phoria2 1.1.0 → 1.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 +70 -13
- package/dist/bloom.js +4 -4
- package/dist/bloom.js.map +1 -1
- package/dist/charts.js +538 -508
- package/dist/charts.js.map +1 -1
- package/dist/core.js +4270 -3652
- package/dist/core.js.map +1 -1
- package/dist/edit.js +65 -65
- package/dist/edit.js.map +1 -1
- package/dist/explain.js +6 -2
- package/dist/explain.js.map +1 -1
- package/dist/gltf.js +116 -116
- package/dist/gltf.js.map +1 -1
- package/dist/keyboard.js +188 -0
- package/dist/keyboard.js.map +1 -0
- package/dist/motion.js +35 -35
- package/dist/motion.js.map +1 -1
- package/dist/particles.js +188 -115
- package/dist/particles.js.map +1 -1
- package/dist/passes.js +29 -29
- package/dist/passes.js.map +1 -1
- package/dist/phoria2.js +1 -1
- package/dist/picking.js +32 -16
- package/dist/picking.js.map +1 -1
- package/dist/snapshot.js +1 -1
- package/dist/tooltip.js +1 -1
- package/dist/types/OrbitControl.d.ts +6 -2
- package/dist/types/Raycaster.d.ts +10 -0
- package/dist/types/View.d.ts +70 -1
- package/dist/types/area.d.ts +18 -0
- package/dist/types/charts/Chart.d.ts +7 -0
- package/dist/types/explain.d.ts +3 -0
- package/dist/types/frame.d.ts +7 -0
- package/dist/types/geometry/Geometry.d.ts +24 -2
- package/dist/types/index.d.ts +2 -0
- package/dist/types/keyboard.d.ts +48 -0
- package/dist/types/labels.d.ts +4 -0
- package/dist/types/material/Material.d.ts +15 -0
- package/dist/types/material/Texture.d.ts +18 -2
- package/dist/types/particles/Emitter.d.ts +39 -2
- package/dist/types/scene/Node.d.ts +19 -14
- package/dist/types/scene/drawables.d.ts +54 -15
- package/dist/types/scene/lights.d.ts +16 -2
- package/dist/types/shadow.d.ts +2 -1
- package/dist/types/types.d.ts +14 -0
- package/dist/types/value/Color.d.ts +0 -4
- package/dist/types/value/Quat.d.ts +4 -2
- package/dist/types/webgl/resources.d.ts +12 -2
- package/dist/types/webgl/shaders.d.ts +7 -2
- package/llms-full.txt +106 -10
- package/package.json +4 -1
- package/schema/scene.schema.json +67 -1
- package/src/OrbitControl.js +7 -3
- package/src/Raycaster.js +58 -0
- package/src/View.js +220 -41
- package/src/area.js +131 -0
- package/src/charts/Chart.js +20 -2
- package/src/charts/marks.js +29 -2
- package/src/explain.js +6 -2
- package/src/frame.js +29 -9
- package/src/geometry/Geometry.js +32 -4
- package/src/index.js +1 -0
- package/src/keyboard.js +298 -0
- package/src/labels.js +4 -1
- package/src/material/Material.js +9 -2
- package/src/material/Texture.js +55 -2
- package/src/particles/Emitter.js +121 -10
- package/src/scene/Node.js +20 -9
- package/src/scene/Scene.js +2 -0
- package/src/scene/cameras.js +4 -1
- package/src/scene/drawables.js +115 -15
- package/src/scene/lights.js +40 -6
- package/src/shadow.js +27 -4
- package/src/types.js +6 -0
- package/src/value/Color.js +21 -0
- package/src/value/Quat.js +15 -6
- package/src/watch.js +14 -2
- package/src/webgl/WebGLRenderer.js +36 -5
- package/src/webgl/picking.js +22 -1
- package/src/webgl/resources.js +168 -14
- package/src/webgl/shaders.js +110 -11
package/dist/charts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"charts.js","names":["boxGeometry","fail","Mesh","invert","describe","Geometry","Lines","checkNumber","EASES","Color","InstancedMesh","NODE_OPTIONS","didYouMean","box","icosphere","registerType","Group","Points","Label","ALONG","EDGE_ON","tmp","look","p","camera","x","y","cy","z","len","chartFrame","w","h","d","frame","dir","wallColor","theme","tickValues","ticks","a","r0","r1","lo","hi","ticksOf","xt","axes","yt","zt","wall","seg","b","at","side","v","axis","t","k","margin","cls","kind","labels","name","values","edge","edges","set","bottom","sign","n","zs","m","xs","rect","c","e","LOG10","tickStep","raw","span","count","power","error","formatter","option","f","date","fallback","numberFormat","digits","step","plain","compact","useCompact","max","pair","scaleLinear","d0","d1","domain","range","zero","nice","scale","clamp","out","format","scaleLog","inner","SECOND","MINUTE","HOUR","DAY","INTERVALS","CALENDAR","DATE_FORMATS","toDate","scaleTime","t0","t1","pick","ms","unit","get","size","years","first","i","auto","scaleBand","index","padding","SCHEMES","scaleColor","scheme","sequential","stops","along","last","j","local","value","distinct","list","legend","el","position","title","head","item","swatch","color","onToggle","key","ramp","marks","mark","stackKey","xv","ch","row","valueClass","ctx","labelsOf","priority","pos","s","barMark","mesh","makeBars","share","base","stacks","state","rows","y0","y1","below","keysOf","target","bigger","r","g","capacity","pointMark","sized","opacity","material","node","emptyPoints","stride","geometry","lineMark","lines","dots","fill","area","by","groups","series","totals","ordered","segColors","dotPos","dotColors","tri","triColors","lengths","colors","px","py","pz","replace","old","options","surfaceMark","grid","cell","missing","gap","positions","indices","nx","nz","random","seed","WIDTHS","networkMark","o","keyOf","keyGetter","linkCh","source","placed","makeNodes","nodesMesh","linkNodes","active","packets","flows","links","rowsNow","hovered","keys","l","place","neighbours","hover","dimmed","byWidth","link","bucket","widthClass","linkColor","flowSpeed","li","showNeighbours","dt","hit","rgb","other","layout","tiers","pairs","force","rand","dims","warm","steps","near","hops","furthest","queue","q","next","from","spread","to","weights","want","dx","dy","dz","field","order","tierOf","angle","radius","members","pull","above","MARKS","CHANNELS","OPTIONS","CHANNEL_OPTIONS","OPTION_HINTS","MARK_HINTS","CHANNEL_HINTS","normalise","input","markOf","dataOf","fields","fieldsOf","encoding","channels","spec","channel","tooltipSpec","markTooltip","tooltip","tooltipOf","linkFields","checkTicks","hint","data","names","inferType","owner","isColor","type","what","seen","encoded","CSS","addStyle","style","NODE_KEYS","chart","Chart","rest","#input","#ctx","#rebuild","#step","#spec","#mark","change","fn","#filter","sc","shown","#shown","json","copy","defaultBox","overlap","visible","#hidden","scalesFor","linkColors","colorScale","colorValue","formatValue","signature","#signature","makeMark","#current","#tween","#frame","axesFor","#title","#setLegend","#tooltipFor","hl","#show","animate","on","container","host","now","cur","#draw","before","keep","going","leaving","slot","sameShape","tw","duration","ease","extent","colorOptions","ranges","listed","stackTotals","scales","NUMBER","COMPACT","DATE"],"sources":["../src/charts/axes.js","../src/charts/scales.js","../src/charts/legend.js","../src/charts/marks.js","../src/charts/network.js","../src/charts/spec.js","../src/charts/style.js","../src/charts/Chart.js"],"sourcesContent":["// A chart's frame: grid walls on the far sides of its box and tick labels on the near edges. Every\n// candidate wall and label set is in the scene, and per-camera visibility (showFrom) picks which\n// ones a frame draws - so orbiting never moves anything, and two views of one chart are each right.\nimport { Geometry } from '../geometry/Geometry.js'\nimport { Group } from '../scene/Node.js'\nimport { Label, Lines } from '../scene/drawables.js'\nimport * as mat4 from '../math/mat4.js'\n\n/** @import { Camera } from '../scene/cameras.js' */\n/** @import { Scale } from './scales.js' */\n/** @import { Channel } from './spec.js' */\n\n// a direction this close to an axis counts as looking along it (that axis collapses on screen)\nconst ALONG = 0.97\n// walls closer than this to edge-on are left out\nconst EDGE_ON = 0.08\n// a camera this little to one side counts as straight ahead when choosing which edges to label\nconst LEAN = 0.1\n\nconst tmp = new Float32Array(16)\n\n/**\n * The camera's direction from the box centre, in the box's own space.\n * @param {Group} box @param {Camera} camera @param {number} cy the box centre's height\n */\nfunction look(box, camera, cy) {\n const p = camera.worldPosition\n mat4.invert(tmp, box.worldMatrix)\n const x = tmp[0] * p[0] + tmp[4] * p[1] + tmp[8] * p[2] + tmp[12]\n const y = tmp[1] * p[0] + tmp[5] * p[1] + tmp[9] * p[2] + tmp[13] - cy\n const z = tmp[2] * p[0] + tmp[6] * p[1] + tmp[10] * p[2] + tmp[14]\n const len = Math.hypot(x, y, z) || 1\n return [x / len, y / len, z / len]\n}\n\n/**\n * @typedef {object} AxisSpec\n * @property {Scale} scale\n * @property {Channel | null} channel\n * @property {string} title\n */\n\n/**\n * Walls, ticks and titles for a chart box spanning x -w/2..w/2, y 0..h, z -d/2..d/2.\n * @param {{ box: [number, number, number], axes: { x?: AxisSpec, y?: AxisSpec, z?: AxisSpec }, theme: 'dark' | 'light', overlap: 'dim' | 'hide' | 'show' }} options\n * @returns {Group}\n */\nexport function chartFrame({ box, axes, theme, overlap }) {\n const [w, h, d] = box\n const frame = new Group({ name: 'axes', pickable: false })\n const dir = (camera) => look(frame, camera, h / 2)\n const wallColor = theme === 'light' ? '#c3c8d2' : '#3a3d47'\n // the values an axis marks: those it lists, or about as many as it asks for (five unless it says)\n const tickValues = (a) => {\n const ticks = a.channel?.axis?.ticks\n if (!Array.isArray(ticks)) return a.scale.kind === 'band' ? a.scale.ticks() : a.scale.ticks(ticks ?? 5)\n const [r0, r1] = a.scale.range, lo = Math.min(r0, r1), hi = Math.max(r0, r1)\n return ticks.filter((t) => a.scale(t) >= lo - 1e-9 && a.scale(t) <= hi + 1e-9)\n }\n const ticksOf = (a) => (a && a.scale.kind !== 'band' && a.channel?.axis !== false ? tickValues(a) : [])\n const xt = ticksOf(axes.x), yt = ticksOf(axes.y), zt = ticksOf(axes.z)\n\n // six walls: grid lines at the ticks of the two axes they span, and a border\n const wall = (axis, side) => {\n const p = []\n const seg = (a, b) => p.push(...a, ...b)\n const at = (v) => (side < 0 ? -v / 2 : v / 2)\n if (axis === 'y') {\n const y = side < 0 ? 0 : h\n for (const t of xt) { const x = axes.x.scale(t); seg([x, y, -d / 2], [x, y, d / 2]) }\n for (const t of zt) { const z = axes.z.scale(t); seg([-w / 2, y, z], [w / 2, y, z]) }\n rect(seg, [-w / 2, y, -d / 2], [w / 2, y, -d / 2], [w / 2, y, d / 2], [-w / 2, y, d / 2])\n } else if (axis === 'x') {\n const x = at(w)\n for (const t of yt) { const y = axes.y.scale(t); seg([x, y, -d / 2], [x, y, d / 2]) }\n for (const t of zt) { const z = axes.z.scale(t); seg([x, 0, z], [x, h, z]) }\n rect(seg, [x, 0, -d / 2], [x, h, -d / 2], [x, h, d / 2], [x, 0, d / 2])\n } else {\n const z = at(d)\n for (const t of yt) { const y = axes.y.scale(t); seg([-w / 2, y, z], [w / 2, y, z]) }\n for (const t of xt) { const x = axes.x.scale(t); seg([x, 0, z], [x, h, z]) }\n rect(seg, [-w / 2, 0, z], [w / 2, 0, z], [w / 2, h, z], [-w / 2, h, z])\n }\n const k = 'xyz'.indexOf(axis)\n // a wall shows when the camera is on its far side\n frame.add(new Lines({\n geometry: new Geometry({ positions: p }), material: { color: wallColor }, pickable: false,\n showFrom: (camera) => -side * dir(camera)[k] > EDGE_ON,\n }))\n }\n for (const axis of ['x', 'y', 'z']) for (const side of [-1, 1]) wall(axis, side)\n\n // tick label sets: one per candidate edge, shown when it is the edge nearest the viewer\n const margin = Math.max(w, h, d) * 0.04\n const cls = (kind) => `phoria-axis-${kind} phoria-${theme}`\n const labels = (name, edges, place) => {\n const a = axes[name]\n if (!a || a.channel?.axis === false) return\n const k = 'xyz'.indexOf(name)\n const values = tickValues(a)\n for (const edge of edges) {\n const set = frame.add(new Group({\n showFrom: (camera) => {\n const v = dir(camera)\n return Math.abs(v[k]) < ALONG && edge.when(v)\n },\n }))\n for (const t of values) {\n set.add(new Label({ text: a.scale.format(t), position: edge.at(a.scale(t), margin), place, className: cls('tick'), priority: 1, overlap }))\n }\n // an empty title (axis: { title: '' }) leaves the axis untitled\n if (a.title) set.add(new Label({ text: a.title, position: edge.title(margin), place, className: cls('title'), priority: 2, overlap }))\n }\n }\n const bottom = (v) => v[1] >= -EDGE_ON\n // which side the camera is on - leaning to + so a view from straight ahead (or nearly) keeps its\n // labels where a front-on chart has them, however framing nudges the camera off centre\n const sign = (n) => (n >= -LEAN ? 1 : -1)\n // x ticks along the bottom edge nearest the viewer\n labels('x', [-1, 1].flatMap((zs) => [0, h].map((y) => ({\n when: (v) => (y === 0) === bottom(v) && sign(v[2]) === zs,\n at: (x, m) => [x, y, zs * (d / 2 + m)],\n title: (m) => [0, y, zs * (d / 2 + m * 3.5)],\n }))), 'below')\n // z ticks along the bottom edge on the viewer's side in x\n labels('z', [-1, 1].flatMap((xs) => [0, h].map((y) => ({\n when: (v) => (y === 0) === bottom(v) && sign(v[0]) === xs,\n at: (z, m) => [xs * (w / 2 + m), y, z],\n title: (m) => [xs * (w / 2 + m * 4), y, 0],\n }))), 'below')\n // y ticks up the outline edge on the screen's left: the far side in x, the near side in z\n labels('y', [-1, 1].flatMap((xs) => [-1, 1].map((zs) => ({\n when: (v) => sign(v[0]) === -xs && sign(v[2]) === zs,\n at: (y, m) => [xs * (w / 2 + m), y, zs * d / 2],\n title: (m) => [xs * (w / 2 + m), h + m * 2, zs * d / 2],\n }))), 'left')\n return frame\n}\n\n/** Four edges of a rectangle as segments. */\nfunction rect(seg, a, b, c, e) {\n seg(a, b)\n seg(b, c)\n seg(c, e)\n seg(e, a)\n}\n","// Scales map data values to positions or colours. Each is a function with a few members - ticks(),\n// format(), invert() - in the spirit of d3-scale, but a small subset written for charts in a box.\nimport { Color } from '../value/Color.js'\nimport { describe, fail } from '../validate.js'\n\n/** @typedef {Intl.NumberFormatOptions | Intl.DateTimeFormatOptions | ((value: any) => string)} FormatOption */\n\n/**\n * @typedef {object} ScaleBase\n * @property {'linear' | 'log' | 'time' | 'band'} kind\n * @property {any[]} domain\n * @property {[number, number]} range\n * @property {(count?: number) => any[]} ticks\n * @property {(value: any) => string} format\n */\n/** @typedef {((value: any) => number) & ScaleBase & { invert?: (y: number) => any, bandwidth?: number, step?: number }} Scale */\n\nconst LOG10 = Math.log(10)\n\n/** A round step near span / count: 1, 2 or 5 times a power of ten. @param {number} span @param {number} count */\nexport function tickStep(span, count) {\n const raw = span / Math.max(1, count)\n const power = 10 ** Math.floor(Math.log(raw) / LOG10)\n const error = raw / power\n return power * (error >= 7.07 ? 10 : error >= 3.16 ? 5 : error >= 1.41 ? 2 : 1)\n}\n\n/** @param {FormatOption | undefined} option @param {(v: any) => string} fallback */\nfunction formatter(option, fallback, date = false) {\n if (typeof option === 'function') return option\n if (option && typeof option === 'object') {\n const f = date ? new Intl.DateTimeFormat(undefined, /** @type {Intl.DateTimeFormatOptions} */ (option))\n : new Intl.NumberFormat(undefined, /** @type {Intl.NumberFormatOptions} */ (option))\n return (v) => f.format(v)\n }\n if (option !== undefined) fail('charts', `'format' must be Intl format options or a function, got ${describe(option)}`)\n return fallback\n}\n\n/**\n * Plain numbers to a step's precision; compact (1.2K) from ten thousand, while the steps are big\n * enough to tell apart in it - 10,000 to 10,010 would read 10K at every tick.\n * @param {number} step @param {number} max\n */\nfunction numberFormat(step, max) {\n const digits = Math.max(0, Math.min(6, -Math.floor(Math.log(step || 1) / LOG10)))\n const plain = new Intl.NumberFormat(undefined, { maximumFractionDigits: digits })\n const compact = new Intl.NumberFormat(undefined, { notation: 'compact', maximumFractionDigits: 1 })\n const useCompact = Math.abs(max) >= 1e4 && step >= Math.abs(max) / 100\n return (v) => (useCompact ? compact : plain).format(v)\n}\n\n/** @param {unknown} v @param {string} name @returns {[number, number]} */\nfunction pair(v, name) {\n if (!Array.isArray(v) || v.length !== 2 || !v.every((n) => typeof n === 'number' && Number.isFinite(n))) {\n fail('charts', `'${name}' must be [min, max] numbers, got ${describe(v)}`)\n }\n return /** @type {[number, number]} */ ([v[0], v[1]])\n}\n\n/**\n * Numbers to numbers in proportion.\n *\n * const y = scaleLinear({ domain: [0, 120], range: [0, 6] })\n * y(60) // 3\n * y.ticks(5) // [0, 20, 40, 60, 80, 100, 120]\n * @param {{ domain: [number, number], range?: [number, number], nice?: boolean, zero?: boolean, clamp?: boolean,\n * format?: FormatOption }} options nice widens the domain to round ends; zero takes it to include 0\n * @returns {Scale}\n */\nexport function scaleLinear({ domain, range = [0, 1], nice = false, zero = false, clamp = false, format }) {\n let [d0, d1] = pair(domain, 'domain')\n const [r0, r1] = pair(range, 'range')\n if (zero) {\n d0 = Math.min(0, d0)\n d1 = Math.max(0, d1)\n }\n if (d0 === d1) {\n // a single value still gets a little room\n d0 -= d0 ? Math.abs(d0) * 0.5 : 1\n d1 += d1 ? Math.abs(d1) * 0.5 : 1\n }\n if (nice) {\n const step = tickStep(d1 - d0, 5)\n d0 = Math.floor(d0 / step) * step\n d1 = Math.ceil(d1 / step) * step\n }\n const k = (r1 - r0) / (d1 - d0)\n const scale = /** @type {Scale} */ ((v) => {\n const t = r0 + (v - d0) * k\n return clamp ? Math.min(Math.max(t, Math.min(r0, r1)), Math.max(r0, r1)) : t\n })\n scale.kind = 'linear'\n scale.domain = [d0, d1]\n scale.range = [r0, r1]\n scale.invert = (y) => d0 + (y - r0) / k\n scale.ticks = (count = 5) => {\n const step = tickStep(d1 - d0, count), out = []\n for (let v = Math.ceil(d0 / step) * step; v <= d1 + step * 1e-9; v += step) out.push(+v.toFixed(12))\n return out\n }\n scale.format = formatter(format, numberFormat(tickStep(d1 - d0, 5), Math.max(Math.abs(d0), Math.abs(d1))))\n return scale\n}\n\n/**\n * Positive numbers on a log scale, for values spanning orders of magnitude.\n * @param {{ domain: [number, number], range?: [number, number], format?: FormatOption }} options\n * @returns {Scale}\n */\nexport function scaleLog({ domain, range = [0, 1], format }) {\n const [d0, d1] = pair(domain, 'domain')\n if (d0 <= 0 || d1 <= 0) fail('charts', `a log scale needs a domain above 0, got [${d0}, ${d1}] - use a linear scale for zero or negative values`)\n const inner = scaleLinear({ domain: [Math.log10(d0), Math.log10(d1)], range })\n const scale = /** @type {Scale} */ ((v) => inner(Math.log10(v)))\n scale.kind = 'log'\n scale.domain = [d0, d1]\n scale.range = inner.range\n scale.invert = (y) => 10 ** /** @type {number} */ (inner.invert?.(y))\n scale.ticks = () => {\n const out = []\n for (let p = Math.floor(Math.log10(d0)); p <= Math.ceil(Math.log10(d1)); p++) {\n for (const m of [1, 2, 5]) {\n const v = m * 10 ** p\n if (v >= d0 * 0.999 && v <= d1 * 1.001) out.push(v)\n }\n }\n return out\n }\n scale.format = formatter(format, (v) => new Intl.NumberFormat(undefined, { notation: 'compact', maximumFractionDigits: 1 }).format(v))\n return scale\n}\n\n// tick intervals for time, in ms, and how to label each\nconst SECOND = 1000, MINUTE = 60 * SECOND, HOUR = 60 * MINUTE, DAY = 24 * HOUR\n/** @type {[number, string][]} */\nconst INTERVALS = [\n [SECOND, 's'], [5 * SECOND, 's'], [15 * SECOND, 's'], [30 * SECOND, 's'], [MINUTE, 'm'], [5 * MINUTE, 'm'], [15 * MINUTE, 'm'],\n [30 * MINUTE, 'm'], [HOUR, 'h'], [3 * HOUR, 'h'], [6 * HOUR, 'h'], [12 * HOUR, 'h'], [DAY, 'd'], [2 * DAY, 'd'], [7 * DAY, 'w'],\n [30 * DAY, 'M'], [91 * DAY, 'Q'], [365 * DAY, 'Y'],\n]\n/**\n * Each unit as a calendar field to step - read it, set it, and its rough size in ms.\n * @type {Record<string, [(d: Date) => number, (d: Date, v: number) => void, number]>}\n */\nconst CALENDAR = {\n s: [(d) => d.getSeconds(), (d, v) => d.setSeconds(v), SECOND],\n m: [(d) => d.getMinutes(), (d, v) => d.setMinutes(v), MINUTE],\n h: [(d) => d.getHours(), (d, v) => d.setHours(v), HOUR],\n d: [(d) => d.getDate(), (d, v) => d.setDate(v), DAY],\n w: [(d) => d.getDate(), (d, v) => d.setDate(v), DAY],\n M: [(d) => d.getMonth(), (d, v) => d.setMonth(v), 30 * DAY],\n Q: [(d) => d.getMonth(), (d, v) => d.setMonth(v), 30 * DAY],\n Y: [(d) => d.getFullYear(), (d, v) => d.setFullYear(v), 365 * DAY],\n}\nconst DATE_FORMATS = {\n s: { hour: '2-digit', minute: '2-digit', second: '2-digit' }, m: { hour: '2-digit', minute: '2-digit' }, h: { hour: '2-digit', minute: '2-digit' },\n d: { month: 'short', day: 'numeric' }, w: { month: 'short', day: 'numeric' }, M: { month: 'short', year: 'numeric' },\n Q: { month: 'short', year: 'numeric' }, Y: { year: 'numeric' },\n}\n\n/** A Date from a Date, a timestamp or a date string. @param {unknown} v @returns {Date} */\nexport function toDate(v) {\n const d = v instanceof Date ? v : new Date(/** @type {any} */ (v))\n if (Number.isNaN(d.getTime())) fail('charts', `${describe(v)} isn't a date - use Date objects, timestamps or ISO strings like '2026-10-25'`)\n return d\n}\n\n/**\n * Dates to numbers, with ticks on calendar boundaries (days, months, years) and labels to match.\n * @param {{ domain: [unknown, unknown], range?: [number, number], format?: FormatOption }} options\n * @returns {Scale}\n */\nexport function scaleTime({ domain, range = [0, 1], format }) {\n const t0 = toDate(domain[0]).getTime(), t1 = toDate(domain[1]).getTime()\n const inner = scaleLinear({ domain: [t0, t1], range })\n const span = Math.max(1, t1 - t0)\n const pick = (count) => INTERVALS.find(([ms]) => span / ms <= count) ?? INTERVALS[INTERVALS.length - 1]\n const scale = /** @type {Scale} */ ((v) => inner(toDate(v).getTime()))\n scale.kind = 'time'\n scale.domain = [new Date(t0), new Date(t1)]\n scale.range = inner.range\n scale.invert = (y) => new Date(/** @type {number} */ (inner.invert?.(y)))\n scale.ticks = (count = 5) => {\n const [ms, unit] = pick(count)\n const [get, set, size] = CALENDAR[unit]\n // whole steps of the unit - years nicely, as 1, 2, 5, 10 ...\n let n = Math.max(1, Math.round(ms / size))\n if (unit === 'Y') {\n const years = span / size / count, p = 10 ** Math.floor(Math.log10(years || 1))\n n = Math.max(1, [1, 2, 5, 10].map((m) => m * p).find((v) => v >= years) ?? 10 * p)\n }\n const d = new Date(t0)\n // start on a boundary of the unit, at a multiple of the step within the next unit up: quarters\n // in Jan, Apr, Jul and Oct, quarter hours on the quarter\n d.setMilliseconds(0)\n if (unit !== 's') d.setSeconds(0)\n if (!'sm'.includes(unit)) d.setMinutes(0)\n if ('dwMQY'.includes(unit)) d.setHours(0)\n if ('MQY'.includes(unit)) d.setDate(1)\n if (unit === 'Y') d.setMonth(0)\n const first = unit === 'd' ? 1 : 0\n if (unit !== 'w') set(d, Math.floor((get(d) - first) / n) * n + first)\n // steps through the calendar, in local time, so ticks stay on round times across daylight saving\n while (d.getTime() < t0) set(d, get(d) + n)\n const out = []\n for (let i = 0; d.getTime() <= t1 && i < 200; i++) {\n out.push(new Date(d))\n set(d, get(d) + n)\n }\n return out\n }\n const auto = new Intl.DateTimeFormat(undefined, /** @type {any} */ (DATE_FORMATS[pick(6)[1]]))\n scale.format = formatter(format, (v) => auto.format(toDate(v)), true)\n return scale\n}\n\n/**\n * Categories to evenly spaced bands; the value is the band's centre.\n *\n * const months = scaleBand({ domain: ['Jan', 'Feb', 'Mar'], range: [0, 9], padding: 0.2 })\n * months('Feb') // 4.5\n * months.bandwidth // 2.4 - the band's width without its padding\n * @param {{ domain: unknown[], range?: [number, number], padding?: number, format?: FormatOption }} options\n * @returns {Scale}\n */\nexport function scaleBand({ domain, range = [0, 1], padding = 0.2, format }) {\n if (!Array.isArray(domain)) fail('charts', `a band scale's domain is a list of categories, got ${describe(domain)}`)\n const [r0, r1] = pair(range, 'range')\n const index = new Map(domain.map((v, i) => [String(v), i]))\n const step = (r1 - r0) / Math.max(1, domain.length)\n const scale = /** @type {Scale} */ ((v) => {\n const i = index.get(String(v))\n return i === undefined ? NaN : r0 + step * (i + 0.5)\n })\n scale.kind = 'band'\n scale.domain = domain\n scale.range = [r0, r1]\n scale.step = step\n scale.bandwidth = Math.abs(step) * (1 - padding)\n scale.ticks = () => domain\n scale.format = formatter(format, (v) => String(v))\n return scale\n}\n\n// colour schemes: categorical (Tableau 10) and ramps for numbers, as sRGB hex stops\nexport const SCHEMES = {\n category: ['#4e79a7', '#f28e2b', '#59a14f', '#e15759', '#76b7b2', '#edc948', '#b07aa1', '#ff9da7', '#9c755f', '#bab0ac'],\n viridis: ['#440154', '#3b528b', '#21918c', '#5ec962', '#fde725'],\n blues: ['#eff3ff', '#bdd7e7', '#6baed6', '#3182bd', '#08519c'],\n heat: ['#2c7bb6', '#abd9e9', '#ffffbf', '#fdae61', '#d7191c'],\n cool: ['#f7fcf0', '#ccebc5', '#7bccc4', '#2b8cbe', '#084081'],\n redblue: ['#b2182b', '#ef8a62', '#f7f7f7', '#67a9cf', '#2166ac'],\n}\n\n/**\n * @typedef {((value: any) => Color) & { kind: 'categorical' | 'sequential', domain: any[], range: string[],\n * colors: () => { value: any, color: Color }[] }} ColorScale\n */\n\n/**\n * Values to colours: categories to a categorical scheme, numbers along a ramp (mixed in linear\n * space). Give a scheme name or a range of colours.\n *\n * scaleColor({ domain: ['ok', 'warn', 'down'], range: ['#59a14f', '#f2b134', '#e15759'] })\n * scaleColor({ domain: [18, 35], scheme: 'heat' })\n * @param {{ domain: any[], scheme?: keyof typeof SCHEMES, range?: string[], kind?: 'sequential' | 'categorical' }} options\n * kind: a ramp through the domain's numbers (two or more - [0, 50, 100] for a diverging scheme), or a colour\n * per value. Without it, two numbers make a ramp and anything else categories\n * @returns {ColorScale}\n */\nexport function scaleColor({ domain, scheme, range, kind }) {\n if (scheme !== undefined && !(scheme in SCHEMES)) {\n fail('charts', `colour scheme '${scheme}' isn't one we have - use ${Object.keys(SCHEMES).map((k) => `'${k}'`).join(', ')}, or a range of colours`)\n }\n const sequential = kind ? kind === 'sequential' : domain.length === 2 && domain.every((v) => typeof v === 'number')\n if (sequential && (domain.length < 2 || domain.some((v) => typeof v !== 'number'))) fail('charts', `a sequential colour scale needs two or more numbers in its domain, got ${describe(domain)}`)\n const stops = (range ?? SCHEMES[scheme ?? (sequential ? 'viridis' : 'category')]).map((c) => Color.fromInput(c, 'charts'))\n /** @type {ColorScale} */\n let scale\n if (sequential) {\n // where a value is along the domain, 0 - 1: piece by piece when it has more than two numbers\n const along = (/** @type {number} */ v) => {\n const last = domain.length - 1\n let j = 0\n while (j < last - 1 && v > domain[j + 1]) j++\n const local = (v - domain[j]) / (domain[j + 1] - domain[j] || 1)\n return Math.min(1, Math.max(0, (j + local) / last))\n }\n scale = /** @type {ColorScale} */ ((v) => {\n if (stops.length < 2) return stops[0].clone()\n const t = along(v) * (stops.length - 1)\n const i = Math.min(stops.length - 2, Math.floor(t))\n return stops[i].clone().lerp(stops[i + 1], t - i)\n })\n scale.kind = 'sequential'\n scale.colors = () => []\n } else {\n const index = new Map(domain.map((v, i) => [String(v), i]))\n scale = /** @type {ColorScale} */ ((v) => stops[(index.get(String(v)) ?? 0) % stops.length].clone())\n scale.kind = 'categorical'\n scale.colors = () => domain.map((value) => ({ value, color: scale(value) }))\n }\n scale.domain = domain\n scale.range = stops.map((c) => c.getStyle())\n return scale\n}\n\n/**\n * The different values, in order: numbers and dates ascending, anything else as first seen. @internal\n * @param {any[]} values @returns {any[]}\n */\nexport function distinct(values) {\n const list = [...new Map(values.map((v) => [v instanceof Date ? v.getTime() : v, v])).values()]\n return typeof list[0] === 'number' || list[0] instanceof Date ? list.sort((a, b) => +a - +b) : list\n}\n","// A chart's legend as HTML: swatches for categories (click to hide or show them), or for numbers a\n// key - a ramp, highest at the top, with values marked up its side.\nimport { scaleLinear } from './scales.js'\n\n/** @import { ColorScale } from './scales.js' */\n\n/**\n * @param {ColorScale} scale\n * @param {{ title: string, theme: 'dark' | 'light', position?: string, format: (v: any) => string,\n * ticks?: number[] | number, onToggle?: (value: any, on: boolean) => void }} options\n * @returns {HTMLDivElement}\n */\nexport function legend(scale, { title, theme, position = 'top-right', format, ticks, onToggle }) {\n const el = document.createElement('div')\n el.className = `phoria-legend phoria-legend-${position} phoria-${theme}`\n // an empty title leaves the legend untitled\n if (title) {\n const head = document.createElement('div')\n head.className = 'phoria-legend-title'\n head.textContent = title\n el.append(head)\n }\n if (scale.kind === 'categorical') {\n for (const { value, color } of scale.colors()) {\n const item = document.createElement('button')\n item.type = 'button'\n item.className = 'phoria-legend-item'\n const swatch = document.createElement('span')\n swatch.className = 'phoria-legend-swatch'\n swatch.style.background = color.getStyle()\n item.append(swatch, format(value))\n item.addEventListener('click', () => onToggle?.(value, !item.classList.toggle('off')))\n el.append(item)\n }\n } else {\n const lo = scale.domain[0], hi = scale.domain[scale.domain.length - 1]\n const along = scaleLinear({ domain: [lo, hi], range: [0, 100] })\n const key = document.createElement('div')\n key.className = 'phoria-legend-key'\n const ramp = document.createElement('div')\n ramp.className = 'phoria-legend-ramp'\n // sampled from the scale, so a ramp with more than two numbers in its domain is drawn as it colours\n const stops = Array.from({ length: 17 }, (_, i) => `${scale(lo + (hi - lo) * i / 16).getStyle()} ${i * 100 / 16}%`)\n ramp.style.background = `linear-gradient(to top, ${stops.join(', ')})`\n const marks = document.createElement('div')\n marks.className = 'phoria-legend-scale'\n const values = Array.isArray(ticks) ? ticks : along.ticks(ticks ?? 5)\n for (const v of values) {\n const at = along(v)\n if (!(at >= -1e-9 && at <= 100 + 1e-9)) continue\n const mark = document.createElement('span')\n mark.style.bottom = `${at}%`\n mark.textContent = format(v)\n marks.append(mark)\n }\n key.append(ramp, marks)\n el.append(key)\n }\n return el\n}\n","// The marks: each turns rows into a flat numeric state - a few numbers per item - and writes a\n// state into its nodes. The chart tweens between states for transitions, so a mark only has to\n// lay out and draw, never animate.\nimport { Geometry } from '../geometry/Geometry.js'\nimport { box as boxGeometry, icosphere } from '../geometry/generators.js'\nimport { InstancedMesh, Lines, Mesh, Points } from '../scene/drawables.js'\nimport { fail } from '../validate.js'\nimport { distinct } from './scales.js'\n\n/**\n * Where a row stacks: on the others at its x and in its depth series, negatives down from zero on\n * their own. One rule for the bars, the lines and areas, and the y domain they are drawn in.\n * @param {any} ch the spec's channels @param {any} row @param {number} v its y value\n * @returns {string}\n */\nexport function stackKey(ch, row, v) {\n const xv = ch.x?.get(row)\n return `${xv instanceof Date ? xv.getTime() : xv}|${ch.z ? ch.z.get(row) : ''}|${v < 0 ? '-' : '+'}`\n}\n\n/** @import { Node } from '../scene/Node.js' */\n/** @import { Scale, ColorScale } from './scales.js' */\n/** @import { Channel, normalise } from './spec.js' */\n\n/**\n * @typedef {object} MarkContext\n * @property {ReturnType<typeof normalise>} spec\n * @property {[number, number, number]} box\n * @property {{ x?: Scale, y?: Scale, z?: Scale }} scales\n * @property {Scale | null} size\n * @property {(row: any) => number[]} rgb a row's colour, sRGB 0-1\n * @property {'dark' | 'light'} theme\n * @property {'dim' | 'hide' | 'show'} overlap what the chart's labels do when covered\n * @property {(channel: Channel, value: any) => string} format\n * @property {(value: any) => import('../value/Color.js').Color} linkColor a network link's colour for a value\n */\n\n/**\n * What a mark draws for some rows: a state of `stride` numbers per item, and the rows behind them.\n * Keyed items can enter, move and leave one by one; unkeyed states only tween when their shapes match.\n * @typedef {object} Target\n * @property {any[]} rows\n * @property {any[] | null} keys\n * @property {Float32Array} state\n * @property {number} stride\n * @property {any} [shape] mark-specific layout that stays fixed through a tween (series lengths, grid size)\n */\n\n/**\n * @typedef {object} Mark\n * @property {Node[]} nodes\n * @property {(rows: any[]) => Target} layout\n * @property {(state: Float32Array, target: Target) => void} apply\n * @property {(item: Float32Array) => void} [enter] make one item's state absent (zero height, zero size)\n * @property {(dt: number) => void} [tick] per-frame work, such as flowing packets\n * @property {(hit: any) => any} [tooltipRows] which tooltip channels apply to a hit, when not the chart's\n */\n\n/** The theme's label class for values on marks. @param {MarkContext} ctx */\nconst valueClass = (ctx) => `phoria-value phoria-${ctx.theme}`\n\n/**\n * The label option for an InstancedMesh or Points, from the label channel.\n * @param {MarkContext} ctx @param {'above' | 'center'} place\n */\nexport function labelsOf(ctx, place) {\n const c = ctx.spec.channels.label\n if (!c) return null\n const p = c.priority\n const priority = typeof p === 'function' ? p : typeof p === 'string' ? (row) => Number(row[p]) || 0 : (p ?? 0)\n return { text: (row) => (row ? ctx.format(c, c.get(row)) : null), place, className: valueClass(ctx), priority, occlude: true, overlap: ctx.overlap }\n}\n\n/** A position along a scale; bands give their centre. @param {Scale | undefined} s @param {Channel | undefined} c @param {any} row */\nconst pos = (s, c, row) => (s && c ? s(c.get(row)) : 0)\n\n// --- bars ---------------------------------------------------------------------------------\n\n/** @param {MarkContext} ctx @returns {Mark} */\nexport function barMark(ctx) {\n let mesh = makeBars(64, ctx)\n const mark = {\n nodes: [mesh],\n layout(rows) {\n const { x, y, z } = ctx.scales, ch = ctx.spec.channels\n const share = ctx.spec.options.width ?? 0.7\n const w = (x.bandwidth ?? ctx.box[0] / 20) * share / (1 - 0.2)\n const d = z?.bandwidth !== undefined ? z.bandwidth * share / (1 - 0.2) : Math.min(w, ctx.box[2] * 0.8)\n const base = y(Math.max(y.domain[0], Math.min(0, y.domain[1])))\n // stacking: running totals per x (and z), in row order\n const stacks = new Map()\n const stride = 9, state = new Float32Array(rows.length * stride)\n rows.forEach((row, i) => {\n const v = Number(ch.y.get(row)) || 0\n let y0 = base, y1 = y(v)\n if (ctx.spec.options.stack) {\n const at = stackKey(ch, row, v)\n const below = stacks.get(at) ?? 0\n y0 = y(below)\n y1 = y(below + v)\n stacks.set(at, below + v)\n }\n state.set([pos(x, ch.x, row), pos(z, ch.z, row), y0, y1, w, d, ...ctx.rgb(row)], i * stride)\n })\n return { rows, keys: keysOf(ctx, rows), state, stride }\n },\n apply(state, target) {\n const n = state.length / target.stride\n if (n > mesh.instanceMatrices.length / 16) {\n // more bars than room: a bigger mesh, swapped in place\n const bigger = makeBars(n * 2, ctx)\n mesh.parent?.add(bigger)\n mesh.parent?.remove(mesh)\n mesh.dispose()\n mark.nodes[0] = mesh = bigger\n }\n mesh.count = n\n mesh.data = target.rows\n for (let i = 0; i < n; i++) {\n const [x, z, y0, y1, w, d, r, g, b] = state.subarray(i * 9, i * 9 + 9)\n mesh.setInstance(i, { position: [x, (y0 + y1) / 2, z], scale: [w, Math.max(1e-3, Math.abs(y1 - y0)), d], color: [r, g, b] })\n }\n },\n enter(item) {\n item[3] = item[2]\n },\n }\n return mark\n}\n\n/** @param {number} capacity @param {MarkContext} ctx */\nfunction makeBars(capacity, ctx) {\n const mesh = new InstancedMesh({ geometry: boxGeometry(1), material: { roughness: 0.55 }, count: capacity, labels: labelsOf(ctx, 'above') })\n mesh.count = 0\n return mesh\n}\n\n/** Keys for transitions: the key channel, an id field, or nothing (match by order). @param {MarkContext} ctx @param {any[]} rows */\nfunction keysOf(ctx, rows) {\n const k = ctx.spec.channels.key\n if (k) return rows.map((r) => k.get(r))\n if (rows.length && rows[0] && 'id' in rows[0]) return rows.map((r) => r.id)\n return rows.map((_, i) => i)\n}\n\n// --- points -------------------------------------------------------------------------------\n\n/** @param {MarkContext} ctx @returns {Mark} */\nexport function pointMark(ctx) {\n const sized = !!ctx.spec.channels.size?.field\n const unit = Math.min(...ctx.box) / 40\n const opacity = ctx.spec.channels.opacity?.value\n const material = { roughness: 0.4, ...(opacity !== undefined ? { opacity } : {}) }\n /** @type {any} */\n let node = sized\n ? new InstancedMesh({ geometry: icosphere({ radius: 1, detail: 1 }), material, count: 64, labels: labelsOf(ctx, 'above') })\n : new Points({ geometry: emptyPoints(64), material: { size: ctx.spec.channels.size?.value ?? unit * 1.4, vertexColors: true, ...material },\n labels: labelsOf(ctx, 'above') })\n if (sized) node.count = 0\n const mark = {\n nodes: [node],\n layout(rows) {\n const { x, y, z } = ctx.scales, ch = ctx.spec.channels\n const stride = sized ? 7 : 6, state = new Float32Array(rows.length * stride)\n rows.forEach((row, i) => {\n const p = [pos(x, ch.x, row), pos(y, ch.y, row), pos(z, ch.z, row)]\n state.set(sized ? [...p, ctx.size(ch.size.get(row)), ...ctx.rgb(row)] : [...p, ...ctx.rgb(row)], i * stride)\n })\n return { rows, keys: keysOf(ctx, rows), state, stride }\n },\n apply(state, target) {\n const n = state.length / target.stride\n node.data = target.rows\n if (sized) {\n if (n > node.instanceMatrices.length / 16) {\n const bigger = new InstancedMesh({ geometry: node.geometry, material: node.material, count: n * 2, labels: node.labels })\n node.parent?.add(bigger)\n node.parent?.remove(node)\n mark.nodes[0] = node = bigger\n }\n node.count = n\n for (let i = 0; i < n; i++) {\n const [x, y, z, s, r, g, b] = state.subarray(i * 7, i * 7 + 7)\n node.setInstance(i, { position: [x, y, z], scale: Math.max(1e-4, s), color: [r, g, b] })\n }\n return\n }\n const geometry = node.geometry\n if (n > geometry.vertexCount) node.geometry = emptyPoints(n * 2)\n const p = node.geometry.positions, c = node.geometry.colors\n for (let i = 0; i < n; i++) {\n p.set(state.subarray(i * 6, i * 6 + 3), i * 3)\n c.set(state.subarray(i * 6 + 3, i * 6 + 6), i * 3)\n }\n node.geometry.drawCount = n\n node.geometry.needsUpdate()\n if (node.geometry !== geometry) geometry.dispose()\n },\n enter(item) {\n // points rise from the floor; sized points grow from nothing\n if (sized) item[3] = 0\n else item[1] = 0\n },\n }\n return mark\n}\n\n/** @param {number} n */\nfunction emptyPoints(n) {\n const g = new Geometry({ positions: new Float32Array(n * 3), colors: new Float32Array(n * 3) })\n g.drawCount = 0\n return g\n}\n\n// --- lines and areas ----------------------------------------------------------------------\n\n/** @param {MarkContext} ctx @param {boolean} area @returns {Mark} */\nexport function lineMark(ctx, area) {\n const lines = new Lines({ geometry: new Geometry({ positions: [0, 0, 0, 0, 0, 0] }), material: { width: 2.5, vertexColors: true }, pickable: false })\n const dots = new Points({ geometry: emptyPoints(8), material: { size: 7, sizeAttenuation: false, vertexColors: true }, labels: labelsOf(ctx, 'above') })\n const fill = area ? new Mesh({ geometry: new Geometry({ positions: [0, 0, 0, 0, 0, 0, 0, 0, 0] }), material: { vertexColors: true, opacity: 0.55, doubleSided: true, unlit: true }, pickable: false }) : null\n return {\n nodes: fill ? [fill, lines, dots] : [lines, dots],\n layout(rows) {\n const { x, y, z } = ctx.scales, ch = ctx.spec.channels\n // series by colour, detail or z field; each in x order\n const by = ch.color?.field ? ch.color : ch.detail ?? (ch.z?.field ? ch.z : null)\n const groups = new Map()\n for (const row of rows) {\n const k = by ? String(by.get(row)) : ''\n if (!groups.has(k)) groups.set(k, [])\n groups.get(k).push(row)\n }\n // in order along the x axis, whatever its type (numbers, dates or categories)\n const series = [...groups.values()].map((g) => g.sort((a, b) => x(ch.x.get(a)) - x(ch.x.get(b))))\n // stacked areas: each series sits on the running total at its x\n const totals = new Map()\n const ordered = series.flat()\n const state = new Float32Array(ordered.length * 4)\n let i = 0\n for (const s of series) {\n for (const row of s) {\n const xv = ch.x.get(row), v = Number(ch.y.get(row)) || 0\n const at = stackKey(ch, row, v)\n const below = ctx.spec.options.stack ? totals.get(at) ?? 0 : 0\n if (ctx.spec.options.stack) totals.set(at, below + v)\n state.set([x(xv), y(below + v), pos(z, ch.z, row), y(below)], i * 4)\n i++\n }\n }\n return { rows: ordered, keys: null, state, stride: 4, shape: { lengths: series.map((s) => s.length), colors: series.map((s) => ctx.rgb(s[0])) } }\n },\n apply(state, target) {\n const { lengths, colors } = target.shape\n const seg = [], segColors = [], dotPos = [], dotColors = [], tri = [], triColors = [], index = []\n let i = 0\n lengths.forEach((n, s) => {\n const c = colors[s]\n for (let k = 0; k < n; k++, i++) {\n const [px, py, pz, base] = state.subarray(i * 4, i * 4 + 4)\n dotPos.push(px, py, pz)\n dotColors.push(...c)\n if (k > 0) {\n seg.push(...state.subarray((i - 1) * 4, (i - 1) * 4 + 3), px, py, pz)\n segColors.push(...c, ...c)\n }\n if (fill) {\n const v = triColors.length / 3\n tri.push(px, py, pz, px, base, pz)\n triColors.push(...c, ...c)\n if (k > 0) index.push(v - 2, v - 1, v, v - 1, v + 1, v)\n }\n }\n })\n lines.geometry = replace(lines.geometry, seg.length ? { positions: seg, colors: segColors } : { positions: [0, 0, 0, 0, 0, 0] })\n dots.geometry = replace(dots.geometry, { positions: dotPos.length ? dotPos : [0, 0, 0], colors: dotPos.length ? dotColors : [0, 0, 0] })\n dots.geometry.drawCount = dotPos.length / 3\n // dense series get smaller dots, so the line still reads\n dots.material.size = Math.max(...lengths, 0) > 40 ? 4 : 7\n dots.data = target.rows\n if (fill) fill.geometry = replace(fill.geometry, index.length ? { positions: tri, colors: triColors, indices: index } : { positions: [0, 0, 0, 0, 0, 0, 0, 0, 0] })\n },\n }\n}\n\n/** A new geometry in place of an old one, freeing the old one's GPU copy. @param {Geometry} old @param {any} options */\nfunction replace(old, options) {\n old.dispose()\n return new Geometry(options)\n}\n\n// --- surfaces -----------------------------------------------------------------------------\n\n/** @param {MarkContext} ctx @returns {Mark} */\nexport function surfaceMark(ctx) {\n const mesh = new Mesh({ geometry: new Geometry({ positions: [0, 0, 0, 0, 0, 0, 0, 0, 0] }), material: { vertexColors: true, roughness: 0.6, doubleSided: true } })\n return {\n nodes: [mesh],\n layout(rows) {\n const { x, y, z } = ctx.scales, ch = ctx.spec.channels\n const xs = distinct(rows.map((r) => ch.x.get(r))), zs = distinct(rows.map((r) => ch.z.get(r)))\n const grid = new Map(rows.map((r) => [`${+ch.x.get(r)}|${+ch.z.get(r)}|${ch.x.get(r)}|${ch.z.get(r)}`, r]))\n const cell = (a, b) => grid.get(`${+a}|${+b}|${a}|${b}`)\n const missing = xs.length * zs.length - grid.size\n if (missing > 0) {\n const gap = xs.flatMap((a) => zs.map((b) => [a, b])).find(([a, b]) => !cell(a, b))\n fail('chart()', `a surface needs a value for every x and z pair - ${missing} of ${xs.length * zs.length} are missing (first: x ${gap[0]}, z ${gap[1]})`)\n }\n const ordered = [], state = new Float32Array(xs.length * zs.length * 6)\n let i = 0\n for (const b of zs) {\n for (const a of xs) {\n const row = cell(a, b)\n ordered.push(row)\n state.set([x(a), y(Number(ch.y.get(row)) || 0), z(b), ...ctx.rgb(row)], i++ * 6)\n }\n }\n return { rows: ordered, keys: null, state, stride: 6, shape: { nx: xs.length, nz: zs.length } }\n },\n apply(state, target) {\n const { nx, nz } = target.shape\n const positions = [], colors = [], indices = []\n for (let i = 0; i < nx * nz; i++) {\n positions.push(...state.subarray(i * 6, i * 6 + 3))\n colors.push(...state.subarray(i * 6 + 3, i * 6 + 6))\n }\n for (let j = 0; j < nz - 1; j++) {\n for (let i = 0; i < nx - 1; i++) {\n const a = j * nx + i, b = a + 1, c = a + nx, d = c + 1\n indices.push(a, c, b, b, c, d)\n }\n }\n mesh.geometry = replace(mesh.geometry, { positions, colors, indices })\n // a row per vertex: picking gives the nearest grid point's row\n mesh.data = target.rows\n },\n }\n}\n\n","// The network mark: nodes as instanced spheres, links as lines, laid out by force, by tiers or from\n// the data. Layouts are deterministic (seeded), and updates start from where nodes already are, so a\n// live map changes colour without moving.\nimport { Geometry } from '../geometry/Geometry.js'\nimport { icosphere } from '../geometry/generators.js'\nimport { InstancedMesh, Lines, Points } from '../scene/drawables.js'\nimport { Color } from '../value/Color.js'\nimport { describe, fail } from '../validate.js'\nimport { labelsOf } from './marks.js'\n\n/** @import { MarkContext, Mark } from './marks.js' */\n\n/** Seeded random numbers (mulberry32): the same graph lays out the same way every time. @param {number} seed */\nfunction random(seed) {\n return () => {\n seed = (seed + 0x6d2b79f5) | 0\n let t = Math.imul(seed ^ (seed >>> 15), 1 | seed)\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n}\n\n// link widths in pixels for thin, medium and thick links\nconst WIDTHS = [1.2, 2.5, 4.5]\n\n/**\n * @param {MarkContext} ctx\n * @returns {Mark}\n */\nexport function networkMark(ctx) {\n const o = ctx.spec.options\n const keyOf = keyGetter(ctx)\n const linkCh = ctx.spec.link\n const source = o.source ?? 'source', target = o.target ?? 'target'\n /** @type {Map<any, number[]>} layout positions by key, kept between updates for stability */\n let placed = new Map()\n const makeNodes = (/** @type {number} */ capacity) => new InstancedMesh({ geometry: icosphere({ radius: 1, detail: 2 }), material: { roughness: 0.35 }, count: capacity, labels: labelsOf(ctx, 'above') })\n let nodesMesh = makeNodes(Math.max(8, ctx.spec.rows.length * 2))\n nodesMesh.count = 0\n // links in up to three widths; each segment carries its link's row\n const linkNodes = WIDTHS.map((width) => new Lines({ geometry: new Geometry({ positions: [0, 0, 0, 0, 0, 0] }), material: { width, vertexColors: true }, data: [] }))\n const active = new Lines({ geometry: new Geometry({ positions: [] }), material: { width: 4, color: '#7fd3ff' }, pickable: false, visible: false })\n // packets small beside the nodes, so the traffic reads as motion along the links, not more nodes\n const packets = linkCh.flow ? new Points({ geometry: new Geometry({ positions: [] }), material: { size: 0.012 * Math.min(...ctx.box), color: '#bff0ff' }, pickable: false }) : null\n /** @type {{ a: number, b: number, speed: number, phase: number }[]} */\n let flows = []\n /** the drawn node positions, by row index, as of the last apply */\n let at = []\n /** @type {any[]} */ let links = []\n /** @type {any[]} */ let rowsNow = []\n /** the hovered node by its key, not its row - rows move and go when the data changes; null for none */\n /** @type {unknown} */ let hovered = null\n\n const mark = {\n nodes: [...linkNodes, active, nodesMesh, ...(packets ? [packets] : [])],\n layout(rows) {\n const keys = rows.map(keyOf)\n const index = new Map(keys.map((k, i) => [k, i]))\n links = ctx.spec.links.filter((l, i) => {\n const a = l[source], b = l[target]\n if (a === undefined || b === undefined) fail('chart()', `link ${i} has no '${a === undefined ? source : target}' - links name their ends with source: '${source}', target: '${target}' (set 'source' and 'target' to your field names)`)\n if (!ctx.spec.rows.some((r) => keyOf(r) === a)) fail('chart()', `link ${i}: ${source} ${describe(a)} names no node`)\n if (!ctx.spec.rows.some((r) => keyOf(r) === b)) fail('chart()', `link ${i}: ${target} ${describe(b)} names no node`)\n // links to hidden nodes are hidden too\n return index.has(a) && index.has(b)\n })\n const pairs = links.map((l) => [index.get(l[source]), index.get(l[target])])\n const positions = place(rows, keys, pairs)\n const stride = 7, state = new Float32Array(rows.length * stride)\n rows.forEach((row, i) => state.set([...positions[i], ctx.size ? ctx.size(ctx.spec.channels.size.get(row)) : 0.06 * Math.min(...ctx.box), ...ctx.rgb(row)], i * stride))\n return { rows, keys, state, stride, shape: { pairs: links.map((l) => [l[source], l[target]]) } }\n },\n apply(state, t) {\n const n = state.length / t.stride\n rowsNow = t.rows\n // a hovered node that has gone from the data is hovered no longer\n if (hovered !== null && !rowsNow.some((r) => keyOf(r) === hovered)) {\n hovered = null\n active.visible = false\n }\n if (n > nodesMesh.instanceMatrices.length / 16) {\n // more nodes than room - arriving and leaving ones together, in a transition: a bigger mesh,\n // swapped in place, keeping its hover handler\n const bigger = makeNodes(n * 2)\n if (neighbours) bigger.on('hover', hover)\n nodesMesh.parent?.add(bigger)\n nodesMesh.parent?.remove(nodesMesh)\n nodesMesh.dispose()\n mark.nodes[mark.nodes.indexOf(nodesMesh)] = bigger\n nodesMesh = bigger\n }\n nodesMesh.count = n\n nodesMesh.data = t.rows\n const keys = t.rows.map(keyOf)\n const index = new Map(keys.map((k, i) => [k, i]))\n at = []\n for (let i = 0; i < n; i++) {\n const [x, y, z, s, r, g, b] = state.subarray(i * 7, i * 7 + 7)\n at.push([x, y, z])\n nodesMesh.setInstance(i, { position: [x, y, z], scale: Math.max(1e-4, s), color: dimmed(i, [r, g, b]) })\n }\n // links follow their nodes, so they move with any transition\n const byWidth = WIDTHS.map(() => ({ positions: [], colors: [], rows: [] }))\n flows = []\n links.forEach((link, li) => {\n const a = index.get(link[source]), b = index.get(link[target])\n if (a === undefined || b === undefined) return\n const bucket = byWidth[widthClass(link)]\n const c = linkColor(link)\n bucket.positions.push(...at[a], ...at[b])\n bucket.colors.push(...c, ...c)\n bucket.rows.push(link)\n if (linkCh.flow) flows.push({ a, b, speed: flowSpeed(link), phase: (li * 0.618) % 1 })\n })\n linkNodes.forEach((node, i) => {\n const bucket = byWidth[i]\n node.geometry.dispose()\n node.geometry = new Geometry(bucket.positions.length ? { positions: bucket.positions, colors: bucket.colors } : { positions: [0, 0, 0, 0, 0, 0] })\n node.visible = bucket.positions.length > 0\n node.data = bucket.rows\n })\n if (hovered !== null) showNeighbours(hovered)\n },\n enter(item) {\n item[3] = 0\n },\n tick(dt) {\n if (!packets || !flows.length) return\n const p = new Float32Array(flows.length * 3)\n flows.forEach((f, i) => {\n f.phase = (f.phase + dt * f.speed) % 1\n const a = at[f.a], b = at[f.b]\n for (let k = 0; k < 3; k++) p[i * 3 + k] = a[k] + (b[k] - a[k]) * f.phase\n })\n if (packets.geometry.vertexCount !== flows.length) {\n packets.geometry.dispose()\n packets.geometry = new Geometry({ positions: p })\n } else {\n packets.geometry.positions.set(p)\n packets.geometry.needsUpdate()\n }\n },\n tooltipRows(hit) {\n return linkNodes.includes(hit.node) ? 'link' : 'node'\n },\n }\n\n // neighbour highlight: the hovered node's links light up, and nodes it doesn't touch dim\n const neighbours = (o.highlight ?? 'neighbours') === 'neighbours'\n if (neighbours) {\n // on the nodes themselves, so the chart's own onHover stays the app's: the view tells this one\n // the hit while the pointer is over a node, and null when it leaves them\n nodesMesh.on('hover', hover)\n }\n /** @param {any} hit */\n function hover(hit) {\n const key = hit && hit.node === nodesMesh && hit.instance !== null ? keyOf(rowsNow[hit.instance]) : null\n if (key === hovered) return\n hovered = key\n active.visible = key !== null\n if (key !== null) showNeighbours(key)\n // recolour every node for the dimming, or back\n for (let k = 0; k < nodesMesh.count; k++) nodesMesh.setColor(k, dimmed(k, ctx.rgb(rowsNow[k])))\n }\n\n /** @param {unknown} key */\n function showNeighbours(key) {\n const p = []\n for (const l of links) {\n if (l[source] !== key && l[target] !== key) continue\n const a = rowsNow.findIndex((r) => keyOf(r) === l[source]), b = rowsNow.findIndex((r) => keyOf(r) === l[target])\n if (a >= 0 && b >= 0) p.push(...at[a], ...at[b])\n }\n active.geometry.dispose()\n active.geometry = new Geometry({ positions: p })\n }\n\n /** A node's colour, dimmed while another node and its neighbours are highlighted. @param {number} k @param {number[]} rgb */\n function dimmed(k, rgb) {\n if (hovered === null || !neighbours) return rgb\n const other = keyOf(rowsNow[k])\n if (other === hovered) return rgb\n const near = links.some((l) => (l[source] === hovered && l[target] === other) || (l[target] === hovered && l[source] === other))\n if (near) return rgb\n const c = new Color().setSRGB(rgb[0], rgb[1], rgb[2]).lerp(ctx.theme === 'light' ? '#ffffff' : '#202024', 0.65)\n return c.toSRGB()\n }\n\n /** @param {any} link */\n function widthClass(link) {\n const c = linkCh.width\n if (!c) return 0\n if (c.field === null) return c.value >= 3.5 ? 2 : c.value >= 2 ? 1 : 0\n const values = ctx.spec.links.map((l) => Number(c.get(l)) || 0)\n const max = Math.max(...values) || 1\n return Math.min(2, Math.floor((Number(c.get(link)) || 0) / max * 2.999))\n }\n\n /** @param {any} link @returns {number[]} */\n function linkColor(link) {\n const c = linkCh.color\n const base = ctx.theme === 'light' ? '#9aa3b2' : '#4a5266'\n if (!c) return Color.fromInput(base).toSRGB()\n if (c.field === null) return Color.fromInput(c.value).toSRGB()\n return ctx.linkColor(c.get(link)).toSRGB()\n }\n\n /** @param {any} link */\n function flowSpeed(link) {\n const c = linkCh.flow\n if (c.field === null) return 0.4\n const max = Math.max(...ctx.spec.links.map((l) => Number(c.get(l)) || 0)) || 1\n return 0.15 + 0.6 * (Number(c.get(link)) || 0) / max\n }\n\n /**\n * Node positions in the chart box, by layout.\n * @param {any[]} rows @param {any[]} keys @param {number[][]} pairs\n * @returns {number[][]}\n */\n function place(rows, keys, pairs) {\n const [w, h, d] = ctx.box\n const layout = o.layout ?? 'force'\n if (layout === 'given') {\n const { x, y, z } = ctx.scales, ch = ctx.spec.channels\n return rows.map((r) => [x && ch.x ? x(ch.x.get(r)) : 0, y && ch.y ? y(ch.y.get(r)) : h / 2, z && ch.z ? z(ch.z.get(r)) : 0])\n }\n if (layout && typeof layout === 'object' && 'tiers' in layout) return tiers(rows, keys, pairs, layout, [w, h, d])\n if (layout !== 'force') fail('chart()', `layout ${describe(layout)} - expected 'force', 'given' or { tiers: 'field' }`)\n const raw = force(keys, pairs)\n // fit the layout into the box, keeping its proportions\n const lo = [Infinity, Infinity, Infinity], hi = [-Infinity, -Infinity, -Infinity]\n for (const p of raw) for (let k = 0; k < 3; k++) { lo[k] = Math.min(lo[k], p[k]); hi[k] = Math.max(hi[k], p[k]) }\n const span = Math.max(...hi.map((v, k) => v - lo[k]), 1e-6)\n const s = Math.min(w, o.flat ? d : Math.min(h, d)) * 0.9 / span\n const c = hi.map((v, k) => (v + lo[k]) / 2)\n return raw.map((p) => [(p[0] - c[0]) * s, o.flat ? 0 : (p[1] - c[1]) * s + h / 2, (p[2] - c[2]) * s])\n }\n\n /**\n * An organic layout by stress: nodes are placed so the distance between any two is as near as it\n * can be to the number of links between them. Every link comes out about the same length, a node\n * with one link sits beside its neighbour rather than flung out, and the whole spreads evenly -\n * where a force layout leaves a dense middle and far-off leaves, which then set the scale.\n */\n function force(keys, pairs) {\n const n = keys.length, rand = random(o.seed ?? 1), dims = o.flat ? [0, 2] : [0, 1, 2]\n const warm = keys.some((key) => placed.has(key))\n const steps = o.steps ?? (warm ? 60 : 300)\n // links between every pair: breadth first from each node; parts not joined sit a hop beyond the furthest\n const near = keys.map(() => /** @type {number[]} */ ([]))\n for (const [a, b] of pairs) {\n near[a].push(b)\n near[b].push(a)\n }\n const hops = new Float32Array(n * n).fill(Infinity)\n let furthest = 1\n for (let s = 0; s < n; s++) {\n const queue = [s]\n hops[s * n + s] = 0\n for (let q = 0; q < queue.length; q++) {\n const at = queue[q], h = hops[s * n + at] + 1\n for (const t of near[at]) {\n if (hops[s * n + t] !== Infinity) continue\n hops[s * n + t] = h\n furthest = Math.max(furthest, h)\n queue.push(t)\n }\n }\n }\n const p = keys.map((key, i) => {\n if (placed.has(key)) return [...placed.get(key)]\n // a new node starts beside a neighbour that is already placed, or anywhere\n const next = near[i].find((j) => placed.has(keys[j]))\n const from = next === undefined ? [0, 0, 0] : placed.get(keys[next])\n const spread = next === undefined ? Math.sqrt(n) : 0.5\n return [from[0] + (rand() - 0.5) * spread, o.flat ? 0 : from[1] + (rand() - 0.5) * spread, from[2] + (rand() - 0.5) * spread]\n })\n // each node in turn moves to where its distances to all the others fit best, nearer ones counting more\n const to = [0, 0, 0]\n for (let step = 0; step < steps; step++) {\n for (let i = 0; i < n; i++) {\n to.fill(0)\n let weights = 0\n for (let j = 0; j < n; j++) {\n if (i === j) continue\n const h = hops[i * n + j], want = h === Infinity ? furthest + 1 : h, w = 1 / (want * want)\n const dx = p[i][0] - p[j][0], dy = p[i][1] - p[j][1], dz = p[i][2] - p[j][2]\n const len = Math.hypot(dx, dy, dz) || 1e-6\n to[0] += w * (p[j][0] + want * dx / len)\n to[1] += w * (p[j][1] + want * dy / len)\n to[2] += w * (p[j][2] + want * dz / len)\n weights += w\n }\n if (weights) for (const c of dims) p[i][c] = to[c] / weights\n }\n }\n placed = new Map(keys.map((key, i) => [key, p[i]]))\n return p\n }\n\n return mark\n}\n\n/**\n * Tiers: rings stacked top to bottom by a field, each ring ordered to sit under its links.\n * @param {any[]} rows @param {any[]} keys @param {number[][]} pairs\n * @param {{ tiers: string, order?: any[] }} layout @param {number[]} box\n */\nfunction tiers(rows, keys, pairs, layout, [w, h, d]) {\n const field = layout.tiers\n if (!rows.length) return []\n if (!(field in rows[0])) fail('chart()', `layout: { tiers: '${field}' } - '${field}' isn't a node field`)\n const order = layout.order ?? [...new Set(rows.map((r) => r[field]))]\n const tierOf = rows.map((r) => Math.max(0, order.indexOf(r[field])))\n const count = Math.max(...tierOf) + 1\n const angle = new Array(rows.length).fill(0)\n const out = new Array(rows.length)\n const radius = Math.min(w, d) / 2 * 0.92\n for (let t = 0; t < count; t++) {\n const members = rows.map((_, i) => i).filter((i) => tierOf[i] === t)\n // sit under the nodes they link to in the tier above: order by those nodes' angles\n const pull = (i) => {\n const above = pairs.filter(([a, b]) => a === i || b === i).map(([a, b]) => (a === i ? b : a)).filter((j) => tierOf[j] < t)\n return above.length ? above.reduce((s, j) => s + angle[j], 0) / above.length : members.indexOf(i)\n }\n if (t > 0) members.sort((a, b) => pull(a) - pull(b))\n const r = members.length === 1 ? 0 : t === 0 ? radius * 0.25 : radius * (0.35 + 0.65 * t / Math.max(1, count - 1))\n members.forEach((i, m) => {\n angle[i] = (m + 0.5) / members.length * Math.PI * 2\n out[i] = [Math.cos(angle[i]) * r, h * (1 - t / Math.max(1, count - 1)), Math.sin(angle[i]) * r]\n })\n }\n void keys\n return out\n}\n\n/** @param {MarkContext} ctx */\nfunction keyGetter(ctx) {\n const k = ctx.spec.channels.key\n if (k) return (row) => k.get(row)\n if (ctx.spec.rows.length && !('id' in ctx.spec.rows[0])) fail('chart()', \"network nodes need an 'id' field, or key: 'yourIdField' - links name nodes by it\")\n return (row) => row.id\n}\n","// Chart specs in, normalised specs out: channels resolved to fields or constants, types inferred,\n// and every mistake explained - including Vega-Lite, ECharts and Plotly habits - since a spec is\n// exactly what an agent writes.\nimport { Color } from '../value/Color.js'\nimport { checkNumber, describe, didYouMean, fail } from '../validate.js'\nimport { toDate } from './scales.js'\n\n/** @typedef {'quantitative' | 'nominal' | 'ordinal' | 'temporal'} FieldType */\n/** @typedef {'bar' | 'point' | 'line' | 'area' | 'surface' | 'network'} Mark */\n\n/**\n * A channel after normalising: a field (with a type and a getter) or a constant value.\n * @typedef {object} Channel\n * @property {string | null} field\n * @property {any} value a constant, when there is no field\n * @property {FieldType} type\n * @property {string} title for axes, legends and tooltips\n * @property {any} format Intl options or a function\n * @property {Record<string, any>} scale scale options: domain, range, scheme, zero, nice, type\n * @property {Record<string, any> | false} axis\n * @property {(row: any) => any} get the row's value (dates parsed)\n * @property {any} [priority] labels: a number, a field name or a function\n */\n\nexport const MARKS = /** @type {Mark[]} */ (['bar', 'point', 'line', 'area', 'surface', 'network'])\nexport const CHANNELS = ['x', 'y', 'z', 'color', 'size', 'opacity', 'label', 'key', 'detail']\nexport const OPTIONS = ['mark', 'data', 'encoding', 'tooltip', 'box', 'stack', 'width', 'layout', 'flat', 'steps', 'seed',\n 'source', 'target', 'link', 'highlight', 'legend', 'theme', 'overlap', 'transition', 'title', '$schema', 'description', ...CHANNELS]\nexport const CHANNEL_OPTIONS = ['field', 'type', 'title', 'format', 'scale', 'axis', 'value', 'priority', 'legend']\n\n// what other chart libraries call things\nexport const OPTION_HINTS = {\n series: \"phoria2 charts map fields to channels instead of listing series - e.g. { mark: 'bar', x: 'month', y: 'sales', color: 'region' }\",\n xAxis: \"axes come from the channels - use x: { field, axis: { title } }\",\n yAxis: \"axes come from the channels - use y: { field, axis: { title } }\",\n zAxis: \"axes come from the channels - use z: { field, axis: { title } }\",\n type: \"use mark: 'bar' | 'point' | 'line' | 'area' | 'surface' | 'network'\",\n transform: \"transforms aren't supported - filter, sum or sort the rows before charting them\",\n selection: \"use view.on('click', (hit) => ...) or a chart's onClick; hit.datum is the row\",\n params: \"use view.on('click', (hit) => ...) or a chart's onClick; hit.datum is the row\",\n facet: 'small multiples aren\\'t supported - make one chart (or one View) per panel',\n repeat: 'small multiples aren\\'t supported - make one chart (or one View) per panel',\n layer: 'layers aren\\'t supported yet - add several charts to the same scene with the same box',\n hconcat: 'put each chart in its own View', vconcat: 'put each chart in its own View', concat: 'put each chart in its own View',\n height: \"the canvas sets the size in pixels; 'box' sets the chart's size in the scene\",\n colour: \"use 'color'\", colors: \"use color: { field, scale: { range: [...] } }\",\n nodes: \"a network's nodes and links go in data: { nodes, links }\", links: \"a network's nodes and links go in data: { nodes, links }\",\n}\nconst MARK_HINTS = {\n scatter: 'point', scatter3d: 'point', circle: 'point', dots: 'point', column: 'bar', bars: 'bar', histogram: 'bar',\n heatmap: 'surface', mesh3d: 'surface', graph: 'network', tree: 'network', ribbon: 'area', lines: 'line', rect: 'bar',\n}\nexport const CHANNEL_HINTS = {\n overlap: \"set overlap on the chart - { overlap: 'dim' | 'hide' | 'show' } - it applies to all the chart's labels\",\n aggregate: 'aggregate the rows first (e.g. sum per month) - charts draw rows as given',\n bin: 'bin the rows first - charts draw rows as given',\n timeUnit: 'round the dates in the rows first - charts draw rows as given',\n sort: 'sort with scale: { domain: [...] } in the order you want',\n stack: \"stacking is the chart's option: stack: true\",\n}\n\n/**\n * @param {Record<string, any>} input the spec as written\n * @returns {{ mark: Mark, rows: any[], links: any[], fields: string[], channels: Record<string, Channel>,\n * tooltip: Channel[] | ((hit: any) => any) | null, link: Record<string, Channel>, options: Record<string, any> }}\n */\nexport function normalise(input) {\n if (!input || typeof input !== 'object' || Array.isArray(input)) fail('chart()', `expected a spec such as { mark: 'bar', data, x, y }, got ${describe(input)}`)\n for (const key of Object.keys(input)) {\n if (OPTIONS.includes(key)) continue\n fail('chart()', `unknown option '${key}' - ${OPTION_HINTS[key] ?? `expected ${OPTIONS.filter((k) => k[0] !== '$').join(', ')}${didYouMean(key, OPTIONS)}`}`)\n }\n if (typeof input.width === 'number' && input.width > 1) fail('chart()', `'width' is a bar's share of its band (0-1); in Vega-Lite it is pixels - here the canvas sets the size`)\n\n const mark = markOf(input.mark)\n const { rows, links } = dataOf(input.data, mark)\n const fields = fieldsOf(rows)\n // Vega-Lite nests channels under 'encoding'; flat channels win if both are given\n const encoding = { ...(input.encoding ?? {}) }\n for (const key of Object.keys(encoding)) {\n if (!CHANNELS.includes(key) && key !== 'tooltip') fail('chart()', `encoding '${key}' isn't a channel we have - channels are ${CHANNELS.join(', ')}, tooltip`)\n }\n /** @type {Record<string, Channel>} */\n const channels = {}\n for (const name of CHANNELS) {\n const spec = input[name] ?? encoding[name]\n if (spec !== undefined && spec !== null) channels[name] = channel(name, spec, rows, fields)\n }\n if (mark === 'network') {\n for (const name of ['x', 'y', 'z']) {\n if (channels[name] && input.layout !== 'given') fail('chart()', `${name} on a 'network' places its nodes - add layout: 'given' to use positions from the data`)\n }\n } else {\n for (const name of mark === 'surface' ? ['x', 'z', 'y'] : ['x', 'y']) {\n if (!channels[name]) fail('chart()', `a '${mark}' chart needs ${name} - e.g. ${name}: '${fields[0] ?? 'field'}'`)\n // bars, lines, areas and surfaces are laid out along these scales; only points can sit at a constant\n if (mark !== 'point' && channels[name].field === null) {\n fail('chart()', `${name} on a '${mark}' chart lays its marks out along a scale - it needs a field, not a constant value - e.g. ${name}: '${fields[0] ?? 'field'}'`)\n }\n }\n }\n\n const tooltipSpec = input.tooltip ?? encoding.tooltip\n const markTooltip = typeof input.mark === 'object' ? input.mark.tooltip : undefined\n const tooltip = tooltipOf(tooltipSpec ?? (markTooltip === false ? false : undefined), channels, rows, fields)\n\n /** @type {Record<string, Channel>} */\n const link = {}\n if (input.link !== undefined) {\n if (mark !== 'network') fail('chart()', \"'link' sets a network's link channels - it needs mark: 'network'\")\n const linkFields = fieldsOf(links)\n for (const [name, spec] of Object.entries(input.link)) {\n if (!['width', 'color', 'opacity', 'flow', 'tooltip'].includes(name)) fail('chart()', `link has no '${name}' - link channels are width, color, opacity, flow, tooltip`)\n if (name !== 'tooltip') link[name] = channel(`link.${name}`, spec, links, linkFields)\n }\n if (input.link.tooltip !== undefined) link.tooltip = /** @type {any} */ (tooltipOf(input.link.tooltip, {}, links, linkFields))\n }\n\n const options = {}\n for (const key of OPTIONS) if (!CHANNELS.includes(key) && !['mark', 'data', 'encoding', 'tooltip', 'link'].includes(key) && input[key] !== undefined) options[key] = input[key]\n // a network's force layout: how long it settles, and where it starts\n if (options.steps !== undefined && (!Number.isInteger(options.steps) || options.steps < 1)) {\n fail('chart()', `'steps' is how many steps the force layout takes, a whole number of 1 or more, got ${describe(options.steps)}`)\n }\n if (options.seed !== undefined) checkNumber('chart()', 'seed', options.seed)\n if (options.legend?.ticks !== undefined) checkTicks('legend', options.legend.ticks)\n if (options.box !== undefined && (!Array.isArray(options.box) || options.box.length !== 3 || !options.box.every((n) => n > 0))) {\n fail('chart()', `'box' is the chart's size in the scene, [x, y, z] above 0, got ${describe(options.box)}`)\n }\n return { mark, rows, links, fields, channels, tooltip, link, options }\n}\n\n/** @param {unknown} v @returns {Mark} */\nfunction markOf(v) {\n let mark = v\n if (mark && typeof mark === 'object') {\n // Vega-Lite's { type: 'bar', tooltip: true }\n for (const key of Object.keys(mark)) {\n if (key !== 'type' && key !== 'tooltip') fail('chart()', `mark option '${key}' isn't supported - use the chart's options (width, stack, ...) or style the chart's nodes`)\n }\n mark = /** @type {any} */ (mark).type\n }\n if (typeof mark !== 'string') fail('chart()', `'mark' is required: one of ${MARKS.map((m) => `'${m}'`).join(', ')}`)\n if (!MARKS.includes(/** @type {Mark} */ (mark))) {\n const hint = MARK_HINTS[mark]\n if (mark === 'pie' || mark === 'arc' || mark === 'donut') fail('chart()', \"pie and donut charts aren't supported - in 3D they distort values; use mark: 'bar'\")\n fail('chart()', `mark '${mark}' - ${hint ? `use '${hint}'` : `expected one of ${MARKS.map((m) => `'${m}'`).join(', ')}${didYouMean(mark, MARKS)}`}`)\n }\n return /** @type {Mark} */ (mark)\n}\n\n/** @param {any} data @param {Mark} mark */\nfunction dataOf(data, mark) {\n if (data && typeof data === 'object' && !Array.isArray(data) && 'url' in data) {\n fail('chart()', \"data: { url } isn't loaded for you - fetch the rows and pass data: rows\")\n }\n if (mark === 'network') {\n if (!data || !Array.isArray(data.nodes) || !Array.isArray(data.links)) fail('chart()', `a network's data is { nodes: [...], links: [...] }, got ${describe(data)}`)\n return { rows: data.nodes, links: data.links }\n }\n const rows = Array.isArray(data) ? data : data && Array.isArray(data.values) ? data.values : null\n if (!rows) fail('chart()', `'data' must be an array of rows (objects), or { values: [...] }, got ${describe(data)}`)\n if (rows.some((r) => !r || typeof r !== 'object')) fail('chart()', \"every row in 'data' must be an object, such as { month: 'Jan', sales: 41 }\")\n return { rows, links: [] }\n}\n\n/** Field names from the first rows. @param {any[]} rows @returns {string[]} */\nfunction fieldsOf(rows) {\n const names = new Set()\n for (const row of rows.slice(0, 50)) for (const k of Object.keys(row)) names.add(k)\n return [...names]\n}\n\n/** @param {any[]} rows @param {string} field @returns {FieldType} */\nfunction inferType(rows, field) {\n const v = rows.find((r) => r[field] !== null && r[field] !== undefined)?.[field]\n if (typeof v === 'number') return 'quantitative'\n if (v instanceof Date || (typeof v === 'string' && /^\\d{4}-\\d{2}(-\\d{2})?([T ][\\d:.]+Z?)?$/.test(v))) return 'temporal'\n return 'nominal'\n}\n\n/**\n * @param {string} name @param {any} spec @param {any[]} rows @param {string[]} fields\n * @returns {Channel}\n */\nfunction channel(name, spec, rows, fields) {\n const owner = 'chart()'\n /** @type {Record<string, any>} */\n let o\n if (typeof spec === 'string') {\n if (fields.includes(spec)) o = { field: spec }\n else if (/color|colour/.test(name) && isColor(spec)) o = { value: spec }\n else fail(owner, `${name}: field '${spec}' isn't in the data - fields are ${fields.join(', ') || '(none)'}${didYouMean(spec, fields)}`)\n } else if (typeof spec === 'number' && ['size', 'opacity', 'link.width', 'link.opacity', 'link.flow'].includes(name)) {\n o = { value: spec }\n } else if (spec && typeof spec === 'object' && !Array.isArray(spec)) {\n o = spec\n for (const key of Object.keys(o)) {\n if (!CHANNEL_OPTIONS.includes(key)) fail(owner, `${name}: '${key}' - ${CHANNEL_HINTS[key] ?? `unknown; a channel takes ${CHANNEL_OPTIONS.join(', ')}`}`)\n }\n if (o.field !== undefined && !fields.includes(o.field)) {\n fail(owner, `${name}: field '${o.field}' isn't in the data - fields are ${fields.join(', ') || '(none)'}${didYouMean(String(o.field), fields)}`)\n }\n if (o.field === undefined && o.value === undefined) fail(owner, `${name} needs a field (or a constant value)`)\n } else {\n // a size given as [x, y, z] meant the chart's size\n if (name === 'size' && Array.isArray(spec)) fail(owner, \"'size' is a channel - the chart's size in the scene is 'box: [x, y, z]'\")\n return fail(owner, `${name} must be a field name or { field, ... }, got ${describe(spec)}`)\n }\n if (o.axis?.ticks !== undefined) checkTicks(`${name}: axis`, o.axis.ticks)\n const field = o.field ?? null\n const type = o.type ?? (field ? inferType(rows, field) : 'nominal')\n if (!['quantitative', 'nominal', 'ordinal', 'temporal'].includes(type)) {\n fail(owner, `${name}: type '${type}' - expected 'quantitative', 'nominal', 'ordinal' or 'temporal'${didYouMean(String(type), ['quantitative', 'nominal', 'ordinal', 'temporal'])}`)\n }\n const get = field === null ? () => o.value : type === 'temporal' ? (r) => toDate(r[field]) : (r) => r[field]\n return { field, value: o.value, type, title: o.title ?? field ?? name, format: o.format, scale: o.scale ?? {}, axis: o.axis ?? {}, get,\n priority: o.priority }\n}\n\n/** Ticks are a list of the values to mark, or about how many. @param {string} what @param {unknown} ticks */\nfunction checkTicks(what, ticks) {\n if (Array.isArray(ticks) || (Number.isInteger(ticks) && /** @type {number} */ (ticks) > 0)) return\n fail('chart()', `${what} ticks are a list of the values to mark, such as [0, 25, 50, 75, 100], or about how many, got ${describe(ticks)}`)\n}\n\n/** @param {string} s */\nfunction isColor(s) {\n try {\n Color.fromInput(s)\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Tooltip rows from fields, a function, or (by default) every channel with a field.\n * @param {any} spec @param {Record<string, Channel>} channels @param {any[]} rows @param {string[]} fields\n */\nfunction tooltipOf(spec, channels, rows, fields) {\n if (spec === false || spec === null) return null\n if (typeof spec === 'function') return spec\n if (spec === undefined || spec === true) {\n const seen = new Set()\n return Object.entries(channels).filter(([n, c]) => c.field && n !== 'key' && !seen.has(c.field) && seen.add(c.field)).map(([, c]) => c)\n }\n const list = Array.isArray(spec) ? spec : [spec]\n // a field named on its own reads as its channel does - with that channel's title and format\n const encoded = (item) => typeof item === 'string' && Object.entries(channels).find(([n, c]) => n !== 'key' && c.field === item)?.[1]\n return list.map((item) => encoded(item) || channel('tooltip', item, rows, fields))\n}\n","// Default looks for chart HTML - ticks, titles, value labels, legends - in :where() rules, which\n// have no specificity, so any app CSS for these classes wins. Added once, on first use.\n\nconst CSS = `\n/* ticks are bare text: the padding is breathing room, so the overlap the label layout allows never runs them together */\n:where(.phoria-axis-tick) { padding: 0 4px; color: #8b909c; font: 11px/1.2 system-ui, sans-serif; font-variant-numeric: tabular-nums; }\n:where(.phoria-axis-title) { color: #c8ccd4; font: 600 12px/1.2 system-ui, sans-serif; }\n:where(.phoria-value) { padding: 1px 5px; border-radius: 4px; background: rgba(16, 16, 20, 0.72); color: #eee;\n font: 11px/1.3 system-ui, sans-serif; font-variant-numeric: tabular-nums; }\n:where(.phoria-light.phoria-axis-tick) { color: #5d6370; }\n:where(.phoria-light.phoria-axis-title) { color: #2b2f37; }\n:where(.phoria-light.phoria-value) { background: rgba(255, 255, 255, 0.85); color: #222; }\n:where(.phoria-legend) { position: absolute; display: flex; flex-direction: column; gap: 3px; padding: 8px 10px;\n border-radius: 8px; background: rgba(20, 20, 24, 0.78); color: #e6e6e6; font: 12px/1.3 system-ui, sans-serif;\n pointer-events: auto; max-height: calc(100% - 24px); overflow: auto; }\n:where(.phoria-light.phoria-legend) { background: rgba(255, 255, 255, 0.88); color: #222; }\n:where(.phoria-legend-top-right) { top: 12px; right: 12px; }\n:where(.phoria-legend-top-left) { top: 12px; left: 12px; }\n:where(.phoria-legend-bottom-right) { bottom: 12px; right: 12px; }\n:where(.phoria-legend-bottom-left) { bottom: 12px; left: 12px; }\n:where(.phoria-legend-title) { opacity: 0.7; font-size: 11px; margin-bottom: 2px; }\n:where(.phoria-legend-item) { display: flex; align-items: center; gap: 6px; padding: 0; border: 0; background: none;\n color: inherit; font: inherit; text-align: left; cursor: pointer; }\n:where(.phoria-legend-item.off) { opacity: 0.35; }\n:where(.phoria-legend-swatch) { width: 10px; height: 10px; border-radius: 2px; flex: none; }\n/* a number key is up to 140px tall and gives way in a short view, so the legend never scrolls; its\n values share one grid cell, so the widest sets the key's width, each raised to its place */\n:where(.phoria-legend-key) { display: flex; gap: 6px; margin: 6px 0; flex: 0 1 140px; min-height: 48px; }\n:where(.phoria-legend-ramp) { width: 10px; border-radius: 2px; flex: none; }\n:where(.phoria-legend-scale) { display: grid; font-size: 11px; font-variant-numeric: tabular-nums; }\n:where(.phoria-legend-scale > span) { grid-area: 1 / 1; align-self: end; position: relative; transform: translateY(50%);\n white-space: nowrap; opacity: 0.8; }\n`\n\nexport function addStyle() {\n if (typeof document === 'undefined' || document.getElementById('phoria-chart-style')) return\n const style = document.createElement('style')\n style.id = 'phoria-chart-style'\n style.textContent = CSS\n document.head.prepend(style)\n}\n","// A chart: a Group that builds its marks, axes and legend from a spec, and animates to new data.\n// Everything it makes is ordinary nodes - restyle, pick or add to them like anything else.\nimport { Group, NODE_OPTIONS } from '../scene/Node.js'\nimport { Label } from '../scene/drawables.js'\nimport { Color } from '../value/Color.js'\nimport { registerType } from '../registry.js'\nimport { describe, fail } from '../validate.js'\nimport { chartFrame } from './axes.js'\nimport { legend } from './legend.js'\nimport { barMark, lineMark, pointMark, stackKey, surfaceMark } from './marks.js'\nimport { networkMark } from './network.js'\nimport { SCHEMES, distinct, scaleBand, scaleColor, scaleLinear, scaleLog, scaleTime, toDate } from './scales.js'\nimport { normalise } from './spec.js'\nimport { addStyle } from './style.js'\nimport { EASES } from '../ease.js'\n\n/** @import { Mark, MarkContext, Target } from './marks.js' */\n/** @import { Scale, ColorScale } from './scales.js' */\n/** @import { Channel } from './spec.js' */\n\n// node options a chart passes to its Group; 'tooltip' and 'highlight' are the chart's own\nconst NODE_KEYS = NODE_OPTIONS.filter((k) => !['children', 'tooltip', 'highlight'].includes(k))\n\n/**\n * Build a chart from a spec - mark, data and channels:\n *\n * scene.add(chart({ mark: 'bar', data: rows, x: 'month', z: 'region', y: 'sales', color: 'region' }))\n * @param {Record<string, any>} spec\n * @returns {Chart}\n */\nexport function chart(spec) {\n return new Chart(spec)\n}\n\nexport class Chart extends Group {\n static type = 'chart'\n // only node options reach Node's own checks; the spec is checked by normalise()\n static get OPTIONS() { return NODE_OPTIONS }\n\n /** The scales in use - place your own content in data coordinates: chart.scales.y(50). @type {{ x?: Scale, y?: Scale, z?: Scale, color?: ColorScale, size?: Scale }} */\n scales = {}\n\n /** @type {Record<string, any>} the spec as given, data included */ #input\n /** @type {ReturnType<typeof normalise> | null} */ #spec = null\n /** @type {Mark | null} */ #mark = null\n #signature = ''\n /** @type {MarkContext} */ #ctx\n /** @type {Group | null} */ #frame = null\n /** @type {Label | null} */ #title = null\n /** @type {Set<string>} colour values switched off in the legend */ #hidden = new Set()\n /** @type {((row: any) => boolean) | null} */ #filter = null\n // what is drawn now: its state, and the layout that state is in\n /** @type {Float32Array | null} */ #current = null\n /** @type {Target | null} */ #shown = null\n /** @type {{ from: Float32Array, to: Float32Array, t: number, frame: Target, final: Target } | null} */ #tween = null\n\n /** @param {Record<string, any>} spec mark, data, channels and options - and node options such as position */\n constructor(spec) {\n if (!spec || typeof spec !== 'object' || Array.isArray(spec)) fail('chart()', `expected a spec such as { mark: 'bar', data, x, y }, got ${describe(spec)}`)\n const node = {}, rest = {}\n for (const [k, v] of Object.entries(spec)) (NODE_KEYS.includes(k) ? node : rest)[k] = v\n if (spec.children) fail('chart()', \"a chart makes its own children - add other nodes to a Group beside it\")\n super(node)\n addStyle()\n this.#input = rest\n this.#ctx = /** @type {MarkContext} */ ({})\n this.#rebuild(true)\n // transitions and flowing links run from the scene clock\n this.onUpdate((_, dt) => this.#step(dt))\n }\n\n /** The normalised spec: mark, channels (fields, types, titles) and options. */\n get spec() {\n const s = /** @type {ReturnType<typeof normalise>} */ (this.#spec)\n return { mark: s.mark, channels: s.channels, options: s.options }\n }\n\n /** The data as given. */\n get data() {\n return this.#input.data\n }\n\n /** The nodes drawing the data, for styling: chart.marks[0].material.roughness = 0.2. @returns {import('../scene/Node.js').Node[]} */\n get marks() {\n return this.#mark ? [...this.#mark.nodes] : []\n }\n\n /**\n * New data - rows, or { nodes, links } for a network - or changed spec options. Marks animate:\n * new ones grow in, changed ones move, removed ones shrink away, matched by the key channel (or\n * an id field, or position).\n * @param {any[] | Record<string, any>} change\n * @returns {this}\n */\n update(change) {\n const data = Array.isArray(change) || (change && 'nodes' in change && 'links' in change)\n this.#input = data ? { ...this.#input, data: change } : { ...this.#input, ...change }\n this.#rebuild(true)\n return this\n }\n\n /** Show only the rows that pass, animated; null shows them all. @param {((row: any) => boolean) | null} fn @returns {this} */\n filter(fn) {\n if (fn !== null && typeof fn !== 'function') fail('Chart', `filter() takes (row) => boolean, or null, got ${describe(fn)}`)\n this.#filter = fn\n this.#rebuild(true)\n return this\n }\n\n /** One line about this chart, for view.explain(). */\n explain() {\n const s = /** @type {ReturnType<typeof normalise>} */ (this.#spec)\n const axes = ['x', 'y', 'z'].filter((k) => this.scales[k]).map((k) => {\n const sc = this.scales[k]\n return sc.kind === 'band' ? `${k} band of ${sc.domain.length}` : `${k} ${sc.kind} ${sc.format(sc.domain[0])}-${sc.format(sc.domain[1])}`\n })\n const shown = this.#shown?.rows.length ?? 0\n return `Chart (${s.mark}): ${shown} of ${s.rows.length} rows shown${axes.length ? `; ${axes.join(', ')}` : ''}${s.links.length ? `; ${s.links.length} links` : ''}`\n }\n\n /** @internal @returns {Record<string, unknown>} */\n jsonOptions() {\n return { ...this.#input }\n }\n\n toJSON() {\n // the children are made from the spec, so the spec is the description - and the highlight is\n // the spec's, or none, not the colour the chart turned it into\n const json = super.toJSON()\n delete json.children\n if (this.#input.highlight === undefined) delete json.highlight\n return json\n }\n\n /** A new chart from the same spec and transform. @returns {any} */\n clone() {\n // the node options a chart takes (its tooltip and highlight are its own, in its spec)\n const { name, position, quaternion, scale, visible, pickable, highlightWhole, onHover, onClick, showFrom, clip, onDrag, outline } = super.cloneOptions()\n const copy = new Chart({ ...this.#input, name, position, quaternion, scale, visible, pickable, highlightWhole, onHover, onClick, showFrom, clip, onDrag, outline })\n // as Node.clone() does - but not the update handlers, which include this chart's own\n copy.userData = structuredClone(this.userData)\n copy.matrixAutoUpdate = this.matrixAutoUpdate\n if (!copy.matrixAutoUpdate) copy.matrix.copy(this.matrix)\n return copy\n }\n\n /** @param {boolean} animate */\n #rebuild(animate) {\n const spec = normalise(this.#input)\n const o = spec.options, ch = spec.channels\n this.#spec = spec\n const box = /** @type {[number, number, number]} */ (o.box ?? defaultBox(spec))\n const theme = o.theme ?? 'dark'\n if (theme !== 'dark' && theme !== 'light') fail('chart()', `theme '${theme}' - expected 'dark' or 'light'`)\n // one rule for every label the chart draws, covered by another label or by the marks: by default\n // they fade rather than vanish, so the chart keeps its shape as it turns\n const overlap = o.overlap ?? 'dim'\n if (!['dim', 'hide', 'show'].includes(overlap)) fail('chart()', `overlap '${overlap}' - expected 'dim', 'hide' or 'show'`)\n const visible = spec.rows.filter((r) => (!this.#filter || this.#filter(r)) && (!ch.color?.field || !this.#hidden.has(String(ch.color.get(r)))))\n\n this.scales = scalesFor(spec, box)\n const color = this.scales.color\n const fallback = Color.fromInput(ch.color?.field ? SCHEMES.category[0] : ch.color?.value ?? SCHEMES.category[0], 'chart()').toSRGB()\n const linkColors = spec.link.color?.field ? colorScale(spec.link.color, spec.links.map((l) => spec.link.color.get(l))) : null\n Object.assign(this.#ctx, {\n spec, box, theme, overlap, scales: this.scales,\n size: this.scales.size ?? null,\n rgb: (row) => (color ? color(colorValue(spec, row)).toSRGB() : fallback),\n format: formatValue,\n linkColor: (v) => /** @type {ColorScale} */ (linkColors)(v),\n })\n\n // a different kind of chart (or channels) means new marks; the same kind keeps them, to animate\n const signature = JSON.stringify([spec.mark, Object.entries(ch).map(([k, c]) => [k, c.field, c.type]), box, theme, overlap, o.stack, o.layout, o.flat, Object.keys(spec.link)])\n if (signature !== this.#signature) {\n this.#signature = signature\n if (this.#mark) this.remove(.../** @type {any[]} */ (this.#mark.nodes))\n this.#mark = makeMark(spec.mark, this.#ctx)\n for (const node of this.#mark.nodes) this.add(node)\n this.#current = this.#shown = null\n this.#tween = null\n }\n if (this.#frame) this.remove(this.#frame)\n this.#frame = spec.mark === 'network' && o.layout !== 'given' ? null : this.add(chartFrame({ box, theme, overlap, axes: axesFor(spec, this.scales) }))\n if (this.#title) this.remove(this.#title)\n this.#title = o.title ? this.add(new Label({ text: String(o.title), position: [0, box[1] * 1.12, -box[2] / 2], className: `phoria-axis-title phoria-${theme}`, overlap: 'show' })) : null\n\n this.#setLegend(spec, theme)\n this.tooltip = spec.tooltip === null && !spec.link.tooltip ? null : (hit) => this.#tooltipFor(hit)\n const hl = o.highlight\n this.highlight = hl === false ? null : Color.fromInput(hl === undefined || hl === 'neighbours' || hl === 'node' ? '#ffffff' : hl, 'chart()')\n\n this.#show(/** @type {Mark} */ (this.#mark).layout(visible), animate && o.transition !== false)\n }\n\n /** @param {ReturnType<typeof normalise>} spec @param {'dark' | 'light'} theme */\n #setLegend(spec, theme) {\n this.overlay?.remove()\n this.overlay = null\n const c = spec.channels.color, o = spec.options.legend\n // no legend outside a browser (tests, servers)\n if (!c?.field || o === false || !this.scales.color || typeof document === 'undefined') return\n const el = legend(this.scales.color, {\n title: c.title, theme, position: o?.position, ticks: o?.ticks, format: (v) => formatValue(c, v),\n onToggle: (value, on) => {\n if (on) this.#hidden.delete(String(value))\n else this.#hidden.add(String(value))\n this.#rebuild(true)\n },\n })\n // keep switched-off entries looking off\n el.querySelectorAll('.phoria-legend-item').forEach((item, i) => {\n if (this.#hidden.has(String(this.scales.color?.domain[i]))) item.classList.add('off')\n })\n const container = o?.container\n if (container) {\n const host = typeof container === 'string' ? document.querySelector(container) : container\n if (!host) fail('chart()', `legend container ${describe(container)} not found`)\n el.classList.remove(`phoria-legend-${o?.position ?? 'top-right'}`)\n // laid out in the page's flow: a row that wraps, as tall as it needs - not the floating box\n Object.assign(el.style, { position: 'static', flexDirection: 'row', flexWrap: 'wrap', alignItems: 'center',\n columnGap: '12px', maxHeight: 'none', overflow: 'visible' })\n host.replaceChildren(el)\n } else {\n this.overlay = el\n }\n }\n\n /** @param {any} hit */\n #tooltipFor(hit) {\n const spec = /** @type {ReturnType<typeof normalise>} */ (this.#spec)\n const row = hit.datum\n if (!row) return null\n const link = this.#mark?.tooltipRows?.(hit) === 'link'\n const list = /** @type {any} */ (link ? spec.link.tooltip : spec.tooltip)\n if (typeof list === 'function') return list(row, hit)\n if (link && (!list || !list.length)) {\n const s = spec.options.source ?? 'source', t = spec.options.target ?? 'target'\n return { title: `${row[s]} → ${row[t]}`, rows: Object.fromEntries(Object.entries(spec.link).filter(([k, c]) => k !== 'tooltip' && c.field).map(([, c]) => [c.title, formatValue(c, c.get(row))])) }\n }\n if (!list || !list.length) return null\n // the first category names the row; the rest are name/value pairs\n const head = list.find((/** @type {Channel} */ c) => c.type === 'nominal' || c.type === 'ordinal')\n const rows = Object.fromEntries(list.filter((/** @type {Channel} */ c) => c !== head).map((/** @type {Channel} */ c) => [c.title, formatValue(c, c.get(row))]))\n return head ? { title: formatValue(head, head.get(row)), rows } : { rows }\n }\n\n // move to a new target: straight there, or by a tween from what is drawn now\n /** @param {Target} target @param {boolean} animate */\n #show(target, animate) {\n const mark = /** @type {Mark} */ (this.#mark)\n const now = this.#shown, cur = this.#current\n if (!animate) return this.#draw(target.state, target, target)\n const { stride } = target\n let from, to, frame = target\n if (target.keys && mark.enter) {\n // keyed: match items by key; new ones enter from nothing, missing ones leave to nothing\n const before = new Map(now?.keys?.map((k, i) => [k, i]) ?? [])\n const keep = new Set(target.keys)\n // rows the interrupted animation was already taking away go now, rather than leaving all\n // over again - or under a steady stream of changes they would never be gone\n const going = new Set(this.#tween?.final.keys ?? now?.keys)\n const leaving = now?.keys ? now.keys.map((_, i) => i).filter((i) => {\n const key = /** @type {any[]} */ (now.keys)[i]\n return !keep.has(key) && going.has(key)\n }) : []\n const n = target.keys.length + leaving.length\n from = new Float32Array(n * stride)\n to = new Float32Array(n * stride)\n to.set(target.state)\n target.keys.forEach((key, i) => {\n const j = before.get(key)\n const slot = from.subarray(i * stride, (i + 1) * stride)\n if (j !== undefined && cur && now?.stride === stride) slot.set(cur.subarray(j * stride, (j + 1) * stride))\n else {\n slot.set(target.state.subarray(i * stride, (i + 1) * stride))\n mark.enter(slot)\n }\n })\n leaving.forEach((j, e) => {\n const i = target.keys.length + e\n from.set(/** @type {Float32Array} */ (cur).subarray(j * stride, (j + 1) * stride), i * stride)\n to.set(/** @type {Float32Array} */ (cur).subarray(j * stride, (j + 1) * stride), i * stride)\n mark.enter(to.subarray(i * stride, (i + 1) * stride))\n })\n frame = { ...target, rows: [...target.rows, ...leaving.map((j) => /** @type {Target} */ (now).rows[j])],\n // leaving is empty unless there were keys before\n keys: [...target.keys, ...leaving.map((j) => /** @type {any[]} */ (/** @type {Target} */ (now).keys)[j])], state: to }\n } else if (now && cur && cur.length === target.state.length && now.stride === stride && sameShape(now.shape, target.shape)) {\n from = cur.slice()\n to = target.state\n } else {\n return this.#draw(target.state, target, target)\n }\n this.#tween = { from, to, t: 0, frame, final: target }\n this.#draw(from, frame, frame)\n }\n\n /** @param {Float32Array} state @param {Target} frame @param {Target} shown */\n #draw(state, frame, shown) {\n /** @type {Mark} */ (this.#mark).apply(state, frame)\n this.#current = state.slice()\n this.#shown = shown\n }\n\n /** @param {number} dt */\n #step(dt) {\n this.#mark?.tick?.(dt)\n const tw = this.#tween\n if (!tw) return\n const o = this.#input.transition ?? {}\n const duration = o.duration ?? 0.5\n const ease = EASES[o.ease ?? 'out']\n if (!ease) fail('chart()', `transition ease '${o.ease}' - expected ${Object.keys(EASES).map((e) => `'${e}'`).join(', ')}`)\n tw.t = Math.min(1, tw.t + dt / duration)\n const k = ease(tw.t)\n const state = new Float32Array(tw.from.length)\n for (let i = 0; i < state.length; i++) state[i] = tw.from[i] + (tw.to[i] - tw.from[i]) * k\n if (tw.t < 1) return this.#draw(state, tw.frame, tw.frame)\n this.#tween = null\n this.#draw(tw.final.state, tw.final, tw.final)\n }\n}\n\nregisterType(Chart)\n\n/** Do two layouts have the same shape (series lengths, grid size), so one can tween into the other? */\nfunction sameShape(a, b) {\n const key = (s) => JSON.stringify(s ? { lengths: s.lengths, nx: s.nx, nz: s.nz } : null)\n return key(a) === key(b)\n}\n\n/** @param {string} mark @param {MarkContext} ctx */\nfunction makeMark(mark, ctx) {\n if (mark === 'bar') return barMark(ctx)\n if (mark === 'point') return pointMark(ctx)\n if (mark === 'line' || mark === 'area') return lineMark(ctx, mark === 'area')\n if (mark === 'surface') return surfaceMark(ctx)\n return networkMark(ctx)\n}\n\n/** @param {ReturnType<typeof normalise>} spec @returns {[number, number, number]} */\nfunction defaultBox(spec) {\n const z = !!spec.channels.z\n if (spec.mark === 'surface') return [10, 4, 10]\n if (spec.mark === 'network') return spec.options.flat ? [12, 1, 12] : [12, 8, 12]\n if (spec.mark === 'point') return [8, 6, z ? 8 : 1.6]\n return [10, 6, z ? 6 : 1.6]\n}\n\n/** @param {any[]} values @returns {[number, number]} */\nfunction extent(values) {\n let lo = Infinity, hi = -Infinity\n for (const v of values) {\n const n = +v\n if (!Number.isFinite(n)) continue\n if (n < lo) lo = n\n if (n > hi) hi = n\n }\n return lo === Infinity ? [0, 1] : [lo, hi]\n}\n\n/** @param {Channel} c */\nfunction colorOptions(c) {\n return { scheme: c.scale.scheme, range: c.scale.range }\n}\n\n/**\n * A channel's colour scale: its type says ramp or categories - not the shape of its values, which\n * can't tell two nominal years from a numeric range.\n * @param {any} c the channel @param {any[]} values @param {keyof typeof SCHEMES} [scheme] the default scheme\n */\nfunction colorScale(c, values, scheme) {\n return c.type === 'quantitative'\n ? scaleColor({ kind: 'sequential', domain: c.scale.domain ?? extent(values), ...colorOptions(c), scheme: c.scale.scheme ?? scheme })\n : scaleColor({ kind: 'categorical', domain: c.scale.domain ?? distinct(values), ...colorOptions(c) })\n}\n\n/** The value a row is coloured by: the colour field, or (for surfaces, by default) its height. */\nfunction colorValue(spec, row) {\n const c = spec.channels.color\n return c?.field ? c.get(row) : spec.channels.y.get(row)\n}\n\n/**\n * Scales for the channels, over all the rows (not just those shown), so the axes stay put while a\n * legend entry or filter hides some.\n * @param {ReturnType<typeof normalise>} spec @param {[number, number, number]} box\n */\nfunction scalesFor(spec, box) {\n const [w, h, d] = box\n const ch = spec.channels, rows = spec.rows, out = {}\n const ranges = { x: [-w / 2, w / 2], y: [0, h], z: [d / 2, -d / 2] }\n for (const name of ['x', 'y', 'z']) {\n const c = ch[name]\n if (!c?.field) continue\n // the values listed as ticks are always on the axis\n const listed = c.axis && c.axis.ticks\n const values = [...rows.map((r) => c.get(r)), ...(Array.isArray(listed) ? listed : [])]\n const o = { range: ranges[name], format: (c.axis && c.axis.format) ?? c.format }\n const banded = c.type === 'nominal' || c.type === 'ordinal' || (spec.mark === 'bar' && name !== 'y')\n if (banded) {\n out[name] = scaleBand({ domain: c.scale.domain ?? distinct(values), padding: 0.2, ...o })\n } else if (c.type === 'temporal') {\n const [a, b] = extent(values.map((v) => toDate(v).getTime()))\n out[name] = scaleTime({ domain: /** @type {any} */ (c.scale.domain ?? [a, b]), ...o })\n } else {\n let domain = c.scale.domain ?? extent(values)\n // stacked bars and areas reach the totals, not the single values\n if (name === 'y' && spec.options.stack) domain = extent([0, ...stackTotals(spec)])\n if (c.scale.type === 'log') out[name] = scaleLog({ domain, ...o })\n else out[name] = scaleLinear({ domain, nice: c.scale.nice ?? true, zero: c.scale.zero ?? (name === 'y' && ['bar', 'area'].includes(spec.mark)), ...o })\n }\n }\n const color = ch.color\n if (color?.field || spec.mark === 'surface') {\n const c = color?.field ? color : ch.y\n const ticks = spec.options.legend?.ticks\n // as on an axis, a number key reaches the values listed as its ticks\n const values = [...rows.map((r) => c.get(r)), ...(c.type === 'quantitative' && Array.isArray(ticks) ? ticks : [])]\n out.color = colorScale(c, values, spec.mark === 'surface' && !color?.field ? 'viridis' : undefined)\n }\n const size = ch.size\n if (size?.field) {\n const unit = Math.min(...box) / 40\n // network nodes stay small beside their links, so the links read as the connections they are\n const range = spec.mark === 'network' ? [unit * 0.6, unit * 1.8] : [unit * 0.5, unit * 2]\n out.size = scaleLinear({ domain: extent(rows.map((r) => size.get(r))), range: /** @type {[number, number]} */ (size.scale.range ?? range) })\n }\n return out\n}\n\n/** Running totals per x (and z) for stacked charts. */\nfunction stackTotals(spec) {\n const ch = spec.channels, totals = new Map()\n for (const r of spec.rows) {\n const v = Number(ch.y.get(r)) || 0\n const k = stackKey(ch, r, v)\n totals.set(k, (totals.get(k) ?? 0) + v)\n }\n return [...totals.values()]\n}\n\n/** @param {ReturnType<typeof normalise>} spec @param {Chart['scales']} scales */\nfunction axesFor(spec, scales) {\n const axes = {}\n for (const name of ['x', 'y', 'z']) {\n const c = spec.channels[name]\n if (scales[name] && c) axes[name] = { scale: scales[name], channel: c, title: (c.axis && c.axis.title) ?? c.title }\n }\n return axes\n}\n\nconst NUMBER = new Intl.NumberFormat(undefined, { maximumFractionDigits: 2 })\nconst COMPACT = new Intl.NumberFormat(undefined, { notation: 'compact', maximumFractionDigits: 1 })\nconst DATE = new Intl.DateTimeFormat(undefined, { year: 'numeric', month: 'short', day: 'numeric' })\n\n/** A value as text, by its channel's format (Intl options or a function). @param {Channel} c @param {any} v */\nexport function formatValue(c, v) {\n if (v === null || v === undefined) return ''\n const f = c.format\n if (typeof f === 'function') return String(f(v))\n if (v instanceof Date) return f ? new Intl.DateTimeFormat(undefined, f).format(v) : DATE.format(v)\n if (typeof v === 'number') return f ? new Intl.NumberFormat(undefined, f).format(v) : (Math.abs(v) >= 1e4 ? COMPACT : NUMBER).format(v)\n return String(v)\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"charts.js","names":["boxGeometry","Lines","didYouMean","checkNumber","invert","Label","EASES","InstancedMesh","Mesh","NODE_OPTIONS","fail","describe","box","Geometry","icosphere","registerType","Group","Texture","Points","Color","ALONG","EDGE_ON","tmp","look","p","camera","x","y","cy","z","len","chartFrame","w","h","d","frame","dir","wallColor","theme","tickValues","ticks","a","r0","r1","lo","hi","ticksOf","xt","axes","yt","zt","wall","seg","b","at","side","v","axis","k","margin","cls","kind","labels","name","values","edge","edges","set","t","bottom","sign","n","zs","m","xs","rect","c","e","LOG10","tickStep","raw","span","count","power","error","formatter","option","f","date","fallback","numberFormat","digits","step","plain","compact","useCompact","max","pair","scaleLinear","d0","d1","domain","range","zero","nice","scale","clamp","out","format","scaleLog","inner","SECOND","MINUTE","HOUR","DAY","INTERVALS","CALENDAR","DATE_FORMATS","toDate","scaleTime","t0","t1","pick","ms","unit","get","size","years","first","i","auto","scaleBand","index","padding","SCHEMES","scaleColor","scheme","sequential","stops","along","last","j","local","value","distinct","list","legend","el","position","title","head","item","swatch","color","onToggle","key","ramp","marks","mark","stackKey","xv","ch","row","valueClass","ctx","labelsOf","priority","pos","s","barMark","mesh","makeBars","share","base","stacks","state","rows","y0","y1","below","keysOf","target","bigger","r","g","capacity","pointMark","sized","opacity","material","node","emptyPoints","dot","stride","geometry","dotTexture","data","shade","alpha","lineMark","lines","dots","fill","area","by","groups","series","totals","ordered","segColors","dotPos","dotColors","tri","triColors","lengths","colors","px","py","pz","replace","old","options","surfaceMark","grid","cell","missing","gap","positions","indices","nx","nz","random","seed","WIDTHS","networkMark","o","keyOf","keyGetter","linkCh","source","placed","makeNodes","nodesMesh","linkNodes","active","packets","flows","links","rowsNow","hovered","keys","l","place","neighbours","hover","dimmed","byWidth","link","bucket","widthClass","linkColor","flowSpeed","li","showNeighbours","dt","hit","rgb","other","layout","tiers","pairs","force","rand","dims","warm","steps","near","hops","furthest","queue","q","next","from","spread","to","weights","want","dx","dy","dz","field","order","tierOf","angle","radius","members","pull","above","MARKS","CHANNELS","OPTIONS","CHANNEL_OPTIONS","OPTION_HINTS","MARK_HINTS","CHANNEL_HINTS","normalise","input","markOf","dataOf","fields","fieldsOf","encoding","channels","spec","channel","tooltipSpec","markTooltip","tooltip","tooltipOf","linkFields","checkTicks","hint","names","inferType","owner","isColor","type","what","seen","encoded","CSS","addStyle","style","NODE_KEYS","chart","Chart","rest","#input","#ctx","#rebuild","#step","#spec","#mark","change","fn","#filter","sc","shown","#shown","one","json","copy","defaultBox","overlap","visible","#hidden","scalesFor","linkColors","colorScale","colorValue","formatValue","signature","#signature","makeMark","#current","#tween","#frame","axesFor","#title","#setLegend","#tooltipFor","hl","#show","animate","on","container","host","now","cur","#draw","before","keep","going","leaving","slot","sameShape","still","tw","duration","ease","extent","colorOptions","ranges","listed","stackTotals","scales","NUMBER","COMPACT","DATE"],"sources":["../src/charts/axes.js","../src/charts/scales.js","../src/charts/legend.js","../src/charts/marks.js","../src/charts/network.js","../src/charts/spec.js","../src/charts/style.js","../src/charts/Chart.js"],"sourcesContent":["// A chart's frame: grid walls on the far sides of its box and tick labels on the near edges. Every\n// candidate wall and label set is in the scene, and per-camera visibility (showFrom) picks which\n// ones a frame draws - so orbiting never moves anything, and two views of one chart are each right.\nimport { Geometry } from '../geometry/Geometry.js'\nimport { Group } from '../scene/Node.js'\nimport { Label, Lines } from '../scene/drawables.js'\nimport * as mat4 from '../math/mat4.js'\n\n/** @import { Camera } from '../scene/cameras.js' */\n/** @import { Scale } from './scales.js' */\n/** @import { Channel } from './spec.js' */\n\n// a direction this close to an axis counts as looking along it (that axis collapses on screen)\nconst ALONG = 0.97\n// walls closer than this to edge-on are left out\nconst EDGE_ON = 0.08\n// a camera this little to one side counts as straight ahead when choosing which edges to label\nconst LEAN = 0.1\n\nconst tmp = new Float32Array(16)\n\n/**\n * The camera's direction from the box centre, in the box's own space.\n * @param {Group} box @param {Camera} camera @param {number} cy the box centre's height\n */\nfunction look(box, camera, cy) {\n const p = camera.worldPosition\n mat4.invert(tmp, box.worldMatrix)\n const x = tmp[0] * p[0] + tmp[4] * p[1] + tmp[8] * p[2] + tmp[12]\n const y = tmp[1] * p[0] + tmp[5] * p[1] + tmp[9] * p[2] + tmp[13] - cy\n const z = tmp[2] * p[0] + tmp[6] * p[1] + tmp[10] * p[2] + tmp[14]\n const len = Math.hypot(x, y, z) || 1\n return [x / len, y / len, z / len]\n}\n\n/**\n * @typedef {object} AxisSpec\n * @property {Scale} scale\n * @property {Channel | null} channel\n * @property {string} title\n */\n\n/**\n * Walls, ticks and titles for a chart box spanning x -w/2..w/2, y 0..h, z -d/2..d/2.\n * @param {{ box: [number, number, number], axes: { x?: AxisSpec, y?: AxisSpec, z?: AxisSpec }, theme: 'dark' | 'light', overlap: 'dim' | 'hide' | 'show' }} options\n * @returns {Group}\n */\nexport function chartFrame({ box, axes, theme, overlap }) {\n const [w, h, d] = box\n const frame = new Group({ name: 'axes', pickable: false })\n const dir = (camera) => look(frame, camera, h / 2)\n const wallColor = theme === 'light' ? '#c3c8d2' : '#3a3d47'\n // the values an axis marks: those it lists, or about as many as it asks for (five unless it says)\n const tickValues = (a) => {\n const ticks = a.channel?.axis?.ticks\n if (!Array.isArray(ticks)) return a.scale.kind === 'band' ? a.scale.ticks() : a.scale.ticks(ticks ?? 5)\n const [r0, r1] = a.scale.range, lo = Math.min(r0, r1), hi = Math.max(r0, r1)\n return ticks.filter((t) => a.scale(t) >= lo - 1e-9 && a.scale(t) <= hi + 1e-9)\n }\n const ticksOf = (a) => (a && a.scale.kind !== 'band' && a.channel?.axis !== false ? tickValues(a) : [])\n const xt = ticksOf(axes.x), yt = ticksOf(axes.y), zt = ticksOf(axes.z)\n\n // six walls: grid lines at the ticks of the two axes they span, and a border\n const wall = (axis, side) => {\n const p = []\n const seg = (a, b) => p.push(...a, ...b)\n const at = (v) => (side < 0 ? -v / 2 : v / 2)\n if (axis === 'y') {\n const y = side < 0 ? 0 : h\n for (const t of xt) { const x = axes.x.scale(t); seg([x, y, -d / 2], [x, y, d / 2]) }\n for (const t of zt) { const z = axes.z.scale(t); seg([-w / 2, y, z], [w / 2, y, z]) }\n rect(seg, [-w / 2, y, -d / 2], [w / 2, y, -d / 2], [w / 2, y, d / 2], [-w / 2, y, d / 2])\n } else if (axis === 'x') {\n const x = at(w)\n for (const t of yt) { const y = axes.y.scale(t); seg([x, y, -d / 2], [x, y, d / 2]) }\n for (const t of zt) { const z = axes.z.scale(t); seg([x, 0, z], [x, h, z]) }\n rect(seg, [x, 0, -d / 2], [x, h, -d / 2], [x, h, d / 2], [x, 0, d / 2])\n } else {\n const z = at(d)\n for (const t of yt) { const y = axes.y.scale(t); seg([-w / 2, y, z], [w / 2, y, z]) }\n for (const t of xt) { const x = axes.x.scale(t); seg([x, 0, z], [x, h, z]) }\n rect(seg, [-w / 2, 0, z], [w / 2, 0, z], [w / 2, h, z], [-w / 2, h, z])\n }\n const k = 'xyz'.indexOf(axis)\n // a wall shows when the camera is on its far side\n frame.add(new Lines({\n geometry: new Geometry({ positions: p }), material: { color: wallColor }, pickable: false,\n showFrom: (camera) => -side * dir(camera)[k] > EDGE_ON,\n }))\n }\n for (const axis of ['x', 'y', 'z']) for (const side of [-1, 1]) wall(axis, side)\n\n // tick label sets: one per candidate edge, shown when it is the edge nearest the viewer\n const margin = Math.max(w, h, d) * 0.04\n const cls = (kind) => `phoria-axis-${kind} phoria-${theme}`\n const labels = (name, edges, place) => {\n const a = axes[name]\n if (!a || a.channel?.axis === false) return\n const k = 'xyz'.indexOf(name)\n const values = tickValues(a)\n for (const edge of edges) {\n const set = frame.add(new Group({\n showFrom: (camera) => {\n const v = dir(camera)\n return Math.abs(v[k]) < ALONG && edge.when(v)\n },\n }))\n for (const t of values) {\n set.add(new Label({ text: a.scale.format(t), position: edge.at(a.scale(t), margin), place, className: cls('tick'), priority: 1, overlap }))\n }\n // an empty title (axis: { title: '' }) leaves the axis untitled\n if (a.title) set.add(new Label({ text: a.title, position: edge.title(margin), place, className: cls('title'), priority: 2, overlap }))\n }\n }\n const bottom = (v) => v[1] >= -EDGE_ON\n // which side the camera is on - leaning to + so a view from straight ahead (or nearly) keeps its\n // labels where a front-on chart has them, however framing nudges the camera off centre\n const sign = (n) => (n >= -LEAN ? 1 : -1)\n // x ticks along the bottom edge nearest the viewer\n labels('x', [-1, 1].flatMap((zs) => [0, h].map((y) => ({\n when: (v) => (y === 0) === bottom(v) && sign(v[2]) === zs,\n at: (x, m) => [x, y, zs * (d / 2 + m)],\n title: (m) => [0, y, zs * (d / 2 + m * 3.5)],\n }))), 'below')\n // z ticks along the bottom edge on the viewer's side in x\n labels('z', [-1, 1].flatMap((xs) => [0, h].map((y) => ({\n when: (v) => (y === 0) === bottom(v) && sign(v[0]) === xs,\n at: (z, m) => [xs * (w / 2 + m), y, z],\n title: (m) => [xs * (w / 2 + m * 4), y, 0],\n }))), 'below')\n // y ticks up the outline edge on the screen's left: the far side in x, the near side in z\n labels('y', [-1, 1].flatMap((xs) => [-1, 1].map((zs) => ({\n when: (v) => sign(v[0]) === -xs && sign(v[2]) === zs,\n at: (y, m) => [xs * (w / 2 + m), y, zs * d / 2],\n title: (m) => [xs * (w / 2 + m), h + m * 2, zs * d / 2],\n }))), 'left')\n return frame\n}\n\n/** Four edges of a rectangle as segments. */\nfunction rect(seg, a, b, c, e) {\n seg(a, b)\n seg(b, c)\n seg(c, e)\n seg(e, a)\n}\n","// Scales map data values to positions or colours. Each is a function with a few members - ticks(),\n// format(), invert() - in the spirit of d3-scale, but a small subset written for charts in a box.\nimport { Color } from '../value/Color.js'\nimport { describe, fail } from '../validate.js'\n\n/** @typedef {Intl.NumberFormatOptions | Intl.DateTimeFormatOptions | ((value: any) => string)} FormatOption */\n\n/**\n * @typedef {object} ScaleBase\n * @property {'linear' | 'log' | 'time' | 'band'} kind\n * @property {any[]} domain\n * @property {[number, number]} range\n * @property {(count?: number) => any[]} ticks\n * @property {(value: any) => string} format\n */\n/** @typedef {((value: any) => number) & ScaleBase & { invert?: (y: number) => any, bandwidth?: number, step?: number }} Scale */\n\nconst LOG10 = Math.log(10)\n\n/** A round step near span / count: 1, 2 or 5 times a power of ten. @param {number} span @param {number} count */\nexport function tickStep(span, count) {\n const raw = span / Math.max(1, count)\n const power = 10 ** Math.floor(Math.log(raw) / LOG10)\n const error = raw / power\n return power * (error >= 7.07 ? 10 : error >= 3.16 ? 5 : error >= 1.41 ? 2 : 1)\n}\n\n/** @param {FormatOption | undefined} option @param {(v: any) => string} fallback */\nfunction formatter(option, fallback, date = false) {\n if (typeof option === 'function') return option\n if (option && typeof option === 'object') {\n const f = date ? new Intl.DateTimeFormat(undefined, /** @type {Intl.DateTimeFormatOptions} */ (option))\n : new Intl.NumberFormat(undefined, /** @type {Intl.NumberFormatOptions} */ (option))\n return (v) => f.format(v)\n }\n if (option !== undefined) fail('charts', `'format' must be Intl format options or a function, got ${describe(option)}`)\n return fallback\n}\n\n/**\n * Plain numbers to a step's precision; compact (1.2K) from ten thousand, while the steps are big\n * enough to tell apart in it - 10,000 to 10,010 would read 10K at every tick.\n * @param {number} step @param {number} max\n */\nfunction numberFormat(step, max) {\n const digits = Math.max(0, Math.min(6, -Math.floor(Math.log(step || 1) / LOG10)))\n const plain = new Intl.NumberFormat(undefined, { maximumFractionDigits: digits })\n const compact = new Intl.NumberFormat(undefined, { notation: 'compact', maximumFractionDigits: 1 })\n const useCompact = Math.abs(max) >= 1e4 && step >= Math.abs(max) / 100\n return (v) => (useCompact ? compact : plain).format(v)\n}\n\n/** @param {unknown} v @param {string} name @returns {[number, number]} */\nfunction pair(v, name) {\n if (!Array.isArray(v) || v.length !== 2 || !v.every((n) => typeof n === 'number' && Number.isFinite(n))) {\n fail('charts', `'${name}' must be [min, max] numbers, got ${describe(v)}`)\n }\n return /** @type {[number, number]} */ ([v[0], v[1]])\n}\n\n/**\n * Numbers to numbers in proportion.\n *\n * const y = scaleLinear({ domain: [0, 120], range: [0, 6] })\n * y(60) // 3\n * y.ticks(5) // [0, 20, 40, 60, 80, 100, 120]\n * @param {{ domain: [number, number], range?: [number, number], nice?: boolean, zero?: boolean, clamp?: boolean,\n * format?: FormatOption }} options nice widens the domain to round ends; zero takes it to include 0\n * @returns {Scale}\n */\nexport function scaleLinear({ domain, range = [0, 1], nice = false, zero = false, clamp = false, format }) {\n let [d0, d1] = pair(domain, 'domain')\n const [r0, r1] = pair(range, 'range')\n if (zero) {\n d0 = Math.min(0, d0)\n d1 = Math.max(0, d1)\n }\n if (d0 === d1) {\n // a single value still gets a little room\n d0 -= d0 ? Math.abs(d0) * 0.5 : 1\n d1 += d1 ? Math.abs(d1) * 0.5 : 1\n }\n if (nice) {\n const step = tickStep(d1 - d0, 5)\n d0 = Math.floor(d0 / step) * step\n d1 = Math.ceil(d1 / step) * step\n }\n const k = (r1 - r0) / (d1 - d0)\n const scale = /** @type {Scale} */ ((v) => {\n const t = r0 + (v - d0) * k\n return clamp ? Math.min(Math.max(t, Math.min(r0, r1)), Math.max(r0, r1)) : t\n })\n scale.kind = 'linear'\n scale.domain = [d0, d1]\n scale.range = [r0, r1]\n scale.invert = (y) => d0 + (y - r0) / k\n scale.ticks = (count = 5) => {\n const step = tickStep(d1 - d0, count), out = []\n for (let v = Math.ceil(d0 / step) * step; v <= d1 + step * 1e-9; v += step) out.push(+v.toFixed(12))\n return out\n }\n scale.format = formatter(format, numberFormat(tickStep(d1 - d0, 5), Math.max(Math.abs(d0), Math.abs(d1))))\n return scale\n}\n\n/**\n * Positive numbers on a log scale, for values spanning orders of magnitude.\n * @param {{ domain: [number, number], range?: [number, number], format?: FormatOption }} options\n * @returns {Scale}\n */\nexport function scaleLog({ domain, range = [0, 1], format }) {\n const [d0, d1] = pair(domain, 'domain')\n if (d0 <= 0 || d1 <= 0) fail('charts', `a log scale needs a domain above 0, got [${d0}, ${d1}] - use a linear scale for zero or negative values`)\n const inner = scaleLinear({ domain: [Math.log10(d0), Math.log10(d1)], range })\n const scale = /** @type {Scale} */ ((v) => inner(Math.log10(v)))\n scale.kind = 'log'\n scale.domain = [d0, d1]\n scale.range = inner.range\n scale.invert = (y) => 10 ** /** @type {number} */ (inner.invert?.(y))\n scale.ticks = () => {\n const out = []\n for (let p = Math.floor(Math.log10(d0)); p <= Math.ceil(Math.log10(d1)); p++) {\n for (const m of [1, 2, 5]) {\n const v = m * 10 ** p\n if (v >= d0 * 0.999 && v <= d1 * 1.001) out.push(v)\n }\n }\n return out\n }\n scale.format = formatter(format, (v) => new Intl.NumberFormat(undefined, { notation: 'compact', maximumFractionDigits: 1 }).format(v))\n return scale\n}\n\n// tick intervals for time, in ms, and how to label each\nconst SECOND = 1000, MINUTE = 60 * SECOND, HOUR = 60 * MINUTE, DAY = 24 * HOUR\n/** @type {[number, string][]} */\nconst INTERVALS = [\n [SECOND, 's'], [5 * SECOND, 's'], [15 * SECOND, 's'], [30 * SECOND, 's'], [MINUTE, 'm'], [5 * MINUTE, 'm'], [15 * MINUTE, 'm'],\n [30 * MINUTE, 'm'], [HOUR, 'h'], [3 * HOUR, 'h'], [6 * HOUR, 'h'], [12 * HOUR, 'h'], [DAY, 'd'], [2 * DAY, 'd'], [7 * DAY, 'w'],\n [30 * DAY, 'M'], [91 * DAY, 'Q'], [365 * DAY, 'Y'],\n]\n/**\n * Each unit as a calendar field to step - read it, set it, and its rough size in ms.\n * @type {Record<string, [(d: Date) => number, (d: Date, v: number) => void, number]>}\n */\nconst CALENDAR = {\n s: [(d) => d.getSeconds(), (d, v) => d.setSeconds(v), SECOND],\n m: [(d) => d.getMinutes(), (d, v) => d.setMinutes(v), MINUTE],\n h: [(d) => d.getHours(), (d, v) => d.setHours(v), HOUR],\n d: [(d) => d.getDate(), (d, v) => d.setDate(v), DAY],\n w: [(d) => d.getDate(), (d, v) => d.setDate(v), DAY],\n M: [(d) => d.getMonth(), (d, v) => d.setMonth(v), 30 * DAY],\n Q: [(d) => d.getMonth(), (d, v) => d.setMonth(v), 30 * DAY],\n Y: [(d) => d.getFullYear(), (d, v) => d.setFullYear(v), 365 * DAY],\n}\nconst DATE_FORMATS = {\n s: { hour: '2-digit', minute: '2-digit', second: '2-digit' }, m: { hour: '2-digit', minute: '2-digit' }, h: { hour: '2-digit', minute: '2-digit' },\n d: { month: 'short', day: 'numeric' }, w: { month: 'short', day: 'numeric' }, M: { month: 'short', year: 'numeric' },\n Q: { month: 'short', year: 'numeric' }, Y: { year: 'numeric' },\n}\n\n/** A Date from a Date, a timestamp or a date string. @param {unknown} v @returns {Date} */\nexport function toDate(v) {\n const d = v instanceof Date ? v : new Date(/** @type {any} */ (v))\n if (Number.isNaN(d.getTime())) fail('charts', `${describe(v)} isn't a date - use Date objects, timestamps or ISO strings like '2026-10-25'`)\n return d\n}\n\n/**\n * Dates to numbers, with ticks on calendar boundaries (days, months, years) and labels to match.\n * @param {{ domain: [unknown, unknown], range?: [number, number], format?: FormatOption }} options\n * @returns {Scale}\n */\nexport function scaleTime({ domain, range = [0, 1], format }) {\n const t0 = toDate(domain[0]).getTime(), t1 = toDate(domain[1]).getTime()\n const inner = scaleLinear({ domain: [t0, t1], range })\n const span = Math.max(1, t1 - t0)\n const pick = (count) => INTERVALS.find(([ms]) => span / ms <= count) ?? INTERVALS[INTERVALS.length - 1]\n const scale = /** @type {Scale} */ ((v) => inner(toDate(v).getTime()))\n scale.kind = 'time'\n scale.domain = [new Date(t0), new Date(t1)]\n scale.range = inner.range\n scale.invert = (y) => new Date(/** @type {number} */ (inner.invert?.(y)))\n scale.ticks = (count = 5) => {\n const [ms, unit] = pick(count)\n const [get, set, size] = CALENDAR[unit]\n // whole steps of the unit - years nicely, as 1, 2, 5, 10 ...\n let n = Math.max(1, Math.round(ms / size))\n if (unit === 'Y') {\n const years = span / size / count, p = 10 ** Math.floor(Math.log10(years || 1))\n n = Math.max(1, [1, 2, 5, 10].map((m) => m * p).find((v) => v >= years) ?? 10 * p)\n }\n const d = new Date(t0)\n // start on a boundary of the unit, at a multiple of the step within the next unit up: quarters\n // in Jan, Apr, Jul and Oct, quarter hours on the quarter\n d.setMilliseconds(0)\n if (unit !== 's') d.setSeconds(0)\n if (!'sm'.includes(unit)) d.setMinutes(0)\n if ('dwMQY'.includes(unit)) d.setHours(0)\n if ('MQY'.includes(unit)) d.setDate(1)\n if (unit === 'Y') d.setMonth(0)\n const first = unit === 'd' ? 1 : 0\n if (unit !== 'w') set(d, Math.floor((get(d) - first) / n) * n + first)\n // steps through the calendar, in local time, so ticks stay on round times across daylight saving\n while (d.getTime() < t0) set(d, get(d) + n)\n const out = []\n for (let i = 0; d.getTime() <= t1 && i < 200; i++) {\n out.push(new Date(d))\n set(d, get(d) + n)\n }\n return out\n }\n const auto = new Intl.DateTimeFormat(undefined, /** @type {any} */ (DATE_FORMATS[pick(6)[1]]))\n scale.format = formatter(format, (v) => auto.format(toDate(v)), true)\n return scale\n}\n\n/**\n * Categories to evenly spaced bands; the value is the band's centre.\n *\n * const months = scaleBand({ domain: ['Jan', 'Feb', 'Mar'], range: [0, 9], padding: 0.2 })\n * months('Feb') // 4.5\n * months.bandwidth // 2.4 - the band's width without its padding\n * @param {{ domain: unknown[], range?: [number, number], padding?: number, format?: FormatOption }} options\n * @returns {Scale}\n */\nexport function scaleBand({ domain, range = [0, 1], padding = 0.2, format }) {\n if (!Array.isArray(domain)) fail('charts', `a band scale's domain is a list of categories, got ${describe(domain)}`)\n const [r0, r1] = pair(range, 'range')\n const index = new Map(domain.map((v, i) => [String(v), i]))\n const step = (r1 - r0) / Math.max(1, domain.length)\n const scale = /** @type {Scale} */ ((v) => {\n const i = index.get(String(v))\n return i === undefined ? NaN : r0 + step * (i + 0.5)\n })\n scale.kind = 'band'\n scale.domain = domain\n scale.range = [r0, r1]\n scale.step = step\n scale.bandwidth = Math.abs(step) * (1 - padding)\n scale.ticks = () => domain\n scale.format = formatter(format, (v) => String(v))\n return scale\n}\n\n// colour schemes: categorical (Tableau 10) and ramps for numbers, as sRGB hex stops\nexport const SCHEMES = {\n category: ['#4e79a7', '#f28e2b', '#59a14f', '#e15759', '#76b7b2', '#edc948', '#b07aa1', '#ff9da7', '#9c755f', '#bab0ac'],\n viridis: ['#440154', '#3b528b', '#21918c', '#5ec962', '#fde725'],\n blues: ['#eff3ff', '#bdd7e7', '#6baed6', '#3182bd', '#08519c'],\n heat: ['#2c7bb6', '#abd9e9', '#ffffbf', '#fdae61', '#d7191c'],\n cool: ['#f7fcf0', '#ccebc5', '#7bccc4', '#2b8cbe', '#084081'],\n redblue: ['#b2182b', '#ef8a62', '#f7f7f7', '#67a9cf', '#2166ac'],\n}\n\n/**\n * @typedef {((value: any) => Color) & { kind: 'categorical' | 'sequential', domain: any[], range: string[],\n * colors: () => { value: any, color: Color }[] }} ColorScale\n */\n\n/**\n * Values to colours: categories to a categorical scheme, numbers along a ramp (mixed in linear\n * space). Give a scheme name or a range of colours.\n *\n * scaleColor({ domain: ['ok', 'warn', 'down'], range: ['#59a14f', '#f2b134', '#e15759'] })\n * scaleColor({ domain: [18, 35], scheme: 'heat' })\n * @param {{ domain: any[], scheme?: keyof typeof SCHEMES, range?: string[], kind?: 'sequential' | 'categorical' }} options\n * kind: a ramp through the domain's numbers (two or more - [0, 50, 100] for a diverging scheme), or a colour\n * per value. Without it, two numbers make a ramp and anything else categories\n * @returns {ColorScale}\n */\nexport function scaleColor({ domain, scheme, range, kind }) {\n if (scheme !== undefined && !(scheme in SCHEMES)) {\n fail('charts', `colour scheme '${scheme}' isn't one we have - use ${Object.keys(SCHEMES).map((k) => `'${k}'`).join(', ')}, or a range of colours`)\n }\n const sequential = kind ? kind === 'sequential' : domain.length === 2 && domain.every((v) => typeof v === 'number')\n if (sequential && (domain.length < 2 || domain.some((v) => typeof v !== 'number'))) fail('charts', `a sequential colour scale needs two or more numbers in its domain, got ${describe(domain)}`)\n const stops = (range ?? SCHEMES[scheme ?? (sequential ? 'viridis' : 'category')]).map((c) => Color.fromInput(c, 'charts'))\n /** @type {ColorScale} */\n let scale\n if (sequential) {\n // where a value is along the domain, 0 - 1: piece by piece when it has more than two numbers\n const along = (/** @type {number} */ v) => {\n const last = domain.length - 1\n let j = 0\n while (j < last - 1 && v > domain[j + 1]) j++\n const local = (v - domain[j]) / (domain[j + 1] - domain[j] || 1)\n return Math.min(1, Math.max(0, (j + local) / last))\n }\n scale = /** @type {ColorScale} */ ((v) => {\n if (stops.length < 2) return stops[0].clone()\n const t = along(v) * (stops.length - 1)\n const i = Math.min(stops.length - 2, Math.floor(t))\n return stops[i].clone().lerp(stops[i + 1], t - i)\n })\n scale.kind = 'sequential'\n scale.colors = () => []\n } else {\n const index = new Map(domain.map((v, i) => [String(v), i]))\n scale = /** @type {ColorScale} */ ((v) => stops[(index.get(String(v)) ?? 0) % stops.length].clone())\n scale.kind = 'categorical'\n scale.colors = () => domain.map((value) => ({ value, color: scale(value) }))\n }\n scale.domain = domain\n scale.range = stops.map((c) => c.getStyle())\n return scale\n}\n\n/**\n * The different values, in order: numbers and dates ascending, anything else as first seen. @internal\n * @param {any[]} values @returns {any[]}\n */\nexport function distinct(values) {\n const list = [...new Map(values.map((v) => [v instanceof Date ? v.getTime() : v, v])).values()]\n return typeof list[0] === 'number' || list[0] instanceof Date ? list.sort((a, b) => +a - +b) : list\n}\n","// A chart's legend as HTML: swatches for categories (click to hide or show them), or for numbers a\n// key - a ramp, highest at the top, with values marked up its side.\nimport { scaleLinear } from './scales.js'\n\n/** @import { ColorScale } from './scales.js' */\n\n/**\n * @param {ColorScale} scale\n * @param {{ title: string, theme: 'dark' | 'light', position?: string, format: (v: any) => string,\n * ticks?: number[] | number, onToggle?: (value: any, on: boolean) => void }} options\n * @returns {HTMLDivElement}\n */\nexport function legend(scale, { title, theme, position = 'top-right', format, ticks, onToggle }) {\n const el = document.createElement('div')\n el.className = `phoria-legend phoria-legend-${position} phoria-${theme}`\n // an empty title leaves the legend untitled\n if (title) {\n const head = document.createElement('div')\n head.className = 'phoria-legend-title'\n head.textContent = title\n el.append(head)\n }\n if (scale.kind === 'categorical') {\n for (const { value, color } of scale.colors()) {\n const item = document.createElement('button')\n item.type = 'button'\n item.className = 'phoria-legend-item'\n const swatch = document.createElement('span')\n swatch.className = 'phoria-legend-swatch'\n swatch.style.background = color.getStyle()\n item.append(swatch, format(value))\n item.addEventListener('click', () => onToggle?.(value, !item.classList.toggle('off')))\n el.append(item)\n }\n } else {\n const lo = scale.domain[0], hi = scale.domain[scale.domain.length - 1]\n const along = scaleLinear({ domain: [lo, hi], range: [0, 100] })\n const key = document.createElement('div')\n key.className = 'phoria-legend-key'\n const ramp = document.createElement('div')\n ramp.className = 'phoria-legend-ramp'\n // sampled from the scale, so a ramp with more than two numbers in its domain is drawn as it colours\n const stops = Array.from({ length: 17 }, (_, i) => `${scale(lo + (hi - lo) * i / 16).getStyle()} ${i * 100 / 16}%`)\n ramp.style.background = `linear-gradient(to top, ${stops.join(', ')})`\n const marks = document.createElement('div')\n marks.className = 'phoria-legend-scale'\n const values = Array.isArray(ticks) ? ticks : along.ticks(ticks ?? 5)\n for (const v of values) {\n const at = along(v)\n if (!(at >= -1e-9 && at <= 100 + 1e-9)) continue\n const mark = document.createElement('span')\n mark.style.bottom = `${at}%`\n mark.textContent = format(v)\n marks.append(mark)\n }\n key.append(ramp, marks)\n el.append(key)\n }\n return el\n}\n","// The marks: each turns rows into a flat numeric state - a few numbers per item - and writes a\n// state into its nodes. The chart tweens between states for transitions, so a mark only has to\n// lay out and draw, never animate.\nimport { Geometry } from '../geometry/Geometry.js'\nimport { box as boxGeometry, icosphere } from '../geometry/generators.js'\nimport { Texture } from '../material/Texture.js'\nimport { InstancedMesh, Lines, Mesh, Points } from '../scene/drawables.js'\nimport { fail } from '../validate.js'\nimport { distinct } from './scales.js'\n\n/**\n * Where a row stacks: on the others at its x and in its depth series, negatives down from zero on\n * their own. One rule for the bars, the lines and areas, and the y domain they are drawn in.\n * @param {any} ch the spec's channels @param {any} row @param {number} v its y value\n * @returns {string}\n */\nexport function stackKey(ch, row, v) {\n const xv = ch.x?.get(row)\n return `${xv instanceof Date ? xv.getTime() : xv}|${ch.z ? ch.z.get(row) : ''}|${v < 0 ? '-' : '+'}`\n}\n\n/** @import { Node } from '../scene/Node.js' */\n/** @import { Scale, ColorScale } from './scales.js' */\n/** @import { Channel, normalise } from './spec.js' */\n\n/**\n * @typedef {object} MarkContext\n * @property {ReturnType<typeof normalise>} spec\n * @property {[number, number, number]} box\n * @property {{ x?: Scale, y?: Scale, z?: Scale }} scales\n * @property {Scale | null} size\n * @property {(row: any) => number[]} rgb a row's colour, sRGB 0-1\n * @property {'dark' | 'light'} theme\n * @property {'dim' | 'hide' | 'show'} overlap what the chart's labels do when covered\n * @property {(channel: Channel, value: any) => string} format\n * @property {(value: any) => import('../value/Color.js').Color} linkColor a network link's colour for a value\n */\n\n/**\n * What a mark draws for some rows: a state of `stride` numbers per item, and the rows behind them.\n * Keyed items can enter, move and leave one by one; unkeyed states only tween when their shapes match.\n * @typedef {object} Target\n * @property {any[]} rows\n * @property {any[] | null} keys\n * @property {Float32Array} state\n * @property {number} stride\n * @property {any} [shape] mark-specific layout that stays fixed through a tween (series lengths, grid size)\n */\n\n/**\n * @typedef {object} Mark\n * @property {Node[]} nodes\n * @property {(rows: any[]) => Target} layout\n * @property {(state: Float32Array, target: Target) => void} apply\n * @property {(item: Float32Array) => void} [enter] make one item's state absent (zero height, zero size)\n * @property {(dt: number) => void} [tick] per-frame work, such as flowing packets\n * @property {(hit: any) => any} [tooltipRows] which tooltip channels apply to a hit, when not the chart's\n */\n\n/** The theme's label class for values on marks. @param {MarkContext} ctx */\nconst valueClass = (ctx) => `phoria-value phoria-${ctx.theme}`\n\n/**\n * The label option for an InstancedMesh or Points, from the label channel.\n * @param {MarkContext} ctx @param {'above' | 'center'} place\n */\nexport function labelsOf(ctx, place) {\n const c = ctx.spec.channels.label\n if (!c) return null\n const p = c.priority\n const priority = typeof p === 'function' ? p : typeof p === 'string' ? (row) => Number(row[p]) || 0 : (p ?? 0)\n return { text: (row) => (row ? ctx.format(c, c.get(row)) : null), place, className: valueClass(ctx), priority, occlude: true, overlap: ctx.overlap }\n}\n\n/** A position along a scale; bands give their centre. @param {Scale | undefined} s @param {Channel | undefined} c @param {any} row */\nconst pos = (s, c, row) => (s && c ? s(c.get(row)) : 0)\n\n// --- bars ---------------------------------------------------------------------------------\n\n/** @param {MarkContext} ctx @returns {Mark} */\nexport function barMark(ctx) {\n let mesh = makeBars(64, ctx)\n const mark = {\n nodes: [mesh],\n layout(rows) {\n const { x, y, z } = ctx.scales, ch = ctx.spec.channels\n const share = ctx.spec.options.width ?? 0.7\n const w = (x.bandwidth ?? ctx.box[0] / 20) * share / (1 - 0.2)\n const d = z?.bandwidth !== undefined ? z.bandwidth * share / (1 - 0.2) : Math.min(w, ctx.box[2] * 0.8)\n const base = y(Math.max(y.domain[0], Math.min(0, y.domain[1])))\n // stacking: running totals per x (and z), in row order\n const stacks = new Map()\n const stride = 9, state = new Float32Array(rows.length * stride)\n rows.forEach((row, i) => {\n const v = Number(ch.y.get(row)) || 0\n let y0 = base, y1 = y(v)\n if (ctx.spec.options.stack) {\n const at = stackKey(ch, row, v)\n const below = stacks.get(at) ?? 0\n y0 = y(below)\n y1 = y(below + v)\n stacks.set(at, below + v)\n }\n state.set([pos(x, ch.x, row), pos(z, ch.z, row), y0, y1, w, d, ...ctx.rgb(row)], i * stride)\n })\n return { rows, keys: keysOf(ctx, rows), state, stride }\n },\n apply(state, target) {\n const n = state.length / target.stride\n if (n > mesh.instanceMatrices.length / 16) {\n // more bars than room: a bigger mesh, swapped in place\n const bigger = makeBars(n * 2, ctx)\n mesh.parent?.add(bigger)\n mesh.parent?.remove(mesh)\n mesh.dispose()\n mark.nodes[0] = mesh = bigger\n }\n mesh.count = n\n mesh.data = target.rows\n for (let i = 0; i < n; i++) {\n const [x, z, y0, y1, w, d, r, g, b] = state.subarray(i * 9, i * 9 + 9)\n mesh.setInstance(i, { position: [x, (y0 + y1) / 2, z], scale: [w, Math.max(1e-3, Math.abs(y1 - y0)), d], color: [r, g, b] })\n }\n },\n enter(item) {\n item[3] = item[2]\n },\n }\n return mark\n}\n\n/** @param {number} capacity @param {MarkContext} ctx */\nfunction makeBars(capacity, ctx) {\n const mesh = new InstancedMesh({ geometry: boxGeometry(1), material: { roughness: 0.55 }, count: capacity, labels: labelsOf(ctx, 'above') })\n mesh.count = 0\n return mesh\n}\n\n/** Keys for transitions: the key channel, an id field, or nothing (match by order). @param {MarkContext} ctx @param {any[]} rows */\nfunction keysOf(ctx, rows) {\n const k = ctx.spec.channels.key\n if (k) return rows.map((r) => k.get(r))\n if (rows.length && rows[0] && 'id' in rows[0]) return rows.map((r) => r.id)\n return rows.map((_, i) => i)\n}\n\n// --- points -------------------------------------------------------------------------------\n\n/** @param {MarkContext} ctx @returns {Mark} */\nexport function pointMark(ctx) {\n const sized = !!ctx.spec.channels.size?.field\n const unit = Math.min(...ctx.box) / 40\n const opacity = ctx.spec.channels.opacity?.value\n const material = { roughness: 0.4, ...(opacity !== undefined ? { opacity } : {}) }\n /** @type {any} */\n let node = sized\n ? new InstancedMesh({ geometry: icosphere({ radius: 1, detail: 1 }), material, count: 64, labels: labelsOf(ctx, 'above') })\n // dots with a darker rim, so each one reads where they crowd together - drawn furthest first, so\n // each blends over the ones behind it\n : new Points({ geometry: emptyPoints(64), material: { size: ctx.spec.channels.size?.value ?? unit * 1.4, vertexColors: true, map: dot(), depthWrite: false, ...material },\n sort: true, labels: labelsOf(ctx, 'above') })\n if (sized) node.count = 0\n const mark = {\n nodes: [node],\n layout(rows) {\n const { x, y, z } = ctx.scales, ch = ctx.spec.channels\n const stride = sized ? 7 : 6, state = new Float32Array(rows.length * stride)\n rows.forEach((row, i) => {\n const p = [pos(x, ch.x, row), pos(y, ch.y, row), pos(z, ch.z, row)]\n state.set(sized ? [...p, ctx.size(ch.size.get(row)), ...ctx.rgb(row)] : [...p, ...ctx.rgb(row)], i * stride)\n })\n return { rows, keys: keysOf(ctx, rows), state, stride }\n },\n apply(state, target) {\n const n = state.length / target.stride\n node.data = target.rows\n if (sized) {\n if (n > node.instanceMatrices.length / 16) {\n const bigger = new InstancedMesh({ geometry: node.geometry, material: node.material, count: n * 2, labels: node.labels })\n node.parent?.add(bigger)\n node.parent?.remove(node)\n mark.nodes[0] = node = bigger\n }\n node.count = n\n for (let i = 0; i < n; i++) {\n const [x, y, z, s, r, g, b] = state.subarray(i * 7, i * 7 + 7)\n node.setInstance(i, { position: [x, y, z], scale: Math.max(1e-4, s), color: [r, g, b] })\n }\n return\n }\n const geometry = node.geometry\n if (n > geometry.vertexCount) node.geometry = emptyPoints(n * 2)\n const p = node.geometry.positions, c = node.geometry.colors\n for (let i = 0; i < n; i++) {\n p.set(state.subarray(i * 6, i * 6 + 3), i * 3)\n c.set(state.subarray(i * 6 + 3, i * 6 + 6), i * 3)\n }\n node.geometry.drawCount = n\n node.geometry.needsUpdate()\n if (node.geometry !== geometry) geometry.dispose()\n },\n enter(item) {\n // points rise from the floor; sized points grow from nothing\n if (sized) item[3] = 0\n else item[1] = 0\n },\n }\n return mark\n}\n\n/** @type {Texture | null} */\nlet dotTexture = null\n\n/**\n * A dot: a white disc whose outer part darkens to a rim, with a soft edge - pixels of its own, so\n * charts need no canvas to make it. Shared by every scatter.\n */\nfunction dot() {\n if (dotTexture) return dotTexture\n const size = 64, data = new Uint8Array(size * size * 4), r = size / 2\n for (let y = 0; y < size; y++) {\n for (let x = 0; x < size; x++) {\n const d = Math.hypot(x + 0.5 - r, y + 0.5 - r) / r\n // the colour full to 0.78 of the radius, then down to 0.62 at the edge; alpha soft over the last pixel and a half\n const shade = d < 0.78 ? 1 : 1 - (d - 0.78) / 0.22 * 0.38\n const alpha = Math.min(1, Math.max(0, (1 - d) * r / 1.5))\n const o = (y * size + x) * 4\n data[o] = data[o + 1] = data[o + 2] = Math.round(shade * 255)\n data[o + 3] = Math.round(alpha * 255)\n }\n }\n return (dotTexture = new Texture({ image: { data, width: size, height: size } }))\n}\n\n/** @param {number} n */\nfunction emptyPoints(n) {\n const g = new Geometry({ positions: new Float32Array(n * 3), colors: new Float32Array(n * 3) })\n g.drawCount = 0\n return g\n}\n\n// --- lines and areas ----------------------------------------------------------------------\n\n/** @param {MarkContext} ctx @param {boolean} area @returns {Mark} */\nexport function lineMark(ctx, area) {\n const lines = new Lines({ geometry: new Geometry({ positions: [0, 0, 0, 0, 0, 0] }), material: { width: 2.5, vertexColors: true }, pickable: false })\n const dots = new Points({ geometry: emptyPoints(8), material: { size: 7, sizeAttenuation: false, vertexColors: true }, labels: labelsOf(ctx, 'above') })\n const fill = area ? new Mesh({ geometry: new Geometry({ positions: [0, 0, 0, 0, 0, 0, 0, 0, 0] }), material: { vertexColors: true, opacity: 0.55, doubleSided: true, unlit: true }, pickable: false }) : null\n return {\n nodes: fill ? [fill, lines, dots] : [lines, dots],\n layout(rows) {\n const { x, y, z } = ctx.scales, ch = ctx.spec.channels\n // series by colour, detail or z field; each in x order\n const by = ch.color?.field ? ch.color : ch.detail ?? (ch.z?.field ? ch.z : null)\n const groups = new Map()\n for (const row of rows) {\n const k = by ? String(by.get(row)) : ''\n if (!groups.has(k)) groups.set(k, [])\n groups.get(k).push(row)\n }\n // in order along the x axis, whatever its type (numbers, dates or categories)\n const series = [...groups.values()].map((g) => g.sort((a, b) => x(ch.x.get(a)) - x(ch.x.get(b))))\n // stacked areas: each series sits on the running total at its x\n const totals = new Map()\n const ordered = series.flat()\n const state = new Float32Array(ordered.length * 4)\n let i = 0\n for (const s of series) {\n for (const row of s) {\n const xv = ch.x.get(row), v = Number(ch.y.get(row)) || 0\n const at = stackKey(ch, row, v)\n const below = ctx.spec.options.stack ? totals.get(at) ?? 0 : 0\n if (ctx.spec.options.stack) totals.set(at, below + v)\n state.set([x(xv), y(below + v), pos(z, ch.z, row), y(below)], i * 4)\n i++\n }\n }\n return { rows: ordered, keys: null, state, stride: 4, shape: { lengths: series.map((s) => s.length), colors: series.map((s) => ctx.rgb(s[0])) } }\n },\n apply(state, target) {\n const { lengths, colors } = target.shape\n const seg = [], segColors = [], dotPos = [], dotColors = [], tri = [], triColors = [], index = []\n let i = 0\n lengths.forEach((n, s) => {\n const c = colors[s]\n for (let k = 0; k < n; k++, i++) {\n const [px, py, pz, base] = state.subarray(i * 4, i * 4 + 4)\n dotPos.push(px, py, pz)\n dotColors.push(...c)\n if (k > 0) {\n seg.push(...state.subarray((i - 1) * 4, (i - 1) * 4 + 3), px, py, pz)\n segColors.push(...c, ...c)\n }\n if (fill) {\n const v = triColors.length / 3\n tri.push(px, py, pz, px, base, pz)\n triColors.push(...c, ...c)\n if (k > 0) index.push(v - 2, v - 1, v, v - 1, v + 1, v)\n }\n }\n })\n lines.geometry = replace(lines.geometry, seg.length ? { positions: seg, colors: segColors } : { positions: [0, 0, 0, 0, 0, 0] })\n dots.geometry = replace(dots.geometry, { positions: dotPos.length ? dotPos : [0, 0, 0], colors: dotPos.length ? dotColors : [0, 0, 0] })\n dots.geometry.drawCount = dotPos.length / 3\n // dense series get smaller dots, so the line still reads\n dots.material.size = Math.max(...lengths, 0) > 40 ? 4 : 7\n dots.data = target.rows\n if (fill) fill.geometry = replace(fill.geometry, index.length ? { positions: tri, colors: triColors, indices: index } : { positions: [0, 0, 0, 0, 0, 0, 0, 0, 0] })\n },\n }\n}\n\n/** A new geometry in place of an old one, freeing the old one's GPU copy. @param {Geometry} old @param {any} options */\nfunction replace(old, options) {\n old.dispose()\n return new Geometry(options)\n}\n\n// --- surfaces -----------------------------------------------------------------------------\n\n/** @param {MarkContext} ctx @returns {Mark} */\nexport function surfaceMark(ctx) {\n const mesh = new Mesh({ geometry: new Geometry({ positions: [0, 0, 0, 0, 0, 0, 0, 0, 0] }), material: { vertexColors: true, roughness: 0.6, doubleSided: true } })\n return {\n nodes: [mesh],\n layout(rows) {\n const { x, y, z } = ctx.scales, ch = ctx.spec.channels\n const xs = distinct(rows.map((r) => ch.x.get(r))), zs = distinct(rows.map((r) => ch.z.get(r)))\n const grid = new Map(rows.map((r) => [`${+ch.x.get(r)}|${+ch.z.get(r)}|${ch.x.get(r)}|${ch.z.get(r)}`, r]))\n const cell = (a, b) => grid.get(`${+a}|${+b}|${a}|${b}`)\n const missing = xs.length * zs.length - grid.size\n if (missing > 0) {\n const gap = xs.flatMap((a) => zs.map((b) => [a, b])).find(([a, b]) => !cell(a, b))\n fail('chart()', `a surface needs a value for every x and z pair - ${missing} of ${xs.length * zs.length} are missing (first: x ${gap[0]}, z ${gap[1]})`)\n }\n const ordered = [], state = new Float32Array(xs.length * zs.length * 6)\n let i = 0\n for (const b of zs) {\n for (const a of xs) {\n const row = cell(a, b)\n ordered.push(row)\n state.set([x(a), y(Number(ch.y.get(row)) || 0), z(b), ...ctx.rgb(row)], i++ * 6)\n }\n }\n return { rows: ordered, keys: null, state, stride: 6, shape: { nx: xs.length, nz: zs.length } }\n },\n apply(state, target) {\n const { nx, nz } = target.shape\n const positions = [], colors = [], indices = []\n for (let i = 0; i < nx * nz; i++) {\n positions.push(...state.subarray(i * 6, i * 6 + 3))\n colors.push(...state.subarray(i * 6 + 3, i * 6 + 6))\n }\n for (let j = 0; j < nz - 1; j++) {\n for (let i = 0; i < nx - 1; i++) {\n const a = j * nx + i, b = a + 1, c = a + nx, d = c + 1\n indices.push(a, c, b, b, c, d)\n }\n }\n mesh.geometry = replace(mesh.geometry, { positions, colors, indices })\n // a row per vertex: picking gives the nearest grid point's row\n mesh.data = target.rows\n },\n }\n}\n\n","// The network mark: nodes as instanced spheres, links as lines, laid out by force, by tiers or from\n// the data. Layouts are deterministic (seeded), and updates start from where nodes already are, so a\n// live map changes colour without moving.\nimport { Geometry } from '../geometry/Geometry.js'\nimport { icosphere } from '../geometry/generators.js'\nimport { InstancedMesh, Lines, Points } from '../scene/drawables.js'\nimport { Color } from '../value/Color.js'\nimport { describe, fail } from '../validate.js'\nimport { labelsOf } from './marks.js'\n\n/** @import { MarkContext, Mark } from './marks.js' */\n\n/** Seeded random numbers (mulberry32): the same graph lays out the same way every time. @param {number} seed */\nfunction random(seed) {\n return () => {\n seed = (seed + 0x6d2b79f5) | 0\n let t = Math.imul(seed ^ (seed >>> 15), 1 | seed)\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n}\n\n// link widths in pixels for thin, medium and thick links\nconst WIDTHS = [1.2, 2.5, 4.5]\n\n/**\n * @param {MarkContext} ctx\n * @returns {Mark}\n */\nexport function networkMark(ctx) {\n const o = ctx.spec.options\n const keyOf = keyGetter(ctx)\n const linkCh = ctx.spec.link\n const source = o.source ?? 'source', target = o.target ?? 'target'\n /** @type {Map<any, number[]>} layout positions by key, kept between updates for stability */\n let placed = new Map()\n const makeNodes = (/** @type {number} */ capacity) => new InstancedMesh({ geometry: icosphere({ radius: 1, detail: 2 }), material: { roughness: 0.35 }, count: capacity, labels: labelsOf(ctx, 'above') })\n let nodesMesh = makeNodes(Math.max(8, ctx.spec.rows.length * 2))\n nodesMesh.count = 0\n // links in up to three widths; each segment carries its link's row\n const linkNodes = WIDTHS.map((width) => new Lines({ geometry: new Geometry({ positions: [0, 0, 0, 0, 0, 0] }), material: { width, vertexColors: true }, data: [] }))\n const active = new Lines({ geometry: new Geometry({ positions: [] }), material: { width: 4, color: '#7fd3ff' }, pickable: false, visible: false })\n // packets small beside the nodes, so the traffic reads as motion along the links, not more nodes\n const packets = linkCh.flow ? new Points({ geometry: new Geometry({ positions: [] }), material: { size: 0.012 * Math.min(...ctx.box), color: '#bff0ff' }, pickable: false }) : null\n /** @type {{ a: number, b: number, speed: number, phase: number }[]} */\n let flows = []\n /** the drawn node positions, by row index, as of the last apply */\n let at = []\n /** @type {any[]} */ let links = []\n /** @type {any[]} */ let rowsNow = []\n /** the hovered node by its key, not its row - rows move and go when the data changes; null for none */\n /** @type {unknown} */ let hovered = null\n\n const mark = {\n nodes: [...linkNodes, active, nodesMesh, ...(packets ? [packets] : [])],\n layout(rows) {\n const keys = rows.map(keyOf)\n const index = new Map(keys.map((k, i) => [k, i]))\n links = ctx.spec.links.filter((l, i) => {\n const a = l[source], b = l[target]\n if (a === undefined || b === undefined) fail('chart()', `link ${i} has no '${a === undefined ? source : target}' - links name their ends with source: '${source}', target: '${target}' (set 'source' and 'target' to your field names)`)\n if (!ctx.spec.rows.some((r) => keyOf(r) === a)) fail('chart()', `link ${i}: ${source} ${describe(a)} names no node`)\n if (!ctx.spec.rows.some((r) => keyOf(r) === b)) fail('chart()', `link ${i}: ${target} ${describe(b)} names no node`)\n // links to hidden nodes are hidden too\n return index.has(a) && index.has(b)\n })\n const pairs = links.map((l) => [index.get(l[source]), index.get(l[target])])\n const positions = place(rows, keys, pairs)\n const stride = 7, state = new Float32Array(rows.length * stride)\n rows.forEach((row, i) => state.set([...positions[i], ctx.size ? ctx.size(ctx.spec.channels.size.get(row)) : 0.06 * Math.min(...ctx.box), ...ctx.rgb(row)], i * stride))\n return { rows, keys, state, stride, shape: { pairs: links.map((l) => [l[source], l[target]]) } }\n },\n apply(state, t) {\n const n = state.length / t.stride\n rowsNow = t.rows\n // a hovered node that has gone from the data is hovered no longer\n if (hovered !== null && !rowsNow.some((r) => keyOf(r) === hovered)) {\n hovered = null\n active.visible = false\n }\n if (n > nodesMesh.instanceMatrices.length / 16) {\n // more nodes than room - arriving and leaving ones together, in a transition: a bigger mesh,\n // swapped in place, keeping its hover handler\n const bigger = makeNodes(n * 2)\n if (neighbours) bigger.on('hover', hover)\n nodesMesh.parent?.add(bigger)\n nodesMesh.parent?.remove(nodesMesh)\n nodesMesh.dispose()\n mark.nodes[mark.nodes.indexOf(nodesMesh)] = bigger\n nodesMesh = bigger\n }\n nodesMesh.count = n\n nodesMesh.data = t.rows\n const keys = t.rows.map(keyOf)\n const index = new Map(keys.map((k, i) => [k, i]))\n at = []\n for (let i = 0; i < n; i++) {\n const [x, y, z, s, r, g, b] = state.subarray(i * 7, i * 7 + 7)\n at.push([x, y, z])\n nodesMesh.setInstance(i, { position: [x, y, z], scale: Math.max(1e-4, s), color: dimmed(i, [r, g, b]) })\n }\n // links follow their nodes, so they move with any transition\n const byWidth = WIDTHS.map(() => ({ positions: [], colors: [], rows: [] }))\n flows = []\n links.forEach((link, li) => {\n const a = index.get(link[source]), b = index.get(link[target])\n if (a === undefined || b === undefined) return\n const bucket = byWidth[widthClass(link)]\n const c = linkColor(link)\n bucket.positions.push(...at[a], ...at[b])\n bucket.colors.push(...c, ...c)\n bucket.rows.push(link)\n if (linkCh.flow) flows.push({ a, b, speed: flowSpeed(link), phase: (li * 0.618) % 1 })\n })\n linkNodes.forEach((node, i) => {\n const bucket = byWidth[i]\n node.geometry.dispose()\n node.geometry = new Geometry(bucket.positions.length ? { positions: bucket.positions, colors: bucket.colors } : { positions: [0, 0, 0, 0, 0, 0] })\n node.visible = bucket.positions.length > 0\n node.data = bucket.rows\n })\n if (hovered !== null) showNeighbours(hovered)\n },\n enter(item) {\n item[3] = 0\n },\n tick(dt) {\n if (!packets || !flows.length) return\n const p = new Float32Array(flows.length * 3)\n flows.forEach((f, i) => {\n f.phase = (f.phase + dt * f.speed) % 1\n const a = at[f.a], b = at[f.b]\n for (let k = 0; k < 3; k++) p[i * 3 + k] = a[k] + (b[k] - a[k]) * f.phase\n })\n if (packets.geometry.vertexCount !== flows.length) {\n packets.geometry.dispose()\n packets.geometry = new Geometry({ positions: p })\n } else {\n packets.geometry.positions.set(p)\n packets.geometry.needsUpdate()\n }\n },\n tooltipRows(hit) {\n return linkNodes.includes(hit.node) ? 'link' : 'node'\n },\n }\n\n // neighbour highlight: the hovered node's links light up, and nodes it doesn't touch dim\n const neighbours = (o.highlight ?? 'neighbours') === 'neighbours'\n if (neighbours) {\n // on the nodes themselves, so the chart's own onHover stays the app's: the view tells this one\n // the hit while the pointer is over a node, and null when it leaves them\n nodesMesh.on('hover', hover)\n }\n /** @param {any} hit */\n function hover(hit) {\n const key = hit && hit.node === nodesMesh && hit.instance !== null ? keyOf(rowsNow[hit.instance]) : null\n if (key === hovered) return\n hovered = key\n active.visible = key !== null\n if (key !== null) showNeighbours(key)\n // recolour every node for the dimming, or back\n for (let k = 0; k < nodesMesh.count; k++) nodesMesh.setColor(k, dimmed(k, ctx.rgb(rowsNow[k])))\n }\n\n /** @param {unknown} key */\n function showNeighbours(key) {\n const p = []\n for (const l of links) {\n if (l[source] !== key && l[target] !== key) continue\n const a = rowsNow.findIndex((r) => keyOf(r) === l[source]), b = rowsNow.findIndex((r) => keyOf(r) === l[target])\n if (a >= 0 && b >= 0) p.push(...at[a], ...at[b])\n }\n active.geometry.dispose()\n active.geometry = new Geometry({ positions: p })\n }\n\n /** A node's colour, dimmed while another node and its neighbours are highlighted. @param {number} k @param {number[]} rgb */\n function dimmed(k, rgb) {\n if (hovered === null || !neighbours) return rgb\n const other = keyOf(rowsNow[k])\n if (other === hovered) return rgb\n const near = links.some((l) => (l[source] === hovered && l[target] === other) || (l[target] === hovered && l[source] === other))\n if (near) return rgb\n const c = new Color().setSRGB(rgb[0], rgb[1], rgb[2]).lerp(ctx.theme === 'light' ? '#ffffff' : '#202024', 0.65)\n return c.toSRGB()\n }\n\n /** @param {any} link */\n function widthClass(link) {\n const c = linkCh.width\n if (!c) return 0\n if (c.field === null) return c.value >= 3.5 ? 2 : c.value >= 2 ? 1 : 0\n const values = ctx.spec.links.map((l) => Number(c.get(l)) || 0)\n const max = Math.max(...values) || 1\n return Math.min(2, Math.floor((Number(c.get(link)) || 0) / max * 2.999))\n }\n\n /** @param {any} link @returns {number[]} */\n function linkColor(link) {\n const c = linkCh.color\n const base = ctx.theme === 'light' ? '#9aa3b2' : '#4a5266'\n if (!c) return Color.fromInput(base).toSRGB()\n if (c.field === null) return Color.fromInput(c.value).toSRGB()\n return ctx.linkColor(c.get(link)).toSRGB()\n }\n\n /** @param {any} link */\n function flowSpeed(link) {\n const c = linkCh.flow\n if (c.field === null) return 0.4\n const max = Math.max(...ctx.spec.links.map((l) => Number(c.get(l)) || 0)) || 1\n return 0.15 + 0.6 * (Number(c.get(link)) || 0) / max\n }\n\n /**\n * Node positions in the chart box, by layout.\n * @param {any[]} rows @param {any[]} keys @param {number[][]} pairs\n * @returns {number[][]}\n */\n function place(rows, keys, pairs) {\n const [w, h, d] = ctx.box\n const layout = o.layout ?? 'force'\n if (layout === 'given') {\n const { x, y, z } = ctx.scales, ch = ctx.spec.channels\n return rows.map((r) => [x && ch.x ? x(ch.x.get(r)) : 0, y && ch.y ? y(ch.y.get(r)) : h / 2, z && ch.z ? z(ch.z.get(r)) : 0])\n }\n if (layout && typeof layout === 'object' && 'tiers' in layout) return tiers(rows, keys, pairs, layout, [w, h, d])\n if (layout !== 'force') fail('chart()', `layout ${describe(layout)} - expected 'force', 'given' or { tiers: 'field' }`)\n const raw = force(keys, pairs)\n // fit the layout into the box, keeping its proportions\n const lo = [Infinity, Infinity, Infinity], hi = [-Infinity, -Infinity, -Infinity]\n for (const p of raw) for (let k = 0; k < 3; k++) { lo[k] = Math.min(lo[k], p[k]); hi[k] = Math.max(hi[k], p[k]) }\n const span = Math.max(...hi.map((v, k) => v - lo[k]), 1e-6)\n const s = Math.min(w, o.flat ? d : Math.min(h, d)) * 0.9 / span\n const c = hi.map((v, k) => (v + lo[k]) / 2)\n return raw.map((p) => [(p[0] - c[0]) * s, o.flat ? 0 : (p[1] - c[1]) * s + h / 2, (p[2] - c[2]) * s])\n }\n\n /**\n * An organic layout by stress: nodes are placed so the distance between any two is as near as it\n * can be to the number of links between them. Every link comes out about the same length, a node\n * with one link sits beside its neighbour rather than flung out, and the whole spreads evenly -\n * where a force layout leaves a dense middle and far-off leaves, which then set the scale.\n */\n function force(keys, pairs) {\n const n = keys.length, rand = random(o.seed ?? 1), dims = o.flat ? [0, 2] : [0, 1, 2]\n const warm = keys.some((key) => placed.has(key))\n const steps = o.steps ?? (warm ? 60 : 300)\n // links between every pair: breadth first from each node; parts not joined sit a hop beyond the furthest\n const near = keys.map(() => /** @type {number[]} */ ([]))\n for (const [a, b] of pairs) {\n near[a].push(b)\n near[b].push(a)\n }\n const hops = new Float32Array(n * n).fill(Infinity)\n let furthest = 1\n for (let s = 0; s < n; s++) {\n const queue = [s]\n hops[s * n + s] = 0\n for (let q = 0; q < queue.length; q++) {\n const at = queue[q], h = hops[s * n + at] + 1\n for (const t of near[at]) {\n if (hops[s * n + t] !== Infinity) continue\n hops[s * n + t] = h\n furthest = Math.max(furthest, h)\n queue.push(t)\n }\n }\n }\n const p = keys.map((key, i) => {\n if (placed.has(key)) return [...placed.get(key)]\n // a new node starts beside a neighbour that is already placed, or anywhere\n const next = near[i].find((j) => placed.has(keys[j]))\n const from = next === undefined ? [0, 0, 0] : placed.get(keys[next])\n const spread = next === undefined ? Math.sqrt(n) : 0.5\n return [from[0] + (rand() - 0.5) * spread, o.flat ? 0 : from[1] + (rand() - 0.5) * spread, from[2] + (rand() - 0.5) * spread]\n })\n // each node in turn moves to where its distances to all the others fit best, nearer ones counting more\n const to = [0, 0, 0]\n for (let step = 0; step < steps; step++) {\n for (let i = 0; i < n; i++) {\n to.fill(0)\n let weights = 0\n for (let j = 0; j < n; j++) {\n if (i === j) continue\n const h = hops[i * n + j], want = h === Infinity ? furthest + 1 : h, w = 1 / (want * want)\n const dx = p[i][0] - p[j][0], dy = p[i][1] - p[j][1], dz = p[i][2] - p[j][2]\n const len = Math.hypot(dx, dy, dz) || 1e-6\n to[0] += w * (p[j][0] + want * dx / len)\n to[1] += w * (p[j][1] + want * dy / len)\n to[2] += w * (p[j][2] + want * dz / len)\n weights += w\n }\n if (weights) for (const c of dims) p[i][c] = to[c] / weights\n }\n }\n placed = new Map(keys.map((key, i) => [key, p[i]]))\n return p\n }\n\n return mark\n}\n\n/**\n * Tiers: rings stacked top to bottom by a field, each ring ordered to sit under its links.\n * @param {any[]} rows @param {any[]} keys @param {number[][]} pairs\n * @param {{ tiers: string, order?: any[] }} layout @param {number[]} box\n */\nfunction tiers(rows, keys, pairs, layout, [w, h, d]) {\n const field = layout.tiers\n if (!rows.length) return []\n if (!(field in rows[0])) fail('chart()', `layout: { tiers: '${field}' } - '${field}' isn't a node field`)\n const order = layout.order ?? [...new Set(rows.map((r) => r[field]))]\n const tierOf = rows.map((r) => Math.max(0, order.indexOf(r[field])))\n const count = Math.max(...tierOf) + 1\n const angle = new Array(rows.length).fill(0)\n const out = new Array(rows.length)\n const radius = Math.min(w, d) / 2 * 0.92\n for (let t = 0; t < count; t++) {\n const members = rows.map((_, i) => i).filter((i) => tierOf[i] === t)\n // sit under the nodes they link to in the tier above: order by those nodes' angles\n const pull = (i) => {\n const above = pairs.filter(([a, b]) => a === i || b === i).map(([a, b]) => (a === i ? b : a)).filter((j) => tierOf[j] < t)\n return above.length ? above.reduce((s, j) => s + angle[j], 0) / above.length : members.indexOf(i)\n }\n if (t > 0) members.sort((a, b) => pull(a) - pull(b))\n const r = members.length === 1 ? 0 : t === 0 ? radius * 0.25 : radius * (0.35 + 0.65 * t / Math.max(1, count - 1))\n members.forEach((i, m) => {\n angle[i] = (m + 0.5) / members.length * Math.PI * 2\n out[i] = [Math.cos(angle[i]) * r, h * (1 - t / Math.max(1, count - 1)), Math.sin(angle[i]) * r]\n })\n }\n void keys\n return out\n}\n\n/** @param {MarkContext} ctx */\nfunction keyGetter(ctx) {\n const k = ctx.spec.channels.key\n if (k) return (row) => k.get(row)\n if (ctx.spec.rows.length && !('id' in ctx.spec.rows[0])) fail('chart()', \"network nodes need an 'id' field, or key: 'yourIdField' - links name nodes by it\")\n return (row) => row.id\n}\n","// Chart specs in, normalised specs out: channels resolved to fields or constants, types inferred,\n// and every mistake explained - including Vega-Lite, ECharts and Plotly habits - since a spec is\n// exactly what an agent writes.\nimport { Color } from '../value/Color.js'\nimport { checkNumber, describe, didYouMean, fail } from '../validate.js'\nimport { toDate } from './scales.js'\n\n/** @typedef {'quantitative' | 'nominal' | 'ordinal' | 'temporal'} FieldType */\n/** @typedef {'bar' | 'point' | 'line' | 'area' | 'surface' | 'network'} Mark */\n\n/**\n * A channel after normalising: a field (with a type and a getter) or a constant value.\n * @typedef {object} Channel\n * @property {string | null} field\n * @property {any} value a constant, when there is no field\n * @property {FieldType} type\n * @property {string} title for axes, legends and tooltips\n * @property {any} format Intl options or a function\n * @property {Record<string, any>} scale scale options: domain, range, scheme, zero, nice, type\n * @property {Record<string, any> | false} axis\n * @property {(row: any) => any} get the row's value (dates parsed)\n * @property {any} [priority] labels: a number, a field name or a function\n */\n\nexport const MARKS = /** @type {Mark[]} */ (['bar', 'point', 'line', 'area', 'surface', 'network'])\nexport const CHANNELS = ['x', 'y', 'z', 'color', 'size', 'opacity', 'label', 'key', 'detail']\nexport const OPTIONS = ['mark', 'data', 'encoding', 'tooltip', 'box', 'stack', 'width', 'layout', 'flat', 'steps', 'seed',\n 'source', 'target', 'link', 'highlight', 'legend', 'theme', 'overlap', 'transition', 'title', '$schema', 'description', ...CHANNELS]\nexport const CHANNEL_OPTIONS = ['field', 'type', 'title', 'format', 'scale', 'axis', 'value', 'priority', 'legend']\n\n// what other chart libraries call things\nexport const OPTION_HINTS = {\n series: \"phoria2 charts map fields to channels instead of listing series - e.g. { mark: 'bar', x: 'month', y: 'sales', color: 'region' }\",\n xAxis: \"axes come from the channels - use x: { field, axis: { title } }\",\n yAxis: \"axes come from the channels - use y: { field, axis: { title } }\",\n zAxis: \"axes come from the channels - use z: { field, axis: { title } }\",\n type: \"use mark: 'bar' | 'point' | 'line' | 'area' | 'surface' | 'network'\",\n transform: \"transforms aren't supported - filter, sum or sort the rows before charting them\",\n selection: \"use view.on('click', (hit) => ...) or a chart's onClick; hit.datum is the row\",\n params: \"use view.on('click', (hit) => ...) or a chart's onClick; hit.datum is the row\",\n facet: 'small multiples aren\\'t supported - make one chart (or one View) per panel',\n repeat: 'small multiples aren\\'t supported - make one chart (or one View) per panel',\n layer: 'layers aren\\'t supported yet - add several charts to the same scene with the same box',\n hconcat: 'put each chart in its own View', vconcat: 'put each chart in its own View', concat: 'put each chart in its own View',\n height: \"the canvas sets the size in pixels; 'box' sets the chart's size in the scene\",\n colour: \"use 'color'\", colors: \"use color: { field, scale: { range: [...] } }\",\n nodes: \"a network's nodes and links go in data: { nodes, links }\", links: \"a network's nodes and links go in data: { nodes, links }\",\n}\nconst MARK_HINTS = {\n scatter: 'point', scatter3d: 'point', circle: 'point', dots: 'point', column: 'bar', bars: 'bar', histogram: 'bar',\n heatmap: 'surface', mesh3d: 'surface', graph: 'network', tree: 'network', ribbon: 'area', lines: 'line', rect: 'bar',\n}\nexport const CHANNEL_HINTS = {\n overlap: \"set overlap on the chart - { overlap: 'dim' | 'hide' | 'show' } - it applies to all the chart's labels\",\n aggregate: 'aggregate the rows first (e.g. sum per month) - charts draw rows as given',\n bin: 'bin the rows first - charts draw rows as given',\n timeUnit: 'round the dates in the rows first - charts draw rows as given',\n sort: 'sort with scale: { domain: [...] } in the order you want',\n stack: \"stacking is the chart's option: stack: true\",\n}\n\n/**\n * @param {Record<string, any>} input the spec as written\n * @returns {{ mark: Mark, rows: any[], links: any[], fields: string[], channels: Record<string, Channel>,\n * tooltip: Channel[] | ((hit: any) => any) | null, link: Record<string, Channel>, options: Record<string, any> }}\n */\nexport function normalise(input) {\n if (!input || typeof input !== 'object' || Array.isArray(input)) fail('chart()', `expected a spec such as { mark: 'bar', data, x, y }, got ${describe(input)}`)\n for (const key of Object.keys(input)) {\n if (OPTIONS.includes(key)) continue\n fail('chart()', `unknown option '${key}' - ${OPTION_HINTS[key] ?? `expected ${OPTIONS.filter((k) => k[0] !== '$').join(', ')}${didYouMean(key, OPTIONS)}`}`)\n }\n if (typeof input.width === 'number' && input.width > 1) fail('chart()', `'width' is a bar's share of its band (0-1); in Vega-Lite it is pixels - here the canvas sets the size`)\n\n const mark = markOf(input.mark)\n const { rows, links } = dataOf(input.data, mark)\n const fields = fieldsOf(rows)\n // Vega-Lite nests channels under 'encoding'; flat channels win if both are given\n const encoding = { ...(input.encoding ?? {}) }\n for (const key of Object.keys(encoding)) {\n if (!CHANNELS.includes(key) && key !== 'tooltip') fail('chart()', `encoding '${key}' isn't a channel we have - channels are ${CHANNELS.join(', ')}, tooltip`)\n }\n /** @type {Record<string, Channel>} */\n const channels = {}\n for (const name of CHANNELS) {\n const spec = input[name] ?? encoding[name]\n if (spec !== undefined && spec !== null) channels[name] = channel(name, spec, rows, fields)\n }\n if (mark === 'network') {\n for (const name of ['x', 'y', 'z']) {\n if (channels[name] && input.layout !== 'given') fail('chart()', `${name} on a 'network' places its nodes - add layout: 'given' to use positions from the data`)\n }\n } else {\n for (const name of mark === 'surface' ? ['x', 'z', 'y'] : ['x', 'y']) {\n if (!channels[name]) fail('chart()', `a '${mark}' chart needs ${name} - e.g. ${name}: '${fields[0] ?? 'field'}'`)\n // bars, lines, areas and surfaces are laid out along these scales; only points can sit at a constant\n if (mark !== 'point' && channels[name].field === null) {\n fail('chart()', `${name} on a '${mark}' chart lays its marks out along a scale - it needs a field, not a constant value - e.g. ${name}: '${fields[0] ?? 'field'}'`)\n }\n }\n }\n\n const tooltipSpec = input.tooltip ?? encoding.tooltip\n const markTooltip = typeof input.mark === 'object' ? input.mark.tooltip : undefined\n const tooltip = tooltipOf(tooltipSpec ?? (markTooltip === false ? false : undefined), channels, rows, fields)\n\n /** @type {Record<string, Channel>} */\n const link = {}\n if (input.link !== undefined) {\n if (mark !== 'network') fail('chart()', \"'link' sets a network's link channels - it needs mark: 'network'\")\n const linkFields = fieldsOf(links)\n for (const [name, spec] of Object.entries(input.link)) {\n if (!['width', 'color', 'opacity', 'flow', 'tooltip'].includes(name)) fail('chart()', `link has no '${name}' - link channels are width, color, opacity, flow, tooltip`)\n if (name !== 'tooltip') link[name] = channel(`link.${name}`, spec, links, linkFields)\n }\n if (input.link.tooltip !== undefined) link.tooltip = /** @type {any} */ (tooltipOf(input.link.tooltip, {}, links, linkFields))\n }\n\n const options = {}\n for (const key of OPTIONS) if (!CHANNELS.includes(key) && !['mark', 'data', 'encoding', 'tooltip', 'link'].includes(key) && input[key] !== undefined) options[key] = input[key]\n // a network's force layout: how long it settles, and where it starts\n if (options.steps !== undefined && (!Number.isInteger(options.steps) || options.steps < 1)) {\n fail('chart()', `'steps' is how many steps the force layout takes, a whole number of 1 or more, got ${describe(options.steps)}`)\n }\n if (options.seed !== undefined) checkNumber('chart()', 'seed', options.seed)\n if (options.legend?.ticks !== undefined) checkTicks('legend', options.legend.ticks)\n if (options.box !== undefined && (!Array.isArray(options.box) || options.box.length !== 3 || !options.box.every((n) => n > 0))) {\n fail('chart()', `'box' is the chart's size in the scene, [x, y, z] above 0, got ${describe(options.box)}`)\n }\n return { mark, rows, links, fields, channels, tooltip, link, options }\n}\n\n/** @param {unknown} v @returns {Mark} */\nfunction markOf(v) {\n let mark = v\n if (mark && typeof mark === 'object') {\n // Vega-Lite's { type: 'bar', tooltip: true }\n for (const key of Object.keys(mark)) {\n if (key !== 'type' && key !== 'tooltip') fail('chart()', `mark option '${key}' isn't supported - use the chart's options (width, stack, ...) or style the chart's nodes`)\n }\n mark = /** @type {any} */ (mark).type\n }\n if (typeof mark !== 'string') fail('chart()', `'mark' is required: one of ${MARKS.map((m) => `'${m}'`).join(', ')}`)\n if (!MARKS.includes(/** @type {Mark} */ (mark))) {\n const hint = MARK_HINTS[mark]\n if (mark === 'pie' || mark === 'arc' || mark === 'donut') fail('chart()', \"pie and donut charts aren't supported - in 3D they distort values; use mark: 'bar'\")\n fail('chart()', `mark '${mark}' - ${hint ? `use '${hint}'` : `expected one of ${MARKS.map((m) => `'${m}'`).join(', ')}${didYouMean(mark, MARKS)}`}`)\n }\n return /** @type {Mark} */ (mark)\n}\n\n/** @param {any} data @param {Mark} mark */\nfunction dataOf(data, mark) {\n if (data && typeof data === 'object' && !Array.isArray(data) && 'url' in data) {\n fail('chart()', \"data: { url } isn't loaded for you - fetch the rows and pass data: rows\")\n }\n if (mark === 'network') {\n if (!data || !Array.isArray(data.nodes) || !Array.isArray(data.links)) fail('chart()', `a network's data is { nodes: [...], links: [...] }, got ${describe(data)}`)\n return { rows: data.nodes, links: data.links }\n }\n const rows = Array.isArray(data) ? data : data && Array.isArray(data.values) ? data.values : null\n if (!rows) fail('chart()', `'data' must be an array of rows (objects), or { values: [...] }, got ${describe(data)}`)\n if (rows.some((r) => !r || typeof r !== 'object')) fail('chart()', \"every row in 'data' must be an object, such as { month: 'Jan', sales: 41 }\")\n return { rows, links: [] }\n}\n\n/** Field names from the first rows. @param {any[]} rows @returns {string[]} */\nfunction fieldsOf(rows) {\n const names = new Set()\n for (const row of rows.slice(0, 50)) for (const k of Object.keys(row)) names.add(k)\n return [...names]\n}\n\n/** @param {any[]} rows @param {string} field @returns {FieldType} */\nfunction inferType(rows, field) {\n const v = rows.find((r) => r[field] !== null && r[field] !== undefined)?.[field]\n if (typeof v === 'number') return 'quantitative'\n if (v instanceof Date || (typeof v === 'string' && /^\\d{4}-\\d{2}(-\\d{2})?([T ][\\d:.]+Z?)?$/.test(v))) return 'temporal'\n return 'nominal'\n}\n\n/**\n * @param {string} name @param {any} spec @param {any[]} rows @param {string[]} fields\n * @returns {Channel}\n */\nfunction channel(name, spec, rows, fields) {\n const owner = 'chart()'\n /** @type {Record<string, any>} */\n let o\n if (typeof spec === 'string') {\n if (fields.includes(spec)) o = { field: spec }\n else if (/color|colour/.test(name) && isColor(spec)) o = { value: spec }\n else fail(owner, `${name}: field '${spec}' isn't in the data - fields are ${fields.join(', ') || '(none)'}${didYouMean(spec, fields)}`)\n } else if (typeof spec === 'number' && ['size', 'opacity', 'link.width', 'link.opacity', 'link.flow'].includes(name)) {\n o = { value: spec }\n } else if (spec && typeof spec === 'object' && !Array.isArray(spec)) {\n o = spec\n for (const key of Object.keys(o)) {\n if (!CHANNEL_OPTIONS.includes(key)) fail(owner, `${name}: '${key}' - ${CHANNEL_HINTS[key] ?? `unknown; a channel takes ${CHANNEL_OPTIONS.join(', ')}`}`)\n }\n if (o.field !== undefined && !fields.includes(o.field)) {\n fail(owner, `${name}: field '${o.field}' isn't in the data - fields are ${fields.join(', ') || '(none)'}${didYouMean(String(o.field), fields)}`)\n }\n if (o.field === undefined && o.value === undefined) fail(owner, `${name} needs a field (or a constant value)`)\n } else {\n // a size given as [x, y, z] meant the chart's size\n if (name === 'size' && Array.isArray(spec)) fail(owner, \"'size' is a channel - the chart's size in the scene is 'box: [x, y, z]'\")\n return fail(owner, `${name} must be a field name or { field, ... }, got ${describe(spec)}`)\n }\n if (o.axis?.ticks !== undefined) checkTicks(`${name}: axis`, o.axis.ticks)\n const field = o.field ?? null\n const type = o.type ?? (field ? inferType(rows, field) : 'nominal')\n if (!['quantitative', 'nominal', 'ordinal', 'temporal'].includes(type)) {\n fail(owner, `${name}: type '${type}' - expected 'quantitative', 'nominal', 'ordinal' or 'temporal'${didYouMean(String(type), ['quantitative', 'nominal', 'ordinal', 'temporal'])}`)\n }\n const get = field === null ? () => o.value : type === 'temporal' ? (r) => toDate(r[field]) : (r) => r[field]\n return { field, value: o.value, type, title: o.title ?? field ?? name, format: o.format, scale: o.scale ?? {}, axis: o.axis ?? {}, get,\n priority: o.priority }\n}\n\n/** Ticks are a list of the values to mark, or about how many. @param {string} what @param {unknown} ticks */\nfunction checkTicks(what, ticks) {\n if (Array.isArray(ticks) || (Number.isInteger(ticks) && /** @type {number} */ (ticks) > 0)) return\n fail('chart()', `${what} ticks are a list of the values to mark, such as [0, 25, 50, 75, 100], or about how many, got ${describe(ticks)}`)\n}\n\n/** @param {string} s */\nfunction isColor(s) {\n try {\n Color.fromInput(s)\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Tooltip rows from fields, a function, or (by default) every channel with a field.\n * @param {any} spec @param {Record<string, Channel>} channels @param {any[]} rows @param {string[]} fields\n */\nfunction tooltipOf(spec, channels, rows, fields) {\n if (spec === false || spec === null) return null\n if (typeof spec === 'function') return spec\n if (spec === undefined || spec === true) {\n const seen = new Set()\n return Object.entries(channels).filter(([n, c]) => c.field && n !== 'key' && !seen.has(c.field) && seen.add(c.field)).map(([, c]) => c)\n }\n const list = Array.isArray(spec) ? spec : [spec]\n // a field named on its own reads as its channel does - with that channel's title and format\n const encoded = (item) => typeof item === 'string' && Object.entries(channels).find(([n, c]) => n !== 'key' && c.field === item)?.[1]\n return list.map((item) => encoded(item) || channel('tooltip', item, rows, fields))\n}\n","// Default looks for chart HTML - ticks, titles, value labels, legends - in :where() rules, which\n// have no specificity, so any app CSS for these classes wins. Added once, on first use.\n\nconst CSS = `\n/* ticks are bare text: the padding is breathing room, so the overlap the label layout allows never runs them together */\n:where(.phoria-axis-tick) { padding: 0 4px; color: #8b909c; font: 11px/1.2 system-ui, sans-serif; font-variant-numeric: tabular-nums; }\n:where(.phoria-axis-title) { color: #c8ccd4; font: 600 12px/1.2 system-ui, sans-serif; }\n:where(.phoria-value) { padding: 1px 5px; border-radius: 4px; background: rgba(16, 16, 20, 0.72); color: #eee;\n font: 11px/1.3 system-ui, sans-serif; font-variant-numeric: tabular-nums; }\n:where(.phoria-light.phoria-axis-tick) { color: #5d6370; }\n:where(.phoria-light.phoria-axis-title) { color: #2b2f37; }\n:where(.phoria-light.phoria-value) { background: rgba(255, 255, 255, 0.85); color: #222; }\n:where(.phoria-legend) { position: absolute; display: flex; flex-direction: column; gap: 3px; padding: 8px 10px;\n border-radius: 8px; background: rgba(20, 20, 24, 0.78); color: #e6e6e6; font: 12px/1.3 system-ui, sans-serif;\n pointer-events: auto; max-height: calc(100% - 24px); overflow: auto; }\n:where(.phoria-light.phoria-legend) { background: rgba(255, 255, 255, 0.88); color: #222; }\n:where(.phoria-legend-top-right) { top: 12px; right: 12px; }\n:where(.phoria-legend-top-left) { top: 12px; left: 12px; }\n:where(.phoria-legend-bottom-right) { bottom: 12px; right: 12px; }\n:where(.phoria-legend-bottom-left) { bottom: 12px; left: 12px; }\n:where(.phoria-legend-title) { opacity: 0.7; font-size: 11px; margin-bottom: 2px; }\n:where(.phoria-legend-item) { display: flex; align-items: center; gap: 6px; padding: 0; border: 0; background: none;\n color: inherit; font: inherit; text-align: left; cursor: pointer; }\n:where(.phoria-legend-item.off) { opacity: 0.35; }\n:where(.phoria-legend-swatch) { width: 10px; height: 10px; border-radius: 2px; flex: none; }\n/* a number key is up to 140px tall and gives way in a short view, so the legend never scrolls; its\n values share one grid cell, so the widest sets the key's width, each raised to its place */\n:where(.phoria-legend-key) { display: flex; gap: 6px; margin: 6px 0; flex: 0 1 140px; min-height: 48px; }\n:where(.phoria-legend-ramp) { width: 10px; border-radius: 2px; flex: none; }\n:where(.phoria-legend-scale) { display: grid; font-size: 11px; font-variant-numeric: tabular-nums; }\n:where(.phoria-legend-scale > span) { grid-area: 1 / 1; align-self: end; position: relative; transform: translateY(50%);\n white-space: nowrap; opacity: 0.8; }\n`\n\nexport function addStyle() {\n if (typeof document === 'undefined' || document.getElementById('phoria-chart-style')) return\n const style = document.createElement('style')\n style.id = 'phoria-chart-style'\n style.textContent = CSS\n document.head.prepend(style)\n}\n","// A chart: a Group that builds its marks, axes and legend from a spec, and animates to new data.\n// Everything it makes is ordinary nodes - restyle, pick or add to them like anything else.\nimport { Group, NODE_OPTIONS } from '../scene/Node.js'\nimport { Label } from '../scene/drawables.js'\nimport { Color } from '../value/Color.js'\nimport { registerType } from '../registry.js'\nimport { describe, fail } from '../validate.js'\nimport { chartFrame } from './axes.js'\nimport { legend } from './legend.js'\nimport { barMark, lineMark, pointMark, stackKey, surfaceMark } from './marks.js'\nimport { networkMark } from './network.js'\nimport { SCHEMES, distinct, scaleBand, scaleColor, scaleLinear, scaleLog, scaleTime, toDate } from './scales.js'\nimport { normalise } from './spec.js'\nimport { addStyle } from './style.js'\nimport { EASES } from '../ease.js'\n\n/** @import { Mark, MarkContext, Target } from './marks.js' */\n/** @import { Scale, ColorScale } from './scales.js' */\n/** @import { Channel } from './spec.js' */\n\n// node options a chart passes to its Group; 'tooltip' and 'highlight' are the chart's own\nconst NODE_KEYS = NODE_OPTIONS.filter((k) => !['children', 'tooltip', 'highlight'].includes(k))\n\n/**\n * Build a chart from a spec - mark, data and channels:\n *\n * scene.add(chart({ mark: 'bar', data: rows, x: 'month', z: 'region', y: 'sales', color: 'region' }))\n * @param {Record<string, any>} spec\n * @returns {Chart}\n */\nexport function chart(spec) {\n return new Chart(spec)\n}\n\nexport class Chart extends Group {\n static type = 'chart'\n // only node options reach Node's own checks; the spec is checked by normalise()\n static get OPTIONS() { return NODE_OPTIONS }\n\n /** The scales in use - place your own content in data coordinates: chart.scales.y(50). @type {{ x?: Scale, y?: Scale, z?: Scale, color?: ColorScale, size?: Scale }} */\n scales = {}\n\n /** @type {Record<string, any>} the spec as given, data included */ #input\n /** @type {ReturnType<typeof normalise> | null} */ #spec = null\n /** @type {Mark | null} */ #mark = null\n #signature = ''\n /** @type {MarkContext} */ #ctx\n /** @type {Group | null} */ #frame = null\n /** @type {Label | null} */ #title = null\n /** @type {Set<string>} colour values switched off in the legend */ #hidden = new Set()\n /** @type {((row: any) => boolean) | null} */ #filter = null\n // what is drawn now: its state, and the layout that state is in\n /** @type {Float32Array | null} */ #current = null\n /** @type {Target | null} */ #shown = null\n /** @type {{ from: Float32Array, to: Float32Array, t: number, frame: Target, final: Target } | null} */ #tween = null\n\n /** @param {Record<string, any>} spec mark, data, channels and options - and node options such as position */\n constructor(spec) {\n if (!spec || typeof spec !== 'object' || Array.isArray(spec)) fail('chart()', `expected a spec such as { mark: 'bar', data, x, y }, got ${describe(spec)}`)\n const node = {}, rest = {}\n for (const [k, v] of Object.entries(spec)) (NODE_KEYS.includes(k) ? node : rest)[k] = v\n if (spec.children) fail('chart()', \"a chart makes its own children - add other nodes to a Group beside it\")\n super(node)\n addStyle()\n this.#input = rest\n this.#ctx = /** @type {MarkContext} */ ({})\n this.#rebuild(true)\n // transitions and flowing links run from the scene clock\n this.onUpdate((_, dt) => this.#step(dt))\n }\n\n /** The normalised spec: mark, channels (fields, types, titles) and options. */\n get spec() {\n const s = /** @type {ReturnType<typeof normalise>} */ (this.#spec)\n return { mark: s.mark, channels: s.channels, options: s.options }\n }\n\n /** The data as given. */\n get data() {\n return this.#input.data\n }\n\n /** The nodes drawing the data, for styling: chart.marks[0].material.roughness = 0.2. @returns {import('../scene/Node.js').Node[]} */\n get marks() {\n return this.#mark ? [...this.#mark.nodes] : []\n }\n\n /**\n * New data - rows, or { nodes, links } for a network - or changed spec options. Marks animate:\n * new ones grow in, changed ones move, removed ones shrink away, matched by the key channel (or\n * an id field, or position).\n * @param {any[] | Record<string, any>} change\n * @returns {this}\n */\n update(change) {\n const data = Array.isArray(change) || (change && 'nodes' in change && 'links' in change)\n this.#input = data ? { ...this.#input, data: change } : { ...this.#input, ...change }\n this.#rebuild(true)\n return this\n }\n\n /** Show only the rows that pass, animated; null shows them all. @param {((row: any) => boolean) | null} fn @returns {this} */\n filter(fn) {\n if (fn !== null && typeof fn !== 'function') fail('Chart', `filter() takes (row) => boolean, or null, got ${describe(fn)}`)\n this.#filter = fn\n this.#rebuild(true)\n return this\n }\n\n /** One line about this chart, for view.explain(). */\n explain() {\n const s = /** @type {ReturnType<typeof normalise>} */ (this.#spec)\n const axes = ['x', 'y', 'z'].filter((k) => this.scales[k]).map((k) => {\n const sc = this.scales[k]\n return sc.kind === 'band' ? `${k} band of ${sc.domain.length}` : `${k} ${sc.kind} ${sc.format(sc.domain[0])}-${sc.format(sc.domain[1])}`\n })\n const shown = this.#shown?.rows.length ?? 0\n return `Chart (${s.mark}): ${shown} of ${s.rows.length} rows shown${axes.length ? `; ${axes.join(', ')}` : ''}${s.links.length ? `; ${s.links.length} links` : ''}`\n }\n\n /**\n * One sentence about this chart for screen readers - the spec's description, or its title and what\n * it shows: \"Sales by month: bar chart of 12 rows by Month, Sales\". A View with keyboard: true labels\n * its canvas with this.\n * @returns {string}\n */\n summary() {\n const s = /** @type {ReturnType<typeof normalise>} */ (this.#spec), o = /** @type {any} */ (s.options)\n if (o.description) return String(o.description)\n // each field once, though it may set more than one channel (z and colour by region)\n const by = [...new Set(['x', 'y', 'z', 'color', 'size'].map((k) => /** @type {any} */ (s.channels)[k]).filter((c) => c?.field).map((c) => c.title))]\n const count = (n, one) => `${n} ${n === 1 ? one : `${one}s`}`\n const what = `${s.mark} chart of ${count(s.rows.length, 'row')}${by.length ? ` by ${by.join(', ')}` : ''}${s.links.length ? ` and ${count(s.links.length, 'link')}` : ''}`\n return o.title ? `${o.title}: ${what}` : what\n }\n\n /** @internal @returns {Record<string, unknown>} */\n jsonOptions() {\n return { ...this.#input }\n }\n\n toJSON() {\n // the children are made from the spec, so the spec is the description - and the highlight is\n // the spec's, or none, not the colour the chart turned it into\n const json = super.toJSON()\n delete json.children\n if (this.#input.highlight === undefined) delete json.highlight\n return json\n }\n\n /** A new chart from the same spec and transform. @returns {any} */\n clone() {\n // the node options a chart takes (its tooltip and highlight are its own, in its spec)\n const { name, position, quaternion, scale, visible, pickable, highlightWhole, onHover, onClick, showFrom, clip, onDrag, outline } = super.cloneOptions()\n const copy = new Chart({ ...this.#input, name, position, quaternion, scale, visible, pickable, highlightWhole, onHover, onClick, showFrom, clip, onDrag, outline })\n // as Node.clone() does - but not the update handlers, which include this chart's own\n copy.userData = structuredClone(this.userData)\n copy.matrixAutoUpdate = this.matrixAutoUpdate\n if (!copy.matrixAutoUpdate) copy.matrix.copy(this.matrix)\n return copy\n }\n\n /** @param {boolean} animate */\n #rebuild(animate) {\n const spec = normalise(this.#input)\n const o = spec.options, ch = spec.channels\n this.#spec = spec\n const box = /** @type {[number, number, number]} */ (o.box ?? defaultBox(spec))\n const theme = o.theme ?? 'dark'\n if (theme !== 'dark' && theme !== 'light') fail('chart()', `theme '${theme}' - expected 'dark' or 'light'`)\n // one rule for every label the chart draws, covered by another label or by the marks: by default\n // they fade rather than vanish, so the chart keeps its shape as it turns\n const overlap = o.overlap ?? 'dim'\n if (!['dim', 'hide', 'show'].includes(overlap)) fail('chart()', `overlap '${overlap}' - expected 'dim', 'hide' or 'show'`)\n const visible = spec.rows.filter((r) => (!this.#filter || this.#filter(r)) && (!ch.color?.field || !this.#hidden.has(String(ch.color.get(r)))))\n\n this.scales = scalesFor(spec, box)\n const color = this.scales.color\n const fallback = Color.fromInput(ch.color?.field ? SCHEMES.category[0] : ch.color?.value ?? SCHEMES.category[0], 'chart()').toSRGB()\n const linkColors = spec.link.color?.field ? colorScale(spec.link.color, spec.links.map((l) => spec.link.color.get(l))) : null\n Object.assign(this.#ctx, {\n spec, box, theme, overlap, scales: this.scales,\n size: this.scales.size ?? null,\n rgb: (row) => (color ? color(colorValue(spec, row)).toSRGB() : fallback),\n format: formatValue,\n linkColor: (v) => /** @type {ColorScale} */ (linkColors)(v),\n })\n\n // a different kind of chart (or channels) means new marks; the same kind keeps them, to animate\n const signature = JSON.stringify([spec.mark, Object.entries(ch).map(([k, c]) => [k, c.field, c.type]), box, theme, overlap, o.stack, o.layout, o.flat, Object.keys(spec.link)])\n if (signature !== this.#signature) {\n this.#signature = signature\n if (this.#mark) this.remove(.../** @type {any[]} */ (this.#mark.nodes))\n this.#mark = makeMark(spec.mark, this.#ctx)\n for (const node of this.#mark.nodes) this.add(node)\n this.#current = this.#shown = null\n this.#tween = null\n }\n if (this.#frame) this.remove(this.#frame)\n this.#frame = spec.mark === 'network' && o.layout !== 'given' ? null : this.add(chartFrame({ box, theme, overlap, axes: axesFor(spec, this.scales) }))\n if (this.#title) this.remove(this.#title)\n this.#title = o.title ? this.add(new Label({ text: String(o.title), position: [0, box[1] * 1.12, -box[2] / 2], className: `phoria-axis-title phoria-${theme}`, overlap: 'show' })) : null\n\n this.#setLegend(spec, theme)\n this.tooltip = spec.tooltip === null && !spec.link.tooltip ? null : (hit) => this.#tooltipFor(hit)\n const hl = o.highlight\n this.highlight = hl === false ? null : Color.fromInput(hl === undefined || hl === 'neighbours' || hl === 'node' ? '#ffffff' : hl, 'chart()')\n\n this.#show(/** @type {Mark} */ (this.#mark).layout(visible), animate && o.transition !== false)\n }\n\n /** @param {ReturnType<typeof normalise>} spec @param {'dark' | 'light'} theme */\n #setLegend(spec, theme) {\n this.overlay?.remove()\n this.overlay = null\n const c = spec.channels.color, o = spec.options.legend\n // no legend outside a browser (tests, servers)\n if (!c?.field || o === false || !this.scales.color || typeof document === 'undefined') return\n const el = legend(this.scales.color, {\n title: c.title, theme, position: o?.position, ticks: o?.ticks, format: (v) => formatValue(c, v),\n onToggle: (value, on) => {\n if (on) this.#hidden.delete(String(value))\n else this.#hidden.add(String(value))\n this.#rebuild(true)\n },\n })\n // keep switched-off entries looking off\n el.querySelectorAll('.phoria-legend-item').forEach((item, i) => {\n if (this.#hidden.has(String(this.scales.color?.domain[i]))) item.classList.add('off')\n })\n const container = o?.container\n if (container) {\n const host = typeof container === 'string' ? document.querySelector(container) : container\n if (!host) fail('chart()', `legend container ${describe(container)} not found`)\n el.classList.remove(`phoria-legend-${o?.position ?? 'top-right'}`)\n // laid out in the page's flow: a row that wraps, as tall as it needs - not the floating box\n Object.assign(el.style, { position: 'static', flexDirection: 'row', flexWrap: 'wrap', alignItems: 'center',\n columnGap: '12px', maxHeight: 'none', overflow: 'visible' })\n host.replaceChildren(el)\n } else {\n this.overlay = el\n }\n }\n\n /** @param {any} hit */\n #tooltipFor(hit) {\n const spec = /** @type {ReturnType<typeof normalise>} */ (this.#spec)\n const row = hit.datum\n if (!row) return null\n const link = this.#mark?.tooltipRows?.(hit) === 'link'\n const list = /** @type {any} */ (link ? spec.link.tooltip : spec.tooltip)\n if (typeof list === 'function') return list(row, hit)\n if (link && (!list || !list.length)) {\n const s = spec.options.source ?? 'source', t = spec.options.target ?? 'target'\n return { title: `${row[s]} → ${row[t]}`, rows: Object.fromEntries(Object.entries(spec.link).filter(([k, c]) => k !== 'tooltip' && c.field).map(([, c]) => [c.title, formatValue(c, c.get(row))])) }\n }\n if (!list || !list.length) return null\n // the first category names the row; the rest are name/value pairs\n const head = list.find((/** @type {Channel} */ c) => c.type === 'nominal' || c.type === 'ordinal')\n const rows = Object.fromEntries(list.filter((/** @type {Channel} */ c) => c !== head).map((/** @type {Channel} */ c) => [c.title, formatValue(c, c.get(row))]))\n return head ? { title: formatValue(head, head.get(row)), rows } : { rows }\n }\n\n // move to a new target: straight there, or by a tween from what is drawn now\n /** @param {Target} target @param {boolean} animate */\n #show(target, animate) {\n const mark = /** @type {Mark} */ (this.#mark)\n const now = this.#shown, cur = this.#current\n if (!animate) return this.#draw(target.state, target, target)\n const { stride } = target\n let from, to, frame = target\n if (target.keys && mark.enter) {\n // keyed: match items by key; new ones enter from nothing, missing ones leave to nothing\n const before = new Map(now?.keys?.map((k, i) => [k, i]) ?? [])\n const keep = new Set(target.keys)\n // rows the interrupted animation was already taking away go now, rather than leaving all\n // over again - or under a steady stream of changes they would never be gone\n const going = new Set(this.#tween?.final.keys ?? now?.keys)\n const leaving = now?.keys ? now.keys.map((_, i) => i).filter((i) => {\n const key = /** @type {any[]} */ (now.keys)[i]\n return !keep.has(key) && going.has(key)\n }) : []\n const n = target.keys.length + leaving.length\n from = new Float32Array(n * stride)\n to = new Float32Array(n * stride)\n to.set(target.state)\n target.keys.forEach((key, i) => {\n const j = before.get(key)\n const slot = from.subarray(i * stride, (i + 1) * stride)\n if (j !== undefined && cur && now?.stride === stride) slot.set(cur.subarray(j * stride, (j + 1) * stride))\n else {\n slot.set(target.state.subarray(i * stride, (i + 1) * stride))\n mark.enter(slot)\n }\n })\n leaving.forEach((j, e) => {\n const i = target.keys.length + e\n from.set(/** @type {Float32Array} */ (cur).subarray(j * stride, (j + 1) * stride), i * stride)\n to.set(/** @type {Float32Array} */ (cur).subarray(j * stride, (j + 1) * stride), i * stride)\n mark.enter(to.subarray(i * stride, (i + 1) * stride))\n })\n frame = { ...target, rows: [...target.rows, ...leaving.map((j) => /** @type {Target} */ (now).rows[j])],\n // leaving is empty unless there were keys before\n keys: [...target.keys, ...leaving.map((j) => /** @type {any[]} */ (/** @type {Target} */ (now).keys)[j])], state: to }\n } else if (now && cur && cur.length === target.state.length && now.stride === stride && sameShape(now.shape, target.shape)) {\n from = cur.slice()\n to = target.state\n } else {\n return this.#draw(target.state, target, target)\n }\n this.#tween = { from, to, t: 0, frame, final: target }\n this.#draw(from, frame, frame)\n }\n\n /** @param {Float32Array} state @param {Target} frame @param {Target} shown */\n #draw(state, frame, shown) {\n /** @type {Mark} */ (this.#mark).apply(state, frame)\n this.#current = state.slice()\n this.#shown = shown\n }\n\n /** @param {number} dt */\n #step(dt) {\n // with motion reduced (the View's reducedMotion), flows stand still and a change shows at once\n const still = /** @type {any} */ (this.root).motionReduced === true\n if (!still) this.#mark?.tick?.(dt)\n const tw = this.#tween\n if (!tw) return\n const o = this.#input.transition ?? {}\n const duration = o.duration ?? 0.5\n const ease = EASES[o.ease ?? 'out']\n if (!ease) fail('chart()', `transition ease '${o.ease}' - expected ${Object.keys(EASES).map((e) => `'${e}'`).join(', ')}`)\n tw.t = still ? 1 : Math.min(1, tw.t + dt / duration)\n const k = ease(tw.t)\n const state = new Float32Array(tw.from.length)\n for (let i = 0; i < state.length; i++) state[i] = tw.from[i] + (tw.to[i] - tw.from[i]) * k\n if (tw.t < 1) return this.#draw(state, tw.frame, tw.frame)\n this.#tween = null\n this.#draw(tw.final.state, tw.final, tw.final)\n }\n}\n\nregisterType(Chart)\n\n/** Do two layouts have the same shape (series lengths, grid size), so one can tween into the other? */\nfunction sameShape(a, b) {\n const key = (s) => JSON.stringify(s ? { lengths: s.lengths, nx: s.nx, nz: s.nz } : null)\n return key(a) === key(b)\n}\n\n/** @param {string} mark @param {MarkContext} ctx */\nfunction makeMark(mark, ctx) {\n if (mark === 'bar') return barMark(ctx)\n if (mark === 'point') return pointMark(ctx)\n if (mark === 'line' || mark === 'area') return lineMark(ctx, mark === 'area')\n if (mark === 'surface') return surfaceMark(ctx)\n return networkMark(ctx)\n}\n\n/** @param {ReturnType<typeof normalise>} spec @returns {[number, number, number]} */\nfunction defaultBox(spec) {\n const z = !!spec.channels.z\n if (spec.mark === 'surface') return [10, 4, 10]\n if (spec.mark === 'network') return spec.options.flat ? [12, 1, 12] : [12, 8, 12]\n if (spec.mark === 'point') return [8, 6, z ? 8 : 1.6]\n return [10, 6, z ? 6 : 1.6]\n}\n\n/** @param {any[]} values @returns {[number, number]} */\nfunction extent(values) {\n let lo = Infinity, hi = -Infinity\n for (const v of values) {\n const n = +v\n if (!Number.isFinite(n)) continue\n if (n < lo) lo = n\n if (n > hi) hi = n\n }\n return lo === Infinity ? [0, 1] : [lo, hi]\n}\n\n/** @param {Channel} c */\nfunction colorOptions(c) {\n return { scheme: c.scale.scheme, range: c.scale.range }\n}\n\n/**\n * A channel's colour scale: its type says ramp or categories - not the shape of its values, which\n * can't tell two nominal years from a numeric range.\n * @param {any} c the channel @param {any[]} values @param {keyof typeof SCHEMES} [scheme] the default scheme\n */\nfunction colorScale(c, values, scheme) {\n return c.type === 'quantitative'\n ? scaleColor({ kind: 'sequential', domain: c.scale.domain ?? extent(values), ...colorOptions(c), scheme: c.scale.scheme ?? scheme })\n : scaleColor({ kind: 'categorical', domain: c.scale.domain ?? distinct(values), ...colorOptions(c) })\n}\n\n/** The value a row is coloured by: the colour field, or (for surfaces, by default) its height. */\nfunction colorValue(spec, row) {\n const c = spec.channels.color\n return c?.field ? c.get(row) : spec.channels.y.get(row)\n}\n\n/**\n * Scales for the channels, over all the rows (not just those shown), so the axes stay put while a\n * legend entry or filter hides some.\n * @param {ReturnType<typeof normalise>} spec @param {[number, number, number]} box\n */\nfunction scalesFor(spec, box) {\n const [w, h, d] = box\n const ch = spec.channels, rows = spec.rows, out = {}\n const ranges = { x: [-w / 2, w / 2], y: [0, h], z: [d / 2, -d / 2] }\n for (const name of ['x', 'y', 'z']) {\n const c = ch[name]\n if (!c?.field) continue\n // the values listed as ticks are always on the axis\n const listed = c.axis && c.axis.ticks\n const values = [...rows.map((r) => c.get(r)), ...(Array.isArray(listed) ? listed : [])]\n const o = { range: ranges[name], format: (c.axis && c.axis.format) ?? c.format }\n const banded = c.type === 'nominal' || c.type === 'ordinal' || (spec.mark === 'bar' && name !== 'y')\n if (banded) {\n out[name] = scaleBand({ domain: c.scale.domain ?? distinct(values), padding: 0.2, ...o })\n } else if (c.type === 'temporal') {\n const [a, b] = extent(values.map((v) => toDate(v).getTime()))\n out[name] = scaleTime({ domain: /** @type {any} */ (c.scale.domain ?? [a, b]), ...o })\n } else {\n let domain = c.scale.domain ?? extent(values)\n // stacked bars and areas reach the totals, not the single values\n if (name === 'y' && spec.options.stack) domain = extent([0, ...stackTotals(spec)])\n if (c.scale.type === 'log') out[name] = scaleLog({ domain, ...o })\n else out[name] = scaleLinear({ domain, nice: c.scale.nice ?? true, zero: c.scale.zero ?? (name === 'y' && ['bar', 'area'].includes(spec.mark)), ...o })\n }\n }\n const color = ch.color\n if (color?.field || spec.mark === 'surface') {\n const c = color?.field ? color : ch.y\n const ticks = spec.options.legend?.ticks\n // as on an axis, a number key reaches the values listed as its ticks\n const values = [...rows.map((r) => c.get(r)), ...(c.type === 'quantitative' && Array.isArray(ticks) ? ticks : [])]\n out.color = colorScale(c, values, spec.mark === 'surface' && !color?.field ? 'viridis' : undefined)\n }\n const size = ch.size\n if (size?.field) {\n const unit = Math.min(...box) / 40\n // network nodes stay small beside their links, so the links read as the connections they are\n const range = spec.mark === 'network' ? [unit * 0.6, unit * 1.8] : [unit * 0.5, unit * 2]\n out.size = scaleLinear({ domain: extent(rows.map((r) => size.get(r))), range: /** @type {[number, number]} */ (size.scale.range ?? range) })\n }\n return out\n}\n\n/** Running totals per x (and z) for stacked charts. */\nfunction stackTotals(spec) {\n const ch = spec.channels, totals = new Map()\n for (const r of spec.rows) {\n const v = Number(ch.y.get(r)) || 0\n const k = stackKey(ch, r, v)\n totals.set(k, (totals.get(k) ?? 0) + v)\n }\n return [...totals.values()]\n}\n\n/** @param {ReturnType<typeof normalise>} spec @param {Chart['scales']} scales */\nfunction axesFor(spec, scales) {\n const axes = {}\n for (const name of ['x', 'y', 'z']) {\n const c = spec.channels[name]\n if (scales[name] && c) axes[name] = { scale: scales[name], channel: c, title: (c.axis && c.axis.title) ?? c.title }\n }\n return axes\n}\n\nconst NUMBER = new Intl.NumberFormat(undefined, { maximumFractionDigits: 2 })\nconst COMPACT = new Intl.NumberFormat(undefined, { notation: 'compact', maximumFractionDigits: 1 })\nconst DATE = new Intl.DateTimeFormat(undefined, { year: 'numeric', month: 'short', day: 'numeric' })\n\n/** A value as text, by its channel's format (Intl options or a function). @param {Channel} c @param {any} v */\nexport function formatValue(c, v) {\n if (v === null || v === undefined) return ''\n const f = c.format\n if (typeof f === 'function') return String(f(v))\n if (v instanceof Date) return f ? new Intl.DateTimeFormat(undefined, f).format(v) : DATE.format(v)\n if (typeof v === 'number') return f ? new Intl.NumberFormat(undefined, f).format(v) : (Math.abs(v) >= 1e4 ? COMPACT : NUMBER).format(v)\n return String(v)\n}\n"],"mappings":"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"}
|