@forgecharts/sdk 1.1.28 → 1.1.30

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 (237) hide show
  1. package/dist/index.js +8100 -48
  2. package/dist/index.js.map +1 -1
  3. package/dist/internal.js +8851 -31
  4. package/dist/internal.js.map +1 -1
  5. package/dist/react/index.js +11558 -27
  6. package/dist/react/index.js.map +1 -1
  7. package/dist/react/internal.js +12147 -43
  8. package/dist/react/internal.js.map +1 -1
  9. package/package.json +1 -1
  10. package/dist/__tests__/backwardCompatibility.test.js +0 -159
  11. package/dist/__tests__/backwardCompatibility.test.js.map +0 -1
  12. package/dist/__tests__/candleInvariant.test.js +0 -415
  13. package/dist/__tests__/candleInvariant.test.js.map +0 -1
  14. package/dist/__tests__/public-api-surface.js +0 -38
  15. package/dist/__tests__/public-api-surface.js.map +0 -1
  16. package/dist/__tests__/timeframeBoundary.test.js +0 -452
  17. package/dist/__tests__/timeframeBoundary.test.js.map +0 -1
  18. package/dist/api/DrawingManager.js +0 -190
  19. package/dist/api/DrawingManager.js.map +0 -1
  20. package/dist/api/EventBus.js +0 -44
  21. package/dist/api/EventBus.js.map +0 -1
  22. package/dist/api/IndicatorDAG.js +0 -316
  23. package/dist/api/IndicatorDAG.js.map +0 -1
  24. package/dist/api/IndicatorRegistry.js +0 -39
  25. package/dist/api/IndicatorRegistry.js.map +0 -1
  26. package/dist/api/LayoutManager.js +0 -51
  27. package/dist/api/LayoutManager.js.map +0 -1
  28. package/dist/api/PaneManager.js +0 -119
  29. package/dist/api/PaneManager.js.map +0 -1
  30. package/dist/api/ReferenceAPI.js +0 -153
  31. package/dist/api/ReferenceAPI.js.map +0 -1
  32. package/dist/api/TChart.js +0 -765
  33. package/dist/api/TChart.js.map +0 -1
  34. package/dist/api/createChart.js +0 -42
  35. package/dist/api/createChart.js.map +0 -1
  36. package/dist/api/drawing tools/fib gann menu/fibRetracement.js +0 -22
  37. package/dist/api/drawing tools/fib gann menu/fibRetracement.js.map +0 -1
  38. package/dist/api/drawing tools/lines menu/crossLine.js +0 -16
  39. package/dist/api/drawing tools/lines menu/crossLine.js.map +0 -1
  40. package/dist/api/drawing tools/lines menu/disjointChannel.js +0 -59
  41. package/dist/api/drawing tools/lines menu/disjointChannel.js.map +0 -1
  42. package/dist/api/drawing tools/lines menu/extendedLine.js +0 -17
  43. package/dist/api/drawing tools/lines menu/extendedLine.js.map +0 -1
  44. package/dist/api/drawing tools/lines menu/flatTopBottom.js +0 -41
  45. package/dist/api/drawing tools/lines menu/flatTopBottom.js.map +0 -1
  46. package/dist/api/drawing tools/lines menu/horizontal.js +0 -19
  47. package/dist/api/drawing tools/lines menu/horizontal.js.map +0 -1
  48. package/dist/api/drawing tools/lines menu/horizontalRay.js +0 -20
  49. package/dist/api/drawing tools/lines menu/horizontalRay.js.map +0 -1
  50. package/dist/api/drawing tools/lines menu/infoLine.js +0 -107
  51. package/dist/api/drawing tools/lines menu/infoLine.js.map +0 -1
  52. package/dist/api/drawing tools/lines menu/insidePitchfork.js +0 -31
  53. package/dist/api/drawing tools/lines menu/insidePitchfork.js.map +0 -1
  54. package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.js +0 -15
  55. package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.js.map +0 -1
  56. package/dist/api/drawing tools/lines menu/parallelChannel.js +0 -43
  57. package/dist/api/drawing tools/lines menu/parallelChannel.js.map +0 -1
  58. package/dist/api/drawing tools/lines menu/pitchfork.js +0 -12
  59. package/dist/api/drawing tools/lines menu/pitchfork.js.map +0 -1
  60. package/dist/api/drawing tools/lines menu/ray.js +0 -23
  61. package/dist/api/drawing tools/lines menu/ray.js.map +0 -1
  62. package/dist/api/drawing tools/lines menu/regressionTrend.js +0 -127
  63. package/dist/api/drawing tools/lines menu/regressionTrend.js.map +0 -1
  64. package/dist/api/drawing tools/lines menu/schiffPitchfork.js +0 -15
  65. package/dist/api/drawing tools/lines menu/schiffPitchfork.js.map +0 -1
  66. package/dist/api/drawing tools/lines menu/trendAngle.js +0 -51
  67. package/dist/api/drawing tools/lines menu/trendAngle.js.map +0 -1
  68. package/dist/api/drawing tools/lines menu/trendline.js +0 -11
  69. package/dist/api/drawing tools/lines menu/trendline.js.map +0 -1
  70. package/dist/api/drawing tools/lines menu/vertical.js +0 -11
  71. package/dist/api/drawing tools/lines menu/vertical.js.map +0 -1
  72. package/dist/api/drawing tools/pointers menu/crosshair.js +0 -16
  73. package/dist/api/drawing tools/pointers menu/crosshair.js.map +0 -1
  74. package/dist/api/drawing tools/pointers menu/cursor.js +0 -15
  75. package/dist/api/drawing tools/pointers menu/cursor.js.map +0 -1
  76. package/dist/api/drawing tools/pointers menu/demonstration.js +0 -30
  77. package/dist/api/drawing tools/pointers menu/demonstration.js.map +0 -1
  78. package/dist/api/drawing tools/pointers menu/dot.js +0 -23
  79. package/dist/api/drawing tools/pointers menu/dot.js.map +0 -1
  80. package/dist/api/drawing tools/shapes menu/rectangle.js +0 -19
  81. package/dist/api/drawing tools/shapes menu/rectangle.js.map +0 -1
  82. package/dist/api/drawing tools/shapes menu/text.js +0 -25
  83. package/dist/api/drawing tools/shapes menu/text.js.map +0 -1
  84. package/dist/api/drawingUtils.js +0 -83
  85. package/dist/api/drawingUtils.js.map +0 -1
  86. package/dist/core/CanvasLayer.js +0 -56
  87. package/dist/core/CanvasLayer.js.map +0 -1
  88. package/dist/core/Chart.js +0 -839
  89. package/dist/core/Chart.js.map +0 -1
  90. package/dist/core/CoordTransform.js +0 -224
  91. package/dist/core/CoordTransform.js.map +0 -1
  92. package/dist/core/Crosshair.js +0 -186
  93. package/dist/core/Crosshair.js.map +0 -1
  94. package/dist/core/IndicatorEngine.js +0 -181
  95. package/dist/core/IndicatorEngine.js.map +0 -1
  96. package/dist/core/InteractionManager.js +0 -698
  97. package/dist/core/InteractionManager.js.map +0 -1
  98. package/dist/core/PriceScale.js +0 -113
  99. package/dist/core/PriceScale.js.map +0 -1
  100. package/dist/core/Series.js +0 -114
  101. package/dist/core/Series.js.map +0 -1
  102. package/dist/core/TimeScale.js +0 -150
  103. package/dist/core/TimeScale.js.map +0 -1
  104. package/dist/datafeed/DatafeedConnector.js +0 -268
  105. package/dist/datafeed/DatafeedConnector.js.map +0 -1
  106. package/dist/engine/CandleEngine.js +0 -318
  107. package/dist/engine/CandleEngine.js.map +0 -1
  108. package/dist/engine/__tests__/CandleEngine.test.js +0 -300
  109. package/dist/engine/__tests__/CandleEngine.test.js.map +0 -1
  110. package/dist/engine/candleInvariants.js +0 -134
  111. package/dist/engine/candleInvariants.js.map +0 -1
  112. package/dist/engine/mergeUtils.js +0 -64
  113. package/dist/engine/mergeUtils.js.map +0 -1
  114. package/dist/engine/timeframeUtils.js +0 -100
  115. package/dist/engine/timeframeUtils.js.map +0 -1
  116. package/dist/licensing/ChartRuntimeResolver.js +0 -310
  117. package/dist/licensing/ChartRuntimeResolver.js.map +0 -1
  118. package/dist/licensing/LicenseManager.js +0 -114
  119. package/dist/licensing/LicenseManager.js.map +0 -1
  120. package/dist/licensing/__tests__/ChartRuntimeResolver.test.js +0 -177
  121. package/dist/licensing/__tests__/ChartRuntimeResolver.test.js.map +0 -1
  122. package/dist/licensing/__tests__/LicenseManager.test.js +0 -153
  123. package/dist/licensing/__tests__/LicenseManager.test.js.map +0 -1
  124. package/dist/licensing/licenseTypes.js +0 -2
  125. package/dist/licensing/licenseTypes.js.map +0 -1
  126. package/dist/pine/PineCompiler.js +0 -44
  127. package/dist/pine/PineCompiler.js.map +0 -1
  128. package/dist/pine/diagnostics.js +0 -11
  129. package/dist/pine/diagnostics.js.map +0 -1
  130. package/dist/pine/index.js +0 -5
  131. package/dist/pine/index.js.map +0 -1
  132. package/dist/pine/pine-ast.js +0 -19
  133. package/dist/pine/pine-ast.js.map +0 -1
  134. package/dist/pine/pine-lexer.js +0 -249
  135. package/dist/pine/pine-lexer.js.map +0 -1
  136. package/dist/pine/pine-parser.js +0 -416
  137. package/dist/pine/pine-parser.js.map +0 -1
  138. package/dist/pine/pine-transpiler.js +0 -260
  139. package/dist/pine/pine-transpiler.js.map +0 -1
  140. package/dist/pixi/LayerName.js +0 -35
  141. package/dist/pixi/LayerName.js.map +0 -1
  142. package/dist/pixi/PixiCandlestickRenderer.js +0 -107
  143. package/dist/pixi/PixiCandlestickRenderer.js.map +0 -1
  144. package/dist/pixi/PixiChart.js +0 -367
  145. package/dist/pixi/PixiChart.js.map +0 -1
  146. package/dist/pixi/PixiCrosshairRenderer.js +0 -110
  147. package/dist/pixi/PixiCrosshairRenderer.js.map +0 -1
  148. package/dist/pixi/PixiDrawingRenderer.js +0 -111
  149. package/dist/pixi/PixiDrawingRenderer.js.map +0 -1
  150. package/dist/pixi/PixiGridRenderer.js +0 -114
  151. package/dist/pixi/PixiGridRenderer.js.map +0 -1
  152. package/dist/pixi/PixiLayerManager.js +0 -92
  153. package/dist/pixi/PixiLayerManager.js.map +0 -1
  154. package/dist/react/canvas/ChartCanvas.js +0 -604
  155. package/dist/react/canvas/ChartCanvas.js.map +0 -1
  156. package/dist/react/canvas/ChartContextMenu.js +0 -5
  157. package/dist/react/canvas/ChartContextMenu.js.map +0 -1
  158. package/dist/react/canvas/ChartSettingsDialog.js +0 -28
  159. package/dist/react/canvas/ChartSettingsDialog.js.map +0 -1
  160. package/dist/react/canvas/IndicatorLabel.js +0 -196
  161. package/dist/react/canvas/IndicatorLabel.js.map +0 -1
  162. package/dist/react/canvas/IndicatorPane.js +0 -395
  163. package/dist/react/canvas/IndicatorPane.js.map +0 -1
  164. package/dist/react/canvas/PointerOverlay.js +0 -61
  165. package/dist/react/canvas/PointerOverlay.js.map +0 -1
  166. package/dist/react/canvas/toolbars/LeftToolbar.js +0 -407
  167. package/dist/react/canvas/toolbars/LeftToolbar.js.map +0 -1
  168. package/dist/react/hooks/useChartCapabilities.js +0 -66
  169. package/dist/react/hooks/useChartCapabilities.js.map +0 -1
  170. package/dist/react/shell/ManagedAppShell.js +0 -440
  171. package/dist/react/shell/ManagedAppShell.js.map +0 -1
  172. package/dist/react/trading/TradingBridge.js +0 -73
  173. package/dist/react/trading/TradingBridge.js.map +0 -1
  174. package/dist/react/workspace/ChartWorkspace.js +0 -42
  175. package/dist/react/workspace/ChartWorkspace.js.map +0 -1
  176. package/dist/react/workspace/FloatingPanel.js +0 -82
  177. package/dist/react/workspace/FloatingPanel.js.map +0 -1
  178. package/dist/react/workspace/IndicatorsDialog.js +0 -121
  179. package/dist/react/workspace/IndicatorsDialog.js.map +0 -1
  180. package/dist/react/workspace/LayoutMenu.js +0 -113
  181. package/dist/react/workspace/LayoutMenu.js.map +0 -1
  182. package/dist/react/workspace/SymbolSearchDialog.js +0 -245
  183. package/dist/react/workspace/SymbolSearchDialog.js.map +0 -1
  184. package/dist/react/workspace/TabBar.js +0 -29
  185. package/dist/react/workspace/TabBar.js.map +0 -1
  186. package/dist/react/workspace/toolbars/BottomToolbar.js +0 -236
  187. package/dist/react/workspace/toolbars/BottomToolbar.js.map +0 -1
  188. package/dist/react/workspace/toolbars/RightToolbar.js +0 -18
  189. package/dist/react/workspace/toolbars/RightToolbar.js.map +0 -1
  190. package/dist/react/workspace/toolbars/TopToolbar.js +0 -82
  191. package/dist/react/workspace/toolbars/TopToolbar.js.map +0 -1
  192. package/dist/renderers/CandlestickRenderer.js +0 -98
  193. package/dist/renderers/CandlestickRenderer.js.map +0 -1
  194. package/dist/renderers/HistogramRenderer.js +0 -50
  195. package/dist/renderers/HistogramRenderer.js.map +0 -1
  196. package/dist/renderers/LineRenderer.js +0 -64
  197. package/dist/renderers/LineRenderer.js.map +0 -1
  198. package/dist/theme/colors.js +0 -19
  199. package/dist/theme/colors.js.map +0 -1
  200. package/dist/tools/barDivergenceCheck.js +0 -200
  201. package/dist/tools/barDivergenceCheck.js.map +0 -1
  202. package/dist/trading/TradingOverlayStore.js +0 -139
  203. package/dist/trading/TradingOverlayStore.js.map +0 -1
  204. package/dist/trading/UnmanagedIngestion.js +0 -114
  205. package/dist/trading/UnmanagedIngestion.js.map +0 -1
  206. package/dist/trading/__tests__/ManagedTradingController.test.js +0 -271
  207. package/dist/trading/__tests__/ManagedTradingController.test.js.map +0 -1
  208. package/dist/trading/__tests__/TradingOverlayStore.test.js +0 -267
  209. package/dist/trading/__tests__/TradingOverlayStore.test.js.map +0 -1
  210. package/dist/trading/__tests__/UnmanagedIngestion.test.js +0 -170
  211. package/dist/trading/__tests__/UnmanagedIngestion.test.js.map +0 -1
  212. package/dist/trading/managed/ManagedTradingController.js +0 -247
  213. package/dist/trading/managed/ManagedTradingController.js.map +0 -1
  214. package/dist/trading/managed/managedCapabilities.js +0 -79
  215. package/dist/trading/managed/managedCapabilities.js.map +0 -1
  216. package/dist/trading/managed/managedTypes.js +0 -13
  217. package/dist/trading/managed/managedTypes.js.map +0 -1
  218. package/dist/trading/tradingTypes.js +0 -8
  219. package/dist/trading/tradingTypes.js.map +0 -1
  220. package/dist/tscript/TScriptIndicator.js +0 -47
  221. package/dist/tscript/TScriptIndicator.js.map +0 -1
  222. package/dist/tscript/ast.js +0 -22
  223. package/dist/tscript/ast.js.map +0 -1
  224. package/dist/tscript/lexer.js +0 -187
  225. package/dist/tscript/lexer.js.map +0 -1
  226. package/dist/tscript/parser.js +0 -318
  227. package/dist/tscript/parser.js.map +0 -1
  228. package/dist/tscript/runtime.js +0 -475
  229. package/dist/tscript/runtime.js.map +0 -1
  230. package/dist/tscript/series.js +0 -79
  231. package/dist/tscript/series.js.map +0 -1
  232. package/dist/types/IChart.js +0 -2
  233. package/dist/types/IChart.js.map +0 -1
  234. package/dist/types/IRenderer.js +0 -2
  235. package/dist/types/IRenderer.js.map +0 -1
  236. package/dist/types/ISeries.js +0 -2
  237. package/dist/types/ISeries.js.map +0 -1
