teechart.js 4.0.5 → 5.0.0-beta.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 (274) hide show
  1. package/3D-COMPATIBILITY.md +45 -0
  2. package/README.md +463 -27
  3. package/dist/chunks/chart-p639xVyw.js +16 -0
  4. package/dist/chunks/chart-p639xVyw.js.map +1 -0
  5. package/dist/chunks/palette-series-DfyYptK1.js +16 -0
  6. package/dist/chunks/palette-series-DfyYptK1.js.map +1 -0
  7. package/dist/chunks/series-DeozLXIv.js +16 -0
  8. package/dist/chunks/series-DeozLXIv.js.map +1 -0
  9. package/dist/teechart.3d.esm.js +27 -0
  10. package/dist/teechart.3d.esm.js.map +1 -0
  11. package/dist/teechart.auto.esm.js +16 -0
  12. package/dist/teechart.auto.esm.js.map +1 -0
  13. package/dist/teechart.core.esm.js +16 -0
  14. package/dist/teechart.core.esm.js.map +1 -0
  15. package/dist/teechart.esm.js +3 -3
  16. package/dist/teechart.esm.js.map +1 -1
  17. package/dist/teechart.js +14 -3
  18. package/dist/teechart.js.map +1 -1
  19. package/dist/teechart.maps.esm.js +16 -0
  20. package/dist/teechart.maps.esm.js.map +1 -0
  21. package/dist/types/accessibility.d.ts +29 -0
  22. package/dist/types/accessibility.d.ts.map +1 -0
  23. package/dist/types/auto.d.ts +4 -0
  24. package/dist/types/auto.d.ts.map +1 -0
  25. package/dist/types/chart-options.d.ts +826 -0
  26. package/dist/types/chart-options.d.ts.map +1 -0
  27. package/dist/types/chart.d.ts +252 -0
  28. package/dist/types/chart.d.ts.map +1 -0
  29. package/dist/types/checkbox.d.ts +12 -0
  30. package/dist/types/checkbox.d.ts.map +1 -0
  31. package/dist/types/core/elements/axes.d.ts +17 -0
  32. package/dist/types/core/elements/axes.d.ts.map +1 -0
  33. package/dist/types/core/elements/axis-grid.d.ts +20 -0
  34. package/dist/types/core/elements/axis-grid.d.ts.map +1 -0
  35. package/dist/types/core/elements/axis-labels.d.ts +54 -0
  36. package/dist/types/core/elements/axis-labels.d.ts.map +1 -0
  37. package/dist/types/core/elements/axis-ticks.d.ts +19 -0
  38. package/dist/types/core/elements/axis-ticks.d.ts.map +1 -0
  39. package/dist/types/core/elements/axis-title.d.ts +16 -0
  40. package/dist/types/core/elements/axis-title.d.ts.map +1 -0
  41. package/dist/types/core/elements/axis.d.ts +125 -0
  42. package/dist/types/core/elements/axis.d.ts.map +1 -0
  43. package/dist/types/core/elements/chart-image.d.ts +13 -0
  44. package/dist/types/core/elements/chart-image.d.ts.map +1 -0
  45. package/dist/types/core/elements/font.d.ts +28 -0
  46. package/dist/types/core/elements/font.d.ts.map +1 -0
  47. package/dist/types/core/elements/format.d.ts +125 -0
  48. package/dist/types/core/elements/format.d.ts.map +1 -0
  49. package/dist/types/core/elements/gradient.d.ts +23 -0
  50. package/dist/types/core/elements/gradient.d.ts.map +1 -0
  51. package/dist/types/core/elements/legend-symbol.d.ts +49 -0
  52. package/dist/types/core/elements/legend-symbol.d.ts.map +1 -0
  53. package/dist/types/core/elements/legend.d.ts +131 -0
  54. package/dist/types/core/elements/legend.d.ts.map +1 -0
  55. package/dist/types/core/elements/margins.d.ts +9 -0
  56. package/dist/types/core/elements/margins.d.ts.map +1 -0
  57. package/dist/types/core/elements/panel.d.ts +13 -0
  58. package/dist/types/core/elements/panel.d.ts.map +1 -0
  59. package/dist/types/core/elements/scroll.d.ts +14 -0
  60. package/dist/types/core/elements/scroll.d.ts.map +1 -0
  61. package/dist/types/core/elements/shadow.d.ts +14 -0
  62. package/dist/types/core/elements/shadow.d.ts.map +1 -0
  63. package/dist/types/core/elements/stroke.d.ts +19 -0
  64. package/dist/types/core/elements/stroke.d.ts.map +1 -0
  65. package/dist/types/core/elements/wall.d.ts +13 -0
  66. package/dist/types/core/elements/wall.d.ts.map +1 -0
  67. package/dist/types/core/elements/zoom.d.ts +33 -0
  68. package/dist/types/core/elements/zoom.d.ts.map +1 -0
  69. package/dist/types/core/primitives.d.ts +33 -0
  70. package/dist/types/core/primitives.d.ts.map +1 -0
  71. package/dist/types/core.d.ts +96 -0
  72. package/dist/types/core.d.ts.map +1 -0
  73. package/dist/types/data/data-engine.d.ts +245 -0
  74. package/dist/types/data/data-engine.d.ts.map +1 -0
  75. package/dist/types/date.format.d.ts +5 -0
  76. package/dist/types/date.format.d.ts.map +1 -0
  77. package/dist/types/declarative-tools.d.ts +6 -0
  78. package/dist/types/declarative-tools.d.ts.map +1 -0
  79. package/dist/types/do-http-request.d.ts +2 -0
  80. package/dist/types/do-http-request.d.ts.map +1 -0
  81. package/dist/types/dom-tip.d.ts +41 -0
  82. package/dist/types/dom-tip.d.ts.map +1 -0
  83. package/dist/types/events.d.ts +82 -0
  84. package/dist/types/events.d.ts.map +1 -0
  85. package/dist/types/extras.d.ts +18 -0
  86. package/dist/types/extras.d.ts.map +1 -0
  87. package/dist/types/index.d.ts +5 -0
  88. package/dist/types/index.d.ts.map +1 -0
  89. package/dist/types/interaction.d.ts +67 -0
  90. package/dist/types/interaction.d.ts.map +1 -0
  91. package/dist/types/map-series-definition.d.ts +5 -0
  92. package/dist/types/map-series-definition.d.ts.map +1 -0
  93. package/dist/types/maps/africa-map.d.ts +10 -0
  94. package/dist/types/maps/africa-map.d.ts.map +1 -0
  95. package/dist/types/maps/asia-map.d.ts +10 -0
  96. package/dist/types/maps/asia-map.d.ts.map +1 -0
  97. package/dist/types/maps/australia-map.d.ts +10 -0
  98. package/dist/types/maps/australia-map.d.ts.map +1 -0
  99. package/dist/types/maps/europe-map.d.ts +10 -0
  100. package/dist/types/maps/europe-map.d.ts.map +1 -0
  101. package/dist/types/maps/europe27-map.d.ts +10 -0
  102. package/dist/types/maps/europe27-map.d.ts.map +1 -0
  103. package/dist/types/maps/layout-map.d.ts +51 -0
  104. package/dist/types/maps/layout-map.d.ts.map +1 -0
  105. package/dist/types/maps/map-types.d.ts +19 -0
  106. package/dist/types/maps/map-types.d.ts.map +1 -0
  107. package/dist/types/maps/south-america-map.d.ts +10 -0
  108. package/dist/types/maps/south-america-map.d.ts.map +1 -0
  109. package/dist/types/maps/spain-map.d.ts +11 -0
  110. package/dist/types/maps/spain-map.d.ts.map +1 -0
  111. package/dist/types/maps/svg-map.d.ts +37 -0
  112. package/dist/types/maps/svg-map.d.ts.map +1 -0
  113. package/dist/types/maps/usa-map.d.ts +12 -0
  114. package/dist/types/maps/usa-map.d.ts.map +1 -0
  115. package/dist/types/maps/world-map.d.ts +14 -0
  116. package/dist/types/maps/world-map.d.ts.map +1 -0
  117. package/dist/types/maps.d.ts +15 -0
  118. package/dist/types/maps.d.ts.map +1 -0
  119. package/dist/types/marks-animation.d.ts +16 -0
  120. package/dist/types/marks-animation.d.ts.map +1 -0
  121. package/dist/types/modern-theme.d.ts +14 -0
  122. package/dist/types/modern-theme.d.ts.map +1 -0
  123. package/dist/types/optional-options.d.ts +6 -0
  124. package/dist/types/optional-options.d.ts.map +1 -0
  125. package/dist/types/palette.d.ts +11 -0
  126. package/dist/types/palette.d.ts.map +1 -0
  127. package/dist/types/platform.d.ts +27 -0
  128. package/dist/types/platform.d.ts.map +1 -0
  129. package/dist/types/plugin.d.ts +80 -0
  130. package/dist/types/plugin.d.ts.map +1 -0
  131. package/dist/types/quadrants-plugin.d.ts +45 -0
  132. package/dist/types/quadrants-plugin.d.ts.map +1 -0
  133. package/dist/types/register-all.d.ts +3 -0
  134. package/dist/types/register-all.d.ts.map +1 -0
  135. package/dist/types/rendering/canvas-graphics.d.ts +65 -0
  136. package/dist/types/rendering/canvas-graphics.d.ts.map +1 -0
  137. package/dist/types/rendering/graphics.d.ts +59 -0
  138. package/dist/types/rendering/graphics.d.ts.map +1 -0
  139. package/dist/types/rendering/renderer.d.ts +58 -0
  140. package/dist/types/rendering/renderer.d.ts.map +1 -0
  141. package/dist/types/rendering/three-graphics.d.ts +22 -0
  142. package/dist/types/rendering/three-graphics.d.ts.map +1 -0
  143. package/dist/types/responsive.d.ts +8 -0
  144. package/dist/types/responsive.d.ts.map +1 -0
  145. package/dist/types/series/activity-gauge.d.ts +18 -0
  146. package/dist/types/series/activity-gauge.d.ts.map +1 -0
  147. package/dist/types/series/arc-gauge.d.ts +74 -0
  148. package/dist/types/series/arc-gauge.d.ts.map +1 -0
  149. package/dist/types/series/area.d.ts +24 -0
  150. package/dist/types/series/area.d.ts.map +1 -0
  151. package/dist/types/series/bar.d.ts +17 -0
  152. package/dist/types/series/bar.d.ts.map +1 -0
  153. package/dist/types/series/box-plot.d.ts +140 -0
  154. package/dist/types/series/box-plot.d.ts.map +1 -0
  155. package/dist/types/series/bubble.d.ts +25 -0
  156. package/dist/types/series/bubble.d.ts.map +1 -0
  157. package/dist/types/series/bullet.d.ts +86 -0
  158. package/dist/types/series/bullet.d.ts.map +1 -0
  159. package/dist/types/series/candle.d.ts +27 -0
  160. package/dist/types/series/candle.d.ts.map +1 -0
  161. package/dist/types/series/circular-gauge.d.ts +100 -0
  162. package/dist/types/series/circular-gauge.d.ts.map +1 -0
  163. package/dist/types/series/color-series.d.ts +59 -0
  164. package/dist/types/series/color-series.d.ts.map +1 -0
  165. package/dist/types/series/composed-series.d.ts +76 -0
  166. package/dist/types/series/composed-series.d.ts.map +1 -0
  167. package/dist/types/series/custom-bar.d.ts +63 -0
  168. package/dist/types/series/custom-bar.d.ts.map +1 -0
  169. package/dist/types/series/custom-series.d.ts +74 -0
  170. package/dist/types/series/custom-series.d.ts.map +1 -0
  171. package/dist/types/series/donut.d.ts +17 -0
  172. package/dist/types/series/donut.d.ts.map +1 -0
  173. package/dist/types/series/gantt.d.ts +47 -0
  174. package/dist/types/series/gantt.d.ts.map +1 -0
  175. package/dist/types/series/high-low-bar.d.ts +24 -0
  176. package/dist/types/series/high-low-bar.d.ts.map +1 -0
  177. package/dist/types/series/histogram.d.ts +36 -0
  178. package/dist/types/series/histogram.d.ts.map +1 -0
  179. package/dist/types/series/horiz-area.d.ts +11 -0
  180. package/dist/types/series/horiz-area.d.ts.map +1 -0
  181. package/dist/types/series/horiz-bar.d.ts +23 -0
  182. package/dist/types/series/horiz-bar.d.ts.map +1 -0
  183. package/dist/types/series/line.d.ts +22 -0
  184. package/dist/types/series/line.d.ts.map +1 -0
  185. package/dist/types/series/linear-gauge.d.ts +73 -0
  186. package/dist/types/series/linear-gauge.d.ts.map +1 -0
  187. package/dist/types/series/map-series.d.ts +82 -0
  188. package/dist/types/series/map-series.d.ts.map +1 -0
  189. package/dist/types/series/numeric-gauge.d.ts +96 -0
  190. package/dist/types/series/numeric-gauge.d.ts.map +1 -0
  191. package/dist/types/series/palette-series.d.ts +39 -0
  192. package/dist/types/series/palette-series.d.ts.map +1 -0
  193. package/dist/types/series/pie.d.ts +81 -0
  194. package/dist/types/series/pie.d.ts.map +1 -0
  195. package/dist/types/series/point-xy.d.ts +13 -0
  196. package/dist/types/series/point-xy.d.ts.map +1 -0
  197. package/dist/types/series/polar.d.ts +37 -0
  198. package/dist/types/series/polar.d.ts.map +1 -0
  199. package/dist/types/series/sankey.d.ts +90 -0
  200. package/dist/types/series/sankey.d.ts.map +1 -0
  201. package/dist/types/series/series-list.d.ts +127 -0
  202. package/dist/types/series/series-list.d.ts.map +1 -0
  203. package/dist/types/series/series-list.types.d.ts +43 -0
  204. package/dist/types/series/series-list.types.d.ts.map +1 -0
  205. package/dist/types/series/sliced.d.ts +13 -0
  206. package/dist/types/series/sliced.d.ts.map +1 -0
  207. package/dist/types/series/surface.d.ts +24 -0
  208. package/dist/types/series/surface.d.ts.map +1 -0
  209. package/dist/types/series/treemap.d.ts +107 -0
  210. package/dist/types/series/treemap.d.ts.map +1 -0
  211. package/dist/types/series/violin.d.ts +105 -0
  212. package/dist/types/series/violin.d.ts.map +1 -0
  213. package/dist/types/series/volume.d.ts +11 -0
  214. package/dist/types/series/volume.d.ts.map +1 -0
  215. package/dist/types/series-definitions.d.ts +30 -0
  216. package/dist/types/series-definitions.d.ts.map +1 -0
  217. package/dist/types/series-registry.d.ts +37 -0
  218. package/dist/types/series-registry.d.ts.map +1 -0
  219. package/dist/types/series-utils.d.ts +29 -0
  220. package/dist/types/series-utils.d.ts.map +1 -0
  221. package/dist/types/series.d.ts +342 -0
  222. package/dist/types/series.d.ts.map +1 -0
  223. package/dist/types/slider.d.ts +49 -0
  224. package/dist/types/slider.d.ts.map +1 -0
  225. package/dist/types/spline.d.ts +2 -0
  226. package/dist/types/spline.d.ts.map +1 -0
  227. package/dist/types/table/chart-table.d.ts +27 -0
  228. package/dist/types/table/chart-table.d.ts.map +1 -0
  229. package/dist/types/teechart-3d.d.ts +4 -0
  230. package/dist/types/teechart-3d.d.ts.map +1 -0
  231. package/dist/types/theme.d.ts +41 -0
  232. package/dist/types/theme.d.ts.map +1 -0
  233. package/dist/types/three/chart-3d.d.ts +77 -0
  234. package/dist/types/three/chart-3d.d.ts.map +1 -0
  235. package/dist/types/three/chart-options-3d.d.ts +5 -0
  236. package/dist/types/three/chart-options-3d.d.ts.map +1 -0
  237. package/dist/types/three/teechart-3d.d.ts +25 -0
  238. package/dist/types/three/teechart-3d.d.ts.map +1 -0
  239. package/dist/types/three-context.d.ts +184 -0
  240. package/dist/types/three-context.d.ts.map +1 -0
  241. package/dist/types/three-context.types.d.ts +177 -0
  242. package/dist/types/three-context.types.d.ts.map +1 -0
  243. package/dist/types/three-parametric-geometry.d.ts +7 -0
  244. package/dist/types/three-parametric-geometry.d.ts.map +1 -0
  245. package/dist/types/three.d.ts +6 -0
  246. package/dist/types/three.d.ts.map +1 -0
  247. package/dist/types/tools/animate-hover.d.ts +13 -0
  248. package/dist/types/tools/animate-hover.d.ts.map +1 -0
  249. package/dist/types/tools/annotation.d.ts +169 -0
  250. package/dist/types/tools/annotation.d.ts.map +1 -0
  251. package/dist/types/tools/base-animation.d.ts +83 -0
  252. package/dist/types/tools/base-animation.d.ts.map +1 -0
  253. package/dist/types/tools/cursor-tool.d.ts +51 -0
  254. package/dist/types/tools/cursor-tool.d.ts.map +1 -0
  255. package/dist/types/tools/drag-tool.d.ts +28 -0
  256. package/dist/types/tools/drag-tool.d.ts.map +1 -0
  257. package/dist/types/tools/index.d.ts +8 -0
  258. package/dist/types/tools/index.d.ts.map +1 -0
  259. package/dist/types/tools/tool.d.ts +27 -0
  260. package/dist/types/tools/tool.d.ts.map +1 -0
  261. package/dist/types/tools/tools.d.ts +33 -0
  262. package/dist/types/tools/tools.d.ts.map +1 -0
  263. package/dist/types/utils.d.ts +23 -0
  264. package/dist/types/utils.d.ts.map +1 -0
  265. package/dist/types/worker.d.ts +92 -0
  266. package/dist/types/worker.d.ts.map +1 -0
  267. package/package.json +73 -26
  268. package/dist/Tween.js +0 -13
  269. package/dist/date.format.js +0 -145
  270. package/dist/excanvas/canvas.text.js +0 -489
  271. package/dist/excanvas/excanvas.compiled.js +0 -35
  272. package/dist/excanvas/excanvas.js +0 -924
  273. package/dist/excanvas/excanvas_text.js +0 -1416
  274. package/dist/three.js +0 -990
