basalt-ui 1.14.0 → 1.15.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/AGENTS.md +1 -1
- package/CHANGELOG.md +8 -0
- package/README.md +38 -2
- package/agent/rules/basalt-charts.md +260 -108
- package/agent/rules/basalt-mantine.md +4 -2
- package/agent/skills/basalt-charts/SKILL.md +114 -64
- package/agent/skills/basalt-design/SKILL.md +4 -3
- package/configs/oxlint-plugin.js +152 -0
- package/configs/oxlint-plugin.test.ts +107 -0
- package/configs/oxlint.json +2 -0
- package/dist/charts/cursor/resolve.d.ts +33 -0
- package/dist/charts/cursor/resolve.d.ts.map +1 -0
- package/dist/charts/cursor/resolve.js +61 -0
- package/dist/charts/cursor/resolve.test.d.ts +2 -0
- package/dist/charts/cursor/resolve.test.d.ts.map +1 -0
- package/dist/charts/cursor/scope.d.ts +17 -0
- package/dist/charts/cursor/scope.d.ts.map +1 -0
- package/dist/charts/cursor/scope.js +20 -0
- package/dist/charts/cursor/store.d.ts +31 -0
- package/dist/charts/cursor/store.d.ts.map +1 -0
- package/dist/charts/cursor/store.js +25 -0
- package/dist/charts/cursor/store.test.d.ts +2 -0
- package/dist/charts/cursor/store.test.d.ts.map +1 -0
- package/dist/charts/hooks/useChartCursor.d.ts +39 -0
- package/dist/charts/hooks/useChartCursor.d.ts.map +1 -0
- package/dist/charts/hooks/useChartCursor.js +104 -0
- package/dist/charts/hooks/useChartSize.d.ts +8 -4
- package/dist/charts/hooks/useChartSize.d.ts.map +1 -1
- package/dist/charts/index.d.ts +16 -13
- package/dist/charts/index.d.ts.map +1 -1
- package/dist/charts/index.js +38 -19
- package/dist/charts/kinds/Bars.d.ts +25 -47
- package/dist/charts/kinds/Bars.d.ts.map +1 -1
- package/dist/charts/kinds/Bars.js +230 -390
- package/dist/charts/kinds/Donut.d.ts +5 -4
- package/dist/charts/kinds/Donut.d.ts.map +1 -1
- package/dist/charts/kinds/Donut.js +17 -14
- package/dist/charts/kinds/DualPanel.d.ts.map +1 -1
- package/dist/charts/kinds/DualPanel.js +136 -90
- package/dist/charts/kinds/Heatmap.d.ts +15 -11
- package/dist/charts/kinds/Heatmap.d.ts.map +1 -1
- package/dist/charts/kinds/Heatmap.js +38 -22
- package/dist/charts/kinds/MultiLine.d.ts +27 -35
- package/dist/charts/kinds/MultiLine.d.ts.map +1 -1
- package/dist/charts/kinds/MultiLine.js +114 -237
- package/dist/charts/kinds/StackedArea.d.ts +21 -10
- package/dist/charts/kinds/StackedArea.d.ts.map +1 -1
- package/dist/charts/kinds/StackedArea.js +74 -132
- package/dist/charts/kinds/ZonedLine.d.ts +24 -40
- package/dist/charts/kinds/ZonedLine.d.ts.map +1 -1
- package/dist/charts/kinds/ZonedLine.js +103 -184
- package/dist/charts/layout/auto-margin.d.ts +60 -0
- package/dist/charts/layout/auto-margin.d.ts.map +1 -0
- package/dist/charts/layout/auto-margin.js +37 -0
- package/dist/charts/layout/auto-margin.test.d.ts +2 -0
- package/dist/charts/layout/auto-margin.test.d.ts.map +1 -0
- package/dist/charts/primitives/CartesianChart.d.ts +143 -0
- package/dist/charts/primitives/CartesianChart.d.ts.map +1 -0
- package/dist/charts/primitives/CartesianChart.js +349 -0
- package/dist/charts/primitives/CartesianChart.test.d.ts +2 -0
- package/dist/charts/primitives/CartesianChart.test.d.ts.map +1 -0
- package/dist/charts/primitives/ChartFrame.d.ts +16 -5
- package/dist/charts/primitives/ChartFrame.d.ts.map +1 -1
- package/dist/charts/primitives/ChartFrame.js +17 -2
- package/dist/charts/primitives/ChartLegend.d.ts +12 -1
- package/dist/charts/primitives/ChartLegend.d.ts.map +1 -1
- package/dist/charts/primitives/ChartLegend.js +21 -3
- package/dist/charts/primitives/ChartLegend.test.d.ts +2 -0
- package/dist/charts/primitives/ChartLegend.test.d.ts.map +1 -0
- package/dist/charts/primitives/ChartTooltip.d.ts +16 -16
- package/dist/charts/primitives/ChartTooltip.d.ts.map +1 -1
- package/dist/charts/primitives/ChartTooltip.js +45 -19
- package/dist/charts/primitives/HoverOverlay.d.ts +19 -4
- package/dist/charts/primitives/HoverOverlay.d.ts.map +1 -1
- package/dist/charts/primitives/HoverOverlay.js +22 -1
- package/dist/charts/primitives/XZoneRects.d.ts +40 -0
- package/dist/charts/primitives/XZoneRects.d.ts.map +1 -0
- package/dist/charts/primitives/XZoneRects.js +28 -0
- package/dist/charts/primitives/XZoneRects.test.d.ts +2 -0
- package/dist/charts/primitives/XZoneRects.test.d.ts.map +1 -0
- package/dist/charts/series.d.ts +16 -1
- package/dist/charts/series.d.ts.map +1 -1
- package/dist/charts/series.js +3 -1
- package/dist/charts/series.test.d.ts +2 -0
- package/dist/charts/series.test.d.ts.map +1 -0
- package/dist/charts/utils/measure-text.d.ts +25 -0
- package/dist/charts/utils/measure-text.d.ts.map +1 -0
- package/dist/charts/utils/measure-text.js +64 -0
- package/dist/charts/utils/measure-text.test.d.ts +2 -0
- package/dist/charts/utils/measure-text.test.d.ts.map +1 -0
- package/dist/content/fence-block.d.ts.map +1 -1
- package/dist/surfaces.d.ts +1 -1
- package/dist/surfaces.d.ts.map +1 -1
- package/dist/surfaces.js +1 -1
- package/dist/tokens/chart-margin.test.d.ts +2 -0
- package/dist/tokens/chart-margin.test.d.ts.map +1 -0
- package/dist/tokens/index.d.ts +29 -0
- package/dist/tokens/index.d.ts.map +1 -1
- package/dist/tokens/index.js +10 -0
- package/dist/tokens/palette.d.ts +4 -0
- package/dist/tokens/palette.d.ts.map +1 -1
- package/dist/tokens/palette.js +3 -0
- package/llms.txt +3 -3
- package/package.json +1 -1
- package/src/charts/cursor/resolve.test.ts +61 -0
- package/src/charts/cursor/resolve.ts +102 -0
- package/src/charts/cursor/scope.tsx +32 -0
- package/src/charts/cursor/store.test.ts +46 -0
- package/src/charts/cursor/store.ts +53 -0
- package/src/charts/hooks/useChartCursor.ts +163 -0
- package/src/charts/hooks/useChartSize.ts +8 -4
- package/src/charts/index.ts +34 -14
- package/src/charts/kinds/Bars.tsx +327 -460
- package/src/charts/kinds/Donut.tsx +31 -23
- package/src/charts/kinds/DualPanel.tsx +228 -134
- package/src/charts/kinds/Heatmap.tsx +72 -47
- package/src/charts/kinds/MultiLine.tsx +158 -294
- package/src/charts/kinds/StackedArea.tsx +116 -175
- package/src/charts/kinds/ZonedLine.tsx +148 -255
- package/src/charts/layout/auto-margin.test.ts +42 -0
- package/src/charts/layout/auto-margin.ts +110 -0
- package/src/charts/primitives/CartesianChart.test.ts +99 -0
- package/src/charts/primitives/CartesianChart.tsx +566 -0
- package/src/charts/primitives/ChartFrame.test.tsx +33 -0
- package/src/charts/primitives/ChartFrame.tsx +40 -4
- package/src/charts/primitives/ChartLegend.test.tsx +48 -0
- package/src/charts/primitives/ChartLegend.tsx +45 -2
- package/src/charts/primitives/ChartTooltip.tsx +67 -37
- package/src/charts/primitives/HoverOverlay.tsx +39 -3
- package/src/charts/primitives/XZoneRects.test.tsx +63 -0
- package/src/charts/primitives/XZoneRects.tsx +67 -0
- package/src/charts/series.test.ts +61 -0
- package/src/charts/series.ts +18 -1
- package/src/charts/utils/measure-text.test.ts +36 -0
- package/src/charts/utils/measure-text.ts +109 -0
- package/src/content/fence-block.tsx +2 -3
- package/src/surfaces.ts +2 -1
- package/src/theme/spacing.test.ts +2 -0
- package/src/tokens/chart-margin.test.ts +39 -0
- package/src/tokens/density.test.ts +1 -0
- package/src/tokens/index.ts +36 -0
- package/src/tokens/palette.ts +3 -0
- package/dist/charts/hooks/useChartTooltip.d.ts +0 -13
- package/dist/charts/hooks/useChartTooltip.d.ts.map +0 -1
- package/dist/charts/hooks/useChartTooltip.js +0 -26
- package/dist/charts/hooks/useHoverSync.d.ts +0 -46
- package/dist/charts/hooks/useHoverSync.d.ts.map +0 -1
- package/dist/charts/hooks/useHoverSync.js +0 -75
- package/dist/charts/hover-context.d.ts +0 -21
- package/dist/charts/hover-context.d.ts.map +0 -1
- package/dist/charts/hover-context.js +0 -12
- package/dist/charts/hover-sync.d.ts +0 -14
- package/dist/charts/hover-sync.d.ts.map +0 -1
- package/dist/charts/hover-sync.js +0 -17
- package/dist/charts/primitives/ResponsiveChart.d.ts +0 -45
- package/dist/charts/primitives/ResponsiveChart.d.ts.map +0 -1
- package/dist/charts/primitives/ResponsiveChart.js +0 -24
- package/src/charts/hooks/useChartTooltip.ts +0 -31
- package/src/charts/hooks/useHoverSync.ts +0 -152
- package/src/charts/hover-context.ts +0 -28
- package/src/charts/hover-sync.tsx +0 -37
- package/src/charts/primitives/ResponsiveChart.tsx +0 -64
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
function parseKey(key) {
|
|
2
|
+
if (/^[-+]?\d*\.?\d+$/.test(key)) {
|
|
3
|
+
const n = Number(key);
|
|
4
|
+
return Number.isFinite(n) ? n : null;
|
|
5
|
+
}
|
|
6
|
+
const t = Date.parse(key);
|
|
7
|
+
return Number.isNaN(t) ? null : t;
|
|
8
|
+
}
|
|
9
|
+
function buildDomainIndex(data, getKey) {
|
|
10
|
+
const byKey = /* @__PURE__ */ new Map();
|
|
11
|
+
const parsed = [];
|
|
12
|
+
let parseable = true;
|
|
13
|
+
for (const d of data) {
|
|
14
|
+
byKey.set(getKey(d), d);
|
|
15
|
+
if (!parseable) continue;
|
|
16
|
+
const value = parseKey(getKey(d));
|
|
17
|
+
if (value === null) parseable = false;
|
|
18
|
+
else parsed.push({ value, point: d });
|
|
19
|
+
}
|
|
20
|
+
if (!parseable || parsed.length < 2) return { byKey, values: [], points: [], step: 0 };
|
|
21
|
+
parsed.sort((a, b) => a.value - b.value);
|
|
22
|
+
const values = parsed.map((p) => p.value);
|
|
23
|
+
const points = parsed.map((p) => p.point);
|
|
24
|
+
const diffs = [];
|
|
25
|
+
for (let i = 1; i < values.length; i++) {
|
|
26
|
+
diffs.push(values[i] - values[i - 1]);
|
|
27
|
+
}
|
|
28
|
+
diffs.sort((a, b) => a - b);
|
|
29
|
+
return { byKey, values, points, step: diffs[Math.floor(diffs.length / 2)] ?? 0 };
|
|
30
|
+
}
|
|
31
|
+
function resolveCursorPoint(index, key) {
|
|
32
|
+
const exact = index.byKey.get(key);
|
|
33
|
+
if (exact !== void 0) return exact;
|
|
34
|
+
const target = parseKey(key);
|
|
35
|
+
if (target === null || index.values.length === 0) return null;
|
|
36
|
+
const first = index.values[0];
|
|
37
|
+
const last = index.values[index.values.length - 1];
|
|
38
|
+
if (target < first - index.step || target > last + index.step) return null;
|
|
39
|
+
let lo = 0;
|
|
40
|
+
let hi = index.values.length - 1;
|
|
41
|
+
while (lo < hi) {
|
|
42
|
+
const mid = lo + hi >> 1;
|
|
43
|
+
if (index.values[mid] < target) lo = mid + 1;
|
|
44
|
+
else hi = mid;
|
|
45
|
+
}
|
|
46
|
+
let best = lo;
|
|
47
|
+
let bestDist = Math.abs(index.values[lo] - target);
|
|
48
|
+
if (lo > 0) {
|
|
49
|
+
const prevDist = Math.abs(index.values[lo - 1] - target);
|
|
50
|
+
if (prevDist <= bestDist) {
|
|
51
|
+
best = lo - 1;
|
|
52
|
+
bestDist = prevDist;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return bestDist <= index.step ? index.points[best] : null;
|
|
56
|
+
}
|
|
57
|
+
export {
|
|
58
|
+
buildDomainIndex,
|
|
59
|
+
parseKey,
|
|
60
|
+
resolveCursorPoint
|
|
61
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.test.d.ts","sourceRoot":"","sources":["../../../src/charts/cursor/resolve.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { CursorState, CursorStore } from './store.js';
|
|
3
|
+
export type ChartCursorScopeProps = {
|
|
4
|
+
children: ReactNode;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* ISOLATES its subtree onto a private cursor store — the inverse of the removed `ChartHoverSync`, which
|
|
8
|
+
* had to be mounted to enable sharing at all. Charts share a cursor by default now; wrap a group
|
|
9
|
+
* in this only when it must NOT follow the rest of the page (e.g. two independent dashboards
|
|
10
|
+
* rendered side by side over the same calendar).
|
|
11
|
+
*/
|
|
12
|
+
export declare function ChartCursorScope({ children }: ChartCursorScopeProps): import("react").JSX.Element;
|
|
13
|
+
/** The cursor store this chart belongs to — the nearest `ChartCursorScope`, else the global one. */
|
|
14
|
+
export declare function useCursorStore(): CursorStore;
|
|
15
|
+
/** Subscribe to the ambient cursor. Re-renders only on an actual cursor change. */
|
|
16
|
+
export declare function useCursorState(): CursorState;
|
|
17
|
+
//# sourceMappingURL=scope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../../src/charts/cursor/scope.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAKvD,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,SAAS,CAAA;CACpB,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,EAAE,qBAAqB,+BAGnE;AAED,oGAAoG;AACpG,wBAAgB,cAAc,IAAI,WAAW,CAE5C;AAED,mFAAmF;AACnF,wBAAgB,cAAc,IAAI,WAAW,CAG5C"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext, useMemo, useSyncExternalStore } from "react";
|
|
3
|
+
import { createCursorStore, EMPTY_CURSOR, globalCursorStore } from "./store.js";
|
|
4
|
+
const CursorStoreContext = createContext(globalCursorStore);
|
|
5
|
+
function ChartCursorScope({ children }) {
|
|
6
|
+
const store = useMemo(() => createCursorStore(), []);
|
|
7
|
+
return /* @__PURE__ */ jsx(CursorStoreContext.Provider, { value: store, children });
|
|
8
|
+
}
|
|
9
|
+
function useCursorStore() {
|
|
10
|
+
return useContext(CursorStoreContext);
|
|
11
|
+
}
|
|
12
|
+
function useCursorState() {
|
|
13
|
+
const store = useCursorStore();
|
|
14
|
+
return useSyncExternalStore(store.subscribe, store.get, () => EMPTY_CURSOR);
|
|
15
|
+
}
|
|
16
|
+
export {
|
|
17
|
+
ChartCursorScope,
|
|
18
|
+
useCursorState,
|
|
19
|
+
useCursorStore
|
|
20
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The shared chart cursor — an external store, not a React context value.
|
|
3
|
+
*
|
|
4
|
+
* Sharing used to require a `ChartHoverSync` ancestor, so it was opt-in and silently absent
|
|
5
|
+
* whenever someone forgot the wrapper. This inverts that: a module-level store means every
|
|
6
|
+
* chart on the page shares a cursor by default, and `ChartCursorScope` exists to ISOLATE a
|
|
7
|
+
* subtree (`docs/CHARTS-SPEC.md` §3). Charts with non-overlapping domains never resolve each
|
|
8
|
+
* other's keys, so "shared by default" cannot produce a false cursor.
|
|
9
|
+
*
|
|
10
|
+
* External store rather than context for a second reason: a cursor move re-renders only the
|
|
11
|
+
* charts subscribed to it, instead of every descendant of a provider whose value object is new
|
|
12
|
+
* on each pointer frame.
|
|
13
|
+
*/
|
|
14
|
+
/** Broadcast cursor position: an opaque domain key plus the chart that owns it. */
|
|
15
|
+
export type CursorState = {
|
|
16
|
+
/** The hovered x-domain key (a date/category string), or null when nothing is hovered. */
|
|
17
|
+
key: string | null;
|
|
18
|
+
/** `chartId` of the chart the pointer is actually over — the one that owns the tooltip. */
|
|
19
|
+
source: string | null;
|
|
20
|
+
};
|
|
21
|
+
export type CursorStore = {
|
|
22
|
+
get: () => CursorState;
|
|
23
|
+
set: (key: string | null, source: string | null) => void;
|
|
24
|
+
subscribe: (onChange: () => void) => () => void;
|
|
25
|
+
};
|
|
26
|
+
/** Stable identity for "nothing hovered" — also the SSR snapshot, so it must never be recreated. */
|
|
27
|
+
export declare const EMPTY_CURSOR: CursorState;
|
|
28
|
+
export declare function createCursorStore(): CursorStore;
|
|
29
|
+
/** The default store every chart shares unless a `ChartCursorScope` overrides it. */
|
|
30
|
+
export declare const globalCursorStore: CursorStore;
|
|
31
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/charts/cursor/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,mFAAmF;AACnF,MAAM,MAAM,WAAW,GAAG;IACxB,0FAA0F;IAC1F,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,2FAA2F;IAC3F,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,MAAM,WAAW,CAAA;IACtB,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;IACxD,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAA;CAChD,CAAA;AAED,oGAAoG;AACpG,eAAO,MAAM,YAAY,EAAE,WAAyC,CAAA;AAEpE,wBAAgB,iBAAiB,IAAI,WAAW,CAkB/C;AAED,qFAAqF;AACrF,eAAO,MAAM,iBAAiB,EAAE,WAAiC,CAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
const EMPTY_CURSOR = { key: null, source: null };
|
|
2
|
+
function createCursorStore() {
|
|
3
|
+
let state = EMPTY_CURSOR;
|
|
4
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
5
|
+
return {
|
|
6
|
+
get: () => state,
|
|
7
|
+
set: (key, source) => {
|
|
8
|
+
if (state.key === key && state.source === source) return;
|
|
9
|
+
state = key === null && source === null ? EMPTY_CURSOR : { key, source };
|
|
10
|
+
for (const listener of listeners) listener();
|
|
11
|
+
},
|
|
12
|
+
subscribe: (onChange) => {
|
|
13
|
+
listeners.add(onChange);
|
|
14
|
+
return () => {
|
|
15
|
+
listeners.delete(onChange);
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
const globalCursorStore = createCursorStore();
|
|
21
|
+
export {
|
|
22
|
+
EMPTY_CURSOR,
|
|
23
|
+
createCursorStore,
|
|
24
|
+
globalCursorStore
|
|
25
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.test.d.ts","sourceRoot":"","sources":["../../../src/charts/cursor/store.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { KeyboardEvent, PointerEvent } from 'react';
|
|
2
|
+
/** Viewport-space pointer anchor the tooltip positions against. */
|
|
3
|
+
export type CursorAnchor = {
|
|
4
|
+
x: number;
|
|
5
|
+
y: number;
|
|
6
|
+
};
|
|
7
|
+
export type ChartCursor<T> = {
|
|
8
|
+
/** The point this chart paints its crosshair + dots at — own hover, or a resolved sibling key. */
|
|
9
|
+
point: T | null;
|
|
10
|
+
/** True when the pointer is over THIS chart. Only the source chart shows the floating tooltip. */
|
|
11
|
+
isSource: boolean;
|
|
12
|
+
/** Latest pointer position in viewport coords, or null when not hovered. */
|
|
13
|
+
anchor: CursorAnchor | null;
|
|
14
|
+
onPointerMove: (event: PointerEvent<SVGRectElement>) => void;
|
|
15
|
+
onPointerLeave: () => void;
|
|
16
|
+
onKeyDown: (event: KeyboardEvent<SVGRectElement>) => void;
|
|
17
|
+
onBlur: () => void;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Wires a chart into the ambient cursor store: snaps the pointer to the nearest own point,
|
|
21
|
+
* broadcasts it, and reads back a sibling's broadcast through domain-aware resolution. Replaces
|
|
22
|
+
* the removed `useHoverSync` + `useChartTooltip` pair, including their `resolveKey` escape hatch —
|
|
23
|
+
* resolution is now automatic.
|
|
24
|
+
*
|
|
25
|
+
* The tooltip anchor is coalesced through `requestAnimationFrame`, so a fast scrub costs one local
|
|
26
|
+
* state write per frame instead of one per event. The BROADCAST is not rAF-gated — it is deduped
|
|
27
|
+
* instead (the store ignores a set that doesn't change the value), so a scrub within one x-bucket
|
|
28
|
+
* costs nothing while a real bucket change reaches siblings on the same tick rather than a frame
|
|
29
|
+
* late.
|
|
30
|
+
*/
|
|
31
|
+
export declare function useChartCursor<T>({ data, chartId, getKey, xScale, marginLeft, }: {
|
|
32
|
+
data: readonly T[];
|
|
33
|
+
chartId: string;
|
|
34
|
+
getKey: (d: T) => string;
|
|
35
|
+
/** Own x scale — maps a domain key to a plot-local x offset. */
|
|
36
|
+
xScale: (key: string) => number | undefined;
|
|
37
|
+
marginLeft: number;
|
|
38
|
+
}): ChartCursor<T>;
|
|
39
|
+
//# sourceMappingURL=useChartCursor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useChartCursor.d.ts","sourceRoot":"","sources":["../../../src/charts/hooks/useChartCursor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,OAAO,CAAA;AAIxD,mEAAmE;AACnE,MAAM,MAAM,YAAY,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAEnD,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;IAC3B,kGAAkG;IAClG,KAAK,EAAE,CAAC,GAAG,IAAI,CAAA;IACf,kGAAkG;IAClG,QAAQ,EAAE,OAAO,CAAA;IACjB,4EAA4E;IAC5E,MAAM,EAAE,YAAY,GAAG,IAAI,CAAA;IAC3B,aAAa,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC,cAAc,CAAC,KAAK,IAAI,CAAA;IAC5D,cAAc,EAAE,MAAM,IAAI,CAAA;IAC1B,SAAS,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,cAAc,CAAC,KAAK,IAAI,CAAA;IACzD,MAAM,EAAE,MAAM,IAAI,CAAA;CACnB,CAAA;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,EAChC,IAAI,EACJ,OAAO,EACP,MAAM,EACN,MAAM,EACN,UAAU,GACX,EAAE;IACD,IAAI,EAAE,SAAS,CAAC,EAAE,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAA;IACxB,gEAAgE;IAChE,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAA;IAC3C,UAAU,EAAE,MAAM,CAAA;CACnB,GAAG,WAAW,CAAC,CAAC,CAAC,CAmHjB"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { localPoint } from "@visx/event";
|
|
2
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
3
|
+
import { buildDomainIndex, resolveCursorPoint } from "../cursor/resolve.js";
|
|
4
|
+
import { useCursorState, useCursorStore } from "../cursor/scope.js";
|
|
5
|
+
function useChartCursor({
|
|
6
|
+
data,
|
|
7
|
+
chartId,
|
|
8
|
+
getKey,
|
|
9
|
+
xScale,
|
|
10
|
+
marginLeft
|
|
11
|
+
}) {
|
|
12
|
+
const store = useCursorStore();
|
|
13
|
+
const cursor = useCursorState();
|
|
14
|
+
const [anchor, setAnchor] = useState(null);
|
|
15
|
+
const getKeyRef = useRef(getKey);
|
|
16
|
+
getKeyRef.current = getKey;
|
|
17
|
+
const xScaleRef = useRef(xScale);
|
|
18
|
+
xScaleRef.current = xScale;
|
|
19
|
+
const index = useMemo(() => buildDomainIndex(data, getKeyRef.current), [data]);
|
|
20
|
+
const frameRef = useRef(null);
|
|
21
|
+
const pendingRef = useRef(null);
|
|
22
|
+
useEffect(
|
|
23
|
+
() => () => {
|
|
24
|
+
if (frameRef.current !== null) cancelAnimationFrame(frameRef.current);
|
|
25
|
+
if (store.get().source === chartId) store.set(null, null);
|
|
26
|
+
},
|
|
27
|
+
[store, chartId]
|
|
28
|
+
);
|
|
29
|
+
const scheduleAnchor = useCallback((next) => {
|
|
30
|
+
pendingRef.current = next;
|
|
31
|
+
if (frameRef.current !== null) return;
|
|
32
|
+
frameRef.current = requestAnimationFrame(() => {
|
|
33
|
+
frameRef.current = null;
|
|
34
|
+
setAnchor(pendingRef.current);
|
|
35
|
+
});
|
|
36
|
+
}, []);
|
|
37
|
+
const onPointerMove = useCallback(
|
|
38
|
+
(event) => {
|
|
39
|
+
if (data.length === 0) return;
|
|
40
|
+
const local = localPoint(event.currentTarget, event.nativeEvent);
|
|
41
|
+
if (local === null) return;
|
|
42
|
+
const px = local.x - marginLeft;
|
|
43
|
+
let closest = data[0];
|
|
44
|
+
let minDist = Infinity;
|
|
45
|
+
for (const d of data) {
|
|
46
|
+
const x = xScaleRef.current(getKeyRef.current(d)) ?? 0;
|
|
47
|
+
const dist = Math.abs(x - px);
|
|
48
|
+
if (dist < minDist) {
|
|
49
|
+
minDist = dist;
|
|
50
|
+
closest = d;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
scheduleAnchor({ x: event.clientX, y: event.clientY });
|
|
54
|
+
store.set(getKeyRef.current(closest), chartId);
|
|
55
|
+
},
|
|
56
|
+
[data, marginLeft, chartId, store, scheduleAnchor]
|
|
57
|
+
);
|
|
58
|
+
const clear = useCallback(() => {
|
|
59
|
+
if (frameRef.current !== null) {
|
|
60
|
+
cancelAnimationFrame(frameRef.current);
|
|
61
|
+
frameRef.current = null;
|
|
62
|
+
}
|
|
63
|
+
pendingRef.current = null;
|
|
64
|
+
setAnchor(null);
|
|
65
|
+
if (store.get().source === chartId) store.set(null, null);
|
|
66
|
+
}, [store, chartId]);
|
|
67
|
+
const onKeyDown = useCallback(
|
|
68
|
+
(event) => {
|
|
69
|
+
if (data.length === 0) return;
|
|
70
|
+
if (event.key === "Escape") {
|
|
71
|
+
clear();
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const delta = event.key === "ArrowRight" ? 1 : event.key === "ArrowLeft" ? -1 : 0;
|
|
75
|
+
if (delta === 0) return;
|
|
76
|
+
event.preventDefault();
|
|
77
|
+
const current = store.get().key;
|
|
78
|
+
const currentIndex = data.findIndex((d) => getKeyRef.current(d) === current);
|
|
79
|
+
const nextIndex = Math.min(
|
|
80
|
+
Math.max((currentIndex === -1 ? delta > 0 ? -1 : data.length : currentIndex) + delta, 0),
|
|
81
|
+
data.length - 1
|
|
82
|
+
);
|
|
83
|
+
const next = data[nextIndex];
|
|
84
|
+
const rect = event.currentTarget.getBoundingClientRect();
|
|
85
|
+
const x = xScaleRef.current(getKeyRef.current(next)) ?? 0;
|
|
86
|
+
scheduleAnchor({ x: rect.left + x, y: rect.top });
|
|
87
|
+
store.set(getKeyRef.current(next), chartId);
|
|
88
|
+
},
|
|
89
|
+
[data, store, chartId, clear, scheduleAnchor]
|
|
90
|
+
);
|
|
91
|
+
const point = cursor.key === null ? null : resolveCursorPoint(index, cursor.key);
|
|
92
|
+
return {
|
|
93
|
+
point,
|
|
94
|
+
isSource: cursor.source === chartId,
|
|
95
|
+
anchor,
|
|
96
|
+
onPointerMove,
|
|
97
|
+
onPointerLeave: clear,
|
|
98
|
+
onKeyDown,
|
|
99
|
+
onBlur: clear
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
export {
|
|
103
|
+
useChartCursor
|
|
104
|
+
};
|
|
@@ -11,12 +11,16 @@ export type UseChartSizeResult = ChartSize & {
|
|
|
11
11
|
* A thin basalt wrapper over `@visx/responsive`'s `useParentSize` — keeps the
|
|
12
12
|
* `@visx/*` import inside `src/charts/**` per the Mantine-free boundary rule.
|
|
13
13
|
*
|
|
14
|
+
* Charts do not call this directly — `ChartFrame` (and `CartesianChart` above it) measure for
|
|
15
|
+
* them, including the legend band. Reach for it when something OUTSIDE the chart system needs a
|
|
16
|
+
* measured box, e.g. sizing a sparkline to its table cell.
|
|
17
|
+
*
|
|
14
18
|
* @example
|
|
15
|
-
* function
|
|
16
|
-
* const { ref, width
|
|
19
|
+
* function CellSparkline({ points }: { points: number[] }) {
|
|
20
|
+
* const { ref, width } = useChartSize()
|
|
17
21
|
* return (
|
|
18
|
-
* <div ref={ref} style={{ width: '100%', height:
|
|
19
|
-
* {width > 0 && <
|
|
22
|
+
* <div ref={ref} style={{ width: '100%', height: 24 }}>
|
|
23
|
+
* {width > 0 && <LineSparkline data={points} width={width} height={24} />}
|
|
20
24
|
* </div>
|
|
21
25
|
* )
|
|
22
26
|
* }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useChartSize.d.ts","sourceRoot":"","sources":["../../../src/charts/hooks/useChartSize.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG;IAC3C,iEAAiE;IACjE,GAAG,EAAE,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,KAAK,IAAI,CAAA;CAC3C,CAAA;AAED
|
|
1
|
+
{"version":3,"file":"useChartSize.d.ts","sourceRoot":"","sources":["../../../src/charts/hooks/useChartSize.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG;IAC3C,iEAAiE;IACjE,GAAG,EAAE,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,KAAK,IAAI,CAAA;CAC3C,CAAA;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,YAAY,CAAC,UAAU,SAAI,GAAG,kBAAkB,CAG/D"}
|
package/dist/charts/index.d.ts
CHANGED
|
@@ -2,37 +2,40 @@
|
|
|
2
2
|
* `./charts` — Mantine-free visx chart system (ZERO `@mantine/*` imports, lint-enforced).
|
|
3
3
|
*
|
|
4
4
|
* Re-exports the framework token layer (so chart consumers have one import surface), the chart
|
|
5
|
-
* theme context, the shared
|
|
6
|
-
*
|
|
5
|
+
* theme context, the shared cursor (module-level store — charts sync with no provider; see
|
|
6
|
+
* `docs/CHARTS-SPEC.md` §3), the primitives, kinds, sparklines, hooks, utils, and a curated set of
|
|
7
|
+
* raw @visx primitives for bespoke charts.
|
|
7
8
|
*
|
|
8
9
|
* The framework ships ONLY generic primitives + framework palette data — no domain series tree
|
|
9
10
|
* (apps rebuild that app-side with `seriesTokens` / `groupTokens` against their own series maps).
|
|
10
11
|
* Grounded in argo `packages/charts/src/index.ts`.
|
|
11
12
|
*/
|
|
12
|
-
export { VX, alpha, type ColorPair, type SeriesMap, buildPaletteCss, seriesTokens, defineSeries, groupTokens, } from '../tokens/index.js';
|
|
13
|
+
export { VX, alpha, type ColorPair, type SeriesMap, buildPaletteCss, seriesTokens, defineSeries, groupTokens, chartMargin, type ChartMargin, } from '../tokens/index.js';
|
|
13
14
|
export type { SeriesKey } from '../register.js';
|
|
14
15
|
export { VxThemeProvider, useVxTheme, type VxTheme } from './theme.js';
|
|
15
|
-
export {
|
|
16
|
-
export {
|
|
16
|
+
export { ChartCursorScope, type ChartCursorScopeProps, useCursorState } from './cursor/scope.js';
|
|
17
|
+
export { createCursorStore, globalCursorStore, type CursorState, type CursorStore, } from './cursor/store.js';
|
|
17
18
|
export { type SeriesMark, type SeriesDash, type SeriesRole, type LegendPlacement, type ChartLegendConfig, type SeriesStyle, type ChartSeries, deriveLegend, deriveTooltipRows, } from './series.js';
|
|
18
|
-
export {
|
|
19
|
-
export { ChartFrame, type ChartFrameProps, type ChartFrameLegend } from './primitives/ChartFrame.js';
|
|
19
|
+
export { CartesianChart, resolveAxisDomain, type CartesianChartProps, type CartesianTooltipConfig, type AxisConfig, type PlotContext, } from './primitives/CartesianChart.js';
|
|
20
|
+
export { ChartFrame, type ChartFrameProps, type ChartFrameLegend, type PlotRect, resolveLegend, } from './primitives/ChartFrame.js';
|
|
20
21
|
export { ChartCenter, type ChartCenterProps, ChartPending, type ChartPendingProps, } from './primitives/ChartPending.js';
|
|
21
22
|
export { Crosshair, SeriesDot } from './primitives/Crosshair.js';
|
|
22
23
|
export { ChartCard } from './primitives/ChartCard.js';
|
|
23
24
|
export { ChartLegend, type LegendEntry } from './primitives/ChartLegend.js';
|
|
24
|
-
export {
|
|
25
|
+
export { ChartTooltipFloat, TooltipHeader, TooltipRow, TooltipBody, } from './primitives/ChartTooltip.js';
|
|
25
26
|
export { AxisBottomDate, AxisLeftNumeric, AxisRightNumeric } from './primitives/Axes.js';
|
|
26
27
|
export { HoverOverlay } from './primitives/HoverOverlay.js';
|
|
27
28
|
export { ZoneRects, type ZoneSpec } from './primitives/ZoneRects.js';
|
|
29
|
+
export { XZoneRects, type XZoneSpec } from './primitives/XZoneRects.js';
|
|
28
30
|
export { AreaGradient, areaFillUrl } from './primitives/AreaGradient.js';
|
|
29
|
-
export {
|
|
30
|
-
export { useHoverSync } from './hooks/useHoverSync.js';
|
|
31
|
+
export { useChartCursor, type ChartCursor, type CursorAnchor } from './hooks/useChartCursor.js';
|
|
31
32
|
export { useChartSize, type UseChartSizeResult, type ChartSize } from './hooks/useChartSize.js';
|
|
32
33
|
export { fmtAxisDate, fmtTooltipDate } from './utils/format.js';
|
|
33
|
-
export { smartTicks } from './utils/ticks.js';
|
|
34
|
-
export {
|
|
35
|
-
export {
|
|
34
|
+
export { smartTicks, smartTicksEvery } from './utils/ticks.js';
|
|
35
|
+
export { autoMargin, probeAxisLabels, type AutoMarginInput } from './layout/auto-margin.js';
|
|
36
|
+
export { measureText, maxTextWidth } from './utils/measure-text.js';
|
|
37
|
+
export { ZonedLine, type ZonedLineProps, type ZonedLineZone, type ZonedLineThreshold, type ZonedLineRefLine, } from './kinds/ZonedLine.js';
|
|
38
|
+
export { Bars, type BarsProps, type BarsBar, type BarsLine, type BarsZone, type BarsRefLine, } from './kinds/Bars.js';
|
|
36
39
|
export { StackedArea, type StackedAreaProps } from './kinds/StackedArea.js';
|
|
37
40
|
export { Donut, type DonutProps, type DonutDatum } from './kinds/Donut.js';
|
|
38
41
|
export { MultiLine, type MultiLineProps } from './kinds/MultiLine.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/charts/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/charts/index.ts"],"names":[],"mappings":"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"}
|
package/dist/charts/index.js
CHANGED
|
@@ -4,17 +4,27 @@ import {
|
|
|
4
4
|
buildPaletteCss,
|
|
5
5
|
seriesTokens,
|
|
6
6
|
defineSeries,
|
|
7
|
-
groupTokens
|
|
7
|
+
groupTokens,
|
|
8
|
+
chartMargin
|
|
8
9
|
} from "../tokens/index.js";
|
|
9
10
|
import { VxThemeProvider, useVxTheme } from "./theme.js";
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
11
|
+
import { ChartCursorScope, useCursorState } from "./cursor/scope.js";
|
|
12
|
+
import {
|
|
13
|
+
createCursorStore,
|
|
14
|
+
globalCursorStore
|
|
15
|
+
} from "./cursor/store.js";
|
|
12
16
|
import {
|
|
13
17
|
deriveLegend,
|
|
14
18
|
deriveTooltipRows
|
|
15
19
|
} from "./series.js";
|
|
16
|
-
import {
|
|
17
|
-
|
|
20
|
+
import {
|
|
21
|
+
CartesianChart,
|
|
22
|
+
resolveAxisDomain
|
|
23
|
+
} from "./primitives/CartesianChart.js";
|
|
24
|
+
import {
|
|
25
|
+
ChartFrame,
|
|
26
|
+
resolveLegend
|
|
27
|
+
} from "./primitives/ChartFrame.js";
|
|
18
28
|
import {
|
|
19
29
|
ChartCenter,
|
|
20
30
|
ChartPending
|
|
@@ -23,21 +33,22 @@ import { Crosshair, SeriesDot } from "./primitives/Crosshair.js";
|
|
|
23
33
|
import { ChartCard } from "./primitives/ChartCard.js";
|
|
24
34
|
import { ChartLegend } from "./primitives/ChartLegend.js";
|
|
25
35
|
import {
|
|
26
|
-
|
|
36
|
+
ChartTooltipFloat,
|
|
27
37
|
TooltipHeader,
|
|
28
38
|
TooltipRow,
|
|
29
|
-
TooltipBody
|
|
30
|
-
useTooltipStyles
|
|
39
|
+
TooltipBody
|
|
31
40
|
} from "./primitives/ChartTooltip.js";
|
|
32
41
|
import { AxisBottomDate, AxisLeftNumeric, AxisRightNumeric } from "./primitives/Axes.js";
|
|
33
42
|
import { HoverOverlay } from "./primitives/HoverOverlay.js";
|
|
34
43
|
import { ZoneRects } from "./primitives/ZoneRects.js";
|
|
44
|
+
import { XZoneRects } from "./primitives/XZoneRects.js";
|
|
35
45
|
import { AreaGradient, areaFillUrl } from "./primitives/AreaGradient.js";
|
|
36
|
-
import {
|
|
37
|
-
import { useHoverSync } from "./hooks/useHoverSync.js";
|
|
46
|
+
import { useChartCursor } from "./hooks/useChartCursor.js";
|
|
38
47
|
import { useChartSize } from "./hooks/useChartSize.js";
|
|
39
48
|
import { fmtAxisDate, fmtTooltipDate } from "./utils/format.js";
|
|
40
|
-
import { smartTicks } from "./utils/ticks.js";
|
|
49
|
+
import { smartTicks, smartTicksEvery } from "./utils/ticks.js";
|
|
50
|
+
import { autoMargin, probeAxisLabels } from "./layout/auto-margin.js";
|
|
51
|
+
import { measureText, maxTextWidth } from "./utils/measure-text.js";
|
|
41
52
|
import {
|
|
42
53
|
ZonedLine
|
|
43
54
|
} from "./kinds/ZonedLine.js";
|
|
@@ -74,29 +85,27 @@ export {
|
|
|
74
85
|
BarSparkline,
|
|
75
86
|
BarStack,
|
|
76
87
|
Bars,
|
|
88
|
+
CartesianChart,
|
|
77
89
|
ChartCard,
|
|
78
90
|
ChartCenter,
|
|
91
|
+
ChartCursorScope,
|
|
79
92
|
ChartFrame,
|
|
80
|
-
ChartHoverSync,
|
|
81
93
|
ChartLegend,
|
|
82
94
|
ChartPending,
|
|
83
|
-
|
|
95
|
+
ChartTooltipFloat,
|
|
84
96
|
Crosshair,
|
|
85
|
-
DEFAULT_NO_OP_SET_HOVER,
|
|
86
97
|
Donut,
|
|
87
98
|
DualPanel,
|
|
88
99
|
GridColumns,
|
|
89
100
|
GridRows,
|
|
90
101
|
Group,
|
|
91
102
|
Heatmap,
|
|
92
|
-
HoverContext,
|
|
93
103
|
HoverOverlay,
|
|
94
104
|
Line,
|
|
95
105
|
LinePath,
|
|
96
106
|
LineSparkline,
|
|
97
107
|
MultiLine,
|
|
98
108
|
Pie,
|
|
99
|
-
ResponsiveChart,
|
|
100
109
|
SeriesDot,
|
|
101
110
|
StackedArea,
|
|
102
111
|
Threshold,
|
|
@@ -105,11 +114,15 @@ export {
|
|
|
105
114
|
TooltipRow,
|
|
106
115
|
VX,
|
|
107
116
|
VxThemeProvider,
|
|
117
|
+
XZoneRects,
|
|
108
118
|
ZoneRects,
|
|
109
119
|
ZonedLine,
|
|
110
120
|
alpha,
|
|
111
121
|
areaFillUrl,
|
|
122
|
+
autoMargin,
|
|
112
123
|
buildPaletteCss,
|
|
124
|
+
chartMargin,
|
|
125
|
+
createCursorStore,
|
|
113
126
|
curveBasis,
|
|
114
127
|
curveCatmullRom,
|
|
115
128
|
curveLinear,
|
|
@@ -120,16 +133,22 @@ export {
|
|
|
120
133
|
deriveTooltipRows,
|
|
121
134
|
fmtAxisDate,
|
|
122
135
|
fmtTooltipDate,
|
|
136
|
+
globalCursorStore,
|
|
123
137
|
groupTokens,
|
|
138
|
+
maxTextWidth,
|
|
139
|
+
measureText,
|
|
140
|
+
probeAxisLabels,
|
|
141
|
+
resolveAxisDomain,
|
|
142
|
+
resolveLegend,
|
|
124
143
|
scaleBand,
|
|
125
144
|
scaleLinear,
|
|
126
145
|
scalePoint,
|
|
127
146
|
scaleTime,
|
|
128
147
|
seriesTokens,
|
|
129
148
|
smartTicks,
|
|
149
|
+
smartTicksEvery,
|
|
150
|
+
useChartCursor,
|
|
130
151
|
useChartSize,
|
|
131
|
-
|
|
132
|
-
useHoverSync,
|
|
133
|
-
useTooltipStyles,
|
|
152
|
+
useCursorState,
|
|
134
153
|
useVxTheme
|
|
135
154
|
};
|