@tranding-custom-chart/react 0.0.0-stage → 2.1.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.
Files changed (116) hide show
  1. package/README.md +351 -2
  2. package/dist/AccessibleChartTable.d.ts +12 -0
  3. package/dist/AccessibleChartTable.d.ts.map +1 -0
  4. package/dist/AccessibleChartTable.js +19 -0
  5. package/dist/BaselineSeries.d.ts +13 -0
  6. package/dist/BaselineSeries.d.ts.map +1 -0
  7. package/dist/BaselineSeries.js +32 -0
  8. package/dist/BoxPlotSeries.d.ts +11 -0
  9. package/dist/BoxPlotSeries.d.ts.map +1 -0
  10. package/dist/BoxPlotSeries.js +37 -0
  11. package/dist/BubbleSeries.d.ts +11 -0
  12. package/dist/BubbleSeries.d.ts.map +1 -0
  13. package/dist/BubbleSeries.js +37 -0
  14. package/dist/CandlestickSeries.d.ts +13 -0
  15. package/dist/CandlestickSeries.d.ts.map +1 -0
  16. package/dist/CandlestickSeries.js +54 -0
  17. package/dist/ChartContainer.d.ts +73 -0
  18. package/dist/ChartContainer.d.ts.map +1 -0
  19. package/dist/ChartContainer.js +631 -0
  20. package/dist/ChartContext.d.ts +36 -0
  21. package/dist/ChartContext.d.ts.map +1 -0
  22. package/dist/ChartContext.js +13 -0
  23. package/dist/ChartSyncGroup.d.ts +14 -0
  24. package/dist/ChartSyncGroup.d.ts.map +1 -0
  25. package/dist/ChartSyncGroup.js +18 -0
  26. package/dist/ColumnsSeries.d.ts +13 -0
  27. package/dist/ColumnsSeries.d.ts.map +1 -0
  28. package/dist/ColumnsSeries.js +54 -0
  29. package/dist/CrosshairOverlay.d.ts +10 -0
  30. package/dist/CrosshairOverlay.d.ts.map +1 -0
  31. package/dist/CrosshairOverlay.js +65 -0
  32. package/dist/DrawingOverlay.d.ts +16 -0
  33. package/dist/DrawingOverlay.d.ts.map +1 -0
  34. package/dist/DrawingOverlay.js +50 -0
  35. package/dist/GridAxes.d.ts +19 -0
  36. package/dist/GridAxes.d.ts.map +1 -0
  37. package/dist/GridAxes.js +50 -0
  38. package/dist/HeatmapSeries.d.ts +11 -0
  39. package/dist/HeatmapSeries.d.ts.map +1 -0
  40. package/dist/HeatmapSeries.js +74 -0
  41. package/dist/HighLowSeries.d.ts +12 -0
  42. package/dist/HighLowSeries.d.ts.map +1 -0
  43. package/dist/HighLowSeries.js +29 -0
  44. package/dist/HlcAreaSeries.d.ts +13 -0
  45. package/dist/HlcAreaSeries.d.ts.map +1 -0
  46. package/dist/HlcAreaSeries.js +28 -0
  47. package/dist/HollowCandlestickSeries.d.ts +13 -0
  48. package/dist/HollowCandlestickSeries.d.ts.map +1 -0
  49. package/dist/HollowCandlestickSeries.js +30 -0
  50. package/dist/HorizontalBarSeries.d.ts +15 -0
  51. package/dist/HorizontalBarSeries.d.ts.map +1 -0
  52. package/dist/HorizontalBarSeries.js +42 -0
  53. package/dist/InteractiveLegend.d.ts +19 -0
  54. package/dist/InteractiveLegend.d.ts.map +1 -0
  55. package/dist/InteractiveLegend.js +39 -0
  56. package/dist/LastPriceLine.d.ts +11 -0
  57. package/dist/LastPriceLine.d.ts.map +1 -0
  58. package/dist/LastPriceLine.js +29 -0
  59. package/dist/LineSeries.d.ts +20 -0
  60. package/dist/LineSeries.d.ts.map +1 -0
  61. package/dist/LineSeries.js +74 -0
  62. package/dist/LineWithMarkersSeries.d.ts +13 -0
  63. package/dist/LineWithMarkersSeries.d.ts.map +1 -0
  64. package/dist/LineWithMarkersSeries.js +30 -0
  65. package/dist/MixedChartSeries.d.ts +14 -0
  66. package/dist/MixedChartSeries.d.ts.map +1 -0
  67. package/dist/MixedChartSeries.js +30 -0
  68. package/dist/OhlcBarSeries.d.ts +14 -0
  69. package/dist/OhlcBarSeries.d.ts.map +1 -0
  70. package/dist/OhlcBarSeries.js +31 -0
  71. package/dist/PieSeries.d.ts +18 -0
  72. package/dist/PieSeries.d.ts.map +1 -0
  73. package/dist/PieSeries.js +85 -0
  74. package/dist/PluginLayer.d.ts +11 -0
  75. package/dist/PluginLayer.d.ts.map +1 -0
  76. package/dist/PluginLayer.js +14 -0
  77. package/dist/PolarAreaSeries.d.ts +11 -0
  78. package/dist/PolarAreaSeries.d.ts.map +1 -0
  79. package/dist/PolarAreaSeries.js +35 -0
  80. package/dist/RadarSeries.d.ts +16 -0
  81. package/dist/RadarSeries.d.ts.map +1 -0
  82. package/dist/RadarSeries.js +47 -0
  83. package/dist/ScatterSeries.d.ts +11 -0
  84. package/dist/ScatterSeries.d.ts.map +1 -0
  85. package/dist/ScatterSeries.js +60 -0
  86. package/dist/SeriesMarkersOverlay.d.ts +10 -0
  87. package/dist/SeriesMarkersOverlay.d.ts.map +1 -0
  88. package/dist/SeriesMarkersOverlay.js +28 -0
  89. package/dist/StackedBarSeries.d.ts +13 -0
  90. package/dist/StackedBarSeries.d.ts.map +1 -0
  91. package/dist/StackedBarSeries.js +26 -0
  92. package/dist/StepLineSeries.d.ts +15 -0
  93. package/dist/StepLineSeries.d.ts.map +1 -0
  94. package/dist/StepLineSeries.js +28 -0
  95. package/dist/SupertrendSeries.d.ts +16 -0
  96. package/dist/SupertrendSeries.d.ts.map +1 -0
  97. package/dist/SupertrendSeries.js +40 -0
  98. package/dist/UniversalSeries.d.ts +21 -0
  99. package/dist/UniversalSeries.d.ts.map +1 -0
  100. package/dist/UniversalSeries.js +222 -0
  101. package/dist/VolumeProfileSeries.d.ts +21 -0
  102. package/dist/VolumeProfileSeries.d.ts.map +1 -0
  103. package/dist/VolumeProfileSeries.js +57 -0
  104. package/dist/VolumeSeries.d.ts +14 -0
  105. package/dist/VolumeSeries.d.ts.map +1 -0
  106. package/dist/VolumeSeries.js +33 -0
  107. package/dist/WatermarkOverlay.d.ts +11 -0
  108. package/dist/WatermarkOverlay.d.ts.map +1 -0
  109. package/dist/WatermarkOverlay.js +27 -0
  110. package/dist/index.d.ts +42 -0
  111. package/dist/index.d.ts.map +1 -0
  112. package/dist/index.js +41 -0
  113. package/dist/useChart.d.ts +16 -0
  114. package/dist/useChart.d.ts.map +1 -0
  115. package/dist/useChart.js +34 -0
  116. package/package.json +93 -4
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @file packages/chart-react/src/ChartSyncGroup.tsx
3
+ * Multi-chart synchronization context for cursor and viewport alignment.
4
+ */
5
+ import React from 'react';
6
+ export interface ChartSyncContextValue {
7
+ readonly syncHoverIndex: number | null;
8
+ readonly setSyncHoverIndex: (index: number | null) => void;
9
+ }
10
+ export declare function ChartSyncGroup({ children, }: {
11
+ readonly children: React.ReactNode;
12
+ }): React.JSX.Element;
13
+ export declare function useChartSync(): ChartSyncContextValue | null;
14
+ //# sourceMappingURL=ChartSyncGroup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartSyncGroup.d.ts","sourceRoot":"","sources":["../src/ChartSyncGroup.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAoE,MAAM,OAAO,CAAC;AAEzF,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAC5D;AAID,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,GACT,EAAE;IACD,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CACpC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAiBpB;AAED,wBAAgB,YAAY,IAAI,qBAAqB,GAAG,IAAI,CAE3D"}
@@ -0,0 +1,18 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * @file packages/chart-react/src/ChartSyncGroup.tsx
4
+ * Multi-chart synchronization context for cursor and viewport alignment.
5
+ */
6
+ import React, { createContext, useContext, useState, useCallback, useMemo } from 'react';
7
+ const ChartSyncContext = createContext(null);
8
+ export function ChartSyncGroup({ children, }) {
9
+ const [syncHoverIndex, setIndex] = useState(null);
10
+ const setSyncHoverIndex = useCallback((index) => {
11
+ setIndex(index);
12
+ }, []);
13
+ const value = useMemo(() => ({ syncHoverIndex, setSyncHoverIndex }), [syncHoverIndex, setSyncHoverIndex]);
14
+ return (_jsx(ChartSyncContext.Provider, { value: value, children: children }));
15
+ }
16
+ export function useChartSync() {
17
+ return useContext(ChartSyncContext);
18
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @file packages/chart-react/src/ColumnsSeries.tsx
3
+ * Declarative Columns chart series for vertical column histograms.
4
+ */
5
+ import type { OHLCVBar } from '@tranding-custom-chart/core';
6
+ export interface ColumnsSeriesProps {
7
+ readonly data: readonly OHLCVBar[];
8
+ readonly upColor?: string | undefined;
9
+ readonly downColor?: string | undefined;
10
+ readonly columnWidthRatio?: number | undefined;
11
+ }
12
+ export declare function ColumnsSeries({ data, upColor, downColor, columnWidthRatio, }: ColumnsSeriesProps): null;
13
+ //# sourceMappingURL=ColumnsSeries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColumnsSeries.d.ts","sourceRoot":"","sources":["../src/ColumnsSeries.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAI5D,MAAM,WAAW,kBAAkB;IACjC,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,aAAa,CAAC,EAC5B,IAAI,EACJ,OAAO,EACP,SAAS,EACT,gBAAuB,GACxB,EAAE,kBAAkB,GAAG,IAAI,CAmD3B"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * @file packages/chart-react/src/ColumnsSeries.tsx
3
+ * Declarative Columns chart series for vertical column histograms.
4
+ */
5
+ import React, { useEffect, useId } from 'react';
6
+ import { renderColumns } from '@tranding-custom-chart/renderer-canvas';
7
+ import { useChartContext } from './ChartContext.js';
8
+ export function ColumnsSeries({ data, upColor, downColor, columnWidthRatio = 0.75, }) {
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: 'bar',
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) => {
37
+ renderColumns({
38
+ ctx,
39
+ bars: data,
40
+ xScale,
41
+ yScale,
42
+ baselineY: bounds.height - padding.bottom,
43
+ theme: {
44
+ ...theme,
45
+ upCandle: upColor ?? theme.upCandle,
46
+ downCandle: downColor ?? theme.downCandle,
47
+ },
48
+ columnWidthRatio,
49
+ });
50
+ });
51
+ return unregister;
52
+ }, [registerDataLayer, id, data, xScale, yScale, theme, upColor, downColor, columnWidthRatio]);
53
+ return null;
54
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @file packages/chart-react/src/CrosshairOverlay.tsx
3
+ * Declarative interactive crosshair overlay with axis badges.
4
+ */
5
+ export interface CrosshairOverlayProps {
6
+ readonly xLabelFormatter?: ((indexOrTime: number) => string) | undefined;
7
+ readonly yLabelFormatter?: ((price: number) => string) | undefined;
8
+ }
9
+ export declare function CrosshairOverlay({ xLabelFormatter, yLabelFormatter, }: CrosshairOverlayProps): null;
10
+ //# sourceMappingURL=CrosshairOverlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CrosshairOverlay.d.ts","sourceRoot":"","sources":["../src/CrosshairOverlay.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,CAAC;IACzE,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,CAAC;CACpE;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,eAAe,EACf,eAAe,GAChB,EAAE,qBAAqB,GAAG,IAAI,CA+D9B"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * @file packages/chart-react/src/CrosshairOverlay.tsx
3
+ * Declarative interactive crosshair overlay with axis badges.
4
+ */
5
+ import React, { useEffect, useId } from 'react';
6
+ import { renderCrosshair } from '@tranding-custom-chart/renderer-canvas';
7
+ import { useChartContext } from './ChartContext.js';
8
+ export function CrosshairOverlay({ xLabelFormatter, yLabelFormatter, }) {
9
+ const { registerOverlayLayer, hoverPos, hoverIndex, syncHoverIndex, xScale, yScale, theme } = useChartContext();
10
+ const id = useId();
11
+ useEffect(() => {
12
+ const unregister = registerOverlayLayer(id, (ctx, bounds, padding, dpr) => {
13
+ if (!xScale || !yScale)
14
+ return;
15
+ const effectiveIndex = hoverIndex !== null ? hoverIndex : (syncHoverIndex ?? null);
16
+ if (hoverPos) {
17
+ // Direct pointer hover: render full crosshair with horizontal line & price badge
18
+ const priceAtY = yScale.invert(hoverPos.y);
19
+ const yLabel = yLabelFormatter ? yLabelFormatter(priceAtY) : `₹${priceAtY.toFixed(2)}`;
20
+ let xLabel;
21
+ if (effectiveIndex !== null && xLabelFormatter) {
22
+ xLabel = xLabelFormatter(effectiveIndex);
23
+ }
24
+ renderCrosshair({
25
+ ctx,
26
+ bounds,
27
+ padding,
28
+ x: hoverPos.x,
29
+ y: hoverPos.y,
30
+ theme,
31
+ dpr,
32
+ xLabel,
33
+ yLabel,
34
+ showHorizontalLine: true,
35
+ });
36
+ }
37
+ else if (effectiveIndex !== null) {
38
+ // Synchronized hover from another pane: render synchronized vertical guideline & time badge
39
+ const x = xScale.scale(effectiveIndex);
40
+ const left = padding.left;
41
+ const right = bounds.width - padding.right;
42
+ if (x < left || x > right)
43
+ return;
44
+ let xLabel;
45
+ if (xLabelFormatter) {
46
+ xLabel = xLabelFormatter(effectiveIndex);
47
+ }
48
+ renderCrosshair({
49
+ ctx,
50
+ bounds,
51
+ padding,
52
+ x,
53
+ y: (padding.top + bounds.height - padding.bottom) / 2,
54
+ theme,
55
+ dpr,
56
+ xLabel,
57
+ yLabel: undefined,
58
+ showHorizontalLine: false,
59
+ });
60
+ }
61
+ });
62
+ return unregister;
63
+ }, [registerOverlayLayer, id, hoverPos, hoverIndex, syncHoverIndex, xScale, yScale, theme, xLabelFormatter, yLabelFormatter]);
64
+ return null;
65
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @file packages/chart-react/src/DrawingOverlay.tsx
3
+ * Declarative interactive technical drawings layer (trendlines, levels, and measurement rulers).
4
+ */
5
+ import type { DrawingHandleType, DrawingItem } from '@tranding-custom-chart/core';
6
+ export interface DrawingOverlayProps {
7
+ readonly drawings: readonly DrawingItem[];
8
+ readonly selectedDrawingId?: string | null | undefined;
9
+ readonly activeHandle?: DrawingHandleType | null | undefined;
10
+ readonly onSelectDrawing?: ((id: string | null) => void) | undefined;
11
+ readonly onChangeDrawing?: ((drawing: DrawingItem, action?: string) => void) | undefined;
12
+ readonly onDeleteDrawing?: ((id: string) => void) | undefined;
13
+ readonly editable?: boolean | undefined;
14
+ }
15
+ export declare function DrawingOverlay({ drawings, selectedDrawingId, activeHandle, }: DrawingOverlayProps): null;
16
+ //# sourceMappingURL=DrawingOverlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DrawingOverlay.d.ts","sourceRoot":"","sources":["../src/DrawingOverlay.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAKlF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IAC1C,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACvD,QAAQ,CAAC,YAAY,CAAC,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,CAAC;IAC7D,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACrE,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACzF,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC9D,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACzC;AAED,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,iBAAwB,EACxB,YAAmB,GACpB,EAAE,mBAAmB,GAAG,IAAI,CA8C5B"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * @file packages/chart-react/src/DrawingOverlay.tsx
3
+ * Declarative interactive technical drawings layer (trendlines, levels, and measurement rulers).
4
+ */
5
+ import React, { useEffect, useId } from 'react';
6
+ import { hitTestAllDrawings } from '@tranding-custom-chart/core';
7
+ import { renderDrawings } from '@tranding-custom-chart/renderer-canvas';
8
+ import { useChartContext } from './ChartContext.js';
9
+ export function DrawingOverlay({ drawings, selectedDrawingId = null, activeHandle = null, }) {
10
+ const { registerOverlayLayer, registerHitTest, requestRender, xScale, yScale, bounds, padding } = useChartContext();
11
+ const id = useId();
12
+ useEffect(() => {
13
+ if (!xScale || !yScale || drawings.length === 0)
14
+ return;
15
+ const unregisterHit = registerHitTest(id, (x, y) => {
16
+ const hit = hitTestAllDrawings(drawings, x, y, xScale, yScale, 8);
17
+ if (hit) {
18
+ return {
19
+ elementType: 'drawing',
20
+ seriesId: id,
21
+ elementId: hit.drawing.id,
22
+ label: `${hit.drawing.type} (${hit.handle}): ${hit.drawing.id}`,
23
+ pointId: hit.handle,
24
+ };
25
+ }
26
+ return null;
27
+ });
28
+ return unregisterHit;
29
+ }, [registerHitTest, id, drawings, xScale, yScale]);
30
+ useEffect(() => {
31
+ if (!xScale || !yScale)
32
+ return;
33
+ const unregister = registerOverlayLayer(id, (ctx, _bounds, _padding, dpr) => {
34
+ renderDrawings({
35
+ ctx,
36
+ drawings,
37
+ xScale,
38
+ yScale,
39
+ bounds,
40
+ padding,
41
+ dpr,
42
+ selectedDrawingId,
43
+ activeHandle,
44
+ });
45
+ });
46
+ requestRender();
47
+ return unregister;
48
+ }, [registerOverlayLayer, requestRender, id, drawings, xScale, yScale, bounds, padding, selectedDrawingId, activeHandle]);
49
+ return null;
50
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @file packages/chart-react/src/GridAxes.tsx
3
+ * Declarative background grid and axes layer.
4
+ */
5
+ import type { LineStyle, Scale } from '@tranding-custom-chart/core';
6
+ export interface GridAxesProps {
7
+ readonly xTickFormatter?: ((val: number) => string) | undefined;
8
+ readonly yTickFormatter?: ((val: number) => string) | undefined;
9
+ readonly showXGrid?: boolean | undefined;
10
+ readonly showYGrid?: boolean | undefined;
11
+ readonly gridStyle?: LineStyle | undefined;
12
+ /** Primary Y-Axis position: 'left', 'right' (default), or 'both' */
13
+ readonly yAxisPosition?: 'left' | 'right' | 'both' | undefined;
14
+ /** Secondary Y-Scale for dual-axis mixed charts */
15
+ readonly secondaryYScale?: Scale<number> | undefined;
16
+ readonly secondaryYTickFormatter?: ((val: number) => string) | undefined;
17
+ }
18
+ export declare function GridAxes({ xTickFormatter, yTickFormatter, showXGrid, showYGrid, gridStyle, yAxisPosition, secondaryYScale, secondaryYTickFormatter, }: GridAxesProps): null;
19
+ //# sourceMappingURL=GridAxes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GridAxes.d.ts","sourceRoot":"","sources":["../src/GridAxes.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAIpE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,CAAC;IAChE,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,CAAC;IAChE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC3C,oEAAoE;IACpE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IAC/D,mDAAmD;IACnD,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IACrD,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,CAAC;CAC1E;AAED,wBAAgB,QAAQ,CAAC,EACvB,cAAc,EACd,cAAc,EACd,SAAgB,EAChB,SAAgB,EAChB,SAAoB,EACpB,aAAuB,EACvB,eAAe,EACf,uBAAuB,GACxB,EAAE,aAAa,GAAG,IAAI,CA6CtB"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * @file packages/chart-react/src/GridAxes.tsx
3
+ * Declarative background grid and axes layer.
4
+ */
5
+ import React, { useEffect, useId } from 'react';
6
+ import { renderGridAndAxes } from '@tranding-custom-chart/renderer-canvas';
7
+ import { useChartContext } from './ChartContext.js';
8
+ export function GridAxes({ xTickFormatter, yTickFormatter, showXGrid = true, showYGrid = true, gridStyle = 'dashed', yAxisPosition = 'right', secondaryYScale, secondaryYTickFormatter, }) {
9
+ const { registerDataLayer, xScale, yScale, theme } = useChartContext();
10
+ const id = useId();
11
+ useEffect(() => {
12
+ if (!xScale || !yScale)
13
+ return;
14
+ const unregister = registerDataLayer(id, (ctx, bounds, padding, dpr) => {
15
+ renderGridAndAxes({
16
+ ctx,
17
+ bounds,
18
+ padding,
19
+ xScale,
20
+ yScale,
21
+ theme,
22
+ dpr,
23
+ xTickFormatter,
24
+ yTickFormatter,
25
+ showXGrid,
26
+ showYGrid,
27
+ gridStyle,
28
+ yAxisPosition,
29
+ secondaryYScale,
30
+ secondaryYTickFormatter,
31
+ });
32
+ });
33
+ return unregister;
34
+ }, [
35
+ registerDataLayer,
36
+ id,
37
+ xScale,
38
+ yScale,
39
+ theme,
40
+ xTickFormatter,
41
+ yTickFormatter,
42
+ showXGrid,
43
+ showYGrid,
44
+ gridStyle,
45
+ yAxisPosition,
46
+ secondaryYScale,
47
+ secondaryYTickFormatter,
48
+ ]);
49
+ return null;
50
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @file packages/chart-react/src/HeatmapSeries.tsx
3
+ * Declarative 2D Matrix Heatmap series component.
4
+ */
5
+ import type { HeatmapDatum } from '@tranding-custom-chart/core';
6
+ import { type HeatmapRenderOptions } from '@tranding-custom-chart/renderer-canvas';
7
+ export interface HeatmapSeriesProps extends HeatmapRenderOptions {
8
+ readonly data: readonly HeatmapDatum[];
9
+ }
10
+ export declare function HeatmapSeries({ data, cellGap, cellRadius, colorLow, colorHigh, showLabels, labelColor, fontSize, }: HeatmapSeriesProps): null;
11
+ //# sourceMappingURL=HeatmapSeries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HeatmapSeries.d.ts","sourceRoot":"","sources":["../src/HeatmapSeries.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAiB,KAAK,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAGlG,MAAM,WAAW,kBAAmB,SAAQ,oBAAoB;IAC9D,QAAQ,CAAC,IAAI,EAAE,SAAS,YAAY,EAAE,CAAC;CACxC;AAED,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,OAAW,EACX,UAAc,EACd,QAAkC,EAClC,SAAqC,EACrC,UAAkB,EAClB,UAAsB,EACtB,QAAa,GACd,EAAE,kBAAkB,GAAG,IAAI,CAyE3B"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * @file packages/chart-react/src/HeatmapSeries.tsx
3
+ * Declarative 2D Matrix Heatmap series component.
4
+ */
5
+ import React, { useEffect, useId } from 'react';
6
+ import { renderHeatmap } from '@tranding-custom-chart/renderer-canvas';
7
+ import { useChartContext } from './ChartContext.js';
8
+ export function HeatmapSeries({ data, cellGap = 2, cellRadius = 2, colorLow = 'rgba(30, 41, 59, 0.6)', colorHigh = 'rgba(16, 185, 129, 0.9)', showLabels = false, labelColor = '#ffffff', fontSize = 10, }) {
9
+ const { registerDataLayer, registerHitTest, bounds, padding } = useChartContext();
10
+ const id = useId();
11
+ useEffect(() => {
12
+ if (!data || data.length === 0)
13
+ return;
14
+ const unregisterHit = registerHitTest(id, (x, y) => {
15
+ const cols = Array.from(new Set(data.map((d) => String(d.x))));
16
+ const rows = Array.from(new Set(data.map((d) => String(d.y))));
17
+ if (cols.length === 0 || rows.length === 0)
18
+ return null;
19
+ const plotWidth = bounds.width - padding.left - padding.right;
20
+ const plotHeight = bounds.height - padding.top - padding.bottom;
21
+ const colWidth = (plotWidth - (cols.length - 1) * cellGap) / cols.length;
22
+ const rowHeight = (plotHeight - (rows.length - 1) * cellGap) / rows.length;
23
+ for (let i = 0; i < data.length; i++) {
24
+ const datum = data[i];
25
+ const colIdx = cols.indexOf(String(datum.x));
26
+ const rowIdx = rows.indexOf(String(datum.y));
27
+ if (colIdx === -1 || rowIdx === -1)
28
+ continue;
29
+ const cellX = padding.left + colIdx * (colWidth + cellGap);
30
+ const cellY = padding.top + rowIdx * (rowHeight + cellGap);
31
+ if (x >= cellX && x <= cellX + colWidth && y >= cellY && y <= cellY + rowHeight) {
32
+ return {
33
+ elementType: 'cell',
34
+ seriesId: id,
35
+ dataIndex: i,
36
+ label: `${datum.x} × ${datum.y}: ${datum.value}`,
37
+ };
38
+ }
39
+ }
40
+ return null;
41
+ });
42
+ return unregisterHit;
43
+ }, [registerHitTest, id, data, bounds, padding, cellGap]);
44
+ useEffect(() => {
45
+ if (!data || data.length === 0)
46
+ return;
47
+ const unregister = registerDataLayer(id, (ctx) => {
48
+ renderHeatmap(ctx, data, bounds, padding, {
49
+ cellGap,
50
+ cellRadius,
51
+ colorLow,
52
+ colorHigh,
53
+ showLabels,
54
+ labelColor,
55
+ fontSize,
56
+ });
57
+ });
58
+ return unregister;
59
+ }, [
60
+ registerDataLayer,
61
+ id,
62
+ data,
63
+ bounds,
64
+ padding,
65
+ cellGap,
66
+ cellRadius,
67
+ colorLow,
68
+ colorHigh,
69
+ showLabels,
70
+ labelColor,
71
+ fontSize,
72
+ ]);
73
+ return null;
74
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @file packages/chart-react/src/HighLowSeries.tsx
3
+ * Declarative High-Low range bars series component.
4
+ */
5
+ import type { OHLCVBar } from '@tranding-custom-chart/core';
6
+ export interface HighLowSeriesProps {
7
+ readonly data: readonly OHLCVBar[];
8
+ readonly color?: string | undefined;
9
+ readonly lineWidth?: number | undefined;
10
+ }
11
+ export declare function HighLowSeries({ data, color, lineWidth, }: HighLowSeriesProps): null;
12
+ //# sourceMappingURL=HighLowSeries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HighLowSeries.d.ts","sourceRoot":"","sources":["../src/HighLowSeries.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAI5D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,SAAS,QAAQ,EAAE,CAAC;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACzC;AAED,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,KAAK,EACL,SAAa,GACd,EAAE,kBAAkB,GAAG,IAAI,CAwB3B"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @file packages/chart-react/src/HighLowSeries.tsx
3
+ * Declarative High-Low range bars series component.
4
+ */
5
+ import React, { useEffect, useId } from 'react';
6
+ import { renderHighLowBars } from '@tranding-custom-chart/renderer-canvas';
7
+ import { useChartContext } from './ChartContext.js';
8
+ export function HighLowSeries({ data, color, lineWidth = 2, }) {
9
+ const { registerDataLayer, xScale, yScale, theme } = 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
+ renderHighLowBars({
16
+ ctx,
17
+ bars: data,
18
+ xScale,
19
+ yScale,
20
+ theme,
21
+ dpr,
22
+ customColor: color,
23
+ lineWidth,
24
+ });
25
+ });
26
+ return unregister;
27
+ }, [registerDataLayer, id, data, xScale, yScale, theme, color, lineWidth]);
28
+ return null;
29
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @file packages/chart-react/src/HlcAreaSeries.tsx
3
+ * Declarative HLC Area series component (High-Low shaded spread with Close line).
4
+ */
5
+ import type { OHLCVBar } from '@tranding-custom-chart/core';
6
+ export interface HlcAreaSeriesProps {
7
+ readonly data: readonly OHLCVBar[];
8
+ readonly bandFillColor?: string | undefined;
9
+ readonly closeLineColor?: string | undefined;
10
+ readonly closeLineWidth?: number | undefined;
11
+ }
12
+ export declare function HlcAreaSeries({ data, bandFillColor, closeLineColor, closeLineWidth, }: HlcAreaSeriesProps): null;
13
+ //# sourceMappingURL=HlcAreaSeries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HlcAreaSeries.d.ts","sourceRoot":"","sources":["../src/HlcAreaSeries.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAI5D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,SAAS,QAAQ,EAAE,CAAC;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7C,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9C;AAED,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,aAAa,EACb,cAAc,EACd,cAAc,GACf,EAAE,kBAAkB,GAAG,IAAI,CAuB3B"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @file packages/chart-react/src/HlcAreaSeries.tsx
3
+ * Declarative HLC Area series component (High-Low shaded spread with Close line).
4
+ */
5
+ import React, { useEffect, useId } from 'react';
6
+ import { renderHlcArea } from '@tranding-custom-chart/renderer-canvas';
7
+ import { useChartContext } from './ChartContext.js';
8
+ export function HlcAreaSeries({ data, bandFillColor, closeLineColor, closeLineWidth, }) {
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
+ renderHlcArea({
16
+ ctx,
17
+ bars: data,
18
+ xScale,
19
+ yScale,
20
+ bandFillColor,
21
+ closeLineColor,
22
+ closeLineWidth,
23
+ });
24
+ });
25
+ return unregister;
26
+ }, [registerDataLayer, id, data, xScale, yScale, bandFillColor, closeLineColor, closeLineWidth]);
27
+ return null;
28
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @file packages/chart-react/src/HollowCandlestickSeries.tsx
3
+ * Declarative Hollow Candlestick series component.
4
+ */
5
+ import type { OHLCVBar } from '@tranding-custom-chart/core';
6
+ export interface HollowCandlestickSeriesProps {
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 HollowCandlestickSeries({ data, upColor, downColor, candleWidthRatio, }: HollowCandlestickSeriesProps): null;
13
+ //# sourceMappingURL=HollowCandlestickSeries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HollowCandlestickSeries.d.ts","sourceRoot":"","sources":["../src/HollowCandlestickSeries.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAI5D,MAAM,WAAW,4BAA4B;IAC3C,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,uBAAuB,CAAC,EACtC,IAAI,EACJ,OAAO,EACP,SAAS,EACT,gBAAsB,GACvB,EAAE,4BAA4B,GAAG,IAAI,CAyBrC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @file packages/chart-react/src/HollowCandlestickSeries.tsx
3
+ * Declarative Hollow Candlestick series component.
4
+ */
5
+ import React, { useEffect, useId } from 'react';
6
+ import { renderHollowCandlesticks } from '@tranding-custom-chart/renderer-canvas';
7
+ import { useChartContext } from './ChartContext.js';
8
+ export function HollowCandlestickSeries({ data, upColor, downColor, candleWidthRatio = 0.7, }) {
9
+ const { registerDataLayer, xScale, yScale, theme } = 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
+ renderHollowCandlesticks({
16
+ ctx,
17
+ bars: data,
18
+ xScale,
19
+ yScale,
20
+ theme,
21
+ dpr,
22
+ candleWidthRatio,
23
+ customUpColor: upColor,
24
+ customDownColor: downColor,
25
+ });
26
+ });
27
+ return unregister;
28
+ }, [registerDataLayer, id, data, xScale, yScale, theme, upColor, downColor, candleWidthRatio]);
29
+ return null;
30
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * @file packages/chart-react/src/HorizontalBarSeries.tsx
3
+ * Declarative Horizontal Bar series component.
4
+ */
5
+ import type { HorizontalBarDatum } from '@tranding-custom-chart/core';
6
+ export interface HorizontalBarSeriesProps {
7
+ readonly data: readonly HorizontalBarDatum[];
8
+ readonly barHeightRatio?: number | undefined;
9
+ readonly borderRadius?: number | undefined;
10
+ readonly defaultColor?: string | undefined;
11
+ readonly showLabels?: boolean | undefined;
12
+ readonly labelColor?: string | undefined;
13
+ }
14
+ export declare function HorizontalBarSeries({ data, barHeightRatio, borderRadius, defaultColor, showLabels, labelColor, }: HorizontalBarSeriesProps): null;
15
+ //# sourceMappingURL=HorizontalBarSeries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HorizontalBarSeries.d.ts","sourceRoot":"","sources":["../src/HorizontalBarSeries.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAItE,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,IAAI,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAC7C,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1C;AAED,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,cAAoB,EACpB,YAAgB,EAChB,YAAwB,EACxB,UAAiB,EACjB,UAAU,GACX,EAAE,wBAAwB,GAAG,IAAI,CAqCjC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * @file packages/chart-react/src/HorizontalBarSeries.tsx
3
+ * Declarative Horizontal Bar series component.
4
+ */
5
+ import React, { useEffect, useId } from 'react';
6
+ import { renderHorizontalBars } from '@tranding-custom-chart/renderer-canvas';
7
+ import { useChartContext } from './ChartContext.js';
8
+ export function HorizontalBarSeries({ data, barHeightRatio = 0.6, borderRadius = 4, defaultColor = '#3b82f6', showLabels = true, labelColor, }) {
9
+ const { registerDataLayer, bounds, padding, xScale, theme } = useChartContext();
10
+ const id = useId();
11
+ useEffect(() => {
12
+ if (!xScale || data.length === 0)
13
+ return;
14
+ const unregister = registerDataLayer(id, (ctx) => {
15
+ renderHorizontalBars(ctx, data, {
16
+ bounds,
17
+ padding,
18
+ xScale,
19
+ barHeightRatio,
20
+ borderRadius,
21
+ defaultColor,
22
+ showLabels,
23
+ labelColor: labelColor ?? theme.textPrimary,
24
+ });
25
+ });
26
+ return unregister;
27
+ }, [
28
+ registerDataLayer,
29
+ id,
30
+ data,
31
+ bounds,
32
+ padding,
33
+ xScale,
34
+ barHeightRatio,
35
+ borderRadius,
36
+ defaultColor,
37
+ showLabels,
38
+ labelColor,
39
+ theme.textPrimary,
40
+ ]);
41
+ return null;
42
+ }