@wick-charts/vue 0.6.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -72,6 +72,30 @@ chart.setSeriesData(seriesId, data);
72
72
 
73
73
  There's no separate `@wick-charts/core` package on npm — the three framework packages are the supported way to install the engine.
74
74
 
75
+ ### Drop-in `<script>` — no build step
76
+
77
+ For a CodePen, JSFiddle, or a plain HTML page, load the prebuilt UMD bundle from a CDN — no npm, no bundler. It exposes the whole engine (every `ChartInstance`, series def, theme, and painter) as a `WickCharts` global:
78
+
79
+ ```html
80
+ <div id="chart" style="width: 640px; height: 320px"></div>
81
+
82
+ <script src="https://cdn.jsdelivr.net/npm/@wick-charts/react/dist/wick-charts.umd.min.js"></script>
83
+ <script>
84
+ const { ChartInstance, LineSeriesDef } = WickCharts;
85
+
86
+ const chart = new ChartInstance(document.getElementById('chart'));
87
+ const id = chart.addSeries(LineSeriesDef);
88
+ chart.setLayerColors(id, ['#22c55e']);
89
+ chart.setSeriesData(id, [
90
+ { time: Date.now() - 2 * 86_400_000, value: 100 },
91
+ { time: Date.now() - 86_400_000, value: 118 },
92
+ { time: Date.now(), value: 109 },
93
+ ]);
94
+ </script>
95
+ ```
96
+
97
+ The same file is on unpkg (`https://unpkg.com/@wick-charts/react/dist/wick-charts.umd.min.js`); pin a version with `@x.y.z` for production. ~72 kB gzipped, self-contained.
98
+
75
99
  ## Bundle size
76
100
 
77
101
  Packages ship per-module ESM with `sideEffects: false`, and each series component carries its own renderer — your bundler only ships the chart types you import.
