mayacharts 0.2.0 → 0.2.1

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.0 | MIT | https://github.com/BbekShr/mayacharts */
1
+ /*! mayacharts v0.2.1 | 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.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":"AAcA,IAAMA,EAAM,OAAO,IAAI,oBAA2B,EAC7C,OAAO,OAAO,WAAYA,CAAG,GAChC,OAAO,eAAe,WAAYA,EAAK,CAAE,sBAAO,IAAI,GAAoB,CAAC,EAG3E,IAAaC,EAAW,WAA4DD,GA+BpF,SAAgBE,EAAS,EAAc,EAAkB,CAClDD,EAAQ,IAAIE,CAAI,GAAGF,EAAQ,IAAIE,EAAMC,CAAI,EAE1C,OAAO,WAAW,eAAkB,YACtC,WAAW,cAAc,IAAI,MAAM,eAAe,CAAC,CACvD,CCvDA,IAAMC,EAA8B,CAClC,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,SACL,IAAK,OACP,EAEA,SAAgBC,EAAI,EAA4B,CAC9C,OAAO,OAAOC,CAAC,CAAC,CAAC,QAAQ,WAAa,GAAMF,EAAIG,EAAG,CACrD,CAEA,SAAgBC,EAAE,EAAmB,CACnC,OAAO,KAAK,MAAMC,EAAI,GAAG,EAAI,GAC/B,CAEA,SAAgBC,EACd,EACA,EACA,EACQ,CACR,IAAIC,EAAI,GACR,IAAK,IAAMC,KAAKC,EAAO,CACrB,IAAMC,EAAID,EAAMD,GACZE,GAAK,MAAQA,IAAM,KACvB,GAAKA,IAAM,GAAO,IAAIF,EAAE,KAAO,IAAIA,EAAE,IAAIP,EAAIS,CAAC,EAAE,GAClD,CACA,OAAOC,IAAa,IAAA,GAAY,IAAIC,IAAML,EAAE,IAAM,IAAIK,IAAML,EAAE,GAAGI,EAAS,IAAIC,EAAI,EACpF,CAGA,IAAaC,EAAQ,UAORC,GAAO,GAAGC,IACrBA,EACG,IAAK,GAAM,mBAAmB,OAAOC,CAAC,CAAC,CAAC,QAAQ,WAAY,GAAG,CAAC,CAAC,CAAC,QAAQ,KAAM,KAAK,CAAC,CAAC,CACvF,KAAK,GAAG,ECvCPC,EAAS,GAAc,WAAWZ,EAAE,YAAY,EAAE,CAAC,EAEzD,SAAgBa,EAAU,EAAa,EAAa,EAAS,EAAU,CACjEC,IAAQC,IACV,CAACA,EAAKD,GAAOC,IAAQ,EAAI,CAAC,EAAG,CAAC,EAAI,CAACA,EAAM,EAAGD,EAAM,CAAC,GAErD,IAAME,EAAO,IAAM,KAAK,MAAM,KAAK,OAAOF,EAAMC,GAAOE,CAAM,CAAC,EAC1DC,EAAOF,EACPG,EAAO,IAGLC,EAAQL,EAAM,GAAKD,EAAM,EAC/B,IAAK,IAAMO,IAAK,CAAC,EAAG,EAAG,IAAK,EAAG,EAAE,EAAG,CAClC,IAAMxB,EAAImB,EAAOK,EACXC,EAAK,KAAK,MAAMP,EAAMlB,EAAI,IAAI,EAC9BG,EAAI,KAAK,KAAKc,EAAMjB,EAAI,IAAI,EAAIyB,EAAK,EACrCC,EAAQH,EACVpB,EAAIiB,EAAS,EACX,KACCjB,EAAI,EAAI,KAAK,IAAIA,EAAIiB,CAAM,EAAI,KAAOpB,EACzC,KAAK,IAAIG,EAAIiB,CAAM,EACnBM,EAAQJ,EAAO,KAAO,KAAK,IAAII,CAAK,IACtC,EAAOA,EACP,EAAO1B,EAEX,CACA,IAAMyB,EAAK,KAAK,MAAMP,EAAMG,EAAO,IAAI,EACjCM,EAAK,KAAK,KAAKV,EAAMI,EAAO,IAAI,EAChCO,EAAmB,CAAC,EAC1B,IAAK,IAAIC,EAAIJ,EAAII,GAAKF,EAAI,IAAKC,EAAO,KAAKb,EAAMc,EAAIR,CAAI,CAAC,EAC1D,MAAO,CAAE,OAAQ,CAACN,EAAMU,EAAKJ,CAAI,EAAGN,EAAMY,EAAKN,CAAI,CAAC,EAAG,SAAQ,KAAMN,EAAMM,CAAI,CAAE,CACnF,CC3BA,IAAMS,EAAM,KAAK,GAAK,EAChBC,EAAM,GAECC,EAAe,CAC1B,KAAM,aACN,KAAK,EAAK,CACR,GAAM,CAAE,OAAM,SAAQ,QAASC,EACzB9B,EAAI+B,EAAO,WAAW,OAC5B,GAAI,CAAC/B,GAAK,CAAC+B,EAAO,MAAM,OAAQ,MAAO,CAAE,MAAO,GAAI,KAAM,EAAG,EAG7D,IAAMC,EAAOD,EAAO,MAAM,IAAK,IAAO,CAAE,IAAG,EAAG,KAAK,IAAI,EAAGjC,EAAE,OAAS,CAAC,EAAG,GAAI,EAAG,GAAI,CAAE,EAAE,EAClFmC,EAAa,MAAcjC,CAAC,CAAC,CAAC,KAAK,CAAC,EAC1C,IAAK,IAAMH,KAAKmC,EACd,EAAE,GAAKC,EAAOpC,EAAE,EAAE,IAClB,EAAE,GAAK,EAAOA,EAAE,EAAE,IAAMA,EAAE,GAAKA,EAAE,EAGnC,IAAMqC,EAAQrB,EAAU,EADZ,KAAK,IAAI,EAAG,GAAGoB,CACA,EAAK,CAAC,EAC3BE,EAAMD,EAAM,OAAO,GAGnBE,EAAQL,EAAO,WAAW,IAAK,GAAM,CACzC,IAAMM,EAAIP,EAAI,IAAIQ,EAAK,EAAGxC,CAAC,EAC3B,OAAOuC,EAAE,OAAST,EAAMS,EAAE,MAAM,EAAG,EAAO,EAAI,IAAMA,CACtD,CAAC,EACKE,EAAK,KAAK,IAAI,GAAGH,EAAM,IAAK,GAAMvC,EAAE,MAAM,CAAC,EAAI,IAAM,EACrD,CAAC2C,EAAIC,GAAM,CAACC,EAAK,EAAIA,EAAK,EAAI,EAAGA,EAAK,EAAIA,EAAK,EAAI,CAAC,EACpDC,EAAI,KAAK,IAAI,GAAI,KAAK,IAAID,EAAK,EAAI,EAAIH,EAAIG,EAAK,EAAI,EAAI,EAAE,CAAC,EAC3DE,EAAKD,EAAI,IACTE,EAAO,GAAcD,EAAMvC,EAAI8B,GAAQQ,EAAIC,GAC3CE,GAAM,EAAY,IAAc,GAAG/C,EAAEyC,EAAKO,EAAK,KAAK,IAAI7C,CAAC,CAAC,EAAE,GAAGH,EAAE0C,EAAKM,EAAK,KAAK,IAAI7C,CAAC,CAAC,IAEtF8C,EAAIhD,EAAI,EAAI,IAAO,EACnBkB,GAAQS,EAAMqB,GAAKhD,EACnBiD,EAAM,KAAK,IAAI/B,EAAO,GAAK,GAAI,EAC/BgC,GAAU,EAAY,EAAY,EAAY,IAAe,CACjE,IAAMC,EAAI,KAAK,IAAIC,EAAIC,EAAM1B,EAAM,OAAU,GAAG,EAC1C2B,EAAM,IAAID,EAAK,KAAK,IAC1B,MACE,IAAIP,EAAGS,EAAIF,CAAE,EAAE,GAAGtD,EAAEwD,CAAE,EAAE,GAAGxD,EAAEwD,CAAE,EAAE,KAAKD,EAAI,KAAKR,EAAGS,EAAIJ,CAAC,EAAA,GACnDL,EAAGU,EAAIL,CAAC,EAAE,GAAGpD,EAAEyD,CAAE,EAAE,GAAGzD,EAAEyD,CAAE,EAAE,KAAKF,EAAI,KAAKR,EAAGU,EAAIH,CAAE,EAAE,EAE7D,EAEII,EAAQ,GACRC,EAAO,GACX1B,EAAK,SAAS,EAAG,IAAM,CACrB,IAAM2B,EAAQ5B,EAAO,WAAWlC,EAAE,EAAE,IAC9B+D,EAAM7B,EAAO,OAAOlC,EAAE,EAAE,IACxB,CAACwD,EAAID,GAAM,CAACJ,EAAI,EAAInD,EAAE,EAAE,GAAKqB,EAAO+B,EAAKD,EAAI,GAAKnD,EAAE,EAAE,GAAK,GAAKqB,EAAO+B,CAAG,EAC1E,CAACO,EAAID,GAAM,CAACV,EAAIhD,EAAE,EAAE,EAAGgD,EAAIhD,EAAE,EAAE,CAAC,EAChCgE,EAAI,CACR,WAAYpD,EAAImD,EAAKD,CAAK,EAC1B,SAAU,EACV,SAAU9D,EAAE,EAAE,GAAK,EACnB,SAAUiC,EAAI,IAAIQ,EAAK,EAAGqB,CAAK,EAC/B,cAAeC,EACf,SAAU/D,EAAE,EAAE,MACd,SAAUiC,EAAI,IAAIQ,EAAK,EAAGzC,EAAE,EAAE,KAAK,EACnC,YAAaiC,EAAI,KAAKjC,EAAE,CAAC,EACzB,aAAc8D,IAAUnD,CAC1B,EACA,GAASP,EAAG,OAAQ,CAAE,YAAa,OAAQ,GAAG4D,EAAG,EAAGX,EAAOM,EAAID,EAAIF,EAAID,CAAE,CAAE,CAAC,EAE5E,IAAMU,GAAON,EAAKD,GAAM,EAClB,CAACQ,EAAIC,GAAM,CACf,KAAK,IAAI,EAAGF,EAAM,KAAK,IAAI,IAAKP,EAAKC,GAAM,CAAC,CAAC,EAC7CM,EAAM,KAAK,IAAI,IAAKP,EAAKC,GAAM,CAAC,CAClC,EACMS,EAAO,KAAK,KAAKb,EAAKC,GAAM,EAAG,GAAKS,GAAO,CAAC,EAC5CI,GAAMb,EAAKD,GAAM,GACnBG,EAAKC,EAAK,KAAOJ,EAAKC,GAAMS,EAAM,MACpC,GAAQ7D,EAAG,OAAQ,CACjB,YAAa,MACb,GAAG4D,EACH,EAAGX,EAAOa,EAAIC,EAAIE,EAAKD,EAAMC,EAAKD,CAAI,EACtC,KAAM,aACR,CAAC,EACL,CAAC,EAGD,IAAIE,EAAO,GACPC,EAAS,GAEPC,EAAOnC,EAAM,OAAO,OAAQ,GAAM7B,EAAI,CAAC,EAC7C,IAAK,IAAMA,KAAKgE,EAAK,OAAS,EAAIA,EAAK,QAAQ,EAAG,IAAM3C,EAAI,CAAC,EAAI2C,EAC/D,GAAQpE,EAAG,SAAU,CAAE,GAAIF,EAAEyC,CAAE,EAAG,GAAIzC,EAAE0C,CAAE,EAAG,EAAG1C,EAAE8C,EAAIxC,CAAC,CAAC,EAAG,KAAM,MAAO,CAAC,EACzE,GAAUJ,EACR,OACA,CAAE,EAAGF,EAAEyC,CAAE,EAAG,EAAGzC,EAAE0C,EAAKI,EAAIxC,CAAC,EAAI,CAAC,EAAG,cAAe,SAAU,YAAa,EAAG,EAC5ET,EAAIkC,EAAI,IAAIQ,EAAK,EAAGjC,CAAC,CAAC,CACxB,EAIF,IAAMiE,EAAoB,CAAC,EAgB3B,OAfAlC,EAAM,SAAS,EAAM,IAAM,CACzB,IAAMlC,EAAI8C,EAAI,GAAKtB,EAAI,IAAOR,EACxB,CAACqD,EAAGC,GAAK,CAAChC,GAAMG,EAAI,GAAK,KAAK,IAAIzC,CAAC,EAAGuC,GAAME,EAAI,GAAK,KAAK,IAAIzC,CAAC,CAAC,EAChEuE,EAAK,KAAK,IAAIvE,CAAC,EACfwE,EAAS,KAAK,IAAID,CAAE,EAAI,GAAM,SAAWA,EAAK,EAAI,QAAU,MAC5DE,EAAIC,EAAK,OAAS,IAClBC,EAAIH,IAAW,SAAWH,EAAII,EAAI,EAAID,IAAW,QAAUH,EAAIA,EAAII,EACrEL,EAAM,KAAM,GAAMO,EAAIC,EAAE,IAAOD,EAAIF,EAAIG,EAAE,IAAON,EAAI,EAAIM,EAAE,IAAON,EAAI,EAAIM,EAAE,EAAG,IAClFR,EAAM,KAAK,CAACO,EAAGL,EAAI,EAAGK,EAAIF,EAAGH,EAAI,CAAC,CAAC,EACnC,GAAUvE,EACR,OACA,CAAE,EAAGF,EAAEwE,CAAC,EAAG,EAAGxE,EAAEyE,CAAC,EAAG,cAAeE,EAAQ,oBAAqB,SAAU,WAAY,EAAG,EACzF9E,EAAIgF,CAAI,CACV,EACF,CAAC,EACM,CAAE,QAAO,OAAM,SAAQ,MAAK,CACrC,CACF,EAEApF,EAAS,SAAUqC,CAAM"}
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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"}
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=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{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: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}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mayacharts",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Beautiful, accessible charts in five lines. Zero dependencies. The browser is the chart engine.",
5
5
  "keywords": [
6
6
  "chart",