@devexperts/dxcharts-lite 1.0.2 → 2.0.1

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 (258) hide show
  1. package/README.md +2 -2
  2. package/dist/chart/animation/canvas-animation.js +134 -1
  3. package/dist/chart/animation/types/animation.js +43 -1
  4. package/dist/chart/animation/types/color-alpha-animation.d.ts +1 -1
  5. package/dist/chart/animation/types/color-alpha-animation.js +60 -1
  6. package/dist/chart/animation/types/color-transition-animation.d.ts +1 -1
  7. package/dist/chart/animation/types/color-transition-animation.js +86 -1
  8. package/dist/chart/animation/types/viewport-movement-animation.js +63 -1
  9. package/dist/chart/animation/viewport-model-animation.js +20 -1
  10. package/dist/chart/bootstrap.d.ts +51 -48
  11. package/dist/chart/bootstrap.js +449 -1
  12. package/dist/chart/canvas/canvas-bounds-container.d.ts +0 -5
  13. package/dist/chart/canvas/canvas-bounds-container.js +815 -1
  14. package/dist/chart/canvas/canvas-chart-html.js +16 -18
  15. package/dist/chart/canvas/chart-elements.d.ts +1 -4
  16. package/dist/chart/canvas/chart-elements.js +22 -1
  17. package/dist/chart/canvas/cursor.handler.js +122 -1
  18. package/dist/chart/canvas/layout-creator.js +34 -1
  19. package/dist/chart/canvas/y-axis-bounds.container.d.ts +2 -2
  20. package/dist/chart/canvas/y-axis-bounds.container.js +67 -1
  21. package/dist/chart/chart-container.js +1 -1
  22. package/dist/chart/chart.config.d.ts +4 -5
  23. package/dist/chart/chart.config.js +645 -1
  24. package/dist/chart/chart.d.ts +62 -0
  25. package/dist/chart/chart.js +106 -0
  26. package/dist/chart/components/chart/basic-scale.d.ts +2 -2
  27. package/dist/chart/components/chart/basic-scale.js +31 -1
  28. package/dist/chart/components/chart/candle-transformer.functions.js +15 -1
  29. package/dist/chart/components/chart/candle-width-calculator.functions.js +2 -1
  30. package/dist/chart/components/chart/candle.functions.js +44 -1
  31. package/dist/chart/components/chart/chart-area-pan.handler.d.ts +3 -3
  32. package/dist/chart/components/chart/chart-area-pan.handler.js +197 -1
  33. package/dist/chart/components/chart/chart-base.model.js +66 -1
  34. package/dist/chart/components/chart/chart.component.d.ts +7 -3
  35. package/dist/chart/components/chart/chart.component.js +408 -1
  36. package/dist/chart/components/chart/chart.model.d.ts +4 -11
  37. package/dist/chart/components/chart/chart.model.js +954 -1
  38. package/dist/chart/components/chart/data-series.high-low-provider.js +34 -1
  39. package/dist/chart/components/chart/fake-candles.js +97 -1
  40. package/dist/chart/components/chart/price.formatter.js +35 -1
  41. package/dist/chart/components/chart/secondary-chart-colors-pool.js +68 -1
  42. package/dist/chart/components/cross_tool/cross-tool.component.js +85 -1
  43. package/dist/chart/components/cross_tool/cross-tool.drawer.js +32 -1
  44. package/dist/chart/components/cross_tool/cross-tool.model.js +107 -1
  45. package/dist/chart/components/cross_tool/types/cross-and-labels.drawer.js +137 -1
  46. package/dist/chart/components/cross_tool/types/none.drawer.js +3 -1
  47. package/dist/chart/components/dran-n-drop_helper/drag-n-drop-x.component.js +28 -1
  48. package/dist/chart/components/dran-n-drop_helper/drag-n-drop-y.component.js +24 -1
  49. package/dist/chart/components/dran-n-drop_helper/drag-n-drop.component.js +53 -1
  50. package/dist/chart/components/dynamic-objects/dynamic-objects.component.d.ts +13 -0
  51. package/dist/chart/components/dynamic-objects/dynamic-objects.component.js +20 -0
  52. package/dist/chart/components/dynamic-objects/dynamic-objects.drawer.d.ts +18 -0
  53. package/dist/chart/components/dynamic-objects/dynamic-objects.drawer.js +23 -0
  54. package/dist/chart/components/dynamic-objects/dynamic-objects.model.d.ts +63 -0
  55. package/dist/chart/components/dynamic-objects/dynamic-objects.model.js +136 -0
  56. package/dist/chart/components/events/events-hit-test.drawer.js +63 -1
  57. package/dist/chart/components/events/events.component.js +61 -1
  58. package/dist/chart/components/events/events.drawer.js +195 -1
  59. package/dist/chart/components/events/events.model.js +69 -1
  60. package/dist/chart/components/grid/grid.component.d.ts +2 -2
  61. package/dist/chart/components/grid/grid.component.js +31 -1
  62. package/dist/chart/components/grid/grid.drawer.d.ts +4 -3
  63. package/dist/chart/components/grid/grid.drawer.js +106 -1
  64. package/dist/chart/components/high_low/high-low.component.js +12 -1
  65. package/dist/chart/components/high_low/high-low.drawer.js +126 -1
  66. package/dist/chart/components/highlights/highlights.component.js +46 -1
  67. package/dist/chart/components/highlights/highlights.drawer.js +154 -1
  68. package/dist/chart/components/highlights/highlights.model.js +75 -1
  69. package/dist/chart/components/labels_generator/numeric-axis-labels.generator.d.ts +1 -1
  70. package/dist/chart/components/labels_generator/numeric-axis-labels.generator.js +199 -1
  71. package/dist/chart/components/navigation_map/navigation-map-move.handler.d.ts +2 -2
  72. package/dist/chart/components/navigation_map/navigation-map-move.handler.js +108 -1
  73. package/dist/chart/components/navigation_map/navigation-map.component.js +112 -1
  74. package/dist/chart/components/navigation_map/navigation-map.drawer.js +244 -1
  75. package/dist/chart/components/navigation_map/navigation-map.model.js +33 -2
  76. package/dist/chart/components/pan/chart-pan.component.d.ts +2 -2
  77. package/dist/chart/components/pan/chart-pan.component.js +51 -1
  78. package/dist/chart/components/pane/extent/y-extent-component.d.ts +12 -18
  79. package/dist/chart/components/pane/extent/y-extent-component.js +120 -1
  80. package/dist/chart/components/pane/pane-hit-test.controller.d.ts +2 -2
  81. package/dist/chart/components/pane/pane-hit-test.controller.js +55 -1
  82. package/dist/chart/components/pane/pane-manager.component.d.ts +12 -6
  83. package/dist/chart/components/pane/pane-manager.component.js +149 -1
  84. package/dist/chart/components/pane/pane.component.d.ts +16 -32
  85. package/dist/chart/components/pane/pane.component.js +278 -1
  86. package/dist/chart/components/resizer/bar-resizer.component.js +139 -1
  87. package/dist/chart/components/resizer/bar-resizer.drawer.js +46 -1
  88. package/dist/chart/components/snapshot/snapshot.component.js +48 -1
  89. package/dist/chart/components/volumes/separate-volumes.component.d.ts +6 -10
  90. package/dist/chart/components/volumes/separate-volumes.component.js +63 -1
  91. package/dist/chart/components/volumes/volume-color-resolvers.functions.js +18 -1
  92. package/dist/chart/components/volumes/volumes.component.d.ts +6 -7
  93. package/dist/chart/components/volumes/volumes.component.js +94 -1
  94. package/dist/chart/components/volumes/volumes.drawer.d.ts +5 -12
  95. package/dist/chart/components/volumes/volumes.drawer.js +140 -1
  96. package/dist/chart/components/volumes/volumes.formatter.js +31 -1
  97. package/dist/chart/components/volumes/volumes.model.d.ts +2 -2
  98. package/dist/chart/components/volumes/volumes.model.js +43 -1
  99. package/dist/chart/components/watermark/water-mark.component.js +103 -1
  100. package/dist/chart/components/watermark/water-mark.drawer.js +187 -1
  101. package/dist/chart/components/x_axis/numeric-x-axis-labels.generator.js +27 -1
  102. package/dist/chart/components/x_axis/time/parser/time-formats-matchers.functions.js +187 -1
  103. package/dist/chart/components/x_axis/time/parser/time-formats-parser.functions.js +76 -1
  104. package/dist/chart/components/x_axis/time/parser/time-formats-validators.functions.js +79 -1
  105. package/dist/chart/components/x_axis/time/parser/time-formats.model.js +14 -1
  106. package/dist/chart/components/x_axis/time/x-axis-weights.functions.d.ts +1 -1
  107. package/dist/chart/components/x_axis/time/x-axis-weights.functions.js +143 -1
  108. package/dist/chart/components/x_axis/time/x-axis-weights.generator.js +73 -1
  109. package/dist/chart/components/x_axis/x-axis-draw.functions.js +49 -1
  110. package/dist/chart/components/x_axis/x-axis-labels.drawer.js +70 -1
  111. package/dist/chart/components/x_axis/x-axis-labels.generator.d.ts +2 -2
  112. package/dist/chart/components/x_axis/x-axis-labels.generator.js +332 -1
  113. package/dist/chart/components/x_axis/x-axis-labels.model.js +35 -1
  114. package/dist/chart/components/x_axis/x-axis-scale.handler.d.ts +2 -2
  115. package/dist/chart/components/x_axis/x-axis-scale.handler.js +60 -1
  116. package/dist/chart/components/x_axis/x-axis-time-labels.drawer.js +82 -1
  117. package/dist/chart/components/x_axis/x-axis.component.d.ts +2 -2
  118. package/dist/chart/components/x_axis/x-axis.component.js +119 -1
  119. package/dist/chart/components/y_axis/label-color.functions.js +53 -1
  120. package/dist/chart/components/y_axis/numeric-y-axis-labels.generator.d.ts +4 -4
  121. package/dist/chart/components/y_axis/numeric-y-axis-labels.generator.js +33 -1
  122. package/dist/chart/components/y_axis/price_labels/data-series-y-axis-labels.provider.d.ts +3 -3
  123. package/dist/chart/components/y_axis/price_labels/data-series-y-axis-labels.provider.js +67 -1
  124. package/dist/chart/components/y_axis/price_labels/labels-positions-calculator.js +56 -1
  125. package/dist/chart/components/y_axis/price_labels/last-candle-labels.provider.d.ts +4 -3
  126. package/dist/chart/components/y_axis/price_labels/last-candle-labels.provider.js +96 -1
  127. package/dist/chart/components/y_axis/price_labels/price-label.drawer.d.ts +2 -2
  128. package/dist/chart/components/y_axis/price_labels/price-label.drawer.js +119 -1
  129. package/dist/chart/components/y_axis/price_labels/y-axis-labels.model.d.ts +9 -8
  130. package/dist/chart/components/y_axis/price_labels/y-axis-labels.model.js +201 -1
  131. package/dist/chart/components/y_axis/price_labels/y-axis-price-labels.drawer.d.ts +6 -7
  132. package/dist/chart/components/y_axis/price_labels/y-axis-price-labels.drawer.js +58 -1
  133. package/dist/chart/components/y_axis/y-axis-base-labels.model.d.ts +6 -4
  134. package/dist/chart/components/y_axis/y-axis-base-labels.model.js +47 -1
  135. package/dist/chart/components/y_axis/y-axis-labels.drawer.d.ts +4 -4
  136. package/dist/chart/components/y_axis/y-axis-labels.drawer.js +161 -1
  137. package/dist/chart/components/y_axis/y-axis-scale.handler.d.ts +2 -2
  138. package/dist/chart/components/y_axis/y-axis-scale.handler.js +72 -1
  139. package/dist/chart/components/y_axis/y-axis.component.d.ts +32 -41
  140. package/dist/chart/components/y_axis/y-axis.component.js +220 -1
  141. package/dist/chart/components/y_axis/y-axis.drawer.d.ts +9 -12
  142. package/dist/chart/components/y_axis/y-axis.drawer.js +96 -1
  143. package/dist/chart/components/y_axis/y-axis.model.d.ts +10 -17
  144. package/dist/chart/components/y_axis/y-axis.model.js +34 -1
  145. package/dist/chart/drawers/chart-background.drawer.js +69 -1
  146. package/dist/chart/drawers/chart-type-drawers/area.drawer.js +69 -1
  147. package/dist/chart/drawers/chart-type-drawers/bar.drawer.js +57 -1
  148. package/dist/chart/drawers/chart-type-drawers/baseline.drawer.js +84 -1
  149. package/dist/chart/drawers/chart-type-drawers/candle.drawer.js +162 -1
  150. package/dist/chart/drawers/chart-type-drawers/histogram.drawer.js +57 -1
  151. package/dist/chart/drawers/chart-type-drawers/line.drawer.js +38 -1
  152. package/dist/chart/drawers/chart-type-drawers/scatter-plot.drawer.js +19 -1
  153. package/dist/chart/drawers/clear-canvas.drawer.js +14 -1
  154. package/dist/chart/drawers/composite.drawer.js +67 -1
  155. package/dist/chart/drawers/data-series-drawers/candle-series-wrapper.js +50 -1
  156. package/dist/chart/drawers/data-series-drawers/color-candle.drawer.js +35 -1
  157. package/dist/chart/drawers/data-series-drawers/data-series-drawers.utils.js +16 -1
  158. package/dist/chart/drawers/data-series-drawers/difference-cloud.drawer.js +106 -1
  159. package/dist/chart/drawers/data-series-drawers/histogram.drawer.js +23 -1
  160. package/dist/chart/drawers/data-series-drawers/linear.drawer.js +19 -1
  161. package/dist/chart/drawers/data-series-drawers/points.drawer.js +19 -1
  162. package/dist/chart/drawers/data-series-drawers/rectangular-tool.drawer.js +7 -1
  163. package/dist/chart/drawers/data-series-drawers/text.drawer.js +25 -1
  164. package/dist/chart/drawers/data-series-drawers/trend-histogram.drawer.js +35 -1
  165. package/dist/chart/drawers/data-series-drawers/triangle.drawer.js +22 -1
  166. package/dist/chart/drawers/data-series.drawer.d.ts +5 -7
  167. package/dist/chart/drawers/data-series.drawer.js +56 -1
  168. package/dist/chart/drawers/drawing-manager.d.ts +1 -1
  169. package/dist/chart/drawers/drawing-manager.js +177 -1
  170. package/dist/chart/drawers/ht-data-series.drawer.js +37 -1
  171. package/dist/chart/events/event-bus.js +73 -1
  172. package/dist/chart/events/events.js +3 -1
  173. package/dist/chart/inputhandlers/candle-tap.handler.js +46 -1
  174. package/dist/chart/inputhandlers/chart-resize.handler.js +98 -1
  175. package/dist/chart/inputhandlers/cross-event-producer.component.js +67 -1
  176. package/dist/chart/inputhandlers/hover-producer.component.d.ts +2 -2
  177. package/dist/chart/inputhandlers/hover-producer.component.js +228 -1
  178. package/dist/chart/inputhandlers/main-canvas-touch.handler.d.ts +2 -2
  179. package/dist/chart/inputhandlers/main-canvas-touch.handler.js +80 -1
  180. package/dist/chart/inputlisteners/canvas-input-listener.component.js +629 -1
  181. package/dist/chart/model/baseline.model.js +88 -1
  182. package/dist/chart/model/bounds.model.js +1 -1
  183. package/dist/chart/model/candle-hover.js +70 -1
  184. package/dist/chart/model/candle-series-high-low.provider.js +45 -1
  185. package/dist/chart/model/candle-series.model.d.ts +3 -3
  186. package/dist/chart/model/candle-series.model.js +245 -1
  187. package/dist/chart/model/candle.model.js +69 -1
  188. package/dist/chart/model/canvas.model.js +228 -1
  189. package/dist/chart/model/chart-base-element.js +129 -1
  190. package/dist/chart/model/compare-series-hover.js +25 -1
  191. package/dist/chart/model/data-series-view.d.ts +5 -5
  192. package/dist/chart/model/data-series-view.js +111 -1
  193. package/dist/chart/model/data-series.config.js +14 -1
  194. package/dist/chart/model/data-series.model.d.ts +4 -4
  195. package/dist/chart/model/data-series.model.js +281 -1
  196. package/dist/chart/model/date-time.formatter.js +151 -1
  197. package/dist/chart/model/hit-test-canvas.model.d.ts +1 -1
  198. package/dist/chart/model/hit-test-canvas.model.js +256 -1
  199. package/dist/chart/model/main-candle-series.model.d.ts +1 -1
  200. package/dist/chart/model/main-candle-series.model.js +29 -1
  201. package/dist/chart/model/scale.model.d.ts +3 -2
  202. package/dist/chart/model/scale.model.js +316 -1
  203. package/dist/chart/model/scaling/auto-scale.model.d.ts +2 -4
  204. package/dist/chart/model/scaling/auto-scale.model.js +91 -1
  205. package/dist/chart/model/scaling/constrait.functions.js +61 -1
  206. package/dist/chart/model/scaling/lock-ratio.model.js +17 -1
  207. package/dist/chart/model/scaling/move-chart.functions.js +22 -1
  208. package/dist/chart/model/scaling/viewport.model.d.ts +2 -2
  209. package/dist/chart/model/scaling/viewport.model.js +279 -1
  210. package/dist/chart/model/scaling/x-zooming.functions.js +35 -1
  211. package/dist/chart/model/time-zone.model.js +109 -1
  212. package/dist/chart/model/visual-candle.js +134 -1
  213. package/dist/chart/utils/__tests__/array.utils.test.js +135 -1
  214. package/dist/chart/utils/__tests__/math.utils.test.js +14 -1
  215. package/dist/chart/utils/__tests__/object.utils.test.js +11 -1
  216. package/dist/chart/utils/__tests__/priceIncrementsUtils.test.js +29 -1
  217. package/dist/chart/utils/array.utils.d.ts +1 -1
  218. package/dist/chart/utils/array.utils.js +269 -1
  219. package/dist/chart/utils/auto-period-detector.utils.js +39 -1
  220. package/dist/chart/utils/candles-generator-ts.utils.js +20 -1
  221. package/dist/chart/utils/candles-generator.utils.js +161 -1
  222. package/dist/chart/utils/candles.utils.js +42 -1
  223. package/dist/chart/utils/canvas/canvas-drawing-functions.utils.js +144 -1
  224. package/dist/chart/utils/canvas/canvas-font-measure-tool.utils.js +51 -1
  225. package/dist/chart/utils/canvas/canvas-text-functions.utils.js +156 -1
  226. package/dist/chart/utils/color.utils.js +31 -1
  227. package/dist/chart/utils/device/browser.utils.js +10 -1
  228. package/dist/chart/utils/device/device-detector.utils.js +24 -1
  229. package/dist/chart/utils/device/device-pixel-ratio.utils.js +21 -1
  230. package/dist/chart/utils/device/touchpad.utils.js +91 -1
  231. package/dist/chart/utils/dom.utils.js +15 -1
  232. package/dist/chart/utils/function.utils.js +16 -1
  233. package/dist/chart/utils/linkedList.utils.d.ts +28 -0
  234. package/dist/chart/utils/linkedList.utils.js +138 -0
  235. package/dist/chart/utils/math.utils.js +115 -1
  236. package/dist/chart/utils/merge.utils.js +56 -1
  237. package/dist/chart/utils/object.utils.js +43 -1
  238. package/dist/chart/utils/performance/animation-frame-cache.utils.js +77 -0
  239. package/dist/chart/utils/{perfomance → performance}/debounce.utils.js +7 -1
  240. package/dist/chart/utils/performance/memoize.utils.js +74 -0
  241. package/dist/chart/utils/performance/request-animation-frame-throttle.utils.js +43 -0
  242. package/dist/chart/utils/performance/throttle.utils.js +26 -0
  243. package/dist/chart/utils/price-increments.utils.d.ts +1 -0
  244. package/dist/chart/utils/price-increments.utils.js +127 -1
  245. package/dist/chart/utils/uuid.utils.js +4 -1
  246. package/dist/dxchart.min.js +9 -12
  247. package/dist/index.d.ts +3 -3
  248. package/dist/index.js +20 -1
  249. package/package.json +4 -4
  250. package/dist/chart/utils/perfomance/animation-frame-cache.utils.js +0 -6
  251. package/dist/chart/utils/perfomance/memoize.utils.js +0 -6
  252. package/dist/chart/utils/perfomance/request-animation-frame-throttle.utils.js +0 -6
  253. package/dist/chart/utils/perfomance/throttle.utils.js +0 -6
  254. /package/dist/chart/utils/{perfomance → performance}/animation-frame-cache.utils.d.ts +0 -0
  255. /package/dist/chart/utils/{perfomance → performance}/debounce.utils.d.ts +0 -0
  256. /package/dist/chart/utils/{perfomance → performance}/memoize.utils.d.ts +0 -0
  257. /package/dist/chart/utils/{perfomance → performance}/request-animation-frame-throttle.utils.d.ts +0 -0
  258. /package/dist/chart/utils/{perfomance → performance}/throttle.utils.d.ts +0 -0
