@itssumitrai/fin-charter 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (396) hide show
  1. package/README.md +96 -0
  2. package/dist/api/chart-api.d.ts +173 -0
  3. package/dist/api/export.d.ts +46 -0
  4. package/dist/api/indicator-api.d.ts +38 -0
  5. package/dist/api/options.d.ts +226 -0
  6. package/dist/api/pane-api.d.ts +28 -0
  7. package/dist/api/series-api.d.ts +115 -0
  8. package/dist/core/accessibility.d.ts +90 -0
  9. package/dist/core/alert-line.d.ts +49 -0
  10. package/dist/core/chart-state.d.ts +39 -0
  11. package/dist/core/chart-sync.d.ts +83 -0
  12. package/dist/core/crosshair.d.ts +28 -0
  13. package/dist/core/css-theme.d.ts +41 -0
  14. package/dist/core/custom-indicator.d.ts +70 -0
  15. package/dist/core/data-feed.d.ts +59 -0
  16. package/dist/core/data-layer.d.ts +38 -0
  17. package/dist/core/invalidation.d.ts +24 -0
  18. package/dist/core/market-session.d.ts +11 -0
  19. package/dist/core/order-line.d.ts +134 -0
  20. package/dist/core/pane-divider.d.ts +22 -0
  21. package/dist/core/pane.d.ts +32 -0
  22. package/dist/core/periodicity.d.ts +6 -0
  23. package/dist/core/plugin.d.ts +90 -0
  24. package/dist/core/price-line.d.ts +17 -0
  25. package/dist/core/price-scale.d.ts +74 -0
  26. package/dist/core/replay.d.ts +73 -0
  27. package/dist/core/rtl.d.ts +22 -0
  28. package/dist/core/segment-tree.d.ts +38 -0
  29. package/dist/core/series-markers.d.ts +18 -0
  30. package/dist/core/storage-adapter.d.ts +50 -0
  31. package/dist/core/streaming-adapter.d.ts +102 -0
  32. package/dist/core/symbol-resolver.d.ts +32 -0
  33. package/dist/core/text-label.d.ts +72 -0
  34. package/dist/core/time-scale.d.ts +109 -0
  35. package/dist/core/types.d.ts +144 -0
  36. package/dist/core/undo-redo.d.ts +46 -0
  37. package/dist/currency/currency.d.ts +8 -0
  38. package/dist/currency/index.d.ts +2 -0
  39. package/dist/drawings/arrow.d.ts +10 -0
  40. package/dist/drawings/base.d.ts +79 -0
  41. package/dist/drawings/channel.d.ts +10 -0
  42. package/dist/drawings/crossline.d.ts +10 -0
  43. package/dist/drawings/ellipse.d.ts +10 -0
  44. package/dist/drawings/fib-arc.d.ts +10 -0
  45. package/dist/drawings/fib-fan.d.ts +12 -0
  46. package/dist/drawings/fib-projection.d.ts +11 -0
  47. package/dist/drawings/fibonacci.d.ts +11 -0
  48. package/dist/drawings/horizontal-line.d.ts +10 -0
  49. package/dist/drawings/index.d.ts +7 -0
  50. package/dist/drawings/measurement.d.ts +11 -0
  51. package/dist/drawings/pitchfork.d.ts +12 -0
  52. package/dist/drawings/ray.d.ts +12 -0
  53. package/dist/drawings/rectangle.d.ts +10 -0
  54. package/dist/drawings/text-annotation.d.ts +11 -0
  55. package/dist/drawings/trendline.d.ts +10 -0
  56. package/dist/drawings/vertical-line.d.ts +10 -0
  57. package/dist/formatting/index.d.ts +5 -0
  58. package/dist/formatting/price-formatter.d.ts +6 -0
  59. package/dist/formatting/time-formatter.d.ts +7 -0
  60. package/dist/formatting/volume-formatter.d.ts +1 -0
  61. package/dist/i18n/i18n.d.ts +6 -0
  62. package/dist/i18n/index.d.ts +3 -0
  63. package/dist/i18n/locales/en.d.ts +3 -0
  64. package/dist/index.d.ts +63 -0
  65. package/dist/index.js +2 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/index10.js +2 -0
  68. package/dist/index10.js.map +1 -0
  69. package/dist/index100.js +2 -0
  70. package/dist/index100.js.map +1 -0
  71. package/dist/index101.js +2 -0
  72. package/dist/index101.js.map +1 -0
  73. package/dist/index102.js +2 -0
  74. package/dist/index102.js.map +1 -0
  75. package/dist/index103.js +2 -0
  76. package/dist/index103.js.map +1 -0
  77. package/dist/index104.js +2 -0
  78. package/dist/index104.js.map +1 -0
  79. package/dist/index105.js +2 -0
  80. package/dist/index105.js.map +1 -0
  81. package/dist/index106.js +2 -0
  82. package/dist/index106.js.map +1 -0
  83. package/dist/index107.js +2 -0
  84. package/dist/index107.js.map +1 -0
  85. package/dist/index108.js +2 -0
  86. package/dist/index108.js.map +1 -0
  87. package/dist/index109.js +2 -0
  88. package/dist/index109.js.map +1 -0
  89. package/dist/index11.js +2 -0
  90. package/dist/index11.js.map +1 -0
  91. package/dist/index110.js +2 -0
  92. package/dist/index110.js.map +1 -0
  93. package/dist/index111.js +2 -0
  94. package/dist/index111.js.map +1 -0
  95. package/dist/index112.js +2 -0
  96. package/dist/index112.js.map +1 -0
  97. package/dist/index113.js +2 -0
  98. package/dist/index113.js.map +1 -0
  99. package/dist/index114.js +2 -0
  100. package/dist/index114.js.map +1 -0
  101. package/dist/index115.js +2 -0
  102. package/dist/index115.js.map +1 -0
  103. package/dist/index116.js +2 -0
  104. package/dist/index116.js.map +1 -0
  105. package/dist/index117.js +2 -0
  106. package/dist/index117.js.map +1 -0
  107. package/dist/index118.js +2 -0
  108. package/dist/index118.js.map +1 -0
  109. package/dist/index119.js +2 -0
  110. package/dist/index119.js.map +1 -0
  111. package/dist/index12.js +2 -0
  112. package/dist/index12.js.map +1 -0
  113. package/dist/index120.js +2 -0
  114. package/dist/index120.js.map +1 -0
  115. package/dist/index121.js +2 -0
  116. package/dist/index121.js.map +1 -0
  117. package/dist/index122.js +2 -0
  118. package/dist/index122.js.map +1 -0
  119. package/dist/index123.js +2 -0
  120. package/dist/index123.js.map +1 -0
  121. package/dist/index124.js +2 -0
  122. package/dist/index124.js.map +1 -0
  123. package/dist/index13.js +2 -0
  124. package/dist/index13.js.map +1 -0
  125. package/dist/index14.js +2 -0
  126. package/dist/index14.js.map +1 -0
  127. package/dist/index15.js +2 -0
  128. package/dist/index15.js.map +1 -0
  129. package/dist/index16.js +2 -0
  130. package/dist/index16.js.map +1 -0
  131. package/dist/index17.js +2 -0
  132. package/dist/index17.js.map +1 -0
  133. package/dist/index18.js +2 -0
  134. package/dist/index18.js.map +1 -0
  135. package/dist/index19.js +2 -0
  136. package/dist/index19.js.map +1 -0
  137. package/dist/index2.js +2 -0
  138. package/dist/index2.js.map +1 -0
  139. package/dist/index20.js +2 -0
  140. package/dist/index20.js.map +1 -0
  141. package/dist/index21.js +2 -0
  142. package/dist/index21.js.map +1 -0
  143. package/dist/index22.js +2 -0
  144. package/dist/index22.js.map +1 -0
  145. package/dist/index23.js +2 -0
  146. package/dist/index23.js.map +1 -0
  147. package/dist/index24.js +2 -0
  148. package/dist/index24.js.map +1 -0
  149. package/dist/index25.js +2 -0
  150. package/dist/index25.js.map +1 -0
  151. package/dist/index26.js +2 -0
  152. package/dist/index26.js.map +1 -0
  153. package/dist/index27.js +2 -0
  154. package/dist/index27.js.map +1 -0
  155. package/dist/index28.js +2 -0
  156. package/dist/index28.js.map +1 -0
  157. package/dist/index29.js +2 -0
  158. package/dist/index29.js.map +1 -0
  159. package/dist/index3.js +2 -0
  160. package/dist/index3.js.map +1 -0
  161. package/dist/index30.js +2 -0
  162. package/dist/index30.js.map +1 -0
  163. package/dist/index31.js +2 -0
  164. package/dist/index31.js.map +1 -0
  165. package/dist/index32.js +2 -0
  166. package/dist/index32.js.map +1 -0
  167. package/dist/index33.js +2 -0
  168. package/dist/index33.js.map +1 -0
  169. package/dist/index34.js +2 -0
  170. package/dist/index34.js.map +1 -0
  171. package/dist/index35.js +2 -0
  172. package/dist/index35.js.map +1 -0
  173. package/dist/index36.js +2 -0
  174. package/dist/index36.js.map +1 -0
  175. package/dist/index37.js +2 -0
  176. package/dist/index37.js.map +1 -0
  177. package/dist/index38.js +2 -0
  178. package/dist/index38.js.map +1 -0
  179. package/dist/index39.js +2 -0
  180. package/dist/index39.js.map +1 -0
  181. package/dist/index4.js +2 -0
  182. package/dist/index4.js.map +1 -0
  183. package/dist/index40.js +2 -0
  184. package/dist/index40.js.map +1 -0
  185. package/dist/index41.js +2 -0
  186. package/dist/index41.js.map +1 -0
  187. package/dist/index42.js +2 -0
  188. package/dist/index42.js.map +1 -0
  189. package/dist/index43.js +2 -0
  190. package/dist/index43.js.map +1 -0
  191. package/dist/index44.js +2 -0
  192. package/dist/index44.js.map +1 -0
  193. package/dist/index45.js +2 -0
  194. package/dist/index45.js.map +1 -0
  195. package/dist/index46.js +2 -0
  196. package/dist/index46.js.map +1 -0
  197. package/dist/index47.js +2 -0
  198. package/dist/index47.js.map +1 -0
  199. package/dist/index48.js +2 -0
  200. package/dist/index48.js.map +1 -0
  201. package/dist/index49.js +2 -0
  202. package/dist/index49.js.map +1 -0
  203. package/dist/index5.js +2 -0
  204. package/dist/index5.js.map +1 -0
  205. package/dist/index50.js +2 -0
  206. package/dist/index50.js.map +1 -0
  207. package/dist/index51.js +2 -0
  208. package/dist/index51.js.map +1 -0
  209. package/dist/index52.js +2 -0
  210. package/dist/index52.js.map +1 -0
  211. package/dist/index53.js +2 -0
  212. package/dist/index53.js.map +1 -0
  213. package/dist/index54.js +2 -0
  214. package/dist/index54.js.map +1 -0
  215. package/dist/index55.js +2 -0
  216. package/dist/index55.js.map +1 -0
  217. package/dist/index56.js +2 -0
  218. package/dist/index56.js.map +1 -0
  219. package/dist/index57.js +2 -0
  220. package/dist/index57.js.map +1 -0
  221. package/dist/index58.js +2 -0
  222. package/dist/index58.js.map +1 -0
  223. package/dist/index59.js +2 -0
  224. package/dist/index59.js.map +1 -0
  225. package/dist/index6.js +2 -0
  226. package/dist/index6.js.map +1 -0
  227. package/dist/index60.js +2 -0
  228. package/dist/index60.js.map +1 -0
  229. package/dist/index61.js +2 -0
  230. package/dist/index61.js.map +1 -0
  231. package/dist/index62.js +2 -0
  232. package/dist/index62.js.map +1 -0
  233. package/dist/index63.js +2 -0
  234. package/dist/index63.js.map +1 -0
  235. package/dist/index64.js +2 -0
  236. package/dist/index64.js.map +1 -0
  237. package/dist/index65.js +3 -0
  238. package/dist/index65.js.map +1 -0
  239. package/dist/index66.js +2 -0
  240. package/dist/index66.js.map +1 -0
  241. package/dist/index67.js +2 -0
  242. package/dist/index67.js.map +1 -0
  243. package/dist/index68.js +2 -0
  244. package/dist/index68.js.map +1 -0
  245. package/dist/index69.js +2 -0
  246. package/dist/index69.js.map +1 -0
  247. package/dist/index7.js +2 -0
  248. package/dist/index7.js.map +1 -0
  249. package/dist/index70.js +2 -0
  250. package/dist/index70.js.map +1 -0
  251. package/dist/index71.js +2 -0
  252. package/dist/index71.js.map +1 -0
  253. package/dist/index72.js +2 -0
  254. package/dist/index72.js.map +1 -0
  255. package/dist/index73.js +2 -0
  256. package/dist/index73.js.map +1 -0
  257. package/dist/index74.js +2 -0
  258. package/dist/index74.js.map +1 -0
  259. package/dist/index75.js +2 -0
  260. package/dist/index75.js.map +1 -0
  261. package/dist/index76.js +2 -0
  262. package/dist/index76.js.map +1 -0
  263. package/dist/index77.js +2 -0
  264. package/dist/index77.js.map +1 -0
  265. package/dist/index78.js +2 -0
  266. package/dist/index78.js.map +1 -0
  267. package/dist/index79.js +2 -0
  268. package/dist/index79.js.map +1 -0
  269. package/dist/index8.js +2 -0
  270. package/dist/index8.js.map +1 -0
  271. package/dist/index80.js +2 -0
  272. package/dist/index80.js.map +1 -0
  273. package/dist/index81.js +2 -0
  274. package/dist/index81.js.map +1 -0
  275. package/dist/index82.js +2 -0
  276. package/dist/index82.js.map +1 -0
  277. package/dist/index83.js +2 -0
  278. package/dist/index83.js.map +1 -0
  279. package/dist/index84.js +2 -0
  280. package/dist/index84.js.map +1 -0
  281. package/dist/index85.js +2 -0
  282. package/dist/index85.js.map +1 -0
  283. package/dist/index86.js +2 -0
  284. package/dist/index86.js.map +1 -0
  285. package/dist/index87.js +2 -0
  286. package/dist/index87.js.map +1 -0
  287. package/dist/index88.js +2 -0
  288. package/dist/index88.js.map +1 -0
  289. package/dist/index89.js +2 -0
  290. package/dist/index89.js.map +1 -0
  291. package/dist/index9.js +2 -0
  292. package/dist/index9.js.map +1 -0
  293. package/dist/index90.js +2 -0
  294. package/dist/index90.js.map +1 -0
  295. package/dist/index91.js +2 -0
  296. package/dist/index91.js.map +1 -0
  297. package/dist/index92.js +2 -0
  298. package/dist/index92.js.map +1 -0
  299. package/dist/index93.js +2 -0
  300. package/dist/index93.js.map +1 -0
  301. package/dist/index94.js +2 -0
  302. package/dist/index94.js.map +1 -0
  303. package/dist/index95.js +2 -0
  304. package/dist/index95.js.map +1 -0
  305. package/dist/index96.js +2 -0
  306. package/dist/index96.js.map +1 -0
  307. package/dist/index97.js +2 -0
  308. package/dist/index97.js.map +1 -0
  309. package/dist/index98.js +2 -0
  310. package/dist/index98.js.map +1 -0
  311. package/dist/index99.js +2 -0
  312. package/dist/index99.js.map +1 -0
  313. package/dist/indicators/adx.d.ts +6 -0
  314. package/dist/indicators/aroon.d.ts +5 -0
  315. package/dist/indicators/atr.d.ts +1 -0
  316. package/dist/indicators/awesome-oscillator.d.ts +1 -0
  317. package/dist/indicators/bollinger.d.ts +6 -0
  318. package/dist/indicators/cci.d.ts +1 -0
  319. package/dist/indicators/chaikin-mf.d.ts +1 -0
  320. package/dist/indicators/choppiness.d.ts +1 -0
  321. package/dist/indicators/coppock.d.ts +1 -0
  322. package/dist/indicators/donchian.d.ts +6 -0
  323. package/dist/indicators/elder-force.d.ts +1 -0
  324. package/dist/indicators/ema.d.ts +1 -0
  325. package/dist/indicators/ichimoku.d.ts +8 -0
  326. package/dist/indicators/index.d.ts +31 -0
  327. package/dist/indicators/keltner.d.ts +6 -0
  328. package/dist/indicators/linear-regression.d.ts +1 -0
  329. package/dist/indicators/macd.d.ts +6 -0
  330. package/dist/indicators/mfi.d.ts +1 -0
  331. package/dist/indicators/obv.d.ts +1 -0
  332. package/dist/indicators/parabolic-sar.d.ts +1 -0
  333. package/dist/indicators/pivot-points.d.ts +10 -0
  334. package/dist/indicators/roc.d.ts +1 -0
  335. package/dist/indicators/rsi.d.ts +1 -0
  336. package/dist/indicators/sma.d.ts +1 -0
  337. package/dist/indicators/stochastic.d.ts +5 -0
  338. package/dist/indicators/supertrend.d.ts +5 -0
  339. package/dist/indicators/trix.d.ts +5 -0
  340. package/dist/indicators/utils.d.ts +20 -0
  341. package/dist/indicators/volume-profile.d.ts +37 -0
  342. package/dist/indicators/volume.d.ts +1 -0
  343. package/dist/indicators/vwap.d.ts +1 -0
  344. package/dist/indicators/vwma.d.ts +1 -0
  345. package/dist/indicators/williams-r.d.ts +1 -0
  346. package/dist/interactions/axis-drag.d.ts +24 -0
  347. package/dist/interactions/context-menu-handler.d.ts +42 -0
  348. package/dist/interactions/crosshair.d.ts +20 -0
  349. package/dist/interactions/drawing-handler.d.ts +39 -0
  350. package/dist/interactions/event-router.d.ts +37 -0
  351. package/dist/interactions/keyboard-nav.d.ts +11 -0
  352. package/dist/interactions/pan-zoom.d.ts +39 -0
  353. package/dist/interactions/range-selection.d.ts +103 -0
  354. package/dist/interactions/touch-gestures.d.ts +36 -0
  355. package/dist/logo.svg +40 -0
  356. package/dist/market/exchange-map.d.ts +3 -0
  357. package/dist/market/index.d.ts +4 -0
  358. package/dist/market/market-calendar.d.ts +4 -0
  359. package/dist/market/market-definition.d.ts +22 -0
  360. package/dist/mockServiceWorker.js +349 -0
  361. package/dist/renderers/area.d.ts +17 -0
  362. package/dist/renderers/bar-ohlc.d.ts +17 -0
  363. package/dist/renderers/baseline-delta-mountain.d.ts +22 -0
  364. package/dist/renderers/baseline.d.ts +19 -0
  365. package/dist/renderers/candlestick.d.ts +21 -0
  366. package/dist/renderers/canvas-renderer.d.ts +28 -0
  367. package/dist/renderers/colored-line.d.ts +15 -0
  368. package/dist/renderers/colored-mountain.d.ts +18 -0
  369. package/dist/renderers/column.d.ts +14 -0
  370. package/dist/renderers/high-low.d.ts +14 -0
  371. package/dist/renderers/histogram.d.ts +16 -0
  372. package/dist/renderers/hlc-area.d.ts +16 -0
  373. package/dist/renderers/hollow-candle.d.ts +18 -0
  374. package/dist/renderers/kagi.d.ts +22 -0
  375. package/dist/renderers/line-break.d.ts +20 -0
  376. package/dist/renderers/line.d.ts +17 -0
  377. package/dist/renderers/point-figure.d.ts +20 -0
  378. package/dist/renderers/renderer.d.ts +59 -0
  379. package/dist/renderers/renko.d.ts +24 -0
  380. package/dist/renderers/step-line.d.ts +14 -0
  381. package/dist/renderers/text-cache.d.ts +23 -0
  382. package/dist/renderers/volume-candle.d.ts +20 -0
  383. package/dist/renderers/webgl/area-webgl.d.ts +28 -0
  384. package/dist/renderers/webgl/candlestick-webgl.d.ts +30 -0
  385. package/dist/renderers/webgl/index.d.ts +7 -0
  386. package/dist/renderers/webgl/line-webgl.d.ts +23 -0
  387. package/dist/renderers/webgl/webgl-utils.d.ts +23 -0
  388. package/dist/timezone/index.d.ts +2 -0
  389. package/dist/timezone/timezone.d.ts +12 -0
  390. package/dist/transforms/aggregate.d.ts +2 -0
  391. package/dist/transforms/heikin-ashi.d.ts +2 -0
  392. package/dist/transforms/index.d.ts +2 -0
  393. package/dist/ui/context-menu.d.ts +14 -0
  394. package/dist/ui/hud.d.ts +43 -0
  395. package/dist/ui/settings-popup.d.ts +15 -0
  396. package/package.json +129 -0
