@forgecharts/sdk 1.1.27 → 1.1.28

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 (581) hide show
  1. package/dist/__tests__/backwardCompatibility.test.d.ts +14 -0
  2. package/dist/__tests__/backwardCompatibility.test.d.ts.map +1 -0
  3. package/dist/__tests__/backwardCompatibility.test.js +159 -0
  4. package/dist/__tests__/backwardCompatibility.test.js.map +1 -0
  5. package/dist/__tests__/candleInvariant.test.d.ts +20 -0
  6. package/dist/__tests__/candleInvariant.test.d.ts.map +1 -0
  7. package/dist/__tests__/candleInvariant.test.js +415 -0
  8. package/dist/__tests__/candleInvariant.test.js.map +1 -0
  9. package/dist/__tests__/public-api-surface.d.ts +13 -0
  10. package/dist/__tests__/public-api-surface.d.ts.map +1 -0
  11. package/{src/__tests__/public-api-surface.ts → dist/__tests__/public-api-surface.js} +4 -42
  12. package/dist/__tests__/public-api-surface.js.map +1 -0
  13. package/dist/__tests__/timeframeBoundary.test.d.ts +17 -0
  14. package/dist/__tests__/timeframeBoundary.test.d.ts.map +1 -0
  15. package/dist/__tests__/timeframeBoundary.test.js +452 -0
  16. package/dist/__tests__/timeframeBoundary.test.js.map +1 -0
  17. package/dist/api/DrawingManager.d.ts +20 -0
  18. package/dist/api/DrawingManager.d.ts.map +1 -0
  19. package/dist/api/DrawingManager.js +190 -0
  20. package/dist/api/DrawingManager.js.map +1 -0
  21. package/dist/api/EventBus.d.ts +19 -0
  22. package/dist/api/EventBus.d.ts.map +1 -0
  23. package/dist/api/EventBus.js +44 -0
  24. package/dist/api/EventBus.js.map +1 -0
  25. package/dist/api/IndicatorDAG.d.ts +85 -0
  26. package/dist/api/IndicatorDAG.d.ts.map +1 -0
  27. package/dist/api/IndicatorDAG.js +316 -0
  28. package/dist/api/IndicatorDAG.js.map +1 -0
  29. package/dist/api/IndicatorRegistry.d.ts +22 -0
  30. package/dist/api/IndicatorRegistry.d.ts.map +1 -0
  31. package/dist/api/IndicatorRegistry.js +39 -0
  32. package/dist/api/IndicatorRegistry.js.map +1 -0
  33. package/dist/api/LayoutManager.d.ts +30 -0
  34. package/dist/api/LayoutManager.d.ts.map +1 -0
  35. package/dist/api/LayoutManager.js +51 -0
  36. package/dist/api/LayoutManager.js.map +1 -0
  37. package/dist/api/PaneManager.d.ts +42 -0
  38. package/dist/api/PaneManager.d.ts.map +1 -0
  39. package/dist/api/PaneManager.js +119 -0
  40. package/dist/api/PaneManager.js.map +1 -0
  41. package/dist/api/ReferenceAPI.d.ts +78 -0
  42. package/dist/api/ReferenceAPI.d.ts.map +1 -0
  43. package/dist/api/ReferenceAPI.js +153 -0
  44. package/dist/api/ReferenceAPI.js.map +1 -0
  45. package/dist/api/TChart.d.ts +345 -0
  46. package/dist/api/TChart.d.ts.map +1 -0
  47. package/dist/api/TChart.js +765 -0
  48. package/dist/api/TChart.js.map +1 -0
  49. package/{src/api/createChart.ts → dist/api/createChart.d.ts} +2 -7
  50. package/dist/api/createChart.d.ts.map +1 -0
  51. package/dist/api/createChart.js +42 -0
  52. package/dist/api/createChart.js.map +1 -0
  53. package/dist/api/drawing tools/fib gann menu/fibRetracement.d.ts +4 -0
  54. package/dist/api/drawing tools/fib gann menu/fibRetracement.d.ts.map +1 -0
  55. package/dist/api/drawing tools/fib gann menu/fibRetracement.js +22 -0
  56. package/dist/api/drawing tools/fib gann menu/fibRetracement.js.map +1 -0
  57. package/dist/api/drawing tools/lines menu/crossLine.d.ts +4 -0
  58. package/dist/api/drawing tools/lines menu/crossLine.d.ts.map +1 -0
  59. package/dist/api/drawing tools/lines menu/crossLine.js +16 -0
  60. package/dist/api/drawing tools/lines menu/crossLine.js.map +1 -0
  61. package/dist/api/drawing tools/lines menu/disjointChannel.d.ts +17 -0
  62. package/dist/api/drawing tools/lines menu/disjointChannel.d.ts.map +1 -0
  63. package/dist/api/drawing tools/lines menu/disjointChannel.js +59 -0
  64. package/dist/api/drawing tools/lines menu/disjointChannel.js.map +1 -0
  65. package/dist/api/drawing tools/lines menu/extendedLine.d.ts +4 -0
  66. package/dist/api/drawing tools/lines menu/extendedLine.d.ts.map +1 -0
  67. package/dist/api/drawing tools/lines menu/extendedLine.js +17 -0
  68. package/dist/api/drawing tools/lines menu/extendedLine.js.map +1 -0
  69. package/dist/api/drawing tools/lines menu/flatTopBottom.d.ts +4 -0
  70. package/dist/api/drawing tools/lines menu/flatTopBottom.d.ts.map +1 -0
  71. package/dist/api/drawing tools/lines menu/flatTopBottom.js +41 -0
  72. package/dist/api/drawing tools/lines menu/flatTopBottom.js.map +1 -0
  73. package/dist/api/drawing tools/lines menu/horizontal.d.ts +4 -0
  74. package/dist/api/drawing tools/lines menu/horizontal.d.ts.map +1 -0
  75. package/dist/api/drawing tools/lines menu/horizontal.js +19 -0
  76. package/dist/api/drawing tools/lines menu/horizontal.js.map +1 -0
  77. package/dist/api/drawing tools/lines menu/horizontalRay.d.ts +4 -0
  78. package/dist/api/drawing tools/lines menu/horizontalRay.d.ts.map +1 -0
  79. package/dist/api/drawing tools/lines menu/horizontalRay.js +20 -0
  80. package/dist/api/drawing tools/lines menu/horizontalRay.js.map +1 -0
  81. package/dist/api/drawing tools/lines menu/infoLine.d.ts +4 -0
  82. package/dist/api/drawing tools/lines menu/infoLine.d.ts.map +1 -0
  83. package/dist/api/drawing tools/lines menu/infoLine.js +107 -0
  84. package/dist/api/drawing tools/lines menu/infoLine.js.map +1 -0
  85. package/dist/api/drawing tools/lines menu/insidePitchfork.d.ts +4 -0
  86. package/dist/api/drawing tools/lines menu/insidePitchfork.d.ts.map +1 -0
  87. package/dist/api/drawing tools/lines menu/insidePitchfork.js +31 -0
  88. package/dist/api/drawing tools/lines menu/insidePitchfork.js.map +1 -0
  89. package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.d.ts +4 -0
  90. package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.d.ts.map +1 -0
  91. package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.js +15 -0
  92. package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.js.map +1 -0
  93. package/dist/api/drawing tools/lines menu/parallelChannel.d.ts +4 -0
  94. package/dist/api/drawing tools/lines menu/parallelChannel.d.ts.map +1 -0
  95. package/dist/api/drawing tools/lines menu/parallelChannel.js +43 -0
  96. package/dist/api/drawing tools/lines menu/parallelChannel.js.map +1 -0
  97. package/dist/api/drawing tools/lines menu/pitchfork.d.ts +4 -0
  98. package/dist/api/drawing tools/lines menu/pitchfork.d.ts.map +1 -0
  99. package/dist/api/drawing tools/lines menu/pitchfork.js +12 -0
  100. package/dist/api/drawing tools/lines menu/pitchfork.js.map +1 -0
  101. package/dist/api/drawing tools/lines menu/ray.d.ts +4 -0
  102. package/dist/api/drawing tools/lines menu/ray.d.ts.map +1 -0
  103. package/dist/api/drawing tools/lines menu/ray.js +23 -0
  104. package/dist/api/drawing tools/lines menu/ray.js.map +1 -0
  105. package/dist/api/drawing tools/lines menu/regressionTrend.d.ts +4 -0
  106. package/dist/api/drawing tools/lines menu/regressionTrend.d.ts.map +1 -0
  107. package/dist/api/drawing tools/lines menu/regressionTrend.js +127 -0
  108. package/dist/api/drawing tools/lines menu/regressionTrend.js.map +1 -0
  109. package/dist/api/drawing tools/lines menu/schiffPitchfork.d.ts +4 -0
  110. package/dist/api/drawing tools/lines menu/schiffPitchfork.d.ts.map +1 -0
  111. package/dist/api/drawing tools/lines menu/schiffPitchfork.js +15 -0
  112. package/dist/api/drawing tools/lines menu/schiffPitchfork.js.map +1 -0
  113. package/dist/api/drawing tools/lines menu/trendAngle.d.ts +4 -0
  114. package/dist/api/drawing tools/lines menu/trendAngle.d.ts.map +1 -0
  115. package/dist/api/drawing tools/lines menu/trendAngle.js +51 -0
  116. package/dist/api/drawing tools/lines menu/trendAngle.js.map +1 -0
  117. package/dist/api/drawing tools/lines menu/trendline.d.ts +4 -0
  118. package/dist/api/drawing tools/lines menu/trendline.d.ts.map +1 -0
  119. package/dist/api/drawing tools/lines menu/trendline.js +11 -0
  120. package/dist/api/drawing tools/lines menu/trendline.js.map +1 -0
  121. package/dist/api/drawing tools/lines menu/vertical.d.ts +4 -0
  122. package/dist/api/drawing tools/lines menu/vertical.d.ts.map +1 -0
  123. package/dist/api/drawing tools/lines menu/vertical.js +11 -0
  124. package/dist/api/drawing tools/lines menu/vertical.js.map +1 -0
  125. package/dist/api/drawing tools/pointers menu/crosshair.d.ts +16 -0
  126. package/dist/api/drawing tools/pointers menu/crosshair.d.ts.map +1 -0
  127. package/{src/api/drawing tools/pointers menu/crosshair.ts → dist/api/drawing tools/pointers menu/crosshair.js } +6 -7
  128. package/dist/api/drawing tools/pointers menu/crosshair.js.map +1 -0
  129. package/dist/api/drawing tools/pointers menu/cursor.d.ts +15 -0
  130. package/dist/api/drawing tools/pointers menu/cursor.d.ts.map +1 -0
  131. package/{src/api/drawing tools/pointers menu/cursor.ts → dist/api/drawing tools/pointers menu/cursor.js } +7 -8
  132. package/dist/api/drawing tools/pointers menu/cursor.js.map +1 -0
  133. package/dist/api/drawing tools/pointers menu/demonstration.d.ts +30 -0
  134. package/dist/api/drawing tools/pointers menu/demonstration.d.ts.map +1 -0
  135. package/{src/api/drawing tools/pointers menu/demonstration.ts → dist/api/drawing tools/pointers menu/demonstration.js } +9 -14
  136. package/dist/api/drawing tools/pointers menu/demonstration.js.map +1 -0
  137. package/dist/api/drawing tools/pointers menu/dot.d.ts +23 -0
  138. package/dist/api/drawing tools/pointers menu/dot.d.ts.map +1 -0
  139. package/{src/api/drawing tools/pointers menu/dot.ts → dist/api/drawing tools/pointers menu/dot.js } +8 -11
  140. package/dist/api/drawing tools/pointers menu/dot.js.map +1 -0
  141. package/dist/api/drawing tools/shapes menu/rectangle.d.ts +4 -0
  142. package/dist/api/drawing tools/shapes menu/rectangle.d.ts.map +1 -0
  143. package/dist/api/drawing tools/shapes menu/rectangle.js +19 -0
  144. package/dist/api/drawing tools/shapes menu/rectangle.js.map +1 -0
  145. package/dist/api/drawing tools/shapes menu/text.d.ts +4 -0
  146. package/dist/api/drawing tools/shapes menu/text.d.ts.map +1 -0
  147. package/dist/api/drawing tools/shapes menu/text.js +25 -0
  148. package/dist/api/drawing tools/shapes menu/text.js.map +1 -0
  149. package/dist/api/drawingUtils.d.ts +22 -0
  150. package/dist/api/drawingUtils.d.ts.map +1 -0
  151. package/dist/api/drawingUtils.js +83 -0
  152. package/dist/api/drawingUtils.js.map +1 -0
  153. package/dist/core/CanvasLayer.d.ts +26 -0
  154. package/dist/core/CanvasLayer.d.ts.map +1 -0
  155. package/dist/core/CanvasLayer.js +56 -0
  156. package/dist/core/CanvasLayer.js.map +1 -0
  157. package/dist/core/Chart.d.ts +164 -0
  158. package/dist/core/Chart.d.ts.map +1 -0
  159. package/dist/core/Chart.js +839 -0
  160. package/dist/core/Chart.js.map +1 -0
  161. package/dist/core/CoordTransform.d.ts +168 -0
  162. package/dist/core/CoordTransform.d.ts.map +1 -0
  163. package/dist/core/CoordTransform.js +224 -0
  164. package/dist/core/CoordTransform.js.map +1 -0
  165. package/dist/core/Crosshair.d.ts +30 -0
  166. package/dist/core/Crosshair.d.ts.map +1 -0
  167. package/dist/core/Crosshair.js +186 -0
  168. package/dist/core/Crosshair.js.map +1 -0
  169. package/dist/core/IndicatorEngine.d.ts +51 -0
  170. package/dist/core/IndicatorEngine.d.ts.map +1 -0
  171. package/dist/core/IndicatorEngine.js +181 -0
  172. package/dist/core/IndicatorEngine.js.map +1 -0
  173. package/dist/core/InteractionManager.d.ts +197 -0
  174. package/dist/core/InteractionManager.d.ts.map +1 -0
  175. package/dist/core/InteractionManager.js +698 -0
  176. package/dist/core/InteractionManager.js.map +1 -0
  177. package/dist/core/PriceScale.d.ts +27 -0
  178. package/dist/core/PriceScale.d.ts.map +1 -0
  179. package/dist/core/PriceScale.js +113 -0
  180. package/dist/core/PriceScale.js.map +1 -0
  181. package/dist/core/Series.d.ts +40 -0
  182. package/dist/core/Series.d.ts.map +1 -0
  183. package/dist/core/Series.js +114 -0
  184. package/dist/core/Series.js.map +1 -0
  185. package/dist/core/TimeScale.d.ts +43 -0
  186. package/dist/core/TimeScale.d.ts.map +1 -0
  187. package/dist/core/TimeScale.js +150 -0
  188. package/dist/core/TimeScale.js.map +1 -0
  189. package/dist/datafeed/DatafeedConnector.d.ts +89 -0
  190. package/dist/datafeed/DatafeedConnector.d.ts.map +1 -0
  191. package/dist/datafeed/DatafeedConnector.js +268 -0
  192. package/dist/datafeed/DatafeedConnector.js.map +1 -0
  193. package/dist/engine/CandleEngine.d.ts +207 -0
  194. package/dist/engine/CandleEngine.d.ts.map +1 -0
  195. package/dist/engine/CandleEngine.js +318 -0
  196. package/dist/engine/CandleEngine.js.map +1 -0
  197. package/dist/engine/__tests__/CandleEngine.test.d.ts +2 -0
  198. package/dist/engine/__tests__/CandleEngine.test.d.ts.map +1 -0
  199. package/dist/engine/__tests__/CandleEngine.test.js +300 -0
  200. package/dist/engine/__tests__/CandleEngine.test.js.map +1 -0
  201. package/dist/engine/candleInvariants.d.ts +66 -0
  202. package/dist/engine/candleInvariants.d.ts.map +1 -0
  203. package/dist/engine/candleInvariants.js +134 -0
  204. package/dist/engine/candleInvariants.js.map +1 -0
  205. package/{src/engine/mergeUtils.ts → dist/engine/mergeUtils.d.ts} +15 -52
  206. package/dist/engine/mergeUtils.d.ts.map +1 -0
  207. package/dist/engine/mergeUtils.js +64 -0
  208. package/dist/engine/mergeUtils.js.map +1 -0
  209. package/dist/engine/timeframeUtils.d.ts +80 -0
  210. package/dist/engine/timeframeUtils.d.ts.map +1 -0
  211. package/{src/engine/timeframeUtils.ts → dist/engine/timeframeUtils.js} +30 -48
  212. package/dist/engine/timeframeUtils.js.map +1 -0
  213. package/dist/index.d.ts +40 -0
  214. package/dist/index.d.ts.map +1 -0
  215. package/dist/index.js +49 -0
  216. package/dist/index.js.map +1 -0
  217. package/dist/internal.d.ts +29 -0
  218. package/dist/internal.d.ts.map +1 -0
  219. package/{src/internal.ts → dist/internal.js} +1 -10
  220. package/dist/internal.js.map +1 -0
  221. package/dist/licensing/ChartRuntimeResolver.d.ts +233 -0
  222. package/dist/licensing/ChartRuntimeResolver.d.ts.map +1 -0
  223. package/dist/licensing/ChartRuntimeResolver.js +310 -0
  224. package/dist/licensing/ChartRuntimeResolver.js.map +1 -0
  225. package/dist/licensing/LicenseManager.d.ts +55 -0
  226. package/dist/licensing/LicenseManager.d.ts.map +1 -0
  227. package/dist/licensing/LicenseManager.js +114 -0
  228. package/dist/licensing/LicenseManager.js.map +1 -0
  229. package/dist/licensing/__tests__/ChartRuntimeResolver.test.d.ts +13 -0
  230. package/dist/licensing/__tests__/ChartRuntimeResolver.test.d.ts.map +1 -0
  231. package/dist/licensing/__tests__/ChartRuntimeResolver.test.js +177 -0
  232. package/dist/licensing/__tests__/ChartRuntimeResolver.test.js.map +1 -0
  233. package/dist/licensing/__tests__/LicenseManager.test.d.ts +12 -0
  234. package/dist/licensing/__tests__/LicenseManager.test.d.ts.map +1 -0
  235. package/dist/licensing/__tests__/LicenseManager.test.js +153 -0
  236. package/dist/licensing/__tests__/LicenseManager.test.js.map +1 -0
  237. package/dist/licensing/licenseTypes.d.ts +18 -0
  238. package/dist/licensing/licenseTypes.d.ts.map +1 -0
  239. package/dist/licensing/licenseTypes.js +2 -0
  240. package/dist/licensing/licenseTypes.js.map +1 -0
  241. package/dist/pine/PineCompiler.d.ts +35 -0
  242. package/dist/pine/PineCompiler.d.ts.map +1 -0
  243. package/dist/pine/PineCompiler.js +44 -0
  244. package/dist/pine/PineCompiler.js.map +1 -0
  245. package/dist/pine/diagnostics.d.ts +20 -0
  246. package/dist/pine/diagnostics.d.ts.map +1 -0
  247. package/dist/pine/diagnostics.js +11 -0
  248. package/dist/pine/diagnostics.js.map +1 -0
  249. package/{src/pine/index.ts → dist/pine/index.d.ts} +4 -3
  250. package/dist/pine/index.d.ts.map +1 -0
  251. package/dist/pine/index.js +5 -0
  252. package/dist/pine/index.js.map +1 -0
  253. package/dist/pine/pine-ast.d.ts +142 -0
  254. package/dist/pine/pine-ast.d.ts.map +1 -0
  255. package/dist/pine/pine-ast.js +19 -0
  256. package/dist/pine/pine-ast.js.map +1 -0
  257. package/dist/pine/pine-lexer.d.ts +41 -0
  258. package/dist/pine/pine-lexer.d.ts.map +1 -0
  259. package/dist/pine/pine-lexer.js +249 -0
  260. package/dist/pine/pine-lexer.js.map +1 -0
  261. package/dist/pine/pine-parser.d.ts +51 -0
  262. package/dist/pine/pine-parser.d.ts.map +1 -0
  263. package/dist/pine/pine-parser.js +416 -0
  264. package/dist/pine/pine-parser.js.map +1 -0
  265. package/dist/pine/pine-transpiler.d.ts +33 -0
  266. package/dist/pine/pine-transpiler.d.ts.map +1 -0
  267. package/dist/pine/pine-transpiler.js +260 -0
  268. package/dist/pine/pine-transpiler.js.map +1 -0
  269. package/dist/pixi/LayerName.d.ts +18 -0
  270. package/dist/pixi/LayerName.d.ts.map +1 -0
  271. package/dist/pixi/LayerName.js +35 -0
  272. package/dist/pixi/LayerName.js.map +1 -0
  273. package/dist/pixi/PixiCandlestickRenderer.d.ts +23 -0
  274. package/dist/pixi/PixiCandlestickRenderer.d.ts.map +1 -0
  275. package/dist/pixi/PixiCandlestickRenderer.js +107 -0
  276. package/dist/pixi/PixiCandlestickRenderer.js.map +1 -0
  277. package/dist/pixi/PixiChart.d.ts +72 -0
  278. package/dist/pixi/PixiChart.d.ts.map +1 -0
  279. package/dist/pixi/PixiChart.js +367 -0
  280. package/dist/pixi/PixiChart.js.map +1 -0
  281. package/dist/pixi/PixiCrosshairRenderer.d.ts +29 -0
  282. package/dist/pixi/PixiCrosshairRenderer.d.ts.map +1 -0
  283. package/dist/pixi/PixiCrosshairRenderer.js +110 -0
  284. package/dist/pixi/PixiCrosshairRenderer.js.map +1 -0
  285. package/dist/pixi/PixiDrawingRenderer.d.ts +17 -0
  286. package/dist/pixi/PixiDrawingRenderer.d.ts.map +1 -0
  287. package/dist/pixi/PixiDrawingRenderer.js +111 -0
  288. package/dist/pixi/PixiDrawingRenderer.js.map +1 -0
  289. package/dist/pixi/PixiGridRenderer.d.ts +22 -0
  290. package/dist/pixi/PixiGridRenderer.d.ts.map +1 -0
  291. package/dist/pixi/PixiGridRenderer.js +114 -0
  292. package/dist/pixi/PixiGridRenderer.js.map +1 -0
  293. package/dist/pixi/PixiLayerManager.d.ts +56 -0
  294. package/dist/pixi/PixiLayerManager.d.ts.map +1 -0
  295. package/dist/pixi/PixiLayerManager.js +92 -0
  296. package/dist/pixi/PixiLayerManager.js.map +1 -0
  297. package/dist/react/canvas/ChartCanvas.d.ts +85 -0
  298. package/dist/react/canvas/ChartCanvas.d.ts.map +1 -0
  299. package/dist/react/canvas/ChartCanvas.js +604 -0
  300. package/dist/react/canvas/ChartCanvas.js.map +1 -0
  301. package/dist/react/canvas/ChartContextMenu.d.ts +18 -0
  302. package/dist/react/canvas/ChartContextMenu.d.ts.map +1 -0
  303. package/dist/react/canvas/ChartContextMenu.js +5 -0
  304. package/dist/react/canvas/ChartContextMenu.js.map +1 -0
  305. package/dist/react/canvas/ChartSettingsDialog.d.ts +25 -0
  306. package/dist/react/canvas/ChartSettingsDialog.d.ts.map +1 -0
  307. package/dist/react/canvas/ChartSettingsDialog.js +28 -0
  308. package/dist/react/canvas/ChartSettingsDialog.js.map +1 -0
  309. package/dist/react/canvas/IndicatorLabel.d.ts +21 -0
  310. package/dist/react/canvas/IndicatorLabel.d.ts.map +1 -0
  311. package/dist/react/canvas/IndicatorLabel.js +196 -0
  312. package/dist/react/canvas/IndicatorLabel.js.map +1 -0
  313. package/dist/react/canvas/IndicatorPane.d.ts +32 -0
  314. package/dist/react/canvas/IndicatorPane.d.ts.map +1 -0
  315. package/dist/react/canvas/IndicatorPane.js +395 -0
  316. package/dist/react/canvas/IndicatorPane.js.map +1 -0
  317. package/dist/react/canvas/PointerOverlay.d.ts +23 -0
  318. package/dist/react/canvas/PointerOverlay.d.ts.map +1 -0
  319. package/dist/react/canvas/PointerOverlay.js +61 -0
  320. package/dist/react/canvas/PointerOverlay.js.map +1 -0
  321. package/dist/react/canvas/toolbars/LeftToolbar.d.ts +19 -0
  322. package/dist/react/canvas/toolbars/LeftToolbar.d.ts.map +1 -0
  323. package/dist/react/canvas/toolbars/LeftToolbar.js +407 -0
  324. package/dist/react/canvas/toolbars/LeftToolbar.js.map +1 -0
  325. package/dist/react/hooks/useChartCapabilities.d.ts +21 -0
  326. package/dist/react/hooks/useChartCapabilities.d.ts.map +1 -0
  327. package/dist/react/hooks/useChartCapabilities.js +66 -0
  328. package/dist/react/hooks/useChartCapabilities.js.map +1 -0
  329. package/dist/react/index.d.ts +30 -0
  330. package/dist/react/index.d.ts.map +1 -0
  331. package/{src/react/index.ts → dist/react/index.js} +1 -24
  332. package/dist/react/index.js.map +1 -0
  333. package/dist/react/internal.d.ts +38 -0
  334. package/dist/react/internal.d.ts.map +1 -0
  335. package/{src/react/internal.ts → dist/react/internal.js} +1 -19
  336. package/dist/react/internal.js.map +1 -0
  337. package/dist/react/shell/ManagedAppShell.d.ts +91 -0
  338. package/dist/react/shell/ManagedAppShell.d.ts.map +1 -0
  339. package/dist/react/shell/ManagedAppShell.js +440 -0
  340. package/dist/react/shell/ManagedAppShell.js.map +1 -0
  341. package/dist/react/trading/TradingBridge.d.ts +86 -0
  342. package/dist/react/trading/TradingBridge.d.ts.map +1 -0
  343. package/dist/react/trading/TradingBridge.js +73 -0
  344. package/dist/react/trading/TradingBridge.js.map +1 -0
  345. package/dist/react/workspace/ChartWorkspace.d.ts +73 -0
  346. package/dist/react/workspace/ChartWorkspace.d.ts.map +1 -0
  347. package/dist/react/workspace/ChartWorkspace.js +42 -0
  348. package/dist/react/workspace/ChartWorkspace.js.map +1 -0
  349. package/dist/react/workspace/FloatingPanel.d.ts +18 -0
  350. package/dist/react/workspace/FloatingPanel.d.ts.map +1 -0
  351. package/dist/react/workspace/FloatingPanel.js +82 -0
  352. package/dist/react/workspace/FloatingPanel.js.map +1 -0
  353. package/dist/react/workspace/IndicatorsDialog.d.ts +8 -0
  354. package/dist/react/workspace/IndicatorsDialog.d.ts.map +1 -0
  355. package/dist/react/workspace/IndicatorsDialog.js +121 -0
  356. package/dist/react/workspace/IndicatorsDialog.js.map +1 -0
  357. package/dist/react/workspace/LayoutMenu.d.ts +33 -0
  358. package/dist/react/workspace/LayoutMenu.d.ts.map +1 -0
  359. package/dist/react/workspace/LayoutMenu.js +113 -0
  360. package/dist/react/workspace/LayoutMenu.js.map +1 -0
  361. package/dist/react/workspace/SymbolSearchDialog.d.ts +10 -0
  362. package/dist/react/workspace/SymbolSearchDialog.d.ts.map +1 -0
  363. package/dist/react/workspace/SymbolSearchDialog.js +245 -0
  364. package/dist/react/workspace/SymbolSearchDialog.js.map +1 -0
  365. package/dist/react/workspace/TabBar.d.ts +17 -0
  366. package/dist/react/workspace/TabBar.d.ts.map +1 -0
  367. package/dist/react/workspace/TabBar.js +29 -0
  368. package/dist/react/workspace/TabBar.js.map +1 -0
  369. package/dist/react/workspace/toolbars/BottomToolbar.d.ts +19 -0
  370. package/dist/react/workspace/toolbars/BottomToolbar.d.ts.map +1 -0
  371. package/dist/react/workspace/toolbars/BottomToolbar.js +236 -0
  372. package/dist/react/workspace/toolbars/BottomToolbar.js.map +1 -0
  373. package/dist/react/workspace/toolbars/RightToolbar.d.ts +8 -0
  374. package/dist/react/workspace/toolbars/RightToolbar.d.ts.map +1 -0
  375. package/dist/react/workspace/toolbars/RightToolbar.js +18 -0
  376. package/dist/react/workspace/toolbars/RightToolbar.js.map +1 -0
  377. package/dist/react/workspace/toolbars/TopToolbar.d.ts +41 -0
  378. package/dist/react/workspace/toolbars/TopToolbar.d.ts.map +1 -0
  379. package/dist/react/workspace/toolbars/TopToolbar.js +82 -0
  380. package/dist/react/workspace/toolbars/TopToolbar.js.map +1 -0
  381. package/dist/renderers/CandlestickRenderer.d.ts +13 -0
  382. package/dist/renderers/CandlestickRenderer.d.ts.map +1 -0
  383. package/dist/renderers/CandlestickRenderer.js +98 -0
  384. package/dist/renderers/CandlestickRenderer.js.map +1 -0
  385. package/dist/renderers/HistogramRenderer.d.ts +11 -0
  386. package/dist/renderers/HistogramRenderer.d.ts.map +1 -0
  387. package/dist/renderers/HistogramRenderer.js +50 -0
  388. package/dist/renderers/HistogramRenderer.js.map +1 -0
  389. package/dist/renderers/LineRenderer.d.ts +12 -0
  390. package/dist/renderers/LineRenderer.d.ts.map +1 -0
  391. package/dist/renderers/LineRenderer.js +64 -0
  392. package/dist/renderers/LineRenderer.js.map +1 -0
  393. package/dist/theme/colors.d.ts +4 -0
  394. package/dist/theme/colors.d.ts.map +1 -0
  395. package/dist/theme/colors.js +19 -0
  396. package/dist/theme/colors.js.map +1 -0
  397. package/dist/tools/barDivergenceCheck.d.ts +120 -0
  398. package/dist/tools/barDivergenceCheck.d.ts.map +1 -0
  399. package/dist/tools/barDivergenceCheck.js +200 -0
  400. package/dist/tools/barDivergenceCheck.js.map +1 -0
  401. package/dist/trading/TradingOverlayStore.d.ts +86 -0
  402. package/dist/trading/TradingOverlayStore.d.ts.map +1 -0
  403. package/dist/trading/TradingOverlayStore.js +139 -0
  404. package/dist/trading/TradingOverlayStore.js.map +1 -0
  405. package/dist/trading/UnmanagedIngestion.d.ts +91 -0
  406. package/dist/trading/UnmanagedIngestion.d.ts.map +1 -0
  407. package/dist/trading/UnmanagedIngestion.js +114 -0
  408. package/dist/trading/UnmanagedIngestion.js.map +1 -0
  409. package/dist/trading/__tests__/ManagedTradingController.test.d.ts +18 -0
  410. package/dist/trading/__tests__/ManagedTradingController.test.d.ts.map +1 -0
  411. package/dist/trading/__tests__/ManagedTradingController.test.js +271 -0
  412. package/dist/trading/__tests__/ManagedTradingController.test.js.map +1 -0
  413. package/dist/trading/__tests__/TradingOverlayStore.test.d.ts +16 -0
  414. package/dist/trading/__tests__/TradingOverlayStore.test.d.ts.map +1 -0
  415. package/dist/trading/__tests__/TradingOverlayStore.test.js +267 -0
  416. package/dist/trading/__tests__/TradingOverlayStore.test.js.map +1 -0
  417. package/dist/trading/__tests__/UnmanagedIngestion.test.d.ts +16 -0
  418. package/dist/trading/__tests__/UnmanagedIngestion.test.d.ts.map +1 -0
  419. package/dist/trading/__tests__/UnmanagedIngestion.test.js +170 -0
  420. package/dist/trading/__tests__/UnmanagedIngestion.test.js.map +1 -0
  421. package/dist/trading/managed/ManagedTradingController.d.ts +110 -0
  422. package/dist/trading/managed/ManagedTradingController.d.ts.map +1 -0
  423. package/dist/trading/managed/ManagedTradingController.js +247 -0
  424. package/dist/trading/managed/ManagedTradingController.js.map +1 -0
  425. package/dist/trading/managed/managedCapabilities.d.ts +45 -0
  426. package/dist/trading/managed/managedCapabilities.d.ts.map +1 -0
  427. package/dist/trading/managed/managedCapabilities.js +79 -0
  428. package/dist/trading/managed/managedCapabilities.js.map +1 -0
  429. package/dist/trading/managed/managedTypes.d.ts +122 -0
  430. package/dist/trading/managed/managedTypes.d.ts.map +1 -0
  431. package/dist/trading/managed/managedTypes.js +13 -0
  432. package/dist/trading/managed/managedTypes.js.map +1 -0
  433. package/dist/trading/tradingTypes.d.ts +89 -0
  434. package/dist/trading/tradingTypes.d.ts.map +1 -0
  435. package/dist/trading/tradingTypes.js +8 -0
  436. package/dist/trading/tradingTypes.js.map +1 -0
  437. package/dist/tscript/TScriptIndicator.d.ts +41 -0
  438. package/dist/tscript/TScriptIndicator.d.ts.map +1 -0
  439. package/dist/tscript/TScriptIndicator.js +47 -0
  440. package/dist/tscript/TScriptIndicator.js.map +1 -0
  441. package/dist/tscript/ast.d.ts +89 -0
  442. package/dist/tscript/ast.d.ts.map +1 -0
  443. package/dist/tscript/ast.js +22 -0
  444. package/dist/tscript/ast.js.map +1 -0
  445. package/dist/tscript/lexer.d.ts +36 -0
  446. package/dist/tscript/lexer.d.ts.map +1 -0
  447. package/dist/tscript/lexer.js +187 -0
  448. package/dist/tscript/lexer.js.map +1 -0
  449. package/dist/tscript/parser.d.ts +50 -0
  450. package/dist/tscript/parser.d.ts.map +1 -0
  451. package/dist/tscript/parser.js +318 -0
  452. package/dist/tscript/parser.js.map +1 -0
  453. package/dist/tscript/runtime.d.ts +123 -0
  454. package/dist/tscript/runtime.d.ts.map +1 -0
  455. package/dist/tscript/runtime.js +475 -0
  456. package/dist/tscript/runtime.js.map +1 -0
  457. package/dist/tscript/series.d.ts +49 -0
  458. package/dist/tscript/series.d.ts.map +1 -0
  459. package/dist/tscript/series.js +79 -0
  460. package/dist/tscript/series.js.map +1 -0
  461. package/dist/types/IChart.d.ts +48 -0
  462. package/dist/types/IChart.d.ts.map +1 -0
  463. package/dist/types/IChart.js +2 -0
  464. package/dist/types/IChart.js.map +1 -0
  465. package/{src/types/IRenderer.ts → dist/types/IRenderer.d.ts} +2 -8
  466. package/dist/types/IRenderer.d.ts.map +1 -0
  467. package/dist/types/IRenderer.js +2 -0
  468. package/dist/types/IRenderer.js.map +1 -0
  469. package/dist/types/ISeries.d.ts +26 -0
  470. package/dist/types/ISeries.d.ts.map +1 -0
  471. package/dist/types/ISeries.js +2 -0
  472. package/dist/types/ISeries.js.map +1 -0
  473. package/package.json +5 -1
  474. package/src/__tests__/backwardCompatibility.test.ts +0 -191
  475. package/src/__tests__/candleInvariant.test.ts +0 -500
  476. package/src/__tests__/timeframeBoundary.test.ts +0 -583
  477. package/src/api/DrawingManager.ts +0 -188
  478. package/src/api/EventBus.ts +0 -53
  479. package/src/api/IndicatorDAG.ts +0 -389
  480. package/src/api/IndicatorRegistry.ts +0 -47
  481. package/src/api/LayoutManager.ts +0 -72
  482. package/src/api/PaneManager.ts +0 -129
  483. package/src/api/ReferenceAPI.ts +0 -195
  484. package/src/api/TChart.ts +0 -881
  485. package/src/api/drawing tools/fib gann menu/fibRetracement.ts +0 -27
  486. package/src/api/drawing tools/lines menu/crossLine.ts +0 -21
  487. package/src/api/drawing tools/lines menu/disjointChannel.ts +0 -74
  488. package/src/api/drawing tools/lines menu/extendedLine.ts +0 -22
  489. package/src/api/drawing tools/lines menu/flatTopBottom.ts +0 -45
  490. package/src/api/drawing tools/lines menu/horizontal.ts +0 -24
  491. package/src/api/drawing tools/lines menu/horizontalRay.ts +0 -25
  492. package/src/api/drawing tools/lines menu/infoLine.ts +0 -127
  493. package/src/api/drawing tools/lines menu/insidePitchfork.ts +0 -21
  494. package/src/api/drawing tools/lines menu/modifiedSchiffPitchfork.ts +0 -18
  495. package/src/api/drawing tools/lines menu/parallelChannel.ts +0 -47
  496. package/src/api/drawing tools/lines menu/pitchfork.ts +0 -15
  497. package/src/api/drawing tools/lines menu/ray.ts +0 -28
  498. package/src/api/drawing tools/lines menu/regressionTrend.ts +0 -157
  499. package/src/api/drawing tools/lines menu/schiffPitchfork.ts +0 -18
  500. package/src/api/drawing tools/lines menu/trendAngle.ts +0 -64
  501. package/src/api/drawing tools/lines menu/trendline.ts +0 -16
  502. package/src/api/drawing tools/lines menu/vertical.ts +0 -16
  503. package/src/api/drawing tools/shapes menu/rectangle.ts +0 -24
  504. package/src/api/drawing tools/shapes menu/text.ts +0 -30
  505. package/src/api/drawingUtils.ts +0 -82
  506. package/src/core/CanvasLayer.ts +0 -77
  507. package/src/core/Chart.ts +0 -917
  508. package/src/core/CoordTransform.ts +0 -282
  509. package/src/core/Crosshair.ts +0 -207
  510. package/src/core/IndicatorEngine.ts +0 -216
  511. package/src/core/InteractionManager.ts +0 -899
  512. package/src/core/PriceScale.ts +0 -133
  513. package/src/core/Series.ts +0 -132
  514. package/src/core/TimeScale.ts +0 -175
  515. package/src/datafeed/DatafeedConnector.ts +0 -300
  516. package/src/engine/CandleEngine.ts +0 -458
  517. package/src/engine/__tests__/CandleEngine.test.ts +0 -402
  518. package/src/engine/candleInvariants.ts +0 -172
  519. package/src/index.ts +0 -190
  520. package/src/licensing/ChartRuntimeResolver.ts +0 -380
  521. package/src/licensing/LicenseManager.ts +0 -131
  522. package/src/licensing/__tests__/ChartRuntimeResolver.test.ts +0 -207
  523. package/src/licensing/__tests__/LicenseManager.test.ts +0 -180
  524. package/src/licensing/licenseTypes.ts +0 -19
  525. package/src/pine/PineCompiler.ts +0 -68
  526. package/src/pine/diagnostics.ts +0 -30
  527. package/src/pine/pine-ast.ts +0 -163
  528. package/src/pine/pine-lexer.ts +0 -265
  529. package/src/pine/pine-parser.ts +0 -439
  530. package/src/pine/pine-transpiler.ts +0 -301
  531. package/src/pixi/LayerName.ts +0 -35
  532. package/src/pixi/PixiCandlestickRenderer.ts +0 -125
  533. package/src/pixi/PixiChart.ts +0 -425
  534. package/src/pixi/PixiCrosshairRenderer.ts +0 -134
  535. package/src/pixi/PixiDrawingRenderer.ts +0 -121
  536. package/src/pixi/PixiGridRenderer.ts +0 -136
  537. package/src/pixi/PixiLayerManager.ts +0 -102
  538. package/src/react/canvas/ChartCanvas.tsx +0 -984
  539. package/src/react/canvas/ChartContextMenu.tsx +0 -60
  540. package/src/react/canvas/ChartSettingsDialog.tsx +0 -133
  541. package/src/react/canvas/IndicatorLabel.tsx +0 -347
  542. package/src/react/canvas/IndicatorPane.tsx +0 -503
  543. package/src/react/canvas/PointerOverlay.tsx +0 -126
  544. package/src/react/canvas/toolbars/LeftToolbar.tsx +0 -1096
  545. package/src/react/hooks/useChartCapabilities.ts +0 -76
  546. package/src/react/shell/ManagedAppShell.tsx +0 -699
  547. package/src/react/trading/TradingBridge.ts +0 -156
  548. package/src/react/workspace/ChartWorkspace.tsx +0 -228
  549. package/src/react/workspace/FloatingPanel.tsx +0 -131
  550. package/src/react/workspace/IndicatorsDialog.tsx +0 -246
  551. package/src/react/workspace/LayoutMenu.tsx +0 -345
  552. package/src/react/workspace/SymbolSearchDialog.tsx +0 -377
  553. package/src/react/workspace/TabBar.tsx +0 -87
  554. package/src/react/workspace/toolbars/BottomToolbar.tsx +0 -372
  555. package/src/react/workspace/toolbars/RightToolbar.tsx +0 -46
  556. package/src/react/workspace/toolbars/TopToolbar.tsx +0 -431
  557. package/src/renderers/CandlestickRenderer.ts +0 -130
  558. package/src/renderers/HistogramRenderer.ts +0 -63
  559. package/src/renderers/LineRenderer.ts +0 -77
  560. package/src/theme/colors.ts +0 -21
  561. package/src/tools/barDivergenceCheck.ts +0 -305
  562. package/src/trading/TradingOverlayStore.ts +0 -161
  563. package/src/trading/UnmanagedIngestion.ts +0 -156
  564. package/src/trading/__tests__/ManagedTradingController.test.ts +0 -338
  565. package/src/trading/__tests__/TradingOverlayStore.test.ts +0 -323
  566. package/src/trading/__tests__/UnmanagedIngestion.test.ts +0 -205
  567. package/src/trading/managed/ManagedTradingController.ts +0 -292
  568. package/src/trading/managed/managedCapabilities.ts +0 -98
  569. package/src/trading/managed/managedTypes.ts +0 -151
  570. package/src/trading/tradingTypes.ts +0 -135
  571. package/src/tscript/TScriptIndicator.ts +0 -54
  572. package/src/tscript/ast.ts +0 -105
  573. package/src/tscript/lexer.ts +0 -190
  574. package/src/tscript/parser.ts +0 -334
  575. package/src/tscript/runtime.ts +0 -525
  576. package/src/tscript/series.ts +0 -84
  577. package/src/types/IChart.ts +0 -56
  578. package/src/types/ISeries.ts +0 -30
  579. package/tsconfig.json +0 -23
  580. package/tsup.config.ts +0 -16
  581. package/vitest.config.ts +0 -25