@@ -3,4 +3,147 @@
3
3
  * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
4
4
  * If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
5
  */
6
- export function drawRoundedRect(e,i,o,l,a,n=4,r=!0,v=!1){e.save(),e.beginPath(),e.moveTo(i+n,o),e.lineTo(i+l-n,o),e.quadraticCurveTo(i+l,o,i+l,o+n),e.lineTo(i+l,o+a-n),e.quadraticCurveTo(i+l,o+a,i+l-n,o+a),e.lineTo(i+n,o+a),e.quadraticCurveTo(i,o+a,i,o+a-n),e.lineTo(i,o+n),e.quadraticCurveTo(i,o,i+n,o),e.closePath(),r&&e.fill(),v&&e.stroke(),e.restore()}export function drawPriceLabel(e,i,o,l,a,n,r,v,u,C,q=4,P=!0,m=!1){const s=C==="right"?v:-v,T=C==="right"?q:-q,f=q;e.save(),e.beginPath(),u?e.moveTo(n+T,r):e.moveTo(n,r),u?(e.lineTo(n+s-T,r),e.quadraticCurveTo(n+s,r,n+s,r-f),e.lineTo(n+s,o+f),e.quadraticCurveTo(n+s,o,n+s-T,o),e.lineTo(i+T,o)):(e.lineTo(n+s,r),e.lineTo(n+s,o),e.lineTo(i,o)),u?(e.quadraticCurveTo(i,o,i-T/3,o+f/3),e.lineTo(l+T/3,a-f/3),e.quadraticCurveTo(l,a,l+T/3,a+f/3),e.lineTo(n-T/3,r-f/3),e.quadraticCurveTo(n,r,n+T/3,r)):(e.lineTo(l,a),e.lineTo(n,r)),e.closePath(),P&&e.fill(),m&&e.stroke(),e.restore()}export function drawLine(e,i,o,l,a,n=1){e.save(),e.lineWidth=n,e.beginPath(),e.moveTo(i,o),e.lineTo(l,a),e.stroke(),e.closePath(),e.restore()}export function avoidAntialiasing(e,i){e.save(),e.lineWidth%2&&e.translate(.5,.5),i(),e.restore()}export function fillRect(e,i,o){const l=Math.min(i.x,o.x)+.5,a=Math.min(i.y,o.y),n=Math.abs(i.x-o.x),r=Math.abs(i.y-o.y);e.fillRect(l,a,n,r)}
6
+ /**
7
+ * Draws a rounded rectangle on a canvas context
8
+ * @param {CanvasRenderingContext2D} ctx - The canvas context to draw on
9
+ * @param {number} x - The x-coordinate of the top-left corner of the rectangle
10
+ * @param {number} y - The y-coordinate of the top-left corner of the rectangle
11
+ * @param {number} width - The width of the rectangle
12
+ * @param {number} height - The height of the rectangle
13
+ * @param {number} [radius=4] - The radius of the corners of the rectangle
14
+ * @param {boolean} [fill=true] - Whether or not to fill the rectangle
15
+ * @param {boolean} [stroke=false] - Whether or not to stroke the rectangle
16
+ */
17
+ export function drawRoundedRect(ctx, x, y, width, height, radius = 4, fill = true, stroke = false) {
18
+ ctx.save();
19
+ ctx.beginPath();
20
+ ctx.moveTo(x + radius, y);
21
+ ctx.lineTo(x + width - radius, y);
22
+ ctx.quadraticCurveTo(x + width, y, x + width, y + radius);
23
+ ctx.lineTo(x + width, y + height - radius);
24
+ ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);
25
+ ctx.lineTo(x + radius, y + height);
26
+ ctx.quadraticCurveTo(x, y + height, x, y + height - radius);
27
+ ctx.lineTo(x, y + radius);
28
+ ctx.quadraticCurveTo(x, y, x + radius, y);
29
+ ctx.closePath();
30
+ if (fill) {
31
+ ctx.fill();
32
+ }
33
+ if (stroke) {
34
+ ctx.stroke();
35
+ }
36
+ ctx.restore();
37
+ }
38
+ /**
39
+ * Draws a price label on a canvas context.
40
+ * @param {CanvasRenderingContext2D} ctx - The canvas context to draw on.
41
+ * @param {number} x0 - The x-coordinate of the starting point of the label.
42
+ * @param {number} y0 - The y-coordinate of the starting point of the label.
43
+ * @param {number} x1 - The x-coordinate of the middle point of the label.
44
+ * @param {number} y1 - The y-coordinate of the middle point of the label.
45
+ * @param {number} x2 - The x-coordinate of the ending point of the label.
46
+ * @param {number} y2 - The y-coordinate of the ending point of the label.
47
+ * @param {number} _width - The width of the label.
48
+ * @param {boolean} rounded - Whether the label should have rounded corners.
49
+ * @param {string} align - The alignment of the label on the y-axis. Can be 'left' or 'right'.
50
+ * @param {number} radius - The radius of the rounded corners of the label.
51
+ * @param {boolean} fill - Whether the label should be filled with color.
52
+ * @param {boolean} stroke - Whether the label should have a stroke.
53
+ */
54
+ export function drawPriceLabel(ctx, x0, y0, x1, y1, x2, y2, _width, rounded, align, radius = 4, fill = true, stroke = false) {
55
+ const width = align === 'right' ? _width : -_width;
56
+ const xRadius = align === 'right' ? radius : -radius;
57
+ const yRadius = radius;
58
+ ctx.save();
59
+ ctx.beginPath();
60
+ if (rounded) {
61
+ ctx.moveTo(x2 + xRadius, y2);
62
+ }
63
+ else {
64
+ ctx.moveTo(x2, y2);
65
+ }
66
+ // rect
67
+ if (rounded) {
68
+ ctx.lineTo(x2 + width - xRadius, y2);
69
+ ctx.quadraticCurveTo(x2 + width, y2, x2 + width, y2 - yRadius);
70
+ ctx.lineTo(x2 + width, y0 + yRadius);
71
+ ctx.quadraticCurveTo(x2 + width, y0, x2 + width - xRadius, y0);
72
+ ctx.lineTo(x0 + xRadius, y0);
73
+ }
74
+ else {
75
+ ctx.lineTo(x2 + width, y2);
76
+ ctx.lineTo(x2 + width, y0);
77
+ ctx.lineTo(x0, y0);
78
+ }
79
+ // triangle
80
+ if (rounded) {
81
+ ctx.quadraticCurveTo(x0, y0, x0 - xRadius / 3, y0 + yRadius / 3);
82
+ ctx.lineTo(x1 + xRadius / 3, y1 - yRadius / 3);
83
+ ctx.quadraticCurveTo(x1, y1, x1 + xRadius / 3, y1 + yRadius / 3);
84
+ ctx.lineTo(x2 - xRadius / 3, y2 - yRadius / 3);
85
+ ctx.quadraticCurveTo(x2, y2, x2 + xRadius / 3, y2);
86
+ }
87
+ else {
88
+ ctx.lineTo(x1, y1);
89
+ ctx.lineTo(x2, y2);
90
+ }
91
+ ctx.closePath();
92
+ if (fill) {
93
+ ctx.fill();
94
+ }
95
+ if (stroke) {
96
+ ctx.stroke();
97
+ }
98
+ ctx.restore();
99
+ }
100
+ /**
101
+ * Draws a line on a canvas context with the specified thickness.
102
+ *
103
+ * @param {CanvasRenderingContext2D} ctx - The canvas context to draw on.
104
+ * @param {number} x0 - The x-coordinate of the starting point of the line.
105
+ * @param {number} y0 - The y-coordinate of the starting point of the line.
106
+ * @param {number} x1 - The x-coordinate of the ending point of the line.
107
+ * @param {number} y1 - The y-coordinate of the ending point of the line.
108
+ * @param {number} [thickness=1] - The thickness of the line. Default is 1.
109
+ *
110
+ * @returns {void}
111
+ */
112
+ export function drawLine(ctx, x0, y0, x1, y1, thickness = 1) {
113
+ ctx.save();
114
+ ctx.lineWidth = thickness;
115
+ ctx.beginPath();
116
+ ctx.moveTo(x0, y0);
117
+ ctx.lineTo(x1, y1);
118
+ ctx.stroke();
119
+ ctx.closePath();
120
+ ctx.restore();
121
+ }
122
+ /**
123
+ * Try to avoid anti-aliasing
124
+ */
125
+ export function avoidAntialiasing(ctx, draw) {
126
+ // TODO rework, potentially make it one time per DRAW event
127
+ ctx.save();
128
+ if (ctx.lineWidth % 2) {
129
+ ctx.translate(0.5, 0.5);
130
+ }
131
+ draw();
132
+ ctx.restore();
133
+ }
134
+ /**
135
+ * Draws a filled rectangle on a canvas context.
136
+ *
137
+ * @param {CanvasRenderingContext2D} ctx - The canvas context to draw on.
138
+ * @param {{x: number, y: number}} a - The first point of the rectangle.
139
+ * @param {{x: number, y: number}} b - The second point of the rectangle.
140
+ * @returns {void}
141
+
142
+ */
143
+ export function fillRect(ctx, a, b) {
144
+ const x = Math.min(a.x, b.x) + 0.5;
145
+ const y = Math.min(a.y, b.y);
146
+ const w = Math.abs(a.x - b.x);
147
+ const h = Math.abs(a.y - b.y);
148
+ ctx.fillRect(x, y, w, h);
149
+ }
@@ -3,4 +3,54 @@
3
3
  * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