@@ -80,9 +104,9 @@ Tree-shaken React scenarios via `pnpm size` (esbuild, minified, browser target,
80
104
 
81
105
  | Scenario | Raw | Gzip | Brotli |
82
106
  |---|---:|---:|---:|
83
- | Candlestick only | 83.3 kB | 25.9 kB | 22.9 kB |
84
- | Line only | 91.3 kB | 28.3 kB | 25.0 kB |
85
- | Full React | 180.3 kB | 55.5 kB | 47.1 kB |
107
+ | Candlestick only | 109.8 kB | 34.1 kB | 30.0 kB |
108
+ | Line only | 125.6 kB | 38.7 kB | 33.8 kB |
109
+ | Full React | 253.5 kB | 78.1 kB | 65.6 kB |
86
110
 
87
111
  ## Migration
88
112
 
@@ -1,20 +1,20 @@
1
- import { defineComponent as $, ref as r, shallowRef as M, provide as l, computed as P, onMounted as D, nextTick as h, onUnmounted as T, watch as d, openBlock as g, createElementBlock as p, normalizeStyle as j, createElementVNode as o, createCommentVNode as A, renderSlot as N } from "vue";
2
- import { ChartInstance as z } from "./core/dist/chart.js";
3
- import { deepEqual as H } from "./core/dist/utils/deep-equal.js";
4
- import { catppuccin as q } from "./core/dist/theme/themes/catppuccin.js";
5
- import { ChartKey as G, ThemeKey as I, TitleAnchorKey as U, InfoBarAnchorKey as F, LegendAnchorKey as J, LegendRightAnchorKey as Q, NavigatorAnchorKey as W } from "./context.js";
6
- const X = { style: { display: "flex", "flex-direction": "row", flex: "1", "min-height": "0" } }, Y = { style: { display: "flex", "flex-direction": "column", flex: "1", "min-width": "0", "min-height": "0" } }, Z = {
1
+ import { defineComponent as U, ref as r, shallowRef as P, provide as l, computed as v, onMounted as G, nextTick as g, onUnmounted as I, watch as d, openBlock as y, createElementBlock as m, normalizeStyle as q, createElementVNode as o, createCommentVNode as w, renderSlot as J } from "vue";
2
+ import { ChartInstance as T } from "./core/dist/chart.js";
3
+ import { deepEqual as z } from "./core/dist/utils/deep-equal.js";
4
+ import { catppuccin as Q } from "./core/dist/theme/themes/catppuccin.js";
5
+ import { ChartKey as W, ThemeKey as X, TitleAnchorKey as Y, InfoBarAnchorKey as Z, LegendAnchorKey as ee, LegendRightAnchorKey as te, NavigatorAnchorKey as ie } from "./context.js";
6
+ const ae = { style: { display: "flex", "flex-direction": "row", flex: "1", "min-height": "0" } }, oe = { style: { display: "flex", "flex-direction": "column", flex: "1", "min-width": "0", "min-height": "0" } }, ne = {
7
7
  key: 0,
8
8
  "data-chart-header": "",
9
9
  style: { "flex-shrink": "0", display: "flex", "flex-direction": "column", "pointer-events": "none" }
10
- }, ee = {
10
+ }, re = {
11
11
  key: 1,
12
12
  "data-chart-series-overlay": "",
13
13
  style: { position: "absolute", inset: "0", "pointer-events": "none", "z-index": "3" }
14
- }, le = /* @__PURE__ */ $({
14
+ }, H = 24, ce = /* @__PURE__ */ U({
15
15
  __name: "ChartContainer",
16
16
  props: {
17
- theme: { default: () => q.theme },
17
+ theme: { default: () => Q.theme },
18
18
  axis: {},
19
19
  padding: {},
20
20
  viewport: {},
@@ -22,6 +22,7 @@ const X = { style: { display: "flex", "flex-direction": "row", flex: "1", "min-h
22
22
  gradient: { type: Boolean, default: !0 },
23
23
  interactive: { type: Boolean, default: !0 },
24
24
  grid: {},
25
+ fade: { type: [Boolean, Object], default: void 0 },
25
26
  headerLayout: { default: "overlay" },
26
27
  animations: { type: [Boolean, Object] },
27
28
  perf: {},
@@ -33,76 +34,105 @@ const X = { style: { display: "flex", "flex-direction": "row", flex: "1", "min-h
33
34
  onVisibleRangeChange: {},
34
35
  onCrosshairMove: {}
35
36
  },
36
- setup(y) {
37
- const e = y, c = r(), n = M(null), m = M(e.theme), u = e.perf, v = e.onEdgeReached, w = r(null), b = r(null), R = r(null), C = r(null), _ = r(null), E = r(null);
38
- l(G, n), l(I, m), l(U, b), l(F, R), l(J, C), l(Q, _), l(W, E);
39
- let s = null;
40
- const k = r(0), B = P(() => e.headerLayout === "overlay" ? k.value : 0);
41
- function x() {
42
- if (!n.value) return;
43
- const i = { top: (e.padding?.top ?? 20) + B.value };
44
- e.padding?.bottom !== void 0 && (i.bottom = e.padding.bottom), e.padding?.right !== void 0 && (i.right = e.padding.right), e.padding?.left !== void 0 && (i.left = e.padding.left), n.value.setPadding(i);
37
+ setup(b) {
38
+ const e = b, s = r(), a = P(null), x = P(e.theme), c = e.perf, p = e.onEdgeReached, C = r(null), R = r(null), k = r(null), _ = r(null), E = r(null), B = r(null);
39
+ l(W, a), l(X, x), l(Y, R), l(Z, k), l(ee, _), l(te, E), l(ie, B);
40
+ let f = null;
41
+ const u = r(0), O = v(() => e.fade === !1 ? !1 : typeof e.fade == "object" ? e.fade.top !== void 0 || e.fade.overlap !== void 0 : e.fade === !0), S = v(() => {
42
+ if (!O.value) return 0;
43
+ const t = typeof e.fade == "object" ? e.fade.overlap : void 0;
44
+ return t !== void 0 ? Math.max(0, t) : u.value / 2;
45
+ }), j = v(() => {
46
+ if (!O.value) return 0;
47
+ if (typeof e.fade == "object" && e.fade.top !== void 0) return e.fade.top;
48
+ const t = e.headerLayout === "overlay" ? u.value : 0;
49
+ return t > 0 ? t + H : H;
50
+ }), L = v(
51
+ () => e.headerLayout === "overlay" ? Math.max(0, u.value - S.value) : 0
52
+ );
53
+ function A() {
54
+ if (!a.value) return;
55
+ const i = { top: (e.padding?.top ?? 20) + L.value };
56
+ e.padding?.bottom !== void 0 && (i.bottom = e.padding.bottom), e.padding?.right !== void 0 && (i.right = e.padding.right), e.padding?.left !== void 0 && (i.left = e.padding.left), a.value.setPadding(i);
57
+ }
58
+ function M(t) {
59
+ if (e.fade === !1) {
60
+ t.fade = { top: 0, right: 0, left: 0 };
61
+ return;
62
+ }
63
+ if (typeof e.fade != "object") return;
64
+ const i = {};
65
+ e.fade.top !== void 0 && (i.top = e.fade.top), e.fade.right !== void 0 && (i.right = e.fade.right), e.fade.left !== void 0 && (i.left = e.fade.left), t.fade = i;
66
+ }
67
+ function $() {
68
+ if (!a.value) return;
69
+ if (e.fade === !1) {
70
+ a.value.setFade({ top: 0, right: 0, left: 0 });
71
+ return;
72
+ }
73
+ const t = { top: j.value };
74
+ typeof e.fade == "object" && (e.fade.right !== void 0 && (t.right = e.fade.right), e.fade.left !== void 0 && (t.left = e.fade.left)), a.value.setFade(t);
45
75
  }
46
- function L() {
47
- s?.disconnect(), s = null;
48
- const t = e.headerLayout === "overlay" ? w.value : null;
76
+ function V() {
77
+ f?.disconnect(), f = null;
78
+ const t = e.headerLayout === "overlay" ? C.value : null;
49
79
  if (!t) {
50
- k.value = 0, x();
80
+ u.value = 0, A();
51
81
  return;
52
82
  }
53
83
  const i = () => {
54
- k.value = t.getBoundingClientRect().height, x();
84
+ u.value = t.getBoundingClientRect().height, A();
55
85
  };
56
- i(), s = new ResizeObserver(i), s.observe(t);
86
+ i(), f = new ResizeObserver(i), f.observe(t);
57
87
  }
58
- function V(t) {
59
- t.on("pointClick", (a) => e.onPointClick?.(a)), t.on("pointDoubleClick", (a) => e.onPointDoubleClick?.(a)), t.on("seriesHover", (a) => e.onSeriesHover?.(a)), t.on("crosshairMove", (a) => e.onCrosshairMove?.(a));
88
+ function K(t) {
89
+ t.on("pointClick", (n) => e.onPointClick?.(n)), t.on("pointDoubleClick", (n) => e.onPointDoubleClick?.(n)), t.on("seriesHover", (n) => e.onSeriesHover?.(n)), t.on("crosshairMove", (n) => e.onCrosshairMove?.(n));
60
90
  const i = () => e.onVisibleRangeChange?.(t.getVisibleRange());
61
91
  t.on("viewportChange", i), t.on("dataUpdate", i), t.on("seriesChange", i);
62
92
  }
63
- D(async () => {
64
- if (!c.value) return;
93
+ G(async () => {
94
+ if (!s.value) return;
65
95
  const t = {};
66
- e.axis && (t.axis = e.axis), e.theme && (t.theme = e.theme), e.padding && (t.padding = e.padding), e.viewport && (t.viewport = e.viewport), e.interactive !== void 0 && (t.interactive = e.interactive), e.grid !== void 0 && (t.grid = e.grid), u !== void 0 && (t.perf = u), v && (t.onEdgeReached = v), e.animations !== void 0 && (t.animations = e.animations), n.value = new z(c.value, t), V(n.value), e.onReady?.(n.value), await h(), L();
67
- }), T(() => {
68
- s?.disconnect(), s = null, n.value?.destroy(), n.value = null;
96
+ e.axis && (t.axis = e.axis), e.theme && (t.theme = e.theme), e.padding && (t.padding = e.padding), e.viewport && (t.viewport = e.viewport), e.interactive !== void 0 && (t.interactive = e.interactive), e.grid !== void 0 && (t.grid = e.grid), c !== void 0 && (t.perf = c), p && (t.onEdgeReached = p), e.animations !== void 0 && (t.animations = e.animations), M(t), a.value = new T(s.value, t), K(a.value), e.onReady?.(a.value), await g(), V();
97
+ }), I(() => {
98
+ f?.disconnect(), f = null, a.value?.destroy(), a.value = null;
69
99
  }), d(
70
100
  () => e.headerLayout,
71
101
  async () => {
72
- n.value && (await h(), L());
102
+ a.value && (await g(), V());
73
103
  }
74
104
  ), d(
75
105
  () => e.theme,
76
106
  (t) => {
77
- n.value && t && (n.value.setTheme(t), m.value = t);
107
+ a.value && t && (a.value.setTheme(t), x.value = t);
78
108
  }
79
109
  ), d(
80
110
  () => e.axis,
81
111
  (t) => {
82
- n.value && t && n.value.setAxis(t);
112
+ a.value && t && a.value.setAxis(t);
83
113
  },
84
114
  { deep: !0 }
85
115
  ), d(
86
116
  () => e.grid?.visible,
87
117
  () => {
88
- n.value && e.grid !== void 0 && n.value.setGrid(e.grid);
118
+ a.value && e.grid !== void 0 && a.value.setGrid(e.grid);
89
119
  }
90
120
  );
91
- let K = e.animations;
121
+ let D = e.animations;
92
122
  d(
93
123
  () => e.animations,
94
124
  async (t) => {
95
- if (H(t, K) || (K = t, !n.value || !c.value)) return;
96
- n.value.destroy(), n.value = null, await h();
125
+ if (z(t, D) || (D = t, !a.value || !s.value)) return;
126
+ a.value.destroy(), a.value = null, await g();
97
127
  const i = {};
98
- e.axis && (i.axis = e.axis), e.theme && (i.theme = e.theme), e.padding && (i.padding = e.padding), e.viewport && (i.viewport = e.viewport), e.interactive !== void 0 && (i.interactive = e.interactive), e.grid !== void 0 && (i.grid = e.grid), u !== void 0 && (i.perf = u), v && (i.onEdgeReached = v), t !== void 0 && (i.animations = t), n.value = new z(c.value, i), V(n.value), e.onReady?.(n.value);
128
+ e.axis && (i.axis = e.axis), e.theme && (i.theme = e.theme), e.padding && (i.padding = e.padding), e.viewport && (i.viewport = e.viewport), e.interactive !== void 0 && (i.interactive = e.interactive), e.grid !== void 0 && (i.grid = e.grid), c !== void 0 && (i.perf = c), p && (i.onEdgeReached = p), t !== void 0 && (i.animations = t), M(i), a.value = new T(s.value, i), K(a.value), e.onReady?.(a.value);
99
129
  }
100
130
  );
101
- let f;
131
+ let h;
102
132
  d(
103
- () => [n.value, e.visibleRange],
133
+ () => [a.value, e.visibleRange],
104
134
  async ([t, i]) => {
105
- !t || i === void 0 || f !== void 0 && f.instance === t && H(f.spec, i) || (f = { instance: t, spec: i }, await h(), t.setVisibleRange(i));
135
+ !t || i === void 0 || h !== void 0 && h.instance === t && z(h.spec, i) || (h = { instance: t, spec: i }, await g(), t.setVisibleRange(i));
106
136
  },
107
137
  { immediate: !0 }
108
138
  ), d(
@@ -111,75 +141,75 @@ const X = { style: { display: "flex", "flex-direction": "row", flex: "1", "min-h
111
141
  e.padding?.bottom,
112
142
  typeof e.padding?.right == "object" ? e.padding.right.intervals : e.padding?.right,
113
143
  typeof e.padding?.left == "object" ? e.padding.left.intervals : e.padding?.left,
114
- B.value
144
+ L.value
115
145
  ],
116
- x
117
- );
118
- const S = P(() => {
119
- const t = m.value, [i, a] = t?.chartGradient ?? ["transparent", "transparent"], O = t?.background ?? "transparent";
120
- return `position: relative; display: flex; flex-direction: column; width: 100%; height: 100%; min-height: 240px; overflow: hidden; background: ${e.gradient ? `linear-gradient(to bottom, ${i} 0%, ${O} 70%, ${a} 100%)` : O}`;
146
+ A
147
+ ), d(() => [a.value, j.value, e.fade], $, { immediate: !0 });
148
+ const N = v(() => {
149
+ const t = x.value, [i, n] = t?.chartGradient ?? ["transparent", "transparent"], F = t?.background ?? "transparent";
150
+ return `position: relative; display: flex; flex-direction: column; width: 100%; height: 100%; min-height: 240px; overflow: hidden; background: ${e.gradient ? `linear-gradient(to bottom, ${i} 0%, ${F} 70%, ${n} 100%)` : F}`;
121
151
  });
122
- return (t, i) => (g(), p("div", {
123
- style: j(S.value)
152
+ return (t, i) => (y(), m("div", {
153
+ style: q(N.value)
124
154
  }, [
125
- o("div", X, [
126
- o("div", Y, [
127
- y.headerLayout === "inline" ? (g(), p("div", Z, [
155
+ o("div", ae, [
156
+ o("div", oe, [
157
+ b.headerLayout === "inline" ? (y(), m("div", ne, [
128
158
  o("div", {
129
159
  ref_key: "titleAnchor",
130
- ref: b,
160
+ ref: R,
131
161
  "data-chart-title-anchor": ""
132
162
  }, null, 512),
133
163
  o("div", {
134
164
  ref_key: "infoBarAnchor",
135
- ref: R,
165
+ ref: k,
136
166
  "data-tooltip-legend-anchor": ""
137
167
  }, null, 512)
138
- ])) : A("", !0),
168
+ ])) : w("", !0),
139
169
  o("div", {
140
170
  ref_key: "containerRef",
141
- ref: c,
171
+ ref: s,
142
172
  style: { position: "relative", flex: "1", "min-width": "0", "min-height": "0", overflow: "hidden" }
143
173
  }, [
144
- y.headerLayout === "overlay" ? (g(), p("div", {
174
+ b.headerLayout === "overlay" ? (y(), m("div", {
145
175
  key: 0,
146
176
  ref_key: "topOverlayRef",
147
- ref: w,
177
+ ref: C,
148
178
  "data-chart-top-overlay": "",
149
179
  style: { position: "absolute", top: "0", left: "0", right: "0", "z-index": "2", "pointer-events": "none", display: "flex", "flex-direction": "column" }
150
180
  }, [
151
181
  o("div", {
152
182
  ref_key: "titleAnchor",
153
- ref: b,
183
+ ref: R,
154
184
  "data-chart-title-anchor": ""
155
185
  }, null, 512),
156
186
  o("div", {
157
187
  ref_key: "infoBarAnchor",
158
- ref: R,
188
+ ref: k,
159
189
  "data-tooltip-legend-anchor": ""
160
190
  }, null, 512)
161
- ], 512)) : A("", !0),
162
- n.value ? (g(), p("div", ee, [
163
- N(t.$slots, "default")
164
- ])) : A("", !0)
191
+ ], 512)) : w("", !0),
192
+ a.value ? (y(), m("div", re, [
193
+ J(t.$slots, "default")
194
+ ])) : w("", !0)
165
195
  ], 512)
166
196
  ]),
167
197
  o("div", {
168
198
  ref_key: "legendRightAnchor",
169
- ref: _,
199
+ ref: E,
170
200
  "data-legend-right-anchor": "",
171
201
  style: { flex: "0 0 auto" }
172
202
  }, null, 512)
173
203
  ]),
174
204
  o("div", {
175
205
  ref_key: "legendAnchor",
176
- ref: C,
206
+ ref: _,
177
207
  "data-legend-anchor": "",
178
208
  style: { flex: "0 0 auto" }
179
209
  }, null, 512),
180
210
  o("div", {
181
211
  ref_key: "navigatorAnchor",
182
- ref: E,
212
+ ref: B,
183
213
  "data-navigator-anchor": "",
184
214
  style: { flex: "0 0 auto" }
185
215
  }, null, 512)
@@ -187,5 +217,5 @@ const X = { style: { display: "flex", "flex-direction": "row", flex: "1", "min-h
187
217
  }
188
218
  });
189
219
  export {
190
- le as default
220
+ ce as default
191
221
  };
@@ -1,5 +1,15 @@
1
- import { DEFAULT_MAX_VISIBLE_BARS as o, MIN_VISIBLE_BARS as n } from "./pan-zoom-math.js";
2
- function s(t) {
1
+ import { DEFAULT_MAX_VISIBLE_BARS as i, MIN_VISIBLE_BARS as r } from "./pan-zoom-math.js";
2
+ function n(t) {
3
+ return t === void 0 || !Number.isFinite(t) || t <= 0 ? 0 : t;
4
+ }
5
+ function a(t) {
6
+ return {
7
+ top: n(t?.top),
8
+ right: t?.right === void 0 ? null : n(t.right),
9
+ left: n(t?.left)
10
+ };
11
+ }
12
+ function l(t) {
3
13
  if (!t) return { monitor: null, ownsMonitor: !1, hud: null };
4
14
  if (typeof t != "object" || !("monitor" in t || "recordFrame" in t))
5
15
  throw new Error(
@@ -7,29 +17,30 @@ function s(t) {
7
17
  );
8
18
  return "recordFrame" in t ? { monitor: t, ownsMonitor: !1, hud: null } : { monitor: t.monitor, ownsMonitor: t.ownsMonitor ?? !1, hud: t.hud ?? null };
9
19
  }
10
- const r = {
20
+ const e = {
11
21
  top: 20,
12
22
  bottom: 20,
13
23
  right: { intervals: 3 },
14
24
  left: { intervals: 0 }
15
25
  };
16
- function a(t) {
26
+ function f(t) {
17
27
  return {
18
- top: t?.top ?? r.top,
19
- bottom: t?.bottom ?? r.bottom,
20
- right: t?.right ?? r.right,
21
- left: t?.left ?? r.left
28
+ top: t?.top ?? e.top,
29
+ bottom: t?.bottom ?? e.bottom,
30
+ right: t?.right ?? e.right,
31
+ left: t?.left ?? e.left
22
32
  };
23
33
  }
24
- function f(t, e) {
25
- return typeof t == "number" && typeof e == "number" ? t === e : typeof t == "object" && typeof e == "object" ? t.intervals === e.intervals : !1;
34
+ function u(t, o) {
35
+ return typeof t == "number" && typeof o == "number" ? t === o : typeof t == "object" && typeof o == "object" ? t.intervals === o.intervals : !1;
26
36
  }
27
- function l(t) {
28
- return t === void 0 ? o : Number.isFinite(t) ? Math.max(n, Math.floor(t)) : o;
37
+ function m(t) {
38
+ return t === void 0 ? i : Number.isFinite(t) ? Math.max(r, Math.floor(t)) : i;
29
39
  }
30
40
  export {
31
- f as isSameHorizontalPadding,
32
- l as resolveMaxVisibleBars,
33
- a as resolvePadding,
34
- s as resolvePerfOptions
41
+ u as isSameHorizontalPadding,
42
+ a as resolveFade,
43
+ m as resolveMaxVisibleBars,
44
+ f as resolvePadding,
45
+ l as resolvePerfOptions
35
46
  };