blazeplot 0.1.10 → 0.1.11

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.
@@ -1,5 +1,4 @@
1
1
  export { Camera2D } from './Camera2D.js';
2
- export { InputController } from './InputController.js';
3
2
  export { AxisController } from './AxisController.js';
4
3
  export type { PanIntent, ZoomAxis, ZoomIntent, ViewportPolicy } from './types.js';
5
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/interaction/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/interaction/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { interactionsPlugin } from '../ui/Interactions.js';
2
+ export type { InteractionsPluginOptions } from '../ui/Interactions.js';
3
+ //# sourceMappingURL=interactions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactions.d.ts","sourceRoot":"","sources":["../../src/plugins/interactions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,YAAY,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,143 @@
1
+ //#region src/ui/Interactions.ts
2
+ var e = 1;
3
+ function t(e, t) {
4
+ return {
5
+ dx: t === "y" ? 0 : e.dx,
6
+ dy: t === "x" ? 0 : e.dy
7
+ };
8
+ }
9
+ function n(e) {
10
+ return {
11
+ xMin: e.xMin,
12
+ xMax: e.xMax,
13
+ yMin: e.yMin,
14
+ yMax: e.yMax
15
+ };
16
+ }
17
+ function r(e, t, n, r) {
18
+ if (n.width <= 0 || n.height <= 0) return null;
19
+ let i = Math.max(0, Math.min(e - n.left, n.width)), a = Math.max(0, Math.min(t - n.top, n.height));
20
+ return [r.xMin + i / n.width * (r.xMax - r.xMin), r.yMax - a / n.height * (r.yMax - r.yMin)];
21
+ }
22
+ function i(e, t, n, r) {
23
+ let i = Math.min(t[0], n[0]), a = Math.max(t[0], n[0]), o = Math.min(t[1], n[1]), s = Math.max(t[1], n[1]);
24
+ return {
25
+ xMin: r === "y" ? e.xMin : i,
26
+ xMax: r === "y" ? e.xMax : a,
27
+ yMin: r === "x" ? e.yMin : o,
28
+ yMax: r === "x" ? e.yMax : s
29
+ };
30
+ }
31
+ function a(a = {}) {
32
+ return { install(o) {
33
+ let s = a.axis ?? "xy", c = a.minDragDistancePx ?? 6, l = o.canvas, u = o.xAxisElement, d = o.yAxisElement, f = document.createElement("div"), p = `blazeplot-axis-hover-${e++}`, m = document.createElement("style"), h = u.style.pointerEvents, g = d.style.pointerEvents, _ = u.style.cursor, v = d.style.cursor, y = u.style.filter, b = d.style.filter, x = null, S = null;
34
+ f.className = "blazeplot-selection", f.style.position = "absolute", f.style.display = "none", f.style.pointerEvents = "none", f.style.zIndex = "24", f.style.border = `1px solid ${a.selectionStroke ?? "rgba(147, 197, 253, 0.95)"}`, f.style.background = a.selectionFill ?? "rgba(59, 130, 246, 0.18)", o.plotElement.appendChild(f), m.textContent = `.${p} > div { color: ${a.axisHoverColor ?? "#f8fafc"} !important; }`, a.axisInteractions !== !1 && a.axisHover !== !1 && o.rootElement.appendChild(m), a.axisInteractions !== !1 && (u.style.pointerEvents = "auto", d.style.pointerEvents = "auto", u.style.cursor = "ew-resize", d.style.cursor = "ns-resize");
35
+ let C = () => {
36
+ S ??= n(o.getViewport());
37
+ }, w = (e, n) => {
38
+ let r = t(e, n);
39
+ return a.viewportPolicy?.beforePan?.(o.getCamera(), r) ?? r;
40
+ }, T = (e) => a.viewportPolicy?.beforeZoom?.(o.getCamera(), e) ?? e, E = () => {
41
+ f.style.display = "none";
42
+ }, D = (e, t) => {
43
+ if (a.axisHover === !1) return;
44
+ let n = t ? a.axisHoverFilter ?? "brightness(1.18)" : null;
45
+ e.classList.toggle(p, t), e === u ? u.style.filter = n ?? y : e === d && (d.style.filter = n ?? b);
46
+ }, O = () => D(u, !0), k = () => D(u, !1), A = () => D(d, !0), j = () => D(d, !1), M = (e) => {
47
+ let t = l.getBoundingClientRect(), n = Math.max(0, Math.min(e.startX - t.left, t.width)), r = Math.max(0, Math.min(e.startY - t.top, t.height)), i = Math.max(0, Math.min(e.currentX - t.left, t.width)), a = Math.max(0, Math.min(e.currentY - t.top, t.height)), o = s === "y" ? 0 : Math.min(n, i), c = s === "x" ? 0 : Math.min(r, a), u = s === "y" ? t.width : Math.abs(i - n), d = s === "x" ? t.height : Math.abs(a - r);
48
+ f.style.left = `${o}px`, f.style.top = `${c}px`, f.style.width = `${u}px`, f.style.height = `${d}px`, f.style.display = "block";
49
+ }, N = (e, t, n) => {
50
+ C(), e.preventDefault(), n !== l && D(n, !0), n.setPointerCapture(e.pointerId), x = {
51
+ mode: "pan",
52
+ pointerId: e.pointerId,
53
+ axis: t,
54
+ target: n,
55
+ lastX: e.clientX,
56
+ lastY: e.clientY
57
+ };
58
+ }, P = (e) => {
59
+ if (!(x || e.button !== 0)) {
60
+ if (e.shiftKey && a.shiftDragPan !== !1) {
61
+ N(e, s, l);
62
+ return;
63
+ }
64
+ a.boxZoom !== !1 && (C(), e.preventDefault(), l.setPointerCapture(e.pointerId), x = {
65
+ mode: "select",
66
+ pointerId: e.pointerId,
67
+ target: l,
68
+ startX: e.clientX,
69
+ startY: e.clientY,
70
+ currentX: e.clientX,
71
+ currentY: e.clientY
72
+ }, M(x));
73
+ }
74
+ }, F = (e) => {
75
+ x || e.button !== 0 || a.axisInteractions === !1 || N(e, "x", u);
76
+ }, I = (e) => {
77
+ x || e.button !== 0 || a.axisInteractions === !1 || N(e, "y", d);
78
+ }, L = (e) => {
79
+ if (!(!x || e.pointerId !== x.pointerId)) {
80
+ if (e.preventDefault(), x.mode === "pan") {
81
+ let t = l.getBoundingClientRect(), n = w({
82
+ dx: t.width > 0 ? (x.lastX - e.clientX) / t.width : 0,
83
+ dy: t.height > 0 ? (e.clientY - x.lastY) / t.height : 0
84
+ }, x.axis);
85
+ n && o.pan(n), x.lastX = e.clientX, x.lastY = e.clientY;
86
+ return;
87
+ }
88
+ x.currentX = e.clientX, x.currentY = e.clientY, M(x);
89
+ }
90
+ }, R = (e) => {
91
+ if (!x || e.pointerId !== x.pointerId) return;
92
+ e.preventDefault();
93
+ let t = x;
94
+ if (x = null, t.target.hasPointerCapture(e.pointerId) && t.target.releasePointerCapture(e.pointerId), E(), t.mode !== "select") return;
95
+ let n = e.clientX - t.startX, a = e.clientY - t.startY;
96
+ if (Math.hypot(n, a) < c) return;
97
+ let u = o.getViewport(), d = l.getBoundingClientRect(), f = r(t.startX, t.startY, d, u), p = r(e.clientX, e.clientY, d, u);
98
+ if (!f || !p) return;
99
+ let m = i(u, f, p, s);
100
+ m.xMax > m.xMin && m.yMax > m.yMin && o.setViewport(m);
101
+ }, z = (e) => {
102
+ if (!x || e.pointerId !== x.pointerId) return;
103
+ let t = x;
104
+ x = null, t.target.hasPointerCapture(e.pointerId) && t.target.releasePointerCapture(e.pointerId), E();
105
+ }, B = (e, t) => {
106
+ if (a.wheelZoom === !1) return;
107
+ C(), e.preventDefault();
108
+ let n = e.deltaY < 0 ? 1.1 : .9, r = l.getBoundingClientRect(), i = T({
109
+ factor: n,
110
+ cx: r.width > 0 ? (e.clientX - r.left) / r.width : .5,
111
+ cy: r.height > 0 ? 1 - (e.clientY - r.top) / r.height : .5,
112
+ axis: t
113
+ });
114
+ i && o.zoom(i);
115
+ }, V = (e) => {
116
+ B(e, s);
117
+ }, H = (e) => {
118
+ a.axisInteractions !== !1 && B(e, "x");
119
+ }, U = (e) => {
120
+ a.axisInteractions !== !1 && B(e, "y");
121
+ }, W = (e) => {
122
+ if (a.doubleClickReset === !1) return;
123
+ e.preventDefault();
124
+ let t = S ?? n(o.getViewport());
125
+ o.setViewport(t);
126
+ }, G = [
127
+ l,
128
+ u,
129
+ d
130
+ ];
131
+ l.addEventListener("pointerdown", P), l.addEventListener("wheel", V, { passive: !1 }), l.addEventListener("dblclick", W), a.axisInteractions !== !1 && (u.addEventListener("pointerdown", F), d.addEventListener("pointerdown", I), u.addEventListener("pointerenter", O), u.addEventListener("pointerleave", k), d.addEventListener("pointerenter", A), d.addEventListener("pointerleave", j), u.addEventListener("wheel", H, { passive: !1 }), d.addEventListener("wheel", U, { passive: !1 }), u.addEventListener("dblclick", W), d.addEventListener("dblclick", W));
132
+ for (let e of G) e.addEventListener("pointermove", L), e.addEventListener("pointerup", R), e.addEventListener("pointercancel", z);
133
+ return () => {
134
+ l.removeEventListener("pointerdown", P), l.removeEventListener("wheel", V), l.removeEventListener("dblclick", W), u.removeEventListener("pointerdown", F), d.removeEventListener("pointerdown", I), u.removeEventListener("pointerenter", O), u.removeEventListener("pointerleave", k), d.removeEventListener("pointerenter", A), d.removeEventListener("pointerleave", j), u.removeEventListener("wheel", H), d.removeEventListener("wheel", U), u.removeEventListener("dblclick", W), d.removeEventListener("dblclick", W);
135
+ for (let e of G) e.removeEventListener("pointermove", L), e.removeEventListener("pointerup", R), e.removeEventListener("pointercancel", z);
136
+ u.style.pointerEvents = h, d.style.pointerEvents = g, u.style.cursor = _, d.style.cursor = v, u.style.filter = y, d.style.filter = b, u.classList.remove(p), d.classList.remove(p), m.remove(), f.remove();
137
+ };
138
+ } };
139
+ }
140
+ //#endregion
141
+ export { a as interactionsPlugin };
142
+
143
+ //# sourceMappingURL=interactions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactions.js","names":[],"sources":["../../src/ui/Interactions.ts"],"sourcesContent":["import type { Viewport } from \"../core/types.js\";\nimport type { PanIntent, ViewportPolicy, ZoomAxis, ZoomIntent } from \"../interaction/types.js\";\nimport type { Chart, ChartPlugin } from \"./Chart.js\";\n\nexport interface InteractionsPluginOptions {\n readonly axis?: ZoomAxis;\n readonly viewportPolicy?: ViewportPolicy;\n readonly boxZoom?: boolean;\n readonly wheelZoom?: boolean;\n readonly axisInteractions?: boolean;\n readonly axisHover?: boolean;\n readonly axisHoverColor?: string;\n readonly axisHoverFilter?: string;\n readonly shiftDragPan?: boolean;\n readonly doubleClickReset?: boolean;\n readonly minDragDistancePx?: number;\n readonly selectionFill?: string;\n readonly selectionStroke?: string;\n}\n\nlet nextInteractionsPluginId = 1;\n\ntype InteractionTarget = HTMLCanvasElement | HTMLElement;\n\ntype DragState =\n | {\n readonly mode: \"pan\";\n readonly pointerId: number;\n readonly axis: ZoomAxis;\n readonly target: InteractionTarget;\n lastX: number;\n lastY: number;\n }\n | {\n readonly mode: \"select\";\n readonly pointerId: number;\n readonly target: HTMLCanvasElement;\n readonly startX: number;\n readonly startY: number;\n currentX: number;\n currentY: number;\n };\n\nfunction constrainPan(intent: PanIntent, axis: ZoomAxis): PanIntent {\n return {\n dx: axis === \"y\" ? 0 : intent.dx,\n dy: axis === \"x\" ? 0 : intent.dy,\n };\n}\n\nfunction normalizeViewport(v: Viewport): Viewport {\n return { xMin: v.xMin, xMax: v.xMax, yMin: v.yMin, yMax: v.yMax };\n}\n\nfunction clientToDataClamped(\n clientX: number,\n clientY: number,\n rect: DOMRect,\n viewport: Viewport,\n): [number, number] | null {\n if (rect.width <= 0 || rect.height <= 0) return null;\n\n const plotX = Math.max(0, Math.min(clientX - rect.left, rect.width));\n const plotY = Math.max(0, Math.min(clientY - rect.top, rect.height));\n return [\n viewport.xMin + (plotX / rect.width) * (viewport.xMax - viewport.xMin),\n viewport.yMax - (plotY / rect.height) * (viewport.yMax - viewport.yMin),\n ];\n}\n\nfunction applySelectionAxis(\n current: Viewport,\n a: [number, number],\n b: [number, number],\n axis: ZoomAxis,\n): Viewport {\n const xMin = Math.min(a[0], b[0]);\n const xMax = Math.max(a[0], b[0]);\n const yMin = Math.min(a[1], b[1]);\n const yMax = Math.max(a[1], b[1]);\n\n return {\n xMin: axis === \"y\" ? current.xMin : xMin,\n xMax: axis === \"y\" ? current.xMax : xMax,\n yMin: axis === \"x\" ? current.yMin : yMin,\n yMax: axis === \"x\" ? current.yMax : yMax,\n };\n}\n\nexport function interactionsPlugin(options: InteractionsPluginOptions = {}): ChartPlugin {\n return {\n install(chart: Chart) {\n const axis = options.axis ?? \"xy\";\n const minDragDistancePx = options.minDragDistancePx ?? 6;\n const canvas = chart.canvas;\n const xAxis = chart.xAxisElement;\n const yAxis = chart.yAxisElement;\n const selection = document.createElement(\"div\");\n const axisHoverClass = `blazeplot-axis-hover-${nextInteractionsPluginId++}`;\n const axisHoverStyle = document.createElement(\"style\");\n const originalXAxisPointerEvents = xAxis.style.pointerEvents;\n const originalYAxisPointerEvents = yAxis.style.pointerEvents;\n const originalXAxisCursor = xAxis.style.cursor;\n const originalYAxisCursor = yAxis.style.cursor;\n const originalXAxisFilter = xAxis.style.filter;\n const originalYAxisFilter = yAxis.style.filter;\n let drag: DragState | null = null;\n let resetViewport: Viewport | null = null;\n\n selection.className = \"blazeplot-selection\";\n selection.style.position = \"absolute\";\n selection.style.display = \"none\";\n selection.style.pointerEvents = \"none\";\n selection.style.zIndex = \"24\";\n selection.style.border = `1px solid ${options.selectionStroke ?? \"rgba(147, 197, 253, 0.95)\"}`;\n selection.style.background = options.selectionFill ?? \"rgba(59, 130, 246, 0.18)\";\n chart.plotElement.appendChild(selection);\n\n axisHoverStyle.textContent = `.${axisHoverClass} > div { color: ${options.axisHoverColor ?? \"#f8fafc\"} !important; }`;\n if (options.axisInteractions !== false && options.axisHover !== false) {\n chart.rootElement.appendChild(axisHoverStyle);\n }\n\n if (options.axisInteractions !== false) {\n xAxis.style.pointerEvents = \"auto\";\n yAxis.style.pointerEvents = \"auto\";\n xAxis.style.cursor = \"ew-resize\";\n yAxis.style.cursor = \"ns-resize\";\n }\n\n const captureResetViewport = (): void => {\n resetViewport ??= normalizeViewport(chart.getViewport());\n };\n\n const applyPanPolicy = (intent: PanIntent, panAxis: ZoomAxis): PanIntent | null => {\n const constrained = constrainPan(intent, panAxis);\n return options.viewportPolicy?.beforePan?.(chart.getCamera(), constrained) ?? constrained;\n };\n\n const applyZoomPolicy = (intent: ZoomIntent): ZoomIntent | null => {\n return options.viewportPolicy?.beforeZoom?.(chart.getCamera(), intent) ?? intent;\n };\n\n const hideSelection = (): void => {\n selection.style.display = \"none\";\n };\n\n const setAxisHovered = (target: HTMLElement, hovered: boolean): void => {\n if (options.axisHover === false) return;\n const filter = hovered ? options.axisHoverFilter ?? \"brightness(1.18)\" : null;\n target.classList.toggle(axisHoverClass, hovered);\n if (target === xAxis) {\n xAxis.style.filter = filter ?? originalXAxisFilter;\n } else if (target === yAxis) {\n yAxis.style.filter = filter ?? originalYAxisFilter;\n }\n };\n\n const onXAxisPointerEnter = (): void => setAxisHovered(xAxis, true);\n const onXAxisPointerLeave = (): void => setAxisHovered(xAxis, false);\n const onYAxisPointerEnter = (): void => setAxisHovered(yAxis, true);\n const onYAxisPointerLeave = (): void => setAxisHovered(yAxis, false);\n\n const updateSelection = (state: Extract<DragState, { mode: \"select\" }>): void => {\n const rect = canvas.getBoundingClientRect();\n const x0 = Math.max(0, Math.min(state.startX - rect.left, rect.width));\n const y0 = Math.max(0, Math.min(state.startY - rect.top, rect.height));\n const x1 = Math.max(0, Math.min(state.currentX - rect.left, rect.width));\n const y1 = Math.max(0, Math.min(state.currentY - rect.top, rect.height));\n const left = axis === \"y\" ? 0 : Math.min(x0, x1);\n const top = axis === \"x\" ? 0 : Math.min(y0, y1);\n const width = axis === \"y\" ? rect.width : Math.abs(x1 - x0);\n const height = axis === \"x\" ? rect.height : Math.abs(y1 - y0);\n\n selection.style.left = `${left}px`;\n selection.style.top = `${top}px`;\n selection.style.width = `${width}px`;\n selection.style.height = `${height}px`;\n selection.style.display = \"block\";\n };\n\n const beginPan = (event: PointerEvent, panAxis: ZoomAxis, target: InteractionTarget): void => {\n captureResetViewport();\n event.preventDefault();\n if (target !== canvas) setAxisHovered(target, true);\n target.setPointerCapture(event.pointerId);\n drag = {\n mode: \"pan\",\n pointerId: event.pointerId,\n axis: panAxis,\n target,\n lastX: event.clientX,\n lastY: event.clientY,\n };\n };\n\n const onCanvasPointerDown = (event: PointerEvent): void => {\n if (drag || event.button !== 0) return;\n\n if (event.shiftKey && options.shiftDragPan !== false) {\n beginPan(event, axis, canvas);\n return;\n }\n\n if (options.boxZoom === false) return;\n captureResetViewport();\n event.preventDefault();\n canvas.setPointerCapture(event.pointerId);\n drag = {\n mode: \"select\",\n pointerId: event.pointerId,\n target: canvas,\n startX: event.clientX,\n startY: event.clientY,\n currentX: event.clientX,\n currentY: event.clientY,\n };\n updateSelection(drag);\n };\n\n const onXAxisPointerDown = (event: PointerEvent): void => {\n if (drag || event.button !== 0 || options.axisInteractions === false) return;\n beginPan(event, \"x\", xAxis);\n };\n\n const onYAxisPointerDown = (event: PointerEvent): void => {\n if (drag || event.button !== 0 || options.axisInteractions === false) return;\n beginPan(event, \"y\", yAxis);\n };\n\n const onPointerMove = (event: PointerEvent): void => {\n if (!drag || event.pointerId !== drag.pointerId) return;\n event.preventDefault();\n\n if (drag.mode === \"pan\") {\n const rect = canvas.getBoundingClientRect();\n const dx = rect.width > 0 ? (drag.lastX - event.clientX) / rect.width : 0;\n const dy = rect.height > 0 ? (event.clientY - drag.lastY) / rect.height : 0;\n const intent = applyPanPolicy({ dx, dy }, drag.axis);\n if (intent) chart.pan(intent);\n drag.lastX = event.clientX;\n drag.lastY = event.clientY;\n return;\n }\n\n drag.currentX = event.clientX;\n drag.currentY = event.clientY;\n updateSelection(drag);\n };\n\n const onPointerUp = (event: PointerEvent): void => {\n if (!drag || event.pointerId !== drag.pointerId) return;\n event.preventDefault();\n\n const completed = drag;\n drag = null;\n if (completed.target.hasPointerCapture(event.pointerId)) completed.target.releasePointerCapture(event.pointerId);\n hideSelection();\n\n if (completed.mode !== \"select\") return;\n\n const dx = event.clientX - completed.startX;\n const dy = event.clientY - completed.startY;\n if (Math.hypot(dx, dy) < minDragDistancePx) return;\n\n const current = chart.getViewport();\n const rect = canvas.getBoundingClientRect();\n const start = clientToDataClamped(completed.startX, completed.startY, rect, current);\n const end = clientToDataClamped(event.clientX, event.clientY, rect, current);\n if (!start || !end) return;\n\n const next = applySelectionAxis(current, start, end, axis);\n if (next.xMax > next.xMin && next.yMax > next.yMin) chart.setViewport(next);\n };\n\n const onPointerCancel = (event: PointerEvent): void => {\n if (!drag || event.pointerId !== drag.pointerId) return;\n const completed = drag;\n drag = null;\n if (completed.target.hasPointerCapture(event.pointerId)) completed.target.releasePointerCapture(event.pointerId);\n hideSelection();\n };\n\n const wheelOnAxis = (event: WheelEvent, zoomAxis: ZoomAxis): void => {\n if (options.wheelZoom === false) return;\n captureResetViewport();\n event.preventDefault();\n const factor = event.deltaY < 0 ? 1.1 : 0.9;\n const rect = canvas.getBoundingClientRect();\n const cx = rect.width > 0 ? (event.clientX - rect.left) / rect.width : 0.5;\n const cy = rect.height > 0 ? 1 - (event.clientY - rect.top) / rect.height : 0.5;\n const intent = applyZoomPolicy({ factor, cx, cy, axis: zoomAxis });\n if (intent) chart.zoom(intent);\n };\n\n const onCanvasWheel = (event: WheelEvent): void => {\n wheelOnAxis(event, axis);\n };\n\n const onXAxisWheel = (event: WheelEvent): void => {\n if (options.axisInteractions === false) return;\n wheelOnAxis(event, \"x\");\n };\n\n const onYAxisWheel = (event: WheelEvent): void => {\n if (options.axisInteractions === false) return;\n wheelOnAxis(event, \"y\");\n };\n\n const onDoubleClick = (event: MouseEvent): void => {\n if (options.doubleClickReset === false) return;\n event.preventDefault();\n const target = resetViewport ?? normalizeViewport(chart.getViewport());\n chart.setViewport(target);\n };\n\n const pointerTargets = [canvas, xAxis, yAxis];\n canvas.addEventListener(\"pointerdown\", onCanvasPointerDown);\n canvas.addEventListener(\"wheel\", onCanvasWheel, { passive: false });\n canvas.addEventListener(\"dblclick\", onDoubleClick);\n\n if (options.axisInteractions !== false) {\n xAxis.addEventListener(\"pointerdown\", onXAxisPointerDown);\n yAxis.addEventListener(\"pointerdown\", onYAxisPointerDown);\n xAxis.addEventListener(\"pointerenter\", onXAxisPointerEnter);\n xAxis.addEventListener(\"pointerleave\", onXAxisPointerLeave);\n yAxis.addEventListener(\"pointerenter\", onYAxisPointerEnter);\n yAxis.addEventListener(\"pointerleave\", onYAxisPointerLeave);\n xAxis.addEventListener(\"wheel\", onXAxisWheel, { passive: false });\n yAxis.addEventListener(\"wheel\", onYAxisWheel, { passive: false });\n xAxis.addEventListener(\"dblclick\", onDoubleClick);\n yAxis.addEventListener(\"dblclick\", onDoubleClick);\n }\n\n for (const target of pointerTargets) {\n target.addEventListener(\"pointermove\", onPointerMove);\n target.addEventListener(\"pointerup\", onPointerUp);\n target.addEventListener(\"pointercancel\", onPointerCancel);\n }\n\n return () => {\n canvas.removeEventListener(\"pointerdown\", onCanvasPointerDown);\n canvas.removeEventListener(\"wheel\", onCanvasWheel);\n canvas.removeEventListener(\"dblclick\", onDoubleClick);\n xAxis.removeEventListener(\"pointerdown\", onXAxisPointerDown);\n yAxis.removeEventListener(\"pointerdown\", onYAxisPointerDown);\n xAxis.removeEventListener(\"pointerenter\", onXAxisPointerEnter);\n xAxis.removeEventListener(\"pointerleave\", onXAxisPointerLeave);\n yAxis.removeEventListener(\"pointerenter\", onYAxisPointerEnter);\n yAxis.removeEventListener(\"pointerleave\", onYAxisPointerLeave);\n xAxis.removeEventListener(\"wheel\", onXAxisWheel);\n yAxis.removeEventListener(\"wheel\", onYAxisWheel);\n xAxis.removeEventListener(\"dblclick\", onDoubleClick);\n yAxis.removeEventListener(\"dblclick\", onDoubleClick);\n for (const target of pointerTargets) {\n target.removeEventListener(\"pointermove\", onPointerMove);\n target.removeEventListener(\"pointerup\", onPointerUp);\n target.removeEventListener(\"pointercancel\", onPointerCancel);\n }\n xAxis.style.pointerEvents = originalXAxisPointerEvents;\n yAxis.style.pointerEvents = originalYAxisPointerEvents;\n xAxis.style.cursor = originalXAxisCursor;\n yAxis.style.cursor = originalYAxisCursor;\n xAxis.style.filter = originalXAxisFilter;\n yAxis.style.filter = originalYAxisFilter;\n xAxis.classList.remove(axisHoverClass);\n yAxis.classList.remove(axisHoverClass);\n axisHoverStyle.remove();\n selection.remove();\n };\n },\n };\n}\n"],"mappings":"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"}
@@ -5,33 +5,37 @@ function e(e) {
5
5
  function t(e, t) {
6
6
  e.style.top = t.startsWith("top") ? "8px" : "auto", e.style.bottom = t.startsWith("bottom") ? "8px" : "auto", e.style.left = t.endsWith("left") ? "8px" : "auto", e.style.right = t.endsWith("right") ? "8px" : "auto";
7
7
  }
8
- function n(t, n, r, i) {
8
+ function n(e, t) {
9
+ let n = e.borderColor ?? t.theme.legendBorderColor;
10
+ return n === "transparent" ? "0" : `1px solid ${n}`;
11
+ }
12
+ function r(t, n, r, i, a) {
9
13
  n.replaceChildren();
10
- for (let a of t) {
14
+ for (let o of t) {
11
15
  let t = document.createElement("button");
12
- t.type = "button", t.style.display = "flex", t.style.alignItems = "center", t.style.gap = "6px", t.style.width = "100%", t.style.border = "0", t.style.padding = "2px 4px", t.style.background = "transparent", t.style.color = a.visible ? "#dbeafe" : "#789", t.style.font = "11px ui-monospace, monospace, sans-serif", t.style.textAlign = "left", t.style.cursor = i ? "pointer" : "default", t.style.opacity = a.visible ? "1" : "0.45";
13
- let o = document.createElement("span");
14
- o.style.width = "10px", o.style.height = "10px", o.style.borderRadius = "2px", o.style.background = e(a.color), o.style.flex = "0 0 auto";
16
+ t.type = "button", t.style.display = "flex", t.style.alignItems = "center", t.style.gap = "6px", t.style.border = "0", t.style.margin = "0", t.style.padding = "0", t.style.appearance = "none", t.style.background = "transparent", t.style.color = o.visible ? a.textColor ?? r.theme.legendTextColor : a.mutedTextColor ?? r.theme.legendMutedTextColor, t.style.font = "inherit", t.style.textAlign = "left", t.style.cursor = i ? "pointer" : "default", t.style.opacity = o.visible ? "1" : "0.45";
15
17
  let s = document.createElement("span");
16
- s.textContent = a.name ?? a.id ?? `${a.mode} ${a.index + 1}`, t.append(o, s), i && t.addEventListener("click", () => {
17
- r.setSeriesVisible(a.series, !a.visible);
18
+ s.textContent = "█", s.style.color = e(o.color), s.style.flex = "0 0 auto";
19
+ let c = document.createElement("span");
20
+ c.textContent = o.name ?? o.id ?? `${o.mode} ${o.index + 1}`, t.append(s, c), i && t.addEventListener("click", () => {
21
+ r.setSeriesVisible(o.series, !o.visible);
18
22
  }), n.appendChild(t);
19
23
  }
20
24
  }
21
- function r(e = {}) {
22
- return { install(r) {
23
- let i = document.createElement("div");
24
- i.className = e.className ?? "blazeplot-legend", i.style.position = "absolute", i.style.zIndex = "20", i.style.pointerEvents = "auto", i.style.padding = "6px", i.style.border = "1px solid rgba(148, 163, 184, 0.22)", i.style.borderRadius = "6px", i.style.background = "rgba(15, 23, 42, 0.72)", i.style.backdropFilter = "blur(4px)", i.style.userSelect = "none", t(i, e.position ?? "top-right"), r.rootElement.appendChild(i);
25
- let a = () => {
26
- let t = r.getSeriesState();
27
- e.render ? e.render(t, i, r) : n(t, i, r, e.toggleOnClick !== !1);
28
- }, o = r.subscribe("serieschange", a);
29
- return a(), () => {
30
- o(), i.remove();
25
+ function i(e = {}) {
26
+ return { install(i) {
27
+ let a = document.createElement("div");
28
+ a.className = e.className ?? "blazeplot-legend", a.style.position = "absolute", a.style.zIndex = "20", a.style.pointerEvents = "auto", a.style.padding = "8px 10px", a.style.border = n(e, i), a.style.background = e.backgroundColor ?? i.theme.legendBackgroundColor, a.style.color = e.textColor ?? i.theme.legendTextColor, a.style.font = e.font ?? i.theme.legendFont, a.style.whiteSpace = "pre", a.style.userSelect = "none", t(a, e.position ?? "top-right"), i.rootElement.appendChild(a);
29
+ let o = () => {
30
+ let t = i.getSeriesState();
31
+ e.render ? e.render(t, a, i) : r(t, a, i, e.toggleOnClick !== !1, e);
32
+ }, s = i.subscribe("serieschange", o);
33
+ return o(), () => {
34
+ s(), a.remove();
31
35
  };
32
36
  } };
33
37
  }
34
38
  //#endregion
35
- export { r as legendPlugin };
39
+ export { i as legendPlugin };
36
40
 
37
41
  //# sourceMappingURL=legend.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"legend.js","names":[],"sources":["../../src/ui/Legend.ts"],"sourcesContent":["import type { Chart, ChartPlugin, ChartSeriesState } from \"./Chart.js\";\n\nexport interface LegendPluginOptions {\n readonly className?: string;\n readonly position?: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n readonly toggleOnClick?: boolean;\n readonly render?: (state: readonly ChartSeriesState[], container: HTMLElement, chart: Chart) => void;\n}\n\nfunction rgba(color: readonly [number, number, number, number]): string {\n return `rgba(${Math.round(color[0] * 255)}, ${Math.round(color[1] * 255)}, ${Math.round(color[2] * 255)}, ${color[3]})`;\n}\n\nfunction applyPosition(el: HTMLElement, position: NonNullable<LegendPluginOptions[\"position\"]>): void {\n el.style.top = position.startsWith(\"top\") ? \"8px\" : \"auto\";\n el.style.bottom = position.startsWith(\"bottom\") ? \"8px\" : \"auto\";\n el.style.left = position.endsWith(\"left\") ? \"8px\" : \"auto\";\n el.style.right = position.endsWith(\"right\") ? \"8px\" : \"auto\";\n}\n\nfunction renderDefaultLegend(\n state: readonly ChartSeriesState[],\n container: HTMLElement,\n chart: Chart,\n toggleOnClick: boolean,\n): void {\n container.replaceChildren();\n\n for (const item of state) {\n const row = document.createElement(\"button\");\n row.type = \"button\";\n row.style.display = \"flex\";\n row.style.alignItems = \"center\";\n row.style.gap = \"6px\";\n row.style.width = \"100%\";\n row.style.border = \"0\";\n row.style.padding = \"2px 4px\";\n row.style.background = \"transparent\";\n row.style.color = item.visible ? \"#dbeafe\" : \"#789\";\n row.style.font = \"11px ui-monospace, monospace, sans-serif\";\n row.style.textAlign = \"left\";\n row.style.cursor = toggleOnClick ? \"pointer\" : \"default\";\n row.style.opacity = item.visible ? \"1\" : \"0.45\";\n\n const swatch = document.createElement(\"span\");\n swatch.style.width = \"10px\";\n swatch.style.height = \"10px\";\n swatch.style.borderRadius = \"2px\";\n swatch.style.background = rgba(item.color);\n swatch.style.flex = \"0 0 auto\";\n\n const label = document.createElement(\"span\");\n label.textContent = item.name ?? item.id ?? `${item.mode} ${item.index + 1}`;\n\n row.append(swatch, label);\n if (toggleOnClick) {\n row.addEventListener(\"click\", () => {\n chart.setSeriesVisible(item.series, !item.visible);\n });\n }\n container.appendChild(row);\n }\n}\n\nexport function legendPlugin(options: LegendPluginOptions = {}): ChartPlugin {\n return {\n install(chart: Chart) {\n const container = document.createElement(\"div\");\n container.className = options.className ?? \"blazeplot-legend\";\n container.style.position = \"absolute\";\n container.style.zIndex = \"20\";\n container.style.pointerEvents = \"auto\";\n container.style.padding = \"6px\";\n container.style.border = \"1px solid rgba(148, 163, 184, 0.22)\";\n container.style.borderRadius = \"6px\";\n container.style.background = \"rgba(15, 23, 42, 0.72)\";\n container.style.backdropFilter = \"blur(4px)\";\n container.style.userSelect = \"none\";\n applyPosition(container, options.position ?? \"top-right\");\n chart.rootElement.appendChild(container);\n\n const render = (): void => {\n const state = chart.getSeriesState();\n if (options.render) {\n options.render(state, container, chart);\n } else {\n renderDefaultLegend(state, container, chart, options.toggleOnClick !== false);\n }\n };\n\n const unsubscribe = chart.subscribe(\"serieschange\", render);\n render();\n\n return () => {\n unsubscribe();\n container.remove();\n };\n },\n };\n}\n"],"mappings":";AASA,SAAS,EAAK,GAA0D;CACtE,OAAO,QAAQ,KAAK,MAAM,EAAM,KAAK,GAAG,EAAE,IAAI,KAAK,MAAM,EAAM,KAAK,GAAG,EAAE,IAAI,KAAK,MAAM,EAAM,KAAK,GAAG,EAAE,IAAI,EAAM,GAAG;AACvH;AAEA,SAAS,EAAc,GAAiB,GAA8D;CAIpG,AAHA,EAAG,MAAM,MAAM,EAAS,WAAW,KAAK,IAAI,QAAQ,QACpD,EAAG,MAAM,SAAS,EAAS,WAAW,QAAQ,IAAI,QAAQ,QAC1D,EAAG,MAAM,OAAO,EAAS,SAAS,MAAM,IAAI,QAAQ,QACpD,EAAG,MAAM,QAAQ,EAAS,SAAS,OAAO,IAAI,QAAQ;AACxD;AAEA,SAAS,EACP,GACA,GACA,GACA,GACM;CACN,EAAU,gBAAgB;CAE1B,KAAK,IAAM,KAAQ,GAAO;EACxB,IAAM,IAAM,SAAS,cAAc,QAAQ;EAa3C,AAZA,EAAI,OAAO,UACX,EAAI,MAAM,UAAU,QACpB,EAAI,MAAM,aAAa,UACvB,EAAI,MAAM,MAAM,OAChB,EAAI,MAAM,QAAQ,QAClB,EAAI,MAAM,SAAS,KACnB,EAAI,MAAM,UAAU,WACpB,EAAI,MAAM,aAAa,eACvB,EAAI,MAAM,QAAQ,EAAK,UAAU,YAAY,QAC7C,EAAI,MAAM,OAAO,4CACjB,EAAI,MAAM,YAAY,QACtB,EAAI,MAAM,SAAS,IAAgB,YAAY,WAC/C,EAAI,MAAM,UAAU,EAAK,UAAU,MAAM;EAEzC,IAAM,IAAS,SAAS,cAAc,MAAM;EAK5C,AAJA,EAAO,MAAM,QAAQ,QACrB,EAAO,MAAM,SAAS,QACtB,EAAO,MAAM,eAAe,OAC5B,EAAO,MAAM,aAAa,EAAK,EAAK,KAAK,GACzC,EAAO,MAAM,OAAO;EAEpB,IAAM,IAAQ,SAAS,cAAc,MAAM;EAS3C,AARA,EAAM,cAAc,EAAK,QAAQ,EAAK,MAAM,GAAG,EAAK,KAAK,GAAG,EAAK,QAAQ,KAEzE,EAAI,OAAO,GAAQ,CAAK,GACpB,KACF,EAAI,iBAAiB,eAAe;GAClC,EAAM,iBAAiB,EAAK,QAAQ,CAAC,EAAK,OAAO;EACnD,CAAC,GAEH,EAAU,YAAY,CAAG;CAC3B;AACF;AAEA,SAAgB,EAAa,IAA+B,CAAC,GAAgB;CAC3E,OAAO,EACL,QAAQ,GAAc;EACpB,IAAM,IAAY,SAAS,cAAc,KAAK;EAY9C,AAXA,EAAU,YAAY,EAAQ,aAAa,oBAC3C,EAAU,MAAM,WAAW,YAC3B,EAAU,MAAM,SAAS,MACzB,EAAU,MAAM,gBAAgB,QAChC,EAAU,MAAM,UAAU,OAC1B,EAAU,MAAM,SAAS,uCACzB,EAAU,MAAM,eAAe,OAC/B,EAAU,MAAM,aAAa,0BAC7B,EAAU,MAAM,iBAAiB,aACjC,EAAU,MAAM,aAAa,QAC7B,EAAc,GAAW,EAAQ,YAAY,WAAW,GACxD,EAAM,YAAY,YAAY,CAAS;EAEvC,IAAM,UAAqB;GACzB,IAAM,IAAQ,EAAM,eAAe;GACnC,AAAI,EAAQ,SACV,EAAQ,OAAO,GAAO,GAAW,CAAK,IAEtC,EAAoB,GAAO,GAAW,GAAO,EAAQ,kBAAkB,EAAK;EAEhF,GAEM,IAAc,EAAM,UAAU,gBAAgB,CAAM;EAG1D,OAFA,EAAO,SAEM;GAEX,AADA,EAAY,GACZ,EAAU,OAAO;EACnB;CACF,EACF;AACF"}
1
+ {"version":3,"file":"legend.js","names":[],"sources":["../../src/ui/Legend.ts"],"sourcesContent":["import type { Chart, ChartPlugin, ChartSeriesState } from \"./Chart.js\";\n\nexport interface LegendPluginOptions {\n readonly className?: string;\n readonly position?: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n readonly toggleOnClick?: boolean;\n readonly backgroundColor?: string;\n readonly borderColor?: string;\n readonly textColor?: string;\n readonly mutedTextColor?: string;\n readonly font?: string;\n readonly render?: (state: readonly ChartSeriesState[], container: HTMLElement, chart: Chart) => void;\n}\n\nfunction rgba(color: readonly [number, number, number, number]): string {\n return `rgba(${Math.round(color[0] * 255)}, ${Math.round(color[1] * 255)}, ${Math.round(color[2] * 255)}, ${color[3]})`;\n}\n\nfunction applyPosition(el: HTMLElement, position: NonNullable<LegendPluginOptions[\"position\"]>): void {\n el.style.top = position.startsWith(\"top\") ? \"8px\" : \"auto\";\n el.style.bottom = position.startsWith(\"bottom\") ? \"8px\" : \"auto\";\n el.style.left = position.endsWith(\"left\") ? \"8px\" : \"auto\";\n el.style.right = position.endsWith(\"right\") ? \"8px\" : \"auto\";\n}\n\nfunction legendBorder(options: LegendPluginOptions, chart: Chart): string {\n const color = options.borderColor ?? chart.theme.legendBorderColor;\n return color === \"transparent\" ? \"0\" : `1px solid ${color}`;\n}\n\nfunction renderDefaultLegend(\n state: readonly ChartSeriesState[],\n container: HTMLElement,\n chart: Chart,\n toggleOnClick: boolean,\n options: LegendPluginOptions,\n): void {\n container.replaceChildren();\n\n for (const item of state) {\n const row = document.createElement(\"button\");\n row.type = \"button\";\n row.style.display = \"flex\";\n row.style.alignItems = \"center\";\n row.style.gap = \"6px\";\n row.style.border = \"0\";\n row.style.margin = \"0\";\n row.style.padding = \"0\";\n row.style.appearance = \"none\";\n row.style.background = \"transparent\";\n row.style.color = item.visible\n ? options.textColor ?? chart.theme.legendTextColor\n : options.mutedTextColor ?? chart.theme.legendMutedTextColor;\n row.style.font = \"inherit\";\n row.style.textAlign = \"left\";\n row.style.cursor = toggleOnClick ? \"pointer\" : \"default\";\n row.style.opacity = item.visible ? \"1\" : \"0.45\";\n\n const swatch = document.createElement(\"span\");\n swatch.textContent = \"\\u2588\";\n swatch.style.color = rgba(item.color);\n swatch.style.flex = \"0 0 auto\";\n\n const label = document.createElement(\"span\");\n label.textContent = item.name ?? item.id ?? `${item.mode} ${item.index + 1}`;\n\n row.append(swatch, label);\n if (toggleOnClick) {\n row.addEventListener(\"click\", () => {\n chart.setSeriesVisible(item.series, !item.visible);\n });\n }\n container.appendChild(row);\n }\n}\n\nexport function legendPlugin(options: LegendPluginOptions = {}): ChartPlugin {\n return {\n install(chart: Chart) {\n const container = document.createElement(\"div\");\n container.className = options.className ?? \"blazeplot-legend\";\n container.style.position = \"absolute\";\n container.style.zIndex = \"20\";\n container.style.pointerEvents = \"auto\";\n container.style.padding = \"8px 10px\";\n container.style.border = legendBorder(options, chart);\n container.style.background = options.backgroundColor ?? chart.theme.legendBackgroundColor;\n container.style.color = options.textColor ?? chart.theme.legendTextColor;\n container.style.font = options.font ?? chart.theme.legendFont;\n container.style.whiteSpace = \"pre\";\n container.style.userSelect = \"none\";\n applyPosition(container, options.position ?? \"top-right\");\n chart.rootElement.appendChild(container);\n\n const render = (): void => {\n const state = chart.getSeriesState();\n if (options.render) {\n options.render(state, container, chart);\n } else {\n renderDefaultLegend(state, container, chart, options.toggleOnClick !== false, options);\n }\n };\n\n const unsubscribe = chart.subscribe(\"serieschange\", render);\n render();\n\n return () => {\n unsubscribe();\n container.remove();\n };\n },\n };\n}\n"],"mappings":"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"}
@@ -21,7 +21,7 @@ function r(r, i, a) {
21
21
  function i(e = {}) {
22
22
  return { install(t) {
23
23
  let i = document.createElement("div");
24
- i.className = e.className ?? "blazeplot-tooltip", i.style.position = "absolute", i.style.zIndex = "30", i.style.display = "none", i.style.pointerEvents = "none", i.style.background = "rgba(4, 8, 16, 0.85)", i.style.color = "#bfd6ff", i.style.font = "11px/1.35 ui-monospace, monospace", i.style.padding = "8px 10px", i.style.whiteSpace = "pre", t.rootElement.appendChild(i);
24
+ i.className = e.className ?? "blazeplot-tooltip", i.style.position = "absolute", i.style.zIndex = "30", i.style.display = "none", i.style.pointerEvents = "none", i.style.background = e.backgroundColor ?? t.theme.tooltipBackgroundColor, i.style.color = e.textColor ?? t.theme.tooltipTextColor, i.style.font = e.font ?? t.theme.tooltipFont, i.style.padding = "8px 10px", i.style.whiteSpace = "pre", t.rootElement.appendChild(i);
25
25
  let a = document.createElement("div");
26
26
  a.className = "blazeplot-tooltip-markers", a.style.position = "absolute", a.style.inset = "0", a.style.zIndex = "25", a.style.pointerEvents = "none", t.plotElement.appendChild(a);
27
27
  let o = (t) => {
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip.js","names":[],"sources":["../../src/ui/Tooltip.ts"],"sourcesContent":["import type { Chart, ChartHoverState, ChartPickItem, ChartPickMode, ChartPlugin } from \"./Chart.js\";\n\nexport interface TooltipPluginOptions {\n readonly className?: string;\n readonly mode?: ChartPickMode;\n readonly maxDistancePx?: number;\n readonly offsetX?: number;\n readonly offsetY?: number;\n readonly highlight?: boolean;\n readonly formatter?: (item: ChartPickItem, state: ChartHoverState) => string;\n readonly render?: (state: ChartHoverState, container: HTMLElement, chart: Chart) => void;\n}\n\nfunction labelOf(item: ChartPickItem): string {\n return item.name ?? item.id ?? `${item.mode} ${item.seriesIndex + 1}`;\n}\n\nfunction formatNumber(value: number): string {\n if (!Number.isFinite(value)) return String(value);\n const abs = Math.abs(value);\n if (abs > 0 && (abs < 1e-3 || abs >= 1e6)) return value.toExponential(3);\n return Number(value.toPrecision(6)).toString();\n}\n\nfunction rgba(color: readonly [number, number, number, number]): string {\n return `rgba(${Math.round(color[0] * 255)}, ${Math.round(color[1] * 255)}, ${Math.round(color[2] * 255)}, ${color[3]})`;\n}\n\nfunction renderDefaultTooltip(\n state: ChartHoverState,\n container: HTMLElement,\n formatter: TooltipPluginOptions[\"formatter\"],\n): void {\n const pad = Math.max(1, ...state.items.map((item) => labelOf(item).length));\n let html = \"\";\n for (const item of state.items) {\n const value = formatter ? formatter(item, state) : `(${formatNumber(item.x)}, ${formatNumber(item.y)})`;\n const color = rgba(item.series.style.color);\n if (html) html += \"<br>\";\n html += `<span style=\"color:${color}\">\\u2588</span> ${labelOf(item).padEnd(pad)} ${value}`;\n }\n container.innerHTML = html;\n}\n\nexport function tooltipPlugin(options: TooltipPluginOptions = {}): ChartPlugin {\n return {\n install(chart: Chart) {\n const container = document.createElement(\"div\");\n container.className = options.className ?? \"blazeplot-tooltip\";\n container.style.position = \"absolute\";\n container.style.zIndex = \"30\";\n container.style.display = \"none\";\n container.style.pointerEvents = \"none\";\n container.style.background = \"rgba(4, 8, 16, 0.85)\";\n container.style.color = \"#bfd6ff\";\n container.style.font = \"11px/1.35 ui-monospace, monospace\";\n container.style.padding = \"8px 10px\";\n container.style.whiteSpace = \"pre\";\n chart.rootElement.appendChild(container);\n\n const markerLayer = document.createElement(\"div\");\n markerLayer.className = \"blazeplot-tooltip-markers\";\n markerLayer.style.position = \"absolute\";\n markerLayer.style.inset = \"0\";\n markerLayer.style.zIndex = \"25\";\n markerLayer.style.pointerEvents = \"none\";\n chart.plotElement.appendChild(markerLayer);\n\n const renderMarkers = (state: ChartHoverState | null): void => {\n markerLayer.replaceChildren();\n if (options.highlight === false || !state) return;\n\n for (const item of state.items) {\n const marker = document.createElement(\"div\");\n marker.style.position = \"absolute\";\n marker.style.left = `${item.plotX}px`;\n marker.style.top = `${item.plotY}px`;\n marker.style.width = \"10px\";\n marker.style.height = \"10px\";\n marker.style.border = \"2px solid #f8fafc\";\n marker.style.borderRadius = \"999px\";\n marker.style.background = rgba(item.series.style.color);\n marker.style.boxShadow = \"0 0 0 2px rgba(4, 8, 16, 0.85)\";\n marker.style.transform = \"translate(-50%, -50%)\";\n markerLayer.appendChild(marker);\n }\n };\n\n const render = (state: ChartHoverState | null): void => {\n const effectiveState = state && (options.mode !== undefined || options.maxDistancePx !== undefined)\n ? chart.pick(state.clientX, state.clientY, options)\n : state;\n\n renderMarkers(effectiveState);\n if (!effectiveState || effectiveState.items.length === 0) {\n container.style.display = \"none\";\n return;\n }\n\n if (options.render) {\n options.render(effectiveState, container, chart);\n } else {\n renderDefaultTooltip(effectiveState, container, options.formatter);\n }\n\n const rootRect = chart.rootElement.getBoundingClientRect();\n const x = effectiveState.clientX - rootRect.left + (options.offsetX ?? 12);\n const y = effectiveState.clientY - rootRect.top + (options.offsetY ?? 12);\n container.style.transform = `translate(${x}px, ${y}px)`;\n container.style.display = \"block\";\n };\n\n const unsubscribe = chart.subscribe(\"hover\", render);\n return () => {\n unsubscribe();\n markerLayer.remove();\n container.remove();\n };\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"tooltip.js","names":[],"sources":["../../src/ui/Tooltip.ts"],"sourcesContent":["import type { Chart, ChartHoverState, ChartPickItem, ChartPickMode, ChartPlugin } from \"./Chart.js\";\n\nexport interface TooltipPluginOptions {\n readonly className?: string;\n readonly mode?: ChartPickMode;\n readonly maxDistancePx?: number;\n readonly offsetX?: number;\n readonly offsetY?: number;\n readonly highlight?: boolean;\n readonly backgroundColor?: string;\n readonly textColor?: string;\n readonly font?: string;\n readonly formatter?: (item: ChartPickItem, state: ChartHoverState) => string;\n readonly render?: (state: ChartHoverState, container: HTMLElement, chart: Chart) => void;\n}\n\nfunction labelOf(item: ChartPickItem): string {\n return item.name ?? item.id ?? `${item.mode} ${item.seriesIndex + 1}`;\n}\n\nfunction formatNumber(value: number): string {\n if (!Number.isFinite(value)) return String(value);\n const abs = Math.abs(value);\n if (abs > 0 && (abs < 1e-3 || abs >= 1e6)) return value.toExponential(3);\n return Number(value.toPrecision(6)).toString();\n}\n\nfunction rgba(color: readonly [number, number, number, number]): string {\n return `rgba(${Math.round(color[0] * 255)}, ${Math.round(color[1] * 255)}, ${Math.round(color[2] * 255)}, ${color[3]})`;\n}\n\nfunction renderDefaultTooltip(\n state: ChartHoverState,\n container: HTMLElement,\n formatter: TooltipPluginOptions[\"formatter\"],\n): void {\n const pad = Math.max(1, ...state.items.map((item) => labelOf(item).length));\n let html = \"\";\n for (const item of state.items) {\n const value = formatter ? formatter(item, state) : `(${formatNumber(item.x)}, ${formatNumber(item.y)})`;\n const color = rgba(item.series.style.color);\n if (html) html += \"<br>\";\n html += `<span style=\"color:${color}\">\\u2588</span> ${labelOf(item).padEnd(pad)} ${value}`;\n }\n container.innerHTML = html;\n}\n\nexport function tooltipPlugin(options: TooltipPluginOptions = {}): ChartPlugin {\n return {\n install(chart: Chart) {\n const container = document.createElement(\"div\");\n container.className = options.className ?? \"blazeplot-tooltip\";\n container.style.position = \"absolute\";\n container.style.zIndex = \"30\";\n container.style.display = \"none\";\n container.style.pointerEvents = \"none\";\n container.style.background = options.backgroundColor ?? chart.theme.tooltipBackgroundColor;\n container.style.color = options.textColor ?? chart.theme.tooltipTextColor;\n container.style.font = options.font ?? chart.theme.tooltipFont;\n container.style.padding = \"8px 10px\";\n container.style.whiteSpace = \"pre\";\n chart.rootElement.appendChild(container);\n\n const markerLayer = document.createElement(\"div\");\n markerLayer.className = \"blazeplot-tooltip-markers\";\n markerLayer.style.position = \"absolute\";\n markerLayer.style.inset = \"0\";\n markerLayer.style.zIndex = \"25\";\n markerLayer.style.pointerEvents = \"none\";\n chart.plotElement.appendChild(markerLayer);\n\n const renderMarkers = (state: ChartHoverState | null): void => {\n markerLayer.replaceChildren();\n if (options.highlight === false || !state) return;\n\n for (const item of state.items) {\n const marker = document.createElement(\"div\");\n marker.style.position = \"absolute\";\n marker.style.left = `${item.plotX}px`;\n marker.style.top = `${item.plotY}px`;\n marker.style.width = \"10px\";\n marker.style.height = \"10px\";\n marker.style.border = \"2px solid #f8fafc\";\n marker.style.borderRadius = \"999px\";\n marker.style.background = rgba(item.series.style.color);\n marker.style.boxShadow = \"0 0 0 2px rgba(4, 8, 16, 0.85)\";\n marker.style.transform = \"translate(-50%, -50%)\";\n markerLayer.appendChild(marker);\n }\n };\n\n const render = (state: ChartHoverState | null): void => {\n const effectiveState = state && (options.mode !== undefined || options.maxDistancePx !== undefined)\n ? chart.pick(state.clientX, state.clientY, options)\n : state;\n\n renderMarkers(effectiveState);\n if (!effectiveState || effectiveState.items.length === 0) {\n container.style.display = \"none\";\n return;\n }\n\n if (options.render) {\n options.render(effectiveState, container, chart);\n } else {\n renderDefaultTooltip(effectiveState, container, options.formatter);\n }\n\n const rootRect = chart.rootElement.getBoundingClientRect();\n const x = effectiveState.clientX - rootRect.left + (options.offsetX ?? 12);\n const y = effectiveState.clientY - rootRect.top + (options.offsetY ?? 12);\n container.style.transform = `translate(${x}px, ${y}px)`;\n container.style.display = \"block\";\n };\n\n const unsubscribe = chart.subscribe(\"hover\", render);\n return () => {\n unsubscribe();\n markerLayer.remove();\n container.remove();\n };\n },\n };\n}\n"],"mappings":";AAgBA,SAAS,EAAQ,GAA6B;CAC5C,OAAO,EAAK,QAAQ,EAAK,MAAM,GAAG,EAAK,KAAK,GAAG,EAAK,cAAc;AACpE;AAEA,SAAS,EAAa,GAAuB;CAC3C,IAAI,CAAC,OAAO,SAAS,CAAK,GAAG,OAAO,OAAO,CAAK;CAChD,IAAM,IAAM,KAAK,IAAI,CAAK;CAE1B,OADI,IAAM,MAAM,IAAM,QAAQ,KAAO,OAAa,EAAM,cAAc,CAAC,IAChE,OAAO,EAAM,YAAY,CAAC,CAAC,EAAE,SAAS;AAC/C;AAEA,SAAS,EAAK,GAA0D;CACtE,OAAO,QAAQ,KAAK,MAAM,EAAM,KAAK,GAAG,EAAE,IAAI,KAAK,MAAM,EAAM,KAAK,GAAG,EAAE,IAAI,KAAK,MAAM,EAAM,KAAK,GAAG,EAAE,IAAI,EAAM,GAAG;AACvH;AAEA,SAAS,EACP,GACA,GACA,GACM;CACN,IAAM,IAAM,KAAK,IAAI,GAAG,GAAG,EAAM,MAAM,KAAK,MAAS,EAAQ,CAAI,EAAE,MAAM,CAAC,GACtE,IAAO;CACX,KAAK,IAAM,KAAQ,EAAM,OAAO;EAC9B,IAAM,IAAQ,IAAY,EAAU,GAAM,CAAK,IAAI,IAAI,EAAa,EAAK,CAAC,EAAE,IAAI,EAAa,EAAK,CAAC,EAAE,IAC/F,IAAQ,EAAK,EAAK,OAAO,MAAM,KAAK;EAE1C,AADI,MAAM,KAAQ,SAClB,KAAQ,sBAAsB,EAAM,kBAAkB,EAAQ,CAAI,EAAE,OAAO,CAAG,EAAE,IAAI;CACtF;CACA,EAAU,YAAY;AACxB;AAEA,SAAgB,EAAc,IAAgC,CAAC,GAAgB;CAC7E,OAAO,EACL,QAAQ,GAAc;EACpB,IAAM,IAAY,SAAS,cAAc,KAAK;EAW9C,AAVA,EAAU,YAAY,EAAQ,aAAa,qBAC3C,EAAU,MAAM,WAAW,YAC3B,EAAU,MAAM,SAAS,MACzB,EAAU,MAAM,UAAU,QAC1B,EAAU,MAAM,gBAAgB,QAChC,EAAU,MAAM,aAAa,EAAQ,mBAAmB,EAAM,MAAM,wBACpE,EAAU,MAAM,QAAQ,EAAQ,aAAa,EAAM,MAAM,kBACzD,EAAU,MAAM,OAAO,EAAQ,QAAQ,EAAM,MAAM,aACnD,EAAU,MAAM,UAAU,YAC1B,EAAU,MAAM,aAAa,OAC7B,EAAM,YAAY,YAAY,CAAS;EAEvC,IAAM,IAAc,SAAS,cAAc,KAAK;EAMhD,AALA,EAAY,YAAY,6BACxB,EAAY,MAAM,WAAW,YAC7B,EAAY,MAAM,QAAQ,KAC1B,EAAY,MAAM,SAAS,MAC3B,EAAY,MAAM,gBAAgB,QAClC,EAAM,YAAY,YAAY,CAAW;EAEzC,IAAM,KAAiB,MAAwC;GAC7D,MAAY,gBAAgB,GACxB,IAAQ,cAAc,MAAS,CAAC,IAEpC,KAAK,IAAM,KAAQ,EAAM,OAAO;IAC9B,IAAM,IAAS,SAAS,cAAc,KAAK;IAW3C,AAVA,EAAO,MAAM,WAAW,YACxB,EAAO,MAAM,OAAO,GAAG,EAAK,MAAM,KAClC,EAAO,MAAM,MAAM,GAAG,EAAK,MAAM,KACjC,EAAO,MAAM,QAAQ,QACrB,EAAO,MAAM,SAAS,QACtB,EAAO,MAAM,SAAS,qBACtB,EAAO,MAAM,eAAe,SAC5B,EAAO,MAAM,aAAa,EAAK,EAAK,OAAO,MAAM,KAAK,GACtD,EAAO,MAAM,YAAY,kCACzB,EAAO,MAAM,YAAY,yBACzB,EAAY,YAAY,CAAM;GAChC;EACF,GA0BM,IAAc,EAAM,UAAU,UAxBpB,MAAwC;GACtD,IAAM,IAAiB,MAAU,EAAQ,SAAS,KAAA,KAAa,EAAQ,kBAAkB,KAAA,KACrF,EAAM,KAAK,EAAM,SAAS,EAAM,SAAS,CAAO,IAChD;GAGJ,IADA,EAAc,CAAc,GACxB,CAAC,KAAkB,EAAe,MAAM,WAAW,GAAG;IACxD,EAAU,MAAM,UAAU;IAC1B;GACF;GAEA,AAAI,EAAQ,SACV,EAAQ,OAAO,GAAgB,GAAW,CAAK,IAE/C,EAAqB,GAAgB,GAAW,EAAQ,SAAS;GAGnE,IAAM,IAAW,EAAM,YAAY,sBAAsB,GACnD,IAAI,EAAe,UAAU,EAAS,QAAQ,EAAQ,WAAW,KACjE,IAAI,EAAe,UAAU,EAAS,OAAO,EAAQ,WAAW;GAEtE,AADA,EAAU,MAAM,YAAY,aAAa,EAAE,MAAM,EAAE,MACnD,EAAU,MAAM,UAAU;EAC5B,CAEmD;EACnD,aAAa;GAGX,AAFA,EAAY,GACZ,EAAY,OAAO,GACnB,EAAU,OAAO;EACnB;CACF,EACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"ReglBackend.d.ts","sourceRoot":"","sources":["../../src/render/ReglBackend.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAA+B,MAAM,YAAY,CAAC;AA8BpI,qBAAa,WAAY,YAAW,UAAU;IAC5C,OAAO,CAAC,EAAE,CAAyB;IACnC,OAAO,CAAC,IAAI,CAAO;IACnB,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,YAAY,CAAuC;IAC3D,OAAO,CAAC,UAAU,CAA+D;IACjF,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC;gBAEtC,MAAM,EAAE,iBAAiB;IAiCrC,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS;IASzC,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,GAAG,WAAW,EAAE,MAAM,GAAE,MAAU,GAAG,IAAI;IAS3F,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU;IAQrD,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAuC1B,OAAO,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI;IAMpC,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAIvD,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAI1D,OAAO,IAAI,IAAI;IAKf,OAAO,CAAC,iBAAiB;IAkCzB,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,eAAe;CAUxB"}
1
+ {"version":3,"file":"ReglBackend.d.ts","sourceRoot":"","sources":["../../src/render/ReglBackend.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAA+B,MAAM,YAAY,CAAC;AA8BpI,qBAAa,WAAY,YAAW,UAAU;IAC5C,OAAO,CAAC,EAAE,CAAyB;IACnC,OAAO,CAAC,IAAI,CAAO;IACnB,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,YAAY,CAAuC;IAC3D,OAAO,CAAC,UAAU,CAA+D;IACjF,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC;gBAEtC,MAAM,EAAE,iBAAiB;IAiCrC,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS;IASzC,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,GAAG,WAAW,EAAE,MAAM,GAAE,MAAU,GAAG,IAAI;IAS3F,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU;IAQrD,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAuC1B,OAAO,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI;IAMpC,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAIvD,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAS1D,OAAO,IAAI,IAAI;IAKf,OAAO,CAAC,iBAAiB;IAkCzB,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,eAAe;CAUxB"}
@@ -1,7 +1,9 @@
1
1
  import { SeriesConfig, SeriesStyle, SeriesMode, SeriesSample } from '../core/types.js';
2
2
  import { SeriesStore } from '../core/SeriesStore.js';
3
- import { ViewportPolicy } from '../interaction/types.js';
3
+ import { Camera2D } from '../interaction/Camera2D.js';
4
+ import { PanIntent, ViewportPolicy, ZoomIntent } from '../interaction/types.js';
4
5
  import { AxisPosition } from './ChartLayout.js';
6
+ import { ChartTheme, ResolvedChartTheme } from './theme.js';
5
7
  export interface AxisConfig {
6
8
  readonly visible?: boolean;
7
9
  readonly position?: AxisPosition;
@@ -27,6 +29,7 @@ export interface ChartOptions {
27
29
  };
28
30
  readonly hover?: ChartPickOptions;
29
31
  readonly plugins?: readonly ChartPlugin[];
32
+ readonly theme?: ChartTheme;
30
33
  }
31
34
  export type TypedSeriesConfig = Omit<SeriesConfig, "mode">;
32
35
  export interface ChartSeriesState {
@@ -80,7 +83,6 @@ export declare class Chart {
80
83
  private camera;
81
84
  private axis;
82
85
  private renderer;
83
- private input;
84
86
  private rawLineBuffer;
85
87
  private rawLineData;
86
88
  private minMaxInstanceBuffer;
@@ -94,6 +96,7 @@ export declare class Chart {
94
96
  private readonly yTicks;
95
97
  private axisOverlay;
96
98
  private normalizedAxes;
99
+ private readonly resolvedTheme;
97
100
  private layout;
98
101
  private stats;
99
102
  private resizeObserver;
@@ -112,7 +115,20 @@ export declare class Chart {
112
115
  get canvas(): HTMLCanvasElement;
113
116
  get rootElement(): HTMLElement;
114
117
  get plotElement(): HTMLElement;
118
+ get xAxisElement(): HTMLElement;
119
+ get yAxisElement(): HTMLElement;
120
+ get theme(): ResolvedChartTheme;
121
+ getCamera(): Camera2D;
115
122
  dataToPlot(x: number, y: number): [number, number];
123
+ clientToData(clientX: number, clientY: number): [number, number] | null;
124
+ getViewport(): {
125
+ xMin: number;
126
+ xMax: number;
127
+ yMin: number;
128
+ yMax: number;
129
+ };
130
+ pan(intent: PanIntent): void;
131
+ zoom(intent: ZoomIntent): void;
116
132
  addSeries(config: SeriesConfig, style?: Partial<SeriesStyle>): SeriesStore;
117
133
  addLine(config: TypedSeriesConfig, style?: Partial<SeriesStyle>): SeriesStore;
118
134
  addArea(config: TypedSeriesConfig, style?: Partial<SeriesStyle>): SeriesStore;
@@ -1 +1 @@
1
- {"version":3,"file":"Chart.d.ts","sourceRoot":"","sources":["../../src/ui/Chart.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Chart.d.ts","sourceRoot":"","sources":["../../src/ui/Chart.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { ViewportPolicy, ZoomAxis } from '../interaction/types.js';
2
+ import { ChartPlugin } from './Chart.js';
3
+ export interface InteractionsPluginOptions {
4
+ readonly axis?: ZoomAxis;
5
+ readonly viewportPolicy?: ViewportPolicy;
6
+ readonly boxZoom?: boolean;
7
+ readonly wheelZoom?: boolean;
8
+ readonly axisInteractions?: boolean;
9
+ readonly axisHover?: boolean;
10
+ readonly axisHoverColor?: string;
11
+ readonly axisHoverFilter?: string;
12
+ readonly shiftDragPan?: boolean;
13
+ readonly doubleClickReset?: boolean;
14
+ readonly minDragDistancePx?: number;
15
+ readonly selectionFill?: string;
16
+ readonly selectionStroke?: string;
17
+ }
18
+ export declare function interactionsPlugin(options?: InteractionsPluginOptions): ChartPlugin;
19
+ //# sourceMappingURL=Interactions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Interactions.d.ts","sourceRoot":"","sources":["../../src/ui/Interactions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAa,cAAc,EAAE,QAAQ,EAAc,MAAM,yBAAyB,CAAC;AAC/F,OAAO,KAAK,EAAS,WAAW,EAAE,MAAM,YAAY,CAAC;AAErD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACnC;AAuED,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,yBAA8B,GAAG,WAAW,CA2RvF"}
@@ -3,6 +3,11 @@ export interface LegendPluginOptions {
3
3
  readonly className?: string;
4
4
  readonly position?: "top-left" | "top-right" | "bottom-left" | "bottom-right";
5
5
  readonly toggleOnClick?: boolean;
6
+ readonly backgroundColor?: string;
7
+ readonly borderColor?: string;
8
+ readonly textColor?: string;
9
+ readonly mutedTextColor?: string;
10
+ readonly font?: string;
6
11
  readonly render?: (state: readonly ChartSeriesState[], container: HTMLElement, chart: Chart) => void;
7
12
  }
8
13
  export declare function legendPlugin(options?: LegendPluginOptions): ChartPlugin;
@@ -1 +1 @@
1
- {"version":3,"file":"Legend.d.ts","sourceRoot":"","sources":["../../src/ui/Legend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEvE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,UAAU,GAAG,WAAW,GAAG,aAAa,GAAG,cAAc,CAAC;IAC9E,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,gBAAgB,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACtG;AAyDD,wBAAgB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,WAAW,CAmC3E"}
1
+ {"version":3,"file":"Legend.d.ts","sourceRoot":"","sources":["../../src/ui/Legend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEvE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,UAAU,GAAG,WAAW,GAAG,aAAa,GAAG,cAAc,CAAC;IAC9E,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,gBAAgB,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACtG;AAgED,wBAAgB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,WAAW,CAoC3E"}
@@ -6,6 +6,9 @@ export interface TooltipPluginOptions {
6
6
  readonly offsetX?: number;
7
7
  readonly offsetY?: number;
8
8
  readonly highlight?: boolean;
9
+ readonly backgroundColor?: string;
10
+ readonly textColor?: string;
11
+ readonly font?: string;
9
12
  readonly formatter?: (item: ChartPickItem, state: ChartHoverState) => string;
10
13
  readonly render?: (state: ChartHoverState, container: HTMLElement, chart: Chart) => void;
11
14
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Tooltip.d.ts","sourceRoot":"","sources":["../../src/ui/Tooltip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEpG,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,eAAe,KAAK,MAAM,CAAC;IAC7E,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAC1F;AAiCD,wBAAgB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,WAAW,CA4E7E"}
1
+ {"version":3,"file":"Tooltip.d.ts","sourceRoot":"","sources":["../../src/ui/Tooltip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEpG,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,eAAe,KAAK,MAAM,CAAC;IAC7E,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAC1F;AAiCD,wBAAgB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,WAAW,CA4E7E"}
@@ -0,0 +1,41 @@
1
+ export type RgbaColor = readonly [number, number, number, number];
2
+ export type CssColor = string;
3
+ export type ThemeColor = RgbaColor | CssColor;
4
+ export interface ChartTheme {
5
+ readonly backgroundColor?: ThemeColor;
6
+ readonly gridColor?: ThemeColor;
7
+ readonly axisColor?: string;
8
+ readonly axisFont?: string;
9
+ readonly seriesColors?: readonly ThemeColor[];
10
+ readonly tooltipBackgroundColor?: string;
11
+ readonly tooltipTextColor?: string;
12
+ readonly tooltipFont?: string;
13
+ readonly legendBackgroundColor?: string;
14
+ readonly legendBorderColor?: string;
15
+ readonly legendTextColor?: string;
16
+ readonly legendMutedTextColor?: string;
17
+ readonly legendFont?: string;
18
+ }
19
+ export interface ResolvedChartTheme {
20
+ readonly backgroundColor: RgbaColor;
21
+ readonly backgroundCssColor: string;
22
+ readonly gridColor: RgbaColor;
23
+ readonly axisColor: string;
24
+ readonly axisFont: string;
25
+ readonly seriesColors: readonly RgbaColor[];
26
+ readonly tooltipBackgroundColor: string;
27
+ readonly tooltipTextColor: string;
28
+ readonly tooltipFont: string;
29
+ readonly legendBackgroundColor: string;
30
+ readonly legendBorderColor: string;
31
+ readonly legendTextColor: string;
32
+ readonly legendMutedTextColor: string;
33
+ readonly legendFont: string;
34
+ }
35
+ export declare const DEFAULT_CHART_THEME: ResolvedChartTheme;
36
+ export declare function resolveChartTheme(theme: ChartTheme | undefined, context?: Element): ResolvedChartTheme;
37
+ export declare function resolveThemeColor(color: ThemeColor | undefined, fallback: RgbaColor, context?: Element): RgbaColor;
38
+ export declare function themeColorToCss(color: ThemeColor | undefined, fallback: string): string;
39
+ export declare function rgbaCss(color: RgbaColor): string;
40
+ export declare function resolveCssColor(color: string, context?: Element): string | null;
41
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/ui/theme.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAClE,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAC9B,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE9C,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,eAAe,CAAC,EAAE,UAAU,CAAC;IACtC,QAAQ,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IAC9C,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,eAAe,EAAE,SAAS,CAAC;IACpC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,SAAS,SAAS,EAAE,CAAC;IAC5C,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAWD,eAAO,MAAM,mBAAmB,EAAE,kBAejC,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,kBAAkB,CA4BtG;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAOlH;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGvF;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAEhD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAe/E"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blazeplot",
3
- "version": "0.1.10",
3
+ "version": "0.1.11",
4
4
  "author": {
5
5
  "name": "BlazePlot contributors"
6
6
  },
@@ -28,6 +28,10 @@
28
28
  "types": "./dist/plugins/tooltip.d.ts",
29
29
  "import": "./dist/plugins/tooltip.js"
30
30
  },
31
+ "./plugins/interactions": {
32
+ "types": "./dist/plugins/interactions.d.ts",
33
+ "import": "./dist/plugins/interactions.js"
34
+ },
31
35
  "./package.json": "./package.json"
32
36
  },
33
37
  "files": [