4
4
  * If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
5
  */
6
- const u={};export function calculateSymbolHeight(r,e){let t=u[r];return t!==void 0||(e.save(),e.font=r,t=e.measureText("M").width,u[r]=t,e.restore()),t}const a=new Map;export function calculateTextWidth(r,e,t){const n=t+r;let s=a.get(n);return s||(e.save(),e.font=t,s=e.measureText(r).width,a.set(n,s),e.restore()),s}
6
+ /**
7
+ * Calculates max symbol height for provided font on canvas.
8
+ * @doc-tags tricky,chart-core,canvas
9
+ */
10
+ const symbolHeightCache = {};
11
+ /**
12
+ * Calculates the height of a symbol for a given font using a CanvasRenderingContext2D.
13
+ * @param {string} font - The font to calculate the symbol height for.
14
+ * @param {CanvasRenderingContext2D} ctx - The CanvasRenderingContext2D to use for the calculation.
15
+ * @returns {number} - The height of the symbol.
16
+ */
17
+ export function calculateSymbolHeight(font, ctx) {
18
+ let result = symbolHeightCache[font];
19
+ if (result !== undefined) {
20
+ return result;
21
+ }
22
+ // Capital "M" width is very close to height, 90% approximation
23
+ ctx.save();
24
+ ctx.font = font;
25
+ result = ctx.measureText('M').width;
26
+ symbolHeightCache[font] = result;
27
+ ctx.restore();
28
+ return result;
29
+ }
30
+ /**
31
+ * Calculates text width in pixels for provided font on canvas.
32
+ * @param text
33
+ * @param ctx
34
+ * @param font
35
+ * @doc-tags tricky,chart-core,canvas
36
+ */
37
+ const textWidthCache = new Map();
38
+ /**
39
+ * Calculates the width of a given text using the provided font and canvas rendering context.
40
+ * @param {string} text - The text to calculate the width of.
41
+ * @param {CanvasRenderingContext2D} ctx - The canvas rendering context to use for measuring the text width.
42
+ * @param {string} font - The font to use for measuring the text width.
43
+ * @returns {number} - The width of the text in pixels.
44
+ */
45
+ export function calculateTextWidth(text, ctx, font) {
46
+ const key = font + text;
47
+ let result = textWidthCache.get(key);
48
+ if (!result) {
49
+ ctx.save();
50
+ ctx.font = font;
51
+ result = ctx.measureText(text).width;
52
+ textWidthCache.set(key, result);
53
+ ctx.restore();
54
+ }
55
+ return result;
56
+ }
@@ -3,4 +3,159 @@
3
3
  * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