@@ -1,367 +0,0 @@
1
- import { Application } from 'pixi.js';
2
- import { CanvasLayer } from '../core/CanvasLayer';
3
- import { TimeScale } from '../core/TimeScale';
4
- import { PriceScale } from '../core/PriceScale';
5
- import { CoordTransform } from '../core/CoordTransform';
6
- import { Series } from '../core/Series';
7
- import { InteractionManager } from '../core/InteractionManager';
8
- import { DARK_COLORS, LIGHT_COLORS } from '../theme/colors';
9
- import { LayerName } from './LayerName';
10
- import { PixiLayerManager } from './PixiLayerManager';
11
- import { PixiGridRenderer } from './PixiGridRenderer';
12
- import { PixiCandlestickRenderer } from './PixiCandlestickRenderer';
13
- import { PixiCrosshairRenderer } from './PixiCrosshairRenderer';
14
- import { PixiDrawingRenderer } from './PixiDrawingRenderer';
15
- /**
16
- * PixiChart — GPU-accelerated chart engine built on PixiJS v8.
17
- *
18
- * Implements `IChart` identically to the Canvas 2D `Chart` class, so it is
19
- * a drop-in replacement. Rendering is performed inside a PixiJS `Application`
20
- * (WebGL / WebGPU auto-detected) using seven sortable `Container` layers.
21
- *
22
- * Selective redraw:
23
- * - `DirtyFlags` tracks which layers need painting.
24
- * - Each layer's renderer is called only when its flag is set.
25
- * - Viewport changes (zoom/pan) mark all layers dirty via `_markViewportDirty()`.
26
- * - Data changes only mark `PriceSeries` dirty.
27
- *
28
- * @example
29
- * ```ts
30
- * const chart = new PixiChart(container, { theme: 'dark' });
31
- * const series = chart.addSeries({ type: 'candlestick' });
32
- * series.setData(bars);
33
- *
34
- * // Access the transform for drawing tools or plugins
35
- * const { x, y } = chart.transform().toPixel(bar.time, bar.close);
36
- * ```
37
- */
38
- export class PixiChart {
39
- _app;
40
- _stage;
41
- _container;
42
- _options;
43
- _colors;
44
- _timeScale;
45
- _priceScale;
46
- _transform;
47
- _layers;
48
- _gridRenderer;
49
- _candleRenderer;
50
- _crosshairRenderer;
51
- _drawingRenderer;
52
- _series = [];
53
- _drawings = [];
54
- _plugins = [];
55
- _resizeObserver;
56
- _initPromise;
57
- _ready = false;
58
- _interaction;
59
- constructor(container, options = {}) {
60
- this._container = container;
61
- this._container.style.position = 'relative';
62
- this._container.style.overflow = 'hidden';
63
- this._options = this._resolveOptions(options);
64
- this._colors = this._resolveColors(this._options.theme, this._options.colors);
65
- const { width, height } = container.getBoundingClientRect();
66
- // ── Scales & transform ────────────────────────────────────────────────────
67
- // TimeScale and PriceScale need a CanvasLayer for their Canvas 2D render()
68
- // pass; for PixiChart that pass is never called — Pixi renderers own all
69
- // drawing. A hidden dummy canvas satisfies the constructor requirement.
70
- const dpr = window.devicePixelRatio ?? 1;
71
- const dummyLayer = new CanvasLayer(container, { width, height, dpr, zIndex: 0 });
72
- dummyLayer.canvas.style.display = 'none';
73
- this._timeScale = new TimeScale(dummyLayer, this._colors, this._options.timeScale);
74
- this._priceScale = new PriceScale(dummyLayer, this._colors, this._options.priceScale);
75
- this._transform = new CoordTransform(this._timeScale, this._priceScale, this._priceScale.width, this._timeScale.height);
76
- this._transform.update(width, height);
77
- // ── PixiJS Application ────────────────────────────────────────────────────
78
- this._app = new Application();
79
- this._stage = this._app.stage;
80
- this._initPromise = this._app.init({
81
- width,
82
- height,
83
- backgroundColor: parseInt(this._colors.background.replace('#', ''), 16),
84
- antialias: true,
85
- resolution: dpr,
86
- autoDensity: true,
87
- }).then(() => {
88
- const canvas = this._app.canvas;
89
- canvas.style.position = 'absolute';
90
- canvas.style.inset = '0';
91
- container.appendChild(canvas);
92
- // ── Layers ──────────────────────────────────────────────────────────────
93
- this._layers.dirty.markAll();
94
- this._ready = true;
95
- // Attach PixiJS ticker for per-frame selective redraw
96
- this._app.ticker.add(() => this._renderFrame());
97
- });
98
- // Layer manager + renderers (can be constructed before init resolves)
99
- this._layers = new PixiLayerManager(this._stage);
100
- this._gridRenderer = new PixiGridRenderer(this._layers.get(LayerName.Background), this._colors, this._timeScale);
101
- this._candleRenderer = new PixiCandlestickRenderer(this._layers.get(LayerName.PriceSeries));
102
- this._crosshairRenderer = new PixiCrosshairRenderer(this._layers.get(LayerName.Interaction), this._colors);
103
- this._drawingRenderer = new PixiDrawingRenderer(this._layers.get(LayerName.Drawing));
104
- // ── Interactions ─────────────────────────────────────────────────────────
105
- this._interaction = new InteractionManager(this._container, this._transform, {
106
- onPan: (dx, dy) => {
107
- this._transform.pan(dx, dy);
108
- this._markViewportDirty();
109
- },
110
- onZoom: (factor, originX) => {
111
- this._transform.zoomTime(factor, originX);
112
- this._markViewportDirty();
113
- },
114
- onCrosshairMove: (x, y) => {
115
- this._crosshairRenderer.update(x, y);
116
- this._layers.dirty.mark(LayerName.Interaction);
117
- },
118
- onCrosshairHide: () => {
119
- this._crosshairRenderer.hide();
120
- this._layers.dirty.mark(LayerName.Interaction);
121
- },
122
- onKeyAction: (action) => {
123
- this._handleKeyAction(action);
124
- },
125
- }, {
126
- enablePan: this._options.handleScroll,
127
- enableZoom: this._options.handleScale,
128
- });
129
- this._resizeObserver = new ResizeObserver(() => this._onResize());
130
- this._resizeObserver.observe(container);
131
- }
132
- // ─── IChart implementation ────────────────────────────────────────────────
133
- addSeries(options) {
134
- const series = new Series(options, this._colors);
135
- // When the caller mutates data, mark the series + background layers dirty
136
- // so the next ticker frame redraws only those layers (selective redraw).
137
- series.onDataChanged = () => {
138
- this._layers.dirty.mark(LayerName.PriceSeries);
139
- this._layers.dirty.mark(LayerName.Background); // price range may change
140
- };
141
- this._series.push(series);
142
- this._layers.dirty.mark(LayerName.PriceSeries);
143
- return series;
144
- }
145
- removeSeries(series) {
146
- this._series = this._series.filter((s) => s !== series);
147
- this._layers.dirty.mark(LayerName.PriceSeries);
148
- }
149
- addPlugin(plugin) {
150
- this._plugins.push(plugin);
151
- plugin.onAttach(this);
152
- }
153
- removePlugin(plugin) {
154
- this._plugins = this._plugins.filter((p) => p !== plugin);
155
- plugin.onDetach();
156
- }
157
- applyOptions(options) {
158
- Object.assign(this._options, options);
159
- if (options.theme) {
160
- // Mutate the existing colors object in-place so all renderers that hold
161
- // a reference to it (PixiGridRenderer, PixiCrosshairRenderer, etc.) pick
162
- // up the new values without needing a reference swap.
163
- Object.assign(this._colors, this._resolveColors(options.theme, this._options.colors));
164
- // Also update the PixiJS renderer's own background color.
165
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
166
- this._app.renderer.background.color = parseInt(this._colors.background.replace('#', ''), 16);
167
- }
168
- if (options.timezone !== undefined) {
169
- this._crosshairRenderer.timezone = options.timezone ?? 'UTC';
170
- }
171
- this._layers.dirty.markAll();
172
- }
173
- setInterval(tf) {
174
- this._crosshairRenderer.interval = tf;
175
- this._layers.dirty.mark(LayerName.Interaction);
176
- }
177
- resize(width, height) {
178
- this._app.renderer.resize(width, height);
179
- this._transform.update(width, height);
180
- this._markViewportDirty();
181
- }
182
- transform() {
183
- return this._transform;
184
- }
185
- destroy() {
186
- this._resizeObserver.disconnect();
187
- this._interaction.destroy();
188
- this._layers.destroy();
189
- this._plugins.forEach((p) => p.onDetach());
190
- this._series = [];
191
- this._plugins = [];
192
- void this._app.destroy(true, { children: true });
193
- }
194
- // ─── Drawing objects (used by PixiChart directly; TChart uses DrawingManager) ─
195
- /** @internal Used by PixiChart when DrawingManager pushes an update. */
196
- setDrawings(drawings) {
197
- this._drawings = [...drawings];
198
- this._layers.dirty.mark(LayerName.Drawing);
199
- }
200
- // ─── Rendering ───────────────────────────────────────────────────────────────
201
- _renderFrame() {
202
- if (!this._ready)
203
- return;
204
- const t = this._transform;
205
- const cw = t.canvasWidth;
206
- const ch = t.canvasHeight;
207
- const dirty = this._layers.dirty;
208
- // ── Price series first so auto-fit updates the price range ───────────────
209
- // This must run before Background so the grid can reflect the new range
210
- // within the same frame.
211
- if (dirty.isDirty(LayerName.PriceSeries)) {
212
- // Auto-fit price range to visible data, then mark background dirty so
213
- // the grid redraws with the updated price range in this same frame.
214
- this._autoFitPriceRange();
215
- dirty.mark(LayerName.Background);
216
- // Renderers own their Graphics object; calling gfx.clear() internally.
217
- // Do NOT call _layers.clear(PriceSeries) — that would detach the gfx.
218
- for (const series of this._series) {
219
- const opts = series.options();
220
- if (opts.visible === false)
221
- continue;
222
- const bars = this._getVisibleBars(series);
223
- if (bars.length === 0)
224
- continue;
225
- if (opts.type === 'heikinashi') {
226
- this._candleRenderer.drawHeikinAshi(bars, t);
227
- }
228
- else {
229
- this._candleRenderer.draw(bars, t);
230
- }
231
- }
232
- dirty.clear(LayerName.PriceSeries);
233
- }
234
- // ── Background + grid (axes, labels) ─────────────────────────────────────
235
- if (dirty.isDirty(LayerName.Background)) {
236
- this._gridRenderer.draw(t, cw, ch);
237
- dirty.clear(LayerName.Background);
238
- }
239
- // ── Indicator — placeholder ───────────────────────────────────────────────
240
- if (dirty.isDirty(LayerName.Indicator)) {
241
- dirty.clear(LayerName.Indicator);
242
- }
243
- // ── Drawings ──────────────────────────────────────────────────────────────
244
- if (dirty.isDirty(LayerName.Drawing)) {
245
- this._drawingRenderer.draw(this._drawings, t);
246
- dirty.clear(LayerName.Drawing);
247
- }
248
- // ── Trading overlay — placeholder ─────────────────────────────────────────
249
- if (dirty.isDirty(LayerName.TradingOverlay)) {
250
- dirty.clear(LayerName.TradingOverlay);
251
- }
252
- // ── Crosshair (Interaction layer) ─────────────────────────────────────────
253
- if (dirty.isDirty(LayerName.Interaction)) {
254
- this._crosshairRenderer.draw(t);
255
- dirty.clear(LayerName.Interaction);
256
- }
257
- // ── UI overlay — placeholder ──────────────────────────────────────────────
258
- if (dirty.isDirty(LayerName.UIOverlay)) {
259
- dirty.clear(LayerName.UIOverlay);
260
- }
261
- // Let plugins render
262
- this._plugins.forEach((p) => p.onRender());
263
- }
264
- // ─── Helpers ─────────────────────────────────────────────────────────────────
265
- _getVisibleBars(series) {
266
- const { from, to } = this._transform.timeRange;
267
- return series.data().filter((b) => b.time >= from - 1 && b.time <= to + 1);
268
- }
269
- _autoFitPriceRange() {
270
- let low = Infinity, high = -Infinity;
271
- for (const series of this._series) {
272
- for (const bar of this._getVisibleBars(series)) {
273
- if (bar.low < low)
274
- low = bar.low;
275
- if (bar.high > high)
276
- high = bar.high;
277
- }
278
- }
279
- if (low === Infinity || high === -Infinity)
280
- return;
281
- const padding = (high - low) * 0.05;
282
- this._priceScale.setVisibleRange({ min: low - padding, max: high + padding });
283
- // Background must redraw so price-axis labels reflect the new range.
284
- // Caller is responsible for marking Background dirty after calling this.
285
- }
286
- _markViewportDirty() {
287
- this._layers.dirty.mark(LayerName.Background);
288
- this._layers.dirty.mark(LayerName.PriceSeries);
289
- this._layers.dirty.mark(LayerName.Indicator);
290
- this._layers.dirty.mark(LayerName.Drawing);
291
- this._layers.dirty.mark(LayerName.TradingOverlay);
292
- this._layers.dirty.mark(LayerName.Interaction);
293
- this._layers.dirty.mark(LayerName.UIOverlay);
294
- }
295
- _onResize() {
296
- const { width, height } = this._container.getBoundingClientRect();
297
- this.resize(width, height);
298
- }
299
- // ─── Keyboard action handler ──────────────────────────────────────────────────
300
- _handleKeyAction(action) {
301
- const step = 40; // px per arrow-key press
302
- const zf = 1.1; // zoom factor per key press
303
- const cx = this._transform.plotWidth / 2;
304
- switch (action) {
305
- case 'panLeft':
306
- this._transform.pan(step, 0);
307
- break;
308
- case 'panRight':
309
- this._transform.pan(-step, 0);
310
- break;
311
- case 'panUp':
312
- this._transform.pan(0, step);
313
- break;
314
- case 'panDown':
315
- this._transform.pan(0, -step);
316
- break;
317
- case 'zoomIn':
318
- this._transform.zoomTime(1 / zf, cx);
319
- break;
320
- case 'zoomOut':
321
- this._transform.zoomTime(zf, cx);
322
- break;
323
- case 'scrollToEnd':
324
- this._scrollToLatestBar();
325
- break;
326
- case 'deselect':
327
- this._interaction.clearSelection();
328
- break;
329
- case 'scrollToStart':
330
- case 'deleteSelection': break; // handled externally
331
- }
332
- this._markViewportDirty();
333
- }
334
- /** Pans the viewport so the latest bar sits near the right edge. */
335
- _scrollToLatestBar() {
336
- let latestTime = -Infinity;
337
- for (const s of this._series) {
338
- const data = s.data();
339
- const last = data[data.length - 1];
340
- if (last && last.time > latestTime)
341
- latestTime = last.time;
342
- }
343
- if (!isFinite(latestTime))
344
- return;
345
- const pad = this._transform.plotWidth * 0.05;
346
- const px = this._transform.timeToX(latestTime);
347
- this._transform.pan(-(px - (this._transform.plotWidth - pad)), 0);
348
- }
349
- // ─── Option resolvers ────────────────────────────────────────────────────────
350
- _resolveOptions(opts) {
351
- return {
352
- theme: opts.theme ?? 'dark',
353
- colors: opts.colors ?? {},
354
- timeScale: opts.timeScale ?? {},
355
- priceScale: opts.priceScale ?? {},
356
- crosshair: opts.crosshair ?? {},
357
- handleScroll: opts.handleScroll ?? true,
358
- handleScale: opts.handleScale ?? true,
359
- timezone: opts.timezone ?? 'UTC',
360
- };
361
- }
362
- _resolveColors(theme, overrides) {
363
- const base = theme === 'dark' ? DARK_COLORS : LIGHT_COLORS;
364
- return { ...base, ...overrides };
365
- }
366
- }
367
- //# sourceMappingURL=PixiChart.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PixiChart.js","sourceRoot":"","sources":["../../src/pixi/PixiChart.ts"],"names":[],"mappings":"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"}
@@ -1,110 +0,0 @@
1
- import { Graphics, Text, TextStyle } from 'pixi.js';
2
- /**
3
- * PixiCrosshairRenderer — draws the interactive crosshair lines and their
4
- * data-accurate price / time labels using GPU-batched PixiJS Graphics.
5
- *
6
- * Owned by the Interaction layer; receives pixel coords from mouse events
7
- * and converts them to data values via `CoordTransform`.
8
- */
9
- export class PixiCrosshairRenderer {
10
- _colors;
11
- _gfx;
12
- _priceLabel;
13
- _timeLabel;
14
- _x = null;
15
- _y = null;
16
- /** Active timeframe — controls whether time is shown alongside the date. */
17
- interval = '1h';
18
- /** IANA timezone for the time label. Falls back to UTC. */
19
- timezone = 'UTC';
20
- constructor(layer, _colors) {
21
- this._colors = _colors;
22
- const labelStyle = new TextStyle({
23
- fontSize: 11,
24
- fontFamily: 'system-ui, sans-serif',
25
- fill: _colors.background,
26
- });
27
- this._gfx = new Graphics();
28
- this._priceLabel = new Text({ text: '', style: labelStyle });
29
- this._timeLabel = new Text({ text: '', style: labelStyle });
30
- layer.addChild(this._gfx, this._priceLabel, this._timeLabel);
31
- }
32
- update(x, y) {
33
- this._x = x;
34
- this._y = y;
35
- }
36
- hide() {
37
- this._x = null;
38
- this._y = null;
39
- }
40
- draw(transform) {
41
- this._gfx.clear();
42
- this._priceLabel.text = '';
43
- this._timeLabel.text = '';
44
- if (this._x === null || this._y === null)
45
- return;
46
- const x = this._x;
47
- const y = this._y;
48
- const pw = transform.plotWidth;
49
- const ph = transform.plotHeight;
50
- const psw = transform.priceScaleWidth;
51
- const tsh = transform.timeScaleHeight;
52
- if (!transform.inPlotArea(x, y))
53
- return;
54
- const crossColor = parseInt(this._colors.crosshair.replace('#', ''), 16);
55
- // Vertical line
56
- this._gfx
57
- .moveTo(x, 0)
58
- .lineTo(x, ph)
59
- .stroke({ color: crossColor, width: 1, alpha: 0.85, join: 'miter' });
60
- // Horizontal line
61
- this._gfx
62
- .moveTo(0, y)
63
- .lineTo(pw, y)
64
- .stroke({ color: crossColor, width: 1, alpha: 0.85, join: 'miter' });
65
- // ── Price label (right axis) ─────────────────────────────────────────────
66
- const price = transform.yToPrice(y);
67
- const priceText = this._formatPrice(price);
68
- const lh = 18;
69
- const lw = psw;
70
- this._gfx
71
- .rect(pw, y - lh / 2, lw, lh)
72
- .fill({ color: crossColor, alpha: 0.9 });
73
- this._priceLabel.text = priceText;
74
- this._priceLabel.x = pw + 4;
75
- this._priceLabel.y = y - this._priceLabel.height / 2;
76
- // ── Time label (bottom axis) ─────────────────────────────────────────────
77
- const time = transform.xToTime(x);
78
- const timeText = this._formatTime(time);
79
- const dailyIntervals = new Set(['1d', '2d', '3d', '1w', '2w', '1M', '3M', '6M', '12M']);
80
- const tlw = dailyIntervals.has(this.interval) ? 120 : 170;
81
- const tlh = tsh - 4;
82
- const tlx = Math.max(tlw / 2, Math.min(x, pw - tlw / 2));
83
- this._gfx
84
- .rect(tlx - tlw / 2, ph + 2, tlw, tlh)
85
- .fill({ color: crossColor, alpha: 0.9 });
86
- this._timeLabel.text = timeText;
87
- this._timeLabel.x = tlx - this._timeLabel.width / 2;
88
- this._timeLabel.y = ph + 2 + (tlh - this._timeLabel.height) / 2;
89
- }
90
- _formatPrice(price) {
91
- const decimals = price < 1 ? 6 : price < 1000 ? 4 : 2;
92
- return price.toFixed(decimals);
93
- }
94
- _formatTime(time) {
95
- const timeZone = (!this.timezone || this.timezone === 'exchange') ? 'UTC' : this.timezone;
96
- const d = new Date(time * 1000);
97
- const weekday = d.toLocaleDateString('en-US', { weekday: 'short', timeZone });
98
- const day = d.toLocaleDateString('en-US', { day: '2-digit', timeZone });
99
- const month = d.toLocaleDateString('en-US', { month: 'short', timeZone });
100
- const year = d.toLocaleDateString('en-US', { year: '2-digit', timeZone });
101
- const datePart = `${weekday} ${day} ${month} '${year}`;
102
- const dailyIntervals = new Set(['1d', '2d', '3d', '1w', '2w', '1M', '3M', '6M', '12M']);
103
- if (dailyIntervals.has(this.interval))
104
- return datePart;
105
- const hh = d.toLocaleString('en-US', { hour: '2-digit', hour12: false, timeZone });
106
- const mm = d.toLocaleString('en-US', { minute: '2-digit', timeZone }).padStart(2, '0');
107
- return `${datePart} ${hh}:${mm}`;
108
- }
109
- }
110
- //# sourceMappingURL=PixiCrosshairRenderer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PixiCrosshairRenderer.js","sourceRoot":"","sources":["../../src/pixi/PixiCrosshairRenderer.ts"],"names":[],"mappings":"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"}
@@ -1,111 +0,0 @@
1
- import { Graphics } from 'pixi.js';
2
- const DEFAULT_COLOR = 0x888888;
3
- const DEFAULT_WIDTH = 1;
4
- const FIB_RATIOS = [0, 0.236, 0.382, 0.5, 0.618, 0.786, 1];
5
- /**
6
- * PixiDrawingRenderer — renders all drawing objects via GPU-batched Graphics.
7
- *
8
- * All `DrawingPoint` (time, price) → pixel conversions go through
9
- * `CoordTransform`, keeping drawings perfectly aligned with the price series
10
- * across zoom/pan without requiring a full re-fetch of underlying data.
11
- */
12
- export class PixiDrawingRenderer {
13
- _gfx;
14
- constructor(layer) {
15
- this._gfx = new Graphics();
16
- layer.addChild(this._gfx);
17
- }
18
- draw(drawings, transform) {
19
- this._gfx.clear();
20
- for (const d of drawings) {
21
- if (d.visible === false)
22
- continue;
23
- this._drawOne(d, transform);
24
- }
25
- }
26
- _drawOne(d, t) {
27
- const gfx = this._gfx;
28
- const color = d.color ? parseInt(d.color.replace('#', ''), 16) : DEFAULT_COLOR;
29
- const width = d.lineWidth ?? DEFAULT_WIDTH;
30
- const stroke = { color, width };
31
- const { points, type } = d;
32
- switch (type) {
33
- case 'trendline': {
34
- if (points.length < 2)
35
- break;
36
- const p0 = t.toPixel(points[0].time, points[0].price);
37
- const p1 = t.toPixel(points[1].time, points[1].price);
38
- gfx.moveTo(p0.x, p0.y).lineTo(p1.x, p1.y).stroke(stroke);
39
- break;
40
- }
41
- case 'horizontal': {
42
- if (points.length < 1)
43
- break;
44
- const y = t.priceToY(points[0].price);
45
- gfx.moveTo(0, y).lineTo(t.plotWidth, y).stroke(stroke);
46
- break;
47
- }
48
- case 'vertical': {
49
- if (points.length < 1)
50
- break;
51
- const x = t.timeToX(points[0].time);
52
- gfx.moveTo(x, 0).lineTo(x, t.plotHeight).stroke(stroke);
53
- break;
54
- }
55
- case 'rectangle': {
56
- if (points.length < 2)
57
- break;
58
- const p0 = t.toPixel(points[0].time, points[0].price);
59
- const p1 = t.toPixel(points[1].time, points[1].price);
60
- gfx
61
- .rect(Math.min(p0.x, p1.x), Math.min(p0.y, p1.y), Math.abs(p1.x - p0.x), Math.abs(p1.y - p0.y))
62
- .stroke(stroke);
63
- break;
64
- }
65
- case 'fibRetracement': {
66
- if (points.length < 2)
67
- break;
68
- const priceHigh = Math.max(points[0].price, points[1].price);
69
- const priceLow = Math.min(points[0].price, points[1].price);
70
- const span = priceHigh - priceLow;
71
- const x0 = Math.min(t.timeToX(points[0].time), t.timeToX(points[1].time));
72
- const x1 = Math.max(t.timeToX(points[0].time), t.timeToX(points[1].time));
73
- for (const ratio of FIB_RATIOS) {
74
- const levelPrice = priceLow + span * (1 - ratio);
75
- const y = t.priceToY(levelPrice);
76
- gfx.moveTo(x0, y).lineTo(x1, y).stroke({ color, width, alpha: 0.7 });
77
- }
78
- break;
79
- }
80
- // ray: rendered as a segment from p0 through p1 to the plot boundary
81
- case 'ray': {
82
- if (points.length < 2)
83
- break;
84
- const x0 = t.timeToX(points[0].time);
85
- const y0 = t.priceToY(points[0].price);
86
- const dx = t.timeToX(points[1].time) - x0;
87
- const dy = t.priceToY(points[1].price) - y0;
88
- let tMin = Infinity;
89
- if (dx > 0)
90
- tMin = Math.min(tMin, (t.plotWidth - x0) / dx);
91
- else if (dx < 0)
92
- tMin = Math.min(tMin, -x0 / dx);
93
- if (dy > 0)
94
- tMin = Math.min(tMin, (t.plotHeight - y0) / dy);
95
- else if (dy < 0)
96
- tMin = Math.min(tMin, -y0 / dy);
97
- const ex = tMin === Infinity ? x0 : x0 + dx * tMin;
98
- const ey = tMin === Infinity ? y0 : y0 + dy * tMin;
99
- gfx.moveTo(x0, y0).lineTo(ex, ey).stroke(stroke);
100
- break;
101
- }
102
- // text: PixiJS does not handle text labels — skip silently
103
- case 'text':
104
- break;
105
- default:
106
- // Fib/Gann tools and future drawing types are rendered by the canvas layer, not Pixi.
107
- break;
108
- }
109
- }
110
- }
111
- //# sourceMappingURL=PixiDrawingRenderer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PixiDrawingRenderer.js","sourceRoot":"","sources":["../../src/pixi/PixiDrawingRenderer.ts"],"names":[],"mappings":"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"}