mayacharts 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -6
- package/dist/core/registry.d.ts +1 -1
- package/dist/core/types.d.ts +1 -1
- package/dist/element/animate.d.ts +4 -0
- package/dist/element.js +3 -3
- package/dist/element.js.map +1 -1
- package/dist/flow.js +2 -2
- package/dist/flow.js.map +1 -1
- package/dist/geo.js +2 -2
- package/dist/geo.js.map +1 -1
- package/dist/hierarchy.js +2 -2
- package/dist/hierarchy.js.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/maya.global.js +3 -3
- package/dist/maya.global.js.map +1 -1
- package/dist/radial.js +1 -1
- package/dist/radial.js.map +1 -1
- package/dist/theme.css +1 -1
- package/llms.txt +1 -1
- package/package.json +5 -5
- package/schema.json +1 -1
package/dist/flow.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
/*! mayacharts v0.
|
|
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={"&":`&`,"<":`<`,">":`>`,'"':`"`,"'":`'`};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=(...e)=>e.map(e=>encodeURIComponent(String(e).replace(/\p{Cs}/gu,`�`)).replace(/~/g,`%7E`)).join(`~`),c=12,l=8,u={noun:`Sankey`,check(e,t){(!Array.isArray(e.path)||e.path.length<2)&&t(`invalid-option`,`path`,`spec.path on "sankey" needs at least 2 levels.`,`Example: path: ["source", "target"] (outer to inner).`)},draw(e){let{spec:t,plot:n}=e,r=t.path,i=r.length,u=[],d=r.map(()=>/* @__PURE__ */ new Map),f=/* @__PURE__ */ new Map,p=(e,t)=>{let n=d[e].get(t);return n||(n={lv:e,name:t,i:u.length,in:0,out:0,v:0,y:0},d[e].set(t,n),u.push(n)),n};for(let n of t.data){let a=n[t.y];if(typeof a!=`number`)continue;a>0||e.fail(`non-positive-value`,t.y,`spec.${t.y} is ${a}, but sankey sizes must be positive.`);let o=p(0,String(n[r[0]]));for(let e=1;e<i;e++){let t=p(e,String(n[r[e]])),i=o.i+`\0`+t.i,s=f.get(i);s||f.set(i,s={s:o,t,vals:[],v:0,sy:0,ty:0}),s.vals.push(a),o=t}}let m=e.agg(t.aggregate),h=[...f.values()];for(let n of h)n.v=m(n.vals)??0,n.v>0||e.fail(`non-positive-value`,t.y,`link ${n.s.name} to ${n.t.name} is ${n.v}, but sankey sizes must be positive.`),n.s.out+=n.v,n.t.in+=n.v;for(let e of u)e.v=Math.max(e.in,e.out);let g=e=>u.filter(t=>t.lv===e).sort((e,t)=>t.v-e.v),_=1/0;for(let e=0;e<i;e++){let t=g(e),
|
|
1
|
+
/*! mayacharts v0.3.0 | MIT | https://github.com/BbekShr/mayacharts */
|
|
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={"&":`&`,"<":`<`,">":`>`,'"':`"`,"'":`'`};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=(...e)=>e.map(e=>encodeURIComponent(String(e).replace(/\p{Cs}/gu,`�`)).replace(/~/g,`%7E`)).join(`~`),c=12,l=8,u={noun:`Sankey`,check(e,t){(!Array.isArray(e.path)||e.path.length<2)&&t(`invalid-option`,`path`,`spec.path on "sankey" needs at least 2 levels.`,`Example: path: ["source", "target"] (outer to inner).`)},draw(e){let{spec:t,plot:n}=e,r=t.path,i=r.length,u=[],d=r.map(()=>/* @__PURE__ */ new Map),f=/* @__PURE__ */ new Map,p=(e,t)=>{let n=d[e].get(t);return n||(n={lv:e,name:t,i:u.length,in:0,out:0,v:0,y:0},d[e].set(t,n),u.push(n)),n};for(let n of t.data){let a=n[t.y];if(typeof a!=`number`)continue;a>0||e.fail(`non-positive-value`,t.y,`spec.${t.y} is ${a}, but sankey sizes must be positive.`);let o=p(0,String(n[r[0]]));for(let e=1;e<i;e++){let t=p(e,String(n[r[e]])),i=o.i+`\0`+t.i,s=f.get(i);s||f.set(i,s={s:o,t,vals:[],v:0,sy:0,ty:0}),s.vals.push(a),o=t}}let m=e.agg(t.aggregate),h=[...f.values()];for(let n of h)n.v=m(n.vals)??0,n.v>0||e.fail(`non-positive-value`,t.y,`link ${n.s.name} to ${n.t.name} is ${n.v}, but sankey sizes must be positive.`),n.s.out+=n.v,n.t.in+=n.v;for(let e of u)e.v=Math.max(e.in,e.out);let g=e=>u.filter(t=>t.lv===e).sort((e,t)=>t.v-e.v),[_,v]=[n.y+8,Math.max(0,n.h-16)],y=Math.max(...Array.from({length:i},(e,t)=>g(t).length)),b=y>1?Math.min(l,v/4/(y-1)):0,x=1/0;for(let e=0;e<i;e++){let t=g(e),n=t.reduce((e,t)=>e+t.v,0);n>0&&(x=Math.min(x,(v-b*(t.length-1))/n))}x>0&&x<1/0||(x=0);for(let e=0;e<i;e++){let t=_;for(let n of g(e))n.y=t,t+=n.v*x+b}let S=e=>n.x+e.lv*(n.w-c)/(i-1);for(let e of u){let t=e.y;for(let n of h.filter(t=>t.s===e).sort((e,t)=>e.t.y-t.t.y))n.sy=t,t+=n.v*x;t=e.y;for(let n of h.filter(t=>t.t===e).sort((e,t)=>e.s.y-t.s.y))n.ty=t,t+=n.v*x}let C=0,w=``;for(let n of h){let[r,i,l,u]=[S(n.s)+c,S(n.t),n.v*x,(S(n.s)+c+S(n.t))/2],[d,f]=[n.sy,n.ty],p=`M${a(r)} ${a(d)}C${a(u)} ${a(d)} ${a(u)} ${a(f)} ${a(i)} ${a(f)}L${a(i)} ${a(f+l)}C${a(u)} ${a(f+l)} ${a(u)} ${a(d+l)} ${a(r)} ${a(d+l)}Z`;w+=o(`path`,{"data-maya":`link`,"data-key":s(`k`,n.s.lv,n.s.name,n.t.name),"data-c":C++,"data-s":n.s.i%8,"data-x":`${n.s.name} → ${n.t.name}`,"data-series":``,"data-y":n.v,"data-f":e.fmt(t.y,n.v),d:p})}for(let n of u){let r=n.v*x;w+=o(`rect`,{"data-maya":`mark`,"data-key":s(`n`,n.lv,n.name),"data-c":C++,"data-s":n.i%8,"data-x":n.name,"data-series":``,"data-y":n.v,"data-f":e.fmt(t.y,n.v),"data-depth":n.lv,x:a(S(n)),y:a(n.y),width:c,height:a(r)});let l=n.lv===i-1;e.label(l?S(n)-4:S(n)+c+4,n.y+r/2,n.name,l?`end`:`start`)}return{marks:w,hits:``}}};n(`sankey`,u);var d=8,f=(e,t)=>{let n=[...e];return n.length>t?n.slice(0,t-1).join(``)+`…`:e},p={noun:`Chord`,draw(e){let{spec:t,plot:n}=e,[r,i]=t.path,c=[],l=[/* @__PURE__ */ new Map,/* @__PURE__ */ new Map],u=/* @__PURE__ */ new Map,p=(e,t)=>{let n=l[e].get(t);return n||(n={lv:e,name:t,i:c.length,s:0,v:0,a:0},l[e].set(t,n),c.push(n)),n};for(let n of t.data){let a=n[t.y];if(typeof a!=`number`)continue;a>0||e.fail(`non-positive-value`,t.y,`spec.${t.y} is ${a}, but chord sizes must be positive.`);let o=p(0,String(n[r])),s=p(1,String(n[i])),c=o.i+`\0`+s.i,l=u.get(c);l||u.set(c,l={s:o,t:s,vals:[],v:0}),l.vals.push(a)}let m=e.agg(t.aggregate),h=[...u.values()];for(let n of h)n.v=m(n.vals)??0,n.v>0||e.fail(`non-positive-value`,t.y,`link ${n.s.name} to ${n.t.name} is ${n.v}, but chord sizes must be positive.`),n.s.v+=n.v,n.t.v+=n.v;c.sort((e,t)=>e.lv-t.lv||e.i-t.i).forEach((e,t)=>e.s=t%8);let g=h.reduce((e,t)=>e+t.v,0);if(!(g>0))return{marks:``,hits:``};let _=.1,v=.03,y=[0,1].map(e=>c.filter(t=>t.lv===e)),b=Math.min(...y.map(e=>(Math.PI-_-v*(e.length-1))/g));for(let e of[0,1]){let t=y[e].sort((t,n)=>(e?n.v-t.v:t.v-n.v)||t.i-n.i),n=e?_/2:Math.PI+_/2;for(let e of t)e.a=n,n+=e.v*b+v}let x=Math.min(20,Math.floor((n.w*.36-4)/7.2)),S=[0,1].map(e=>Math.max(0,...y[e].map(e=>[...f(e.name,x)].length))*7.2+4),C=Math.max(12,Math.min(n.h/2-d-20,(n.w-S[0]-S[1]-24-4)/2)),w=n.w-S[0]-S[1]-2*(C+12),T=n.x+w/2+S[0]+C+12,E=n.y+n.h/2,D=(e,t)=>`${a(T+t*Math.sin(e))} ${a(E-t*Math.cos(e))}`,O=(e,t,n,r)=>`A${a(n)} ${a(n)} 0 0 ${r} ${D(r?t:e,n)}`,k=/* @__PURE__ */ new Map;for(let e of c){let t=h.filter(t=>(e.lv?t.t:t.s)===e).sort((t,n)=>e.lv?n.s.a-t.s.a:n.t.a-t.t.a),n=e.a;for(let r of t){let t=k.get(r)??{sa:0,ta:0};e.lv?t.ta=n:t.sa=n,k.set(r,t),n+=r.v*b}}let A=e=>t.titles.get(e)??e,j=0,M=``;for(let n of h){let{sa:r,ta:i}=k.get(n),[c,l]=[r+n.v*b,i+n.v*b],u=`M${D(r,C)}${O(r,c,C,1)}Q${a(T)} ${a(E)} ${D(i,C)}${O(i,l,C,1)}Q${a(T)} ${a(E)} ${D(r,C)}Z`;M+=o(`path`,{"data-maya":`link`,"data-key":s(`k`,0,n.s.name,n.t.name),"data-c":j++,"data-s":n.s.s,"data-x":`${n.s.name} -> ${n.t.name}`,"data-series":``,"data-y":n.v,"data-f":e.fmt(t.y,n.v),d:u})}for(let n of c){let[a,c]=[n.a,n.a+n.v*b],l=`M${D(a,C+d)}${O(a,c,C+d,1)}L${D(c,C)}${O(a,c,C,0)}Z`;M+=o(`path`,{"data-maya":`mark`,"data-key":s(`n`,n.lv,n.name),"data-c":j++,"data-s":n.s,"data-x":n.name,"data-series":A(n.lv?i:r),"data-y":n.v,"data-f":e.fmt(t.y,n.v),"data-depth":n.lv,d:l})}for(let t of c){let n=t.a+t.v*b/2,[r,i]=[Math.sin(n),Math.cos(n)],a=C+d+4,[o,s]=[T+a*r,E-a*i],c=f(t.name,x);e.label(o,s,c,Math.abs(r)<.25?i>0?`above`:`below`:r>0?`start`:`end`)}return{marks:M,hits:``}}};n(`chord`,p);export{p as chord,u as sankey};
|
|
3
3
|
//# sourceMappingURL=flow.js.map
|
package/dist/flow.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flow.js","names":["KEY","MODULES","register","type","mark","ESC","esc","s","c","r","n","el","a","k","attrs","v","children","tag","key","parts","p","W","PAD","sankey","spec","fail","ctx","P","cols","nodes","byLv","links","node","lv","name","row","prev","next","l","red","ls","col","b","sum","plot","y","x","o","marks","x0","x1","th","m","d","h","last","RING","clip","chord","P0","P1","t","j","total","SIDE","GAP","sides","lw","R","cx","cy","pt","rad","arc","sweep","a1","a0","slot","mine","title","f","sb","tb","sa","ta","sn","cs","lx","ly","text"],"sources":["../src/core/registry.ts","../src/core/svg.ts","../src/flow.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 \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n};\n\nexport function esc(s: string | number): string {\n return String(s).replace(/[&<>\"']/g, (c) => ESC[c]!);\n}\n\nexport function r(n: number): number {\n return Math.round(n * 100) / 100;\n}\n\nexport function el(\n tag: string,\n attrs: Record<string, string | number | boolean | null | undefined>,\n children?: string,\n): string {\n let a = \"\";\n for (const k in attrs) {\n const v = attrs[k];\n if (v == null || v === false) continue;\n a += v === true ? ` ${k}=\"\"` : ` ${k}=\"${esc(v)}\"`;\n }\n return children === undefined ? `<${tag}${a}/>` : `<${tag}${a}>${children}</${tag}>`;\n}\n\n/** Sentinel category for `limit`'s rolled-up rest. Cannot collide with real data text. */\nexport const OTHER = \"\\u0000other\";\n\n/**\n * Mark identity: each part `encodeURIComponent`ed (lone surrogates replaced, `~` -> %7E),\n * joined by `~`. Grammar: band `S~C`; line/area `l~S`/`a~S`; scatter `S~name` (or index);\n * hierarchy `h~p0~p1…`; sankey node `n~depth~name`, link `k~depth~src~dst`; hexmap `g~CODE`.\n */\nexport const key = (...parts: unknown[]): string =>\n parts\n .map((p) => encodeURIComponent(String(p).replace(/\\p{Cs}/gu, \"�\")).replace(/~/g, \"%7E\"))\n .join(\"~\");\n\n/** Invisible target grown to >= 24 px around a small rect mark; \"\" when it is big enough. */\nexport function hit(d: Parameters<typeof el>[1], x: number, y: number, w: number, h: number) {\n const [gw, gh] = [Math.max(w, 24), Math.max(h, 24)];\n return w < 24 || h < 24\n ? el(\n \"rect\",\n Object.assign({ \"data-maya\": \"hit\" }, d, {\n \"data-maya\": \"hit\",\n x: r(x - (gw - w) / 2),\n y: r(y - (gh - h) / 2),\n width: r(gw),\n height: r(gh),\n fill: \"transparent\",\n }),\n )\n : \"\";\n}\n","// mayacharts/flow: sankey. Imports only registry, svg and types (never validate/render/shape).\nimport { register } from \"./core/registry.ts\";\nimport { el, key, r } from \"./core/svg.ts\";\nimport type { Mark } from \"./core/types.ts\";\n\nconst W = 12;\nconst PAD = 8;\n\ninterface N {\n lv: number;\n name: string;\n i: number;\n in: number;\n out: number;\n v: number;\n y: number;\n}\ninterface L {\n s: N;\n t: N;\n vals: number[];\n v: number;\n sy: number;\n ty: number;\n}\n\nexport const sankey: Mark = {\n noun: \"Sankey\",\n check(spec, fail) {\n if (!Array.isArray(spec.path) || spec.path.length < 2)\n fail(\n \"invalid-option\",\n \"path\",\n 'spec.path on \"sankey\" needs at least 2 levels.',\n 'Example: path: [\"source\", \"target\"] (outer to inner).',\n );\n },\n draw(ctx) {\n const { spec, plot } = ctx;\n const P = spec.path;\n const cols = P.length;\n // Maps, not objects: node names such as \"__proto__\" are plain data.\n const nodes: N[] = [];\n const byLv: Map<string, N>[] = P.map(() => new Map());\n const links = new Map<string, L>();\n const node = (lv: number, name: string): N => {\n let n = byLv[lv]!.get(name);\n if (!n) {\n n = { lv, name, i: nodes.length, in: 0, out: 0, v: 0, y: 0 };\n byLv[lv]!.set(name, n);\n nodes.push(n);\n }\n return n;\n };\n for (const row of spec.data) {\n const v = row[spec.y];\n if (typeof v !== \"number\") continue;\n if (!(v > 0))\n ctx.fail(\n \"non-positive-value\",\n spec.y,\n `spec.${spec.y} is ${v}, but sankey sizes must be positive.`,\n );\n let prev = node(0, String(row[P[0]!]));\n for (let lv = 1; lv < cols; lv++) {\n const next = node(lv, String(row[P[lv]!]));\n const k = prev.i + \"\\0\" + next.i;\n let l = links.get(k);\n if (!l) links.set(k, (l = { s: prev, t: next, vals: [], v: 0, sy: 0, ty: 0 }));\n l.vals.push(v);\n prev = next;\n }\n }\n const red = ctx.agg(spec.aggregate);\n const ls = [...links.values()];\n for (const l of ls) {\n l.v = red(l.vals) ?? 0;\n if (!(l.v > 0))\n ctx.fail(\n \"non-positive-value\",\n spec.y,\n `link ${l.s.name} to ${l.t.name} is ${l.v}, but sankey sizes must be positive.`,\n );\n l.s.out += l.v;\n l.t.in += l.v;\n }\n for (const n of nodes) n.v = Math.max(n.in, n.out);\n\n // ponytail: no crossing minimisation; columns sorted by value only.\n const col = (lv: number) => nodes.filter((n) => n.lv === lv).sort((a, b) => b.v - a.v);\n let k = Infinity;\n for (let lv = 0; lv < cols; lv++) {\n const c = col(lv);\n const sum = c.reduce((a, n) => a + n.v, 0);\n if (sum > 0) k = Math.min(k, (plot.h - PAD * (c.length - 1)) / sum);\n }\n if (!(k > 0 && k < Infinity)) k = 0;\n for (let lv = 0; lv < cols; lv++) {\n let y = plot.y;\n for (const n of col(lv)) ((n.y = y), (y += n.v * k + PAD));\n }\n const x = (n: N) => plot.x + (n.lv * (plot.w - W)) / (cols - 1);\n for (const n of nodes) {\n let o = n.y;\n for (const l of ls.filter((l) => l.s === n).sort((a, b) => a.t.y - b.t.y))\n ((l.sy = o), (o += l.v * k));\n o = n.y;\n for (const l of ls.filter((l) => l.t === n).sort((a, b) => a.s.y - b.s.y))\n ((l.ty = o), (o += l.v * k));\n }\n\n let c = 0;\n let marks = \"\";\n for (const l of ls) {\n const [x0, x1, th, m] = [x(l.s) + W, x(l.t), l.v * k, (x(l.s) + W + x(l.t)) / 2];\n const [a, b] = [l.sy, l.ty];\n const d = `M${r(x0)} ${r(a)}C${r(m)} ${r(a)} ${r(m)} ${r(b)} ${r(x1)} ${r(b)}L${r(x1)} ${r(b + th)}C${r(m)} ${r(b + th)} ${r(m)} ${r(a + th)} ${r(x0)} ${r(a + th)}Z`;\n marks += el(\"path\", {\n \"data-maya\": \"link\",\n \"data-key\": key(\"k\", l.s.lv, l.s.name, l.t.name),\n \"data-c\": c++,\n \"data-s\": l.s.i % 8,\n \"data-x\": `${l.s.name} → ${l.t.name}`,\n \"data-series\": \"\",\n \"data-y\": l.v,\n \"data-f\": ctx.fmt(spec.y, l.v),\n d,\n });\n }\n for (const n of nodes) {\n const h = n.v * k;\n marks += el(\"rect\", {\n \"data-maya\": \"mark\",\n \"data-key\": key(\"n\", n.lv, n.name),\n \"data-c\": c++,\n \"data-s\": n.i % 8,\n \"data-x\": n.name,\n \"data-series\": \"\",\n \"data-y\": n.v,\n \"data-f\": ctx.fmt(spec.y, n.v),\n \"data-depth\": n.lv,\n x: r(x(n)),\n y: r(n.y),\n width: W,\n height: r(h),\n });\n const last = n.lv === cols - 1;\n ctx.label(last ? x(n) - 4 : x(n) + W + 4, n.y + h / 2, n.name, last ? \"end\" : \"start\");\n }\n return { marks, hits: \"\" };\n },\n};\n\nregister(\"sankey\", sankey);\n\nconst TAU = Math.PI * 2;\nconst RING = 8;\nconst clip = (s: string) => {\n const c = [...s];\n return c.length > 14 ? c.slice(0, 13).join(\"\") + \"\\u2026\" : s;\n};\n\ninterface CN {\n lv: number;\n s: number;\n name: string;\n i: number;\n v: number;\n a: number;\n}\ninterface CL {\n s: CN;\n t: CN;\n vals: number[];\n v: number;\n}\n\n/** Chord diagram: from-nodes on the left half, to-nodes on the right, ribbons between them. */\nexport const chord: Mark = {\n noun: \"Chord\",\n draw(ctx) {\n const { spec, plot } = ctx;\n const [P0, P1] = spec.path as [string, string];\n const nodes: CN[] = [];\n const byLv: Map<string, CN>[] = [new Map(), new Map()];\n const links = new Map<string, CL>();\n const node = (lv: number, name: string): CN => {\n let n = byLv[lv]!.get(name);\n if (!n) {\n n = { lv, name, i: nodes.length, s: 0, v: 0, a: 0 };\n byLv[lv]!.set(name, n);\n nodes.push(n);\n }\n return n;\n };\n for (const row of spec.data) {\n const v = row[spec.y];\n if (typeof v !== \"number\") continue;\n if (!(v > 0))\n ctx.fail(\n \"non-positive-value\",\n spec.y,\n `spec.${spec.y} is ${v}, but chord sizes must be positive.`,\n );\n const s = node(0, String(row[P0]));\n const t = node(1, String(row[P1]));\n const k = s.i + \"\\0\" + t.i;\n let l = links.get(k);\n if (!l) links.set(k, (l = { s, t, vals: [], v: 0 }));\n l.vals.push(v);\n }\n const red = ctx.agg(spec.aggregate);\n const ls = [...links.values()];\n for (const l of ls) {\n l.v = red(l.vals) ?? 0;\n if (!(l.v > 0))\n ctx.fail(\n \"non-positive-value\",\n spec.y,\n `link ${l.s.name} to ${l.t.name} is ${l.v}, but chord sizes must be positive.`,\n );\n l.s.v += l.v;\n l.t.v += l.v;\n }\n // Palette slots: from-nodes first, then to-nodes, in first-seen order.\n nodes.sort((a, b) => a.lv - b.lv || a.i - b.i).forEach((n, j) => (n.s = j % 8));\n const total = ls.reduce((a, l) => a + l.v, 0);\n if (!(total > 0)) return { marks: \"\", hits: \"\" };\n\n // Angles run clockwise from 12 o'clock. To-nodes fill the right half top to bottom (largest on\n // top), from-nodes the left half bottom to top (largest on top). Each side holds `total`.\n const SIDE = 0.1;\n const GAP = 0.03;\n const sides = [0, 1].map((lv) => nodes.filter((n) => n.lv === lv));\n const k = Math.min(...sides.map((c) => (Math.PI - SIDE - GAP * (c.length - 1)) / total));\n for (const lv of [0, 1]) {\n const c = sides[lv]!.sort((a, b) => (lv ? b.v - a.v : a.v - b.v) || a.i - b.i);\n let a = lv ? SIDE / 2 : Math.PI + SIDE / 2;\n for (const n of c) ((n.a = a), (a += n.v * k + GAP));\n }\n const lw = Math.min(\n Math.max(...nodes.map((n) => clip(n.name).length)) * 7.2 + 4,\n plot.w * 0.28,\n );\n const R = Math.max(12, Math.min(plot.h / 2 - RING - 22, plot.w / 2 - RING - lw - 10));\n const [cx, cy] = [plot.x + plot.w / 2, plot.y + plot.h / 2];\n const pt = (a: number, rad: number) =>\n `${r(cx + rad * Math.sin(a))} ${r(cy - rad * Math.cos(a))}`;\n const arc = (a0: number, a1: number, rad: number, sweep: 0 | 1) =>\n `A${r(rad)} ${r(rad)} 0 0 ${sweep} ${pt(sweep ? a1 : a0, rad)}`;\n\n // Ribbon slots: each node hands them out clockwise, ordered to avoid crossings.\n const slot = new Map<CL, { sa: number; ta: number }>();\n for (const n of nodes) {\n const mine = ls\n .filter((l) => (n.lv ? l.t : l.s) === n)\n .sort((x, y) => (n.lv ? y.s.a - x.s.a : y.t.a - x.t.a));\n let a = n.a;\n for (const l of mine) {\n const o = slot.get(l) ?? { sa: 0, ta: 0 };\n n.lv ? (o.ta = a) : (o.sa = a);\n slot.set(l, o);\n a += l.v * k;\n }\n }\n const title = (f: string) => spec.titles.get(f) ?? f;\n let c = 0;\n let marks = \"\";\n for (const l of ls) {\n const { sa, ta } = slot.get(l)!;\n const [sb, tb] = [sa + l.v * k, ta + l.v * k];\n const d = `M${pt(sa, R)}${arc(sa, sb, R, 1)}Q${r(cx)} ${r(cy)} ${pt(ta, R)}${arc(ta, tb, R, 1)}Q${r(cx)} ${r(cy)} ${pt(sa, R)}Z`;\n marks += el(\"path\", {\n \"data-maya\": \"link\",\n \"data-key\": key(\"k\", 0, l.s.name, l.t.name),\n \"data-c\": c++,\n \"data-s\": l.s.s,\n \"data-x\": `${l.s.name} -> ${l.t.name}`,\n \"data-series\": \"\",\n \"data-y\": l.v,\n \"data-f\": ctx.fmt(spec.y, l.v),\n d,\n });\n }\n for (const n of nodes) {\n const [a0, a1] = [n.a, n.a + n.v * k];\n const d = `M${pt(a0, R + RING)}${arc(a0, a1, R + RING, 1)}L${pt(a1, R)}${arc(a0, a1, R, 0)}Z`;\n marks += el(\"path\", {\n \"data-maya\": \"mark\",\n \"data-key\": key(\"n\", n.lv, n.name),\n \"data-c\": c++,\n \"data-s\": n.s,\n \"data-x\": n.name,\n \"data-series\": title(n.lv ? P1 : P0),\n \"data-y\": n.v,\n \"data-f\": ctx.fmt(spec.y, n.v),\n \"data-depth\": n.lv,\n d,\n });\n }\n // ponytail: labels are clipped to 14 characters; ones that still collide are dropped by ctx.label.\n for (const n of nodes) {\n const m = n.a + (n.v * k) / 2;\n const [sn, cs] = [Math.sin(m), Math.cos(m)];\n const rad = R + RING + 4;\n const [lx, ly] = [cx + rad * sn, cy - rad * cs];\n const text = clip(n.name);\n ctx.label(\n lx,\n ly,\n text,\n Math.abs(sn) < 0.25 ? (cs > 0 ? \"above\" : \"below\") : sn > 0 ? \"start\" : \"end\",\n );\n }\n return { marks, hits: \"\" };\n },\n};\nregister(\"chord\", chord);\n\nexport {};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"flow.js","names":["KEY","MODULES","register","type","mark","ESC","esc","s","c","r","n","el","a","k","attrs","v","children","tag","key","parts","p","W","PAD","sankey","spec","fail","ctx","P","cols","nodes","byLv","links","node","lv","name","row","prev","next","l","red","ls","col","b","top","avail","plot","most","pad","sum","y","x","o","marks","x0","x1","th","m","d","h","last","RING","clip","max","chord","P0","P1","t","j","total","SIDE","GAP","sides","maxCh","lw","R","spare","cx","cy","pt","rad","arc","sweep","a1","a0","slot","mine","title","f","sb","tb","sa","ta","sn","cs","lx","ly","text"],"sources":["../src/core/registry.ts","../src/core/svg.ts","../src/flow.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 \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n};\n\nexport function esc(s: string | number): string {\n return String(s).replace(/[&<>\"']/g, (c) => ESC[c]!);\n}\n\nexport function r(n: number): number {\n return Math.round(n * 100) / 100;\n}\n\nexport function el(\n tag: string,\n attrs: Record<string, string | number | boolean | null | undefined>,\n children?: string,\n): string {\n let a = \"\";\n for (const k in attrs) {\n const v = attrs[k];\n if (v == null || v === false) continue;\n a += v === true ? ` ${k}=\"\"` : ` ${k}=\"${esc(v)}\"`;\n }\n return children === undefined ? `<${tag}${a}/>` : `<${tag}${a}>${children}</${tag}>`;\n}\n\n/** Sentinel category for `limit`'s rolled-up rest. Cannot collide with real data text. */\nexport const OTHER = \"\\u0000other\";\n\n/**\n * Mark identity: each part `encodeURIComponent`ed (lone surrogates replaced, `~` -> %7E),\n * joined by `~`. Grammar: band `S~C`; line/area `l~S`/`a~S`; scatter `S~name` (or index);\n * hierarchy `h~p0~p1…`; sankey node `n~depth~name`, link `k~depth~src~dst`; hexmap `g~CODE`.\n */\nexport const key = (...parts: unknown[]): string =>\n parts\n .map((p) => encodeURIComponent(String(p).replace(/\\p{Cs}/gu, \"�\")).replace(/~/g, \"%7E\"))\n .join(\"~\");\n\n/** Invisible target grown to >= 24 px around a small rect mark; \"\" when it is big enough. */\nexport function hit(d: Parameters<typeof el>[1], x: number, y: number, w: number, h: number) {\n const [gw, gh] = [Math.max(w, 24), Math.max(h, 24)];\n return w < 24 || h < 24\n ? el(\n \"rect\",\n Object.assign({ \"data-maya\": \"hit\" }, d, {\n \"data-maya\": \"hit\",\n x: r(x - (gw - w) / 2),\n y: r(y - (gh - h) / 2),\n width: r(gw),\n height: r(gh),\n fill: \"transparent\",\n }),\n )\n : \"\";\n}\n","// mayacharts/flow: sankey. Imports only registry, svg and types (never validate/render/shape).\nimport { register } from \"./core/registry.ts\";\nimport { el, key, r } from \"./core/svg.ts\";\nimport type { Mark } from \"./core/types.ts\";\n\nconst W = 12;\nconst PAD = 8;\n\ninterface N {\n lv: number;\n name: string;\n i: number;\n in: number;\n out: number;\n v: number;\n y: number;\n}\ninterface L {\n s: N;\n t: N;\n vals: number[];\n v: number;\n sy: number;\n ty: number;\n}\n\nexport const sankey: Mark = {\n noun: \"Sankey\",\n check(spec, fail) {\n if (!Array.isArray(spec.path) || spec.path.length < 2)\n fail(\n \"invalid-option\",\n \"path\",\n 'spec.path on \"sankey\" needs at least 2 levels.',\n 'Example: path: [\"source\", \"target\"] (outer to inner).',\n );\n },\n draw(ctx) {\n const { spec, plot } = ctx;\n const P = spec.path;\n const cols = P.length;\n // Maps, not objects: node names such as \"__proto__\" are plain data.\n const nodes: N[] = [];\n const byLv: Map<string, N>[] = P.map(() => new Map());\n const links = new Map<string, L>();\n const node = (lv: number, name: string): N => {\n let n = byLv[lv]!.get(name);\n if (!n) {\n n = { lv, name, i: nodes.length, in: 0, out: 0, v: 0, y: 0 };\n byLv[lv]!.set(name, n);\n nodes.push(n);\n }\n return n;\n };\n for (const row of spec.data) {\n const v = row[spec.y];\n if (typeof v !== \"number\") continue;\n if (!(v > 0))\n ctx.fail(\n \"non-positive-value\",\n spec.y,\n `spec.${spec.y} is ${v}, but sankey sizes must be positive.`,\n );\n let prev = node(0, String(row[P[0]!]));\n for (let lv = 1; lv < cols; lv++) {\n const next = node(lv, String(row[P[lv]!]));\n const k = prev.i + \"\\0\" + next.i;\n let l = links.get(k);\n if (!l) links.set(k, (l = { s: prev, t: next, vals: [], v: 0, sy: 0, ty: 0 }));\n l.vals.push(v);\n prev = next;\n }\n }\n const red = ctx.agg(spec.aggregate);\n const ls = [...links.values()];\n for (const l of ls) {\n l.v = red(l.vals) ?? 0;\n if (!(l.v > 0))\n ctx.fail(\n \"non-positive-value\",\n spec.y,\n `link ${l.s.name} to ${l.t.name} is ${l.v}, but sankey sizes must be positive.`,\n );\n l.s.out += l.v;\n l.t.in += l.v;\n }\n for (const n of nodes) n.v = Math.max(n.in, n.out);\n\n // ponytail: no crossing minimisation; columns sorted by value only.\n const col = (lv: number) => nodes.filter((n) => n.lv === lv).sort((a, b) => b.v - a.v);\n // Inset 8 px (half a label) so edge nodes keep their labels; padding shrinks so it never\n // takes more than a quarter of the height, then the scale is what is left over.\n const [top, avail] = [plot.y + 8, Math.max(0, plot.h - 16)];\n const most = Math.max(...Array.from({ length: cols }, (_, lv) => col(lv).length));\n const pad = most > 1 ? Math.min(PAD, avail / 4 / (most - 1)) : 0;\n let k = Infinity;\n for (let lv = 0; lv < cols; lv++) {\n const c = col(lv);\n const sum = c.reduce((a, n) => a + n.v, 0);\n if (sum > 0) k = Math.min(k, (avail - pad * (c.length - 1)) / sum);\n }\n if (!(k > 0 && k < Infinity)) k = 0;\n for (let lv = 0; lv < cols; lv++) {\n let y = top;\n for (const n of col(lv)) ((n.y = y), (y += n.v * k + pad));\n }\n const x = (n: N) => plot.x + (n.lv * (plot.w - W)) / (cols - 1);\n for (const n of nodes) {\n let o = n.y;\n for (const l of ls.filter((l) => l.s === n).sort((a, b) => a.t.y - b.t.y))\n ((l.sy = o), (o += l.v * k));\n o = n.y;\n for (const l of ls.filter((l) => l.t === n).sort((a, b) => a.s.y - b.s.y))\n ((l.ty = o), (o += l.v * k));\n }\n\n let c = 0;\n let marks = \"\";\n for (const l of ls) {\n const [x0, x1, th, m] = [x(l.s) + W, x(l.t), l.v * k, (x(l.s) + W + x(l.t)) / 2];\n const [a, b] = [l.sy, l.ty];\n const d = `M${r(x0)} ${r(a)}C${r(m)} ${r(a)} ${r(m)} ${r(b)} ${r(x1)} ${r(b)}L${r(x1)} ${r(b + th)}C${r(m)} ${r(b + th)} ${r(m)} ${r(a + th)} ${r(x0)} ${r(a + th)}Z`;\n marks += el(\"path\", {\n \"data-maya\": \"link\",\n \"data-key\": key(\"k\", l.s.lv, l.s.name, l.t.name),\n \"data-c\": c++,\n \"data-s\": l.s.i % 8,\n \"data-x\": `${l.s.name} → ${l.t.name}`,\n \"data-series\": \"\",\n \"data-y\": l.v,\n \"data-f\": ctx.fmt(spec.y, l.v),\n d,\n });\n }\n for (const n of nodes) {\n const h = n.v * k;\n marks += el(\"rect\", {\n \"data-maya\": \"mark\",\n \"data-key\": key(\"n\", n.lv, n.name),\n \"data-c\": c++,\n \"data-s\": n.i % 8,\n \"data-x\": n.name,\n \"data-series\": \"\",\n \"data-y\": n.v,\n \"data-f\": ctx.fmt(spec.y, n.v),\n \"data-depth\": n.lv,\n x: r(x(n)),\n y: r(n.y),\n width: W,\n height: r(h),\n });\n const last = n.lv === cols - 1;\n ctx.label(last ? x(n) - 4 : x(n) + W + 4, n.y + h / 2, n.name, last ? \"end\" : \"start\");\n }\n return { marks, hits: \"\" };\n },\n};\n\nregister(\"sankey\", sankey);\n\nconst TAU = Math.PI * 2;\nconst RING = 8;\nconst clip = (s: string, max: number) => {\n const c = [...s];\n return c.length > max ? c.slice(0, max - 1).join(\"\") + \"\\u2026\" : s;\n};\n\ninterface CN {\n lv: number;\n s: number;\n name: string;\n i: number;\n v: number;\n a: number;\n}\ninterface CL {\n s: CN;\n t: CN;\n vals: number[];\n v: number;\n}\n\n/** Chord diagram: from-nodes on the left half, to-nodes on the right, ribbons between them. */\nexport const chord: Mark = {\n noun: \"Chord\",\n draw(ctx) {\n const { spec, plot } = ctx;\n const [P0, P1] = spec.path as [string, string];\n const nodes: CN[] = [];\n const byLv: Map<string, CN>[] = [new Map(), new Map()];\n const links = new Map<string, CL>();\n const node = (lv: number, name: string): CN => {\n let n = byLv[lv]!.get(name);\n if (!n) {\n n = { lv, name, i: nodes.length, s: 0, v: 0, a: 0 };\n byLv[lv]!.set(name, n);\n nodes.push(n);\n }\n return n;\n };\n for (const row of spec.data) {\n const v = row[spec.y];\n if (typeof v !== \"number\") continue;\n if (!(v > 0))\n ctx.fail(\n \"non-positive-value\",\n spec.y,\n `spec.${spec.y} is ${v}, but chord sizes must be positive.`,\n );\n const s = node(0, String(row[P0]));\n const t = node(1, String(row[P1]));\n const k = s.i + \"\\0\" + t.i;\n let l = links.get(k);\n if (!l) links.set(k, (l = { s, t, vals: [], v: 0 }));\n l.vals.push(v);\n }\n const red = ctx.agg(spec.aggregate);\n const ls = [...links.values()];\n for (const l of ls) {\n l.v = red(l.vals) ?? 0;\n if (!(l.v > 0))\n ctx.fail(\n \"non-positive-value\",\n spec.y,\n `link ${l.s.name} to ${l.t.name} is ${l.v}, but chord sizes must be positive.`,\n );\n l.s.v += l.v;\n l.t.v += l.v;\n }\n // Palette slots: from-nodes first, then to-nodes, in first-seen order.\n nodes.sort((a, b) => a.lv - b.lv || a.i - b.i).forEach((n, j) => (n.s = j % 8));\n const total = ls.reduce((a, l) => a + l.v, 0);\n if (!(total > 0)) return { marks: \"\", hits: \"\" };\n\n // Angles run clockwise from 12 o'clock. To-nodes fill the right half top to bottom (largest on\n // top), from-nodes the left half bottom to top (largest on top). Each side holds `total`.\n const SIDE = 0.1;\n const GAP = 0.03;\n const sides = [0, 1].map((lv) => nodes.filter((n) => n.lv === lv));\n const k = Math.min(...sides.map((c) => (Math.PI - SIDE - GAP * (c.length - 1)) / total));\n for (const lv of [0, 1]) {\n const c = sides[lv]!.sort((a, b) => (lv ? b.v - a.v : a.v - b.v) || a.i - b.i);\n let a = lv ? SIDE / 2 : Math.PI + SIDE / 2;\n for (const n of c) ((n.a = a), (a += n.v * k + GAP));\n }\n // Label room per side from the longest label (at most 20 characters, at most 36% of the\n // width), so the ring grows to what is left; the pair is then centred as a whole.\n const maxCh = Math.min(20, Math.floor((plot.w * 0.36 - 4) / 7.2));\n const lw = [0, 1].map(\n (lv) => Math.max(0, ...sides[lv]!.map((n) => [...clip(n.name, maxCh)].length)) * 7.2 + 4,\n ) as [number, number];\n const gutter = RING + 4;\n const R = Math.max(\n 12,\n Math.min(plot.h / 2 - RING - 20, (plot.w - lw[0] - lw[1] - 2 * gutter - 4) / 2),\n );\n const spare = plot.w - lw[0] - lw[1] - 2 * (R + gutter);\n const cx = plot.x + spare / 2 + lw[0] + R + gutter;\n const cy = plot.y + plot.h / 2;\n const pt = (a: number, rad: number) =>\n `${r(cx + rad * Math.sin(a))} ${r(cy - rad * Math.cos(a))}`;\n const arc = (a0: number, a1: number, rad: number, sweep: 0 | 1) =>\n `A${r(rad)} ${r(rad)} 0 0 ${sweep} ${pt(sweep ? a1 : a0, rad)}`;\n\n // Ribbon slots: each node hands them out clockwise, ordered to avoid crossings.\n const slot = new Map<CL, { sa: number; ta: number }>();\n for (const n of nodes) {\n const mine = ls\n .filter((l) => (n.lv ? l.t : l.s) === n)\n .sort((x, y) => (n.lv ? y.s.a - x.s.a : y.t.a - x.t.a));\n let a = n.a;\n for (const l of mine) {\n const o = slot.get(l) ?? { sa: 0, ta: 0 };\n n.lv ? (o.ta = a) : (o.sa = a);\n slot.set(l, o);\n a += l.v * k;\n }\n }\n const title = (f: string) => spec.titles.get(f) ?? f;\n let c = 0;\n let marks = \"\";\n for (const l of ls) {\n const { sa, ta } = slot.get(l)!;\n const [sb, tb] = [sa + l.v * k, ta + l.v * k];\n const d = `M${pt(sa, R)}${arc(sa, sb, R, 1)}Q${r(cx)} ${r(cy)} ${pt(ta, R)}${arc(ta, tb, R, 1)}Q${r(cx)} ${r(cy)} ${pt(sa, R)}Z`;\n marks += el(\"path\", {\n \"data-maya\": \"link\",\n \"data-key\": key(\"k\", 0, l.s.name, l.t.name),\n \"data-c\": c++,\n \"data-s\": l.s.s,\n \"data-x\": `${l.s.name} -> ${l.t.name}`,\n \"data-series\": \"\",\n \"data-y\": l.v,\n \"data-f\": ctx.fmt(spec.y, l.v),\n d,\n });\n }\n for (const n of nodes) {\n const [a0, a1] = [n.a, n.a + n.v * k];\n const d = `M${pt(a0, R + RING)}${arc(a0, a1, R + RING, 1)}L${pt(a1, R)}${arc(a0, a1, R, 0)}Z`;\n marks += el(\"path\", {\n \"data-maya\": \"mark\",\n \"data-key\": key(\"n\", n.lv, n.name),\n \"data-c\": c++,\n \"data-s\": n.s,\n \"data-x\": n.name,\n \"data-series\": title(n.lv ? P1 : P0),\n \"data-y\": n.v,\n \"data-f\": ctx.fmt(spec.y, n.v),\n \"data-depth\": n.lv,\n d,\n });\n }\n // ponytail: labels are clipped to 20 characters; ones that still collide are dropped by ctx.label.\n for (const n of nodes) {\n const m = n.a + (n.v * k) / 2;\n const [sn, cs] = [Math.sin(m), Math.cos(m)];\n const rad = R + RING + 4;\n const [lx, ly] = [cx + rad * sn, cy - rad * cs];\n const text = clip(n.name, maxCh);\n ctx.label(\n lx,\n ly,\n text,\n Math.abs(sn) < 0.25 ? (cs > 0 ? \"above\" : \"below\") : sn > 0 ? \"start\" : \"end\",\n );\n }\n return { marks, hits: \"\" };\n },\n};\nregister(\"chord\", chord);\n\nexport {};\n"],"mappings":"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"}
|
package/dist/geo.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
/*! mayacharts v0.
|
|
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={"&":`&`,"<":`<`,">":`>`,'"':`"`,"'":`'`};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=(...e)=>e.map(e=>encodeURIComponent(String(e).replace(/\p{Cs}/gu,`�`)).replace(/~/g,`%7E`)).join(`~`),c=`AK Alaska 0 0|ME Maine 10 0|WI Wisconsin 5 1|VT Vermont 9 1|NH New Hampshire 10 1|WA Washington 0 2|ID Idaho 1 2|MT Montana 2 2|ND North Dakota 3 2|MN Minnesota 4 2|IL Illinois 5 2|MI Michigan 6 2|NY New York 8 2|MA Massachusetts 9 2|OR Oregon 0 3|NV Nevada 1 3|WY Wyoming 2 3|SD South Dakota 3 3|IA Iowa 4 3|IN Indiana 5 3|OH Ohio 6 3|PA Pennsylvania 7 3|NJ New Jersey 8 3|CT Connecticut 9 3|RI Rhode Island 10 3|CA California 0 4|UT Utah 1 4|CO Colorado 2 4|NE Nebraska 3 4|MO Missouri 4 4|KY Kentucky 5 4|WV West Virginia 6 4|VA Virginia 7 4|MD Maryland 8 4|DE Delaware 9 4|AZ Arizona 1 5|NM New Mexico 2 5|KS Kansas 3 5|AR Arkansas 4 5|TN Tennessee 5 5|NC North Carolina 6 5|SC South Carolina 7 5|DC District of Columbia 8 5|OK Oklahoma 3 6|LA Louisiana 4 6|MS Mississippi 5 6|AL Alabama 6 6|GA Georgia 7 6|HI Hawaii 0 7|TX Texas 3 7|FL Florida 7 7|PR Puerto Rico 8 8`.split(`|`).map(e=>{let t=/^(\S+) (.+) (\d+) (\d+)$/.exec(e);return{code:t[1],name:t[2],c:+t[3],r:+t[4]}}),l=/* @__PURE__ */ new Map;for(let e of c)l.set(e.code.toLowerCase(),e).set(e.name.toLowerCase(),e);var u=e=>l.get(String(e).trim().toLowerCase()),d=e=>{let t=e.trim().toLowerCase(),n=``,r=4;for(let[e,i]of l){let a=Math.abs(t.length-e.length)+[...e].filter(e=>!t.includes(e)).length+[...t].filter(t=>!e.includes(t)).length;a<r&&([r,n]=[a,e.length===2?i.code:i.name])}return n},f=Math.sqrt(3),p=Math.max(...c.map(e=>e.c))+1.5,m=Math.max(...c.map(e=>e.r))+1,h={noun:`Hex map`,check(e,t){e.data.forEach((n,r)=>{let i=n[e.x];if(i==null||u(i))return;let a=d(String(i));t(`unknown-state`,`data[${r}].${e.x}`,`"${i}" is not a US state`,a&&`Did you mean "${a}"?`,`Use a two-letter code or full name (50 states, DC, PR).`)})},draw(e){let{spec:t,shaped:n,plot:r}=e,l=Math.min(r.w/(f*p),r.h/(1.5*(m-1)+2)),d=r.x+(r.w-f*l*p)/2,h=r.y+(r.h-l*(1.5*(m-1)+2))/2,g=l*.94,_=e=>[d+f*l*(e.c+.5+e.r%2/2),h+l+1.5*l*e.r],v=e=>{let[t,n]=_(e);return`M`+[0,1,2,3,4,5].map(e=>{let r=Math.PI/3*e-Math.PI/6;return`${a(t+g*Math.cos(r))} ${a(n+g*Math.sin(r))}`}).join(`L`)+`Z`},y=/* @__PURE__ */ new Map;n.cells.forEach(e=>{let t=u(n.categories[e.ci]);t&&e.value!==null&&y.set(t,(y.get(t)??0)+e.value)});let b=[...y.values()],x=Math.min(...b),S=Math.max(...b),C=``;for(let e of c)C+=o(`path`,{d:v(e),fill:`none`});let w=``,T=0;for(let[n,r]of y){let[
|
|
1
|
+
/*! mayacharts v0.3.0 | MIT | https://github.com/BbekShr/mayacharts */
|
|
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={"&":`&`,"<":`<`,">":`>`,'"':`"`,"'":`'`};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=(...e)=>e.map(e=>encodeURIComponent(String(e).replace(/\p{Cs}/gu,`�`)).replace(/~/g,`%7E`)).join(`~`),c=`AK Alaska 0 0|ME Maine 10 0|WI Wisconsin 5 1|VT Vermont 9 1|NH New Hampshire 10 1|WA Washington 0 2|ID Idaho 1 2|MT Montana 2 2|ND North Dakota 3 2|MN Minnesota 4 2|IL Illinois 5 2|MI Michigan 6 2|NY New York 8 2|MA Massachusetts 9 2|OR Oregon 0 3|NV Nevada 1 3|WY Wyoming 2 3|SD South Dakota 3 3|IA Iowa 4 3|IN Indiana 5 3|OH Ohio 6 3|PA Pennsylvania 7 3|NJ New Jersey 8 3|CT Connecticut 9 3|RI Rhode Island 10 3|CA California 0 4|UT Utah 1 4|CO Colorado 2 4|NE Nebraska 3 4|MO Missouri 4 4|KY Kentucky 5 4|WV West Virginia 6 4|VA Virginia 7 4|MD Maryland 8 4|DE Delaware 9 4|AZ Arizona 1 5|NM New Mexico 2 5|KS Kansas 3 5|AR Arkansas 4 5|TN Tennessee 5 5|NC North Carolina 6 5|SC South Carolina 7 5|DC District of Columbia 8 5|OK Oklahoma 3 6|LA Louisiana 4 6|MS Mississippi 5 6|AL Alabama 6 6|GA Georgia 7 6|HI Hawaii 0 7|TX Texas 3 7|FL Florida 7 7|PR Puerto Rico 8 8`.split(`|`).map(e=>{let t=/^(\S+) (.+) (\d+) (\d+)$/.exec(e);return{code:t[1],name:t[2],c:+t[3],r:+t[4]}}),l=/* @__PURE__ */ new Map;for(let e of c)l.set(e.code.toLowerCase(),e).set(e.name.toLowerCase(),e);var u=e=>l.get(String(e).trim().toLowerCase()),d=e=>{let t=e.trim().toLowerCase(),n=``,r=4;for(let[e,i]of l){let a=Math.abs(t.length-e.length)+[...e].filter(e=>!t.includes(e)).length+[...t].filter(t=>!e.includes(t)).length;a<r&&([r,n]=[a,e.length===2?i.code:i.name])}return n},f=Math.sqrt(3),p=Math.max(...c.map(e=>e.c))+1.5,m=Math.max(...c.map(e=>e.r))+1,h={noun:`Hex map`,check(e,t){e.data.forEach((n,r)=>{let i=n[e.x];if(i==null||u(i))return;let a=d(String(i));t(`unknown-state`,`data[${r}].${e.x}`,`"${i}" is not a US state`,a&&`Did you mean "${a}"?`,`Use a two-letter code or full name (50 states, DC, PR).`)})},draw(e){let{spec:t,shaped:n,plot:r}=e,l=Math.min(r.w/(f*p),r.h/(1.5*(m-1)+2)),d=r.x+(r.w-f*l*p)/2,h=r.y+(r.h-l*(1.5*(m-1)+2))/2,g=l*.94,_=e=>[d+f*l*(e.c+.5+e.r%2/2),h+l+1.5*l*e.r],v=e=>{let[t,n]=_(e);return`M`+[0,1,2,3,4,5].map(e=>{let r=Math.PI/3*e-Math.PI/6;return`${a(t+g*Math.cos(r))} ${a(n+g*Math.sin(r))}`}).join(`L`)+`Z`},y=/* @__PURE__ */ new Map;n.cells.forEach(e=>{let t=u(n.categories[e.ci]);t&&e.value!==null&&y.set(t,(y.get(t)??0)+e.value)});let b=[...y.values()],x=Math.min(...b),S=Math.max(...b),C=``;for(let e of c)C+=o(`path`,{d:v(e),fill:`none`});let w=``,T=``,E=0;for(let[n,r]of y){let[c,l]=_(n),u=S>x?Math.min(9,Math.floor((r-x)/(S-x)*10)):9;w+=o(`path`,{"data-maya":`mark`,"data-key":s(`g`,n.code),"data-c":E++,"data-s":0,"data-x":n.name,"data-series":``,"data-f":e.fmt(t.y,r),"data-y":r,"data-neg":r<0,"data-tone":e.tone(r),"data-q":u,d:v(n)}),T+=o(`text`,{x:a(c),y:a(l),"text-anchor":`middle`,"dominant-baseline":`middle`,"data-in":!0,"data-dark":u>=6},i(n.code))}let D=S>x?`<div class="maya-legend" data-maya="ramp"><span>${i(e.fmt(t.y,x))}</span><i></i><span>${i(e.fmt(t.y,S))}</span></div>`:``;return{marks:w,hits:``,labels:T,grid:C,legend:D}}};n(`hexmap`,h);export{h as hexmap};
|
|
3
3
|
//# sourceMappingURL=geo.js.map
|
package/dist/geo.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geo.js","names":["KEY","MODULES","register","type","mark","ESC","esc","s","c","r","n","el","a","k","attrs","v","children","tag","key","parts","p","STATES","m","BY","find","near","best","min","ch","R3","COLS","ROWS","hexmap","spec","row","d","fail","i","ctx","plot","ox","oy","at","st","hex","cx","cy","sum","shaped","vals","lo","hi","grid","marks","legend"],"sources":["../src/core/registry.ts","../src/core/svg.ts","../src/geo.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 \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n};\n\nexport function esc(s: string | number): string {\n return String(s).replace(/[&<>\"']/g, (c) => ESC[c]!);\n}\n\nexport function r(n: number): number {\n return Math.round(n * 100) / 100;\n}\n\nexport function el(\n tag: string,\n attrs: Record<string, string | number | boolean | null | undefined>,\n children?: string,\n): string {\n let a = \"\";\n for (const k in attrs) {\n const v = attrs[k];\n if (v == null || v === false) continue;\n a += v === true ? ` ${k}=\"\"` : ` ${k}=\"${esc(v)}\"`;\n }\n return children === undefined ? `<${tag}${a}/>` : `<${tag}${a}>${children}</${tag}>`;\n}\n\n/** Sentinel category for `limit`'s rolled-up rest. Cannot collide with real data text. */\nexport const OTHER = \"\\u0000other\";\n\n/**\n * Mark identity: each part `encodeURIComponent`ed (lone surrogates replaced, `~` -> %7E),\n * joined by `~`. Grammar: band `S~C`; line/area `l~S`/`a~S`; scatter `S~name` (or index);\n * hierarchy `h~p0~p1…`; sankey node `n~depth~name`, link `k~depth~src~dst`; hexmap `g~CODE`.\n */\nexport const key = (...parts: unknown[]): string =>\n parts\n .map((p) => encodeURIComponent(String(p).replace(/\\p{Cs}/gu, \"�\")).replace(/~/g, \"%7E\"))\n .join(\"~\");\n\n/** Invisible target grown to >= 24 px around a small rect mark; \"\" when it is big enough. */\nexport function hit(d: Parameters<typeof el>[1], x: number, y: number, w: number, h: number) {\n const [gw, gh] = [Math.max(w, 24), Math.max(h, 24)];\n return w < 24 || h < 24\n ? el(\n \"rect\",\n Object.assign({ \"data-maya\": \"hit\" }, d, {\n \"data-maya\": \"hit\",\n x: r(x - (gw - w) / 2),\n y: r(y - (gh - h) / 2),\n width: r(gw),\n height: r(gh),\n fill: \"transparent\",\n }),\n )\n : \"\";\n}\n","// US state hex cartogram. Importing this file registers the \"hexmap\" type.\nimport { register } from \"./core/registry.ts\";\nimport { el, key, r, esc } from \"./core/svg.ts\";\nimport type { Mark } from \"./core/types.ts\";\n\n// \"CODE Name col row\": odd-r offset grid (odd rows shift right half a hex), pointy-top.\nconst TABLE =\n \"AK Alaska 0 0|ME Maine 10 0|WI Wisconsin 5 1|VT Vermont 9 1|NH New Hampshire 10 1|\" +\n \"WA Washington 0 2|ID Idaho 1 2|MT Montana 2 2|ND North Dakota 3 2|MN Minnesota 4 2|IL Illinois 5 2|MI Michigan 6 2|NY New York 8 2|MA Massachusetts 9 2|\" +\n \"OR Oregon 0 3|NV Nevada 1 3|WY Wyoming 2 3|SD South Dakota 3 3|IA Iowa 4 3|IN Indiana 5 3|OH Ohio 6 3|PA Pennsylvania 7 3|NJ New Jersey 8 3|CT Connecticut 9 3|RI Rhode Island 10 3|\" +\n \"CA California 0 4|UT Utah 1 4|CO Colorado 2 4|NE Nebraska 3 4|MO Missouri 4 4|KY Kentucky 5 4|WV West Virginia 6 4|VA Virginia 7 4|MD Maryland 8 4|DE Delaware 9 4|\" +\n \"AZ Arizona 1 5|NM New Mexico 2 5|KS Kansas 3 5|AR Arkansas 4 5|TN Tennessee 5 5|NC North Carolina 6 5|SC South Carolina 7 5|DC District of Columbia 8 5|\" +\n \"OK Oklahoma 3 6|LA Louisiana 4 6|MS Mississippi 5 6|AL Alabama 6 6|GA Georgia 7 6|\" +\n \"HI Hawaii 0 7|TX Texas 3 7|FL Florida 7 7|PR Puerto Rico 8 8\";\n\nconst STATES = TABLE.split(\"|\").map((e) => {\n const m = /^(\\S+) (.+) (\\d+) (\\d+)$/.exec(e)!;\n return { code: m[1]!, name: m[2]!, c: +m[3]!, r: +m[4]! };\n});\nconst BY = new Map<string, (typeof STATES)[number]>();\nfor (const s of STATES) BY.set(s.code.toLowerCase(), s).set(s.name.toLowerCase(), s);\n\nconst find = (v: unknown) => BY.get(String(v).trim().toLowerCase());\n\n/** Closest code or name (a few edits away), else \"\". */\nconst near = (v: string): string => {\n const a = v.trim().toLowerCase();\n let best = \"\";\n let min = 4;\n for (const [k, s] of BY) {\n const n =\n Math.abs(a.length - k.length) +\n [...k].filter((ch) => !a.includes(ch)).length +\n [...a].filter((ch) => !k.includes(ch)).length;\n if (n < min) [min, best] = [n, k.length === 2 ? s.code : s.name];\n }\n return best;\n};\n\nconst R3 = Math.sqrt(3);\nconst COLS = Math.max(...STATES.map((s) => s.c)) + 1.5;\nconst ROWS = Math.max(...STATES.map((s) => s.r)) + 1;\n\nexport const hexmap: Mark = {\n noun: \"Hex map\",\n check(spec, fail) {\n spec.data.forEach((row, i) => {\n const v = (row as Record<string, unknown>)[spec.x as string];\n if (v == null || find(v)) return;\n const d = near(String(v));\n fail(\n \"unknown-state\",\n `data[${i}].${spec.x}`,\n `\"${v}\" is not a US state`,\n d && `Did you mean \"${d}\"?`,\n \"Use a two-letter code or full name (50 states, DC, PR).\",\n );\n });\n },\n draw(ctx) {\n const { spec, shaped, plot } = ctx;\n const s = Math.min(plot.w / (R3 * COLS), plot.h / (1.5 * (ROWS - 1) + 2));\n const ox = plot.x + (plot.w - R3 * s * COLS) / 2;\n const oy = plot.y + (plot.h - s * (1.5 * (ROWS - 1) + 2)) / 2;\n const k = s * 0.94;\n const at = (st: (typeof STATES)[number]) => [\n ox + R3 * s * (st.c + 0.5 + (st.r % 2) / 2),\n oy + s + 1.5 * s * st.r,\n ];\n const hex = (st: (typeof STATES)[number]) => {\n const [cx, cy] = at(st) as [number, number];\n return (\n \"M\" +\n [0, 1, 2, 3, 4, 5]\n .map((i) => {\n const a = (Math.PI / 3) * i - Math.PI / 6;\n return `${r(cx + k * Math.cos(a))} ${r(cy + k * Math.sin(a))}`;\n })\n .join(\"L\") +\n \"Z\"\n );\n };\n\n const sum = new Map<(typeof STATES)[number], number>();\n shaped.cells.forEach((c) => {\n const st = find(shaped.categories[c.ci]);\n if (st && c.value !== null) sum.set(st, (sum.get(st) ?? 0) + c.value);\n });\n const vals = [...sum.values()];\n const lo = Math.min(...vals);\n const hi = Math.max(...vals);\n\n let grid = \"\";\n for (const st of STATES) grid += el(\"path\", { d: hex(st), fill: \"none\" });\n let marks = \"\";\n let n = 0;\n for (const [st, v] of sum) {\n const [cx, cy] = at(st) as [number, number];\n marks += el(\"path\", {\n \"data-maya\": \"mark\",\n \"data-key\": key(\"g\", st.code),\n \"data-c\": n++,\n \"data-s\": 0,\n \"data-x\": st.name,\n \"data-series\": \"\",\n \"data-f\": ctx.fmt(spec.y, v),\n \"data-y\": v,\n \"data-neg\": v < 0,\n \"data-tone\": ctx.tone(v),\n \"data-q\": hi > lo ? Math.min(9, Math.floor(((v - lo) / (hi - lo)) * 10)) : 9,\n d: hex(st),\n });\n ctx.label(cx, cy, st.code, \"center\");\n }\n const legend =\n hi > lo\n ? `<div class=\"maya-legend\" data-maya=\"ramp\"><span>${esc(ctx.fmt(spec.y, lo))}</span><i></i><span>${esc(ctx.fmt(spec.y, hi))}</span></div>`\n : \"\";\n return { marks, hits: \"\", grid, legend };\n },\n};\n\nregister(\"hexmap\", hexmap);\n\nexport {};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"geo.js","names":["KEY","MODULES","register","type","mark","ESC","esc","s","c","r","n","el","a","k","attrs","v","children","tag","key","parts","p","STATES","m","BY","find","near","best","min","ch","R3","COLS","ROWS","hexmap","spec","row","d","fail","i","ctx","plot","ox","oy","at","st","hex","cx","cy","sum","shaped","vals","lo","hi","grid","marks","labels","q","legend"],"sources":["../src/core/registry.ts","../src/core/svg.ts","../src/geo.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 \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n};\n\nexport function esc(s: string | number): string {\n return String(s).replace(/[&<>\"']/g, (c) => ESC[c]!);\n}\n\nexport function r(n: number): number {\n return Math.round(n * 100) / 100;\n}\n\nexport function el(\n tag: string,\n attrs: Record<string, string | number | boolean | null | undefined>,\n children?: string,\n): string {\n let a = \"\";\n for (const k in attrs) {\n const v = attrs[k];\n if (v == null || v === false) continue;\n a += v === true ? ` ${k}=\"\"` : ` ${k}=\"${esc(v)}\"`;\n }\n return children === undefined ? `<${tag}${a}/>` : `<${tag}${a}>${children}</${tag}>`;\n}\n\n/** Sentinel category for `limit`'s rolled-up rest. Cannot collide with real data text. */\nexport const OTHER = \"\\u0000other\";\n\n/**\n * Mark identity: each part `encodeURIComponent`ed (lone surrogates replaced, `~` -> %7E),\n * joined by `~`. Grammar: band `S~C`; line/area `l~S`/`a~S`; scatter `S~name` (or index);\n * hierarchy `h~p0~p1…`; sankey node `n~depth~name`, link `k~depth~src~dst`; hexmap `g~CODE`.\n */\nexport const key = (...parts: unknown[]): string =>\n parts\n .map((p) => encodeURIComponent(String(p).replace(/\\p{Cs}/gu, \"�\")).replace(/~/g, \"%7E\"))\n .join(\"~\");\n\n/** Invisible target grown to >= 24 px around a small rect mark; \"\" when it is big enough. */\nexport function hit(d: Parameters<typeof el>[1], x: number, y: number, w: number, h: number) {\n const [gw, gh] = [Math.max(w, 24), Math.max(h, 24)];\n return w < 24 || h < 24\n ? el(\n \"rect\",\n Object.assign({ \"data-maya\": \"hit\" }, d, {\n \"data-maya\": \"hit\",\n x: r(x - (gw - w) / 2),\n y: r(y - (gh - h) / 2),\n width: r(gw),\n height: r(gh),\n fill: \"transparent\",\n }),\n )\n : \"\";\n}\n","// US state hex cartogram. Importing this file registers the \"hexmap\" type.\nimport { register } from \"./core/registry.ts\";\nimport { el, key, r, esc } from \"./core/svg.ts\";\nimport type { Mark } from \"./core/types.ts\";\n\n// \"CODE Name col row\": odd-r offset grid (odd rows shift right half a hex), pointy-top.\nconst TABLE =\n \"AK Alaska 0 0|ME Maine 10 0|WI Wisconsin 5 1|VT Vermont 9 1|NH New Hampshire 10 1|\" +\n \"WA Washington 0 2|ID Idaho 1 2|MT Montana 2 2|ND North Dakota 3 2|MN Minnesota 4 2|IL Illinois 5 2|MI Michigan 6 2|NY New York 8 2|MA Massachusetts 9 2|\" +\n \"OR Oregon 0 3|NV Nevada 1 3|WY Wyoming 2 3|SD South Dakota 3 3|IA Iowa 4 3|IN Indiana 5 3|OH Ohio 6 3|PA Pennsylvania 7 3|NJ New Jersey 8 3|CT Connecticut 9 3|RI Rhode Island 10 3|\" +\n \"CA California 0 4|UT Utah 1 4|CO Colorado 2 4|NE Nebraska 3 4|MO Missouri 4 4|KY Kentucky 5 4|WV West Virginia 6 4|VA Virginia 7 4|MD Maryland 8 4|DE Delaware 9 4|\" +\n \"AZ Arizona 1 5|NM New Mexico 2 5|KS Kansas 3 5|AR Arkansas 4 5|TN Tennessee 5 5|NC North Carolina 6 5|SC South Carolina 7 5|DC District of Columbia 8 5|\" +\n \"OK Oklahoma 3 6|LA Louisiana 4 6|MS Mississippi 5 6|AL Alabama 6 6|GA Georgia 7 6|\" +\n \"HI Hawaii 0 7|TX Texas 3 7|FL Florida 7 7|PR Puerto Rico 8 8\";\n\nconst STATES = TABLE.split(\"|\").map((e) => {\n const m = /^(\\S+) (.+) (\\d+) (\\d+)$/.exec(e)!;\n return { code: m[1]!, name: m[2]!, c: +m[3]!, r: +m[4]! };\n});\nconst BY = new Map<string, (typeof STATES)[number]>();\nfor (const s of STATES) BY.set(s.code.toLowerCase(), s).set(s.name.toLowerCase(), s);\n\nconst find = (v: unknown) => BY.get(String(v).trim().toLowerCase());\n\n/** Closest code or name (a few edits away), else \"\". */\nconst near = (v: string): string => {\n const a = v.trim().toLowerCase();\n let best = \"\";\n let min = 4;\n for (const [k, s] of BY) {\n const n =\n Math.abs(a.length - k.length) +\n [...k].filter((ch) => !a.includes(ch)).length +\n [...a].filter((ch) => !k.includes(ch)).length;\n if (n < min) [min, best] = [n, k.length === 2 ? s.code : s.name];\n }\n return best;\n};\n\nconst R3 = Math.sqrt(3);\nconst COLS = Math.max(...STATES.map((s) => s.c)) + 1.5;\nconst ROWS = Math.max(...STATES.map((s) => s.r)) + 1;\n\nexport const hexmap: Mark = {\n noun: \"Hex map\",\n check(spec, fail) {\n spec.data.forEach((row, i) => {\n const v = (row as Record<string, unknown>)[spec.x as string];\n if (v == null || find(v)) return;\n const d = near(String(v));\n fail(\n \"unknown-state\",\n `data[${i}].${spec.x}`,\n `\"${v}\" is not a US state`,\n d && `Did you mean \"${d}\"?`,\n \"Use a two-letter code or full name (50 states, DC, PR).\",\n );\n });\n },\n draw(ctx) {\n const { spec, shaped, plot } = ctx;\n const s = Math.min(plot.w / (R3 * COLS), plot.h / (1.5 * (ROWS - 1) + 2));\n const ox = plot.x + (plot.w - R3 * s * COLS) / 2;\n const oy = plot.y + (plot.h - s * (1.5 * (ROWS - 1) + 2)) / 2;\n const k = s * 0.94;\n const at = (st: (typeof STATES)[number]) => [\n ox + R3 * s * (st.c + 0.5 + (st.r % 2) / 2),\n oy + s + 1.5 * s * st.r,\n ];\n const hex = (st: (typeof STATES)[number]) => {\n const [cx, cy] = at(st) as [number, number];\n return (\n \"M\" +\n [0, 1, 2, 3, 4, 5]\n .map((i) => {\n const a = (Math.PI / 3) * i - Math.PI / 6;\n return `${r(cx + k * Math.cos(a))} ${r(cy + k * Math.sin(a))}`;\n })\n .join(\"L\") +\n \"Z\"\n );\n };\n\n const sum = new Map<(typeof STATES)[number], number>();\n shaped.cells.forEach((c) => {\n const st = find(shaped.categories[c.ci]);\n if (st && c.value !== null) sum.set(st, (sum.get(st) ?? 0) + c.value);\n });\n const vals = [...sum.values()];\n const lo = Math.min(...vals);\n const hi = Math.max(...vals);\n\n let grid = \"\";\n for (const st of STATES) grid += el(\"path\", { d: hex(st), fill: \"none\" });\n let marks = \"\";\n let labels = \"\";\n let n = 0;\n for (const [st, v] of sum) {\n const [cx, cy] = at(st) as [number, number];\n const q = hi > lo ? Math.min(9, Math.floor(((v - lo) / (hi - lo)) * 10)) : 9;\n marks += el(\"path\", {\n \"data-maya\": \"mark\",\n \"data-key\": key(\"g\", st.code),\n \"data-c\": n++,\n \"data-s\": 0,\n \"data-x\": st.name,\n \"data-series\": \"\",\n \"data-f\": ctx.fmt(spec.y, v),\n \"data-y\": v,\n \"data-neg\": v < 0,\n \"data-tone\": ctx.tone(v),\n \"data-q\": q,\n d: hex(st),\n });\n // Drawn here (not ctx.label) so labels on the dark ramp steps can carry data-dark.\n labels += el(\n \"text\",\n {\n x: r(cx),\n y: r(cy),\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"middle\",\n \"data-in\": true,\n \"data-dark\": q >= 6,\n },\n esc(st.code),\n );\n }\n const legend =\n hi > lo\n ? `<div class=\"maya-legend\" data-maya=\"ramp\"><span>${esc(ctx.fmt(spec.y, lo))}</span><i></i><span>${esc(ctx.fmt(spec.y, hi))}</span></div>`\n : \"\";\n return { marks, hits: \"\", labels, grid, legend };\n },\n};\n\nregister(\"hexmap\", hexmap);\n\nexport {};\n"],"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,CAUA,IAAaC,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,EC1BPC,EAAS,02BAAM,MAAM,GAAG,CAAC,CAAC,IAAK,GAAM,CACzC,IAAMC,EAAI,2BAA2B,KAAK,CAAC,EAC3C,MAAO,CAAE,KAAMA,EAAE,GAAK,KAAMA,EAAE,GAAK,EAAG,CAACA,EAAE,GAAK,EAAG,CAACA,EAAE,EAAI,CAC1D,CAAC,EACKC,kBAAK,IAAI,IACf,IAAK,IAAMhB,KAAKc,EAAQE,EAAG,IAAIhB,EAAE,KAAK,YAAY,EAAGA,CAAC,CAAC,CAAC,IAAIA,EAAE,KAAK,YAAY,EAAGA,CAAC,EAEnF,IAAMiB,EAAQ,GAAeD,EAAG,IAAI,OAAOR,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,EAG5DU,EAAQ,GAAsB,CAClC,IAAMb,EAAIG,EAAE,KAAK,CAAC,CAAC,YAAY,EAC3BW,EAAO,GACPC,EAAM,EACV,IAAK,GAAM,CAACd,EAAGN,KAAMgB,EAAI,CACvB,IAAMb,EACJ,KAAK,IAAIE,EAAE,OAASC,EAAE,MAAM,EAC5B,CAAC,GAAGA,CAAC,CAAC,CAAC,OAAQ,GAAO,CAACD,EAAE,SAASgB,CAAE,CAAC,CAAC,CAAC,OACvC,CAAC,GAAGhB,CAAC,CAAC,CAAC,OAAQ,GAAO,CAACC,EAAE,SAASe,CAAE,CAAC,CAAC,CAAC,OACrClB,EAAIiB,IAAK,CAACA,EAAKD,GAAQ,CAAChB,EAAGG,EAAE,SAAW,EAAIN,EAAE,KAAOA,EAAE,IAAI,EACjE,CACA,OAAOmB,CACT,EAEMG,EAAK,KAAK,KAAK,CAAC,EAChBC,EAAO,KAAK,IAAI,GAAGT,EAAO,IAAK,GAAMd,EAAE,CAAC,CAAC,EAAI,IAC7CwB,EAAO,KAAK,IAAI,GAAGV,EAAO,IAAK,GAAMd,EAAE,CAAC,CAAC,EAAI,EAEtCyB,EAAe,CAC1B,KAAM,UACN,MAAM,EAAM,EAAM,CAChBC,EAAK,KAAK,SAAS,EAAK,IAAM,CAC5B,IAAMlB,EAAKmB,EAAgCD,EAAK,GAChD,GAAIlB,GAAK,MAAQS,EAAKT,CAAC,EAAG,OAC1B,IAAMoB,EAAIV,EAAK,OAAOV,CAAC,CAAC,EACxBqB,EACE,gBACA,QAAQC,EAAE,IAAIJ,EAAK,IACnB,IAAIlB,EAAE,qBACNoB,GAAK,iBAAiBA,EAAE,IACxB,yDACF,CACF,CAAC,CACH,EACA,KAAK,EAAK,CACR,GAAM,CAAE,OAAM,SAAQ,QAASG,EACzB/B,EAAI,KAAK,IAAIgC,EAAK,GAAKV,EAAKC,GAAOS,EAAK,GAAK,KAAOR,EAAO,GAAK,EAAE,EAClES,EAAKD,EAAK,GAAKA,EAAK,EAAIV,EAAKtB,EAAIuB,GAAQ,EACzCW,EAAKF,EAAK,GAAKA,EAAK,EAAIhC,GAAK,KAAOwB,EAAO,GAAK,IAAM,EACtDlB,EAAIN,EAAI,IACRmC,EAAM,GAAgC,CAC1CF,EAAKX,EAAKtB,GAAKoC,EAAG,EAAI,GAAOA,EAAG,EAAI,EAAK,GACzCF,EAAKlC,EAAI,IAAMA,EAAIoC,EAAG,CACxB,EACMC,EAAO,GAAgC,CAC3C,GAAM,CAACC,EAAIC,GAAMJ,EAAGC,CAAE,EACtB,MACE,IACA,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,CAAC,CACf,IAAK,GAAM,CACV,IAAM/B,EAAK,KAAK,GAAK,EAAKyB,EAAI,KAAK,GAAK,EACxC,MAAO,GAAG5B,EAAEoC,EAAKhC,EAAI,KAAK,IAAID,CAAC,CAAC,EAAE,GAAGH,EAAEqC,EAAKjC,EAAI,KAAK,IAAID,CAAC,CAAC,GAC7D,CAAC,CAAC,CACD,KAAK,GAAG,EACX,GAEJ,EAEMmC,kBAAM,IAAI,IAChBC,EAAO,MAAM,QAAS,GAAM,CAC1B,IAAML,EAAKnB,EAAKwB,EAAO,WAAWxC,EAAE,GAAG,EACnCmC,GAAMnC,EAAE,QAAU,MAAMuC,EAAI,IAAIJ,GAAKI,EAAI,IAAIJ,CAAE,GAAK,GAAKnC,EAAE,KAAK,CACtE,CAAC,EACD,IAAMyC,EAAO,CAAC,GAAGF,EAAI,OAAO,CAAC,EACvBG,EAAK,KAAK,IAAI,GAAGD,CAAI,EACrBE,EAAK,KAAK,IAAI,GAAGF,CAAI,EAEvBG,EAAO,GACX,IAAK,IAAMT,KAAMtB,EAAQ,GAAQV,EAAG,OAAQ,CAAE,EAAGiC,EAAID,CAAE,EAAG,KAAM,MAAO,CAAC,EACxE,IAAIU,EAAQ,GACRC,EAAS,GACT5C,EAAI,EACR,IAAK,GAAM,CAACiC,EAAI5B,KAAMgC,EAAK,CACzB,GAAM,CAACF,EAAIC,GAAMJ,EAAGC,CAAE,EAChBY,EAAIJ,EAAKD,EAAK,KAAK,IAAI,EAAG,KAAK,OAAQnC,EAAImC,IAAOC,EAAKD,GAAO,EAAE,CAAC,EAAI,EAC3E,GAASvC,EAAG,OAAQ,CAClB,YAAa,OACb,WAAYO,EAAI,IAAKyB,EAAG,IAAI,EAC5B,SAAU,IACV,SAAU,EACV,SAAUA,EAAG,KACb,cAAe,GACf,SAAUL,EAAI,IAAIL,EAAK,EAAGlB,CAAC,EAC3B,SAAUA,EACV,WAAYA,EAAI,EAChB,YAAauB,EAAI,KAAKvB,CAAC,EACvB,SAAUwC,EACV,EAAGX,EAAID,CAAE,CACX,CAAC,EAED,GAAUhC,EACR,OACA,CACE,EAAGF,EAAEoC,CAAE,EACP,EAAGpC,EAAEqC,CAAE,EACP,cAAe,SACf,oBAAqB,SACrB,UAAW,GACX,YAAaS,GAAK,CACpB,EACAjD,EAAIqC,EAAG,IAAI,CACb,CACF,CACA,IAAMa,EACJL,EAAKD,EACD,mDAAmD5C,EAAIgC,EAAI,IAAIL,EAAK,EAAGiB,CAAE,CAAC,EAAE,sBAAsB5C,EAAIgC,EAAI,IAAIL,EAAK,EAAGkB,CAAE,CAAC,EAAE,eAC3H,GACN,MAAO,CAAE,QAAO,KAAM,GAAI,SAAQ,OAAM,QAAO,CACjD,CACF,EAEAjD,EAAS,SAAU8B,CAAM"}
|
package/dist/hierarchy.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
/*! mayacharts v0.
|
|
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={"&":`&`,"<":`<`,">":`>`,'"':`"`,"'":`'`};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=(...e)=>e.map(e=>encodeURIComponent(String(e).replace(/\p{Cs}/gu,`�`)).replace(/~/g,`%7E`)).join(`~`);function c(e,t,n,r,i){let[s,c]=[Math.max(r,24),Math.max(i,24)];return r<24||i<24?o(`rect`,Object.assign({"data-maya":`hit`},e,{"data-maya":`hit`,x:a(t-(s-r)/2),y:a(n-(c-i)/2),width:a(s),height:a(c),fill:`transparent`})):``}function l(e,t,n,r,i=null){let a=()=>({kids:/* @__PURE__ */ new Map,ys:[],cs:[]}),o=a();for(let r of e){let e=r[n];if(typeof e!=`number`)continue;let s=o;for(let e of t){let t=String(r[e]);s=s.kids.get(t)??s.kids.set(t,a()).get(t)}s.ys.push(e);let c=i===null?null:r[i];typeof c==`number`&&s.cs.push(c)}let s=(e,t,n,i)=>{let a=[...e.kids].map(([e,t])=>s(t,e,n+1,[...i,e]));return{name:t,children:a,depth:n,parts:i,cv:e.cs.length?r(e.cs):null,value:a.length?a.reduce((e,t)=>e+t.value,0):r(e.ys)??0}};return s(o,``,0,[])}function u(e,t,n,r,i){let a=[],o=e.filter(e=>e.value>0).sort((e,t)=>t.value-e.value),s=o.reduce((e,t)=>e+t.value,0),c=0;for(;c<o.length;){let e=Math.min(r,i),l=r*i/s,u=(t,n,r)=>Math.max(e*e*r/(t*t),t*t/(e*e*n)),d=c,f=0,p=1/0;for(;d<o.length;d++){let e=o[d].value*l,t=f+e,n=u(t,e,o[c].value*l);if(d>c&&n>p)break;p=n,f=t}let m=o.slice(c,d),h=e?f/e:0,g=0;for(let o of m){let s=f?o.value*l*e/f:0;a.push(r>=i?[o,t,n+g,h,s]:[o,t+g,n,s,h]),g+=s}r>=i?(t+=h,r-=h):(n+=h,i-=h),s-=m.reduce((e,t)=>e+t.value,0),c=d}return a}function d(e){let{spec:t}=e;t.data.forEach((n,r)=>{let i=n[t.y];typeof i==`number`&&!(i>0)&&e.fail(`non-positive-value`,`data[${r}].${t.y}`,`Value ${i} is not positive.`,`Treemaps and sunbursts size shapes by value, so every value must be above zero.`,`To show negative values use a bar chart with colorBy: "sign".`)});let n=typeof t.colorBy==`string`&&t.colorBy!==`sign`?t.colorBy:null,r=l(t.data,t.path,t.y,e.agg(t.aggregate),n)
|
|
1
|
+
/*! mayacharts v0.3.0 | MIT | https://github.com/BbekShr/mayacharts */
|
|
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={"&":`&`,"<":`<`,">":`>`,'"':`"`,"'":`'`};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=(...e)=>e.map(e=>encodeURIComponent(String(e).replace(/\p{Cs}/gu,`�`)).replace(/~/g,`%7E`)).join(`~`);function c(e,t,n,r,i){let[s,c]=[Math.max(r,24),Math.max(i,24)];return r<24||i<24?o(`rect`,Object.assign({"data-maya":`hit`},e,{"data-maya":`hit`,x:a(t-(s-r)/2),y:a(n-(c-i)/2),width:a(s),height:a(c),fill:`transparent`})):``}function l(e,t,n,r,i=null){let a=()=>({kids:/* @__PURE__ */ new Map,ys:[],cs:[]}),o=a();for(let r of e){let e=r[n];if(typeof e!=`number`)continue;let s=o;for(let e of t){let t=String(r[e]);s=s.kids.get(t)??s.kids.set(t,a()).get(t)}s.ys.push(e);let c=i===null?null:r[i];typeof c==`number`&&s.cs.push(c)}let s=(e,t,n,i)=>{let a=[...e.kids].map(([e,t])=>s(t,e,n+1,[...i,e]));return{name:t,children:a,depth:n,parts:i,cv:e.cs.length?r(e.cs):null,value:a.length?a.reduce((e,t)=>e+t.value,0):r(e.ys)??0}};return s(o,``,0,[])}function u(e,t,n,r,i){let a=[],o=e.filter(e=>e.value>0).sort((e,t)=>t.value-e.value),s=o.reduce((e,t)=>e+t.value,0),c=0;for(;c<o.length;){let e=Math.min(r,i),l=r*i/s,u=(t,n,r)=>Math.max(e*e*r/(t*t),t*t/(e*e*n)),d=c,f=0,p=1/0;for(;d<o.length;d++){let e=o[d].value*l,t=f+e,n=u(t,e,o[c].value*l);if(d>c&&n>p)break;p=n,f=t}let m=o.slice(c,d),h=e?f/e:0,g=0;for(let o of m){let s=f?o.value*l*e/f:0;a.push(r>=i?[o,t,n+g,h,s]:[o,t+g,n,s,h]),g+=s}r>=i?(t+=h,r-=h):(n+=h,i-=h),s-=m.reduce((e,t)=>e+t.value,0),c=d}return a}function d(e){let{spec:t}=e;t.data.forEach((n,r)=>{let i=n[t.y];typeof i==`number`&&!(i>0)&&e.fail(`non-positive-value`,`data[${r}].${t.y}`,`Value ${i} is not positive.`,`Treemaps and sunbursts size shapes by value, so every value must be above zero.`,`To show negative values use a bar chart with colorBy: "sign".`)});let n=typeof t.colorBy==`string`&&t.colorBy!==`sign`?t.colorBy:null,r=l(t.data,t.path,t.y,e.agg(t.aggregate),n);if(t.drill)for(let e of r.children)e.children=[];let i=0,a=r.children;return{root:r,tops:a,attrs:n=>{let r=[...t.drilled,...n.parts],o=a.findIndex(e=>e.name===n.parts[0]);return{"data-maya":`mark`,"data-key":s(`h`,...r),"data-c":i++,"data-s":o%8,"data-x":r.join(` › `),"data-series":``,"data-y":n.value,"data-f":e.fmt(t.y,n.value),"data-tone":e.tone(n.value),"data-q":n.cv===null?null:e.q(n.cv),"data-depth":n.depth}}}}var f=e=>e.length*7.2+4,p={noun:`Treemap`,draw(e){let{plot:t,spec:n}=e,{root:r,attrs:i}=d(e),s=``,l=``,p=(t,r,d,m,h)=>{let g=t.depth>1?.5:0,[_,v,y,b]=[r+g,d+g,Math.max(0,m-2*g),Math.max(0,h-2*g)];if(!t.children.length){if(y*b<4)return;let r=i(t);s+=o(`rect`,{...r,x:a(_),y:a(v),width:a(y),height:a(b)}),l+=c({...r,"data-depth":null},_,v,y,b);let[u,d,p,m]=[_+y/2,v+b/2,r[`data-f`],`${t.name} · ${r[`data-f`]}`];if(!n.labels||b<16)return;b>=34&&f(t.name)<=y&&f(p)<=y?e.label(u,d-8,t.name,`center`)&&e.label(u,d+8,p,`center`):f(m)<=y?e.label(u,d,m,`center`):f(p)<=y&&e.label(u,d,p,`center`);return}t.depth===1&&f(t.name)<=y&&b>=30&&e.label(_+y/2,v+9,t.name,`center`);for(let[e,n,r,i,a]of u(t.children,_,v,y,b))p(e,n,r,i,a)};return p(r,t.x,t.y,t.w,t.h),{marks:s,hits:l}}},m=Math.PI*2;n(`treemap`,p),n(`sunburst`,{noun:`Sunburst`,draw(e){let{plot:t,spec:n}=e,{root:r,attrs:i}=d(e),s=n.drill?1:n.path.length,c=Math.min(t.w,t.h)/2,[l,u]=[t.x+t.w/2,t.y+t.h/2],p=(e,t)=>`${a(l+e*Math.cos(t-Math.PI/2))} ${a(u+e*Math.sin(t-Math.PI/2))}`,h=``,g=(t,r,l)=>{if(t.depth){let[u,d]=[t.depth*c/(s+1),(t.depth+1)*c/(s+1)];if((l-r)*d<2)return;let g=Math.min(l,r+m*359.99/360),_=+(g-r>Math.PI),v=`M${p(d,r)}A${a(d)} ${a(d)} 0 ${_} 1 ${p(d,g)}L${p(u,g)}A${a(u)} ${a(u)} 0 ${_} 0 ${p(u,r)}Z`;h+=o(`path`,{...i(t),d:v});let[y,b,x]=[(r+g)/2,(u+d)/2,(g-r)*((u+d)/2)],S=Math.abs(Math.sin(y))*(d-u)+Math.abs(Math.cos(y))*x;if(n.labels&&x>=14&&f(t.name)<=S){let[n,r]=p(b,y).split(` `);e.label(+n,+r,t.name,`center`)}}let u=r;for(let e of t.children){let n=(l-r)*e.value/t.value;g(e,u,u+n),u+=n}};return g(r,0,m),{marks:h,hits:``}}});var h=e=>e>0&&e<.005?`<1%`:`${Math.round(e*100)}%`,g={noun:`Marimekko`,draw(e){let{plot:t,spec:n,shaped:r}=e,{categories:i,series:l,cells:u}=r,d=/* @__PURE__ */ new Map,f=i.map(()=>0);for(let e of u){let t=Math.max(0,e.value??0);d.set(`${e.ci}/${e.si}`,t),f[e.ci]=(f[e.ci]??0)+t}let p=f.reduce((e,t)=>e+t,0);if(!p)return{marks:``,hits:``};let[m,g]=[t.y+2,t.y+t.h-20],_=t.w-4*(i.length-1),v=``,y=``,b=t.x;return i.forEach((i,u)=>{let x=f[u]??0,S=_*x/p,C=g;for(let t of r.visible){let r=d.get(`${u}/${t}`);if(!r)continue;let f=(g-m)*r/x,p=e.fmt(n.y,r),_={"data-maya":`mark`,"data-key":s(l[t],i),"data-c":u,"data-s":t%8,"data-x":i,"data-series":l[t],"data-y":r,"data-f":`${p} (${h(r/x)})`};if(C-=f,v+=o(`rect`,{..._,x:a(b),y:a(C),width:a(S),height:a(f)}),y+=c(_,b,C,S,f),n.labels&&f>=16){let t=h(r/x);e.label(b+S/2,C+f/2,`${p} (${t})`.length*7.2+4<=S?`${p} (${t})`:t,`center`)}}S>0&&e.label(b+S/2,t.y+t.h-20,i,`below`),b+=S+4}),{marks:v,hits:y}}},_={noun:`Waffle`,draw(e){let{plot:t,spec:n,shaped:r}=e,c=r.categories.map(()=>0);for(let e of r.cells)c[e.ci]=(c[e.ci]??0)+Math.max(0,e.value??0);let l=c.reduce((e,t)=>e+t,0);if(!l)return{marks:``,hits:``};let u=c.map(e=>Math.floor(e/l*100)),d=100-u.reduce((e,t)=>e+t,0);c.map((e,t)=>[e/l*100%1,t]).sort((e,t)=>t[0]-e[0]||e[1]-t[1]).slice(0,d).forEach(([,e])=>u[e]=(u[e]??0)+1);let f=Math.min(t.w,t.h)/10,[p,m]=[t.x+(t.w-f*10)/2,t.y+(t.h-f*10)/2],g=Math.min(3,f*.12),_=``,v=``,y=0;r.categories.forEach((t,r)=>{let i=c[r]??0;for(let c=0;c<(u[r]??0);c++,y++){let[u,d]=[p+y%10*f,m+Math.floor(y/10)*f],b={"data-maya":`mark`,"data-key":s(`w`,t,c),"data-c":y,"data-s":r%8,"data-x":t,"data-series":``,"data-y":i,"data-f":`${e.fmt(n.y,i)} (${h(i/l)})`};_+=o(`rect`,{...b,x:a(u+g/2),y:a(d+g/2),width:a(f-g),height:a(f-g)}),v+=o(`rect`,{...b,"data-maya":`hit`,x:a(u),y:a(d),width:a(f),height:a(f),fill:`transparent`})}});let b=`<div class="maya-legend" data-maya="legend">`+r.categories.map((e,t)=>`<span data-s="${t%8}"><i></i>${i(e)} ${h((c[t]??0)/l)}</span>`).join(``)+`</div>`;return{marks:_,hits:v,legend:b}}};n(`marimekko`,g),n(`waffle`,_);export{g as marimekko,l as tree,_ as waffle};
|
|
3
3
|
//# sourceMappingURL=hierarchy.js.map
|
package/dist/hierarchy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hierarchy.js","names":["KEY","MODULES","register","type","mark","ESC","esc","s","c","r","n","el","a","k","attrs","v","children","tag","key","parts","p","hit","gw","gh","w","h","d","x","y","tree","mk","top","row","rows","f","path","cb","build","raw","depth","agg","squarify","out","items","nodes","b","rest","i","side","scale","worst","mx","mn","j","sum","best","wst","thick","len","setup","ctx","spec","root","tops","t","text","treemap","marks","hits","walk","bx","by","bw","bh","lx","ly","one","cx","cy","cw","ch","plot","TAU","D","R","pt","rad","r0","r1","e","a1","a0","big","span","pct","marimekko","shaped","val","tot","categories","cells","grand","bot","free","ci","si","series","name","share","waffle","vals","left","step","ox","oy","legend"],"sources":["../src/core/registry.ts","../src/core/svg.ts","../src/hierarchy.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 \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n};\n\nexport function esc(s: string | number): string {\n return String(s).replace(/[&<>\"']/g, (c) => ESC[c]!);\n}\n\nexport function r(n: number): number {\n return Math.round(n * 100) / 100;\n}\n\nexport function el(\n tag: string,\n attrs: Record<string, string | number | boolean | null | undefined>,\n children?: string,\n): string {\n let a = \"\";\n for (const k in attrs) {\n const v = attrs[k];\n if (v == null || v === false) continue;\n a += v === true ? ` ${k}=\"\"` : ` ${k}=\"${esc(v)}\"`;\n }\n return children === undefined ? `<${tag}${a}/>` : `<${tag}${a}>${children}</${tag}>`;\n}\n\n/** Sentinel category for `limit`'s rolled-up rest. Cannot collide with real data text. */\nexport const OTHER = \"\\u0000other\";\n\n/**\n * Mark identity: each part `encodeURIComponent`ed (lone surrogates replaced, `~` -> %7E),\n * joined by `~`. Grammar: band `S~C`; line/area `l~S`/`a~S`; scatter `S~name` (or index);\n * hierarchy `h~p0~p1…`; sankey node `n~depth~name`, link `k~depth~src~dst`; hexmap `g~CODE`.\n */\nexport const key = (...parts: unknown[]): string =>\n parts\n .map((p) => encodeURIComponent(String(p).replace(/\\p{Cs}/gu, \"�\")).replace(/~/g, \"%7E\"))\n .join(\"~\");\n\n/** Invisible target grown to >= 24 px around a small rect mark; \"\" when it is big enough. */\nexport function hit(d: Parameters<typeof el>[1], x: number, y: number, w: number, h: number) {\n const [gw, gh] = [Math.max(w, 24), Math.max(h, 24)];\n return w < 24 || h < 24\n ? el(\n \"rect\",\n Object.assign({ \"data-maya\": \"hit\" }, d, {\n \"data-maya\": \"hit\",\n x: r(x - (gw - w) / 2),\n y: r(y - (gh - h) / 2),\n width: r(gw),\n height: r(gh),\n fill: \"transparent\",\n }),\n )\n : \"\";\n}\n","// treemap + sunburst. Importing this file registers both types.\nimport { register } from \"./core/registry.ts\";\nimport { el, esc, hit, key, r } from \"./core/svg.ts\";\nimport type { Aggregate, Mark, MarkCtx, MarkOut, Row } from \"./core/types.ts\";\n\ninterface Node {\n name: string;\n value: number;\n children: Node[];\n depth: number;\n /** Names from the first path level down to this node. */\n parts: string[];\n /** colorBy field value (leaves only). */\n cv: number | null;\n}\n\ntype Reduce = ReturnType<MarkCtx[\"agg\"]>;\n\n/** Rows -> nested tree in first-appearance order. Map-keyed, so any name is safe. */\nexport function tree(\n rows: readonly Row[],\n path: readonly string[],\n y: string,\n agg: Reduce,\n cb: string | null = null,\n): Node {\n type Raw = { kids: Map<string, Raw>; ys: number[]; cs: number[] };\n const mk = (): Raw => ({ kids: new Map(), ys: [], cs: [] });\n const top = mk();\n for (const row of rows) {\n const v = row[y];\n if (typeof v !== \"number\") continue;\n let n = top;\n for (const f of path) {\n const k = String(row[f]);\n n = n.kids.get(k) ?? n.kids.set(k, mk()).get(k)!;\n }\n n.ys.push(v);\n const c = cb === null ? null : row[cb];\n if (typeof c === \"number\") n.cs.push(c);\n }\n const build = (raw: Raw, name: string, depth: number, parts: string[]): Node => {\n const children = [...raw.kids].map(([k, c]) => build(c, k, depth + 1, [...parts, k]));\n return {\n name,\n children,\n depth,\n parts,\n cv: raw.cs.length ? agg(raw.cs) : null,\n value: children.length ? children.reduce((s, c) => s + c.value, 0) : (agg(raw.ys) ?? 0),\n };\n };\n return build(top, \"\", 0, []);\n}\n\n/** Bruls squarify: [node, x, y, w, h] for `nodes` filling the box. */\nfunction squarify(nodes: Node[], x: number, y: number, w: number, h: number) {\n const out: [Node, number, number, number, number][] = [];\n const items = nodes.filter((n) => n.value > 0).sort((a, b) => b.value - a.value);\n let rest = items.reduce((s, n) => s + n.value, 0);\n let i = 0;\n while (i < items.length) {\n const side = Math.min(w, h);\n const scale = (w * h) / rest;\n const worst = (a: number, mn: number, mx: number) =>\n Math.max((side * side * mx) / (a * a), (a * a) / (side * side * mn));\n let j = i;\n let sum = 0;\n let best = Infinity;\n for (; j < items.length; j++) {\n const v = items[j]!.value * scale;\n const s = sum + v;\n const wst = worst(s, v, items[i]!.value * scale);\n if (j > i && wst > best) break;\n best = wst;\n sum = s;\n }\n const row = items.slice(i, j);\n const thick = side ? sum / side : 0;\n let p = 0;\n for (const n of row) {\n const len = sum ? (n.value * scale * side) / sum : 0;\n out.push(w >= h ? [n, x, y + p, thick, len] : [n, x + p, y, len, thick]);\n p += len;\n }\n if (w >= h) ((x += thick), (w -= thick));\n else ((y += thick), (h -= thick));\n rest -= row.reduce((s, n) => s + n.value, 0);\n i = j;\n }\n return out;\n}\n\n/** Validate values, build the tree, and compute attributes shared by both marks. */\nfunction setup(ctx: MarkCtx) {\n const { spec } = ctx;\n spec.data.forEach((row, i) => {\n const v = row[spec.y];\n if (typeof v === \"number\" && !(v > 0))\n ctx.fail(\n \"non-positive-value\",\n `data[${i}].${spec.y}`,\n `Value ${v} is not positive.`,\n \"Treemaps and sunbursts size shapes by value, so every value must be above zero.\",\n 'To show negative values use a bar chart with colorBy: \"sign\".',\n );\n });\n const cb = typeof spec.colorBy === \"string\" && spec.colorBy !== \"sign\" ? spec.colorBy : null;\n const root = tree(spec.data, spec.path, spec.y, ctx.agg(spec.aggregate as Aggregate), cb);\n let c = 0;\n const tops = root.children;\n const attrs = (n: Node) => {\n const parts = [...spec.drilled, ...n.parts];\n const s = tops.findIndex((t) => t.name === n.parts[0]);\n return {\n \"data-maya\": \"mark\",\n \"data-key\": key(\"h\", ...parts),\n \"data-c\": c++,\n \"data-s\": s % 8,\n \"data-x\": parts.join(\" › \"),\n \"data-series\": \"\",\n \"data-y\": n.value,\n \"data-f\": ctx.fmt(spec.y, n.value),\n \"data-tone\": ctx.tone(n.value),\n \"data-q\": n.cv === null ? null : ctx.q(n.cv),\n \"data-depth\": n.depth,\n };\n };\n return { root, tops, attrs };\n}\n\nconst text = (s: string) => s.length * 7.2 + 4;\n\nconst treemap: Mark = {\n noun: \"Treemap\",\n draw(ctx): MarkOut {\n const { plot, spec } = ctx;\n const { root, attrs } = setup(ctx);\n let marks = \"\";\n let hits = \"\";\n const walk = (n: Node, x: number, y: number, w: number, h: number): void => {\n // 0.5 px inset below the top level: siblings sit 1 px apart (stroke adds more).\n const g = n.depth > 1 ? 0.5 : 0;\n const [bx, by, bw, bh] = [x + g, y + g, Math.max(0, w - 2 * g), Math.max(0, h - 2 * g)];\n if (!n.children.length) {\n const a = attrs(n);\n marks += el(\"rect\", { ...a, x: r(bx), y: r(by), width: r(bw), height: r(bh) });\n hits += hit(a, bx, by, bw, bh);\n // Name over value when both fit, else \"name · value\" on one line, else the value.\n const [lx, ly, f, one] = [\n bx + bw / 2,\n by + bh / 2,\n a[\"data-f\"],\n `${n.name} · ${a[\"data-f\"]}`,\n ];\n if (!spec.labels || bh < 16) return;\n if (bh >= 34 && text(n.name) <= bw && text(f) <= bw)\n ctx.label(lx, ly - 8, n.name, \"center\") && ctx.label(lx, ly + 8, f, \"center\");\n else if (text(one) <= bw) ctx.label(lx, ly, one, \"center\");\n else if (text(f) <= bw) ctx.label(lx, ly, f, \"center\");\n return;\n }\n if (n.depth === 1 && text(n.name) <= bw && bh >= 30)\n ctx.label(bx + bw / 2, by + 9, n.name, \"center\");\n for (const [c, cx, cy, cw, ch] of squarify(n.children, bx, by, bw, bh))\n walk(c, cx, cy, cw, ch);\n };\n walk(root, plot.x, plot.y, plot.w, plot.h);\n return { marks, hits };\n },\n};\n\nconst TAU = Math.PI * 2;\n\nconst sunburst: Mark = {\n noun: \"Sunburst\",\n draw(ctx): MarkOut {\n const { plot, spec } = ctx;\n const { root, attrs } = setup(ctx);\n const D = spec.path.length;\n const R = Math.min(plot.w, plot.h) / 2;\n const [cx, cy] = [plot.x + plot.w / 2, plot.y + plot.h / 2];\n const pt = (rad: number, a: number) =>\n `${r(cx + rad * Math.cos(a - Math.PI / 2))} ${r(cy + rad * Math.sin(a - Math.PI / 2))}`;\n let marks = \"\";\n const walk = (n: Node, a0: number, a1: number): void => {\n if (n.depth) {\n const [r0, r1] = [(n.depth * R) / (D + 1), ((n.depth + 1) * R) / (D + 1)];\n const e = Math.min(a1, a0 + (TAU * 359.99) / 360);\n const big = e - a0 > Math.PI ? 1 : 0;\n const d =\n `M${pt(r1, a0)}A${r(r1)} ${r(r1)} 0 ${big} 1 ${pt(r1, e)}` +\n `L${pt(r0, e)}A${r(r0)} ${r(r0)} 0 ${big} 0 ${pt(r0, a0)}Z`;\n marks += el(\"path\", { ...attrs(n), d });\n }\n let a = a0;\n for (const c of n.children) {\n const span = ((a1 - a0) * c.value) / n.value;\n walk(c, a, a + span);\n a += span;\n }\n };\n walk(root, 0, TAU);\n return { marks, hits: \"\" };\n },\n};\n\nregister(\"treemap\", treemap);\nregister(\"sunburst\", sunburst);\n\nconst pct = (p: number) => (p > 0 && p < 0.005 ? \"<1%\" : `${Math.round(p * 100)}%`);\n\n/** Column width ~ column total; segments are shares of the column total (visible series only). */\nexport const marimekko: Mark = {\n noun: \"Marimekko\",\n draw(ctx): MarkOut {\n const { plot, spec, shaped } = ctx;\n const { categories, series, cells } = shaped;\n // ponytail: negative and null values count as 0, a stack of shares cannot show them.\n const val = new Map<string, number>();\n const tot = categories.map(() => 0);\n for (const c of cells) {\n const v = Math.max(0, c.value ?? 0);\n val.set(`${c.ci}/${c.si}`, v);\n tot[c.ci] = (tot[c.ci] ?? 0) + v;\n }\n const grand = tot.reduce((a, b) => a + b, 0);\n if (!grand) return { marks: \"\", hits: \"\" };\n const gap = 4;\n const [top, bot] = [plot.y + 2, plot.y + plot.h - 20];\n const free = plot.w - gap * (categories.length - 1);\n let marks = \"\";\n let hits = \"\";\n let x = plot.x;\n categories.forEach((name, ci) => {\n const t = tot[ci] ?? 0;\n const w = (free * t) / grand;\n let y = bot;\n for (const si of shaped.visible) {\n const v = val.get(`${ci}/${si}`);\n if (!v) continue;\n const h = ((bot - top) * v) / t;\n const f = ctx.fmt(spec.y, v);\n const a = {\n \"data-maya\": \"mark\",\n \"data-key\": key(series[si], name),\n \"data-c\": ci,\n \"data-s\": si % 8,\n \"data-x\": name,\n \"data-series\": series[si],\n \"data-y\": v,\n \"data-f\": `${f} (${pct(v / t)})`,\n };\n y -= h;\n marks += el(\"rect\", { ...a, x: r(x), y: r(y), width: r(w), height: r(h) });\n hits += hit(a, x, y, w, h);\n if (spec.labels && h >= 16) {\n const share = pct(v / t);\n ctx.label(\n x + w / 2,\n y + h / 2,\n `${f} (${share})`.length * 7.2 + 4 <= w ? `${f} (${share})` : share,\n \"center\",\n );\n }\n }\n if (w > 0) ctx.label(x + w / 2, plot.y + plot.h - 20, name, \"below\");\n x += w + gap;\n });\n return { marks, hits };\n },\n};\n\n/** 10x10 cells split between the x categories by largest remainder. */\nexport const waffle: Mark = {\n noun: \"Waffle\",\n draw(ctx): MarkOut {\n const { plot, spec, shaped } = ctx;\n const vals = shaped.categories.map(() => 0);\n for (const c of shaped.cells) vals[c.ci] = (vals[c.ci] ?? 0) + Math.max(0, c.value ?? 0);\n const sum = vals.reduce((a, b) => a + b, 0);\n if (!sum) return { marks: \"\", hits: \"\" };\n const n = vals.map((v) => Math.floor((v / sum) * 100));\n const left = 100 - n.reduce((a, b) => a + b, 0);\n vals\n .map((v, i) => [((v / sum) * 100) % 1, i] as const)\n .sort((a, b) => b[0] - a[0] || a[1] - b[1])\n .slice(0, left)\n .forEach(([, i]) => (n[i] = (n[i] ?? 0) + 1));\n const step = Math.min(plot.w, plot.h) / 10;\n const [ox, oy] = [plot.x + (plot.w - step * 10) / 2, plot.y + (plot.h - step * 10) / 2];\n const g = Math.min(3, step * 0.12);\n let marks = \"\";\n let hits = \"\";\n let i = 0;\n shaped.categories.forEach((name, ci) => {\n const v = vals[ci] ?? 0;\n for (let k = 0; k < (n[ci] ?? 0); k++, i++) {\n const [cx, cy] = [ox + (i % 10) * step, oy + Math.floor(i / 10) * step];\n const a = {\n \"data-maya\": \"mark\",\n \"data-key\": key(\"w\", name, k),\n \"data-c\": i,\n \"data-s\": ci % 8,\n \"data-x\": name,\n \"data-series\": \"\",\n \"data-y\": v,\n \"data-f\": `${ctx.fmt(spec.y, v)} (${pct(v / sum)})`,\n };\n marks += el(\"rect\", {\n ...a,\n x: r(cx + g / 2),\n y: r(cy + g / 2),\n width: r(step - g),\n height: r(step - g),\n });\n // The hit covers the whole grid step so the gaps between cells still hit.\n hits += el(\"rect\", {\n ...a,\n \"data-maya\": \"hit\",\n x: r(cx),\n y: r(cy),\n width: r(step),\n height: r(step),\n fill: \"transparent\",\n });\n }\n });\n const legend =\n `<div class=\"maya-legend\" data-maya=\"legend\">` +\n shaped.categories\n .map(\n (name, ci) =>\n `<span data-s=\"${ci % 8}\"><i></i>${esc(name)} ${pct((vals[ci] ?? 0) / sum)}</span>`,\n )\n .join(\"\") +\n `</div>`;\n return { marks, hits, legend };\n },\n};\nregister(\"marimekko\", marimekko);\nregister(\"waffle\", waffle);\n\nexport {};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hierarchy.js","names":["KEY","MODULES","register","type","mark","ESC","esc","s","c","r","n","el","a","k","attrs","v","children","tag","key","parts","p","hit","gw","gh","w","h","d","x","y","tree","mk","top","row","rows","f","path","cb","build","raw","depth","agg","squarify","out","items","nodes","b","rest","i","side","scale","worst","mx","mn","j","sum","best","wst","thick","len","setup","ctx","spec","root","tops","t","text","treemap","marks","hits","walk","bx","by","bw","bh","lx","ly","one","cx","cy","cw","ch","plot","TAU","D","R","pt","rad","r0","r1","a1","a0","e","big","mid","rm","arc","room","span","pct","marimekko","shaped","val","tot","categories","cells","grand","bot","free","ci","si","series","name","share","waffle","vals","left","step","ox","oy","legend"],"sources":["../src/core/registry.ts","../src/core/svg.ts","../src/hierarchy.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 \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n};\n\nexport function esc(s: string | number): string {\n return String(s).replace(/[&<>\"']/g, (c) => ESC[c]!);\n}\n\nexport function r(n: number): number {\n return Math.round(n * 100) / 100;\n}\n\nexport function el(\n tag: string,\n attrs: Record<string, string | number | boolean | null | undefined>,\n children?: string,\n): string {\n let a = \"\";\n for (const k in attrs) {\n const v = attrs[k];\n if (v == null || v === false) continue;\n a += v === true ? ` ${k}=\"\"` : ` ${k}=\"${esc(v)}\"`;\n }\n return children === undefined ? `<${tag}${a}/>` : `<${tag}${a}>${children}</${tag}>`;\n}\n\n/** Sentinel category for `limit`'s rolled-up rest. Cannot collide with real data text. */\nexport const OTHER = \"\\u0000other\";\n\n/**\n * Mark identity: each part `encodeURIComponent`ed (lone surrogates replaced, `~` -> %7E),\n * joined by `~`. Grammar: band `S~C`; line/area `l~S`/`a~S`; scatter `S~name` (or index);\n * hierarchy `h~p0~p1…`; sankey node `n~depth~name`, link `k~depth~src~dst`; hexmap `g~CODE`.\n */\nexport const key = (...parts: unknown[]): string =>\n parts\n .map((p) => encodeURIComponent(String(p).replace(/\\p{Cs}/gu, \"�\")).replace(/~/g, \"%7E\"))\n .join(\"~\");\n\n/** Invisible target grown to >= 24 px around a small rect mark; \"\" when it is big enough. */\nexport function hit(d: Parameters<typeof el>[1], x: number, y: number, w: number, h: number) {\n const [gw, gh] = [Math.max(w, 24), Math.max(h, 24)];\n return w < 24 || h < 24\n ? el(\n \"rect\",\n Object.assign({ \"data-maya\": \"hit\" }, d, {\n \"data-maya\": \"hit\",\n x: r(x - (gw - w) / 2),\n y: r(y - (gh - h) / 2),\n width: r(gw),\n height: r(gh),\n fill: \"transparent\",\n }),\n )\n : \"\";\n}\n","// treemap + sunburst. Importing this file registers both types.\nimport { register } from \"./core/registry.ts\";\nimport { el, esc, hit, key, r } from \"./core/svg.ts\";\nimport type { Aggregate, Mark, MarkCtx, MarkOut, Row } from \"./core/types.ts\";\n\ninterface Node {\n name: string;\n value: number;\n children: Node[];\n depth: number;\n /** Names from the first path level down to this node. */\n parts: string[];\n /** colorBy field value (leaves only). */\n cv: number | null;\n}\n\ntype Reduce = ReturnType<MarkCtx[\"agg\"]>;\n\n/** Rows -> nested tree in first-appearance order. Map-keyed, so any name is safe. */\nexport function tree(\n rows: readonly Row[],\n path: readonly string[],\n y: string,\n agg: Reduce,\n cb: string | null = null,\n): Node {\n type Raw = { kids: Map<string, Raw>; ys: number[]; cs: number[] };\n const mk = (): Raw => ({ kids: new Map(), ys: [], cs: [] });\n const top = mk();\n for (const row of rows) {\n const v = row[y];\n if (typeof v !== \"number\") continue;\n let n = top;\n for (const f of path) {\n const k = String(row[f]);\n n = n.kids.get(k) ?? n.kids.set(k, mk()).get(k)!;\n }\n n.ys.push(v);\n const c = cb === null ? null : row[cb];\n if (typeof c === \"number\") n.cs.push(c);\n }\n const build = (raw: Raw, name: string, depth: number, parts: string[]): Node => {\n const children = [...raw.kids].map(([k, c]) => build(c, k, depth + 1, [...parts, k]));\n return {\n name,\n children,\n depth,\n parts,\n cv: raw.cs.length ? agg(raw.cs) : null,\n value: children.length ? children.reduce((s, c) => s + c.value, 0) : (agg(raw.ys) ?? 0),\n };\n };\n return build(top, \"\", 0, []);\n}\n\n/** Bruls squarify: [node, x, y, w, h] for `nodes` filling the box. */\nfunction squarify(nodes: Node[], x: number, y: number, w: number, h: number) {\n const out: [Node, number, number, number, number][] = [];\n const items = nodes.filter((n) => n.value > 0).sort((a, b) => b.value - a.value);\n let rest = items.reduce((s, n) => s + n.value, 0);\n let i = 0;\n while (i < items.length) {\n const side = Math.min(w, h);\n const scale = (w * h) / rest;\n const worst = (a: number, mn: number, mx: number) =>\n Math.max((side * side * mx) / (a * a), (a * a) / (side * side * mn));\n let j = i;\n let sum = 0;\n let best = Infinity;\n for (; j < items.length; j++) {\n const v = items[j]!.value * scale;\n const s = sum + v;\n const wst = worst(s, v, items[i]!.value * scale);\n if (j > i && wst > best) break;\n best = wst;\n sum = s;\n }\n const row = items.slice(i, j);\n const thick = side ? sum / side : 0;\n let p = 0;\n for (const n of row) {\n const len = sum ? (n.value * scale * side) / sum : 0;\n out.push(w >= h ? [n, x, y + p, thick, len] : [n, x + p, y, len, thick]);\n p += len;\n }\n if (w >= h) ((x += thick), (w -= thick));\n else ((y += thick), (h -= thick));\n rest -= row.reduce((s, n) => s + n.value, 0);\n i = j;\n }\n return out;\n}\n\n/** Validate values, build the tree, and compute attributes shared by both marks. */\nfunction setup(ctx: MarkCtx) {\n const { spec } = ctx;\n spec.data.forEach((row, i) => {\n const v = row[spec.y];\n if (typeof v === \"number\" && !(v > 0))\n ctx.fail(\n \"non-positive-value\",\n `data[${i}].${spec.y}`,\n `Value ${v} is not positive.`,\n \"Treemaps and sunbursts size shapes by value, so every value must be above zero.\",\n 'To show negative values use a bar chart with colorBy: \"sign\".',\n );\n });\n const cb = typeof spec.colorBy === \"string\" && spec.colorBy !== \"sign\" ? spec.colorBy : null;\n const root = tree(spec.data, spec.path, spec.y, ctx.agg(spec.aggregate as Aggregate), cb);\n // Drilling: draw only the next level; a click pushes it, so each click goes one level deeper.\n if (spec.drill) for (const n of root.children) n.children = [];\n let c = 0;\n const tops = root.children;\n const attrs = (n: Node) => {\n const parts = [...spec.drilled, ...n.parts];\n const s = tops.findIndex((t) => t.name === n.parts[0]);\n return {\n \"data-maya\": \"mark\",\n \"data-key\": key(\"h\", ...parts),\n \"data-c\": c++,\n \"data-s\": s % 8,\n \"data-x\": parts.join(\" › \"),\n \"data-series\": \"\",\n \"data-y\": n.value,\n \"data-f\": ctx.fmt(spec.y, n.value),\n \"data-tone\": ctx.tone(n.value),\n \"data-q\": n.cv === null ? null : ctx.q(n.cv),\n \"data-depth\": n.depth,\n };\n };\n return { root, tops, attrs };\n}\n\nconst text = (s: string) => s.length * 7.2 + 4;\n\nconst treemap: Mark = {\n noun: \"Treemap\",\n draw(ctx): MarkOut {\n const { plot, spec } = ctx;\n const { root, attrs } = setup(ctx);\n let marks = \"\";\n let hits = \"\";\n const walk = (n: Node, x: number, y: number, w: number, h: number): void => {\n // 0.5 px inset below the top level: siblings sit 1 px apart (stroke adds more).\n const g = n.depth > 1 ? 0.5 : 0;\n const [bx, by, bw, bh] = [x + g, y + g, Math.max(0, w - 2 * g), Math.max(0, h - 2 * g)];\n if (!n.children.length) {\n if (bw * bh < 4) return; // ponytail: leaves under ~2 px a side are not drawn\n const a = attrs(n);\n marks += el(\"rect\", { ...a, x: r(bx), y: r(by), width: r(bw), height: r(bh) });\n // No data-depth on the hit: [data-depth] strokes would outline every grown target.\n hits += hit({ ...a, \"data-depth\": null }, bx, by, bw, bh);\n // Name over value when both fit, else \"name · value\" on one line, else the value.\n const [lx, ly, f, one] = [\n bx + bw / 2,\n by + bh / 2,\n a[\"data-f\"],\n `${n.name} · ${a[\"data-f\"]}`,\n ];\n if (!spec.labels || bh < 16) return;\n if (bh >= 34 && text(n.name) <= bw && text(f) <= bw)\n ctx.label(lx, ly - 8, n.name, \"center\") && ctx.label(lx, ly + 8, f, \"center\");\n else if (text(one) <= bw) ctx.label(lx, ly, one, \"center\");\n else if (text(f) <= bw) ctx.label(lx, ly, f, \"center\");\n return;\n }\n if (n.depth === 1 && text(n.name) <= bw && bh >= 30)\n ctx.label(bx + bw / 2, by + 9, n.name, \"center\");\n for (const [c, cx, cy, cw, ch] of squarify(n.children, bx, by, bw, bh))\n walk(c, cx, cy, cw, ch);\n };\n walk(root, plot.x, plot.y, plot.w, plot.h);\n return { marks, hits };\n },\n};\n\nconst TAU = Math.PI * 2;\n\nconst sunburst: Mark = {\n noun: \"Sunburst\",\n draw(ctx): MarkOut {\n const { plot, spec } = ctx;\n const { root, attrs } = setup(ctx);\n const D = spec.drill ? 1 : spec.path.length;\n const R = Math.min(plot.w, plot.h) / 2;\n const [cx, cy] = [plot.x + plot.w / 2, plot.y + plot.h / 2];\n const pt = (rad: number, a: number) =>\n `${r(cx + rad * Math.cos(a - Math.PI / 2))} ${r(cy + rad * Math.sin(a - Math.PI / 2))}`;\n let marks = \"\";\n const walk = (n: Node, a0: number, a1: number): void => {\n if (n.depth) {\n const [r0, r1] = [(n.depth * R) / (D + 1), ((n.depth + 1) * R) / (D + 1)];\n if ((a1 - a0) * r1 < 2) return; // ponytail: arcs under 2 px are not drawn (nor their children)\n const e = Math.min(a1, a0 + (TAU * 359.99) / 360);\n const big = e - a0 > Math.PI ? 1 : 0;\n const d =\n `M${pt(r1, a0)}A${r(r1)} ${r(r1)} 0 ${big} 1 ${pt(r1, e)}` +\n `L${pt(r0, e)}A${r(r0)} ${r(r0)} 0 ${big} 0 ${pt(r0, a0)}Z`;\n marks += el(\"path\", { ...attrs(n), d });\n // Horizontal name if it fits the wedge: arc length near the top/bottom, ring thickness at the sides.\n const [mid, rm, arc] = [(a0 + e) / 2, (r0 + r1) / 2, (e - a0) * ((r0 + r1) / 2)];\n const room = Math.abs(Math.sin(mid)) * (r1 - r0) + Math.abs(Math.cos(mid)) * arc;\n if (spec.labels && arc >= 14 && text(n.name) <= room) {\n const [lx, ly] = pt(rm, mid).split(\" \") as [string, string];\n ctx.label(+lx, +ly, n.name, \"center\");\n }\n }\n let a = a0;\n for (const c of n.children) {\n const span = ((a1 - a0) * c.value) / n.value;\n walk(c, a, a + span);\n a += span;\n }\n };\n walk(root, 0, TAU);\n return { marks, hits: \"\" };\n },\n};\n\nregister(\"treemap\", treemap);\nregister(\"sunburst\", sunburst);\n\nconst pct = (p: number) => (p > 0 && p < 0.005 ? \"<1%\" : `${Math.round(p * 100)}%`);\n\n/** Column width ~ column total; segments are shares of the column total (visible series only). */\nexport const marimekko: Mark = {\n noun: \"Marimekko\",\n draw(ctx): MarkOut {\n const { plot, spec, shaped } = ctx;\n const { categories, series, cells } = shaped;\n // ponytail: negative and null values count as 0, a stack of shares cannot show them.\n const val = new Map<string, number>();\n const tot = categories.map(() => 0);\n for (const c of cells) {\n const v = Math.max(0, c.value ?? 0);\n val.set(`${c.ci}/${c.si}`, v);\n tot[c.ci] = (tot[c.ci] ?? 0) + v;\n }\n const grand = tot.reduce((a, b) => a + b, 0);\n if (!grand) return { marks: \"\", hits: \"\" };\n const gap = 4;\n const [top, bot] = [plot.y + 2, plot.y + plot.h - 20];\n const free = plot.w - gap * (categories.length - 1);\n let marks = \"\";\n let hits = \"\";\n let x = plot.x;\n categories.forEach((name, ci) => {\n const t = tot[ci] ?? 0;\n const w = (free * t) / grand;\n let y = bot;\n for (const si of shaped.visible) {\n const v = val.get(`${ci}/${si}`);\n if (!v) continue;\n const h = ((bot - top) * v) / t;\n const f = ctx.fmt(spec.y, v);\n const a = {\n \"data-maya\": \"mark\",\n \"data-key\": key(series[si], name),\n \"data-c\": ci,\n \"data-s\": si % 8,\n \"data-x\": name,\n \"data-series\": series[si],\n \"data-y\": v,\n \"data-f\": `${f} (${pct(v / t)})`,\n };\n y -= h;\n marks += el(\"rect\", { ...a, x: r(x), y: r(y), width: r(w), height: r(h) });\n hits += hit(a, x, y, w, h);\n if (spec.labels && h >= 16) {\n const share = pct(v / t);\n ctx.label(\n x + w / 2,\n y + h / 2,\n `${f} (${share})`.length * 7.2 + 4 <= w ? `${f} (${share})` : share,\n \"center\",\n );\n }\n }\n if (w > 0) ctx.label(x + w / 2, plot.y + plot.h - 20, name, \"below\");\n x += w + gap;\n });\n return { marks, hits };\n },\n};\n\n/** 10x10 cells split between the x categories by largest remainder. */\nexport const waffle: Mark = {\n noun: \"Waffle\",\n draw(ctx): MarkOut {\n const { plot, spec, shaped } = ctx;\n const vals = shaped.categories.map(() => 0);\n for (const c of shaped.cells) vals[c.ci] = (vals[c.ci] ?? 0) + Math.max(0, c.value ?? 0);\n const sum = vals.reduce((a, b) => a + b, 0);\n if (!sum) return { marks: \"\", hits: \"\" };\n const n = vals.map((v) => Math.floor((v / sum) * 100));\n const left = 100 - n.reduce((a, b) => a + b, 0);\n vals\n .map((v, i) => [((v / sum) * 100) % 1, i] as const)\n .sort((a, b) => b[0] - a[0] || a[1] - b[1])\n .slice(0, left)\n .forEach(([, i]) => (n[i] = (n[i] ?? 0) + 1));\n const step = Math.min(plot.w, plot.h) / 10;\n const [ox, oy] = [plot.x + (plot.w - step * 10) / 2, plot.y + (plot.h - step * 10) / 2];\n const g = Math.min(3, step * 0.12);\n let marks = \"\";\n let hits = \"\";\n let i = 0;\n shaped.categories.forEach((name, ci) => {\n const v = vals[ci] ?? 0;\n for (let k = 0; k < (n[ci] ?? 0); k++, i++) {\n const [cx, cy] = [ox + (i % 10) * step, oy + Math.floor(i / 10) * step];\n const a = {\n \"data-maya\": \"mark\",\n \"data-key\": key(\"w\", name, k),\n \"data-c\": i,\n \"data-s\": ci % 8,\n \"data-x\": name,\n \"data-series\": \"\",\n \"data-y\": v,\n \"data-f\": `${ctx.fmt(spec.y, v)} (${pct(v / sum)})`,\n };\n marks += el(\"rect\", {\n ...a,\n x: r(cx + g / 2),\n y: r(cy + g / 2),\n width: r(step - g),\n height: r(step - g),\n });\n // The hit covers the whole grid step so the gaps between cells still hit.\n hits += el(\"rect\", {\n ...a,\n \"data-maya\": \"hit\",\n x: r(cx),\n y: r(cy),\n width: r(step),\n height: r(step),\n fill: \"transparent\",\n });\n }\n });\n const legend =\n `<div class=\"maya-legend\" data-maya=\"legend\">` +\n shaped.categories\n .map(\n (name, ci) =>\n `<span data-s=\"${ci % 8}\"><i></i>${esc(name)} ${pct((vals[ci] ?? 0) / sum)}</span>`,\n )\n .join(\"\") +\n `</div>`;\n return { marks, hits, legend };\n },\n};\nregister(\"marimekko\", marimekko);\nregister(\"waffle\", waffle);\n\nexport {};\n"],"mappings":"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"}
|