@@ -0,0 +1,45 @@
1
+ # Native 3D compatibility and implementation contract
2
+
3
+ `TeeChart3D` runs the canonical `Chart` engine and full `ChartOptions` API through the existing Three.js
4
+ drawing context. It covers the registered series, axis, legend, theme, palette, plugin and tool APIs
5
+ through the same code paths as a 2D chart. `Chart3D` and `createChart3DScene` are separate low-level,
6
+ data-only scene APIs. This matrix tracks their direct `Chart3DOptions` geometry coverage; it does not
7
+ limit the complete `TeeChart3D` API. A native-scene feature is complete only when its behavior, public
8
+ types, tests and an example are present.
9
+
10
+ | Capability | Status | Contract or outstanding work |
11
+ | --- | --- | --- |
12
+ | Lifecycle | Partial | Create, replace scene, resize, destroy; test WebGL and resource ownership in browser. |
13
+ | Full `ChartOptions` adapter | Supported | `TeeChart3D` applies normal `ChartOptions` to `Chart`, forces `aspect.view3d`, redraws through the Three context and cleans up chart, renderer and resize observer. Optional built-ins follow `Chart` and require `registerAll()` or individual registration. |
14
+ | Camera and interaction | Partial | Perspective or orthographic projection, position updates, orbit controls and click picking for bar, point, line, area, circular and surface points; other events pending. |
15
+ | Scene and lighting | Partial | Background, dimensions, ambient and directional lights, optional back wall and floor; configurable lights and wall styles pending. |
16
+ | Axes and grids | Partial | Linear vertical range, inversion, grid, ticks, numeric and category labels; log/date axes, clipping and multiple axes pending. |
17
+ | Title, subtitle, footer | Partial | Plain title, subtitle and footer text, plus title visibility; typography and layout options pending. |
18
+ | Legend | Partial | Plain series labels; layout, symbols, style and interactions pending. |
19
+ | Marks | Partial | Cartesian value labels and visibility; placement, connectors, styles and circular/surface marks pending. |
20
+ | Series styles | Partial | Color, visibility and transparency; stroke, gradients, textures and palette pending. |
21
+ | Bar | Partial | Signed values, depth rows and absolute or percentage stacking; horizontal bars and sizing options pending. |
22
+ | Line | Partial | Numeric values, explicit numeric/date X positions and gaps; null modes, interpolation, pointers and styles pending. |
23
+ | Point | Partial | Numeric points and visibility; pointer options, x coordinates and hit testing pending. |
24
+ | Area | Partial | Numeric values, gaps and zero crossings; stacking, x coordinates and styles pending. |
25
+ | Bubble | Partial | Cartesian X/Y points and relative 3D radii from object data; full pointer styling and radius axis semantics pending. |
26
+ | Volume | Partial | Signed narrow volume columns; financial volume row semantics and styling pending. |
27
+ | Pie, donut | Partial | Extruded slices and point identity; labels, placement and series options pending. |
28
+ | Sliced | Partial | Proportional extruded blocks and point identity; labels and layout options pending. |
29
+ | Activity gauge | Pending | Gauge geometry, labels, hit testing and options. |
30
+ | Surface | Partial | Rectangular numeric grids, wireframe and nearest-vertex picking; palettes and existing options mapping pending. |
31
+ | Color grid | Partial | Rectangular numeric grids render as individually colored, pickable 3D cells; palette integration and cell labels remain pending. |
32
+ | Polar, financial, statistical, Gantt, histogram, bullet | Pending | Geometry, data semantics and options for each registered series type. |
33
+ | Circular, linear, numeric and arc gauges | Pending | Gauge geometry and configuration. |
34
+ | Treemap, Sankey, map | Pending | Hierarchical, flow and geographic geometry and options. |
35
+ | Tools | Pending | Tooltip, cursor, drag, annotations and animations; decide 3D behavior per tool. |
36
+ | `ChartOptions` | Partial | Explicit conversion of a small subset; unsupported settings are rejected. |
37
+ | Plugins, themes and palettes | Pending | Establish scene lifecycle hooks and reuse applicable chart configuration. |
38
+ | Bundles and public types | Partial | Root and `/3d` exports; `/core` must not include Three.js. |
39
+ | Demos and migration | Pending | Replace existing demos and document breaking changes before removing the bridge. |
40
+
41
+ The canonical inventory is `src/chart-options.ts` (`ChartOptions`, `AxisOptions`,
42
+ `SeriesOptionsRegistry`, `ToolsOptions`) plus the public imperative objects exported from
43
+ `src/core.ts`. Each option needs either implemented behavior with a test or a documented,
44
+ explicit rejection/alternative. The renderer must never silently approximate a complete
45
+ TeeChart chart while presenting itself as compatible with those options.
package/README.md CHANGED
@@ -1,42 +1,478 @@
1
1
  # TeeChart.js
