mayacharts 0.2.0 → 0.3.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/README.md +8 -6
- package/dist/core/registry.d.ts +1 -1
- package/dist/core/types.d.ts +1 -1
- package/dist/element/animate.d.ts +4 -0
- package/dist/element.js +3 -3
- package/dist/element.js.map +1 -1
- package/dist/flow.js +2 -2
- package/dist/flow.js.map +1 -1
- package/dist/geo.js +2 -2
- package/dist/geo.js.map +1 -1
- package/dist/hierarchy.js +2 -2
- package/dist/hierarchy.js.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/maya.global.js +3 -3
- package/dist/maya.global.js.map +1 -1
- package/dist/radial.js +1 -1
- package/dist/radial.js.map +1 -1
- package/dist/theme.css +1 -1
- package/llms.txt +1 -1
- package/package.json +5 -5
- package/schema.json +1 -1
package/dist/maya.global.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"maya.global.js","names":["ROWS","CAP","w","clip","points","PAD","num","draw","HEAD","PAD","num","S","css","css","same","reduce","mount","reduce","mount","reduce","mount","reduce","mount","str","css","measure.mount","drill.mount","select.mount","zoom.mount","sort.mount","select.reduce","zoom.reduce","sort.reduce","drill.reduce","measure.reduce","TAU","maya","__defProp","__exportAll","target","name","all","no_symbols","VERSION","KEY","MODULES","CORE_TYPES","MODULE_OF","register","type","mark","types","TEXT","t","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$1","CAP$1","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","bandScale","domain","span","range","padInner","padOuter","start","linearScale","d0","d1","r0","r1","clean","niceTicks","max","min","base","best","cross","m","score","values","wide","tw","ch","w$1","maxW","clip$1","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","gap","dots","px","py","points$1","yd","nv","dodge","order","xs","d2","rad","placed","from","near","cand","limit","beeswarm","sx","pts","bh","groups","big","g","seen","mid","off","id","dumbbell","pairs","links","at","to","x1","ox","oy","down","side","heatmap","q","col","legend","PAD$2","num$2","draw$1","live","last","period","fs","payload","labels","prev","pct","vs","kpi","TOP","BOTTOM","LEFT","RIGHT","parallel","ms","lines","vals","x0","scales","l","of","paths","ridgeline","ri","tall","runs","area","axes","draw","areas","fill","sh","line","MIN","points","xd","sv","scatter","sy","scale","HEAD$1","ROW","PAD$1","num$1","table","title","nulls","byValue","lw","cw","colX","rw","cut","on","fit","mi","right","bw","D","N","rng","S$1","Q","C","B","css$1","MayaSpecError","message","code","path","S","KEYS","PATHX","PATH","ALL_Y","CPA","PTH","ONLY","AGGS","PRESETS","DATE","isDateOpts","TOKENS","USE","HORIZ","SIZED","PIE","GEO","EX","HINTS","ALIAS","FN","FAM","FONT","own","isObj","strs","show","dym","fail","headline","bad","want","css","ok","font","bFmt","format","dt","CHECKS","validateSpec","known","str","mod","isPath","need","pth","\"path\"","missing","colors","entries","theme","cart","colorBy","select","detail","found","unk","use","ys","arr","fields","opt","scan","numeric","validateOptions","unknown","inv","sel","vk","win","sortBy","measure","drill","nonce","resolve","measures","view","full","drilled","CORE","kebab","build","fmts","toneText","boxes","label","place","tp","markLegend","body","vars","style","svg","sheet","renderParts","render","shellInner","st","project","keep","renderShell","json","cache","html","tt","instant","EASE","DATA","UI","MAX","Z","geo","boxOf","tf","then","done","once","sync","seed","origin","fade","enter","exit","visual","an","old","g0","g1","ref","fresh","ui","pool","om","fadeIn","ghosts","fadeable","wm","ghost","patch","markup","box","animate","same$1","withDrill","reduce$4","cur","next","branchOf","raw","depth","mount$4","host","say","pop","push","click","crumb","RADIO","reduce$3","same","_drop","index","mount$3","radios","kbd","pick","keydown","painted","FIELDS","dec","reduce$2","had","selected","selOf","matches","mount$2","onClick","root","reduce$1","dir","HEAD","mount$1","titles","txt","SEL","FADE","tooltip","tip","probe","anchored","list","byKey","byC","open","pin","kb","timer","down0","group","lit","light","vw","hide","markOf","ev","bd","tgt","announce","move","on_","cs","clear","_w","MIN_START","MIN_SPAN","NS","mount","brush","lastSaid","lastDrill","svgOf","geom","vb","ky","pw","ph","clampTo","stopBrush","bandMode","onDown","onMove","swallowClick","eat","onUp","began","spanX","spanY","idx","vx","vy","reset","onDbl","onCancel","chip","MayaChart","#prop","#json","#attr","#schedule","#state","#click","#key","#registered","#commit","#announce","#ix","#tip","#off","#ro","#size","#resized","#raf","#say","names","#vars","decl","am","#origin","#emit","ix","#render","#seen","width","height","#drawn","pre","#err","focus","#focusId","maya","slots","#last","\"table\"","still","resized","#restore","FOCUS","element_exports","prior","tree","mk","squarify","nodes","rest","worst","mx","mn","sum","wst","thick","setup","tops","treemap","walk","lx","one","TAU$1","R","pt","a1","a0","tot","categories","grand","bot","free","share","PAD","P","byLv","node","lv","red","ls","RING","clip","P0","P1","SIDE","GAP","sides","arc","sweep","mine","sb","tb","sa","ta","sn","STATES","BY","find","R3","COLS","ROWS","hex","TAU","CAP","segs","totals","R0","rr","G","sector","h0","h1","half","anchor"],"sources":["../src/core/registry.ts","../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/beeswarm.ts","../src/core/marks/dumbbell.ts","../src/core/marks/heatmap.ts","../src/core/marks/kpi.ts","../src/core/marks/parallel.ts","../src/core/marks/ridgeline.ts","../src/core/marks/line.ts","../src/core/marks/scatter.ts","../src/core/marks/table.ts","../src/styles/theme.ts","../src/core/validate.ts","../src/core/render.ts","../src/element/html.ts","../src/element/animate.ts","../src/element/drill.ts","../src/element/measure.ts","../src/element/select.ts","../src/element/sort.ts","../src/element/tooltip.ts","../src/element/zoom.ts","../src/element/maya-chart.ts","../src/element.ts","../src/hierarchy.ts","../src/flow.ts","../src/geo.ts","../src/radial.ts","../src/global.ts"],"sourcesContent":["/*\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.2.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 \"ridgeline\",\n \"beeswarm\",\n \"parallel\",\n \"table\",\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 marimekko: \"hierarchy\",\n waffle: \"hierarchy\",\n sankey: \"flow\",\n chord: \"flow\",\n radial: \"radial\",\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","/*\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 /** Auto description without a category field: {0} = noun, {1} = y title. */\n chartOfAll: \"{0} chart of {1}\",\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 /** Live region after a table header click: {0} = column title, {1} = ascending/descending. */\n sortedBy: \"Sorted by {0}, {1}\",\n ascending: \"ascending\",\n descending: \"descending\",\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}` +\n (spec.x || spec.path.length\n ? ` by ${spec.titles.get(spec.x) ?? (spec.x || spec.path.join(\" / \"))}`\n : \"\");\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 =\n spec.x || spec.path.length\n ? t(spec, \"chartOf\", noun, ti(spec.y), spec.x ? ti(spec.x) : spec.path.join(\" / \"))\n : t(spec, \"chartOfAll\", noun, ti(spec.y));\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 [d0, d1] = fixed ?? a.domain;\n // A reversed yDomain ([hi, lo]) keeps its order for the scale; ticks are computed low to high.\n const [lo, hi] = d0 > d1 ? [d1, d0] : [d0, d1];\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 // Without a left axis, still leave room for half of the first bottom tick label.\n const left = Math.max(\n (spec.yAxis && ly ? maxW(lLab) + 10 : 8) + (yTitle ? 18 : 0),\n bt ? tw(bt.labels[0] ?? \"\") / 2 + 2 : 0,\n );\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, r } from \"../svg.ts\";\nimport type { Axis, BandScale, LinearScale, Mark, ResolvedSpec, Shaped } from \"../types.ts\";\n\ninterface Pt {\n i: number;\n v: number;\n ci: number;\n si: number;\n name: string | null;\n row: Record<string, unknown>;\n}\n\n/**\n * One point per row with a numeric y, a visible series and (when x is set) a kept category.\n * An explicit yDomain clips; points outside it are skipped.\n */\nfunction points(spec: ResolvedSpec, shaped: Shaped): Pt[] {\n const out: Pt[] = [];\n const cats = new Map(shaped.categories.map((c, ci) => [c, ci]));\n const yd = spec.yDomain;\n spec.data.forEach((row, i) => {\n const v = row[spec.y];\n if (typeof v !== \"number\" || !Number.isFinite(v)) return;\n if (yd && (v < yd[0] || v > yd[1])) return;\n // No x: one swarm (shape put every row in the single category \"undefined\").\n const ci = spec.x === \"\" ? 0 : cats.get(String(row[spec.x]));\n if (ci === undefined) return;\n const si = shaped.series.indexOf(spec.series === null ? \"\" : String(row[spec.series]));\n if (!shaped.visible.includes(si)) return;\n const nv = spec.name === null ? null : row[spec.name];\n out.push({ i, v, ci, si, name: nv == null ? null : String(nv), row });\n });\n return out;\n}\n\n/**\n * Dodge: points sorted by pixel x; each takes the smallest |offset| (from the band centre) at which\n * it clears every placed neighbour closer than one diameter. Candidates are 0 and the tangent\n * offsets of those neighbours. Deterministic: ties go to the positive offset.\n */\nfunction dodge(xs: number[], rad: number, limit: number): number[] {\n const order = xs.map((_, i) => i).sort((a, b) => xs[a]! - xs[b]! || a - b);\n const d2 = (2 * rad) ** 2;\n const out: number[] = new Array(xs.length).fill(0);\n const placed: number[] = []; // indices into xs, in placement order\n let from = 0; // placed[from..] may still be within a diameter in x\n for (const i of order) {\n const x = xs[i]!;\n while (from < placed.length && x - xs[placed[from]!]! >= 2 * rad) from++;\n const near = placed.slice(from);\n const cand = [0];\n for (const j of near) {\n const h = Math.sqrt(Math.max(0, d2 - (x - xs[j]!) ** 2));\n cand.push(out[j]! + h, out[j]! - h);\n }\n cand.sort((a, b) => Math.abs(a) - Math.abs(b) || b - a);\n const ok = (o: number) =>\n near.every((j) => (x - xs[j]!) ** 2 + (o - out[j]!) ** 2 >= d2 - 1e-6);\n let o = cand.find(ok) ?? 0;\n // ponytail: a swarm taller than its band is clamped, so the overflow overlaps instead of leaving the band.\n o = Math.max(-limit, Math.min(limit, o));\n out[i] = o;\n placed.push(i);\n }\n return out;\n}\n\n/** Dots dodged off a shared value axis: y = value (bottom axis), x = optional row category (left band). */\nexport const beeswarm: Mark = {\n noun: \"Beeswarm\",\n axes(spec, shaped) {\n let lo = Infinity;\n let hi = -Infinity;\n for (const p of points(spec, shaped)) ((lo = Math.min(lo, p.v)), (hi = Math.max(hi, p.v)));\n if (lo > hi) lo = hi = 0;\n const left: Axis =\n spec.x === \"\" ? null : { kind: \"band\", field: spec.x, domain: shaped.categories };\n return [{ kind: \"linear\", field: spec.y, domain: spec.yDomain ?? [lo, hi] }, left];\n },\n draw(ctx) {\n const { spec, shaped, plot } = ctx;\n const sx = ctx.x as LinearScale;\n const band = ctx.y as BandScale | null;\n const pts = points(spec, shaped);\n const bh = band ? band.bandwidth : plot.h;\n const groups = new Map<number, Pt[]>();\n for (const p of pts) (groups.get(p.ci) ?? groups.set(p.ci, []).get(p.ci)!).push(p);\n let big = 1;\n for (const g of groups.values()) big = Math.max(big, g.length);\n // Radius from density: the area each point of the busiest swarm gets, 3 to 6 px.\n const rad = Math.max(3, Math.min(6, Math.sqrt((plot.w * bh) / big) / 4));\n const cb = typeof spec.colorBy === \"string\" && spec.colorBy !== \"sign\" ? spec.colorBy : null;\n\n const seen = new Map<string, number>();\n let marks = \"\";\n let hits = \"\";\n for (const [ci, g] of [...groups].sort((a, b) => a[0] - b[0])) {\n const mid = band ? band.at(ci) + band.bandwidth / 2 : plot.y + plot.h / 2;\n const xs = g.map((p) => sx.of(p.v));\n const off = dodge(xs, rad + 0.5, Math.max(0, bh / 2 - rad));\n g.forEach((p, k) => {\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 f = ctx.fmt(spec.y, p.v);\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 ?? (band ? ctx.fmt(spec.x, shaped.categories[ci]) : \"\"),\n \"data-series\": ser,\n \"data-y\": p.v,\n \"data-f\": f,\n \"data-neg\": p.v < 0,\n \"data-tone\": ctx.tone(p.v),\n \"data-q\": typeof cv === \"number\" ? ctx.q(cv) : null,\n };\n const cx = xs[k]!;\n const cy = mid + off[k]!;\n marks += el(\"circle\", { \"data-maya\": \"mark\", ...d, r: r(rad), cx: r(cx), cy: r(cy) });\n hits += hit(d, cx - rad, cy - rad, rad * 2, rad * 2);\n if (spec.labels) ctx.label(cx, cy - rad, f, \"above\");\n });\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 { el, esc, key, OTHER, r } from \"../svg.ts\";\nimport { niceTicks } from \"../ticks.ts\";\nimport type { Mark, Row } from \"../types.ts\";\n\nconst TOP = 26;\nconst BOTTOM = 12;\nconst LEFT = 48;\nconst RIGHT = 14;\n\n/**\n * One polyline per x category across one vertical axis per measure (`spec.measures`), each with its\n * own linear scale. No Mark.axes: axes, ticks and titles are drawn here (grid + labels).\n */\nexport const parallel: Mark = {\n noun: \"Parallel coordinates\",\n draw(ctx) {\n const { spec, shaped, width: W, height: H } = ctx;\n const ms = spec.measures;\n const rows = new Map<string, Row[]>();\n for (const row of spec.data) {\n const c = String(row[spec.x]);\n (rows.get(c) ?? rows.set(c, []).get(c)!).push(row);\n }\n const reduce = ctx.agg(spec.aggregate);\n const lines = shaped.categories.flatMap((cat, ci) => {\n const rs = rows.get(cat);\n if (!rs || cat === OTHER) return []; // ponytail: the limit roll-up has no single line, it is skipped.\n const vals = ms.map((m) => reduce(rs.map((row) => row[m] as number | null)));\n const si =\n spec.series === null ? 0 : Math.max(0, shaped.series.indexOf(String(rs[0]![spec.series])));\n return shaped.visible.includes(si) ? [{ cat, ci, vals, si }] : [];\n });\n\n const x0 = LEFT;\n const x1 = Math.max(x0 + 1, W - RIGHT);\n const [y0, y1] = [TOP, Math.max(TOP + 1, H - BOTTOM)];\n const at = (i: number) => r(ms.length < 2 ? x0 : x0 + ((x1 - x0) * i) / (ms.length - 1));\n let grid = \"\";\n let labels = \"\";\n const scales = ms.map((m, i) => {\n const all = lines.map((l) => l.vals[i]).filter((v): v is number => v !== null);\n const t = niceTicks(Math.min(0, ...all), Math.max(0, ...all), 4);\n const [lo, hi] = t.domain;\n const of = (v: number) => r(y1 - ((v - lo) / (hi - lo || 1)) * (y1 - y0));\n const x = at(i);\n grid += el(\"line\", { x1: x, x2: x, y1: r(y0), y2: r(y1) });\n for (const v of t.values) {\n const y = of(v);\n grid += el(\"line\", { x1: x - 3, x2: x, y1: y, y2: y });\n labels += el(\n \"text\",\n { x: x - 6, y, \"text-anchor\": \"end\", \"dominant-baseline\": \"middle\", \"data-in\": true },\n esc(ctx.fmt(m, v, t.step)),\n );\n }\n labels += el(\n \"text\",\n {\n x,\n y: 12,\n \"text-anchor\": i === 0 ? \"start\" : i === ms.length - 1 ? \"end\" : \"middle\",\n \"font-weight\": 600,\n \"data-in\": true,\n },\n esc(spec.titles.get(m) ?? m),\n );\n return of;\n });\n\n let dots = \"\";\n let paths = \"\";\n let hits = \"\";\n for (const { cat, ci, vals, si } of lines) {\n const x = ctx.fmt(spec.x, cat);\n let d = \"\";\n let gap = true;\n vals.forEach((v, i) => {\n if (v === null) {\n gap = true;\n return;\n }\n const [cx, cy] = [at(i), scales[i]!(v)];\n d += `${gap ? \"M\" : \"L\"}${cx} ${cy}`;\n gap = false;\n dots += el(\"circle\", {\n \"data-maya\": \"mark\",\n \"data-key\": key(cat, ms[i]),\n \"data-c\": ci,\n \"data-s\": si % 8,\n \"data-x\": x,\n \"data-series\": spec.titles.get(ms[i]!) ?? ms[i],\n \"data-y\": v,\n \"data-f\": ctx.fmt(ms[i]!, v),\n \"data-neg\": v < 0,\n r: 3.5,\n cx,\n cy,\n });\n });\n if (!d) continue;\n paths += el(\"path\", {\n \"data-maya\": \"line\",\n \"data-key\": key(\"l\", cat),\n \"data-c\": ci,\n \"data-s\": si % 8,\n pathLength: 1,\n d,\n });\n hits += el(\"path\", {\n \"data-maya\": \"hit\",\n \"data-c\": ci,\n d,\n fill: \"none\",\n stroke: \"transparent\",\n \"stroke-width\": 16,\n \"stroke-linejoin\": \"round\",\n });\n }\n // Points first: the line~circle CSS rule (hide points until active) only matches circles after a line.\n return { marks: dots + paths, hits, grid, labels };\n },\n};\n","import { colorVals } from \"../shape.ts\";\nimport { el, key, OTHER, r } from \"../svg.ts\";\nimport type { Axis, BandScale, Cell, Mark } from \"../types.ts\";\n\n/** Rows of areas, first series on top, each scaled 0..global max so peaks overlap the row above. */\nexport const ridgeline: Mark = {\n noun: \"Ridgeline\",\n axes: (spec, shaped) => [\n { kind: \"band\", field: spec.x, domain: shaped.categories } satisfies Axis,\n {\n kind: \"band\",\n field: spec.series ?? \"\",\n domain: shaped.visible.map((i) => shaped.series[i]!),\n },\n ],\n draw(ctx) {\n const { spec, shaped, plot } = ctx;\n const cat = ctx.x as BandScale;\n const row = ctx.y as BandScale;\n const cvOf = colorVals(spec);\n const px = (ci: number) => r(cat.at(ci) + cat.bandwidth / 2);\n let max = 0;\n for (const c of shaped.cells) if (c.value !== null && c.value > max) max = c.value;\n if (max <= 0) max = 1;\n // Baseline = bottom of each band; the peak reaches 1.4 bands up unless the top row would leave the plot.\n const base = (ri: number) => row.at(ri) + row.bandwidth / 2 + row.step / 2;\n const tall = Math.min(1.4 * row.step, base(0) - plot.y);\n\n let rows = \"\";\n let dots = \"\";\n shaped.visible.forEach((si, ri) => {\n const ser = shaped.series[si]!;\n const b = base(ri);\n const py = (v: number) => r(b - (v / max) * tall);\n const cells: Cell[] = shaped.cells.filter((c) => c.si === si).sort((a, c) => a.ci - c.ci);\n const runs: Cell[][] = [[]];\n for (const c of cells) {\n if (c.value === null) {\n runs.push([]);\n continue;\n }\n runs[runs.length - 1]!.push(c);\n const cname = shaped.categories[c.ci]!;\n const cv = cvOf(cname, ser);\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\": ctx.fmt(spec.x, cname),\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\": cname === OTHER,\n r: 3,\n cx: px(c.ci),\n cy: py(c.value),\n });\n }\n const pts = (run: Cell[]) => run.map((c, i) => `${i ? \"L\" : \"M\"}${px(c.ci)} ${py(c.value!)}`);\n const live = runs.filter((run) => run.length > 0);\n const area = live\n .map(\n (run) => `${pts(run).join(\"\")}L${px(run.at(-1)!.ci)} ${r(b)}L${px(run[0]!.ci)} ${r(b)}Z`,\n )\n .join(\"\");\n if (area)\n rows += el(\"path\", {\n \"data-maya\": \"area\",\n \"data-ridge\": true,\n \"data-key\": key(\"a\", ser),\n \"data-s\": si % 8,\n d: area,\n });\n rows += el(\"path\", {\n \"data-maya\": \"line\",\n \"data-key\": key(\"l\", ser),\n \"data-s\": si % 8,\n pathLength: 1,\n d: live.map((run) => pts(run).join(\"\")).join(\"\") || 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: rows + 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","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","import { el, esc, hit, key, r } from \"../svg.ts\";\nimport type { Mark } from \"../types.ts\";\n\nconst HEAD = 30;\nconst ROW = 26;\nconst PAD = 8;\nconst num = (v: unknown) => (typeof v === \"number\" ? v : null);\n\n/**\n * Rows = x categories, one column per measure (every `spec.y` entry), value text plus a thin bar\n * scaled to the column max. Header cells are `data-maya=\"sort\"` groups (element/sort.ts).\n */\nexport const table: Mark = {\n noun: \"Table\",\n draw(ctx) {\n const { spec, width: W, height: H } = ctx;\n const ms = spec.measures;\n const title = (f: string) => spec.titles.get(f) ?? f;\n const agg = ctx.agg(spec.aggregate);\n\n const groups = new Map<string, (number | null)[][]>();\n for (const row of spec.data) {\n const k = String(row[spec.x]);\n const g =\n groups.get(k) ??\n groups\n .set(\n k,\n ms.map(() => []),\n )\n .get(k)!;\n ms.forEach((m, i) => g[i]!.push(num(row[m])));\n }\n let rows = [...groups].map(([name, g]) => ({ name, vals: g.map((v) => agg(v)) }));\n\n const nulls = (v: number | null, d: number) => (v === null ? Infinity : v * d);\n const byValue = (i: number, d: number) => (a: (typeof rows)[0], b: (typeof rows)[0]) =>\n nulls(a.vals[i]!, d) - nulls(b.vals[i]!, d) || 0;\n // ponytail: limit is a plain cut to the top N of the first measure (no Other roll-up).\n if (spec.limit !== null && rows.length > spec.limit)\n rows = rows.sort(byValue(0, -1)).slice(0, spec.limit);\n const by =\n spec.sortBy && (spec.sortBy[0] === spec.x || ms.includes(spec.sortBy[0]))\n ? spec.sortBy\n : null;\n if (by) {\n const d = by[1] === \"asc\" ? 1 : -1;\n const i = ms.indexOf(by[0]);\n if (i < 0) {\n const c = new Intl.Collator(spec.locale, { numeric: true });\n rows.sort((a, b) => d * c.compare(a.name, b.name));\n } else\n rows.sort((a, b) => {\n const [x, y] = [a.vals[i]!, b.vals[i]!];\n return x === null || y === null\n ? (x === null ? 1 : 0) - (y === null ? 1 : 0)\n : d * (x - y);\n });\n } else if (spec.sort) {\n rows.sort(byValue(0, spec.sort === \"asc\" ? 1 : -1));\n }\n\n const lw = Math.max(80, Math.min(W * 0.34, 180));\n const cw = (W - lw) / ms.length;\n const colX = (i: number) => lw + i * cw; // left edge of measure column i\n const max = ms.map((_, i) => Math.max(0, ...rows.map((rw) => Math.abs(rw.vals[i] ?? 0))));\n const cut = (s: string, w: number) => {\n const n = Math.max(1, Math.floor((w - PAD) / 7));\n return s.length > n ? s.slice(0, n - 1) + \"…\" : s;\n };\n\n let labels = \"\";\n let grid = \"\";\n let hits = \"\";\n const heads = [spec.x, ...ms];\n heads.forEach((f, i) => {\n const x0 = i ? colX(i - 1) : 0;\n const w = i ? cw : lw;\n const on = by?.[0] === f ? by[1] : null;\n const text = cut(title(f), w - (on ? 14 : 0)) + (on ? (on === \"asc\" ? \" ▲\" : \" ▼\") : \"\");\n // Headers go in the hits group: the labels group ignores the pointer.\n hits += el(\n \"g\",\n {\n \"data-maya\": \"sort\",\n \"data-field\": f,\n \"data-sort\": on,\n role: \"button\",\n tabindex: 0,\n \"aria-label\": on\n ? ctx.t(\"sortedBy\", title(f), ctx.t(on === \"asc\" ? \"ascending\" : \"descending\"))\n : title(f),\n },\n el(\"rect\", { x: r(x0), y: 0, width: r(w), height: HEAD, fill: \"transparent\" }) +\n el(\n \"text\",\n {\n \"data-th\": true,\n x: r(i ? x0 + w - PAD : PAD),\n y: HEAD / 2,\n \"text-anchor\": i ? \"end\" : \"start\",\n \"dominant-baseline\": \"middle\",\n },\n esc(text),\n ),\n );\n });\n grid += el(\"line\", { x1: 0, x2: W, y1: HEAD, y2: HEAD });\n\n // ponytail: rows that do not fit the height are not drawn (the tile shows the top rows); no scroll.\n const fit = Math.max(0, Math.floor((H - HEAD) / ROW));\n let marks = \"\";\n rows.slice(0, fit).forEach((rw, ri) => {\n const top = HEAD + ri * ROW;\n const name = ctx.fmt(spec.x, rw.name);\n // Row texts sit in the marks group, keyed by row, so a re-sort slides them with their bars.\n marks += el(\n \"text\",\n {\n \"data-key\": key(\"t\", rw.name),\n x: PAD,\n y: top + ROW / 2 - 2,\n \"dominant-baseline\": \"middle\",\n \"data-td\": \"label\",\n },\n esc(cut(name, lw)),\n );\n ms.forEach((m, mi) => {\n const v = rw.vals[mi]!;\n const right = colX(mi) + cw - PAD;\n const text = v === null ? \"–\" : ctx.fmt(m, v);\n marks += el(\n \"text\",\n {\n \"data-key\": key(\"v\", m, rw.name),\n x: r(right),\n y: top + ROW / 2 - 2,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"middle\",\n },\n esc(text),\n );\n if (v === null) return;\n const bw = max[mi] ? ((cw - 2 * PAD) * Math.abs(v)) / max[mi]! : 0;\n const d = {\n \"data-key\": key(m, rw.name),\n \"data-c\": ri,\n \"data-s\": ms.length > 1 ? mi % 8 : 0,\n \"data-x\": name,\n \"data-series\": title(m),\n \"data-f\": text,\n \"data-y\": v,\n \"data-neg\": v < 0,\n };\n const y = top + ROW - 7;\n marks += el(\"rect\", {\n \"data-maya\": \"mark\",\n ...d,\n x: r(colX(mi) + PAD),\n y,\n width: r(bw),\n height: 4,\n });\n hits += hit(d, colX(mi) + PAD, y, bw, 4);\n });\n });\n return { marks, hits, labels, grid };\n },\n};\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 // 0.2 types: ridgeline fill, radial rings, table header and row text, parallel line focus.\n \"[data-ridge]{fill:color-mix(in oklab,var(--c) 40%,var(--maya-bg))}[data-maya=grid] circle{fill:none;shape-rendering:auto}\" +\n \"[data-maya=labels] [data-ring]{fill:var(--maya-fg-muted)}[data-maya=marks] text{fill:var(--maya-fg)}\" +\n \"[data-maya=sort]{cursor:pointer}[data-maya=sort] rect{fill:transparent}[data-maya=sort] text{font-weight:600}[data-maya=sort]:focus-visible{outline:2px solid var(--maya-focus)}\" +\n \"[data-maya=line]{transition:opacity .2s}[data-maya=marks]:has(path[data-active]) path[data-maya=line]:not([data-active]){opacity:.25}\" +\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\"];\n/** Types whose x can come from path with drill (the current level is the category). */\nconst PATHX = [...CART, \"dumbbell\"];\nconst PATH = [\"treemap\", \"sunburst\", \"sankey\", \"chord\"];\n/** y arrays on these types are shown together (axes, columns), never a measure toggle. */\nexport const ALL_Y = [\"parallel\", \"table\"];\n/** Option -> types that accept it (option-unsupported otherwise). */\nconst CPA = \"bar,line,area\";\nconst PTH = \"treemap,sunburst,sankey,chord\";\nexport const ONLY: Readonly<Record<string, readonly string[]>> = Object.fromEntries(\n w(\n `horizontal:bar,dumbbell y2:bar size:scatter name:scatter,beeswarm path:${CPA},dumbbell,${PTH} totals:waterfall series:${CPA},scatter,heatmap,dumbbell,ridgeline,beeswarm,parallel,marimekko,radial sort:${CPA},heatmap,dumbbell,table,radial,waffle limit:${CPA},heatmap,dumbbell,table,waffle,radial stack:bar,area colorBy:${CPA},waterfall,scatter,dumbbell,kpi,treemap,sunburst,hexmap xDomain:scatter drill:${CPA},dumbbell,${PTH} select:${CPA},waterfall,scatter,heatmap,dumbbell,beeswarm,parallel,table,marimekko,waffle,radial,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 if (t === \"chord\" && Array.isArray(pth) && pth.length !== 2)\n fail(\n \"invalid-option\",\n \"path\",\n \"spec.path needs exactly two levels for a chord: from and to.\",\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 t !== \"beeswarm\" &&\n !(need === \"x\" && PATHX.includes(t) && s.path !== undefined)\n )\n missing(need);\n if (s.y === undefined) missing(\"y\");\n if ((t === \"dumbbell\" || t === \"ridgeline\" || t === \"marimekko\") && s.series === undefined)\n missing(\"series\");\n if (t === \"parallel\" && !(Array.isArray(s.y) && s.y.length >= 2))\n fail(\n \"invalid-option\",\n \"y\",\n 'spec.y on \"parallel\" needs an array of at least 2 measures, one axis each.',\n 'Example: y: [\"sales\", \"units\", \"price\"]',\n );\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 (k === \"yDomain\" ? d[0] !== d[1] : d[0]! < d[1]!)\n )\n )\n fail(\n \"invalid-domain\",\n k,\n `spec.${k} = ${show(d)} is not a valid domain.`,\n k === \"yDomain\"\n ? \"Expected [min, max] (or [max, min] to reverse) with two different finite numbers.\"\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 = PATHX.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 sortBy\");\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, sortBy } = v as Record<string, unknown>;\n if (\n sortBy !== undefined &&\n !(\n Array.isArray(sortBy) &&\n sortBy.length === 2 &&\n typeof sortBy[0] === \"string\" &&\n (sortBy[1] === \"asc\" || sortBy[1] === \"desc\")\n )\n )\n inv(\"view.sortBy\", sortBy, '[field, \"asc\" | \"desc\"]');\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 ?? (PATHX.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 sortBy: view.sortBy ?? 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:\n spec.legend ?? (spec.series !== undefined || spec.y2 !== undefined || spec.type === \"waffle\"),\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 { beeswarm } from \"./marks/beeswarm.ts\";\nimport { dumbbell } from \"./marks/dumbbell.ts\";\nimport { heatmap } from \"./marks/heatmap.ts\";\nimport { kpi } from \"./marks/kpi.ts\";\nimport { parallel } from \"./marks/parallel.ts\";\nimport { ridgeline } from \"./marks/ridgeline.ts\";\nimport { area, line } from \"./marks/line.ts\";\nimport { scatter } from \"./marks/scatter.ts\";\nimport { table } from \"./marks/table.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 { ALL_Y, 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 ridgeline,\n beeswarm,\n parallel,\n table,\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 && !ALL_Y.includes(s.type)\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","/*\n * Every innerHTML / insertAdjacentHTML / template.innerHTML in the element goes through\n * html(): a Trusted Types policy created once. Safe because core escapes every data string.\n * Hosts allow it with `trusted-types mayacharts`.\n */\ntype Policy = { createHTML(s: string): string };\ntype TT = { createPolicy(n: string, o: Policy): Policy; getPolicy?(n: string): Policy | null };\nlet cache: [TT, Policy | null] | undefined;\n\nexport const html = (s: string): string => {\n const tt = (globalThis as { trustedTypes?: TT }).trustedTypes;\n if (!tt) return s;\n if (cache?.[0] !== tt) {\n let p: Policy | null = null;\n try {\n p = tt.createPolicy(\"mayacharts\", { createHTML: (x) => x });\n } catch {\n p = tt.getPolicy?.(\"mayacharts\") ?? null; // duplicate names may be refused by the page's CSP\n }\n cache = [tt, p];\n }\n return cache[1] ? cache[1].createHTML(s) : s;\n};\n","import { html } from \"./html.ts\";\n\n/** x, y, width, height in viewBox units. */\nexport type Box = [x: number, y: number, w: number, h: number];\nexport interface PatchOptions {\n /** Entering marks start from this box; exiting marks collapse into it. */\n origin?: Box | undefined;\n /** Post-patch hook, called with the live svg after every patch (animated or not). */\n after?: (svg: Element) => void;\n /** Diff and reuse nodes, but apply every change immediately (resize). */\n instant?: boolean;\n}\n\nlet instant = false;\n\nconst EASE = \"cubic-bezier(.2,.8,.2,1)\";\nconst DATA: KeyframeAnimationOptions = { duration: 280, easing: EASE };\nconst UI: KeyframeAnimationOptions = { duration: 160, easing: EASE };\nconst MAX = 1500; // ponytail: no animation above this many marks\nconst Z = 1e-6;\nconst n = (e: Element, k: string) => +(e.getAttribute(k) ?? 0);\n\n/** Geometry of a rect or circle (circle = its bounding square); undefined for paths etc. */\nconst geo = (e: Element): Box | undefined => {\n if (e.localName === \"rect\") return [n(e, \"x\"), n(e, \"y\"), n(e, \"width\"), n(e, \"height\")];\n if (e.localName === \"circle\") {\n const r = n(e, \"r\");\n return [n(e, \"cx\") - r, n(e, \"cy\") - r, 2 * r, 2 * r];\n }\n};\n\n/** Box of any mark (paths via getBBox where it exists); used to derive a drill origin. */\nexport const boxOf = (e: Element): Box | undefined => {\n const b = (e as SVGGraphicsElement).getBBox?.();\n return geo(e) ?? (b ? [b.x, b.y, b.width, b.height] : undefined);\n};\n\n/** Transform (origin 0 0 of the fill-box) that maps geometry `g` onto box `b`. */\nconst tf = (g: Box, b: Box) =>\n `translate(${b[0] - g[0]}px,${b[1] - g[1]}px) scale(${Math.max(b[2], Z) / Math.max(g[2], Z)},${Math.max(b[3], Z) / Math.max(g[3], Z)})`;\n\nconst run = (e: Element, k: Keyframe[], o: KeyframeAnimationOptions, then?: () => void) => {\n const a = instant ? undefined : e.animate?.(k, o);\n if (!then) return;\n if (!a) return then();\n let done = false;\n const once = () => done || ((done = true), then());\n a.addEventListener(\"finish\", once);\n a.addEventListener(\"cancel\", once);\n // Hidden tabs freeze animation timelines; ghosts must still leave.\n setTimeout(once, Number(o.duration ?? 0) + 100);\n};\n\nfunction sync(o: Element, w: Element): void {\n for (const a of [...o.attributes]) if (!w.hasAttribute(a.name)) o.removeAttribute(a.name);\n for (const a of [...w.attributes]) o.setAttribute(a.name, a.value);\n}\n\n/** Where an entering mark starts (and an exiting one ends): `origin`, else its own baseline/centre. */\nfunction seed(e: Element, g: Box, origin?: Box): Box {\n if (origin) return origin;\n const [x, y, w, h] = g;\n if (e.localName === \"circle\") return [x + w / 2, y + h / 2, 0, 0];\n const neg = e.hasAttribute(\"data-neg\");\n return e.closest(\"[data-dir=h]\") ? [neg ? x + w : x, y, 0, h] : [x, neg ? y : y + h, w, 0];\n}\n\nfunction fade(e: Element, out: boolean, then?: () => void, o = DATA): void {\n const k = [{ opacity: 0 }, { opacity: 1 }];\n run(e, out ? k.reverse() : k, out ? { ...o, fill: \"forwards\" } : o, then);\n}\n\nfunction enter(e: Element, origin?: Box): void {\n const g = geo(e);\n if (g)\n run(\n e,\n [\n { transform: tf(g, seed(e, g, origin)), opacity: 0 },\n { transform: \"none\", opacity: 1 },\n ],\n DATA,\n );\n else if (e.matches(\"path[data-maya=line]\")) {\n e.setAttribute(\"pathLength\", \"1\");\n const d = (o: string) => ({ strokeDasharray: \"1\", strokeDashoffset: o });\n run(e, [d(\"1\"), d(\"0\")], DATA);\n } else fade(e, false);\n}\n\nfunction exit(e: Element, origin?: Box): void {\n // No longer addressable while it leaves.\n e.removeAttribute(\"data-key\");\n e.removeAttribute(\"data-maya\");\n const g = geo(e);\n const done = () => e.remove();\n if (g)\n run(\n e,\n [\n { transform: \"none\", opacity: 1 },\n { transform: tf(g, seed(e, g, origin)), opacity: 0 },\n ],\n { ...DATA, fill: \"forwards\" },\n done,\n );\n else fade(e, true, done);\n}\n\n/** Current on-screen box of an animating mark (cancels its animations). */\nfunction visual(m: Element, g: Box): Box {\n const an = m.getAnimations?.() ?? [];\n if (!an.length) return g;\n const t = getComputedStyle(m).transform; // user units under fill-box, origin 0 0\n for (const a of an) a.cancel();\n if (!t || t === \"none\" || typeof DOMMatrix === \"undefined\") return g;\n const c = new DOMMatrix(t);\n return [g[0] + c.e, g[1] + c.f, g[2] * c.a, g[3] * c.d];\n}\n\nfunction marks(o: Element, w: Element, origin?: Box): void {\n const old = new Map<string, Element>();\n for (const e of o.children)\n if (e.hasAttribute(\"data-key\")) old.set(e.getAttribute(\"data-key\")!, e);\n const order: Element[] = [];\n for (const e of [...w.children]) {\n const k = e.getAttribute(\"data-key\")!;\n const m = old.get(k);\n if (!m || m.localName !== e.localName) {\n // Unknown key, or same key with another tag: replace (old one exits).\n order.push(e);\n continue;\n }\n old.delete(k);\n const g0 = geo(m);\n const v = g0 && visual(m, g0);\n sync(m, e);\n const g1 = geo(m);\n if (v && g1 && v.some((x, i) => Math.abs(x - g1[i]!) > 0.01))\n run(m, [{ transform: tf(g1, v) }, { transform: \"none\" }], DATA);\n order.push(m);\n }\n for (const m of old.values()) exit(m, origin);\n let ref = o.firstElementChild;\n for (const m of order) {\n while (ref && ref !== m && !ref.hasAttribute(\"data-key\")) ref = ref.nextElementSibling;\n if (ref === m) ref = ref.nextElementSibling;\n else {\n const fresh = !m.isConnected;\n o.insertBefore(m, ref);\n if (fresh) enter(m, origin);\n }\n }\n}\n\n/** Crossfade the non-mark children (axes, grid, labels): changed groups fade 160 ms. */\nfunction ui(o: Element, w: Element, om: Element, wm: Element): void {\n const id = (c: Element) => c.getAttribute(\"data-maya\") ?? c.localName;\n const pool = new Map([...o.children].filter((c) => c !== om).map((c) => [id(c), c]));\n const out: Element[] = [];\n const fadeIn: Element[] = [];\n const ghosts: Element[] = [];\n const fadeable = (c: Element) => c.localName === \"g\" && !/^(cross|hits)$/.test(id(c));\n for (const c of [...w.children]) {\n if (c === wm) {\n out.push(om);\n continue;\n }\n const p = pool.get(id(c));\n pool.delete(id(c));\n if (p && p.outerHTML === c.outerHTML) out.push(p);\n else {\n if (p && fadeable(p)) (ghosts.push(p), out.push(p));\n out.push(c);\n if (p && fadeable(c)) fadeIn.push(c);\n }\n }\n for (const p of pool.values()) if (fadeable(p)) (ghosts.push(p), out.push(p));\n o.replaceChildren(...out);\n // Start every fade after the swap: animations on template children stay pending forever in\n // WebKit and Firefox, and a ghost removed synchronously would be re-inserted by the swap.\n for (const g of ghosts) ghost(g);\n for (const c of fadeIn) fade(c, false, undefined, UI);\n}\n\n/** An outgoing group: unaddressable while it fades, then removed. */\nfunction ghost(g: Element): void {\n g.removeAttribute(\"data-maya\");\n for (const d of g.querySelectorAll(\"[data-maya]\")) d.removeAttribute(\"data-maya\");\n fade(g, true, () => g.remove(), UI);\n}\n\nexport function patch(\n box: Element,\n markup: string,\n animate: boolean,\n opts: PatchOptions = {},\n): void {\n const t = document.createElement(\"template\");\n t.innerHTML = html(markup);\n const w = t.content.firstElementChild!;\n const o = box.firstElementChild;\n const om = o?.querySelector(\":scope > [data-maya=marks]\");\n const wm = w.querySelector(\":scope > [data-maya=marks]\");\n if (!animate || !o || !om || !wm || wm.childElementCount > MAX || om.childElementCount > MAX)\n box.replaceChildren(w);\n else {\n instant = !!opts.instant;\n sync(o, w);\n sync(om, wm);\n marks(om, wm, opts.origin);\n ui(o, w, om, wm);\n instant = false;\n }\n opts.after?.(box.firstElementChild!);\n}\n","/*\n * Drill (T10b). Same reduce/mount contract as measure.ts.\n * Click/Enter on a mark pushes its branch; breadcrumb (Parts.crumbs, `.maya-crumbs`), Back\n * and Escape (priority 5) pop. Persistence: resets when type/x/path change, popping to the\n * deepest branch that still exists in the data.\n */\nimport { t } from \"../core/strings.ts\";\nimport type { ChartSpec, Handlers, Host, SpecEvent, State } from \"../core/types.ts\";\n\n/** `spec` is needed to gate a push (the reducer has no other access to it). */\nexport type DrillEvent =\n { type: \"drill\"; value: string; spec?: ChartSpec } | { type: \"pop\"; depth: number } | SpecEvent;\n\nconst same = (a: readonly string[] = [], b: readonly string[] = []) =>\n a.length === b.length && a.every((v, i) => v === b[i]);\n\nconst withDrill = (s: State, drill: readonly string[]): State =>\n same(s.view.drill, drill) ? s : { view: { ...s.view, drill }, selected: [] };\n\nexport const reduce = (s: State, e: DrillEvent): State => {\n const cur = s.view.drill ?? [];\n if (e.type === \"pop\") return withDrill(s, cur.slice(0, Math.max(0, e.depth)));\n if (e.type === \"drill\") {\n const n = e.spec?.path?.length ?? 0;\n return e.spec?.drill && cur.length < n - 1 ? withDrill(s, [...cur, e.value]) : s;\n }\n if (e.type !== \"spec\" || !cur.length) return s;\n const { prev, next } = e;\n const path = next.path ?? [];\n if (\n !next.drill ||\n (prev && (prev.type !== next.type || prev.x !== next.x || !same(prev.path, next.path)))\n )\n return withDrill(s, []);\n // Deepest branch that still has rows.\n let rows = next.data;\n const keep: string[] = [];\n for (let i = 0; i < cur.length && i < path.length - 1; i++) {\n rows = rows.filter((r) => String(r[path[i]!]) === cur[i]);\n if (!rows.length) break;\n keep.push(cur[i]!);\n }\n return withDrill(s, keep);\n};\n\n/** Raw category the mark stands for, decoded from its data-key (grammar: core/svg.ts). */\nconst branchOf = (key: string, depth: number): string | undefined => {\n const p = key.split(\"~\");\n const raw = p[0] === \"h\" ? (p[1 + depth] ?? p[p.length - 1]) : p[1];\n if (raw === undefined) return;\n try {\n return decodeURIComponent(raw);\n } catch {\n return raw;\n }\n};\n\nexport const mount = (host: Host): Handlers => {\n /** After the next paint: focus the first mark (push) or the parent mark (pop). */\n let want: { first: true } | { value: string } | undefined;\n\n const marks = () =>\n [...host.root.querySelectorAll<SVGElement>(\"[data-maya=mark][data-key]\")].filter(\n (m) => !m.hasAttribute(\"data-other\"),\n );\n\n const say = (next: State) => {\n const spec = host.spec();\n const d = next.view.drill ?? [];\n if (spec) host.announce(t(spec, d.length ? \"drilledInto\" : \"back\", d.join(\" / \")));\n };\n\n const pop = (depth: number): boolean => {\n const s = host.state();\n const cur = s.view.drill ?? [];\n if (depth >= cur.length) return false;\n const next = reduce(s, { type: \"pop\", depth });\n if (next === s) return false;\n want = { value: cur[depth]! };\n host.commit(next);\n say(next);\n return true;\n };\n\n const push = (mark: Element): boolean => {\n const spec = host.spec();\n const key = mark.getAttribute(\"data-key\");\n if (!spec?.drill || !key || mark.hasAttribute(\"data-other\")) return false;\n const s = host.state();\n const value = branchOf(key, (s.view.drill ?? []).length);\n if (value === undefined) return false;\n const next = reduce(s, { type: \"drill\", value, spec });\n if (next === s) return false;\n want = { first: true };\n host.commit(next);\n say(next);\n return true;\n };\n\n const click = (e: Event) => {\n const el = e.target as Element | null;\n const crumb = el?.closest(\".maya-crumbs [data-depth]\");\n if (crumb) return void pop(Number(crumb.getAttribute(\"data-depth\")));\n const m = el?.closest(\"[data-maya=mark],[data-maya=hit]\");\n if (m) push(m);\n };\n host.root.addEventListener(\"click\", click);\n\n return {\n escape: () => pop((host.state().view.drill ?? []).length - 1),\n enter: (mark) => push(mark),\n painted() {\n if (!want) return;\n const all = marks();\n const m =\n \"first\" in want\n ? all[0]\n : all.find(\n (x) =>\n branchOf(x.getAttribute(\"data-key\")!, host.state().view.drill?.length ?? 0) ===\n (want as { value: string }).value,\n );\n want = undefined;\n if (m) {\n if (!m.hasAttribute(\"tabindex\")) m.setAttribute(\"tabindex\", \"-1\");\n (m as unknown as HTMLElement).focus?.({ preventScroll: true });\n }\n // Keyboard must keep working after a pointer drill: fall back to the chart itself.\n if (!host.root.activeElement || !host.root.contains(host.root.activeElement))\n host.root.querySelector<HTMLElement>(\".maya-svg\")?.focus({ preventScroll: true });\n },\n off: () => host.root.removeEventListener(\"click\", click),\n };\n};\n","/*\n * Measure toggle (T10a). Contract shared by measure/drill/select/zoom:\n * reduce(state, event) => state pure, node-tested; handles its own events and\n * { type: \"spec\", prev, next } (persistence rules)\n * mount(host) => Handlers DOM wiring on host.root; calls host.commit(next)\n * Markup: Parts.controls, a `.maya-ctl` radiogroup of [role=radio][aria-checked] buttons.\n * Persistence: measure resets when spec.y changes.\n */\nimport type { Handlers, Host, SpecEvent, State } from \"../core/types.ts\";\nimport { t } from \"../core/strings.ts\";\n\n/** `count` (number of measures) bounds the index; without it only the lower bound applies. */\nexport type MeasureEvent =\n { type: \"measure\" | \"pick\"; index: number; count?: number | undefined } | SpecEvent;\n\nconst RADIO = \".maya-ctl [role=radio]\";\n\nexport const reduce = (s: State, e: MeasureEvent): State => {\n if (e.type === \"spec\") {\n const y = e.next.y;\n const same = e.prev && JSON.stringify(y) === JSON.stringify(e.prev.y);\n if (Array.isArray(y) && same) return s;\n if (s.view.measure === undefined) return s;\n const { measure: _drop, ...view } = s.view;\n return { ...s, view };\n }\n const max = e.count === undefined ? Infinity : e.count - 1;\n const index = Math.min(Math.max(0, Math.trunc(e.index) || 0), Math.max(0, max));\n return s.view.measure === index ? s : { ...s, view: { ...s.view, measure: index } };\n};\n\nexport const mount = (host: Host): Handlers => {\n const radios = () => [...host.root.querySelectorAll<HTMLElement>(RADIO)];\n let kbd = false; // the last change came from the keyboard: keep focus on the active radio\n\n const pick = (index: number): void => {\n const spec = host.spec();\n const ys = spec && Array.isArray(spec.y) ? (spec.y as string[]) : [];\n const s = host.state();\n const next = reduce(s, { type: \"measure\", index, count: ys.length || undefined });\n if (next === s) return;\n host.commit(next);\n const m = next.view.measure ?? 0;\n const name = ys[m] ?? String(m);\n host.announce(\n t(\n spec ?? {},\n \"showing\",\n (spec?.titles as Record<string, string> | undefined)?.[name] ?? name,\n ),\n );\n };\n\n const click = (e: Event): void => {\n const b = (e.target as Element).closest?.(RADIO);\n const i = b ? radios().indexOf(b as HTMLElement) : -1;\n if (i >= 0) pick(i);\n };\n\n const keydown = (e: Event): void => {\n const k = (e as KeyboardEvent).key;\n const all = radios();\n const i = all.indexOf((e.target as Element).closest?.(RADIO) as HTMLElement);\n if (i < 0) return;\n const to =\n k === \"ArrowRight\" || k === \"ArrowDown\"\n ? (i + 1) % all.length\n : k === \"ArrowLeft\" || k === \"ArrowUp\"\n ? (i - 1 + all.length) % all.length\n : k === \"Home\"\n ? 0\n : k === \"End\"\n ? all.length - 1\n : -1;\n if (to < 0) return;\n e.preventDefault();\n kbd = true;\n if (to === host.state().view.measure)\n painted(); // already active (e.g. Home on first)\n else pick(to);\n all[to]?.focus({ preventScroll: true });\n };\n\n const painted = (): void => {\n const all = radios();\n const m = host.state().view.measure ?? 0;\n all.forEach((r, i) => {\n r.setAttribute(\"aria-checked\", String(i === m));\n r.setAttribute(\"tabindex\", i === m ? \"0\" : \"-1\");\n });\n if (kbd) {\n kbd = false;\n all[m]?.focus({ preventScroll: true });\n }\n };\n\n host.root.addEventListener(\"click\", click);\n host.root.addEventListener(\"keydown\", keydown);\n return {\n painted,\n off() {\n host.root.removeEventListener(\"click\", click);\n host.root.removeEventListener(\"keydown\", keydown);\n },\n };\n};\n","/*\n * Selection (T10c). Same reduce/mount contract as measure.ts.\n * Click/Enter/legend toggles a Sel (raw values); `data-selected` re-applied in painted();\n * Escape (priority 3) clears. Persistence: clears when type/x/path change (or drill changes),\n * else unmatched keys are inert. In select mode maya-chart's own legend handler stands down.\n */\nimport { t } from \"../core/strings.ts\";\nimport type { Handlers, Host, Sel, SpecEvent, State } from \"../core/types.ts\";\n\nexport type SelectEvent =\n { type: \"toggle\"; sel: Sel; multi: boolean } | { type: \"clear\" } | SpecEvent;\n\nconst same = (a: Sel, b: Sel) => JSON.stringify(a) === JSON.stringify(b);\nconst FIELDS = [\"x\", \"series\", \"name\"] as const;\nconst dec = (s: string) => {\n try {\n return decodeURIComponent(s);\n } catch {\n return s;\n }\n};\n\nexport function reduce(s: State, e: SelectEvent): State {\n if (e.type === \"clear\") return s.selected.length ? { ...s, selected: [] } : s;\n if (e.type === \"spec\") {\n const p = e.prev;\n if (!p || !s.selected.length) return s;\n const n = e.next;\n const moved =\n p.type !== n.type || p.x !== n.x || JSON.stringify(p.path) !== JSON.stringify(n.path);\n return moved ? { ...s, selected: [] } : s;\n }\n if (e.type !== \"toggle\") return s;\n const had = s.selected.some((q) => same(q, e.sel));\n const selected = e.multi\n ? had\n ? s.selected.filter((q) => !same(q, e.sel))\n : [...s.selected, e.sel]\n : had && s.selected.length === 1\n ? []\n : [e.sel];\n return { ...s, selected };\n}\n\n/** Raw-value Sel of a mark, decoded from its data-key (`S~C`, scatter `S~name`, `h~…`). */\nexport function selOf(mark: Element, type?: string): Sel | undefined {\n const key = mark.getAttribute(\"data-key\");\n if (!key) return;\n const p = key.split(\"~\").map(dec);\n if (p[0] === \"h\") return { name: p[p.length - 1] };\n if (p.length !== 2) return; // line/area paths, sankey, hexmap: not selectable\n const sel: Sel = {};\n if (p[0]) sel.series = p[0];\n if (type === \"scatter\") sel.name = p[1];\n else sel.x = p[1];\n return sel;\n}\n\n/** A Sel matches a mark when every field it names equals the mark's (compared as text). */\nexport function matches(sel: Sel, mark: Element, type?: string): boolean {\n const m = selOf(mark, type);\n if (!m) return false;\n return FIELDS.every((f) => sel[f] === undefined || String(sel[f]) === String(m[f]));\n}\n\nexport function mount(host: Host): Handlers {\n const { root } = host;\n const type = () => host.spec()?.type;\n const pick = (sel: Sel, target: Element | null) => {\n const spec = host.spec();\n if (!spec?.select) return;\n const next = reduce(host.state(), { type: \"toggle\", sel, multi: spec.select === \"multi\" });\n const y = target?.getAttribute(\"data-y\") ?? \"\";\n host.commit(next, target ? { ...sel, value: y !== \"\" && !isNaN(+y) ? +y : y } : null);\n const n = next.selected.length;\n host.announce(n ? t(spec, \"selected\", n) : t(spec, \"selectionCleared\"));\n };\n const onClick = (e: Event) => {\n const spec = host.spec();\n if (!spec?.select) return;\n const el = e.target as Element;\n const b = el.closest(\"[data-maya=legend] button\");\n if (b) {\n const k = b.getAttribute(\"data-key\");\n if (k) pick({ series: k }, null);\n return;\n }\n let m = el.closest(\"[data-maya=mark],[data-maya=hit]\");\n if (m && !m.getAttribute(\"data-key\")) {\n // keyless band hit (line/area): the category's first keyed mark\n const c = m.getAttribute(\"data-c\");\n m = c === null ? null : root.querySelector(`[data-maya=mark][data-key][data-c=\"${c}\"]`);\n }\n const sel = m && selOf(m, type());\n if (m && sel) pick(sel, m);\n };\n root.addEventListener(\"click\", onClick);\n return {\n escape() {\n if (!host.state().selected.length) return false;\n host.commit(reduce(host.state(), { type: \"clear\" }));\n host.announce(t(host.spec() ?? {}, \"selectionCleared\"));\n return true;\n },\n enter(mark) {\n const sel = selOf(mark, type());\n if (!host.spec()?.select || !sel) return false;\n pick(sel, mark);\n return true;\n },\n painted() {\n const sel = host.state().selected;\n for (const m of root.querySelectorAll(\"[data-maya=mark][data-key]\"))\n if (sel.some((q) => matches(q, m, type()))) m.setAttribute(\"data-selected\", \"\");\n else m.removeAttribute(\"data-selected\");\n },\n off: () => root.removeEventListener(\"click\", onClick),\n };\n}\n","/*\n * Table header sort. Same reduce/mount contract as measure.ts.\n * Markup: `[data-maya=sort][data-field]` groups from core/marks/table.ts (tabindex 0, role button).\n * Click, Enter or Space commits view.sortBy: same field toggles, a new field starts desc for a\n * measure and asc for the row label. Persistence: resets when type, x or y change.\n */\nimport { t } from \"../core/strings.ts\";\nimport type { Handlers, Host, SpecEvent, State } from \"../core/types.ts\";\n\nexport type SortEvent = { type: \"sort\"; field: string; label?: boolean } | SpecEvent;\n\nexport const reduce = (s: State, e: SortEvent): State => {\n if (e.type === \"spec\") {\n const { prev, next } = e;\n if (\n !s.view.sortBy ||\n (prev &&\n prev.type === next.type &&\n prev.x === next.x &&\n JSON.stringify(prev.y) === JSON.stringify(next.y))\n )\n return s;\n const { sortBy: _drop, ...view } = s.view;\n return { ...s, view };\n }\n const cur = s.view.sortBy;\n const dir = cur?.[0] === e.field ? (cur[1] === \"asc\" ? \"desc\" : \"asc\") : e.label ? \"asc\" : \"desc\";\n return { ...s, view: { ...s.view, sortBy: [e.field, dir] } };\n};\n\nconst HEAD = \"[data-maya=sort]\";\n\nexport const mount = (host: Host): Handlers => {\n let want: string | null = null; // field to refocus after the repaint\n\n const pick = (h: Element): void => {\n const spec = host.spec();\n const field = h.getAttribute(\"data-field\");\n if (!spec || spec.type !== \"table\" || !field) return;\n const next = reduce(host.state(), { type: \"sort\", field, label: field === spec.x });\n const [, dir] = next.view.sortBy!;\n want = field;\n host.commit(next);\n const titles = spec.titles as Record<string, string> | undefined;\n host.announce(\n t(\n spec,\n \"sortedBy\",\n titles?.[field] ?? field,\n t(spec, dir === \"asc\" ? \"ascending\" : \"descending\"),\n ),\n );\n };\n\n const click = (e: Event): void => {\n const h = (e.target as Element).closest?.(HEAD);\n if (h) pick(h);\n };\n const keydown = (e: Event): void => {\n const k = (e as KeyboardEvent).key;\n const h = (e.target as Element).closest?.(HEAD);\n if (!h || (k !== \"Enter\" && k !== \" \")) return;\n e.preventDefault();\n e.stopPropagation(); // the chart's own Enter handler would drill/select\n pick(h);\n };\n host.root.addEventListener(\"click\", click);\n host.root.addEventListener(\"keydown\", keydown, true);\n\n return {\n painted() {\n if (want === null) return;\n const f = want;\n want = null;\n [...host.root.querySelectorAll<HTMLElement>(HEAD)]\n .find((h) => h.getAttribute(\"data-field\") === f)\n ?.focus({ preventScroll: true });\n },\n off() {\n host.root.removeEventListener(\"click\", click);\n host.root.removeEventListener(\"keydown\", keydown, true);\n },\n };\n};\n","import { t as str } from \"../core/strings.ts\";\nimport type { ChartSpec } from \"../core/types.ts\";\n\nconst a = (e: Element, k: string) => e.getAttribute(k) ?? \"\";\nconst h = (t: string, txt = \"\", at: Record<string, string> = {}) => {\n const e = document.createElement(t);\n e.textContent = txt;\n for (const k in at) e.setAttribute(k, at[k]!);\n return e;\n};\n// Links (sankey flows, chord ribbons) carry the same payload as marks.\nconst SEL = \"[data-maya=hit],[data-maya=mark],[data-maya=link][data-key]\";\nconst FADE = 120;\n\nexport interface Tooltip {\n off(): void;\n hide(): void;\n /** The mark the tooltip is showing (hover, tap or keyboard). */\n active(): Element | undefined;\n /** Rebuild the key index after a patch and re-show the active mark if it survived. */\n refresh(): void;\n}\n\nexport function tooltip(\n root: ShadowRoot,\n on: () => boolean,\n announce: (text: string) => void = () => {},\n spec: () => ChartSpec | undefined = () => undefined,\n): Tooltip {\n const q = (s: string) => root.querySelector<HTMLElement>(s)!;\n const box = q(\".maya-box\"),\n tip = q(\".maya-tip\"),\n probe = q(\".maya-probe\"),\n host = root.host;\n const anchored = !!globalThis.CSS?.supports?.(\"anchor-name: --x\");\n // Hit-testing: closest() + these maps, rebuilt once per patch (never querySelectorAll per move).\n let list: Element[] = [],\n byKey = new Map<string, Element>(),\n byC = new Map<string, Element[]>();\n let cur: Element | undefined,\n open = false,\n pin = false,\n kb = false,\n timer: ReturnType<typeof setTimeout> | undefined,\n down0: [number, number] | undefined;\n\n const index = () => {\n list = [...box.querySelectorAll(\"[data-maya=mark][data-key]\")];\n byKey = new Map();\n byC = new Map();\n for (const m of list) {\n byKey.set(a(m, \"data-key\"), m);\n if (!m.hasAttribute(\"data-c\")) continue;\n const c = a(m, \"data-c\");\n byC.set(c, [...(byC.get(c) ?? []), m]);\n }\n };\n const group = (m: Element) =>\n (a(m, \"data-maya\") !== \"link\" && m.hasAttribute(\"data-c\") && byC.get(a(m, \"data-c\"))) || [m];\n // Lines that belong to one category (parallel coordinates) light up with it.\n let lit: Element[] = [];\n const light = (m: Element | undefined) => {\n for (const l of lit) l.removeAttribute(\"data-active\");\n lit = m?.hasAttribute(\"data-c\")\n ? [...box.querySelectorAll(`[data-maya=line][data-c=\"${CSS.escape(a(m, \"data-c\"))}\"]`)]\n : [];\n for (const l of lit) l.setAttribute(\"data-active\", \"\");\n };\n\n const cross = (m: Element | undefined) => {\n const g = box.querySelector<SVGElement>(\"[data-maya=cross]\");\n if (!g || (!m && g.style.opacity !== \"1\")) return; // hidden by CSS until first shown\n g.style.opacity = m ? \"1\" : \"0\";\n const svg = g.ownerSVGElement ?? box.querySelector(\"svg\");\n if (!m || !svg) return;\n const r = m.getBoundingClientRect(),\n s = svg.getBoundingClientRect();\n const vw = +(a(svg, \"viewBox\").split(\" \")[2] || s.width) || 1;\n g.style.transform = `translateX(${((r.left + r.width / 2 - s.left) * vw) / (s.width || vw)}px)`;\n };\n\n const hide = () => {\n cur?.removeAttribute(\"data-active\");\n light(undefined);\n cur = undefined;\n pin = false;\n cross(undefined);\n tip.classList.remove(\"maya-open\");\n if (open) {\n open = false;\n clearTimeout(timer);\n timer = setTimeout(() => open || tip.hidePopover(), FADE);\n }\n };\n\n const markOf = (t: EventTarget | null | undefined, ev?: Event) => {\n const e = (t as Element | null)?.closest?.(SEL);\n if (!e || a(e, \"data-maya\") !== \"hit\") return e ?? undefined;\n if (e.hasAttribute(\"data-key\")) return byKey.get(a(e, \"data-key\"));\n // Keyless band hit: the mark in this category nearest the pointer.\n const y = (ev as PointerEvent | undefined)?.clientY ?? 0;\n let best: Element | undefined,\n bd = Infinity;\n for (const m of byC.get(a(e, \"data-c\")) ?? []) {\n const r = m.getBoundingClientRect(),\n d = Math.abs(y - (r.top + r.height / 2));\n if (d < bd) ((bd = d), (best = m));\n }\n return best;\n };\n\n /** Plain-text row for one mark: also what the live region reads. */\n const tone = (k: Element) => {\n const v = a(k, \"data-tone\"),\n s = spec();\n if (!v) return \"\";\n const tgt = typeof s?.colorBy === \"object\";\n return str(s ?? {}, v === \"good\" ? (tgt ? \"above\" : \"positive\") : tgt ? \"below\" : \"negative\");\n };\n\n const show = (m: Element, say = false) => {\n cur?.removeAttribute(\"data-active\");\n cur = m;\n m.setAttribute(\"data-active\", \"\");\n light(m);\n const g = group(m);\n tip.replaceChildren(\n h(\"b\", a(m, \"data-x\")),\n ...g.map((k) => {\n const row = h(\"div\", \"\", k === m ? { \"data-on\": \"\" } : {});\n const s = a(k, \"data-series\");\n if (s) {\n if (k.hasAttribute(\"data-s\")) row.append(h(\"i\", \"\", { \"data-s\": a(k, \"data-s\") }));\n row.append(h(\"span\", s));\n }\n row.append(h(\"span\", a(k, \"data-f\")));\n const tn = tone(k);\n if (tn) row.append(h(\"span\", tn));\n return row;\n }),\n );\n cross(m);\n // The probe's containing block is the host's padding box (:host is position:relative).\n const r = m.getBoundingClientRect(),\n p = host.getBoundingClientRect();\n Object.assign(probe.style, {\n left: r.left - p.left - host.clientLeft + \"px\",\n top: r.top - p.top - host.clientTop + \"px\",\n width: r.width + \"px\",\n height: r.height + \"px\",\n });\n clearTimeout(timer);\n if (!open) (tip.showPopover(), (open = true));\n tip.classList.add(\"maya-open\");\n if (!anchored) {\n const t = tip.getBoundingClientRect(),\n w = globalThis.visualViewport?.width ?? innerWidth;\n let y = r.top - t.height - 8;\n if (y < 8) y = r.bottom + 8;\n const x = Math.min(Math.max(r.left + r.width / 2 - t.width / 2, 8), w - t.width - 8);\n Object.assign(tip.style, { position: \"fixed\", left: x + \"px\", top: y + \"px\" });\n }\n if (say)\n announce(\n `${a(m, \"data-x\")}: ${g.map((k) => [a(k, \"data-series\"), a(k, \"data-f\"), tone(k)].filter(Boolean).join(\" \")).join(\", \")}`,\n );\n };\n\n const move = (e: Event) => {\n kb = false;\n if (!on() || (e as PointerEvent).pointerType !== \"mouse\") return;\n const m = markOf(e.target, e);\n if (!m) hide();\n else if (m !== cur) show(m);\n };\n // Touch/pen: remember where it started; a tap (moved < 4 px) shows on pointerup.\n const down = (e: Event) => {\n kb = false;\n const p = e as PointerEvent;\n down0 = p.pointerType === \"mouse\" ? undefined : [p.clientX, p.clientY];\n };\n const up = (e: Event) => {\n const p = e as PointerEvent;\n const d = down0;\n down0 = undefined;\n if (!on() || !d || Math.hypot(p.clientX - d[0], p.clientY - d[1]) >= 4) return;\n const m = markOf(e.target, e);\n if (m) show(m);\n };\n const outside = (e: Event) => {\n const p = e.composedPath();\n if (!p.includes(box) || !markOf(p[0], e)) hide();\n };\n const leave = (e: Event) => (e as PointerEvent).pointerType === \"mouse\" && hide();\n const key = (e: Event) => {\n const k = (e as KeyboardEvent).key;\n if (!on()) return;\n kb = true;\n if (k === \"Escape\") {\n // Pinned tooltip is Escape's first priority: consume the key so nothing else reacts.\n if (pin) e.preventDefault();\n return hide();\n }\n let next: Element | undefined;\n if (k === \" \") {\n next = cur ?? list[0];\n if (!next) return;\n pin = !pin;\n if (pin) show(next, true);\n } else if (k.startsWith(\"Arrow\")) {\n const d = k === \"ArrowRight\" || k === \"ArrowDown\" ? 1 : -1;\n const i = cur ? list.indexOf(cur) : -1;\n if (i < 0) next = list[0];\n else if (k === \"ArrowUp\" || k === \"ArrowDown\") {\n const g = group(list[i]!);\n next = g[g.indexOf(list[i]!) + d];\n } else {\n const cs = [...byC.keys()];\n const g = byC.get(cs[cs.indexOf(a(list[i]!, \"data-c\")) + d]!);\n next = g?.find((m) => a(m, \"data-s\") === a(list[i]!, \"data-s\")) ?? g?.[0];\n }\n if (next) show(next, true);\n } else return;\n e.preventDefault();\n };\n const blur = () => pin || hide();\n\n const on_: [EventTarget, string, EventListener, AddEventListenerOptions?][] = [\n [box, \"pointerover\", move],\n [box, \"pointermove\", move],\n [box, \"pointerdown\", down],\n [box, \"pointerup\", up],\n [box, \"pointerleave\", leave],\n [box, \"keydown\", key],\n [box, \"focusout\", blur],\n [document, \"pointerdown\", outside, { capture: true }],\n // Focusing the chart can scroll it into view; that must not close a keyboard tooltip.\n [window, \"scroll\", () => kb || hide(), { capture: true, passive: true }],\n ];\n for (const [t, n, f, o] of on_) t.addEventListener(n, f, o);\n index();\n return {\n off: () => (\n hide(),\n clearTimeout(timer),\n on_.forEach(([t, n, f, o]) => t.removeEventListener(n, f, o))\n ),\n hide,\n active: () => cur,\n refresh() {\n const k = cur && a(cur, \"data-key\");\n index();\n const m = k ? byKey.get(k) : undefined;\n if (m && on()) show(m);\n else hide();\n },\n };\n}\n","/*\n * Zoom (T10d). Same reduce/mount contract as measure.ts.\n * Drag draws `[data-maya=brush]`; release sets view.window; Reset chip (`.maya-reset`),\n * double-click and Escape restore. Escape priority: cancel() = brush in progress (2),\n * escape() = window (4). Persistence: resets when drill or x change; clamps to category count.\n */\nimport { t } from \"../core/strings.ts\";\nimport type { Handlers, Host, SpecEvent, State, View } from \"../core/types.ts\";\n\ntype Win = NonNullable<View[\"window\"]>;\nexport type ZoomEvent = { type: \"zoom\"; window: Win } | { type: \"reset\" } | SpecEvent;\n\nconst clear = (s: State): State => {\n if (!s.view.window) return s;\n const { window: _w, ...view } = s.view;\n return { ...s, view };\n};\n\nexport const reduce = (s: State, e: ZoomEvent): State => {\n if (e.type === \"zoom\") {\n const w = e.window;\n if (w.length === 2) {\n const i0 = Math.max(0, Math.trunc(Math.min(w[0], w[1])));\n const i1 = Math.max(i0, Math.trunc(Math.max(w[0], w[1])));\n return { ...s, view: { ...s.view, window: [i0, i1] } };\n }\n const [a, b, c, d] = w;\n return {\n ...s,\n view: { ...s.view, window: [Math.min(a, b), Math.max(a, b), Math.min(c, d), Math.max(c, d)] },\n };\n }\n if (e.type === \"reset\") return clear(s);\n const { prev, next } = e;\n if (\n prev &&\n (prev.type !== next.type ||\n prev.x !== next.x ||\n JSON.stringify(prev.path) !== JSON.stringify(next.path))\n )\n return clear(s);\n return s;\n};\n\nconst MIN_START = 4; // px of movement before a brush starts (tooltip taps stay < 4)\nconst MIN_SPAN = 2; // px a brush must span to commit\nconst NS = \"http://www.w3.org/2000/svg\";\nconst num = (s: string | null): number[] => (s ?? \"\").trim().split(/\\s+/).map(Number);\nconst fmt = (n: number) => String(+n.toPrecision(4));\n\nexport const mount = (host: Host): Handlers => {\n const { root } = host;\n let down: { id: number; x: number; y: number; svg: SVGSVGElement } | undefined;\n let brush: SVGRectElement | undefined;\n let lastSaid = \"\";\n let lastDrill = JSON.stringify(host.state().view.drill);\n\n const svgOf = (e: Event) =>\n (e.target as Element | null)?.closest?.(\"svg.maya-svg\") as SVGSVGElement | null;\n const geom = (svg: SVGSVGElement) => {\n const r = svg.getBoundingClientRect();\n const vb = num(svg.getAttribute(\"viewBox\"));\n const k = r.width ? (vb[2] ?? r.width) / r.width : 1;\n const ky = r.height ? (vb[3] ?? r.height) / r.height : 1;\n const [px = 0, py = 0, pw = 1, ph = 1] = num(svg.getAttribute(\"data-plot\"));\n return { r, k, ky, px, py, pw, ph, vx: vb[0] ?? 0, vy: vb[1] ?? 0 };\n };\n const clampTo = (v: number, lo: number, hi: number) => Math.min(hi, Math.max(lo, v));\n\n const stopBrush = () => {\n brush?.remove();\n brush = undefined;\n down = undefined;\n };\n\n /** Pointer position in viewBox units, clamped to the plot box. */\n const at = (svg: SVGSVGElement, e: PointerEvent) => {\n const g = geom(svg);\n return {\n g,\n x: clampTo((e.clientX - g.r.left) * g.k + g.vx, g.px, g.px + g.pw),\n y: clampTo((e.clientY - g.r.top) * g.ky + g.vy, g.py, g.py + g.ph),\n };\n };\n const bandMode = (svg: SVGSVGElement) => !svg.hasAttribute(\"data-xd\");\n\n const draw = (svg: SVGSVGElement, a: { x: number; y: number }, b: { x: number; y: number }) => {\n const g = geom(svg);\n if (!brush || brush.ownerSVGElement !== svg) {\n brush?.remove();\n brush = document.createElementNS(NS, \"rect\") as SVGRectElement;\n brush.setAttribute(\"data-maya\", \"brush\");\n brush.setAttribute(\"width\", \"1\");\n brush.setAttribute(\"height\", \"1\");\n brush.style.pointerEvents = \"none\";\n brush.style.transformOrigin = \"0 0\";\n svg.append(brush);\n }\n const band = bandMode(svg);\n const x = Math.min(a.x, b.x),\n w = Math.abs(a.x - b.x);\n const y = band ? g.py : Math.min(a.y, b.y),\n h = band ? g.ph : Math.abs(a.y - b.y);\n brush.style.transform = `matrix(${w},0,0,${h},${x},${y})`;\n };\n\n let start: { x: number; y: number } | undefined;\n\n const onDown = (ev: Event) => {\n const e = ev as PointerEvent;\n const svg = svgOf(e);\n if (!svg || !host.spec()?.zoom) return;\n if (e.pointerType === \"mouse\" && e.button !== 0) return;\n if (e.isPrimary === false) return;\n stopBrush();\n svg.style.touchAction = \"pan-y\";\n down = { id: e.pointerId, x: e.clientX, y: e.clientY, svg };\n start = at(svg, e);\n };\n\n const onMove = (ev: Event) => {\n const e = ev as PointerEvent;\n if (!down || e.pointerId !== down.id || !start) return;\n if (!brush && Math.hypot(e.clientX - down.x, e.clientY - down.y) < MIN_START) return;\n if (!brush) {\n try {\n down.svg.setPointerCapture(e.pointerId);\n } catch {\n /* capture is best-effort */\n }\n }\n draw(down.svg, start, at(down.svg, e));\n };\n\n const swallowClick = () => {\n const eat = (c: Event) => c.stopPropagation();\n root.addEventListener(\"click\", eat, { capture: true, once: true });\n setTimeout(() => root.removeEventListener(\"click\", eat, { capture: true }), 0);\n };\n\n const onUp = (ev: Event) => {\n const e = ev as PointerEvent;\n if (!down || e.pointerId !== down.id || !start) return;\n const { svg } = down;\n const began = !!brush;\n const a = start;\n const b = at(svg, e);\n const g = b.g;\n try {\n svg.releasePointerCapture(e.pointerId);\n } catch {\n /* not captured */\n }\n stopBrush();\n start = undefined;\n if (!began) return;\n swallowClick();\n const band = bandMode(svg);\n const spanX = Math.abs(a.x - b.x) / g.k,\n spanY = Math.abs(a.y - b.y) / g.ky;\n if (band ? spanX < MIN_SPAN : spanX < MIN_SPAN || spanY < MIN_SPAN) return;\n const s = host.state();\n if (band) {\n const n = Math.max(1, +(svg.getAttribute(\"data-n\") ?? 1));\n const off = s.view.window?.[0] ?? 0;\n const idx = (x: number) => clampTo(Math.floor(((x - g.px) / g.pw) * n), 0, n - 1);\n const i0 = idx(Math.min(a.x, b.x)),\n i1 = idx(Math.max(a.x, b.x));\n host.commit(reduce(s, { type: \"zoom\", window: [off + i0, off + i1] }), null);\n } else {\n const xd = num(svg.getAttribute(\"data-xd\")),\n yd = num(svg.getAttribute(\"data-yd\"));\n const vx = (x: number) => xd[0]! + ((x - g.px) / g.pw) * (xd[1]! - xd[0]!);\n const vy = (y: number) => yd[1]! - ((y - g.py) / g.ph) * (yd[1]! - yd[0]!);\n host.commit(reduce(s, { type: \"zoom\", window: [vx(a.x), vx(b.x), vy(a.y), vy(b.y)] }), null);\n }\n };\n\n const reset = (): boolean => {\n const s = host.state();\n if (!s.view.window) return false;\n host.commit(reduce(s, { type: \"reset\" }), null);\n return true;\n };\n\n const onClick = (e: Event) => {\n if ((e.target as Element).closest(\".maya-reset\")) reset();\n };\n const onDbl = (e: Event) => {\n if (svgOf(e)) reset();\n };\n\n root.addEventListener(\"pointerdown\", onDown);\n root.addEventListener(\"pointermove\", onMove);\n root.addEventListener(\"pointerup\", onUp);\n const onCancel = () => {\n stopBrush();\n start = undefined;\n };\n root.addEventListener(\"pointercancel\", onCancel);\n root.addEventListener(\"click\", onClick);\n root.addEventListener(\"dblclick\", onDbl);\n\n return {\n cancel() {\n if (!brush) return false;\n stopBrush();\n start = undefined;\n return true;\n },\n escape: reset,\n painted() {\n const s = host.state();\n const spec = host.spec();\n const w = s.view.window;\n const drill = JSON.stringify(s.view.drill);\n const drilled = drill !== lastDrill;\n lastDrill = drill;\n if (w && drilled) return void reset();\n const svg = root.querySelector<SVGSVGElement>(\"svg.maya-svg\");\n if (svg && spec?.zoom) svg.style.touchAction = \"pan-y\";\n const box = root.querySelector(\".maya-box\");\n let chip = box?.querySelector<HTMLButtonElement>(\".maya-reset\") ?? null;\n if (!w || !spec) {\n chip?.remove();\n lastSaid = \"\";\n return;\n }\n if (box && !chip) {\n chip = document.createElement(\"button\");\n chip.type = \"button\";\n chip.className = \"maya-reset\";\n box.append(chip);\n }\n if (chip) chip.textContent = t(spec, \"reset\");\n const key = w.join(\",\");\n if (key === lastSaid) return;\n lastSaid = key;\n if (w.length === 4) host.announce(t(spec, \"zoomedTo\", fmt(w[0]), fmt(w[1])));\n else {\n const xs = [...root.querySelectorAll(\"[data-maya=mark][data-x]\")].map((m) =>\n m.getAttribute(\"data-x\")!,\n );\n if (xs.length) host.announce(t(spec, \"zoomedTo\", xs[0]!, xs[xs.length - 1]!));\n }\n },\n off() {\n stopBrush();\n root.removeEventListener(\"pointerdown\", onDown);\n root.removeEventListener(\"pointermove\", onMove);\n root.removeEventListener(\"pointerup\", onUp);\n root.removeEventListener(\"pointercancel\", onCancel);\n root.removeEventListener(\"click\", onClick);\n root.removeEventListener(\"dblclick\", onDbl);\n },\n };\n};\n","import { VERSION } from \"../core/registry.ts\";\nimport { renderParts, shellInner } from \"../core/render.ts\";\nimport { MayaSpecError } from \"../core/validate.ts\";\nimport type {\n ChartSpec,\n Handlers,\n Host,\n MayaErrorDetail,\n MayaSelectDetail,\n Parts,\n Sel,\n SpecEvent,\n State,\n View,\n} from \"../core/types.ts\";\nimport { css } from \"../styles/theme.ts\";\nimport { type Box, boxOf, patch } from \"./animate.ts\";\nimport * as drill from \"./drill.ts\";\nimport { html } from \"./html.ts\";\nimport * as measure from \"./measure.ts\";\nimport * as select from \"./select.ts\";\nimport * as sort from \"./sort.ts\";\nimport { type Tooltip, tooltip } from \"./tooltip.ts\";\nimport * as zoom from \"./zoom.ts\";\n\nlet sheet: CSSStyleSheet | undefined;\n\nexport class MayaChart extends HTMLElement {\n static observedAttributes = [\"spec\"];\n static version = VERSION;\n #prop: ChartSpec | undefined;\n #json: ChartSpec | undefined;\n #attr: ChartSpec | undefined;\n #state: State = { view: {}, selected: [] };\n #seen: ChartSpec | undefined;\n #ix: Record<\"measure\" | \"drill\" | \"select\" | \"zoom\" | \"sort\", Handlers> | undefined;\n #say: ReturnType<typeof setTimeout> | undefined;\n #last: Record<string, string> = {};\n #size = [0, 0];\n #raf = 0;\n #ro: ResizeObserver | undefined;\n #resized = false;\n #off: (() => void) | undefined;\n #tip: Tooltip | undefined;\n #origin: Box | undefined;\n #vars = new Set<string>();\n #err = \"\";\n #drawn = false;\n\n get spec(): ChartSpec | undefined {\n return this.#prop ?? this.#json ?? this.#attr;\n }\n // Accepts typed rows (ChartSpec<MyRow>); reads back as the Row-typed spec.\n set spec(v: ChartSpec<any> | undefined) {\n this.#prop = v;\n this.#schedule();\n }\n get data(): ChartSpec[\"data\"] | undefined {\n return this.spec?.data;\n }\n set data(rows: ChartSpec[\"data\"]) {\n this.#prop = { ...this.spec!, data: rows };\n this.#schedule();\n }\n\n /** Interaction state ({ measure, drill, window, hidden }). Setting never dispatches events. */\n get view(): View {\n return this.#state.view;\n }\n set view(v: View) {\n this.#state = { ...this.#state, view: v ?? {} };\n this.#schedule();\n }\n /** Selected marks by raw values. Setting never dispatches events. */\n get selected(): readonly Sel[] {\n return this.#state.selected;\n }\n set selected(v: readonly Sel[]) {\n this.#state = { ...this.#state, selected: v ?? [] };\n this.#schedule();\n }\n\n attributeChangedCallback(_: string, __: string | null, v: string | null): void {\n try {\n this.#attr = v ? JSON.parse(v) : undefined;\n } catch (e) {\n this.#attr = undefined;\n console.error(e);\n }\n this.#schedule();\n }\n\n connectedCallback(): void {\n // Upgrade race: properties set on the element before it was defined shadow the accessors.\n for (const p of [\"spec\", \"data\", \"view\", \"selected\"] as const)\n if (Object.hasOwn(this, p)) {\n const v = (this as any)[p];\n delete (this as any)[p];\n (this as any)[p] = v;\n }\n const j = this.querySelector(':scope > script[type=\"application/json\"]')?.textContent;\n try {\n if (j) this.#json = JSON.parse(j);\n } catch (e) {\n console.error(e);\n }\n let root = this.shadowRoot;\n if (!root) {\n root = this.attachShadow({ mode: \"open\" });\n sheet ??= new CSSStyleSheet();\n if (!sheet.cssRules.length) sheet.replaceSync(css);\n root.adoptedStyleSheets = [sheet];\n root.innerHTML = html(\n shellInner(\n {\n svg: \"\",\n legend: \"\",\n controls: \"\",\n crumbs: \"\",\n table: \"\",\n title: \"\",\n style: \"\",\n vars: [],\n warnings: [],\n },\n \"\",\n ),\n );\n }\n root.addEventListener(\"click\", this.#click);\n root.addEventListener(\"keydown\", this.#key);\n globalThis.addEventListener(\"maya-register\", this.#registered);\n const host: Host = {\n root,\n el: this,\n spec: () => this.spec,\n state: () => this.#state,\n commit: (next, target) => this.#commit(next, target ?? null),\n announce: (text) => this.#announce(text),\n };\n this.#ix = {\n measure: measure.mount(host),\n drill: drill.mount(host),\n select: select.mount(host),\n zoom: zoom.mount(host),\n sort: sort.mount(host),\n };\n const box = root.querySelector(\".maya-box\")!;\n this.#tip = tooltip(\n root,\n () => this.spec?.tooltip !== false,\n (t) => this.#announce(t),\n () => this.spec,\n );\n this.#off = this.#tip.off;\n this.#ro = new ResizeObserver(() => {\n if (\n Math.abs(box.clientWidth - this.#size[0]!) > 1 ||\n Math.abs(box.clientHeight - this.#size[1]!) > 1\n ) {\n this.#ix?.zoom.cancel?.(); // a brush's pixel geometry is stale after a resize\n this.#resized = true;\n this.#schedule();\n }\n });\n this.#ro.observe(box);\n this.#schedule();\n }\n\n disconnectedCallback(): void {\n cancelAnimationFrame(this.#raf);\n this.#raf = 0;\n this.#ro?.disconnect();\n this.#off?.();\n this.shadowRoot?.removeEventListener(\"click\", this.#click);\n this.shadowRoot?.removeEventListener(\"keydown\", this.#key);\n globalThis.removeEventListener(\"maya-register\", this.#registered);\n clearTimeout(this.#say);\n for (const h of Object.values(this.#ix ?? {})) h.off();\n this.#ix = undefined;\n }\n\n #registered = () => this.#schedule();\n\n /** Polite live region: static node, textContent only, debounced 300 ms. User-initiated only. */\n #announce(text: string): void {\n clearTimeout(this.#say);\n this.#say = setTimeout(() => {\n const live = this.shadowRoot?.querySelector(\"[data-maya=live]\");\n if (live) live.textContent = text;\n }, 300);\n }\n\n /** Standalone SVG: custom properties resolved from the computed style (dark export looks right). */\n toSVG(): string {\n const root = this.shadowRoot;\n const svg = root?.querySelector<SVGSVGElement>(\"svg.maya-svg\");\n if (!root || !svg) return \"\";\n const cs = getComputedStyle(root.querySelector(\".maya\")!);\n const names = new Set([...css.matchAll(/--maya-[\\w-]+/g)].map((m) => m[0]));\n for (const v of this.#vars) names.add(v);\n const decl = [...names]\n .map((k) => [k, cs.getPropertyValue(k).trim()])\n .filter(([, v]) => v)\n .map(([k, v]) => `${k}:${v}`)\n .join(\";\");\n const c = svg.cloneNode(true) as SVGSVGElement;\n c.setAttribute(\"xmlns\", \"http://www.w3.org/2000/svg\");\n c.removeAttribute(\"tabindex\");\n for (const e of c.querySelectorAll(\"[data-active]\")) e.removeAttribute(\"data-active\");\n const st = document.createElementNS(\"http://www.w3.org/2000/svg\", \"style\");\n st.textContent = `${css}.maya-svg{${decl}}`;\n c.prepend(st);\n return c.outerHTML;\n }\n\n #emit(type: string, detail: unknown, cancelable = false): boolean {\n return this.dispatchEvent(\n new CustomEvent(type, { detail, bubbles: true, composed: true, cancelable }),\n );\n }\n\n /** User-initiated state change: re-render, then tell the page what changed. */\n #commit(next: State, target: MayaSelectDetail[\"target\"]): void {\n const prev = this.#state;\n // Drilling: the clicked mark is where entering marks start from.\n const am = this.#tip?.active();\n if (am && JSON.stringify(prev.view.drill) !== JSON.stringify(next.view.drill))\n this.#origin = boxOf(am);\n this.#state = next;\n this.#schedule();\n if (JSON.stringify(prev.view) !== JSON.stringify(next.view)) this.#emit(\"maya-view\", next.view);\n if (JSON.stringify(prev.selected) !== JSON.stringify(next.selected))\n this.#emit(\"maya-select\", {\n selected: [...next.selected],\n target,\n } satisfies MayaSelectDetail);\n }\n\n /*\n * One keydown dispatcher. Escape priority: pinned tooltip (tooltip.ts, T2) -> brush in\n * progress -> selection -> zoom window -> drill pop. Enter: drill, else select, on the\n * keyboard-active mark. T2 routes the tooltip's own Escape/Enter/Space through here.\n */\n #key = (e: Event) => {\n const ix = this.#ix;\n if (!ix) return;\n if (e.defaultPrevented) return; // the tooltip consumed it (pinned Escape)\n const k = (e as KeyboardEvent).key;\n let done: boolean | undefined;\n if (k === \"Escape\")\n done =\n ix.zoom.cancel?.() || ix.select.escape?.() || ix.zoom.escape?.() || ix.drill.escape?.();\n else if (k === \"Enter\") {\n const m = this.#tip?.active();\n done = !!m && (ix.drill.enter?.(m) || ix.select.enter?.(m));\n }\n if (done) e.preventDefault();\n };\n\n #click = (e: Event) => {\n // In select mode the legend selects (select.ts) instead of hiding.\n if (this.spec?.select) return;\n const b = (e.target as Element).closest(\"[data-maya=legend] button\");\n if (!b) return;\n const k = b.getAttribute(\"data-key\") ?? \"\";\n const hidden = new Set(this.#state.view.hidden);\n if (hidden.has(k)) hidden.delete(k);\n else if (this.shadowRoot!.querySelectorAll(\"[data-maya=legend] [aria-pressed=true]\").length > 1)\n hidden.add(k);\n else return;\n this.#commit({ ...this.#state, view: { ...this.#state.view, hidden: [...hidden] } }, null);\n };\n\n #schedule(): void {\n if (this.isConnected && !this.#raf)\n this.#raf = requestAnimationFrame(() => ((this.#raf = 0), this.#render()));\n }\n\n #render(): void {\n const root = this.shadowRoot!;\n const spec = this.spec;\n const box = root.querySelector(\".maya-box\")!;\n if (!spec) return;\n if (spec !== this.#seen) {\n // Persistence rules live in the reducers (measure, drill, zoom, select).\n const ev: SpecEvent = { type: \"spec\", prev: this.#seen, next: spec };\n this.#state = select.reduce(\n zoom.reduce(sort.reduce(drill.reduce(measure.reduce(this.#state, ev), ev), ev), ev),\n ev,\n );\n this.#seen = spec;\n }\n const width = box.clientWidth || 640,\n height = box.clientHeight || 320;\n this.#size = [box.clientWidth, box.clientHeight];\n let parts;\n try {\n parts = renderParts(spec, {\n width,\n height,\n view: this.#state.view,\n selected: this.#state.selected,\n });\n } catch (e) {\n this.#tip?.hide();\n const d: MayaErrorDetail | null =\n e instanceof MayaSpecError ? { code: e.code, path: e.path, message: e.message } : null;\n // Cancelable: preventDefault() hides the box (the host shows its own error).\n if (d && !this.#emit(\"maya-error\", d, true)) {\n box.replaceChildren();\n this.#drawn = false;\n return;\n }\n const pre = document.createElement(\"pre\");\n pre.className = \"maya-err\"; // styled by theme.ts; never an inline style\n pre.textContent = e instanceof Error ? e.message : String(e);\n box.replaceChildren(pre);\n this.#drawn = false;\n if (pre.textContent !== this.#err) console.error(e);\n this.#err = pre.textContent;\n return;\n }\n this.#err = \"\";\n const focus = this.#focusId();\n const maya = root.querySelector<HTMLElement>(\".maya\")!;\n // Slots in shell order; each is replaced only when its markup changed.\n const slots: [keyof Parts, string][] = [\n [\"title\", \".maya-title\"],\n [\"controls\", \".maya-ctl\"],\n [\"legend\", \"[data-maya=legend]\"],\n [\"crumbs\", \".maya-crumbs\"],\n ];\n slots.forEach(([k, sel], i) => {\n if (this.#last[k] === parts[k]) return;\n this.#last[k] = parts[k] as string;\n root.querySelector(sel)?.remove();\n const next = slots.slice(i + 1).map(([, s]) => root.querySelector(s));\n (next.find(Boolean) ?? box).insertAdjacentHTML(\"beforebegin\", html(parts[k] as string));\n });\n if (this.#last[\"table\"] !== parts.table) {\n this.#last[\"table\"] = parts.table;\n root.querySelector(\"table.maya-sr\")?.remove();\n box.insertAdjacentHTML(\"afterend\", html(parts.table));\n }\n // Overrides via CSSOM (never a style attribute).\n for (const [k, v] of parts.vars) maya.style.setProperty(k, v);\n for (const k of this.#vars)\n if (!parts.vars.some(([n]) => n === k)) maya.style.removeProperty(k);\n this.#vars = new Set(parts.vars.map(([k]) => k));\n // Nothing animates on resize: geometry must track the container immediately.\n const still = spec.animate === false || matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n const resized = this.#resized;\n this.#resized = false;\n patch(box, parts.svg, this.#drawn && !still, {\n origin: this.#origin,\n after: () => this.#tip?.refresh(),\n instant: resized,\n });\n this.#origin = undefined;\n this.#drawn = true;\n this.#restore(focus);\n for (const h of Object.values(this.#ix ?? {})) h.painted?.();\n this.#emit(\"maya-render\", {});\n }\n\n /** Stable id of the focused control: svg, legend:i, measure:i, crumb:i or reset. */\n #focusId(): string | undefined {\n const f = this.shadowRoot!.activeElement;\n if (!f) return;\n for (const [id, sel] of FOCUS) {\n const all = [...this.shadowRoot!.querySelectorAll(sel)];\n const i = all.indexOf(f);\n if (i >= 0) return `${id}:${i}`;\n }\n }\n\n #restore(id: string | undefined): void {\n const root = this.shadowRoot!;\n if (!id || root.activeElement) return;\n const [k, i] = id.split(\":\");\n const sel = FOCUS.find(([n]) => n === k)![1];\n root.querySelectorAll<HTMLElement>(sel)[+i!]?.focus({ preventScroll: true });\n }\n}\n\nconst FOCUS: [string, string][] = [\n [\"svg\", \".maya-svg\"],\n [\"legend\", \"[data-maya=legend] button\"],\n [\"measure\", \".maya-ctl [role=radio]\"],\n [\"crumb\", \".maya-crumbs :is(button,a)\"],\n [\"reset\", \".maya-reset\"],\n];\n","import { VERSION } from \"./core/registry.ts\";\nimport type { MayaErrorDetail, MayaSelectDetail, MayaViewDetail } from \"./core/types.ts\";\nimport { MayaChart } from \"./element/maya-chart.ts\";\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"maya-chart\": MayaChart;\n }\n interface HTMLElementEventMap {\n \"maya-select\": CustomEvent<MayaSelectDetail>;\n \"maya-view\": CustomEvent<MayaViewDetail>;\n \"maya-error\": CustomEvent<MayaErrorDetail>;\n \"maya-render\": CustomEvent<Record<string, never>>;\n }\n}\n\nif (typeof customElements !== \"undefined\") {\n const prior = customElements.get(\"maya-chart\") as { version?: string } | undefined;\n if (!prior) customElements.define(\"maya-chart\", MayaChart);\n else if (prior.version !== VERSION)\n console.warn(\n `mayacharts: <maya-chart> ${prior.version ?? \"(unknown)\"} is already defined; ${VERSION} is not used.`,\n );\n}\n\nexport { MayaChart };\nexport * from \"./index.ts\";\n","// treemap + sunburst. Importing this file registers both types.\nimport { register } from \"./core/registry.ts\";\nimport { el, esc, hit, key, r } from \"./core/svg.ts\";\nimport type { Aggregate, Mark, MarkCtx, MarkOut, Row } from \"./core/types.ts\";\n\ninterface Node {\n name: string;\n value: number;\n children: Node[];\n depth: number;\n /** Names from the first path level down to this node. */\n parts: string[];\n /** colorBy field value (leaves only). */\n cv: number | null;\n}\n\ntype Reduce = ReturnType<MarkCtx[\"agg\"]>;\n\n/** Rows -> nested tree in first-appearance order. Map-keyed, so any name is safe. */\nexport function tree(\n rows: readonly Row[],\n path: readonly string[],\n y: string,\n agg: Reduce,\n cb: string | null = null,\n): Node {\n type Raw = { kids: Map<string, Raw>; ys: number[]; cs: number[] };\n const mk = (): Raw => ({ kids: new Map(), ys: [], cs: [] });\n const top = mk();\n for (const row of rows) {\n const v = row[y];\n if (typeof v !== \"number\") continue;\n let n = top;\n for (const f of path) {\n const k = String(row[f]);\n n = n.kids.get(k) ?? n.kids.set(k, mk()).get(k)!;\n }\n n.ys.push(v);\n const c = cb === null ? null : row[cb];\n if (typeof c === \"number\") n.cs.push(c);\n }\n const build = (raw: Raw, name: string, depth: number, parts: string[]): Node => {\n const children = [...raw.kids].map(([k, c]) => build(c, k, depth + 1, [...parts, k]));\n return {\n name,\n children,\n depth,\n parts,\n cv: raw.cs.length ? agg(raw.cs) : null,\n value: children.length ? children.reduce((s, c) => s + c.value, 0) : (agg(raw.ys) ?? 0),\n };\n };\n return build(top, \"\", 0, []);\n}\n\n/** Bruls squarify: [node, x, y, w, h] for `nodes` filling the box. */\nfunction squarify(nodes: Node[], x: number, y: number, w: number, h: number) {\n const out: [Node, number, number, number, number][] = [];\n const items = nodes.filter((n) => n.value > 0).sort((a, b) => b.value - a.value);\n let rest = items.reduce((s, n) => s + n.value, 0);\n let i = 0;\n while (i < items.length) {\n const side = Math.min(w, h);\n const scale = (w * h) / rest;\n const worst = (a: number, mn: number, mx: number) =>\n Math.max((side * side * mx) / (a * a), (a * a) / (side * side * mn));\n let j = i;\n let sum = 0;\n let best = Infinity;\n for (; j < items.length; j++) {\n const v = items[j]!.value * scale;\n const s = sum + v;\n const wst = worst(s, v, items[i]!.value * scale);\n if (j > i && wst > best) break;\n best = wst;\n sum = s;\n }\n const row = items.slice(i, j);\n const thick = side ? sum / side : 0;\n let p = 0;\n for (const n of row) {\n const len = sum ? (n.value * scale * side) / sum : 0;\n out.push(w >= h ? [n, x, y + p, thick, len] : [n, x + p, y, len, thick]);\n p += len;\n }\n if (w >= h) ((x += thick), (w -= thick));\n else ((y += thick), (h -= thick));\n rest -= row.reduce((s, n) => s + n.value, 0);\n i = j;\n }\n return out;\n}\n\n/** Validate values, build the tree, and compute attributes shared by both marks. */\nfunction setup(ctx: MarkCtx) {\n const { spec } = ctx;\n spec.data.forEach((row, i) => {\n const v = row[spec.y];\n if (typeof v === \"number\" && !(v > 0))\n ctx.fail(\n \"non-positive-value\",\n `data[${i}].${spec.y}`,\n `Value ${v} is not positive.`,\n \"Treemaps and sunbursts size shapes by value, so every value must be above zero.\",\n 'To show negative values use a bar chart with colorBy: \"sign\".',\n );\n });\n const cb = typeof spec.colorBy === \"string\" && spec.colorBy !== \"sign\" ? spec.colorBy : null;\n const root = tree(spec.data, spec.path, spec.y, ctx.agg(spec.aggregate as Aggregate), cb);\n let c = 0;\n const tops = root.children;\n const attrs = (n: Node) => {\n const parts = [...spec.drilled, ...n.parts];\n const s = tops.findIndex((t) => t.name === n.parts[0]);\n return {\n \"data-maya\": \"mark\",\n \"data-key\": key(\"h\", ...parts),\n \"data-c\": c++,\n \"data-s\": s % 8,\n \"data-x\": parts.join(\" › \"),\n \"data-series\": \"\",\n \"data-y\": n.value,\n \"data-f\": ctx.fmt(spec.y, n.value),\n \"data-tone\": ctx.tone(n.value),\n \"data-q\": n.cv === null ? null : ctx.q(n.cv),\n \"data-depth\": n.depth,\n };\n };\n return { root, tops, attrs };\n}\n\nconst text = (s: string) => s.length * 7.2 + 4;\n\nconst treemap: Mark = {\n noun: \"Treemap\",\n draw(ctx): MarkOut {\n const { plot, spec } = ctx;\n const { root, attrs } = setup(ctx);\n let marks = \"\";\n let hits = \"\";\n const walk = (n: Node, x: number, y: number, w: number, h: number): void => {\n // 0.5 px inset below the top level: siblings sit 1 px apart (stroke adds more).\n const g = n.depth > 1 ? 0.5 : 0;\n const [bx, by, bw, bh] = [x + g, y + g, Math.max(0, w - 2 * g), Math.max(0, h - 2 * g)];\n if (!n.children.length) {\n const a = attrs(n);\n marks += el(\"rect\", { ...a, x: r(bx), y: r(by), width: r(bw), height: r(bh) });\n hits += hit(a, bx, by, bw, bh);\n // Name over value when both fit, else \"name · value\" on one line, else the value.\n const [lx, ly, f, one] = [\n bx + bw / 2,\n by + bh / 2,\n a[\"data-f\"],\n `${n.name} · ${a[\"data-f\"]}`,\n ];\n if (!spec.labels || bh < 16) return;\n if (bh >= 34 && text(n.name) <= bw && text(f) <= bw)\n ctx.label(lx, ly - 8, n.name, \"center\") && ctx.label(lx, ly + 8, f, \"center\");\n else if (text(one) <= bw) ctx.label(lx, ly, one, \"center\");\n else if (text(f) <= bw) ctx.label(lx, ly, f, \"center\");\n return;\n }\n if (n.depth === 1 && text(n.name) <= bw && bh >= 30)\n ctx.label(bx + bw / 2, by + 9, n.name, \"center\");\n for (const [c, cx, cy, cw, ch] of squarify(n.children, bx, by, bw, bh))\n walk(c, cx, cy, cw, ch);\n };\n walk(root, plot.x, plot.y, plot.w, plot.h);\n return { marks, hits };\n },\n};\n\nconst TAU = Math.PI * 2;\n\nconst sunburst: Mark = {\n noun: \"Sunburst\",\n draw(ctx): MarkOut {\n const { plot, spec } = ctx;\n const { root, attrs } = setup(ctx);\n const D = spec.path.length;\n const R = Math.min(plot.w, plot.h) / 2;\n const [cx, cy] = [plot.x + plot.w / 2, plot.y + plot.h / 2];\n const pt = (rad: number, a: number) =>\n `${r(cx + rad * Math.cos(a - Math.PI / 2))} ${r(cy + rad * Math.sin(a - Math.PI / 2))}`;\n let marks = \"\";\n const walk = (n: Node, a0: number, a1: number): void => {\n if (n.depth) {\n const [r0, r1] = [(n.depth * R) / (D + 1), ((n.depth + 1) * R) / (D + 1)];\n const e = Math.min(a1, a0 + (TAU * 359.99) / 360);\n const big = e - a0 > Math.PI ? 1 : 0;\n const d =\n `M${pt(r1, a0)}A${r(r1)} ${r(r1)} 0 ${big} 1 ${pt(r1, e)}` +\n `L${pt(r0, e)}A${r(r0)} ${r(r0)} 0 ${big} 0 ${pt(r0, a0)}Z`;\n marks += el(\"path\", { ...attrs(n), d });\n }\n let a = a0;\n for (const c of n.children) {\n const span = ((a1 - a0) * c.value) / n.value;\n walk(c, a, a + span);\n a += span;\n }\n };\n walk(root, 0, TAU);\n return { marks, hits: \"\" };\n },\n};\n\nregister(\"treemap\", treemap);\nregister(\"sunburst\", sunburst);\n\nconst pct = (p: number) => (p > 0 && p < 0.005 ? \"<1%\" : `${Math.round(p * 100)}%`);\n\n/** Column width ~ column total; segments are shares of the column total (visible series only). */\nexport const marimekko: Mark = {\n noun: \"Marimekko\",\n draw(ctx): MarkOut {\n const { plot, spec, shaped } = ctx;\n const { categories, series, cells } = shaped;\n // ponytail: negative and null values count as 0, a stack of shares cannot show them.\n const val = new Map<string, number>();\n const tot = categories.map(() => 0);\n for (const c of cells) {\n const v = Math.max(0, c.value ?? 0);\n val.set(`${c.ci}/${c.si}`, v);\n tot[c.ci] = (tot[c.ci] ?? 0) + v;\n }\n const grand = tot.reduce((a, b) => a + b, 0);\n if (!grand) return { marks: \"\", hits: \"\" };\n const gap = 4;\n const [top, bot] = [plot.y + 2, plot.y + plot.h - 20];\n const free = plot.w - gap * (categories.length - 1);\n let marks = \"\";\n let hits = \"\";\n let x = plot.x;\n categories.forEach((name, ci) => {\n const t = tot[ci] ?? 0;\n const w = (free * t) / grand;\n let y = bot;\n for (const si of shaped.visible) {\n const v = val.get(`${ci}/${si}`);\n if (!v) continue;\n const h = ((bot - top) * v) / t;\n const f = ctx.fmt(spec.y, v);\n const a = {\n \"data-maya\": \"mark\",\n \"data-key\": key(series[si], name),\n \"data-c\": ci,\n \"data-s\": si % 8,\n \"data-x\": name,\n \"data-series\": series[si],\n \"data-y\": v,\n \"data-f\": `${f} (${pct(v / t)})`,\n };\n y -= h;\n marks += el(\"rect\", { ...a, x: r(x), y: r(y), width: r(w), height: r(h) });\n hits += hit(a, x, y, w, h);\n if (spec.labels && h >= 16) {\n const share = pct(v / t);\n ctx.label(\n x + w / 2,\n y + h / 2,\n `${f} (${share})`.length * 7.2 + 4 <= w ? `${f} (${share})` : share,\n \"center\",\n );\n }\n }\n if (w > 0) ctx.label(x + w / 2, plot.y + plot.h - 20, name, \"below\");\n x += w + gap;\n });\n return { marks, hits };\n },\n};\n\n/** 10x10 cells split between the x categories by largest remainder. */\nexport const waffle: Mark = {\n noun: \"Waffle\",\n draw(ctx): MarkOut {\n const { plot, spec, shaped } = ctx;\n const vals = shaped.categories.map(() => 0);\n for (const c of shaped.cells) vals[c.ci] = (vals[c.ci] ?? 0) + Math.max(0, c.value ?? 0);\n const sum = vals.reduce((a, b) => a + b, 0);\n if (!sum) return { marks: \"\", hits: \"\" };\n const n = vals.map((v) => Math.floor((v / sum) * 100));\n const left = 100 - n.reduce((a, b) => a + b, 0);\n vals\n .map((v, i) => [((v / sum) * 100) % 1, i] as const)\n .sort((a, b) => b[0] - a[0] || a[1] - b[1])\n .slice(0, left)\n .forEach(([, i]) => (n[i] = (n[i] ?? 0) + 1));\n const step = Math.min(plot.w, plot.h) / 10;\n const [ox, oy] = [plot.x + (plot.w - step * 10) / 2, plot.y + (plot.h - step * 10) / 2];\n const g = Math.min(3, step * 0.12);\n let marks = \"\";\n let hits = \"\";\n let i = 0;\n shaped.categories.forEach((name, ci) => {\n const v = vals[ci] ?? 0;\n for (let k = 0; k < (n[ci] ?? 0); k++, i++) {\n const [cx, cy] = [ox + (i % 10) * step, oy + Math.floor(i / 10) * step];\n const a = {\n \"data-maya\": \"mark\",\n \"data-key\": key(\"w\", name, k),\n \"data-c\": i,\n \"data-s\": ci % 8,\n \"data-x\": name,\n \"data-series\": \"\",\n \"data-y\": v,\n \"data-f\": `${ctx.fmt(spec.y, v)} (${pct(v / sum)})`,\n };\n marks += el(\"rect\", {\n ...a,\n x: r(cx + g / 2),\n y: r(cy + g / 2),\n width: r(step - g),\n height: r(step - g),\n });\n // The hit covers the whole grid step so the gaps between cells still hit.\n hits += el(\"rect\", {\n ...a,\n \"data-maya\": \"hit\",\n x: r(cx),\n y: r(cy),\n width: r(step),\n height: r(step),\n fill: \"transparent\",\n });\n }\n });\n const legend =\n `<div class=\"maya-legend\" data-maya=\"legend\">` +\n shaped.categories\n .map(\n (name, ci) =>\n `<span data-s=\"${ci % 8}\"><i></i>${esc(name)} ${pct((vals[ci] ?? 0) / sum)}</span>`,\n )\n .join(\"\") +\n `</div>`;\n return { marks, hits, legend };\n },\n};\nregister(\"marimekko\", marimekko);\nregister(\"waffle\", waffle);\n\nexport {};\n","// mayacharts/flow: sankey. Imports only registry, svg and types (never validate/render/shape).\nimport { register } from \"./core/registry.ts\";\nimport { el, key, r } from \"./core/svg.ts\";\nimport type { Mark } from \"./core/types.ts\";\n\nconst W = 12;\nconst PAD = 8;\n\ninterface N {\n lv: number;\n name: string;\n i: number;\n in: number;\n out: number;\n v: number;\n y: number;\n}\ninterface L {\n s: N;\n t: N;\n vals: number[];\n v: number;\n sy: number;\n ty: number;\n}\n\nexport const sankey: Mark = {\n noun: \"Sankey\",\n check(spec, fail) {\n if (!Array.isArray(spec.path) || spec.path.length < 2)\n fail(\n \"invalid-option\",\n \"path\",\n 'spec.path on \"sankey\" needs at least 2 levels.',\n 'Example: path: [\"source\", \"target\"] (outer to inner).',\n );\n },\n draw(ctx) {\n const { spec, plot } = ctx;\n const P = spec.path;\n const cols = P.length;\n // Maps, not objects: node names such as \"__proto__\" are plain data.\n const nodes: N[] = [];\n const byLv: Map<string, N>[] = P.map(() => new Map());\n const links = new Map<string, L>();\n const node = (lv: number, name: string): N => {\n let n = byLv[lv]!.get(name);\n if (!n) {\n n = { lv, name, i: nodes.length, in: 0, out: 0, v: 0, y: 0 };\n byLv[lv]!.set(name, n);\n nodes.push(n);\n }\n return n;\n };\n for (const row of spec.data) {\n const v = row[spec.y];\n if (typeof v !== \"number\") continue;\n if (!(v > 0))\n ctx.fail(\n \"non-positive-value\",\n spec.y,\n `spec.${spec.y} is ${v}, but sankey sizes must be positive.`,\n );\n let prev = node(0, String(row[P[0]!]));\n for (let lv = 1; lv < cols; lv++) {\n const next = node(lv, String(row[P[lv]!]));\n const k = prev.i + \"\\0\" + next.i;\n let l = links.get(k);\n if (!l) links.set(k, (l = { s: prev, t: next, vals: [], v: 0, sy: 0, ty: 0 }));\n l.vals.push(v);\n prev = next;\n }\n }\n const red = ctx.agg(spec.aggregate);\n const ls = [...links.values()];\n for (const l of ls) {\n l.v = red(l.vals) ?? 0;\n if (!(l.v > 0))\n ctx.fail(\n \"non-positive-value\",\n spec.y,\n `link ${l.s.name} to ${l.t.name} is ${l.v}, but sankey sizes must be positive.`,\n );\n l.s.out += l.v;\n l.t.in += l.v;\n }\n for (const n of nodes) n.v = Math.max(n.in, n.out);\n\n // ponytail: no crossing minimisation; columns sorted by value only.\n const col = (lv: number) => nodes.filter((n) => n.lv === lv).sort((a, b) => b.v - a.v);\n let k = Infinity;\n for (let lv = 0; lv < cols; lv++) {\n const c = col(lv);\n const sum = c.reduce((a, n) => a + n.v, 0);\n if (sum > 0) k = Math.min(k, (plot.h - PAD * (c.length - 1)) / sum);\n }\n if (!(k > 0 && k < Infinity)) k = 0;\n for (let lv = 0; lv < cols; lv++) {\n let y = plot.y;\n for (const n of col(lv)) ((n.y = y), (y += n.v * k + PAD));\n }\n const x = (n: N) => plot.x + (n.lv * (plot.w - W)) / (cols - 1);\n for (const n of nodes) {\n let o = n.y;\n for (const l of ls.filter((l) => l.s === n).sort((a, b) => a.t.y - b.t.y))\n ((l.sy = o), (o += l.v * k));\n o = n.y;\n for (const l of ls.filter((l) => l.t === n).sort((a, b) => a.s.y - b.s.y))\n ((l.ty = o), (o += l.v * k));\n }\n\n let c = 0;\n let marks = \"\";\n for (const l of ls) {\n const [x0, x1, th, m] = [x(l.s) + W, x(l.t), l.v * k, (x(l.s) + W + x(l.t)) / 2];\n const [a, b] = [l.sy, l.ty];\n const d = `M${r(x0)} ${r(a)}C${r(m)} ${r(a)} ${r(m)} ${r(b)} ${r(x1)} ${r(b)}L${r(x1)} ${r(b + th)}C${r(m)} ${r(b + th)} ${r(m)} ${r(a + th)} ${r(x0)} ${r(a + th)}Z`;\n marks += el(\"path\", {\n \"data-maya\": \"link\",\n \"data-key\": key(\"k\", l.s.lv, l.s.name, l.t.name),\n \"data-c\": c++,\n \"data-s\": l.s.i % 8,\n \"data-x\": `${l.s.name} → ${l.t.name}`,\n \"data-series\": \"\",\n \"data-y\": l.v,\n \"data-f\": ctx.fmt(spec.y, l.v),\n d,\n });\n }\n for (const n of nodes) {\n const h = n.v * k;\n marks += el(\"rect\", {\n \"data-maya\": \"mark\",\n \"data-key\": key(\"n\", n.lv, n.name),\n \"data-c\": c++,\n \"data-s\": n.i % 8,\n \"data-x\": n.name,\n \"data-series\": \"\",\n \"data-y\": n.v,\n \"data-f\": ctx.fmt(spec.y, n.v),\n \"data-depth\": n.lv,\n x: r(x(n)),\n y: r(n.y),\n width: W,\n height: r(h),\n });\n const last = n.lv === cols - 1;\n ctx.label(last ? x(n) - 4 : x(n) + W + 4, n.y + h / 2, n.name, last ? \"end\" : \"start\");\n }\n return { marks, hits: \"\" };\n },\n};\n\nregister(\"sankey\", sankey);\n\nconst TAU = Math.PI * 2;\nconst RING = 8;\nconst clip = (s: string) => {\n const c = [...s];\n return c.length > 14 ? c.slice(0, 13).join(\"\") + \"\\u2026\" : s;\n};\n\ninterface CN {\n lv: number;\n s: number;\n name: string;\n i: number;\n v: number;\n a: number;\n}\ninterface CL {\n s: CN;\n t: CN;\n vals: number[];\n v: number;\n}\n\n/** Chord diagram: from-nodes on the left half, to-nodes on the right, ribbons between them. */\nexport const chord: Mark = {\n noun: \"Chord\",\n draw(ctx) {\n const { spec, plot } = ctx;\n const [P0, P1] = spec.path as [string, string];\n const nodes: CN[] = [];\n const byLv: Map<string, CN>[] = [new Map(), new Map()];\n const links = new Map<string, CL>();\n const node = (lv: number, name: string): CN => {\n let n = byLv[lv]!.get(name);\n if (!n) {\n n = { lv, name, i: nodes.length, s: 0, v: 0, a: 0 };\n byLv[lv]!.set(name, n);\n nodes.push(n);\n }\n return n;\n };\n for (const row of spec.data) {\n const v = row[spec.y];\n if (typeof v !== \"number\") continue;\n if (!(v > 0))\n ctx.fail(\n \"non-positive-value\",\n spec.y,\n `spec.${spec.y} is ${v}, but chord sizes must be positive.`,\n );\n const s = node(0, String(row[P0]));\n const t = node(1, String(row[P1]));\n const k = s.i + \"\\0\" + t.i;\n let l = links.get(k);\n if (!l) links.set(k, (l = { s, t, vals: [], v: 0 }));\n l.vals.push(v);\n }\n const red = ctx.agg(spec.aggregate);\n const ls = [...links.values()];\n for (const l of ls) {\n l.v = red(l.vals) ?? 0;\n if (!(l.v > 0))\n ctx.fail(\n \"non-positive-value\",\n spec.y,\n `link ${l.s.name} to ${l.t.name} is ${l.v}, but chord sizes must be positive.`,\n );\n l.s.v += l.v;\n l.t.v += l.v;\n }\n // Palette slots: from-nodes first, then to-nodes, in first-seen order.\n nodes.sort((a, b) => a.lv - b.lv || a.i - b.i).forEach((n, j) => (n.s = j % 8));\n const total = ls.reduce((a, l) => a + l.v, 0);\n if (!(total > 0)) return { marks: \"\", hits: \"\" };\n\n // Angles run clockwise from 12 o'clock. To-nodes fill the right half top to bottom (largest on\n // top), from-nodes the left half bottom to top (largest on top). Each side holds `total`.\n const SIDE = 0.1;\n const GAP = 0.03;\n const sides = [0, 1].map((lv) => nodes.filter((n) => n.lv === lv));\n const k = Math.min(...sides.map((c) => (Math.PI - SIDE - GAP * (c.length - 1)) / total));\n for (const lv of [0, 1]) {\n const c = sides[lv]!.sort((a, b) => (lv ? b.v - a.v : a.v - b.v) || a.i - b.i);\n let a = lv ? SIDE / 2 : Math.PI + SIDE / 2;\n for (const n of c) ((n.a = a), (a += n.v * k + GAP));\n }\n const lw = Math.min(\n Math.max(...nodes.map((n) => clip(n.name).length)) * 7.2 + 4,\n plot.w * 0.28,\n );\n const R = Math.max(12, Math.min(plot.h / 2 - RING - 22, plot.w / 2 - RING - lw - 10));\n const [cx, cy] = [plot.x + plot.w / 2, plot.y + plot.h / 2];\n const pt = (a: number, rad: number) =>\n `${r(cx + rad * Math.sin(a))} ${r(cy - rad * Math.cos(a))}`;\n const arc = (a0: number, a1: number, rad: number, sweep: 0 | 1) =>\n `A${r(rad)} ${r(rad)} 0 0 ${sweep} ${pt(sweep ? a1 : a0, rad)}`;\n\n // Ribbon slots: each node hands them out clockwise, ordered to avoid crossings.\n const slot = new Map<CL, { sa: number; ta: number }>();\n for (const n of nodes) {\n const mine = ls\n .filter((l) => (n.lv ? l.t : l.s) === n)\n .sort((x, y) => (n.lv ? y.s.a - x.s.a : y.t.a - x.t.a));\n let a = n.a;\n for (const l of mine) {\n const o = slot.get(l) ?? { sa: 0, ta: 0 };\n n.lv ? (o.ta = a) : (o.sa = a);\n slot.set(l, o);\n a += l.v * k;\n }\n }\n const title = (f: string) => spec.titles.get(f) ?? f;\n let c = 0;\n let marks = \"\";\n for (const l of ls) {\n const { sa, ta } = slot.get(l)!;\n const [sb, tb] = [sa + l.v * k, ta + l.v * k];\n const d = `M${pt(sa, R)}${arc(sa, sb, R, 1)}Q${r(cx)} ${r(cy)} ${pt(ta, R)}${arc(ta, tb, R, 1)}Q${r(cx)} ${r(cy)} ${pt(sa, R)}Z`;\n marks += el(\"path\", {\n \"data-maya\": \"link\",\n \"data-key\": key(\"k\", 0, l.s.name, l.t.name),\n \"data-c\": c++,\n \"data-s\": l.s.s,\n \"data-x\": `${l.s.name} -> ${l.t.name}`,\n \"data-series\": \"\",\n \"data-y\": l.v,\n \"data-f\": ctx.fmt(spec.y, l.v),\n d,\n });\n }\n for (const n of nodes) {\n const [a0, a1] = [n.a, n.a + n.v * k];\n const d = `M${pt(a0, R + RING)}${arc(a0, a1, R + RING, 1)}L${pt(a1, R)}${arc(a0, a1, R, 0)}Z`;\n marks += el(\"path\", {\n \"data-maya\": \"mark\",\n \"data-key\": key(\"n\", n.lv, n.name),\n \"data-c\": c++,\n \"data-s\": n.s,\n \"data-x\": n.name,\n \"data-series\": title(n.lv ? P1 : P0),\n \"data-y\": n.v,\n \"data-f\": ctx.fmt(spec.y, n.v),\n \"data-depth\": n.lv,\n d,\n });\n }\n // ponytail: labels are clipped to 14 characters; ones that still collide are dropped by ctx.label.\n for (const n of nodes) {\n const m = n.a + (n.v * k) / 2;\n const [sn, cs] = [Math.sin(m), Math.cos(m)];\n const rad = R + RING + 4;\n const [lx, ly] = [cx + rad * sn, cy - rad * cs];\n const text = clip(n.name);\n ctx.label(\n lx,\n ly,\n text,\n Math.abs(sn) < 0.25 ? (cs > 0 ? \"above\" : \"below\") : sn > 0 ? \"start\" : \"end\",\n );\n }\n return { marks, hits: \"\" };\n },\n};\nregister(\"chord\", chord);\n\nexport {};\n","// US state hex cartogram. Importing this file registers the \"hexmap\" type.\nimport { register } from \"./core/registry.ts\";\nimport { el, key, r, esc } from \"./core/svg.ts\";\nimport type { Mark } from \"./core/types.ts\";\n\n// \"CODE Name col row\": odd-r offset grid (odd rows shift right half a hex), pointy-top.\nconst TABLE =\n \"AK Alaska 0 0|ME Maine 10 0|WI Wisconsin 5 1|VT Vermont 9 1|NH New Hampshire 10 1|\" +\n \"WA Washington 0 2|ID Idaho 1 2|MT Montana 2 2|ND North Dakota 3 2|MN Minnesota 4 2|IL Illinois 5 2|MI Michigan 6 2|NY New York 8 2|MA Massachusetts 9 2|\" +\n \"OR Oregon 0 3|NV Nevada 1 3|WY Wyoming 2 3|SD South Dakota 3 3|IA Iowa 4 3|IN Indiana 5 3|OH Ohio 6 3|PA Pennsylvania 7 3|NJ New Jersey 8 3|CT Connecticut 9 3|RI Rhode Island 10 3|\" +\n \"CA California 0 4|UT Utah 1 4|CO Colorado 2 4|NE Nebraska 3 4|MO Missouri 4 4|KY Kentucky 5 4|WV West Virginia 6 4|VA Virginia 7 4|MD Maryland 8 4|DE Delaware 9 4|\" +\n \"AZ Arizona 1 5|NM New Mexico 2 5|KS Kansas 3 5|AR Arkansas 4 5|TN Tennessee 5 5|NC North Carolina 6 5|SC South Carolina 7 5|DC District of Columbia 8 5|\" +\n \"OK Oklahoma 3 6|LA Louisiana 4 6|MS Mississippi 5 6|AL Alabama 6 6|GA Georgia 7 6|\" +\n \"HI Hawaii 0 7|TX Texas 3 7|FL Florida 7 7|PR Puerto Rico 8 8\";\n\nconst STATES = TABLE.split(\"|\").map((e) => {\n const m = /^(\\S+) (.+) (\\d+) (\\d+)$/.exec(e)!;\n return { code: m[1]!, name: m[2]!, c: +m[3]!, r: +m[4]! };\n});\nconst BY = new Map<string, (typeof STATES)[number]>();\nfor (const s of STATES) BY.set(s.code.toLowerCase(), s).set(s.name.toLowerCase(), s);\n\nconst find = (v: unknown) => BY.get(String(v).trim().toLowerCase());\n\n/** Closest code or name (a few edits away), else \"\". */\nconst near = (v: string): string => {\n const a = v.trim().toLowerCase();\n let best = \"\";\n let min = 4;\n for (const [k, s] of BY) {\n const n =\n Math.abs(a.length - k.length) +\n [...k].filter((ch) => !a.includes(ch)).length +\n [...a].filter((ch) => !k.includes(ch)).length;\n if (n < min) [min, best] = [n, k.length === 2 ? s.code : s.name];\n }\n return best;\n};\n\nconst R3 = Math.sqrt(3);\nconst COLS = Math.max(...STATES.map((s) => s.c)) + 1.5;\nconst ROWS = Math.max(...STATES.map((s) => s.r)) + 1;\n\nexport const hexmap: Mark = {\n noun: \"Hex map\",\n check(spec, fail) {\n spec.data.forEach((row, i) => {\n const v = (row as Record<string, unknown>)[spec.x as string];\n if (v == null || find(v)) return;\n const d = near(String(v));\n fail(\n \"unknown-state\",\n `data[${i}].${spec.x}`,\n `\"${v}\" is not a US state`,\n d && `Did you mean \"${d}\"?`,\n \"Use a two-letter code or full name (50 states, DC, PR).\",\n );\n });\n },\n draw(ctx) {\n const { spec, shaped, plot } = ctx;\n const s = Math.min(plot.w / (R3 * COLS), plot.h / (1.5 * (ROWS - 1) + 2));\n const ox = plot.x + (plot.w - R3 * s * COLS) / 2;\n const oy = plot.y + (plot.h - s * (1.5 * (ROWS - 1) + 2)) / 2;\n const k = s * 0.94;\n const at = (st: (typeof STATES)[number]) => [\n ox + R3 * s * (st.c + 0.5 + (st.r % 2) / 2),\n oy + s + 1.5 * s * st.r,\n ];\n const hex = (st: (typeof STATES)[number]) => {\n const [cx, cy] = at(st) as [number, number];\n return (\n \"M\" +\n [0, 1, 2, 3, 4, 5]\n .map((i) => {\n const a = (Math.PI / 3) * i - Math.PI / 6;\n return `${r(cx + k * Math.cos(a))} ${r(cy + k * Math.sin(a))}`;\n })\n .join(\"L\") +\n \"Z\"\n );\n };\n\n const sum = new Map<(typeof STATES)[number], number>();\n shaped.cells.forEach((c) => {\n const st = find(shaped.categories[c.ci]);\n if (st && c.value !== null) sum.set(st, (sum.get(st) ?? 0) + c.value);\n });\n const vals = [...sum.values()];\n const lo = Math.min(...vals);\n const hi = Math.max(...vals);\n\n let grid = \"\";\n for (const st of STATES) grid += el(\"path\", { d: hex(st), fill: \"none\" });\n let marks = \"\";\n let n = 0;\n for (const [st, v] of sum) {\n const [cx, cy] = at(st) as [number, number];\n marks += el(\"path\", {\n \"data-maya\": \"mark\",\n \"data-key\": key(\"g\", st.code),\n \"data-c\": n++,\n \"data-s\": 0,\n \"data-x\": st.name,\n \"data-series\": \"\",\n \"data-f\": ctx.fmt(spec.y, v),\n \"data-y\": v,\n \"data-neg\": v < 0,\n \"data-tone\": ctx.tone(v),\n \"data-q\": hi > lo ? Math.min(9, Math.floor(((v - lo) / (hi - lo)) * 10)) : 9,\n d: hex(st),\n });\n ctx.label(cx, cy, st.code, \"center\");\n }\n const legend =\n hi > lo\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\nregister(\"hexmap\", hexmap);\n\nexport {};\n","// mayacharts/radial: polar bars. Imports only registry, svg, scale, ticks and types.\nimport { register } from \"./core/registry.ts\";\nimport { el, esc, key, OTHER, r } from \"./core/svg.ts\";\nimport { niceTicks } from \"./core/ticks.ts\";\nimport type { Mark } from \"./core/types.ts\";\n\nconst TAU = Math.PI * 2;\nconst CAP = 11;\n\nexport const radial: Mark = {\n noun: \"Radial bar\",\n draw(ctx) {\n const { spec, shaped, plot } = ctx;\n const n = shaped.categories.length;\n if (!n || !shaped.cells.length) return { marks: \"\", hits: \"\" };\n\n // Stack outward per category; negatives and nulls draw nothing.\n const segs = shaped.cells.map((c) => ({ c, v: Math.max(0, c.value ?? 0), y0: 0, y1: 0 }));\n const totals = new Array<number>(n).fill(0);\n for (const s of segs) {\n s.y0 = totals[s.c.ci]!;\n s.y1 = totals[s.c.ci] = s.y0 + s.v;\n }\n const max = Math.max(0, ...totals);\n const ticks = niceTicks(0, max, 5);\n const top = ticks.domain[1];\n\n // Room for category labels outside the outer radius (truncated at CAP chars).\n const names = shaped.categories.map((c) => {\n const f = ctx.fmt(spec.x, c);\n return f.length > CAP ? f.slice(0, CAP - 1) + \"…\" : f;\n });\n const lw = Math.max(...names.map((s) => s.length)) * 7.2 + 6;\n const [cx, cy] = [plot.x + plot.w / 2, plot.y + plot.h / 2];\n const R = Math.max(10, Math.min(plot.w / 2 - lw, plot.h / 2 - 16));\n const R0 = R * 0.25;\n const rad = (v: number) => R0 + (v / top) * (R - R0);\n const pt = (rr: number, a: number) => `${r(cx + rr * Math.sin(a))} ${r(cy - rr * Math.cos(a))}`;\n // A clear wedge at 12 o'clock holds the ring labels, so they never sit on a bar.\n const G = n > 1 ? 0.35 : 0;\n const step = (TAU - G) / n;\n const gap = Math.min(step * 0.1, 0.04);\n const sector = (r0: number, r1: number, a0: number, a1: number) => {\n const e = Math.min(a1, a0 + (TAU * 359.99) / 360);\n const big = e - a0 > Math.PI ? 1 : 0;\n return (\n `M${pt(r1, a0)}A${r(r1)} ${r(r1)} 0 ${big} 1 ${pt(r1, e)}` +\n `L${pt(r0, e)}A${r(r0)} ${r(r0)} 0 ${big} 0 ${pt(r0, a0)}Z`\n );\n };\n\n let marks = \"\";\n let hits = \"\";\n segs.forEach((s, i) => {\n const cname = shaped.categories[s.c.ci]!;\n const ser = shaped.series[s.c.si]!;\n const [a0, a1] = [G / 2 + s.c.ci * step + gap, G / 2 + (s.c.ci + 1) * step - gap];\n const [r0, r1] = [rad(s.y0), rad(s.y1)];\n const d = {\n \"data-key\": key(ser, cname),\n \"data-c\": i,\n \"data-s\": s.c.si % 8,\n \"data-x\": ctx.fmt(spec.x, cname),\n \"data-series\": ser,\n \"data-y\": s.c.value,\n \"data-f\": ctx.fmt(spec.y, s.c.value),\n \"data-tone\": ctx.tone(s.v),\n \"data-other\": cname === OTHER,\n };\n marks += el(\"path\", { \"data-maya\": \"mark\", ...d, d: sector(r0, r1, a0, a1) });\n // Hit: grown to >= 24 px thick and wide around the segment's middle (hit() is rect-only).\n const mid = (r0 + r1) / 2;\n const [h0, h1] = [\n Math.max(0, mid - Math.max(12, (r1 - r0) / 2)),\n mid + Math.max(12, (r1 - r0) / 2),\n ];\n const half = Math.max((a1 - a0) / 2, 12 / mid || 0);\n const am = (a0 + a1) / 2;\n if (r1 - r0 < 24 || (a1 - a0) * mid < 24)\n hits += el(\"path\", {\n \"data-maya\": \"hit\",\n ...d,\n d: sector(h0, h1, am - half, am + half),\n fill: \"transparent\",\n });\n });\n\n // Rings: faint circles with value labels along the 12 o'clock spoke.\n let grid = \"\";\n let labels = \"\";\n // At most 3 rings: thin every other tick when the scale has more.\n const vals = ticks.values.filter((v) => v > 0);\n for (const v of vals.length > 3 ? vals.filter((_, i) => i % 2) : vals) {\n grid += el(\"circle\", { cx: r(cx), cy: r(cy), r: r(rad(v)), fill: \"none\" });\n labels += el(\n \"text\",\n { x: r(cx), y: r(cy - rad(v) + 4), \"text-anchor\": \"middle\", \"data-ring\": \"\" },\n esc(ctx.fmt(spec.y, v)),\n );\n }\n\n // Category labels anchored by angle; one that overlaps a placed label is skipped.\n const boxes: number[][] = [];\n names.forEach((name, i) => {\n const a = G / 2 + (i + 0.5) * step;\n const [x, y] = [cx + (R + 6) * Math.sin(a), cy - (R + 6) * Math.cos(a)];\n const sx = Math.sin(a);\n const anchor = Math.abs(sx) < 0.2 ? \"middle\" : sx > 0 ? \"start\" : \"end\";\n const w = name.length * 7.2;\n const l = anchor === \"middle\" ? x - w / 2 : anchor === \"start\" ? x : x - w;\n if (boxes.some((b) => l < b[2]! && l + w > b[0]! && y - 7 < b[3]! && y + 7 > b[1]!)) return;\n boxes.push([l, y - 7, l + w, y + 7]);\n labels += el(\n \"text\",\n { x: r(x), y: r(y), \"text-anchor\": anchor, \"dominant-baseline\": \"middle\", \"data-cat\": \"\" },\n esc(name),\n );\n });\n return { marks, hits, labels, grid };\n },\n};\n\nregister(\"radial\", radial);\n","// IIFE entry (dist/maya.global.js): element + every module, exposed as globalThis.maya.\nimport * as maya from \"./element.ts\";\nimport \"./hierarchy.ts\";\nimport \"./flow.ts\";\nimport \"./geo.ts\";\nimport \"./radial.ts\";\n\n(globalThis as { maya?: typeof maya }).maya = maya;\n\nexport {};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"maya.global.js","names":["ROWS","CAP","w","clip","points","PAD","num","draw","HEAD","PAD","num","S","css","css","INTRO","same","reduce","mount","reduce","mount","reduce","mount","reduce","mount","str","css","measure.mount","drill.mount","select.mount","zoom.mount","sort.mount","select.reduce","zoom.reduce","sort.reduce","drill.reduce","measure.reduce","TAU","maya","__defProp","__exportAll","target","name","all","no_symbols","VERSION","KEY","MODULES","CORE_TYPES","MODULE_OF","register","type","mark","types","TEXT","t","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$1","CAP$1","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","fine","preset","opts","o","out","bandScale","domain","span","range","padInner","padOuter","start","linearScale","d0","d1","r0","r1","clean","niceTicks","max","min","base","best","cross","m","score","values","wide","tw","ch","w$1","maxW","clip$1","ticks","fixed","tk","b","frame","bx","ly","ry","W","H","size","bt","lt","bLab","lFull","lLab","rt","rTitle","yTitle","xTitle","left","bottom","plot","y2","grid","x2","ay","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","MAX_BAR","steps","items","bar","val","v2","ctx","hz","inner","cvOf","marks","hits","full","th","len","cname","cv","text","est","cx","f2","slot","gap","dots","px","py","points$1","yd","nv","dodge","order","xs","d2","rad","placed","from","near","cand","limit","beeswarm","sx","pts","bh","groups","big","g","seen","mid","off","id","dumbbell","pairs","links","at","to","x1","ox","oy","down","side","heatmap","q","labels","col","legend","PAD$2","num$2","draw$1","live","last","period","fs","payload","prev","pct","vs","z","kpi","TOP","BOTTOM","LEFT","RIGHT","parallel","ms","lines","vals","x0","scales","l","of","paths","ridgeline","ri","tall","runs","area","axes","draw","areas","fill","sh","line","MIN","points","xd","sv","scatter","sy","scale","HEAD$1","ROW","PAD$1","num$1","table","title","nulls","byValue","lw","cw","colX","rw","cut","on","fit","mi","right","bw","D","N","rng","S$1","A","Q","C","B","css$1","MayaSpecError","message","code","path","S","KEYS","PATHX","PATH","ALL_Y","CPA","PTH","ONLY","AGGS","PRESETS","DATE","isDateOpts","TOKENS","USE","HORIZ","SIZED","PIE","GEO","EX","HINTS","ALIAS","FN","FAM","FONT","own","isObj","strs","show","dym","fail","headline","bad","want","css","ok","font","bFmt","format","dt","CHECKS","validateSpec","known","str","mod","isPath","need","pth","\"path\"","missing","colors","entries","theme","cart","colorBy","select","detail","found","unk","use","ys","arr","fields","opt","scan","numeric","validateOptions","unknown","inv","sel","vk","win","sortBy","measure","drill","nonce","resolve","measures","view","drilled","CORE","kebab","build","fmts","toneText","boxes","label","place","tp","markLegend","body","vars","style","svg","sheet","renderParts","render","shellInner","st","project","keep","renderShell","json","cache","html","tt","instant","lag","EASE","POP","SWEEP","DATA","INTRO$1","UI","MAX","STAGGER","Z","geo","boxOf","tf","then","done","once","delay","sync","seed","origin","fade","pop","enter","retire","exit","visual","MORPH","cmds","morphable","morphs","outline","morph","crossfade","NUM","counts","count","tok","ds","fd","ls","head","tail","int","dec","t0","cur","now","old","g0","morphed","was","g1","ref","fresh","ui","pool","om","fadeIn","ghosts","fadeable","wm","ghost","intro","part","late","spread","cs","patch","markup","box","many","animate","same$1","withDrill","reduce$4","next","branchOf","raw","depth","mount$4","host","say","push","click","crumb","RADIO","reduce$3","same","_drop","index","mount$3","radios","kbd","pick","keydown","painted","FIELDS","reduce$2","had","selected","selOf","matches","mount$2","onClick","root","reduce$1","dir","HEAD","mount$1","titles","txt","SEL","FADE","FIXED","GLIDE","still","tooltip","tip","probe","anchored","list","byKey","byC","open","pin","clamped","kb","timer","down0","flip","group","lit","peers","light","vw","shade","pw","ph","hide","markOf","ev","bd","tgt","sp","vv","vh","dx","dy","announce","move","on_","clear","_w","MIN_START","MIN_SPAN","NS","mount","brush","lastSaid","lastDrill","svgOf","geom","vb","ky","clampTo","stopBrush","bandMode","onDown","onMove","swallowClick","eat","onUp","began","spanX","spanY","idx","vx","vy","reset","onDbl","onCancel","chip","MayaChart","#prop","#json","#attr","#schedule","#state","#click","#key","#registered","#commit","#announce","#ix","#tip","#off","#ro","#size","#resized","#raf","#say","names","#vars","decl","am","#origin","#emit","ix","#render","#seen","focus","#focusId","#slots","#drawn","pre","#err","maya","#last","\"table\"","resized","INTRO","#restore","changed","SLOTS","FOCUS","element_exports","prior","tree","mk","squarify","nodes","rest","worst","mx","mn","sum","wst","thick","setup","tops","treemap","walk","lx","one","TAU$1","R","pt","a1","a0","rm","arc","room","tot","categories","grand","bot","free","share","PAD","P","byLv","node","lv","red","avail","most","pad","RING","clip","P0","P1","SIDE","GAP","sides","maxCh","spare","sweep","mine","sb","tb","sa","ta","sn","STATES","BY","find","R3","COLS","ROWS","hex","TAU","CAP","segs","totals","R0","rr","G","sector","h0","h1","half","anchor"],"sources":["../src/core/registry.ts","../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/beeswarm.ts","../src/core/marks/dumbbell.ts","../src/core/marks/heatmap.ts","../src/core/marks/kpi.ts","../src/core/marks/parallel.ts","../src/core/marks/ridgeline.ts","../src/core/marks/line.ts","../src/core/marks/scatter.ts","../src/core/marks/table.ts","../src/styles/theme.ts","../src/core/validate.ts","../src/core/render.ts","../src/element/html.ts","../src/element/animate.ts","../src/element/drill.ts","../src/element/measure.ts","../src/element/select.ts","../src/element/sort.ts","../src/element/tooltip.ts","../src/element/zoom.ts","../src/element/maya-chart.ts","../src/element.ts","../src/hierarchy.ts","../src/flow.ts","../src/geo.ts","../src/radial.ts","../src/global.ts"],"sourcesContent":["/*\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.3.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 \"ridgeline\",\n \"beeswarm\",\n \"parallel\",\n \"table\",\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 marimekko: \"hierarchy\",\n waffle: \"hierarchy\",\n sankey: \"flow\",\n chord: \"flow\",\n radial: \"radial\",\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","/*\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 /** Auto description without a category field: {0} = noun, {1} = y title. */\n chartOfAll: \"{0} chart of {1}\",\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 /** Live region after a table header click: {0} = column title, {1} = ascending/descending. */\n sortedBy: \"Sorted by {0}, {1}\",\n ascending: \"ascending\",\n descending: \"descending\",\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}` +\n (spec.x || spec.path.length\n ? ` by ${spec.titles.get(spec.x) ?? (spec.x || spec.path.join(\" / \"))}`\n : \"\");\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 =\n spec.x || spec.path.length\n ? t(spec, \"chartOf\", noun, ti(spec.y), spec.x ? ti(spec.x) : spec.path.join(\" / \"))\n : t(spec, \"chartOfAll\", noun, ti(spec.y));\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 let fine: Intl.NumberFormat | null = null; // step-less percent below 1%: 0.0025 is \"0.25%\", not \"0.3%\"\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: step === undefined ? 0 : decimals(step * 100),\n maximumFractionDigits: step === undefined ? 1 : Math.max(1, decimals(step * 100)),\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 if (preset === \"percent\" && step === undefined)\n fine = new Intl.NumberFormat(locale, { ...o, maximumFractionDigits: 2 });\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\n out =\n typeof v === \"number\"\n ? (fine && v && Math.abs(v) < 0.01 ? fine : num!).format(v)\n : 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 [d0, d1] = fixed ?? a.domain;\n // A reversed yDomain ([hi, lo]) keeps its order for the scale; ticks are computed low to high.\n const [lo, hi] = d0 > d1 ? [d1, d0] : [d0, d1];\n const tk = niceTicks(lo, hi);\n const values = fixed ? tk.values.filter((v) => v >= lo && v <= hi) : tk.values;\n // A fixed domain end at the top of the axis (rank 1 on [15, 1]) gets its tick when it is not\n // within half a step of a neighbour.\n if (fixed && !values.some((v) => Math.abs(v - d1) < tk.step / 2)) {\n values.push(d1);\n values.sort((a, b) => a - b);\n }\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 // Without a left axis, still leave room for half of the first bottom tick label.\n const left = Math.max(\n (spec.yAxis && ly ? maxW(lLab) + 10 : 8) + (yTitle ? 18 : 0),\n bt ? tw(bt.labels[0] ?? \"\") / 2 + 2 : 0,\n );\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\nconst MAX_BAR = 72;\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 full = spec.stack || spec.type === \"waterfall\" ? cat.bandwidth : inner.bandwidth;\n // ponytail: bars stop growing at MAX_BAR px and sit centred in their slot.\n const th = Math.min(full, MAX_BAR);\n const pos =\n cat.at(c.ci) +\n (spec.stack || spec.type === \"waterfall\" ? 0 : inner.at(k)) +\n (full - th) / 2;\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, r } from \"../svg.ts\";\nimport type { Axis, BandScale, LinearScale, Mark, ResolvedSpec, Shaped } from \"../types.ts\";\n\ninterface Pt {\n i: number;\n v: number;\n ci: number;\n si: number;\n name: string | null;\n row: Record<string, unknown>;\n}\n\n/**\n * One point per row with a numeric y, a visible series and (when x is set) a kept category.\n * An explicit yDomain clips; points outside it are skipped.\n */\nfunction points(spec: ResolvedSpec, shaped: Shaped): Pt[] {\n const out: Pt[] = [];\n const cats = new Map(shaped.categories.map((c, ci) => [c, ci]));\n const yd = spec.yDomain;\n spec.data.forEach((row, i) => {\n const v = row[spec.y];\n if (typeof v !== \"number\" || !Number.isFinite(v)) return;\n if (yd && (v < yd[0] || v > yd[1])) return;\n // No x: one swarm (shape put every row in the single category \"undefined\").\n const ci = spec.x === \"\" ? 0 : cats.get(String(row[spec.x]));\n if (ci === undefined) return;\n const si = shaped.series.indexOf(spec.series === null ? \"\" : String(row[spec.series]));\n if (!shaped.visible.includes(si)) return;\n const nv = spec.name === null ? null : row[spec.name];\n out.push({ i, v, ci, si, name: nv == null ? null : String(nv), row });\n });\n return out;\n}\n\n/**\n * Dodge: points sorted by pixel x; each takes the smallest |offset| (from the band centre) at which\n * it clears every placed neighbour closer than one diameter. Candidates are 0 and the tangent\n * offsets of those neighbours. Deterministic: ties go to the positive offset.\n */\nfunction dodge(xs: number[], rad: number, limit: number): number[] {\n const order = xs.map((_, i) => i).sort((a, b) => xs[a]! - xs[b]! || a - b);\n const d2 = (2 * rad) ** 2;\n const out: number[] = new Array(xs.length).fill(0);\n const placed: number[] = []; // indices into xs, in placement order\n let from = 0; // placed[from..] may still be within a diameter in x\n for (const i of order) {\n const x = xs[i]!;\n while (from < placed.length && x - xs[placed[from]!]! >= 2 * rad) from++;\n const near = placed.slice(from);\n const cand = [0];\n for (const j of near) {\n const h = Math.sqrt(Math.max(0, d2 - (x - xs[j]!) ** 2));\n cand.push(out[j]! + h, out[j]! - h);\n }\n cand.sort((a, b) => Math.abs(a) - Math.abs(b) || b - a);\n const ok = (o: number) =>\n near.every((j) => (x - xs[j]!) ** 2 + (o - out[j]!) ** 2 >= d2 - 1e-6);\n let o = cand.find(ok) ?? 0;\n // ponytail: a swarm taller than its band is clamped, so the overflow overlaps instead of leaving the band.\n o = Math.max(-limit, Math.min(limit, o));\n out[i] = o;\n placed.push(i);\n }\n return out;\n}\n\n/** Dots dodged off a shared value axis: y = value (bottom axis), x = optional row category (left band). */\nexport const beeswarm: Mark = {\n noun: \"Beeswarm\",\n axes(spec, shaped) {\n let lo = Infinity;\n let hi = -Infinity;\n for (const p of points(spec, shaped)) ((lo = Math.min(lo, p.v)), (hi = Math.max(hi, p.v)));\n if (lo > hi) lo = hi = 0;\n const left: Axis =\n spec.x === \"\" ? null : { kind: \"band\", field: spec.x, domain: shaped.categories };\n return [{ kind: \"linear\", field: spec.y, domain: spec.yDomain ?? [lo, hi] }, left];\n },\n draw(ctx) {\n const { spec, shaped, plot } = ctx;\n const sx = ctx.x as LinearScale;\n const band = ctx.y as BandScale | null;\n const pts = points(spec, shaped);\n const bh = band ? band.bandwidth : plot.h;\n const groups = new Map<number, Pt[]>();\n for (const p of pts) (groups.get(p.ci) ?? groups.set(p.ci, []).get(p.ci)!).push(p);\n let big = 1;\n for (const g of groups.values()) big = Math.max(big, g.length);\n // Radius from density: the area each point of the busiest swarm gets, 3 to 6 px.\n const rad = Math.max(3, Math.min(6, Math.sqrt((plot.w * bh) / big) / 4));\n const cb = typeof spec.colorBy === \"string\" && spec.colorBy !== \"sign\" ? spec.colorBy : null;\n\n const seen = new Map<string, number>();\n let marks = \"\";\n let hits = \"\";\n for (const [ci, g] of [...groups].sort((a, b) => a[0] - b[0])) {\n const mid = band ? band.at(ci) + band.bandwidth / 2 : plot.y + plot.h / 2;\n const xs = g.map((p) => sx.of(p.v));\n const off = dodge(xs, rad + 0.5, Math.max(0, bh / 2 - rad));\n g.forEach((p, k) => {\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 f = ctx.fmt(spec.y, p.v);\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 ?? (band ? ctx.fmt(spec.x, shaped.categories[ci]) : \"\"),\n \"data-series\": ser,\n \"data-y\": p.v,\n \"data-f\": f,\n \"data-neg\": p.v < 0,\n \"data-tone\": ctx.tone(p.v),\n \"data-q\": typeof cv === \"number\" ? ctx.q(cv) : null,\n };\n const cx = xs[k]!;\n const cy = mid + off[k]!;\n marks += el(\"circle\", { \"data-maya\": \"mark\", ...d, r: r(rad), cx: r(cx), cy: r(cy) });\n hits += hit(d, cx - rad, cy - rad, rad * 2, rad * 2);\n if (spec.labels) ctx.label(cx, cy - rad, f, \"above\");\n });\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 let labels = \"\";\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 // Drawn here (not ctx.label) so labels on the dark ramp steps can carry data-dark.\n const text = ctx.fmt(spec.y, v);\n if (spec.labels !== false && w >= 24 && h >= 24 && text.length * 7.2 + 4 <= w)\n labels += el(\n \"text\",\n {\n x: r(x + w / 2),\n y: r(y + h / 2),\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"middle\",\n \"data-in\": true,\n \"data-dark\": d[\"data-q\"] >= 6,\n },\n esc(text),\n );\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, labels, 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 // Unbroken sparkline: a soft area under it (render.ts adds the fading gradient).\n const a = live[0],\n z = live[live.length - 1];\n marks =\n (a && z && live.length === cells.length\n ? el(\"path\", {\n \"data-maya\": \"area\",\n \"data-key\": key(\"a\", \"\"),\n \"data-s\": 0,\n d: `${d}L${px(z.ci)} ${r(bottom)}L${px(a.ci)} ${r(bottom)}Z`,\n })\n : \"\") +\n el(\"path\", {\n \"data-maya\": \"line\",\n \"data-key\": key(\"l\", \"\"),\n \"data-s\": 0,\n pathLength: 1,\n d: d || null,\n }) +\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 { el, esc, key, OTHER, r } from \"../svg.ts\";\nimport { niceTicks } from \"../ticks.ts\";\nimport type { Mark, Row } from \"../types.ts\";\n\nconst TOP = 26;\nconst BOTTOM = 12;\nconst LEFT = 48;\nconst RIGHT = 14;\n\n/**\n * One polyline per x category across one vertical axis per measure (`spec.measures`), each with its\n * own linear scale. No Mark.axes: axes, ticks and titles are drawn here (grid + labels).\n */\nexport const parallel: Mark = {\n noun: \"Parallel coordinates\",\n draw(ctx) {\n const { spec, shaped, width: W, height: H } = ctx;\n const ms = spec.measures;\n const rows = new Map<string, Row[]>();\n for (const row of spec.data) {\n const c = String(row[spec.x]);\n (rows.get(c) ?? rows.set(c, []).get(c)!).push(row);\n }\n const reduce = ctx.agg(spec.aggregate);\n const lines = shaped.categories.flatMap((cat, ci) => {\n const rs = rows.get(cat);\n if (!rs || cat === OTHER) return []; // ponytail: the limit roll-up has no single line, it is skipped.\n const vals = ms.map((m) => reduce(rs.map((row) => row[m] as number | null)));\n const si =\n spec.series === null ? 0 : Math.max(0, shaped.series.indexOf(String(rs[0]![spec.series])));\n return shaped.visible.includes(si) ? [{ cat, ci, vals, si }] : [];\n });\n\n const x0 = LEFT;\n const x1 = Math.max(x0 + 1, W - RIGHT);\n const [y0, y1] = [TOP, Math.max(TOP + 1, H - BOTTOM)];\n const at = (i: number) => r(ms.length < 2 ? x0 : x0 + ((x1 - x0) * i) / (ms.length - 1));\n let grid = \"\";\n let labels = \"\";\n const scales = ms.map((m, i) => {\n const all = lines.map((l) => l.vals[i]).filter((v): v is number => v !== null);\n const t = niceTicks(Math.min(0, ...all), Math.max(0, ...all), 4);\n const [lo, hi] = t.domain;\n const of = (v: number) => r(y1 - ((v - lo) / (hi - lo || 1)) * (y1 - y0));\n const x = at(i);\n grid += el(\"line\", { x1: x, x2: x, y1: r(y0), y2: r(y1) });\n for (const v of t.values) {\n const y = of(v);\n grid += el(\"line\", { x1: x - 3, x2: x, y1: y, y2: y });\n labels += el(\n \"text\",\n { x: x - 6, y, \"text-anchor\": \"end\", \"dominant-baseline\": \"middle\", \"data-in\": true },\n esc(ctx.fmt(m, v, t.step)),\n );\n }\n labels += el(\n \"text\",\n {\n x,\n y: 12,\n \"text-anchor\": i === 0 ? \"start\" : i === ms.length - 1 ? \"end\" : \"middle\",\n \"font-weight\": 600,\n \"data-in\": true,\n },\n esc(spec.titles.get(m) ?? m),\n );\n return of;\n });\n\n let dots = \"\";\n let paths = \"\";\n let hits = \"\";\n for (const { cat, ci, vals, si } of lines) {\n const x = ctx.fmt(spec.x, cat);\n let d = \"\";\n let gap = true;\n vals.forEach((v, i) => {\n if (v === null) {\n gap = true;\n return;\n }\n const [cx, cy] = [at(i), scales[i]!(v)];\n d += `${gap ? \"M\" : \"L\"}${cx} ${cy}`;\n gap = false;\n dots += el(\"circle\", {\n \"data-maya\": \"mark\",\n \"data-key\": key(cat, ms[i]),\n \"data-c\": ci,\n \"data-s\": si % 8,\n \"data-x\": x,\n \"data-series\": spec.titles.get(ms[i]!) ?? ms[i],\n \"data-y\": v,\n \"data-f\": ctx.fmt(ms[i]!, v),\n \"data-neg\": v < 0,\n r: 3.5,\n cx,\n cy,\n });\n });\n if (!d) continue;\n paths += el(\"path\", {\n \"data-maya\": \"line\",\n \"data-key\": key(\"l\", cat),\n \"data-c\": ci,\n \"data-s\": si % 8,\n pathLength: 1,\n d,\n });\n hits += el(\"path\", {\n \"data-maya\": \"hit\",\n \"data-c\": ci,\n d,\n fill: \"none\",\n stroke: \"transparent\",\n \"stroke-width\": 16,\n \"stroke-linejoin\": \"round\",\n });\n }\n // Points first: the line~circle CSS rule (hide points until active) only matches circles after a line.\n return { marks: dots + paths, hits, grid, labels };\n },\n};\n","import { colorVals } from \"../shape.ts\";\nimport { el, key, OTHER, r } from \"../svg.ts\";\nimport type { Axis, BandScale, Cell, Mark } from \"../types.ts\";\n\n/** Rows of areas, first series on top, each scaled 0..global max so peaks overlap the row above. */\nexport const ridgeline: Mark = {\n noun: \"Ridgeline\",\n axes: (spec, shaped) => [\n { kind: \"band\", field: spec.x, domain: shaped.categories } satisfies Axis,\n {\n kind: \"band\",\n field: spec.series ?? \"\",\n domain: shaped.visible.map((i) => shaped.series[i]!),\n },\n ],\n draw(ctx) {\n const { spec, shaped, plot } = ctx;\n const cat = ctx.x as BandScale;\n const row = ctx.y as BandScale;\n const cvOf = colorVals(spec);\n const px = (ci: number) => r(cat.at(ci) + cat.bandwidth / 2);\n let max = 0;\n for (const c of shaped.cells) if (c.value !== null && c.value > max) max = c.value;\n if (max <= 0) max = 1;\n // Baseline = bottom of each band; the peak reaches 1.4 bands up unless the top row would leave the plot.\n const base = (ri: number) => row.at(ri) + row.bandwidth / 2 + row.step / 2;\n const tall = Math.min(1.4 * row.step, base(0) - plot.y);\n\n let rows = \"\";\n let dots = \"\";\n shaped.visible.forEach((si, ri) => {\n const ser = shaped.series[si]!;\n const b = base(ri);\n const py = (v: number) => r(b - (v / max) * tall);\n const cells: Cell[] = shaped.cells.filter((c) => c.si === si).sort((a, c) => a.ci - c.ci);\n const runs: Cell[][] = [[]];\n for (const c of cells) {\n if (c.value === null) {\n runs.push([]);\n continue;\n }\n runs[runs.length - 1]!.push(c);\n const cname = shaped.categories[c.ci]!;\n const cv = cvOf(cname, ser);\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\": ctx.fmt(spec.x, cname),\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\": cname === OTHER,\n r: 3,\n cx: px(c.ci),\n cy: py(c.value),\n });\n }\n const pts = (run: Cell[]) => run.map((c, i) => `${i ? \"L\" : \"M\"}${px(c.ci)} ${py(c.value!)}`);\n const live = runs.filter((run) => run.length > 0);\n const area = live\n .map(\n (run) => `${pts(run).join(\"\")}L${px(run.at(-1)!.ci)} ${r(b)}L${px(run[0]!.ci)} ${r(b)}Z`,\n )\n .join(\"\");\n if (area)\n rows += el(\"path\", {\n \"data-maya\": \"area\",\n \"data-ridge\": true,\n \"data-key\": key(\"a\", ser),\n \"data-s\": si % 8,\n d: area,\n });\n rows += el(\"path\", {\n \"data-maya\": \"line\",\n \"data-key\": key(\"l\", ser),\n \"data-s\": si % 8,\n pathLength: 1,\n d: live.map((run) => pts(run).join(\"\")).join(\"\") || 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: rows + 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","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","import { el, esc, hit, key, r } from \"../svg.ts\";\nimport type { Mark } from \"../types.ts\";\n\nconst HEAD = 30;\nconst ROW = 26;\nconst PAD = 8;\nconst num = (v: unknown) => (typeof v === \"number\" ? v : null);\n\n/**\n * Rows = x categories, one column per measure (every `spec.y` entry), value text plus a thin bar\n * scaled to the column max. Header cells are `data-maya=\"sort\"` groups (element/sort.ts).\n */\nexport const table: Mark = {\n noun: \"Table\",\n draw(ctx) {\n const { spec, width: W, height: H } = ctx;\n const ms = spec.measures;\n const title = (f: string) => spec.titles.get(f) ?? f;\n const agg = ctx.agg(spec.aggregate);\n\n const groups = new Map<string, (number | null)[][]>();\n for (const row of spec.data) {\n const k = String(row[spec.x]);\n const g =\n groups.get(k) ??\n groups\n .set(\n k,\n ms.map(() => []),\n )\n .get(k)!;\n ms.forEach((m, i) => g[i]!.push(num(row[m])));\n }\n let rows = [...groups].map(([name, g]) => ({ name, vals: g.map((v) => agg(v)) }));\n\n const nulls = (v: number | null, d: number) => (v === null ? Infinity : v * d);\n const byValue = (i: number, d: number) => (a: (typeof rows)[0], b: (typeof rows)[0]) =>\n nulls(a.vals[i]!, d) - nulls(b.vals[i]!, d) || 0;\n // ponytail: limit is a plain cut to the top N of the first measure (no Other roll-up).\n if (spec.limit !== null && rows.length > spec.limit)\n rows = rows.sort(byValue(0, -1)).slice(0, spec.limit);\n const by =\n spec.sortBy && (spec.sortBy[0] === spec.x || ms.includes(spec.sortBy[0]))\n ? spec.sortBy\n : null;\n if (by) {\n const d = by[1] === \"asc\" ? 1 : -1;\n const i = ms.indexOf(by[0]);\n if (i < 0) {\n const c = new Intl.Collator(spec.locale, { numeric: true });\n rows.sort((a, b) => d * c.compare(a.name, b.name));\n } else\n rows.sort((a, b) => {\n const [x, y] = [a.vals[i]!, b.vals[i]!];\n return x === null || y === null\n ? (x === null ? 1 : 0) - (y === null ? 1 : 0)\n : d * (x - y);\n });\n } else if (spec.sort) {\n rows.sort(byValue(0, spec.sort === \"asc\" ? 1 : -1));\n }\n\n const lw = Math.max(80, Math.min(W * 0.34, 180));\n const cw = (W - lw) / ms.length;\n const colX = (i: number) => lw + i * cw; // left edge of measure column i\n const max = ms.map((_, i) => Math.max(0, ...rows.map((rw) => Math.abs(rw.vals[i] ?? 0))));\n const cut = (s: string, w: number) => {\n const n = Math.max(1, Math.floor((w - PAD) / 7));\n return s.length > n ? s.slice(0, n - 1) + \"…\" : s;\n };\n\n let labels = \"\";\n let grid = \"\";\n let hits = \"\";\n const heads = [spec.x, ...ms];\n heads.forEach((f, i) => {\n const x0 = i ? colX(i - 1) : 0;\n const w = i ? cw : lw;\n const on = by?.[0] === f ? by[1] : null;\n const text = cut(title(f), w - (on ? 14 : 0)) + (on ? (on === \"asc\" ? \" ▲\" : \" ▼\") : \"\");\n // Headers go in the hits group: the labels group ignores the pointer.\n hits += el(\n \"g\",\n {\n \"data-maya\": \"sort\",\n \"data-field\": f,\n \"data-sort\": on,\n role: \"button\",\n tabindex: 0,\n \"aria-label\": on\n ? ctx.t(\"sortedBy\", title(f), ctx.t(on === \"asc\" ? \"ascending\" : \"descending\"))\n : title(f),\n },\n el(\"rect\", { x: r(x0), y: 0, width: r(w), height: HEAD, fill: \"transparent\" }) +\n el(\n \"text\",\n {\n \"data-th\": true,\n x: r(i ? x0 + w - PAD : PAD),\n y: HEAD / 2,\n \"text-anchor\": i ? \"end\" : \"start\",\n \"dominant-baseline\": \"middle\",\n },\n esc(text),\n ),\n );\n });\n grid += el(\"line\", { x1: 0, x2: W, y1: HEAD, y2: HEAD });\n\n // ponytail: rows that do not fit the height are not drawn (the tile shows the top rows); no scroll.\n const fit = Math.max(0, Math.floor((H - HEAD) / ROW));\n let marks = \"\";\n rows.slice(0, fit).forEach((rw, ri) => {\n const top = HEAD + ri * ROW;\n const name = ctx.fmt(spec.x, rw.name);\n // Row texts sit in the marks group, keyed by row, so a re-sort slides them with their bars.\n marks += el(\n \"text\",\n {\n \"data-key\": key(\"t\", rw.name),\n x: PAD,\n y: top + ROW / 2 - 2,\n \"dominant-baseline\": \"middle\",\n \"data-td\": \"label\",\n },\n esc(cut(name, lw)),\n );\n ms.forEach((m, mi) => {\n const v = rw.vals[mi]!;\n const right = colX(mi) + cw - PAD;\n const text = v === null ? \"–\" : ctx.fmt(m, v);\n marks += el(\n \"text\",\n {\n \"data-key\": key(\"v\", m, rw.name),\n x: r(right),\n y: top + ROW / 2 - 2,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"middle\",\n },\n esc(text),\n );\n if (v === null) return;\n const bw = max[mi] ? ((cw - 2 * PAD) * Math.abs(v)) / max[mi]! : 0;\n const d = {\n \"data-key\": key(m, rw.name),\n \"data-c\": ri,\n \"data-s\": ms.length > 1 ? mi % 8 : 0,\n \"data-x\": name,\n \"data-series\": title(m),\n \"data-f\": text,\n \"data-y\": v,\n \"data-neg\": v < 0,\n };\n const y = top + ROW - 7;\n marks += el(\"rect\", {\n \"data-maya\": \"mark\",\n ...d,\n x: r(colX(mi) + PAD),\n y,\n width: r(bw),\n height: 4,\n });\n hits += hit(d, colX(mi) + PAD, y, bw, 4);\n });\n });\n return { marks, hits, labels, grid };\n },\n};\n","const L =\n \":host,.maya-root{--maya-font:ui-sans-serif,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) 10%,transparent);--maya-bg:light-dark(#fff,#0d1117);--maya-accent:oklch(.6 .17 255);--maya-radius:3px;--maya-ease:cubic-bezier(.22,1,.36,1);--maya-tooltip-bg:color-mix(in oklab,var(--maya-bg) 92%,transparent);--maya-tooltip-fg:var(--maya-fg);--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// Area fill: the slot's baseline-fading gradient (render.ts defs), flat tint if the reference fails.\nconst A = rng(8)\n .map(\n (n) =>\n `svg:not([data-stack]) [data-maya=area][data-s=\"${n}\"]{fill:url(#maya-a${n}) color-mix(in oklab,var(--c) 18%,transparent)}`,\n )\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 (n) =>\n `.maya:has(.maya-legend [data-s=\"${n}\"]:hover) :is([data-maya=mark],[data-maya=line],[data-maya=area]):not([data-s=\"${n}\"]){opacity:.25}`,\n )\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:15px;letter-spacing:-.01em;margin:0 0 6px}\" +\n \".maya-legend,.maya-crumbs{color:var(--maya-fg-muted);display:flex;flex-wrap:wrap;align-items:center;gap:2px 6px;margin:0 0 8px}\" +\n \".maya-crumbs{min-height:1.25em;line-height:1.25}\" +\n `.maya-legend :is(button,span),.maya-crumbs button,.maya-reset{display:inline-flex;align-items:center;gap:6px;${B};border-radius:6px;padding:2px 6px;transition:background .15s,opacity .2s,color .15s}` +\n \":is(.maya-legend,.maya-crumbs) button:hover{background:var(--maya-grid);color:var(--maya-fg)}\" +\n \".maya-legend [aria-pressed=false]{opacity:.5}.maya-legend [aria-pressed=false] i{background:none;box-shadow:inset 0 0 0 1.5px var(--c)}\" +\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-reset{position:absolute;top:4px;right:4px;border:1px solid var(--maya-grid);border-radius:99px;padding:3px 12px;background:var(--maya-bg);box-shadow:0 1px 3px #0000001a}\" +\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);box-shadow:0 1px 3px #00000024;transition:transform .3s var(--maya-ease)}\" +\n C +\n `.maya-ctl [role=radio]{${B};position:relative;padding:4px 12px;border-radius:6px;transition:color .2s}` +\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}[data-maya^=axis] text{font-size:11px}\" +\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 .25s var(--maya-ease),fill .2s}[data-ghost]{pointer-events:none}\" +\n \"[data-maya=mark][data-active]{fill:color-mix(in oklab,var(--c,var(--maya-series-1)),var(--maya-fg) 12%)}\" +\n \"[data-stack] rect[data-maya=mark]{stroke:var(--maya-bg);stroke-width:1}\" +\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-lit],[data-selected],[data-last]){fill-opacity:0;stroke-opacity:0}\" +\n \"[data-maya=line]~circle[data-maya=mark]{stroke:var(--maya-bg);stroke-width:2;transition:fill-opacity .15s,stroke-opacity .15s}[data-maya=line]~circle[data-lit]{r:4px}\" +\n \"circle[data-maya=mark][data-active]{filter:drop-shadow(0 0 4px color-mix(in oklab,var(--c) 70%,transparent))}\" +\n \"[data-maya=line]{fill:none;stroke:var(--c);stroke-width:2.25;stroke-linejoin:round;stroke-linecap:round}\" +\n \"[data-maya=area]{fill:color-mix(in oklab,var(--c) 18%,transparent);stroke:none}[data-stack] [data-maya=area]{fill:color-mix(in oklab,var(--c) 45%,var(--maya-bg))}\" +\n A +\n \"stop{stop-color:var(--c)}\" +\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 // 0.2 types: ridgeline fill, radial rings, table header and row text, parallel line focus.\n \"[data-ridge]{fill:color-mix(in oklab,var(--c) 40%,var(--maya-bg))}[data-maya=grid] circle{fill:none;shape-rendering:auto}\" +\n \"[data-maya=labels] [data-ring]{fill:var(--maya-fg-muted)}[data-maya=marks] text{fill:var(--maya-fg)}\" +\n \"[data-maya=sort]{cursor:pointer}[data-maya=sort] rect{fill:transparent}[data-maya=sort] text{font-weight:600}[data-maya=sort]:focus-visible{outline:2px solid var(--maya-focus)}\" +\n \":is([data-maya=line],[data-maya=area]){transition:opacity .25s}[data-maya=marks]:has(path[data-active]) path[data-maya=line]:not([data-active]){opacity:.25}\" +\n \"[data-depth]{stroke:var(--maya-bg);stroke-width:1}\" +\n \"[data-maya=marks]:has([data-active]) [data-maya=mark]:not([data-active],[data-lit],text){opacity:.4}\" +\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],[data-maya=band]{pointer-events:none}[data-maya=cross],[data-maya=band]{opacity:0;transition:opacity .2s}\" +\n \"[data-on]:is([data-maya=cross],[data-maya=band]){opacity:1;transition:opacity .2s,transform .25s var(--maya-ease)}[data-maya=band]{fill:var(--maya-fg);fill-opacity:.05;rx:6px}\" +\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}[data-maya=labels] [data-dark]{fill:var(--maya-bg)}[data-maya=hit]{stroke:none}\" +\n \"[data-maya=cross] line{stroke:var(--maya-fg-muted);stroke-opacity:.55}\" +\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:1px solid var(--maya-grid);padding:8px 10px;min-width:96px;background:var(--maya-tooltip-bg);color:var(--maya-tooltip-fg);border-radius:8px;box-shadow:0 1px 2px #0000000f,0 10px 28px -8px #0000004d;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);font:var(--maya-font-size)/1.4 var(--maya-font);font-variant-numeric:tabular-nums;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}.maya-tip[data-side]{position-area:inline-end span-block-end;position-try-fallbacks:flip-inline;margin:0 12px}}\" +\n \".maya-tip{opacity:0;translate:0 4px;transition:opacity .15s,translate .2s var(--maya-ease)}.maya-tip.maya-open{opacity:1;translate:none}\" +\n \".maya-tip b{display:block;margin:0 0 4px;font-weight:600}\" +\n \".maya-tip div{display:flex;align-items:center;gap:8px;color:color-mix(in oklab,var(--maya-tooltip-fg) 72%,transparent)}.maya-tip i{width:8px;height:8px;border-radius:50%}\" +\n \".maya-tip [data-v]{margin-inline-start:auto;padding-inline-start:12px;font-weight:600;color:var(--maya-tooltip-fg)}.maya-tip [data-on]{color:var(--maya-tooltip-fg)}\" +\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:has(button){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 \"[data-still] *{transition:none!important}@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\"];\n/** Types whose x can come from path with drill (the current level is the category). */\nconst PATHX = [...CART, \"dumbbell\"];\nconst PATH = [\"treemap\", \"sunburst\", \"sankey\", \"chord\"];\n/** y arrays on these types are shown together (axes, columns), never a measure toggle. */\nexport const ALL_Y = [\"parallel\", \"table\"];\n/** Option -> types that accept it (option-unsupported otherwise). */\nconst CPA = \"bar,line,area\";\nconst PTH = \"treemap,sunburst,sankey,chord\";\nexport const ONLY: Readonly<Record<string, readonly string[]>> = Object.fromEntries(\n w(\n `horizontal:bar,dumbbell y2:bar size:scatter name:scatter,beeswarm path:${CPA},dumbbell,${PTH} totals:waterfall series:${CPA},scatter,heatmap,dumbbell,ridgeline,beeswarm,parallel,marimekko,radial sort:${CPA},heatmap,dumbbell,table,radial,waffle limit:${CPA},heatmap,dumbbell,table,waffle,radial stack:bar,area colorBy:${CPA},waterfall,scatter,dumbbell,kpi,treemap,sunburst,hexmap xDomain:scatter drill:${CPA},dumbbell,${PTH} select:${CPA},waterfall,scatter,heatmap,dumbbell,beeswarm,parallel,table,marimekko,waffle,radial,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 if (t === \"chord\" && Array.isArray(pth) && pth.length !== 2)\n fail(\n \"invalid-option\",\n \"path\",\n \"spec.path needs exactly two levels for a chord: from and to.\",\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 t !== \"beeswarm\" &&\n !(need === \"x\" && PATHX.includes(t) && s.path !== undefined)\n )\n missing(need);\n if (s.y === undefined) missing(\"y\");\n if ((t === \"dumbbell\" || t === \"ridgeline\" || t === \"marimekko\") && s.series === undefined)\n missing(\"series\");\n if (t === \"parallel\" && !(Array.isArray(s.y) && s.y.length >= 2))\n fail(\n \"invalid-option\",\n \"y\",\n 'spec.y on \"parallel\" needs an array of at least 2 measures, one axis each.',\n 'Example: y: [\"sales\", \"units\", \"price\"]',\n );\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 (k === \"yDomain\" ? d[0] !== d[1] : d[0]! < d[1]!)\n )\n )\n fail(\n \"invalid-domain\",\n k,\n `spec.${k} = ${show(d)} is not a valid domain.`,\n k === \"yDomain\"\n ? \"Expected [min, max] (or [max, min] to reverse) with two different finite numbers.\"\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 = PATHX.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 sortBy\");\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, sortBy } = v as Record<string, unknown>;\n if (\n sortBy !== undefined &&\n !(\n Array.isArray(sortBy) &&\n sortBy.length === 2 &&\n typeof sortBy[0] === \"string\" &&\n (sortBy[1] === \"asc\" || sortBy[1] === \"desc\")\n )\n )\n inv(\"view.sortBy\", sortBy, '[field, \"asc\" | \"desc\"]');\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 ?? (PATHX.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 sortBy: view.sortBy ?? 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:\n spec.legend ?? (spec.series !== undefined || spec.y2 !== undefined || spec.type === \"waffle\"),\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 transform/opacity, plus two exceptions:\n * update: from translate(oldX-newX, oldY-newY) scale(oldW/newW, oldH/newH) to none,\n * delayed by data-c (stagger, at most 320 ms across all categories)\n * enter: positive bar from translate(0, h) scale(1, 0); negative from scale(1, 0);\n * circles pop from their centre; other paths scale from 0.6 about their own\n * centre; plus opacity 0 -> 1\n * exit: reverse of enter, then remove on finish. Leaving nodes lose data-key and get\n * data-ghost (styled, not hit-testable) until removed.\n * paths: a path whose `d` changed morphs through CSS `d` when the browser interpolates\n * it and the command letters are unchanged (exception 1); else the old outline\n * crossfades out over the new one.\n * text: a text mark whose number changed counts to it with rAF, replacing digits in\n * place so the formatter's separators survive (exception 2).\n * first draw (no server-rendered svg): grid and axes fade in; marks enter by kind:\n * \"wipe\" (clip-path inset on the marks group: line, area, sankey, ridgeline,\n * parallel), \"bloom\" (rotate + scale of the marks group about the plot centre:\n * sunburst, chord, radial) or per mark (everything else); labels fade in last.\n * Guard zero sizes (use 1e-6). Skip entirely under prefers-reduced-motion or\n * spec.animate === false.\n *\n * Hover (element/tooltip.ts): the active mark gets data-active and the marks of its\n * category (its tooltip rows, plus hierarchy ancestors) data-lit; CSS dims the rest.\n * Bar types get an element-owned `<rect data-maya=\"band\">` before the marks group,\n * moved with a CSSOM transform; it and the crosshair glide once they carry data-on.\n * Charts with a crosshair anchor the tooltip beside it (data-side on .maya-tip).\n * The tooltip glides between marks (FLIP on its own box, transform only).\n *\n * Fills: non-stacked area and kpi carry `<defs>` in the grid group with one\n * linearGradient per visible slot (`maya-a0`..`maya-a7`, data-s for its colour). The svg\n * carries data-stack when stacked (separated bar segments, opaque stacked areas).\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 { beeswarm } from \"./marks/beeswarm.ts\";\nimport { dumbbell } from \"./marks/dumbbell.ts\";\nimport { heatmap } from \"./marks/heatmap.ts\";\nimport { kpi } from \"./marks/kpi.ts\";\nimport { parallel } from \"./marks/parallel.ts\";\nimport { ridgeline } from \"./marks/ridgeline.ts\";\nimport { area, line } from \"./marks/line.ts\";\nimport { scatter } from \"./marks/scatter.ts\";\nimport { table } from \"./marks/table.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 { ALL_Y, 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 ridgeline,\n beeswarm,\n parallel,\n table,\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 // Area fills fade toward the baseline: one gradient per visible slot, kept in the grid group\n // (the marks group holds keyed marks only). ponytail: fixed ids, see NON-FEATURES.\n const fades =\n (s.type === \"area\" && !s.stack) || s.type === \"kpi\"\n ? el(\n \"defs\",\n {},\n [...new Set(shaped.visible.map((i) => i % 8))]\n .map((n) =>\n el(\n \"linearGradient\",\n { id: `maya-a${n}`, \"data-s\": n, x1: 0, y1: 0, x2: 0, y2: 1 },\n `<stop offset=\"0\" stop-opacity=\".34\"/><stop offset=\"1\" stop-opacity=\".02\"/>`,\n ),\n )\n .join(\"\"),\n )\n : \"\";\n body =\n g(\"grid\", fades + (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 // Waffle slots follow categories (data-s = category index), so its keys map against those.\n for (const [k, c] of s.colors as ReadonlyMap<string, string>) {\n const j = (s.type === \"waffle\" ? shaped.categories : 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 // A table has focusable sort headers, which an img role would hide (children presentational).\n role: s.type === \"table\" ? \"figure\" : \"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 \"data-stack\": s.stack || 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 && !ALL_Y.includes(s.type)\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","/*\n * Every innerHTML / insertAdjacentHTML / template.innerHTML in the element goes through\n * html(): a Trusted Types policy created once. Safe because core escapes every data string.\n * Hosts allow it with `trusted-types mayacharts`.\n */\ntype Policy = { createHTML(s: string): string };\ntype TT = { createPolicy(n: string, o: Policy): Policy; getPolicy?(n: string): Policy | null };\nlet cache: [TT, Policy | null] | undefined;\n\nexport const html = (s: string): string => {\n const tt = (globalThis as { trustedTypes?: TT }).trustedTypes;\n if (!tt) return s;\n if (cache?.[0] !== tt) {\n let p: Policy | null = null;\n try {\n p = tt.createPolicy(\"mayacharts\", { createHTML: (x) => x });\n } catch {\n p = tt.getPolicy?.(\"mayacharts\") ?? null; // duplicate names may be refused by the page's CSP\n }\n cache = [tt, p];\n }\n return cache[1] ? cache[1].createHTML(s) : s;\n};\n","import { html } from \"./html.ts\";\n\n/** x, y, width, height in viewBox units. */\nexport type Box = [x: number, y: number, w: number, h: number];\n/** First-draw choreography: wipe left to right (lines, flows), bloom from the centre (radial), or per mark. */\nexport type Intro = \"wipe\" | \"bloom\" | \"marks\";\nexport interface PatchOptions {\n /** Entering marks start from this box; exiting marks collapse into it. */\n origin?: Box | undefined;\n /** Post-patch hook, called with the live svg after every patch (animated or not). */\n after?: (svg: Element) => void;\n /** Diff and reuse nodes, but apply every change immediately (resize). */\n instant?: boolean;\n /** First draw: play this entrance (only when animating). */\n intro?: Intro | undefined;\n}\n\nlet instant = false;\nlet lag = 0; // ms per category step of the current patch's stagger\n\nconst EASE = \"cubic-bezier(.22,1,.36,1)\"; // ease-out-quint: fast start, long soft landing\nconst POP = \"cubic-bezier(.34,1.5,.64,1)\"; // slight overshoot for points\nconst SWEEP = \"cubic-bezier(.65,0,.35,1)\";\nconst DATA: KeyframeAnimationOptions = { duration: 520, easing: EASE };\nconst INTRO: KeyframeAnimationOptions = { duration: 760, easing: EASE };\nconst UI: KeyframeAnimationOptions = { duration: 220, easing: EASE };\nconst MAX = 1500; // ponytail: no animation above this many marks\nconst STAGGER = 320; // total stagger spread across categories, ms\nconst Z = 1e-6;\nconst n = (e: Element, k: string) => +(e.getAttribute(k) ?? 0);\n\n/** Geometry of a rect or circle (circle = its bounding square); undefined for paths etc. */\nconst geo = (e: Element): Box | undefined => {\n if (e.localName === \"rect\") return [n(e, \"x\"), n(e, \"y\"), n(e, \"width\"), n(e, \"height\")];\n if (e.localName === \"circle\") {\n const r = n(e, \"r\");\n return [n(e, \"cx\") - r, n(e, \"cy\") - r, 2 * r, 2 * r];\n }\n};\n\n/** Box of any mark (paths via getBBox where it exists); used to derive a drill origin. */\nexport const boxOf = (e: Element): Box | undefined => {\n const b = (e as SVGGraphicsElement).getBBox?.();\n return geo(e) ?? (b ? [b.x, b.y, b.width, b.height] : undefined);\n};\n\n/** Transform (origin 0 0 of the fill-box) that maps geometry `g` onto box `b`. */\nconst tf = (g: Box, b: Box) =>\n `translate(${b[0] - g[0]}px,${b[1] - g[1]}px) scale(${Math.max(b[2], Z) / Math.max(g[2], Z)},${Math.max(b[3], Z) / Math.max(g[3], Z)})`;\n\nconst run = (e: Element, k: Keyframe[], o: KeyframeAnimationOptions, then?: () => void) => {\n // A delayed animation holds its first frame while it waits (else the mark flashes in place).\n if (o.delay) o = { ...o, fill: o.fill === \"forwards\" ? \"both\" : (o.fill ?? \"backwards\") };\n const a = instant ? undefined : e.animate?.(k, o);\n if (!then) return;\n if (!a) return then();\n let done = false;\n const once = () => done || ((done = true), then());\n a.addEventListener(\"finish\", once);\n a.addEventListener(\"cancel\", once);\n // Hidden tabs freeze animation timelines; ghosts must still leave.\n setTimeout(once, Number(o.duration ?? 0) + Number(o.delay ?? 0) + 100);\n};\n\n/** Stagger: a mark's delay follows its category, so bars rise left to right. */\nconst delay = (e: Element) => (e.hasAttribute(\"data-c\") ? n(e, \"data-c\") * lag : 0);\n\nfunction sync(o: Element, w: Element): void {\n // `style` holds element-owned CSSOM writes (bloom origin), never markup: keep it.\n for (const a of [...o.attributes])\n if (!w.hasAttribute(a.name) && a.name !== \"style\") o.removeAttribute(a.name);\n for (const a of [...w.attributes]) o.setAttribute(a.name, a.value);\n}\n\n/** Where an entering mark starts (and an exiting one ends): `origin`, else its own baseline/centre. */\nfunction seed(e: Element, g: Box, origin?: Box): Box {\n if (origin) return origin;\n const [x, y, w, h] = g;\n if (e.localName === \"circle\") return [x + w / 2, y + h / 2, 0, 0];\n const neg = e.hasAttribute(\"data-neg\");\n return e.closest(\"[data-dir=h]\") ? [neg ? x + w : x, y, 0, h] : [x, neg ? y : y + h, w, 0];\n}\n\nfunction fade(e: Element, out: boolean, then?: () => void, o = DATA): void {\n const k = [{ opacity: 0 }, { opacity: 1 }];\n run(e, out ? k.reverse() : k, out ? { ...o, fill: \"forwards\" } : o, then);\n}\n\n/** Paths (arcs, hexes, ribbons): grow from their own centre while fading in. */\nconst pop = (out = false) => {\n const k: Keyframe[] = [\n { transform: \"scale(.6)\", transformOrigin: \"50% 50%\", opacity: 0 },\n { transform: \"none\", transformOrigin: \"50% 50%\", opacity: 1 },\n ];\n return out ? k.reverse() : k;\n};\n\nfunction enter(e: Element, origin?: Box, o = DATA): void {\n const g = geo(e);\n const at = { ...o, delay: delay(e) };\n if (g) {\n const c = e.localName === \"circle\";\n run(\n e,\n [\n { transform: tf(g, seed(e, g, origin)), opacity: 0 },\n { transform: \"none\", opacity: 1 },\n ],\n c && !origin ? { ...at, easing: POP } : at,\n );\n } else if (e.matches(\"path[data-maya=line]\")) {\n e.setAttribute(\"pathLength\", \"1\");\n const d = (o: string) => ({ strokeDasharray: \"1\", strokeDashoffset: o });\n run(e, [d(\"1\"), d(\"0\")], { ...o, easing: SWEEP, duration: Number(o.duration) * 1.4 });\n } else if (e.localName === \"path\" && !e.matches(\"[data-maya=area]\")) run(e, pop(), at);\n else fade(e, false, undefined, at);\n}\n\n/** An outgoing node: unaddressable (no key, no pointer) but still styled while it leaves. */\nfunction retire(e: Element): void {\n for (const k of [\"data-key\", \"data-active\", \"data-lit\"]) e.removeAttribute(k);\n e.setAttribute(\"data-ghost\", \"\");\n}\n\nfunction exit(e: Element, origin?: Box): void {\n retire(e);\n const g = geo(e);\n const done = () => e.remove();\n const o = { ...DATA, fill: \"forwards\" as const };\n if (g)\n run(\n e,\n [\n { transform: \"none\", opacity: 1 },\n { transform: tf(g, seed(e, g, origin)), opacity: 0 },\n ],\n o,\n done,\n );\n else if (e.localName === \"path\" && !e.matches(\"[data-maya=line],[data-maya=area]\"))\n run(e, pop(true), o, done);\n else fade(e, true, done);\n}\n\n/** Current on-screen box of an animating mark (its animations keep running). */\nfunction visual(m: Element, g: Box): Box {\n if (!m.getAnimations?.().length) return g;\n const t = getComputedStyle(m).transform; // user units under fill-box, origin 0 0\n if (!t || t === \"none\" || typeof DOMMatrix === \"undefined\") return g;\n const c = new DOMMatrix(t);\n return [g[0] + c.e, g[1] + c.f, g[2] * c.a, g[3] * c.d];\n}\n\n// Paths morph through CSS `d` where the engine interpolates it (Chromium, Firefox) and the\n// command sequence is unchanged; otherwise the old outline crossfades out.\nconst MORPH = !!globalThis.CSS?.supports?.(\"d\", 'path(\"M0 0\")');\nconst cmds = (d: string) => d.replace(/[^A-Za-z]/g, \"\");\nconst morphable = (d0: string, d1: string) => MORPH && !!d0 && !!d1 && cmds(d0) === cmds(d1);\nconst morphs = new WeakMap<Element, Animation>();\n\n/** The outline on screen: mid-morph, the interpolated `d`; else the attribute. Read before sync. */\nconst outline = (m: Element, d0: string) => {\n const c = morphs.get(m)?.playState === \"running\" ? getComputedStyle(m).getPropertyValue(\"d\") : \"\";\n return c.startsWith(\"path(\") ? c : `path(\"${d0}\")`;\n};\n\nfunction morph(m: Element, from: string, d1: string): void {\n for (const a of m.getAnimations?.() ?? []) a.cancel();\n if (instant) return;\n const a = m.animate?.([{ d: from }, { d: `path(\"${d1}\")` }], DATA);\n if (a) morphs.set(m, a);\n}\n\n/** Path whose shape changed: the old outline fades out over the new one. */\nfunction crossfade(m: Element): void {\n const gh = m.cloneNode(true) as Element;\n retire(gh);\n m.before(gh);\n fade(gh, true, () => gh.remove());\n}\n\n// Numbers in text marks (kpi value): count to the new value. Digits are replaced in place, so\n// the locale's separators, prefix and suffix stay exactly as the formatter wrote them.\nconst NUM = /\\d(?:[\\d.,'\\u2019\\s\\u00a0\\u202f]*\\d)?/;\nconst counts = new WeakMap<Element, number>(); // latest count per element; older loops stop\nfunction count(e: Element, from: string, o: KeyframeAnimationOptions): void {\n const to = e.textContent ?? \"\";\n const m = NUM.exec(to);\n const f = NUM.exec(from);\n if (!m || instant || typeof requestAnimationFrame === \"undefined\") return;\n const tok = m[0];\n const ds = tok.replace(/\\D/g, \"\");\n if (ds.length > 15 || +ds === 0) return;\n // Count from the old number when it has the same shape (same digit count), else from zero.\n const fd = f ? f[0].replace(/\\D/g, \"\") : \"\";\n const a = fd.length === ds.length ? +fd : 0;\n const b = +ds;\n if (a === b) return;\n // A last separator followed by other than 3 digits is the decimal mark, as is one after a\n // lone leading zero (\"0.125\").\n const ls = /^0\\D/.test(tok) ? 1 : tok.search(/\\D\\d{1,2}$|\\D\\d{4,}$/);\n const head = to.slice(0, m.index),\n tail = to.slice(m.index + tok.length);\n const shape = (k: number) => {\n const s = String(k).padStart(ds.length, \"0\");\n let i = 0;\n const t = tok.replace(/\\d/g, () => s[i++]!);\n const [int, dec] = ls < 0 ? [t, \"\"] : [t.slice(0, ls), t.slice(ls)];\n return head + int.replace(/^[0\\D]+(?=\\d)/, \"\") + dec + tail;\n };\n const ms = Number(o.duration) * 1.6,\n t0 = performance.now() + Number(o.delay ?? 0);\n const id = (counts.get(e) ?? 0) + 1;\n counts.set(e, id);\n let cur = shape(a);\n e.textContent = cur;\n const step = (now: number) => {\n if (counts.get(e) !== id || e.textContent !== cur) return; // a newer count or render\n const p = Math.min(1, Math.max(0, (now - t0) / ms));\n e.textContent = cur = p < 1 ? shape(Math.round(a + (b - a) * (1 - (1 - p) ** 4))) : to;\n if (p < 1) requestAnimationFrame(step);\n };\n requestAnimationFrame(step);\n}\n\nfunction marks(o: Element, w: Element, origin?: Box): void {\n const old = new Map<string, Element>();\n for (const e of o.children)\n if (e.hasAttribute(\"data-key\")) old.set(e.getAttribute(\"data-key\")!, e);\n const order: Element[] = [];\n for (const e of [...w.children]) {\n const k = e.getAttribute(\"data-key\")!;\n const m = old.get(k);\n if (!m || m.localName !== e.localName) {\n // Unknown key, or same key with another tag: replace (old one exits).\n order.push(e);\n continue;\n }\n old.delete(k);\n const g0 = geo(m);\n const v = g0 && visual(m, g0);\n const d0 = m.getAttribute(\"d\") ?? \"\",\n d1 = e.getAttribute(\"d\") ?? \"\";\n const shaped = !g0 && d0 !== d1;\n const morphed = shaped && morphable(d0, d1);\n const from = morphed ? outline(m, d0) : \"\";\n const was = m.textContent ?? \"\";\n if (instant || (shaped && !morphed)) for (const a of m.getAnimations?.() ?? []) a.cancel();\n if (shaped && !morphed && !instant) crossfade(m); // the ghost keeps the old outline\n sync(m, e);\n if (morphed) morph(m, from, d1);\n if (m.innerHTML !== e.innerHTML) m.replaceChildren(...e.childNodes);\n const g1 = geo(m);\n // Moved: restart from where it is on screen now. Unmoved: a running entrance keeps playing.\n if (\n !instant &&\n v &&\n g1 &&\n (v.some((x, i) => Math.abs(x - g1[i]!) > 0.01) || g1.some((x, i) => x !== g0[i]))\n ) {\n for (const a of m.getAnimations?.() ?? []) a.cancel();\n run(m, [{ transform: tf(g1, v) }, { transform: \"none\" }], { ...DATA, delay: delay(m) / 2 });\n } else if (shaped && !morphed) fade(m, false);\n if (m.localName === \"text\" && m.textContent !== was) count(m, was, DATA);\n order.push(m);\n }\n for (const m of old.values()) exit(m, origin);\n let ref = o.firstElementChild;\n for (const m of order) {\n while (ref && ref !== m && !ref.hasAttribute(\"data-key\")) ref = ref.nextElementSibling;\n if (ref === m) ref = ref.nextElementSibling;\n else {\n const fresh = !m.isConnected;\n o.insertBefore(m, ref);\n if (fresh) enter(m, origin);\n }\n }\n}\n\n/** Crossfade the non-mark children (axes, grid, labels): changed groups fade 220 ms. */\nfunction ui(o: Element, w: Element, om: Element, wm: Element): void {\n const id = (c: Element) => c.getAttribute(\"data-maya\") ?? c.localName;\n const pool = new Map([...o.children].filter((c) => c !== om).map((c) => [id(c), c]));\n const out: Element[] = [];\n const fadeIn: Element[] = [];\n const ghosts: Element[] = [];\n const fadeable = (c: Element) => c.localName === \"g\" && !/^(cross|hits)$/.test(id(c));\n for (const c of [...w.children]) {\n if (c === wm) {\n out.push(om);\n continue;\n }\n const p = pool.get(id(c));\n pool.delete(id(c));\n if (p && p.outerHTML === c.outerHTML) out.push(p);\n else {\n if (p && fadeable(p)) (ghosts.push(p), out.push(p));\n out.push(c);\n if (p && fadeable(c)) fadeIn.push(c);\n }\n }\n for (const p of pool.values()) if (fadeable(p)) (ghosts.push(p), out.push(p));\n o.replaceChildren(...out);\n // Start every fade after the swap: animations on template children stay pending forever in\n // WebKit and Firefox, and a ghost removed synchronously would be re-inserted by the swap.\n for (const g of ghosts) ghost(g);\n for (const c of fadeIn) fade(c, false, undefined, UI);\n}\n\n/** An outgoing group: unaddressable while it fades, then removed. */\nfunction ghost(g: Element): void {\n g.removeAttribute(\"data-maya\");\n for (const d of g.querySelectorAll(\"[data-maya]\")) d.removeAttribute(\"data-maya\");\n fade(g, true, () => g.remove(), UI);\n}\n\n/** The first draw: scaffolding fades in, marks enter by `kind`, labels and numbers follow. */\nfunction intro(svg: Element, kind: Intro): void {\n const part = (k: string) => svg.querySelector(`:scope > [data-maya=${k}]`);\n for (const k of [\"grid\", \"axis-y\", \"axis-x\"]) {\n const g = part(k);\n if (g) fade(g, false, undefined, { ...UI, duration: 480 });\n }\n const m = part(\"marks\");\n if (!m) return;\n const late = { ...UI, duration: 360, delay: Number(INTRO.duration) * 0.6 + STAGGER / 2 };\n const l = part(\"labels\");\n if (l) fade(l, false, undefined, late);\n if (kind === \"wipe\") {\n // Clip, not geometry: lines, areas and points are revealed together, left to right.\n const c = (r: string) => ({ clipPath: `inset(-20% ${r} -20% -1%)` });\n run(m, [c(\"101%\"), c(\"-1%\")], { duration: 1100, easing: SWEEP });\n } else if (kind === \"bloom\") {\n const p = (svg.getAttribute(\"data-plot\") ?? \"0 0 0 0\").split(\" \").map(Number);\n (m as SVGElement).style.transformOrigin = `${p[0]! + p[2]! / 2}px ${p[1]! + p[3]! / 2}px`;\n run(\n m,\n [\n { transform: \"rotate(-24deg) scale(.82)\", opacity: 0 },\n { transform: \"none\", opacity: 1 },\n ],\n { duration: 1000, easing: EASE },\n );\n } else for (const e of m.children) enter(e, undefined, INTRO);\n for (const t of m.querySelectorAll(\"text[data-maya=mark]\")) count(t, \"\", INTRO);\n}\n\n/** ms between categories so the whole stagger spans at most STAGGER. */\nconst spread = (wm: Element) => {\n const cs = new Set<string>();\n for (const e of wm.children) cs.add(e.getAttribute(\"data-c\") ?? \"\");\n return Math.min(40, STAGGER / Math.max(1, cs.size));\n};\n\nexport function patch(\n box: Element,\n markup: string,\n animate: boolean,\n opts: PatchOptions = {},\n): void {\n const t = document.createElement(\"template\");\n t.innerHTML = html(markup);\n const w = t.content.firstElementChild!;\n const o = box.firstElementChild;\n const om = o?.querySelector(\":scope > [data-maya=marks]\");\n const wm = w.querySelector(\":scope > [data-maya=marks]\");\n const many = !wm || wm.childElementCount > MAX || (om?.childElementCount ?? 0) > MAX;\n if (!animate || !o || !om || !wm || many) {\n box.replaceChildren(w);\n if (animate && opts.intro && wm && !many) {\n lag = spread(wm);\n intro(box.firstElementChild!, opts.intro);\n }\n } else {\n instant = !!opts.instant;\n lag = spread(wm);\n sync(o, w);\n sync(om, wm);\n marks(om, wm, opts.origin);\n ui(o, w, om, wm);\n instant = false;\n }\n opts.after?.(box.firstElementChild!);\n}\n","/*\n * Drill (T10b). Same reduce/mount contract as measure.ts.\n * Click/Enter on a mark pushes its branch; breadcrumb (Parts.crumbs, `.maya-crumbs`), Back\n * and Escape (priority 5) pop. Persistence: resets when type/x/path change, popping to the\n * deepest branch that still exists in the data.\n */\nimport { t } from \"../core/strings.ts\";\nimport type { ChartSpec, Handlers, Host, SpecEvent, State } from \"../core/types.ts\";\n\n/** `spec` is needed to gate a push (the reducer has no other access to it). */\nexport type DrillEvent =\n { type: \"drill\"; value: string; spec?: ChartSpec } | { type: \"pop\"; depth: number } | SpecEvent;\n\nconst same = (a: readonly string[] = [], b: readonly string[] = []) =>\n a.length === b.length && a.every((v, i) => v === b[i]);\n\nconst withDrill = (s: State, drill: readonly string[]): State =>\n same(s.view.drill, drill) ? s : { view: { ...s.view, drill }, selected: [] };\n\nexport const reduce = (s: State, e: DrillEvent): State => {\n const cur = s.view.drill ?? [];\n if (e.type === \"pop\") return withDrill(s, cur.slice(0, Math.max(0, e.depth)));\n if (e.type === \"drill\") {\n const n = e.spec?.path?.length ?? 0;\n return e.spec?.drill && cur.length < n - 1 ? withDrill(s, [...cur, e.value]) : s;\n }\n if (e.type !== \"spec\" || !cur.length) return s;\n const { prev, next } = e;\n const path = next.path ?? [];\n if (\n !next.drill ||\n (prev && (prev.type !== next.type || prev.x !== next.x || !same(prev.path, next.path)))\n )\n return withDrill(s, []);\n // Deepest branch that still has rows.\n let rows = next.data;\n const keep: string[] = [];\n for (let i = 0; i < cur.length && i < path.length - 1; i++) {\n rows = rows.filter((r) => String(r[path[i]!]) === cur[i]);\n if (!rows.length) break;\n keep.push(cur[i]!);\n }\n return withDrill(s, keep);\n};\n\n/** Raw category the mark stands for, decoded from its data-key (grammar: core/svg.ts). */\nconst branchOf = (key: string, depth: number): string | undefined => {\n const p = key.split(\"~\");\n const raw = p[0] === \"h\" ? (p[1 + depth] ?? p[p.length - 1]) : p[1];\n if (raw === undefined) return;\n try {\n return decodeURIComponent(raw);\n } catch {\n return raw;\n }\n};\n\nexport const mount = (host: Host): Handlers => {\n /** After the next paint: focus the first mark (push) or the parent mark (pop). */\n let want: { first: true } | { value: string } | undefined;\n\n const marks = () =>\n [...host.root.querySelectorAll<SVGElement>(\"[data-maya=mark][data-key]\")].filter(\n (m) => !m.hasAttribute(\"data-other\"),\n );\n\n const say = (next: State) => {\n const spec = host.spec();\n const d = next.view.drill ?? [];\n if (spec) host.announce(t(spec, d.length ? \"drilledInto\" : \"back\", d.join(\" / \")));\n };\n\n const pop = (depth: number): boolean => {\n const s = host.state();\n const cur = s.view.drill ?? [];\n if (depth >= cur.length) return false;\n const next = reduce(s, { type: \"pop\", depth });\n if (next === s) return false;\n want = { value: cur[depth]! };\n host.commit(next);\n say(next);\n return true;\n };\n\n const push = (mark: Element): boolean => {\n const spec = host.spec();\n const key = mark.getAttribute(\"data-key\");\n if (!spec?.drill || !key || mark.hasAttribute(\"data-other\")) return false;\n const s = host.state();\n const value = branchOf(key, (s.view.drill ?? []).length);\n if (value === undefined) return false;\n const next = reduce(s, { type: \"drill\", value, spec });\n if (next === s) return false;\n want = { first: true };\n host.commit(next);\n say(next);\n return true;\n };\n\n const click = (e: Event) => {\n const el = e.target as Element | null;\n const crumb = el?.closest(\".maya-crumbs [data-depth]\");\n if (crumb) return void pop(Number(crumb.getAttribute(\"data-depth\")));\n const m = el?.closest(\"[data-maya=mark],[data-maya=hit]\");\n if (m) push(m);\n };\n host.root.addEventListener(\"click\", click);\n\n return {\n escape: () => pop((host.state().view.drill ?? []).length - 1),\n enter: (mark) => push(mark),\n painted() {\n if (!want) return;\n const all = marks();\n const m =\n \"first\" in want\n ? all[0]\n : all.find(\n (x) =>\n branchOf(x.getAttribute(\"data-key\")!, host.state().view.drill?.length ?? 0) ===\n (want as { value: string }).value,\n );\n want = undefined;\n if (m) {\n if (!m.hasAttribute(\"tabindex\")) m.setAttribute(\"tabindex\", \"-1\");\n (m as unknown as HTMLElement).focus?.({ preventScroll: true });\n }\n // Keyboard must keep working after a pointer drill: fall back to the chart itself.\n if (!host.root.activeElement || !host.root.contains(host.root.activeElement))\n host.root.querySelector<HTMLElement>(\".maya-svg\")?.focus({ preventScroll: true });\n },\n off: () => host.root.removeEventListener(\"click\", click),\n };\n};\n","/*\n * Measure toggle (T10a). Contract shared by measure/drill/select/zoom:\n * reduce(state, event) => state pure, node-tested; handles its own events and\n * { type: \"spec\", prev, next } (persistence rules)\n * mount(host) => Handlers DOM wiring on host.root; calls host.commit(next)\n * Markup: Parts.controls, a `.maya-ctl` radiogroup of [role=radio][aria-checked] buttons.\n * Persistence: measure resets when spec.y changes.\n */\nimport type { Handlers, Host, SpecEvent, State } from \"../core/types.ts\";\nimport { t } from \"../core/strings.ts\";\n\n/** `count` (number of measures) bounds the index; without it only the lower bound applies. */\nexport type MeasureEvent =\n { type: \"measure\" | \"pick\"; index: number; count?: number | undefined } | SpecEvent;\n\nconst RADIO = \".maya-ctl [role=radio]\";\n\nexport const reduce = (s: State, e: MeasureEvent): State => {\n if (e.type === \"spec\") {\n const y = e.next.y;\n const same = e.prev && JSON.stringify(y) === JSON.stringify(e.prev.y);\n if (Array.isArray(y) && same) return s;\n if (s.view.measure === undefined) return s;\n const { measure: _drop, ...view } = s.view;\n return { ...s, view };\n }\n const max = e.count === undefined ? Infinity : e.count - 1;\n const index = Math.min(Math.max(0, Math.trunc(e.index) || 0), Math.max(0, max));\n return s.view.measure === index ? s : { ...s, view: { ...s.view, measure: index } };\n};\n\nexport const mount = (host: Host): Handlers => {\n const radios = () => [...host.root.querySelectorAll<HTMLElement>(RADIO)];\n let kbd = false; // the last change came from the keyboard: keep focus on the active radio\n\n const pick = (index: number): void => {\n const spec = host.spec();\n const ys = spec && Array.isArray(spec.y) ? (spec.y as string[]) : [];\n const s = host.state();\n const next = reduce(s, { type: \"measure\", index, count: ys.length || undefined });\n if (next === s) return;\n host.commit(next);\n const m = next.view.measure ?? 0;\n const name = ys[m] ?? String(m);\n host.announce(\n t(\n spec ?? {},\n \"showing\",\n (spec?.titles as Record<string, string> | undefined)?.[name] ?? name,\n ),\n );\n };\n\n const click = (e: Event): void => {\n const b = (e.target as Element).closest?.(RADIO);\n const i = b ? radios().indexOf(b as HTMLElement) : -1;\n if (i >= 0) pick(i);\n };\n\n const keydown = (e: Event): void => {\n const k = (e as KeyboardEvent).key;\n const all = radios();\n const i = all.indexOf((e.target as Element).closest?.(RADIO) as HTMLElement);\n if (i < 0) return;\n const to =\n k === \"ArrowRight\" || k === \"ArrowDown\"\n ? (i + 1) % all.length\n : k === \"ArrowLeft\" || k === \"ArrowUp\"\n ? (i - 1 + all.length) % all.length\n : k === \"Home\"\n ? 0\n : k === \"End\"\n ? all.length - 1\n : -1;\n if (to < 0) return;\n e.preventDefault();\n kbd = true;\n if (to === host.state().view.measure)\n painted(); // already active (e.g. Home on first)\n else pick(to);\n all[to]?.focus({ preventScroll: true });\n };\n\n const painted = (): void => {\n const all = radios();\n const m = host.state().view.measure ?? 0;\n all.forEach((r, i) => {\n r.setAttribute(\"aria-checked\", String(i === m));\n r.setAttribute(\"tabindex\", i === m ? \"0\" : \"-1\");\n });\n if (kbd) {\n kbd = false;\n all[m]?.focus({ preventScroll: true });\n }\n };\n\n host.root.addEventListener(\"click\", click);\n host.root.addEventListener(\"keydown\", keydown);\n return {\n painted,\n off() {\n host.root.removeEventListener(\"click\", click);\n host.root.removeEventListener(\"keydown\", keydown);\n },\n };\n};\n","/*\n * Selection (T10c). Same reduce/mount contract as measure.ts.\n * Click/Enter/legend toggles a Sel (raw values); `data-selected` re-applied in painted();\n * Escape (priority 3) clears. Persistence: clears when type/x/path change (or drill changes),\n * else unmatched keys are inert. In select mode maya-chart's own legend handler stands down.\n */\nimport { t } from \"../core/strings.ts\";\nimport type { Handlers, Host, Sel, SpecEvent, State } from \"../core/types.ts\";\n\nexport type SelectEvent =\n { type: \"toggle\"; sel: Sel; multi: boolean } | { type: \"clear\" } | SpecEvent;\n\nconst same = (a: Sel, b: Sel) => JSON.stringify(a) === JSON.stringify(b);\nconst FIELDS = [\"x\", \"series\", \"name\"] as const;\nconst dec = (s: string) => {\n try {\n return decodeURIComponent(s);\n } catch {\n return s;\n }\n};\n\nexport function reduce(s: State, e: SelectEvent): State {\n if (e.type === \"clear\") return s.selected.length ? { ...s, selected: [] } : s;\n if (e.type === \"spec\") {\n const p = e.prev;\n if (!p || !s.selected.length) return s;\n const n = e.next;\n const moved =\n p.type !== n.type || p.x !== n.x || JSON.stringify(p.path) !== JSON.stringify(n.path);\n return moved ? { ...s, selected: [] } : s;\n }\n if (e.type !== \"toggle\") return s;\n const had = s.selected.some((q) => same(q, e.sel));\n const selected = e.multi\n ? had\n ? s.selected.filter((q) => !same(q, e.sel))\n : [...s.selected, e.sel]\n : had && s.selected.length === 1\n ? []\n : [e.sel];\n return { ...s, selected };\n}\n\n/** Raw-value Sel of a mark, decoded from its data-key (`S~C`, scatter `S~name`, `h~…`). */\nexport function selOf(mark: Element, type?: string): Sel | undefined {\n const key = mark.getAttribute(\"data-key\");\n if (!key) return;\n const p = key.split(\"~\").map(dec);\n if (p[0] === \"h\") return { name: p[p.length - 1] };\n if (p.length !== 2) return; // line/area paths, sankey, hexmap: not selectable\n const sel: Sel = {};\n if (p[0]) sel.series = p[0];\n if (type === \"scatter\") sel.name = p[1];\n else sel.x = p[1];\n return sel;\n}\n\n/** A Sel matches a mark when every field it names equals the mark's (compared as text). */\nexport function matches(sel: Sel, mark: Element, type?: string): boolean {\n const m = selOf(mark, type);\n if (!m) return false;\n return FIELDS.every((f) => sel[f] === undefined || String(sel[f]) === String(m[f]));\n}\n\nexport function mount(host: Host): Handlers {\n const { root } = host;\n const type = () => host.spec()?.type;\n const pick = (sel: Sel, target: Element | null) => {\n const spec = host.spec();\n if (!spec?.select) return;\n const next = reduce(host.state(), { type: \"toggle\", sel, multi: spec.select === \"multi\" });\n const y = target?.getAttribute(\"data-y\") ?? \"\";\n host.commit(next, target ? { ...sel, value: y !== \"\" && !isNaN(+y) ? +y : y } : null);\n const n = next.selected.length;\n host.announce(n ? t(spec, \"selected\", n) : t(spec, \"selectionCleared\"));\n };\n const onClick = (e: Event) => {\n const spec = host.spec();\n if (!spec?.select) return;\n const el = e.target as Element;\n const b = el.closest(\"[data-maya=legend] button\");\n if (b) {\n const k = b.getAttribute(\"data-key\");\n if (k) pick({ series: k }, null);\n return;\n }\n let m = el.closest(\"[data-maya=mark],[data-maya=hit]\");\n if (m && !m.getAttribute(\"data-key\")) {\n // keyless band hit (line/area): the category's first keyed mark\n const c = m.getAttribute(\"data-c\");\n m = c === null ? null : root.querySelector(`[data-maya=mark][data-key][data-c=\"${c}\"]`);\n }\n const sel = m && selOf(m, type());\n if (m && sel) pick(sel, m);\n };\n root.addEventListener(\"click\", onClick);\n return {\n escape() {\n if (!host.state().selected.length) return false;\n host.commit(reduce(host.state(), { type: \"clear\" }));\n host.announce(t(host.spec() ?? {}, \"selectionCleared\"));\n return true;\n },\n enter(mark) {\n const sel = selOf(mark, type());\n if (!host.spec()?.select || !sel) return false;\n pick(sel, mark);\n return true;\n },\n painted() {\n const sel = host.state().selected;\n for (const m of root.querySelectorAll(\"[data-maya=mark][data-key]\"))\n if (sel.some((q) => matches(q, m, type()))) m.setAttribute(\"data-selected\", \"\");\n else m.removeAttribute(\"data-selected\");\n },\n off: () => root.removeEventListener(\"click\", onClick),\n };\n}\n","/*\n * Table header sort. Same reduce/mount contract as measure.ts.\n * Markup: `[data-maya=sort][data-field]` groups from core/marks/table.ts (tabindex 0, role button).\n * Click, Enter or Space commits view.sortBy: same field toggles, a new field starts desc for a\n * measure and asc for the row label. Persistence: resets when type, x or y change.\n */\nimport { t } from \"../core/strings.ts\";\nimport type { Handlers, Host, SpecEvent, State } from \"../core/types.ts\";\n\nexport type SortEvent = { type: \"sort\"; field: string; label?: boolean } | SpecEvent;\n\nexport const reduce = (s: State, e: SortEvent): State => {\n if (e.type === \"spec\") {\n const { prev, next } = e;\n if (\n !s.view.sortBy ||\n (prev &&\n prev.type === next.type &&\n prev.x === next.x &&\n JSON.stringify(prev.y) === JSON.stringify(next.y))\n )\n return s;\n const { sortBy: _drop, ...view } = s.view;\n return { ...s, view };\n }\n const cur = s.view.sortBy;\n const dir = cur?.[0] === e.field ? (cur[1] === \"asc\" ? \"desc\" : \"asc\") : e.label ? \"asc\" : \"desc\";\n return { ...s, view: { ...s.view, sortBy: [e.field, dir] } };\n};\n\nconst HEAD = \"[data-maya=sort]\";\n\nexport const mount = (host: Host): Handlers => {\n let want: string | null = null; // field to refocus after the repaint\n\n const pick = (h: Element): void => {\n const spec = host.spec();\n const field = h.getAttribute(\"data-field\");\n if (!spec || spec.type !== \"table\" || !field) return;\n const next = reduce(host.state(), { type: \"sort\", field, label: field === spec.x });\n const [, dir] = next.view.sortBy!;\n want = field;\n host.commit(next);\n const titles = spec.titles as Record<string, string> | undefined;\n host.announce(\n t(\n spec,\n \"sortedBy\",\n titles?.[field] ?? field,\n t(spec, dir === \"asc\" ? \"ascending\" : \"descending\"),\n ),\n );\n };\n\n const click = (e: Event): void => {\n const h = (e.target as Element).closest?.(HEAD);\n if (h) pick(h);\n };\n const keydown = (e: Event): void => {\n const k = (e as KeyboardEvent).key;\n const h = (e.target as Element).closest?.(HEAD);\n if (!h || (k !== \"Enter\" && k !== \" \")) return;\n e.preventDefault();\n e.stopPropagation(); // the chart's own Enter handler would drill/select\n pick(h);\n };\n host.root.addEventListener(\"click\", click);\n host.root.addEventListener(\"keydown\", keydown, true);\n\n return {\n painted() {\n if (want === null) return;\n const f = want;\n want = null;\n [...host.root.querySelectorAll<HTMLElement>(HEAD)]\n .find((h) => h.getAttribute(\"data-field\") === f)\n ?.focus({ preventScroll: true });\n },\n off() {\n host.root.removeEventListener(\"click\", click);\n host.root.removeEventListener(\"keydown\", keydown, true);\n },\n };\n};\n","import { t as str } from \"../core/strings.ts\";\nimport type { ChartSpec } from \"../core/types.ts\";\n\nconst a = (e: Element, k: string) => e.getAttribute(k) ?? \"\";\nconst h = (t: string, txt = \"\", at: Record<string, string> = {}) => {\n const e = document.createElement(t);\n e.textContent = txt;\n for (const k in at) e.setAttribute(k, at[k]!);\n return e;\n};\n// Links (sankey flows, chord ribbons) carry the same payload as marks.\nconst SEL = \"[data-maya=hit],[data-maya=mark],[data-maya=link][data-key]\";\nconst FADE = 120;\nconst FIXED = [\"position\", \"position-area\", \"left\", \"top\", \"margin\"];\nconst GLIDE: KeyframeAnimationOptions = { duration: 200, easing: \"cubic-bezier(.22,1,.36,1)\" };\nconst still = () => matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches;\n\nexport interface Tooltip {\n off(): void;\n hide(): void;\n /** The mark the tooltip is showing (hover, tap or keyboard). */\n active(): Element | undefined;\n /** Rebuild the key index after a patch and re-show the active mark if it survived. */\n refresh(): void;\n}\n\nexport function tooltip(\n root: ShadowRoot,\n on: () => boolean,\n announce: (text: string) => void = () => {},\n spec: () => ChartSpec | undefined = () => undefined,\n): Tooltip {\n const q = (s: string) => root.querySelector<HTMLElement>(s)!;\n const box = q(\".maya-box\"),\n tip = q(\".maya-tip\"),\n probe = q(\".maya-probe\"),\n host = root.host;\n const anchored = !!globalThis.CSS?.supports?.(\"anchor-name: --x\");\n // Hit-testing: closest() + these maps, rebuilt once per patch (never querySelectorAll per move).\n let list: Element[] = [],\n byKey = new Map<string, Element>(),\n byC = new Map<string, Element[]>();\n let cur: Element | undefined,\n open = false,\n pin = false,\n clamped = false,\n kb = false,\n timer: ReturnType<typeof setTimeout> | undefined,\n down0: [number, number] | undefined,\n flip: Animation | undefined,\n band: SVGRectElement | undefined;\n\n const index = () => {\n list = [...box.querySelectorAll(\"[data-maya=mark][data-key]\")];\n byKey = new Map();\n byC = new Map();\n for (const m of list) {\n byKey.set(a(m, \"data-key\"), m);\n if (!m.hasAttribute(\"data-c\")) continue;\n const c = a(m, \"data-c\");\n byC.set(c, [...(byC.get(c) ?? []), m]);\n }\n };\n const group = (m: Element) =>\n (a(m, \"data-maya\") !== \"link\" && m.hasAttribute(\"data-c\") && byC.get(a(m, \"data-c\"))) || [m];\n // Lines that belong to one category (parallel coordinates) light up with it.\n // The hovered mark's category stays lit (its tooltip rows) while the rest dims.\n let lit: Element[] = [],\n peers: Element[] = [];\n const light = (m: Element | undefined) => {\n for (const l of lit) l.removeAttribute(\"data-active\");\n for (const l of peers) l.removeAttribute(\"data-lit\");\n lit = m?.hasAttribute(\"data-c\")\n ? [\n ...box.querySelectorAll(\n `[data-maya=line][data-key][data-c=\"${CSS.escape(a(m, \"data-c\"))}\"]`,\n ),\n ]\n : [];\n peers = m ? [...group(m)] : [];\n // Hierarchy keys (h~a~b) light their ancestors, so the hovered path reads root to leaf.\n const k = m ? a(m, \"data-key\") : \"\";\n if (k.startsWith(\"h~\"))\n for (const [p, e] of byKey) if (k.startsWith(p + \"~\") && p !== \"h\") peers.push(e);\n for (const l of lit) l.setAttribute(\"data-active\", \"\");\n for (const l of peers) l.setAttribute(\"data-lit\", \"\");\n };\n\n const cross = (m: Element | undefined) => {\n const g = box.querySelector<SVGElement>(\"[data-maya=cross]\");\n if (!g || (!m && g.style.opacity !== \"1\")) return; // hidden by CSS until first shown\n const was = g.style.opacity === \"1\";\n g.style.opacity = m ? \"1\" : \"0\";\n const svg = g.ownerSVGElement ?? box.querySelector(\"svg\");\n if (!m || !svg) return g.removeAttribute(\"data-on\");\n const r = m.getBoundingClientRect(),\n s = svg.getBoundingClientRect();\n const vw = +(a(svg, \"viewBox\").split(\" \")[2] || s.width) || 1;\n g.style.transform = `translateX(${((r.left + r.width / 2 - s.left) * vw) / (s.width || vw)}px)`;\n // Glide between categories once visible; the first placement jumps (flush, then enable).\n if (!was) getComputedStyle(g).transform;\n g.setAttribute(\"data-on\", \"\");\n };\n\n /** Bar charts: a soft column behind the hovered category, gliding between categories. */\n const shade = (m: Element | undefined) => {\n const svg = box.querySelector(\"svg\");\n const t = spec()?.type;\n if (!m || !svg || m.localName !== \"rect\" || (t !== \"bar\" && t !== \"waterfall\")) {\n band?.removeAttribute(\"data-on\");\n return;\n }\n const [px, py, pw, ph] = a(svg, \"data-plot\").split(\" \").map(Number) as number[];\n const hz = svg.hasAttribute(\"data-dir\");\n const step = (hz ? ph! : pw!) / Math.max(1, +a(svg, \"data-n\") || 1);\n let lo = Infinity,\n hi = -Infinity;\n for (const k of group(m)) {\n const p = +a(k, hz ? \"y\" : \"x\"),\n q = p + +a(k, hz ? \"height\" : \"width\");\n ((lo = Math.min(lo, p)), (hi = Math.max(hi, q)));\n }\n const c = (lo + hi) / 2 - step / 2;\n const fresh = !band?.isConnected;\n if (fresh) {\n band = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n band.setAttribute(\"data-maya\", \"band\");\n svg.querySelector(\":scope > [data-maya=marks]\")?.before(band);\n }\n const b = band!;\n for (const [k, v] of Object.entries(\n hz ? { x: px, y: 0, width: pw, height: step } : { x: 0, y: py, width: step, height: ph },\n ))\n b.setAttribute(k, String(v));\n b.style.transform = hz ? `translateY(${c}px)` : `translateX(${c}px)`;\n if (!b.hasAttribute(\"data-on\")) getComputedStyle(b).transform;\n b.setAttribute(\"data-on\", \"\");\n };\n\n const hide = () => {\n cur?.removeAttribute(\"data-active\");\n light(undefined);\n cur = undefined;\n pin = false;\n cross(undefined);\n shade(undefined);\n tip.classList.remove(\"maya-open\");\n if (open) {\n open = false;\n clearTimeout(timer);\n timer = setTimeout(() => open || tip.hidePopover(), FADE);\n }\n };\n\n const markOf = (t: EventTarget | null | undefined, ev?: Event) => {\n const e = (t as Element | null)?.closest?.(SEL);\n if (!e || a(e, \"data-maya\") !== \"hit\") return e ?? undefined;\n if (e.hasAttribute(\"data-key\")) return byKey.get(a(e, \"data-key\"));\n // Keyless band hit: the mark in this category nearest the pointer.\n const y = (ev as PointerEvent | undefined)?.clientY ?? 0;\n let best: Element | undefined,\n bd = Infinity;\n for (const m of byC.get(a(e, \"data-c\")) ?? []) {\n const r = m.getBoundingClientRect(),\n d = Math.abs(y - (r.top + r.height / 2));\n if (d < bd) ((bd = d), (best = m));\n }\n return best;\n };\n\n /** Plain-text row for one mark: also what the live region reads. */\n const tone = (k: Element) => {\n const v = a(k, \"data-tone\"),\n s = spec();\n if (!v) return \"\";\n const tgt = typeof s?.colorBy === \"object\";\n return str(s ?? {}, v === \"good\" ? (tgt ? \"above\" : \"positive\") : tgt ? \"below\" : \"negative\");\n };\n\n const show = (m: Element, say = false) => {\n // Glide: remember where the tooltip is now (mid-glide included) before it moves.\n const from = open ? tip.getBoundingClientRect() : undefined;\n flip?.cancel();\n cur?.removeAttribute(\"data-active\");\n cur = m;\n m.setAttribute(\"data-active\", \"\");\n light(m);\n const g = group(m);\n // Rows without a series name the measure (\"Sales 1.2M\"); scatter values carry their own.\n const sp = spec(),\n y = sp?.y,\n label =\n typeof y === \"string\" && sp?.type !== \"scatter\"\n ? sp?.titles && Object.hasOwn(sp.titles, y)\n ? sp.titles[y]!\n : y\n : \"\";\n tip.replaceChildren(\n h(\"b\", a(m, \"data-x\")),\n ...g.map((k) => {\n const row = h(\"div\", \"\", k === m ? { \"data-on\": \"\" } : {});\n const s = a(k, \"data-series\");\n if (s) {\n if (k.hasAttribute(\"data-s\")) row.append(h(\"i\", \"\", { \"data-s\": a(k, \"data-s\") }));\n row.append(h(\"span\", s));\n } else if (label) row.append(h(\"span\", label));\n row.append(h(\"span\", a(k, \"data-f\"), { \"data-v\": \"\" }));\n const tn = tone(k);\n if (tn) row.append(h(\"span\", tn));\n return row;\n }),\n );\n cross(m);\n shade(m);\n // The probe's containing block is the host's padding box (:host is position:relative).\n // Charts with a crosshair anchor to it: the tooltip sits beside the line, never over the points.\n const svg = box.querySelector(\"svg\"),\n side = !!svg?.querySelector(\"[data-maya=cross] *\");\n let r: {\n left: number;\n top: number;\n width: number;\n height: number;\n right: number;\n bottom: number;\n } = m.getBoundingClientRect();\n if (side && svg) {\n const s = svg.getBoundingClientRect(),\n k = s.width / (+a(svg, \"viewBox\").split(\" \")[2]! || s.width || 1),\n [, py, , ph] = a(svg, \"data-plot\").split(\" \").map(Number) as number[],\n left = r.left + r.width / 2,\n top = s.top + py! * k;\n r = { left, top, width: 0, height: ph! * k, right: left, bottom: top + ph! * k };\n }\n tip.toggleAttribute(\"data-side\", side);\n const p = host.getBoundingClientRect();\n Object.assign(probe.style, {\n left: r.left - p.left - host.clientLeft + \"px\",\n top: r.top - p.top - host.clientTop + \"px\",\n width: r.width + \"px\",\n height: r.height + \"px\",\n });\n clearTimeout(timer);\n if (!open) (tip.showPopover(), (open = true));\n tip.classList.add(\"maya-open\");\n // Anchored placement can overflow a tile-sized viewport: measure, then clamp with fixed.\n const vv = globalThis.visualViewport,\n vw = vv?.width ?? innerWidth,\n vh = vv?.height ?? innerHeight;\n if (clamped) for (const k of FIXED) tip.style.removeProperty(k);\n clamped = false;\n let t = tip.getBoundingClientRect();\n if (!anchored || t.left < 0 || t.top < 0 || t.right > vw || t.bottom > vh) {\n // Leave the anchor (position-area would resolve insets against the anchor area).\n for (const k of [\"left\", \"top\", \"margin\"]) tip.style.setProperty(k, \"0px\");\n tip.style.setProperty(\"position\", \"fixed\");\n tip.style.setProperty(\"position-area\", \"none\");\n t = tip.getBoundingClientRect();\n let y = side ? r.top : r.top - t.height - 8;\n if (y < 8) y = r.bottom + 8;\n y = Math.max(8, Math.min(y, vh - t.height - 8));\n let x = side ? r.left + 12 : r.left + r.width / 2 - t.width / 2;\n if (side && x + t.width > vw - 8) x = r.left - 12 - t.width;\n x = Math.max(8, Math.min(x, vw - t.width - 8));\n tip.style.setProperty(\"left\", x + \"px\");\n tip.style.setProperty(\"top\", y + \"px\");\n clamped = true;\n }\n if (from && !still() && spec()?.animate !== false) {\n const to = tip.getBoundingClientRect();\n const dx = from.left - to.left,\n dy = from.top - to.top;\n if (dx || dy)\n flip = tip.animate?.(\n [{ transform: `translate(${dx}px,${dy}px)` }, { transform: \"none\" }],\n GLIDE,\n );\n }\n if (say)\n announce(\n `${a(m, \"data-x\")}: ${g.map((k) => [a(k, \"data-series\"), a(k, \"data-f\"), tone(k)].filter(Boolean).join(\" \")).join(\", \")}`,\n );\n };\n\n const move = (e: Event) => {\n kb = false;\n if (!on() || (e as PointerEvent).pointerType !== \"mouse\") return;\n const m = markOf(e.target, e);\n if (!m) hide();\n else if (m !== cur) show(m);\n };\n // Touch/pen: remember where it started; a tap (moved < 4 px) shows on pointerup.\n const down = (e: Event) => {\n kb = false;\n const p = e as PointerEvent;\n down0 = p.pointerType === \"mouse\" ? undefined : [p.clientX, p.clientY];\n };\n const up = (e: Event) => {\n const p = e as PointerEvent;\n const d = down0;\n down0 = undefined;\n if (!on() || !d || Math.hypot(p.clientX - d[0], p.clientY - d[1]) >= 4) return;\n const m = markOf(e.target, e);\n if (m) show(m);\n };\n const outside = (e: Event) => {\n const p = e.composedPath();\n if (!p.includes(box) || !markOf(p[0], e)) hide();\n };\n const leave = (e: Event) => (e as PointerEvent).pointerType === \"mouse\" && hide();\n const key = (e: Event) => {\n const k = (e as KeyboardEvent).key;\n if (!on()) return;\n kb = true;\n if (k === \"Escape\") {\n // Pinned tooltip is Escape's first priority: consume the key so nothing else reacts.\n if (pin) e.preventDefault();\n return hide();\n }\n let next: Element | undefined;\n if (k === \" \") {\n next = cur ?? list[0];\n if (!next) return;\n pin = !pin;\n if (pin) show(next, true);\n } else if (k.startsWith(\"Arrow\")) {\n const d = k === \"ArrowRight\" || k === \"ArrowDown\" ? 1 : -1;\n const i = cur ? list.indexOf(cur) : -1;\n if (i < 0) next = list[0];\n else if (k === \"ArrowUp\" || k === \"ArrowDown\") {\n const g = group(list[i]!);\n next = g[g.indexOf(list[i]!) + d];\n } else {\n const cs = [...byC.keys()];\n const g = byC.get(cs[cs.indexOf(a(list[i]!, \"data-c\")) + d]!);\n next = g?.find((m) => a(m, \"data-s\") === a(list[i]!, \"data-s\")) ?? g?.[0];\n }\n if (next) show(next, true);\n } else return;\n e.preventDefault();\n };\n const blur = () => pin || hide();\n\n const on_: [EventTarget, string, EventListener, AddEventListenerOptions?][] = [\n [box, \"pointerover\", move],\n [box, \"pointermove\", move],\n [box, \"pointerdown\", down],\n [box, \"pointerup\", up],\n [box, \"pointerleave\", leave],\n [box, \"keydown\", key],\n [box, \"focusout\", blur],\n [document, \"pointerdown\", outside, { capture: true }],\n // Focusing the chart can scroll it into view; that must not close a keyboard tooltip.\n [window, \"scroll\", () => kb || hide(), { capture: true, passive: true }],\n ];\n for (const [t, n, f, o] of on_) t.addEventListener(n, f, o);\n index();\n return {\n off: () => (\n hide(),\n clearTimeout(timer),\n on_.forEach(([t, n, f, o]) => t.removeEventListener(n, f, o))\n ),\n hide,\n active: () => cur,\n refresh() {\n const k = cur && a(cur, \"data-key\");\n index();\n const m = k ? byKey.get(k) : undefined;\n if (m && on()) show(m);\n else hide();\n },\n };\n}\n","/*\n * Zoom (T10d). Same reduce/mount contract as measure.ts.\n * Drag draws `[data-maya=brush]`; release sets view.window; Reset chip (`.maya-reset`),\n * double-click and Escape restore. Escape priority: cancel() = brush in progress (2),\n * escape() = window (4). Persistence: resets when drill or x change; clamps to category count.\n */\nimport { t } from \"../core/strings.ts\";\nimport type { Handlers, Host, SpecEvent, State, View } from \"../core/types.ts\";\n\ntype Win = NonNullable<View[\"window\"]>;\nexport type ZoomEvent = { type: \"zoom\"; window: Win } | { type: \"reset\" } | SpecEvent;\n\nconst clear = (s: State): State => {\n if (!s.view.window) return s;\n const { window: _w, ...view } = s.view;\n return { ...s, view };\n};\n\nexport const reduce = (s: State, e: ZoomEvent): State => {\n if (e.type === \"zoom\") {\n const w = e.window;\n if (w.length === 2) {\n const i0 = Math.max(0, Math.trunc(Math.min(w[0], w[1])));\n const i1 = Math.max(i0, Math.trunc(Math.max(w[0], w[1])));\n return { ...s, view: { ...s.view, window: [i0, i1] } };\n }\n const [a, b, c, d] = w;\n return {\n ...s,\n view: { ...s.view, window: [Math.min(a, b), Math.max(a, b), Math.min(c, d), Math.max(c, d)] },\n };\n }\n if (e.type === \"reset\") return clear(s);\n const { prev, next } = e;\n if (\n prev &&\n (prev.type !== next.type ||\n prev.x !== next.x ||\n JSON.stringify(prev.path) !== JSON.stringify(next.path))\n )\n return clear(s);\n return s;\n};\n\nconst MIN_START = 4; // px of movement before a brush starts (tooltip taps stay < 4)\nconst MIN_SPAN = 2; // px a brush must span to commit\nconst NS = \"http://www.w3.org/2000/svg\";\nconst num = (s: string | null): number[] => (s ?? \"\").trim().split(/\\s+/).map(Number);\nconst fmt = (n: number) => String(+n.toPrecision(4));\n\nexport const mount = (host: Host): Handlers => {\n const { root } = host;\n let down: { id: number; x: number; y: number; svg: SVGSVGElement } | undefined;\n let brush: SVGRectElement | undefined;\n let lastSaid = \"\";\n let lastDrill = JSON.stringify(host.state().view.drill);\n\n const svgOf = (e: Event) =>\n (e.target as Element | null)?.closest?.(\"svg.maya-svg\") as SVGSVGElement | null;\n const geom = (svg: SVGSVGElement) => {\n const r = svg.getBoundingClientRect();\n const vb = num(svg.getAttribute(\"viewBox\"));\n const k = r.width ? (vb[2] ?? r.width) / r.width : 1;\n const ky = r.height ? (vb[3] ?? r.height) / r.height : 1;\n const [px = 0, py = 0, pw = 1, ph = 1] = num(svg.getAttribute(\"data-plot\"));\n return { r, k, ky, px, py, pw, ph, vx: vb[0] ?? 0, vy: vb[1] ?? 0 };\n };\n const clampTo = (v: number, lo: number, hi: number) => Math.min(hi, Math.max(lo, v));\n\n const stopBrush = () => {\n brush?.remove();\n brush = undefined;\n down = undefined;\n };\n\n /** Pointer position in viewBox units, clamped to the plot box. */\n const at = (svg: SVGSVGElement, e: PointerEvent) => {\n const g = geom(svg);\n return {\n g,\n x: clampTo((e.clientX - g.r.left) * g.k + g.vx, g.px, g.px + g.pw),\n y: clampTo((e.clientY - g.r.top) * g.ky + g.vy, g.py, g.py + g.ph),\n };\n };\n const bandMode = (svg: SVGSVGElement) => !svg.hasAttribute(\"data-xd\");\n\n const draw = (svg: SVGSVGElement, a: { x: number; y: number }, b: { x: number; y: number }) => {\n const g = geom(svg);\n if (!brush || brush.ownerSVGElement !== svg) {\n brush?.remove();\n brush = document.createElementNS(NS, \"rect\") as SVGRectElement;\n brush.setAttribute(\"data-maya\", \"brush\");\n brush.setAttribute(\"width\", \"1\");\n brush.setAttribute(\"height\", \"1\");\n brush.style.pointerEvents = \"none\";\n brush.style.transformOrigin = \"0 0\";\n svg.append(brush);\n }\n const band = bandMode(svg);\n const x = Math.min(a.x, b.x),\n w = Math.abs(a.x - b.x);\n const y = band ? g.py : Math.min(a.y, b.y),\n h = band ? g.ph : Math.abs(a.y - b.y);\n brush.style.transform = `matrix(${w},0,0,${h},${x},${y})`;\n };\n\n let start: { x: number; y: number } | undefined;\n\n const onDown = (ev: Event) => {\n const e = ev as PointerEvent;\n const svg = svgOf(e);\n if (!svg || !host.spec()?.zoom) return;\n if (e.pointerType === \"mouse\" && e.button !== 0) return;\n if (e.isPrimary === false) return;\n stopBrush();\n svg.style.touchAction = \"pan-y\";\n down = { id: e.pointerId, x: e.clientX, y: e.clientY, svg };\n start = at(svg, e);\n };\n\n const onMove = (ev: Event) => {\n const e = ev as PointerEvent;\n if (!down || e.pointerId !== down.id || !start) return;\n if (!brush && Math.hypot(e.clientX - down.x, e.clientY - down.y) < MIN_START) return;\n if (!brush) {\n try {\n down.svg.setPointerCapture(e.pointerId);\n } catch {\n /* capture is best-effort */\n }\n }\n draw(down.svg, start, at(down.svg, e));\n };\n\n const swallowClick = () => {\n const eat = (c: Event) => c.stopPropagation();\n root.addEventListener(\"click\", eat, { capture: true, once: true });\n setTimeout(() => root.removeEventListener(\"click\", eat, { capture: true }), 0);\n };\n\n const onUp = (ev: Event) => {\n const e = ev as PointerEvent;\n if (!down || e.pointerId !== down.id || !start) return;\n const { svg } = down;\n const began = !!brush;\n const a = start;\n const b = at(svg, e);\n const g = b.g;\n try {\n svg.releasePointerCapture(e.pointerId);\n } catch {\n /* not captured */\n }\n stopBrush();\n start = undefined;\n if (!began) return;\n swallowClick();\n const band = bandMode(svg);\n const spanX = Math.abs(a.x - b.x) / g.k,\n spanY = Math.abs(a.y - b.y) / g.ky;\n if (band ? spanX < MIN_SPAN : spanX < MIN_SPAN || spanY < MIN_SPAN) return;\n const s = host.state();\n if (band) {\n const n = Math.max(1, +(svg.getAttribute(\"data-n\") ?? 1));\n const off = s.view.window?.[0] ?? 0;\n const idx = (x: number) => clampTo(Math.floor(((x - g.px) / g.pw) * n), 0, n - 1);\n const i0 = idx(Math.min(a.x, b.x)),\n i1 = idx(Math.max(a.x, b.x));\n host.commit(reduce(s, { type: \"zoom\", window: [off + i0, off + i1] }), null);\n } else {\n const xd = num(svg.getAttribute(\"data-xd\")),\n yd = num(svg.getAttribute(\"data-yd\"));\n const vx = (x: number) => xd[0]! + ((x - g.px) / g.pw) * (xd[1]! - xd[0]!);\n const vy = (y: number) => yd[1]! - ((y - g.py) / g.ph) * (yd[1]! - yd[0]!);\n host.commit(reduce(s, { type: \"zoom\", window: [vx(a.x), vx(b.x), vy(a.y), vy(b.y)] }), null);\n }\n };\n\n const reset = (): boolean => {\n const s = host.state();\n if (!s.view.window) return false;\n host.commit(reduce(s, { type: \"reset\" }), null);\n return true;\n };\n\n const onClick = (e: Event) => {\n if ((e.target as Element).closest(\".maya-reset\")) reset();\n };\n const onDbl = (e: Event) => {\n if (svgOf(e)) reset();\n };\n\n root.addEventListener(\"pointerdown\", onDown);\n root.addEventListener(\"pointermove\", onMove);\n root.addEventListener(\"pointerup\", onUp);\n const onCancel = () => {\n stopBrush();\n start = undefined;\n };\n root.addEventListener(\"pointercancel\", onCancel);\n root.addEventListener(\"click\", onClick);\n root.addEventListener(\"dblclick\", onDbl);\n\n return {\n cancel() {\n if (!brush) return false;\n stopBrush();\n start = undefined;\n return true;\n },\n escape: reset,\n painted() {\n const s = host.state();\n const spec = host.spec();\n const w = s.view.window;\n const drill = JSON.stringify(s.view.drill);\n const drilled = drill !== lastDrill;\n lastDrill = drill;\n if (w && drilled) return void reset();\n const svg = root.querySelector<SVGSVGElement>(\"svg.maya-svg\");\n if (svg && spec?.zoom) svg.style.touchAction = \"pan-y\";\n const box = root.querySelector(\".maya-box\");\n let chip = box?.querySelector<HTMLButtonElement>(\".maya-reset\") ?? null;\n if (!w || !spec) {\n chip?.remove();\n lastSaid = \"\";\n return;\n }\n if (box && !chip) {\n chip = document.createElement(\"button\");\n chip.type = \"button\";\n chip.className = \"maya-reset\";\n box.append(chip);\n }\n if (chip) chip.textContent = t(spec, \"reset\");\n const key = w.join(\",\");\n if (key === lastSaid) return;\n lastSaid = key;\n if (w.length === 4) host.announce(t(spec, \"zoomedTo\", fmt(w[0]), fmt(w[1])));\n else {\n const xs = [...root.querySelectorAll(\"[data-maya=mark][data-key][data-x]\")].map((m) =>\n m.getAttribute(\"data-x\")!,\n );\n if (xs.length) host.announce(t(spec, \"zoomedTo\", xs[0]!, xs[xs.length - 1]!));\n }\n },\n off() {\n stopBrush();\n root.removeEventListener(\"pointerdown\", onDown);\n root.removeEventListener(\"pointermove\", onMove);\n root.removeEventListener(\"pointerup\", onUp);\n root.removeEventListener(\"pointercancel\", onCancel);\n root.removeEventListener(\"click\", onClick);\n root.removeEventListener(\"dblclick\", onDbl);\n },\n };\n};\n","import { VERSION } from \"../core/registry.ts\";\nimport { renderParts, shellInner } from \"../core/render.ts\";\nimport { MayaSpecError } from \"../core/validate.ts\";\nimport type {\n ChartSpec,\n Handlers,\n Host,\n MayaErrorDetail,\n MayaSelectDetail,\n Parts,\n Sel,\n SpecEvent,\n State,\n View,\n} from \"../core/types.ts\";\nimport { css } from \"../styles/theme.ts\";\nimport { type Box, boxOf, type Intro, patch } from \"./animate.ts\";\nimport * as drill from \"./drill.ts\";\nimport { html } from \"./html.ts\";\nimport * as measure from \"./measure.ts\";\nimport * as select from \"./select.ts\";\nimport * as sort from \"./sort.ts\";\nimport { type Tooltip, tooltip } from \"./tooltip.ts\";\nimport * as zoom from \"./zoom.ts\";\n\nlet sheet: CSSStyleSheet | undefined;\n\nexport class MayaChart extends HTMLElement {\n static observedAttributes = [\"spec\"];\n static version = VERSION;\n #prop: ChartSpec | undefined;\n #json: ChartSpec | undefined;\n #attr: ChartSpec | undefined;\n #state: State = { view: {}, selected: [] };\n #seen: ChartSpec | undefined;\n #ix: Record<\"measure\" | \"drill\" | \"select\" | \"zoom\" | \"sort\", Handlers> | undefined;\n #say: ReturnType<typeof setTimeout> | undefined;\n #last: Record<string, string> = {};\n #size = [0, 0];\n #raf = 0;\n #ro: ResizeObserver | undefined;\n #resized = false;\n #off: (() => void) | undefined;\n #tip: Tooltip | undefined;\n #origin: Box | undefined;\n #vars = new Set<string>();\n #err = \"\";\n #drawn = false;\n\n get spec(): ChartSpec | undefined {\n return this.#prop ?? this.#json ?? this.#attr;\n }\n // Accepts typed rows (ChartSpec<MyRow>); reads back as the Row-typed spec.\n set spec(v: ChartSpec<any> | undefined) {\n this.#prop = v;\n this.#schedule();\n }\n get data(): ChartSpec[\"data\"] | undefined {\n return this.spec?.data;\n }\n set data(rows: ChartSpec[\"data\"]) {\n this.#prop = { ...this.spec!, data: rows };\n this.#schedule();\n }\n\n /** Interaction state ({ measure, drill, window, hidden }). Setting never dispatches events. */\n get view(): View {\n return this.#state.view;\n }\n set view(v: View) {\n this.#state = { ...this.#state, view: v ?? {} };\n this.#schedule();\n }\n /** Selected marks by raw values. Setting never dispatches events. */\n get selected(): readonly Sel[] {\n return this.#state.selected;\n }\n set selected(v: readonly Sel[]) {\n this.#state = { ...this.#state, selected: v ?? [] };\n this.#schedule();\n }\n\n attributeChangedCallback(_: string, __: string | null, v: string | null): void {\n try {\n this.#attr = v ? JSON.parse(v) : undefined;\n } catch (e) {\n this.#attr = undefined;\n console.error(e);\n }\n this.#schedule();\n }\n\n connectedCallback(): void {\n // Upgrade race: properties set on the element before it was defined shadow the accessors.\n for (const p of [\"spec\", \"data\", \"view\", \"selected\"] as const)\n if (Object.hasOwn(this, p)) {\n const v = (this as any)[p];\n delete (this as any)[p];\n (this as any)[p] = v;\n }\n const j = this.querySelector(':scope > script[type=\"application/json\"]')?.textContent;\n try {\n if (j) this.#json = JSON.parse(j);\n } catch (e) {\n console.error(e);\n }\n let root = this.shadowRoot;\n if (!root) {\n root = this.attachShadow({ mode: \"open\" });\n sheet ??= new CSSStyleSheet();\n if (!sheet.cssRules.length) sheet.replaceSync(css);\n root.adoptedStyleSheets = [sheet];\n root.innerHTML = html(\n shellInner(\n {\n svg: \"\",\n legend: \"\",\n controls: \"\",\n crumbs: \"\",\n table: \"\",\n title: \"\",\n style: \"\",\n vars: [],\n warnings: [],\n },\n \"\",\n ),\n );\n }\n root.addEventListener(\"click\", this.#click);\n root.addEventListener(\"keydown\", this.#key);\n globalThis.addEventListener(\"maya-register\", this.#registered);\n const host: Host = {\n root,\n el: this,\n spec: () => this.spec,\n state: () => this.#state,\n commit: (next, target) => this.#commit(next, target ?? null),\n announce: (text) => this.#announce(text),\n };\n this.#ix = {\n measure: measure.mount(host),\n drill: drill.mount(host),\n select: select.mount(host),\n zoom: zoom.mount(host),\n sort: sort.mount(host),\n };\n const box = root.querySelector(\".maya-box\")!;\n this.#tip = tooltip(\n root,\n () => this.spec?.tooltip !== false,\n (t) => this.#announce(t),\n () => this.spec,\n );\n this.#off = this.#tip.off;\n this.#ro = new ResizeObserver(() => {\n if (\n Math.abs(box.clientWidth - this.#size[0]!) > 1 ||\n Math.abs(box.clientHeight - this.#size[1]!) > 1\n ) {\n this.#ix?.zoom.cancel?.(); // a brush's pixel geometry is stale after a resize\n this.#resized = true;\n this.#schedule();\n }\n });\n this.#ro.observe(box);\n this.#schedule();\n }\n\n disconnectedCallback(): void {\n cancelAnimationFrame(this.#raf);\n this.#raf = 0;\n this.#ro?.disconnect();\n this.#off?.();\n this.shadowRoot?.removeEventListener(\"click\", this.#click);\n this.shadowRoot?.removeEventListener(\"keydown\", this.#key);\n globalThis.removeEventListener(\"maya-register\", this.#registered);\n clearTimeout(this.#say);\n for (const h of Object.values(this.#ix ?? {})) h.off();\n this.#ix = undefined;\n }\n\n #registered = () => this.#schedule();\n\n /** Polite live region: static node, textContent only, debounced 300 ms. User-initiated only. */\n #announce(text: string): void {\n clearTimeout(this.#say);\n this.#say = setTimeout(() => {\n const live = this.shadowRoot?.querySelector(\"[data-maya=live]\");\n if (live) live.textContent = text;\n }, 300);\n }\n\n /** Standalone SVG: custom properties resolved from the computed style (dark export looks right). */\n toSVG(): string {\n const root = this.shadowRoot;\n const svg = root?.querySelector<SVGSVGElement>(\"svg.maya-svg\");\n if (!root || !svg) return \"\";\n const cs = getComputedStyle(root.querySelector(\".maya\")!);\n const names = new Set([...css.matchAll(/--maya-[\\w-]+/g)].map((m) => m[0]));\n for (const v of this.#vars) names.add(v);\n const decl = [...names]\n .map((k) => [k, cs.getPropertyValue(k).trim()])\n .filter(([, v]) => v)\n .map(([k, v]) => `${k}:${v}`)\n .join(\";\");\n const c = svg.cloneNode(true) as SVGSVGElement;\n c.setAttribute(\"xmlns\", \"http://www.w3.org/2000/svg\");\n c.removeAttribute(\"tabindex\");\n for (const e of c.querySelectorAll(\"[data-active],[data-lit]\"))\n (e.removeAttribute(\"data-active\"), e.removeAttribute(\"data-lit\"));\n for (const e of c.querySelectorAll(\"[data-ghost],[data-maya=band]\")) e.remove();\n const st = document.createElementNS(\"http://www.w3.org/2000/svg\", \"style\");\n st.textContent = `${css}.maya-svg{${decl}}`;\n c.prepend(st);\n return c.outerHTML;\n }\n\n #emit(type: string, detail: unknown, cancelable = false): boolean {\n return this.dispatchEvent(\n new CustomEvent(type, { detail, bubbles: true, composed: true, cancelable }),\n );\n }\n\n /** User-initiated state change: re-render, then tell the page what changed. */\n #commit(next: State, target: MayaSelectDetail[\"target\"]): void {\n const prev = this.#state;\n // Drilling: the clicked mark is where entering marks start from.\n const am = this.#tip?.active();\n if (am && JSON.stringify(prev.view.drill) !== JSON.stringify(next.view.drill))\n this.#origin = boxOf(am);\n this.#state = next;\n this.#schedule();\n if (JSON.stringify(prev.view) !== JSON.stringify(next.view)) this.#emit(\"maya-view\", next.view);\n if (JSON.stringify(prev.selected) !== JSON.stringify(next.selected))\n this.#emit(\"maya-select\", {\n selected: [...next.selected],\n target,\n } satisfies MayaSelectDetail);\n }\n\n /*\n * One keydown dispatcher. Escape priority: pinned tooltip (tooltip.ts, T2) -> brush in\n * progress -> selection -> zoom window -> drill pop. Enter: drill, else select, on the\n * keyboard-active mark. T2 routes the tooltip's own Escape/Enter/Space through here.\n */\n #key = (e: Event) => {\n const ix = this.#ix;\n if (!ix) return;\n if (e.defaultPrevented) return; // the tooltip consumed it (pinned Escape)\n const k = (e as KeyboardEvent).key;\n let done: boolean | undefined;\n if (k === \"Escape\")\n done =\n ix.zoom.cancel?.() || ix.select.escape?.() || ix.zoom.escape?.() || ix.drill.escape?.();\n else if (k === \"Enter\") {\n const m = this.#tip?.active();\n done = !!m && (ix.drill.enter?.(m) || ix.select.enter?.(m));\n }\n if (done) e.preventDefault();\n };\n\n #click = (e: Event) => {\n // In select mode the legend selects (select.ts) instead of hiding.\n if (this.spec?.select) return;\n const b = (e.target as Element).closest(\"[data-maya=legend] button\");\n if (!b) return;\n const k = b.getAttribute(\"data-key\") ?? \"\";\n const hidden = new Set(this.#state.view.hidden);\n if (hidden.has(k)) hidden.delete(k);\n else if (this.shadowRoot!.querySelectorAll(\"[data-maya=legend] [aria-pressed=true]\").length > 1)\n hidden.add(k);\n else return;\n this.#commit({ ...this.#state, view: { ...this.#state.view, hidden: [...hidden] } }, null);\n };\n\n #schedule(): void {\n if (this.isConnected && !this.#raf)\n this.#raf = requestAnimationFrame(() => ((this.#raf = 0), this.#render()));\n }\n\n #render(): void {\n const root = this.shadowRoot!;\n const spec = this.spec;\n const box = root.querySelector(\".maya-box\")!;\n if (!spec) return;\n if (spec !== this.#seen) {\n // Persistence rules live in the reducers (measure, drill, zoom, select).\n const ev: SpecEvent = { type: \"spec\", prev: this.#seen, next: spec };\n this.#state = select.reduce(\n zoom.reduce(sort.reduce(drill.reduce(measure.reduce(this.#state, ev), ev), ev), ev),\n ev,\n );\n this.#seen = spec;\n }\n const draw = () => {\n this.#size = [box.clientWidth, box.clientHeight];\n return renderParts(spec, {\n width: box.clientWidth || 640,\n height: box.clientHeight || 320,\n view: this.#state.view,\n selected: this.#state.selected,\n });\n };\n // Before #slots: a focused legend button or crumb may be replaced.\n const focus = this.#focusId();\n let parts;\n try {\n parts = draw();\n // A title, legend or control that just appeared shrinks the box: fit it in this frame.\n const [w, h] = this.#size;\n if (this.#slots(root, parts) && (box.clientWidth !== w || box.clientHeight !== h))\n parts = draw();\n } catch (e) {\n this.#tip?.hide();\n const d: MayaErrorDetail | null =\n e instanceof MayaSpecError ? { code: e.code, path: e.path, message: e.message } : null;\n // Cancelable: preventDefault() hides the box (the host shows its own error).\n if (d && !this.#emit(\"maya-error\", d, true)) {\n box.replaceChildren();\n this.#drawn = false;\n return;\n }\n const pre = document.createElement(\"pre\");\n pre.className = \"maya-err\"; // styled by theme.ts; never an inline style\n pre.textContent = e instanceof Error ? e.message : String(e);\n box.replaceChildren(pre);\n this.#drawn = false;\n if (pre.textContent !== this.#err) console.error(e);\n this.#err = pre.textContent;\n return;\n }\n this.#err = \"\";\n const maya = root.querySelector<HTMLElement>(\".maya\")!;\n if (this.#last[\"table\"] !== parts.table) {\n this.#last[\"table\"] = parts.table;\n root.querySelector(\"table.maya-sr\")?.remove();\n box.insertAdjacentHTML(\"afterend\", html(parts.table));\n }\n // Overrides via CSSOM (never a style attribute).\n for (const [k, v] of parts.vars) maya.style.setProperty(k, v);\n for (const k of this.#vars)\n if (!parts.vars.some(([n]) => n === k)) maya.style.removeProperty(k);\n this.#vars = new Set(parts.vars.map(([k]) => k));\n // Nothing animates on resize: geometry must track the container immediately.\n const still = spec.animate === false || matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n maya.toggleAttribute(\"data-still\", spec.animate === false); // CSS transitions off too\n const resized = this.#resized;\n this.#resized = false;\n // First draw plays an entrance, unless the chart arrived server-rendered (already on screen).\n const intro: Intro | undefined =\n this.#drawn || box.querySelector(\"svg\") ? undefined : (INTRO[spec.type] ?? \"marks\");\n patch(box, parts.svg, (this.#drawn || !!intro) && !still, {\n intro,\n origin: this.#origin,\n after: () => this.#tip?.refresh(),\n instant: resized,\n });\n this.#origin = undefined;\n this.#drawn = true;\n this.#restore(focus);\n for (const h of Object.values(this.#ix ?? {})) h.painted?.();\n this.#emit(\"maya-render\", {});\n }\n\n /** Slots in shell order; each is replaced only when its markup changed. True if any was. */\n #slots(root: ShadowRoot, parts: Parts): boolean {\n const box = root.querySelector(\".maya-box\")!;\n let changed = false;\n SLOTS.forEach(([k, sel], i) => {\n if (this.#last[k] === parts[k]) return;\n changed = true;\n this.#last[k] = parts[k] as string;\n root.querySelector(sel)?.remove();\n const next = SLOTS.slice(i + 1).map(([, s]) => root.querySelector(s));\n (next.find(Boolean) ?? box).insertAdjacentHTML(\"beforebegin\", html(parts[k] as string));\n });\n return changed;\n }\n\n /** Stable id of the focused control: svg, legend:i, measure:i, crumb:i or reset. */\n #focusId(): string | undefined {\n const f = this.shadowRoot!.activeElement;\n if (!f) return;\n for (const [id, sel] of FOCUS) {\n const all = [...this.shadowRoot!.querySelectorAll(sel)];\n const i = all.indexOf(f);\n if (i >= 0) return `${id}:${i}`;\n }\n }\n\n #restore(id: string | undefined): void {\n const root = this.shadowRoot!;\n if (!id || root.activeElement) return;\n const [k, i] = id.split(\":\");\n const sel = FOCUS.find(([n]) => n === k)![1];\n root.querySelectorAll<HTMLElement>(sel)[+i!]?.focus({ preventScroll: true });\n }\n}\n\nconst SLOTS: [keyof Parts, string][] = [\n [\"title\", \".maya-title\"],\n [\"controls\", \".maya-ctl\"],\n [\"legend\", \".maya-legend\"],\n [\"crumbs\", \".maya-crumbs\"],\n];\n\nconst INTRO: Record<string, Intro> = {\n line: \"wipe\",\n area: \"wipe\",\n sankey: \"wipe\",\n ridgeline: \"wipe\",\n parallel: \"wipe\",\n sunburst: \"bloom\",\n chord: \"bloom\",\n radial: \"bloom\",\n};\n\nconst FOCUS: [string, string][] = [\n [\"svg\", \".maya-svg\"],\n [\"legend\", \"[data-maya=legend] button\"],\n [\"measure\", \".maya-ctl [role=radio]\"],\n [\"crumb\", \".maya-crumbs :is(button,a)\"],\n [\"reset\", \".maya-reset\"],\n];\n","import { VERSION } from \"./core/registry.ts\";\nimport type { MayaErrorDetail, MayaSelectDetail, MayaViewDetail } from \"./core/types.ts\";\nimport { MayaChart } from \"./element/maya-chart.ts\";\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"maya-chart\": MayaChart;\n }\n interface HTMLElementEventMap {\n \"maya-select\": CustomEvent<MayaSelectDetail>;\n \"maya-view\": CustomEvent<MayaViewDetail>;\n \"maya-error\": CustomEvent<MayaErrorDetail>;\n \"maya-render\": CustomEvent<Record<string, never>>;\n }\n}\n\nif (typeof customElements !== \"undefined\") {\n const prior = customElements.get(\"maya-chart\") as { version?: string } | undefined;\n if (!prior) customElements.define(\"maya-chart\", MayaChart);\n else if (prior.version !== VERSION)\n console.warn(\n `mayacharts: <maya-chart> ${prior.version ?? \"(unknown)\"} is already defined; ${VERSION} is not used.`,\n );\n}\n\nexport { MayaChart };\nexport * from \"./index.ts\";\n","// treemap + sunburst. Importing this file registers both types.\nimport { register } from \"./core/registry.ts\";\nimport { el, esc, hit, key, r } from \"./core/svg.ts\";\nimport type { Aggregate, Mark, MarkCtx, MarkOut, Row } from \"./core/types.ts\";\n\ninterface Node {\n name: string;\n value: number;\n children: Node[];\n depth: number;\n /** Names from the first path level down to this node. */\n parts: string[];\n /** colorBy field value (leaves only). */\n cv: number | null;\n}\n\ntype Reduce = ReturnType<MarkCtx[\"agg\"]>;\n\n/** Rows -> nested tree in first-appearance order. Map-keyed, so any name is safe. */\nexport function tree(\n rows: readonly Row[],\n path: readonly string[],\n y: string,\n agg: Reduce,\n cb: string | null = null,\n): Node {\n type Raw = { kids: Map<string, Raw>; ys: number[]; cs: number[] };\n const mk = (): Raw => ({ kids: new Map(), ys: [], cs: [] });\n const top = mk();\n for (const row of rows) {\n const v = row[y];\n if (typeof v !== \"number\") continue;\n let n = top;\n for (const f of path) {\n const k = String(row[f]);\n n = n.kids.get(k) ?? n.kids.set(k, mk()).get(k)!;\n }\n n.ys.push(v);\n const c = cb === null ? null : row[cb];\n if (typeof c === \"number\") n.cs.push(c);\n }\n const build = (raw: Raw, name: string, depth: number, parts: string[]): Node => {\n const children = [...raw.kids].map(([k, c]) => build(c, k, depth + 1, [...parts, k]));\n return {\n name,\n children,\n depth,\n parts,\n cv: raw.cs.length ? agg(raw.cs) : null,\n value: children.length ? children.reduce((s, c) => s + c.value, 0) : (agg(raw.ys) ?? 0),\n };\n };\n return build(top, \"\", 0, []);\n}\n\n/** Bruls squarify: [node, x, y, w, h] for `nodes` filling the box. */\nfunction squarify(nodes: Node[], x: number, y: number, w: number, h: number) {\n const out: [Node, number, number, number, number][] = [];\n const items = nodes.filter((n) => n.value > 0).sort((a, b) => b.value - a.value);\n let rest = items.reduce((s, n) => s + n.value, 0);\n let i = 0;\n while (i < items.length) {\n const side = Math.min(w, h);\n const scale = (w * h) / rest;\n const worst = (a: number, mn: number, mx: number) =>\n Math.max((side * side * mx) / (a * a), (a * a) / (side * side * mn));\n let j = i;\n let sum = 0;\n let best = Infinity;\n for (; j < items.length; j++) {\n const v = items[j]!.value * scale;\n const s = sum + v;\n const wst = worst(s, v, items[i]!.value * scale);\n if (j > i && wst > best) break;\n best = wst;\n sum = s;\n }\n const row = items.slice(i, j);\n const thick = side ? sum / side : 0;\n let p = 0;\n for (const n of row) {\n const len = sum ? (n.value * scale * side) / sum : 0;\n out.push(w >= h ? [n, x, y + p, thick, len] : [n, x + p, y, len, thick]);\n p += len;\n }\n if (w >= h) ((x += thick), (w -= thick));\n else ((y += thick), (h -= thick));\n rest -= row.reduce((s, n) => s + n.value, 0);\n i = j;\n }\n return out;\n}\n\n/** Validate values, build the tree, and compute attributes shared by both marks. */\nfunction setup(ctx: MarkCtx) {\n const { spec } = ctx;\n spec.data.forEach((row, i) => {\n const v = row[spec.y];\n if (typeof v === \"number\" && !(v > 0))\n ctx.fail(\n \"non-positive-value\",\n `data[${i}].${spec.y}`,\n `Value ${v} is not positive.`,\n \"Treemaps and sunbursts size shapes by value, so every value must be above zero.\",\n 'To show negative values use a bar chart with colorBy: \"sign\".',\n );\n });\n const cb = typeof spec.colorBy === \"string\" && spec.colorBy !== \"sign\" ? spec.colorBy : null;\n const root = tree(spec.data, spec.path, spec.y, ctx.agg(spec.aggregate as Aggregate), cb);\n // Drilling: draw only the next level; a click pushes it, so each click goes one level deeper.\n if (spec.drill) for (const n of root.children) n.children = [];\n let c = 0;\n const tops = root.children;\n const attrs = (n: Node) => {\n const parts = [...spec.drilled, ...n.parts];\n const s = tops.findIndex((t) => t.name === n.parts[0]);\n return {\n \"data-maya\": \"mark\",\n \"data-key\": key(\"h\", ...parts),\n \"data-c\": c++,\n \"data-s\": s % 8,\n \"data-x\": parts.join(\" › \"),\n \"data-series\": \"\",\n \"data-y\": n.value,\n \"data-f\": ctx.fmt(spec.y, n.value),\n \"data-tone\": ctx.tone(n.value),\n \"data-q\": n.cv === null ? null : ctx.q(n.cv),\n \"data-depth\": n.depth,\n };\n };\n return { root, tops, attrs };\n}\n\nconst text = (s: string) => s.length * 7.2 + 4;\n\nconst treemap: Mark = {\n noun: \"Treemap\",\n draw(ctx): MarkOut {\n const { plot, spec } = ctx;\n const { root, attrs } = setup(ctx);\n let marks = \"\";\n let hits = \"\";\n const walk = (n: Node, x: number, y: number, w: number, h: number): void => {\n // 0.5 px inset below the top level: siblings sit 1 px apart (stroke adds more).\n const g = n.depth > 1 ? 0.5 : 0;\n const [bx, by, bw, bh] = [x + g, y + g, Math.max(0, w - 2 * g), Math.max(0, h - 2 * g)];\n if (!n.children.length) {\n if (bw * bh < 4) return; // ponytail: leaves under ~2 px a side are not drawn\n const a = attrs(n);\n marks += el(\"rect\", { ...a, x: r(bx), y: r(by), width: r(bw), height: r(bh) });\n // No data-depth on the hit: [data-depth] strokes would outline every grown target.\n hits += hit({ ...a, \"data-depth\": null }, bx, by, bw, bh);\n // Name over value when both fit, else \"name · value\" on one line, else the value.\n const [lx, ly, f, one] = [\n bx + bw / 2,\n by + bh / 2,\n a[\"data-f\"],\n `${n.name} · ${a[\"data-f\"]}`,\n ];\n if (!spec.labels || bh < 16) return;\n if (bh >= 34 && text(n.name) <= bw && text(f) <= bw)\n ctx.label(lx, ly - 8, n.name, \"center\") && ctx.label(lx, ly + 8, f, \"center\");\n else if (text(one) <= bw) ctx.label(lx, ly, one, \"center\");\n else if (text(f) <= bw) ctx.label(lx, ly, f, \"center\");\n return;\n }\n if (n.depth === 1 && text(n.name) <= bw && bh >= 30)\n ctx.label(bx + bw / 2, by + 9, n.name, \"center\");\n for (const [c, cx, cy, cw, ch] of squarify(n.children, bx, by, bw, bh))\n walk(c, cx, cy, cw, ch);\n };\n walk(root, plot.x, plot.y, plot.w, plot.h);\n return { marks, hits };\n },\n};\n\nconst TAU = Math.PI * 2;\n\nconst sunburst: Mark = {\n noun: \"Sunburst\",\n draw(ctx): MarkOut {\n const { plot, spec } = ctx;\n const { root, attrs } = setup(ctx);\n const D = spec.drill ? 1 : spec.path.length;\n const R = Math.min(plot.w, plot.h) / 2;\n const [cx, cy] = [plot.x + plot.w / 2, plot.y + plot.h / 2];\n const pt = (rad: number, a: number) =>\n `${r(cx + rad * Math.cos(a - Math.PI / 2))} ${r(cy + rad * Math.sin(a - Math.PI / 2))}`;\n let marks = \"\";\n const walk = (n: Node, a0: number, a1: number): void => {\n if (n.depth) {\n const [r0, r1] = [(n.depth * R) / (D + 1), ((n.depth + 1) * R) / (D + 1)];\n if ((a1 - a0) * r1 < 2) return; // ponytail: arcs under 2 px are not drawn (nor their children)\n const e = Math.min(a1, a0 + (TAU * 359.99) / 360);\n const big = e - a0 > Math.PI ? 1 : 0;\n const d =\n `M${pt(r1, a0)}A${r(r1)} ${r(r1)} 0 ${big} 1 ${pt(r1, e)}` +\n `L${pt(r0, e)}A${r(r0)} ${r(r0)} 0 ${big} 0 ${pt(r0, a0)}Z`;\n marks += el(\"path\", { ...attrs(n), d });\n // Horizontal name if it fits the wedge: arc length near the top/bottom, ring thickness at the sides.\n const [mid, rm, arc] = [(a0 + e) / 2, (r0 + r1) / 2, (e - a0) * ((r0 + r1) / 2)];\n const room = Math.abs(Math.sin(mid)) * (r1 - r0) + Math.abs(Math.cos(mid)) * arc;\n if (spec.labels && arc >= 14 && text(n.name) <= room) {\n const [lx, ly] = pt(rm, mid).split(\" \") as [string, string];\n ctx.label(+lx, +ly, n.name, \"center\");\n }\n }\n let a = a0;\n for (const c of n.children) {\n const span = ((a1 - a0) * c.value) / n.value;\n walk(c, a, a + span);\n a += span;\n }\n };\n walk(root, 0, TAU);\n return { marks, hits: \"\" };\n },\n};\n\nregister(\"treemap\", treemap);\nregister(\"sunburst\", sunburst);\n\nconst pct = (p: number) => (p > 0 && p < 0.005 ? \"<1%\" : `${Math.round(p * 100)}%`);\n\n/** Column width ~ column total; segments are shares of the column total (visible series only). */\nexport const marimekko: Mark = {\n noun: \"Marimekko\",\n draw(ctx): MarkOut {\n const { plot, spec, shaped } = ctx;\n const { categories, series, cells } = shaped;\n // ponytail: negative and null values count as 0, a stack of shares cannot show them.\n const val = new Map<string, number>();\n const tot = categories.map(() => 0);\n for (const c of cells) {\n const v = Math.max(0, c.value ?? 0);\n val.set(`${c.ci}/${c.si}`, v);\n tot[c.ci] = (tot[c.ci] ?? 0) + v;\n }\n const grand = tot.reduce((a, b) => a + b, 0);\n if (!grand) return { marks: \"\", hits: \"\" };\n const gap = 4;\n const [top, bot] = [plot.y + 2, plot.y + plot.h - 20];\n const free = plot.w - gap * (categories.length - 1);\n let marks = \"\";\n let hits = \"\";\n let x = plot.x;\n categories.forEach((name, ci) => {\n const t = tot[ci] ?? 0;\n const w = (free * t) / grand;\n let y = bot;\n for (const si of shaped.visible) {\n const v = val.get(`${ci}/${si}`);\n if (!v) continue;\n const h = ((bot - top) * v) / t;\n const f = ctx.fmt(spec.y, v);\n const a = {\n \"data-maya\": \"mark\",\n \"data-key\": key(series[si], name),\n \"data-c\": ci,\n \"data-s\": si % 8,\n \"data-x\": name,\n \"data-series\": series[si],\n \"data-y\": v,\n \"data-f\": `${f} (${pct(v / t)})`,\n };\n y -= h;\n marks += el(\"rect\", { ...a, x: r(x), y: r(y), width: r(w), height: r(h) });\n hits += hit(a, x, y, w, h);\n if (spec.labels && h >= 16) {\n const share = pct(v / t);\n ctx.label(\n x + w / 2,\n y + h / 2,\n `${f} (${share})`.length * 7.2 + 4 <= w ? `${f} (${share})` : share,\n \"center\",\n );\n }\n }\n if (w > 0) ctx.label(x + w / 2, plot.y + plot.h - 20, name, \"below\");\n x += w + gap;\n });\n return { marks, hits };\n },\n};\n\n/** 10x10 cells split between the x categories by largest remainder. */\nexport const waffle: Mark = {\n noun: \"Waffle\",\n draw(ctx): MarkOut {\n const { plot, spec, shaped } = ctx;\n const vals = shaped.categories.map(() => 0);\n for (const c of shaped.cells) vals[c.ci] = (vals[c.ci] ?? 0) + Math.max(0, c.value ?? 0);\n const sum = vals.reduce((a, b) => a + b, 0);\n if (!sum) return { marks: \"\", hits: \"\" };\n const n = vals.map((v) => Math.floor((v / sum) * 100));\n const left = 100 - n.reduce((a, b) => a + b, 0);\n vals\n .map((v, i) => [((v / sum) * 100) % 1, i] as const)\n .sort((a, b) => b[0] - a[0] || a[1] - b[1])\n .slice(0, left)\n .forEach(([, i]) => (n[i] = (n[i] ?? 0) + 1));\n const step = Math.min(plot.w, plot.h) / 10;\n const [ox, oy] = [plot.x + (plot.w - step * 10) / 2, plot.y + (plot.h - step * 10) / 2];\n const g = Math.min(3, step * 0.12);\n let marks = \"\";\n let hits = \"\";\n let i = 0;\n shaped.categories.forEach((name, ci) => {\n const v = vals[ci] ?? 0;\n for (let k = 0; k < (n[ci] ?? 0); k++, i++) {\n const [cx, cy] = [ox + (i % 10) * step, oy + Math.floor(i / 10) * step];\n const a = {\n \"data-maya\": \"mark\",\n \"data-key\": key(\"w\", name, k),\n \"data-c\": i,\n \"data-s\": ci % 8,\n \"data-x\": name,\n \"data-series\": \"\",\n \"data-y\": v,\n \"data-f\": `${ctx.fmt(spec.y, v)} (${pct(v / sum)})`,\n };\n marks += el(\"rect\", {\n ...a,\n x: r(cx + g / 2),\n y: r(cy + g / 2),\n width: r(step - g),\n height: r(step - g),\n });\n // The hit covers the whole grid step so the gaps between cells still hit.\n hits += el(\"rect\", {\n ...a,\n \"data-maya\": \"hit\",\n x: r(cx),\n y: r(cy),\n width: r(step),\n height: r(step),\n fill: \"transparent\",\n });\n }\n });\n const legend =\n `<div class=\"maya-legend\" data-maya=\"legend\">` +\n shaped.categories\n .map(\n (name, ci) =>\n `<span data-s=\"${ci % 8}\"><i></i>${esc(name)} ${pct((vals[ci] ?? 0) / sum)}</span>`,\n )\n .join(\"\") +\n `</div>`;\n return { marks, hits, legend };\n },\n};\nregister(\"marimekko\", marimekko);\nregister(\"waffle\", waffle);\n\nexport {};\n","// mayacharts/flow: sankey. Imports only registry, svg and types (never validate/render/shape).\nimport { register } from \"./core/registry.ts\";\nimport { el, key, r } from \"./core/svg.ts\";\nimport type { Mark } from \"./core/types.ts\";\n\nconst W = 12;\nconst PAD = 8;\n\ninterface N {\n lv: number;\n name: string;\n i: number;\n in: number;\n out: number;\n v: number;\n y: number;\n}\ninterface L {\n s: N;\n t: N;\n vals: number[];\n v: number;\n sy: number;\n ty: number;\n}\n\nexport const sankey: Mark = {\n noun: \"Sankey\",\n check(spec, fail) {\n if (!Array.isArray(spec.path) || spec.path.length < 2)\n fail(\n \"invalid-option\",\n \"path\",\n 'spec.path on \"sankey\" needs at least 2 levels.',\n 'Example: path: [\"source\", \"target\"] (outer to inner).',\n );\n },\n draw(ctx) {\n const { spec, plot } = ctx;\n const P = spec.path;\n const cols = P.length;\n // Maps, not objects: node names such as \"__proto__\" are plain data.\n const nodes: N[] = [];\n const byLv: Map<string, N>[] = P.map(() => new Map());\n const links = new Map<string, L>();\n const node = (lv: number, name: string): N => {\n let n = byLv[lv]!.get(name);\n if (!n) {\n n = { lv, name, i: nodes.length, in: 0, out: 0, v: 0, y: 0 };\n byLv[lv]!.set(name, n);\n nodes.push(n);\n }\n return n;\n };\n for (const row of spec.data) {\n const v = row[spec.y];\n if (typeof v !== \"number\") continue;\n if (!(v > 0))\n ctx.fail(\n \"non-positive-value\",\n spec.y,\n `spec.${spec.y} is ${v}, but sankey sizes must be positive.`,\n );\n let prev = node(0, String(row[P[0]!]));\n for (let lv = 1; lv < cols; lv++) {\n const next = node(lv, String(row[P[lv]!]));\n const k = prev.i + \"\\0\" + next.i;\n let l = links.get(k);\n if (!l) links.set(k, (l = { s: prev, t: next, vals: [], v: 0, sy: 0, ty: 0 }));\n l.vals.push(v);\n prev = next;\n }\n }\n const red = ctx.agg(spec.aggregate);\n const ls = [...links.values()];\n for (const l of ls) {\n l.v = red(l.vals) ?? 0;\n if (!(l.v > 0))\n ctx.fail(\n \"non-positive-value\",\n spec.y,\n `link ${l.s.name} to ${l.t.name} is ${l.v}, but sankey sizes must be positive.`,\n );\n l.s.out += l.v;\n l.t.in += l.v;\n }\n for (const n of nodes) n.v = Math.max(n.in, n.out);\n\n // ponytail: no crossing minimisation; columns sorted by value only.\n const col = (lv: number) => nodes.filter((n) => n.lv === lv).sort((a, b) => b.v - a.v);\n // Inset 8 px (half a label) so edge nodes keep their labels; padding shrinks so it never\n // takes more than a quarter of the height, then the scale is what is left over.\n const [top, avail] = [plot.y + 8, Math.max(0, plot.h - 16)];\n const most = Math.max(...Array.from({ length: cols }, (_, lv) => col(lv).length));\n const pad = most > 1 ? Math.min(PAD, avail / 4 / (most - 1)) : 0;\n let k = Infinity;\n for (let lv = 0; lv < cols; lv++) {\n const c = col(lv);\n const sum = c.reduce((a, n) => a + n.v, 0);\n if (sum > 0) k = Math.min(k, (avail - pad * (c.length - 1)) / sum);\n }\n if (!(k > 0 && k < Infinity)) k = 0;\n for (let lv = 0; lv < cols; lv++) {\n let y = top;\n for (const n of col(lv)) ((n.y = y), (y += n.v * k + pad));\n }\n const x = (n: N) => plot.x + (n.lv * (plot.w - W)) / (cols - 1);\n for (const n of nodes) {\n let o = n.y;\n for (const l of ls.filter((l) => l.s === n).sort((a, b) => a.t.y - b.t.y))\n ((l.sy = o), (o += l.v * k));\n o = n.y;\n for (const l of ls.filter((l) => l.t === n).sort((a, b) => a.s.y - b.s.y))\n ((l.ty = o), (o += l.v * k));\n }\n\n let c = 0;\n let marks = \"\";\n for (const l of ls) {\n const [x0, x1, th, m] = [x(l.s) + W, x(l.t), l.v * k, (x(l.s) + W + x(l.t)) / 2];\n const [a, b] = [l.sy, l.ty];\n const d = `M${r(x0)} ${r(a)}C${r(m)} ${r(a)} ${r(m)} ${r(b)} ${r(x1)} ${r(b)}L${r(x1)} ${r(b + th)}C${r(m)} ${r(b + th)} ${r(m)} ${r(a + th)} ${r(x0)} ${r(a + th)}Z`;\n marks += el(\"path\", {\n \"data-maya\": \"link\",\n \"data-key\": key(\"k\", l.s.lv, l.s.name, l.t.name),\n \"data-c\": c++,\n \"data-s\": l.s.i % 8,\n \"data-x\": `${l.s.name} → ${l.t.name}`,\n \"data-series\": \"\",\n \"data-y\": l.v,\n \"data-f\": ctx.fmt(spec.y, l.v),\n d,\n });\n }\n for (const n of nodes) {\n const h = n.v * k;\n marks += el(\"rect\", {\n \"data-maya\": \"mark\",\n \"data-key\": key(\"n\", n.lv, n.name),\n \"data-c\": c++,\n \"data-s\": n.i % 8,\n \"data-x\": n.name,\n \"data-series\": \"\",\n \"data-y\": n.v,\n \"data-f\": ctx.fmt(spec.y, n.v),\n \"data-depth\": n.lv,\n x: r(x(n)),\n y: r(n.y),\n width: W,\n height: r(h),\n });\n const last = n.lv === cols - 1;\n ctx.label(last ? x(n) - 4 : x(n) + W + 4, n.y + h / 2, n.name, last ? \"end\" : \"start\");\n }\n return { marks, hits: \"\" };\n },\n};\n\nregister(\"sankey\", sankey);\n\nconst TAU = Math.PI * 2;\nconst RING = 8;\nconst clip = (s: string, max: number) => {\n const c = [...s];\n return c.length > max ? c.slice(0, max - 1).join(\"\") + \"\\u2026\" : s;\n};\n\ninterface CN {\n lv: number;\n s: number;\n name: string;\n i: number;\n v: number;\n a: number;\n}\ninterface CL {\n s: CN;\n t: CN;\n vals: number[];\n v: number;\n}\n\n/** Chord diagram: from-nodes on the left half, to-nodes on the right, ribbons between them. */\nexport const chord: Mark = {\n noun: \"Chord\",\n draw(ctx) {\n const { spec, plot } = ctx;\n const [P0, P1] = spec.path as [string, string];\n const nodes: CN[] = [];\n const byLv: Map<string, CN>[] = [new Map(), new Map()];\n const links = new Map<string, CL>();\n const node = (lv: number, name: string): CN => {\n let n = byLv[lv]!.get(name);\n if (!n) {\n n = { lv, name, i: nodes.length, s: 0, v: 0, a: 0 };\n byLv[lv]!.set(name, n);\n nodes.push(n);\n }\n return n;\n };\n for (const row of spec.data) {\n const v = row[spec.y];\n if (typeof v !== \"number\") continue;\n if (!(v > 0))\n ctx.fail(\n \"non-positive-value\",\n spec.y,\n `spec.${spec.y} is ${v}, but chord sizes must be positive.`,\n );\n const s = node(0, String(row[P0]));\n const t = node(1, String(row[P1]));\n const k = s.i + \"\\0\" + t.i;\n let l = links.get(k);\n if (!l) links.set(k, (l = { s, t, vals: [], v: 0 }));\n l.vals.push(v);\n }\n const red = ctx.agg(spec.aggregate);\n const ls = [...links.values()];\n for (const l of ls) {\n l.v = red(l.vals) ?? 0;\n if (!(l.v > 0))\n ctx.fail(\n \"non-positive-value\",\n spec.y,\n `link ${l.s.name} to ${l.t.name} is ${l.v}, but chord sizes must be positive.`,\n );\n l.s.v += l.v;\n l.t.v += l.v;\n }\n // Palette slots: from-nodes first, then to-nodes, in first-seen order.\n nodes.sort((a, b) => a.lv - b.lv || a.i - b.i).forEach((n, j) => (n.s = j % 8));\n const total = ls.reduce((a, l) => a + l.v, 0);\n if (!(total > 0)) return { marks: \"\", hits: \"\" };\n\n // Angles run clockwise from 12 o'clock. To-nodes fill the right half top to bottom (largest on\n // top), from-nodes the left half bottom to top (largest on top). Each side holds `total`.\n const SIDE = 0.1;\n const GAP = 0.03;\n const sides = [0, 1].map((lv) => nodes.filter((n) => n.lv === lv));\n const k = Math.min(...sides.map((c) => (Math.PI - SIDE - GAP * (c.length - 1)) / total));\n for (const lv of [0, 1]) {\n const c = sides[lv]!.sort((a, b) => (lv ? b.v - a.v : a.v - b.v) || a.i - b.i);\n let a = lv ? SIDE / 2 : Math.PI + SIDE / 2;\n for (const n of c) ((n.a = a), (a += n.v * k + GAP));\n }\n // Label room per side from the longest label (at most 20 characters, at most 36% of the\n // width), so the ring grows to what is left; the pair is then centred as a whole.\n const maxCh = Math.min(20, Math.floor((plot.w * 0.36 - 4) / 7.2));\n const lw = [0, 1].map(\n (lv) => Math.max(0, ...sides[lv]!.map((n) => [...clip(n.name, maxCh)].length)) * 7.2 + 4,\n ) as [number, number];\n const gutter = RING + 4;\n const R = Math.max(\n 12,\n Math.min(plot.h / 2 - RING - 20, (plot.w - lw[0] - lw[1] - 2 * gutter - 4) / 2),\n );\n const spare = plot.w - lw[0] - lw[1] - 2 * (R + gutter);\n const cx = plot.x + spare / 2 + lw[0] + R + gutter;\n const cy = plot.y + plot.h / 2;\n const pt = (a: number, rad: number) =>\n `${r(cx + rad * Math.sin(a))} ${r(cy - rad * Math.cos(a))}`;\n const arc = (a0: number, a1: number, rad: number, sweep: 0 | 1) =>\n `A${r(rad)} ${r(rad)} 0 0 ${sweep} ${pt(sweep ? a1 : a0, rad)}`;\n\n // Ribbon slots: each node hands them out clockwise, ordered to avoid crossings.\n const slot = new Map<CL, { sa: number; ta: number }>();\n for (const n of nodes) {\n const mine = ls\n .filter((l) => (n.lv ? l.t : l.s) === n)\n .sort((x, y) => (n.lv ? y.s.a - x.s.a : y.t.a - x.t.a));\n let a = n.a;\n for (const l of mine) {\n const o = slot.get(l) ?? { sa: 0, ta: 0 };\n n.lv ? (o.ta = a) : (o.sa = a);\n slot.set(l, o);\n a += l.v * k;\n }\n }\n const title = (f: string) => spec.titles.get(f) ?? f;\n let c = 0;\n let marks = \"\";\n for (const l of ls) {\n const { sa, ta } = slot.get(l)!;\n const [sb, tb] = [sa + l.v * k, ta + l.v * k];\n const d = `M${pt(sa, R)}${arc(sa, sb, R, 1)}Q${r(cx)} ${r(cy)} ${pt(ta, R)}${arc(ta, tb, R, 1)}Q${r(cx)} ${r(cy)} ${pt(sa, R)}Z`;\n marks += el(\"path\", {\n \"data-maya\": \"link\",\n \"data-key\": key(\"k\", 0, l.s.name, l.t.name),\n \"data-c\": c++,\n \"data-s\": l.s.s,\n \"data-x\": `${l.s.name} -> ${l.t.name}`,\n \"data-series\": \"\",\n \"data-y\": l.v,\n \"data-f\": ctx.fmt(spec.y, l.v),\n d,\n });\n }\n for (const n of nodes) {\n const [a0, a1] = [n.a, n.a + n.v * k];\n const d = `M${pt(a0, R + RING)}${arc(a0, a1, R + RING, 1)}L${pt(a1, R)}${arc(a0, a1, R, 0)}Z`;\n marks += el(\"path\", {\n \"data-maya\": \"mark\",\n \"data-key\": key(\"n\", n.lv, n.name),\n \"data-c\": c++,\n \"data-s\": n.s,\n \"data-x\": n.name,\n \"data-series\": title(n.lv ? P1 : P0),\n \"data-y\": n.v,\n \"data-f\": ctx.fmt(spec.y, n.v),\n \"data-depth\": n.lv,\n d,\n });\n }\n // ponytail: labels are clipped to 20 characters; ones that still collide are dropped by ctx.label.\n for (const n of nodes) {\n const m = n.a + (n.v * k) / 2;\n const [sn, cs] = [Math.sin(m), Math.cos(m)];\n const rad = R + RING + 4;\n const [lx, ly] = [cx + rad * sn, cy - rad * cs];\n const text = clip(n.name, maxCh);\n ctx.label(\n lx,\n ly,\n text,\n Math.abs(sn) < 0.25 ? (cs > 0 ? \"above\" : \"below\") : sn > 0 ? \"start\" : \"end\",\n );\n }\n return { marks, hits: \"\" };\n },\n};\nregister(\"chord\", chord);\n\nexport {};\n","// US state hex cartogram. Importing this file registers the \"hexmap\" type.\nimport { register } from \"./core/registry.ts\";\nimport { el, key, r, esc } from \"./core/svg.ts\";\nimport type { Mark } from \"./core/types.ts\";\n\n// \"CODE Name col row\": odd-r offset grid (odd rows shift right half a hex), pointy-top.\nconst TABLE =\n \"AK Alaska 0 0|ME Maine 10 0|WI Wisconsin 5 1|VT Vermont 9 1|NH New Hampshire 10 1|\" +\n \"WA Washington 0 2|ID Idaho 1 2|MT Montana 2 2|ND North Dakota 3 2|MN Minnesota 4 2|IL Illinois 5 2|MI Michigan 6 2|NY New York 8 2|MA Massachusetts 9 2|\" +\n \"OR Oregon 0 3|NV Nevada 1 3|WY Wyoming 2 3|SD South Dakota 3 3|IA Iowa 4 3|IN Indiana 5 3|OH Ohio 6 3|PA Pennsylvania 7 3|NJ New Jersey 8 3|CT Connecticut 9 3|RI Rhode Island 10 3|\" +\n \"CA California 0 4|UT Utah 1 4|CO Colorado 2 4|NE Nebraska 3 4|MO Missouri 4 4|KY Kentucky 5 4|WV West Virginia 6 4|VA Virginia 7 4|MD Maryland 8 4|DE Delaware 9 4|\" +\n \"AZ Arizona 1 5|NM New Mexico 2 5|KS Kansas 3 5|AR Arkansas 4 5|TN Tennessee 5 5|NC North Carolina 6 5|SC South Carolina 7 5|DC District of Columbia 8 5|\" +\n \"OK Oklahoma 3 6|LA Louisiana 4 6|MS Mississippi 5 6|AL Alabama 6 6|GA Georgia 7 6|\" +\n \"HI Hawaii 0 7|TX Texas 3 7|FL Florida 7 7|PR Puerto Rico 8 8\";\n\nconst STATES = TABLE.split(\"|\").map((e) => {\n const m = /^(\\S+) (.+) (\\d+) (\\d+)$/.exec(e)!;\n return { code: m[1]!, name: m[2]!, c: +m[3]!, r: +m[4]! };\n});\nconst BY = new Map<string, (typeof STATES)[number]>();\nfor (const s of STATES) BY.set(s.code.toLowerCase(), s).set(s.name.toLowerCase(), s);\n\nconst find = (v: unknown) => BY.get(String(v).trim().toLowerCase());\n\n/** Closest code or name (a few edits away), else \"\". */\nconst near = (v: string): string => {\n const a = v.trim().toLowerCase();\n let best = \"\";\n let min = 4;\n for (const [k, s] of BY) {\n const n =\n Math.abs(a.length - k.length) +\n [...k].filter((ch) => !a.includes(ch)).length +\n [...a].filter((ch) => !k.includes(ch)).length;\n if (n < min) [min, best] = [n, k.length === 2 ? s.code : s.name];\n }\n return best;\n};\n\nconst R3 = Math.sqrt(3);\nconst COLS = Math.max(...STATES.map((s) => s.c)) + 1.5;\nconst ROWS = Math.max(...STATES.map((s) => s.r)) + 1;\n\nexport const hexmap: Mark = {\n noun: \"Hex map\",\n check(spec, fail) {\n spec.data.forEach((row, i) => {\n const v = (row as Record<string, unknown>)[spec.x as string];\n if (v == null || find(v)) return;\n const d = near(String(v));\n fail(\n \"unknown-state\",\n `data[${i}].${spec.x}`,\n `\"${v}\" is not a US state`,\n d && `Did you mean \"${d}\"?`,\n \"Use a two-letter code or full name (50 states, DC, PR).\",\n );\n });\n },\n draw(ctx) {\n const { spec, shaped, plot } = ctx;\n const s = Math.min(plot.w / (R3 * COLS), plot.h / (1.5 * (ROWS - 1) + 2));\n const ox = plot.x + (plot.w - R3 * s * COLS) / 2;\n const oy = plot.y + (plot.h - s * (1.5 * (ROWS - 1) + 2)) / 2;\n const k = s * 0.94;\n const at = (st: (typeof STATES)[number]) => [\n ox + R3 * s * (st.c + 0.5 + (st.r % 2) / 2),\n oy + s + 1.5 * s * st.r,\n ];\n const hex = (st: (typeof STATES)[number]) => {\n const [cx, cy] = at(st) as [number, number];\n return (\n \"M\" +\n [0, 1, 2, 3, 4, 5]\n .map((i) => {\n const a = (Math.PI / 3) * i - Math.PI / 6;\n return `${r(cx + k * Math.cos(a))} ${r(cy + k * Math.sin(a))}`;\n })\n .join(\"L\") +\n \"Z\"\n );\n };\n\n const sum = new Map<(typeof STATES)[number], number>();\n shaped.cells.forEach((c) => {\n const st = find(shaped.categories[c.ci]);\n if (st && c.value !== null) sum.set(st, (sum.get(st) ?? 0) + c.value);\n });\n const vals = [...sum.values()];\n const lo = Math.min(...vals);\n const hi = Math.max(...vals);\n\n let grid = \"\";\n for (const st of STATES) grid += el(\"path\", { d: hex(st), fill: \"none\" });\n let marks = \"\";\n let labels = \"\";\n let n = 0;\n for (const [st, v] of sum) {\n const [cx, cy] = at(st) as [number, number];\n const q = hi > lo ? Math.min(9, Math.floor(((v - lo) / (hi - lo)) * 10)) : 9;\n marks += el(\"path\", {\n \"data-maya\": \"mark\",\n \"data-key\": key(\"g\", st.code),\n \"data-c\": n++,\n \"data-s\": 0,\n \"data-x\": st.name,\n \"data-series\": \"\",\n \"data-f\": ctx.fmt(spec.y, v),\n \"data-y\": v,\n \"data-neg\": v < 0,\n \"data-tone\": ctx.tone(v),\n \"data-q\": q,\n d: hex(st),\n });\n // Drawn here (not ctx.label) so labels on the dark ramp steps can carry data-dark.\n labels += el(\n \"text\",\n {\n x: r(cx),\n y: r(cy),\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"middle\",\n \"data-in\": true,\n \"data-dark\": q >= 6,\n },\n esc(st.code),\n );\n }\n const legend =\n hi > lo\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: \"\", labels, grid, legend };\n },\n};\n\nregister(\"hexmap\", hexmap);\n\nexport {};\n","// mayacharts/radial: polar bars. Imports only registry, svg, scale, ticks and types.\nimport { register } from \"./core/registry.ts\";\nimport { el, esc, key, OTHER, r } from \"./core/svg.ts\";\nimport { niceTicks } from \"./core/ticks.ts\";\nimport type { Mark } from \"./core/types.ts\";\n\nconst TAU = Math.PI * 2;\nconst CAP = 11;\n\nexport const radial: Mark = {\n noun: \"Radial bar\",\n draw(ctx) {\n const { spec, shaped, plot } = ctx;\n const n = shaped.categories.length;\n if (!n || !shaped.cells.length) return { marks: \"\", hits: \"\" };\n\n // Stack outward per category; negatives and nulls draw nothing.\n const segs = shaped.cells.map((c) => ({ c, v: Math.max(0, c.value ?? 0), y0: 0, y1: 0 }));\n const totals = new Array<number>(n).fill(0);\n for (const s of segs) {\n s.y0 = totals[s.c.ci]!;\n s.y1 = totals[s.c.ci] = s.y0 + s.v;\n }\n const max = Math.max(0, ...totals);\n const ticks = niceTicks(0, max, 5);\n const top = ticks.domain[1];\n\n // Room for category labels outside the outer radius (truncated at CAP chars).\n const names = shaped.categories.map((c) => {\n const f = ctx.fmt(spec.x, c);\n return f.length > CAP ? f.slice(0, CAP - 1) + \"…\" : f;\n });\n const lw = Math.max(...names.map((s) => s.length)) * 7.2 + 6;\n const [cx, cy] = [plot.x + plot.w / 2, plot.y + plot.h / 2];\n const R = Math.max(10, Math.min(plot.w / 2 - lw, plot.h / 2 - 16));\n const R0 = R * 0.25;\n const rad = (v: number) => R0 + (v / top) * (R - R0);\n const pt = (rr: number, a: number) => `${r(cx + rr * Math.sin(a))} ${r(cy - rr * Math.cos(a))}`;\n // A clear wedge at 12 o'clock holds the ring labels, so they never sit on a bar.\n const G = n > 1 ? 0.35 : 0;\n const step = (TAU - G) / n;\n const gap = Math.min(step * 0.1, 0.04);\n const sector = (r0: number, r1: number, a0: number, a1: number) => {\n const e = Math.min(a1, a0 + (TAU * 359.99) / 360);\n const big = e - a0 > Math.PI ? 1 : 0;\n return (\n `M${pt(r1, a0)}A${r(r1)} ${r(r1)} 0 ${big} 1 ${pt(r1, e)}` +\n `L${pt(r0, e)}A${r(r0)} ${r(r0)} 0 ${big} 0 ${pt(r0, a0)}Z`\n );\n };\n\n let marks = \"\";\n let hits = \"\";\n segs.forEach((s, i) => {\n const cname = shaped.categories[s.c.ci]!;\n const ser = shaped.series[s.c.si]!;\n const [a0, a1] = [G / 2 + s.c.ci * step + gap, G / 2 + (s.c.ci + 1) * step - gap];\n const [r0, r1] = [rad(s.y0), rad(s.y1)];\n const d = {\n \"data-key\": key(ser, cname),\n \"data-c\": i,\n \"data-s\": s.c.si % 8,\n \"data-x\": ctx.fmt(spec.x, cname),\n \"data-series\": ser,\n \"data-y\": s.c.value,\n \"data-f\": ctx.fmt(spec.y, s.c.value),\n \"data-tone\": ctx.tone(s.v),\n \"data-other\": cname === OTHER,\n };\n marks += el(\"path\", { \"data-maya\": \"mark\", ...d, d: sector(r0, r1, a0, a1) });\n // Hit: grown to >= 24 px thick and wide around the segment's middle (hit() is rect-only).\n const mid = (r0 + r1) / 2;\n const [h0, h1] = [\n Math.max(0, mid - Math.max(12, (r1 - r0) / 2)),\n mid + Math.max(12, (r1 - r0) / 2),\n ];\n const half = Math.max((a1 - a0) / 2, 12 / mid || 0);\n const am = (a0 + a1) / 2;\n if (r1 - r0 < 24 || (a1 - a0) * mid < 24)\n hits += el(\"path\", {\n \"data-maya\": \"hit\",\n ...d,\n d: sector(h0, h1, am - half, am + half),\n fill: \"transparent\",\n });\n });\n\n // Rings: faint circles with value labels along the 12 o'clock spoke.\n let grid = \"\";\n let labels = \"\";\n // At most 3 rings: thin every other tick when the scale has more.\n const vals = ticks.values.filter((v) => v > 0);\n for (const v of vals.length > 3 ? vals.filter((_, i) => i % 2) : vals) {\n grid += el(\"circle\", { cx: r(cx), cy: r(cy), r: r(rad(v)), fill: \"none\" });\n labels += el(\n \"text\",\n { x: r(cx), y: r(cy - rad(v) + 4), \"text-anchor\": \"middle\", \"data-ring\": \"\" },\n esc(ctx.fmt(spec.y, v)),\n );\n }\n\n // Category labels anchored by angle; one that overlaps a placed label is skipped.\n const boxes: number[][] = [];\n names.forEach((name, i) => {\n const a = G / 2 + (i + 0.5) * step;\n const [x, y] = [cx + (R + 6) * Math.sin(a), cy - (R + 6) * Math.cos(a)];\n const sx = Math.sin(a);\n const anchor = Math.abs(sx) < 0.2 ? \"middle\" : sx > 0 ? \"start\" : \"end\";\n const w = name.length * 7.2;\n const l = anchor === \"middle\" ? x - w / 2 : anchor === \"start\" ? x : x - w;\n if (boxes.some((b) => l < b[2]! && l + w > b[0]! && y - 7 < b[3]! && y + 7 > b[1]!)) return;\n boxes.push([l, y - 7, l + w, y + 7]);\n labels += el(\n \"text\",\n { x: r(x), y: r(y), \"text-anchor\": anchor, \"dominant-baseline\": \"middle\", \"data-cat\": \"\" },\n esc(name),\n );\n });\n return { marks, hits, labels, grid };\n },\n};\n\nregister(\"radial\", radial);\n","// IIFE entry (dist/maya.global.js): element + every module, exposed as globalThis.maya.\nimport * as maya from \"./element.ts\";\nimport \"./hierarchy.ts\";\nimport \"./flow.ts\";\nimport \"./geo.ts\";\nimport \"./radial.ts\";\n\n(globalThis as { maya?: typeof maya }).maya = maya;\n\nexport {};\n"],"mappings":"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"}
|