4
4
  * If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
5
  */
6
- import*as g from"color";export function prepareTextForFill(t,e){let n="";e.textStyle&&(e.textStyle.italic&&(n+="italic "),e.textStyle.bold&&(n+="bold ")),t.font=n+(e.textSize||12)+" "+(e.textFontFamily||"monospace"),t.fillStyle=e.textFill||"#FFFFFF",e.rtl?t.textAlign="right":t.textAlign="start"}export function getTextLineHeight(t){const e=t.font.match(/(\d+.)?\d+(px|pt)/gi);let n="10px";return e&&e.length&&(e[0].includes("pt")?n=+e[0].slice(0,e[0].indexOf("pt"))*96/72+"px":n=e[0]),parseInt(n,10)*1.33}export function getTextBounds(t,e,n){t.save(),prepareTextForFill(t,n);const i=Math.ceil(Math.max.apply(Math,e.map(o=>t.measureText(o).width))),l=getTextLineHeight(t),r=l*e.length;return t.restore(),[i,r,l]}export function getTextLines(t){return(t||"").split(/\r\n|\r|\n/)}export function drawText(t,e,n,i,l){t.save();const[r,,o]=getTextBounds(t,e,l);e.forEach((s,d)=>{var u,x,a;const h=t.measureText(s).width,f=c(n,r,h,(u=l.textAlign)!==null&&u!==void 0?u:"left");l.textStyle&&l.textStyle.underline&&underlineText(t,s,f,i+o*d,(x=l.textFill)!==null&&x!==void 0?x:"",(a=l.textSize)!==null&&a!==void 0?a:""),t.fillText(s,f,i+o*d)}),t.restore()}function c(t,e,n,i){switch(i){case"left":return t;case"right":return t+e-n;default:return t}}export function underlineText(t,e,n,i,l,r){t.save();const o=t.measureText(e).width,s=n,d=n+o,u=i+2,x=u;let a=parseInt(r,10)/15;a<1&&(a=1),t.beginPath(),t.strokeStyle=l,t.lineWidth=a,t.moveTo(s,u),t.lineTo(d,x),t.stroke(),t.restore()}export function getFontSizeInPx(t){return`${t}px`}export function getLabelTextColorByBackgroundColor(t,e,n){const i=g.rgb(t).array(),l=i[0],r=i[1],o=i[2];return(l*299+r*587+o*114)/1e3<128?e:n}
6
+ import Color from 'color';
7
+ /**
8
+ * Sets the font, fill style and text alignment of a canvas context based on the provided properties.
9
+ * @param {CanvasRenderingContext2D} ctx - The canvas context to modify.
10
+ * @param {CanvasTextProperties} properties - An object containing the properties to apply to the canvas context.
11
+ * @param {string} properties.textStyle - The style of the text. Can be 'italic', 'bold' or both.
12
+ * @param {number} properties.textSize - The size of the text in pixels.
13
+ * @param {string} properties.textFontFamily - The font family of the text.
14
+ * @param {string} properties.textFill - The fill style of the text.
15
+ * @param {boolean} properties.rtl - Whether the text should be aligned to the right or to the left.
16
+ */
17
+ export function prepareTextForFill(ctx, properties) {
18
+ let textStyles = '';
19
+ if (properties.textStyle) {
20
+ properties.textStyle.italic && (textStyles += `italic `);
21
+ properties.textStyle.bold && (textStyles += `bold `);
22
+ }
23
+ ctx.font = textStyles + (properties.textSize || 12) + ' ' + (properties.textFontFamily || 'monospace');
24
+ ctx.fillStyle = properties.textFill || '#FFFFFF';
25
+ if (properties.rtl) {
26
+ ctx.textAlign = 'right';
27
+ }
28
+ else {
29
+ ctx.textAlign = 'start';
30
+ }
31
+ }
32
+ /**
33
+ * Calculates the line height of a text based on the font size of the provided CanvasRenderingContext2D.
34
+ * @param {CanvasRenderingContext2D} ctx - The CanvasRenderingContext2D object used to draw the text.
35
+ * @returns {number} The calculated line height of the text.
36
+ */
37
+ export function getTextLineHeight(ctx) {
38
+ const textSizeMatch = ctx.font.match(/(\d+.)?\d+(px|pt)/gi);
39
+ let textSize = '10px';
40
+ if (textSizeMatch && textSizeMatch.length) {
41
+ if (textSizeMatch[0].includes('pt')) {
42
+ const ptSize = +textSizeMatch[0].slice(0, textSizeMatch[0].indexOf('pt'));
43
+ textSize = (ptSize * 96) / 72 + 'px';
44
+ }
45
+ else {
46
+ textSize = textSizeMatch[0];
47
+ }
48
+ }
49
+ return parseInt(textSize, 10) * 1.33; // Base Line Height in Project
50
+ }
51
+ /**
52
+ * Calculates text bounds [textWidth, textHeight, lineHeight]
53
+ * @param ctx
54
+ * @param lines
55
+ * @param properties
56
+ */
57
+ export function getTextBounds(ctx, lines, properties) {
58
+ ctx.save();
59
+ prepareTextForFill(ctx, properties);
60
+ const textWidth = Math.ceil(Math.max.apply(Math, lines.map((text) => {
61
+ return ctx.measureText(text).width;
62
+ })));
63
+ const lineHeight = getTextLineHeight(ctx);
64
+ const textHeight = lineHeight * lines.length;
65
+ ctx.restore();
66
+ return [textWidth, textHeight, lineHeight];
67
+ }
68
+ /**
69
+ * Splits multiline text to array of lines
70
+ * @param text
71
+ */
72
+ export function getTextLines(text) {
73
+ return (text || '').split(/\r\n|\r|\n/);
74
+ }
75
+ /**
76
+ * Draws multiple lines of text on a canvas context at a given position.
77
+ * @param {CanvasRenderingContext2D} ctx - The canvas context to draw on.
78
+ * @param {string[]} lines - An array of strings representing the lines of text to draw.
79
+ * @param {number} x - The x-coordinate of the starting position of the text.
80
+ * @param {number} y - The y-coordinate of the starting position of the text.
81
+ * @param {CanvasTextProperties} properties - An object containing properties for the text, such as font size, style, and alignment.
82
+ * @returns {void}
83
+
84
+ */
85
+ export function drawText(ctx, lines, x, y, properties) {
86
+ ctx.save();
87
+ const [textWidth, , lineHeight] = getTextBounds(ctx, lines, properties);
88
+ lines.forEach((l, i) => {
89
+ var _a, _b, _c;
90
+ const lineWidth = ctx.measureText(l).width;
91
+ const alignedX = alignCanvasText(x, textWidth, lineWidth, (_a = properties.textAlign) !== null && _a !== void 0 ? _a : 'left');
92
+ if (properties.textStyle && properties.textStyle.underline) {
93
+ underlineText(ctx, l, alignedX, y + lineHeight * i, (_b = properties.textFill) !== null && _b !== void 0 ? _b : '', (_c = properties.textSize) !== null && _c !== void 0 ? _c : '');
94
+ }
95
+ ctx.fillText(l, alignedX, y + lineHeight * i);
96
+ });
97
+ ctx.restore();
98
+ }
99
+ /**
100
+ * Aligns canvas text based on the given parameters.
101
+ * @param {number} originalCoordinate - The original coordinate of the text.
102
+ * @param {number} maxWidth - The maximum width of the text.
103
+ * @param {number} textWidth - The width of the text.
104
+ * @param {CanvasTextAlignment} alignment - The alignment of the text.
105
+ * @returns {number} - The aligned coordinate of the text.
106
+ */
107
+ function alignCanvasText(originalCoordinate, maxWidth, textWidth, alignment) {
108
+ switch (alignment) {
109
+ case 'left':
110
+ return originalCoordinate;
111
+ case 'right':
112
+ return originalCoordinate + maxWidth - textWidth;
113
+ default:
114
+ return originalCoordinate;
115
+ }
116
+ }
117
+ /**
118
+ * Draws an underline below the given text on a canvas context.
119
+ * @param {CanvasRenderingContext2D} ctx - The canvas context to draw on.
120
+ * @param {string} text - The text to underline.
121
+ * @param {number} x - The x-coordinate of the starting point of the text.
122
+ * @param {number} y - The y-coordinate of the starting point of the text.
123
+ * @param {string} color - The color of the underline.
124
+ * @param {string} textSize - The size of the text in pixels.
125
+ */
126
+ export function underlineText(ctx, text, x, y, color, textSize) {
127
+ ctx.save();
128
+ const textWidth = ctx.measureText(text).width;
129
+ const startX = x;
130
+ const endX = x + textWidth;
131
+ const startY = y + 2; // shifts underline 2px lower than the text
132
+ const endY = startY;
133
+ let underlineHeight = parseInt(textSize, 10) / 15;
134
+ if (underlineHeight < 1) {
135
+ underlineHeight = 1;
136
+ }
137
+ ctx.beginPath();
138
+ ctx.strokeStyle = color;
139
+ ctx.lineWidth = underlineHeight;
140
+ ctx.moveTo(startX, startY);
141
+ ctx.lineTo(endX, endY);
142
+ ctx.stroke();
143
+ ctx.restore();
144
+ }
145
+ /**
146
+ * Returns a string with the font size in pixels.
147
+ *
148
+ * @param {number} fontSize - The font size in points.
149
+ * @returns {string} The font size in pixels as a string.
150
+ */
151
+ export function getFontSizeInPx(fontSize) {
152
+ return `${fontSize}px`;
153
+ }
154
+ export function getLabelTextColorByBackgroundColor(bgColor, textColor, invertedTextColor) {
155
+ const rgb = Color.rgb(bgColor).array();
156
+ const r = rgb[0];
157
+ const g = rgb[1];
158
+ const b = rgb[2];
159
+ const yiq = (r * 299 + g * 587 + b * 114) / 1000;
160
+ return yiq < 128 ? textColor : invertedTextColor;
161
+ }
@@ -3,4 +3,34 @@
3
3
  * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