2
2
 
3
- <a href="https://www.steema.com/product/js">
4
- <img align="right" src="http://www.steema.com/img/logos/teechartjs.png">
5
- </a>
3
+ JavaScript charting with Canvas, TypeScript declarations, maps, gauges and optional 3D rendering.
6
4
 
7
- Powerful yet flexible JavaScript charting for designers & developers.
5
+ ## Installation
8
6
 
9
- [![npm](https://img.shields.io/npm/v/teechart.js)](https://www.npmjs.com/package/teechart.js)
10
- [![License](https://img.shields.io/badge/license-Steema-blue)](https://www.steema.com/licensing/js)
7
+ ```sh
8
+ pnpm add teechart.js
9
+ ```
11
10
 
12
- ## Documentation
11
+ ## Usage
13
12
 
14
- All links point to the latest version of the library.
13
+ Create a canvas in your page:
15
14
 
16
- - [Product Page](https://www.steema.com/product/js)
17
- - [Getting Started](https://teechartjs.steema.com/getting-started)
18
- - [API Reference](https://www.steema.com/docs/TeeChartHTML5Reference.htm)
19
- - [Demos](https://teechartjs.steema.com/demos)
20
- - [Legacy Demos](https://www.steema.com/files/public/teechart/html5/latest/demos/index.html)
21
- - [Release Notes](https://teechartjs.steema.com/release-notes)
22
- - [Migration Guide](https://teechartjs.steema.com/migration)
15
+ ```html
16
+ <canvas id="chart" width="640" height="400"></canvas>
17
+ ```
18
+
19
+ Create the chart with a declarative configuration. The chart type, data and common
20
+ presentation options live together. Call `draw()` to render the initial state;
21
+ `setOptions()` applies later changes and redraws automatically:
22
+
23
+ ```js
24
+ import { Chart } from "teechart.js"
25
+
26
+ const chart = new Chart("chart", {
27
+ title: { text: "Weekly sales", visible: true },
28
+ data: {
29
+ labels: ["Mon", "Tue", "Wed", "Thu"],
30
+ series: [{ type: "line", data: [10, 20, 15, 30], label: "Sales" }]
31
+ }
32
+ })
33
+ chart.draw()
34
+
35
+ // Update the chart later without rebuilding it:
36
+ chart.setOptions({
37
+ data: {
38
+ labels: ["Mon", "Tue", "Wed", "Thu"],
39
+ series: [{ type: "line", data: [12, 18, 22, 28], label: "Sales" }]
40
+ }
41
+ })
42
+
43
+ // When the host component or page is removed:
44
+ // chart.destroy()
45
+ ```
46
+
47
+ Axes can also be configured and updated declaratively. For example,
48
+ `axes: { left: { position: 50, innerTicksVisible: true, minorTicksVisible: true,
49
+ grid: { bandColor: "#ffffe6" } } }` positions the left axis at 50% and styles its ticks
50
+ and alternating grid bands. Set `bandColor` to an empty string to remove the fill.
51
+
52
+ Cartesian series also accept point objects when each value has its own position. This is
53
+ useful for irregularly spaced or date-based data:
54
+
55
+ ```js
56
+ const chart = new Chart("chart", {
57
+ data: {
58
+ series: [
59
+ {
60
+ type: "line",
61
+ data: [
62
+ { x: new Date("2026-04-01"), y: 12 },
63
+ { x: new Date("2026-04-08"), y: 18 },
64
+ { x: new Date("2026-04-20"), y: 15 }
65
+ ]
66
+ }
67
+ ]
68
+ }
69
+ })
70
+ ```
71
+
72
+ Pie and donut marks can be styled and positioned in the same declarative series options.
73
+ `maxRadius` controls the pie size; `marks` supports label placement, connector, fill,
74
+ border, text color and size, corner radius, and margins:
75
+
76
+ ```js
77
+ const chart = new Chart("chart", {
78
+ type: "pie",
79
+ data: {
80
+ labels: ["Apples", "Pears", "Plums"],
81
+ series: [{
82
+ data: [15, 10, 8],
83
+ maxRadius: 85,
84
+ marks: {
85
+ visible: true,
86
+ style: "labelvalue",
87
+ placement: "outside",
88
+ connector: "straight",
89
+ backgroundColor: "#f8fafc",
90
+ borderColor: "",
91
+ fontSize: 11,
92
+ fontColor: "#0f172a",
93
+ borderRadius: 7,
94
+ margins: { left: 7, right: 7, top: 4, bottom: 4 }
95
+ }
96
+ }]
97
+ }
98
+ })
99
+ chart.draw()
100
+ ```
101
+
102
+ `registerAllSeriesTypes()` also enables `colorGrid` and `surface` with a matrix of
103
+ numbers (one array per row), and `linearGauge` with a numeric `data` value and optional
104
+ `min` and `max`. Matrix rows are copied, so updating a chart does not mutate your data.
105
+ Surface options accept `wireFrame`; rendering in WebGL still requires a `Three` adapter.
106
+
107
+ Canvas maps are registered separately to keep SVG maps outside the core runtime graph.
108
+ The map data is a factory, called when the chart creates or updates its series. This
109
+ lets React applications declare the options before browser APIs are available:
110
+
111
+ ```js
112
+ import { Chart, registerSeriesType } from "teechart.js/core"
113
+ import { mapSeriesType, WorldMap } from "teechart.js/maps"
114
+
115
+ registerSeriesType("map", mapSeriesType)
116
+ const chart = new Chart("chart", {
117
+ data: { series: [{ type: "map", data: () => new WorldMap() }] },
118
+ tooltip: { enabled: true }
119
+ })
120
+ chart.draw()
121
+ ```
122
+
123
+ For applications that prefer every built-in optional series and chart option, the
124
+ `registerAll()` function registers them, including the map series type. It also leaves the Three
125
+ integration available through its regular direct API:
126
+
127
+ ```js
128
+ import { Chart, WorldMap, registerAll } from "teechart.js"
129
+
130
+ registerAll()
131
+
132
+ const chart = new Chart("chart", {
133
+ data: { series: [{ type: "map", data: () => new WorldMap() }] },
134
+ responsive: true
135
+ })
136
+ ```
137
+
138
+ Use the regular `teechart.js` or `teechart.js/core` entry and register selected features
139
+ manually when bundle size is a priority. The `auto` entry includes optional features in
140
+ the consuming application's bundle.
141
+
142
+ The React demos use `options` for their chart data and supported settings. They keep
143
+ `configure` for custom canvas drawing, additional gauge hands, geographic projections,
144
+ data-source adapters and animation controls that need the live chart instance.
145
+
146
+ For application data that uses different property names, set `xKey` and `yKey` on the
147
+ series. They default to `x` and `y`:
148
+
149
+ ```js
150
+ const chart = new Chart("chart", {
151
+ data: {
152
+ series: [{
153
+ type: "line",
154
+ data: [{ date: new Date("2026-04-01"), revenue: 12 }],
155
+ xKey: "date",
156
+ yKey: "revenue"
157
+ }]
158
+ }
159
+ })
160
+ ```
161
+
162
+ The existing `number[]` form with a parallel `x` array remains supported. Do not provide
163
+ both forms of horizontal position in the same series. These keys apply to Cartesian series
164
+ using object rows; specialized series keep their own data shapes.
165
+
166
+ `setOptions()` is a patch: omitted options keep their current values, and removing an
167
+ option from a later object does not reset it to its default. When `data.series` is
168
+ provided, it describes the complete series list and entries missing from the new list
169
+ are removed. Give series an `id` to keep their instances matched across reordering and
170
+ updates; series without an `id` continue to match by position. The `plugins` option is
171
+ creation-only, so changing plugin definitions requires destroying and recreating the chart.
172
+ Toggle an attached plugin in place with `chart.setPluginEnabled(id, enabled)`. Its init and
173
+ cleanup hooks run on each transition, and its configured options are retained when toggled
174
+ through this method.
175
+
176
+ Use `resetOptions()` to restore every resettable declarative section to TeeChart.js defaults,
177
+ or pass section names to reset only those parts. Plugin definitions are fixed when the chart
178
+ is created and cannot be reset:
179
+
180
+ ```js
181
+ chart.resetOptions(["title", "data"])
182
+ chart.resetOptions() // reset all supported sections
183
+ ```
184
+
185
+ Use `compareChartOptions()` when an integration needs to decide whether new declarative
186
+ options can be patched or require a new chart:
187
+
188
+ ```js
189
+ import { Chart, compareChartOptions } from "teechart.js"
190
+
191
+ let chart = new Chart("chart", {
192
+ type: "line",
193
+ data: { series: [{ data: [10, 20, 15, 30] }] }
194
+ })
195
+ chart.draw()
196
+
197
+ const nextOptions = { title: { text: "Updated", visible: true }, data: { series: [{ type: "line", data: [12, 18, 22, 28] }] } }
198
+ const change = compareChartOptions(chart.getOptions(), nextOptions)
199
+
200
+ if (change.change === "patch") chart.setOptions(change.patch)
201
+ if (change.change === "recreate") {
202
+ chart.destroy()
203
+ chart = new Chart("chart", change.patch)
204
+ chart.draw()
205
+ }
206
+ ```
207
+
208
+ The comparison returns `"none"` when the applied options already match, `"patch"`
209
+ when `setOptions()` can apply the changes, and `"recreate"` when an option value was
210
+ removed, the plugin list changed, or a plugin's enabled state changed. Series with ids
211
+ can be reordered in a patch without replacing their instances. For `"recreate"`, `patch`
212
+ contains the complete new configuration for the replacement chart.
213
+
214
+ Plugins can provide `defaults` and receive their resolved options after the hook's chart
215
+ arguments. A plugin can create state for each chart with `create`; that state is passed
216
+ to every hook and `destroy`. An `afterInit` hook can also return a cleanup function.
217
+ Use `order` to control execution when plugins depend on one another; lower values run
218
+ first and ties retain registration order. Configure a plugin by id with `pluginOptions`;
219
+ use `false` to disable a registered plugin for one chart:
220
+
221
+ ```js
222
+ const chart = new Chart("chart", {
223
+ pluginOptions: { watermark: { text: "Internal preview" } }
224
+ })
225
+ ```
226
+
227
+ Applications can add known plugin ids to `PluginOptionsRegistry` for option autocomplete
228
+ and type checking while keeping other ids available for dynamic plugins:
229
+
230
+ ```ts
231
+ import { Chart } from "teechart.js"
232
+
233
+ declare module "teechart.js" {
234
+ interface PluginOptionsRegistry {
235
+ watermark: { text?: string; opacity?: number }
236
+ }
237
+ }
238
+
239
+ new Chart("chart", {
240
+ pluginOptions: { watermark: { text: "Internal preview", opacity: 0.5 } }
241
+ })
242
+ ```
23
243
 
24
- ## History
244
+ The core includes a built-in `quadrants` plugin that stays inert until configured. It paints
245
+ four background regions behind the series, split at `split.x` and `split.y` (axis values, or `"mean"` /
246
+ `"median"` of the chart data). Areas (`topLeft`, `topRight`, `bottomLeft`, `bottomRight`)
247
+ take a `backgroundColor` and a corner `text`; `divider` styles the split lines:
25
248
 
26
- [teechart.js](https://teechartjs.steema.com/) comes from TeeChart JavaScript/HTML5, a library initially written by [David Berneda](https://github.com/davidberneda) in 2012 and maintained by the team at [Steema Software](https://www.steema.com).
27
- Steema Software open-sourced the library in March 2018 but still offers [paid support subscriptions](https://www.steema.com/product/js#pricing).
249
+ ```js
250
+ const chart = new Chart("chart", {
251
+ pluginOptions: {
252
+ quadrants: {
253
+ split: { x: 0, y: "mean" },
254
+ areas: {
255
+ topLeft: { backgroundColor: "rgba(255, 99, 132, 0.2)", text: "Q2" },
256
+ bottomRight: { backgroundColor: "rgba(75, 192, 192, 0.2)", text: "Q4" }
257
+ },
258
+ divider: { color: "#888", width: 1 }
259
+ }
260
+ }
261
+ })
262
+ ```
28
263
 
29
- ## Contributing
264
+ Global plugin registration is keyed by `id`. Registering another plugin object with an
265
+ existing id replaces its definition for newly created charts. Existing charts retain
266
+ their original plugin lifecycle until destruction. Unregister the currently registered
267
+ object to remove its hooks and owned themes or palettes; when multiple plugins provide
268
+ the same resource name, the previous owner or base registry becomes active again after
269
+ unregistration. Plugins passed in `ChartOptions.plugins` keep their hooks, themes, and
270
+ palettes scoped to that chart. Their resources are available while the initial options
271
+ are applied, and never enter the global theme or palette registry.
30
272
 
31
- Before submitting an issue, please check the [Issue Tracker](https://www.steema.com/bugs/buglist.cgi?product=HTML5%20JavaScript%20TeeChart&query_format=advanced&resolution=---) first. For support, please contact [Steema Software](https://www.steema.com/support).
273
+ The imperative API is also available when you need to work directly with series and
274
+ chart components:
275
+
276
+ ```js
277
+ import { Chart, Line } from "teechart.js"
278
+
279
+ const chart = new Chart("chart")
280
+ chart.addSeries(new Line([10, 20, 15, 30]))
281
+ chart.draw()
282
+
283
+ const series = chart.series.items[0]
284
+ const pointPosition = series.getPointPosition(2) // canvas pixel coordinates
285
+ ```
286
+
287
+ `getPointPosition(index, point?)` uses the series' axes and point calculation to return
288
+ canvas coordinates. Call it after the chart has calculated its axes, such as inside
289
+ `afterSeriesDraw`; pass a reusable `Point` when querying many positions.
290
+ `getCanvasBounds(rectangle?)` returns the series bounds in canvas coordinates and can
291
+ reuse a supplied `Rectangle`. The legacy `bounds(rectangle)` method remains available;
292
+ Gantt's `bounds(index, rectangle?)` overload still calculates an individual task's bounds.
293
+
294
+ Destroying a chart releases its slider touch handlers, tooltip callbacks and
295
+ pointer animations, including sliders created without `chart.tools.add`.
296
+ Use `chart.tools.remove(tool, true)` to dispose a slider or tooltip earlier.
297
+ Each `Series` belongs to one chart at a time; `chart.addSeries(series)` transfers it
298
+ from its previous chart. Tools are bound to the chart passed to their constructor and
299
+ cannot be added to another chart; create a new tool for the destination chart.
300
+ Hiding or destroying a tooltip discards pending asynchronous text updates.
301
+ DOM tooltips preserve application-owned `document.onmousemove` handlers and
302
+ listeners. Canvas cleanup restores application handlers even when chart lifetimes
303
+ overlap on the same canvas.
304
+ The legacy DOM renderer still shares one active tooltip across charts.
305
+
306
+ The package exports constructors and helpers as named ESM exports. For namespace-style
307
+ usage, write `import * as Tee from "teechart.js"`. There is no default export.
308
+ TypeScript declarations are included; no separate TeeChart types package is needed.
309
+
310
+ Known `Series` properties such as visibility, axis selectors, date formats and
311
+ animation hooks have explicit types. `SeriesData.source` is `unknown`; narrow it
312
+ to the expected source element before accessing its properties.
313
+ `DataEngine.onclickseries` is typed as a callback accepting a `Series` and a
314
+ numeric point index, or `null`/`undefined` when unset. Check it before calling it.
315
+ `Series` and `SeriesData` no longer have an index signature: reading or assigning a property
316
+ that the class does not declare is a compile-time error. Series types declare the properties
317
+ they use, and `SeriesData` lists the arrays that specific series fill (`x`, `open`, `high`,
318
+ `low`, `close`, `start`, `end`...). Series constructors accept `number[]`, a chart or a data
319
+ source object, and an optional labels array, instead of `unknown`.
320
+
321
+ ### Updating data
322
+
323
+ `series.append(value, label)` associates the label with the appended point's index,
324
+ including when earlier points have no labels. Numeric text rows with a value of
325
+ zero retain their labels. `DataDimension.selected` accepts scalar values or arrays,
326
+ including `0`, `false`, and `""`. Set `selectedInclude = false` to exclude the selected
327
+ categories; use `null`, `undefined`, or `[]` to clear a selection. Queries preserve the
328
+ selection and filter mode, including when a metric throws. With `nulls = false`, zero
329
+ and false remain valid categories, while missing and empty categories are hidden.
330
+ Empty categories are removed after considering all metrics; numeric array indices
331
+ and string object keys retain their types. Query charts retain zero group titles and
332
+ use primitive category ids as labels when later series introduce new categories.
333
+
334
+ ### Bullet orientation
335
+
336
+ `Bullet` is horizontal by default. Set `yMandatory = true` for vertical bullets:
337
+
338
+ ```js
339
+ import { Bullet } from "teechart.js"
340
+
341
+ const bullet = new Bullet([85], ["Revenue"])
342
+ bullet.yMandatory = true
343
+ bullet.states.values = [70, 20, 40] // consecutive range widths from the origin
344
+ bullet.limit.origin = 100 // target, relative to the origin
345
+ chart.addSeries(bullet)
346
+ chart.draw()
347
+ ```
348
+
349
+ Each point occupies its own row (horizontal) or column (vertical), grouped by category
350
+ axis across visible Bullet series. Ranges, measures, target markers and tooltips follow
351
+ the orientation. `states.barSize`, `barSize` and `limit.height` are percentages of the
352
+ slot perpendicular to the value axis; `limit.width` is the marker thickness along the
353
+ value axis, in axis units. Use `minValue()` and `maxValue()` for the value range in
354
+ either orientation. Change `yMandatory` and call `chart.draw()` to switch orientation;
355
+ move any manually configured value-axis range to the new value axis as well.
356
+
357
+ ## Optional ESM entries
358
+
359
+ ```js
360
+ import { Chart, Line } from "teechart.js/core"
361
+ import { Map as MapSeries, WorldMap } from "teechart.js/maps"
362
+ import { Three } from "teechart.js/3d"
363
+ ```
364
+
365
+ `/core` contains the engine, series and utilities without loading maps or Three.js.
366
+ `/maps` provides SVG/geographic maps and the map series; `/3d` provides the Three.js
367
+ bridge and parametric geometry. The root entry keeps the complete API. All ESM entries
368
+ share their base classes and plugin/theme registries and include TypeScript declarations.
369
+ `registerAll()` from the root entry registers built-in optional series and chart options when
370
+ called, including the map series type. Its optional feature code is included in the consumer's
371
+ bundle when the function is used.
372
+
373
+ The new native 3D renderer is available alongside the existing `Three` bridge:
374
+
375
+ ```js
376
+ import { TeeChart3D } from "teechart.js/3d"
377
+
378
+ const chart = new TeeChart3D(document.querySelector("canvas"), {
379
+ theme: "modernDark",
380
+ palette: "excel",
381
+ type: "bar",
382
+ data: { labels: ["North", "South", "West"], series: [{ data: [2, -1, 4] }] },
383
+ axes: { left: { minimum: -2, maximum: 5 }, bottom: { visible: true } },
384
+ legend: { visible: true, position: "right" },
385
+ tooltip: { enabled: true }
386
+ })
387
+
388
+ // TeeChart3D.chart exposes the complete imperative Chart API.
389
+ chart.setOptions({ theme: "modern", data: { labels: ["North", "South", "West"], series: [{ data: [4, 2, 1] }] } })
390
+ chart.destroy()
391
+ ```
392
+
393
+ `TeeChart3D` runs the regular TeeChart chart engine and its full `ChartOptions` through the Three.js
394
+ drawing context. Series, axes, themes, palettes, plugins, tools, tooltips and chart events therefore
395
+ use the same public APIs as a 2D `Chart`. `chart.chart` exposes the underlying `Chart` instance and
396
+ all imperative methods. As with `Chart`, call `registerAll()` when using optional built-in series
397
+ types or option sections such as annotations and animation. `TeeChart3D` forces `aspect.view3d` on
398
+ and observes canvas resizing by default.
399
+
400
+ `Chart3D` and `createChart3DScene` remain lower-level, data-only scene APIs. Their supported subset
401
+ and outstanding native geometry work are tracked in [3D-COMPATIBILITY.md](3D-COMPATIBILITY.md).
402
+ `chart3DOptionsFromChartOptions` is a strict converter for that subset; use `TeeChart3D` when you need
403
+ the complete TeeChart options and series registry.
404
+
405
+ Cartesian series can show value marks with `marks: true` and accept a `transparency` from 0
406
+ to 1. Set `camera.projection` to `"perspective"` or `"orthographic"`, and optionally provide
407
+ `camera.position` as an `[x, y, z]` tuple. `setOptions()` can update the projection and position.
408
+ Bar series can use positive and negative stacks with `stacked: true`, or percentage stacks
409
+ with `stacked: "100"`. The `ChartOptions` converter accepts `"yes"` and `"100"` respectively.
410
+ The vertical `axis` supports `inverted`, `increment`, `decimals` and `fixedDecimals` in addition
411
+ to its range and visibility options.
412
+ Cartesian series also accept numeric `x` positions. The `ChartOptions` converter accepts numeric
413
+ positions or JavaScript `Date` values and converts dates to timestamps. It also accepts object
414
+ points with `x` and `y` fields or custom `xKey` and `yKey` fields. Date-axis label formatting is
415
+ not yet implemented.
416
+
417
+ ESM uses shared chunks. If you serve the files directly, copy all of `dist`, including
418
+ `dist/chunks`, and preserve relative paths. Optional imports reduce the JavaScript loaded
419
+ by the application; they do not change the npm package's installed dependencies.
420
+
421
+ The browser bundle `dist/teechart.js` exposes the global `Tee` namespace when loaded
422
+ with a classic script tag. ESM consumers should use the root or documented optional entries;
423
+ deep imports into `teechart.js/src` are unsupported.
424
+
425
+ ## Grouping remaining values
426
+
427
+ `DataEngine.groupRemaining(data, max, label)` and charts created by
428
+ `DataEngine.createChart()` using `groupOther(max)` limit each series in place,
429
+ reserving the last slot for the sum of all remaining values. For example,
430
+ `[10, 8, 5, 2]` with a limit of `3` becomes `[10, 8, 7]`. Labels and codes stay
431
+ aligned; the aggregate code is `null`. Series at or below the limit stay unchanged.
432
+
433
+ Use a positive integer limit, including the aggregate item; a limit of `1` groups
434
+ all values into that item when the series has more than one value. Grouping keeps
435
+ the current order, so sort the chart by values in descending order first to retain
436
+ the largest values.
437
+ `groupRemaining()` returns the original length minus the limit when grouping,
438
+ or `-1` when the series is unchanged.
439
+
440
+ ## Shared tooltips
441
+
442
+ Set `tooltip: { enabled: true, shared: true }` in `ChartOptions` to show the visible
443
+ cartesian series at the hovered category or x value together. The default DOM
444
+ tooltip keeps each series' color, name and formatted value. Numeric and date x
445
+ values are matched by value, so a missing point is omitted instead of showing a
446
+ different category. Hidden series and null or non-finite values are omitted.
447
+ Series must share the category axis and orientation. Canvas tooltips show one
448
+ text line per matching series. A custom `tooltip.format` still overrides the body.
449
+ The imperative equivalent is `toolTip.shared = true`.
450
+
451
+ ## Cursor rendering
452
+
453
+ `CursorTool` uses `render = "copy"` by default. It saves the chart bitmap and
454
+ restores it when the cursor moves, including transparent pixels. Each chart redraw
455
+ replaces the saved bitmap so animation frames do not accumulate. The snapshot
456
+ follows the canvas backing size when the chart is resized or its pixel ratio changes.
457
+
458
+ ## Documentation
459
+
460
+ - [Getting started](https://teechartjs.steema.com/getting-started)
461
+ - [Demos](https://teechartjs.steema.com/demos)
462
+ - [Framework integrations](https://teechartjs.steema.com/integrations)
463
+ - [Migration guide](https://teechartjs.steema.com/migration)
464
+ - [Release notes](https://teechartjs.steema.com/release-notes)
465
+ - [Support](https://www.steema.com/support)
32
466
 
33
467
  ## License
34
468
 
35
- Copyright (c) 2012-2026 Steema Software SL. All Rights Reserved.
36
- See the [licensing details](https://www.steema.com/licensing/js).
469
+ Copyright (c) 2012-2026 Steema Software SL. All Rights Reserved.
470
+
471
+ See [LICENSE.md](LICENSE.md) for the Steema non-commercial license.
472
+ Commercial use requires authorization from Steema; see the
473
+ [licensing details](https://www.steema.com/licensing/js).
474
+
475
+ ## Native 3D compatibility
37
476
 
38
- <p align="center">
39
- <a href="https://www.steema.com/">
40
- <img src="https://raw.githubusercontent.com/wiki/Steema/TeeChartJS/logo-steema.png">
41
- </a>
42
- </p>
477
+ The current native renderer is experimental. See [3D-COMPATIBILITY.md](3D-COMPATIBILITY.md)
478
+ for the feature matrix and the work required before it can replace the existing bridge.