minerva-design 1.0.2 → 1.1.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/CHANGELOG.md +6 -0
- package/README.md +21 -19
- package/dist/charts/core.cjs +1 -0
- package/dist/charts/core.d.cts +3 -0
- package/dist/charts/core.d.ts +3 -0
- package/dist/charts/core.js +3 -0
- package/dist/charts/engine/axis.cjs +2 -0
- package/dist/charts/engine/axis.cjs.map +1 -0
- package/dist/charts/engine/axis.d.cts +13 -0
- package/dist/charts/engine/axis.d.ts +13 -0
- package/dist/charts/engine/axis.js +38 -0
- package/dist/charts/engine/axis.js.map +1 -0
- package/dist/charts/engine/chart.cjs +3 -0
- package/dist/charts/engine/chart.cjs.map +1 -0
- package/dist/charts/engine/chart.d.cts +6 -0
- package/dist/charts/engine/chart.d.ts +6 -0
- package/dist/charts/engine/chart.js +624 -0
- package/dist/charts/engine/chart.js.map +1 -0
- package/dist/charts/engine/color.cjs +2 -0
- package/dist/charts/engine/color.cjs.map +1 -0
- package/dist/charts/engine/color.d.cts +23 -0
- package/dist/charts/engine/color.d.ts +23 -0
- package/dist/charts/engine/color.js +95 -0
- package/dist/charts/engine/color.js.map +1 -0
- package/dist/charts/engine/data.cjs +2 -0
- package/dist/charts/engine/data.cjs.map +1 -0
- package/dist/charts/engine/data.d.cts +29 -0
- package/dist/charts/engine/data.d.ts +29 -0
- package/dist/charts/engine/data.js +104 -0
- package/dist/charts/engine/data.js.map +1 -0
- package/dist/charts/engine/decimate.cjs +2 -0
- package/dist/charts/engine/decimate.cjs.map +1 -0
- package/dist/charts/engine/decimate.d.cts +13 -0
- package/dist/charts/engine/decimate.d.ts +13 -0
- package/dist/charts/engine/decimate.js +28 -0
- package/dist/charts/engine/decimate.js.map +1 -0
- package/dist/charts/engine/dom.cjs +2 -0
- package/dist/charts/engine/dom.cjs.map +1 -0
- package/dist/charts/engine/dom.d.cts +21 -0
- package/dist/charts/engine/dom.d.ts +21 -0
- package/dist/charts/engine/dom.js +125 -0
- package/dist/charts/engine/dom.js.map +1 -0
- package/dist/charts/engine/format.cjs +2 -0
- package/dist/charts/engine/format.cjs.map +1 -0
- package/dist/charts/engine/format.d.cts +9 -0
- package/dist/charts/engine/format.d.ts +9 -0
- package/dist/charts/engine/format.js +34 -0
- package/dist/charts/engine/format.js.map +1 -0
- package/dist/charts/engine/items.cjs +2 -0
- package/dist/charts/engine/items.cjs.map +1 -0
- package/dist/charts/engine/items.d.cts +8 -0
- package/dist/charts/engine/items.d.ts +8 -0
- package/dist/charts/engine/items.js +91 -0
- package/dist/charts/engine/items.js.map +1 -0
- package/dist/charts/engine/layout.cjs +2 -0
- package/dist/charts/engine/layout.cjs.map +1 -0
- package/dist/charts/engine/layout.d.cts +37 -0
- package/dist/charts/engine/layout.d.ts +37 -0
- package/dist/charts/engine/layout.js +26 -0
- package/dist/charts/engine/layout.js.map +1 -0
- package/dist/charts/engine/model.cjs +2 -0
- package/dist/charts/engine/model.cjs.map +1 -0
- package/dist/charts/engine/model.d.cts +74 -0
- package/dist/charts/engine/model.d.ts +74 -0
- package/dist/charts/engine/model.js +175 -0
- package/dist/charts/engine/model.js.map +1 -0
- package/dist/charts/engine/overlay.cjs +2 -0
- package/dist/charts/engine/overlay.cjs.map +1 -0
- package/dist/charts/engine/overlay.d.cts +62 -0
- package/dist/charts/engine/overlay.d.ts +62 -0
- package/dist/charts/engine/overlay.js +123 -0
- package/dist/charts/engine/overlay.js.map +1 -0
- package/dist/charts/engine/renderers/canvas2d.cjs +2 -0
- package/dist/charts/engine/renderers/canvas2d.cjs.map +1 -0
- package/dist/charts/engine/renderers/canvas2d.d.cts +4 -0
- package/dist/charts/engine/renderers/canvas2d.d.ts +4 -0
- package/dist/charts/engine/renderers/canvas2d.js +156 -0
- package/dist/charts/engine/renderers/canvas2d.js.map +1 -0
- package/dist/charts/engine/renderers/detect.cjs +2 -0
- package/dist/charts/engine/renderers/detect.cjs.map +1 -0
- package/dist/charts/engine/renderers/detect.d.cts +12 -0
- package/dist/charts/engine/renderers/detect.d.ts +12 -0
- package/dist/charts/engine/renderers/detect.js +33 -0
- package/dist/charts/engine/renderers/detect.js.map +1 -0
- package/dist/charts/engine/renderers/range.cjs +2 -0
- package/dist/charts/engine/renderers/range.cjs.map +1 -0
- package/dist/charts/engine/renderers/range.d.cts +5 -0
- package/dist/charts/engine/renderers/range.d.ts +5 -0
- package/dist/charts/engine/renderers/range.js +32 -0
- package/dist/charts/engine/renderers/range.js.map +1 -0
- package/dist/charts/engine/renderers/shaders.cjs +266 -0
- package/dist/charts/engine/renderers/shaders.cjs.map +1 -0
- package/dist/charts/engine/renderers/shaders.d.cts +20 -0
- package/dist/charts/engine/renderers/shaders.d.ts +20 -0
- package/dist/charts/engine/renderers/shaders.js +251 -0
- package/dist/charts/engine/renderers/shaders.js.map +1 -0
- package/dist/charts/engine/renderers/types.cjs +2 -0
- package/dist/charts/engine/renderers/types.cjs.map +1 -0
- package/dist/charts/engine/renderers/types.d.cts +83 -0
- package/dist/charts/engine/renderers/types.d.ts +83 -0
- package/dist/charts/engine/renderers/types.js +6 -0
- package/dist/charts/engine/renderers/types.js.map +1 -0
- package/dist/charts/engine/renderers/webgl2.cjs +2 -0
- package/dist/charts/engine/renderers/webgl2.cjs.map +1 -0
- package/dist/charts/engine/renderers/webgl2.d.cts +5 -0
- package/dist/charts/engine/renderers/webgl2.d.ts +5 -0
- package/dist/charts/engine/renderers/webgl2.js +134 -0
- package/dist/charts/engine/renderers/webgl2.js.map +1 -0
- package/dist/charts/engine/renderers/webgpu.cjs +2 -0
- package/dist/charts/engine/renderers/webgpu.cjs.map +1 -0
- package/dist/charts/engine/renderers/webgpu.d.cts +6 -0
- package/dist/charts/engine/renderers/webgpu.d.ts +6 -0
- package/dist/charts/engine/renderers/webgpu.js +220 -0
- package/dist/charts/engine/renderers/webgpu.js.map +1 -0
- package/dist/charts/engine/scale.cjs +2 -0
- package/dist/charts/engine/scale.cjs.map +1 -0
- package/dist/charts/engine/scale.d.cts +13 -0
- package/dist/charts/engine/scale.d.ts +13 -0
- package/dist/charts/engine/scale.js +37 -0
- package/dist/charts/engine/scale.js.map +1 -0
- package/dist/charts/engine/spatial.cjs +2 -0
- package/dist/charts/engine/spatial.cjs.map +1 -0
- package/dist/charts/engine/spatial.d.cts +18 -0
- package/dist/charts/engine/spatial.d.ts +18 -0
- package/dist/charts/engine/spatial.js +53 -0
- package/dist/charts/engine/spatial.js.map +1 -0
- package/dist/charts/engine/theme.cjs +2 -0
- package/dist/charts/engine/theme.cjs.map +1 -0
- package/dist/charts/engine/theme.d.cts +21 -0
- package/dist/charts/engine/theme.d.ts +21 -0
- package/dist/charts/engine/theme.js +70 -0
- package/dist/charts/engine/theme.js.map +1 -0
- package/dist/charts/engine/time.cjs +2 -0
- package/dist/charts/engine/time.cjs.map +1 -0
- package/dist/charts/engine/time.d.cts +10 -0
- package/dist/charts/engine/time.d.ts +10 -0
- package/dist/charts/engine/time.js +189 -0
- package/dist/charts/engine/time.js.map +1 -0
- package/dist/charts/engine/types.d.cts +289 -0
- package/dist/charts/engine/types.d.ts +289 -0
- package/dist/charts/engine/viewport.cjs +2 -0
- package/dist/charts/engine/viewport.cjs.map +1 -0
- package/dist/charts/engine/viewport.d.cts +12 -0
- package/dist/charts/engine/viewport.d.ts +12 -0
- package/dist/charts/engine/viewport.js +15 -0
- package/dist/charts/engine/viewport.js.map +1 -0
- package/dist/charts/index.cjs +1 -0
- package/dist/charts/index.d.cts +4 -0
- package/dist/charts/index.d.ts +4 -0
- package/dist/charts/index.js +7 -0
- package/dist/charts/react/Chart.cjs +2 -0
- package/dist/charts/react/Chart.cjs.map +1 -0
- package/dist/charts/react/Chart.d.cts +28 -0
- package/dist/charts/react/Chart.d.ts +28 -0
- package/dist/charts/react/Chart.js +75 -0
- package/dist/charts/react/Chart.js.map +1 -0
- package/dist/charts/react/charts.cjs +2 -0
- package/dist/charts/react/charts.cjs.map +1 -0
- package/dist/charts/react/charts.d.cts +13 -0
- package/dist/charts/react/charts.d.ts +13 -0
- package/dist/charts/react/charts.js +179 -0
- package/dist/charts/react/charts.js.map +1 -0
- package/dist/charts/react/types.d.cts +168 -0
- package/dist/charts/react/types.d.ts +168 -0
- package/package.json +28 -2
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface DecimatedLine {
|
|
2
|
+
/** Interleaved x, y; NaN y marks a gap */
|
|
3
|
+
points: Float64Array;
|
|
4
|
+
/** Number of points */
|
|
5
|
+
length: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Decimates the points `[start, end)` of a line with sorted x, given as
|
|
9
|
+
* interleaved `x, y` values. `column` maps an x value to its pixel column.
|
|
10
|
+
* Missing values (NaN or `gap`) are kept as a single NaN point so the
|
|
11
|
+
* gaps survive.
|
|
12
|
+
*/
|
|
13
|
+
export declare const decimateMinMax: (points: ArrayLike<number>, start: number, end: number, column: (x: number) => number, gap?: number) => DecimatedLine;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface DecimatedLine {
|
|
2
|
+
/** Interleaved x, y; NaN y marks a gap */
|
|
3
|
+
points: Float64Array;
|
|
4
|
+
/** Number of points */
|
|
5
|
+
length: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Decimates the points `[start, end)` of a line with sorted x, given as
|
|
9
|
+
* interleaved `x, y` values. `column` maps an x value to its pixel column.
|
|
10
|
+
* Missing values (NaN or `gap`) are kept as a single NaN point so the
|
|
11
|
+
* gaps survive.
|
|
12
|
+
*/
|
|
13
|
+
export declare const decimateMinMax: (points: ArrayLike<number>, start: number, end: number, column: (x: number) => number, gap?: number) => DecimatedLine;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
//#region src/engine/decimate.ts
|
|
2
|
+
var e = (e, t, n, r, i = Infinity) => {
|
|
3
|
+
let a = new Float64Array(Math.max(0, n - t) * 2), o = 0, s = NaN, c = -1, l = -1, u = -1, d = -1, f = (t) => {
|
|
4
|
+
a[o * 2] = e[t * 2], a[o * 2 + 1] = e[t * 2 + 1], o++;
|
|
5
|
+
}, p = () => {
|
|
6
|
+
if (c < 0) return;
|
|
7
|
+
f(c);
|
|
8
|
+
let e = Math.min(l, u), t = Math.max(l, u);
|
|
9
|
+
e !== c && f(e), t !== e && t !== c && f(t), d !== t && d !== e && d !== c && f(d), c = -1;
|
|
10
|
+
}, m = (e) => Number.isFinite(e) && Math.abs(e) < i;
|
|
11
|
+
for (let i = t; i < n; i++) {
|
|
12
|
+
let t = e[i * 2], n = e[i * 2 + 1];
|
|
13
|
+
if (!m(t) || !m(n)) {
|
|
14
|
+
p(), s = NaN, o > 0 && !Number.isNaN(a[o * 2 - 1]) && (a[o * 2] = t, a[o * 2 + 1] = NaN, o++);
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
let f = Math.floor(r(t));
|
|
18
|
+
f !== s || c < 0 ? (p(), s = f, c = l = u = d = i) : (n < e[l * 2 + 1] && (l = i), n > e[u * 2 + 1] && (u = i), d = i);
|
|
19
|
+
}
|
|
20
|
+
return p(), {
|
|
21
|
+
points: a,
|
|
22
|
+
length: o
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
//#endregion
|
|
26
|
+
export { e as decimateMinMax };
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=decimate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decimate.js","names":["decimateMinMax","out","end","start","length","col","first","min","max","last","push","points","i","flush","lo","hi","valid","v","gap","x","y","c","column"],"sources":["../../../../charts/src/engine/decimate.ts"],"sourcesContent":["// Min-max decimation: keeps the shape of a sorted line with at most four\n// points per pixel column (first, min, max, last).\n\nexport interface DecimatedLine {\n /** Interleaved x, y; NaN y marks a gap */\n points: Float64Array;\n /** Number of points */\n length: number;\n}\n\n/**\n * Decimates the points `[start, end)` of a line with sorted x, given as\n * interleaved `x, y` values. `column` maps an x value to its pixel column.\n * Missing values (NaN or `gap`) are kept as a single NaN point so the\n * gaps survive.\n */\nexport const decimateMinMax = (\n points: ArrayLike<number>,\n start: number,\n end: number,\n column: (x: number) => number,\n gap = Infinity,\n): DecimatedLine => {\n const out = new Float64Array(Math.max(0, end - start) * 2);\n let length = 0;\n let col = NaN;\n let first = -1;\n let min = -1;\n let max = -1;\n let last = -1;\n\n const push = (i: number) => {\n out[length * 2] = points[i * 2];\n out[length * 2 + 1] = points[i * 2 + 1];\n length++;\n };\n const flush = () => {\n if (first < 0) return;\n push(first);\n const lo = Math.min(min, max);\n const hi = Math.max(min, max);\n if (lo !== first) push(lo);\n if (hi !== lo && hi !== first) push(hi);\n if (last !== hi && last !== lo && last !== first) push(last);\n first = -1;\n };\n const valid = (v: number) => Number.isFinite(v) && Math.abs(v) < gap;\n\n for (let i = start; i < end; i++) {\n const x = points[i * 2];\n const y = points[i * 2 + 1];\n if (!valid(x) || !valid(y)) {\n flush();\n col = NaN;\n if (length > 0 && !Number.isNaN(out[length * 2 - 1])) {\n out[length * 2] = x;\n out[length * 2 + 1] = NaN;\n length++;\n }\n continue;\n }\n const c = Math.floor(column(x));\n if (c !== col || first < 0) {\n flush();\n col = c;\n first = min = max = last = i;\n } else {\n if (y < points[min * 2 + 1]) min = i;\n if (y > points[max * 2 + 1]) max = i;\n last = i;\n }\n }\n flush();\n return { points: out, length };\n};\n"],"mappings":";AAgBA,IAAaA,KACX,GACA,GACA,GACA,GACA,IAAM,aACY;CAClB,IAAMC,IAAM,IAAI,aAAa,KAAK,IAAI,GAAGC,IAAMC,CAAK,IAAI,CAAC,GACrDC,IAAS,GACTC,IAAM,KACNC,IAAQ,IACRC,IAAM,IACNC,IAAM,IACNC,IAAO,IAELC,KAAQ,MAAc;EAG1B,AAFA,EAAIN,IAAS,KAAKO,EAAOC,IAAI,IAC7B,EAAIR,IAAS,IAAI,KAAKO,EAAOC,IAAI,IAAI,IACrC;CACF,GACMC,UAAc;EAClB,IAAIP,IAAQ,GAAG;EACf,EAAKA,CAAK;EACV,IAAMQ,IAAK,KAAK,IAAIP,GAAKC,CAAG,GACtBO,IAAK,KAAK,IAAIR,GAAKC,CAAG;EAI5B,AAHIM,MAAOR,KAAOI,EAAKI,CAAE,GACrBC,MAAOD,KAAMC,MAAOT,KAAOI,EAAKK,CAAE,GAClCN,MAASM,KAAMN,MAASK,KAAML,MAASH,KAAOI,EAAKD,CAAI,GAC3D,IAAQ;CACV,GACMO,KAAS,MAAc,OAAO,SAASC,CAAC,KAAK,KAAK,IAAIA,CAAC,IAAIC;CAEjE,KAAK,IAAI,IAAIf,GAAO,IAAID,GAAK,KAAK;EAChC,IAAMiB,IAAIR,EAAO,IAAI,IACfS,IAAIT,EAAO,IAAI,IAAI;EACzB,IAAI,CAACK,EAAMG,CAAC,KAAK,CAACH,EAAMI,CAAC,GAAG;GAG1B,AAFAP,EAAM,GACN,IAAM,KACFT,IAAS,KAAK,CAAC,OAAO,MAAMH,EAAIG,IAAS,IAAI,EAAE,MACjD,EAAIA,IAAS,KAAKe,GAClB,EAAIf,IAAS,IAAI,KAAK,KACtB;GAEF;EACF;EACA,IAAMiB,IAAI,KAAK,MAAMC,EAAOH,CAAC,CAAC;EAC9B,AAAIE,MAAMhB,KAAOC,IAAQ,KACvBO,EAAM,GACN,IAAMQ,GACN,IAAQ,IAAM,IAAM,IAAO,MAEvBD,IAAIT,EAAOJ,IAAM,IAAI,OAAI,IAAM,IAC/Ba,IAAIT,EAAOH,IAAM,IAAI,OAAI,IAAM,IACnC,IAAO;CAEX;CAEA,OADAK,EAAM,GACC;EAAE,QAAQZ;EAAK;CAAO;AAC/B"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var e=(e,t)=>(Object.assign(e.style,t),e),t=(t,n)=>e(t.createElement(n),{position:`absolute`,left:`0`,top:`0`,pointerEvents:`none`}),n=n=>{let r=n.ownerDocument,i=e(r.createElement(`div`),{position:`relative`,display:`flex`,flexDirection:`column`,width:`100%`,height:`100%`,minHeight:`0`,fontFamily:`var(--font-family-sans, system-ui, sans-serif)`,color:`var(--text-color, #1f2937)`});i.className=`minerva-chart`;let a=e(r.createElement(`div`),{display:`none`,flexWrap:`wrap`,alignItems:`center`,gap:`4px 14px`,padding:`0 4px 8px`,fontSize:`12px`,lineHeight:`18px`});a.className=`minerva-chart-legend`;let o=e(r.createElement(`div`),{position:`relative`,flex:`1 1 auto`,minHeight:`0`,outline:`none`,touchAction:`pan-y`,userSelect:`none`,borderRadius:`6px`});o.className=`minerva-chart-stage`,o.setAttribute(`role`,`figure`),o.setAttribute(`aria-roledescription`,`chart`);let s=t(r,`canvas`),c=t(r,`canvas`);s.setAttribute(`aria-hidden`,`true`),c.setAttribute(`aria-hidden`,`true`);let l=e(t(r,`div`),{right:`0`,bottom:`0`,overflow:`hidden`});l.setAttribute(`aria-hidden`,`true`);let u=e(r.createElement(`div`),{position:`absolute`,width:`0`,borderLeft:`1px dashed color-mix(in srgb, var(--text-secondary-color, #6b7280) 55%, transparent)`,display:`none`});l.appendChild(u);let d=e(r.createElement(`div`),{position:`absolute`,left:`0`,top:`0`,zIndex:`2`,display:`none`,pointerEvents:`none`,minWidth:`128px`,maxWidth:`320px`,padding:`8px 10px`,borderRadius:`8px`,border:`1px solid var(--border-color, #e5e7eb)`,background:`var(--surface-elevated-color, var(--background-color, #fff))`,color:`var(--text-color, #1f2937)`,boxShadow:`0 8px 24px -6px rgba(15, 23, 42, 0.18), 0 2px 6px -2px rgba(15, 23, 42, 0.12)`,fontSize:`12px`,lineHeight:`18px`,whiteSpace:`nowrap`,transition:`transform 60ms ease-out`});d.className=`minerva-chart-tooltip`,d.setAttribute(`role`,`tooltip`);let f=e(r.createElement(`div`),{position:`absolute`,width:`1px`,height:`1px`,overflow:`hidden`,clip:`rect(0 0 0 0)`,clipPath:`inset(50%)`,whiteSpace:`nowrap`});return f.setAttribute(`aria-live`,`polite`),o.append(s,c,l,d,f),i.append(a,o),n.appendChild(i),{root:i,legend:a,stage:o,background:s,foreground:c,hover:l,crosshair:u,tooltip:d,live:f}},r=e=>{let n=t(e,`canvas`);return n.setAttribute(`aria-hidden`,`true`),n.className=`minerva-chart-data`,n},i=(t,n,r)=>{let i=t.createElement(`span`);return e(i,{display:`inline-block`,flex:`none`,width:r===`line`?`14px`:`9px`,height:r===`line`?`3px`:`9px`,borderRadius:r===`dot`?`50%`:`2px`,background:n}),i},a=t=>e(t.createElement(`div`),{position:`absolute`,boxSizing:`border-box`,borderRadius:`50%`,border:`2px solid var(--surface-color, var(--background-color, #fff))`,boxShadow:`0 0 0 1px rgba(15, 23, 42, 0.12), 0 1px 4px rgba(15, 23, 42, 0.25)`,transform:`translate(-50%, -50%)`}),o=t=>e(t.createElement(`div`),{position:`absolute`,boxSizing:`border-box`,borderRadius:`4px`,background:`rgba(255, 255, 255, 0.18)`,boxShadow:`0 0 0 2px var(--surface-color, var(--background-color, #fff)) inset`});exports.createBarHighlight=o,exports.createChartDom=n,exports.createDataCanvas=r,exports.createMarker=a,exports.styleElement=e,exports.swatch=i;
|
|
2
|
+
//# sourceMappingURL=dom.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom.cjs","names":["assign","el","style","layer","doc","tag","createChartDom","container","root","legend","stage","background","foreground","hover","crosshair","tooltip","live","createDataCanvas","canvas","swatch","shape","color","createMarker","createBarHighlight"],"sources":["../../../../charts/src/engine/dom.ts"],"sourcesContent":["// DOM of a chart: legend, stage with the canvas layers, hover markers,\n// tooltip and a live region. Styled inline with the Minerva CSS variables\n// (and fallbacks), so the engine needs no stylesheet.\n\nexport interface ChartDom {\n root: HTMLDivElement;\n legend: HTMLDivElement;\n stage: HTMLDivElement;\n background: HTMLCanvasElement;\n foreground: HTMLCanvasElement;\n hover: HTMLDivElement;\n crosshair: HTMLDivElement;\n tooltip: HTMLDivElement;\n live: HTMLDivElement;\n}\n\nconst assign = (el: HTMLElement, style: Partial<CSSStyleDeclaration>) => {\n Object.assign(el.style, style);\n return el;\n};\n\nconst layer = (doc: Document, tag: \"canvas\" | \"div\") =>\n assign(doc.createElement(tag), {\n position: \"absolute\",\n left: \"0\",\n top: \"0\",\n pointerEvents: \"none\",\n });\n\nexport const createChartDom = (container: HTMLElement): ChartDom => {\n const doc = container.ownerDocument;\n const root = assign(doc.createElement(\"div\"), {\n position: \"relative\",\n display: \"flex\",\n flexDirection: \"column\",\n width: \"100%\",\n height: \"100%\",\n minHeight: \"0\",\n fontFamily: \"var(--font-family-sans, system-ui, sans-serif)\",\n color: \"var(--text-color, #1f2937)\",\n }) as HTMLDivElement;\n root.className = \"minerva-chart\";\n\n const legend = assign(doc.createElement(\"div\"), {\n display: \"none\",\n flexWrap: \"wrap\",\n alignItems: \"center\",\n gap: \"4px 14px\",\n padding: \"0 4px 8px\",\n fontSize: \"12px\",\n lineHeight: \"18px\",\n }) as HTMLDivElement;\n legend.className = \"minerva-chart-legend\";\n\n const stage = assign(doc.createElement(\"div\"), {\n position: \"relative\",\n flex: \"1 1 auto\",\n minHeight: \"0\",\n outline: \"none\",\n touchAction: \"pan-y\",\n userSelect: \"none\",\n borderRadius: \"6px\",\n }) as HTMLDivElement;\n stage.className = \"minerva-chart-stage\";\n stage.setAttribute(\"role\", \"figure\");\n stage.setAttribute(\"aria-roledescription\", \"chart\");\n\n const background = layer(doc, \"canvas\") as HTMLCanvasElement;\n const foreground = layer(doc, \"canvas\") as HTMLCanvasElement;\n background.setAttribute(\"aria-hidden\", \"true\");\n foreground.setAttribute(\"aria-hidden\", \"true\");\n\n const hover = assign(layer(doc, \"div\"), {\n right: \"0\",\n bottom: \"0\",\n overflow: \"hidden\",\n }) as HTMLDivElement;\n hover.setAttribute(\"aria-hidden\", \"true\");\n\n const crosshair = assign(doc.createElement(\"div\"), {\n position: \"absolute\",\n width: \"0\",\n borderLeft:\n \"1px dashed color-mix(in srgb, var(--text-secondary-color, #6b7280) 55%, transparent)\",\n display: \"none\",\n }) as HTMLDivElement;\n hover.appendChild(crosshair);\n\n const tooltip = assign(doc.createElement(\"div\"), {\n position: \"absolute\",\n left: \"0\",\n top: \"0\",\n zIndex: \"2\",\n display: \"none\",\n pointerEvents: \"none\",\n minWidth: \"128px\",\n maxWidth: \"320px\",\n padding: \"8px 10px\",\n borderRadius: \"8px\",\n border: \"1px solid var(--border-color, #e5e7eb)\",\n background: \"var(--surface-elevated-color, var(--background-color, #fff))\",\n color: \"var(--text-color, #1f2937)\",\n boxShadow:\n \"0 8px 24px -6px rgba(15, 23, 42, 0.18), 0 2px 6px -2px rgba(15, 23, 42, 0.12)\",\n fontSize: \"12px\",\n lineHeight: \"18px\",\n whiteSpace: \"nowrap\",\n transition: \"transform 60ms ease-out\",\n }) as HTMLDivElement;\n tooltip.className = \"minerva-chart-tooltip\";\n tooltip.setAttribute(\"role\", \"tooltip\");\n\n const live = assign(doc.createElement(\"div\"), {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n overflow: \"hidden\",\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n whiteSpace: \"nowrap\",\n }) as HTMLDivElement;\n live.setAttribute(\"aria-live\", \"polite\");\n\n stage.append(background, foreground, hover, tooltip, live);\n root.append(legend, stage);\n container.appendChild(root);\n return {\n root,\n legend,\n stage,\n background,\n foreground,\n hover,\n crosshair,\n tooltip,\n live,\n };\n};\n\n/** Canvas of the data layer, placed over the plot area */\nexport const createDataCanvas = (doc: Document): HTMLCanvasElement => {\n const canvas = layer(doc, \"canvas\") as HTMLCanvasElement;\n canvas.setAttribute(\"aria-hidden\", \"true\");\n canvas.className = \"minerva-chart-data\";\n return canvas;\n};\n\nexport const swatch = (\n doc: Document,\n color: string,\n shape: \"dot\" | \"square\" | \"line\",\n) => {\n const el = doc.createElement(\"span\");\n assign(el, {\n display: \"inline-block\",\n flex: \"none\",\n width: shape === \"line\" ? \"14px\" : \"9px\",\n height: shape === \"line\" ? \"3px\" : \"9px\",\n borderRadius: shape === \"dot\" ? \"50%\" : shape === \"line\" ? \"2px\" : \"2px\",\n background: color,\n });\n return el;\n};\n\n/** Marker of a hovered point (dot with a ring in the background color) */\nexport const createMarker = (doc: Document) =>\n assign(doc.createElement(\"div\"), {\n position: \"absolute\",\n boxSizing: \"border-box\",\n borderRadius: \"50%\",\n border: \"2px solid var(--surface-color, var(--background-color, #fff))\",\n boxShadow:\n \"0 0 0 1px rgba(15, 23, 42, 0.12), 0 1px 4px rgba(15, 23, 42, 0.25)\",\n transform: \"translate(-50%, -50%)\",\n }) as HTMLDivElement;\n\n/** Highlight of a hovered bar */\nexport const createBarHighlight = (doc: Document) =>\n assign(doc.createElement(\"div\"), {\n position: \"absolute\",\n boxSizing: \"border-box\",\n borderRadius: \"4px\",\n background: \"rgba(255, 255, 255, 0.18)\",\n boxShadow:\n \"0 0 0 2px var(--surface-color, var(--background-color, #fff)) inset\",\n }) as HTMLDivElement;\n\nexport { assign as styleElement };\n"],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface ChartDom {
|
|
2
|
+
root: HTMLDivElement;
|
|
3
|
+
legend: HTMLDivElement;
|
|
4
|
+
stage: HTMLDivElement;
|
|
5
|
+
background: HTMLCanvasElement;
|
|
6
|
+
foreground: HTMLCanvasElement;
|
|
7
|
+
hover: HTMLDivElement;
|
|
8
|
+
crosshair: HTMLDivElement;
|
|
9
|
+
tooltip: HTMLDivElement;
|
|
10
|
+
live: HTMLDivElement;
|
|
11
|
+
}
|
|
12
|
+
declare const assign: (el: HTMLElement, style: Partial<CSSStyleDeclaration>) => HTMLElement;
|
|
13
|
+
export declare const createChartDom: (container: HTMLElement) => ChartDom;
|
|
14
|
+
/** Canvas of the data layer, placed over the plot area */
|
|
15
|
+
export declare const createDataCanvas: (doc: Document) => HTMLCanvasElement;
|
|
16
|
+
export declare const swatch: (doc: Document, color: string, shape: "dot" | "square" | "line") => HTMLSpanElement;
|
|
17
|
+
/** Marker of a hovered point (dot with a ring in the background color) */
|
|
18
|
+
export declare const createMarker: (doc: Document) => HTMLDivElement;
|
|
19
|
+
/** Highlight of a hovered bar */
|
|
20
|
+
export declare const createBarHighlight: (doc: Document) => HTMLDivElement;
|
|
21
|
+
export { assign as styleElement };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface ChartDom {
|
|
2
|
+
root: HTMLDivElement;
|
|
3
|
+
legend: HTMLDivElement;
|
|
4
|
+
stage: HTMLDivElement;
|
|
5
|
+
background: HTMLCanvasElement;
|
|
6
|
+
foreground: HTMLCanvasElement;
|
|
7
|
+
hover: HTMLDivElement;
|
|
8
|
+
crosshair: HTMLDivElement;
|
|
9
|
+
tooltip: HTMLDivElement;
|
|
10
|
+
live: HTMLDivElement;
|
|
11
|
+
}
|
|
12
|
+
declare const assign: (el: HTMLElement, style: Partial<CSSStyleDeclaration>) => HTMLElement;
|
|
13
|
+
export declare const createChartDom: (container: HTMLElement) => ChartDom;
|
|
14
|
+
/** Canvas of the data layer, placed over the plot area */
|
|
15
|
+
export declare const createDataCanvas: (doc: Document) => HTMLCanvasElement;
|
|
16
|
+
export declare const swatch: (doc: Document, color: string, shape: "dot" | "square" | "line") => HTMLSpanElement;
|
|
17
|
+
/** Marker of a hovered point (dot with a ring in the background color) */
|
|
18
|
+
export declare const createMarker: (doc: Document) => HTMLDivElement;
|
|
19
|
+
/** Highlight of a hovered bar */
|
|
20
|
+
export declare const createBarHighlight: (doc: Document) => HTMLDivElement;
|
|
21
|
+
export { assign as styleElement };
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
//#region src/engine/dom.ts
|
|
2
|
+
var e = (e, t) => (Object.assign(e.style, t), e), t = (t, n) => e(t.createElement(n), {
|
|
3
|
+
position: "absolute",
|
|
4
|
+
left: "0",
|
|
5
|
+
top: "0",
|
|
6
|
+
pointerEvents: "none"
|
|
7
|
+
}), n = (n) => {
|
|
8
|
+
let r = n.ownerDocument, i = e(r.createElement("div"), {
|
|
9
|
+
position: "relative",
|
|
10
|
+
display: "flex",
|
|
11
|
+
flexDirection: "column",
|
|
12
|
+
width: "100%",
|
|
13
|
+
height: "100%",
|
|
14
|
+
minHeight: "0",
|
|
15
|
+
fontFamily: "var(--font-family-sans, system-ui, sans-serif)",
|
|
16
|
+
color: "var(--text-color, #1f2937)"
|
|
17
|
+
});
|
|
18
|
+
i.className = "minerva-chart";
|
|
19
|
+
let a = e(r.createElement("div"), {
|
|
20
|
+
display: "none",
|
|
21
|
+
flexWrap: "wrap",
|
|
22
|
+
alignItems: "center",
|
|
23
|
+
gap: "4px 14px",
|
|
24
|
+
padding: "0 4px 8px",
|
|
25
|
+
fontSize: "12px",
|
|
26
|
+
lineHeight: "18px"
|
|
27
|
+
});
|
|
28
|
+
a.className = "minerva-chart-legend";
|
|
29
|
+
let o = e(r.createElement("div"), {
|
|
30
|
+
position: "relative",
|
|
31
|
+
flex: "1 1 auto",
|
|
32
|
+
minHeight: "0",
|
|
33
|
+
outline: "none",
|
|
34
|
+
touchAction: "pan-y",
|
|
35
|
+
userSelect: "none",
|
|
36
|
+
borderRadius: "6px"
|
|
37
|
+
});
|
|
38
|
+
o.className = "minerva-chart-stage", o.setAttribute("role", "figure"), o.setAttribute("aria-roledescription", "chart");
|
|
39
|
+
let s = t(r, "canvas"), c = t(r, "canvas");
|
|
40
|
+
s.setAttribute("aria-hidden", "true"), c.setAttribute("aria-hidden", "true");
|
|
41
|
+
let l = e(t(r, "div"), {
|
|
42
|
+
right: "0",
|
|
43
|
+
bottom: "0",
|
|
44
|
+
overflow: "hidden"
|
|
45
|
+
});
|
|
46
|
+
l.setAttribute("aria-hidden", "true");
|
|
47
|
+
let u = e(r.createElement("div"), {
|
|
48
|
+
position: "absolute",
|
|
49
|
+
width: "0",
|
|
50
|
+
borderLeft: "1px dashed color-mix(in srgb, var(--text-secondary-color, #6b7280) 55%, transparent)",
|
|
51
|
+
display: "none"
|
|
52
|
+
});
|
|
53
|
+
l.appendChild(u);
|
|
54
|
+
let d = e(r.createElement("div"), {
|
|
55
|
+
position: "absolute",
|
|
56
|
+
left: "0",
|
|
57
|
+
top: "0",
|
|
58
|
+
zIndex: "2",
|
|
59
|
+
display: "none",
|
|
60
|
+
pointerEvents: "none",
|
|
61
|
+
minWidth: "128px",
|
|
62
|
+
maxWidth: "320px",
|
|
63
|
+
padding: "8px 10px",
|
|
64
|
+
borderRadius: "8px",
|
|
65
|
+
border: "1px solid var(--border-color, #e5e7eb)",
|
|
66
|
+
background: "var(--surface-elevated-color, var(--background-color, #fff))",
|
|
67
|
+
color: "var(--text-color, #1f2937)",
|
|
68
|
+
boxShadow: "0 8px 24px -6px rgba(15, 23, 42, 0.18), 0 2px 6px -2px rgba(15, 23, 42, 0.12)",
|
|
69
|
+
fontSize: "12px",
|
|
70
|
+
lineHeight: "18px",
|
|
71
|
+
whiteSpace: "nowrap",
|
|
72
|
+
transition: "transform 60ms ease-out"
|
|
73
|
+
});
|
|
74
|
+
d.className = "minerva-chart-tooltip", d.setAttribute("role", "tooltip");
|
|
75
|
+
let f = e(r.createElement("div"), {
|
|
76
|
+
position: "absolute",
|
|
77
|
+
width: "1px",
|
|
78
|
+
height: "1px",
|
|
79
|
+
overflow: "hidden",
|
|
80
|
+
clip: "rect(0 0 0 0)",
|
|
81
|
+
clipPath: "inset(50%)",
|
|
82
|
+
whiteSpace: "nowrap"
|
|
83
|
+
});
|
|
84
|
+
return f.setAttribute("aria-live", "polite"), o.append(s, c, l, d, f), i.append(a, o), n.appendChild(i), {
|
|
85
|
+
root: i,
|
|
86
|
+
legend: a,
|
|
87
|
+
stage: o,
|
|
88
|
+
background: s,
|
|
89
|
+
foreground: c,
|
|
90
|
+
hover: l,
|
|
91
|
+
crosshair: u,
|
|
92
|
+
tooltip: d,
|
|
93
|
+
live: f
|
|
94
|
+
};
|
|
95
|
+
}, r = (e) => {
|
|
96
|
+
let n = t(e, "canvas");
|
|
97
|
+
return n.setAttribute("aria-hidden", "true"), n.className = "minerva-chart-data", n;
|
|
98
|
+
}, i = (t, n, r) => {
|
|
99
|
+
let i = t.createElement("span");
|
|
100
|
+
return e(i, {
|
|
101
|
+
display: "inline-block",
|
|
102
|
+
flex: "none",
|
|
103
|
+
width: r === "line" ? "14px" : "9px",
|
|
104
|
+
height: r === "line" ? "3px" : "9px",
|
|
105
|
+
borderRadius: r === "dot" ? "50%" : "2px",
|
|
106
|
+
background: n
|
|
107
|
+
}), i;
|
|
108
|
+
}, a = (t) => e(t.createElement("div"), {
|
|
109
|
+
position: "absolute",
|
|
110
|
+
boxSizing: "border-box",
|
|
111
|
+
borderRadius: "50%",
|
|
112
|
+
border: "2px solid var(--surface-color, var(--background-color, #fff))",
|
|
113
|
+
boxShadow: "0 0 0 1px rgba(15, 23, 42, 0.12), 0 1px 4px rgba(15, 23, 42, 0.25)",
|
|
114
|
+
transform: "translate(-50%, -50%)"
|
|
115
|
+
}), o = (t) => e(t.createElement("div"), {
|
|
116
|
+
position: "absolute",
|
|
117
|
+
boxSizing: "border-box",
|
|
118
|
+
borderRadius: "4px",
|
|
119
|
+
background: "rgba(255, 255, 255, 0.18)",
|
|
120
|
+
boxShadow: "0 0 0 2px var(--surface-color, var(--background-color, #fff)) inset"
|
|
121
|
+
});
|
|
122
|
+
//#endregion
|
|
123
|
+
export { o as createBarHighlight, n as createChartDom, r as createDataCanvas, a as createMarker, e as styleElement, i as swatch };
|
|
124
|
+
|
|
125
|
+
//# sourceMappingURL=dom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom.js","names":["assign","el","style","layer","doc","tag","createChartDom","container","root","legend","stage","background","foreground","hover","crosshair","tooltip","live","createDataCanvas","canvas","swatch","shape","color","createMarker","createBarHighlight"],"sources":["../../../../charts/src/engine/dom.ts"],"sourcesContent":["// DOM of a chart: legend, stage with the canvas layers, hover markers,\n// tooltip and a live region. Styled inline with the Minerva CSS variables\n// (and fallbacks), so the engine needs no stylesheet.\n\nexport interface ChartDom {\n root: HTMLDivElement;\n legend: HTMLDivElement;\n stage: HTMLDivElement;\n background: HTMLCanvasElement;\n foreground: HTMLCanvasElement;\n hover: HTMLDivElement;\n crosshair: HTMLDivElement;\n tooltip: HTMLDivElement;\n live: HTMLDivElement;\n}\n\nconst assign = (el: HTMLElement, style: Partial<CSSStyleDeclaration>) => {\n Object.assign(el.style, style);\n return el;\n};\n\nconst layer = (doc: Document, tag: \"canvas\" | \"div\") =>\n assign(doc.createElement(tag), {\n position: \"absolute\",\n left: \"0\",\n top: \"0\",\n pointerEvents: \"none\",\n });\n\nexport const createChartDom = (container: HTMLElement): ChartDom => {\n const doc = container.ownerDocument;\n const root = assign(doc.createElement(\"div\"), {\n position: \"relative\",\n display: \"flex\",\n flexDirection: \"column\",\n width: \"100%\",\n height: \"100%\",\n minHeight: \"0\",\n fontFamily: \"var(--font-family-sans, system-ui, sans-serif)\",\n color: \"var(--text-color, #1f2937)\",\n }) as HTMLDivElement;\n root.className = \"minerva-chart\";\n\n const legend = assign(doc.createElement(\"div\"), {\n display: \"none\",\n flexWrap: \"wrap\",\n alignItems: \"center\",\n gap: \"4px 14px\",\n padding: \"0 4px 8px\",\n fontSize: \"12px\",\n lineHeight: \"18px\",\n }) as HTMLDivElement;\n legend.className = \"minerva-chart-legend\";\n\n const stage = assign(doc.createElement(\"div\"), {\n position: \"relative\",\n flex: \"1 1 auto\",\n minHeight: \"0\",\n outline: \"none\",\n touchAction: \"pan-y\",\n userSelect: \"none\",\n borderRadius: \"6px\",\n }) as HTMLDivElement;\n stage.className = \"minerva-chart-stage\";\n stage.setAttribute(\"role\", \"figure\");\n stage.setAttribute(\"aria-roledescription\", \"chart\");\n\n const background = layer(doc, \"canvas\") as HTMLCanvasElement;\n const foreground = layer(doc, \"canvas\") as HTMLCanvasElement;\n background.setAttribute(\"aria-hidden\", \"true\");\n foreground.setAttribute(\"aria-hidden\", \"true\");\n\n const hover = assign(layer(doc, \"div\"), {\n right: \"0\",\n bottom: \"0\",\n overflow: \"hidden\",\n }) as HTMLDivElement;\n hover.setAttribute(\"aria-hidden\", \"true\");\n\n const crosshair = assign(doc.createElement(\"div\"), {\n position: \"absolute\",\n width: \"0\",\n borderLeft:\n \"1px dashed color-mix(in srgb, var(--text-secondary-color, #6b7280) 55%, transparent)\",\n display: \"none\",\n }) as HTMLDivElement;\n hover.appendChild(crosshair);\n\n const tooltip = assign(doc.createElement(\"div\"), {\n position: \"absolute\",\n left: \"0\",\n top: \"0\",\n zIndex: \"2\",\n display: \"none\",\n pointerEvents: \"none\",\n minWidth: \"128px\",\n maxWidth: \"320px\",\n padding: \"8px 10px\",\n borderRadius: \"8px\",\n border: \"1px solid var(--border-color, #e5e7eb)\",\n background: \"var(--surface-elevated-color, var(--background-color, #fff))\",\n color: \"var(--text-color, #1f2937)\",\n boxShadow:\n \"0 8px 24px -6px rgba(15, 23, 42, 0.18), 0 2px 6px -2px rgba(15, 23, 42, 0.12)\",\n fontSize: \"12px\",\n lineHeight: \"18px\",\n whiteSpace: \"nowrap\",\n transition: \"transform 60ms ease-out\",\n }) as HTMLDivElement;\n tooltip.className = \"minerva-chart-tooltip\";\n tooltip.setAttribute(\"role\", \"tooltip\");\n\n const live = assign(doc.createElement(\"div\"), {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n overflow: \"hidden\",\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n whiteSpace: \"nowrap\",\n }) as HTMLDivElement;\n live.setAttribute(\"aria-live\", \"polite\");\n\n stage.append(background, foreground, hover, tooltip, live);\n root.append(legend, stage);\n container.appendChild(root);\n return {\n root,\n legend,\n stage,\n background,\n foreground,\n hover,\n crosshair,\n tooltip,\n live,\n };\n};\n\n/** Canvas of the data layer, placed over the plot area */\nexport const createDataCanvas = (doc: Document): HTMLCanvasElement => {\n const canvas = layer(doc, \"canvas\") as HTMLCanvasElement;\n canvas.setAttribute(\"aria-hidden\", \"true\");\n canvas.className = \"minerva-chart-data\";\n return canvas;\n};\n\nexport const swatch = (\n doc: Document,\n color: string,\n shape: \"dot\" | \"square\" | \"line\",\n) => {\n const el = doc.createElement(\"span\");\n assign(el, {\n display: \"inline-block\",\n flex: \"none\",\n width: shape === \"line\" ? \"14px\" : \"9px\",\n height: shape === \"line\" ? \"3px\" : \"9px\",\n borderRadius: shape === \"dot\" ? \"50%\" : shape === \"line\" ? \"2px\" : \"2px\",\n background: color,\n });\n return el;\n};\n\n/** Marker of a hovered point (dot with a ring in the background color) */\nexport const createMarker = (doc: Document) =>\n assign(doc.createElement(\"div\"), {\n position: \"absolute\",\n boxSizing: \"border-box\",\n borderRadius: \"50%\",\n border: \"2px solid var(--surface-color, var(--background-color, #fff))\",\n boxShadow:\n \"0 0 0 1px rgba(15, 23, 42, 0.12), 0 1px 4px rgba(15, 23, 42, 0.25)\",\n transform: \"translate(-50%, -50%)\",\n }) as HTMLDivElement;\n\n/** Highlight of a hovered bar */\nexport const createBarHighlight = (doc: Document) =>\n assign(doc.createElement(\"div\"), {\n position: \"absolute\",\n boxSizing: \"border-box\",\n borderRadius: \"4px\",\n background: \"rgba(255, 255, 255, 0.18)\",\n boxShadow:\n \"0 0 0 2px var(--surface-color, var(--background-color, #fff)) inset\",\n }) as HTMLDivElement;\n\nexport { assign as styleElement };\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("./scale.cjs");var t=[[0xe8d4a51000,`T`],[1e9,`B`],[1e6,`M`],[1e3,`k`]],n=e=>e.includes(`.`)?e.replace(/\.?0+$/,``):e,r=(r,i=2)=>{if(!Number.isFinite(r))return String(r);if(Object.is(r,-0)||r===0)return`0`;let a=Math.abs(r);for(let[e,o]of t)if(a>=e)return n((r/e).toFixed(i))+o;if(a<1e-4)return r.toExponential(1);let o=Math.min(6,Math.max(i,e.stepDecimals(a)+2));return n(r.toFixed(o))},i=(n,i)=>{if(i>=1e4){let a=t.find(([e])=>i>=e)?.[0]??1,o=Math.min(3,e.stepDecimals(n/a));return e=>r(e,o)}let a=e.stepDecimals(n);return e=>{let t=e.toFixed(a);return/^-0(\.0*)?$/.test(t)?t.slice(1):t}},a=e=>{if(!Number.isFinite(e))return`–`;let t=Math.abs(e);return t>=1e6?r(e,2):Number.isInteger(e)?e.toLocaleString(`en-US`):n(e.toFixed(t>=100?2:t>=1?3:4))};exports.formatCompact=r,exports.formatValue=a,exports.tickFormatter=i;
|
|
2
|
+
//# sourceMappingURL=format.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.cjs","names":["stepDecimals","require_scale","UNITS","trim","text","formatCompact","value","abs","unit","suffix","maxDecimals","decimals","tickFormatter","maxAbs","u","step","formatValue"],"sources":["../../../../charts/src/engine/format.ts"],"sourcesContent":["// Number formatting of tick labels and tooltip values.\n\nimport { stepDecimals } from \"./scale\";\n\nconst UNITS: readonly [number, string][] = [\n [1e12, \"T\"],\n [1e9, \"B\"],\n [1e6, \"M\"],\n [1e3, \"k\"],\n];\n\nconst trim = (text: string) =>\n text.includes(\".\") ? text.replace(/\\.?0+$/, \"\") : text;\n\n/** `1234567` -> `1.23M`, `0.5` -> `0.5`; `-0` is printed as `0` */\nexport const formatCompact = (value: number, maxDecimals = 2): string => {\n if (!Number.isFinite(value)) return String(value);\n if (Object.is(value, -0) || value === 0) return \"0\";\n const abs = Math.abs(value);\n for (const [unit, suffix] of UNITS) {\n if (abs >= unit) return trim((value / unit).toFixed(maxDecimals)) + suffix;\n }\n if (abs < 1e-4) return value.toExponential(1);\n const decimals = Math.min(6, Math.max(maxDecimals, stepDecimals(abs) + 2));\n return trim(value.toFixed(decimals));\n};\n\n/**\n * Formatter of the ticks of a linear axis: enough decimals to tell the\n * ticks apart; compact units (k, M, ...) when the values are large.\n */\nexport const tickFormatter = (step: number, maxAbs: number) => {\n if (maxAbs >= 1e4) {\n const unit = UNITS.find(([u]) => maxAbs >= u)?.[0] ?? 1;\n const decimals = Math.min(3, stepDecimals(step / unit));\n return (value: number) => formatCompact(value, decimals);\n }\n const decimals = stepDecimals(step);\n return (value: number) => {\n const text = value.toFixed(decimals);\n return /^-0(\\.0*)?$/.test(text) ? text.slice(1) : text;\n };\n};\n\n/** Value of a tooltip: up to 4 significant decimals */\nexport const formatValue = (value: number): string => {\n if (!Number.isFinite(value)) return \"–\";\n const abs = Math.abs(value);\n if (abs >= 1e6) return formatCompact(value, 2);\n if (Number.isInteger(value)) return value.toLocaleString(\"en-US\");\n return trim(value.toFixed(abs >= 100 ? 2 : abs >= 1 ? 3 : 4));\n};\n"],"mappings":"+BAIA,IAAME,EAAqC,CACzC,CAAC,aAAM,GAAG,EACV,CAAC,IAAK,GAAG,EACT,CAAC,IAAK,GAAG,EACT,CAAC,IAAK,GAAG,CACX,EAEMC,EAAQ,GACZC,EAAK,SAAS,GAAG,EAAIA,EAAK,QAAQ,SAAU,EAAE,EAAIA,EAGvCC,GAAiB,EAAe,EAAc,IAAc,CACvE,GAAI,CAAC,OAAO,SAASC,CAAK,EAAG,OAAO,OAAOA,CAAK,EAChD,GAAI,OAAO,GAAGA,EAAO,EAAE,GAAKA,IAAU,EAAG,MAAO,IAChD,IAAMC,EAAM,KAAK,IAAID,CAAK,EAC1B,IAAK,GAAM,CAACE,EAAMC,KAAWP,EAC3B,GAAIK,GAAOC,EAAM,OAAOL,GAAMG,EAAQE,EAAA,CAAM,QAAQE,CAAW,CAAC,EAAID,EAEtE,GAAIF,EAAM,KAAM,OAAOD,EAAM,cAAc,CAAC,EAC5C,IAAMK,EAAW,KAAK,IAAI,EAAG,KAAK,IAAID,EAAaV,EAAAA,aAAaO,CAAG,EAAI,CAAC,CAAC,EACzE,OAAOJ,EAAKG,EAAM,QAAQK,CAAQ,CAAC,CACrC,EAMaC,GAAiB,EAAc,IAAmB,CAC7D,GAAIC,GAAU,IAAK,CACjB,IAAML,EAAON,EAAM,MAAM,CAACY,KAAOD,GAAUC,CAAC,CAAC,GAAG,IAAM,EAChDH,EAAW,KAAK,IAAI,EAAGX,EAAAA,aAAae,EAAOP,CAAI,CAAC,EACtD,MAAQ,IAAkBH,EAAcC,EAAOK,CAAQ,CACzD,CACA,IAAMA,EAAWX,EAAAA,aAAae,CAAI,EAClC,MAAQ,IAAkB,CACxB,IAAMX,EAAOE,EAAM,QAAQK,CAAQ,EACnC,MAAO,cAAc,KAAKP,CAAI,EAAIA,EAAK,MAAM,CAAC,EAAIA,CACpD,CACF,EAGaY,EAAe,GAA0B,CACpD,GAAI,CAAC,OAAO,SAASV,CAAK,EAAG,MAAO,IACpC,IAAMC,EAAM,KAAK,IAAID,CAAK,EAG1B,OAFIC,GAAO,IAAYF,EAAcC,EAAO,CAAC,EACzC,OAAO,UAAUA,CAAK,EAAUA,EAAM,eAAe,OAAO,EACzDH,EAAKG,EAAM,QAAQC,GAAO,IAAM,EAAIA,GAAO,EAAI,EAAI,CAAC,CAAC,CAC9D"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** `1234567` -> `1.23M`, `0.5` -> `0.5`; `-0` is printed as `0` */
|
|
2
|
+
export declare const formatCompact: (value: number, maxDecimals?: number) => string;
|
|
3
|
+
/**
|
|
4
|
+
* Formatter of the ticks of a linear axis: enough decimals to tell the
|
|
5
|
+
* ticks apart; compact units (k, M, ...) when the values are large.
|
|
6
|
+
*/
|
|
7
|
+
export declare const tickFormatter: (step: number, maxAbs: number) => (value: number) => string;
|
|
8
|
+
/** Value of a tooltip: up to 4 significant decimals */
|
|
9
|
+
export declare const formatValue: (value: number) => string;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** `1234567` -> `1.23M`, `0.5` -> `0.5`; `-0` is printed as `0` */
|
|
2
|
+
export declare const formatCompact: (value: number, maxDecimals?: number) => string;
|
|
3
|
+
/**
|
|
4
|
+
* Formatter of the ticks of a linear axis: enough decimals to tell the
|
|
5
|
+
* ticks apart; compact units (k, M, ...) when the values are large.
|
|
6
|
+
*/
|
|
7
|
+
export declare const tickFormatter: (step: number, maxAbs: number) => (value: number) => string;
|
|
8
|
+
/** Value of a tooltip: up to 4 significant decimals */
|
|
9
|
+
export declare const formatValue: (value: number) => string;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { stepDecimals as e } from "./scale.js";
|
|
2
|
+
//#region src/engine/format.ts
|
|
3
|
+
var t = [
|
|
4
|
+
[0xe8d4a51000, "T"],
|
|
5
|
+
[1e9, "B"],
|
|
6
|
+
[1e6, "M"],
|
|
7
|
+
[1e3, "k"]
|
|
8
|
+
], n = (e) => e.includes(".") ? e.replace(/\.?0+$/, "") : e, r = (r, i = 2) => {
|
|
9
|
+
if (!Number.isFinite(r)) return String(r);
|
|
10
|
+
if (Object.is(r, -0) || r === 0) return "0";
|
|
11
|
+
let a = Math.abs(r);
|
|
12
|
+
for (let [e, o] of t) if (a >= e) return n((r / e).toFixed(i)) + o;
|
|
13
|
+
if (a < 1e-4) return r.toExponential(1);
|
|
14
|
+
let o = Math.min(6, Math.max(i, e(a) + 2));
|
|
15
|
+
return n(r.toFixed(o));
|
|
16
|
+
}, i = (n, i) => {
|
|
17
|
+
if (i >= 1e4) {
|
|
18
|
+
let a = t.find(([e]) => i >= e)?.[0] ?? 1, o = Math.min(3, e(n / a));
|
|
19
|
+
return (e) => r(e, o);
|
|
20
|
+
}
|
|
21
|
+
let a = e(n);
|
|
22
|
+
return (e) => {
|
|
23
|
+
let t = e.toFixed(a);
|
|
24
|
+
return /^-0(\.0*)?$/.test(t) ? t.slice(1) : t;
|
|
25
|
+
};
|
|
26
|
+
}, a = (e) => {
|
|
27
|
+
if (!Number.isFinite(e)) return "–";
|
|
28
|
+
let t = Math.abs(e);
|
|
29
|
+
return t >= 1e6 ? r(e, 2) : Number.isInteger(e) ? e.toLocaleString("en-US") : n(e.toFixed(t >= 100 ? 2 : t >= 1 ? 3 : 4));
|
|
30
|
+
};
|
|
31
|
+
//#endregion
|
|
32
|
+
export { r as formatCompact, a as formatValue, i as tickFormatter };
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","names":["UNITS","trim","text","formatCompact","value","abs","unit","suffix","maxDecimals","decimals","stepDecimals","tickFormatter","maxAbs","u","step","formatValue"],"sources":["../../../../charts/src/engine/format.ts"],"sourcesContent":["// Number formatting of tick labels and tooltip values.\n\nimport { stepDecimals } from \"./scale\";\n\nconst UNITS: readonly [number, string][] = [\n [1e12, \"T\"],\n [1e9, \"B\"],\n [1e6, \"M\"],\n [1e3, \"k\"],\n];\n\nconst trim = (text: string) =>\n text.includes(\".\") ? text.replace(/\\.?0+$/, \"\") : text;\n\n/** `1234567` -> `1.23M`, `0.5` -> `0.5`; `-0` is printed as `0` */\nexport const formatCompact = (value: number, maxDecimals = 2): string => {\n if (!Number.isFinite(value)) return String(value);\n if (Object.is(value, -0) || value === 0) return \"0\";\n const abs = Math.abs(value);\n for (const [unit, suffix] of UNITS) {\n if (abs >= unit) return trim((value / unit).toFixed(maxDecimals)) + suffix;\n }\n if (abs < 1e-4) return value.toExponential(1);\n const decimals = Math.min(6, Math.max(maxDecimals, stepDecimals(abs) + 2));\n return trim(value.toFixed(decimals));\n};\n\n/**\n * Formatter of the ticks of a linear axis: enough decimals to tell the\n * ticks apart; compact units (k, M, ...) when the values are large.\n */\nexport const tickFormatter = (step: number, maxAbs: number) => {\n if (maxAbs >= 1e4) {\n const unit = UNITS.find(([u]) => maxAbs >= u)?.[0] ?? 1;\n const decimals = Math.min(3, stepDecimals(step / unit));\n return (value: number) => formatCompact(value, decimals);\n }\n const decimals = stepDecimals(step);\n return (value: number) => {\n const text = value.toFixed(decimals);\n return /^-0(\\.0*)?$/.test(text) ? text.slice(1) : text;\n };\n};\n\n/** Value of a tooltip: up to 4 significant decimals */\nexport const formatValue = (value: number): string => {\n if (!Number.isFinite(value)) return \"–\";\n const abs = Math.abs(value);\n if (abs >= 1e6) return formatCompact(value, 2);\n if (Number.isInteger(value)) return value.toLocaleString(\"en-US\");\n return trim(value.toFixed(abs >= 100 ? 2 : abs >= 1 ? 3 : 4));\n};\n"],"mappings":";;AAIA,IAAMA,IAAqC;CACzC,CAAC,cAAM,GAAG;CACV,CAAC,KAAK,GAAG;CACT,CAAC,KAAK,GAAG;CACT,CAAC,KAAK,GAAG;AACX,GAEMC,KAAQ,MACZC,EAAK,SAAS,GAAG,IAAIA,EAAK,QAAQ,UAAU,EAAE,IAAIA,GAGvCC,KAAiB,GAAe,IAAc,MAAc;CACvE,IAAI,CAAC,OAAO,SAASC,CAAK,GAAG,OAAO,OAAOA,CAAK;CAChD,IAAI,OAAO,GAAGA,GAAO,EAAE,KAAKA,MAAU,GAAG,OAAO;CAChD,IAAMC,IAAM,KAAK,IAAID,CAAK;CAC1B,KAAK,IAAM,CAACE,GAAMC,MAAWP,GAC3B,IAAIK,KAAOC,GAAM,OAAOL,GAAMG,IAAQE,EAAA,CAAM,QAAQE,CAAW,CAAC,IAAID;CAEtE,IAAIF,IAAM,MAAM,OAAOD,EAAM,cAAc,CAAC;CAC5C,IAAMK,IAAW,KAAK,IAAI,GAAG,KAAK,IAAID,GAAaE,EAAaL,CAAG,IAAI,CAAC,CAAC;CACzE,OAAOJ,EAAKG,EAAM,QAAQK,CAAQ,CAAC;AACrC,GAMaE,KAAiB,GAAc,MAAmB;CAC7D,IAAIC,KAAU,KAAK;EACjB,IAAMN,IAAON,EAAM,MAAM,CAACa,OAAOD,KAAUC,CAAC,CAAC,GAAG,MAAM,GAChDJ,IAAW,KAAK,IAAI,GAAGC,EAAaI,IAAOR,CAAI,CAAC;EACtD,QAAQ,MAAkBH,EAAcC,GAAOK,CAAQ;CACzD;CACA,IAAMA,IAAWC,EAAaI,CAAI;CAClC,QAAQ,MAAkB;EACxB,IAAMZ,IAAOE,EAAM,QAAQK,CAAQ;EACnC,OAAO,cAAc,KAAKP,CAAI,IAAIA,EAAK,MAAM,CAAC,IAAIA;CACpD;AACF,GAGaa,KAAe,MAA0B;CACpD,IAAI,CAAC,OAAO,SAASX,CAAK,GAAG,OAAO;CACpC,IAAMC,IAAM,KAAK,IAAID,CAAK;CAG1B,OAFIC,KAAO,MAAYF,EAAcC,GAAO,CAAC,IACzC,OAAO,UAAUA,CAAK,IAAUA,EAAM,eAAe,OAAO,IACzDH,EAAKG,EAAM,QAAQC,KAAO,MAAM,IAAIA,KAAO,IAAI,IAAI,CAAC,CAAC;AAC9D"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("./color.cjs"),t=require("./renderers/types.cjs");var n=(e,n)=>Number.isFinite(e)?e-n:t.GAP,r=(e,r,i,a)=>{let o=new Float32Array(i*2);for(let s=0;s<i;s++)o[s*2]=n(e[s],a.x),o[s*2+1]=Number.isFinite(r[s])?r[s]-a.y:t.GAP;return o},i={area:0,bar:1,line:2,scatter:3},a=(a,o,s)=>{let c=[],l=[],u=a.series.filter(e=>!e.hidden).sort((e,t)=>i[e.type]-i[t.type]||e.index-t.index);for(let i of u){let{x:u,y:d,count:f,sorted:p}=i.cols;switch((i.type===`line`||i.type===`scatter`)&&l.length&&c.push(...l.splice(0)),i.type){case`line`:case`area`:{let e=r(u,d,f,o);i.type===`area`&&c.push({kind:`area`,key:`${i.key}:area`,version:s,color:i.color,points:e,count:f,baseline:a.baseline-o.y,opacity:i.opacity,sorted:p}),(i.type===`area`?l:c).push({kind:`line`,key:`${i.key}:line`,version:s,color:i.color,points:e,count:f,width:i.lineWidth,sorted:p});break}case`bar`:{let e=i.barBase??new Float64Array(f),r=i.barTop??d,l=new Float32Array(f*3);for(let a=0;a<f;a++){let s=Number.isFinite(r[a])&&Number.isFinite(e[a]);l[a*3]=n(u[a]+i.barOffset,o.x),l[a*3+1]=s?e[a]-o.y:t.GAP,l[a*3+2]=s?r[a]-o.y:t.GAP}c.push({kind:`bar`,key:`${i.key}:bar`,version:s,color:i.color,instances:l,count:f,halfWidth:i.barHalfWidth,sorted:p,radius:a.series.some(e=>e!==i&&!e.hidden&&e.type===`bar`&&e.barOffset===i.barOffset)?0:3});break}default:{let n=new ArrayBuffer(f*16),r=new Float32Array(n),a=new Uint32Array(n),l=e.packColor(i.color),p=i.cols.size;for(let n=0;n<f;n++){let s=Number.isFinite(d[n])&&Number.isFinite(u[n]);r[n*4]=s?u[n]-o.x:t.GAP,r[n*4+1]=s?d[n]-o.y:t.GAP;let c=p?p[n]:NaN;r[n*4+2]=Number.isFinite(c)&&c>0?c:i.pointSize;let f=i.pointColors?.[n];a[n*4+3]=f?e.packColor(f):l}c.push({kind:`scatter`,key:`${i.key}:scatter`,version:s,color:i.color,instances:n,count:f,opacity:i.opacity,stroke:f<=5e3?1.25:0});break}}}return c.push(...l),c};exports.buildItems=a;
|
|
2
|
+
//# sourceMappingURL=items.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"items.cjs","names":["GAP","packColor","require_color","require_types","rel","value","origin","points","out","count","i","x","o","y","DRAW_ORDER","buildItems","items","outlines","ordered","model","s","a","b","pts","base","top","instances","valid","buffer","f","u","seriesColor","sizes","size","pc"],"sources":["../../../../charts/src/engine/items.ts"],"sourcesContent":["// Chart model -> GPU-ready buffers (positions relative to an origin).\n\nimport { packColor } from \"./color\";\nimport type { ChartModel } from \"./model\";\nimport { GAP, SCATTER_STRIDE, type RenderItem } from \"./renderers/types\";\n\nexport interface Origin {\n x: number;\n y: number;\n}\n\nconst rel = (value: number, origin: number) =>\n Number.isFinite(value) ? value - origin : GAP;\n\nconst points = (x: Float64Array, y: Float64Array, count: number, o: Origin) => {\n const out = new Float32Array(count * 2);\n for (let i = 0; i < count; i++) {\n // x stays real at gaps so sorted data can be binary searched\n out[i * 2] = rel(x[i], o.x);\n out[i * 2 + 1] = Number.isFinite(y[i]) ? y[i] - o.y : GAP;\n }\n return out;\n};\n\nconst DRAW_ORDER = { area: 0, bar: 1, line: 2, scatter: 3 } as const;\n\n/** Render items of the visible series, back to front */\nexport const buildItems = (\n model: ChartModel,\n origin: Origin,\n version: number,\n): RenderItem[] => {\n const items: RenderItem[] = [];\n /** Outlines of the areas are drawn with the lines, above the bars */\n const outlines: RenderItem[] = [];\n const ordered = model.series\n .filter((s) => !s.hidden)\n .sort(\n (a, b) => DRAW_ORDER[a.type] - DRAW_ORDER[b.type] || a.index - b.index,\n );\n for (const s of ordered) {\n const { x, y, count, sorted } = s.cols;\n if ((s.type === \"line\" || s.type === \"scatter\") && outlines.length) {\n items.push(...outlines.splice(0));\n }\n switch (s.type) {\n case \"line\":\n case \"area\": {\n const pts = points(x, y, count, origin);\n if (s.type === \"area\") {\n items.push({\n kind: \"area\",\n key: `${s.key}:area`,\n version,\n color: s.color,\n points: pts,\n count,\n baseline: model.baseline - origin.y,\n opacity: s.opacity,\n sorted,\n });\n }\n (s.type === \"area\" ? outlines : items).push({\n kind: \"line\",\n key: `${s.key}:line`,\n version,\n color: s.color,\n points: pts,\n count,\n width: s.lineWidth,\n sorted,\n });\n break;\n }\n case \"bar\": {\n const base = s.barBase ?? new Float64Array(count);\n const top = s.barTop ?? y;\n const instances = new Float32Array(count * 3);\n for (let i = 0; i < count; i++) {\n const valid = Number.isFinite(top[i]) && Number.isFinite(base[i]);\n instances[i * 3] = rel(x[i] + s.barOffset, origin.x);\n instances[i * 3 + 1] = valid ? base[i] - origin.y : GAP;\n instances[i * 3 + 2] = valid ? top[i] - origin.y : GAP;\n }\n items.push({\n kind: \"bar\",\n key: `${s.key}:bar`,\n version,\n color: s.color,\n instances,\n count,\n halfWidth: s.barHalfWidth,\n sorted,\n radius: model.series.some(\n (o) =>\n o !== s &&\n !o.hidden &&\n o.type === \"bar\" &&\n o.barOffset === s.barOffset,\n )\n ? 0\n : 3,\n });\n break;\n }\n default: {\n const buffer = new ArrayBuffer(count * SCATTER_STRIDE);\n const f = new Float32Array(buffer);\n const u = new Uint32Array(buffer);\n const seriesColor = packColor(s.color);\n const sizes = s.cols.size;\n for (let i = 0; i < count; i++) {\n const valid = Number.isFinite(y[i]) && Number.isFinite(x[i]);\n f[i * 4] = valid ? x[i] - origin.x : GAP;\n f[i * 4 + 1] = valid ? y[i] - origin.y : GAP;\n const size = sizes ? sizes[i] : NaN;\n f[i * 4 + 2] = Number.isFinite(size) && size > 0 ? size : s.pointSize;\n const pc = s.pointColors?.[i];\n u[i * 4 + 3] = pc ? packColor(pc) : seriesColor;\n }\n items.push({\n kind: \"scatter\",\n key: `${s.key}:scatter`,\n version,\n color: s.color,\n instances: buffer,\n count,\n opacity: s.opacity,\n stroke: count <= 5000 ? 1.25 : 0,\n });\n break;\n }\n }\n }\n items.push(...outlines);\n return items;\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ChartModel } from './model.cjs';
|
|
2
|
+
import { RenderItem } from './renderers/types.cjs';
|
|
3
|
+
export interface Origin {
|
|
4
|
+
x: number;
|
|
5
|
+
y: number;
|
|
6
|
+
}
|
|
7
|
+
/** Render items of the visible series, back to front */
|
|
8
|
+
export declare const buildItems: (model: ChartModel, origin: Origin, version: number) => RenderItem[];
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ChartModel } from './model.js';
|
|
2
|
+
import { RenderItem } from './renderers/types.js';
|
|
3
|
+
export interface Origin {
|
|
4
|
+
x: number;
|
|
5
|
+
y: number;
|
|
6
|
+
}
|
|
7
|
+
/** Render items of the visible series, back to front */
|
|
8
|
+
export declare const buildItems: (model: ChartModel, origin: Origin, version: number) => RenderItem[];
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { packColor as e } from "./color.js";
|
|
2
|
+
import { GAP as t } from "./renderers/types.js";
|
|
3
|
+
//#region src/engine/items.ts
|
|
4
|
+
var n = (e, n) => Number.isFinite(e) ? e - n : t, r = (e, r, i, a) => {
|
|
5
|
+
let o = new Float32Array(i * 2);
|
|
6
|
+
for (let s = 0; s < i; s++) o[s * 2] = n(e[s], a.x), o[s * 2 + 1] = Number.isFinite(r[s]) ? r[s] - a.y : t;
|
|
7
|
+
return o;
|
|
8
|
+
}, i = {
|
|
9
|
+
area: 0,
|
|
10
|
+
bar: 1,
|
|
11
|
+
line: 2,
|
|
12
|
+
scatter: 3
|
|
13
|
+
}, a = (a, o, s) => {
|
|
14
|
+
let c = [], l = [], u = a.series.filter((e) => !e.hidden).sort((e, t) => i[e.type] - i[t.type] || e.index - t.index);
|
|
15
|
+
for (let i of u) {
|
|
16
|
+
let { x: u, y: d, count: f, sorted: p } = i.cols;
|
|
17
|
+
switch ((i.type === "line" || i.type === "scatter") && l.length && c.push(...l.splice(0)), i.type) {
|
|
18
|
+
case "line":
|
|
19
|
+
case "area": {
|
|
20
|
+
let e = r(u, d, f, o);
|
|
21
|
+
i.type === "area" && c.push({
|
|
22
|
+
kind: "area",
|
|
23
|
+
key: `${i.key}:area`,
|
|
24
|
+
version: s,
|
|
25
|
+
color: i.color,
|
|
26
|
+
points: e,
|
|
27
|
+
count: f,
|
|
28
|
+
baseline: a.baseline - o.y,
|
|
29
|
+
opacity: i.opacity,
|
|
30
|
+
sorted: p
|
|
31
|
+
}), (i.type === "area" ? l : c).push({
|
|
32
|
+
kind: "line",
|
|
33
|
+
key: `${i.key}:line`,
|
|
34
|
+
version: s,
|
|
35
|
+
color: i.color,
|
|
36
|
+
points: e,
|
|
37
|
+
count: f,
|
|
38
|
+
width: i.lineWidth,
|
|
39
|
+
sorted: p
|
|
40
|
+
});
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
case "bar": {
|
|
44
|
+
let e = i.barBase ?? new Float64Array(f), r = i.barTop ?? d, l = new Float32Array(f * 3);
|
|
45
|
+
for (let a = 0; a < f; a++) {
|
|
46
|
+
let s = Number.isFinite(r[a]) && Number.isFinite(e[a]);
|
|
47
|
+
l[a * 3] = n(u[a] + i.barOffset, o.x), l[a * 3 + 1] = s ? e[a] - o.y : t, l[a * 3 + 2] = s ? r[a] - o.y : t;
|
|
48
|
+
}
|
|
49
|
+
c.push({
|
|
50
|
+
kind: "bar",
|
|
51
|
+
key: `${i.key}:bar`,
|
|
52
|
+
version: s,
|
|
53
|
+
color: i.color,
|
|
54
|
+
instances: l,
|
|
55
|
+
count: f,
|
|
56
|
+
halfWidth: i.barHalfWidth,
|
|
57
|
+
sorted: p,
|
|
58
|
+
radius: a.series.some((e) => e !== i && !e.hidden && e.type === "bar" && e.barOffset === i.barOffset) ? 0 : 3
|
|
59
|
+
});
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
default: {
|
|
63
|
+
let n = /* @__PURE__ */ new ArrayBuffer(f * 16), r = new Float32Array(n), a = new Uint32Array(n), l = e(i.color), p = i.cols.size;
|
|
64
|
+
for (let n = 0; n < f; n++) {
|
|
65
|
+
let s = Number.isFinite(d[n]) && Number.isFinite(u[n]);
|
|
66
|
+
r[n * 4] = s ? u[n] - o.x : t, r[n * 4 + 1] = s ? d[n] - o.y : t;
|
|
67
|
+
let c = p ? p[n] : NaN;
|
|
68
|
+
r[n * 4 + 2] = Number.isFinite(c) && c > 0 ? c : i.pointSize;
|
|
69
|
+
let f = i.pointColors?.[n];
|
|
70
|
+
a[n * 4 + 3] = f ? e(f) : l;
|
|
71
|
+
}
|
|
72
|
+
c.push({
|
|
73
|
+
kind: "scatter",
|
|
74
|
+
key: `${i.key}:scatter`,
|
|
75
|
+
version: s,
|
|
76
|
+
color: i.color,
|
|
77
|
+
instances: n,
|
|
78
|
+
count: f,
|
|
79
|
+
opacity: i.opacity,
|
|
80
|
+
stroke: f <= 5e3 ? 1.25 : 0
|
|
81
|
+
});
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return c.push(...l), c;
|
|
87
|
+
};
|
|
88
|
+
//#endregion
|
|
89
|
+
export { a as buildItems };
|
|
90
|
+
|
|
91
|
+
//# sourceMappingURL=items.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"items.js","names":["rel","value","origin","GAP","points","out","count","i","x","o","y","DRAW_ORDER","buildItems","items","outlines","ordered","model","s","a","b","pts","base","top","instances","valid","buffer","f","u","seriesColor","packColor","sizes","size","pc"],"sources":["../../../../charts/src/engine/items.ts"],"sourcesContent":["// Chart model -> GPU-ready buffers (positions relative to an origin).\n\nimport { packColor } from \"./color\";\nimport type { ChartModel } from \"./model\";\nimport { GAP, SCATTER_STRIDE, type RenderItem } from \"./renderers/types\";\n\nexport interface Origin {\n x: number;\n y: number;\n}\n\nconst rel = (value: number, origin: number) =>\n Number.isFinite(value) ? value - origin : GAP;\n\nconst points = (x: Float64Array, y: Float64Array, count: number, o: Origin) => {\n const out = new Float32Array(count * 2);\n for (let i = 0; i < count; i++) {\n // x stays real at gaps so sorted data can be binary searched\n out[i * 2] = rel(x[i], o.x);\n out[i * 2 + 1] = Number.isFinite(y[i]) ? y[i] - o.y : GAP;\n }\n return out;\n};\n\nconst DRAW_ORDER = { area: 0, bar: 1, line: 2, scatter: 3 } as const;\n\n/** Render items of the visible series, back to front */\nexport const buildItems = (\n model: ChartModel,\n origin: Origin,\n version: number,\n): RenderItem[] => {\n const items: RenderItem[] = [];\n /** Outlines of the areas are drawn with the lines, above the bars */\n const outlines: RenderItem[] = [];\n const ordered = model.series\n .filter((s) => !s.hidden)\n .sort(\n (a, b) => DRAW_ORDER[a.type] - DRAW_ORDER[b.type] || a.index - b.index,\n );\n for (const s of ordered) {\n const { x, y, count, sorted } = s.cols;\n if ((s.type === \"line\" || s.type === \"scatter\") && outlines.length) {\n items.push(...outlines.splice(0));\n }\n switch (s.type) {\n case \"line\":\n case \"area\": {\n const pts = points(x, y, count, origin);\n if (s.type === \"area\") {\n items.push({\n kind: \"area\",\n key: `${s.key}:area`,\n version,\n color: s.color,\n points: pts,\n count,\n baseline: model.baseline - origin.y,\n opacity: s.opacity,\n sorted,\n });\n }\n (s.type === \"area\" ? outlines : items).push({\n kind: \"line\",\n key: `${s.key}:line`,\n version,\n color: s.color,\n points: pts,\n count,\n width: s.lineWidth,\n sorted,\n });\n break;\n }\n case \"bar\": {\n const base = s.barBase ?? new Float64Array(count);\n const top = s.barTop ?? y;\n const instances = new Float32Array(count * 3);\n for (let i = 0; i < count; i++) {\n const valid = Number.isFinite(top[i]) && Number.isFinite(base[i]);\n instances[i * 3] = rel(x[i] + s.barOffset, origin.x);\n instances[i * 3 + 1] = valid ? base[i] - origin.y : GAP;\n instances[i * 3 + 2] = valid ? top[i] - origin.y : GAP;\n }\n items.push({\n kind: \"bar\",\n key: `${s.key}:bar`,\n version,\n color: s.color,\n instances,\n count,\n halfWidth: s.barHalfWidth,\n sorted,\n radius: model.series.some(\n (o) =>\n o !== s &&\n !o.hidden &&\n o.type === \"bar\" &&\n o.barOffset === s.barOffset,\n )\n ? 0\n : 3,\n });\n break;\n }\n default: {\n const buffer = new ArrayBuffer(count * SCATTER_STRIDE);\n const f = new Float32Array(buffer);\n const u = new Uint32Array(buffer);\n const seriesColor = packColor(s.color);\n const sizes = s.cols.size;\n for (let i = 0; i < count; i++) {\n const valid = Number.isFinite(y[i]) && Number.isFinite(x[i]);\n f[i * 4] = valid ? x[i] - origin.x : GAP;\n f[i * 4 + 1] = valid ? y[i] - origin.y : GAP;\n const size = sizes ? sizes[i] : NaN;\n f[i * 4 + 2] = Number.isFinite(size) && size > 0 ? size : s.pointSize;\n const pc = s.pointColors?.[i];\n u[i * 4 + 3] = pc ? packColor(pc) : seriesColor;\n }\n items.push({\n kind: \"scatter\",\n key: `${s.key}:scatter`,\n version,\n color: s.color,\n instances: buffer,\n count,\n opacity: s.opacity,\n stroke: count <= 5000 ? 1.25 : 0,\n });\n break;\n }\n }\n }\n items.push(...outlines);\n return items;\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var e=(e,t,n,r)=>{let[i,a]=t.x,[o,s]=t.y,c=e.width/(a-i||1),l=e.height/(s-o||1),u=e.x,d=e.x+e.width,f=e.y,p=e.y+e.height;return{plot:e,view:t,xToPx:n?e=>d-(e-i)*c:e=>u+(e-i)*c,yToPx:r?e=>f+(e-o)*l:e=>p-(e-o)*l,pxToX:n?e=>i+(d-e)/c:e=>i+(e-u)/c,pxToY:r?e=>o+(e-f)/l:e=>o+(p-e)/l,xPerPx:1/c,yPerPx:1/l}},t=e=>{let{width:t,height:n,padding:r,fontSize:i}=e,a=Math.ceil(i*1.4),o=r.left+(e.yLabelWidth>0?e.yLabelWidth+8:0)+(e.yTitle?a+6:0),s=r.bottom+(e.xAxisVisible?a+8:0)+(e.xTitle?a+4:0),c=r.top,l=r.right;return{x:Math.round(o),y:Math.round(c),width:Math.max(10,Math.round(t-o-l)),height:Math.max(10,Math.round(n-c-s))}};exports.computePlot=t,exports.createScales=e;
|
|
2
|
+
//# sourceMappingURL=layout.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.cjs","names":["createScales","x0","x1","view","y0","y1","xs","plot","ys","left","right","top","bottom","reverseX","v","reverseY","p","computePlot","input","line","fontSize","padding","width","height"],"sources":["../../../../charts/src/engine/layout.ts"],"sourcesContent":["// Plot rectangle and data <-> pixel mappings (CSS pixels of the stage).\n\nimport type { ChartView } from \"./types\";\n\nexport interface Rect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface Scales {\n plot: Rect;\n view: ChartView;\n xToPx(value: number): number;\n yToPx(value: number): number;\n pxToX(px: number): number;\n pxToY(px: number): number;\n /** Data units per CSS pixel */\n xPerPx: number;\n yPerPx: number;\n}\n\nexport const createScales = (\n plot: Rect,\n view: ChartView,\n reverseX: boolean,\n reverseY: boolean,\n): Scales => {\n const [x0, x1] = view.x;\n const [y0, y1] = view.y;\n const xs = plot.width / (x1 - x0 || 1);\n const ys = plot.height / (y1 - y0 || 1);\n const left = plot.x;\n const right = plot.x + plot.width;\n const top = plot.y;\n const bottom = plot.y + plot.height;\n return {\n plot,\n view,\n xToPx: reverseX\n ? (v) => right - (v - x0) * xs\n : (v) => left + (v - x0) * xs,\n yToPx: reverseY\n ? (v) => top + (v - y0) * ys\n : (v) => bottom - (v - y0) * ys,\n pxToX: reverseX\n ? (p) => x0 + (right - p) / xs\n : (p) => x0 + (p - left) / xs,\n pxToY: reverseY\n ? (p) => y0 + (p - top) / ys\n : (p) => y0 + (bottom - p) / ys,\n xPerPx: 1 / xs,\n yPerPx: 1 / ys,\n };\n};\n\nexport interface LayoutInput {\n width: number;\n height: number;\n padding: { top: number; right: number; bottom: number; left: number };\n /** Width of the widest y tick label (0 when the axis is hidden) */\n yLabelWidth: number;\n xAxisVisible: boolean;\n xTitle: boolean;\n yTitle: boolean;\n fontSize: number;\n}\n\n/** Room for the axes, then the plot area */\nexport const computePlot = (input: LayoutInput): Rect => {\n const { width, height, padding, fontSize } = input;\n const line = Math.ceil(fontSize * 1.4);\n const left =\n padding.left +\n (input.yLabelWidth > 0 ? input.yLabelWidth + 8 : 0) +\n (input.yTitle ? line + 6 : 0);\n const bottom =\n padding.bottom +\n (input.xAxisVisible ? line + 8 : 0) +\n (input.xTitle ? line + 4 : 0);\n const top = padding.top;\n const right = padding.right;\n return {\n x: Math.round(left),\n y: Math.round(top),\n width: Math.max(10, Math.round(width - left - right)),\n height: Math.max(10, Math.round(height - top - bottom)),\n };\n};\n"],"mappings":"AAuBA,IAAaA,GACX,EACA,EACA,EACA,IACW,CACX,GAAM,CAACC,EAAIC,GAAMC,EAAK,EAChB,CAACC,EAAIC,GAAMF,EAAK,EAChBG,EAAKC,EAAK,OAASL,EAAKD,GAAM,GAC9BO,EAAKD,EAAK,QAAUF,EAAKD,GAAM,GAC/BK,EAAOF,EAAK,EACZG,EAAQH,EAAK,EAAIA,EAAK,MACtBI,EAAMJ,EAAK,EACXK,EAASL,EAAK,EAAIA,EAAK,OAC7B,MAAO,CACL,OACA,OACA,MAAOM,EACF,GAAMH,GAASI,EAAIb,GAAMK,EACzB,GAAMG,GAAQK,EAAIb,GAAMK,EAC7B,MAAOS,EACF,GAAMJ,GAAOG,EAAIV,GAAMI,EACvB,GAAMI,GAAUE,EAAIV,GAAMI,EAC/B,MAAOK,EACF,GAAMZ,GAAMS,EAAQM,GAAKV,EACzB,GAAML,GAAMe,EAAIP,GAAQH,EAC7B,MAAOS,EACF,GAAMX,GAAMY,EAAIL,GAAOH,EACvB,GAAMJ,GAAMQ,EAASI,GAAKR,EAC/B,OAAQ,EAAIF,EACZ,OAAQ,EAAIE,CACd,CACF,EAeaS,EAAe,GAA6B,CACvD,GAAM,CAAE,QAAO,SAAQ,UAAS,YAAaC,EACvCC,EAAO,KAAK,KAAKC,EAAW,GAAG,EAC/BX,EACJY,EAAQ,MACPH,EAAM,YAAc,EAAIA,EAAM,YAAc,EAAI,IAChDA,EAAM,OAASC,EAAO,EAAI,GACvBP,EACJS,EAAQ,QACPH,EAAM,aAAeC,EAAO,EAAI,IAChCD,EAAM,OAASC,EAAO,EAAI,GACvBR,EAAMU,EAAQ,IACdX,EAAQW,EAAQ,MACtB,MAAO,CACL,EAAG,KAAK,MAAMZ,CAAI,EAClB,EAAG,KAAK,MAAME,CAAG,EACjB,MAAO,KAAK,IAAI,GAAI,KAAK,MAAMW,EAAQb,EAAOC,CAAK,CAAC,EACpD,OAAQ,KAAK,IAAI,GAAI,KAAK,MAAMa,EAASZ,EAAMC,CAAM,CAAC,CACxD,CACF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { ChartView } from './types.cjs';
|
|
2
|
+
export interface Rect {
|
|
3
|
+
x: number;
|
|
4
|
+
y: number;
|
|
5
|
+
width: number;
|
|
6
|
+
height: number;
|
|
7
|
+
}
|
|
8
|
+
export interface Scales {
|
|
9
|
+
plot: Rect;
|
|
10
|
+
view: ChartView;
|
|
11
|
+
xToPx(value: number): number;
|
|
12
|
+
yToPx(value: number): number;
|
|
13
|
+
pxToX(px: number): number;
|
|
14
|
+
pxToY(px: number): number;
|
|
15
|
+
/** Data units per CSS pixel */
|
|
16
|
+
xPerPx: number;
|
|
17
|
+
yPerPx: number;
|
|
18
|
+
}
|
|
19
|
+
export declare const createScales: (plot: Rect, view: ChartView, reverseX: boolean, reverseY: boolean) => Scales;
|
|
20
|
+
export interface LayoutInput {
|
|
21
|
+
width: number;
|
|
22
|
+
height: number;
|
|
23
|
+
padding: {
|
|
24
|
+
top: number;
|
|
25
|
+
right: number;
|
|
26
|
+
bottom: number;
|
|
27
|
+
left: number;
|
|
28
|
+
};
|
|
29
|
+
/** Width of the widest y tick label (0 when the axis is hidden) */
|
|
30
|
+
yLabelWidth: number;
|
|
31
|
+
xAxisVisible: boolean;
|
|
32
|
+
xTitle: boolean;
|
|
33
|
+
yTitle: boolean;
|
|
34
|
+
fontSize: number;
|
|
35
|
+
}
|
|
36
|
+
/** Room for the axes, then the plot area */
|
|
37
|
+
export declare const computePlot: (input: LayoutInput) => Rect;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { ChartView } from './types.js';
|
|
2
|
+
export interface Rect {
|
|
3
|
+
x: number;
|
|
4
|
+
y: number;
|
|
5
|
+
width: number;
|
|
6
|
+
height: number;
|
|
7
|
+
}
|
|
8
|
+
export interface Scales {
|
|
9
|
+
plot: Rect;
|
|
10
|
+
view: ChartView;
|
|
11
|
+
xToPx(value: number): number;
|
|
12
|
+
yToPx(value: number): number;
|
|
13
|
+
pxToX(px: number): number;
|
|
14
|
+
pxToY(px: number): number;
|
|
15
|
+
/** Data units per CSS pixel */
|
|
16
|
+
xPerPx: number;
|
|
17
|
+
yPerPx: number;
|
|
18
|
+
}
|
|
19
|
+
export declare const createScales: (plot: Rect, view: ChartView, reverseX: boolean, reverseY: boolean) => Scales;
|
|
20
|
+
export interface LayoutInput {
|
|
21
|
+
width: number;
|
|
22
|
+
height: number;
|
|
23
|
+
padding: {
|
|
24
|
+
top: number;
|
|
25
|
+
right: number;
|
|
26
|
+
bottom: number;
|
|
27
|
+
left: number;
|
|
28
|
+
};
|
|
29
|
+
/** Width of the widest y tick label (0 when the axis is hidden) */
|
|
30
|
+
yLabelWidth: number;
|
|
31
|
+
xAxisVisible: boolean;
|
|
32
|
+
xTitle: boolean;
|
|
33
|
+
yTitle: boolean;
|
|
34
|
+
fontSize: number;
|
|
35
|
+
}
|
|
36
|
+
/** Room for the axes, then the plot area */
|
|
37
|
+
export declare const computePlot: (input: LayoutInput) => Rect;
|