radiant-charts-core 0.2.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/LICENSE +21 -0
- package/LICENSE.md +21 -0
- package/dist/index.d.mts +431 -0
- package/dist/index.d.ts +431 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +9 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +31 -0
- package/src/Declarative.tsx +503 -0
- package/src/RadiantChart.tsx +446 -0
- package/src/ResponsiveContainer.tsx +128 -0
- package/src/axes/CartesianAxis.ts +305 -0
- package/src/core/Animator.ts +119 -0
- package/src/core/ChartManager.ts +1062 -0
- package/src/core/CrosshairManager.ts +334 -0
- package/src/core/Legend.ts +269 -0
- package/src/core/ThemeManager.ts +98 -0
- package/src/index.ts +31 -0
- package/src/scale/Scale.ts +99 -0
- package/src/scene/Node.ts +183 -0
- package/src/scene/Scene.ts +197 -0
- package/src/scene/Shapes.ts +446 -0
- package/src/series/AreaSeries.ts +315 -0
- package/src/series/BarSeries.ts +502 -0
- package/src/series/LineSeries.ts +284 -0
- package/src/series/PieSeries.ts +203 -0
- package/src/series/ScatterSeries.ts +305 -0
- package/src/tooltip/TooltipContext.ts +22 -0
- package/src/tooltip/TooltipStore.ts +169 -0
- package/src/tooltip/__tests__/TooltipStore.test.ts +176 -0
- package/src/tooltip/coordUtils.ts +41 -0
- package/src/tooltip/index.ts +18 -0
- package/src/tooltip/types.ts +57 -0
- package/src/tooltip/useChartTooltip.ts +43 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// Radiant Charts — Coordinate Space Utilities
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Convert chart-local pixel coordinates to viewport (clientX/Y) coordinates.
|
|
5
|
+
*/
|
|
6
|
+
export function chartLocalToViewport(
|
|
7
|
+
localX: number,
|
|
8
|
+
localY: number,
|
|
9
|
+
container: HTMLElement,
|
|
10
|
+
): { x: number; y: number } {
|
|
11
|
+
const rect = container.getBoundingClientRect();
|
|
12
|
+
return { x: rect.left + localX, y: rect.top + localY };
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Convert viewport coordinates to chart-local pixel coordinates.
|
|
17
|
+
*/
|
|
18
|
+
export function viewportToChartLocal(
|
|
19
|
+
vpX: number,
|
|
20
|
+
vpY: number,
|
|
21
|
+
container: HTMLElement,
|
|
22
|
+
): { x: number; y: number } {
|
|
23
|
+
const rect = container.getBoundingClientRect();
|
|
24
|
+
return { x: vpX - rect.left, y: vpY - rect.top };
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Convert scale-space coordinates (relative to seriesRect origin) to viewport.
|
|
29
|
+
*/
|
|
30
|
+
export function scalePointToViewport(
|
|
31
|
+
scaleX: number,
|
|
32
|
+
scaleY: number,
|
|
33
|
+
seriesRect: { x: number; y: number },
|
|
34
|
+
container: HTMLElement,
|
|
35
|
+
): { x: number; y: number } {
|
|
36
|
+
const rect = container.getBoundingClientRect();
|
|
37
|
+
return {
|
|
38
|
+
x: rect.left + seriesRect.x + scaleX,
|
|
39
|
+
y: rect.top + seriesRect.y + scaleY,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export { TooltipStore } from './TooltipStore';
|
|
2
|
+
export { TooltipStoreContext, useTooltipStore } from './TooltipContext';
|
|
3
|
+
export { useChartTooltip } from './useChartTooltip';
|
|
4
|
+
export type { ChartTooltipContext } from './useChartTooltip';
|
|
5
|
+
export {
|
|
6
|
+
chartLocalToViewport,
|
|
7
|
+
viewportToChartLocal,
|
|
8
|
+
scalePointToViewport,
|
|
9
|
+
} from './coordUtils';
|
|
10
|
+
export type {
|
|
11
|
+
TooltipTrigger,
|
|
12
|
+
TooltipMode,
|
|
13
|
+
TooltipPositionMode,
|
|
14
|
+
TooltipDatumEntry,
|
|
15
|
+
TooltipState,
|
|
16
|
+
TooltipOptions,
|
|
17
|
+
} from './types';
|
|
18
|
+
export { DEFAULT_TOOLTIP_STATE } from './types';
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// Radiant Charts — Tooltip System Types
|
|
2
|
+
|
|
3
|
+
export type TooltipTrigger = 'hover' | 'none';
|
|
4
|
+
export type TooltipMode = 'shared' | 'item';
|
|
5
|
+
export type TooltipPositionMode = 'follow-pointer' | 'snap-to-data' | 'fixed';
|
|
6
|
+
|
|
7
|
+
export interface TooltipDatumEntry {
|
|
8
|
+
seriesIndex: number;
|
|
9
|
+
seriesId: string;
|
|
10
|
+
seriesType: string;
|
|
11
|
+
title: string;
|
|
12
|
+
color: string;
|
|
13
|
+
datum: Record<string, any>;
|
|
14
|
+
dataIndex: number;
|
|
15
|
+
xValue: any;
|
|
16
|
+
yValue: any;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface TooltipState {
|
|
20
|
+
active: boolean;
|
|
21
|
+
/** Raw mouse position — viewport-relative (clientX/Y) */
|
|
22
|
+
pointerX: number;
|
|
23
|
+
pointerY: number;
|
|
24
|
+
/** Snapped data-point position — viewport-relative, used as portal anchor */
|
|
25
|
+
anchorX: number;
|
|
26
|
+
anchorY: number;
|
|
27
|
+
/** Chart-local coordinates (relative to container top-left) */
|
|
28
|
+
localX: number;
|
|
29
|
+
localY: number;
|
|
30
|
+
/** Active data entries */
|
|
31
|
+
entries: TooltipDatumEntry[];
|
|
32
|
+
/** Shared X-axis label (for shared mode) */
|
|
33
|
+
sharedLabel: string | null;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface TooltipOptions {
|
|
37
|
+
enabled?: boolean;
|
|
38
|
+
trigger?: TooltipTrigger;
|
|
39
|
+
mode?: TooltipMode;
|
|
40
|
+
positionMode?: TooltipPositionMode;
|
|
41
|
+
delay?: { show?: number; hide?: number };
|
|
42
|
+
offset?: { x?: number; y?: number };
|
|
43
|
+
snap?: boolean;
|
|
44
|
+
shared?: boolean;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export const DEFAULT_TOOLTIP_STATE: TooltipState = {
|
|
48
|
+
active: false,
|
|
49
|
+
pointerX: 0,
|
|
50
|
+
pointerY: 0,
|
|
51
|
+
anchorX: 0,
|
|
52
|
+
anchorY: 0,
|
|
53
|
+
localX: 0,
|
|
54
|
+
localY: 0,
|
|
55
|
+
entries: [],
|
|
56
|
+
sharedLabel: null,
|
|
57
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// Radiant Charts — Public useChartTooltip Hook
|
|
2
|
+
|
|
3
|
+
import { useSyncExternalStore, useCallback } from 'react';
|
|
4
|
+
import { useTooltipStore } from './TooltipContext';
|
|
5
|
+
import { TooltipDatumEntry } from './types';
|
|
6
|
+
|
|
7
|
+
export interface ChartTooltipContext {
|
|
8
|
+
active: boolean;
|
|
9
|
+
entries: TooltipDatumEntry[];
|
|
10
|
+
sharedLabel: string | null;
|
|
11
|
+
pointerX: number;
|
|
12
|
+
pointerY: number;
|
|
13
|
+
anchorX: number;
|
|
14
|
+
anchorY: number;
|
|
15
|
+
localX: number;
|
|
16
|
+
localY: number;
|
|
17
|
+
hide: () => void;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function useChartTooltip(): ChartTooltipContext {
|
|
21
|
+
const store = useTooltipStore();
|
|
22
|
+
|
|
23
|
+
const state = useSyncExternalStore(
|
|
24
|
+
store.subscribe.bind(store),
|
|
25
|
+
store.getState.bind(store),
|
|
26
|
+
() => store.getState(),
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
const hide = useCallback(() => store.hide(), [store]);
|
|
30
|
+
|
|
31
|
+
return {
|
|
32
|
+
active: state.active,
|
|
33
|
+
entries: state.entries,
|
|
34
|
+
sharedLabel: state.sharedLabel,
|
|
35
|
+
pointerX: state.pointerX,
|
|
36
|
+
pointerY: state.pointerY,
|
|
37
|
+
anchorX: state.anchorX,
|
|
38
|
+
anchorY: state.anchorY,
|
|
39
|
+
localX: state.localX,
|
|
40
|
+
localY: state.localY,
|
|
41
|
+
hide,
|
|
42
|
+
};
|
|
43
|
+
}
|