@@ -0,0 +1,10 @@
1
+ import type { ISymbolResolver } from '@forgecharts/types';
2
+ type Props = {
3
+ current: string;
4
+ onSelect: (symbol: string) => void;
5
+ onClose: () => void;
6
+ symbolResolver: ISymbolResolver;
7
+ };
8
+ export declare function SymbolSearchDialog({ current, onSelect, onClose, symbolResolver }: Props): import("react/jsx-runtime").JSX.Element;
9
+ export {};
10
+ //# sourceMappingURL=SymbolSearchDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SymbolSearchDialog.d.ts","sourceRoot":"","sources":["../../../src/react/workspace/SymbolSearchDialog.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAa,eAAe,EAAsB,MAAM,oBAAoB,CAAC;AAmEzF,KAAK,KAAK,GAAG;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,cAAc,EAAE,eAAe,CAAC;CACjC,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,KAAK,2CA6SvF"}
@@ -0,0 +1,245 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useEffect, useRef, useCallback } from 'react';
3
+ const PAGE_SIZE = 100;
4
+ const TABS = [
5
+ { label: 'All', market: '' },
6
+ { label: 'Stocks', market: 'stocks' },
7
+ { label: 'Funds', market: 'etfs' },
8
+ { label: 'Futures', market: 'futures' },
9
+ { label: 'Forex', market: 'forex' },
10
+ { label: 'Crypto', market: 'crypto' },
11
+ { label: 'Indices', market: 'indices' },
12
+ { label: 'Bonds', market: 'bonds' },
13
+ { label: 'Economy', market: 'economy' },
14
+ { label: 'Options', market: 'options' },
15
+ ];
16
+ function refSymbolsToEntries(symbols) {
17
+ return symbols.map(s => ({
18
+ symbol: s.symbol,
19
+ name: s.displayName,
20
+ symbolKey: s.symbolKey,
21
+ exchange: s.exchange,
22
+ assetType: s.assetType,
23
+ market: s.market,
24
+ ...(s.logoUrl ? { logoUrl: s.logoUrl } : {}),
25
+ }));
26
+ }
27
+ function stringColor(str) {
28
+ const palette = [
29
+ '#f7931a', '#627eea', '#2775ca', '#26a17b', '#e84142',
30
+ '#00adef', '#e91e63', '#9945ff', '#00d4aa', '#ff6b35',
31
+ ];
32
+ let h = 0;
33
+ for (let i = 0; i < str.length; i++)
34
+ h = (Math.imul(31, h) + str.charCodeAt(i)) | 0;
35
+ return palette[Math.abs(h) % palette.length] ?? '#888888';
36
+ }
37
+ function badgeLabel(assetType, market) {
38
+ const a = assetType?.toLowerCase() ?? '';
39
+ const m = market?.toLowerCase() ?? '';
40
+ if (a && m && a !== m)
41
+ return `${a} ${m}`;
42
+ return a || m || '';
43
+ }
44
+ function SymbolIcon({ logoUrl, letter, color }) {
45
+ const [failed, setFailed] = useState(false);
46
+ return (_jsx("span", { className: "sym-row-icon", style: { background: (logoUrl && !failed) ? 'transparent' : color }, children: logoUrl && !failed
47
+ ? _jsx("img", { src: logoUrl, alt: "", className: "sym-logo-img", onError: () => setFailed(true) })
48
+ : letter }));
49
+ }
50
+ export function SymbolSearchDialog({ current, onSelect, onClose, symbolResolver }) {
51
+ const [query, setQuery] = useState('');
52
+ const [activeTab, setActiveTab] = useState(0);
53
+ const [tabSymbols, setTabSymbols] = useState([]);
54
+ const [tabLoading, setTabLoading] = useState(false);
55
+ const [tabLoadingMore, setTabLoadingMore] = useState(false);
56
+ const [tabOffset, setTabOffset] = useState(0);
57
+ const [tabHasMore, setTabHasMore] = useState(false);
58
+ const [searchResults, setSearchResults] = useState(null);
59
+ const [isSearching, setIsSearching] = useState(false);
60
+ const [searchingMore, setSearchingMore] = useState(false);
61
+ const [searchOffset, setSearchOffset] = useState(0);
62
+ const [searchHasMore, setSearchHasMore] = useState(false);
63
+ const inputRef = useRef(null);
64
+ const dialogRef = useRef(null);
65
+ const sentinelRef = useRef(null);
66
+ const searchTimer = useRef(null);
67
+ const queryRef = useRef(query);
68
+ const activeTabRef = useRef(activeTab);
69
+ queryRef.current = query;
70
+ activeTabRef.current = activeTab;
71
+ useEffect(() => { inputRef.current?.focus(); }, []);
72
+ useEffect(() => {
73
+ const h = (e) => { if (e.key === 'Escape')
74
+ onClose(); };
75
+ window.addEventListener('keydown', h);
76
+ return () => window.removeEventListener('keydown', h);
77
+ }, [onClose]);
78
+ // Tab browse: use getSymbols() for all tabs — supports offset pagination.
79
+ useEffect(() => {
80
+ const market = TABS[activeTab]?.market ?? '';
81
+ let cancelled = false;
82
+ setTabLoading(true);
83
+ setTabSymbols([]);
84
+ setTabOffset(0);
85
+ setTabHasMore(false);
86
+ symbolResolver.getSymbols({ ...(market ? { market } : {}), limit: PAGE_SIZE, offset: 0 })
87
+ .then((r) => {
88
+ if (!cancelled) {
89
+ setTabSymbols(refSymbolsToEntries(r.symbols));
90
+ setTabHasMore(r.symbols.length === PAGE_SIZE);
91
+ setTabOffset(PAGE_SIZE);
92
+ }
93
+ })
94
+ .catch(() => { })
95
+ .finally(() => { if (!cancelled)
96
+ setTabLoading(false); });
97
+ return () => { cancelled = true; };
98
+ }, [activeTab]);
99
+ const loadMoreTab = useCallback(async () => {
100
+ if (tabLoadingMore || !tabHasMore)
101
+ return;
102
+ const market = TABS[activeTabRef.current]?.market ?? '';
103
+ setTabLoadingMore(true);
104
+ try {
105
+ const r = await symbolResolver.getSymbols({ ...(market ? { market } : {}), limit: PAGE_SIZE, offset: tabOffset });
106
+ setTabSymbols(prev => [...prev, ...refSymbolsToEntries(r.symbols)]);
107
+ setTabHasMore(r.symbols.length === PAGE_SIZE);
108
+ setTabOffset(prev => prev + PAGE_SIZE);
109
+ }
110
+ catch { /* ignore */ }
111
+ finally {
112
+ setTabLoadingMore(false);
113
+ }
114
+ }, [tabLoadingMore, tabHasMore, tabOffset]);
115
+ const loadMoreSearch = useCallback(async () => {
116
+ if (searchingMore || !searchHasMore)
117
+ return;
118
+ const q = queryRef.current.trim();
119
+ if (!q)
120
+ return;
121
+ const market = TABS[activeTabRef.current]?.market;
122
+ setSearchingMore(true);
123
+ try {
124
+ const res = await symbolResolver.searchSymbols(q, {
125
+ limit: PAGE_SIZE, offset: searchOffset,
126
+ ...(market ? { market } : {}),
127
+ });
128
+ setSearchResults(prev => prev ? [...prev, ...refSymbolsToEntries(res.symbols)] : refSymbolsToEntries(res.symbols));
129
+ setSearchHasMore(res.symbols.length === PAGE_SIZE);
130
+ setSearchOffset(prev => prev + PAGE_SIZE);
131
+ }
132
+ catch { /* ignore */ }
133
+ finally {
134
+ setSearchingMore(false);
135
+ }
136
+ }, [searchingMore, searchHasMore, searchOffset]);
137
+ // Stable refs so the IntersectionObserver callback always calls the latest version
138
+ const loadMoreTabRef = useRef(loadMoreTab);
139
+ const loadMoreSearchRef = useRef(loadMoreSearch);
140
+ loadMoreTabRef.current = loadMoreTab;
141
+ loadMoreSearchRef.current = loadMoreSearch;
142
+ // Sentinel IntersectionObserver — fires loadMore when the bottom of the list enters view
143
+ useEffect(() => {
144
+ const sentinel = sentinelRef.current;
145
+ if (!sentinel)
146
+ return;
147
+ const observer = new IntersectionObserver(entries => {
148
+ if (entries[0]?.isIntersecting) {
149
+ if (queryRef.current.trim()) {
150
+ void loadMoreSearchRef.current();
151
+ }
152
+ else {
153
+ void loadMoreTabRef.current();
154
+ }
155
+ }
156
+ }, { threshold: 0.1 });
157
+ observer.observe(sentinel);
158
+ return () => observer.disconnect();
159
+ }, []); // eslint-disable-line react-hooks/exhaustive-deps
160
+ const doSearch = useCallback((q, tab) => {
161
+ if (searchTimer.current)
162
+ clearTimeout(searchTimer.current);
163
+ if (!q.trim()) {
164
+ setSearchResults(null);
165
+ setSearchOffset(0);
166
+ setSearchHasMore(false);
167
+ return;
168
+ }
169
+ setIsSearching(true);
170
+ searchTimer.current = setTimeout(async () => {
171
+ try {
172
+ const market = TABS[tab]?.market;
173
+ const res = await symbolResolver.searchSymbols(q.trim(), {
174
+ limit: PAGE_SIZE, offset: 0,
175
+ ...(market ? { market } : {}),
176
+ });
177
+ setSearchResults(refSymbolsToEntries(res.symbols));
178
+ setSearchHasMore(res.symbols.length === PAGE_SIZE);
179
+ setSearchOffset(PAGE_SIZE);
180
+ }
181
+ catch {
182
+ setSearchResults([]);
183
+ setSearchHasMore(false);
184
+ }
185
+ finally {
186
+ setIsSearching(false);
187
+ }
188
+ }, 180);
189
+ }, []);
190
+ const handleQueryChange = (value) => {
191
+ setQuery(value);
192
+ doSearch(value, activeTab);
193
+ };
194
+ const handleTabChange = (i) => {
195
+ setActiveTab(i);
196
+ if (queryRef.current.trim())
197
+ doSearch(queryRef.current, i);
198
+ };
199
+ const handleBackdrop = (e) => {
200
+ if (dialogRef.current && !dialogRef.current.contains(e.target))
201
+ onClose();
202
+ };
203
+ const isSearch = query.trim().length > 0;
204
+ const displayList = isSearch ? (searchResults ?? []) : tabSymbols;
205
+ // Use exchange:symbol format (strip market prefix from symbolKey) so the
206
+ // datafeed can pass it directly to the TV API, e.g. "BINANCE:BTCUSDT"
207
+ const toFeedSymbol = (entry) => {
208
+ if (!entry.symbolKey)
209
+ return entry.symbol;
210
+ const parts = entry.symbolKey.split(':');
211
+ // symbolKey is MARKET:EXCHANGE:SYMBOL → we want EXCHANGE:SYMBOL
212
+ return parts.length >= 3 ? parts.slice(1).join(':') : entry.symbolKey;
213
+ };
214
+ const pick = (entry) => { onSelect(toFeedSymbol(entry)); onClose(); };
215
+ const renderRow = (entry) => {
216
+ const iconColor = stringColor(entry.symbol);
217
+ const exchColor = stringColor(entry.exchange);
218
+ const letter = entry.symbol.charAt(0).toUpperCase();
219
+ const exchAbbr = entry.exchange.slice(0, 2).toUpperCase();
220
+ const badge = badgeLabel(entry.assetType, entry.market);
221
+ return (_jsxs("button", { className: `sym-row${entry.symbol === current ? ' active' : ''}`, onClick: () => pick(entry), children: [_jsx(SymbolIcon, { letter: letter, color: iconColor, ...(entry.logoUrl ? { logoUrl: entry.logoUrl } : {}) }), _jsxs("span", { className: "sym-row-info", children: [_jsx("span", { className: "sym-row-ticker", children: entry.symbol }), _jsx("span", { className: "sym-row-name", children: entry.name })] }), badge && _jsx("span", { className: "sym-row-badge", children: badge }), _jsx("span", { className: "sym-row-exchange", children: entry.exchange }), _jsx("span", { className: "sym-row-exch-icon", style: { background: exchColor }, children: exchAbbr })] }, entry.symbolKey ?? `${entry.exchange}:${entry.symbol}`));
222
+ };
223
+ const renderDirectRow = () => {
224
+ const q = query.trim();
225
+ if (!q)
226
+ return null;
227
+ return (_jsxs("button", { className: "sym-row", onClick: () => { onSelect(q.toUpperCase()); onClose(); }, style: { borderTop: '1px solid var(--sym-border, rgba(255,255,255,.08))', marginTop: 4 }, children: [_jsx("span", { className: "sym-row-icon", style: { background: '#444', fontSize: 11, fontWeight: 700 }, children: "\u2192" }), _jsxs("span", { className: "sym-row-info", children: [_jsx("span", { className: "sym-row-ticker", children: q.toUpperCase() }), _jsx("span", { className: "sym-row-name", children: "Use this symbol directly" })] })] }));
228
+ };
229
+ const renderBody = () => {
230
+ if (isSearch && isSearching)
231
+ return _jsx("div", { className: "sym-list", children: renderDirectRow() });
232
+ if (isSearch && searchResults !== null && searchResults.length === 0)
233
+ return _jsx("div", { className: "sym-list", children: renderDirectRow() });
234
+ if (!isSearch && tabLoading)
235
+ return _jsx("div", { className: "sym-empty", children: "Loading..." });
236
+ if (displayList.length === 0 && !isSearch && !tabLoading)
237
+ return _jsx("div", { className: "sym-empty", children: "No data \u2014 run a Symbol Sync from the Studio" });
238
+ const loadingMore = isSearch ? searchingMore : tabLoadingMore;
239
+ if (isSearch)
240
+ return (_jsxs("div", { className: "sym-list", children: [displayList.map(renderRow), renderDirectRow(), _jsx("div", { ref: sentinelRef, className: "sym-sentinel" }), loadingMore && _jsx("div", { className: "sym-loading-more", children: "Loading more\u2026" })] }));
241
+ return (_jsxs("div", { className: "sym-list", children: [displayList.map(renderRow), _jsx("div", { ref: sentinelRef, className: "sym-sentinel" }), loadingMore && _jsx("div", { className: "sym-loading-more", children: "Loading more\u2026" })] }));
242
+ };
243
+ return (_jsx("div", { className: "sym-backdrop", onMouseDown: handleBackdrop, children: _jsxs("div", { className: "sym-dialog", ref: dialogRef, role: "dialog", "aria-modal": "true", "aria-label": "Symbol Search", children: [_jsxs("div", { className: "sym-header", children: [_jsx("span", { className: "sym-header-title", children: "Symbol Search" }), _jsx("button", { className: "sym-header-close", onClick: onClose, "aria-label": "Close", children: _jsxs("svg", { viewBox: "0 0 14 14", width: "13", height: "13", stroke: "currentColor", strokeWidth: "2.2", strokeLinecap: "round", fill: "none", children: [_jsx("line", { x1: "2", y1: "2", x2: "12", y2: "12" }), _jsx("line", { x1: "12", y1: "2", x2: "2", y2: "12" })] }) })] }), _jsxs("div", { className: "sym-search-row", children: [_jsxs("svg", { className: "sym-search-icon", viewBox: "0 0 16 16", width: "15", height: "15", stroke: "currentColor", fill: "none", strokeWidth: "1.8", strokeLinecap: "round", children: [_jsx("circle", { cx: "6.5", cy: "6.5", r: "4.5" }), _jsx("line", { x1: "10.5", y1: "10.5", x2: "14", y2: "14" })] }), _jsx("input", { ref: inputRef, className: "sym-search-input", type: "text", value: query, onChange: (e) => handleQueryChange(e.target.value), placeholder: "Search symbols or names...", autoComplete: "off", spellCheck: false }), query && (_jsx("button", { className: "sym-search-clear", onClick: () => { setQuery(''); setSearchResults(null); }, "aria-label": "Clear", children: _jsxs("svg", { viewBox: "0 0 12 12", width: "11", height: "11", stroke: "currentColor", strokeWidth: "2.2", strokeLinecap: "round", fill: "none", children: [_jsx("line", { x1: "2", y1: "2", x2: "10", y2: "10" }), _jsx("line", { x1: "10", y1: "2", x2: "2", y2: "10" })] }) }))] }), _jsx("div", { className: "sym-tabs", children: TABS.map((tab, i) => (_jsx("button", { className: `sym-tab${i === activeTab ? ' active' : ''}`, onClick: () => handleTabChange(i), children: tab.label }, tab.label))) }), _jsx("div", { className: "sym-list-wrap", children: renderBody() }), _jsx("div", { className: "sym-footer", children: "Search using ISIN and CUSIP codes" })] }) }));
244
+ }
245
+ //# sourceMappingURL=SymbolSearchDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SymbolSearchDialog.js","sourceRoot":"","sources":["../../../src/react/workspace/SymbolSearchDialog.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export type TabItem = {
2
+ id: string;
3
+ label: string;
4
+ /** Whether this tab has been saved to the DB (shows a saved indicator). */
5
+ isSaved?: boolean;
6
+ };
7
+ type Props = {
8
+ tabs: TabItem[];
9
+ activeId: string;
10
+ onSelect: (id: string) => void;
11
+ onAdd: () => void;
12
+ onClose: (id: string) => void;
13
+ onRename: (id: string, label: string) => void;
14
+ };
15
+ export declare function TabBar({ tabs, activeId, onSelect, onAdd, onClose, onRename }: Props): import("react/jsx-runtime").JSX.Element;
16
+ export {};
17
+ //# sourceMappingURL=TabBar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabBar.d.ts","sourceRoot":"","sources":["../../../src/react/workspace/TabBar.tsx"],"names":[],"mappings":"AAEA,MAAM,MAAM,OAAO,GAAG;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,KAAK,KAAK,GAAG;IACX,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/C,CAAC;AAEF,wBAAgB,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,KAAK,2CAoEnF"}
@@ -0,0 +1,29 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useRef, useState } from 'react';
3
+ export function TabBar({ tabs, activeId, onSelect, onAdd, onClose, onRename }) {
4
+ const [editingId, setEditingId] = useState(null);
5
+ const [editValue, setEditValue] = useState('');
6
+ const inputRef = useRef(null);
7
+ function startEdit(tab, e) {
8
+ e.stopPropagation();
9
+ setEditingId(tab.id);
10
+ setEditValue(tab.label);
11
+ setTimeout(() => inputRef.current?.select(), 0);
12
+ }
13
+ function commitEdit() {
14
+ if (editingId && editValue.trim()) {
15
+ onRename(editingId, editValue.trim());
16
+ }
17
+ setEditingId(null);
18
+ }
19
+ return (_jsxs("div", { className: "tab-bar", children: [tabs.map((tab) => (_jsxs("div", { className: `tab-item${tab.id === activeId ? ' active' : ''}`, onClick: () => onSelect(tab.id), onDoubleClick: (e) => startEdit(tab, e), title: "Double-click to rename", children: [editingId === tab.id ? (_jsx("input", { ref: inputRef, className: "tab-rename-input", value: editValue, onChange: (e) => setEditValue(e.target.value), onBlur: commitEdit, onKeyDown: (e) => {
20
+ if (e.key === 'Enter')
21
+ commitEdit();
22
+ if (e.key === 'Escape')
23
+ setEditingId(null);
24
+ }, onClick: (e) => e.stopPropagation(), autoFocus: true })) : (_jsxs("span", { className: "tab-label", children: [tab.label, tab.isSaved && _jsx("span", { className: "tab-saved-dot", title: "Saved layout" })] })), tabs.length > 1 && (_jsx("button", { className: "tab-close", title: "Close tab", onClick: (e) => {
25
+ e.stopPropagation();
26
+ onClose(tab.id);
27
+ }, children: "\u00D7" }))] }, tab.id))), _jsx("button", { className: "tab-add", onClick: onAdd, title: "New chart tab", children: "+" })] }));
28
+ }
29
+ //# sourceMappingURL=TabBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabBar.js","sourceRoot":"","sources":["../../../src/react/workspace/TabBar.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export type TimezoneOption = {
2
+ label: string;
3
+ value: string;
4
+ };
5
+ export declare const TIMEZONE_OPTIONS: TimezoneOption[];
6
+ export type TradingSession = 'regular' | 'extended';
7
+ export declare function symbolSupportsSession(symbol: string): boolean;
8
+ type Props = {
9
+ symbol: string;
10
+ timezone: string;
11
+ onTimezoneChange: (tz: string) => void;
12
+ session: TradingSession;
13
+ onSessionChange: (s: TradingSession) => void;
14
+ onToggleScriptDrawer: () => void;
15
+ scriptDrawerOpen: boolean;
16
+ };
17
+ export declare function BottomToolbar({ symbol, timezone, onTimezoneChange, session, onSessionChange, onToggleScriptDrawer, scriptDrawerOpen }: Props): import("react/jsx-runtime").JSX.Element;
18
+ export {};
19
+ //# sourceMappingURL=BottomToolbar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BottomToolbar.d.ts","sourceRoot":"","sources":["../../../../src/react/workspace/toolbars/BottomToolbar.tsx"],"names":[],"mappings":"AAIA,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,cAAc,EAqH5C,CAAC;AAoCF,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,UAAU,CAAC;AAwBpD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAG7D;AAED,KAAK,KAAK,GAAG;IACX,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,OAAO,EAAE,cAAc,CAAC;IACxB,eAAe,EAAE,CAAC,CAAC,EAAE,cAAc,KAAK,IAAI,CAAC;IAC7C,oBAAoB,EAAE,MAAM,IAAI,CAAC;IACjC,gBAAgB,EAAE,OAAO,CAAC;CAC3B,CAAC;AAgCF,wBAAgB,aAAa,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,EAAE,KAAK,2CA4I5I"}
@@ -0,0 +1,236 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useState } from 'react';
3
+ export const TIMEZONE_OPTIONS = [
4
+ { label: 'UTC', value: 'UTC' },
5
+ { label: 'Exchange', value: 'exchange' },
6
+ // Americas
7
+ { label: '(UTC-10) Honolulu', value: 'Pacific/Honolulu' },
8
+ { label: '(UTC-9) Anchorage', value: 'America/Anchorage' },
9
+ { label: '(UTC-9) Juneau', value: 'America/Juneau' },
10
+ { label: '(UTC-8) Los Angeles', value: 'America/Los_Angeles' },
11
+ { label: '(UTC-8) Vancouver', value: 'America/Vancouver' },
12
+ { label: '(UTC-7) Denver', value: 'America/Denver' },
13
+ { label: '(UTC-7) Phoenix', value: 'America/Phoenix' },
14
+ { label: '(UTC-6) Chicago', value: 'America/Chicago' },
15
+ { label: '(UTC-6) Mexico City', value: 'America/Mexico_City' },
16
+ { label: '(UTC-6) San Salvador', value: 'America/El_Salvador' },
17
+ { label: '(UTC-5) Bogota', value: 'America/Bogota' },
18
+ { label: '(UTC-5) Lima', value: 'America/Lima' },
19
+ { label: '(UTC-5) New York', value: 'America/New_York' },
20
+ { label: '(UTC-5) Toronto', value: 'America/Toronto' },
21
+ { label: '(UTC-4) Caracas', value: 'America/Caracas' },
22
+ { label: '(UTC-4) Halifax', value: 'America/Halifax' },
23
+ { label: '(UTC-3) Buenos Aires', value: 'America/Argentina/Buenos_Aires' },
24
+ { label: '(UTC-3) Santiago', value: 'America/Santiago' },
25
+ { label: '(UTC-3) Sao Paulo', value: 'America/Sao_Paulo' },
26
+ { label: '(UTC-2) Mid-Atlantic', value: 'Atlantic/South_Georgia' },
27
+ { label: '(UTC-1) Azores', value: 'Atlantic/Azores' },
28
+ // Europe / Africa (UTC / UTC+0)
29
+ { label: '(UTC) Casablanca', value: 'Africa/Casablanca' },
30
+ { label: '(UTC) Dublin', value: 'Europe/Dublin' },
31
+ { label: '(UTC) Lisbon', value: 'Europe/Lisbon' },
32
+ { label: '(UTC) London', value: 'Europe/London' },
33
+ { label: '(UTC) Reykjavik', value: 'Atlantic/Reykjavik' },
34
+ // UTC+1
35
+ { label: '(UTC+1) Amsterdam', value: 'Europe/Amsterdam' },
36
+ { label: '(UTC+1) Belgrade', value: 'Europe/Belgrade' },
37
+ { label: '(UTC+1) Berlin', value: 'Europe/Berlin' },
38
+ { label: '(UTC+1) Bratislava', value: 'Europe/Bratislava' },
39
+ { label: '(UTC+1) Brussels', value: 'Europe/Brussels' },
40
+ { label: '(UTC+1) Budapest', value: 'Europe/Budapest' },
41
+ { label: '(UTC+1) Copenhagen', value: 'Europe/Copenhagen' },
42
+ { label: '(UTC+1) Lagos', value: 'Africa/Lagos' },
43
+ { label: '(UTC+1) Luxembourg', value: 'Europe/Luxembourg' },
44
+ { label: '(UTC+1) Madrid', value: 'Europe/Madrid' },
45
+ { label: '(UTC+1) Malta', value: 'Europe/Malta' },
46
+ { label: '(UTC+1) Oslo', value: 'Europe/Oslo' },
47
+ { label: '(UTC+1) Paris', value: 'Europe/Paris' },
48
+ { label: '(UTC+1) Prague', value: 'Europe/Prague' },
49
+ { label: '(UTC+1) Rome', value: 'Europe/Rome' },
50
+ { label: '(UTC+1) Sarajevo', value: 'Europe/Sarajevo' },
51
+ { label: '(UTC+1) Stockholm', value: 'Europe/Stockholm' },
52
+ { label: '(UTC+1) Vienna', value: 'Europe/Vienna' },
53
+ { label: '(UTC+1) Warsaw', value: 'Europe/Warsaw' },
54
+ { label: '(UTC+1) Zurich', value: 'Europe/Zurich' },
55
+ // UTC+2
56
+ { label: '(UTC+2) Athens', value: 'Europe/Athens' },
57
+ { label: '(UTC+2) Bucharest', value: 'Europe/Bucharest' },
58
+ { label: '(UTC+2) Cairo', value: 'Africa/Cairo' },
59
+ { label: '(UTC+2) Helsinki', value: 'Europe/Helsinki' },
60
+ { label: '(UTC+2) Istanbul', value: 'Europe/Istanbul' },
61
+ { label: '(UTC+2) Jerusalem', value: 'Asia/Jerusalem' },
62
+ { label: '(UTC+2) Johannesburg', value: 'Africa/Johannesburg' },
63
+ { label: '(UTC+2) Kyiv', value: 'Europe/Kiev' },
64
+ { label: '(UTC+2) Riga', value: 'Europe/Riga' },
65
+ { label: '(UTC+2) Sofia', value: 'Europe/Sofia' },
66
+ { label: '(UTC+2) Tallinn', value: 'Europe/Tallinn' },
67
+ { label: '(UTC+2) Vilnius', value: 'Europe/Vilnius' },
68
+ // UTC+3
69
+ { label: '(UTC+3) Baghdad', value: 'Asia/Baghdad' },
70
+ { label: '(UTC+3) Kuwait', value: 'Asia/Kuwait' },
71
+ { label: '(UTC+3) Moscow', value: 'Europe/Moscow' },
72
+ { label: '(UTC+3) Nairobi', value: 'Africa/Nairobi' },
73
+ { label: '(UTC+3) Qatar', value: 'Asia/Qatar' },
74
+ { label: '(UTC+3) Riyadh', value: 'Asia/Riyadh' },
75
+ // UTC+3:30 / UTC+4
76
+ { label: '(UTC+3:30) Tehran', value: 'Asia/Tehran' },
77
+ { label: '(UTC+4) Abu Dhabi', value: 'Asia/Dubai' },
78
+ { label: '(UTC+4) Baku', value: 'Asia/Baku' },
79
+ { label: '(UTC+4) Dubai', value: 'Asia/Dubai' },
80
+ { label: '(UTC+4) Muscat', value: 'Asia/Muscat' },
81
+ { label: '(UTC+4) Tbilisi', value: 'Asia/Tbilisi' },
82
+ { label: '(UTC+4:30) Kabul', value: 'Asia/Kabul' },
83
+ // UTC+5
84
+ { label: '(UTC+5) Islamabad', value: 'Asia/Karachi' },
85
+ { label: '(UTC+5) Karachi', value: 'Asia/Karachi' },
86
+ { label: '(UTC+5) Tashkent', value: 'Asia/Tashkent' },
87
+ { label: '(UTC+5:30) Chennai', value: 'Asia/Kolkata' },
88
+ { label: '(UTC+5:30) Mumbai', value: 'Asia/Kolkata' },
89
+ { label: '(UTC+5:30) New Delhi', value: 'Asia/Kolkata' },
90
+ { label: '(UTC+5:45) Kathmandu', value: 'Asia/Kathmandu' },
91
+ // UTC+6
92
+ { label: '(UTC+6) Almaty', value: 'Asia/Almaty' },
93
+ { label: '(UTC+6) Dhaka', value: 'Asia/Dhaka' },
94
+ // UTC+7
95
+ { label: '(UTC+7) Bangkok', value: 'Asia/Bangkok' },
96
+ { label: '(UTC+7) Hanoi', value: 'Asia/Ho_Chi_Minh' },
97
+ { label: '(UTC+7) Jakarta', value: 'Asia/Jakarta' },
98
+ // UTC+8
99
+ { label: '(UTC+8) Beijing', value: 'Asia/Shanghai' },
100
+ { label: '(UTC+8) Hong Kong', value: 'Asia/Hong_Kong' },
101
+ { label: '(UTC+8) Kuala Lumpur', value: 'Asia/Kuala_Lumpur' },
102
+ { label: '(UTC+8) Perth', value: 'Australia/Perth' },
103
+ { label: '(UTC+8) Shanghai', value: 'Asia/Shanghai' },
104
+ { label: '(UTC+8) Singapore', value: 'Asia/Singapore' },
105
+ { label: '(UTC+8) Taipei', value: 'Asia/Taipei' },
106
+ // UTC+9
107
+ { label: '(UTC+9) Osaka', value: 'Asia/Tokyo' },
108
+ { label: '(UTC+9) Seoul', value: 'Asia/Seoul' },
109
+ { label: '(UTC+9) Tokyo', value: 'Asia/Tokyo' },
110
+ { label: '(UTC+9:30) Adelaide', value: 'Australia/Adelaide' },
111
+ { label: '(UTC+9:30) Darwin', value: 'Australia/Darwin' },
112
+ // UTC+10
113
+ { label: '(UTC+10) Brisbane', value: 'Australia/Brisbane' },
114
+ { label: '(UTC+10) Canberra', value: 'Australia/Sydney' },
115
+ { label: '(UTC+10) Melbourne', value: 'Australia/Melbourne' },
116
+ { label: '(UTC+10) Sydney', value: 'Australia/Sydney' },
117
+ // UTC+12
118
+ { label: '(UTC+12) Auckland', value: 'Pacific/Auckland' },
119
+ { label: '(UTC+12) Fiji', value: 'Pacific/Fiji' },
120
+ ];
121
+ // ─── DST-aware offset helpers ─────────────────────────────────────────────────
122
+ /**
123
+ * Returns the current UTC offset label for an IANA timezone, e.g. "(UTC-7)" or "(UTC+5:30)".
124
+ * Because it reads `new Date()` it is automatically DST-aware.
125
+ */
126
+ function getUtcOffsetLabel(iana) {
127
+ try {
128
+ const parts = new Intl.DateTimeFormat('en', {
129
+ timeZone: iana,
130
+ timeZoneName: 'shortOffset',
131
+ }).formatToParts(new Date());
132
+ const tzName = parts.find((p) => p.type === 'timeZoneName')?.value ?? 'GMT';
133
+ const offset = tzName.replace(/^GMT/, '');
134
+ return offset ? `(UTC${offset})` : '(UTC)';
135
+ }
136
+ catch {
137
+ return '(UTC)';
138
+ }
139
+ }
140
+ /**
141
+ * Returns a DST-aware display string for a timezone option.
142
+ * For UTC / Exchange the label is returned unchanged.
143
+ * For all IANA entries the offset prefix is recomputed live.
144
+ */
145
+ function getDisplayLabel(opt) {
146
+ if (opt.value === 'UTC' || opt.value === 'exchange')
147
+ return opt.label;
148
+ // Extract city name from static label like "(UTC-9) Anchorage" → "Anchorage"
149
+ const city = opt.label.replace(/^\(UTC[^)]*\)\s*/, '');
150
+ return `${getUtcOffsetLabel(opt.value)} ${city}`;
151
+ }
152
+ /**
153
+ * Returns true when the given symbol trades on a session-aware exchange
154
+ * (stocks, futures, forex) where RTH/ETH distinction makes sense.
155
+ * Crypto exchanges trade 24/7 and have no session concept.
156
+ */
157
+ const CRYPTO_EXCHANGES = new Set([
158
+ 'BINANCE', 'BINANCEUS', 'BINANCEUSDM', 'BINANCECOINM',
159
+ 'COINBASE', 'COINBASEPRO',
160
+ 'KRAKEN', 'KRAKENFX',
161
+ 'BYBIT', 'BITGET',
162
+ 'OKX', 'OKEX',
163
+ 'HUOBI', 'HTX',
164
+ 'KUCOIN',
165
+ 'GEMINI',
166
+ 'BITSTAMP',
167
+ 'BITFINEX',
168
+ 'MEXC',
169
+ 'GATEIO', 'GATE',
170
+ 'BITMEX',
171
+ 'DERIBIT',
172
+ ]);
173
+ export function symbolSupportsSession(symbol) {
174
+ const exchange = symbol.includes(':') ? symbol.split(':')[0].toUpperCase() : '';
175
+ return exchange !== '' && !CRYPTO_EXCHANGES.has(exchange);
176
+ }
177
+ function useClockTime(timezone) {
178
+ const [time, setTime] = useState(() => _formatClock(timezone));
179
+ useEffect(() => {
180
+ setTime(_formatClock(timezone));
181
+ const id = setInterval(() => setTime(_formatClock(timezone)), 1000);
182
+ return () => clearInterval(id);
183
+ }, [timezone]);
184
+ return time;
185
+ }
186
+ function _formatClock(timezone) {
187
+ const tz = timezone === 'exchange' ? 'UTC' : timezone;
188
+ try {
189
+ return new Intl.DateTimeFormat('en-GB', {
190
+ timeZone: tz,
191
+ hour: '2-digit',
192
+ minute: '2-digit',
193
+ second: '2-digit',
194
+ hour12: false,
195
+ }).format(new Date());
196
+ }
197
+ catch {
198
+ return new Intl.DateTimeFormat('en-GB', {
199
+ timeZone: 'UTC',
200
+ hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false,
201
+ }).format(new Date());
202
+ }
203
+ }
204
+ export function BottomToolbar({ symbol, timezone, onTimezoneChange, session, onSessionChange, onToggleScriptDrawer, scriptDrawerOpen }) {
205
+ const showSession = symbolSupportsSession(symbol);
206
+ const [open, setOpen] = useState(false);
207
+ const [sessionOpen, setSessionOpen] = useState(false);
208
+ const rootRef = useRef(null);
209
+ const sessionRef = useRef(null);
210
+ const clockTime = useClockTime(timezone);
211
+ const current = TIMEZONE_OPTIONS.find((o) => o.value === timezone) ?? TIMEZONE_OPTIONS[0];
212
+ // Close timezone dropdown on outside click
213
+ useEffect(() => {
214
+ if (!open)
215
+ return;
216
+ const handler = (e) => {
217
+ if (rootRef.current && !rootRef.current.contains(e.target))
218
+ setOpen(false);
219
+ };
220
+ document.addEventListener('mousedown', handler);
221
+ return () => document.removeEventListener('mousedown', handler);
222
+ }, [open]);
223
+ // Close session dropdown on outside click
224
+ useEffect(() => {
225
+ if (!sessionOpen)
226
+ return;
227
+ const handler = (e) => {
228
+ if (sessionRef.current && !sessionRef.current.contains(e.target))
229
+ setSessionOpen(false);
230
+ };
231
+ document.addEventListener('mousedown', handler);
232
+ return () => document.removeEventListener('mousedown', handler);
233
+ }, [sessionOpen]);
234
+ return (_jsxs("div", { className: "bottom-bar", children: [_jsx("div", { className: "bottom-bar-left", children: _jsxs("button", { className: `bottom-bar-btn${scriptDrawerOpen ? ' active' : ''}`, onClick: onToggleScriptDrawer, title: "Script Engine", children: [_jsxs("svg", { viewBox: "0 0 16 16", width: "11", height: "11", fill: "none", stroke: "currentColor", strokeWidth: "1.6", strokeLinecap: "round", children: [_jsx("polyline", { points: "4,6 2,8 4,10" }), _jsx("polyline", { points: "12,6 14,8 12,10" }), _jsx("line", { x1: "9", y1: "3", x2: "7", y2: "13" })] }), "Script"] }) }), _jsxs("div", { className: "bottom-bar-right", children: [_jsxs("div", { ref: rootRef, style: { position: 'relative', display: 'flex', alignItems: 'center' }, children: [_jsxs("button", { className: `bottom-bar-btn${open ? ' active' : ''}`, onClick: () => setOpen((o) => !o), title: "Chart timezone", children: [_jsxs("svg", { viewBox: "0 0 14 14", width: "11", height: "11", fill: "none", stroke: "currentColor", strokeWidth: "1.2", children: [_jsx("circle", { cx: "7", cy: "7", r: "5.5" }), _jsx("path", { d: "M7 1.5C7 1.5 9 4 9 7s-2 5.5-2 5.5M7 1.5C7 1.5 5 4 5 7s2 5.5 2 5.5" }), _jsx("line", { x1: "1.5", y1: "7", x2: "12.5", y2: "7" }), _jsx("line", { x1: "2", y1: "4.5", x2: "12", y2: "4.5" }), _jsx("line", { x1: "2", y1: "9.5", x2: "12", y2: "9.5" })] }), getDisplayLabel(current)] }), _jsx("span", { className: "bottom-bar-clock", title: `Current time in ${getDisplayLabel(current)}`, children: clockTime }), open && (_jsxs("div", { className: "bottom-bar-dropdown bottom-bar-dropdown--right", children: [_jsx("div", { className: "bottom-bar-dropdown-section", children: "Timezone" }), TIMEZONE_OPTIONS.map((opt) => (_jsxs("button", { className: `bottom-bar-dropdown-item${opt.value === timezone ? ' current' : ''}`, onClick: () => { onTimezoneChange(opt.value); setOpen(false); }, children: [opt.value === timezone && (_jsx("span", { className: "bottom-bar-check", children: "\u00E2\u0153\u201C" })), getDisplayLabel(opt)] }, opt.value + opt.label)))] }))] }), showSession && _jsxs("div", { ref: sessionRef, style: { position: 'relative', display: 'flex', alignItems: 'center' }, children: [_jsxs("button", { className: `bottom-bar-btn${sessionOpen ? ' active' : ''}`, onClick: () => setSessionOpen((o) => !o), title: "Trading session", children: [_jsxs("svg", { viewBox: "0 0 14 14", width: "11", height: "11", fill: "none", stroke: "currentColor", strokeWidth: "1.2", children: [_jsx("rect", { x: "1.5", y: "2.5", width: "11", height: "9", rx: "1" }), _jsx("line", { x1: "1.5", y1: "5.5", x2: "12.5", y2: "5.5" }), _jsx("line", { x1: "4.5", y1: "2.5", x2: "4.5", y2: "1" }), _jsx("line", { x1: "9.5", y1: "2.5", x2: "9.5", y2: "1" })] }), session === 'extended' ? 'Extended hours' : 'Regular hours'] }), sessionOpen && (_jsxs("div", { className: "bottom-bar-dropdown bottom-bar-dropdown--right", children: [_jsx("div", { className: "bottom-bar-dropdown-section", children: "Sessions" }), _jsxs("button", { className: `bottom-bar-dropdown-item${session === 'regular' ? ' current' : ''}`, onClick: () => { onSessionChange('regular'); setSessionOpen(false); }, children: [session === 'regular' && _jsx("span", { className: "bottom-bar-check", children: "\u00E2\u0153\u201C" }), _jsxs("span", { className: "bottom-bar-session-label", children: [_jsx("strong", { children: "Regular trading hours" }), _jsx("span", { children: "Exchange session only (RTH) \u00E2\u20AC\u201D cleaner signals, higher liquidity" })] })] }), _jsxs("button", { className: `bottom-bar-dropdown-item${session === 'extended' ? ' current' : ''}`, onClick: () => { onSessionChange('extended'); setSessionOpen(false); }, children: [session === 'extended' && _jsx("span", { className: "bottom-bar-check", children: "\u00E2\u0153\u201C" }), _jsxs("span", { className: "bottom-bar-session-label", children: [_jsx("strong", { children: "Extended / electronic hours" }), _jsx("span", { children: "Includes pre-market & after-hours (ETH) \u00E2\u20AC\u201D full price range" })] })] })] }))] })] })] }));
235
+ }
236
+ //# sourceMappingURL=BottomToolbar.js.map