@tranding-custom-chart/react 0.0.0-stage → 2.0.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/README.md +56 -2
- package/dist/AccessibleChartTable.d.ts +12 -0
- package/dist/AccessibleChartTable.d.ts.map +1 -0
- package/dist/AccessibleChartTable.js +19 -0
- package/dist/BaselineSeries.d.ts +13 -0
- package/dist/BaselineSeries.d.ts.map +1 -0
- package/dist/BaselineSeries.js +32 -0
- package/dist/BoxPlotSeries.d.ts +11 -0
- package/dist/BoxPlotSeries.d.ts.map +1 -0
- package/dist/BoxPlotSeries.js +37 -0
- package/dist/BubbleSeries.d.ts +11 -0
- package/dist/BubbleSeries.d.ts.map +1 -0
- package/dist/BubbleSeries.js +37 -0
- package/dist/CandlestickSeries.d.ts +13 -0
- package/dist/CandlestickSeries.d.ts.map +1 -0
- package/dist/CandlestickSeries.js +54 -0
- package/dist/ChartContainer.d.ts +73 -0
- package/dist/ChartContainer.d.ts.map +1 -0
- package/dist/ChartContainer.js +631 -0
- package/dist/ChartContext.d.ts +36 -0
- package/dist/ChartContext.d.ts.map +1 -0
- package/dist/ChartContext.js +13 -0
- package/dist/ChartSyncGroup.d.ts +14 -0
- package/dist/ChartSyncGroup.d.ts.map +1 -0
- package/dist/ChartSyncGroup.js +18 -0
- package/dist/ColumnsSeries.d.ts +13 -0
- package/dist/ColumnsSeries.d.ts.map +1 -0
- package/dist/ColumnsSeries.js +54 -0
- package/dist/CrosshairOverlay.d.ts +10 -0
- package/dist/CrosshairOverlay.d.ts.map +1 -0
- package/dist/CrosshairOverlay.js +65 -0
- package/dist/DrawingOverlay.d.ts +16 -0
- package/dist/DrawingOverlay.d.ts.map +1 -0
- package/dist/DrawingOverlay.js +50 -0
- package/dist/GridAxes.d.ts +19 -0
- package/dist/GridAxes.d.ts.map +1 -0
- package/dist/GridAxes.js +50 -0
- package/dist/HeatmapSeries.d.ts +11 -0
- package/dist/HeatmapSeries.d.ts.map +1 -0
- package/dist/HeatmapSeries.js +74 -0
- package/dist/HighLowSeries.d.ts +12 -0
- package/dist/HighLowSeries.d.ts.map +1 -0
- package/dist/HighLowSeries.js +29 -0
- package/dist/HlcAreaSeries.d.ts +13 -0
- package/dist/HlcAreaSeries.d.ts.map +1 -0
- package/dist/HlcAreaSeries.js +28 -0
- package/dist/HollowCandlestickSeries.d.ts +13 -0
- package/dist/HollowCandlestickSeries.d.ts.map +1 -0
- package/dist/HollowCandlestickSeries.js +30 -0
- package/dist/HorizontalBarSeries.d.ts +15 -0
- package/dist/HorizontalBarSeries.d.ts.map +1 -0
- package/dist/HorizontalBarSeries.js +42 -0
- package/dist/InteractiveLegend.d.ts +19 -0
- package/dist/InteractiveLegend.d.ts.map +1 -0
- package/dist/InteractiveLegend.js +39 -0
- package/dist/LastPriceLine.d.ts +11 -0
- package/dist/LastPriceLine.d.ts.map +1 -0
- package/dist/LastPriceLine.js +29 -0
- package/dist/LineSeries.d.ts +20 -0
- package/dist/LineSeries.d.ts.map +1 -0
- package/dist/LineSeries.js +74 -0
- package/dist/LineWithMarkersSeries.d.ts +13 -0
- package/dist/LineWithMarkersSeries.d.ts.map +1 -0
- package/dist/LineWithMarkersSeries.js +30 -0
- package/dist/MixedChartSeries.d.ts +14 -0
- package/dist/MixedChartSeries.d.ts.map +1 -0
- package/dist/MixedChartSeries.js +30 -0
- package/dist/OhlcBarSeries.d.ts +14 -0
- package/dist/OhlcBarSeries.d.ts.map +1 -0
- package/dist/OhlcBarSeries.js +31 -0
- package/dist/PieSeries.d.ts +18 -0
- package/dist/PieSeries.d.ts.map +1 -0
- package/dist/PieSeries.js +85 -0
- package/dist/PluginLayer.d.ts +11 -0
- package/dist/PluginLayer.d.ts.map +1 -0
- package/dist/PluginLayer.js +14 -0
- package/dist/PolarAreaSeries.d.ts +11 -0
- package/dist/PolarAreaSeries.d.ts.map +1 -0
- package/dist/PolarAreaSeries.js +35 -0
- package/dist/RadarSeries.d.ts +16 -0
- package/dist/RadarSeries.d.ts.map +1 -0
- package/dist/RadarSeries.js +47 -0
- package/dist/ScatterSeries.d.ts +11 -0
- package/dist/ScatterSeries.d.ts.map +1 -0
- package/dist/ScatterSeries.js +60 -0
- package/dist/SeriesMarkersOverlay.d.ts +10 -0
- package/dist/SeriesMarkersOverlay.d.ts.map +1 -0
- package/dist/SeriesMarkersOverlay.js +28 -0
- package/dist/StackedBarSeries.d.ts +13 -0
- package/dist/StackedBarSeries.d.ts.map +1 -0
- package/dist/StackedBarSeries.js +26 -0
- package/dist/StepLineSeries.d.ts +15 -0
- package/dist/StepLineSeries.d.ts.map +1 -0
- package/dist/StepLineSeries.js +28 -0
- package/dist/SupertrendSeries.d.ts +16 -0
- package/dist/SupertrendSeries.d.ts.map +1 -0
- package/dist/SupertrendSeries.js +40 -0
- package/dist/UniversalSeries.d.ts +21 -0
- package/dist/UniversalSeries.d.ts.map +1 -0
- package/dist/UniversalSeries.js +222 -0
- package/dist/VolumeProfileSeries.d.ts +21 -0
- package/dist/VolumeProfileSeries.d.ts.map +1 -0
- package/dist/VolumeProfileSeries.js +57 -0
- package/dist/VolumeSeries.d.ts +14 -0
- package/dist/VolumeSeries.d.ts.map +1 -0
- package/dist/VolumeSeries.js +33 -0
- package/dist/WatermarkOverlay.d.ts +11 -0
- package/dist/WatermarkOverlay.d.ts.map +1 -0
- package/dist/WatermarkOverlay.js +27 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +41 -0
- package/dist/useChart.d.ts +16 -0
- package/dist/useChart.d.ts.map +1 -0
- package/dist/useChart.js +34 -0
- package/package.json +39 -4
package/README.md
CHANGED
|
@@ -1,3 +1,57 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @tranding-custom-chart/react
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> Declarative, accessible, and reactive React components for the `@tranding-custom-chart` Canvas 2D engine.
|
|
4
|
+
|
|
5
|
+
[](https://semver.org)
|
|
6
|
+
[](#)
|
|
7
|
+
[](#)
|
|
8
|
+
|
|
9
|
+
## Features
|
|
10
|
+
- **Declarative Components**:
|
|
11
|
+
- Container: `<ChartContainer>` with dynamic `options?: DeepPartial<ChartOptions>`, imperative `chartRef` handle (`applyOptions`, `resize`, `requestRender`), high-DPI canvas, mousewheel zoom, drag-to-pan, and keyboard roving tabindex.
|
|
12
|
+
- Series: `<UniversalSeries>` (renders any of the 13 chart types), `<CandlestickSeries>`, `<HollowCandlestickSeries>`, `<OhlcBarSeries>`, `<LineSeries>`, `<VolumeSeries>`, `<VolumeProfileSeries>`, `<SupertrendSeries>`, `<PieSeries>`, `<HorizontalBarSeries>`, `<StackedBarSeries>`, `<RadarSeries>`.
|
|
13
|
+
- Overlays: `<GridAxes>`, `<CrosshairOverlay>`, `<WatermarkOverlay>`, `<LastPriceLine>`, `<DrawingOverlay>`.
|
|
14
|
+
- Legend: `<InteractiveLegend>` with clickable filter toggles.
|
|
15
|
+
- **Accessibility (WCAG 2.2 AA)**:
|
|
16
|
+
- Arrow key stepping across data points, Home/End endpoints, PageUp/Down strides.
|
|
17
|
+
- Semantic HTML fallback table (`<AccessibleChartTable>`) for screen readers.
|
|
18
|
+
- Polite ARIA live region coordinate speech announcements.
|
|
19
|
+
- **Multi-Chart Synchronization**:
|
|
20
|
+
- Coordinated crosshairs across multiple panes via `<ChartSyncGroup>`.
|
|
21
|
+
|
|
22
|
+
## Installation
|
|
23
|
+
```bash
|
|
24
|
+
npm install @tranding-custom-chart/react @tranding-custom-chart/core @tranding-custom-chart/renderer-canvas @tranding-custom-chart/financial react react-dom
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Quick Start
|
|
28
|
+
```tsx
|
|
29
|
+
import React from 'react';
|
|
30
|
+
import {
|
|
31
|
+
ChartContainer,
|
|
32
|
+
UniversalSeries,
|
|
33
|
+
VolumeProfileSeries,
|
|
34
|
+
SupertrendSeries,
|
|
35
|
+
GridAxes,
|
|
36
|
+
CrosshairOverlay,
|
|
37
|
+
} from '@tranding-custom-chart/react';
|
|
38
|
+
import { createIndexTimeScale, createLinearScale, calculateOHLCDomain } from '@tranding-custom-chart/core';
|
|
39
|
+
|
|
40
|
+
export function TradingChart({ bars }) {
|
|
41
|
+
const xScale = createIndexTimeScale(bars.length, [20, 800]);
|
|
42
|
+
const yScale = createLinearScale(calculateOHLCDomain(bars), [400, 20]);
|
|
43
|
+
|
|
44
|
+
return (
|
|
45
|
+
<ChartContainer width={820} height={420} xScale={xScale} yScale={yScale} ariaLabel="Trading Chart">
|
|
46
|
+
<GridAxes />
|
|
47
|
+
<UniversalSeries chartType="candlestick" bars={bars} />
|
|
48
|
+
<SupertrendSeries bars={bars} />
|
|
49
|
+
<VolumeProfileSeries bars={bars} />
|
|
50
|
+
<CrosshairOverlay />
|
|
51
|
+
</ChartContainer>
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## License
|
|
57
|
+
UNLICENSED (Internal / In-House Use)
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file packages/chart-react/src/AccessibleChartTable.tsx
|
|
3
|
+
* Accessible HTML table alternative for screen readers (WCAG 2.2 AA).
|
|
4
|
+
*/
|
|
5
|
+
import React from 'react';
|
|
6
|
+
import type { OHLCVBar } from '@tranding-custom-chart/core';
|
|
7
|
+
export interface AccessibleChartTableProps {
|
|
8
|
+
readonly caption: string;
|
|
9
|
+
readonly bars: readonly OHLCVBar[];
|
|
10
|
+
}
|
|
11
|
+
export declare function AccessibleChartTable({ caption, bars, }: AccessibleChartTableProps): React.JSX.Element;
|
|
12
|
+
//# sourceMappingURL=AccessibleChartTable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccessibleChartTable.d.ts","sourceRoot":"","sources":["../src/AccessibleChartTable.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAE5D,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,QAAQ,EAAE,CAAC;CACpC;AAED,wBAAgB,oBAAoB,CAAC,EACnC,OAAO,EACP,IAAI,GACL,EAAE,yBAAyB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA0C/C"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* @file packages/chart-react/src/AccessibleChartTable.tsx
|
|
4
|
+
* Accessible HTML table alternative for screen readers (WCAG 2.2 AA).
|
|
5
|
+
*/
|
|
6
|
+
import React from 'react';
|
|
7
|
+
export function AccessibleChartTable({ caption, bars, }) {
|
|
8
|
+
return (_jsx("div", { style: {
|
|
9
|
+
position: 'absolute',
|
|
10
|
+
width: '1px',
|
|
11
|
+
height: '1px',
|
|
12
|
+
padding: '0',
|
|
13
|
+
margin: '-1px',
|
|
14
|
+
overflow: 'hidden',
|
|
15
|
+
clip: 'rect(0, 0, 0, 0)',
|
|
16
|
+
whiteSpace: 'nowrap',
|
|
17
|
+
border: '0',
|
|
18
|
+
}, children: _jsxs("table", { children: [_jsx("caption", { children: caption }), _jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { scope: "col", children: "Date/Time" }), _jsx("th", { scope: "col", children: "Open" }), _jsx("th", { scope: "col", children: "High" }), _jsx("th", { scope: "col", children: "Low" }), _jsx("th", { scope: "col", children: "Close" }), _jsx("th", { scope: "col", children: "Volume" })] }) }), _jsx("tbody", { children: bars.slice(-100).map((b) => (_jsxs("tr", { children: [_jsx("td", { children: b.dateStr ?? new Date(b.time * 1000).toISOString() }), _jsx("td", { children: b.open.toFixed(2) }), _jsx("td", { children: b.high.toFixed(2) }), _jsx("td", { children: b.low.toFixed(2) }), _jsx("td", { children: b.close.toFixed(2) }), _jsx("td", { children: b.volume !== null ? b.volume.toLocaleString('en-IN') : 'Unavailable' })] }, b.time))) })] }) }));
|
|
19
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file packages/chart-react/src/BaselineSeries.tsx
|
|
3
|
+
* Declarative two-zone Baseline chart series component.
|
|
4
|
+
*/
|
|
5
|
+
export interface BaselineSeriesProps {
|
|
6
|
+
readonly data: readonly number[];
|
|
7
|
+
readonly baselineValue: number;
|
|
8
|
+
readonly aboveColor?: string | undefined;
|
|
9
|
+
readonly belowColor?: string | undefined;
|
|
10
|
+
readonly lineWidth?: number | undefined;
|
|
11
|
+
}
|
|
12
|
+
export declare function BaselineSeries({ data, baselineValue, aboveColor, belowColor, lineWidth, }: BaselineSeriesProps): null;
|
|
13
|
+
//# sourceMappingURL=BaselineSeries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaselineSeries.d.ts","sourceRoot":"","sources":["../src/BaselineSeries.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACzC;AAED,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EACJ,aAAa,EACb,UAAsB,EACtB,UAAsB,EACtB,SAAa,GACd,EAAE,mBAAmB,GAAG,IAAI,CA2B5B"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file packages/chart-react/src/BaselineSeries.tsx
|
|
3
|
+
* Declarative two-zone Baseline chart series component.
|
|
4
|
+
*/
|
|
5
|
+
import React, { useEffect, useId } from 'react';
|
|
6
|
+
import { renderBaselineChart } from '@tranding-custom-chart/renderer-canvas';
|
|
7
|
+
import { useChartContext } from './ChartContext.js';
|
|
8
|
+
export function BaselineSeries({ data, baselineValue, aboveColor = '#16794c', belowColor = '#b42318', lineWidth = 2, }) {
|
|
9
|
+
const { registerDataLayer, xScale, yScale, bounds, padding } = useChartContext();
|
|
10
|
+
const id = useId();
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
if (!xScale || !yScale || data.length === 0)
|
|
13
|
+
return;
|
|
14
|
+
const unregister = registerDataLayer(id, (ctx, _bounds, _padding, dpr) => {
|
|
15
|
+
renderBaselineChart({
|
|
16
|
+
ctx,
|
|
17
|
+
data,
|
|
18
|
+
xScale,
|
|
19
|
+
yScale,
|
|
20
|
+
baselineValue,
|
|
21
|
+
bounds,
|
|
22
|
+
padding,
|
|
23
|
+
dpr,
|
|
24
|
+
aboveColor,
|
|
25
|
+
belowColor,
|
|
26
|
+
lineWidth,
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
return unregister;
|
|
30
|
+
}, [registerDataLayer, id, data, xScale, yScale, bounds, padding, baselineValue, aboveColor, belowColor, lineWidth]);
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file packages/chart-react/src/BoxPlotSeries.tsx
|
|
3
|
+
* Declarative Box Plot (box-and-whisker) statistical series component.
|
|
4
|
+
*/
|
|
5
|
+
import type { BoxPlotDatum } from '@tranding-custom-chart/core';
|
|
6
|
+
import { type BoxPlotRenderOptions } from '@tranding-custom-chart/renderer-canvas';
|
|
7
|
+
export interface BoxPlotSeriesProps extends BoxPlotRenderOptions {
|
|
8
|
+
readonly data: readonly BoxPlotDatum[];
|
|
9
|
+
}
|
|
10
|
+
export declare function BoxPlotSeries({ data, boxWidthRatio, capWidthRatio, defaultColor, strokeWidth, medianColor, }: BoxPlotSeriesProps): null;
|
|
11
|
+
//# sourceMappingURL=BoxPlotSeries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BoxPlotSeries.d.ts","sourceRoot":"","sources":["../src/BoxPlotSeries.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAkB,KAAK,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAGnG,MAAM,WAAW,kBAAmB,SAAQ,oBAAoB;IAC9D,QAAQ,CAAC,IAAI,EAAE,SAAS,YAAY,EAAE,CAAC;CACxC;AAED,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,aAAmB,EACnB,aAAoB,EACpB,YAAwB,EACxB,WAAiB,EACjB,WAAuB,GACxB,EAAE,kBAAkB,GAAG,IAAI,CAgC3B"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file packages/chart-react/src/BoxPlotSeries.tsx
|
|
3
|
+
* Declarative Box Plot (box-and-whisker) statistical series component.
|
|
4
|
+
*/
|
|
5
|
+
import React, { useEffect, useId } from 'react';
|
|
6
|
+
import { renderBoxPlots } from '@tranding-custom-chart/renderer-canvas';
|
|
7
|
+
import { useChartContext } from './ChartContext.js';
|
|
8
|
+
export function BoxPlotSeries({ data, boxWidthRatio = 0.5, capWidthRatio = 0.25, defaultColor = '#3b82f6', strokeWidth = 1.5, medianColor = '#ffffff', }) {
|
|
9
|
+
const { registerDataLayer, xScale, yScale } = useChartContext();
|
|
10
|
+
const id = useId();
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
if (!xScale || !yScale || data.length === 0)
|
|
13
|
+
return;
|
|
14
|
+
const unregister = registerDataLayer(id, (ctx) => {
|
|
15
|
+
renderBoxPlots(ctx, data, xScale, yScale, {
|
|
16
|
+
boxWidthRatio,
|
|
17
|
+
capWidthRatio,
|
|
18
|
+
defaultColor,
|
|
19
|
+
strokeWidth,
|
|
20
|
+
medianColor,
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
return unregister;
|
|
24
|
+
}, [
|
|
25
|
+
registerDataLayer,
|
|
26
|
+
id,
|
|
27
|
+
data,
|
|
28
|
+
xScale,
|
|
29
|
+
yScale,
|
|
30
|
+
boxWidthRatio,
|
|
31
|
+
capWidthRatio,
|
|
32
|
+
defaultColor,
|
|
33
|
+
strokeWidth,
|
|
34
|
+
medianColor,
|
|
35
|
+
]);
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file packages/chart-react/src/BubbleSeries.tsx
|
|
3
|
+
* Declarative Bubble Chart series component.
|
|
4
|
+
*/
|
|
5
|
+
import type { BubbleDatum } from '@tranding-custom-chart/core';
|
|
6
|
+
import { type BubbleRenderOptions } from '@tranding-custom-chart/renderer-canvas';
|
|
7
|
+
export interface BubbleSeriesProps extends BubbleRenderOptions {
|
|
8
|
+
readonly data: readonly BubbleDatum[];
|
|
9
|
+
}
|
|
10
|
+
export declare function BubbleSeries({ data, minRadius, maxRadius, defaultColor, strokeColor, strokeWidth, }: BubbleSeriesProps): null;
|
|
11
|
+
//# sourceMappingURL=BubbleSeries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BubbleSeries.d.ts","sourceRoot":"","sources":["../src/BubbleSeries.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAGjG,MAAM,WAAW,iBAAkB,SAAQ,mBAAmB;IAC5D,QAAQ,CAAC,IAAI,EAAE,SAAS,WAAW,EAAE,CAAC;CACvC;AAED,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,SAAa,EACb,SAAc,EACd,YAAwC,EACxC,WAAuC,EACvC,WAAiB,GAClB,EAAE,iBAAiB,GAAG,IAAI,CAgC1B"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file packages/chart-react/src/BubbleSeries.tsx
|
|
3
|
+
* Declarative Bubble Chart series component.
|
|
4
|
+
*/
|
|
5
|
+
import React, { useEffect, useId } from 'react';
|
|
6
|
+
import { renderBubbles } from '@tranding-custom-chart/renderer-canvas';
|
|
7
|
+
import { useChartContext } from './ChartContext.js';
|
|
8
|
+
export function BubbleSeries({ data, minRadius = 3, maxRadius = 40, defaultColor = 'rgba(59, 130, 246, 0.6)', strokeColor = 'rgba(59, 130, 246, 0.9)', strokeWidth = 1.5, }) {
|
|
9
|
+
const { registerDataLayer, xScale, yScale } = useChartContext();
|
|
10
|
+
const id = useId();
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
if (!data || data.length === 0 || !xScale || !yScale)
|
|
13
|
+
return;
|
|
14
|
+
const unregister = registerDataLayer(id, (ctx) => {
|
|
15
|
+
renderBubbles(ctx, data, xScale, yScale, {
|
|
16
|
+
minRadius,
|
|
17
|
+
maxRadius,
|
|
18
|
+
defaultColor,
|
|
19
|
+
strokeColor,
|
|
20
|
+
strokeWidth,
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
return unregister;
|
|
24
|
+
}, [
|
|
25
|
+
registerDataLayer,
|
|
26
|
+
id,
|
|
27
|
+
data,
|
|
28
|
+
xScale,
|
|
29
|
+
yScale,
|
|
30
|
+
minRadius,
|
|
31
|
+
maxRadius,
|
|
32
|
+
defaultColor,
|
|
33
|
+
strokeColor,
|
|
34
|
+
strokeWidth,
|
|
35
|
+
]);
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file packages/chart-react/src/CandlestickSeries.tsx
|
|
3
|
+
* Declarative Candlestick series component.
|
|
4
|
+
*/
|
|
5
|
+
import type { OHLCVBar } from '@tranding-custom-chart/core';
|
|
6
|
+
export interface CandlestickSeriesProps {
|
|
7
|
+
readonly data: readonly OHLCVBar[];
|
|
8
|
+
readonly upColor?: string | undefined;
|
|
9
|
+
readonly downColor?: string | undefined;
|
|
10
|
+
readonly candleWidthRatio?: number | undefined;
|
|
11
|
+
}
|
|
12
|
+
export declare function CandlestickSeries({ data, upColor, downColor, candleWidthRatio, }: CandlestickSeriesProps): null;
|
|
13
|
+
//# sourceMappingURL=CandlestickSeries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CandlestickSeries.d.ts","sourceRoot":"","sources":["../src/CandlestickSeries.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAI5D,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,SAAS,QAAQ,EAAE,CAAC;IACnC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChD;AAED,wBAAgB,iBAAiB,CAAC,EAChC,IAAI,EACJ,OAAO,EACP,SAAS,EACT,gBAAsB,GACvB,EAAE,sBAAsB,GAAG,IAAI,CAmD/B"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file packages/chart-react/src/CandlestickSeries.tsx
|
|
3
|
+
* Declarative Candlestick series component.
|
|
4
|
+
*/
|
|
5
|
+
import React, { useEffect, useId } from 'react';
|
|
6
|
+
import { renderCandlesticks } from '@tranding-custom-chart/renderer-canvas';
|
|
7
|
+
import { useChartContext } from './ChartContext.js';
|
|
8
|
+
export function CandlestickSeries({ data, upColor, downColor, candleWidthRatio = 0.7, }) {
|
|
9
|
+
const { registerDataLayer, registerHitTest, xScale, yScale, theme } = useChartContext();
|
|
10
|
+
const id = useId();
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
if (!xScale || !yScale || data.length === 0)
|
|
13
|
+
return;
|
|
14
|
+
const unregisterHit = registerHitTest(id, (x, _y) => {
|
|
15
|
+
const idx = Math.round(xScale.invert(x));
|
|
16
|
+
if (idx >= 0 && idx < data.length) {
|
|
17
|
+
const bar = data[idx];
|
|
18
|
+
const barX = xScale.scale(idx);
|
|
19
|
+
if (Math.abs(x - barX) <= 20) {
|
|
20
|
+
return {
|
|
21
|
+
elementType: 'candle',
|
|
22
|
+
seriesId: id,
|
|
23
|
+
dataIndex: idx,
|
|
24
|
+
pointId: bar.time,
|
|
25
|
+
label: bar.dateStr ?? String(bar.time),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
});
|
|
31
|
+
return unregisterHit;
|
|
32
|
+
}, [registerHitTest, id, data, xScale, yScale]);
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
if (!xScale || !yScale || data.length === 0)
|
|
35
|
+
return;
|
|
36
|
+
const unregister = registerDataLayer(id, (ctx, bounds, padding, dpr) => {
|
|
37
|
+
renderCandlesticks({
|
|
38
|
+
ctx,
|
|
39
|
+
bars: data,
|
|
40
|
+
xScale,
|
|
41
|
+
yScale,
|
|
42
|
+
theme: {
|
|
43
|
+
...theme,
|
|
44
|
+
upCandle: upColor ?? theme.upCandle,
|
|
45
|
+
downCandle: downColor ?? theme.downCandle,
|
|
46
|
+
},
|
|
47
|
+
dpr,
|
|
48
|
+
candleWidthRatio,
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
return unregister;
|
|
52
|
+
}, [registerDataLayer, id, data, xScale, yScale, theme, upColor, downColor, candleWidthRatio]);
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file packages/chart-react/src/ChartContainer.tsx
|
|
3
|
+
* High-performance, responsive, accessible React container wrapping CanvasChartEngine.
|
|
4
|
+
*/
|
|
5
|
+
import React from 'react';
|
|
6
|
+
import { type ChartTheme, type Dimension, type Padding, type Scale, type ChartOptions, type DeepPartial, type ChartPlugin, type ChartEvent, type ChartEventHandler, type ChartEventType, type Unsubscribe } from '@tranding-custom-chart/core';
|
|
7
|
+
import { CanvasChartEngine } from '@tranding-custom-chart/renderer-canvas';
|
|
8
|
+
export interface ChartHandle {
|
|
9
|
+
applyOptions(options: DeepPartial<ChartOptions>): void;
|
|
10
|
+
resize(width: number, height: number): void;
|
|
11
|
+
requestRender(): void;
|
|
12
|
+
getEngine(): CanvasChartEngine | null;
|
|
13
|
+
subscribe<T = unknown>(eventType: ChartEventType | '*', handler: ChartEventHandler<T>): Unsubscribe;
|
|
14
|
+
emit<T = unknown>(event: ChartEvent<T>): void;
|
|
15
|
+
}
|
|
16
|
+
export interface ChartContainerProps {
|
|
17
|
+
readonly width?: number | undefined;
|
|
18
|
+
readonly height?: number | undefined;
|
|
19
|
+
readonly padding?: Padding | undefined;
|
|
20
|
+
readonly theme?: ChartTheme | undefined;
|
|
21
|
+
readonly options?: DeepPartial<ChartOptions> | undefined;
|
|
22
|
+
/** Extensible lifecycle plugins */
|
|
23
|
+
readonly plugins?: readonly ChartPlugin<any>[] | undefined;
|
|
24
|
+
readonly chartRef?: React.RefObject<ChartHandle | null> | ((handle: ChartHandle | null) => void) | undefined;
|
|
25
|
+
readonly xScale?: Scale<number> | null | undefined;
|
|
26
|
+
readonly yScale?: Scale<number> | null | undefined;
|
|
27
|
+
readonly secondaryYScale?: Scale<number> | null | undefined;
|
|
28
|
+
readonly ariaLabel: string;
|
|
29
|
+
readonly pointCount?: number | undefined;
|
|
30
|
+
readonly onHoverIndexChange?: ((index: number | null) => void) | undefined;
|
|
31
|
+
readonly onHoverPosChange?: ((pos: {
|
|
32
|
+
x: number;
|
|
33
|
+
y: number;
|
|
34
|
+
} | null) => void) | undefined;
|
|
35
|
+
readonly onZoom?: ((factor: number, focalIndex?: number | null) => void) | undefined;
|
|
36
|
+
readonly onPan?: ((deltaX: number) => void) | undefined;
|
|
37
|
+
readonly isPanDisabled?: boolean | undefined;
|
|
38
|
+
readonly onDimensionsChange?: ((dim: Dimension) => void) | undefined;
|
|
39
|
+
readonly className?: string | undefined;
|
|
40
|
+
readonly style?: React.CSSProperties | undefined;
|
|
41
|
+
readonly children?: React.ReactNode | undefined;
|
|
42
|
+
readonly onClick?: ((event: ChartEvent<any>) => void) | undefined;
|
|
43
|
+
readonly onDoubleClick?: ((event: ChartEvent<any>) => void) | undefined;
|
|
44
|
+
readonly onPointerDown?: ((event: ChartEvent<any>) => void) | undefined;
|
|
45
|
+
readonly onPointerUp?: ((event: ChartEvent<any>) => void) | undefined;
|
|
46
|
+
readonly onPointerMove?: ((event: ChartEvent<any>) => void) | undefined;
|
|
47
|
+
readonly onHover?: ((event: ChartEvent<any>) => void) | undefined;
|
|
48
|
+
readonly onHoverChange?: ((event: ChartEvent<any>) => void) | undefined;
|
|
49
|
+
readonly onDataPointClick?: ((event: ChartEvent<any>) => void) | undefined;
|
|
50
|
+
readonly onSeriesClick?: ((event: ChartEvent<any>) => void) | undefined;
|
|
51
|
+
readonly onLegendClick?: ((event: ChartEvent<any>) => void) | undefined;
|
|
52
|
+
readonly onRangeSelect?: ((event: ChartEvent<any>) => void) | undefined;
|
|
53
|
+
readonly onRangeChange?: ((event: ChartEvent<any>) => void) | undefined;
|
|
54
|
+
readonly onDragStart?: ((event: ChartEvent<any>) => void) | undefined;
|
|
55
|
+
readonly onDrag?: ((event: ChartEvent<any>) => void) | undefined;
|
|
56
|
+
readonly onDragEnd?: ((event: ChartEvent<any>) => void) | undefined;
|
|
57
|
+
readonly onVisibleRangeChange?: ((event: ChartEvent<any>) => void) | undefined;
|
|
58
|
+
readonly onConfigChange?: ((event: ChartEvent<any>) => void) | undefined;
|
|
59
|
+
readonly onDataChange?: ((event: ChartEvent<any>) => void) | undefined;
|
|
60
|
+
readonly onDrawingChange?: ((event: ChartEvent<any>) => void) | undefined;
|
|
61
|
+
readonly onDrawingCreate?: ((event: ChartEvent<any>) => void) | undefined;
|
|
62
|
+
readonly onDrawingSelect?: ((event: ChartEvent<any>) => void) | undefined;
|
|
63
|
+
readonly onDrawingMove?: ((event: ChartEvent<any>) => void) | undefined;
|
|
64
|
+
readonly onDrawingResize?: ((event: ChartEvent<any>) => void) | undefined;
|
|
65
|
+
readonly onDrawingDelete?: ((event: ChartEvent<any>) => void) | undefined;
|
|
66
|
+
readonly onDrawingLockChange?: ((event: ChartEvent<any>) => void) | undefined;
|
|
67
|
+
readonly onChartReady?: ((event: ChartEvent<any>) => void) | undefined;
|
|
68
|
+
readonly onChartResize?: ((event: ChartEvent<any>) => void) | undefined;
|
|
69
|
+
readonly onChartDestroy?: ((event: ChartEvent<any>) => void) | undefined;
|
|
70
|
+
readonly onError?: ((event: ChartEvent<any>) => void) | undefined;
|
|
71
|
+
}
|
|
72
|
+
export declare function ChartContainer({ width: initialWidth, height: initialHeight, padding: initialPadding, theme: initialTheme, options, plugins, chartRef, xScale, yScale, secondaryYScale, ariaLabel, pointCount, onHoverIndexChange, onHoverPosChange, onZoom, onPan, isPanDisabled, onDimensionsChange, className, style, children, onClick, onDoubleClick, onPointerDown, onPointerUp, onPointerMove, onHover, onHoverChange, onDataPointClick, onSeriesClick, onLegendClick, onRangeSelect, onRangeChange, onDragStart, onDrag, onDragEnd, onVisibleRangeChange, onConfigChange, onDataChange, onDrawingChange, onDrawingCreate, onDrawingSelect, onDrawingMove, onDrawingResize, onDrawingDelete, onDrawingLockChange, onChartReady, onChartResize, onChartDestroy, onError, }: ChartContainerProps): React.JSX.Element;
|
|
73
|
+
//# sourceMappingURL=ChartContainer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChartContainer.d.ts","sourceRoot":"","sources":["../src/ChartContainer.tsx"],"names":[],"mappings":"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"}
|