mayacharts 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/radial.js CHANGED
@@ -1,3 +1,3 @@
1
- /*! mayacharts v0.2.1 | MIT | https://github.com/BbekShr/mayacharts */
1
+ /*! mayacharts v0.3.0 | MIT | https://github.com/BbekShr/mayacharts */
2
2
  var e=Symbol.for(`mayacharts.marks@0`);Object.hasOwn(globalThis,e)||Object.defineProperty(globalThis,e,{value:/* @__PURE__ */ new Map});var t=globalThis[e];function n(e,n){t.has(e)||t.set(e,n),typeof globalThis.dispatchEvent==`function`&&globalThis.dispatchEvent(new Event(`maya-register`))}var r={"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&#39;`};function i(e){return String(e).replace(/[&<>"']/g,e=>r[e])}function a(e){return Math.round(e*100)/100}function o(e,t,n){let r=``;for(let e in t){let n=t[e];n!=null&&n!==!1&&(r+=n===!0?` ${e}=""`:` ${e}="${i(n)}"`)}return n===void 0?`<${e}${r}/>`:`<${e}${r}>${n}</${e}>`}var s=`\0other`,c=(...e)=>e.map(e=>encodeURIComponent(String(e).replace(/\p{Cs}/gu,`�`)).replace(/~/g,`%7E`)).join(`~`),l=e=>parseFloat(e.toPrecision(12));function u(e,t,n=5){t===e&&([e,t]=e===0?[0,1]:[e-1,t+1]);let r=10**Math.floor(Math.log10((t-e)/n)),i=r,a=1/0,o=e<0&&t>0;for(let s of[1,2,2.5,5,10]){let c=r*s,l=Math.floor(e/c+1e-9),u=Math.ceil(t/c-1e-9)-l+1,d=o?u>n+3?1/0:(u-1+Math.abs(u-n)/1e3)*c:Math.abs(u-n);d<a-1e-9*Math.abs(d)&&(a=d,i=c)}let s=Math.floor(e/i+1e-9),c=Math.ceil(t/i-1e-9),u=[];for(let e=s;e<=c;e++)u.push(l(e*i));return{domain:[l(s*i),l(c*i)],values:u,step:l(i)}}var d=Math.PI*2,f=11,p={noun:`Radial bar`,draw(e){let{spec:t,shaped:n,plot:r}=e,l=n.categories.length;if(!l||!n.cells.length)return{marks:``,hits:``};let p=n.cells.map(e=>({c:e,v:Math.max(0,e.value??0),y0:0,y1:0})),m=Array(l).fill(0);for(let e of p)e.y0=m[e.c.ci],e.y1=m[e.c.ci]=e.y0+e.v;let h=u(0,Math.max(0,...m),5),g=h.domain[1],_=n.categories.map(n=>{let r=e.fmt(t.x,n);return r.length>f?r.slice(0,10)+`…`:r}),v=Math.max(..._.map(e=>e.length))*7.2+6,[y,b]=[r.x+r.w/2,r.y+r.h/2],x=Math.max(10,Math.min(r.w/2-v,r.h/2-16)),S=x*.25,C=e=>S+e/g*(x-S),w=(e,t)=>`${a(y+e*Math.sin(t))} ${a(b-e*Math.cos(t))}`,T=l>1?.35:0,E=(d-T)/l,D=Math.min(E*.1,.04),O=(e,t,n,r)=>{let i=Math.min(r,n+d*359.99/360),o=+(i-n>Math.PI);return`M${w(t,n)}A${a(t)} ${a(t)} 0 ${o} 1 ${w(t,i)}L${w(e,i)}A${a(e)} ${a(e)} 0 ${o} 0 ${w(e,n)}Z`},k=``,A=``;p.forEach((r,i)=>{let a=n.categories[r.c.ci],l=n.series[r.c.si],[u,d]=[T/2+r.c.ci*E+D,T/2+(r.c.ci+1)*E-D],[f,p]=[C(r.y0),C(r.y1)],m={"data-key":c(l,a),"data-c":i,"data-s":r.c.si%8,"data-x":e.fmt(t.x,a),"data-series":l,"data-y":r.c.value,"data-f":e.fmt(t.y,r.c.value),"data-tone":e.tone(r.v),"data-other":a===s};k+=o(`path`,{"data-maya":`mark`,...m,d:O(f,p,u,d)});let h=(f+p)/2,[g,_]=[Math.max(0,h-Math.max(12,(p-f)/2)),h+Math.max(12,(p-f)/2)],v=Math.max((d-u)/2,12/h||0),y=(u+d)/2;(p-f<24||(d-u)*h<24)&&(A+=o(`path`,{"data-maya":`hit`,...m,d:O(g,_,y-v,y+v),fill:`transparent`}))});let j=``,M=``,N=h.values.filter(e=>e>0);for(let n of N.length>3?N.filter((e,t)=>t%2):N)j+=o(`circle`,{cx:a(y),cy:a(b),r:a(C(n)),fill:`none`}),M+=o(`text`,{x:a(y),y:a(b-C(n)+4),"text-anchor":`middle`,"data-ring":``},i(e.fmt(t.y,n)));let P=[];return _.forEach((e,t)=>{let n=T/2+(t+.5)*E,[r,s]=[y+(x+6)*Math.sin(n),b-(x+6)*Math.cos(n)],c=Math.sin(n),l=Math.abs(c)<.2?`middle`:c>0?`start`:`end`,u=e.length*7.2,d=l===`middle`?r-u/2:l===`start`?r:r-u;P.some(e=>d<e[2]&&d+u>e[0]&&s-7<e[3]&&s+7>e[1])||(P.push([d,s-7,d+u,s+7]),M+=o(`text`,{x:a(r),y:a(s),"text-anchor":l,"dominant-baseline":`middle`,"data-cat":``},i(e)))}),{marks:k,hits:A,labels:M,grid:j}}};n(`radial`,p);export{p as radial};
3
3
  //# sourceMappingURL=radial.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"radial.js","names":["KEY","MODULES","register","type","mark","ESC","esc","s","c","r","n","el","a","k","attrs","v","children","tag","OTHER","key","parts","p","clean","niceTicks","max","min","base","target","step","best","cross","m","lo","score","hi","values","i","TAU","CAP","radial","ctx","shaped","segs","totals","ticks","top","names","f","spec","lw","cx","cy","plot","R","R0","rad","pt","rr","G","gap","sector","e","a1","a0","big","r1","r0","marks","hits","cname","ser","d","mid","h0","h1","half","am","grid","labels","vals","boxes","x","y","sx","anchor","w","name","l","b"],"sources":["../src/core/registry.ts","../src/core/svg.ts","../src/core/ticks.ts","../src/radial.ts"],"sourcesContent":["/*\n * Mark registry for optional modules (hierarchy, flow, geo). Imports nothing at runtime,\n * so every bundle that includes it (index, element, each module, the IIFE) shares one\n * table through a version-keyed global symbol. First definer wins; the property is\n * non-writable and non-configurable so a later bundle cannot swap the table.\n * Core marks are NOT here: they live in render.ts's static CORE map.\n */\nimport type { Mark } from \"./types.ts\";\n\n// ponytail: kept in sync with package.json by hand (one line, checked at release).\nexport const VERSION = \"0.2.1\";\n// ponytail: keyed by major; pre-1.0 Mark-contract breaks must bump this by hand.\nexport const MAJOR = \"0\";\n\nconst KEY = Symbol.for(\"mayacharts.marks@\" + MAJOR);\nif (!Object.hasOwn(globalThis, KEY))\n Object.defineProperty(globalThis, KEY, { value: new Map<string, Mark>() });\n\n/** type -> Mark for every registered module type (shared across bundles). */\nexport const MODULES = (globalThis as unknown as Record<symbol, Map<string, Mark>>)[KEY]!;\n\n/** Types that ship in core (static CORE map in render.ts). */\nexport const CORE_TYPES = [\n \"bar\",\n \"line\",\n \"area\",\n \"scatter\",\n \"heatmap\",\n \"waterfall\",\n \"kpi\",\n \"dumbbell\",\n \"ridgeline\",\n \"beeswarm\",\n \"parallel\",\n \"table\",\n] as const;\n\n/** Module types and the import that provides them (for the unknown-type hint). */\nexport const MODULE_OF: Readonly<Record<string, string>> = {\n treemap: \"hierarchy\",\n sunburst: \"hierarchy\",\n marimekko: \"hierarchy\",\n waffle: \"hierarchy\",\n sankey: \"flow\",\n chord: \"flow\",\n radial: \"radial\",\n hexmap: \"geo\",\n};\n\n/** Not exported from the public entry: modules call it on import. First wins. */\nexport function register(type: string, mark: Mark): void {\n if (!MODULES.has(type)) MODULES.set(type, mark);\n // Connected <maya-chart>s re-render on this, so late module loads fix \"unknown type\".\n if (typeof globalThis.dispatchEvent === \"function\")\n globalThis.dispatchEvent(new Event(\"maya-register\"));\n}\n\n/** Registered module types. */\nexport const types = (): string[] => [...MODULES.keys()];\n","const ESC: Record<string, string> = {\n \"&\": \"&amp;\",\n \"<\": \"&lt;\",\n \">\": \"&gt;\",\n '\"': \"&quot;\",\n \"'\": \"&#39;\",\n};\n\nexport function esc(s: string | number): string {\n return String(s).replace(/[&<>\"']/g, (c) => ESC[c]!);\n}\n\nexport function r(n: number): number {\n return Math.round(n * 100) / 100;\n}\n\nexport function el(\n tag: string,\n attrs: Record<string, string | number | boolean | null | undefined>,\n children?: string,\n): string {\n let a = \"\";\n for (const k in attrs) {\n const v = attrs[k];\n if (v == null || v === false) continue;\n a += v === true ? ` ${k}=\"\"` : ` ${k}=\"${esc(v)}\"`;\n }\n return children === undefined ? `<${tag}${a}/>` : `<${tag}${a}>${children}</${tag}>`;\n}\n\n/** Sentinel category for `limit`'s rolled-up rest. Cannot collide with real data text. */\nexport const OTHER = \"\\u0000other\";\n\n/**\n * Mark identity: each part `encodeURIComponent`ed (lone surrogates replaced, `~` -> %7E),\n * joined by `~`. Grammar: band `S~C`; line/area `l~S`/`a~S`; scatter `S~name` (or index);\n * hierarchy `h~p0~p1…`; sankey node `n~depth~name`, link `k~depth~src~dst`; hexmap `g~CODE`.\n */\nexport const key = (...parts: unknown[]): string =>\n parts\n .map((p) => encodeURIComponent(String(p).replace(/\\p{Cs}/gu, \"�\")).replace(/~/g, \"%7E\"))\n .join(\"~\");\n\n/** Invisible target grown to >= 24 px around a small rect mark; \"\" when it is big enough. */\nexport function hit(d: Parameters<typeof el>[1], x: number, y: number, w: number, h: number) {\n const [gw, gh] = [Math.max(w, 24), Math.max(h, 24)];\n return w < 24 || h < 24\n ? el(\n \"rect\",\n Object.assign({ \"data-maya\": \"hit\" }, d, {\n \"data-maya\": \"hit\",\n x: r(x - (gw - w) / 2),\n y: r(y - (gh - h) / 2),\n width: r(gw),\n height: r(gh),\n fill: \"transparent\",\n }),\n )\n : \"\";\n}\n","import type { Ticks } from \"./types.ts\";\n\nconst clean = (n: number) => parseFloat(n.toPrecision(12));\n\nexport function niceTicks(min: number, max: number, target = 5): Ticks {\n if (max === min) {\n [min, max] = min === 0 ? [0, 1] : [min - 1, max + 1];\n }\n const base = 10 ** Math.floor(Math.log10((max - min) / target));\n let step = base;\n let best = Infinity;\n // Crossing zero, a coarse step pads the short side by a whole step (stacked negatives\n // reaching -200 for -40), so take the tightest domain with up to target + 3 ticks instead.\n const cross = min < 0 && max > 0;\n for (const m of [1, 2, 2.5, 5, 10]) {\n const s = base * m;\n const lo = Math.floor(min / s + 1e-9);\n const n = Math.ceil(max / s - 1e-9) - lo + 1;\n const score = cross\n ? n > target + 3\n ? Infinity\n : (n - 1 + Math.abs(n - target) / 1e3) * s\n : Math.abs(n - target);\n if (score < best - 1e-9 * Math.abs(score)) {\n best = score;\n step = s;\n }\n }\n const lo = Math.floor(min / step + 1e-9);\n const hi = Math.ceil(max / step - 1e-9);\n const values: number[] = [];\n for (let i = lo; i <= hi; i++) values.push(clean(i * step));\n return { domain: [clean(lo * step), clean(hi * step)], values, step: clean(step) };\n}\n","// mayacharts/radial: polar bars. Imports only registry, svg, scale, ticks and types.\nimport { register } from \"./core/registry.ts\";\nimport { el, esc, key, OTHER, r } from \"./core/svg.ts\";\nimport { niceTicks } from \"./core/ticks.ts\";\nimport type { Mark } from \"./core/types.ts\";\n\nconst TAU = Math.PI * 2;\nconst CAP = 11;\n\nexport const radial: Mark = {\n noun: \"Radial bar\",\n draw(ctx) {\n const { spec, shaped, plot } = ctx;\n const n = shaped.categories.length;\n if (!n || !shaped.cells.length) return { marks: \"\", hits: \"\" };\n\n // Stack outward per category; negatives and nulls draw nothing.\n const segs = shaped.cells.map((c) => ({ c, v: Math.max(0, c.value ?? 0), y0: 0, y1: 0 }));\n const totals = new Array<number>(n).fill(0);\n for (const s of segs) {\n s.y0 = totals[s.c.ci]!;\n s.y1 = totals[s.c.ci] = s.y0 + s.v;\n }\n const max = Math.max(0, ...totals);\n const ticks = niceTicks(0, max, 5);\n const top = ticks.domain[1];\n\n // Room for category labels outside the outer radius (truncated at CAP chars).\n const names = shaped.categories.map((c) => {\n const f = ctx.fmt(spec.x, c);\n return f.length > CAP ? f.slice(0, CAP - 1) + \"…\" : f;\n });\n const lw = Math.max(...names.map((s) => s.length)) * 7.2 + 6;\n const [cx, cy] = [plot.x + plot.w / 2, plot.y + plot.h / 2];\n const R = Math.max(10, Math.min(plot.w / 2 - lw, plot.h / 2 - 16));\n const R0 = R * 0.25;\n const rad = (v: number) => R0 + (v / top) * (R - R0);\n const pt = (rr: number, a: number) => `${r(cx + rr * Math.sin(a))} ${r(cy - rr * Math.cos(a))}`;\n // A clear wedge at 12 o'clock holds the ring labels, so they never sit on a bar.\n const G = n > 1 ? 0.35 : 0;\n const step = (TAU - G) / n;\n const gap = Math.min(step * 0.1, 0.04);\n const sector = (r0: number, r1: number, a0: number, a1: number) => {\n const e = Math.min(a1, a0 + (TAU * 359.99) / 360);\n const big = e - a0 > Math.PI ? 1 : 0;\n return (\n `M${pt(r1, a0)}A${r(r1)} ${r(r1)} 0 ${big} 1 ${pt(r1, e)}` +\n `L${pt(r0, e)}A${r(r0)} ${r(r0)} 0 ${big} 0 ${pt(r0, a0)}Z`\n );\n };\n\n let marks = \"\";\n let hits = \"\";\n segs.forEach((s, i) => {\n const cname = shaped.categories[s.c.ci]!;\n const ser = shaped.series[s.c.si]!;\n const [a0, a1] = [G / 2 + s.c.ci * step + gap, G / 2 + (s.c.ci + 1) * step - gap];\n const [r0, r1] = [rad(s.y0), rad(s.y1)];\n const d = {\n \"data-key\": key(ser, cname),\n \"data-c\": i,\n \"data-s\": s.c.si % 8,\n \"data-x\": ctx.fmt(spec.x, cname),\n \"data-series\": ser,\n \"data-y\": s.c.value,\n \"data-f\": ctx.fmt(spec.y, s.c.value),\n \"data-tone\": ctx.tone(s.v),\n \"data-other\": cname === OTHER,\n };\n marks += el(\"path\", { \"data-maya\": \"mark\", ...d, d: sector(r0, r1, a0, a1) });\n // Hit: grown to >= 24 px thick and wide around the segment's middle (hit() is rect-only).\n const mid = (r0 + r1) / 2;\n const [h0, h1] = [\n Math.max(0, mid - Math.max(12, (r1 - r0) / 2)),\n mid + Math.max(12, (r1 - r0) / 2),\n ];\n const half = Math.max((a1 - a0) / 2, 12 / mid || 0);\n const am = (a0 + a1) / 2;\n if (r1 - r0 < 24 || (a1 - a0) * mid < 24)\n hits += el(\"path\", {\n \"data-maya\": \"hit\",\n ...d,\n d: sector(h0, h1, am - half, am + half),\n fill: \"transparent\",\n });\n });\n\n // Rings: faint circles with value labels along the 12 o'clock spoke.\n let grid = \"\";\n let labels = \"\";\n // At most 3 rings: thin every other tick when the scale has more.\n const vals = ticks.values.filter((v) => v > 0);\n for (const v of vals.length > 3 ? vals.filter((_, i) => i % 2) : vals) {\n grid += el(\"circle\", { cx: r(cx), cy: r(cy), r: r(rad(v)), fill: \"none\" });\n labels += el(\n \"text\",\n { x: r(cx), y: r(cy - rad(v) + 4), \"text-anchor\": \"middle\", \"data-ring\": \"\" },\n esc(ctx.fmt(spec.y, v)),\n );\n }\n\n // Category labels anchored by angle; one that overlaps a placed label is skipped.\n const boxes: number[][] = [];\n names.forEach((name, i) => {\n const a = G / 2 + (i + 0.5) * step;\n const [x, y] = [cx + (R + 6) * Math.sin(a), cy - (R + 6) * Math.cos(a)];\n const sx = Math.sin(a);\n const anchor = Math.abs(sx) < 0.2 ? \"middle\" : sx > 0 ? \"start\" : \"end\";\n const w = name.length * 7.2;\n const l = anchor === \"middle\" ? x - w / 2 : anchor === \"start\" ? x : x - w;\n if (boxes.some((b) => l < b[2]! && l + w > b[0]! && y - 7 < b[3]! && y + 7 > b[1]!)) return;\n boxes.push([l, y - 7, l + w, y + 7]);\n labels += el(\n \"text\",\n { x: r(x), y: r(y), \"text-anchor\": anchor, \"dominant-baseline\": \"middle\", \"data-cat\": \"\" },\n esc(name),\n );\n });\n return { marks, hits, labels, grid };\n },\n};\n\nregister(\"radial\", radial);\n"],"mappings":"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"}
1
+ {"version":3,"file":"radial.js","names":["KEY","MODULES","register","type","mark","ESC","esc","s","c","r","n","el","a","k","attrs","v","children","tag","OTHER","key","parts","p","clean","niceTicks","max","min","base","target","step","best","cross","m","lo","score","hi","values","i","TAU","CAP","radial","ctx","shaped","segs","totals","ticks","top","names","f","spec","lw","cx","cy","plot","R","R0","rad","pt","rr","G","gap","sector","e","a1","a0","big","r1","r0","marks","hits","cname","ser","d","mid","h0","h1","half","am","grid","labels","vals","boxes","x","y","sx","anchor","w","name","l","b"],"sources":["../src/core/registry.ts","../src/core/svg.ts","../src/core/ticks.ts","../src/radial.ts"],"sourcesContent":["/*\n * Mark registry for optional modules (hierarchy, flow, geo). Imports nothing at runtime,\n * so every bundle that includes it (index, element, each module, the IIFE) shares one\n * table through a version-keyed global symbol. First definer wins; the property is\n * non-writable and non-configurable so a later bundle cannot swap the table.\n * Core marks are NOT here: they live in render.ts's static CORE map.\n */\nimport type { Mark } from \"./types.ts\";\n\n// ponytail: kept in sync with package.json by hand (one line, checked at release).\nexport const VERSION = \"0.3.0\";\n// ponytail: keyed by major; pre-1.0 Mark-contract breaks must bump this by hand.\nexport const MAJOR = \"0\";\n\nconst KEY = Symbol.for(\"mayacharts.marks@\" + MAJOR);\nif (!Object.hasOwn(globalThis, KEY))\n Object.defineProperty(globalThis, KEY, { value: new Map<string, Mark>() });\n\n/** type -> Mark for every registered module type (shared across bundles). */\nexport const MODULES = (globalThis as unknown as Record<symbol, Map<string, Mark>>)[KEY]!;\n\n/** Types that ship in core (static CORE map in render.ts). */\nexport const CORE_TYPES = [\n \"bar\",\n \"line\",\n \"area\",\n \"scatter\",\n \"heatmap\",\n \"waterfall\",\n \"kpi\",\n \"dumbbell\",\n \"ridgeline\",\n \"beeswarm\",\n \"parallel\",\n \"table\",\n] as const;\n\n/** Module types and the import that provides them (for the unknown-type hint). */\nexport const MODULE_OF: Readonly<Record<string, string>> = {\n treemap: \"hierarchy\",\n sunburst: \"hierarchy\",\n marimekko: \"hierarchy\",\n waffle: \"hierarchy\",\n sankey: \"flow\",\n chord: \"flow\",\n radial: \"radial\",\n hexmap: \"geo\",\n};\n\n/** Not exported from the public entry: modules call it on import. First wins. */\nexport function register(type: string, mark: Mark): void {\n if (!MODULES.has(type)) MODULES.set(type, mark);\n // Connected <maya-chart>s re-render on this, so late module loads fix \"unknown type\".\n if (typeof globalThis.dispatchEvent === \"function\")\n globalThis.dispatchEvent(new Event(\"maya-register\"));\n}\n\n/** Registered module types. */\nexport const types = (): string[] => [...MODULES.keys()];\n","const ESC: Record<string, string> = {\n \"&\": \"&amp;\",\n \"<\": \"&lt;\",\n \">\": \"&gt;\",\n '\"': \"&quot;\",\n \"'\": \"&#39;\",\n};\n\nexport function esc(s: string | number): string {\n return String(s).replace(/[&<>\"']/g, (c) => ESC[c]!);\n}\n\nexport function r(n: number): number {\n return Math.round(n * 100) / 100;\n}\n\nexport function el(\n tag: string,\n attrs: Record<string, string | number | boolean | null | undefined>,\n children?: string,\n): string {\n let a = \"\";\n for (const k in attrs) {\n const v = attrs[k];\n if (v == null || v === false) continue;\n a += v === true ? ` ${k}=\"\"` : ` ${k}=\"${esc(v)}\"`;\n }\n return children === undefined ? `<${tag}${a}/>` : `<${tag}${a}>${children}</${tag}>`;\n}\n\n/** Sentinel category for `limit`'s rolled-up rest. Cannot collide with real data text. */\nexport const OTHER = \"\\u0000other\";\n\n/**\n * Mark identity: each part `encodeURIComponent`ed (lone surrogates replaced, `~` -> %7E),\n * joined by `~`. Grammar: band `S~C`; line/area `l~S`/`a~S`; scatter `S~name` (or index);\n * hierarchy `h~p0~p1…`; sankey node `n~depth~name`, link `k~depth~src~dst`; hexmap `g~CODE`.\n */\nexport const key = (...parts: unknown[]): string =>\n parts\n .map((p) => encodeURIComponent(String(p).replace(/\\p{Cs}/gu, \"�\")).replace(/~/g, \"%7E\"))\n .join(\"~\");\n\n/** Invisible target grown to >= 24 px around a small rect mark; \"\" when it is big enough. */\nexport function hit(d: Parameters<typeof el>[1], x: number, y: number, w: number, h: number) {\n const [gw, gh] = [Math.max(w, 24), Math.max(h, 24)];\n return w < 24 || h < 24\n ? el(\n \"rect\",\n Object.assign({ \"data-maya\": \"hit\" }, d, {\n \"data-maya\": \"hit\",\n x: r(x - (gw - w) / 2),\n y: r(y - (gh - h) / 2),\n width: r(gw),\n height: r(gh),\n fill: \"transparent\",\n }),\n )\n : \"\";\n}\n","import type { Ticks } from \"./types.ts\";\n\nconst clean = (n: number) => parseFloat(n.toPrecision(12));\n\nexport function niceTicks(min: number, max: number, target = 5): Ticks {\n if (max === min) {\n [min, max] = min === 0 ? [0, 1] : [min - 1, max + 1];\n }\n const base = 10 ** Math.floor(Math.log10((max - min) / target));\n let step = base;\n let best = Infinity;\n // Crossing zero, a coarse step pads the short side by a whole step (stacked negatives\n // reaching -200 for -40), so take the tightest domain with up to target + 3 ticks instead.\n const cross = min < 0 && max > 0;\n for (const m of [1, 2, 2.5, 5, 10]) {\n const s = base * m;\n const lo = Math.floor(min / s + 1e-9);\n const n = Math.ceil(max / s - 1e-9) - lo + 1;\n const score = cross\n ? n > target + 3\n ? Infinity\n : (n - 1 + Math.abs(n - target) / 1e3) * s\n : Math.abs(n - target);\n if (score < best - 1e-9 * Math.abs(score)) {\n best = score;\n step = s;\n }\n }\n const lo = Math.floor(min / step + 1e-9);\n const hi = Math.ceil(max / step - 1e-9);\n const values: number[] = [];\n for (let i = lo; i <= hi; i++) values.push(clean(i * step));\n return { domain: [clean(lo * step), clean(hi * step)], values, step: clean(step) };\n}\n","// mayacharts/radial: polar bars. Imports only registry, svg, scale, ticks and types.\nimport { register } from \"./core/registry.ts\";\nimport { el, esc, key, OTHER, r } from \"./core/svg.ts\";\nimport { niceTicks } from \"./core/ticks.ts\";\nimport type { Mark } from \"./core/types.ts\";\n\nconst TAU = Math.PI * 2;\nconst CAP = 11;\n\nexport const radial: Mark = {\n noun: \"Radial bar\",\n draw(ctx) {\n const { spec, shaped, plot } = ctx;\n const n = shaped.categories.length;\n if (!n || !shaped.cells.length) return { marks: \"\", hits: \"\" };\n\n // Stack outward per category; negatives and nulls draw nothing.\n const segs = shaped.cells.map((c) => ({ c, v: Math.max(0, c.value ?? 0), y0: 0, y1: 0 }));\n const totals = new Array<number>(n).fill(0);\n for (const s of segs) {\n s.y0 = totals[s.c.ci]!;\n s.y1 = totals[s.c.ci] = s.y0 + s.v;\n }\n const max = Math.max(0, ...totals);\n const ticks = niceTicks(0, max, 5);\n const top = ticks.domain[1];\n\n // Room for category labels outside the outer radius (truncated at CAP chars).\n const names = shaped.categories.map((c) => {\n const f = ctx.fmt(spec.x, c);\n return f.length > CAP ? f.slice(0, CAP - 1) + \"…\" : f;\n });\n const lw = Math.max(...names.map((s) => s.length)) * 7.2 + 6;\n const [cx, cy] = [plot.x + plot.w / 2, plot.y + plot.h / 2];\n const R = Math.max(10, Math.min(plot.w / 2 - lw, plot.h / 2 - 16));\n const R0 = R * 0.25;\n const rad = (v: number) => R0 + (v / top) * (R - R0);\n const pt = (rr: number, a: number) => `${r(cx + rr * Math.sin(a))} ${r(cy - rr * Math.cos(a))}`;\n // A clear wedge at 12 o'clock holds the ring labels, so they never sit on a bar.\n const G = n > 1 ? 0.35 : 0;\n const step = (TAU - G) / n;\n const gap = Math.min(step * 0.1, 0.04);\n const sector = (r0: number, r1: number, a0: number, a1: number) => {\n const e = Math.min(a1, a0 + (TAU * 359.99) / 360);\n const big = e - a0 > Math.PI ? 1 : 0;\n return (\n `M${pt(r1, a0)}A${r(r1)} ${r(r1)} 0 ${big} 1 ${pt(r1, e)}` +\n `L${pt(r0, e)}A${r(r0)} ${r(r0)} 0 ${big} 0 ${pt(r0, a0)}Z`\n );\n };\n\n let marks = \"\";\n let hits = \"\";\n segs.forEach((s, i) => {\n const cname = shaped.categories[s.c.ci]!;\n const ser = shaped.series[s.c.si]!;\n const [a0, a1] = [G / 2 + s.c.ci * step + gap, G / 2 + (s.c.ci + 1) * step - gap];\n const [r0, r1] = [rad(s.y0), rad(s.y1)];\n const d = {\n \"data-key\": key(ser, cname),\n \"data-c\": i,\n \"data-s\": s.c.si % 8,\n \"data-x\": ctx.fmt(spec.x, cname),\n \"data-series\": ser,\n \"data-y\": s.c.value,\n \"data-f\": ctx.fmt(spec.y, s.c.value),\n \"data-tone\": ctx.tone(s.v),\n \"data-other\": cname === OTHER,\n };\n marks += el(\"path\", { \"data-maya\": \"mark\", ...d, d: sector(r0, r1, a0, a1) });\n // Hit: grown to >= 24 px thick and wide around the segment's middle (hit() is rect-only).\n const mid = (r0 + r1) / 2;\n const [h0, h1] = [\n Math.max(0, mid - Math.max(12, (r1 - r0) / 2)),\n mid + Math.max(12, (r1 - r0) / 2),\n ];\n const half = Math.max((a1 - a0) / 2, 12 / mid || 0);\n const am = (a0 + a1) / 2;\n if (r1 - r0 < 24 || (a1 - a0) * mid < 24)\n hits += el(\"path\", {\n \"data-maya\": \"hit\",\n ...d,\n d: sector(h0, h1, am - half, am + half),\n fill: \"transparent\",\n });\n });\n\n // Rings: faint circles with value labels along the 12 o'clock spoke.\n let grid = \"\";\n let labels = \"\";\n // At most 3 rings: thin every other tick when the scale has more.\n const vals = ticks.values.filter((v) => v > 0);\n for (const v of vals.length > 3 ? vals.filter((_, i) => i % 2) : vals) {\n grid += el(\"circle\", { cx: r(cx), cy: r(cy), r: r(rad(v)), fill: \"none\" });\n labels += el(\n \"text\",\n { x: r(cx), y: r(cy - rad(v) + 4), \"text-anchor\": \"middle\", \"data-ring\": \"\" },\n esc(ctx.fmt(spec.y, v)),\n );\n }\n\n // Category labels anchored by angle; one that overlaps a placed label is skipped.\n const boxes: number[][] = [];\n names.forEach((name, i) => {\n const a = G / 2 + (i + 0.5) * step;\n const [x, y] = [cx + (R + 6) * Math.sin(a), cy - (R + 6) * Math.cos(a)];\n const sx = Math.sin(a);\n const anchor = Math.abs(sx) < 0.2 ? \"middle\" : sx > 0 ? \"start\" : \"end\";\n const w = name.length * 7.2;\n const l = anchor === \"middle\" ? x - w / 2 : anchor === \"start\" ? x : x - w;\n if (boxes.some((b) => l < b[2]! && l + w > b[0]! && y - 7 < b[3]! && y + 7 > b[1]!)) return;\n boxes.push([l, y - 7, l + w, y + 7]);\n labels += el(\n \"text\",\n { x: r(x), y: r(y), \"text-anchor\": anchor, \"dominant-baseline\": \"middle\", \"data-cat\": \"\" },\n esc(name),\n );\n });\n return { marks, hits, labels, grid };\n },\n};\n\nregister(\"radial\", radial);\n"],"mappings":"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"}
package/dist/theme.css CHANGED
@@ -1 +1 @@
1
- :host,.maya-root{--maya-font:system-ui,sans-serif;--maya-font-size:12px;--maya-fg:light-dark(#1f2328,#e6edf3);--maya-fg-muted:light-dark(#656d76,#9198a1);--maya-grid:color-mix(in oklab,var(--maya-fg) 12%,transparent);--maya-bg:light-dark(#fff,#0d1117);--maya-accent:oklch(.6 .17 255);--maya-radius:2px;--maya-tooltip-bg:var(--maya-fg);--maya-tooltip-fg:var(--maya-bg);--maya-focus:var(--maya-accent);--maya-good:light-dark(#1a7f37,#3fb950);--maya-bad:light-dark(#cf222e,#f85149);--maya-series-1:var(--maya-accent);--maya-series-2:oklch(.66 .16 50);--maya-series-3:oklch(.62 .15 160);--maya-series-4:oklch(.66 .17 330);--maya-series-5:oklch(.62 .14 90);--maya-series-6:oklch(.62 .12 205);--maya-series-7:oklch(.64 .19 22);--maya-series-8:oklch(.62 .16 295);color-scheme:light dark}@supports not (color:light-dark(#000,#fff)){:host,.maya-root{--maya-fg:#1f2328;--maya-fg-muted:#656d76;--maya-bg:#fff}@media (prefers-color-scheme:dark){:host,.maya-root{--maya-fg:#e6edf3;--maya-fg-muted:#9198a1;--maya-bg:#0d1117}}}:host{display:block;position:relative;container-type:inline-size;min-height:200px}.maya{display:flex;flex-direction:column;height:100%;font:var(--maya-font-size) var(--maya-font);font-variant-numeric:tabular-nums;color:var(--maya-fg)}.maya-title{font-weight:600;font-size:14px}.maya-legend,.maya-crumbs{color:var(--maya-fg-muted);display:flex;flex-wrap:wrap;align-items:center;gap:4px 12px;margin:0 0 8px}.maya-crumbs{min-height:1.25em;line-height:1.25}.maya-legend button,.maya-crumbs button,.maya-reset{display:inline-flex;align-items:center;gap:6px;border:0;background:none;padding:0;font:inherit;color:var(--maya-fg-muted);cursor:pointer;border-radius:4px}.maya-legend [aria-pressed=false]{opacity:.4}:is(.maya-legend,.maya-crumbs) button:focus-visible,.maya-reset:focus-visible,.maya-ctl :focus-visible{outline:2px solid var(--maya-focus);outline-offset:2px}i{width:10px;height:10px;border-radius:3px;background:var(--c)}[data-maya=ramp]{display:flex;align-items:center;gap:6px}[data-maya=ramp] i{width:80px;height:8px;background:linear-gradient(90deg,color-mix(in oklab,var(--maya-accent) 20%,var(--b)),var(--maya-accent))}[data-q],[data-maya=ramp] i{--b:light-dark(var(--maya-bg),color-mix(in oklab,var(--maya-accent) 15%,var(--maya-bg)))}.maya-legend span{display:inline-flex;align-items:center;gap:6px}.maya-reset{position:absolute;top:4px;right:4px;border:1px solid var(--maya-grid);border-radius:99px;padding:2px 10px;background:var(--maya-bg)}.maya-ctl{position:relative;display:inline-grid;grid-auto-flow:column;grid-auto-columns:1fr;align-self:flex-start;margin:0 0 8px;padding:2px;border-radius:8px;background:var(--maya-grid)}.maya-ctl::before{content:'';position:absolute;inset:2px auto 2px 2px;width:calc(100% - 4px);border-radius:6px;background:var(--maya-bg);transition:transform .2s}.maya-ctl[data-n="2"]::before{width:calc((100% - 4px)/2)}.maya-ctl[data-n="3"]::before{width:calc((100% - 4px)/3)}.maya-ctl[data-n="4"]::before{width:calc((100% - 4px)/4)}.maya-ctl[data-i="1"]::before{transform:translateX(100%)}.maya-ctl[data-i="2"]::before{transform:translateX(200%)}.maya-ctl[data-i="3"]::before{transform:translateX(300%)}.maya-ctl [role=radio]{border:0;background:none;padding:0;font:inherit;color:var(--maya-fg-muted);cursor:pointer;position:relative;padding:4px 12px;border-radius:6px}.maya-ctl [aria-checked=true]{color:var(--maya-fg);font-weight:600}.maya-err{margin:0;padding:8px;color:var(--maya-bad);white-space:pre-wrap;font:12px monospace}.maya-box{flex:1;min-height:0;position:relative}.maya-box svg{display:block;width:100%;height:100%;overflow:visible}.maya-svg{direction:ltr;font:var(--maya-font-size) var(--maya-font);font-variant-numeric:tabular-nums}.maya-svg text{fill:var(--maya-fg-muted);unicode-bidi:plaintext}[data-maya=grid] *{stroke:var(--maya-grid);shape-rendering:crispEdges}[data-s="0"]{--c:var(--maya-series-1)}[data-s="1"]{--c:var(--maya-series-2)}[data-s="2"]{--c:var(--maya-series-3)}[data-s="3"]{--c:var(--maya-series-4)}[data-s="4"]{--c:var(--maya-series-5)}[data-s="5"]{--c:var(--maya-series-6)}[data-s="6"]{--c:var(--maya-series-7)}[data-s="7"]{--c:var(--maya-series-8)}[data-other],[data-total]{--c:var(--maya-fg-muted)}[data-tone=good]{--c:var(--maya-good)}[data-tone=bad]{--c:var(--maya-bad)}[data-q]{--c:color-mix(in oklab,var(--maya-accent) var(--q),var(--b))}[data-q="0"]{--q:20%}[data-q="1"]{--q:29%}[data-q="2"]{--q:38%}[data-q="3"]{--q:47%}[data-q="4"]{--q:56%}[data-q="5"]{--q:64%}[data-q="6"]{--q:73%}[data-q="7"]{--q:82%}[data-q="8"]{--q:91%}[data-q="9"]{--q:100%}[data-maya=mark]{fill:var(--c,var(--maya-series-1));rx:var(--maya-radius);transform-box:fill-box;transform-origin:0 0}[data-dir=h] [data-neg]{transform-origin:100% 0}[data-maya=mark],[data-maya=link]{transition:opacity .2s}[data-maya=mark][data-active]{fill:color-mix(in oklab,var(--c,var(--maya-series-1)),var(--maya-fg) 18%)}:where([data-xd] circle[data-maya=mark]){stroke:var(--maya-bg);stroke-width:1}[data-maya=line]~circle[data-maya=mark]:not([data-active],[data-selected],[data-last]){fill-opacity:0}[data-maya=line]{fill:none;stroke:var(--c);stroke-width:2;stroke-linejoin:round}[data-maya=area]{fill:color-mix(in oklab,var(--c) 18%,transparent);stroke:none}[data-maya=link]{fill:var(--c);opacity:.3}[data-maya=link][data-active]{opacity:.6}line[data-maya=link]{stroke:var(--c,var(--maya-fg-muted));opacity:1}text[data-maya=mark]{fill:var(--maya-fg);font-weight:600}[data-kpi=track]{fill:var(--maya-grid)}[data-kpi=target]{stroke:var(--maya-fg)}[data-maya=labels] [data-tone]{fill:var(--c)}[data-maya=labels] :is([data-kpi=period],[data-kpi=of]){fill:var(--maya-fg-muted)}[data-line] i{height:2px;border-radius:1px}[data-ridge]{fill:color-mix(in oklab,var(--c) 40%,var(--maya-bg))}[data-maya=grid] circle{fill:none;shape-rendering:auto}[data-maya=labels] [data-ring]{fill:var(--maya-fg-muted)}[data-maya=marks] text{fill:var(--maya-fg)}[data-maya=sort]{cursor:pointer}[data-maya=sort] rect{fill:transparent}[data-maya=sort] text{font-weight:600}[data-maya=sort]:focus-visible{outline:2px solid var(--maya-focus)}[data-maya=line]{transition:opacity .2s}[data-maya=marks]:has(path[data-active]) path[data-maya=line]:not([data-active]){opacity:.25}[data-depth]{stroke:var(--maya-bg);stroke-width:1}[data-maya=marks]:has([data-active]) [data-maya=mark]:not([data-active],text){opacity:.55}[data-maya=marks]:has([data-selected]) [data-maya=mark]:not([data-selected]){opacity:.35}[data-selected]{stroke:var(--maya-fg);stroke-width:2}.maya:has([data-s="0"]:hover) [data-maya=mark]:not([data-s="0"]){opacity:.3}.maya:has([data-s="1"]:hover) [data-maya=mark]:not([data-s="1"]){opacity:.3}.maya:has([data-s="2"]:hover) [data-maya=mark]:not([data-s="2"]){opacity:.3}.maya:has([data-s="3"]:hover) [data-maya=mark]:not([data-s="3"]){opacity:.3}.maya:has([data-s="4"]:hover) [data-maya=mark]:not([data-s="4"]){opacity:.3}.maya:has([data-s="5"]:hover) [data-maya=mark]:not([data-s="5"]){opacity:.3}.maya:has([data-s="6"]:hover) [data-maya=mark]:not([data-s="6"]){opacity:.3}.maya:has([data-s="7"]:hover) [data-maya=mark]:not([data-s="7"]){opacity:.3}[data-maya=labels],[data-maya=cross]{pointer-events:none}[data-maya=cross]{opacity:0}[data-maya=labels] text{fill:var(--maya-fg);paint-order:stroke;stroke:var(--maya-bg);stroke-width:3;stroke-linejoin:round}[data-maya=labels] [data-in]{stroke:none}[data-maya=labels] [data-dark]{fill:var(--maya-bg)}[data-maya=hit]{stroke:none}[data-maya=cross] line{stroke:var(--maya-fg-muted);stroke-dasharray:3 3}[data-maya=brush]{fill:var(--maya-accent);fill-opacity:.12;stroke:var(--maya-accent);vector-effect:non-scaling-stroke;pointer-events:none}.maya-svg:focus-visible{outline:2px solid var(--maya-focus)}.maya-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.maya-probe{position:absolute;width:0;height:0;pointer-events:none;anchor-name:--maya-probe}.maya-tip{margin:0;inset:auto;border:0;padding:6px 8px;background:var(--maya-tooltip-bg);color:var(--maya-tooltip-fg);border-radius:6px;box-shadow:0 2px 8px #0003;font:var(--maya-font-size) var(--maya-font);pointer-events:none}@supports (anchor-name:--x){.maya-tip{position-anchor:--maya-probe;position-area:block-start;position-try-fallbacks:flip-block,block-start span-inline-start,block-start span-inline-end;margin:8px}}.maya-tip{opacity:0;transition:opacity .12s}.maya-tip.maya-open{opacity:1}.maya-tip b{display:block}.maya-tip div{display:flex;align-items:center;gap:6px}.maya-tip i{outline:1px solid}.maya-tip [data-on]{font-weight:600}@media (pointer:coarse){:is(.maya-legend,.maya-crumbs) button,.maya-ctl [role=radio],.maya-reset,.maya-crumbs{min-height:24px}}@container (max-width:320px){.maya-legend:has(button){display:none}.maya-title{font-size:12px}}@media (prefers-contrast:more){:host,.maya-root{--maya-fg-muted:var(--maya-fg);--maya-grid:color-mix(in oklab,var(--maya-fg) 40%,transparent)}}@media (forced-colors:active){.maya-svg,i{forced-color-adjust:none}[data-maya=mark]{stroke:CanvasText;stroke-width:1}[data-tone=bad]{stroke-dasharray:4 2}}@media (prefers-reduced-motion:reduce){*{transition:none!important}}
1
+ :host,.maya-root{--maya-font:ui-sans-serif,system-ui,sans-serif;--maya-font-size:12px;--maya-fg:light-dark(#1f2328,#e6edf3);--maya-fg-muted:light-dark(#656d76,#9198a1);--maya-grid:color-mix(in oklab,var(--maya-fg) 10%,transparent);--maya-bg:light-dark(#fff,#0d1117);--maya-accent:oklch(.6 .17 255);--maya-radius:3px;--maya-ease:cubic-bezier(.22,1,.36,1);--maya-tooltip-bg:color-mix(in oklab,var(--maya-bg) 92%,transparent);--maya-tooltip-fg:var(--maya-fg);--maya-focus:var(--maya-accent);--maya-good:light-dark(#1a7f37,#3fb950);--maya-bad:light-dark(#cf222e,#f85149);--maya-series-1:var(--maya-accent);--maya-series-2:oklch(.66 .16 50);--maya-series-3:oklch(.62 .15 160);--maya-series-4:oklch(.66 .17 330);--maya-series-5:oklch(.62 .14 90);--maya-series-6:oklch(.62 .12 205);--maya-series-7:oklch(.64 .19 22);--maya-series-8:oklch(.62 .16 295);color-scheme:light dark}@supports not (color:light-dark(#000,#fff)){:host,.maya-root{--maya-fg:#1f2328;--maya-fg-muted:#656d76;--maya-bg:#fff}@media (prefers-color-scheme:dark){:host,.maya-root{--maya-fg:#e6edf3;--maya-fg-muted:#9198a1;--maya-bg:#0d1117}}}:host{display:block;position:relative;container-type:inline-size;min-height:200px}.maya{display:flex;flex-direction:column;height:100%;font:var(--maya-font-size) var(--maya-font);font-variant-numeric:tabular-nums;color:var(--maya-fg)}.maya-title{font-weight:600;font-size:15px;letter-spacing:-.01em;margin:0 0 6px}.maya-legend,.maya-crumbs{color:var(--maya-fg-muted);display:flex;flex-wrap:wrap;align-items:center;gap:2px 6px;margin:0 0 8px}.maya-crumbs{min-height:1.25em;line-height:1.25}.maya-legend :is(button,span),.maya-crumbs button,.maya-reset{display:inline-flex;align-items:center;gap:6px;border:0;background:none;padding:0;font:inherit;color:var(--maya-fg-muted);cursor:pointer;border-radius:6px;padding:2px 6px;transition:background .15s,opacity .2s,color .15s}:is(.maya-legend,.maya-crumbs) button:hover{background:var(--maya-grid);color:var(--maya-fg)}.maya-legend [aria-pressed=false]{opacity:.5}.maya-legend [aria-pressed=false] i{background:none;box-shadow:inset 0 0 0 1.5px var(--c)}:is(.maya-legend,.maya-crumbs) button:focus-visible,.maya-reset:focus-visible,.maya-ctl :focus-visible{outline:2px solid var(--maya-focus);outline-offset:2px}i{width:10px;height:10px;border-radius:3px;background:var(--c)}[data-maya=ramp]{display:flex;align-items:center;gap:6px}[data-maya=ramp] i{width:80px;height:8px;background:linear-gradient(90deg,color-mix(in oklab,var(--maya-accent) 20%,var(--b)),var(--maya-accent))}[data-q],[data-maya=ramp] i{--b:light-dark(var(--maya-bg),color-mix(in oklab,var(--maya-accent) 15%,var(--maya-bg)))}.maya-reset{position:absolute;top:4px;right:4px;border:1px solid var(--maya-grid);border-radius:99px;padding:3px 12px;background:var(--maya-bg);box-shadow:0 1px 3px #0000001a}.maya-ctl{position:relative;display:inline-grid;grid-auto-flow:column;grid-auto-columns:1fr;align-self:flex-start;margin:0 0 8px;padding:2px;border-radius:8px;background:var(--maya-grid)}.maya-ctl::before{content:'';position:absolute;inset:2px auto 2px 2px;width:calc(100% - 4px);border-radius:6px;background:var(--maya-bg);box-shadow:0 1px 3px #00000024;transition:transform .3s var(--maya-ease)}.maya-ctl[data-n="2"]::before{width:calc((100% - 4px)/2)}.maya-ctl[data-n="3"]::before{width:calc((100% - 4px)/3)}.maya-ctl[data-n="4"]::before{width:calc((100% - 4px)/4)}.maya-ctl[data-i="1"]::before{transform:translateX(100%)}.maya-ctl[data-i="2"]::before{transform:translateX(200%)}.maya-ctl[data-i="3"]::before{transform:translateX(300%)}.maya-ctl [role=radio]{border:0;background:none;padding:0;font:inherit;color:var(--maya-fg-muted);cursor:pointer;position:relative;padding:4px 12px;border-radius:6px;transition:color .2s}.maya-ctl [aria-checked=true]{color:var(--maya-fg);font-weight:600}.maya-err{margin:0;padding:8px;color:var(--maya-bad);white-space:pre-wrap;font:12px monospace}.maya-box{flex:1;min-height:0;position:relative}.maya-box svg{display:block;width:100%;height:100%;overflow:visible}.maya-svg{direction:ltr;font:var(--maya-font-size) var(--maya-font);font-variant-numeric:tabular-nums}.maya-svg text{fill:var(--maya-fg-muted);unicode-bidi:plaintext}[data-maya^=axis] text{font-size:11px}[data-maya=grid] *{stroke:var(--maya-grid);shape-rendering:crispEdges}[data-s="0"]{--c:var(--maya-series-1)}[data-s="1"]{--c:var(--maya-series-2)}[data-s="2"]{--c:var(--maya-series-3)}[data-s="3"]{--c:var(--maya-series-4)}[data-s="4"]{--c:var(--maya-series-5)}[data-s="5"]{--c:var(--maya-series-6)}[data-s="6"]{--c:var(--maya-series-7)}[data-s="7"]{--c:var(--maya-series-8)}[data-other],[data-total]{--c:var(--maya-fg-muted)}[data-tone=good]{--c:var(--maya-good)}[data-tone=bad]{--c:var(--maya-bad)}[data-q]{--c:color-mix(in oklab,var(--maya-accent) var(--q),var(--b))}[data-q="0"]{--q:20%}[data-q="1"]{--q:29%}[data-q="2"]{--q:38%}[data-q="3"]{--q:47%}[data-q="4"]{--q:56%}[data-q="5"]{--q:64%}[data-q="6"]{--q:73%}[data-q="7"]{--q:82%}[data-q="8"]{--q:91%}[data-q="9"]{--q:100%}[data-maya=mark]{fill:var(--c,var(--maya-series-1));rx:var(--maya-radius);transform-box:fill-box;transform-origin:0 0}[data-dir=h] [data-neg]{transform-origin:100% 0}[data-maya=mark],[data-maya=link]{transition:opacity .25s var(--maya-ease),fill .2s}[data-ghost]{pointer-events:none}[data-maya=mark][data-active]{fill:color-mix(in oklab,var(--c,var(--maya-series-1)),var(--maya-fg) 12%)}[data-stack] rect[data-maya=mark]{stroke:var(--maya-bg);stroke-width:1}:where([data-xd] circle[data-maya=mark]){stroke:var(--maya-bg);stroke-width:1}[data-maya=line]~circle[data-maya=mark]:not([data-active],[data-lit],[data-selected],[data-last]){fill-opacity:0;stroke-opacity:0}[data-maya=line]~circle[data-maya=mark]{stroke:var(--maya-bg);stroke-width:2;transition:fill-opacity .15s,stroke-opacity .15s}[data-maya=line]~circle[data-lit]{r:4px}circle[data-maya=mark][data-active]{filter:drop-shadow(0 0 4px color-mix(in oklab,var(--c) 70%,transparent))}[data-maya=line]{fill:none;stroke:var(--c);stroke-width:2.25;stroke-linejoin:round;stroke-linecap:round}[data-maya=area]{fill:color-mix(in oklab,var(--c) 18%,transparent);stroke:none}[data-stack] [data-maya=area]{fill:color-mix(in oklab,var(--c) 45%,var(--maya-bg))}svg:not([data-stack]) [data-maya=area][data-s="0"]{fill:url(#maya-a0) color-mix(in oklab,var(--c) 18%,transparent)}svg:not([data-stack]) [data-maya=area][data-s="1"]{fill:url(#maya-a1) color-mix(in oklab,var(--c) 18%,transparent)}svg:not([data-stack]) [data-maya=area][data-s="2"]{fill:url(#maya-a2) color-mix(in oklab,var(--c) 18%,transparent)}svg:not([data-stack]) [data-maya=area][data-s="3"]{fill:url(#maya-a3) color-mix(in oklab,var(--c) 18%,transparent)}svg:not([data-stack]) [data-maya=area][data-s="4"]{fill:url(#maya-a4) color-mix(in oklab,var(--c) 18%,transparent)}svg:not([data-stack]) [data-maya=area][data-s="5"]{fill:url(#maya-a5) color-mix(in oklab,var(--c) 18%,transparent)}svg:not([data-stack]) [data-maya=area][data-s="6"]{fill:url(#maya-a6) color-mix(in oklab,var(--c) 18%,transparent)}svg:not([data-stack]) [data-maya=area][data-s="7"]{fill:url(#maya-a7) color-mix(in oklab,var(--c) 18%,transparent)}stop{stop-color:var(--c)}[data-maya=link]{fill:var(--c);opacity:.3}[data-maya=link][data-active]{opacity:.6}line[data-maya=link]{stroke:var(--c,var(--maya-fg-muted));opacity:1}text[data-maya=mark]{fill:var(--maya-fg);font-weight:600}[data-kpi=track]{fill:var(--maya-grid)}[data-kpi=target]{stroke:var(--maya-fg)}[data-maya=labels] [data-tone]{fill:var(--c)}[data-maya=labels] :is([data-kpi=period],[data-kpi=of]){fill:var(--maya-fg-muted)}[data-line] i{height:2px;border-radius:1px}[data-ridge]{fill:color-mix(in oklab,var(--c) 40%,var(--maya-bg))}[data-maya=grid] circle{fill:none;shape-rendering:auto}[data-maya=labels] [data-ring]{fill:var(--maya-fg-muted)}[data-maya=marks] text{fill:var(--maya-fg)}[data-maya=sort]{cursor:pointer}[data-maya=sort] rect{fill:transparent}[data-maya=sort] text{font-weight:600}[data-maya=sort]:focus-visible{outline:2px solid var(--maya-focus)}:is([data-maya=line],[data-maya=area]){transition:opacity .25s}[data-maya=marks]:has(path[data-active]) path[data-maya=line]:not([data-active]){opacity:.25}[data-depth]{stroke:var(--maya-bg);stroke-width:1}[data-maya=marks]:has([data-active]) [data-maya=mark]:not([data-active],[data-lit],text){opacity:.4}[data-maya=marks]:has([data-selected]) [data-maya=mark]:not([data-selected]){opacity:.35}[data-selected]{stroke:var(--maya-fg);stroke-width:2}.maya:has(.maya-legend [data-s="0"]:hover) :is([data-maya=mark],[data-maya=line],[data-maya=area]):not([data-s="0"]){opacity:.25}.maya:has(.maya-legend [data-s="1"]:hover) :is([data-maya=mark],[data-maya=line],[data-maya=area]):not([data-s="1"]){opacity:.25}.maya:has(.maya-legend [data-s="2"]:hover) :is([data-maya=mark],[data-maya=line],[data-maya=area]):not([data-s="2"]){opacity:.25}.maya:has(.maya-legend [data-s="3"]:hover) :is([data-maya=mark],[data-maya=line],[data-maya=area]):not([data-s="3"]){opacity:.25}.maya:has(.maya-legend [data-s="4"]:hover) :is([data-maya=mark],[data-maya=line],[data-maya=area]):not([data-s="4"]){opacity:.25}.maya:has(.maya-legend [data-s="5"]:hover) :is([data-maya=mark],[data-maya=line],[data-maya=area]):not([data-s="5"]){opacity:.25}.maya:has(.maya-legend [data-s="6"]:hover) :is([data-maya=mark],[data-maya=line],[data-maya=area]):not([data-s="6"]){opacity:.25}.maya:has(.maya-legend [data-s="7"]:hover) :is([data-maya=mark],[data-maya=line],[data-maya=area]):not([data-s="7"]){opacity:.25}[data-maya=labels],[data-maya=cross],[data-maya=band]{pointer-events:none}[data-maya=cross],[data-maya=band]{opacity:0;transition:opacity .2s}[data-on]:is([data-maya=cross],[data-maya=band]){opacity:1;transition:opacity .2s,transform .25s var(--maya-ease)}[data-maya=band]{fill:var(--maya-fg);fill-opacity:.05;rx:6px}[data-maya=labels] text{fill:var(--maya-fg);paint-order:stroke;stroke:var(--maya-bg);stroke-width:3;stroke-linejoin:round}[data-maya=labels] [data-in]{stroke:none}[data-maya=labels] [data-dark]{fill:var(--maya-bg)}[data-maya=hit]{stroke:none}[data-maya=cross] line{stroke:var(--maya-fg-muted);stroke-opacity:.55}[data-maya=brush]{fill:var(--maya-accent);fill-opacity:.12;stroke:var(--maya-accent);vector-effect:non-scaling-stroke;pointer-events:none}.maya-svg:focus-visible{outline:2px solid var(--maya-focus)}.maya-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.maya-probe{position:absolute;width:0;height:0;pointer-events:none;anchor-name:--maya-probe}.maya-tip{margin:0;inset:auto;border:1px solid var(--maya-grid);padding:8px 10px;min-width:96px;background:var(--maya-tooltip-bg);color:var(--maya-tooltip-fg);border-radius:8px;box-shadow:0 1px 2px #0000000f,0 10px 28px -8px #0000004d;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);font:var(--maya-font-size)/1.4 var(--maya-font);font-variant-numeric:tabular-nums;pointer-events:none}@supports (anchor-name:--x){.maya-tip{position-anchor:--maya-probe;position-area:block-start;position-try-fallbacks:flip-block,block-start span-inline-start,block-start span-inline-end;margin:8px}.maya-tip[data-side]{position-area:inline-end span-block-end;position-try-fallbacks:flip-inline;margin:0 12px}}.maya-tip{opacity:0;translate:0 4px;transition:opacity .15s,translate .2s var(--maya-ease)}.maya-tip.maya-open{opacity:1;translate:none}.maya-tip b{display:block;margin:0 0 4px;font-weight:600}.maya-tip div{display:flex;align-items:center;gap:8px;color:color-mix(in oklab,var(--maya-tooltip-fg) 72%,transparent)}.maya-tip i{width:8px;height:8px;border-radius:50%}.maya-tip [data-v]{margin-inline-start:auto;padding-inline-start:12px;font-weight:600;color:var(--maya-tooltip-fg)}.maya-tip [data-on]{color:var(--maya-tooltip-fg)}@media (pointer:coarse){:is(.maya-legend,.maya-crumbs) button,.maya-ctl [role=radio],.maya-reset,.maya-crumbs{min-height:24px}}@container (max-width:320px){.maya-legend:has(button){display:none}.maya-title{font-size:12px}}@media (prefers-contrast:more){:host,.maya-root{--maya-fg-muted:var(--maya-fg);--maya-grid:color-mix(in oklab,var(--maya-fg) 40%,transparent)}}@media (forced-colors:active){.maya-svg,i{forced-color-adjust:none}[data-maya=mark]{stroke:CanvasText;stroke-width:1}[data-tone=bad]{stroke-dasharray:4 2}}[data-still] *{transition:none!important}@media (prefers-reduced-motion:reduce){*{transition:none!important}}
package/llms.txt CHANGED
@@ -39,7 +39,7 @@ legend: boolean = true if series. Legend; clicking toggles series.
39
39
  drill: boolean = false. Click/Enter zooms into branch of path; breadcrumb, Back, Escape pop. treemap sunburst sankey; bar line area dumbbell with path.
40
40
  select: true|"multi" = off. Click/Enter/legend selects marks; Escape clears. Not with drill. All types but sankey.
41
41
  zoom: boolean = false. Drag to zoom. line area scatter. Reset, double-click, Escape restore.
42
- animate: boolean = true. Animate updates (element only).
42
+ animate: boolean = true. Animate the first draw and every update (element only; off under reduced motion).
43
43
  colors: string[]|{[series]: color} = null. Max 8; slot assignment stable across updates.
44
44
  colorBy: "sign"|{target: n}|field = null. Tone by sign or target, or ramp by numeric field. Not with series. All types but heatmap and sankey.
45
45
  theme: {[token]: css} = {}. Theme token overrides (CSS values, allowlisted). Tokens: font fontSize fg fgMuted grid bg accent radius tooltipBg tooltipFg focus good bad series1..series8.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mayacharts",
3
- "version": "0.2.1",
3
+ "version": "0.3.0",
4
4
  "description": "Beautiful, accessible charts in five lines. Zero dependencies. The browser is the chart engine.",
5
5
  "keywords": [
6
6
  "chart",
@@ -90,14 +90,14 @@
90
90
  "site:build": "node scripts/ssr-demo.ts && vite build --config site/vite.config.ts"
91
91
  },
92
92
  "mayaSize": {
93
- "dist/index.js": 24576,
94
- "dist/element.js": 33792,
95
- "dist/theme.css": 2560,
93
+ "dist/index.js": 25600,
94
+ "dist/element.js": 36864,
95
+ "dist/theme.css": 3328,
96
96
  "dist/hierarchy.js": 3584,
97
97
  "dist/flow.js": 3072,
98
98
  "dist/geo.js": 3584,
99
99
  "dist/radial.js": 3072,
100
- "dist/maya.global.js": 39936
100
+ "dist/maya.global.js": 43008
101
101
  },
102
102
  "devDependencies": {
103
103
  "@axe-core/playwright": "^4.13.0",
package/schema.json CHANGED
@@ -290,7 +290,7 @@
290
290
  "animate": {
291
291
  "type": "boolean",
292
292
  "default": true,
293
- "description": "Animate updates (element only)."
293
+ "description": "Animate the first draw and every update (element only; off under reduced motion)."
294
294
  },
295
295
  "colors": {
296
296
  "oneOf": [