4
4
  * If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
5
  */
6
- const c=/^(#)([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i,o=/^\s*(rgba?)\s*[(]\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*[\d.]+\s*)?[)]\s*$/i;function i(n){const t=c.exec(n)||o.exec(n);let s=[];return t&&(s=t.slice(2,5),t[1]==="#")?s.map(function(e){return parseInt(e,16)}):s}const r={};export function toRGBA(n,t){let s=r[n+t];if(!s){const e=i(n);s=e&&"rgba("+e.join(",")+","+t+")",r[n+t]=s}return s}
6
+ const HEX_COLOR_REGEXP = /^(#)([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i;
7
+ const RGB_COLOR_REGEXP = /^\s*(rgba?)\s*[(]\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*[\d.]+\s*)?[)]\s*$/i;
8
+ function parseColor(color) {
9
+ const match = HEX_COLOR_REGEXP.exec(color) || RGB_COLOR_REGEXP.exec(color);
10
+ let colors = [];
11
+ if (match) {
12
+ colors = match.slice(2, 5);
13
+ if (match[1] === '#') {
14
+ return colors.map(function (s) {
15
+ return parseInt(s, 16);
16
+ });
17
+ }
18
+ }
19
+ return colors;
20
+ }
21
+ /**
22
+ *
23
+ * @param {String} color
24
+ * @param {Number} alpha
25
+ * @returns {String}
26
+ */
27
+ const rgbaCache = {};
28
+ export function toRGBA(color, alpha) {
29
+ let result = rgbaCache[color + alpha];
30
+ if (!result) {
31
+ const colors = parseColor(color);
32
+ result = colors && 'rgba(' + colors.join(',') + ',' + alpha + ')';
33
+ rgbaCache[color + alpha] = result;
34
+ }
35
+ return result;
36
+ }
@@ -3,4 +3,13 @@
3
3
  * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
4
4
  * If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
5
  */
6
- let e;export const isMobile=()=>(e||(e=!!navigator.userAgent.match(/Android|iPhone|Opera Mini/)||!1),e);
6
+ let isMobileCache = undefined;
7
+ /**
8
+ * @doc-tags utility,mobile
9
+ */
10
+ export const isMobile = () => {
11
+ if (!isMobileCache) {
12
+ isMobileCache = !!navigator.userAgent.match(/Android|iPhone|Opera Mini/) || false;
13
+ }
14
+ return isMobileCache;
15
+ };
@@ -3,4 +3,27 @@
3
3
  * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
4
4
  * If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
5
  */
6
- export const deviceDetector=()=>{const e=/Mac|iPod|iPhone|iPad/i.test(navigator.userAgent),i=[/Android/i,/webOS/i,/BlackBerry/i,/Windows Phone/i].some(o=>navigator.userAgent.match(o));return e?"apple":i?"mobile":"other"},multiplyZoomByDevice=(e,t)=>e==="apple"||e==="mobile"?3:t;
6
+ /**
7
+ * Detects the user device. Naive approach.
8
+ * @doc-tags tricky,mobile
9
+ */
10
+ export const deviceDetector = () => {
11
+ const isApple = /Mac|iPod|iPhone|iPad/i.test(navigator.userAgent);
12
+ const mobileMatch = [/Android/i, /webOS/i, /BlackBerry/i, /Windows Phone/i];
13
+ const isMobile = mobileMatch.some(os => {
14
+ return navigator.userAgent.match(os);
15
+ });
16
+ if (isApple) {
17
+ return 'apple';
18
+ }
19
+ if (isMobile) {
20
+ return 'mobile';
21
+ }
22
+ return 'other';
23
+ };
24
+ export const multiplyZoomByDevice = (device, defaultValue) => {
25
+ if (device === 'apple' || device === 'mobile') {
26
+ return 3;
27
+ }
28
+ return defaultValue;
29
+ };
@@ -3,4 +3,24 @@
3
3
  * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
4
4
  * If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
5
  */
6
- import{ceil as t,floor as n,round as d}from"../math.utils";export let dpr=window.devicePixelRatio;let o=window.matchMedia(`screen and (resolution: ${window.devicePixelRatio}dppx)`);const i=()=>{o.removeEventListener("change",i),dpr=window.devicePixelRatio,o=window.matchMedia(`screen and (resolution: ${window.devicePixelRatio}dppx)`),o.addEventListener("change",i)};o.addEventListener("change",i);export const getDPR=()=>dpr,roundToDPR=e=>d(dpr*e)/dpr,floorToDPR=e=>n(dpr*e)/dpr,ceilToDPR=e=>t(dpr*e)/dpr;
6
+ import { ceil, floor, round } from '../math.utils';
7
+ export let dpr = window.devicePixelRatio;
8
+ // A media matcher which watches for changes in the device pixel ratio.
9
+ let mediaMatcher = window.matchMedia(`screen and (resolution: ${window.devicePixelRatio}dppx)`);
10
+ const updateDevicePixelRatio = () => {
11
+ mediaMatcher.removeEventListener('change', updateDevicePixelRatio);
12
+ dpr = window.devicePixelRatio;
13
+ mediaMatcher = window.matchMedia(`screen and (resolution: ${window.devicePixelRatio}dppx)`);
14
+ mediaMatcher.addEventListener('change', updateDevicePixelRatio);
15
+ };
16
+ mediaMatcher.addEventListener('change', updateDevicePixelRatio);
17
+ export const getDPR = () => dpr;
18
+ /**
19
+ * Rounds a given number according to the inverse of current DPR.
20
+ * For example, DPR = 2, num = 2, res => 2; DPR = 2, num = 2.5, res => 2.5; DPR = 2, num = 2.333, res => 2.5
21
+ * @param num
22
+ * @doc-tags chart-core,math,dpr
23
+ */
24
+ export const roundToDPR = (num) => round(dpr * num) / dpr;
25
+ export const floorToDPR = (num) => floor(dpr * num) / dpr;
26
+ export const ceilToDPR = (num) => ceil(dpr * num) / dpr;
@@ -3,4 +3,94 @@
3
3
  * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
4
4
  * If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
5
  */
6
- const o=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),l=!!window.chrome;export const isFirefox=typeof InstallTrigger!="undefined";const d=navigator.platform.indexOf("Win")>-1;export const touchpadDetector=t=>{let i=!1;const{wheelDeltaY:a,wheelDeltaX:s}=t;if(a||s){let e;if(o)e=a===t.deltaY*-3||Math.abs(a+Math.sign(a))===Math.abs(Math.round(t.deltaY)*3)||Math.abs(a-Math.sign(a))===Math.abs(Math.round(t.deltaY)*3);else if(l){if(e=a+Math.sign(a)===t.deltaY*-3?a+Math.sign(a)===t.deltaY*-3:a===t.deltaY*-3,d){const n=Math.round(t.deltaY)===a||Math.abs(Math.round(t.deltaY)+Math.sign(t.deltaY))===Math.abs(a)||Math.abs(Math.round(t.deltaY)-Math.sign(t.deltaY))===Math.abs(a);e=Math.abs(a)===Math.abs(t.deltaY)||n}}else isFirefox?Math.abs(t.deltaY)>Math.abs(t.deltaX)?e=!1:e=s===t.deltaX*-3:e=a===t.deltaY*-3;e&&(i=!0)}else t.deltaMode===0&&(i=!0);return isFirefox&&t.deltaY>=16&&Math.abs(t.deltaY)%16===0&&(i=!1),t.ctrlKey&&(i=!0),i},getTouchpadSensitivity=t=>t.components.yAxis.type==="percent"?t.scale.zoomSensitivity/4:t.scale.zoomSensitivity;
6
+ const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
7
+ //@ts-ignore
8
+ const isChrome = !!window.chrome;
9
+ //@ts-ignore
10
+ export const isFirefox = typeof InstallTrigger !== 'undefined';
11
+ const isWindows = navigator.platform.indexOf('Win') > -1;
12
+ /**
13
+ * this function determines whether the event was triggered with the mouse or the touchpad
14
+ *
15
+ * This works because wheelDeltaY measures the physical distance that the actual hardware mouse wheel has travelled,
16
+ * while deltaY measures the amount of scrolling produced on screen.
17
+ * A conventional mouse typically has a much lower "scroll resolution" than a trackpad.
18
+ * The wheelDeltaY is exactly 3x the deltaY value(in most browsers)
19
+ * This function consist a lot of empiric if statements for some cases in different browsers and systems
20
+ * @param {WheelEvent} e
21
+ * @returns {boolean}
22
+ *
23
+ * @doc-tags chart-core, utility,
24
+ */
25
+ export const touchpadDetector = (e) => {
26
+ let isTouchpad = false;
27
+ // this is essential prop to separate touchpad from mouse wheel
28
+ //@ts-ignore
29
+ const { wheelDeltaY, wheelDeltaX } = e;
30
+ if (wheelDeltaY || wheelDeltaX) {
31
+ let condition;
32
+ if (isSafari) {
33
+ condition =
34
+ wheelDeltaY === e.deltaY * -3 ||
35
+ Math.abs(wheelDeltaY + Math.sign(wheelDeltaY)) === Math.abs(Math.round(e.deltaY) * 3) ||
36
+ Math.abs(wheelDeltaY - Math.sign(wheelDeltaY)) === Math.abs(Math.round(e.deltaY) * 3);
37
+ }
38
+ else if (isChrome) {
39
+ condition =
40
+ wheelDeltaY + Math.sign(wheelDeltaY) === e.deltaY * -3
41
+ ? wheelDeltaY + Math.sign(wheelDeltaY) === e.deltaY * -3
42
+ : wheelDeltaY === e.deltaY * -3;
43
+ // Chrome windows case
44
+ if (isWindows) {
45
+ const diapazoneCondition = Math.round(e.deltaY) === wheelDeltaY ||
46
+ Math.abs(Math.round(e.deltaY) + Math.sign(e.deltaY)) === Math.abs(wheelDeltaY) ||
47
+ Math.abs(Math.round(e.deltaY) - Math.sign(e.deltaY)) === Math.abs(wheelDeltaY);
48
+ const equalCondition = Math.abs(wheelDeltaY) === Math.abs(e.deltaY);
49
+ condition = equalCondition || diapazoneCondition;
50
+ }
51
+ }
52
+ else if (isFirefox) {
53
+ if (Math.abs(e.deltaY) > Math.abs(e.deltaX)) {
54
+ // disable vertical scroll in Firefox bcs it is unstable
55
+ condition = false;
56
+ }
57
+ else {
58
+ condition = wheelDeltaX === e.deltaX * -3;
59
+ }
60
+ }
61
+ else {
62
+ // basic rule
63
+ condition = wheelDeltaY === e.deltaY * -3;
64
+ }
65
+ if (condition) {
66
+ isTouchpad = true;
67
+ }
68
+ }
69
+ else if (e.deltaMode === 0) {
70
+ isTouchpad = true;
71
+ }
72
+ // Firefox for some reason is not obey to rules above
73
+ // so we just this trigger this as mouse wheel event
74
+ if (isFirefox && e.deltaY >= 16 && Math.abs(e.deltaY) % 16 === 0) {
75
+ isTouchpad = false;
76
+ }
77
+ // it is necessary to correctly recognize pinch on touchpad
78
+ // could be emulated mouse wheel + ctrl key BE AWARE!!
79
+ if (e.ctrlKey) {
80
+ isTouchpad = true;
81
+ }
82
+ return isTouchpad;
83
+ };
84
+ /**
85
+ * this function returns different ящщь sensitivity for the percent axis and the others
86
+ * @param config
87
+ * @param isTouchpad
88
+ * @returns {number}
89
+ *
90
+ * @doc-tags chart-core, zoom
91
+ */
92
+ export const getTouchpadSensitivity = (config) => {
93
+ const isPercentAxisType = config.components.yAxis.type === 'percent';
94
+ const zoomSensitivity = isPercentAxisType ? config.scale.zoomSensitivity / 4 : config.scale.zoomSensitivity;
95
+ return zoomSensitivity;
96
+ };
@@ -3,4 +3,18 @@
3
3
  * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
