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,220 @@
|
|
|
1
|
+
import { instanceRange as e } from "./range.js";
|
|
2
|
+
import { WGSL_AREA as t, WGSL_BAR as n, WGSL_LINE as r, WGSL_SCATTER as i } from "./shaders.js";
|
|
3
|
+
//#region src/engine/renderers/webgpu.ts
|
|
4
|
+
var a = 64, o = async (o, s, c = !1) => {
|
|
5
|
+
let l = navigator.gpu;
|
|
6
|
+
if (!l) return null;
|
|
7
|
+
let u = await l.requestAdapter();
|
|
8
|
+
if (!u) return null;
|
|
9
|
+
let d = u;
|
|
10
|
+
if (c && (d.info?.isFallbackAdapter || d.isFallbackAdapter)) return null;
|
|
11
|
+
let f = await u.requestDevice(), p = o.getContext("webgpu");
|
|
12
|
+
if (!p) return f.destroy(), null;
|
|
13
|
+
let m = l.getPreferredCanvasFormat();
|
|
14
|
+
p.configure({
|
|
15
|
+
device: f,
|
|
16
|
+
format: m,
|
|
17
|
+
alphaMode: "premultiplied"
|
|
18
|
+
});
|
|
19
|
+
let h = !1;
|
|
20
|
+
f.lost.then(() => {
|
|
21
|
+
h || s();
|
|
22
|
+
});
|
|
23
|
+
let g = f.createBindGroupLayout({ entries: [{
|
|
24
|
+
binding: 0,
|
|
25
|
+
visibility: 3,
|
|
26
|
+
buffer: { type: "uniform" }
|
|
27
|
+
}] }), _ = f.createPipelineLayout({ bindGroupLayouts: [g] }), v = {
|
|
28
|
+
color: {
|
|
29
|
+
srcFactor: "one",
|
|
30
|
+
dstFactor: "one-minus-src-alpha",
|
|
31
|
+
operation: "add"
|
|
32
|
+
},
|
|
33
|
+
alpha: {
|
|
34
|
+
srcFactor: "one",
|
|
35
|
+
dstFactor: "one-minus-src-alpha",
|
|
36
|
+
operation: "add"
|
|
37
|
+
}
|
|
38
|
+
}, y = (e, t) => {
|
|
39
|
+
let n = f.createShaderModule({ code: e });
|
|
40
|
+
return f.createRenderPipeline({
|
|
41
|
+
layout: _,
|
|
42
|
+
vertex: {
|
|
43
|
+
module: n,
|
|
44
|
+
entryPoint: "vs",
|
|
45
|
+
buffers: t
|
|
46
|
+
},
|
|
47
|
+
fragment: {
|
|
48
|
+
module: n,
|
|
49
|
+
entryPoint: "fs",
|
|
50
|
+
targets: [{
|
|
51
|
+
format: m,
|
|
52
|
+
blend: v
|
|
53
|
+
}]
|
|
54
|
+
},
|
|
55
|
+
primitive: { topology: "triangle-strip" }
|
|
56
|
+
});
|
|
57
|
+
}, b = [{
|
|
58
|
+
arrayStride: 8,
|
|
59
|
+
stepMode: "instance",
|
|
60
|
+
attributes: [{
|
|
61
|
+
shaderLocation: 0,
|
|
62
|
+
offset: 0,
|
|
63
|
+
format: "float32x2"
|
|
64
|
+
}]
|
|
65
|
+
}, {
|
|
66
|
+
arrayStride: 8,
|
|
67
|
+
stepMode: "instance",
|
|
68
|
+
attributes: [{
|
|
69
|
+
shaderLocation: 1,
|
|
70
|
+
offset: 0,
|
|
71
|
+
format: "float32x2"
|
|
72
|
+
}]
|
|
73
|
+
}], x = {
|
|
74
|
+
line: y(r, b),
|
|
75
|
+
area: y(t, b),
|
|
76
|
+
bar: y(n, [{
|
|
77
|
+
arrayStride: 12,
|
|
78
|
+
stepMode: "instance",
|
|
79
|
+
attributes: [{
|
|
80
|
+
shaderLocation: 0,
|
|
81
|
+
offset: 0,
|
|
82
|
+
format: "float32x3"
|
|
83
|
+
}]
|
|
84
|
+
}]),
|
|
85
|
+
scatter: y(i, [{
|
|
86
|
+
arrayStride: 16,
|
|
87
|
+
stepMode: "instance",
|
|
88
|
+
attributes: [
|
|
89
|
+
{
|
|
90
|
+
shaderLocation: 0,
|
|
91
|
+
offset: 0,
|
|
92
|
+
format: "float32x2"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
shaderLocation: 1,
|
|
96
|
+
offset: 8,
|
|
97
|
+
format: "float32"
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
shaderLocation: 2,
|
|
101
|
+
offset: 12,
|
|
102
|
+
format: "unorm8x4"
|
|
103
|
+
}
|
|
104
|
+
]
|
|
105
|
+
}])
|
|
106
|
+
}, S = /* @__PURE__ */ new Map(), C = new Float32Array(a / 4), w = (e) => {
|
|
107
|
+
switch (e.kind) {
|
|
108
|
+
case "line":
|
|
109
|
+
case "area": return e.points.subarray(0, e.count * 2);
|
|
110
|
+
case "bar": return e.instances.subarray(0, e.count * 3);
|
|
111
|
+
default: return e.instances;
|
|
112
|
+
}
|
|
113
|
+
}, T = (e) => {
|
|
114
|
+
let t = S.get(e.key);
|
|
115
|
+
if (t && t.version === e.version && t.kind === e.kind) return t;
|
|
116
|
+
t?.vertex?.destroy();
|
|
117
|
+
let n = w(e), r = Math.max(16, Math.ceil(n.byteLength / 4) * 4), i = n.byteLength > 0 ? f.createBuffer({
|
|
118
|
+
size: r,
|
|
119
|
+
usage: 40
|
|
120
|
+
}) : null;
|
|
121
|
+
if (i && (n instanceof Float32Array ? f.queue.writeBuffer(i, 0, n.buffer, n.byteOffset, n.byteLength) : f.queue.writeBuffer(i, 0, n)), t) t.version = e.version, t.kind = e.kind, t.vertex = i;
|
|
122
|
+
else {
|
|
123
|
+
let n = f.createBuffer({
|
|
124
|
+
size: a,
|
|
125
|
+
usage: 72
|
|
126
|
+
});
|
|
127
|
+
t = {
|
|
128
|
+
version: e.version,
|
|
129
|
+
kind: e.kind,
|
|
130
|
+
vertex: i,
|
|
131
|
+
uniform: n,
|
|
132
|
+
bindGroup: f.createBindGroup({
|
|
133
|
+
layout: g,
|
|
134
|
+
entries: [{
|
|
135
|
+
binding: 0,
|
|
136
|
+
resource: { buffer: n }
|
|
137
|
+
}]
|
|
138
|
+
})
|
|
139
|
+
}, S.set(e.key, t);
|
|
140
|
+
}
|
|
141
|
+
return t;
|
|
142
|
+
}, E = (e, t) => {
|
|
143
|
+
switch (e.kind) {
|
|
144
|
+
case "line": return [
|
|
145
|
+
e.width * t.dpr / 2,
|
|
146
|
+
0,
|
|
147
|
+
0,
|
|
148
|
+
0
|
|
149
|
+
];
|
|
150
|
+
case "area": return [
|
|
151
|
+
e.baseline,
|
|
152
|
+
e.opacity,
|
|
153
|
+
0,
|
|
154
|
+
0
|
|
155
|
+
];
|
|
156
|
+
case "bar": return [
|
|
157
|
+
e.halfWidth,
|
|
158
|
+
e.radius,
|
|
159
|
+
0,
|
|
160
|
+
0
|
|
161
|
+
];
|
|
162
|
+
default: return [
|
|
163
|
+
e.opacity,
|
|
164
|
+
e.stroke,
|
|
165
|
+
0,
|
|
166
|
+
0
|
|
167
|
+
];
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
return {
|
|
171
|
+
kind: "webgpu",
|
|
172
|
+
canvas: o,
|
|
173
|
+
resize(e, t) {
|
|
174
|
+
o.width = Math.max(1, e), o.height = Math.max(1, t);
|
|
175
|
+
},
|
|
176
|
+
render(t, n) {
|
|
177
|
+
if (h) return;
|
|
178
|
+
let r = /* @__PURE__ */ new Set(), i = f.createCommandEncoder(), a = i.beginRenderPass({ colorAttachments: [{
|
|
179
|
+
view: p.getCurrentTexture().createView(),
|
|
180
|
+
clearValue: {
|
|
181
|
+
r: 0,
|
|
182
|
+
g: 0,
|
|
183
|
+
b: 0,
|
|
184
|
+
a: 0
|
|
185
|
+
},
|
|
186
|
+
loadOp: "clear",
|
|
187
|
+
storeOp: "store"
|
|
188
|
+
}] }), o = n.transform;
|
|
189
|
+
for (let i of t) {
|
|
190
|
+
r.add(i.key);
|
|
191
|
+
let [t, s] = e(i, n);
|
|
192
|
+
if (s <= 0) continue;
|
|
193
|
+
let c = T(i);
|
|
194
|
+
c.vertex && (C.set([
|
|
195
|
+
o.xScale,
|
|
196
|
+
o.xOffset,
|
|
197
|
+
o.yScale,
|
|
198
|
+
o.yOffset,
|
|
199
|
+
n.width,
|
|
200
|
+
n.height,
|
|
201
|
+
n.dpr,
|
|
202
|
+
0,
|
|
203
|
+
...i.color,
|
|
204
|
+
...E(i, n)
|
|
205
|
+
], 0), f.queue.writeBuffer(c.uniform, 0, C), a.setPipeline(x[i.kind]), a.setBindGroup(0, c.bindGroup), a.setVertexBuffer(0, c.vertex), (i.kind === "line" || i.kind === "area") && a.setVertexBuffer(1, c.vertex, 8), a.draw(4, s, 0, t));
|
|
206
|
+
}
|
|
207
|
+
a.end(), f.queue.submit([i.finish()]);
|
|
208
|
+
for (let [e, t] of S) r.has(e) || (t.vertex?.destroy(), t.uniform.destroy(), S.delete(e));
|
|
209
|
+
},
|
|
210
|
+
destroy() {
|
|
211
|
+
h = !0;
|
|
212
|
+
for (let e of S.values()) e.vertex?.destroy(), e.uniform.destroy();
|
|
213
|
+
S.clear(), p.unconfigure(), f.destroy();
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
};
|
|
217
|
+
//#endregion
|
|
218
|
+
export { o as createWebGpuRenderer };
|
|
219
|
+
|
|
220
|
+
//# sourceMappingURL=webgpu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webgpu.js","names":["UNIFORM_SIZE","createWebGpuRenderer","gpu","adapter","fallback","requireHardware","device","context","canvas","format","destroyed","onLost","bindGroupLayout","layout","blend","pipeline","module","segment","pipelines","WGSL_LINE","WGSL_AREA","WGSL_BAR","WGSL_SCATTER","resources","uniformData","vertexData","item","upload","res","data","size","vertex","uniform","params","frame","width","height","seen","encoder","pass","t","items","first","instances","instanceRange","key"],"sources":["../../../../../charts/src/engine/renderers/webgpu.ts"],"sourcesContent":["// WebGPU backend: one instanced draw per series.\n\nimport type { ChartRendererKind } from \"../types\";\nimport { instanceRange } from \"./range\";\nimport { WGSL_AREA, WGSL_BAR, WGSL_LINE, WGSL_SCATTER } from \"./shaders\";\nimport {\n SCATTER_STRIDE,\n type ChartRenderer,\n type RenderFrame,\n type RenderItem,\n type RendererLostHandler,\n} from \"./types\";\n\n// lib.dom has the WebGPU interfaces but not these constant objects\nconst BUFFER_VERTEX = 0x20;\nconst BUFFER_UNIFORM = 0x40;\nconst BUFFER_COPY_DST = 0x08;\nconst STAGE_VERTEX = 0x1;\nconst STAGE_FRAGMENT = 0x2;\n\nconst UNIFORM_SIZE = 64;\n\ninterface ItemResources {\n version: number;\n kind: RenderItem[\"kind\"];\n vertex: GPUBuffer | null;\n uniform: GPUBuffer;\n bindGroup: GPUBindGroup;\n}\n\ntype GpuNavigator = Navigator & { gpu?: GPU };\n\n/** Whether `navigator.gpu` exists (an adapter may still be unavailable) */\nexport const hasWebGpu = (): boolean =>\n typeof navigator !== \"undefined\" && !!(navigator as GpuNavigator).gpu;\n\nexport const createWebGpuRenderer = async (\n canvas: HTMLCanvasElement,\n onLost: RendererLostHandler,\n /** Refuses fallback (software) adapters */\n requireHardware = false,\n): Promise<ChartRenderer | null> => {\n const gpu = (navigator as GpuNavigator).gpu;\n if (!gpu) return null;\n const adapter = await gpu.requestAdapter();\n if (!adapter) return null;\n const fallback = adapter as GPUAdapter & {\n isFallbackAdapter?: boolean;\n info?: { isFallbackAdapter?: boolean };\n };\n if (\n requireHardware &&\n (fallback.info?.isFallbackAdapter || fallback.isFallbackAdapter)\n ) {\n return null;\n }\n const device = await adapter.requestDevice();\n const context = canvas.getContext(\"webgpu\") as GPUCanvasContext | null;\n if (!context) {\n device.destroy();\n return null;\n }\n const format = gpu.getPreferredCanvasFormat();\n context.configure({ device, format, alphaMode: \"premultiplied\" });\n\n let destroyed = false;\n void device.lost.then(() => {\n if (!destroyed) onLost();\n });\n\n const bindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: STAGE_VERTEX | STAGE_FRAGMENT,\n buffer: { type: \"uniform\" },\n },\n ],\n });\n const layout = device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout],\n });\n const blend: GPUBlendState = {\n color: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n alpha: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n };\n const pipeline = (code: string, buffers: GPUVertexBufferLayout[]) => {\n const module = device.createShaderModule({ code });\n return device.createRenderPipeline({\n layout,\n vertex: { module, entryPoint: \"vs\", buffers },\n fragment: {\n module,\n entryPoint: \"fs\",\n targets: [{ format, blend }],\n },\n primitive: { topology: \"triangle-strip\" },\n });\n };\n const segment: GPUVertexBufferLayout[] = [\n {\n arrayStride: 8,\n stepMode: \"instance\",\n attributes: [{ shaderLocation: 0, offset: 0, format: \"float32x2\" }],\n },\n {\n arrayStride: 8,\n stepMode: \"instance\",\n attributes: [{ shaderLocation: 1, offset: 0, format: \"float32x2\" }],\n },\n ];\n const pipelines = {\n line: pipeline(WGSL_LINE, segment),\n area: pipeline(WGSL_AREA, segment),\n bar: pipeline(WGSL_BAR, [\n {\n arrayStride: 12,\n stepMode: \"instance\",\n attributes: [{ shaderLocation: 0, offset: 0, format: \"float32x3\" }],\n },\n ]),\n scatter: pipeline(WGSL_SCATTER, [\n {\n arrayStride: SCATTER_STRIDE,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x2\" },\n { shaderLocation: 1, offset: 8, format: \"float32\" },\n { shaderLocation: 2, offset: 12, format: \"unorm8x4\" },\n ],\n },\n ]),\n };\n\n const resources = new Map<string, ItemResources>();\n const uniformData = new Float32Array(UNIFORM_SIZE / 4);\n\n const vertexData = (item: RenderItem): ArrayBuffer | Float32Array => {\n switch (item.kind) {\n case \"line\":\n case \"area\":\n return item.points.subarray(0, item.count * 2);\n case \"bar\":\n return item.instances.subarray(0, item.count * 3);\n default:\n return item.instances;\n }\n };\n\n const upload = (item: RenderItem): ItemResources => {\n let res = resources.get(item.key);\n if (res && res.version === item.version && res.kind === item.kind) {\n return res;\n }\n res?.vertex?.destroy();\n const data = vertexData(item);\n const size = Math.max(16, Math.ceil(data.byteLength / 4) * 4);\n const vertex =\n data.byteLength > 0\n ? device.createBuffer({ size, usage: BUFFER_VERTEX | BUFFER_COPY_DST })\n : null;\n if (vertex) {\n if (data instanceof Float32Array) {\n device.queue.writeBuffer(\n vertex,\n 0,\n data.buffer,\n data.byteOffset,\n data.byteLength,\n );\n } else {\n device.queue.writeBuffer(vertex, 0, data);\n }\n }\n if (!res) {\n const uniform = device.createBuffer({\n size: UNIFORM_SIZE,\n usage: BUFFER_UNIFORM | BUFFER_COPY_DST,\n });\n res = {\n version: item.version,\n kind: item.kind,\n vertex,\n uniform,\n bindGroup: device.createBindGroup({\n layout: bindGroupLayout,\n entries: [{ binding: 0, resource: { buffer: uniform } }],\n }),\n };\n resources.set(item.key, res);\n } else {\n res.version = item.version;\n res.kind = item.kind;\n res.vertex = vertex;\n }\n return res;\n };\n\n const params = (item: RenderItem, frame: RenderFrame): number[] => {\n switch (item.kind) {\n case \"line\":\n return [(item.width * frame.dpr) / 2, 0, 0, 0];\n case \"area\":\n return [item.baseline, item.opacity, 0, 0];\n case \"bar\":\n return [item.halfWidth, item.radius, 0, 0];\n default:\n return [item.opacity, item.stroke, 0, 0];\n }\n };\n\n const renderer: ChartRenderer = {\n kind: \"webgpu\" satisfies ChartRendererKind,\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n if (destroyed) return;\n const seen = new Set<string>();\n const encoder = device.createCommandEncoder();\n const pass = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: context.getCurrentTexture().createView(),\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n const t = frame.transform;\n for (const item of items) {\n seen.add(item.key);\n const [first, instances] = instanceRange(item, frame);\n if (instances <= 0) continue;\n const res = upload(item);\n if (!res.vertex) continue;\n uniformData.set(\n [\n t.xScale,\n t.xOffset,\n t.yScale,\n t.yOffset,\n frame.width,\n frame.height,\n frame.dpr,\n 0,\n ...item.color,\n ...params(item, frame),\n ],\n 0,\n );\n device.queue.writeBuffer(res.uniform, 0, uniformData);\n pass.setPipeline(pipelines[item.kind]);\n pass.setBindGroup(0, res.bindGroup);\n pass.setVertexBuffer(0, res.vertex);\n if (item.kind === \"line\" || item.kind === \"area\") {\n pass.setVertexBuffer(1, res.vertex, 8);\n }\n pass.draw(4, instances, 0, first);\n }\n pass.end();\n device.queue.submit([encoder.finish()]);\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n res.vertex?.destroy();\n res.uniform.destroy();\n resources.delete(key);\n }\n }\n },\n destroy() {\n destroyed = true;\n for (const res of resources.values()) {\n res.vertex?.destroy();\n res.uniform.destroy();\n }\n resources.clear();\n context.unconfigure();\n device.destroy();\n },\n };\n return renderer;\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var e=Math.sqrt(50),t=Math.sqrt(10),n=Math.sqrt(2),r=(r,i,a)=>{let o=Math.abs(i-r);if(!(o>0)||!Number.isFinite(o))return 0;let s=o/Math.max(1,a),c=10**Math.floor(Math.log10(s)),l=s/c;return(l>=e?10:l>=t?5:l>=n?2:1)*c},i=(e,t)=>{let n=Math.max(0,-Math.floor(Math.log10(t))+1);return n>0&&n<20?+e.toFixed(n):e},a=(e,t,n)=>{e>t&&([e,t]=[t,e]);let a=r(e,t,n);if(!a)return Number.isFinite(e)?[e]:[];let o=Math.ceil(e/a-1e-9),s=Math.floor(t/a+1e-9),c=[];for(let e=o;e<=s&&c.length<1e3;e++)c.push(i(e*a,a));return c},o=(e,t,n)=>{e>t&&([e,t]=[t,e]);let a=r(e,t,n);for(let o=0;o<3&&a;o++){let o=Math.floor(e/a)*a,s=Math.ceil(t/a)*a;e=i(o,a),t=i(s,a);let c=r(e,t,n);if(c===a)break;a=c}return[e,t]},s=(e,t,n=[0,1])=>{if(!Number.isFinite(e)||!Number.isFinite(t))return n;if(e>t&&([e,t]=[t,e]),t-e>0)return[e,t];let r=e===0?1:Math.abs(e)*.1;return[e-r,t+r]},c=e=>e>0&&Number.isFinite(e)?Math.min(12,Math.max(0,-Math.floor(Math.log10(e)+1e-9))):0;exports.ensureSpan=s,exports.linearTicks=a,exports.niceDomain=o,exports.stepDecimals=c,exports.tickStep=r;
|
|
2
|
+
//# sourceMappingURL=scale.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scale.cjs","names":["E10","E5","E2","tickStep","span","max","min","raw","count","base","error","roundTo","decimals","step","value","linearTicks","start","end","ticks","i","niceDomain","nextMin","nextMax","next","ensureSpan","fallback","pad","stepDecimals"],"sources":["../../../../charts/src/engine/scale.ts"],"sourcesContent":["// Numeric ticks and ranges.\n\nconst E10 = Math.sqrt(50);\nconst E5 = Math.sqrt(10);\nconst E2 = Math.sqrt(2);\n\n/** Tick step close to `(max - min) / count`, of the form 1, 2 or 5 × 10^k */\nexport const tickStep = (min: number, max: number, count: number): number => {\n const span = Math.abs(max - min);\n if (!(span > 0) || !Number.isFinite(span)) return 0;\n const raw = span / Math.max(1, count);\n const power = Math.floor(Math.log10(raw));\n const base = 10 ** power;\n const error = raw / base;\n const factor = error >= E10 ? 10 : error >= E5 ? 5 : error >= E2 ? 2 : 1;\n return factor * base;\n};\n\n/** Rounds a value computed from a step (avoids 0.30000000000000004) */\nconst roundTo = (value: number, step: number): number => {\n const decimals = Math.max(0, -Math.floor(Math.log10(step)) + 1);\n return decimals > 0 && decimals < 20 ? +value.toFixed(decimals) : value;\n};\n\n/** Tick values inside [min, max] */\nexport const linearTicks = (\n min: number,\n max: number,\n count: number,\n): number[] => {\n if (min > max) [min, max] = [max, min];\n const step = tickStep(min, max, count);\n if (!step) return Number.isFinite(min) ? [min] : [];\n const start = Math.ceil(min / step - 1e-9);\n const end = Math.floor(max / step + 1e-9);\n const ticks: number[] = [];\n // Guard against pathological ranges\n for (let i = start; i <= end && ticks.length < 1000; i++) {\n ticks.push(roundTo(i * step, step));\n }\n return ticks;\n};\n\n/** Extends [min, max] to tick boundaries */\nexport const niceDomain = (\n min: number,\n max: number,\n count: number,\n): [number, number] => {\n if (min > max) [min, max] = [max, min];\n let step = tickStep(min, max, count);\n for (let i = 0; i < 3 && step; i++) {\n const nextMin = Math.floor(min / step) * step;\n const nextMax = Math.ceil(max / step) * step;\n min = roundTo(nextMin, step);\n max = roundTo(nextMax, step);\n const next = tickStep(min, max, count);\n if (next === step) break;\n step = next;\n }\n return [min, max];\n};\n\n/**\n * Range covering [min, max] with a usable span: a single value (or no data)\n * becomes a small range around it.\n */\nexport const ensureSpan = (\n min: number,\n max: number,\n fallback: [number, number] = [0, 1],\n): [number, number] => {\n if (!Number.isFinite(min) || !Number.isFinite(max)) return fallback;\n if (min > max) [min, max] = [max, min];\n if (max - min > 0) return [min, max];\n const pad = min === 0 ? 1 : Math.abs(min) * 0.1;\n return [min - pad, max + pad];\n};\n\n/** Number of decimals that keeps ticks distinct for a step */\nexport const stepDecimals = (step: number): number =>\n step > 0 && Number.isFinite(step)\n ? Math.min(12, Math.max(0, -Math.floor(Math.log10(step) + 1e-9)))\n : 0;\n"],"mappings":"AAEA,IAAMA,EAAM,KAAK,KAAK,EAAE,EAClBC,EAAK,KAAK,KAAK,EAAE,EACjBC,EAAK,KAAK,KAAK,CAAC,EAGTC,GAAY,EAAa,EAAa,IAA0B,CAC3E,IAAMC,EAAO,KAAK,IAAIC,EAAMC,CAAG,EAC/B,GAAI,EAAEF,EAAO,IAAM,CAAC,OAAO,SAASA,CAAI,EAAG,MAAO,GAClD,IAAMG,EAAMH,EAAO,KAAK,IAAI,EAAGI,CAAK,EAE9BC,EAAO,IADC,KAAK,MAAM,KAAK,MAAMF,CAAG,CACpB,EACbG,EAAQH,EAAME,EAEpB,OADeC,GAASV,EAAM,GAAKU,GAAST,EAAK,EAAIS,GAASR,EAAK,EAAI,GACvDO,CAClB,EAGME,GAAW,EAAe,IAAyB,CACvD,IAAMC,EAAW,KAAK,IAAI,EAAG,CAAC,KAAK,MAAM,KAAK,MAAMC,CAAI,CAAC,EAAI,CAAC,EAC9D,OAAOD,EAAW,GAAKA,EAAW,GAAK,CAACE,EAAM,QAAQF,CAAQ,EAAIE,CACpE,EAGaC,GACX,EACA,EACA,IACa,CACTT,EAAMD,IAAK,CAACC,EAAKD,GAAO,CAACA,EAAKC,CAAG,GACrC,IAAMO,EAAOV,EAASG,EAAKD,EAAKG,CAAK,EACrC,GAAI,CAACK,EAAM,OAAO,OAAO,SAASP,CAAG,EAAI,CAACA,CAAG,EAAI,CAAC,EAClD,IAAMU,EAAQ,KAAK,KAAKV,EAAMO,EAAO,IAAI,EACnCI,EAAM,KAAK,MAAMZ,EAAMQ,EAAO,IAAI,EAClCK,EAAkB,CAAC,EAEzB,IAAK,IAAIC,EAAIH,EAAOG,GAAKF,GAAOC,EAAM,OAAS,IAAM,IACnDA,EAAM,KAAKP,EAAQQ,EAAIN,EAAMA,CAAI,CAAC,EAEpC,OAAOK,CACT,EAGaE,GACX,EACA,EACA,IACqB,CACjBd,EAAMD,IAAK,CAACC,EAAKD,GAAO,CAACA,EAAKC,CAAG,GACrC,IAAIO,EAAOV,EAASG,EAAKD,EAAKG,CAAK,EACnC,IAAK,IAAIW,EAAI,EAAGA,EAAI,GAAKN,EAAM,IAAK,CAClC,IAAMQ,EAAU,KAAK,MAAMf,EAAMO,CAAI,EAAIA,EACnCS,EAAU,KAAK,KAAKjB,EAAMQ,CAAI,EAAIA,EACxC,EAAMF,EAAQU,EAASR,CAAI,EAC3B,EAAMF,EAAQW,EAAST,CAAI,EAC3B,IAAMU,EAAOpB,EAASG,EAAKD,EAAKG,CAAK,EACrC,GAAIe,IAASV,EAAM,MACnB,EAAOU,CACT,CACA,MAAO,CAACjB,EAAKD,CAAG,CAClB,EAMamB,GACX,EACA,EACA,EAA6B,CAAC,EAAG,CAAC,IACb,CACrB,GAAI,CAAC,OAAO,SAASlB,CAAG,GAAK,CAAC,OAAO,SAASD,CAAG,EAAG,OAAOoB,EAE3D,GADInB,EAAMD,IAAK,CAACC,EAAKD,GAAO,CAACA,EAAKC,CAAG,GACjCD,EAAMC,EAAM,EAAG,MAAO,CAACA,EAAKD,CAAG,EACnC,IAAMqB,EAAMpB,IAAQ,EAAI,EAAI,KAAK,IAAIA,CAAG,EAAI,GAC5C,MAAO,CAACA,EAAMoB,EAAKrB,EAAMqB,CAAG,CAC9B,EAGaC,EAAgB,GAC3Bd,EAAO,GAAK,OAAO,SAASA,CAAI,EAC5B,KAAK,IAAI,GAAI,KAAK,IAAI,EAAG,CAAC,KAAK,MAAM,KAAK,MAAMA,CAAI,EAAI,IAAI,CAAC,CAAC,EAC9D"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Tick step close to `(max - min) / count`, of the form 1, 2 or 5 × 10^k */
|
|
2
|
+
export declare const tickStep: (min: number, max: number, count: number) => number;
|
|
3
|
+
/** Tick values inside [min, max] */
|
|
4
|
+
export declare const linearTicks: (min: number, max: number, count: number) => number[];
|
|
5
|
+
/** Extends [min, max] to tick boundaries */
|
|
6
|
+
export declare const niceDomain: (min: number, max: number, count: number) => [number, number];
|
|
7
|
+
/**
|
|
8
|
+
* Range covering [min, max] with a usable span: a single value (or no data)
|
|
9
|
+
* becomes a small range around it.
|
|
10
|
+
*/
|
|
11
|
+
export declare const ensureSpan: (min: number, max: number, fallback?: [number, number]) => [number, number];
|
|
12
|
+
/** Number of decimals that keeps ticks distinct for a step */
|
|
13
|
+
export declare const stepDecimals: (step: number) => number;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Tick step close to `(max - min) / count`, of the form 1, 2 or 5 × 10^k */
|
|
2
|
+
export declare const tickStep: (min: number, max: number, count: number) => number;
|
|
3
|
+
/** Tick values inside [min, max] */
|
|
4
|
+
export declare const linearTicks: (min: number, max: number, count: number) => number[];
|
|
5
|
+
/** Extends [min, max] to tick boundaries */
|
|
6
|
+
export declare const niceDomain: (min: number, max: number, count: number) => [number, number];
|
|
7
|
+
/**
|
|
8
|
+
* Range covering [min, max] with a usable span: a single value (or no data)
|
|
9
|
+
* becomes a small range around it.
|
|
10
|
+
*/
|
|
11
|
+
export declare const ensureSpan: (min: number, max: number, fallback?: [number, number]) => [number, number];
|
|
12
|
+
/** Number of decimals that keeps ticks distinct for a step */
|
|
13
|
+
export declare const stepDecimals: (step: number) => number;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
//#region src/engine/scale.ts
|
|
2
|
+
var e = Math.sqrt(50), t = Math.sqrt(10), n = Math.sqrt(2), r = (r, i, a) => {
|
|
3
|
+
let o = Math.abs(i - r);
|
|
4
|
+
if (!(o > 0) || !Number.isFinite(o)) return 0;
|
|
5
|
+
let s = o / Math.max(1, a), c = 10 ** Math.floor(Math.log10(s)), l = s / c;
|
|
6
|
+
return (l >= e ? 10 : l >= t ? 5 : l >= n ? 2 : 1) * c;
|
|
7
|
+
}, i = (e, t) => {
|
|
8
|
+
let n = Math.max(0, -Math.floor(Math.log10(t)) + 1);
|
|
9
|
+
return n > 0 && n < 20 ? +e.toFixed(n) : e;
|
|
10
|
+
}, a = (e, t, n) => {
|
|
11
|
+
e > t && ([e, t] = [t, e]);
|
|
12
|
+
let a = r(e, t, n);
|
|
13
|
+
if (!a) return Number.isFinite(e) ? [e] : [];
|
|
14
|
+
let o = Math.ceil(e / a - 1e-9), s = Math.floor(t / a + 1e-9), c = [];
|
|
15
|
+
for (let e = o; e <= s && c.length < 1e3; e++) c.push(i(e * a, a));
|
|
16
|
+
return c;
|
|
17
|
+
}, o = (e, t, n) => {
|
|
18
|
+
e > t && ([e, t] = [t, e]);
|
|
19
|
+
let a = r(e, t, n);
|
|
20
|
+
for (let o = 0; o < 3 && a; o++) {
|
|
21
|
+
let o = Math.floor(e / a) * a, s = Math.ceil(t / a) * a;
|
|
22
|
+
e = i(o, a), t = i(s, a);
|
|
23
|
+
let c = r(e, t, n);
|
|
24
|
+
if (c === a) break;
|
|
25
|
+
a = c;
|
|
26
|
+
}
|
|
27
|
+
return [e, t];
|
|
28
|
+
}, s = (e, t, n = [0, 1]) => {
|
|
29
|
+
if (!Number.isFinite(e) || !Number.isFinite(t)) return n;
|
|
30
|
+
if (e > t && ([e, t] = [t, e]), t - e > 0) return [e, t];
|
|
31
|
+
let r = e === 0 ? 1 : Math.abs(e) * .1;
|
|
32
|
+
return [e - r, t + r];
|
|
33
|
+
}, c = (e) => e > 0 && Number.isFinite(e) ? Math.min(12, Math.max(0, -Math.floor(Math.log10(e) + 1e-9))) : 0;
|
|
34
|
+
//#endregion
|
|
35
|
+
export { s as ensureSpan, a as linearTicks, o as niceDomain, c as stepDecimals, r as tickStep };
|
|
36
|
+
|
|
37
|
+
//# sourceMappingURL=scale.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scale.js","names":["E10","E5","E2","tickStep","span","max","min","raw","count","base","error","roundTo","decimals","step","value","linearTicks","start","end","ticks","i","niceDomain","nextMin","nextMax","next","ensureSpan","fallback","pad","stepDecimals"],"sources":["../../../../charts/src/engine/scale.ts"],"sourcesContent":["// Numeric ticks and ranges.\n\nconst E10 = Math.sqrt(50);\nconst E5 = Math.sqrt(10);\nconst E2 = Math.sqrt(2);\n\n/** Tick step close to `(max - min) / count`, of the form 1, 2 or 5 × 10^k */\nexport const tickStep = (min: number, max: number, count: number): number => {\n const span = Math.abs(max - min);\n if (!(span > 0) || !Number.isFinite(span)) return 0;\n const raw = span / Math.max(1, count);\n const power = Math.floor(Math.log10(raw));\n const base = 10 ** power;\n const error = raw / base;\n const factor = error >= E10 ? 10 : error >= E5 ? 5 : error >= E2 ? 2 : 1;\n return factor * base;\n};\n\n/** Rounds a value computed from a step (avoids 0.30000000000000004) */\nconst roundTo = (value: number, step: number): number => {\n const decimals = Math.max(0, -Math.floor(Math.log10(step)) + 1);\n return decimals > 0 && decimals < 20 ? +value.toFixed(decimals) : value;\n};\n\n/** Tick values inside [min, max] */\nexport const linearTicks = (\n min: number,\n max: number,\n count: number,\n): number[] => {\n if (min > max) [min, max] = [max, min];\n const step = tickStep(min, max, count);\n if (!step) return Number.isFinite(min) ? [min] : [];\n const start = Math.ceil(min / step - 1e-9);\n const end = Math.floor(max / step + 1e-9);\n const ticks: number[] = [];\n // Guard against pathological ranges\n for (let i = start; i <= end && ticks.length < 1000; i++) {\n ticks.push(roundTo(i * step, step));\n }\n return ticks;\n};\n\n/** Extends [min, max] to tick boundaries */\nexport const niceDomain = (\n min: number,\n max: number,\n count: number,\n): [number, number] => {\n if (min > max) [min, max] = [max, min];\n let step = tickStep(min, max, count);\n for (let i = 0; i < 3 && step; i++) {\n const nextMin = Math.floor(min / step) * step;\n const nextMax = Math.ceil(max / step) * step;\n min = roundTo(nextMin, step);\n max = roundTo(nextMax, step);\n const next = tickStep(min, max, count);\n if (next === step) break;\n step = next;\n }\n return [min, max];\n};\n\n/**\n * Range covering [min, max] with a usable span: a single value (or no data)\n * becomes a small range around it.\n */\nexport const ensureSpan = (\n min: number,\n max: number,\n fallback: [number, number] = [0, 1],\n): [number, number] => {\n if (!Number.isFinite(min) || !Number.isFinite(max)) return fallback;\n if (min > max) [min, max] = [max, min];\n if (max - min > 0) return [min, max];\n const pad = min === 0 ? 1 : Math.abs(min) * 0.1;\n return [min - pad, max + pad];\n};\n\n/** Number of decimals that keeps ticks distinct for a step */\nexport const stepDecimals = (step: number): number =>\n step > 0 && Number.isFinite(step)\n ? Math.min(12, Math.max(0, -Math.floor(Math.log10(step) + 1e-9)))\n : 0;\n"],"mappings":";AAEA,IAAMA,IAAM,KAAK,KAAK,EAAE,GAClBC,IAAK,KAAK,KAAK,EAAE,GACjBC,IAAK,KAAK,KAAK,CAAC,GAGTC,KAAY,GAAa,GAAa,MAA0B;CAC3E,IAAMC,IAAO,KAAK,IAAIC,IAAMC,CAAG;CAC/B,IAAI,EAAEF,IAAO,MAAM,CAAC,OAAO,SAASA,CAAI,GAAG,OAAO;CAClD,IAAMG,IAAMH,IAAO,KAAK,IAAI,GAAGI,CAAK,GAE9BC,IAAO,MADC,KAAK,MAAM,KAAK,MAAMF,CAAG,CACpB,GACbG,IAAQH,IAAME;CAEpB,QADeC,KAASV,IAAM,KAAKU,KAAST,IAAK,IAAIS,KAASR,IAAK,IAAI,KACvDO;AAClB,GAGME,KAAW,GAAe,MAAyB;CACvD,IAAMC,IAAW,KAAK,IAAI,GAAG,CAAC,KAAK,MAAM,KAAK,MAAMC,CAAI,CAAC,IAAI,CAAC;CAC9D,OAAOD,IAAW,KAAKA,IAAW,KAAK,CAACE,EAAM,QAAQF,CAAQ,IAAIE;AACpE,GAGaC,KACX,GACA,GACA,MACa;CACb,AAAIT,IAAMD,MAAK,CAACC,GAAKD,KAAO,CAACA,GAAKC,CAAG;CACrC,IAAMO,IAAOV,EAASG,GAAKD,GAAKG,CAAK;CACrC,IAAI,CAACK,GAAM,OAAO,OAAO,SAASP,CAAG,IAAI,CAACA,CAAG,IAAI,CAAC;CAClD,IAAMU,IAAQ,KAAK,KAAKV,IAAMO,IAAO,IAAI,GACnCI,IAAM,KAAK,MAAMZ,IAAMQ,IAAO,IAAI,GAClCK,IAAkB,CAAC;CAEzB,KAAK,IAAIC,IAAIH,GAAOG,KAAKF,KAAOC,EAAM,SAAS,KAAM,KACnD,EAAM,KAAKP,EAAQQ,IAAIN,GAAMA,CAAI,CAAC;CAEpC,OAAOK;AACT,GAGaE,KACX,GACA,GACA,MACqB;CACrB,AAAId,IAAMD,MAAK,CAACC,GAAKD,KAAO,CAACA,GAAKC,CAAG;CACrC,IAAIO,IAAOV,EAASG,GAAKD,GAAKG,CAAK;CACnC,KAAK,IAAIW,IAAI,GAAGA,IAAI,KAAKN,GAAM,KAAK;EAClC,IAAMQ,IAAU,KAAK,MAAMf,IAAMO,CAAI,IAAIA,GACnCS,IAAU,KAAK,KAAKjB,IAAMQ,CAAI,IAAIA;EAExC,AADA,IAAMF,EAAQU,GAASR,CAAI,GAC3B,IAAMF,EAAQW,GAAST,CAAI;EAC3B,IAAMU,IAAOpB,EAASG,GAAKD,GAAKG,CAAK;EACrC,IAAIe,MAASV,GAAM;EACnB,IAAOU;CACT;CACA,OAAO,CAACjB,GAAKD,CAAG;AAClB,GAMamB,KACX,GACA,GACA,IAA6B,CAAC,GAAG,CAAC,MACb;CACrB,IAAI,CAAC,OAAO,SAASlB,CAAG,KAAK,CAAC,OAAO,SAASD,CAAG,GAAG,OAAOoB;CAE3D,IADInB,IAAMD,MAAK,CAACC,GAAKD,KAAO,CAACA,GAAKC,CAAG,IACjCD,IAAMC,IAAM,GAAG,OAAO,CAACA,GAAKD,CAAG;CACnC,IAAMqB,IAAMpB,MAAQ,IAAI,IAAI,KAAK,IAAIA,CAAG,IAAI;CAC5C,OAAO,CAACA,IAAMoB,GAAKrB,IAAMqB,CAAG;AAC9B,GAGaC,KAAgB,MAC3Bd,IAAO,KAAK,OAAO,SAASA,CAAI,IAC5B,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,CAAC,KAAK,MAAM,KAAK,MAAMA,CAAI,IAAI,IAAI,CAAC,CAAC,IAC9D"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var e=class{constructor(e,t,n,r=4){let i=1/0,a=-1/0,o=1/0,s=-1/0,c=0;for(let r=0;r<n;r++){let n=e[r],l=t[r];Number.isFinite(n)&&Number.isFinite(l)&&(c++,n<i&&(i=n),n>a&&(a=n),l<o&&(o=l),l>s&&(s=l))}let l=Math.min(1024,Math.max(1,Math.ceil(Math.sqrt(c/r))));this.cols=l,this.rows=l,this.x0=c?i:0,this.y0=c?o:0,this.cellW=c&&a>i?(a-i)/l:1,this.cellH=c&&s>o?(s-o)/l:1;let u=new Int32Array(n),d=new Uint32Array(l*l+1);for(let r=0;r<n;r++){let n=e[r],i=t[r];if(!Number.isFinite(n)||!Number.isFinite(i)){u[r]=-1;continue}let a=this.cellOf(n,i);u[r]=a,d[a+1]++}for(let e=1;e<d.length;e++)d[e]+=d[e-1];this.starts=d.slice();let f=d;this.order=new Uint32Array(c);for(let e=0;e<n;e++){let t=u[e];t>=0&&(this.order[f[t]++]=e)}}column(e){let t=Math.floor((e-this.x0)/this.cellW);return t<0?0:t>=this.cols?this.cols-1:t}row(e){let t=Math.floor((e-this.y0)/this.cellH);return t<0?0:t>=this.rows?this.rows-1:t}cellOf(e,t){return this.row(t)*this.cols+this.column(e)}query(e,t,n,r,i){if(this.order.length===0)return;let a=this.column(Math.min(e,t)),o=this.column(Math.max(e,t)),s=this.row(Math.min(n,r)),c=this.row(Math.max(n,r));for(let e=s;e<=c;e++)for(let t=a;t<=o;t++){let n=e*this.cols+t;for(let e=this.starts[n];e<this.starts[n+1];e++)i(this.order[e])}}};exports.GridIndex=e;
|
|
2
|
+
//# sourceMappingURL=spatial.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spatial.cjs","names":["GridIndex","xMin","xMax","yMin","yMax","valid","i","count","xi","x","yi","y","side","pointsPerCell","cells","counts","cell","c","cursor","r","c0","c1","r0","r1","k","visit"],"sources":["../../../../charts/src/engine/spatial.ts"],"sourcesContent":["// Uniform grid index of scattered points: hit testing among millions of\n// points only looks at the cells around the pointer.\n\nexport class GridIndex {\n readonly cols: number;\n readonly rows: number;\n private readonly x0: number;\n private readonly y0: number;\n private readonly cellW: number;\n private readonly cellH: number;\n /** Start of each cell in `order` (length cols * rows + 1) */\n private readonly starts: Uint32Array;\n /** Point indices grouped by cell */\n private readonly order: Uint32Array;\n\n constructor(\n x: ArrayLike<number>,\n y: ArrayLike<number>,\n count: number,\n pointsPerCell = 4,\n ) {\n let xMin = Infinity;\n let xMax = -Infinity;\n let yMin = Infinity;\n let yMax = -Infinity;\n let valid = 0;\n for (let i = 0; i < count; i++) {\n const xi = x[i];\n const yi = y[i];\n if (!Number.isFinite(xi) || !Number.isFinite(yi)) continue;\n valid++;\n if (xi < xMin) xMin = xi;\n if (xi > xMax) xMax = xi;\n if (yi < yMin) yMin = yi;\n if (yi > yMax) yMax = yi;\n }\n const side = Math.min(\n 1024,\n Math.max(1, Math.ceil(Math.sqrt(valid / pointsPerCell))),\n );\n this.cols = side;\n this.rows = side;\n this.x0 = valid ? xMin : 0;\n this.y0 = valid ? yMin : 0;\n this.cellW = valid && xMax > xMin ? (xMax - xMin) / side : 1;\n this.cellH = valid && yMax > yMin ? (yMax - yMin) / side : 1;\n\n const cells = new Int32Array(count);\n const counts = new Uint32Array(side * side + 1);\n for (let i = 0; i < count; i++) {\n const xi = x[i];\n const yi = y[i];\n if (!Number.isFinite(xi) || !Number.isFinite(yi)) {\n cells[i] = -1;\n continue;\n }\n const cell = this.cellOf(xi, yi);\n cells[i] = cell;\n counts[cell + 1]++;\n }\n for (let c = 1; c < counts.length; c++) counts[c] += counts[c - 1];\n this.starts = counts.slice();\n const cursor = counts;\n this.order = new Uint32Array(valid);\n for (let i = 0; i < count; i++) {\n const cell = cells[i];\n if (cell >= 0) this.order[cursor[cell]++] = i;\n }\n }\n\n private column(xi: number) {\n const c = Math.floor((xi - this.x0) / this.cellW);\n return c < 0 ? 0 : c >= this.cols ? this.cols - 1 : c;\n }\n\n private row(yi: number) {\n const r = Math.floor((yi - this.y0) / this.cellH);\n return r < 0 ? 0 : r >= this.rows ? this.rows - 1 : r;\n }\n\n private cellOf(xi: number, yi: number) {\n return this.row(yi) * this.cols + this.column(xi);\n }\n\n /** Calls `visit` with every point that may lie inside the box */\n query(\n xMin: number,\n xMax: number,\n yMin: number,\n yMax: number,\n visit: (index: number) => void,\n ): void {\n if (this.order.length === 0) return;\n const c0 = this.column(Math.min(xMin, xMax));\n const c1 = this.column(Math.max(xMin, xMax));\n const r0 = this.row(Math.min(yMin, yMax));\n const r1 = this.row(Math.max(yMin, yMax));\n for (let r = r0; r <= r1; r++) {\n for (let c = c0; c <= c1; c++) {\n const cell = r * this.cols + c;\n for (let k = this.starts[cell]; k < this.starts[cell + 1]; k++) {\n visit(this.order[k]);\n }\n }\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare class GridIndex {
|
|
2
|
+
readonly cols: number;
|
|
3
|
+
readonly rows: number;
|
|
4
|
+
private readonly x0;
|
|
5
|
+
private readonly y0;
|
|
6
|
+
private readonly cellW;
|
|
7
|
+
private readonly cellH;
|
|
8
|
+
/** Start of each cell in `order` (length cols * rows + 1) */
|
|
9
|
+
private readonly starts;
|
|
10
|
+
/** Point indices grouped by cell */
|
|
11
|
+
private readonly order;
|
|
12
|
+
constructor(x: ArrayLike<number>, y: ArrayLike<number>, count: number, pointsPerCell?: number);
|
|
13
|
+
private column;
|
|
14
|
+
private row;
|
|
15
|
+
private cellOf;
|
|
16
|
+
/** Calls `visit` with every point that may lie inside the box */
|
|
17
|
+
query(xMin: number, xMax: number, yMin: number, yMax: number, visit: (index: number) => void): void;
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare class GridIndex {
|
|
2
|
+
readonly cols: number;
|
|
3
|
+
readonly rows: number;
|
|
4
|
+
private readonly x0;
|
|
5
|
+
private readonly y0;
|
|
6
|
+
private readonly cellW;
|
|
7
|
+
private readonly cellH;
|
|
8
|
+
/** Start of each cell in `order` (length cols * rows + 1) */
|
|
9
|
+
private readonly starts;
|
|
10
|
+
/** Point indices grouped by cell */
|
|
11
|
+
private readonly order;
|
|
12
|
+
constructor(x: ArrayLike<number>, y: ArrayLike<number>, count: number, pointsPerCell?: number);
|
|
13
|
+
private column;
|
|
14
|
+
private row;
|
|
15
|
+
private cellOf;
|
|
16
|
+
/** Calls `visit` with every point that may lie inside the box */
|
|
17
|
+
query(xMin: number, xMax: number, yMin: number, yMax: number, visit: (index: number) => void): void;
|
|
18
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
//#region src/engine/spatial.ts
|
|
2
|
+
var e = class {
|
|
3
|
+
constructor(e, t, n, r = 4) {
|
|
4
|
+
let i = Infinity, a = -Infinity, o = Infinity, s = -Infinity, c = 0;
|
|
5
|
+
for (let r = 0; r < n; r++) {
|
|
6
|
+
let n = e[r], l = t[r];
|
|
7
|
+
Number.isFinite(n) && Number.isFinite(l) && (c++, n < i && (i = n), n > a && (a = n), l < o && (o = l), l > s && (s = l));
|
|
8
|
+
}
|
|
9
|
+
let l = Math.min(1024, Math.max(1, Math.ceil(Math.sqrt(c / r))));
|
|
10
|
+
this.cols = l, this.rows = l, this.x0 = c ? i : 0, this.y0 = c ? o : 0, this.cellW = c && a > i ? (a - i) / l : 1, this.cellH = c && s > o ? (s - o) / l : 1;
|
|
11
|
+
let u = new Int32Array(n), d = new Uint32Array(l * l + 1);
|
|
12
|
+
for (let r = 0; r < n; r++) {
|
|
13
|
+
let n = e[r], i = t[r];
|
|
14
|
+
if (!Number.isFinite(n) || !Number.isFinite(i)) {
|
|
15
|
+
u[r] = -1;
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
let a = this.cellOf(n, i);
|
|
19
|
+
u[r] = a, d[a + 1]++;
|
|
20
|
+
}
|
|
21
|
+
for (let e = 1; e < d.length; e++) d[e] += d[e - 1];
|
|
22
|
+
this.starts = d.slice();
|
|
23
|
+
let f = d;
|
|
24
|
+
this.order = new Uint32Array(c);
|
|
25
|
+
for (let e = 0; e < n; e++) {
|
|
26
|
+
let t = u[e];
|
|
27
|
+
t >= 0 && (this.order[f[t]++] = e);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
column(e) {
|
|
31
|
+
let t = Math.floor((e - this.x0) / this.cellW);
|
|
32
|
+
return t < 0 ? 0 : t >= this.cols ? this.cols - 1 : t;
|
|
33
|
+
}
|
|
34
|
+
row(e) {
|
|
35
|
+
let t = Math.floor((e - this.y0) / this.cellH);
|
|
36
|
+
return t < 0 ? 0 : t >= this.rows ? this.rows - 1 : t;
|
|
37
|
+
}
|
|
38
|
+
cellOf(e, t) {
|
|
39
|
+
return this.row(t) * this.cols + this.column(e);
|
|
40
|
+
}
|
|
41
|
+
query(e, t, n, r, i) {
|
|
42
|
+
if (this.order.length === 0) return;
|
|
43
|
+
let a = this.column(Math.min(e, t)), o = this.column(Math.max(e, t)), s = this.row(Math.min(n, r)), c = this.row(Math.max(n, r));
|
|
44
|
+
for (let e = s; e <= c; e++) for (let t = a; t <= o; t++) {
|
|
45
|
+
let n = e * this.cols + t;
|
|
46
|
+
for (let e = this.starts[n]; e < this.starts[n + 1]; e++) i(this.order[e]);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
//#endregion
|
|
51
|
+
export { e as GridIndex };
|
|
52
|
+
|
|
53
|
+
//# sourceMappingURL=spatial.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spatial.js","names":["GridIndex","xMin","xMax","yMin","yMax","valid","i","count","xi","x","yi","y","side","pointsPerCell","cells","counts","cell","c","cursor","r","c0","c1","r0","r1","k"],"sources":["../../../../charts/src/engine/spatial.ts"],"sourcesContent":["// Uniform grid index of scattered points: hit testing among millions of\n// points only looks at the cells around the pointer.\n\nexport class GridIndex {\n readonly cols: number;\n readonly rows: number;\n private readonly x0: number;\n private readonly y0: number;\n private readonly cellW: number;\n private readonly cellH: number;\n /** Start of each cell in `order` (length cols * rows + 1) */\n private readonly starts: Uint32Array;\n /** Point indices grouped by cell */\n private readonly order: Uint32Array;\n\n constructor(\n x: ArrayLike<number>,\n y: ArrayLike<number>,\n count: number,\n pointsPerCell = 4,\n ) {\n let xMin = Infinity;\n let xMax = -Infinity;\n let yMin = Infinity;\n let yMax = -Infinity;\n let valid = 0;\n for (let i = 0; i < count; i++) {\n const xi = x[i];\n const yi = y[i];\n if (!Number.isFinite(xi) || !Number.isFinite(yi)) continue;\n valid++;\n if (xi < xMin) xMin = xi;\n if (xi > xMax) xMax = xi;\n if (yi < yMin) yMin = yi;\n if (yi > yMax) yMax = yi;\n }\n const side = Math.min(\n 1024,\n Math.max(1, Math.ceil(Math.sqrt(valid / pointsPerCell))),\n );\n this.cols = side;\n this.rows = side;\n this.x0 = valid ? xMin : 0;\n this.y0 = valid ? yMin : 0;\n this.cellW = valid && xMax > xMin ? (xMax - xMin) / side : 1;\n this.cellH = valid && yMax > yMin ? (yMax - yMin) / side : 1;\n\n const cells = new Int32Array(count);\n const counts = new Uint32Array(side * side + 1);\n for (let i = 0; i < count; i++) {\n const xi = x[i];\n const yi = y[i];\n if (!Number.isFinite(xi) || !Number.isFinite(yi)) {\n cells[i] = -1;\n continue;\n }\n const cell = this.cellOf(xi, yi);\n cells[i] = cell;\n counts[cell + 1]++;\n }\n for (let c = 1; c < counts.length; c++) counts[c] += counts[c - 1];\n this.starts = counts.slice();\n const cursor = counts;\n this.order = new Uint32Array(valid);\n for (let i = 0; i < count; i++) {\n const cell = cells[i];\n if (cell >= 0) this.order[cursor[cell]++] = i;\n }\n }\n\n private column(xi: number) {\n const c = Math.floor((xi - this.x0) / this.cellW);\n return c < 0 ? 0 : c >= this.cols ? this.cols - 1 : c;\n }\n\n private row(yi: number) {\n const r = Math.floor((yi - this.y0) / this.cellH);\n return r < 0 ? 0 : r >= this.rows ? this.rows - 1 : r;\n }\n\n private cellOf(xi: number, yi: number) {\n return this.row(yi) * this.cols + this.column(xi);\n }\n\n /** Calls `visit` with every point that may lie inside the box */\n query(\n xMin: number,\n xMax: number,\n yMin: number,\n yMax: number,\n visit: (index: number) => void,\n ): void {\n if (this.order.length === 0) return;\n const c0 = this.column(Math.min(xMin, xMax));\n const c1 = this.column(Math.max(xMin, xMax));\n const r0 = this.row(Math.min(yMin, yMax));\n const r1 = this.row(Math.max(yMin, yMax));\n for (let r = r0; r <= r1; r++) {\n for (let c = c0; c <= c1; c++) {\n const cell = r * this.cols + c;\n for (let k = this.starts[cell]; k < this.starts[cell + 1]; k++) {\n visit(this.order[k]);\n }\n }\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("./color.cjs");var t=[`#4f46e5`,`#10b981`,`#f59e0b`,`#ef4444`,`#0ea5e9`,`#8b5cf6`,`#14b8a6`,`#f97316`],n=(e,t)=>e?.getPropertyValue(t).trim()??``,r=(r,i)=>{let a=r&&typeof getComputedStyle==`function`?getComputedStyle(r):null,o=(t,i)=>{for(let i of t)if(n(a,i))return e.resolveColor(`var(${i})`,r);return e.resolveColor(i,r)},s=o([`--surface-color`,`--background-color`],`#ffffff`),c=o([`--text-color`],`#1f2937`),l=o([`--text-secondary-color`,`--text-muted-color`],`#6b7280`),u=o([`--border-color`],`#e5e7eb`),d;if(i&&i.length)d=i.map(t=>e.resolveColor(t,r));else{let i=[];for(let t=1;t<=8;t++){let o=`--chart-series-${t}`;n(a,o)&&i.push(e.resolveColor(`var(${o})`,r))}d=i.length?i:[...[`--primary-color`,`--success-color`,`--warning-color`,`--danger-color`,`--info-color`].map((i,o)=>n(a,i)?e.resolveColor(`var(${i})`,r):e.resolveColor(t[o],r)),...t.slice(5).map(t=>e.resolveColor(t,r))]}let f=n(a,`--font-family-sans`)||(a?.fontFamily??``)||`system-ui, -apple-system, 'Segoe UI', sans-serif`;return{palette:d,text:c,textMuted:l,grid:e.mix(s,u,.75),axis:u,background:s,surface:s,primary:d[0],fontFamily:f,fontSize:11}},i=e=>{if(typeof document>`u`)return()=>{};let t=[];if(typeof MutationObserver==`function`){let n=new MutationObserver(e);for(let e of[document.documentElement,document.body])e&&n.observe(e,{attributes:!0,attributeFilter:[`class`,`style`,`data-theme`,`data-mode`]});t.push(()=>n.disconnect())}if(typeof matchMedia==`function`){let n=matchMedia(`(prefers-color-scheme: dark)`);n.addEventListener?.(`change`,e),t.push(()=>n.removeEventListener?.(`change`,e))}return()=>t.forEach(e=>e())};exports.readTheme=r,exports.watchTheme=i;
|
|
2
|
+
//# sourceMappingURL=theme.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.cjs","names":["resolveColor","mix","require_color","DEFAULT_PALETTE","readVar","style","name","readTheme","element","color","names","fallback","background","text","textMuted","border","colors","palette","c","custom","i","fontFamily","watchTheme","cleanups","observer","onChange","node","query","fn"],"sources":["../../../../charts/src/engine/theme.ts"],"sourcesContent":["// Chart colors and fonts read from the Minerva CSS variables.\n\nimport { mix, resolveColor, type Rgba } from \"./color\";\n\nexport interface ChartTheme {\n palette: Rgba[];\n text: Rgba;\n textMuted: Rgba;\n grid: Rgba;\n axis: Rgba;\n background: Rgba;\n surface: Rgba;\n primary: Rgba;\n fontFamily: string;\n /** Tick label font size in CSS pixels */\n fontSize: number;\n}\n\n/** Used when no CSS variable is defined (e.g. without the Minerva stylesheet) */\nconst DEFAULT_PALETTE = [\n \"#4f46e5\",\n \"#10b981\",\n \"#f59e0b\",\n \"#ef4444\",\n \"#0ea5e9\",\n \"#8b5cf6\",\n \"#14b8a6\",\n \"#f97316\",\n];\n\nconst readVar = (style: CSSStyleDeclaration | null, name: string) =>\n style?.getPropertyValue(name).trim() ?? \"\";\n\n/** Reads the theme from the computed style of `element` */\nexport const readTheme = (\n element: Element | null,\n palette?: readonly string[],\n): ChartTheme => {\n const style =\n element && typeof getComputedStyle === \"function\"\n ? getComputedStyle(element)\n : null;\n const color = (names: string[], fallback: string): Rgba => {\n for (const name of names) {\n if (readVar(style, name)) return resolveColor(`var(${name})`, element);\n }\n return resolveColor(fallback, element);\n };\n\n const background = color(\n [\"--surface-color\", \"--background-color\"],\n \"#ffffff\",\n );\n const text = color([\"--text-color\"], \"#1f2937\");\n const textMuted = color(\n [\"--text-secondary-color\", \"--text-muted-color\"],\n \"#6b7280\",\n );\n const border = color([\"--border-color\"], \"#e5e7eb\");\n\n let colors: Rgba[];\n if (palette && palette.length) {\n colors = palette.map((c) => resolveColor(c, element));\n } else {\n const custom: Rgba[] = [];\n for (let i = 1; i <= 8; i++) {\n const name = `--chart-series-${i}`;\n if (readVar(style, name))\n custom.push(resolveColor(`var(${name})`, element));\n }\n if (custom.length) {\n colors = custom;\n } else {\n const themed = [\n \"--primary-color\",\n \"--success-color\",\n \"--warning-color\",\n \"--danger-color\",\n \"--info-color\",\n ].map((name, i) =>\n readVar(style, name)\n ? resolveColor(`var(${name})`, element)\n : resolveColor(DEFAULT_PALETTE[i], element),\n );\n colors = [\n ...themed,\n ...DEFAULT_PALETTE.slice(5).map((c) => resolveColor(c, element)),\n ];\n }\n }\n\n const fontFamily =\n readVar(style, \"--font-family-sans\") ||\n (style?.fontFamily ?? \"\") ||\n \"system-ui, -apple-system, 'Segoe UI', sans-serif\";\n\n return {\n palette: colors,\n text,\n textMuted,\n grid: mix(background, border, 0.75),\n axis: border,\n background,\n surface: background,\n primary: colors[0],\n fontFamily,\n fontSize: 11,\n };\n};\n\n/**\n * Calls `onChange` when the theme may have changed: attributes of `<html>` /\n * `<body>` (class, style, data-theme) and the color scheme.\n */\nexport const watchTheme = (onChange: () => void): (() => void) => {\n if (typeof document === \"undefined\") return () => {};\n const cleanups: (() => void)[] = [];\n if (typeof MutationObserver === \"function\") {\n const observer = new MutationObserver(onChange);\n for (const node of [document.documentElement, document.body]) {\n if (node) {\n observer.observe(node, {\n attributes: true,\n attributeFilter: [\"class\", \"style\", \"data-theme\", \"data-mode\"],\n });\n }\n }\n cleanups.push(() => observer.disconnect());\n }\n if (typeof matchMedia === \"function\") {\n const query = matchMedia(\"(prefers-color-scheme: dark)\");\n query.addEventListener?.(\"change\", onChange);\n cleanups.push(() => query.removeEventListener?.(\"change\", onChange));\n }\n return () => cleanups.forEach((fn) => fn());\n};\n"],"mappings":"+BAmBA,IAAMG,EAAkB,CACtB,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SACF,EAEMC,GAAW,EAAmC,IAClDC,GAAO,iBAAiBC,CAAI,CAAC,CAAC,KAAK,GAAK,GAG7BC,GACX,EACA,IACe,CACf,IAAMF,EACJG,GAAW,OAAO,kBAAqB,WACnC,iBAAiBA,CAAO,EACxB,KACAC,GAAS,EAAiB,IAA2B,CACzD,IAAK,IAAMH,KAAQI,EACjB,GAAIN,EAAQC,EAAOC,CAAI,EAAG,OAAON,EAAAA,aAAa,OAAOM,EAAK,GAAIE,CAAO,EAEvE,OAAOR,EAAAA,aAAaW,EAAUH,CAAO,CACvC,EAEMI,EAAaH,EACjB,CAAC,kBAAmB,oBAAoB,EACxC,SACF,EACMI,EAAOJ,EAAM,CAAC,cAAc,EAAG,SAAS,EACxCK,EAAYL,EAChB,CAAC,yBAA0B,oBAAoB,EAC/C,SACF,EACMM,EAASN,EAAM,CAAC,gBAAgB,EAAG,SAAS,EAE9CO,EACJ,GAAIC,GAAWA,EAAQ,OACrB,EAASA,EAAQ,IAAK,GAAMjB,EAAAA,aAAakB,EAAGV,CAAO,CAAC,MAC/C,CACL,IAAMW,EAAiB,CAAC,EACxB,IAAK,IAAIC,EAAI,EAAGA,GAAK,EAAG,IAAK,CAC3B,IAAMd,EAAO,kBAAkBc,IAC3BhB,EAAQC,EAAOC,CAAI,GACrBa,EAAO,KAAKnB,EAAAA,aAAa,OAAOM,EAAK,GAAIE,CAAO,CAAC,CACrD,CACA,AAcEQ,EAdEG,EAAO,OACAA,EAaA,CACP,GAZa,CACb,kBACA,kBACA,kBACA,iBACA,cACF,CAAC,CAAC,KAAK,EAAM,IACXf,EAAQC,EAAOC,CAAI,EACfN,EAAAA,aAAa,OAAOM,EAAK,GAAIE,CAAO,EACpCR,EAAAA,aAAaG,EAAgBiB,GAAIZ,CAAO,CAGzC,EACH,GAAGL,EAAgB,MAAM,CAAC,CAAC,CAAC,IAAK,GAAMH,EAAAA,aAAakB,EAAGV,CAAO,CAAC,CACjE,CAEJ,CAEA,IAAMa,EACJjB,EAAQC,EAAO,oBAAoB,IAClCA,GAAO,YAAc,KACtB,mDAEF,MAAO,CACL,QAASW,EACT,OACA,YACA,KAAMf,EAAAA,IAAIW,EAAYG,EAAQ,GAAI,EAClC,KAAMA,EACN,aACA,QAASH,EACT,QAASI,EAAO,GAChB,aACA,SAAU,EACZ,CACF,EAMaM,EAAc,GAAuC,CAChE,GAAI,OAAO,SAAa,IAAa,UAAa,CAAC,EACnD,IAAMC,EAA2B,CAAC,EAClC,GAAI,OAAO,kBAAqB,WAAY,CAC1C,IAAMC,EAAW,IAAI,iBAAiBC,CAAQ,EAC9C,IAAK,IAAMC,IAAQ,CAAC,SAAS,gBAAiB,SAAS,IAAI,EACrDA,GACFF,EAAS,QAAQE,EAAM,CACrB,WAAY,GACZ,gBAAiB,CAAC,QAAS,QAAS,aAAc,WAAW,CAC/D,CAAC,EAGLH,EAAS,SAAWC,EAAS,WAAW,CAAC,CAC3C,CACA,GAAI,OAAO,YAAe,WAAY,CACpC,IAAMG,EAAQ,WAAW,8BAA8B,EACvDA,EAAM,mBAAmB,SAAUF,CAAQ,EAC3CF,EAAS,SAAWI,EAAM,sBAAsB,SAAUF,CAAQ,CAAC,CACrE,CACA,UAAaF,EAAS,QAAS,GAAOK,EAAG,CAAC,CAC5C"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Rgba } from './color.cjs';
|
|
2
|
+
export interface ChartTheme {
|
|
3
|
+
palette: Rgba[];
|
|
4
|
+
text: Rgba;
|
|
5
|
+
textMuted: Rgba;
|
|
6
|
+
grid: Rgba;
|
|
7
|
+
axis: Rgba;
|
|
8
|
+
background: Rgba;
|
|
9
|
+
surface: Rgba;
|
|
10
|
+
primary: Rgba;
|
|
11
|
+
fontFamily: string;
|
|
12
|
+
/** Tick label font size in CSS pixels */
|
|
13
|
+
fontSize: number;
|
|
14
|
+
}
|
|
15
|
+
/** Reads the theme from the computed style of `element` */
|
|
16
|
+
export declare const readTheme: (element: Element | null, palette?: readonly string[]) => ChartTheme;
|
|
17
|
+
/**
|
|
18
|
+
* Calls `onChange` when the theme may have changed: attributes of `<html>` /
|
|
19
|
+
* `<body>` (class, style, data-theme) and the color scheme.
|
|
20
|
+
*/
|
|
21
|
+
export declare const watchTheme: (onChange: () => void) => (() => void);
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Rgba } from './color.js';
|
|
2
|
+
export interface ChartTheme {
|
|
3
|
+
palette: Rgba[];
|
|
4
|
+
text: Rgba;
|
|
5
|
+
textMuted: Rgba;
|
|
6
|
+
grid: Rgba;
|
|
7
|
+
axis: Rgba;
|
|
8
|
+
background: Rgba;
|
|
9
|
+
surface: Rgba;
|
|
10
|
+
primary: Rgba;
|
|
11
|
+
fontFamily: string;
|
|
12
|
+
/** Tick label font size in CSS pixels */
|
|
13
|
+
fontSize: number;
|
|
14
|
+
}
|
|
15
|
+
/** Reads the theme from the computed style of `element` */
|
|
16
|
+
export declare const readTheme: (element: Element | null, palette?: readonly string[]) => ChartTheme;
|
|
17
|
+
/**
|
|
18
|
+
* Calls `onChange` when the theme may have changed: attributes of `<html>` /
|
|
19
|
+
* `<body>` (class, style, data-theme) and the color scheme.
|
|
20
|
+
*/
|
|
21
|
+
export declare const watchTheme: (onChange: () => void) => (() => void);
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { mix as e, resolveColor as t } from "./color.js";
|
|
2
|
+
//#region src/engine/theme.ts
|
|
3
|
+
var n = [
|
|
4
|
+
"#4f46e5",
|
|
5
|
+
"#10b981",
|
|
6
|
+
"#f59e0b",
|
|
7
|
+
"#ef4444",
|
|
8
|
+
"#0ea5e9",
|
|
9
|
+
"#8b5cf6",
|
|
10
|
+
"#14b8a6",
|
|
11
|
+
"#f97316"
|
|
12
|
+
], r = (e, t) => e?.getPropertyValue(t).trim() ?? "", i = (i, a) => {
|
|
13
|
+
let o = i && typeof getComputedStyle == "function" ? getComputedStyle(i) : null, s = (e, n) => {
|
|
14
|
+
for (let n of e) if (r(o, n)) return t(`var(${n})`, i);
|
|
15
|
+
return t(n, i);
|
|
16
|
+
}, c = s(["--surface-color", "--background-color"], "#ffffff"), l = s(["--text-color"], "#1f2937"), u = s(["--text-secondary-color", "--text-muted-color"], "#6b7280"), d = s(["--border-color"], "#e5e7eb"), f;
|
|
17
|
+
if (a && a.length) f = a.map((e) => t(e, i));
|
|
18
|
+
else {
|
|
19
|
+
let e = [];
|
|
20
|
+
for (let n = 1; n <= 8; n++) {
|
|
21
|
+
let a = `--chart-series-${n}`;
|
|
22
|
+
r(o, a) && e.push(t(`var(${a})`, i));
|
|
23
|
+
}
|
|
24
|
+
f = e.length ? e : [...[
|
|
25
|
+
"--primary-color",
|
|
26
|
+
"--success-color",
|
|
27
|
+
"--warning-color",
|
|
28
|
+
"--danger-color",
|
|
29
|
+
"--info-color"
|
|
30
|
+
].map((e, a) => r(o, e) ? t(`var(${e})`, i) : t(n[a], i)), ...n.slice(5).map((e) => t(e, i))];
|
|
31
|
+
}
|
|
32
|
+
let p = r(o, "--font-family-sans") || (o?.fontFamily ?? "") || "system-ui, -apple-system, 'Segoe UI', sans-serif";
|
|
33
|
+
return {
|
|
34
|
+
palette: f,
|
|
35
|
+
text: l,
|
|
36
|
+
textMuted: u,
|
|
37
|
+
grid: e(c, d, .75),
|
|
38
|
+
axis: d,
|
|
39
|
+
background: c,
|
|
40
|
+
surface: c,
|
|
41
|
+
primary: f[0],
|
|
42
|
+
fontFamily: p,
|
|
43
|
+
fontSize: 11
|
|
44
|
+
};
|
|
45
|
+
}, a = (e) => {
|
|
46
|
+
if (typeof document > "u") return () => {};
|
|
47
|
+
let t = [];
|
|
48
|
+
if (typeof MutationObserver == "function") {
|
|
49
|
+
let n = new MutationObserver(e);
|
|
50
|
+
for (let e of [document.documentElement, document.body]) e && n.observe(e, {
|
|
51
|
+
attributes: !0,
|
|
52
|
+
attributeFilter: [
|
|
53
|
+
"class",
|
|
54
|
+
"style",
|
|
55
|
+
"data-theme",
|
|
56
|
+
"data-mode"
|
|
57
|
+
]
|
|
58
|
+
});
|
|
59
|
+
t.push(() => n.disconnect());
|
|
60
|
+
}
|
|
61
|
+
if (typeof matchMedia == "function") {
|
|
62
|
+
let n = matchMedia("(prefers-color-scheme: dark)");
|
|
63
|
+
n.addEventListener?.("change", e), t.push(() => n.removeEventListener?.("change", e));
|
|
64
|
+
}
|
|
65
|
+
return () => t.forEach((e) => e());
|
|
66
|
+
};
|
|
67
|
+
//#endregion
|
|
68
|
+
export { i as readTheme, a as watchTheme };
|
|
69
|
+
|
|
70
|
+
//# sourceMappingURL=theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.js","names":["DEFAULT_PALETTE","readVar","style","name","readTheme","element","color","names","resolveColor","fallback","background","text","textMuted","border","colors","palette","c","custom","i","fontFamily","mix","watchTheme","cleanups","observer","onChange","node","query","fn"],"sources":["../../../../charts/src/engine/theme.ts"],"sourcesContent":["// Chart colors and fonts read from the Minerva CSS variables.\n\nimport { mix, resolveColor, type Rgba } from \"./color\";\n\nexport interface ChartTheme {\n palette: Rgba[];\n text: Rgba;\n textMuted: Rgba;\n grid: Rgba;\n axis: Rgba;\n background: Rgba;\n surface: Rgba;\n primary: Rgba;\n fontFamily: string;\n /** Tick label font size in CSS pixels */\n fontSize: number;\n}\n\n/** Used when no CSS variable is defined (e.g. without the Minerva stylesheet) */\nconst DEFAULT_PALETTE = [\n \"#4f46e5\",\n \"#10b981\",\n \"#f59e0b\",\n \"#ef4444\",\n \"#0ea5e9\",\n \"#8b5cf6\",\n \"#14b8a6\",\n \"#f97316\",\n];\n\nconst readVar = (style: CSSStyleDeclaration | null, name: string) =>\n style?.getPropertyValue(name).trim() ?? \"\";\n\n/** Reads the theme from the computed style of `element` */\nexport const readTheme = (\n element: Element | null,\n palette?: readonly string[],\n): ChartTheme => {\n const style =\n element && typeof getComputedStyle === \"function\"\n ? getComputedStyle(element)\n : null;\n const color = (names: string[], fallback: string): Rgba => {\n for (const name of names) {\n if (readVar(style, name)) return resolveColor(`var(${name})`, element);\n }\n return resolveColor(fallback, element);\n };\n\n const background = color(\n [\"--surface-color\", \"--background-color\"],\n \"#ffffff\",\n );\n const text = color([\"--text-color\"], \"#1f2937\");\n const textMuted = color(\n [\"--text-secondary-color\", \"--text-muted-color\"],\n \"#6b7280\",\n );\n const border = color([\"--border-color\"], \"#e5e7eb\");\n\n let colors: Rgba[];\n if (palette && palette.length) {\n colors = palette.map((c) => resolveColor(c, element));\n } else {\n const custom: Rgba[] = [];\n for (let i = 1; i <= 8; i++) {\n const name = `--chart-series-${i}`;\n if (readVar(style, name))\n custom.push(resolveColor(`var(${name})`, element));\n }\n if (custom.length) {\n colors = custom;\n } else {\n const themed = [\n \"--primary-color\",\n \"--success-color\",\n \"--warning-color\",\n \"--danger-color\",\n \"--info-color\",\n ].map((name, i) =>\n readVar(style, name)\n ? resolveColor(`var(${name})`, element)\n : resolveColor(DEFAULT_PALETTE[i], element),\n );\n colors = [\n ...themed,\n ...DEFAULT_PALETTE.slice(5).map((c) => resolveColor(c, element)),\n ];\n }\n }\n\n const fontFamily =\n readVar(style, \"--font-family-sans\") ||\n (style?.fontFamily ?? \"\") ||\n \"system-ui, -apple-system, 'Segoe UI', sans-serif\";\n\n return {\n palette: colors,\n text,\n textMuted,\n grid: mix(background, border, 0.75),\n axis: border,\n background,\n surface: background,\n primary: colors[0],\n fontFamily,\n fontSize: 11,\n };\n};\n\n/**\n * Calls `onChange` when the theme may have changed: attributes of `<html>` /\n * `<body>` (class, style, data-theme) and the color scheme.\n */\nexport const watchTheme = (onChange: () => void): (() => void) => {\n if (typeof document === \"undefined\") return () => {};\n const cleanups: (() => void)[] = [];\n if (typeof MutationObserver === \"function\") {\n const observer = new MutationObserver(onChange);\n for (const node of [document.documentElement, document.body]) {\n if (node) {\n observer.observe(node, {\n attributes: true,\n attributeFilter: [\"class\", \"style\", \"data-theme\", \"data-mode\"],\n });\n }\n }\n cleanups.push(() => observer.disconnect());\n }\n if (typeof matchMedia === \"function\") {\n const query = matchMedia(\"(prefers-color-scheme: dark)\");\n query.addEventListener?.(\"change\", onChange);\n cleanups.push(() => query.removeEventListener?.(\"change\", onChange));\n }\n return () => cleanups.forEach((fn) => fn());\n};\n"],"mappings":";;AAmBA,IAAMA,IAAkB;CACtB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,GAEMC,KAAW,GAAmC,MAClDC,GAAO,iBAAiBC,CAAI,CAAC,CAAC,KAAK,KAAK,IAG7BC,KACX,GACA,MACe;CACf,IAAMF,IACJG,KAAW,OAAO,oBAAqB,aACnC,iBAAiBA,CAAO,IACxB,MACAC,KAAS,GAAiB,MAA2B;EACzD,KAAK,IAAMH,KAAQI,GACjB,IAAIN,EAAQC,GAAOC,CAAI,GAAG,OAAOK,EAAa,OAAOL,EAAK,IAAIE,CAAO;EAEvE,OAAOG,EAAaC,GAAUJ,CAAO;CACvC,GAEMK,IAAaJ,EACjB,CAAC,mBAAmB,oBAAoB,GACxC,SACF,GACMK,IAAOL,EAAM,CAAC,cAAc,GAAG,SAAS,GACxCM,IAAYN,EAChB,CAAC,0BAA0B,oBAAoB,GAC/C,SACF,GACMO,IAASP,EAAM,CAAC,gBAAgB,GAAG,SAAS,GAE9CQ;CACJ,IAAIC,KAAWA,EAAQ,QACrB,IAASA,EAAQ,KAAK,MAAMP,EAAaQ,GAAGX,CAAO,CAAC;MAC/C;EACL,IAAMY,IAAiB,CAAC;EACxB,KAAK,IAAIC,IAAI,GAAGA,KAAK,GAAG,KAAK;GAC3B,IAAMf,IAAO,kBAAkBe;GAC/B,AAAIjB,EAAQC,GAAOC,CAAI,KACrBc,EAAO,KAAKT,EAAa,OAAOL,EAAK,IAAIE,CAAO,CAAC;EACrD;EACA,AAcES,IAdEG,EAAO,SACAA,IAaA,CACP,GAZa;GACb;GACA;GACA;GACA;GACA;EACF,CAAC,CAAC,KAAK,GAAM,MACXhB,EAAQC,GAAOC,CAAI,IACfK,EAAa,OAAOL,EAAK,IAAIE,CAAO,IACpCG,EAAaR,EAAgBkB,IAAIb,CAAO,CAGzC,GACH,GAAGL,EAAgB,MAAM,CAAC,CAAC,CAAC,KAAK,MAAMQ,EAAaQ,GAAGX,CAAO,CAAC,CACjE;CAEJ;CAEA,IAAMc,IACJlB,EAAQC,GAAO,oBAAoB,MAClCA,GAAO,cAAc,OACtB;CAEF,OAAO;EACL,SAASY;EACT;EACA;EACA,MAAMM,EAAIV,GAAYG,GAAQ,GAAI;EAClC,MAAMA;EACN;EACA,SAASH;EACT,SAASI,EAAO;EAChB;EACA,UAAU;CACZ;AACF,GAMaO,KAAc,MAAuC;CAChE,IAAI,OAAO,WAAa,KAAa,aAAa,CAAC;CACnD,IAAMC,IAA2B,CAAC;CAClC,IAAI,OAAO,oBAAqB,YAAY;EAC1C,IAAMC,IAAW,IAAI,iBAAiBC,CAAQ;EAC9C,KAAK,IAAMC,KAAQ,CAAC,SAAS,iBAAiB,SAAS,IAAI,GACzD,AAAIA,KACFF,EAAS,QAAQE,GAAM;GACrB,YAAY;GACZ,iBAAiB;IAAC;IAAS;IAAS;IAAc;GAAW;EAC/D,CAAC;EAGL,EAAS,WAAWF,EAAS,WAAW,CAAC;CAC3C;CACA,IAAI,OAAO,cAAe,YAAY;EACpC,IAAMG,IAAQ,WAAW,8BAA8B;EAEvD,AADAA,EAAM,mBAAmB,UAAUF,CAAQ,GAC3CF,EAAS,WAAWI,EAAM,sBAAsB,UAAUF,CAAQ,CAAC;CACrE;CACA,aAAaF,EAAS,SAAS,MAAOK,EAAG,CAAC;AAC5C"}
|