@@ -0,0 +1,11 @@
1
+ import { IPaneView } from '../core/types';
2
+ import { BaseDrawing, AnchorPoint, DrawingOptions, DrawingHitTestResult } from './base';
3
+ export declare class TextAnnotationDrawing extends BaseDrawing {
4
+ readonly drawingType = "text-annotation";
5
+ readonly requiredPoints = 1;
6
+ private _bbox;
7
+ constructor(id: string, points: AnchorPoint[], options: DrawingOptions);
8
+ _hitTestDrawing(x: number, y: number): DrawingHitTestResult | null;
9
+ protected _createPaneView(): IPaneView;
10
+ }
11
+ export declare function createTextAnnotation(id: string, points: AnchorPoint[], options: DrawingOptions): TextAnnotationDrawing;
@@ -0,0 +1,10 @@
1
+ import { IPaneView } from '../core/types';
2
+ import { BaseDrawing, AnchorPoint, DrawingOptions, DrawingHitTestResult } from './base';
3
+ export declare class TrendlineDrawing extends BaseDrawing {
4
+ readonly drawingType = "trendline";
5
+ readonly requiredPoints = 2;
6
+ constructor(id: string, points: AnchorPoint[], options: DrawingOptions);
7
+ _hitTestDrawing(x: number, y: number): DrawingHitTestResult | null;
8
+ protected _createPaneView(): IPaneView;
9
+ }
10
+ export declare function createTrendline(id: string, points: AnchorPoint[], options: DrawingOptions): TrendlineDrawing;
@@ -0,0 +1,10 @@
1
+ import { IPaneView } from '../core/types';
2
+ import { BaseDrawing, AnchorPoint, DrawingOptions, DrawingHitTestResult } from './base';
3
+ export declare class VerticalLineDrawing extends BaseDrawing {
4
+ readonly drawingType = "vertical-line";
5
+ readonly requiredPoints = 1;
6
+ constructor(id: string, points: AnchorPoint[], options: DrawingOptions);
7
+ _hitTestDrawing(x: number, y: number): DrawingHitTestResult | null;
8
+ protected _createPaneView(): IPaneView;
9
+ }
10
+ export declare function createVerticalLine(id: string, points: AnchorPoint[], options: DrawingOptions): VerticalLineDrawing;
@@ -0,0 +1,5 @@
1
+ export { createPriceFormatter } from './price-formatter';
2
+ export type { PriceFormatterOptions } from './price-formatter';
3
+ export { createTimeFormatter } from './time-formatter';
4
+ export type { TimeFormatterOptions } from './time-formatter';
5
+ export { formatVolume } from './volume-formatter';
@@ -0,0 +1,6 @@
1
+ export interface PriceFormatterOptions {
2
+ locale?: string;
3
+ decimals?: number | 'auto';
4
+ currency?: string;
5
+ }
6
+ export declare function createPriceFormatter(options?: PriceFormatterOptions): (price: number) => string;
@@ -0,0 +1,7 @@
1
+ export interface TimeFormatterOptions {
2
+ timezone?: string;
3
+ locale?: string;
4
+ }
5
+ type TickType = 'year' | 'month' | 'day' | 'time';
6
+ export declare function createTimeFormatter(options?: TimeFormatterOptions): (timestampSec: number, tickType: TickType, crosshair?: boolean) => string;
7
+ export {};
@@ -0,0 +1 @@
1
+ export declare function formatVolume(value: number, locale?: string): string;
@@ -0,0 +1,6 @@
1
+ export type Translations = Record<string, string>;
2
+ export declare function setLocale(lang: string): void;
3
+ export declare function getLocale(): string;
4
+ export declare function registerLocale(lang: string, translations: Translations): void;
5
+ export declare function t(key: string, params?: Record<string, string | number>): string;
6
+ export declare function loadLocale(lang: string, loader: () => Promise<Translations>): Promise<void>;
@@ -0,0 +1,3 @@
1
+ export { t, setLocale, getLocale, registerLocale, loadLocale } from './i18n';
2
+ export type { Translations } from './i18n';
3
+ export { default as enLocale } from './locales/en';
@@ -0,0 +1,3 @@
1
+ import { Translations } from '../i18n';
2
+ declare const en: Translations;
3
+ export default en;
@@ -0,0 +1,63 @@
1
+ export declare const VERSION = "0.1.0";
2
+ export { createChart } from './api/chart-api';
3
+ export type { IChartApi, IDrawingApi, CrosshairMoveCallback, ClickCallback, DblClickCallback, VisibleRangeChangeCallback, DrawingEventType, DrawingEventCallback, IndicatorEventType, IndicatorEventCallback, ResizeCallback, SymbolChangeCallback, ChartTypeChangeCallback, PreferencesChangeCallback, LayoutChangeAction, LayoutChangeCallback, } from './api/chart-api';
4
+ export type { ISeriesApi, DataChangedCallback, VisibilityChangeCallback } from './api/series-api';
5
+ export type { IPaneApi } from './api/pane-api';
6
+ export type { IIndicatorApi } from './api/indicator-api';
7
+ export { DARK_THEME, LIGHT_THEME, COLORFUL_THEME } from './api/options';
8
+ export type { RendererType } from './api/options';
9
+ export { isWebGLAvailable } from './renderers/webgl/index';
10
+ export type { CSVExportOptions, PDFExportOptions } from './api/export';
11
+ export type { Periodicity } from './core/periodicity';
12
+ export { periodicityToSeconds, periodicityToLabel } from './core/periodicity';
13
+ export type { MarketSession } from './core/market-session';
14
+ export { US_EQUITY_SESSIONS, isInSession, getSessionForTime, timestampToMinuteOfDay } from './core/market-session';
15
+ export type { ChartState } from './core/chart-state';
16
+ export { CHART_STATE_VERSION, validateChartState } from './core/chart-state';
17
+ export type { ChartEvent, EventType } from './core/series-markers';
18
+ export type { MarkerShape, MarkerPosition, SeriesMarker, } from './core/series-markers';
19
+ export { PriceLine } from './core/price-line';
20
+ export type { PriceLineOptions } from './core/price-line';
21
+ export { WebSocketAdapter, PollingAdapter, TickBuffer } from './core/streaming-adapter';
22
+ export type { IStreamingAdapter, WebSocketAdapterOptions, PollingAdapterOptions } from './core/streaming-adapter';
23
+ export { TouchGestureHandler } from './interactions/touch-gestures';
24
+ export type { TouchGestureOptions } from './interactions/touch-gestures';
25
+ export { detectDirection, mirrorX, resolveTextAlign } from './core/rtl';
26
+ export type { TextDirection } from './core/rtl';
27
+ export { ReplayManager } from './core/replay';
28
+ export type { ReplaySpeed, ReplayEvent, ReplayBarEvent, ReplayControlEvent, ReplayEventCallback, ReplayOptions } from './core/replay';
29
+ export { TextLabel, createTextLabels } from './core/text-label';
30
+ export type { TextLabelOptions } from './core/text-label';
31
+ export { PluginManager } from './core/plugin';
32
+ export type { IPlugin, PluginChartApi, PluginPaintContext } from './core/plugin';
33
+ export { LocalStorageAdapter, IndexedDBAdapter, DrawingPersistence } from './core/storage-adapter';
34
+ export type { IStorageAdapter } from './core/storage-adapter';
35
+ export { CustomIndicatorRegistry } from './core/custom-indicator';
36
+ export type { CustomIndicatorDescriptor, IndicatorOutput, IndicatorParam, IndicatorComputeFn, } from './core/custom-indicator';
37
+ export { CSS_VARS, readCSSTheme, generateCSSTheme, applyCSSTheme } from './core/css-theme';
38
+ export { DataFeedManager } from './core/data-feed';
39
+ export type { IDataFeed, DataFeedManagerOptions } from './core/data-feed';
40
+ export type { PriceScaleMode } from './core/price-scale';
41
+ export { UndoRedoManager } from './core/undo-redo';
42
+ export type { Command, UndoRedoChangeCallback } from './core/undo-redo';
43
+ export { MinMaxSegmentTree } from './core/segment-tree';
44
+ export type { RangeSelectionStats, RangeSelectionCallback, MeasureResult, MeasureCallback, } from './interactions/range-selection';
45
+ export { AlertLine } from './core/alert-line';
46
+ export type { AlertLineOptions, AlertTriggerMode, AlertLineCallback } from './core/alert-line';
47
+ export { OrderLine, PositionLine } from './core/order-line';
48
+ export type { OrderLineOptions, OrderSide, OrderType, OrderModifiedCallback, OrderCancelledCallback, PositionLineOptions } from './core/order-line';
49
+ export type { ChartOptions, LayoutOptions, TimeScaleApiOptions, CrosshairOptions, GridOptions, CandlestickSeriesOptions, LineSeriesOptions, AreaSeriesOptions, BarSeriesOptions, BaselineSeriesOptions, HollowCandleSeriesOptions, HistogramSeriesOptions, PaneOptions, BaseSeriesOptions, SeriesOptionsMap, TooltipOptions, WatermarkOptions, VolumeOverlayOptions, PriceScaleOptions, TimeGapsOptions, IndicatorType, IndicatorOptions, } from './api/options';
50
+ export type { Bar, ColumnData, SeriesType, DeepPartial, ISeriesPrimitive, IPanePrimitive, IPaneView, IPaneRenderer, IRenderTarget, VisibleRange, TimeRange, } from './core/types';
51
+ export { InvalidationLevel } from './core/types';
52
+ export type { AnchorPoint, DrawingOptions, SerializedDrawing, DrawingPrimitive, DrawingHitTestResult, DrawingFactory, } from './drawings/index';
53
+ export { DRAWING_REGISTRY, createBuiltinDrawing, distToSegment, pointInRect } from './drawings/index';
54
+ export { t, setLocale, getLocale, registerLocale, loadLocale, enLocale } from './i18n';
55
+ export type { Translations } from './i18n';
56
+ export { timestampToDateParts, formatInTimezone, getTimezoneOffsetMinutes } from './timezone';
57
+ export type { DateParts } from './timezone';
58
+ export { createPriceFormatter, createTimeFormatter, formatVolume } from './formatting';
59
+ export type { PriceFormatterOptions, TimeFormatterOptions } from './formatting';
60
+ export { getCurrencyInfo, formatCurrency, CURRENCIES } from './currency';
61
+ export type { CurrencyInfo } from './currency';
62
+ export { getMarket, registerMarket, getMarketForExchange, registerExchange, isMarketDate, getNextOpen, isEarlyClose, US_MARKET, UK_MARKET, JP_MARKET, DE_MARKET, AU_MARKET, CRYPTO_MARKET, } from './market';
63
+ export type { MarketDefinition, MarketHoliday } from './market';
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ import{InvalidationLevel as o}from"./index2.js";import{MinMaxSegmentTree as r}from"./index6.js";import{CHART_STATE_VERSION as i,validateChartState as m}from"./index8.js";import{AlertLine as e}from"./index12.js";import{TextLabel as n,createTextLabels as p}from"./index13.js";import{UndoRedoManager as s}from"./index14.js";import{distToSegment as t,pointInRect as x}from"./index21.js";import{DRAWING_REGISTRY as d,createBuiltinDrawing as f}from"./index38.js";import{isWebGLAvailable as j}from"./index61.js";import{PriceLine as a}from"./index66.js";import{COLORFUL_THEME as c,DARK_THEME as l,LIGHT_THEME as v}from"./index70.js";import{createPriceFormatter as L}from"./index102.js";import{formatInTimezone as b,getTimezoneOffsetMinutes as g,timestampToDateParts as h}from"./index103.js";import{createTimeFormatter as k}from"./index104.js";import{formatVolume as q}from"./index105.js";import{createChart as u}from"./index106.js";import{periodicityToLabel as w,periodicityToSeconds as y}from"./index107.js";import{US_EQUITY_SESSIONS as z,getSessionForTime as A,isInSession as B,timestampToMinuteOfDay as C}from"./index108.js";import{PollingAdapter as D,TickBuffer as E,WebSocketAdapter as F}from"./index109.js";import{TouchGestureHandler as G}from"./index110.js";import{detectDirection as H,mirrorX as I,resolveTextAlign as J}from"./index111.js";import{ReplayManager as K}from"./index112.js";import{PluginManager as M}from"./index113.js";import{DrawingPersistence as N,IndexedDBAdapter as O,LocalStorageAdapter as P}from"./index114.js";import{CustomIndicatorRegistry as Q}from"./index115.js";import{CSS_VARS as R,applyCSSTheme as S,generateCSSTheme as T,readCSSTheme as U}from"./index116.js";import{DataFeedManager as V}from"./index117.js";import{OrderLine as W,PositionLine as X}from"./index118.js";import{getLocale as Y,loadLocale as Z,registerLocale as $,setLocale as _,t as oo}from"./index119.js";import ro from"./index120.js";import{CURRENCIES as io,formatCurrency as mo,getCurrencyInfo as eo}from"./index121.js";import{AU_MARKET as no,CRYPTO_MARKET as po,DE_MARKET as so,JP_MARKET as to,UK_MARKET as xo,US_MARKET as fo,getMarket as jo,registerMarket as ao}from"./index122.js";import{getNextOpen as co,isEarlyClose as lo,isMarketDate as vo}from"./index123.js";import{getMarketForExchange as Lo,registerExchange as bo}from"./index124.js";var go="0.1.0";export{no as AU_MARKET,e as AlertLine,i as CHART_STATE_VERSION,c as COLORFUL_THEME,po as CRYPTO_MARKET,R as CSS_VARS,io as CURRENCIES,Q as CustomIndicatorRegistry,l as DARK_THEME,so as DE_MARKET,d as DRAWING_REGISTRY,V as DataFeedManager,N as DrawingPersistence,O as IndexedDBAdapter,o as InvalidationLevel,to as JP_MARKET,v as LIGHT_THEME,P as LocalStorageAdapter,r as MinMaxSegmentTree,W as OrderLine,M as PluginManager,D as PollingAdapter,X as PositionLine,a as PriceLine,K as ReplayManager,n as TextLabel,E as TickBuffer,G as TouchGestureHandler,xo as UK_MARKET,z as US_EQUITY_SESSIONS,fo as US_MARKET,s as UndoRedoManager,go as VERSION,F as WebSocketAdapter,S as applyCSSTheme,f as createBuiltinDrawing,u as createChart,L as createPriceFormatter,p as createTextLabels,k as createTimeFormatter,H as detectDirection,t as distToSegment,ro as enLocale,mo as formatCurrency,b as formatInTimezone,q as formatVolume,T as generateCSSTheme,eo as getCurrencyInfo,Y as getLocale,jo as getMarket,Lo as getMarketForExchange,co as getNextOpen,A as getSessionForTime,g as getTimezoneOffsetMinutes,lo as isEarlyClose,B as isInSession,vo as isMarketDate,j as isWebGLAvailable,Z as loadLocale,I as mirrorX,w as periodicityToLabel,y as periodicityToSeconds,x as pointInRect,U as readCSSTheme,bo as registerExchange,$ as registerLocale,ao as registerMarket,J as resolveTextAlign,_ as setLocale,oo as t,h as timestampToDateParts,C as timestampToMinuteOfDay,m as validateChartState};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["export const VERSION = '0.1.0';\n\n// ─── API layer ──────────────────────────────────────────────────────────────\nexport { createChart } from './api/chart-api';\nexport type {\n IChartApi, IDrawingApi,\n CrosshairMoveCallback, ClickCallback, DblClickCallback,\n VisibleRangeChangeCallback,\n DrawingEventType, DrawingEventCallback,\n IndicatorEventType, IndicatorEventCallback,\n ResizeCallback,\n SymbolChangeCallback,\n ChartTypeChangeCallback,\n PreferencesChangeCallback,\n LayoutChangeAction,\n LayoutChangeCallback,\n} from './api/chart-api';\nexport type { ISeriesApi, DataChangedCallback, VisibilityChangeCallback } from './api/series-api';\nexport type { IPaneApi } from './api/pane-api';\nexport type { IIndicatorApi } from './api/indicator-api';\n\nexport { DARK_THEME, LIGHT_THEME, COLORFUL_THEME } from './api/options';\nexport type { RendererType } from './api/options';\n\n// ─── WebGL ──────────────────────────────────────────────────────────\nexport { isWebGLAvailable } from './renderers/webgl/index';\n\n// ─── Export ─────────────────────────────────────────────────────────\nexport type { CSVExportOptions, PDFExportOptions } from './api/export';\n\n// ─── Periodicity ──────────────────────────────────────────────────────\nexport type { Periodicity } from './core/periodicity';\nexport { periodicityToSeconds, periodicityToLabel } from './core/periodicity';\n\n// ─── Market Sessions ──────────────────────────────────────────────────\nexport type { MarketSession } from './core/market-session';\nexport { US_EQUITY_SESSIONS, isInSession, getSessionForTime, timestampToMinuteOfDay } from './core/market-session';\n\n// ─── Chart State ──────────────────────────────────────────────────────\nexport type { ChartState } from './core/chart-state';\nexport { CHART_STATE_VERSION, validateChartState } from './core/chart-state';\n\n// ─── Chart Events ─────────────────────────────────────────────────────\nexport type { ChartEvent, EventType } from './core/series-markers';\n\n// ─── Series markers ────────────────────────────────────────────────────\nexport type {\n MarkerShape,\n MarkerPosition,\n SeriesMarker,\n} from './core/series-markers';\n\n// ─── Price lines ───────────────────────────────────────────────────────\nexport { PriceLine } from './core/price-line';\nexport type { PriceLineOptions } from './core/price-line';\n\n// ─── Streaming Adapters ─────────────────────────────────────────────\nexport { WebSocketAdapter, PollingAdapter, TickBuffer } from './core/streaming-adapter';\nexport type { IStreamingAdapter, WebSocketAdapterOptions, PollingAdapterOptions } from './core/streaming-adapter';\n\n// ─── Touch Gestures ─────────────────────────────────────────────────\nexport { TouchGestureHandler } from './interactions/touch-gestures';\nexport type { TouchGestureOptions } from './interactions/touch-gestures';\n\n// ─── RTL ────────────────────────────────────────────────────────────\nexport { detectDirection, mirrorX, resolveTextAlign } from './core/rtl';\nexport type { TextDirection } from './core/rtl';\n\n// ─── Replay ─────────────────────────────────────────────────────────\nexport { ReplayManager } from './core/replay';\nexport type { ReplaySpeed, ReplayEvent, ReplayBarEvent, ReplayControlEvent, ReplayEventCallback, ReplayOptions } from './core/replay';\n\n// ─── Text Labels ────────────────────────────────────────────────────\nexport { TextLabel, createTextLabels } from './core/text-label';\nexport type { TextLabelOptions } from './core/text-label';\n\n// ─── Plugin API ─────────────────────────────────────────────────────\nexport { PluginManager } from './core/plugin';\nexport type { IPlugin, PluginChartApi, PluginPaintContext } from './core/plugin';\n\n// ─── Storage & Persistence ──────────────────────────────────────────\nexport { LocalStorageAdapter, IndexedDBAdapter, DrawingPersistence } from './core/storage-adapter';\nexport type { IStorageAdapter } from './core/storage-adapter';\n\n// ─── Custom Indicators ──────────────────────────────────────────────\nexport { CustomIndicatorRegistry } from './core/custom-indicator';\nexport type {\n CustomIndicatorDescriptor,\n IndicatorOutput,\n IndicatorParam,\n IndicatorComputeFn,\n} from './core/custom-indicator';\n\n// ─── CSS Theme ──────────────────────────────────────────────────────\nexport { CSS_VARS, readCSSTheme, generateCSSTheme, applyCSSTheme } from './core/css-theme';\n\n// ─── Data Feed ──────────────────────────────────────────────────────\nexport { DataFeedManager } from './core/data-feed';\nexport type { IDataFeed, DataFeedManagerOptions } from './core/data-feed';\n\n// ─── Price Scale ────────────────────────────────────────────────────\nexport type { PriceScaleMode } from './core/price-scale';\n\n// ─── Undo/Redo ──────────────────────────────────────────────────────\nexport { UndoRedoManager } from './core/undo-redo';\nexport type { Command, UndoRedoChangeCallback } from './core/undo-redo';\n\n// ─── Segment Tree (large dataset optimization) ──────────────────────\nexport { MinMaxSegmentTree } from './core/segment-tree';\n\n// ─── Range Selection & Measure ───────────────────────────────────────\nexport type {\n RangeSelectionStats,\n RangeSelectionCallback,\n MeasureResult,\n MeasureCallback,\n} from './interactions/range-selection';\n\n// ─── Alert lines ──────────────────────────────────────────────────────\nexport { AlertLine } from './core/alert-line';\nexport type { AlertLineOptions, AlertTriggerMode, AlertLineCallback } from './core/alert-line';\n\n// ─── Order & Position Lines ────────────────────────────────────────────────\nexport { OrderLine, PositionLine } from './core/order-line';\nexport type { OrderLineOptions, OrderSide, OrderType, OrderModifiedCallback, OrderCancelledCallback, PositionLineOptions } from './core/order-line';\n\n// ─── Option types ───────────────────────────────────────────────────────────\nexport type {\n ChartOptions,\n LayoutOptions,\n TimeScaleApiOptions,\n CrosshairOptions,\n GridOptions,\n CandlestickSeriesOptions,\n LineSeriesOptions,\n AreaSeriesOptions,\n BarSeriesOptions,\n BaselineSeriesOptions,\n HollowCandleSeriesOptions,\n HistogramSeriesOptions,\n PaneOptions,\n BaseSeriesOptions,\n SeriesOptionsMap,\n TooltipOptions,\n WatermarkOptions,\n VolumeOverlayOptions,\n PriceScaleOptions,\n TimeGapsOptions,\n IndicatorType,\n IndicatorOptions,\n} from './api/options';\n\n// ─── Core types ─────────────────────────────────────────────────────────────\nexport type {\n Bar,\n ColumnData,\n SeriesType,\n DeepPartial,\n ISeriesPrimitive,\n IPanePrimitive,\n IPaneView,\n IPaneRenderer,\n IRenderTarget,\n VisibleRange,\n TimeRange,\n} from './core/types';\n\nexport { InvalidationLevel } from './core/types';\n\n// ─── Drawing tools ────────────────────────────────────────────────────\nexport type {\n AnchorPoint,\n DrawingOptions,\n SerializedDrawing,\n DrawingPrimitive,\n DrawingHitTestResult,\n DrawingFactory,\n} from './drawings/index';\nexport { DRAWING_REGISTRY, createBuiltinDrawing, distToSegment, pointInRect } from './drawings/index';\n\n// ─── i18n ────────────────────────────────────────────────────────────\nexport { t, setLocale, getLocale, registerLocale, loadLocale, enLocale } from './i18n';\nexport type { Translations } from './i18n';\n\n// ─── Timezone ────────────────────────────────────────────────────────\nexport { timestampToDateParts, formatInTimezone, getTimezoneOffsetMinutes } from './timezone';\nexport type { DateParts } from './timezone';\n\n// ─── Formatting ──────────────────────────────────────────────────────\nexport { createPriceFormatter, createTimeFormatter, formatVolume } from './formatting';\nexport type { PriceFormatterOptions, TimeFormatterOptions } from './formatting';\n\n// ─── Currency ────────────────────────────────────────────────────────\nexport { getCurrencyInfo, formatCurrency, CURRENCIES } from './currency';\nexport type { CurrencyInfo } from './currency';\n\n// ─── Market Definitions ─────────────────────────────────────────────\nexport {\n getMarket, registerMarket, getMarketForExchange, registerExchange,\n isMarketDate, getNextOpen, isEarlyClose,\n US_MARKET, UK_MARKET, JP_MARKET, DE_MARKET, AU_MARKET, CRYPTO_MARKET,\n} from './market';\nexport type { MarketDefinition, MarketHoliday } from './market';\n"],"mappings":"gyEAAA,IAAa,GAAU"}
@@ -0,0 +1,2 @@
1
+ import{PriceScale as t}from"./index9.js";var e=class{constructor(e,s,a=!1){this.id=e,this._height=Math.max(50,s),this.priceScale=new t("right"),this.leftPriceScale=new t("left"),this.row=document.createElement("div"),this.row.style.position="relative",this.row.style.width="100%",this.row.style.height=`${this._height}px`,this.row.style.overflow="hidden";const i=document.createElement("canvas");i.style.position="absolute",i.style.left="0",i.style.top="0",i.style.zIndex="1";const h=document.createElement("canvas");h.style.position="absolute",h.style.left="0",h.style.top="0",h.style.zIndex="3";const n=document.createElement("canvas");n.style.position="absolute",n.style.top="0",n.style.zIndex="1";const l=document.createElement("canvas");l.style.position="absolute",l.style.top="0",l.style.left="0",l.style.zIndex="1",this.row.appendChild(i),this.row.appendChild(h),this.row.appendChild(n),this.row.appendChild(l);const o={chartCanvas:i,overlayCanvas:h,rightPriceAxisCanvas:n,leftPriceAxisCanvas:l,chartCtx:i.getContext("2d"),overlayCtx:h.getContext("2d"),rightPriceAxisCtx:n.getContext("2d"),leftPriceAxisCtx:l.getContext("2d")};if(a){const t={alpha:!0,premultipliedAlpha:!1,antialias:!0,preserveDrawingBuffer:!1},e=()=>{const s=document.createElement("canvas");s.style.position="absolute",s.style.left="0",s.style.top="0",s.style.zIndex="2",this.row.insertBefore(s,h);const a=s.getContext("webgl2",t);s.addEventListener("webglcontextlost",t=>{t.preventDefault(),this.canvases.webglCtx=void 0,this.canvases.webglCanvas=void 0}),s.addEventListener("webglcontextrestored",()=>{s.parentNode===this.row&&this.row.removeChild(s),e()}),a?(o.webglCanvas=s,o.webglCtx=a):s.parentNode===this.row&&this.row.removeChild(s)};e()}this.canvases=o}get height(){return this._height}set height(t){this._height=Math.max(50,t),this.row.style.height=`${this._height}px`}layout(t,e,s,a,i,h){const n=this._height;this.priceScale.setHeight(n),this.leftPriceScale.setHeight(n);for(const l of[this.canvases.chartCanvas,this.canvases.overlayCanvas])l.width=Math.round(t*h),l.height=Math.round(n*h),l.style.width=`${t}px`,l.style.height=`${n}px`,l.style.left=`${e}px`;this.canvases.rightPriceAxisCanvas.width=Math.round(s*h),this.canvases.rightPriceAxisCanvas.height=Math.round(n*h),this.canvases.rightPriceAxisCanvas.style.width=`${s}px`,this.canvases.rightPriceAxisCanvas.style.height=`${n}px`,this.canvases.rightPriceAxisCanvas.style.left=`${e+t}px`,this.canvases.rightPriceAxisCanvas.style.display=a?"":"none",this.canvases.leftPriceAxisCanvas.width=Math.round(s*h),this.canvases.leftPriceAxisCanvas.height=Math.round(n*h),this.canvases.leftPriceAxisCanvas.style.width=`${s}px`,this.canvases.leftPriceAxisCanvas.style.height=`${n}px`,this.canvases.leftPriceAxisCanvas.style.left="0px",this.canvases.leftPriceAxisCanvas.style.display=i?"":"none",this.canvases.webglCanvas&&(this.canvases.webglCanvas.width=Math.round(t*h),this.canvases.webglCanvas.height=Math.round(n*h),this.canvases.webglCanvas.style.width=`${t}px`,this.canvases.webglCanvas.style.height=`${n}px`,this.canvases.webglCanvas.style.left=`${e}px`,this.canvases.webglCtx&&this.canvases.webglCtx.viewport(0,0,Math.round(t*h),Math.round(n*h))),this.row.style.height=`${n}px`}};export{e as Pane};
2
+ //# sourceMappingURL=index10.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index10.js","names":[],"sources":["../src/core/pane.ts"],"sourcesContent":["import { PriceScale } from './price-scale';\n\nconst MIN_PANE_HEIGHT = 50;\n\nexport interface PaneCanvases {\n chartCanvas: HTMLCanvasElement;\n overlayCanvas: HTMLCanvasElement;\n rightPriceAxisCanvas: HTMLCanvasElement;\n leftPriceAxisCanvas: HTMLCanvasElement;\n chartCtx: CanvasRenderingContext2D;\n overlayCtx: CanvasRenderingContext2D;\n rightPriceAxisCtx: CanvasRenderingContext2D;\n leftPriceAxisCtx: CanvasRenderingContext2D;\n /** Optional WebGL canvas layered between chart and overlay canvases. */\n webglCanvas?: HTMLCanvasElement;\n webglCtx?: WebGL2RenderingContext;\n}\n\n/**\n * Internal Pane class. Holds canvases, contexts, and price scales for a single pane row.\n */\nexport class Pane {\n public readonly id: string;\n public readonly row: HTMLDivElement;\n public readonly canvases: PaneCanvases;\n public readonly priceScale: PriceScale;\n public readonly leftPriceScale: PriceScale;\n\n private _height: number;\n\n constructor(id: string, height: number, useWebGL = false) {\n this.id = id;\n this._height = Math.max(MIN_PANE_HEIGHT, height);\n\n this.priceScale = new PriceScale('right');\n this.leftPriceScale = new PriceScale('left');\n\n // Create the row container\n this.row = document.createElement('div');\n this.row.style.position = 'relative';\n this.row.style.width = '100%';\n this.row.style.height = `${this._height}px`;\n this.row.style.overflow = 'hidden';\n\n // Chart canvas (series + grid)\n const chartCanvas = document.createElement('canvas');\n chartCanvas.style.position = 'absolute';\n chartCanvas.style.left = '0';\n chartCanvas.style.top = '0';\n chartCanvas.style.zIndex = '1';\n\n // Overlay canvas (crosshair)\n const overlayCanvas = document.createElement('canvas');\n overlayCanvas.style.position = 'absolute';\n overlayCanvas.style.left = '0';\n overlayCanvas.style.top = '0';\n overlayCanvas.style.zIndex = '3';\n\n // Right price axis canvas\n const rightPriceAxisCanvas = document.createElement('canvas');\n rightPriceAxisCanvas.style.position = 'absolute';\n rightPriceAxisCanvas.style.top = '0';\n rightPriceAxisCanvas.style.zIndex = '1';\n\n // Left price axis canvas\n const leftPriceAxisCanvas = document.createElement('canvas');\n leftPriceAxisCanvas.style.position = 'absolute';\n leftPriceAxisCanvas.style.top = '0';\n leftPriceAxisCanvas.style.left = '0';\n leftPriceAxisCanvas.style.zIndex = '1';\n\n this.row.appendChild(chartCanvas);\n this.row.appendChild(overlayCanvas);\n this.row.appendChild(rightPriceAxisCanvas);\n this.row.appendChild(leftPriceAxisCanvas);\n\n const canvases: PaneCanvases = {\n chartCanvas,\n overlayCanvas,\n rightPriceAxisCanvas,\n leftPriceAxisCanvas,\n chartCtx: chartCanvas.getContext('2d')!,\n overlayCtx: overlayCanvas.getContext('2d')!,\n rightPriceAxisCtx: rightPriceAxisCanvas.getContext('2d')!,\n leftPriceAxisCtx: leftPriceAxisCanvas.getContext('2d')!,\n };\n\n // Optionally create a WebGL canvas layered between chart and overlay\n if (useWebGL) {\n const webglContextAttributes: WebGLContextAttributes = {\n alpha: true,\n premultipliedAlpha: false,\n antialias: true,\n preserveDrawingBuffer: false,\n };\n\n const attachWebGLCanvas = (): void => {\n const webglCanvas = document.createElement('canvas');\n webglCanvas.style.position = 'absolute';\n webglCanvas.style.left = '0';\n webglCanvas.style.top = '0';\n webglCanvas.style.zIndex = '2';\n // Insert before overlay so stacking order is: chart(1) < webgl(2) < overlay(3)\n this.row.insertBefore(webglCanvas, overlayCanvas);\n\n const glCtx = webglCanvas.getContext('webgl2', webglContextAttributes);\n\n // Handle context loss gracefully. A lost WebGL context invalidates all\n // GPU resources, so drop references and recreate a fresh canvas/context\n // on restoration to avoid reusing stale per-context renderer caches.\n webglCanvas.addEventListener('webglcontextlost', (e) => {\n e.preventDefault();\n this.canvases.webglCtx = undefined;\n this.canvases.webglCanvas = undefined;\n });\n webglCanvas.addEventListener('webglcontextrestored', () => {\n if (webglCanvas.parentNode === this.row) {\n this.row.removeChild(webglCanvas);\n }\n attachWebGLCanvas();\n });\n\n if (glCtx) {\n canvases.webglCanvas = webglCanvas;\n canvases.webglCtx = glCtx;\n } else if (webglCanvas.parentNode === this.row) {\n this.row.removeChild(webglCanvas);\n }\n };\n\n attachWebGLCanvas();\n }\n\n this.canvases = canvases;\n }\n\n get height(): number {\n return this._height;\n }\n\n set height(value: number) {\n this._height = Math.max(MIN_PANE_HEIGHT, value);\n this.row.style.height = `${this._height}px`;\n }\n\n /**\n * Layout all canvases within this pane row.\n */\n layout(\n chartW: number,\n leftScaleW: number,\n priceAxisWidth: number,\n rightScaleVisible: boolean,\n leftScaleVisible: boolean,\n pixelRatio: number,\n ): void {\n const h = this._height;\n\n this.priceScale.setHeight(h);\n this.leftPriceScale.setHeight(h);\n\n // Chart + overlay canvases\n for (const canvas of [this.canvases.chartCanvas, this.canvases.overlayCanvas]) {\n canvas.width = Math.round(chartW * pixelRatio);\n canvas.height = Math.round(h * pixelRatio);\n canvas.style.width = `${chartW}px`;\n canvas.style.height = `${h}px`;\n canvas.style.left = `${leftScaleW}px`;\n }\n\n // Right price axis canvas\n this.canvases.rightPriceAxisCanvas.width = Math.round(priceAxisWidth * pixelRatio);\n this.canvases.rightPriceAxisCanvas.height = Math.round(h * pixelRatio);\n this.canvases.rightPriceAxisCanvas.style.width = `${priceAxisWidth}px`;\n this.canvases.rightPriceAxisCanvas.style.height = `${h}px`;\n this.canvases.rightPriceAxisCanvas.style.left = `${leftScaleW + chartW}px`;\n this.canvases.rightPriceAxisCanvas.style.display = rightScaleVisible ? '' : 'none';\n\n // Left price axis canvas\n this.canvases.leftPriceAxisCanvas.width = Math.round(priceAxisWidth * pixelRatio);\n this.canvases.leftPriceAxisCanvas.height = Math.round(h * pixelRatio);\n this.canvases.leftPriceAxisCanvas.style.width = `${priceAxisWidth}px`;\n this.canvases.leftPriceAxisCanvas.style.height = `${h}px`;\n this.canvases.leftPriceAxisCanvas.style.left = '0px';\n this.canvases.leftPriceAxisCanvas.style.display = leftScaleVisible ? '' : 'none';\n\n // WebGL canvas (mirrors chart canvas sizing)\n if (this.canvases.webglCanvas) {\n this.canvases.webglCanvas.width = Math.round(chartW * pixelRatio);\n this.canvases.webglCanvas.height = Math.round(h * pixelRatio);\n this.canvases.webglCanvas.style.width = `${chartW}px`;\n this.canvases.webglCanvas.style.height = `${h}px`;\n this.canvases.webglCanvas.style.left = `${leftScaleW}px`;\n\n // Update WebGL viewport to match canvas size\n if (this.canvases.webglCtx) {\n this.canvases.webglCtx.viewport(\n 0, 0,\n Math.round(chartW * pixelRatio),\n Math.round(h * pixelRatio),\n );\n }\n }\n\n // Update row height\n this.row.style.height = `${h}px`;\n }\n}\n"],"mappings":"yCAEA,IAmBa,EAAb,MASE,WAAA,CAAY,EAAY,EAAgB,GAAW,GACjD,KAAK,GAAK,EACV,KAAK,QAAU,KAAK,IA9BA,GA8BqB,GAEzC,KAAK,WAAa,IAAI,EAAW,SACjC,KAAK,eAAiB,IAAI,EAAW,QAGrC,KAAK,IAAM,SAAS,cAAc,OAClC,KAAK,IAAI,MAAM,SAAW,WAC1B,KAAK,IAAI,MAAM,MAAQ,OACvB,KAAK,IAAI,MAAM,OAAS,GAAG,KAAK,YAChC,KAAK,IAAI,MAAM,SAAW,SAG1B,MAAM,EAAc,SAAS,cAAc,UAC3C,EAAY,MAAM,SAAW,WAC7B,EAAY,MAAM,KAAO,IACzB,EAAY,MAAM,IAAM,IACxB,EAAY,MAAM,OAAS,IAG3B,MAAM,EAAgB,SAAS,cAAc,UAC7C,EAAc,MAAM,SAAW,WAC/B,EAAc,MAAM,KAAO,IAC3B,EAAc,MAAM,IAAM,IAC1B,EAAc,MAAM,OAAS,IAG7B,MAAM,EAAuB,SAAS,cAAc,UACpD,EAAqB,MAAM,SAAW,WACtC,EAAqB,MAAM,IAAM,IACjC,EAAqB,MAAM,OAAS,IAGpC,MAAM,EAAsB,SAAS,cAAc,UACnD,EAAoB,MAAM,SAAW,WACrC,EAAoB,MAAM,IAAM,IAChC,EAAoB,MAAM,KAAO,IACjC,EAAoB,MAAM,OAAS,IAEnC,KAAK,IAAI,YAAY,GACrB,KAAK,IAAI,YAAY,GACrB,KAAK,IAAI,YAAY,GACrB,KAAK,IAAI,YAAY,GAErB,MAAM,EAAyB,CAC7B,cACA,gBACA,uBACA,sBACA,SAAU,EAAY,WAAW,MACjC,WAAY,EAAc,WAAW,MACrC,kBAAmB,EAAqB,WAAW,MACnD,iBAAkB,EAAoB,WAAW,OAInD,GAAI,EAAU,CACZ,MAAM,EAAiD,CACrD,OAAO,EACP,oBAAoB,EACpB,WAAW,EACX,uBAAuB,GAGnB,EAAA,KACJ,MAAM,EAAc,SAAS,cAAc,UAC3C,EAAY,MAAM,SAAW,WAC7B,EAAY,MAAM,KAAO,IACzB,EAAY,MAAM,IAAM,IACxB,EAAY,MAAM,OAAS,IAE3B,KAAK,IAAI,aAAa,EAAa,GAEnC,MAAM,EAAQ,EAAY,WAAW,SAAU,GAK/C,EAAY,iBAAiB,mBAAqB,IAChD,EAAE,iBACF,KAAK,SAAS,cAAW,EACzB,KAAK,SAAS,iBAAc,IAE9B,EAAY,iBAAiB,uBAAA,KACvB,EAAY,aAAe,KAAK,KAClC,KAAK,IAAI,YAAY,GAEvB,MAGE,GACF,EAAS,YAAc,EACvB,EAAS,SAAW,GACX,EAAY,aAAe,KAAK,KACzC,KAAK,IAAI,YAAY,IAIzB,IAGF,KAAK,SAAW,EAGlB,UAAI,GACF,OAAO,KAAK,QAGd,UAAI,CAAO,GACT,KAAK,QAAU,KAAK,IA3IA,GA2IqB,GACzC,KAAK,IAAI,MAAM,OAAS,GAAG,KAAK,YAMlC,MAAA,CACE,EACA,EACA,EACA,EACA,EACA,GAEA,MAAM,EAAI,KAAK,QAEf,KAAK,WAAW,UAAU,GAC1B,KAAK,eAAe,UAAU,GAG9B,IAAK,MAAM,IAAU,CAAC,KAAK,SAAS,YAAa,KAAK,SAAS,eAC7D,EAAO,MAAQ,KAAK,MAAM,EAAS,GACnC,EAAO,OAAS,KAAK,MAAM,EAAI,GAC/B,EAAO,MAAM,MAAQ,GAAG,MACxB,EAAO,MAAM,OAAS,GAAG,MACzB,EAAO,MAAM,KAAO,GAAG,MAIzB,KAAK,SAAS,qBAAqB,MAAQ,KAAK,MAAM,EAAiB,GACvE,KAAK,SAAS,qBAAqB,OAAS,KAAK,MAAM,EAAI,GAC3D,KAAK,SAAS,qBAAqB,MAAM,MAAQ,GAAG,MACpD,KAAK,SAAS,qBAAqB,MAAM,OAAS,GAAG,MACrD,KAAK,SAAS,qBAAqB,MAAM,KAAO,GAAG,EAAa,MAChE,KAAK,SAAS,qBAAqB,MAAM,QAAU,EAAoB,GAAK,OAG5E,KAAK,SAAS,oBAAoB,MAAQ,KAAK,MAAM,EAAiB,GACtE,KAAK,SAAS,oBAAoB,OAAS,KAAK,MAAM,EAAI,GAC1D,KAAK,SAAS,oBAAoB,MAAM,MAAQ,GAAG,MACnD,KAAK,SAAS,oBAAoB,MAAM,OAAS,GAAG,MACpD,KAAK,SAAS,oBAAoB,MAAM,KAAO,MAC/C,KAAK,SAAS,oBAAoB,MAAM,QAAU,EAAmB,GAAK,OAGtE,KAAK,SAAS,cAChB,KAAK,SAAS,YAAY,MAAQ,KAAK,MAAM,EAAS,GACtD,KAAK,SAAS,YAAY,OAAS,KAAK,MAAM,EAAI,GAClD,KAAK,SAAS,YAAY,MAAM,MAAQ,GAAG,MAC3C,KAAK,SAAS,YAAY,MAAM,OAAS,GAAG,MAC5C,KAAK,SAAS,YAAY,MAAM,KAAO,GAAG,MAGtC,KAAK,SAAS,UAChB,KAAK,SAAS,SAAS,SACrB,EAAG,EACH,KAAK,MAAM,EAAS,GACpB,KAAK,MAAM,EAAI,KAMrB,KAAK,IAAI,MAAM,OAAS,GAAG"}
@@ -0,0 +1,2 @@
1
+ function t(t,o,r){const n=new Float64Array(o);for(let e=0;e<r;e++)n[e]=NaN;for(let e=r;e<o;e++){const o=t[e-r];n[e]=0===o?NaN:(t[e]-o)/o*100}return n}export{t as computeROC};
2
+ //# sourceMappingURL=index100.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index100.js","names":[],"sources":["../src/indicators/roc.ts"],"sourcesContent":["export function computeROC(close: Float64Array, length: number, period: number): Float64Array {\n const result = new Float64Array(length);\n for (let i = 0; i < period; i++) result[i] = NaN;\n for (let i = period; i < length; i++) {\n const prev = close[i - period];\n result[i] = prev === 0 ? NaN : ((close[i] - prev) / prev) * 100;\n }\n return result;\n}\n"],"mappings":"AAAA,SAAgB,EAAW,EAAqB,EAAgB,GAC9D,MAAM,EAAS,IAAI,aAAa,GAChC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,IAAK,EAAO,GAAK,IAC7C,IAAK,IAAI,EAAI,EAAQ,EAAI,EAAQ,IAAK,CACpC,MAAM,EAAO,EAAM,EAAI,GACvB,EAAO,GAAc,IAAT,EAAa,KAAQ,EAAM,GAAK,GAAQ,EAAQ,IAE9D,OAAO"}
@@ -0,0 +1,2 @@
1
+ function t(t,o,r){const e=new Float64Array(o);for(let n=0;n<r-1;n++)e[n]=NaN;for(let n=r-1;n<o;n++){let o=0,l=0,c=0,f=0;for(let e=0;e<r;e++){const a=e,s=t[n-r+1+e];o+=a,l+=s,c+=a*s,f+=a*a}const a=r,s=(a*c-o*l)/(a*f-o*o);e[n]=(l-s*o)/a+s*(r-1)}return e}export{t as computeLinearRegression};
2
+ //# sourceMappingURL=index101.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index101.js","names":[],"sources":["../src/indicators/linear-regression.ts"],"sourcesContent":["export function computeLinearRegression(close: Float64Array, length: number, period: number): Float64Array {\n const result = new Float64Array(length);\n for (let i = 0; i < period - 1; i++) result[i] = NaN;\n for (let i = period - 1; i < length; i++) {\n let sumX = 0, sumY = 0, sumXY = 0, sumX2 = 0;\n for (let j = 0; j < period; j++) {\n const x = j, y = close[i - period + 1 + j];\n sumX += x; sumY += y; sumXY += x * y; sumX2 += x * x;\n }\n const n = period;\n const slope = (n * sumXY - sumX * sumY) / (n * sumX2 - sumX * sumX);\n const intercept = (sumY - slope * sumX) / n;\n result[i] = intercept + slope * (period - 1);\n }\n return result;\n}\n"],"mappings":"AAAA,SAAgB,EAAwB,EAAqB,EAAgB,GAC3E,MAAM,EAAS,IAAI,aAAa,GAChC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAS,EAAG,IAAK,EAAO,GAAK,IACjD,IAAK,IAAI,EAAI,EAAS,EAAG,EAAI,EAAQ,IAAK,CACxC,IAAI,EAAO,EAAG,EAAO,EAAG,EAAQ,EAAG,EAAQ,EAC3C,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,IAAK,CAC/B,MAAM,EAAI,EAAG,EAAI,EAAM,EAAI,EAAS,EAAI,GACxC,GAAQ,EAAG,GAAQ,EAAG,GAAS,EAAI,EAAG,GAAS,EAAI,EAErD,MAAM,EAAI,EACJ,GAAS,EAAI,EAAQ,EAAO,IAAS,EAAI,EAAQ,EAAO,GAE9D,EAAO,IADY,EAAO,EAAQ,GAAQ,EAClB,GAAS,EAAS,GAE5C,OAAO"}
@@ -0,0 +1,2 @@
1
+ var t=/* @__PURE__ */new Map;function n(n){const i=n?.locale??"en-US",r=n?.decimals??2,c=n?.currency;return n=>isFinite(n)?function(n,i,r){const c=`${n}|${i}|${r??""}`;let e=t.get(c);if(!e){const m=r?{style:"currency",currency:r,minimumFractionDigits:i,maximumFractionDigits:i}:{minimumFractionDigits:i,maximumFractionDigits:i};e=new Intl.NumberFormat(n,m),t.set(c,e)}return e}(i,"auto"===r?function(t){const n=Math.abs(t);return n>=1||0===n?2:n>=.01?4:6}(n):r,c).format(n):"-"}export{n as createPriceFormatter};
2
+ //# sourceMappingURL=index102.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index102.js","names":[],"sources":["../src/formatting/price-formatter.ts"],"sourcesContent":["export interface PriceFormatterOptions {\n locale?: string;\n decimals?: number | 'auto';\n currency?: string;\n}\n\nfunction autoDecimals(price: number): number {\n const abs = Math.abs(price);\n if (abs >= 1 || abs === 0) return 2;\n if (abs >= 0.01) return 4;\n return 6;\n}\n\nconst _cache = new Map<string, Intl.NumberFormat>();\n\nfunction getNumberFmt(locale: string, decimals: number, currency?: string): Intl.NumberFormat {\n const key = `${locale}|${decimals}|${currency ?? ''}`;\n let fmt = _cache.get(key);\n if (!fmt) {\n const opts: Intl.NumberFormatOptions = currency\n ? { style: 'currency', currency, minimumFractionDigits: decimals, maximumFractionDigits: decimals }\n : { minimumFractionDigits: decimals, maximumFractionDigits: decimals };\n fmt = new Intl.NumberFormat(locale, opts);\n _cache.set(key, fmt);\n }\n return fmt;\n}\n\nexport function createPriceFormatter(options?: PriceFormatterOptions): (price: number) => string {\n const locale = options?.locale ?? 'en-US';\n const decSetting = options?.decimals ?? 2;\n const currency = options?.currency;\n\n return (price: number): string => {\n if (!isFinite(price)) return '-';\n const dec = decSetting === 'auto' ? autoDecimals(price) : decSetting;\n return getNumberFmt(locale, dec, currency).format(price);\n };\n}\n"],"mappings":"AAaA,IAAM,iBAAS,IAAI,IAenB,SAAgB,EAAqB,GACnC,MAAM,EAAS,GAAS,QAAU,QAC5B,EAAa,GAAS,UAAY,EAClC,EAAW,GAAS,SAE1B,OAAQ,GACD,SAAS,GAnBlB,SAAsB,EAAgB,EAAkB,GACtD,MAAM,EAAM,GAAG,KAAU,KAAY,GAAY,KACjD,IAAI,EAAM,EAAO,IAAI,GACrB,IAAK,EAAK,CACR,MAAM,EAAiC,EACnC,CAAE,MAAO,WAAY,WAAU,sBAAuB,EAAU,sBAAuB,GACvF,CAAE,sBAAuB,EAAU,sBAAuB,GAC9D,EAAM,IAAI,KAAK,aAAa,EAAQ,GACpC,EAAO,IAAI,EAAK,GAElB,OAAO,EAWE,CAAa,EADO,SAAf,EA7BhB,SAAsB,GACpB,MAAM,EAAM,KAAK,IAAI,GACrB,OAAI,GAAO,GAAa,IAAR,EAAkB,EAC9B,GAAO,IAAa,EACjB,EAyB+B,CAAa,GAAS,EACzB,GAAU,OAAO,GAFrB"}
@@ -0,0 +1,2 @@
1
+ var e=/* @__PURE__ */new Map,n=/* @__PURE__ */new Map;function t(n,t){const a=/* @__PURE__ */new Date(1e3*n),r=function(n){let t=e.get(n);return t||(t=new Intl.DateTimeFormat("en-US",{timeZone:n,year:"numeric",month:"numeric",day:"numeric",hour:"numeric",minute:"numeric",second:"numeric",hour12:!1}),e.set(n,t)),t}(t).formatToParts(a);let o=0,u=0,c=0,m=0,i=0,s=0;for(const e of r)switch(e.type){case"year":o=+e.value;break;case"month":u=+e.value;break;case"day":c=+e.value;break;case"hour":m=24===+e.value?0:+e.value;break;case"minute":i=+e.value;break;case"second":s=+e.value}return{year:o,month:u,day:c,hour:m,minute:i,second:s,weekday:new Date(o,u-1,c).getDay()}}function a(e,t,a,r="en-US"){const o=`${r}|${t}|${JSON.stringify(a)}`;let u=n.get(o);return u||(u=new Intl.DateTimeFormat(r,{...a,timeZone:t}),n.set(o,u)),u.format(/* @__PURE__ */new Date(1e3*e))}function r(e,n){const a=t(e,n),r=Date.UTC(a.year,a.month-1,a.day,a.hour,a.minute,a.second),o=1e3*e;return Math.round((r-o)/6e4)}export{a as formatInTimezone,r as getTimezoneOffsetMinutes,t as timestampToDateParts};
2
+ //# sourceMappingURL=index103.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index103.js","names":[],"sources":["../src/timezone/timezone.ts"],"sourcesContent":["export interface DateParts {\n year: number;\n month: number; // 1-12\n day: number;\n hour: number;\n minute: number;\n second: number;\n weekday: number; // 0=Sun, 6=Sat\n}\n\nconst _partsFmtCache = new Map<string, Intl.DateTimeFormat>();\nconst _fmtCache = new Map<string, Intl.DateTimeFormat>();\n\nfunction getPartsFmt(tz: string): Intl.DateTimeFormat {\n let fmt = _partsFmtCache.get(tz);\n if (!fmt) {\n fmt = new Intl.DateTimeFormat('en-US', {\n timeZone: tz,\n year: 'numeric', month: 'numeric', day: 'numeric',\n hour: 'numeric', minute: 'numeric', second: 'numeric',\n hour12: false,\n });\n _partsFmtCache.set(tz, fmt);\n }\n return fmt;\n}\n\nexport function timestampToDateParts(timestampSec: number, timezone: string): DateParts {\n const date = new Date(timestampSec * 1000);\n const parts = getPartsFmt(timezone).formatToParts(date);\n\n let year = 0, month = 0, day = 0, hour = 0, minute = 0, second = 0;\n for (const p of parts) {\n switch (p.type) {\n case 'year': year = +p.value; break;\n case 'month': month = +p.value; break;\n case 'day': day = +p.value; break;\n case 'hour': hour = +p.value === 24 ? 0 : +p.value; break;\n case 'minute': minute = +p.value; break;\n case 'second': second = +p.value; break;\n }\n }\n\n const localDate = new Date(year, month - 1, day);\n const weekday = localDate.getDay();\n\n return { year, month, day, hour, minute, second, weekday };\n}\n\nexport function formatInTimezone(\n timestampSec: number,\n timezone: string,\n options: Intl.DateTimeFormatOptions,\n locale: string = 'en-US',\n): string {\n const key = `${locale}|${timezone}|${JSON.stringify(options)}`;\n let fmt = _fmtCache.get(key);\n if (!fmt) {\n fmt = new Intl.DateTimeFormat(locale, { ...options, timeZone: timezone });\n _fmtCache.set(key, fmt);\n }\n return fmt.format(new Date(timestampSec * 1000));\n}\n\nexport function getTimezoneOffsetMinutes(timestampSec: number, timezone: string): number {\n const parts = timestampToDateParts(timestampSec, timezone);\n const asUtc = Date.UTC(parts.year, parts.month - 1, parts.day, parts.hour, parts.minute, parts.second);\n const actualUtc = timestampSec * 1000;\n return Math.round((asUtc - actualUtc) / 60000);\n}\n"],"mappings":"AAUA,IAAM,iBAAiB,IAAI,IACrB,iBAAY,IAAI,IAgBtB,SAAgB,EAAqB,EAAsB,GACzD,MAAM,iBAAO,IAAI,KAAoB,IAAf,GAChB,EAhBR,SAAqB,GACnB,IAAI,EAAM,EAAe,IAAI,GAU7B,OATK,IACH,EAAM,IAAI,KAAK,eAAe,QAAS,CACrC,SAAU,EACV,KAAM,UAAW,MAAO,UAAW,IAAK,UACxC,KAAM,UAAW,OAAQ,UAAW,OAAQ,UAC5C,QAAQ,IAEV,EAAe,IAAI,EAAI,IAElB,EAKO,CAAY,GAAU,cAAc,GAElD,IAAI,EAAO,EAAG,EAAQ,EAAG,EAAM,EAAG,EAAO,EAAG,EAAS,EAAG,EAAS,EACjE,IAAK,MAAM,KAAK,EACd,OAAQ,EAAE,MACR,IAAK,OAAQ,GAAQ,EAAE,MAAO,MAC9B,IAAK,QAAS,GAAS,EAAE,MAAO,MAChC,IAAK,MAAO,GAAO,EAAE,MAAO,MAC5B,IAAK,OAAQ,EAAoB,MAAZ,EAAE,MAAe,GAAK,EAAE,MAAO,MACpD,IAAK,SAAU,GAAU,EAAE,MAAO,MAClC,IAAK,SAAU,GAAU,EAAE,MAO/B,MAAO,CAAE,OAAM,QAAO,MAAK,OAAM,SAAQ,SAAQ,QAH/B,IAAI,KAAK,EAAM,EAAQ,EAAG,GAClB,UAK5B,SAAgB,EACd,EACA,EACA,EACA,EAAiB,SAEjB,MAAM,EAAM,GAAG,KAAU,KAAY,KAAK,UAAU,KACpD,IAAI,EAAM,EAAU,IAAI,GAKxB,OAJK,IACH,EAAM,IAAI,KAAK,eAAe,EAAQ,IAAK,EAAS,SAAU,IAC9D,EAAU,IAAI,EAAK,IAEd,EAAI,sBAAO,IAAI,KAAoB,IAAf,IAG7B,SAAgB,EAAyB,EAAsB,GAC7D,MAAM,EAAQ,EAAqB,EAAc,GAC3C,EAAQ,KAAK,IAAI,EAAM,KAAM,EAAM,MAAQ,EAAG,EAAM,IAAK,EAAM,KAAM,EAAM,OAAQ,EAAM,QACzF,EAA2B,IAAf,EAClB,OAAO,KAAK,OAAO,EAAQ,GAAa"}
@@ -0,0 +1,2 @@
1
+ import{timestampToDateParts as r}from"./index103.js";var t=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function e(e){const a=e?.timezone??"UTC";return(e,n,$=!1)=>{const o=r(e,a),u=t[o.month-1],i=o.hour.toString().padStart(2,"0"),c=o.minute.toString().padStart(2,"0");if($)return"time"===n?`${u} ${o.day} ${i}:${c}`:`${u} ${o.day}, ${o.year}`;switch(n){case"time":return`${i}:${c}`;case"day":return`${u} ${o.day}`;case"month":return`${u} ${o.year}`;case"year":return`${o.year}`}}}export{e as createTimeFormatter};
2
+ //# sourceMappingURL=index104.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index104.js","names":[],"sources":["../src/formatting/time-formatter.ts"],"sourcesContent":["import { timestampToDateParts } from '../timezone/timezone';\n\nexport interface TimeFormatterOptions {\n timezone?: string;\n locale?: string;\n}\n\ntype TickType = 'year' | 'month' | 'day' | 'time';\n\nconst MONTHS_SHORT = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];\n\nexport function createTimeFormatter(options?: TimeFormatterOptions): (\n timestampSec: number,\n tickType: TickType,\n crosshair?: boolean,\n) => string {\n const tz = options?.timezone ?? 'UTC';\n\n return (timestampSec: number, tickType: TickType, crosshair: boolean = false): string => {\n const p = timestampToDateParts(timestampSec, tz);\n const mon = MONTHS_SHORT[p.month - 1];\n const hh = p.hour.toString().padStart(2, '0');\n const mm = p.minute.toString().padStart(2, '0');\n\n if (crosshair) {\n if (tickType === 'time') return `${mon} ${p.day} ${hh}:${mm}`;\n return `${mon} ${p.day}, ${p.year}`;\n }\n\n switch (tickType) {\n case 'time': return `${hh}:${mm}`;\n case 'day': return `${mon} ${p.day}`;\n case 'month': return `${mon} ${p.year}`;\n case 'year': return `${p.year}`;\n }\n };\n}\n"],"mappings":"qDASA,IAAM,EAAe,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,OAExF,SAAgB,EAAoB,GAKlC,MAAM,EAAK,GAAS,UAAY,MAEhC,MAAA,CAAQ,EAAsB,EAAoB,GAAqB,KACrE,MAAM,EAAI,EAAqB,EAAc,GACvC,EAAM,EAAa,EAAE,MAAQ,GAC7B,EAAK,EAAE,KAAK,WAAW,SAAS,EAAG,KACnC,EAAK,EAAE,OAAO,WAAW,SAAS,EAAG,KAE3C,GAAI,EACF,MAAiB,SAAb,EAA4B,GAAG,KAAO,EAAE,OAAO,KAAM,IAClD,GAAG,KAAO,EAAE,QAAQ,EAAE,OAG/B,OAAQ,GACN,IAAK,OAAQ,MAAO,GAAG,KAAM,IAC7B,IAAK,MAAO,MAAO,GAAG,KAAO,EAAE,MAC/B,IAAK,QAAS,MAAO,GAAG,KAAO,EAAE,OACjC,IAAK,OAAQ,MAAO,GAAG,EAAE"}
@@ -0,0 +1,2 @@
1
+ var t=[[1e12,"T"],[1e9,"B"],[1e6,"M"],[1e3,"K"]];function i(i,r){if(!isFinite(i))return"-";if(0===i)return"0";const n=Math.abs(i);for(const[o,e]of t)if(n>=o){const t=i/o;return`${r?new Intl.NumberFormat(r,{minimumFractionDigits:2,maximumFractionDigits:2}).format(t):t.toFixed(2)}${e}`}return r?new Intl.NumberFormat(r,{maximumFractionDigits:0}).format(i):Math.round(i).toString()}export{i as formatVolume};
2
+ //# sourceMappingURL=index105.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index105.js","names":[],"sources":["../src/formatting/volume-formatter.ts"],"sourcesContent":["const SUFFIXES: [number, string][] = [\n [1e12, 'T'],\n [1e9, 'B'],\n [1e6, 'M'],\n [1e3, 'K'],\n];\n\nexport function formatVolume(value: number, locale?: string): string {\n if (!isFinite(value)) return '-';\n if (value === 0) return '0';\n\n const abs = Math.abs(value);\n\n for (const [threshold, suffix] of SUFFIXES) {\n if (abs >= threshold) {\n const scaled = value / threshold;\n const formatted = locale\n ? new Intl.NumberFormat(locale, { minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(scaled)\n : scaled.toFixed(2);\n return `${formatted}${suffix}`;\n }\n }\n\n return locale\n ? new Intl.NumberFormat(locale, { maximumFractionDigits: 0 }).format(value)\n : Math.round(value).toString();\n}\n"],"mappings":"AAAA,IAAM,EAA+B,CACnC,CAAC,KAAM,KACP,CAAC,IAAM,KACP,CAAC,IAAM,KACP,CAAC,IAAM,MAGT,SAAgB,EAAa,EAAe,GAC1C,IAAK,SAAS,GAAQ,MAAO,IAC7B,GAAc,IAAV,EAAa,MAAO,IAExB,MAAM,EAAM,KAAK,IAAI,GAErB,IAAK,MAAO,EAAW,KAAW,EAChC,GAAI,GAAO,EAAW,CACpB,MAAM,EAAS,EAAQ,EAIvB,MAAO,GAHW,EACd,IAAI,KAAK,aAAa,EAAQ,CAAE,sBAAuB,EAAG,sBAAuB,IAAK,OAAO,GAC7F,EAAO,QAAQ,KACG,IAI1B,OAAO,EACH,IAAI,KAAK,aAAa,EAAQ,CAAE,sBAAuB,IAAK,OAAO,GACnE,KAAK,MAAM,GAAO"}
@@ -0,0 +1,2 @@
1
+ import{InvalidationLevel as e}from"./index2.js";import{TimeScale as t}from"./index3.js";import{Crosshair as i}from"./index4.js";import{InvalidateMask as s}from"./index5.js";import{DataLayer as n}from"./index7.js";import{CHART_STATE_VERSION as a,validateChartState as r}from"./index8.js";import{Pane as o}from"./index10.js";import{PaneDivider as l}from"./index11.js";import{AlertLine as h}from"./index12.js";import{TextLabel as c}from"./index13.js";import{UndoRedoManager as d}from"./index14.js";import{MeasureHandler as p,RangeSelectionHandler as _}from"./index15.js";import{EventRouter as u}from"./index16.js";import{PanZoomHandler as g}from"./index17.js";import{CrosshairHandler as m}from"./index18.js";import{ContextMenuHandler as f}from"./index20.js";import{BaseDrawing as b}from"./index21.js";import{DRAWING_REGISTRY as x,createBuiltinDrawing as v}from"./index38.js";import{DrawingHandler as y}from"./index39.js";import{HudManager as w}from"./index41.js";import{CandlestickRenderer as C}from"./index42.js";import{LineRenderer as k}from"./index43.js";import{AreaRenderer as S}from"./index44.js";import{BarOHLCRenderer as M}from"./index45.js";import{BaselineRenderer as P}from"./index46.js";import{HollowCandleRenderer as I}from"./index47.js";import{HistogramRenderer as R}from"./index48.js";import{StepLineRenderer as L}from"./index49.js";import{ColoredLineRenderer as T}from"./index50.js";import{ColoredMountainRenderer as O}from"./index51.js";import{HLCAreaRenderer as A}from"./index52.js";import{HighLowRenderer as D}from"./index53.js";import{ColumnRenderer as F}from"./index54.js";import{VolumeCandleRenderer as j}from"./index55.js";import{BaselineDeltaMountainRenderer as H}from"./index56.js";import{RenkoRenderer as E}from"./index57.js";import{KagiRenderer as B}from"./index58.js";import{LineBreakRenderer as z}from"./index59.js";import{PointFigureRenderer as V}from"./index60.js";import{isWebGLAvailable as $}from"./index61.js";import{CandlestickWebGLRenderer as W}from"./index62.js";import{LineWebGLRenderer as q}from"./index63.js";import{AreaWebGLRenderer as U}from"./index64.js";import{exportCSV as X,exportPDF as Y,exportSVG as G}from"./index65.js";import{SeriesApi as K}from"./index67.js";import{PaneApi as N}from"./index68.js";import{IndicatorApi as Z}from"./index69.js";import{COLORFUL_THEME as J,DARK_THEME as Q,DEFAULT_CHART_OPTIONS as ee,DEFAULT_INDICATOR_PARAMS as te,LIGHT_THEME as ie,OVERLAY_INDICATORS as se,mergeOptions as ne}from"./index70.js";import{computeSMA as ae}from"./index71.js";import{computeEMA as re}from"./index72.js";import{computeRSI as oe}from"./index73.js";import{computeHeikinAshi as le}from"./index74.js";import{computeMACD as he}from"./index75.js";import{computeBollinger as ce}from"./index76.js";import{computeVWAP as de}from"./index77.js";import{computeStochastic as pe}from"./index78.js";import{computeATR as _e}from"./index79.js";import{computeADX as ue}from"./index80.js";import{computeOBV as ge}from"./index81.js";import{computeWilliamsR as me}from"./index82.js";import{computeIchimoku as fe}from"./index84.js";import{computeParabolicSAR as be}from"./index85.js";import{computeKeltner as xe}from"./index86.js";import{computeDonchian as ve}from"./index87.js";import{computeCCI as ye}from"./index88.js";import{computePivotPoints as we}from"./index89.js";import{computeAroon as Ce}from"./index90.js";import{computeAwesomeOscillator as ke}from"./index91.js";import{computeChaikinMF as Se}from"./index92.js";import{computeCoppock as Me}from"./index93.js";import{computeElderForce as Pe}from"./index94.js";import{computeTRIX as Ie}from"./index95.js";import{computeSupertrend as Re}from"./index96.js";import{computeVWMA as Le}from"./index97.js";import{computeChoppiness as Te}from"./index98.js";import{computeMFI as Oe}from"./index99.js";import{computeROC as Ae}from"./index100.js";import{computeLinearRegression as De}from"./index101.js";import{createPriceFormatter as Fe}from"./index102.js";import{createTimeFormatter as je}from"./index104.js";import{formatVolume as He}from"./index105.js";var Ee=60,Be=28,ze=.3;function Ve(e,t){if(e<=0||t<=0)return 1;const i=e/t,s=Math.pow(10,Math.floor(Math.log10(i))),n=i/s;let a;return a=n<=1.5?1:n<=3.5?2:n<=7.5?5:10,a*s}var $e=class a{get _chartWidth(){const e=this._options.leftPriceScale.visible?Ee:0,t=this._options.rightPriceScale.visible?Ee:0;return this._width-e-t}get _mainPane(){return this._paneMap.get(this._mainPaneId)}constructor(n,a){this._paneMap=/* @__PURE__ */new Map,this._paneOrder=[],this._paneApis=/* @__PURE__ */new Map,this._dividers=[],this._panePointerCleanup=/* @__PURE__ */new Map,this._crosshairHandler=null,this._contextMenuHandler=null,this._series=[],this._rafId=null,this._resizeObserver=null,this._removed=!1,this._crosshairMoveCallbacks=[],this._clickCallbacks=[],this._dblClickCallbacks=[],this._visibleRangeChangeCallbacks=[],this._drawingEventCallbacks=[],this._indicatorEventCallbacks=[],this._resizeCallbacks=[],this._symbolChangeCallbacks=[],this._chartTypeChangeCallbacks=[],this._preferencesChangeCallbacks=[],this._layoutChangeCallbacks=[],this._lastVisibleRangeFrom=null,this._lastVisibleRangeTo=null,this._lastTooltipBarIdx=-1,this._tooltipWidth=140,this._tooltipHeight=80,this._huds=/* @__PURE__ */new Map,this._mainPaneId="main",this._nextPaneId=0,this._indicators=[],this._nextIndicatorId=0,this._comparisonMode=!1,this._basisPrices=/* @__PURE__ */new Map,this._drawings=[],this._drawingApis=/* @__PURE__ */new Map,this._drawingHandler=null,this._nextDrawingId=0,this._undoRedo=new d(50),this._handleUndoRedoKey=null,this._rangeSelectionHandler=null,this._measureHandler=null,this._alertLines=[],this._nextAlertLineId=0,this._textLabels=[],this._nextTextLabelId=0,this._periodicity={interval:1,unit:"day"},this._periodicityCallbacks=[],this._marketSessions=[],this._sessionFilter="all",this._lastBarAnims=/* @__PURE__ */new Map,this._useWebGL=!1,this._webglCandlestick=null,this._webglLine=null,this._webglArea=null,this._handleClick=e=>{if(0===this._clickCallbacks.length)return;const t=this._getClickState(e);for(const i of this._clickCallbacks)i(t)},this._handleDblClick=e=>{if(0===this._dblClickCallbacks.length)return;const t=this._getClickState(e);for(const i of this._dblClickCallbacks)i(t)},this._options=a,this._container=n,this._width=a.width,this._height=a.height,this._initFormatters(),this._wrapper=document.createElement("div"),this._wrapper.style.position="relative",this._wrapper.style.overflow="hidden",this._wrapper.style.width=`${this._width}px`,this._wrapper.style.height=`${this._height}px`,this._wrapper.style.backgroundColor=a.layout.backgroundColor,this._paneContainer=document.createElement("div"),this._paneContainer.style.display="flex",this._paneContainer.style.flexDirection="column",this._paneContainer.style.width="100%",this._useWebGL="webgl"===a.renderer&&$(),this._useWebGL&&(this._webglCandlestick=new W,this._webglLine=new q,this._webglArea=new U);const r=this._height-Be,l=new o(this._mainPaneId,r,this._useWebGL);a.rightPriceScale?.mode&&l.priceScale.setMode(a.rightPriceScale.mode),a.leftPriceScale?.mode&&l.leftPriceScale.setMode(a.leftPriceScale.mode),this._paneMap.set(this._mainPaneId,l),this._paneOrder.push(this._mainPaneId),this._paneContainer.appendChild(l.row),this._wrapper.appendChild(this._paneContainer),this._timeAxisCanvas=document.createElement("canvas"),this._timeAxisCanvas.style.position="absolute",this._timeAxisCanvas.style.left="0",this._timeAxisCanvas.style.zIndex="1",this._wrapper.appendChild(this._timeAxisCanvas),this._createHudForPane(this._mainPaneId,l),this._tooltipEl=document.createElement("div"),this._tooltipEl.style.cssText=`position:absolute;z-index:20;pointer-events:none;display:none;background:rgba(0,0,0,0.78);color:${a.layout.textColor};border-radius:4px;padding:6px 10px;font-size:${a.layout.fontSize}px;font-family:${a.layout.fontFamily};line-height:1.5;white-space:nowrap;`,this._tooltipDateEl=document.createElement("div"),this._tooltipDateEl.style.marginBottom="2px",this._tooltipDateEl.style.color="#999",this._tooltipOHEl=document.createElement("div"),this._tooltipLCEl=document.createElement("div"),this._tooltipVEl=document.createElement("div"),this._tooltipEl.appendChild(this._tooltipDateEl),this._tooltipEl.appendChild(this._tooltipOHEl),this._tooltipEl.appendChild(this._tooltipLCEl),this._tooltipEl.appendChild(this._tooltipVEl),this._wrapper.appendChild(this._tooltipEl),n.appendChild(this._wrapper),this._timeAxisCtx=this._timeAxisCanvas.getContext("2d"),this._layoutPanes(),this._timeScale=new t(a.timeScale);const h=a.leftPriceScale.visible?Ee:0,c=a.rightPriceScale.visible?Ee:0;this._timeScale.setWidth(this._width-h-c),this._crosshair=new i,this._mask=new s,this._mask.addPane(this._mainPaneId),this._eventRouter=new u,this._panZoomHandler=new g(this._timeScale,()=>this.requestRepaint(e.Full)),this._eventRouter.addHandler(this._panZoomHandler),this._eventRouter.attach(l.canvases.overlayCanvas),this._handleUndoRedoKey=e=>{(e.metaKey||e.ctrlKey)&&("z"!==e.key||e.shiftKey?("y"===e.key||"z"===e.key&&e.shiftKey||"Z"===e.key&&e.shiftKey)&&(e.preventDefault(),this.redo()):(e.preventDefault(),this.undo()))},l.canvases.overlayCanvas.addEventListener("keydown",this._handleUndoRedoKey),this._contextMenuHandler=new f({getDrawings:()=>this._drawings.filter(e=>e instanceof b).map(e=>({drawing:e,id:e.id})),getIndicatorAtPane:e=>{const t=this._indicators.find(t=>t.paneId()===e);return t?{id:`indicator-${t.id}`,label:t.label()}:null},getPaneAtY:e=>{let t=0;for(const i of this._paneOrder){const s=this._paneMap.get(i);if(e>=t&&e<t+s.height)return i;t+=s.height}return null},mainPaneId:this._mainPaneId,editDrawing:t=>{const i=this._drawings.find(e=>e instanceof b&&e.id===t);i&&(i.selected=!0,this.requestRepaint(e.Full))},removeDrawing:e=>{const t=this._drawingApis.get(e);t&&this.removeDrawing(t)},duplicateDrawing:e=>{const t=this._drawings.find(t=>t instanceof b&&t.id===e);if(!t)return;const i=t.serialize(),s=this._mainPane.priceScale.priceRange,n=.02*(s.max-s.min),a=i.points.map(e=>({time:e.time+1,price:e.price+n}));this._addDrawingByIndex(i.type,a,i.options)},bringDrawingToFront:t=>{const i=this._drawings.findIndex(e=>e instanceof b&&e.id===t);if(-1!==i&&i<this._drawings.length-1){const[t]=this._drawings.splice(i,1);this._drawings.push(t),this.requestRepaint(e.Full)}},sendDrawingToBack:t=>{const i=this._drawings.findIndex(e=>e instanceof b&&e.id===t);if(i>0){const[t]=this._drawings.splice(i,1);this._drawings.unshift(t),this.requestRepaint(e.Full)}},openIndicatorSettings:e=>{const t=this._indicators.find(t=>`indicator-${t.id}`===e);if(t){const i=this._huds.get(t.paneId());i&&i.triggerSettings?.(e)}},toggleIndicatorVisibility:t=>{const i=this._indicators.find(e=>`indicator-${e.id}`===t);if(i){const t=!i.isVisible();i.applyOptions({visible:t});for(const e of i.internalSeries)e.applyOptions({visible:t});this.requestRepaint(e.Full)}},removeIndicator:e=>{const t=this._indicators.find(t=>`indicator-${t.id}`===e);t&&this.removeIndicator(t)},fitContent:()=>{this._timeScale.fitContent(),this.requestRepaint(e.Full)},scrollToRealTime:()=>this.scrollToRealTime(),toggleCrosshair:()=>{this._crosshairHandler?(this._eventRouter.removeHandler(this._crosshairHandler),this._crosshairHandler=null,this._crosshair.hide()):this._series.length>0&&(this._crosshairHandler=new m(this._crosshair,this._series[0].api.getDataLayer(),this._timeScale,this._mainPane.priceScale,()=>this.requestRepaint(e.Cursor),this._mainPaneId),this._eventRouter.addHandler(this._crosshairHandler)),this.requestRepaint(e.Full)},theme:{bg:this._options.layout.backgroundColor,text:this._options.layout.textColor,border:"#131722"===this._options.layout.backgroundColor?"#2a2e39":"#e0e3eb"},localToScreen:(e,t)=>{const i=this._wrapper.getBoundingClientRect();return{x:i.left+e,y:i.top+t}}}),this._eventRouter.addHandler(this._contextMenuHandler),l.canvases.overlayCanvas.addEventListener("click",this._handleClick),l.canvases.overlayCanvas.addEventListener("dblclick",this._handleDblClick),a.autoSize&&(this._resizeObserver=new ResizeObserver(e=>{for(const t of e){const{width:e,height:i}=t.contentRect;e>0&&i>0&&this.resize(Math.round(e),Math.round(i))}}),this._resizeObserver.observe(n))}_initFormatters(){this._priceFormat=this._options.priceFormatter??Fe({locale:this._options.locale,decimals:2,currency:this._options.currency});const e=this._options.timeScale.tickMarkFormatter;this._timeFormat=e?(t,i,s)=>e(t,i):je({timezone:this._options.timezone,locale:this._options.locale})}_formatPrice(e){return this._priceFormat(e)}addSeries(e){const{type:t,...i}=e;return this._addSeries(t,i)}removeSeries(t){const i=this._series.findIndex(e=>e.api===t);if(-1!==i){const t=this._series[i],s=`series-${t.type}-${i}`,n=this._huds.get(t.paneId);n&&n.removeRow(s),this._series.splice(i,1),this._lastBarAnims.delete(t.api),0===i&&null!==this._crosshairHandler&&(this._eventRouter.removeHandler(this._crosshairHandler),this._crosshairHandler=null,this._series.length>0&&(this._crosshairHandler=new m(this._crosshair,this._series[0].api.getDataLayer(),this._timeScale,this._mainPane.priceScale,()=>this.requestRepaint(e.Cursor),this._mainPaneId),this._eventRouter.addHandler(this._crosshairHandler))),this.requestRepaint(e.Full)}}addPane(t){const i="pane-"+this._nextPaneId++,s=new o(i,t?.height??150,this._useWebGL);this._paneMap.set(i,s),this._paneOrder.push(i);const n=this._paneOrder[this._paneOrder.length-2],a=this._paneMap.get(n),r=new l(()=>a.height,e=>{a.height=e},()=>s.height,e=>{s.height=e},()=>this._layoutPanes());this._dividers.push(r),this._paneContainer.appendChild(r.el),this._paneContainer.appendChild(s.row),this._mask.addPane(i),this._createHudForPane(i,s);const h=new N(i,s,()=>this.requestRepaint(e.Full));this._paneApis.set(i,h),this._attachPanePointerListeners(i,s),this._layoutPanes(),this.requestRepaint(e.Full);for(const e of this._layoutChangeCallbacks)e({action:"pane-added",paneId:i});return h}removePane(t){const i=t.id;if(i===this._mainPaneId)return;const s=this._paneOrder.indexOf(i);if(-1===s)return;this._paneMap.get(i).row.remove();const n=s-1;if(n>=0&&n<this._dividers.length){const e=this._dividers[n];e.el.remove(),e.destroy(),this._dividers.splice(n,1)}this._paneMap.delete(i),this._paneOrder.splice(s,1),this._paneApis.delete(i),this._mask.removePane(i);const a=this._panePointerCleanup.get(i);a&&(a(),this._panePointerCleanup.delete(i)),this._crosshair.sourcePaneId===i&&(this._crosshair.hide(),this._crosshairHandler&&(this._crosshairHandler.setSourcePaneId(this._mainPaneId),this._crosshairHandler.setPriceScale(this._mainPane.priceScale)));const r=this._huds.get(i);r&&(r.destroy(),this._huds.delete(i)),this._series=this._series.filter(e=>e.paneId!==i),this._layoutPanes(),this.requestRepaint(e.Full);for(const e of this._layoutChangeCallbacks)e({action:"pane-removed",paneId:i})}_attachPanePointerListeners(e,t){const i=t.canvases.overlayCanvas;i.style.touchAction="none";const s=s=>{if(!this._crosshairHandler||0===this._series.length)return;const n=i.getBoundingClientRect(),a=s.clientX-n.left,r=s.clientY-n.top;this._crosshairHandler.setSourcePaneId(e),this._crosshairHandler.setPriceScale(t.priceScale),this._crosshairHandler.onPointerMove(a,r,s.pointerId)},n=()=>{this._crosshairHandler&&(this._crosshairHandler.setSourcePaneId(this._mainPaneId),this._crosshairHandler.setPriceScale(this._mainPane.priceScale),this._crosshairHandler.onPointerUp(0))};i.addEventListener("pointermove",s),i.addEventListener("pointerleave",n),this._panePointerCleanup.set(e,()=>{i.removeEventListener("pointermove",s),i.removeEventListener("pointerleave",n)})}timeScale(){return this._timeScale}priceScale(e){if(e){const t=this._paneMap.get(e);if(t)return t.priceScale;if("left"===e)return this._mainPane.leftPriceScale}return this._mainPane.priceScale}applyOptions(t){const i=this._options.symbol;if(this._options=ne(this._options,t),this._initFormatters(),void 0!==t.symbol&&t.symbol!==i)for(const e of this._symbolChangeCallbacks)e({previous:i??"",current:t.symbol??""});if(t.layout?.backgroundColor&&(this._wrapper.style.backgroundColor=this._options.layout.backgroundColor),t.timeScale&&this._timeScale.setOptions(this._options.timeScale),t.rightPriceScale?.mode)for(const e of this._paneMap.values())e.priceScale.setMode(this._options.rightPriceScale.mode??"linear");if(t.leftPriceScale?.mode)for(const e of this._paneMap.values())e.leftPriceScale.setMode(this._options.leftPriceScale.mode??"linear");void 0!==t.leftPriceScale||void 0!==t.rightPriceScale||void 0!==t.width||void 0!==t.height?this.resize(this._options.width,this._options.height):this.requestRepaint(e.Full);for(const e of this._preferencesChangeCallbacks)e(t)}options(){return{...this._options}}resize(t,i){this._width=t,this._height=i,this._wrapper.style.width=`${t}px`,this._wrapper.style.height=`${i}px`;const s=this._options.leftPriceScale.visible?Ee:0,n=this._options.rightPriceScale.visible?Ee:0;this._timeScale.setWidth(t-s-n),this._options.width=t,this._options.height=i,this._layoutPanes(),this.requestRepaint(e.Full);for(const e of this._resizeCallbacks)e({width:t,height:i})}remove(){if(!this._removed){this._removed=!0,null!==this._rafId&&(cancelAnimationFrame(this._rafId),this._rafId=null),this._resizeObserver?.disconnect(),this._eventRouter.detach(),this._panZoomHandler.destroy(),this._mainPane.canvases.overlayCanvas.removeEventListener("click",this._handleClick),this._mainPane.canvases.overlayCanvas.removeEventListener("dblclick",this._handleDblClick);for(const e of this._panePointerCleanup.values())e();this._panePointerCleanup.clear();for(const e of this._panePointerCleanup.values())e();this._panePointerCleanup.clear();for(const e of this._huds.values())e.destroy();this._huds.clear();for(const e of this._dividers)e.destroy();this._dividers.length=0,this._visibleRangeChangeCallbacks.length=0,this._crosshairMoveCallbacks.length=0,this._clickCallbacks.length=0,this._dblClickCallbacks.length=0,this._drawingEventCallbacks.length=0,this._indicatorEventCallbacks.length=0,this._resizeCallbacks.length=0,this._symbolChangeCallbacks.length=0,this._chartTypeChangeCallbacks.length=0,this._preferencesChangeCallbacks.length=0,this._layoutChangeCallbacks.length=0,this._handleUndoRedoKey&&this._mainPane.canvases.overlayCanvas.removeEventListener("keydown",this._handleUndoRedoKey),this._undoRedo.clear(),this._webglCandlestick?.dispose(),this._webglLine?.dispose(),this._webglArea?.dispose(),this._webglCandlestick=null,this._webglLine=null,this._webglArea=null,this._wrapper.remove()}}subscribeCrosshairMove(e){this._crosshairMoveCallbacks.push(e)}unsubscribeCrosshairMove(e){const t=this._crosshairMoveCallbacks.indexOf(e);-1!==t&&this._crosshairMoveCallbacks.splice(t,1)}subscribeClick(e){this._clickCallbacks.push(e)}unsubscribeClick(e){const t=this._clickCallbacks.indexOf(e);-1!==t&&this._clickCallbacks.splice(t,1)}subscribeDblClick(e){this._dblClickCallbacks.push(e)}unsubscribeDblClick(e){const t=this._dblClickCallbacks.indexOf(e);-1!==t&&this._dblClickCallbacks.splice(t,1)}subscribeDrawingEvent(e){this._drawingEventCallbacks.push(e)}unsubscribeDrawingEvent(e){const t=this._drawingEventCallbacks.indexOf(e);-1!==t&&this._drawingEventCallbacks.splice(t,1)}subscribeIndicatorEvent(e){this._indicatorEventCallbacks.push(e)}unsubscribeIndicatorEvent(e){const t=this._indicatorEventCallbacks.indexOf(e);-1!==t&&this._indicatorEventCallbacks.splice(t,1)}subscribeResize(e){this._resizeCallbacks.push(e)}unsubscribeResize(e){const t=this._resizeCallbacks.indexOf(e);-1!==t&&this._resizeCallbacks.splice(t,1)}subscribeSymbolChange(e){this._symbolChangeCallbacks.push(e)}unsubscribeSymbolChange(e){const t=this._symbolChangeCallbacks.indexOf(e);-1!==t&&this._symbolChangeCallbacks.splice(t,1)}subscribeChartTypeChange(e){this._chartTypeChangeCallbacks.push(e)}unsubscribeChartTypeChange(e){const t=this._chartTypeChangeCallbacks.indexOf(e);-1!==t&&this._chartTypeChangeCallbacks.splice(t,1)}subscribePreferencesChange(e){this._preferencesChangeCallbacks.push(e)}unsubscribePreferencesChange(e){const t=this._preferencesChangeCallbacks.indexOf(e);-1!==t&&this._preferencesChangeCallbacks.splice(t,1)}subscribeLayoutChange(e){this._layoutChangeCallbacks.push(e)}unsubscribeLayoutChange(e){const t=this._layoutChangeCallbacks.indexOf(e);-1!==t&&this._layoutChangeCallbacks.splice(t,1)}setVisibleRange(e,t){if(0===this._series.length)return;const i=this._series[0].api.getDataLayer();if(0===i.store.length)return;const s=i.findIndex(e),n=i.findIndex(t);this.setVisibleLogicalRange(s,n)}setVisibleLogicalRange(t,i){if(this._series.length>0){const e=this._series[0].api.getDataLayer().store;this._timeScale.setDataLength(e.length)}const s=i-t+1;if(s<=0)return;const n=this._chartWidth;if(n<=0)return;const a=n/s;this._timeScale.setOptions({barSpacing:a});const r=i-(this._timeScale.dataLength>0?this._timeScale.dataLength-1:0);this._timeScale.setRightOffset(r),this.requestRepaint(e.Full)}scrollToRealTime(){this._timeScale.scrollToEnd(),this.requestRepaint(e.Full)}fitContent(){this._timeScale.fitContent(),this.requestRepaint(e.Full)}takeScreenshot(){this._paint();const e=window.devicePixelRatio||1,t=Math.round(this._width*e),i=Math.round(this._height*e),s=document.createElement("canvas");s.width=t,s.height=i;const n=s.getContext("2d"),a=this._options.leftPriceScale.visible?Ee:0;this._options.rightPriceScale.visible;const r=this._chartWidth;let o=0;for(const l of this._paneOrder){const t=this._paneMap.get(l),i=Math.round(t.height*e),s=t.canvases;this._options.leftPriceScale.visible&&n.drawImage(s.leftPriceAxisCanvas,0,o),n.drawImage(s.chartCanvas,Math.round(a*e),o),n.drawImage(s.overlayCanvas,Math.round(a*e),o),this._options.rightPriceScale.visible&&n.drawImage(s.rightPriceAxisCanvas,Math.round((a+r)*e),o),o+=i,l!==this._paneOrder[this._paneOrder.length-1]&&(o+=Math.round(4*e))}return n.drawImage(this._timeAxisCanvas,Math.round(a*e),o),s}exportCSV(e){return X(this._series.filter(e=>e.api.isVisible()).map(e=>({label:e.api.options().label??"",store:e.api.getDataLayer().store})),this._indicators.filter(e=>e.isVisible()).map(e=>{const t=/* @__PURE__ */new Map;for(const i of e.internalSeries){const s=i.getDataLayer().store;t.set(i.options().label??e.indicatorType(),s.close)}return{label:e.indicatorType(),outputs:t}}),this._timeScale.visibleRange(),e)}exportSVG(){return G(this.takeScreenshot())}exportPDF(e){return Y(this.takeScreenshot(),e)}undo(){return this._undoRedo.undo()}redo(){return this._undoRedo.redo()}canUndo(){return this._undoRedo.canUndo()}canRedo(){return this._undoRedo.canRedo()}_ensureRangeSelectionHandler(){return this._rangeSelectionHandler||(this._rangeSelectionHandler=new _(this._timeScale,this._mainPane.priceScale,()=>this._series.length>0?this._series[0].api.getDataLayer().store:null,()=>this.requestRepaint(e.Light)),this._eventRouter.addHandler(this._rangeSelectionHandler)),this._rangeSelectionHandler}_ensureMeasureHandler(){return this._measureHandler||(this._measureHandler=new p(this._timeScale,this._mainPane.priceScale,()=>this._series.length>0?this._series[0].api.getDataLayer().store:null,()=>this.requestRepaint(e.Light)),this._eventRouter.addHandler(this._measureHandler)),this._measureHandler}setRangeSelectionActive(e){this._ensureRangeSelectionHandler().active=e,e&&this._measureHandler&&(this._measureHandler.active=!1)}onRangeSelected(e){this._ensureRangeSelectionHandler().onRangeSelected(e)}offRangeSelected(e){this._rangeSelectionHandler?.offRangeSelected(e)}setMeasureActive(e){this._ensureMeasureHandler().active=e,e&&this._rangeSelectionHandler&&(this._rangeSelectionHandler.active=!1)}onMeasure(e){this._ensureMeasureHandler().onMeasure(e)}offMeasure(e){this._measureHandler?.offMeasure(e)}addAlertLine(t,i){const s=new h("alert_"+this._nextAlertLineId++,{...i,price:t},()=>this.requestRepaint(e.Light));return this._alertLines.push(s),this.requestRepaint(e.Light),s}removeAlertLine(t){const i=this._alertLines.indexOf(t);i>=0&&(this._alertLines.splice(i,1),this.requestRepaint(e.Light))}getAlertLines(){return[...this._alertLines]}addTextLabel(t,i,s,n){const a=new c("textlabel_"+this._nextTextLabelId++,t,i,{text:s,...n},()=>this.requestRepaint(e.Light));return this._textLabels.push(a),this.requestRepaint(e.Light),a}removeTextLabel(t){const i=this._textLabels.indexOf(t);i>=0&&(this._textLabels.splice(i,1),this.requestRepaint(e.Light))}getTextLabels(){return[...this._textLabels]}addIndicator(e,t){const i="indicator-"+this._nextIndicatorId++,s={...te[e]??{},...t.params??{}};let n,a=null;t.paneId?n=t.paneId:se.has(e)?n=this._mainPaneId:(n=this.addPane({height:150}).id,a=n);const r=t.source,o=r.getDataLayer().store,l=this._computeIndicator(e,o,s),h=t.color??"#2962ff",c=t.lineWidth??2,d=t.colors,p=t.histogramUpColor??"rgba(34, 171, 148, 0.4)",_=t.histogramDownColor??"rgba(247, 82, 95, 0.4)",u=new Z(i,e,t,n,()=>{this.removeIndicator(u)});u.autoCreatedPaneId=a,this._createIndicatorSeries(u,l,o,n,h,c,d,p,_);const g=()=>{const t=r.getDataLayer().store,i=this._computeIndicator(e,t,s);for(const e of u.internalSeries)this.removeSeries(e);u.internalSeries=[],this._createIndicatorSeries(u,i,t,n,h,c,d,p,_)};u._dataChangedCallback=g,t.source.subscribeDataChanged(g),this._indicators.push(u),this._registerIndicatorHudRow(u,t);for(const m of this._indicatorEventCallbacks)m({type:"added",indicatorId:i,indicatorType:e,paneId:n});return u}removeIndicator(e){const t=e,i=this._indicators.indexOf(t);if(-1===i)return;const s=this._huds.get(t.paneId());s&&s.removeRow(`indicator-${t.id}`);for(const r of t.internalSeries)this.removeSeries(r);if(t.internalSeries=[],t.autoCreatedPaneId){const e=t.autoCreatedPaneId,s=this._series.some(t=>t.paneId===e),n=this._indicators.some((t,s)=>s!==i&&t.paneId()===e);if(!s&&!n){const t=this._paneApis.get(e);t&&this.removePane(t)}}t._dataChangedCallback&&(t.options().source.unsubscribeDataChanged(t._dataChangedCallback),t._dataChangedCallback=null);const n=t.indicatorType(),a=t.paneId();this._indicators.splice(i,1);for(const r of this._indicatorEventCallbacks)r({type:"removed",indicatorId:t.id,indicatorType:n,paneId:a})}_computeIndicator(e,t,i){const s=t.length,n=t.close,a=t.high,r=t.low,o=t.volume;switch(e){case"sma":return{value:ae(n,s,i.period)};case"ema":return{value:re(n,s,i.period)};case"rsi":return{value:oe(n,s,i.period)};case"macd":{const e=he(n,s,i.fastPeriod,i.slowPeriod,i.signalPeriod);return{macd:e.macd,signal:e.signal,histogram:e.histogram}}case"bollinger":{const e=ce(n,s,i.period,i.stdDev);return{upper:e.upper,middle:e.middle,lower:e.lower}}case"vwap":return{value:de(a,r,n,o,s)};case"stochastic":{const e=pe(a,r,n,s,i.kPeriod,i.dPeriod);return{k:e.k,d:e.d}}case"atr":return{value:_e(a,r,n,s,i.period)};case"adx":{const e=ue(a,r,n,s,i.period);return{adx:e.adx,plusDI:e.plusDI,minusDI:e.minusDI}}case"obv":return{value:ge(n,o,s)};case"williams-r":return{value:me(a,r,n,s,i.period)};case"ichimoku":{const e=fe(a,r,n,s,i.tenkanPeriod,i.kijunPeriod,i.senkouPeriod);return{tenkan:e.tenkan,kijun:e.kijun,senkouA:e.senkouA,senkouB:e.senkouB,chikou:e.chikou}}case"parabolic-sar":return{value:be(a,r,s,i.afStep,i.afMax)};case"keltner":{const e=xe(n,a,r,s,i.emaPeriod,i.atrPeriod,i.multiplier);return{upper:e.upper,middle:e.middle,lower:e.lower}}case"donchian":{const e=ve(a,r,s,i.period);return{upper:e.upper,middle:e.middle,lower:e.lower}}case"cci":return{value:ye(a,r,n,s,i.period)};case"pivot-points":{const e=we(a,r,n,s);return{pp:e.pp,r1:e.r1,r2:e.r2,r3:e.r3,s1:e.s1,s2:e.s2,s3:e.s3}}case"aroon":{const e=Ce(a,r,s,i.period??25);return{up:e.up,down:e.down}}case"awesome-oscillator":return{histogram:ke(a,r,s,i.fastPeriod??5,i.slowPeriod??34)};case"chaikin-mf":return{value:Se(a,r,n,o,s,i.period??20)};case"coppock":return{value:Me(n,s,i.wmaPeriod??10,i.longROC??14,i.shortROC??11)};case"elder-force":return{value:Pe(n,o,s,i.period??13)};case"trix":{const e=Ie(n,s,i.period??15,i.signalPeriod??9);return{trix:e.trix,signal:e.signal}}case"supertrend":return{value:Re(a,r,n,s,i.period??10,i.multiplier??3).value};case"vwma":return{value:Le(n,o,s,i.period??20)};case"choppiness":return{value:Te(a,r,n,s,i.period??14)};case"mfi":return{value:Oe(a,r,n,o,s,i.period??14)};case"roc":return{value:Ae(n,s,i.period??12)};case"linear-regression":return{value:De(n,s,i.period??20)};default:throw new Error(`Unknown indicator type: ${e}`)}}_createIndicatorSeries(e,t,i,s,n,a,r,o="rgba(34, 171, 148, 0.4)",l="rgba(247, 82, 95, 0.4)"){const h=e.indicatorType(),c=this._getIndicatorColorMap(h,n),d=r?{...c,...r}:c,p=Object.keys(t).sort((e,t)=>("histogram"===e?-1:0)-("histogram"===t?-1:0));for(const _ of p){const r=t[_],h=d[_]??n,c=[];for(let e=0;e<i.length;e++){const t=r[e];isNaN(t)||c.push({time:i.time[e],open:t,high:t,low:t,close:t,volume:0})}let p;p="histogram"===_?this._addSeries("histogram",{paneId:s,data:c,upColor:o,downColor:l},!0):this._addSeries("line",{paneId:s,data:c,color:h,lineWidth:a},!0),e.internalSeries.push(p)}}_getIndicatorColorMap(e,t){switch(e){case"macd":return{macd:"#2962ff",signal:"#ff6d00",histogram:"#22AB94"};case"bollinger":case"keltner":case"donchian":return{upper:"#42a5f5",middle:t,lower:"#42a5f5"};case"stochastic":return{k:t,d:"#ff6d00"};case"adx":return{adx:t,plusDI:"#22AB94",minusDI:"#F7525F"};case"ichimoku":return{tenkan:"#2962ff",kijun:"#F7525F",senkouA:"#22AB94",senkouB:"#ee6823",chikou:"#9c27b0"};case"pivot-points":return{pp:t,r1:"#F7525F",r2:"#F7525F",r3:"#F7525F",s1:"#22AB94",s2:"#22AB94",s3:"#22AB94"};case"aroon":return{up:"#22AB94",down:"#F7525F"};case"trix":return{trix:t,signal:"#ff6d00"};default:return{value:t}}}setComparisonMode(t){this._comparisonMode=t,this._basisPrices.clear();for(const e of this._paneMap.values())e.priceScale.setComparisonMode(t);this.requestRepaint(e.Full)}isComparisonMode(){return this._comparisonMode}addDrawing(e,t,i={}){let s=t;if(this._series.length>0){const e=this._series[0].api.getDataLayer();e.store.length>0&&(s=t.map(t=>({...t,time:e.findIndex(t.time)})))}return this._addDrawingByIndex(e,s,i)}_addDrawingByIndex(t,i,s={}){const n="drawing_"+this._nextDrawingId++,a=v(t,n,i,s);if(!a)throw new Error(`Unknown drawing type: ${t}`);a instanceof b&&a.setContext(this._getDrawingContext()),this._drawings.push(a);const r=new We(n,a,this);this._drawingApis.set(n,r),this.requestRepaint(e.Full);for(const e of this._drawingEventCallbacks)e({type:"created",drawingId:n,drawingType:t});return r}removeDrawing(t){const i=this._drawings.findIndex(e=>e instanceof b&&e.id===t.id);if(-1!==i){const s=t.drawingType();this._drawings.splice(i,1),this._drawingApis.delete(t.id),this.requestRepaint(e.Full);for(const e of this._drawingEventCallbacks)e({type:"removed",drawingId:t.id,drawingType:s})}}getDrawings(){return Array.from(this._drawingApis.values())}setActiveDrawingTool(e){this._ensureDrawingHandler(),this._drawingHandler.setActiveToolType(e)}registerDrawingType(e,t){x.set(e,t)}serializeDrawings(){return this._drawings.map(e=>e.serialize())}deserializeDrawings(t){this._drawings.length=0,this._drawingApis.clear();for(const e of t){const t=v(e.type,e.id,e.points,e.options);if(!t)continue;t instanceof b&&t.setContext(this._getDrawingContext()),this._drawings.push(t);const i=new We(e.id,t,this);this._drawingApis.set(e.id,i)}this.requestRepaint(e.Full)}exportState(){const e=this._series.map((e,t)=>({id:`series-${t}`,type:e.type,options:e.api.options()})),t=this._indicators.map(e=>{const t=e.options();return{type:e.indicatorType(),sourceSeriesId:"series-0",params:t.params??{},color:t.color}}),i=this._paneOrder.map(e=>({id:e,height:this._paneMap.get(e).height})),s=this._timeScale.visibleRange();let n;if(s){const e=this._series[0]?.api.getDataLayer().store;if(e&&e.length>0){const t=Math.max(0,Math.min(Math.floor(s.fromIdx),e.length-1)),i=Math.max(0,Math.min(Math.floor(s.toIdx),e.length-1));n={from:e.time[t],to:e.time[i]}}}return{version:1,options:this._options,comparisonMode:this._comparisonMode,timeScale:{barSpacing:this._timeScale.barSpacing,rightOffset:this._timeScale.rightOffset},series:e,indicators:t,panes:i,drawings:this.serializeDrawings(),visibleRange:n}}async importState(t,i){if(!r(t))throw new Error("Invalid chart state: failed validation");this.applyOptions(t.options),void 0!==t.comparisonMode&&this.setComparisonMode(t.comparisonMode),this._timeScale.setOptions({barSpacing:t.timeScale.barSpacing}),this._timeScale.setRightOffset(t.timeScale.rightOffset);for(const e of[...this._series])this.removeSeries(e.api);for(const e of[...this._indicators])this.removeIndicator(e);const s=/* @__PURE__ */new Map;for(const e of t.series){const t=this.addSeries({type:e.type,...e.options});s.set(e.id,t)}const n=t.series.map(async e=>{const t=s.get(e.id);if(!t)return;const n=await i(e.id);t.setData(n)});await Promise.all(n);for(const e of t.indicators){const t=s.get(e.sourceSeriesId);t&&this.addIndicator(e.type,{source:t,params:e.params,color:e.color})}t.drawings.length>0&&this.deserializeDrawings(t.drawings),t.visibleRange&&this.setVisibleRange(t.visibleRange.from,t.visibleRange.to),this.requestRepaint(e.Full)}setPeriodicity(t){this._periodicity=t;for(const e of this._periodicityCallbacks)e(t);this.requestRepaint(e.Full)}getPeriodicity(){return this._periodicity}subscribePeriodicityChange(e){this._periodicityCallbacks.push(e)}unsubscribePeriodicityChange(e){const t=this._periodicityCallbacks.indexOf(e);-1!==t&&this._periodicityCallbacks.splice(t,1)}setMarketSessions(t){this._marketSessions=t,this.requestRepaint(e.Full)}getMarketSessions(){return this._marketSessions}setSessionFilter(t){this._sessionFilter=t,this.requestRepaint(e.Full)}getSessionFilter(){return this._sessionFilter}_getDrawingContext(){const t=this._mainPane;return{timeScale:this._timeScale,priceScale:t.priceScale,chartWidth:this._chartWidth,chartHeight:t.height,requestUpdate:()=>this.requestRepaint(e.Full)}}_ensureDrawingHandler(){if(this._drawingHandler)return;const t=this;this._drawingHandler=new y({getDrawings:()=>t._drawings,getDrawingContext:()=>t._getDrawingContext(),onDrawingCreated(i){i instanceof b&&i.setContext(t._getDrawingContext()),t._drawings.push(i);const s=i.id,n=new We(s,i,t);t._drawingApis.set(s,n),t.requestRepaint(e.Full)},onDrawingUpdated(i){if(t.requestRepaint(e.Full),i&&i instanceof b)for(const e of t._drawingEventCallbacks)e({type:"modified",drawingId:i.id,drawingType:i.drawingType})},xToTime:e=>t._timeScale.xToIndex(e),yToPrice:e=>t._mainPane.priceScale.yToPrice(e)}),this._eventRouter.addHandler(this._drawingHandler)}_getBasisPrice(e,t){if(this._basisPrices.has(e.api))return this._basisPrices.get(e.api);const i=e.api.getDataLayer().store,s=Math.max(0,Math.min(t.fromIdx,i.length-1)),n=i.close[s]??0;return this._basisPrices.set(e.api,n),n}subscribeVisibleRangeChange(e){this._visibleRangeChangeCallbacks.push(e)}unsubscribeVisibleRangeChange(e){const t=this._visibleRangeChangeCallbacks.indexOf(e);-1!==t&&this._visibleRangeChangeCallbacks.splice(t,1)}requestRepaint(e){this._mask.invalidateAll(e),null!==this._rafId||this._removed||(this._rafId=requestAnimationFrame(()=>{this._rafId=null,this._paint()}))}_layoutPanes(){const e=window.devicePixelRatio||1,t=this._options.leftPriceScale.visible?Ee:0,i=this._options.rightPriceScale.visible,s=this._options.leftPriceScale.visible,n=this._chartWidth,a=4*this._dividers.length,r=this._height-Be-a;let o=0;for(const c of this._paneOrder)c!==this._mainPaneId&&(o+=this._paneMap.get(c).height);const l=Math.max(50,r-o);this._mainPane.height=l;for(const c of this._paneOrder)this._paneMap.get(c).layout(n,t,Ee,i,s,e);const h=this._height-Be;this._timeAxisCanvas.width=Math.round(n*e),this._timeAxisCanvas.height=Math.round(Be*e),this._timeAxisCanvas.style.width=`${n}px`,this._timeAxisCanvas.style.height="28px",this._timeAxisCanvas.style.left=`${t}px`,this._timeAxisCanvas.style.top=`${h}px`}_paint(){if(!this._removed){if(this._comparisonMode&&this._basisPrices.clear(),this._series.length>0){const e=this._series[0].api.getDataLayer().store;this._timeScale.setDataLength(e.length)}for(const t of this._paneOrder){const i=this._paneMap.get(t),s=this._mask.level(t),n=this._series.filter(e=>e.paneId===t);s>=e.Light&&(this._paintPane(i,n),this._paintPanePriceAxis(i,n),this._paintPaneLeftPriceAxis(i,n)),s>=e.Cursor&&(this._paintPaneOverlay(i),this._paintPanePriceAxis(i,n),this._paintPaneLeftPriceAxis(i,n))}if(this._paintTimeAxis(),this._emitCrosshairCallbacks(),this._updateHud(),this._updateTooltip(),this._visibleRangeChangeCallbacks.length>0&&this._emitVisibleRangeChange(),this._alertLines.length>0&&this._series.length>0){const e=this._series[0].api.getDataLayer().store;if(e.length>0){const t=e.close[e.length-1];for(const e of this._alertLines)e.checkCrossing(t)}}this._mask.reset(),this._isAnimating()&&this.requestRepaint(e.Light)}}_tickLastBarAnim(e,t,i){const s=this._lastBarAnims.get(e),n=t.open[i],a=t.high[i],r=t.low[i],o=t.close[i];if(!s||s.lastIdx!==i)return this._lastBarAnims.set(e,{lastIdx:i,open:n,high:a,low:r,close:o,animating:!1}),null;const l=5e-4*(Math.abs(a-r)||1),h=Math.abs(s.open-n),c=Math.abs(s.high-a),d=Math.abs(s.low-r),p=Math.abs(s.close-o);return h<l&&c<l&&d<l&&p<l?(s.open=n,s.high=a,s.low=r,s.close=o,s.animating=!1,s):(s.open+=(n-s.open)*ze,s.high+=(a-s.high)*ze,s.low+=(r-s.low)*ze,s.close+=(o-s.close)*ze,s.animating=!0,s)}_isAnimating(){for(const e of this._paneOrder){const t=this._paneMap.get(e);if(t.priceScale.isAnimating||t.leftPriceScale.isAnimating)return!0}for(const e of this._lastBarAnims.values())if(e.animating)return!0;return!1}_emitCrosshairCallbacks(){if(this._crosshair.visible){const e={x:this._crosshair.x,y:this._crosshair.y,barIndex:this._crosshair.barIndex,price:this._crosshair.price,time:this._crosshair.time,snappedX:this._crosshair.snappedX};for(const t of this._crosshairMoveCallbacks)t(e)}else for(const e of this._crosshairMoveCallbacks)e(null)}_emitVisibleRangeChange(){if(0===this._series.length){if(null!==this._lastVisibleRangeFrom||null!==this._lastVisibleRangeTo){this._lastVisibleRangeFrom=null,this._lastVisibleRangeTo=null;for(const e of this._visibleRangeChangeCallbacks)e(null)}return}const e=this._series[0].api.getDataLayer().store;if(0===e.length){if(null!==this._lastVisibleRangeFrom||null!==this._lastVisibleRangeTo){this._lastVisibleRangeFrom=null,this._lastVisibleRangeTo=null;for(const e of this._visibleRangeChangeCallbacks)e(null)}return}const t=this._timeScale.visibleRange(),i=e.time[Math.max(0,t.fromIdx)],s=e.time[Math.min(e.length-1,t.toIdx)];if(i!==this._lastVisibleRangeFrom||s!==this._lastVisibleRangeTo){this._lastVisibleRangeFrom=i,this._lastVisibleRangeTo=s;const e={from:i,to:s};for(const t of this._visibleRangeChangeCallbacks)t(e)}}_paintPane(e,t){const i=window.devicePixelRatio||1,s=e.canvases.chartCtx,n=this._chartWidth,a=e.height,r=e.id===this._mainPaneId;s.clearRect(0,0,Math.round(n*i),Math.round(a*i));const o=e.canvases.webglCtx??null;if(o&&(o.viewport(0,0,o.drawingBufferWidth,o.drawingBufferHeight),o.clearColor(0,0,0,0),o.clear(o.COLOR_BUFFER_BIT),o.enable(o.BLEND),o.blendFunc(o.SRC_ALPHA,o.ONE_MINUS_SRC_ALPHA)),0===t.length&&!r)return;const l=this._series.length>0?this._series[0]:null,h=l?l.api.getDataLayer().store:null;h&&this._timeScale.setDataLength(h.length);const c=this._timeScale.visibleRange();if((!h||c.fromIdx>c.toIdx||0===h.length)&&0===t.length)return;this._updatePaneDataRange(e,t,c),e.priceScale.tick(),e.leftPriceScale.tick(),r&&this._drawWatermark(s,n,a,i),r&&h&&this._drawGrid(s,n,a,c,h,e.priceScale,i),s.save(),s.beginPath(),s.rect(0,0,Math.round(n*i),Math.round(a*i)),s.clip();const d=this._createRenderTarget(e.canvases.chartCanvas,s,n,a,i),p=e=>this._timeScale.indexToX(e),_=t.find(e=>e.api.isVisible())??null,u=this._comparisonMode&&_?(()=>{const t=this._getBasisPrice(_,c);return i=>{const s=0===t?0:(i-t)/t*100;return e.priceScale.priceToY(s)}})():t=>e.priceScale.priceToY(t);r&&this._options.volume.visible&&this._drawVolumeOverlay(s,n,a,c,i);for(const g of t){if(!g.api.isVisible())continue;const t=g.api.getDataLayer().store,i=this._getEffectiveStore(g,t);let s;if(this._comparisonMode){const t=this._getBasisPrice(g,c);s=i=>{const s=0===t?0:(i-t)/t*100;return e.priceScale.priceToY(s)}}else s=t=>e.priceScale.priceToY(t);this._drawSeries(g,d,i,c,p,s)}if(r)for(const g of t){if(!g.api.isVisible())continue;const e=g.api.getMarkers();if(e.length>0){const t=g.api.getDataLayer();this._drawMarkers(s,e,t,c,p,u,i)}}if(r)for(const g of t){if(!g.api.isVisible())continue;const e=g.api.getPriceLines();e.length>0&&this._drawPriceLines(s,e,n,u,i)}if(r&&this._alertLines.length>0&&this._drawAlertLines(s,n,u,i),r&&this._textLabels.length>0)for(const g of this._textLabels)g.createPaneView(p,u).renderer()?.draw(d);if(r&&this._options.lastPriceLine.visible&&h&&h.length>0){const e=h.close[h.length-1],t=e>=h.open[h.length-1]?"#22AB94":"#F7525F",a=Math.round(u(e)*i);s.save(),s.strokeStyle=t,s.lineWidth=i,s.setLineDash([4*i,4*i]),s.beginPath(),s.moveTo(0,a),s.lineTo(Math.round(n*i),a),s.stroke(),s.restore()}s.restore(),s.save(),s.strokeStyle=this._options.grid.horzLinesColor,s.lineWidth=Math.max(1,Math.round(i)),s.beginPath(),s.moveTo(Math.round(n*i)-1,0),s.lineTo(Math.round(n*i)-1,Math.round(a*i)),s.stroke(),s.beginPath(),s.moveTo(0,Math.round(a*i)-1),s.lineTo(Math.round(n*i),Math.round(a*i)-1),s.stroke(),s.restore()}_drawSeries(e,t,i,s,n,r){const o=.8*this._timeScale.barSpacing,l=i.length-1;let h=null;if(l>=0&&l>=s.fromIdx&&l<=s.toIdx){const t=this._tickLastBarAnim(e.api,i,l);t&&t.animating&&(h={o:i.open[l],h:i.high[l],l:i.low[l],c:i.close[l]},i.open[l]=t.open,i.high[l]=t.high,i.low[l]=t.low,i.close[l]=t.close)}const c=this._paneMap.get(e.paneId)?.canvases.webglCtx??null;if(c&&this._useWebGL&&a._WEBGL_SUPPORTED_TYPES.has(e.type)){const a=t.pixelRatio,d=t.width,p=t.height;switch(e.type){case"candlestick":case"heikin-ashi":this._webglCandlestick.applyOptions(e.renderer.options()),this._webglCandlestick.draw(c,d,p,a,i,s,n,r,o);break;case"line":this._webglLine.applyOptions(e.renderer.options()),this._webglLine.draw(c,d,p,a,i,s,n,r);break;case"area":this._webglArea.applyOptions(e.renderer.options()),this._webglArea.draw(c,d,p,a,i,s,n,r)}return void(null!==h&&(i.open[l]=h.o,i.high[l]=h.h,i.low[l]=h.l,i.close[l]=h.c))}switch(e.type){case"candlestick":case"heikin-ashi":case"bar":case"hollow-candle":case"histogram":case"column":case"volume-candle":case"renko":case"kagi":case"line-break":case"point-figure":e.renderer.draw(t,i,s,n,r,o);break;case"line":case"area":case"baseline":case"step-line":case"colored-line":case"colored-mountain":case"hlc-area":case"high-low":case"baseline-delta-mountain":e.renderer.draw(t,i,s,n,r)}null!==h&&(i.open[l]=h.o,i.high[l]=h.h,i.low[l]=h.l,i.close[l]=h.c)}_paintPaneOverlay(e){const t=window.devicePixelRatio||1,i=e.canvases.overlayCtx,s=this._chartWidth,n=e.height,a=e.id===this._mainPaneId;if(i.clearRect(0,0,Math.round(s*t),Math.round(n*t)),a&&this._drawings.length>0){const a={canvas:e.canvases.overlayCanvas,context:i,width:Math.round(s*t),height:Math.round(n*t),pixelRatio:t};for(const e of this._drawings){const t=e.paneViews?.();if(t)for(const e of t)e.renderer()?.drawBackground?.(a)}for(const e of this._drawings){const t=e.paneViews?.();if(t)for(const e of t)e.renderer()?.draw(a)}}if(a&&this._rangeSelectionHandler?.selecting){const e=this._rangeSelectionHandler,s=Math.round(Math.min(e.startX,e.endX)*t),a=Math.round(Math.max(e.startX,e.endX)*t)-s;i.save(),i.fillStyle="rgba(33, 150, 243, 0.15)",i.fillRect(s,0,a,Math.round(n*t)),i.strokeStyle="rgba(33, 150, 243, 0.6)",i.lineWidth=t,i.setLineDash([]),i.strokeRect(s,0,a,Math.round(n*t)),i.restore()}if(a&&this._measureHandler?.firstPoint){const e=this._measureHandler,s=e.firstPoint,n=e.secondPoint??(e.hovering?{x:e.hoverX,y:e.hoverY}:null);if(n){const e=Math.round(s.x*t),a=Math.round(s.y*t),r=Math.round(n.x*t),o=Math.round(n.y*t);i.save(),i.strokeStyle="#FF9800",i.lineWidth=t,i.setLineDash([6*t,4*t]),i.beginPath(),i.moveTo(e,a),i.lineTo(r,o),i.stroke(),i.setLineDash([]),i.fillStyle="#FF9800";const l=3*t;i.beginPath(),i.arc(e,a,l,0,2*Math.PI),i.fill(),i.beginPath(),i.arc(r,o,l,0,2*Math.PI),i.fill(),i.restore()}}if(!this._crosshair.visible)return;const r=this._options.crosshair,o=Math.round(this._crosshair.snappedX*t);if(i.save(),i.strokeStyle=r.vertLineColor,i.lineWidth=r.vertLineWidth*t,i.setLineDash(r.vertLineDash.map(e=>e*t)),i.beginPath(),i.moveTo(o,0),i.lineTo(o,Math.round(n*t)),i.stroke(),i.restore(),e.id===this._crosshair.sourcePaneId){const e=Math.round(this._crosshair.y*t);i.save(),i.strokeStyle=r.horzLineColor,i.lineWidth=r.horzLineWidth*t,i.setLineDash(r.horzLineDash.map(e=>e*t)),i.beginPath(),i.moveTo(0,e),i.lineTo(Math.round(s*t),e),i.stroke(),i.restore()}}_drawGrid(e,t,i,s,n,a,r){const o=this._options.grid;if(e.save(),e.lineWidth=Math.max(1,Math.round(r)),o.horzLinesVisible){e.strokeStyle=o.horzLinesColor;const s=a.priceRange,n=Ve(s.max-s.min,Math.max(2,Math.floor(i/60)));for(let i=Math.ceil(s.min/n)*n;i<=s.max;i+=n){const s=Math.round(a.priceToY(i)*r);e.beginPath(),e.moveTo(0,s),e.lineTo(Math.round(t*r),s),e.stroke()}}if(o.vertLinesVisible&&n.length>0){e.strokeStyle=o.vertLinesColor;const n=s.toIdx-s.fromIdx+1,a=Math.max(2,Math.floor(t/100)),l=Math.max(1,Math.round(n/a));for(let t=s.fromIdx;t<=s.toIdx;t+=l){const s=Math.round(this._timeScale.indexToX(t)*r);e.beginPath(),e.moveTo(s,0),e.lineTo(s,Math.round(i*r)),e.stroke()}}e.restore()}_paintPanePriceAxis(e,t){const i=window.devicePixelRatio||1,s=e.canvases.rightPriceAxisCtx,n=e.height,a=e.id===this._mainPaneId;s.clearRect(0,0,Math.round(60*i),Math.round(n*i));const r=this._options.layout,o=e.priceScale.priceRange,l=Ve(o.max-o.min,Math.max(2,Math.floor(n/60))),h=this._comparisonMode?e=>`${e>0?"+":""}${e.toFixed(1)}%`:e=>this._formatPrice(e);s.save(),s.font=`${Math.round(r.fontSize*i)}px ${r.fontFamily}`,s.textAlign="right",s.textBaseline="middle";const c=Math.round(60*i),d=Math.round(6*i),p=Math.round(1.6*r.fontSize*i);for(let _=Math.ceil(o.min/l)*l;_<=o.max;_+=l){const t=Math.round(e.priceScale.priceToY(_)*i);if(t<p/2||t>Math.round(n*i)-p/2)continue;const a=h(_);s.fillStyle=this._options.layout.backgroundColor,s.fillRect(0,t-p/2,c,p),s.fillStyle=r.textColor,s.fillText(a,c-d,t)}if(s.strokeStyle=this._options.grid.horzLinesColor,s.lineWidth=Math.max(1,Math.round(i)),s.beginPath(),s.moveTo(0,0),s.lineTo(0,Math.round(n*i)),s.stroke(),a&&this._options.lastPriceLine.visible&&this._series.length>0){const t=this._series[0],n=t.api.getDataLayer().store;if(n.length>0){const a=n.close[n.length-1],o=a>=n.open[n.length-1]?"#22AB94":"#F7525F";let l,p;if(this._comparisonMode){const s=this._timeScale.visibleRange(),n=this._getBasisPrice(t,s),r=0===n?0:(a-n)/n*100;l=Math.round(e.priceScale.priceToY(r)*i),p=h(r)}else l=Math.round(e.priceScale.priceToY(a)*i),p=this._formatPrice(a);const _=Math.round(1.8*r.fontSize*i);s.fillStyle=o,s.fillRect(0,l-_/2,c,_),s.fillStyle="#ffffff",s.font=`bold ${Math.round(r.fontSize*i)}px ${r.fontFamily}`,s.textAlign="right",s.textBaseline="middle",s.fillText(p,c-d,l)}}if(a)for(const _ of t)if(_.api.isVisible())for(const t of _.api.getPriceLines()){if(!t.options.axisLabelVisible)continue;const a=Math.round(e.priceScale.priceToY(t.options.price)*i);if(a<p/2||a>Math.round(n*i)-p/2)continue;const o=h(t.options.price),l=Math.round(1.8*r.fontSize*i);s.fillStyle=t.options.axisLabelColor??t.options.color,s.fillRect(0,a-l/2,c,l),s.fillStyle=t.options.axisLabelTextColor??"#ffffff",s.font=`bold ${Math.round(r.fontSize*i)}px ${r.fontFamily}`,s.textAlign="right",s.textBaseline="middle",s.fillText(o,c-d,a)}if(e.id===this._crosshair.sourcePaneId&&this._crosshair.visible){const e=Math.round(this._crosshair.y*i);let t;if(this._comparisonMode&&this._series.length>0){const e=this._series[0],i=this._timeScale.visibleRange(),s=this._getBasisPrice(e,i);t=h(0===s?0:(this._crosshair.price-s)/s*100)}else t=this._formatPrice(this._crosshair.price);const n=Math.round(1.8*r.fontSize*i);s.fillStyle=this._options.crosshair.horzLineColor,s.fillRect(0,e-n/2,c,n),s.fillStyle="#ffffff",s.textAlign="right",s.textBaseline="middle",s.fillText(t,c-d,e)}s.restore()}_getTickType(e){if(e.length<2)return"day";const t=e.time[1]-e.time[0];return t<86400?"time":t<2419200?"day":t<31536e3?"month":"year"}_paintTimeAxis(){const e=window.devicePixelRatio||1,t=this._timeAxisCtx,i=this._chartWidth;if(t.clearRect(0,0,Math.round(i*e),Math.round(Be*e)),0===this._series.length)return;const s=this._series[0].api.getDataLayer().store;if(0===s.length)return;this._timeScale.setDataLength(s.length);const n=this._timeScale.visibleRange();if(n.fromIdx>n.toIdx)return;const a=this._options.layout,r=n.toIdx-n.fromIdx+1,o=Math.max(2,Math.floor(i/100)),l=Math.max(1,Math.round(r/o));t.save(),t.font=`${Math.round(a.fontSize*e)}px ${a.fontFamily}`,t.textAlign="center",t.textBaseline="top",t.fillStyle=a.textColor;const h=Math.round(8*e),c=this._getTickType(s);for(let d=n.fromIdx;d<=n.toIdx&&!(d>=s.length);d+=l){const n=Math.round(this._timeScale.indexToX(d)*e);if(n<0||n>Math.round(i*e))continue;const a=s.time[d],r=this._timeFormat(a,c);t.fillText(r,n,h)}if(t.strokeStyle=this._options.grid.horzLinesColor,t.lineWidth=Math.max(1,Math.round(e)),t.beginPath(),t.moveTo(0,0),t.lineTo(Math.round(i*e),0),t.stroke(),this._crosshair.visible&&this._series.length>0){const i=this._series[0].api.getDataLayer().store;if(i.length>0&&this._crosshair.barIndex>=0&&this._crosshair.barIndex<i.length){const s=Math.round(this._crosshair.snappedX*e),n=i.time[this._crosshair.barIndex],r=this._getTickType(i),o=this._timeFormat(n,r,!0),l=Math.round(1.8*a.fontSize*e),h=Math.round(50*e);t.fillStyle=this._options.crosshair.vertLineColor,t.fillRect(s-h/2,0,h,l),t.fillStyle="#ffffff",t.textAlign="center",t.textBaseline="top",t.fillText(o,s,Math.round(2*e))}}t.restore()}_updatePaneDataRange(e,t,i){let s=1/0,n=-1/0,a=1/0,r=-1/0;for(const o of t){if(!o.api.isVisible())continue;const e=o.api.getDataLayer(),t=e.store,l=this._getEffectiveStore(o,t),h=Math.min(i.toIdx,l.length-1),c="left"===o.api.options().priceScaleId;if(this._comparisonMode){const e=this._getBasisPrice(o,i);for(let t=i.fromIdx;t<=h;t++){const i=0===e?0:(l.low[t]-e)/e*100,o=0===e?0:(l.high[t]-e)/e*100;c?(i<a&&(a=i),o>r&&(r=o)):(i<s&&(s=i),o>n&&(n=o))}}else if(l===t&&e.segmentTree.length===l.length){const{min:t,max:o}=e.queryMinMax(i.fromIdx,h);c?(t<a&&(a=t),o>r&&(r=o)):(t<s&&(s=t),o>n&&(n=o))}else for(let o=i.fromIdx;o<=h;o++){const e=l.low[o],t=l.high[o];c?(e<a&&(a=e),t>r&&(r=t)):(e<s&&(s=e),t>n&&(n=t))}}s<1/0&&n>-1/0&&e.priceScale.autoScale(s,n),a<1/0&&r>-1/0&&e.leftPriceScale.autoScale(a,r)}_drawWatermark(e,t,i,s){const n=this._options.watermark;if(!n.visible||!n.text)return;let a,r;e.save(),e.font=`bold ${Math.round(n.fontSize*s)}px ${this._options.layout.fontFamily}`,e.fillStyle=n.color,"left"===n.horzAlign?(e.textAlign="left",a=Math.round(20*s)):"right"===n.horzAlign?(e.textAlign="right",a=Math.round((t-20)*s)):(e.textAlign="center",a=Math.round(t/2*s)),"top"===n.vertAlign?(e.textBaseline="top",r=Math.round(20*s)):"bottom"===n.vertAlign?(e.textBaseline="bottom",r=Math.round((i-20)*s)):(e.textBaseline="middle",r=Math.round(i/2*s)),e.fillText(n.text,a,r),e.restore()}_drawVolumeOverlay(e,t,i,s,n){const a=this._options.volume,r=this._series[0].api.getDataLayer().store;if(!r.volume)return;const o=Math.min(s.toIdx,r.length-1);if(o<s.fromIdx)return;let l=0;for(let u=s.fromIdx;u<=o;u++){const e=r.volume[u];e>l&&(l=e)}if(0===l)return;const h=Math.round(a.scaleMarginTop*i*n),c=Math.round(i*n),d=c-h,p=.8*this._timeScale.barSpacing,_=Math.max(1,Math.round(p*n/2));e.save();for(let u=s.fromIdx;u<=o;u++){const t=r.volume[u];if(0===t)continue;e.fillStyle=r.close[u]>=r.open[u]?a.upColor:a.downColor;const i=Math.round(this._timeScale.indexToX(u)*n),s=Math.max(1,Math.round(t/l*d)),o=c-s;e.fillRect(i-_,o,2*_,s)}e.restore()}_drawMarkers(e,t,i,s,n,a,r){const o=i.store;if(0===o.length)return;e.save();const l=this._options.layout;for(const h of t){const t=i.findIndex(h.time);if(t<s.fromIdx||t>s.toIdx)continue;if(t>=o.length)continue;const c=Math.round(n(t)*r),d=8*(h.size??1)*r,p=d+4*r;let _;switch(_="aboveBar"===h.position?Math.round(a(o.high[t])*r)-p:"belowBar"===h.position?Math.round(a(o.low[t])*r)+p:Math.round(a(o.close[t])*r),e.fillStyle=h.color,h.shape){case"circle":e.beginPath(),e.arc(c,_,d,0,2*Math.PI),e.fill();break;case"square":e.fillRect(c-d,_-d,2*d,2*d);break;case"arrowUp":e.beginPath(),e.moveTo(c,_-d),e.lineTo(c-d,_+d),e.lineTo(c+d,_+d),e.closePath(),e.fill();break;case"arrowDown":e.beginPath(),e.moveTo(c,_+d),e.lineTo(c-d,_-d),e.lineTo(c+d,_-d),e.closePath(),e.fill()}if(h.text){e.fillStyle=h.color,e.font=`${Math.round(10*r)}px ${l.fontFamily}`,e.textAlign="center",e.textBaseline="belowBar"===h.position?"top":"bottom";const t="belowBar"===h.position?_+d+2*r:_-d-2*r;e.fillText(h.text,c,t)}}e.restore()}_drawPriceLines(e,t,i,s,n){e.save();for(const a of t){const t=Math.round(s(a.options.price)*n);switch(e.strokeStyle=a.options.color,e.lineWidth=a.options.lineWidth*n,a.options.lineStyle){case"dashed":e.setLineDash([6*n,4*n]);break;case"dotted":e.setLineDash([2*n,2*n]);break;default:e.setLineDash([])}e.beginPath(),e.moveTo(0,t),e.lineTo(Math.round(i*n),t),e.stroke(),a.options.title&&(e.fillStyle=a.options.color,e.font=`${Math.round(10*n)}px ${this._options.layout.fontFamily}`,e.textAlign="left",e.textBaseline="bottom",e.fillText(a.options.title,Math.round(4*n),t-Math.round(2*n)))}e.setLineDash([]),e.restore()}_drawAlertLines(e,t,i,s){e.save();const n=this._options.layout.fontFamily;for(const a of this._alertLines){const r=a.options,o=Math.round(i(r.price)*s);switch(e.globalAlpha=r.armed?1:.4,e.strokeStyle=r.color,e.lineWidth=r.lineWidth*s,r.lineStyle){case"dashed":e.setLineDash([6*s,4*s]);break;case"dotted":e.setLineDash([2*s,2*s]);break;default:e.setLineDash([])}e.beginPath(),e.moveTo(0,o),e.lineTo(Math.round(t*s),o),e.stroke();const l=Math.round(10*s),h=Math.round(t*s)-Math.round(16*s);e.font=`${l}px ${n}`,e.fillStyle=r.color,e.textAlign="right",e.textBaseline="middle",e.fillText("🔔",h,o),r.title&&(e.font=`${Math.round(10*s)}px ${n}`,e.textAlign="left",e.textBaseline="bottom",e.fillText(r.title,Math.round(4*s),o-Math.round(2*s)))}e.globalAlpha=1,e.setLineDash([]),e.restore()}_updateTooltip(){if(!this._options.tooltip.enabled||0===this._series.length)return void(this._tooltipEl.style.display="none");if(!this._crosshair.visible)return void(this._tooltipEl.style.display="none");const e=this._series[0],t=e.api.getDataLayer().store,i=this._getEffectiveStore(e,t),s=this._crosshair.barIndex;if(s<0||s>=i.length)return void(this._tooltipEl.style.display="none");if(s!==this._lastTooltipBarIdx){this._lastTooltipBarIdx=s;const e=i.open[s],n=i.high[s],a=i.low[s],r=i.close[s],o=t.volume?t.volume[s]:0,l=i.time[s],h=this._getTickType(i),c=this._timeFormat(l,h,!0),d=r>=e?"#22AB94":"#F7525F";this._tooltipDateEl.textContent=c,this._tooltipOHEl.textContent=`O ${this._formatPrice(e)} H ${this._formatPrice(n)}`,this._tooltipOHEl.style.color=d,this._tooltipLCEl.textContent=`L ${this._formatPrice(a)} C ${this._formatPrice(r)}`,this._tooltipLCEl.style.color=d,this._tooltipVEl.textContent=`V ${He(o,this._options.locale)}`,this._tooltipVEl.style.color="#999",this._tooltipWidth=this._tooltipEl.offsetWidth||140,this._tooltipHeight=this._tooltipEl.offsetHeight||80}const n=this._chartWidth,a=this._mainPane.height,r=this._crosshair.snappedX,o=this._crosshair.y,l=this._tooltipWidth,h=this._tooltipHeight;let c=r+16,d=o-h-8;c+l>n&&(c=r-l-16),c<0&&(c=4),d<0&&(d=o+16),d+h>a&&(d=a-h-4),this._tooltipEl.style.left=`${Math.round(c)}px`,this._tooltipEl.style.top=`${Math.round(d)}px`,this._tooltipEl.style.display="block"}_createHudForPane(e,t){const i=new w(t.row,{bg:this._options.layout.backgroundColor,text:this._options.layout.textColor,border:this._options.grid.horzLinesColor,fontFamily:this._options.layout.fontFamily});this._huds.set(e,i),e===this._mainPaneId&&(i.onGlobalCollapseToggle=()=>{const e=i.isGlobalCollapsed;for(const[t,i]of this._huds)t!==this._mainPaneId&&i.setGlobalCollapsed(e)})}_getCrosshairBarIndex(){if(0===this._series.length)return-1;const e=this._series[0].api.getDataLayer().store;return 0===e.length?-1:this._crosshair.visible&&this._crosshair.barIndex>=0&&this._crosshair.barIndex<e.length?this._crosshair.barIndex:e.length-1}_updateHud(){const e=this._getCrosshairBarIndex();for(const t of this._huds.values())t.updateValues(e)}_getSeriesColor(e,t){switch(e){case"candlestick":case"bar":case"hollow-candle":case"histogram":return t.upColor??"#22AB94";case"line":return t.color??"#2196F3";case"area":return t.lineColor??"#2196F3";case"baseline":return t.topLineColor??"#22AB94";default:return"#2196F3"}}_getSeriesValues(e,t){const i=e.getDataLayer().store;if(t<0||t>=i.length)return"";const s=e.seriesType();if("candlestick"===s||"bar"===s||"hollow-candle"===s||"heikin-ashi"===s){const s=this._series.find(t=>t.api===e),n=s?this._getEffectiveStore(s,i):i,a=n.open[t],r=n.high[t],o=n.low[t],l=n.close[t],h=i.volume?i.volume[t]:0;return`O ${this._formatPrice(a)} H ${this._formatPrice(r)} L ${this._formatPrice(o)} C ${this._formatPrice(l)} V ${He(h,this._options.locale)}`}const n=i.close[t];return this._formatPrice(n)}_getIndicatorValues(e,t){const i=[];for(const s of e.internalSeries){const e=s.getDataLayer().store;if(t>=0&&t<e.length){const s=e.close[t];isNaN(s)||i.push(this._formatPrice(s))}}return i.join(" ")}_getSeriesSettingsFields(e,t){const i=[];switch(e){case"candlestick":case"bar":case"hollow-candle":case"histogram":i.push({key:"upColor",label:"Up Color",type:"color",value:t.upColor??"#22AB94"}),i.push({key:"downColor",label:"Down Color",type:"color",value:t.downColor??"#F7525F"});break;case"line":i.push({key:"color",label:"Color",type:"color",value:t.color??"#2196F3"}),i.push({key:"lineWidth",label:"Width",type:"number",value:t.lineWidth??2,min:1,max:5,step:1});break;case"area":i.push({key:"lineColor",label:"Line Color",type:"color",value:t.lineColor??"#2196F3"}),i.push({key:"topColor",label:"Top Color",type:"color",value:t.topColor??"rgba(33,150,243,0.4)"}),i.push({key:"bottomColor",label:"Bottom Color",type:"color",value:t.bottomColor??"rgba(33,150,243,0)"});break;case"baseline":i.push({key:"topLineColor",label:"Top Color",type:"color",value:t.topLineColor??"#22AB94"}),i.push({key:"bottomLineColor",label:"Bottom Color",type:"color",value:t.bottomLineColor??"#F7525F"}),i.push({key:"basePrice",label:"Base Price",type:"number",value:t.basePrice??0,step:.01})}return i}_getIndicatorSettingsFields(e){const t=[],i=e.options();t.push({key:"color",label:"Color",type:"color",value:i.color??"#2962ff"});const s=i.params??{};for(const[n,a]of Object.entries(s))t.push({key:n,label:n,type:"number",value:a,min:1,step:1});return t}_registerSeriesHudRow(e,t,i,s,n){const a=this._huds.get(s);if(!a)return;const r=`series-${t}-${n}`;a.addRow({id:r,label:i.label||this._options.symbol||"Symbol",color:this._getSeriesColor(t,i),getValues:t=>this._getSeriesValues(e,t),onToggleVisible:()=>{const t=!e.isVisible();return e.applyOptions({visible:t}),t},onRemove:()=>{this.removeSeries(e)},getSettingsFields:()=>this._getSeriesSettingsFields(t,e.options()),onSettingsApply:t=>{e.applyOptions(t)}})}_registerIndicatorHudRow(e,t){const i=this._huds.get(e.paneId());i&&i.addRow({id:`indicator-${e.id}`,label:e.label(),color:t.color??"#2962ff",getValues:t=>this._getIndicatorValues(e,t),onToggleVisible:()=>{const t=!e.isVisible();e.applyOptions({visible:t});for(const i of e.internalSeries)i.applyOptions({visible:t});return t},onRemove:()=>{this.removeIndicator(e)},getSettingsFields:()=>this._getIndicatorSettingsFields(e),onSettingsApply:t=>{const{color:i,...s}=t;if(void 0!==i&&e.applyOptions({color:i}),Object.keys(s).length>0){const t={};for(const[e,i]of Object.entries(s))t[e]=i;e.applyOptions({params:t})}}})}_paintPaneLeftPriceAxis(e,t){if(!this._options.leftPriceScale.visible)return;const i=window.devicePixelRatio||1,s=e.canvases.leftPriceAxisCtx,n=e.height,a=Ee;e.id,this._mainPaneId,s.clearRect(0,0,Math.round(a*i),Math.round(n*i));const r=e.leftPriceScale.priceRange;r.min===r.max&&e.leftPriceScale.autoScale(e.priceScale.priceRange.min,e.priceScale.priceRange.max);const o=this._options.layout,l=e.leftPriceScale.priceRange,h=Ve(l.max-l.min,Math.max(2,Math.floor(n/60)));s.save(),s.font=`${Math.round(o.fontSize*i)}px ${o.fontFamily}`,s.textAlign="left",s.textBaseline="middle";const c=Math.round(6*i),d=Math.round(1.6*o.fontSize*i);for(let p=Math.ceil(l.min/h)*h;p<=l.max;p+=h){const t=Math.round(e.leftPriceScale.priceToY(p)*i);if(t<d/2||t>Math.round(n*i)-d/2)continue;const r=this._formatPrice(p);s.fillStyle=o.backgroundColor,s.fillRect(0,t-d/2,Math.round(a*i),d),s.fillStyle=o.textColor,s.fillText(r,c,t)}if(s.strokeStyle=this._options.grid.horzLinesColor,s.lineWidth=Math.max(1,Math.round(i)),s.beginPath(),s.moveTo(Math.round(a*i)-1,0),s.lineTo(Math.round(a*i)-1,Math.round(n*i)),s.stroke(),e.id===this._crosshair.sourcePaneId&&this._crosshair.visible){const e=Math.round(this._crosshair.y*i),t=this._formatPrice(this._crosshair.price),n=Math.round(1.8*o.fontSize*i);s.fillStyle=this._options.crosshair.horzLineColor,s.fillRect(0,e-n/2,Math.round(a*i),n),s.fillStyle="#ffffff",s.textAlign="left",s.textBaseline="middle",s.fillText(t,c,e)}s.restore()}_createRenderTarget(e,t,i,s,n){return{canvas:e,context:t,width:i,height:s,pixelRatio:n}}_addSeries(t,i,s=!1){const a=new n,r=i??{},o=r.paneId??this._mainPaneId,l=this._paneMap.get(o);if(!l)throw new Error(`Pane "${o}" not found. Create it first with addPane().`);const h=this._createRenderer(t,r),c=new K(t,a,l.priceScale,r,()=>this.requestRepaint(e.Full));if(this._series.push({api:c,renderer:h,type:t,paneId:o}),s||this._registerSeriesHudRow(c,t,r,o,this._series.length-1),1===this._series.length&&null===this._crosshairHandler&&(this._crosshairHandler=new m(this._crosshair,a,this._timeScale,this._mainPane.priceScale,()=>this.requestRepaint(e.Cursor),this._mainPaneId),this._eventRouter.addHandler(this._crosshairHandler)),this.requestRepaint(e.Full),!s)for(const e of this._chartTypeChangeCallbacks)e({seriesType:t});return c}_getEffectiveStore(e,t){if("heikin-ashi"!==e.type)return t;const i=e._haCache;if(i&&i.length===t.length)return i.store;const s=le(t);return e._haCache={length:t.length,store:s},s}_createRenderer(e,t){const{data:i,priceScaleId:s,visible:n,paneId:a,label:r,...o}=t;switch(e){case"candlestick":case"heikin-ashi":{const e=new C;return Object.keys(o).length>0&&e.applyOptions(o),e}case"line":{const e=new k;return Object.keys(o).length>0&&e.applyOptions(o),e}case"area":{const e=new S;return Object.keys(o).length>0&&e.applyOptions(o),e}case"bar":{const e=new M;return Object.keys(o).length>0&&e.applyOptions(o),e}case"baseline":{const e=new P;return Object.keys(o).length>0&&e.applyOptions(o),e}case"hollow-candle":{const e=new I;return Object.keys(o).length>0&&e.applyOptions(o),e}case"histogram":{const e=new R;return Object.keys(o).length>0&&e.applyOptions(o),e}case"step-line":{const e=new L;return Object.keys(o).length>0&&e.applyOptions(o),e}case"colored-line":{const e=new T;return Object.keys(o).length>0&&e.applyOptions(o),e}case"colored-mountain":{const e=new O;return Object.keys(o).length>0&&e.applyOptions(o),e}case"hlc-area":{const e=new A;return Object.keys(o).length>0&&e.applyOptions(o),e}case"high-low":{const e=new D;return Object.keys(o).length>0&&e.applyOptions(o),e}case"column":{const e=new F;return Object.keys(o).length>0&&e.applyOptions(o),e}case"volume-candle":{const e=new j;return Object.keys(o).length>0&&e.applyOptions(o),e}case"baseline-delta-mountain":{const e=new H;return Object.keys(o).length>0&&e.applyOptions(o),e}case"renko":{const e=new E;return Object.keys(o).length>0&&e.applyOptions(o),e}case"kagi":{const e=new B;return Object.keys(o).length>0&&e.applyOptions(o),e}case"line-break":{const e=new z;return Object.keys(o).length>0&&e.applyOptions(o),e}case"point-figure":{const e=new V;return Object.keys(o).length>0&&e.applyOptions(o),e}default:throw new Error(`Unknown series type: ${e}`)}}_getClickState(e){const t=this._mainPane.canvases.overlayCanvas.getBoundingClientRect(),i=e.clientX-t.left,s=e.clientY-t.top,n=this._mainPane.priceScale.yToPrice(s);let a=0;if(this._series.length>0){const e=this._series[0].api.getDataLayer().store;if(e.length>0){const t=Math.max(0,Math.min(e.length-1,this._timeScale.xToIndex(i)));a=e.time[t]}}return{x:i,y:s,time:a,price:n}}};$e._WEBGL_SUPPORTED_TYPES=new Set(["candlestick","heikin-ashi","line","area"]);var We=class{constructor(e,t,i){this.id=e,this._drawing=t,this._chart=i}drawingType(){return this._drawing.drawingType}points(){return this._drawing.points.map(e=>({...e}))}applyOptions(t){Object.assign(this._drawing.options,t),this._chart.requestRepaint(e.Full)}options(){return{...this._drawing.options}}remove(){this._chart.removeDrawing(this)}};function qe(e,t){let i;if(t){const e=t.theme;i=ne("light"===e?ne(ee,ie):"dark"===e?ne(ee,Q):"colorful"===e?ne(ee,J):ee,t)}else i={...ee};return new $e(e,i)}export{qe as createChart};
2
+ //# sourceMappingURL=index106.js.map