4
4
  * If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
5
  */
6
- export function subscribeListener(n,r,i,t){return n.addEventListener(i,r,t),function(){n.removeEventListener(i,r,t)}}
6
+ /**
7
+ * @param {Element} element
8
+ * @param {function} listener
9
+ * @param {string} eventType
10
+ * @param {boolean?} useCapture
11
+ * @return {Function}
12
+ */
13
+ export function subscribeListener(element, listener, eventType, useCapture) {
14
+ // @ts-ignore
15
+ element.addEventListener(eventType, listener, useCapture);
16
+ return function () {
17
+ // @ts-ignore
18
+ element.removeEventListener(eventType, listener, useCapture);
19
+ };
20
+ }
@@ -3,4 +3,19 @@
3
3
  * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
4
4
  * If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
5
  */
6
- export function clearerSafe(n){return function(){n.forEach(t=>typeof t=="function"&&t()),n.length=0}}export function identity(n){return n}export function notEmpty(n){return n!=null}export const constVoid=()=>{};export function nonNullableTypeGuard(n){return n!=null}
6
+ export function clearerSafe(arr) {
7
+ return function doClearSafe() {
8
+ arr.forEach(f => typeof f === 'function' && f());
9
+ arr.length = 0;
10
+ };
11
+ }
12
+ export function identity(x) {
13
+ return x;
14
+ }
15
+ export function notEmpty(value) {
16
+ return value !== null && value !== undefined;
17
+ }
18
+ export const constVoid = () => void 0;
19
+ export function nonNullableTypeGuard(x) {
20
+ return x !== undefined && x !== null;
21
+ }
@@ -0,0 +1,28 @@
1
+ /*
2
+ * Copyright (C) 2019 - 2023 Devexperts Solutions IE Limited
3
+ * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
4
+ * If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
5
+ */
6
+ export declare class ListNode<T> {
7
+ data: T;
8
+ next: ListNode<T> | null;
9
+ constructor(data: T);
10
+ }
11
+ /**
12
+ * Implementation of Linked list data structure.
13
+ * @param _head
14
+ */
15
+ export declare class LinkedList<T> {
16
+ private _head;
17
+ private _tail;
18
+ private length;
19
+ constructor(head?: ListNode<T>);
20
+ insertAtEnd(data: T): ListNode<T>;
21
+ insertAt(position: number, data: T): ListNode<T> | null;
22
+ removeAt(position: number): ListNode<T> | null;
23
+ getNodePosition(node: ListNode<T>): number;
24
+ size(): number;
25
+ get head(): ListNode<T> | null;
26
+ get tail(): ListNode<T> | null;
27
+ [Symbol.iterator](): Generator<T, void, unknown>;
28
+ }