@highcharts/grid-pro 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (373) hide show
  1. package/css/grid-pro.css +428 -432
  2. package/es-modules/Accessibility/A11yI18n.js +3 -3
  3. package/es-modules/Accessibility/Accessibility.js +4 -3
  4. package/es-modules/Accessibility/AccessibilityComponent.d.ts +1 -1
  5. package/es-modules/Accessibility/AccessibilityComponent.js +4 -3
  6. package/es-modules/Accessibility/Components/AnnotationsA11y.js +4 -3
  7. package/es-modules/Accessibility/Components/ContainerComponent.js +4 -3
  8. package/es-modules/Accessibility/Components/InfoRegionsComponent.js +4 -3
  9. package/es-modules/Accessibility/Components/LegendComponent.js +4 -3
  10. package/es-modules/Accessibility/Components/MenuComponent.js +4 -3
  11. package/es-modules/Accessibility/Components/NavigatorComponent.js +3 -3
  12. package/es-modules/Accessibility/Components/RangeSelectorComponent.js +4 -3
  13. package/es-modules/Accessibility/Components/SeriesComponent/ForcedMarkers.js +14 -3
  14. package/es-modules/Accessibility/Components/SeriesComponent/NewDataAnnouncer.js +4 -3
  15. package/es-modules/Accessibility/Components/SeriesComponent/SeriesComponent.js +4 -3
  16. package/es-modules/Accessibility/Components/SeriesComponent/SeriesDescriber.js +4 -3
  17. package/es-modules/Accessibility/Components/SeriesComponent/SeriesKeyboardNavigation.js +4 -3
  18. package/es-modules/Accessibility/Components/ZoomComponent.js +4 -3
  19. package/es-modules/Accessibility/FocusBorder.js +4 -3
  20. package/es-modules/Accessibility/HighContrastMode.js +4 -3
  21. package/es-modules/Accessibility/HighContrastTheme.js +4 -3
  22. package/es-modules/Accessibility/KeyboardNavigation.js +4 -3
  23. package/es-modules/Accessibility/KeyboardNavigationHandler.js +4 -3
  24. package/es-modules/Accessibility/Options/A11yDefaults.js +4 -3
  25. package/es-modules/Accessibility/Options/DeprecatedOptions.js +4 -3
  26. package/es-modules/Accessibility/Options/LangDefaults.js +4 -3
  27. package/es-modules/Accessibility/ProxyElement.js +4 -3
  28. package/es-modules/Accessibility/ProxyProvider.js +4 -3
  29. package/es-modules/Accessibility/Utils/Announcer.js +4 -3
  30. package/es-modules/Accessibility/Utils/ChartUtilities.js +4 -3
  31. package/es-modules/Accessibility/Utils/DOMElementProvider.js +4 -3
  32. package/es-modules/Accessibility/Utils/EventProvider.d.ts +1 -1
  33. package/es-modules/Accessibility/Utils/EventProvider.js +4 -3
  34. package/es-modules/Accessibility/Utils/HTMLUtilities.js +4 -3
  35. package/es-modules/Core/Animation/AnimationOptions.d.ts +42 -0
  36. package/es-modules/Core/Animation/AnimationOptions.js +10 -0
  37. package/es-modules/Core/Animation/AnimationUtilities.js +39 -3
  38. package/es-modules/Core/Animation/Fx.d.ts +1 -130
  39. package/es-modules/Core/Animation/Fx.js +13 -6
  40. package/es-modules/Core/Animation/FxBase.d.ts +1 -0
  41. package/es-modules/Core/Animation/FxBase.js +11 -0
  42. package/es-modules/Core/Callback.d.ts +49 -0
  43. package/es-modules/Core/Callback.js +10 -0
  44. package/es-modules/Core/Chart/Chart.d.ts +659 -400
  45. package/es-modules/Core/Chart/Chart.js +64 -54
  46. package/es-modules/Core/Chart/Chart3D.d.ts +123 -233
  47. package/es-modules/Core/Chart/Chart3D.js +22 -35
  48. package/es-modules/Core/Chart/ChartBase.d.ts +3 -0
  49. package/es-modules/Core/Chart/ChartBase.js +11 -0
  50. package/es-modules/Core/Chart/ChartDefaults.js +7 -12
  51. package/es-modules/Core/Chart/ChartNavigationComposition.d.ts +1 -55
  52. package/es-modules/Core/Chart/ChartNavigationComposition.js +13 -13
  53. package/es-modules/Core/Chart/ChartOptions.d.ts +1217 -0
  54. package/es-modules/Core/Chart/ChartOptions.js +10 -0
  55. package/es-modules/Core/Chart/GanttChart.d.ts +0 -38
  56. package/es-modules/Core/Chart/GanttChart.js +4 -3
  57. package/es-modules/Core/Chart/MapChart.d.ts +9 -4
  58. package/es-modules/Core/Chart/MapChart.js +13 -3
  59. package/es-modules/Core/Chart/StockChart.d.ts +0 -85
  60. package/es-modules/Core/Chart/StockChart.js +33 -15
  61. package/es-modules/Core/Color/Color.d.ts +16 -24
  62. package/es-modules/Core/Color/Color.js +26 -8
  63. package/es-modules/Core/Color/ColorString.d.ts +0 -23
  64. package/es-modules/Core/Color/ColorString.js +11 -0
  65. package/es-modules/Core/Color/ColorType.d.ts +0 -33
  66. package/es-modules/Core/Color/ColorType.js +11 -0
  67. package/es-modules/Core/Color/GradientColor.d.ts +0 -33
  68. package/es-modules/Core/Color/GradientColor.js +11 -0
  69. package/es-modules/Core/Color/Palettes.d.ts +1 -84
  70. package/es-modules/Core/Color/Palettes.js +2 -1
  71. package/es-modules/Core/Defaults.d.ts +6 -0
  72. package/es-modules/Core/Defaults.js +30 -66
  73. package/es-modules/Core/Foundation.d.ts +1 -19
  74. package/es-modules/Core/Foundation.js +7 -4
  75. package/es-modules/Core/Geometry/CircleObject.d.ts +5 -0
  76. package/es-modules/Core/Geometry/CircleObject.js +10 -0
  77. package/es-modules/Core/Geometry/CircleUtilities.d.ts +1 -189
  78. package/es-modules/Core/Geometry/CircleUtilities.js +17 -15
  79. package/es-modules/Core/Geometry/GeometryObject.d.ts +7 -0
  80. package/es-modules/Core/Geometry/GeometryObject.js +10 -0
  81. package/es-modules/Core/Geometry/GeometryUtilities.d.ts +1 -48
  82. package/es-modules/Core/Geometry/GeometryUtilities.js +9 -7
  83. package/es-modules/Core/Geometry/IntersectionObject.d.ts +7 -0
  84. package/es-modules/Core/Geometry/IntersectionObject.js +10 -0
  85. package/es-modules/Core/Geometry/PolygonClip.d.ts +1 -19
  86. package/es-modules/Core/Geometry/PolygonClip.js +9 -7
  87. package/es-modules/Core/Globals.d.ts +9 -31
  88. package/es-modules/Core/Globals.js +9 -10
  89. package/es-modules/Core/GlobalsBase.d.ts +35 -0
  90. package/es-modules/Core/GlobalsBase.js +11 -0
  91. package/es-modules/Core/HttpUtilities.d.ts +54 -17
  92. package/es-modules/Core/HttpUtilities.js +15 -14
  93. package/es-modules/Core/JSON.d.ts +29 -0
  94. package/es-modules/Core/JSON.js +13 -0
  95. package/es-modules/Core/KeyboardEvent.d.ts +1 -0
  96. package/es-modules/Core/KeyboardEvent.js +11 -0
  97. package/es-modules/Core/MSPointer.d.ts +1 -74
  98. package/es-modules/Core/MSPointer.js +23 -13
  99. package/es-modules/Core/Math3D.d.ts +1 -117
  100. package/es-modules/Core/Math3D.js +13 -10
  101. package/es-modules/Core/Options.d.ts +334 -0
  102. package/es-modules/Core/Options.js +10 -0
  103. package/es-modules/Core/Pointer.d.ts +71 -445
  104. package/es-modules/Core/Pointer.js +51 -65
  105. package/es-modules/Core/PointerEvent.d.ts +18 -0
  106. package/es-modules/Core/PointerEvent.js +11 -0
  107. package/es-modules/Core/Renderer/AlignObject.d.ts +25 -27
  108. package/es-modules/Core/Renderer/AlignObject.js +11 -0
  109. package/es-modules/Core/Renderer/BBoxObject.d.ts +20 -31
  110. package/es-modules/Core/Renderer/BBoxObject.js +11 -0
  111. package/es-modules/Core/Renderer/CSSObject.d.ts +268 -59
  112. package/es-modules/Core/Renderer/CSSObject.js +10 -0
  113. package/es-modules/Core/Renderer/DOMElementType.d.ts +1 -33
  114. package/es-modules/Core/Renderer/DOMElementType.js +11 -0
  115. package/es-modules/Core/Renderer/DashStyleValue.d.ts +1 -27
  116. package/es-modules/Core/Renderer/DashStyleValue.js +11 -0
  117. package/es-modules/Core/Renderer/FontMetricsObject.d.ts +6 -26
  118. package/es-modules/Core/Renderer/FontMetricsObject.js +11 -0
  119. package/es-modules/Core/Renderer/HTML/AST.d.ts +3 -15
  120. package/es-modules/Core/Renderer/HTML/AST.js +22 -13
  121. package/es-modules/Core/Renderer/HTML/HTMLAttributes.d.ts +1 -25
  122. package/es-modules/Core/Renderer/HTML/HTMLAttributes.js +11 -0
  123. package/es-modules/Core/Renderer/HTML/HTMLElement.d.ts +0 -54
  124. package/es-modules/Core/Renderer/HTML/HTMLElement.js +27 -22
  125. package/es-modules/Core/Renderer/PolygonBoxObject.d.ts +15 -12
  126. package/es-modules/Core/Renderer/PolygonBoxObject.js +11 -0
  127. package/es-modules/Core/Renderer/Position3DObject.d.ts +6 -30
  128. package/es-modules/Core/Renderer/Position3DObject.js +11 -0
  129. package/es-modules/Core/Renderer/PositionObject.d.ts +9 -23
  130. package/es-modules/Core/Renderer/PositionObject.js +11 -0
  131. package/es-modules/Core/Renderer/RectangleObject.d.ts +6 -30
  132. package/es-modules/Core/Renderer/RectangleObject.js +11 -0
  133. package/es-modules/Core/Renderer/RendererRegistry.d.ts +1 -29
  134. package/es-modules/Core/Renderer/RendererRegistry.js +6 -3
  135. package/es-modules/Core/Renderer/RendererType.d.ts +1 -53
  136. package/es-modules/Core/Renderer/RendererType.js +11 -0
  137. package/es-modules/Core/Renderer/RendererUtilities.d.ts +1 -26
  138. package/es-modules/Core/Renderer/RendererUtilities.js +7 -4
  139. package/es-modules/Core/Renderer/SVG/ButtonThemeObject.d.ts +26 -31
  140. package/es-modules/Core/Renderer/SVG/SVGArc3D.d.ts +1 -44
  141. package/es-modules/Core/Renderer/SVG/SVGAttributes.d.ts +15 -51
  142. package/es-modules/Core/Renderer/SVG/SVGAttributes3D.d.ts +1 -42
  143. package/es-modules/Core/Renderer/SVG/SVGCuboid.d.ts +1 -42
  144. package/es-modules/Core/Renderer/SVG/SVGElement.d.ts +459 -0
  145. package/es-modules/Core/Renderer/SVG/SVGElement3D.d.ts +1 -0
  146. package/es-modules/Core/Renderer/SVG/SVGElementBase.d.ts +0 -23
  147. package/es-modules/Core/Renderer/SVG/SVGLabel.d.ts +14 -0
  148. package/es-modules/Core/Renderer/SVG/SVGPath.d.ts +18 -56
  149. package/es-modules/Core/Renderer/SVG/SVGPath3D.d.ts +0 -30
  150. package/es-modules/Core/Renderer/SVG/SVGRenderer.d.ts +652 -0
  151. package/es-modules/Core/Renderer/SVG/SVGRenderer3D.d.ts +1 -0
  152. package/es-modules/Core/Renderer/SVG/SVGRendererBase.d.ts +0 -24
  153. package/es-modules/Core/Renderer/SVG/SymbolOptions.d.ts +3 -26
  154. package/es-modules/Core/Renderer/SVG/SymbolType.d.ts +1 -41
  155. package/es-modules/Core/Renderer/SVG/Symbols.d.ts +146 -0
  156. package/es-modules/Core/Renderer/SVG/TextBuilder.d.ts +1 -0
  157. package/es-modules/Core/Renderer/ShadowOptionsObject.d.ts +21 -30
  158. package/es-modules/Core/Renderer/ShadowOptionsObject.js +11 -0
  159. package/es-modules/Core/Renderer/SizeObject.d.ts +0 -23
  160. package/es-modules/Core/Renderer/SizeObject.js +11 -0
  161. package/es-modules/Core/Responsive.d.ts +91 -28
  162. package/es-modules/Core/Responsive.js +7 -8
  163. package/es-modules/Core/Templating.d.ts +16 -0
  164. package/es-modules/Core/Templating.js +9 -4
  165. package/es-modules/Core/Time.d.ts +10 -1
  166. package/es-modules/Core/Time.js +4 -3
  167. package/es-modules/Core/Tooltip.d.ts +63 -115
  168. package/es-modules/Core/Tooltip.js +61 -27
  169. package/es-modules/Core/TooltipOptions.d.ts +681 -0
  170. package/es-modules/Core/TooltipOptions.js +10 -0
  171. package/es-modules/Core/Utilities.d.ts +75 -106
  172. package/es-modules/Core/Utilities.js +19 -53
  173. package/es-modules/Data/ColumnUtils.js +3 -3
  174. package/es-modules/Data/Connectors/CSVConnector.js +3 -3
  175. package/es-modules/Data/Connectors/CSVConnectorOptions.d.ts +3 -3
  176. package/es-modules/Data/Connectors/DataConnector.d.ts +12 -1
  177. package/es-modules/Data/Connectors/DataConnector.js +34 -4
  178. package/es-modules/Data/Connectors/DataConnectorOptions.d.ts +3 -3
  179. package/es-modules/Data/Connectors/DataConnectorType.d.ts +3 -3
  180. package/es-modules/Data/Connectors/GoogleSheetsConnector.js +3 -3
  181. package/es-modules/Data/Connectors/GoogleSheetsConnectorOptions.d.ts +3 -3
  182. package/es-modules/Data/Connectors/HTMLTableConnector.js +3 -3
  183. package/es-modules/Data/Connectors/HTMLTableConnectorOptions.d.ts +3 -3
  184. package/es-modules/Data/Connectors/JSONConnector.js +3 -3
  185. package/es-modules/Data/Connectors/JSONConnectorOptions.d.ts +3 -3
  186. package/es-modules/Data/Converters/CSVConverter.js +3 -3
  187. package/es-modules/Data/Converters/CSVConverterOptions.d.ts +3 -3
  188. package/es-modules/Data/Converters/DataConverter.js +3 -3
  189. package/es-modules/Data/Converters/DataConverterType.d.ts +3 -3
  190. package/es-modules/Data/Converters/DataConverterUtils.js +3 -3
  191. package/es-modules/Data/Converters/GoogleSheetsConverter.js +3 -3
  192. package/es-modules/Data/Converters/GoogleSheetsConverterOptions.d.ts +3 -3
  193. package/es-modules/Data/Converters/HTMLTableConverter.js +3 -3
  194. package/es-modules/Data/Converters/HTMLTableConverterOptions.d.ts +3 -3
  195. package/es-modules/Data/Converters/JSONConverter.js +3 -3
  196. package/es-modules/Data/Converters/JSONConverterOptions.d.ts +3 -3
  197. package/es-modules/Data/DataCursor.js +3 -3
  198. package/es-modules/Data/DataEvent.js +3 -3
  199. package/es-modules/Data/DataPool.js +3 -3
  200. package/es-modules/Data/DataPoolOptions.d.ts +3 -3
  201. package/es-modules/Data/DataTable.d.ts +6 -6
  202. package/es-modules/Data/DataTable.js +64 -30
  203. package/es-modules/Data/DataTableCore.d.ts +2 -2
  204. package/es-modules/Data/DataTableCore.js +5 -5
  205. package/es-modules/Data/DataTableOptions.js +3 -3
  206. package/es-modules/Data/Formula/Formula.js +3 -3
  207. package/es-modules/Data/Formula/FormulaParser.js +3 -3
  208. package/es-modules/Data/Formula/FormulaProcessor.js +3 -3
  209. package/es-modules/Data/Formula/FormulaTypes.js +3 -3
  210. package/es-modules/Data/Formula/Functions/ABS.js +3 -3
  211. package/es-modules/Data/Formula/Functions/AND.js +3 -3
  212. package/es-modules/Data/Formula/Functions/AVERAGE.js +3 -3
  213. package/es-modules/Data/Formula/Functions/AVERAGEA.js +3 -3
  214. package/es-modules/Data/Formula/Functions/COUNT.js +3 -3
  215. package/es-modules/Data/Formula/Functions/COUNTA.js +3 -3
  216. package/es-modules/Data/Formula/Functions/IF.js +3 -3
  217. package/es-modules/Data/Formula/Functions/ISNA.js +3 -3
  218. package/es-modules/Data/Formula/Functions/MAX.js +3 -3
  219. package/es-modules/Data/Formula/Functions/MEDIAN.js +3 -3
  220. package/es-modules/Data/Formula/Functions/MIN.js +3 -3
  221. package/es-modules/Data/Formula/Functions/MOD.js +3 -3
  222. package/es-modules/Data/Formula/Functions/MODE.js +3 -3
  223. package/es-modules/Data/Formula/Functions/NOT.js +3 -3
  224. package/es-modules/Data/Formula/Functions/OR.js +3 -3
  225. package/es-modules/Data/Formula/Functions/PRODUCT.js +3 -3
  226. package/es-modules/Data/Formula/Functions/SUM.js +3 -3
  227. package/es-modules/Data/Formula/Functions/XOR.js +3 -3
  228. package/es-modules/Data/Modifiers/ChainModifier.js +3 -3
  229. package/es-modules/Data/Modifiers/ChainModifierOptions.js +3 -3
  230. package/es-modules/Data/Modifiers/DataModifier.js +3 -3
  231. package/es-modules/Data/Modifiers/DataModifierEvent.js +3 -3
  232. package/es-modules/Data/Modifiers/DataModifierOptions.js +3 -3
  233. package/es-modules/Data/Modifiers/DataModifierType.d.ts +3 -3
  234. package/es-modules/Data/Modifiers/FilterModifier.js +3 -3
  235. package/es-modules/Data/Modifiers/FilterModifierOptions.js +3 -3
  236. package/es-modules/Data/Modifiers/InvertModifier.js +3 -3
  237. package/es-modules/Data/Modifiers/InvertModifierOptions.js +3 -3
  238. package/es-modules/Data/Modifiers/MathModifier.js +3 -3
  239. package/es-modules/Data/Modifiers/MathModifierOptions.js +3 -3
  240. package/es-modules/Data/Modifiers/RangeModifier.js +3 -3
  241. package/es-modules/Data/Modifiers/RangeModifierOptions.js +3 -3
  242. package/es-modules/Data/Modifiers/SortModifier.js +32 -6
  243. package/es-modules/Data/Modifiers/SortModifierOptions.d.ts +41 -4
  244. package/es-modules/Data/Modifiers/SortModifierOptions.js +3 -3
  245. package/es-modules/Grid/Core/Accessibility/A11yOptions.d.ts +77 -0
  246. package/es-modules/Grid/Core/Accessibility/A11yOptions.js +4 -3
  247. package/es-modules/Grid/Core/Accessibility/Accessibility.d.ts +67 -0
  248. package/es-modules/Grid/Core/Accessibility/Accessibility.js +176 -3
  249. package/es-modules/Grid/Core/Credits.js +3 -3
  250. package/es-modules/Grid/Core/Defaults.js +17 -5
  251. package/es-modules/Grid/Core/Globals.d.ts +4 -4
  252. package/es-modules/Grid/Core/Globals.js +5 -5
  253. package/es-modules/Grid/Core/Grid.d.ts +12 -1
  254. package/es-modules/Grid/Core/Grid.js +110 -8
  255. package/es-modules/Grid/Core/GridUtils.js +3 -3
  256. package/es-modules/Grid/Core/Options.d.ts +17 -1
  257. package/es-modules/Grid/Core/Options.js +3 -3
  258. package/es-modules/Grid/Core/Pagination/Pagination.js +3 -3
  259. package/es-modules/Grid/Core/Pagination/PaginationOptions.d.ts +0 -40
  260. package/es-modules/Grid/Core/Pagination/PaginationOptions.js +11 -0
  261. package/es-modules/Grid/Core/Querying/FilteringController.js +3 -3
  262. package/es-modules/Grid/Core/Querying/PaginationController.js +3 -3
  263. package/es-modules/Grid/Core/Querying/QueryingController.js +3 -3
  264. package/es-modules/Grid/Core/Querying/SortingController.d.ts +15 -0
  265. package/es-modules/Grid/Core/Querying/SortingController.js +89 -51
  266. package/es-modules/Grid/Core/Table/Actions/ColumnFiltering/ColumnFiltering.js +3 -3
  267. package/es-modules/Grid/Core/Table/Actions/ColumnFiltering/FilterCell.d.ts +2 -2
  268. package/es-modules/Grid/Core/Table/Actions/ColumnFiltering/FilterCell.js +3 -3
  269. package/es-modules/Grid/Core/Table/Actions/ColumnFiltering/FilterRow.js +3 -3
  270. package/es-modules/Grid/Core/Table/Actions/ColumnFiltering/FilteringTypes.js +3 -3
  271. package/es-modules/Grid/Core/Table/Actions/ColumnSorting.d.ts +12 -2
  272. package/es-modules/Grid/Core/Table/Actions/ColumnSorting.js +85 -18
  273. package/es-modules/Grid/Core/Table/Actions/ColumnsResizer.js +3 -3
  274. package/es-modules/Grid/Core/Table/Actions/RowsVirtualizer.d.ts +37 -0
  275. package/es-modules/Grid/Core/Table/Actions/RowsVirtualizer.js +137 -26
  276. package/es-modules/Grid/Core/Table/Body/TableCell.d.ts +9 -2
  277. package/es-modules/Grid/Core/Table/Body/TableCell.js +15 -8
  278. package/es-modules/Grid/Core/Table/Body/TableRow.d.ts +18 -0
  279. package/es-modules/Grid/Core/Table/Body/TableRow.js +56 -10
  280. package/es-modules/Grid/Core/Table/Cell.d.ts +0 -7
  281. package/es-modules/Grid/Core/Table/Cell.js +5 -3
  282. package/es-modules/Grid/Core/Table/CellContent/CellContent.js +3 -3
  283. package/es-modules/Grid/Core/Table/CellContent/TextContent.js +4 -4
  284. package/es-modules/Grid/Core/Table/Column.d.ts +1 -1
  285. package/es-modules/Grid/Core/Table/Column.js +3 -3
  286. package/es-modules/Grid/Core/Table/ColumnResizing/AdjacentResizingMode.js +3 -3
  287. package/es-modules/Grid/Core/Table/ColumnResizing/ColumnResizing.js +3 -3
  288. package/es-modules/Grid/Core/Table/ColumnResizing/DistributedResizingMode.js +3 -3
  289. package/es-modules/Grid/Core/Table/ColumnResizing/IndependentResizingMode.js +3 -3
  290. package/es-modules/Grid/Core/Table/ColumnResizing/ResizingMode.js +3 -3
  291. package/es-modules/Grid/Core/Table/Header/ColumnToolbar/ColumnToolbar.js +14 -5
  292. package/es-modules/Grid/Core/Table/Header/ColumnToolbar/FilterPopup.js +3 -3
  293. package/es-modules/Grid/Core/Table/Header/ColumnToolbar/MenuButtons/FilterMenuButton.js +3 -3
  294. package/es-modules/Grid/Core/Table/Header/ColumnToolbar/MenuButtons/SortMenuButton.d.ts +9 -0
  295. package/es-modules/Grid/Core/Table/Header/ColumnToolbar/MenuButtons/SortMenuButton.js +35 -6
  296. package/es-modules/Grid/Core/Table/Header/ColumnToolbar/MenuPopup.js +5 -4
  297. package/es-modules/Grid/Core/Table/Header/ColumnToolbar/StateHelpers.js +11 -7
  298. package/es-modules/Grid/Core/Table/Header/ColumnToolbar/ToolbarButtons/FilterToolbarButton.js +3 -3
  299. package/es-modules/Grid/Core/Table/Header/ColumnToolbar/ToolbarButtons/MenuToolbarButton.js +3 -3
  300. package/es-modules/Grid/Core/Table/Header/ColumnToolbar/ToolbarButtons/SortToolbarButton.d.ts +5 -1
  301. package/es-modules/Grid/Core/Table/Header/ColumnToolbar/ToolbarButtons/SortToolbarButton.js +92 -9
  302. package/es-modules/Grid/Core/Table/Header/HeaderCell.d.ts +2 -2
  303. package/es-modules/Grid/Core/Table/Header/HeaderCell.js +8 -7
  304. package/es-modules/Grid/Core/Table/Header/HeaderRow.js +3 -3
  305. package/es-modules/Grid/Core/Table/Header/TableHeader.js +3 -3
  306. package/es-modules/Grid/Core/Table/Row.js +3 -3
  307. package/es-modules/Grid/Core/Table/Table.d.ts +30 -0
  308. package/es-modules/Grid/Core/Table/Table.js +118 -7
  309. package/es-modules/Grid/Core/UI/Button.js +3 -3
  310. package/es-modules/Grid/Core/UI/ContextMenu.js +3 -3
  311. package/es-modules/Grid/Core/UI/ContextMenuButton.js +3 -3
  312. package/es-modules/Grid/Core/UI/Popup.js +3 -3
  313. package/es-modules/Grid/Core/UI/SvgIcons.js +3 -3
  314. package/es-modules/Grid/Core/UI/Toolbar.js +3 -3
  315. package/es-modules/Grid/Core/UI/ToolbarButton.js +3 -3
  316. package/es-modules/Grid/Pro/CellEditing/CellEditMode.d.ts +3 -44
  317. package/es-modules/Grid/Pro/CellEditing/CellEditMode.js +16 -0
  318. package/es-modules/Grid/Pro/CellEditing/CellEditing.js +3 -3
  319. package/es-modules/Grid/Pro/CellEditing/CellEditingComposition.js +3 -3
  320. package/es-modules/Grid/Pro/CellRendering/CellContentPro.js +3 -3
  321. package/es-modules/Grid/Pro/CellRendering/CellRenderer.js +3 -3
  322. package/es-modules/Grid/Pro/CellRendering/CellRendererRegistry.js +3 -3
  323. package/es-modules/Grid/Pro/CellRendering/CellRendererType.d.ts +1 -34
  324. package/es-modules/Grid/Pro/CellRendering/CellRendererType.js +15 -0
  325. package/es-modules/Grid/Pro/CellRendering/CellRenderersComposition.js +3 -3
  326. package/es-modules/Grid/Pro/CellRendering/ContentTypes/CheckboxContent.js +3 -3
  327. package/es-modules/Grid/Pro/CellRendering/ContentTypes/DateInputContent.js +3 -3
  328. package/es-modules/Grid/Pro/CellRendering/ContentTypes/DateInputContentBase.js +3 -3
  329. package/es-modules/Grid/Pro/CellRendering/ContentTypes/DateTimeInputContent.js +3 -3
  330. package/es-modules/Grid/Pro/CellRendering/ContentTypes/NumberInputContent.js +3 -3
  331. package/es-modules/Grid/Pro/CellRendering/ContentTypes/SelectContent.js +3 -3
  332. package/es-modules/Grid/Pro/CellRendering/ContentTypes/SparklineContent.d.ts +7 -5
  333. package/es-modules/Grid/Pro/CellRendering/ContentTypes/SparklineContent.js +3 -3
  334. package/es-modules/Grid/Pro/CellRendering/ContentTypes/TextInputContent.js +3 -3
  335. package/es-modules/Grid/Pro/CellRendering/ContentTypes/TimeInputContent.js +3 -3
  336. package/es-modules/Grid/Pro/CellRendering/Renderers/CheckboxRenderer.js +3 -3
  337. package/es-modules/Grid/Pro/CellRendering/Renderers/DateInputRenderer.js +3 -3
  338. package/es-modules/Grid/Pro/CellRendering/Renderers/DateInputRendererBase.js +3 -3
  339. package/es-modules/Grid/Pro/CellRendering/Renderers/DateTimeInputRenderer.js +3 -3
  340. package/es-modules/Grid/Pro/CellRendering/Renderers/NumberInputRenderer.js +3 -3
  341. package/es-modules/Grid/Pro/CellRendering/Renderers/SelectRenderer.js +3 -3
  342. package/es-modules/Grid/Pro/CellRendering/Renderers/SparklineRenderer.d.ts +3 -3
  343. package/es-modules/Grid/Pro/CellRendering/Renderers/SparklineRenderer.js +3 -3
  344. package/es-modules/Grid/Pro/CellRendering/Renderers/TextInputRenderer.js +3 -3
  345. package/es-modules/Grid/Pro/CellRendering/Renderers/TextRenderer.js +3 -3
  346. package/es-modules/Grid/Pro/CellRendering/Renderers/TimeInputRenderer.js +3 -3
  347. package/es-modules/Grid/Pro/ColumnTypes/Validator.d.ts +10 -1
  348. package/es-modules/Grid/Pro/ColumnTypes/Validator.js +50 -8
  349. package/es-modules/Grid/Pro/ColumnTypes/ValidatorComposition.js +3 -3
  350. package/es-modules/Grid/Pro/Credits/CreditsPro.js +3 -3
  351. package/es-modules/Grid/Pro/Credits/CreditsProComposition.js +3 -3
  352. package/es-modules/Grid/Pro/Export/Exporting.js +4 -5
  353. package/es-modules/Grid/Pro/Export/ExportingComposition.js +3 -3
  354. package/es-modules/Grid/Pro/GridEvents.d.ts +1 -0
  355. package/es-modules/Grid/Pro/GridEvents.js +3 -3
  356. package/es-modules/Grid/Pro/Pagination/PaginationComposition.js +3 -3
  357. package/es-modules/Grid/index.js +3 -3
  358. package/es-modules/Shared/BaseForm.js +3 -3
  359. package/es-modules/Shared/DownloadURL.d.ts +1 -85
  360. package/es-modules/Shared/DownloadURL.js +14 -11
  361. package/es-modules/Shared/LangOptionsCore.d.ts +4 -3
  362. package/es-modules/Shared/TimeBase.d.ts +1 -46
  363. package/es-modules/Shared/TimeBase.js +8 -7
  364. package/es-modules/Shared/Types.d.ts +4 -3
  365. package/es-modules/masters/grid-pro.src.d.ts +8 -13
  366. package/es-modules/masters/grid-pro.src.js +15 -7
  367. package/grid-pro.d.ts +8 -13
  368. package/grid-pro.js +6 -5
  369. package/grid-pro.js.map +1 -1
  370. package/grid-pro.src.d.ts +8 -13
  371. package/grid-pro.src.js +1923 -721
  372. package/package.json +1 -9
  373. package/es-modules/Grid/Pro/highcharts.d.ts +0 -7
package/grid-pro.src.js CHANGED
@@ -1,10 +1,12 @@
1
+ // SPDX-License-Identifier: LicenseRef-Highcharts
1
2
  /**
2
- * @license Highcharts Grid Pro v2.1.0 (2025-12-09)
3
+ * @license Highcharts Grid Pro v2.2.0 (2026-01-13)
3
4
  * @module grid/grid-pro
4
5
  *
5
- * (c) 2009-2025 Highsoft AS
6
+ * (c) 2009-2026 Highsoft AS
6
7
  *
7
- * License: www.highcharts.com/license
8
+ * A commercial license may be required depending on use.
9
+ * See www.highcharts.com/license
8
10
  */
9
11
  (function webpackUniversalModuleDefinition(root, factory) {
10
12
  if(typeof exports === 'object' && typeof module === 'object')
@@ -52,11 +54,12 @@ __webpack_require__.d(__webpack_exports__, {
52
54
  ;// ./code/grid/es-modules/Core/Globals.js
53
55
  /* *
54
56
  *
55
- * (c) 2010-2025 Torstein Honsi
57
+ * (c) 2010-2026 Highsoft AS
58
+ * Author: Torstein Honsi
56
59
  *
57
- * License: www.highcharts.com/license
60
+ * A commercial license may be required depending on use.
61
+ * See www.highcharts.com/license
58
62
  *
59
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
60
63
  *
61
64
  * */
62
65
 
@@ -67,7 +70,7 @@ __webpack_require__.d(__webpack_exports__, {
67
70
  * */
68
71
  /**
69
72
  * Shared Highcharts properties.
70
- * @private
73
+ * @internal
71
74
  */
72
75
  var Globals;
73
76
  (function (Globals) {
@@ -76,7 +79,7 @@ var Globals;
76
79
  * Constants
77
80
  *
78
81
  * */
79
- Globals.SVG_NS = 'http://www.w3.org/2000/svg', Globals.product = 'Highcharts', Globals.version = '2.1.0', Globals.win = (typeof window !== 'undefined' ?
82
+ Globals.SVG_NS = 'http://www.w3.org/2000/svg', Globals.product = 'Highcharts', Globals.version = '2.2.0', Globals.win = (typeof window !== 'undefined' ?
80
83
  window :
81
84
  {}), // eslint-disable-line node/no-unsupported-features/es-builtins
82
85
  Globals.doc = Globals.win.document, Globals.svg = !!Globals.doc?.createElementNS?.(Globals.SVG_NS, 'svg')?.createSVGRect, Globals.pageLang = Globals.doc?.documentElement?.closest('[lang]')?.lang, Globals.userAgent = Globals.win.navigator?.userAgent || '', Globals.isChrome = Globals.win.chrome, Globals.isFirefox = Globals.userAgent.indexOf('Firefox') !== -1, Globals.isMS = /(edge|msie|trident)/i.test(Globals.userAgent) && !Globals.win.opera, Globals.isSafari = !Globals.isChrome && Globals.userAgent.indexOf('Safari') !== -1, Globals.isTouchDevice = /(Mobile|Android|Windows Phone)/.test(Globals.userAgent), Globals.isWebKit = Globals.userAgent.indexOf('AppleWebKit') !== -1, Globals.deg2rad = Math.PI * 2 / 360, Globals.marginNames = [
@@ -114,7 +117,7 @@ var Globals;
114
117
  /**
115
118
  * A shared registry between all bundles to keep track of applied
116
119
  * compositions.
117
- * @private
120
+ * @internal
118
121
  */
119
122
  Globals.composed = [];
120
123
  /**
@@ -139,14 +142,12 @@ var Globals;
139
142
  */
140
143
  Globals.dateFormats = {};
141
144
  /**
142
- * @private
145
+ * @internal
143
146
  * @deprecated
144
147
  * @todo Use only `Core/Series/SeriesRegistry.seriesTypes`
145
148
  */
146
149
  Globals.seriesTypes = {};
147
- /**
148
- * @private
149
- */
150
+ /** @internal */
150
151
  Globals.symbolSizes = {};
151
152
  /* *
152
153
  *
@@ -181,11 +182,12 @@ var Globals;
181
182
  ;// ./code/grid/es-modules/Core/Utilities.js
182
183
  /* *
183
184
  *
184
- * (c) 2010-2025 Torstein Honsi
185
+ * (c) 2010-2026 Highsoft AS
186
+ * Author: Torstein Honsi
185
187
  *
186
- * License: www.highcharts.com/license
188
+ * A commercial license may be required depending on use.
189
+ * See www.highcharts.com/license
187
190
  *
188
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
189
191
  *
190
192
  * */
191
193
 
@@ -325,7 +327,7 @@ function merge(extendOrSource, ...sources) {
325
327
  /**
326
328
  * Constrain a value to within a lower and upper threshold.
327
329
  *
328
- * @private
330
+ * @internal
329
331
  * @param {number} value The initial value
330
332
  * @param {number} min The lower threshold
331
333
  * @param {number} max The upper threshold
@@ -353,7 +355,7 @@ function crisp(value, lineWidth = 0, inverted) {
353
355
  /**
354
356
  * Return the deep difference between two objects. It can either return the new
355
357
  * properties, or optionally return the old values of new properties.
356
- * @private
358
+ * @internal
357
359
  */
358
360
  function diffObjects(newer, older, keepOlder, collectionsWithUpdate) {
359
361
  const ret = {};
@@ -419,7 +421,7 @@ function diffObjects(newer, older, keepOlder, collectionsWithUpdate) {
419
421
  /**
420
422
  * Shortcut for parseInt
421
423
  *
422
- * @private
424
+ * @internal
423
425
  * @function Highcharts.pInt
424
426
  *
425
427
  * @param {*} s
@@ -556,7 +558,7 @@ function erase(arr, item) {
556
558
  * according to the index option and whether it is internal. Used internally
557
559
  * when adding series and axes.
558
560
  *
559
- * @private
561
+ * @internal
560
562
  * @function Highcharts.Chart#insertItem
561
563
  * @param {Highcharts.Series|Highcharts.Axis} item
562
564
  * The item to insert
@@ -1187,14 +1189,14 @@ const timeUnits = {
1187
1189
  /**
1188
1190
  * Easing definition
1189
1191
  *
1190
- * @private
1192
+ * @internal
1191
1193
  * @function Math.easeInOutSine
1192
1194
  *
1193
1195
  * @param {number} pos
1194
- * Current position, ranging from 0 to 1.
1196
+ * Current position, ranging from 0 to 1.
1195
1197
  *
1196
1198
  * @return {number}
1197
- * Ease result
1199
+ * Ease result
1198
1200
  */
1199
1201
  Math.easeInOutSine = function (pos) {
1200
1202
  return -0.5 * (Math.cos(Math.PI * pos) - 1);
@@ -1202,7 +1204,7 @@ Math.easeInOutSine = function (pos) {
1202
1204
  /**
1203
1205
  * Convenience function to get the align factor, used several places for
1204
1206
  * computing positions
1205
- * @private
1207
+ * @internal
1206
1208
  */
1207
1209
  const getAlignFactor = (align = '') => ({
1208
1210
  center: 0.5,
@@ -1212,7 +1214,7 @@ const getAlignFactor = (align = '') => ({
1212
1214
  }[align] || 0);
1213
1215
  /**
1214
1216
  * Find the closest distance between two values of a two-dimensional array
1215
- * @private
1217
+ * @internal
1216
1218
  * @function Highcharts.getClosestDistance
1217
1219
  *
1218
1220
  * @param {Array<Array<number>>} arrays
@@ -1245,7 +1247,7 @@ function getClosestDistance(arrays, onError) {
1245
1247
  /**
1246
1248
  * Returns the value of a property path on a given object.
1247
1249
  *
1248
- * @private
1250
+ * @internal
1249
1251
  * @function getNestedProperty
1250
1252
  *
1251
1253
  * @param {string} path
@@ -1513,18 +1515,14 @@ function addEvent(el, type, fn, options = {}) {
1513
1515
  */
1514
1516
  function removeEvent(el, type, fn) {
1515
1517
  /* eslint-enable valid-jsdoc */
1516
- /**
1517
- * @private
1518
- */
1518
+ /** @internal */
1519
1519
  function removeOneEvent(type, fn) {
1520
1520
  const removeEventListener = el.removeEventListener;
1521
1521
  if (removeEventListener) {
1522
1522
  removeEventListener.call(el, type, fn, false);
1523
1523
  }
1524
1524
  }
1525
- /**
1526
- * @private
1527
- */
1525
+ /** @internal */
1528
1526
  function removeAllEvents(eventCollection) {
1529
1527
  let types, len;
1530
1528
  if (!el.nodeName) {
@@ -1776,11 +1774,6 @@ if (win.jQuery) {
1776
1774
  }
1777
1775
  };
1778
1776
  }
1779
- /* *
1780
- *
1781
- * Default Export
1782
- *
1783
- * */
1784
1777
  // TODO use named exports when supported.
1785
1778
  const Utilities = {
1786
1779
  addEvent,
@@ -1842,35 +1835,6 @@ const Utilities = {
1842
1835
  * API Declarations
1843
1836
  *
1844
1837
  * */
1845
- /**
1846
- * An animation configuration. Animation configurations can also be defined as
1847
- * booleans, where `false` turns off animation and `true` defaults to a duration
1848
- * of 500ms and defer of 0ms.
1849
- *
1850
- * @interface Highcharts.AnimationOptionsObject
1851
- */ /**
1852
- * A callback function to execute when the animation finishes.
1853
- * @name Highcharts.AnimationOptionsObject#complete
1854
- * @type {Function|undefined}
1855
- */ /**
1856
- * The animation defer in milliseconds.
1857
- * @name Highcharts.AnimationOptionsObject#defer
1858
- * @type {number|undefined}
1859
- */ /**
1860
- * The animation duration in milliseconds.
1861
- * @name Highcharts.AnimationOptionsObject#duration
1862
- * @type {number|undefined}
1863
- */ /**
1864
- * The name of an easing function as defined on the `Math` object.
1865
- * @name Highcharts.AnimationOptionsObject#easing
1866
- * @type {string|Function|undefined}
1867
- */ /**
1868
- * A callback function to execute on each step of each attribute or CSS property
1869
- * that's being animated. The first argument contains information about the
1870
- * animation and progress.
1871
- * @name Highcharts.AnimationOptionsObject#step
1872
- * @type {Function|undefined}
1873
- */
1874
1838
  /**
1875
1839
  * Creates a frame for the animated SVG element.
1876
1840
  *
@@ -2031,6 +1995,9 @@ const Utilities = {
2031
1995
  * @name Highcharts.Dictionary<T>#[key:string]
2032
1996
  * @type {T}
2033
1997
  */
1998
+ /**
1999
+ * @typedef {Highcharts.HTMLDOMElement|Highcharts.SVGDOMElement} Highcharts.DOMElementType
2000
+ */
2034
2001
  /**
2035
2002
  * The function callback to execute when the event is fired. The `this` context
2036
2003
  * contains the instance, that fired the event.
@@ -2172,11 +2139,12 @@ const Utilities = {
2172
2139
  ;// ./code/grid/es-modules/Core/Renderer/HTML/AST.js
2173
2140
  /* *
2174
2141
  *
2175
- * (c) 2010-2025 Torstein Honsi
2142
+ * (c) 2010-2026 Highsoft AS
2143
+ * Author: Torstein Honsi
2176
2144
  *
2177
- * License: www.highcharts.com/license
2145
+ * A commercial license may be required depending on use.
2146
+ * See www.highcharts.com/license
2178
2147
  *
2179
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
2180
2148
  *
2181
2149
  * */
2182
2150
 
@@ -2256,6 +2224,15 @@ class AST {
2256
2224
  });
2257
2225
  return attributes;
2258
2226
  }
2227
+ /**
2228
+ * Utility function to parse a style string to a CSSObject.
2229
+ *
2230
+ * @internal
2231
+ * @param {string} style
2232
+ * The style string to parse.
2233
+ * @return {Highcharts.CSSObject}
2234
+ * The parsed CSSObject.
2235
+ */
2259
2236
  static parseStyle(style) {
2260
2237
  return style
2261
2238
  .split(';')
@@ -2317,11 +2294,11 @@ class AST {
2317
2294
  */
2318
2295
  addToDOM(parent) {
2319
2296
  /**
2320
- * @private
2297
+ * @internal
2321
2298
  * @param {Highcharts.ASTNode} subtree
2322
- * HTML/SVG definition
2299
+ * HTML/SVG definition.
2323
2300
  * @param {Element} [subParent]
2324
- * parent node
2301
+ * Parent node.
2325
2302
  * @return {Highcharts.SVGDOMElement|Highcharts.HTMLDOMElement}
2326
2303
  * The inserted node.
2327
2304
  */
@@ -2392,13 +2369,11 @@ class AST {
2392
2369
  * Parse HTML/SVG markup into AST Node objects. Used internally from the
2393
2370
  * constructor.
2394
2371
  *
2395
- * @private
2396
- *
2397
- * @function Highcharts.AST#getNodesFromMarkup
2398
- *
2399
- * @param {string} markup The markup string.
2400
- *
2401
- * @return {Array<Highcharts.ASTNode>} The parsed nodes.
2372
+ * @internal
2373
+ * @param {string} markup
2374
+ * The markup string.
2375
+ * @return {Array<Highcharts.ASTNode>}
2376
+ * The parsed nodes.
2402
2377
  */
2403
2378
  parseMarkup(markup) {
2404
2379
  const nodes = [];
@@ -2674,6 +2649,7 @@ AST.allowedTags = [
2674
2649
  'u',
2675
2650
  'ul'
2676
2651
  ];
2652
+ /** @internal */
2677
2653
  AST.emptyHTML = emptyHTML;
2678
2654
  /**
2679
2655
  * Allow all custom SVG and HTML attributes, references and tags (together
@@ -2736,11 +2712,12 @@ AST.bypassHTMLFiltering = false;
2736
2712
  ;// ./code/grid/es-modules/Core/Chart/ChartDefaults.js
2737
2713
  /* *
2738
2714
  *
2739
- * (c) 2010-2025 Torstein Honsi
2715
+ * (c) 2010-2026 Highsoft AS
2716
+ * Author: Torstein Honsi
2740
2717
  *
2741
- * License: www.highcharts.com/license
2718
+ * A commercial license may be required depending on use.
2719
+ * See www.highcharts.com/license
2742
2720
  *
2743
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
2744
2721
  *
2745
2722
  * */
2746
2723
 
@@ -3859,13 +3836,9 @@ const ChartDefaults = {
3859
3836
  * @since 10.2.1
3860
3837
  */
3861
3838
  position: {
3862
- /**
3863
- * The horizontal alignment of the button.
3864
- */
3839
+ /** @internal */
3865
3840
  align: 'right',
3866
- /**
3867
- * The horizontal offset of the button.
3868
- */
3841
+ /** @internal */
3869
3842
  x: -10,
3870
3843
  /**
3871
3844
  * The vertical alignment of the button.
@@ -3874,9 +3847,7 @@ const ChartDefaults = {
3874
3847
  * @default top
3875
3848
  * @apioption chart.zooming.resetButton.position.verticalAlign
3876
3849
  */
3877
- /**
3878
- * The vertical offset of the button.
3879
- */
3850
+ /** @internal */
3880
3851
  y: 10
3881
3852
  }
3882
3853
  }
@@ -4043,7 +4014,7 @@ const ChartDefaults = {
4043
4014
  /**
4044
4015
  * Series palettes for Highcharts. Series colors are defined in highcharts.css.
4045
4016
  * **Do not edit this file!** This file is generated using the 'gulp palette' task.
4046
- * @private
4017
+ * @internal
4047
4018
  */
4048
4019
  const SeriesPalettes = {
4049
4020
  /**
@@ -4062,16 +4033,18 @@ const SeriesPalettes = {
4062
4033
  '#91e8e1'
4063
4034
  ],
4064
4035
  };
4036
+ /** @internal */
4065
4037
  /* harmony default export */ const Palettes = (SeriesPalettes);
4066
4038
 
4067
4039
  ;// ./code/grid/es-modules/Shared/TimeBase.js
4068
4040
  /* *
4069
4041
  *
4070
- * (c) 2010-2025 Torstein Honsi
4042
+ * (c) 2010-2026 Highsoft AS
4043
+ * Author: Torstein Honsi
4071
4044
  *
4072
- * License: www.highcharts.com/license
4045
+ * A commercial license may be required depending on use.
4046
+ * See www.highcharts.com/license
4073
4047
  *
4074
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
4075
4048
  *
4076
4049
  * */
4077
4050
 
@@ -4181,7 +4154,7 @@ class TimeBase {
4181
4154
  * initializing Highcharts, after running `Highcharts.setOptions` and on
4182
4155
  * `Chart.update`.
4183
4156
  *
4184
- * @private
4157
+ * @internal
4185
4158
  * @function Highcharts.Time#update
4186
4159
  *
4187
4160
  * @param {Highcharts.TimeOptions} [options]
@@ -4661,7 +4634,7 @@ class TimeBase {
4661
4634
  /**
4662
4635
  * Resolve legacy formats of dateTimeLabelFormats (strings and arrays) into
4663
4636
  * an object.
4664
- * @private
4637
+ * @internal
4665
4638
  * @param {string|Array<T>|Highcharts.Dictionary<T>} f
4666
4639
  * General format description
4667
4640
  * @return {Highcharts.Dictionary<T>}
@@ -4685,7 +4658,7 @@ class TimeBase {
4685
4658
  /**
4686
4659
  * Get the optimal date format for a point, based on a range.
4687
4660
  *
4688
- * @private
4661
+ * @internal
4689
4662
  * @function Highcharts.Time#getDateFormat
4690
4663
  *
4691
4664
  * @param {number} range
@@ -4877,7 +4850,7 @@ class TimeBase {
4877
4850
  * The number of fractional digits to use. 3 means milliseconds.
4878
4851
  *
4879
4852
  * @name Highcharts.DateTimeFormatOptions#fractionalSecondDigits
4880
- * @type {number|undefined}
4853
+ * @type {1|2|3|undefined}
4881
4854
  */ /**
4882
4855
  * The representation of the time zone name.
4883
4856
  *
@@ -4899,11 +4872,12 @@ class TimeBase {
4899
4872
  ;// ./code/grid/es-modules/Core/Time.js
4900
4873
  /* *
4901
4874
  *
4902
- * (c) 2010-2025 Torstein Honsi
4875
+ * (c) 2010-2026 Highsoft AS
4876
+ * Author: Torstein Honsi
4903
4877
  *
4904
- * License: www.highcharts.com/license
4878
+ * A commercial license may be required depending on use.
4879
+ * See www.highcharts.com/license
4905
4880
  *
4906
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
4907
4881
  *
4908
4882
  * */
4909
4883
 
@@ -5073,11 +5047,12 @@ class Time extends Shared_TimeBase {
5073
5047
  ;// ./code/grid/es-modules/Core/Defaults.js
5074
5048
  /* *
5075
5049
  *
5076
- * (c) 2010-2025 Torstein Honsi
5050
+ * (c) 2010-2026 Highsoft AS
5051
+ * Author: Torstein Honsi
5077
5052
  *
5078
- * License: www.highcharts.com/license
5053
+ * A commercial license may be required depending on use.
5054
+ * See www.highcharts.com/license
5079
5055
  *
5080
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
5081
5056
  *
5082
5057
  * */
5083
5058
 
@@ -5100,7 +5075,7 @@ const { fireEvent: Defaults_fireEvent, merge: Defaults_merge } = Core_Utilities;
5100
5075
  * @type {Highcharts.Options}
5101
5076
  */ /**
5102
5077
  * @optionparent
5103
- * @private
5078
+ * @internal
5104
5079
  */
5105
5080
  const defaultOptions = {
5106
5081
  /**
@@ -5335,17 +5310,17 @@ const defaultOptions = {
5335
5310
  * @since 1.2.4
5336
5311
  */
5337
5312
  resetZoom: 'Reset zoom',
5338
- /**
5339
- * The tooltip title for the label appearing when a chart is zoomed.
5340
- *
5341
- * @since 1.2.4
5342
- */
5343
5313
  /**
5344
5314
  * The default title of the Y axis
5345
5315
  *
5346
5316
  * @since 12.2.0
5347
5317
  */
5348
5318
  yAxisTitle: 'Values',
5319
+ /**
5320
+ * The tooltip title for the label appearing when a chart is zoomed.
5321
+ *
5322
+ * @since 1.2.4
5323
+ */
5349
5324
  resetZoomTitle: 'Reset zoom level 1:1'
5350
5325
  },
5351
5326
  /**
@@ -5557,7 +5532,7 @@ const defaultOptions = {
5557
5532
  * `"UTC"`. Setting `useUTC` to false is equivalent to setting
5558
5533
  * `time.timezone` to `undefined`.
5559
5534
  *
5560
- * @see [time.timezone](#timezone)
5535
+ * @see [timezone](#time.timezone)
5561
5536
  *
5562
5537
  * @sample {highcharts} highcharts/time/useutc-true/
5563
5538
  * True by default
@@ -5785,27 +5760,6 @@ const defaultOptions = {
5785
5760
  * @since 2.1
5786
5761
  * @apioption subtitle.floating
5787
5762
  */
5788
- /**
5789
- * CSS styles for the title.
5790
- *
5791
- * In styled mode, the subtitle style is given in the
5792
- * `.highcharts-subtitle` class.
5793
- *
5794
- * @sample {highcharts} highcharts/subtitle/style/
5795
- * Custom color and weight
5796
- * @sample {highcharts} highcharts/css/titles/
5797
- * Styled mode
5798
- * @sample {highstock} stock/chart/subtitle-style
5799
- * Custom color and weight
5800
- * @sample {highstock} highcharts/css/titles/
5801
- * Styled mode
5802
- * @sample {highmaps} highcharts/css/titles/
5803
- * Styled mode
5804
- *
5805
- * @type {Highcharts.CSSObject}
5806
- * @default {"color": "#666666"}
5807
- * @apioption subtitle.style
5808
- */
5809
5763
  /**
5810
5764
  * Whether to
5811
5765
  * [use HTML](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting#html)
@@ -6097,7 +6051,7 @@ const defaultOptions = {
6097
6051
  *
6098
6052
  * @declare Highcharts.LegendEventsOptionsObject
6099
6053
  *
6100
- * @private
6054
+ * @internal
6101
6055
  */
6102
6056
  events: {},
6103
6057
  /**
@@ -6949,8 +6903,17 @@ const defaultOptions = {
6949
6903
  * @apioption tooltip.borderColor
6950
6904
  */
6951
6905
  /**
6952
- * A CSS class name to apply to the tooltip's container div,
6953
- * allowing unique CSS styling for each chart.
6906
+ * A CSS class name to apply to the tooltip, allowing unique CSS
6907
+ * styling for each chart.
6908
+ *
6909
+ * **Note:** The class is applied to the SVG element of the tooltip
6910
+ * (the tooltip label group), not to a container div. This allows you
6911
+ * to style the tooltip using CSS applicable to SVG elements.
6912
+ *
6913
+ * When [tooltip.outside](#tooltip.outside) is `true`, a separate
6914
+ * container div with class `highcharts-tooltip-container` is created
6915
+ * as the parent to the SVG tooltip element, but the `className` option
6916
+ * is still applied to the SVG element itself, not to the container.
6954
6917
  *
6955
6918
  * @type {string}
6956
6919
  * @apioption tooltip.className
@@ -7223,35 +7186,6 @@ const defaultOptions = {
7223
7186
  * @product highcharts highstock
7224
7187
  * @apioption tooltip.split
7225
7188
  */
7226
- /**
7227
- * Prevents the tooltip from switching or closing, when touched or
7228
- * pointed.
7229
- *
7230
- * @sample highcharts/tooltip/stickoncontact/
7231
- * Tooltip sticks on pointer contact
7232
- *
7233
- * @type {boolean}
7234
- * @since 8.0.1
7235
- * @apioption tooltip.stickOnContact
7236
- */
7237
- /**
7238
- * Use HTML to render the contents of the tooltip instead of SVG. Using
7239
- * HTML allows advanced formatting like tables and images in the
7240
- * tooltip. It is also recommended for rtl languages as it works around
7241
- * rtl bugs in early Firefox.
7242
- *
7243
- * @sample {highcharts|highstock} highcharts/tooltip/footerformat/
7244
- * A table for value alignment
7245
- * @sample {highcharts|highstock} highcharts/tooltip/fullhtml/
7246
- * Full HTML tooltip
7247
- * @sample {highmaps} maps/tooltip/usehtml/
7248
- * Pure HTML tooltip
7249
- *
7250
- * @type {boolean}
7251
- * @default false
7252
- * @since 2.2
7253
- * @apioption tooltip.useHTML
7254
- */
7255
7189
  /**
7256
7190
  * How many decimals to show in each series' y value. This is
7257
7191
  * overridable in each series' tooltip options object. The default is to
@@ -7574,6 +7508,9 @@ const defaultOptions = {
7574
7508
  * contains the category name, x value or datetime string depending on
7575
7509
  * the type of axis. For datetime axes, the `point.key` date format can
7576
7510
  * be set using `tooltip.xDateFormat`.
7511
+ * In v12+, locale-aware date names follow the browser's casing and can
7512
+ * be lower-case, so use the `ucfirst` helper (for example
7513
+ * `{ucfirst point.key}`) if you want a capitalized header.
7577
7514
  *
7578
7515
  * @sample {highcharts} highcharts/tooltip/footerformat/
7579
7516
  * An HTML table in the tooltip
@@ -7688,13 +7625,14 @@ const defaultOptions = {
7688
7625
  * @apioption tooltip.shadow
7689
7626
  */
7690
7627
  /**
7691
- * Prevents the tooltip from switching or closing when touched or
7628
+ * Prevents the tooltip from switching or closing, when touched or
7692
7629
  * pointed.
7693
7630
  *
7694
7631
  * @sample highcharts/tooltip/stickoncontact/
7695
7632
  * Tooltip sticks on pointer contact
7696
7633
  *
7697
- * @since 8.0.1
7634
+ * @type {boolean}
7635
+ * @since 8.0.1
7698
7636
  */
7699
7637
  stickOnContact: false,
7700
7638
  /**
@@ -7733,7 +7671,7 @@ const defaultOptions = {
7733
7671
  * @sample {highmaps} maps/tooltip/usehtml/
7734
7672
  * Pure HTML tooltip
7735
7673
  *
7736
- * @since 2.2
7674
+ * @since 2.2
7737
7675
  */
7738
7676
  useHTML: false
7739
7677
  },
@@ -8052,11 +7990,12 @@ const DefaultOptions = {
8052
7990
  ;// ./code/grid/es-modules/Core/Templating.js
8053
7991
  /* *
8054
7992
  *
8055
- * (c) 2010-2025 Torstein Honsi
7993
+ * (c) 2010-2026 Highsoft AS
7994
+ * Author: Torstein Honsi
8056
7995
  *
8057
- * License: www.highcharts.com/license
7996
+ * A commercial license may be required depending on use.
7997
+ * See www.highcharts.com/license
8058
7998
  *
8059
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
8060
7999
  *
8061
8000
  * */
8062
8001
 
@@ -8066,6 +8005,7 @@ const { defaultOptions: Templating_defaultOptions, defaultTime: Templating_defau
8066
8005
  const { pageLang: Templating_pageLang } = Core_Globals;
8067
8006
 
8068
8007
  const { extend: Templating_extend, getNestedProperty: Templating_getNestedProperty, isArray: Templating_isArray, isNumber: Templating_isNumber, isObject: Templating_isObject, isString: Templating_isString, pick: Templating_pick, ucfirst: Templating_ucfirst } = Core_Utilities;
8008
+ /** @internal */
8069
8009
  const helpers = {
8070
8010
  // Built-in helpers
8071
8011
  add: (a, b) => a + b,
@@ -8100,7 +8040,10 @@ const numberFormatCache = {};
8100
8040
  * Functions
8101
8041
  *
8102
8042
  * */
8103
- // Internal convenience function
8043
+ /**
8044
+ * Internal convenience function.
8045
+ * @internal
8046
+ */
8104
8047
  const isQuotedString = (str) => /^["'].+["']$/.test(str);
8105
8048
  /**
8106
8049
  * Formats a JavaScript date timestamp (milliseconds since Jan 1st 1970) into a
@@ -8483,11 +8426,11 @@ const Templating = {
8483
8426
  *
8484
8427
  * Resizing Mode abstract class
8485
8428
  *
8486
- * (c) 2020-2025 Highsoft AS
8429
+ * (c) 2020-2026 Highsoft AS
8487
8430
  *
8488
- * License: www.highcharts.com/license
8431
+ * A commercial license may be required depending on use.
8432
+ * See www.highcharts.com/license
8489
8433
  *
8490
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
8491
8434
  *
8492
8435
  * Authors:
8493
8436
  * - Dawid Dragula
@@ -8679,11 +8622,11 @@ ResizingMode.MIN_COLUMN_WIDTH = 20;
8679
8622
  *
8680
8623
  * Adjacent Resizing Mode class
8681
8624
  *
8682
- * (c) 2020-2025 Highsoft AS
8625
+ * (c) 2020-2026 Highsoft AS
8683
8626
  *
8684
- * License: www.highcharts.com/license
8627
+ * A commercial license may be required depending on use.
8628
+ * See www.highcharts.com/license
8685
8629
  *
8686
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
8687
8630
  *
8688
8631
  * Authors:
8689
8632
  * - Dawid Dragula
@@ -8743,11 +8686,11 @@ class AdjacentResizingMode extends ColumnResizing_ResizingMode {
8743
8686
  *
8744
8687
  * Independent Resizing Mode class
8745
8688
  *
8746
- * (c) 2020-2025 Highsoft AS
8689
+ * (c) 2020-2026 Highsoft AS
8747
8690
  *
8748
- * License: www.highcharts.com/license
8691
+ * A commercial license may be required depending on use.
8692
+ * See www.highcharts.com/license
8749
8693
  *
8750
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
8751
8694
  *
8752
8695
  * Authors:
8753
8696
  * - Dawid Dragula
@@ -8808,11 +8751,11 @@ class IndependentResizingMode extends ColumnResizing_ResizingMode {
8808
8751
  *
8809
8752
  * Distributed Resizing Mode class
8810
8753
  *
8811
- * (c) 2020-2025 Highsoft AS
8754
+ * (c) 2020-2026 Highsoft AS
8812
8755
  *
8813
- * License: www.highcharts.com/license
8756
+ * A commercial license may be required depending on use.
8757
+ * See www.highcharts.com/license
8814
8758
  *
8815
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
8816
8759
  *
8817
8760
  * Authors:
8818
8761
  * - Dawid Dragula
@@ -8863,11 +8806,11 @@ class DistributedResizingMode extends ColumnResizing_ResizingMode {
8863
8806
  *
8864
8807
  * Column Resizing namespace
8865
8808
  *
8866
- * (c) 2020-2025 Highsoft AS
8809
+ * (c) 2020-2026 Highsoft AS
8867
8810
  *
8868
- * License: www.highcharts.com/license
8811
+ * A commercial license may be required depending on use.
8812
+ * See www.highcharts.com/license
8869
8813
  *
8870
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
8871
8814
  *
8872
8815
  * Authors:
8873
8816
  * - Dawid Dragula
@@ -8931,11 +8874,11 @@ function initMode(viewport) {
8931
8874
  ;// ./code/grid/es-modules/Data/Modifiers/DataModifier.js
8932
8875
  /* *
8933
8876
  *
8934
- * (c) 2009-2025 Highsoft AS
8877
+ * (c) 2009-2026 Highsoft AS
8935
8878
  *
8936
- * License: www.highcharts.com/license
8879
+ * A commercial license may be required depending on use.
8880
+ * See www.highcharts.com/license
8937
8881
  *
8938
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
8939
8882
  *
8940
8883
  * Authors:
8941
8884
  * - Sophie Bremer
@@ -9135,11 +9078,11 @@ class DataModifier {
9135
9078
  ;// ./code/grid/es-modules/Data/ColumnUtils.js
9136
9079
  /* *
9137
9080
  *
9138
- * (c) 2020-2025 Highsoft AS
9081
+ * (c) 2020-2026 Highsoft AS
9139
9082
  *
9140
- * License: www.highcharts.com/license
9083
+ * A commercial license may be required depending on use.
9084
+ * See www.highcharts.com/license
9141
9085
  *
9142
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
9143
9086
  *
9144
9087
  * Authors:
9145
9088
  * - Dawid Dragula
@@ -9277,11 +9220,11 @@ var ColumnUtils;
9277
9220
  ;// ./code/grid/es-modules/Data/DataTableCore.js
9278
9221
  /* *
9279
9222
  *
9280
- * (c) 2009-2025 Highsoft AS
9223
+ * (c) 2009-2026 Highsoft AS
9281
9224
  *
9282
- * License: www.highcharts.com/license
9225
+ * A commercial license may be required depending on use.
9226
+ * See www.highcharts.com/license
9283
9227
  *
9284
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
9285
9228
  *
9286
9229
  * Authors:
9287
9230
  * - Sophie Bremer
@@ -9551,11 +9494,11 @@ class DataTableCore {
9551
9494
  }
9552
9495
  }
9553
9496
  /**
9554
- * Returns the medified (clone) or the original data table if the modified
9497
+ * Returns the modified (clone) or the original data table if the modified
9555
9498
  * one does not exist.
9556
9499
  *
9557
9500
  * @return {Highcharts.DataTableCore}
9558
- * The medified (clone) or the original data table.
9501
+ * The modified (clone) or the original data table.
9559
9502
  */
9560
9503
  getModified() {
9561
9504
  return this.modified || this;
@@ -9604,11 +9547,11 @@ class DataTableCore {
9604
9547
  ;// ./code/grid/es-modules/Data/DataTable.js
9605
9548
  /* *
9606
9549
  *
9607
- * (c) 2009-2025 Highsoft AS
9550
+ * (c) 2009-2026 Highsoft AS
9608
9551
  *
9609
- * License: www.highcharts.com/license
9552
+ * A commercial license may be required depending on use.
9553
+ * See www.highcharts.com/license
9610
9554
  *
9611
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
9612
9555
  *
9613
9556
  * Authors:
9614
9557
  * - Sophie Bremer
@@ -9763,11 +9706,11 @@ class DataTable extends Data_DataTableCore {
9763
9706
  *
9764
9707
  * @function Highcharts.DataTable#deleteRows
9765
9708
  *
9766
- * @param {number} [rowIndex]
9767
- * Index to start delete of rows. If not specified, all rows will be
9768
- * deleted.
9709
+ * @param {number | number[]} [rowIndex]
9710
+ * Index of the row where deletion should start, or an array of indices for
9711
+ * deleting multiple rows. If not specified, all rows will be deleted.
9769
9712
  *
9770
- * @param {number} [rowCount=1]
9713
+ * @param {number} [rowCount]
9771
9714
  * Number of rows to delete.
9772
9715
  *
9773
9716
  * @param {Highcharts.DataTableEventDetail} [eventDetail]
@@ -9780,43 +9723,77 @@ class DataTable extends Data_DataTableCore {
9780
9723
  * @emits #afterDeleteRows
9781
9724
  */
9782
9725
  deleteRows(rowIndex, rowCount = 1, eventDetail) {
9783
- const table = this, deletedRows = [], modifiedRows = [], modifier = table.modifier;
9784
- table.emit({
9726
+ const { columns, modifier } = this;
9727
+ const deletedRows = [];
9728
+ let indices;
9729
+ let actualRowCount;
9730
+ if (!DataTable_defined(rowIndex)) {
9731
+ // No index provided - delete all rows.
9732
+ indices = [0];
9733
+ actualRowCount = this.rowCount;
9734
+ }
9735
+ else if (Array.isArray(rowIndex)) {
9736
+ // Array of indices provided - delete the specified rows.
9737
+ indices = rowIndex
9738
+ // Remove negative indices, and indices beyond the row count,
9739
+ // and remove duplicates.
9740
+ .filter((index, i, arr) => (index >= 0 &&
9741
+ index < this.rowCount &&
9742
+ arr.indexOf(index) === i))
9743
+ // Sort indices in descending order.
9744
+ .sort((a, b) => b - a);
9745
+ actualRowCount = indices.length;
9746
+ }
9747
+ else {
9748
+ // Single index provided - delete the specified range of rows.
9749
+ indices = [rowIndex];
9750
+ actualRowCount = rowCount;
9751
+ }
9752
+ this.emit({
9785
9753
  type: 'deleteRows',
9786
9754
  detail: eventDetail,
9787
- rowCount,
9788
- rowIndex: (rowIndex || 0)
9755
+ rowCount: actualRowCount,
9756
+ rowIndex: rowIndex ?? 0
9789
9757
  });
9790
- if (typeof rowIndex === 'undefined') {
9791
- rowIndex = 0;
9792
- rowCount = table.rowCount;
9793
- }
9794
- if (rowCount > 0 && rowIndex < table.rowCount) {
9795
- const columns = table.columns, columnIds = Object.keys(columns);
9796
- for (let i = 0, iEnd = columnIds.length, column, deletedCells, columnId; i < iEnd; ++i) {
9797
- columnId = columnIds[i];
9798
- column = columns[columnId];
9799
- const result = DataTable_splice(column, rowIndex, rowCount);
9800
- deletedCells = result.removed;
9801
- columns[columnId] = column = result.array;
9758
+ if (actualRowCount > 0) {
9759
+ const columnIds = Object.keys(columns);
9760
+ for (let i = 0; i < columnIds.length; ++i) {
9761
+ const columnId = columnIds[i];
9762
+ const column = columns[columnId];
9763
+ let deletedCells;
9764
+ // Perform a range splice.
9765
+ if (indices.length === 1 && actualRowCount > 1) {
9766
+ const result = DataTable_splice(column, indices[0], actualRowCount);
9767
+ deletedCells = result.removed;
9768
+ columns[columnId] = result.array;
9769
+ }
9770
+ else {
9771
+ // Perform a index splice for each index in the array.
9772
+ deletedCells = [];
9773
+ for (const index of indices) {
9774
+ deletedCells.push(column[index]);
9775
+ DataTable_splice(column, index, 1);
9776
+ }
9777
+ // Reverse the deleted cells to maintain the correct order.
9778
+ deletedCells.reverse();
9779
+ }
9802
9780
  if (!i) {
9803
- table.rowCount = column.length;
9781
+ this.rowCount = column.length;
9804
9782
  }
9805
9783
  for (let j = 0, jEnd = deletedCells.length; j < jEnd; ++j) {
9806
- deletedRows[j] = (deletedRows[j] || []);
9784
+ deletedRows[j] = deletedRows[j] || [];
9807
9785
  deletedRows[j][i] = deletedCells[j];
9808
9786
  }
9809
- modifiedRows.push(new Array(iEnd));
9810
9787
  }
9811
9788
  }
9812
9789
  if (modifier) {
9813
- modifier.modifyTable(table);
9790
+ modifier.modifyTable(this);
9814
9791
  }
9815
- table.emit({
9792
+ this.emit({
9816
9793
  type: 'afterDeleteRows',
9817
9794
  detail: eventDetail,
9818
- rowCount,
9819
- rowIndex: (rowIndex || 0),
9795
+ rowCount: actualRowCount,
9796
+ rowIndex: rowIndex ?? 0,
9820
9797
  rows: deletedRows
9821
9798
  });
9822
9799
  return deletedRows;
@@ -10537,11 +10514,11 @@ class DataTable extends Data_DataTableCore {
10537
10514
  ;// ./code/grid/es-modules/Data/Connectors/DataConnector.js
10538
10515
  /* *
10539
10516
  *
10540
- * (c) 2009-2025 Highsoft AS
10517
+ * (c) 2009-2026 Highsoft AS
10541
10518
  *
10542
- * License: www.highcharts.com/license
10519
+ * A commercial license may be required depending on use.
10520
+ * See www.highcharts.com/license
10543
10521
  *
10544
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
10545
10522
  *
10546
10523
  * Authors:
10547
10524
  * - Sophie Bremer
@@ -10703,6 +10680,34 @@ class DataConnector {
10703
10680
  connector.describeColumn(columnIds[i], { index: i });
10704
10681
  }
10705
10682
  }
10683
+ /**
10684
+ * Updates the connector with new options.
10685
+ *
10686
+ * @param newOptions
10687
+ * The new options to be applied to the connector.
10688
+ *
10689
+ * @param reload
10690
+ * Whether to reload the connector after applying the new options.
10691
+ */
10692
+ async update(newOptions, reload = true) {
10693
+ this.emit({ type: 'beforeUpdate' });
10694
+ DataConnector_merge(true, this.options, newOptions);
10695
+ const { options } = this;
10696
+ if ('enablePolling' in newOptions || 'dataRefreshRate' in newOptions) {
10697
+ if ('enablePolling' in options && options.enablePolling) {
10698
+ this.stopPolling();
10699
+ this.startPolling(('dataRefreshRate' in options &&
10700
+ typeof options.dataRefreshRate === 'number') ? Math.max(options.dataRefreshRate, 1) * 1000 : 1000);
10701
+ }
10702
+ else {
10703
+ this.stopPolling();
10704
+ }
10705
+ }
10706
+ if (reload) {
10707
+ await this.load();
10708
+ }
10709
+ this.emit({ type: 'afterUpdate' });
10710
+ }
10706
10711
  /**
10707
10712
  * The default load method, which fires the `afterLoad` event
10708
10713
  *
@@ -10746,7 +10751,9 @@ class DataConnector {
10746
10751
  this.pollingController = new AbortController();
10747
10752
  // Clear the polling timeout.
10748
10753
  window.clearTimeout(connector._polling);
10749
- connector._polling = window.setTimeout(() => connector
10754
+ connector._polling = window.setTimeout(
10755
+ // eslint-disable-next-line @typescript-eslint/no-misused-promises
10756
+ () => connector
10750
10757
  .load()['catch']((error) => connector.emit({
10751
10758
  type: 'loadError',
10752
10759
  error
@@ -10885,11 +10892,11 @@ class DataConnector {
10885
10892
  ;// ./code/grid/es-modules/Data/Converters/DataConverterUtils.js
10886
10893
  /* *
10887
10894
  *
10888
- * (c) 2009-2025 Highsoft AS
10895
+ * (c) 2009-2026 Highsoft AS
10889
10896
  *
10890
- * License: www.highcharts.com/license
10897
+ * A commercial license may be required depending on use.
10898
+ * See www.highcharts.com/license
10891
10899
  *
10892
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
10893
10900
  *
10894
10901
  * Authors:
10895
10902
  * - Kamil Kubik
@@ -11103,11 +11110,11 @@ var DataConverterUtils;
11103
11110
  ;// ./code/grid/es-modules/Data/Converters/DataConverter.js
11104
11111
  /* *
11105
11112
  *
11106
- * (c) 2009-2025 Highsoft AS
11113
+ * (c) 2009-2026 Highsoft AS
11107
11114
  *
11108
- * License: www.highcharts.com/license
11115
+ * A commercial license may be required depending on use.
11116
+ * See www.highcharts.com/license
11109
11117
  *
11110
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
11111
11118
  *
11112
11119
  * Authors:
11113
11120
  * - Sophie Bremer
@@ -11492,11 +11499,11 @@ DataConverter.defaultOptions = {
11492
11499
  ;// ./code/grid/es-modules/Data/DataCursor.js
11493
11500
  /* *
11494
11501
  *
11495
- * (c) 2020-2025 Highsoft AS
11502
+ * (c) 2020-2026 Highsoft AS
11496
11503
  *
11497
- * License: www.highcharts.com/license
11504
+ * A commercial license may be required depending on use.
11505
+ * See www.highcharts.com/license
11498
11506
  *
11499
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
11500
11507
  *
11501
11508
  * Authors:
11502
11509
  * - Sophie Bremer
@@ -11873,13 +11880,14 @@ class DataCursor {
11873
11880
  ;// ./code/grid/es-modules/Accessibility/HighContrastMode.js
11874
11881
  /* *
11875
11882
  *
11876
- * (c) 2009-2025 Øystein Moseng
11883
+ * (c) 2009-2026 Highsoft AS
11884
+ * Author: Øystein Moseng
11877
11885
  *
11878
11886
  * Handling for Windows High Contrast Mode.
11879
11887
  *
11880
- * License: www.highcharts.com/license
11888
+ * A commercial license may be required depending on use.
11889
+ * See www.highcharts.com/license
11881
11890
  *
11882
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
11883
11891
  *
11884
11892
  * */
11885
11893
 
@@ -11975,11 +11983,11 @@ const whcm = {
11975
11983
  ;// ./code/grid/es-modules/Grid/Core/Globals.js
11976
11984
  /* *
11977
11985
  *
11978
- * (c) 2009-2025 Highsoft AS
11986
+ * (c) 2009-2026 Highsoft AS
11979
11987
  *
11980
- * License: www.highcharts.com/license
11988
+ * A commercial license may be required depending on use.
11989
+ * See www.highcharts.com/license
11981
11990
  *
11982
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
11983
11991
  *
11984
11992
  * Authors:
11985
11993
  * - Dawid Dragula
@@ -11993,7 +12001,7 @@ const whcm = {
11993
12001
  *
11994
12002
  * */
11995
12003
  const classNamePrefix = 'hcg-';
11996
- const version = '2.1.0';
12004
+ const version = '2.2.0';
11997
12005
  const rawClassNames = {
11998
12006
  container: 'container',
11999
12007
  tableElement: 'table',
@@ -12005,7 +12013,6 @@ const rawClassNames = {
12005
12013
  rowEven: 'row-even',
12006
12014
  rowOdd: 'row-odd',
12007
12015
  hoveredRow: 'hovered-row',
12008
- columnElement: 'column',
12009
12016
  hoveredCell: 'hovered-cell',
12010
12017
  hoveredColumn: 'hovered-column',
12011
12018
  syncedRow: 'synced-row',
@@ -12031,6 +12038,7 @@ const rawClassNames = {
12031
12038
  columnSortableIcon: 'column-sortable-icon',
12032
12039
  columnSortedAsc: 'column-sorted-asc',
12033
12040
  columnSortedDesc: 'column-sorted-desc',
12041
+ sortPriorityIndicator: 'sort-priority-indicator',
12034
12042
  resizableContent: 'resizable-content',
12035
12043
  resizerHandles: 'column-resizer',
12036
12044
  resizedColumn: 'column-resized',
@@ -12100,11 +12108,11 @@ const getClassName = (classNameKey) => classNamePrefix + rawClassNames[className
12100
12108
  *
12101
12109
  * Grid utilities
12102
12110
  *
12103
- * (c) 2009-2025 Highsoft AS
12111
+ * (c) 2009-2026 Highsoft AS
12104
12112
  *
12105
- * License: www.highcharts.com/license
12113
+ * A commercial license may be required depending on use.
12114
+ * See www.highcharts.com/license
12106
12115
  *
12107
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
12108
12116
  *
12109
12117
  * Authors:
12110
12118
  * - Dawid Dragula
@@ -12281,11 +12289,11 @@ function formatText(template, values) {
12281
12289
  *
12282
12290
  * Grid Filtering Types and Constants
12283
12291
  *
12284
- * (c) 2020-2025 Highsoft AS
12292
+ * (c) 2020-2026 Highsoft AS
12285
12293
  *
12286
- * License: www.highcharts.com/license
12294
+ * A commercial license may be required depending on use.
12295
+ * See www.highcharts.com/license
12287
12296
  *
12288
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
12289
12297
  *
12290
12298
  * Authors:
12291
12299
  * - Dawid Dragula
@@ -12364,11 +12372,11 @@ const conditionsMap = {
12364
12372
  *
12365
12373
  * Grid ColumnFiltering class
12366
12374
  *
12367
- * (c) 2020-2025 Highsoft AS
12375
+ * (c) 2020-2026 Highsoft AS
12368
12376
  *
12369
- * License: www.highcharts.com/license
12377
+ * A commercial license may be required depending on use.
12378
+ * See www.highcharts.com/license
12370
12379
  *
12371
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
12372
12380
  *
12373
12381
  * Authors:
12374
12382
  * - Dawid Dragula
@@ -12740,75 +12748,411 @@ class ColumnFiltering {
12740
12748
  * */
12741
12749
  /* harmony default export */ const ColumnFiltering_ColumnFiltering = (ColumnFiltering);
12742
12750
 
12743
- ;// ./code/grid/es-modules/Grid/Core/Accessibility/Accessibility.js
12751
+ ;// ./code/grid/es-modules/Accessibility/Utils/HTMLUtilities.js
12744
12752
  /* *
12745
12753
  *
12746
- * Grid Accessibility class
12747
- *
12748
- * (c) 2020-2025 Highsoft AS
12754
+ * (c) 2009-2026 Highsoft AS
12755
+ * Author: Øystein Moseng
12749
12756
  *
12750
- * License: www.highcharts.com/license
12757
+ * Utility functions for accessibility module.
12751
12758
  *
12752
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
12759
+ * A commercial license may be required depending on use.
12760
+ * See www.highcharts.com/license
12753
12761
  *
12754
- * Authors:
12755
- * - Dawid Dragula
12756
- * - Sebastian Bochan
12757
12762
  *
12758
12763
  * */
12759
12764
 
12760
12765
 
12766
+ const { doc: HTMLUtilities_doc, win: HTMLUtilities_win } = Core_Globals;
12761
12767
 
12762
-
12763
-
12764
- const { formatText: Accessibility_formatText } = GridUtils;
12768
+ const { css: HTMLUtilities_css } = Core_Utilities;
12769
+ /* *
12770
+ *
12771
+ * Constants
12772
+ *
12773
+ * */
12774
+ const simulatedEventTarget = HTMLUtilities_win.EventTarget && new HTMLUtilities_win.EventTarget() || 'none';
12775
+ /* *
12776
+ *
12777
+ * Functions
12778
+ *
12779
+ * */
12780
+ /* eslint-disable valid-jsdoc */
12765
12781
  /**
12766
- * Representing the accessibility functionalities for the Data Grid.
12782
+ * @private
12783
+ * @param {Highcharts.HTMLDOMElement} el
12784
+ * @param {string} className
12785
+ * @return {void}
12767
12786
  */
12768
- class Accessibility {
12769
- /* *
12770
- *
12771
- * Constructor
12772
- *
12773
- * */
12774
- /**
12775
- * Construct the accessibility object.
12776
- *
12777
- * @param grid
12778
- * The Grid Table instance which the accessibility controller belong to.
12779
- */
12780
- constructor(grid) {
12781
- this.grid = grid;
12782
- this.element = document.createElement('div');
12783
- this.element.classList.add(Grid_Core_Globals.getClassName('visuallyHidden'));
12784
- this.grid.container?.prepend(this.element);
12785
- this.announcerElement = document.createElement('p');
12786
- this.announcerElement.setAttribute('aria-atomic', 'true');
12787
- this.announcerElement.setAttribute('aria-hidden', 'false');
12787
+ function addClass(el, className) {
12788
+ if (el.classList) {
12789
+ el.classList.add(className);
12788
12790
  }
12789
- /* *
12790
- *
12791
- * Methods
12792
- *
12793
- * */
12794
- /**
12795
- * Add the description to the header cell.
12796
- *
12797
- * @param thElement
12798
- * The header cell element to add the description to.
12799
- *
12800
- * @param description
12801
- * The description to be added.
12802
- */
12803
- addHeaderCellDescription(thElement, description) {
12804
- if (description) {
12805
- thElement.setAttribute('aria-description', description);
12791
+ else if (el.className.indexOf(className) < 0) {
12792
+ // Note: Dumb check for class name exists, should be fine for practical
12793
+ // use cases, but will return false positives if the element has a class
12794
+ // that contains the className.
12795
+ el.className += ' ' + className;
12796
+ }
12797
+ }
12798
+ /**
12799
+ * @private
12800
+ * @param {Highcharts.HTMLDOMElement} el
12801
+ * @param {string} className
12802
+ * @return {void}
12803
+ */
12804
+ function removeClass(el, className) {
12805
+ if (el.classList) {
12806
+ el.classList.remove(className);
12807
+ }
12808
+ else {
12809
+ // Note: Dumb logic that will break if the element has a class name that
12810
+ // consists of className plus something else.
12811
+ el.className = el.className.replace(new RegExp(className, 'g'), '');
12812
+ }
12813
+ }
12814
+ /**
12815
+ * Utility function to clone a mouse event for re-dispatching.
12816
+ * @private
12817
+ */
12818
+ function cloneMouseEvent(e) {
12819
+ if (typeof HTMLUtilities_win.MouseEvent === 'function') {
12820
+ return new HTMLUtilities_win.MouseEvent(e.type, e);
12821
+ }
12822
+ // No MouseEvent support, try using initMouseEvent
12823
+ if (HTMLUtilities_doc?.createEvent) {
12824
+ const evt = HTMLUtilities_doc.createEvent('MouseEvent');
12825
+ if (evt.initMouseEvent) {
12826
+ evt.initMouseEvent(e.type, e.bubbles, // #10561, #12161
12827
+ e.cancelable, e.view || HTMLUtilities_win, e.detail, e.screenX, e.screenY, e.clientX, e.clientY, e.ctrlKey, e.altKey, e.shiftKey, e.metaKey, e.button, e.relatedTarget);
12828
+ return evt;
12806
12829
  }
12807
12830
  }
12808
- /**
12809
- * Announce the message to the screen reader.
12810
- *
12811
- * @param msg
12831
+ return getFakeMouseEvent(e.type);
12832
+ }
12833
+ /**
12834
+ * Utility function to clone a touch event for re-dispatching.
12835
+ * @private
12836
+ */
12837
+ function cloneTouchEvent(e) {
12838
+ const touchListToTouchArray = (l) => {
12839
+ const touchArray = [];
12840
+ for (let i = 0; i < l.length; ++i) {
12841
+ const item = l.item(i);
12842
+ if (item) {
12843
+ touchArray.push(item);
12844
+ }
12845
+ }
12846
+ return touchArray;
12847
+ };
12848
+ if (typeof HTMLUtilities_win.TouchEvent === 'function') {
12849
+ const newEvent = new HTMLUtilities_win.TouchEvent(e.type, {
12850
+ touches: touchListToTouchArray(e.touches),
12851
+ targetTouches: touchListToTouchArray(e.targetTouches),
12852
+ changedTouches: touchListToTouchArray(e.changedTouches),
12853
+ ctrlKey: e.ctrlKey,
12854
+ shiftKey: e.shiftKey,
12855
+ altKey: e.altKey,
12856
+ metaKey: e.metaKey,
12857
+ bubbles: e.bubbles,
12858
+ cancelable: e.cancelable,
12859
+ composed: e.composed,
12860
+ detail: e.detail,
12861
+ view: e.view
12862
+ });
12863
+ if (e.defaultPrevented) {
12864
+ newEvent.preventDefault();
12865
+ }
12866
+ return newEvent;
12867
+ }
12868
+ const fakeEvt = cloneMouseEvent(e);
12869
+ fakeEvt.touches = e.touches;
12870
+ fakeEvt.changedTouches = e.changedTouches;
12871
+ fakeEvt.targetTouches = e.targetTouches;
12872
+ return fakeEvt;
12873
+ }
12874
+ /**
12875
+ * @private
12876
+ */
12877
+ function escapeStringForHTML(str) {
12878
+ return str
12879
+ .replace(/&/g, '&amp;')
12880
+ .replace(/</g, '&lt;')
12881
+ .replace(/>/g, '&gt;')
12882
+ .replace(/"/g, '&quot;')
12883
+ .replace(/'/g, '&#x27;')
12884
+ .replace(/\//g, '&#x2F;');
12885
+ }
12886
+ /**
12887
+ * Get an element by ID
12888
+ * @private
12889
+ */
12890
+ function getElement(id) {
12891
+ return HTMLUtilities_doc.getElementById(id);
12892
+ }
12893
+ /**
12894
+ * Get a fake mouse event of a given type. If relatedTarget is not given,
12895
+ * it will point to simulatedEventTarget, as an indicator that the event
12896
+ * is fake.
12897
+ * @private
12898
+ */
12899
+ function getFakeMouseEvent(type, position, relatedTarget) {
12900
+ const pos = position || {
12901
+ x: 0,
12902
+ y: 0
12903
+ };
12904
+ if (typeof HTMLUtilities_win.MouseEvent === 'function') {
12905
+ return new HTMLUtilities_win.MouseEvent(type, {
12906
+ bubbles: true,
12907
+ cancelable: true,
12908
+ composed: true,
12909
+ button: 0,
12910
+ buttons: 1,
12911
+ relatedTarget: relatedTarget || simulatedEventTarget,
12912
+ view: HTMLUtilities_win,
12913
+ detail: type === 'click' ? 1 : 0,
12914
+ screenX: pos.x,
12915
+ screenY: pos.y,
12916
+ clientX: pos.x,
12917
+ clientY: pos.y
12918
+ });
12919
+ }
12920
+ // No MouseEvent support, try using initMouseEvent
12921
+ if (HTMLUtilities_doc?.createEvent) {
12922
+ const evt = HTMLUtilities_doc.createEvent('MouseEvent');
12923
+ if (evt.initMouseEvent) {
12924
+ evt.initMouseEvent(type, true, // Bubble
12925
+ true, // Cancel
12926
+ HTMLUtilities_win, // View
12927
+ type === 'click' ? 1 : 0, // Detail
12928
+ // Coords
12929
+ pos.x, pos.y, pos.x, pos.y,
12930
+ // Pressed keys
12931
+ false, false, false, false, 0, // Button
12932
+ null // Related target
12933
+ );
12934
+ return evt;
12935
+ }
12936
+ }
12937
+ return { type: type };
12938
+ }
12939
+ /**
12940
+ * Get an appropriate heading level for an element. Corresponds to the
12941
+ * heading level below the previous heading in the DOM.
12942
+ *
12943
+ * Note: Only detects previous headings in the DOM that are siblings,
12944
+ * ancestors, or previous siblings of ancestors. Headings that are nested below
12945
+ * siblings of ancestors (cousins et.al) are not picked up. This is because it
12946
+ * is ambiguous whether or not the nesting is for layout purposes or indicates a
12947
+ * separate section.
12948
+ *
12949
+ * @private
12950
+ * @param {Highcharts.HTMLDOMElement} [element]
12951
+ * @return {string} The heading tag name (h1, h2 etc).
12952
+ * If no nearest heading is found, "p" is returned.
12953
+ */
12954
+ function getHeadingTagNameForElement(element) {
12955
+ const getIncreasedHeadingLevel = (tagName) => {
12956
+ const headingLevel = parseInt(tagName.slice(1), 10), newLevel = Math.min(6, headingLevel + 1);
12957
+ return 'h' + newLevel;
12958
+ };
12959
+ const isHeading = (tagName) => /^H[1-6]$/i.test(tagName);
12960
+ const getPreviousSiblingsHeading = (el) => {
12961
+ let sibling = el;
12962
+ while (sibling = sibling.previousSibling) { // eslint-disable-line
12963
+ const tagName = sibling.tagName || '';
12964
+ if (isHeading(tagName)) {
12965
+ return tagName;
12966
+ }
12967
+ }
12968
+ return '';
12969
+ };
12970
+ const getHeadingRecursive = (el) => {
12971
+ const prevSiblingsHeading = getPreviousSiblingsHeading(el);
12972
+ if (prevSiblingsHeading) {
12973
+ return getIncreasedHeadingLevel(prevSiblingsHeading);
12974
+ }
12975
+ // No previous siblings are headings, try parent node
12976
+ const parent = el.parentElement;
12977
+ if (!parent) {
12978
+ return 'h6';
12979
+ }
12980
+ const parentTagName = parent.tagName;
12981
+ if (isHeading(parentTagName)) {
12982
+ return getIncreasedHeadingLevel(parentTagName);
12983
+ }
12984
+ return getHeadingRecursive(parent);
12985
+ };
12986
+ return getHeadingRecursive(element);
12987
+ }
12988
+ /**
12989
+ * Remove an element from the DOM.
12990
+ * @private
12991
+ * @param {Highcharts.HTMLDOMElement|Highcharts.SVGDOMElement} [element]
12992
+ * @return {void}
12993
+ */
12994
+ function removeElement(element) {
12995
+ if (element && element.parentNode) {
12996
+ element.parentNode.removeChild(element);
12997
+ }
12998
+ }
12999
+ /**
13000
+ * Remove all child nodes from an element.
13001
+ * @private
13002
+ * @param {Highcharts.HTMLDOMElement|Highcharts.SVGDOMElement} [element]
13003
+ * @return {void}
13004
+ */
13005
+ function removeChildNodes(element) {
13006
+ while (element.lastChild) {
13007
+ element.removeChild(element.lastChild);
13008
+ }
13009
+ }
13010
+ /**
13011
+ * Utility function. Reverses child nodes of a DOM element.
13012
+ * @private
13013
+ */
13014
+ function reverseChildNodes(node) {
13015
+ let i = node.childNodes.length;
13016
+ while (i--) {
13017
+ node.appendChild(node.childNodes[i]);
13018
+ }
13019
+ }
13020
+ /**
13021
+ * Used for aria-label attributes, painting on a canvas will fail if the
13022
+ * text contains tags.
13023
+ * @private
13024
+ */
13025
+ function stripHTMLTagsFromString(str, isForExport = false) {
13026
+ return (typeof str === 'string') ?
13027
+ (isForExport ?
13028
+ str.replace(/<\/?[^>]+(>|$)/g, '') :
13029
+ str.replace(/<\/?(?!\s)[^>]+(>|$)/g, '')) : str;
13030
+ }
13031
+ /**
13032
+ * Utility function for hiding an element visually, but still keeping it
13033
+ * available to screen reader users.
13034
+ * @private
13035
+ */
13036
+ function visuallyHideElement(element) {
13037
+ HTMLUtilities_css(element, {
13038
+ position: 'absolute',
13039
+ width: '1px',
13040
+ height: '1px',
13041
+ overflow: 'hidden',
13042
+ whiteSpace: 'nowrap',
13043
+ clip: 'rect(1px, 1px, 1px, 1px)',
13044
+ marginTop: '-3px',
13045
+ '-ms-filter': 'progid:DXImageTransform.Microsoft.Alpha(Opacity=1)',
13046
+ filter: 'alpha(opacity=1)',
13047
+ opacity: 0.01
13048
+ });
13049
+ }
13050
+ /* *
13051
+ *
13052
+ * Default Export
13053
+ *
13054
+ * */
13055
+ const HTMLUtilities = {
13056
+ addClass,
13057
+ cloneMouseEvent,
13058
+ cloneTouchEvent,
13059
+ escapeStringForHTML,
13060
+ getElement,
13061
+ getFakeMouseEvent,
13062
+ getHeadingTagNameForElement,
13063
+ removeChildNodes,
13064
+ removeClass,
13065
+ removeElement,
13066
+ reverseChildNodes,
13067
+ simulatedEventTarget,
13068
+ stripHTMLTagsFromString,
13069
+ visuallyHideElement
13070
+ };
13071
+ /* harmony default export */ const Utils_HTMLUtilities = (HTMLUtilities);
13072
+
13073
+ ;// ./code/grid/es-modules/Grid/Core/Accessibility/Accessibility.js
13074
+ /* *
13075
+ *
13076
+ * Grid Accessibility class
13077
+ *
13078
+ * (c) 2020-2026 Highsoft AS
13079
+ *
13080
+ * A commercial license may be required depending on use.
13081
+ * See www.highcharts.com/license
13082
+ *
13083
+ *
13084
+ * Authors:
13085
+ * - Dawid Dragula
13086
+ * - Sebastian Bochan
13087
+ * - Kamil Kubik
13088
+ *
13089
+ * */
13090
+
13091
+
13092
+
13093
+
13094
+
13095
+
13096
+
13097
+
13098
+ const { formatText: Accessibility_formatText } = GridUtils;
13099
+ const { replaceNested: Accessibility_replaceNested } = Core_Utilities;
13100
+ const { getHeadingTagNameForElement: Accessibility_getHeadingTagNameForElement } = Utils_HTMLUtilities;
13101
+ /**
13102
+ * Representing the accessibility functionalities for the Data Grid.
13103
+ */
13104
+ class Accessibility {
13105
+ /* *
13106
+ *
13107
+ * Constructor
13108
+ *
13109
+ * */
13110
+ /**
13111
+ * Construct the accessibility object.
13112
+ *
13113
+ * @param grid
13114
+ * The Grid Table instance which the accessibility controller belong to.
13115
+ */
13116
+ constructor(grid) {
13117
+ /**
13118
+ * The before Grid screen reader section element.
13119
+ */
13120
+ this.beforeGridElement = null;
13121
+ /**
13122
+ * The after Grid screen reader section element.
13123
+ */
13124
+ this.afterGridElement = null;
13125
+ this.grid = grid;
13126
+ this.element = document.createElement('div');
13127
+ this.element.classList.add(Grid_Core_Globals.getClassName('visuallyHidden'));
13128
+ this.grid.container?.prepend(this.element);
13129
+ this.announcerElement = document.createElement('p');
13130
+ this.announcerElement.setAttribute('aria-atomic', 'true');
13131
+ this.announcerElement.setAttribute('aria-hidden', 'false');
13132
+ }
13133
+ /* *
13134
+ *
13135
+ * Methods
13136
+ *
13137
+ * */
13138
+ /**
13139
+ * Add the description to the header cell.
13140
+ *
13141
+ * @param thElement
13142
+ * The header cell element to add the description to.
13143
+ *
13144
+ * @param description
13145
+ * The description to be added.
13146
+ */
13147
+ addHeaderCellDescription(thElement, description) {
13148
+ if (description) {
13149
+ thElement.setAttribute('aria-description', description);
13150
+ }
13151
+ }
13152
+ /**
13153
+ * Announce the message to the screen reader.
13154
+ *
13155
+ * @param msg
12812
13156
  * The message to be announced.
12813
13157
  *
12814
13158
  * @param assertive
@@ -12957,10 +13301,169 @@ class Accessibility {
12957
13301
  }
12958
13302
  this.addHighContrast();
12959
13303
  }
13304
+ /**
13305
+ * Adds the screen reader section before or after the Grid.
13306
+ *
13307
+ * @param placement
13308
+ * Either 'before' or 'after'.
13309
+ */
13310
+ addScreenReaderSection(placement) {
13311
+ const grid = this.grid;
13312
+ const isBefore = placement === 'before';
13313
+ // Get the screen reader section content.
13314
+ const defaultFormatter = isBefore ?
13315
+ this.defaultBeforeFormatter() :
13316
+ this.defaultAfterFormatter();
13317
+ const formatter = grid.options?.accessibility?.screenReaderSection?.[`${placement}GridFormatter`];
13318
+ const content = formatter ? formatter(grid) : defaultFormatter;
13319
+ // Create the screen reader section element.
13320
+ const sectionElement = this[`${placement}GridElement`] = (this[`${placement}GridElement`] || document.createElement('div'));
13321
+ // Create the hidden element.
13322
+ const hiddenElement = sectionElement.firstChild ||
13323
+ document.createElement('div');
13324
+ if (content) {
13325
+ this.setScreenReaderSectionAttributes(sectionElement, placement);
13326
+ HTML_AST.setElementHTML(hiddenElement, content);
13327
+ // Append only if not already a child.
13328
+ if (hiddenElement.parentNode !== sectionElement) {
13329
+ sectionElement.appendChild(hiddenElement);
13330
+ }
13331
+ // Insert only if not already in the DOM.
13332
+ const gridContainer = grid.container;
13333
+ if (!sectionElement.parentNode && gridContainer) {
13334
+ if (isBefore) {
13335
+ gridContainer.insertBefore(sectionElement, gridContainer.firstChild);
13336
+ }
13337
+ else {
13338
+ gridContainer.appendChild(sectionElement);
13339
+ }
13340
+ }
13341
+ hiddenElement.classList.add(Grid_Core_Globals.getClassName('visuallyHidden'));
13342
+ }
13343
+ else {
13344
+ if (sectionElement.parentNode) {
13345
+ sectionElement.parentNode.removeChild(sectionElement);
13346
+ }
13347
+ this[`${placement}GridElement`] = null;
13348
+ }
13349
+ }
13350
+ /**
13351
+ * Sets the accessibility attributes for the screen reader section.
13352
+ *
13353
+ * @param sectionElement
13354
+ * The section element.
13355
+ *
13356
+ * @param placement
13357
+ * Either 'before' or 'after'.
13358
+ */
13359
+ setScreenReaderSectionAttributes(sectionElement, placement) {
13360
+ const grid = this.grid;
13361
+ sectionElement.setAttribute('id', `grid-screen-reader-region-${placement}-${grid.id}`);
13362
+ const regionLabel = grid.options?.lang?.accessibility?.screenReaderSection?.[`${placement}RegionLabel`];
13363
+ if (regionLabel) {
13364
+ sectionElement.setAttribute('aria-label', regionLabel);
13365
+ sectionElement.setAttribute('role', 'region');
13366
+ }
13367
+ // Position the section relatively to the Grid.
13368
+ sectionElement.style.position = 'relative';
13369
+ }
13370
+ /**
13371
+ * Gets the default formatter for the before-Grid screen reader section.
13372
+ * @private
13373
+ */
13374
+ defaultBeforeFormatter() {
13375
+ const grid = this.grid;
13376
+ const { container, dataTable, options } = grid;
13377
+ const format = options?.accessibility?.screenReaderSection?.beforeGridFormat;
13378
+ if (!format || !container) {
13379
+ return '';
13380
+ }
13381
+ const gridTitle = options?.caption?.text;
13382
+ let formattedGridTitle = '';
13383
+ if (gridTitle) {
13384
+ if (this.isWrappedInHeadingTag(gridTitle)) {
13385
+ formattedGridTitle = gridTitle;
13386
+ }
13387
+ else {
13388
+ const headingTag = Accessibility_getHeadingTagNameForElement(container);
13389
+ formattedGridTitle =
13390
+ `<${headingTag}>${gridTitle}</${headingTag}>`;
13391
+ }
13392
+ }
13393
+ const context = {
13394
+ gridTitle: formattedGridTitle,
13395
+ gridDescription: options?.description?.text || '',
13396
+ rowCount: dataTable?.rowCount || 0,
13397
+ columnCount: (dataTable?.getColumnIds() || []).length
13398
+ };
13399
+ const formattedString = this.formatTemplateString(format, context);
13400
+ return this.stripEmptyHTMLTags(formattedString);
13401
+ }
13402
+ /**
13403
+ * Checks if a string is already wrapped in a heading tag (h1-h6).
13404
+ * @private
13405
+ *
13406
+ * @param text
13407
+ * The text to check.
13408
+ *
13409
+ * @returns
13410
+ * True if the text is wrapped in a heading tag.
13411
+ */
13412
+ isWrappedInHeadingTag(text) {
13413
+ return /^<h([1-6])[^>]*>[\s\S]*<\/h\1>$/i.test(text.trim());
13414
+ }
13415
+ /**
13416
+ * Formats a string with template variables.
13417
+ *
13418
+ * @param format
13419
+ * The format string.
13420
+ *
13421
+ * @param context
13422
+ * The context object.
13423
+ *
13424
+ * @private
13425
+ */
13426
+ formatTemplateString(format, context) {
13427
+ return format.replace(/\{(\w+)\}/g, (_, key) => (key in context ? String(context[key]) : `{${key}}`));
13428
+ }
13429
+ /**
13430
+ * Gets the default formatter for the after-Grid screen reader section.
13431
+ * @private
13432
+ */
13433
+ defaultAfterFormatter() {
13434
+ const grid = this.grid;
13435
+ const format = grid.options?.accessibility?.screenReaderSection
13436
+ ?.afterGridFormat;
13437
+ if (!format) {
13438
+ return '';
13439
+ }
13440
+ return this.stripEmptyHTMLTags(format);
13441
+ }
13442
+ /**
13443
+ * Strips empty HTML tags from a string recursively.
13444
+ *
13445
+ * @param string
13446
+ * The string to strip empty HTML tags from.
13447
+ *
13448
+ * @private
13449
+ */
13450
+ stripEmptyHTMLTags(string) {
13451
+ return Accessibility_replaceNested(string, [/<([\w\-.:!]+)\b[^<>]*>\s*<\/\1>/g, '']);
13452
+ }
12960
13453
  /**
12961
13454
  * Destroy the accessibility controller.
12962
13455
  */
12963
13456
  destroy() {
13457
+ // Removes the screen reader before section.
13458
+ const beforeGridElement = this.beforeGridElement;
13459
+ if (beforeGridElement?.parentNode) {
13460
+ beforeGridElement.parentNode.removeChild(beforeGridElement);
13461
+ }
13462
+ // Removes the screen reader after section.
13463
+ const afterGridElement = this.afterGridElement;
13464
+ if (afterGridElement?.parentNode) {
13465
+ afterGridElement.parentNode.removeChild(afterGridElement);
13466
+ }
12964
13467
  this.element.remove();
12965
13468
  this.announcerElement.remove();
12966
13469
  clearTimeout(this.announcerTimeout);
@@ -12987,11 +13490,11 @@ const icons = {
12987
13490
  *
12988
13491
  * Grid Pagination class
12989
13492
  *
12990
- * (c) 2020-2025 Highsoft AS
13493
+ * (c) 2020-2026 Highsoft AS
12991
13494
  *
12992
- * License: www.highcharts.com/license
13495
+ * A commercial license may be required depending on use.
13496
+ * See www.highcharts.com/license
12993
13497
  *
12994
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
12995
13498
  *
12996
13499
  * Authors:
12997
13500
  * - Sebastian Bochan
@@ -13825,11 +14328,11 @@ Pagination.defaultOptions = {
13825
14328
  *
13826
14329
  * Grid default options
13827
14330
  *
13828
- * (c) 2009-2025 Highsoft AS
14331
+ * (c) 2009-2026 Highsoft AS
13829
14332
  *
13830
- * License: www.highcharts.com/license
14333
+ * A commercial license may be required depending on use.
14334
+ * See www.highcharts.com/license
13831
14335
  *
13832
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
13833
14336
  *
13834
14337
  * Authors:
13835
14338
  * - Dawid Dragula
@@ -13851,7 +14354,8 @@ const defaultLangOptions = {
13851
14354
  ascending: 'Sorted ascending.',
13852
14355
  descending: 'Sorted descending.',
13853
14356
  none: 'Not sorted.'
13854
- }
14357
+ },
14358
+ priority: 'Priority {priority}.'
13855
14359
  },
13856
14360
  pagination: {
13857
14361
  announcements: {
@@ -13868,6 +14372,10 @@ const defaultLangOptions = {
13868
14372
  filterCleared: 'Filter cleared for {columnId}. ' +
13869
14373
  '{rowsCount} results found.'
13870
14374
  }
14375
+ },
14376
+ screenReaderSection: {
14377
+ beforeRegionLabel: '',
14378
+ afterRegionLabel: ''
13871
14379
  }
13872
14380
  },
13873
14381
  loading: 'Loading...',
@@ -13918,6 +14426,13 @@ const Defaults_defaultOptions = {
13918
14426
  announcements: {
13919
14427
  sorting: true,
13920
14428
  filtering: true
14429
+ },
14430
+ screenReaderSection: {
14431
+ beforeGridFormat: '{gridTitle}' +
14432
+ '<div>{gridDescription}</div>' +
14433
+ '<div>Grid with {rowCount} rows and {columnCount}' +
14434
+ ' columns.</div>',
14435
+ afterGridFormat: 'End of Grid.'
13921
14436
  }
13922
14437
  },
13923
14438
  time: {
@@ -13943,7 +14458,7 @@ const Defaults_defaultOptions = {
13943
14458
  },
13944
14459
  columnDefaults: {
13945
14460
  sorting: {
13946
- sortable: true
14461
+ enabled: true
13947
14462
  },
13948
14463
  filtering: {
13949
14464
  inline: false
@@ -13977,11 +14492,11 @@ function Defaults_setOptions(options) {
13977
14492
  *
13978
14493
  * Cell Content abstract class
13979
14494
  *
13980
- * (c) 2020-2025 Highsoft AS
14495
+ * (c) 2020-2026 Highsoft AS
13981
14496
  *
13982
- * License: www.highcharts.com/license
14497
+ * A commercial license may be required depending on use.
14498
+ * See www.highcharts.com/license
13983
14499
  *
13984
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
13985
14500
  *
13986
14501
  * Authors:
13987
14502
  * - Dawid Dragula
@@ -14019,11 +14534,11 @@ class CellContent {
14019
14534
  *
14020
14535
  * Text Cell Content class
14021
14536
  *
14022
- * (c) 2020-2025 Highsoft AS
14537
+ * (c) 2020-2026 Highsoft AS
14023
14538
  *
14024
- * License: www.highcharts.com/license
14539
+ * A commercial license may be required depending on use.
14540
+ * See www.highcharts.com/license
14025
14541
  *
14026
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
14027
14542
  *
14028
14543
  * Authors:
14029
14544
  * - Dawid Dragula
@@ -14114,7 +14629,7 @@ class TextContent extends CellContent_CellContent {
14114
14629
  * */
14115
14630
  TextContent.defaultFormatsForDataTypes = {
14116
14631
  string: '{value}',
14117
- number: '{value}',
14632
+ number: '{value:,.f}',
14118
14633
  'boolean': '{value}',
14119
14634
  datetime: '{value:%Y-%m-%d %H:%M:%S}'
14120
14635
  };
@@ -14130,11 +14645,11 @@ TextContent.defaultFormatsForDataTypes = {
14130
14645
  *
14131
14646
  * Grid Column class
14132
14647
  *
14133
- * (c) 2020-2025 Highsoft AS
14648
+ * (c) 2020-2026 Highsoft AS
14134
14649
  *
14135
- * License: www.highcharts.com/license
14650
+ * A commercial license may be required depending on use.
14651
+ * See www.highcharts.com/license
14136
14652
  *
14137
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
14138
14653
  *
14139
14654
  * Authors:
14140
14655
  * - Dawid Dragula
@@ -14384,11 +14899,11 @@ class Column {
14384
14899
  *
14385
14900
  * Grid Row abstract class
14386
14901
  *
14387
- * (c) 2020-2025 Highsoft AS
14902
+ * (c) 2020-2026 Highsoft AS
14388
14903
  *
14389
- * License: www.highcharts.com/license
14904
+ * A commercial license may be required depending on use.
14905
+ * See www.highcharts.com/license
14390
14906
  *
14391
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
14392
14907
  *
14393
14908
  * Authors:
14394
14909
  * - Dawid Dragula
@@ -14517,11 +15032,11 @@ class Row {
14517
15032
  *
14518
15033
  * Grid Cell abstract class
14519
15034
  *
14520
- * (c) 2020-2025 Highsoft AS
15035
+ * (c) 2020-2026 Highsoft AS
14521
15036
  *
14522
- * License: www.highcharts.com/license
15037
+ * A commercial license may be required depending on use.
15038
+ * See www.highcharts.com/license
14523
15039
  *
14524
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
14525
15040
  *
14526
15041
  * Authors:
14527
15042
  * - Dawid Dragula
@@ -14621,6 +15136,8 @@ class Cell {
14621
15136
  *
14622
15137
  * @param e
14623
15138
  * Keyboard event object.
15139
+ *
15140
+ * @internal
14624
15141
  */
14625
15142
  onKeyDown(e) {
14626
15143
  const { row, column } = this;
@@ -14772,11 +15289,11 @@ class Cell {
14772
15289
  *
14773
15290
  * Grid ColumnSorting class
14774
15291
  *
14775
- * (c) 2020-2025 Highsoft AS
15292
+ * (c) 2020-2026 Highsoft AS
14776
15293
  *
14777
- * License: www.highcharts.com/license
15294
+ * A commercial license may be required depending on use.
15295
+ * See www.highcharts.com/license
14778
15296
  *
14779
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
14780
15297
  *
14781
15298
  * Authors:
14782
15299
  * - Dawid Dragula
@@ -14813,24 +15330,35 @@ class ColumnSorting {
14813
15330
  constructor(column, headerCellElement) {
14814
15331
  /**
14815
15332
  * Toggle sorting order for the column in the order: asc -> desc -> none
15333
+ *
15334
+ * @param e
15335
+ * Optional mouse or keyboard event.
14816
15336
  */
14817
- this.toggle = () => {
15337
+ this.toggle = (e) => {
14818
15338
  const viewport = this.column.viewport;
14819
15339
  const querying = viewport.grid.querying;
14820
15340
  const sortingController = querying.sorting;
14821
- const currentOrder = (sortingController.currentSorting?.columnId === this.column.id ?
14822
- sortingController.currentSorting.order : null) || 'none';
15341
+ const additive = !!e?.shiftKey;
15342
+ const currentOrder = (additive ?
15343
+ sortingController.currentSortings?.find((sorting) => sorting.columnId === this.column.id)?.order :
15344
+ (sortingController.currentSorting?.columnId ===
15345
+ this.column.id ?
15346
+ sortingController.currentSorting.order :
15347
+ null)) || 'none';
14823
15348
  const consequents = {
14824
15349
  none: 'asc',
14825
15350
  asc: 'desc',
14826
15351
  desc: null
14827
15352
  };
14828
- void this.setOrder(consequents[currentOrder]);
15353
+ void this.setOrder(consequents[currentOrder], additive);
14829
15354
  };
14830
15355
  this.column = column;
14831
15356
  this.headerCellElement = headerCellElement;
14832
15357
  this.addHeaderElementAttributes();
14833
- if (column.options.sorting?.sortable) {
15358
+ const sortingOptions = column.options.sorting;
15359
+ const sortingEnabled = sortingOptions?.enabled ??
15360
+ sortingOptions?.sortable;
15361
+ if (sortingEnabled) {
14834
15362
  headerCellElement.classList.add(Grid_Core_Globals.getClassName('columnSortable'));
14835
15363
  }
14836
15364
  }
@@ -14846,19 +15374,25 @@ class ColumnSorting {
14846
15374
  const col = this.column;
14847
15375
  const a11y = col.viewport.grid.accessibility;
14848
15376
  const sortingOptions = col.options.sorting;
14849
- const { currentSorting } = col.viewport.grid.querying.sorting;
15377
+ const { currentSorting, currentSortings } = col.viewport.grid.querying.sorting;
14850
15378
  const sortedAscClassName = Grid_Core_Globals.getClassName('columnSortedAsc');
14851
15379
  const sortedDescClassName = Grid_Core_Globals.getClassName('columnSortedDesc');
14852
15380
  const el = this.headerCellElement;
14853
- if (currentSorting?.columnId !== col.id || !currentSorting?.order) {
15381
+ const sortingEnabled = sortingOptions?.enabled ??
15382
+ sortingOptions?.sortable;
15383
+ const columnSorting = (currentSortings?.find((sorting) => sorting.columnId === col.id) ||
15384
+ (currentSorting?.columnId === col.id ?
15385
+ currentSorting :
15386
+ void 0));
15387
+ if (!columnSorting?.order) {
14854
15388
  el.classList.remove(sortedAscClassName);
14855
15389
  el.classList.remove(sortedDescClassName);
14856
- if (sortingOptions?.sortable) {
15390
+ if (sortingEnabled) {
14857
15391
  a11y?.setColumnSortState(el, 'none');
14858
15392
  }
14859
15393
  return;
14860
15394
  }
14861
- switch (currentSorting?.order) {
15395
+ switch (columnSorting.order) {
14862
15396
  case 'asc':
14863
15397
  el.classList.add(sortedAscClassName);
14864
15398
  el.classList.remove(sortedDescClassName);
@@ -14871,6 +15405,12 @@ class ColumnSorting {
14871
15405
  break;
14872
15406
  }
14873
15407
  }
15408
+ /**
15409
+ * Refreshes the sorting-related header attributes and classes.
15410
+ */
15411
+ refreshHeaderAttributes() {
15412
+ this.addHeaderElementAttributes();
15413
+ }
14874
15414
  /**
14875
15415
  * Updates the column options with the new sorting state.
14876
15416
  *
@@ -14878,12 +15418,24 @@ class ColumnSorting {
14878
15418
  * The column to update.
14879
15419
  */
14880
15420
  updateColumnOptions(col) {
14881
- const order = col.viewport.grid.querying.sorting.currentSorting?.order;
14882
- if (col.id === this.column.id && order) {
14883
- col.setOptions({ sorting: { order } });
15421
+ const sortings = col.viewport.grid.querying.sorting.currentSortings || [];
15422
+ const sortingIndex = sortings.findIndex((sorting) => sorting.columnId === col.id);
15423
+ if (sortingIndex !== -1 && sortings[sortingIndex].order) {
15424
+ const sorting = sortings[sortingIndex];
15425
+ const sortingOptions = {
15426
+ order: sorting.order
15427
+ };
15428
+ if (sortings.length > 1) {
15429
+ sortingOptions.priority = sortingIndex + 1;
15430
+ }
15431
+ col.setOptions({ sorting: sortingOptions });
15432
+ if (sortings.length < 2) {
15433
+ delete col.options.sorting?.priority;
15434
+ }
14884
15435
  }
14885
15436
  else {
14886
15437
  delete col.options.sorting?.order;
15438
+ delete col.options.sorting?.priority;
14887
15439
  if (col.options.sorting &&
14888
15440
  Object.keys(col.options.sorting).length < 1) {
14889
15441
  delete col.options.sorting;
@@ -14897,8 +15449,11 @@ class ColumnSorting {
14897
15449
  * @param order
14898
15450
  * The order of sorting. It can be `'asc'`, `'desc'` or `null` if the
14899
15451
  * sorting should be disabled.
15452
+ *
15453
+ * @param additive
15454
+ * Whether to add this sort to existing sorts or replace them.
14900
15455
  */
14901
- async setOrder(order) {
15456
+ async setOrder(order, additive = false) {
14902
15457
  const viewport = this.column.viewport;
14903
15458
  // Do not call sorting when cell is currently edited and validated.
14904
15459
  if (viewport.validator?.errorCell) {
@@ -14913,11 +15468,40 @@ class ColumnSorting {
14913
15468
  order
14914
15469
  });
14915
15470
  });
14916
- sortingController.setSorting(order, this.column.id);
15471
+ if (additive) {
15472
+ const baseSortings = (sortingController.currentSortings ||
15473
+ (sortingController.currentSorting?.columnId &&
15474
+ sortingController.currentSorting.order ?
15475
+ [sortingController.currentSorting] :
15476
+ [])).filter((sorting) => !!(sorting.columnId && sorting.order));
15477
+ const sortings = baseSortings.slice();
15478
+ const index = sortings.findIndex((sorting) => sorting.columnId === this.column.id);
15479
+ if (!order) {
15480
+ if (index !== -1) {
15481
+ sortings.splice(index, 1);
15482
+ }
15483
+ }
15484
+ else {
15485
+ const sorting = {
15486
+ columnId: this.column.id,
15487
+ order
15488
+ };
15489
+ if (index !== -1) {
15490
+ sortings[index] = sorting;
15491
+ }
15492
+ else {
15493
+ sortings.push(sorting);
15494
+ }
15495
+ }
15496
+ sortingController.setSorting(sortings);
15497
+ }
15498
+ else {
15499
+ sortingController.setSorting(order, this.column.id);
15500
+ }
14917
15501
  await viewport.updateRows();
14918
15502
  for (const col of viewport.columns) {
14919
15503
  this.updateColumnOptions(col);
14920
- col.sorting?.addHeaderElementAttributes();
15504
+ col.sorting?.refreshHeaderAttributes();
14921
15505
  }
14922
15506
  a11y?.userSortedColumn(order);
14923
15507
  [this.column, viewport.grid].forEach((source) => {
@@ -14940,11 +15524,11 @@ class ColumnSorting {
14940
15524
  *
14941
15525
  * Grid Svg Icons Registry
14942
15526
  *
14943
- * (c) 2020-2025 Highsoft AS
15527
+ * (c) 2020-2026 Highsoft AS
14944
15528
  *
14945
- * License: www.highcharts.com/license
15529
+ * A commercial license may be required depending on use.
15530
+ * See www.highcharts.com/license
14946
15531
  *
14947
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
14948
15532
  *
14949
15533
  * Authors:
14950
15534
  * - Mikkel Espolin Birkeland
@@ -15091,11 +15675,11 @@ function createGridIcon(name, className = Grid_Core_Globals.getClassName('icon')
15091
15675
  *
15092
15676
  * Grid Toolbar Button class
15093
15677
  *
15094
- * (c) 2020-2025 Highsoft AS
15678
+ * (c) 2020-2026 Highsoft AS
15095
15679
  *
15096
- * License: www.highcharts.com/license
15680
+ * A commercial license may be required depending on use.
15681
+ * See www.highcharts.com/license
15097
15682
  *
15098
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
15099
15683
  *
15100
15684
  * Authors:
15101
15685
  * - Dawid Dragula
@@ -15285,11 +15869,11 @@ class ToolbarButton {
15285
15869
  *
15286
15870
  * Grid Header Cell State Helpers namespace
15287
15871
  *
15288
- * (c) 2020-2025 Highsoft AS
15872
+ * (c) 2020-2026 Highsoft AS
15289
15873
  *
15290
- * License: www.highcharts.com/license
15874
+ * A commercial license may be required depending on use.
15875
+ * See www.highcharts.com/license
15291
15876
  *
15292
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
15293
15877
  *
15294
15878
  * Authors:
15295
15879
  * - Dawid Dragula
@@ -15327,13 +15911,17 @@ function isFiltered(column) {
15327
15911
  * only if the column is sorted in the provided order.
15328
15912
  */
15329
15913
  function isSorted(column, order) {
15330
- const { currentSorting } = column.viewport.grid.querying.sorting || {};
15331
- if (currentSorting?.columnId !== column.id) {
15914
+ const { currentSorting, currentSortings } = column.viewport.grid.querying.sorting || {};
15915
+ const columnSorting = (currentSortings?.find((sorting) => sorting.columnId === column.id) ||
15916
+ (currentSorting?.columnId === column.id ?
15917
+ currentSorting :
15918
+ void 0));
15919
+ if (!columnSorting?.order) {
15332
15920
  return false;
15333
15921
  }
15334
15922
  return order ?
15335
- currentSorting?.order === order :
15336
- !!currentSorting?.order;
15923
+ columnSorting.order === order :
15924
+ !!columnSorting.order;
15337
15925
  }
15338
15926
  /* *
15339
15927
  *
@@ -15350,11 +15938,11 @@ function isSorted(column, order) {
15350
15938
  *
15351
15939
  * Grid Sort Toolbar Button class
15352
15940
  *
15353
- * (c) 2020-2025 Highsoft AS
15941
+ * (c) 2020-2026 Highsoft AS
15354
15942
  *
15355
- * License: www.highcharts.com/license
15943
+ * A commercial license may be required depending on use.
15944
+ * See www.highcharts.com/license
15356
15945
  *
15357
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
15358
15946
  *
15359
15947
  * Authors:
15360
15948
  * - Dawid Dragula
@@ -15364,6 +15952,9 @@ function isSorted(column, order) {
15364
15952
 
15365
15953
 
15366
15954
 
15955
+
15956
+
15957
+ const { formatText: SortToolbarButton_formatText } = GridUtils;
15367
15958
  const { addEvent: SortToolbarButton_addEvent } = Core_Utilities;
15368
15959
  /* *
15369
15960
  *
@@ -15371,6 +15962,48 @@ const { addEvent: SortToolbarButton_addEvent } = Core_Utilities;
15371
15962
  *
15372
15963
  * */
15373
15964
  class SortToolbarButton extends UI_ToolbarButton {
15965
+ getColumnLabel() {
15966
+ const column = this.toolbar?.column;
15967
+ const label = (column?.header?.headerContent?.textContent ||
15968
+ column?.header?.value ||
15969
+ column?.id ||
15970
+ '').trim();
15971
+ return label || column?.id || '';
15972
+ }
15973
+ updateA11yLabel(order, priority) {
15974
+ const button = this.wrapper?.querySelector('button');
15975
+ if (!button) {
15976
+ return;
15977
+ }
15978
+ const column = this.toolbar?.column;
15979
+ const lang = column?.viewport.grid.options?.lang;
15980
+ const sortingLang = lang?.accessibility?.sorting;
15981
+ const announcements = sortingLang?.announcements;
15982
+ const columnLabel = this.getColumnLabel();
15983
+ const labelParts = [];
15984
+ if (columnLabel) {
15985
+ labelParts.push(columnLabel);
15986
+ }
15987
+ let stateLabel;
15988
+ if (order === 'asc') {
15989
+ stateLabel = announcements?.ascending;
15990
+ }
15991
+ else if (order === 'desc') {
15992
+ stateLabel = announcements?.descending;
15993
+ }
15994
+ else {
15995
+ stateLabel = announcements?.none;
15996
+ }
15997
+ if (stateLabel) {
15998
+ labelParts.push(stateLabel);
15999
+ }
16000
+ if (priority) {
16001
+ labelParts.push(SortToolbarButton_formatText(sortingLang?.priority ?? 'Priority {priority}.', { priority: String(priority) }));
16002
+ }
16003
+ if (labelParts.length) {
16004
+ button.setAttribute('aria-label', labelParts.join(' '));
16005
+ }
16006
+ }
15374
16007
  /* *
15375
16008
  *
15376
16009
  * Constructor
@@ -15392,21 +16025,56 @@ class SortToolbarButton extends UI_ToolbarButton {
15392
16025
  * */
15393
16026
  clickHandler(event) {
15394
16027
  super.clickHandler(event);
15395
- this.toolbar?.column.sorting?.toggle();
16028
+ this.toolbar?.column.sorting?.toggle(event);
16029
+ }
16030
+ renderSortPriorityIndicator(priority) {
16031
+ const wrapper = this.wrapper;
16032
+ if (!wrapper) {
16033
+ return;
16034
+ }
16035
+ const button = wrapper.querySelector('button');
16036
+ if (!button) {
16037
+ return;
16038
+ }
16039
+ if (!priority) {
16040
+ this.sortPriorityIndicator?.remove();
16041
+ delete this.sortPriorityIndicator;
16042
+ return;
16043
+ }
16044
+ if (!this.sortPriorityIndicator) {
16045
+ this.sortPriorityIndicator = document.createElement('span');
16046
+ this.sortPriorityIndicator.className = Grid_Core_Globals.getClassName('sortPriorityIndicator');
16047
+ }
16048
+ // Ensure the indicator is rendered to the right of the icon.
16049
+ button.appendChild(this.sortPriorityIndicator);
16050
+ this.sortPriorityIndicator.textContent = String(priority);
15396
16051
  }
15397
16052
  refreshState() {
15398
16053
  const column = this.toolbar?.column;
15399
16054
  if (!column) {
15400
16055
  return;
15401
16056
  }
15402
- if (!StateHelpers.isSorted(column)) {
16057
+ const { currentSortings, currentSorting } = column.viewport.grid.querying.sorting;
16058
+ const sortings = currentSortings || [];
16059
+ const columnSorting = (sortings.find((sorting) => sorting.columnId === column.id) ||
16060
+ (currentSorting?.columnId === column.id ?
16061
+ currentSorting :
16062
+ void 0));
16063
+ if (!StateHelpers.isSorted(column) || !columnSorting?.order) {
15403
16064
  this.setActive(false);
15404
16065
  this.setIcon('upDownArrows');
16066
+ this.renderSortPriorityIndicator();
16067
+ this.updateA11yLabel(null);
15405
16068
  return;
15406
16069
  }
15407
- const { currentSorting } = column.viewport.grid.querying.sorting;
15408
16070
  this.setActive(true);
15409
- this.setIcon(currentSorting?.order === 'asc' ? 'sortAsc' : 'sortDesc');
16071
+ this.setIcon(columnSorting.order === 'asc' ? 'sortAsc' : 'sortDesc');
16072
+ const sortIndex = sortings.findIndex((sorting) => sorting.columnId === column.id);
16073
+ const priority = (sortings.length > 1 && sortIndex !== -1 ?
16074
+ sortIndex + 1 :
16075
+ void 0);
16076
+ this.renderSortPriorityIndicator(priority);
16077
+ this.updateA11yLabel(columnSorting.order, priority);
15410
16078
  }
15411
16079
  addEventListeners() {
15412
16080
  super.addEventListeners();
@@ -15417,8 +16085,11 @@ class SortToolbarButton extends UI_ToolbarButton {
15417
16085
  // If this grid is currently sorted, update the state
15418
16086
  this.eventListenerDestroyers.push(SortToolbarButton_addEvent(column.viewport.grid, 'afterSort', () => this.refreshState()));
15419
16087
  }
15420
- renderActiveIndicator() {
15421
- // Do nothing
16088
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
16089
+ renderActiveIndicator(render) {
16090
+ // Sorting uses directional icons + priority indicators
16091
+ // (for multi-sort), not the generic active dot indicator
16092
+ // (reserved for filtering).
15422
16093
  }
15423
16094
  }
15424
16095
  /* *
@@ -15433,11 +16104,11 @@ class SortToolbarButton extends UI_ToolbarButton {
15433
16104
  *
15434
16105
  * Grid Popup abstract class
15435
16106
  *
15436
- * (c) 2020-2025 Highsoft AS
16107
+ * (c) 2020-2026 Highsoft AS
15437
16108
  *
15438
- * License: www.highcharts.com/license
16109
+ * A commercial license may be required depending on use.
16110
+ * See www.highcharts.com/license
15439
16111
  *
15440
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
15441
16112
  *
15442
16113
  * Authors:
15443
16114
  * - Dawid Dragula
@@ -15707,11 +16378,11 @@ class Popup {
15707
16378
  *
15708
16379
  * Grid Filter Popup class
15709
16380
  *
15710
- * (c) 2020-2025 Highsoft AS
16381
+ * (c) 2020-2026 Highsoft AS
15711
16382
  *
15712
- * License: www.highcharts.com/license
16383
+ * A commercial license may be required depending on use.
16384
+ * See www.highcharts.com/license
15713
16385
  *
15714
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
15715
16386
  *
15716
16387
  * Authors:
15717
16388
  * - Dawid Dragula
@@ -15786,11 +16457,11 @@ class FilterPopup extends UI_Popup {
15786
16457
  *
15787
16458
  * Grid Filter Toolbar Button class
15788
16459
  *
15789
- * (c) 2020-2025 Highsoft AS
16460
+ * (c) 2020-2026 Highsoft AS
15790
16461
  *
15791
- * License: www.highcharts.com/license
16462
+ * A commercial license may be required depending on use.
16463
+ * See www.highcharts.com/license
15792
16464
  *
15793
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
15794
16465
  *
15795
16466
  * Authors:
15796
16467
  * - Dawid Dragula
@@ -15869,11 +16540,11 @@ class FilterToolbarButton extends UI_ToolbarButton {
15869
16540
  *
15870
16541
  * Grid Context Menu abstract class
15871
16542
  *
15872
- * (c) 2020-2025 Highsoft AS
16543
+ * (c) 2020-2026 Highsoft AS
15873
16544
  *
15874
- * License: www.highcharts.com/license
16545
+ * A commercial license may be required depending on use.
16546
+ * See www.highcharts.com/license
15875
16547
  *
15876
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
15877
16548
  *
15878
16549
  * Authors:
15879
16550
  * - Dawid Dragula
@@ -16003,11 +16674,11 @@ class ContextMenu extends UI_Popup {
16003
16674
  *
16004
16675
  * Grid Context Menu Button class
16005
16676
  *
16006
- * (c) 2020-2025 Highsoft AS
16677
+ * (c) 2020-2026 Highsoft AS
16007
16678
  *
16008
- * License: www.highcharts.com/license
16679
+ * A commercial license may be required depending on use.
16680
+ * See www.highcharts.com/license
16009
16681
  *
16010
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
16011
16682
  *
16012
16683
  * Authors:
16013
16684
  * - Dawid Dragula
@@ -16188,11 +16859,11 @@ class ContextMenuButton {
16188
16859
  *
16189
16860
  * Grid Filter Context Menu Button class
16190
16861
  *
16191
- * (c) 2020-2025 Highsoft AS
16862
+ * (c) 2020-2026 Highsoft AS
16192
16863
  *
16193
- * License: www.highcharts.com/license
16864
+ * A commercial license may be required depending on use.
16865
+ * See www.highcharts.com/license
16194
16866
  *
16195
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
16196
16867
  *
16197
16868
  * Authors:
16198
16869
  * - Dawid Dragula
@@ -16269,11 +16940,11 @@ class FilterMenuButton_FilterToolbarButton extends UI_ContextMenuButton {
16269
16940
  *
16270
16941
  * Grid Sort Context Menu Button class
16271
16942
  *
16272
- * (c) 2020-2025 Highsoft AS
16943
+ * (c) 2020-2026 Highsoft AS
16273
16944
  *
16274
- * License: www.highcharts.com/license
16945
+ * A commercial license may be required depending on use.
16946
+ * See www.highcharts.com/license
16275
16947
  *
16276
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
16277
16948
  *
16278
16949
  * Authors:
16279
16950
  * - Dawid Dragula
@@ -16298,7 +16969,8 @@ class SortMenuButton extends UI_ContextMenuButton {
16298
16969
  constructor(langOptions, direction) {
16299
16970
  super({ icon: direction === 'asc' ? 'sortAsc' : 'sortDesc' });
16300
16971
  this.direction = direction;
16301
- this.options.label = langOptions[direction === 'asc' ? 'sortAscending' : 'sortDescending'];
16972
+ this.baseLabel = langOptions[direction === 'asc' ? 'sortAscending' : 'sortDescending'] || '';
16973
+ this.options.label = this.baseLabel;
16302
16974
  }
16303
16975
  /* *
16304
16976
  *
@@ -16310,7 +16982,35 @@ class SortMenuButton extends UI_ContextMenuButton {
16310
16982
  if (!column) {
16311
16983
  return;
16312
16984
  }
16313
- this.setActive(StateHelpers.isSorted(column, this.direction));
16985
+ const isSorted = StateHelpers.isSorted(column, this.direction);
16986
+ this.setActive(isSorted);
16987
+ // Update label with priority if multi-column sorting is active
16988
+ this.updateLabelWithPriority(isSorted ? column : void 0);
16989
+ }
16990
+ /**
16991
+ * Updates the label to include the sort priority when multi-column
16992
+ * sorting is active.
16993
+ *
16994
+ * @param column
16995
+ * The column to get the priority from, or undefined to reset the label.
16996
+ */
16997
+ updateLabelWithPriority(column) {
16998
+ if (!column) {
16999
+ this.setLabel(this.baseLabel);
17000
+ return;
17001
+ }
17002
+ const { currentSortings } = column.viewport.grid.querying.sorting;
17003
+ const sortings = currentSortings || [];
17004
+ const sortIndex = sortings.findIndex((sorting) => sorting.columnId === column.id);
17005
+ const priority = (sortings.length > 1 && sortIndex !== -1 ?
17006
+ sortIndex + 1 :
17007
+ void 0);
17008
+ if (priority) {
17009
+ this.setLabel(`${this.baseLabel} (${priority})`);
17010
+ }
17011
+ else {
17012
+ this.setLabel(this.baseLabel);
17013
+ }
16314
17014
  }
16315
17015
  addEventListeners() {
16316
17016
  super.addEventListeners();
@@ -16327,7 +17027,7 @@ class SortMenuButton extends UI_ContextMenuButton {
16327
17027
  if (!sorting) {
16328
17028
  return;
16329
17029
  }
16330
- void sorting.setOrder(this.isActive ? null : this.direction);
17030
+ void sorting.setOrder(this.isActive ? null : this.direction, !!event?.shiftKey);
16331
17031
  }
16332
17032
  }
16333
17033
  /* *
@@ -16342,11 +17042,11 @@ class SortMenuButton extends UI_ContextMenuButton {
16342
17042
  *
16343
17043
  * Grid Menu Popup class
16344
17044
  *
16345
- * (c) 2020-2025 Highsoft AS
17045
+ * (c) 2020-2026 Highsoft AS
16346
17046
  *
16347
- * License: www.highcharts.com/license
17047
+ * A commercial license may be required depending on use.
17048
+ * See www.highcharts.com/license
16348
17049
  *
16349
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
16350
17050
  *
16351
17051
  * Authors:
16352
17052
  * - Dawid Dragula
@@ -16384,7 +17084,8 @@ class MenuPopup extends UI_ContextMenu {
16384
17084
  const columnOptions = this.button.toolbar?.column.options || {};
16385
17085
  const filteringEnabled = (columnOptions.filtering?.enabled &&
16386
17086
  !columnOptions.filtering.inline);
16387
- const sortingEnabled = columnOptions.sorting?.sortable;
17087
+ const sortingEnabled = columnOptions.sorting?.enabled ??
17088
+ columnOptions.sorting?.sortable;
16388
17089
  this.addHeader(this.button.toolbar?.column.header?.value || '', lang.column);
16389
17090
  if (sortingEnabled) {
16390
17091
  new MenuButtons_SortMenuButton(lang, 'desc').add(this);
@@ -16410,11 +17111,11 @@ class MenuPopup extends UI_ContextMenu {
16410
17111
  *
16411
17112
  * Grid Menu Toolbar Button class
16412
17113
  *
16413
- * (c) 2020-2025 Highsoft AS
17114
+ * (c) 2020-2026 Highsoft AS
16414
17115
  *
16415
- * License: www.highcharts.com/license
17116
+ * A commercial license may be required depending on use.
17117
+ * See www.highcharts.com/license
16416
17118
  *
16417
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
16418
17119
  *
16419
17120
  * Authors:
16420
17121
  * - Dawid Dragula
@@ -16492,11 +17193,11 @@ class MenuToolbarButton extends UI_ToolbarButton {
16492
17193
  *
16493
17194
  * Grid Header Cell Toolbar class
16494
17195
  *
16495
- * (c) 2020-2025 Highsoft AS
17196
+ * (c) 2020-2026 Highsoft AS
16496
17197
  *
16497
- * License: www.highcharts.com/license
17198
+ * A commercial license may be required depending on use.
17199
+ * See www.highcharts.com/license
16498
17200
  *
16499
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
16500
17201
  *
16501
17202
  * Authors:
16502
17203
  * - Dawid Dragula
@@ -16541,7 +17242,9 @@ class HeaderCellToolbar {
16541
17242
  */
16542
17243
  renderFull() {
16543
17244
  const columnOptions = this.column.options;
16544
- if (columnOptions.sorting?.sortable) {
17245
+ const sortingEnabled = columnOptions.sorting?.enabled ??
17246
+ columnOptions.sorting?.sortable;
17247
+ if (sortingEnabled) {
16545
17248
  new ToolbarButtons_SortToolbarButton().add(this);
16546
17249
  }
16547
17250
  if (columnOptions.filtering?.enabled &&
@@ -16551,7 +17254,9 @@ class HeaderCellToolbar {
16551
17254
  }
16552
17255
  renderMinimized() {
16553
17256
  const columnOptions = this.column.options;
16554
- if (columnOptions.sorting?.sortable || (columnOptions.filtering?.enabled &&
17257
+ const sortingEnabled = columnOptions.sorting?.enabled ??
17258
+ columnOptions.sorting?.sortable;
17259
+ if (sortingEnabled || (columnOptions.filtering?.enabled &&
16555
17260
  !columnOptions.filtering.inline)) {
16556
17261
  new ToolbarButtons_MenuToolbarButton().add(this);
16557
17262
  }
@@ -16617,6 +17322,11 @@ class HeaderCellToolbar {
16617
17322
  }
16618
17323
  }
16619
17324
  if (!shouldBeMinimized) {
17325
+ // Ensure we reset any "minimized only" header state. This can
17326
+ // happen if the grid was initialized in a hidden container
17327
+ // (e.g. display:none) where widths measure as 0. (#24002)
17328
+ this.isMenuCentered = void 0;
17329
+ this.column.header?.container?.classList.remove(Grid_Core_Globals.getClassName('noWidth'));
16620
17330
  return;
16621
17331
  }
16622
17332
  const parent = this.column.header?.htmlElement;
@@ -16691,11 +17401,11 @@ HeaderCellToolbar.MINIMIZED_COLUMN_WIDTH = 120;
16691
17401
  *
16692
17402
  * Grid HeaderCell class
16693
17403
  *
16694
- * (c) 2020-2025 Highsoft AS
17404
+ * (c) 2020-2026 Highsoft AS
16695
17405
  *
16696
- * License: www.highcharts.com/license
17406
+ * A commercial license may be required depending on use.
17407
+ * See www.highcharts.com/license
16697
17408
  *
16698
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
16699
17409
  *
16700
17410
  * Authors:
16701
17411
  * - Dawid Dragula
@@ -16795,8 +17505,8 @@ class HeaderCell extends Table_Cell {
16795
17505
  const { column } = this;
16796
17506
  const options = HeaderCell_createOptionsProxy(this.superColumnOptions, column?.options);
16797
17507
  const headerCellOptions = options.header || {};
16798
- if (headerCellOptions.formatter) {
16799
- this.value = headerCellOptions.formatter.call(this).toString();
17508
+ if (column && headerCellOptions.formatter) {
17509
+ this.value = headerCellOptions.formatter.call(column).toString();
16800
17510
  }
16801
17511
  else if (HeaderCell_isString(headerCellOptions.format)) {
16802
17512
  this.value = column ?
@@ -16873,8 +17583,9 @@ class HeaderCell extends Table_Cell {
16873
17583
  e.target !== column.header?.headerContent) || column.viewport.columnsResizer?.isResizing) {
16874
17584
  return;
16875
17585
  }
16876
- if (column.options.sorting?.sortable) {
16877
- column.sorting?.toggle();
17586
+ if ((column.options.sorting?.enabled ??
17587
+ column.options.sorting?.sortable)) {
17588
+ column.sorting?.toggle(e);
16878
17589
  }
16879
17590
  HeaderCell_fireEvent(this, 'click', {
16880
17591
  originalEvent: e,
@@ -16917,11 +17628,11 @@ class HeaderCell extends Table_Cell {
16917
17628
  *
16918
17629
  * Grid HeaderRow class
16919
17630
  *
16920
- * (c) 2020-2025 Highsoft AS
17631
+ * (c) 2020-2026 Highsoft AS
16921
17632
  *
16922
- * License: www.highcharts.com/license
17633
+ * A commercial license may be required depending on use.
17634
+ * See www.highcharts.com/license
16923
17635
  *
16924
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
16925
17636
  *
16926
17637
  * Authors:
16927
17638
  * - Dawid Dragula
@@ -17101,11 +17812,11 @@ class HeaderRow extends Table_Row {
17101
17812
  *
17102
17813
  * Grid Filter Cell class
17103
17814
  *
17104
- * (c) 2020-2025 Highsoft AS
17815
+ * (c) 2020-2026 Highsoft AS
17105
17816
  *
17106
- * License: www.highcharts.com/license
17817
+ * A commercial license may be required depending on use.
17818
+ * See www.highcharts.com/license
17107
17819
  *
17108
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
17109
17820
  *
17110
17821
  * Authors:
17111
17822
  * - Dawid Dragula
@@ -17189,11 +17900,11 @@ class FilterCell extends Header_HeaderCell {
17189
17900
  *
17190
17901
  * Grid FilteringRow class
17191
17902
  *
17192
- * (c) 2020-2025 Highsoft AS
17903
+ * (c) 2020-2026 Highsoft AS
17193
17904
  *
17194
- * License: www.highcharts.com/license
17905
+ * A commercial license may be required depending on use.
17906
+ * See www.highcharts.com/license
17195
17907
  *
17196
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
17197
17908
  *
17198
17909
  * Authors:
17199
17910
  * - Dawid Dragula
@@ -17271,11 +17982,11 @@ class FilterRow extends Header_HeaderRow {
17271
17982
  *
17272
17983
  * Grid TableHeader class
17273
17984
  *
17274
- * (c) 2020-2025 Highsoft AS
17985
+ * (c) 2020-2026 Highsoft AS
17275
17986
  *
17276
- * License: www.highcharts.com/license
17987
+ * A commercial license may be required depending on use.
17988
+ * See www.highcharts.com/license
17277
17989
  *
17278
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
17279
17990
  *
17280
17991
  * Authors:
17281
17992
  * - Dawid Dragula
@@ -17432,11 +18143,11 @@ class TableHeader {
17432
18143
  *
17433
18144
  * Grid class
17434
18145
  *
17435
- * (c) 2020-2025 Highsoft AS
18146
+ * (c) 2020-2026 Highsoft AS
17436
18147
  *
17437
- * License: www.highcharts.com/license
18148
+ * A commercial license may be required depending on use.
18149
+ * See www.highcharts.com/license
17438
18150
  *
17439
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
17440
18151
  *
17441
18152
  * Authors:
17442
18153
  * - Dawid Dragula
@@ -17563,12 +18274,19 @@ class TableCell extends Table_Cell {
17563
18274
  await vp.updateRows();
17564
18275
  return true;
17565
18276
  }
18277
+ /**
18278
+ * Initialize event listeners for table body cells.
18279
+ *
18280
+ * Most events (click, dblclick, keydown, mousedown, mouseover, mouseout)
18281
+ * are delegated to Table for better performance with virtualization.
18282
+ * Only focus/blur remain on individual cells for focus management.
18283
+ */
17566
18284
  initEvents() {
17567
- this.cellEvents.push(['dblclick', (e) => (this.onDblClick(e))]);
17568
- this.cellEvents.push(['mousedown', (e) => {
17569
- this.onMouseDown(e);
17570
- }]);
17571
- super.initEvents();
18285
+ this.cellEvents.push(['blur', () => this.onBlur()]);
18286
+ this.cellEvents.push(['focus', () => this.onFocus()]);
18287
+ this.cellEvents.forEach((pair) => {
18288
+ this.htmlElement.addEventListener(pair[0], pair[1]);
18289
+ });
17572
18290
  }
17573
18291
  /**
17574
18292
  * Handles the focus event on the cell.
@@ -17662,11 +18380,11 @@ class TableCell extends Table_Cell {
17662
18380
  *
17663
18381
  * Grid TableRow class
17664
18382
  *
17665
- * (c) 2020-2025 Highsoft AS
18383
+ * (c) 2020-2026 Highsoft AS
17666
18384
  *
17667
- * License: www.highcharts.com/license
18385
+ * A commercial license may be required depending on use.
18386
+ * See www.highcharts.com/license
17668
18387
  *
17669
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
17670
18388
  *
17671
18389
  * Authors:
17672
18390
  * - Dawid Dragula
@@ -17739,18 +18457,47 @@ class TableRow extends Table_Row {
17739
18457
  this.data = data;
17740
18458
  }
17741
18459
  /**
17742
- * Updates the row data and its cells with the latest values from the data
17743
- * table.
18460
+ * Updates the row data and its cells with the latest values from the data
18461
+ * table.
18462
+ */
18463
+ update() {
18464
+ this.id = this.viewport.dataTable.getOriginalRowIndex(this.index);
18465
+ this.updateRowAttributes();
18466
+ this.loadData();
18467
+ for (let i = 0, iEnd = this.cells.length; i < iEnd; ++i) {
18468
+ const cell = this.cells[i];
18469
+ void cell.setValue();
18470
+ }
18471
+ this.reflow();
18472
+ }
18473
+ /**
18474
+ * Reuses the row instance for a new index.
18475
+ *
18476
+ * @param index
18477
+ * The index of the row in the data table.
18478
+ *
18479
+ * @param doReflow
18480
+ * Whether to reflow the row after updating the cells.
17744
18481
  */
17745
- update() {
17746
- this.id = this.viewport.dataTable.getOriginalRowIndex(this.index);
18482
+ reuse(index, doReflow = true) {
18483
+ if (this.index === index) {
18484
+ this.update();
18485
+ return;
18486
+ }
18487
+ this.index = index;
18488
+ this.id = this.viewport.dataTable.getOriginalRowIndex(index);
18489
+ this.htmlElement.setAttribute('data-row-index', index);
17747
18490
  this.updateRowAttributes();
18491
+ this.updateParityClass();
18492
+ this.updateStateClasses();
17748
18493
  this.loadData();
17749
18494
  for (let i = 0, iEnd = this.cells.length; i < iEnd; ++i) {
17750
18495
  const cell = this.cells[i];
17751
18496
  void cell.setValue();
17752
18497
  }
17753
- this.reflow();
18498
+ if (doReflow) {
18499
+ this.reflow();
18500
+ }
17754
18501
  }
17755
18502
  /**
17756
18503
  * Adds or removes the hovered CSS class to the row element.
@@ -17787,13 +18534,8 @@ class TableRow extends Table_Row {
17787
18534
  el.setAttribute('data-row-index', idx);
17788
18535
  this.updateRowAttributes();
17789
18536
  // Indexing from 0, so rows with even index are odd.
17790
- el.classList.add(Grid_Core_Globals.getClassName(idx % 2 ? 'rowEven' : 'rowOdd'));
17791
- if (this.viewport.grid.hoveredRowIndex === idx) {
17792
- el.classList.add(Grid_Core_Globals.getClassName('hoveredRow'));
17793
- }
17794
- if (this.viewport.grid.syncedRowIndex === idx) {
17795
- el.classList.add(Grid_Core_Globals.getClassName('syncedRow'));
17796
- }
18537
+ this.updateParityClass();
18538
+ this.updateStateClasses();
17797
18539
  }
17798
18540
  /**
17799
18541
  * Sets the row HTML element attributes that are updateable in the row
@@ -17811,6 +18553,28 @@ class TableRow extends Table_Row {
17811
18553
  // Calculate levels of header, 1 to avoid indexing from 0
17812
18554
  a11y?.setRowIndex(el, idx + (vp.header?.rows.length ?? 0) + 1);
17813
18555
  }
18556
+ /**
18557
+ * Updates the row parity class based on index.
18558
+ */
18559
+ updateParityClass() {
18560
+ const el = this.htmlElement;
18561
+ el.classList.remove(Grid_Core_Globals.getClassName('rowEven'), Grid_Core_Globals.getClassName('rowOdd'));
18562
+ // Indexing from 0, so rows with even index are odd.
18563
+ el.classList.add(Grid_Core_Globals.getClassName(this.index % 2 ? 'rowEven' : 'rowOdd'));
18564
+ }
18565
+ /**
18566
+ * Updates the hovered and synced classes based on grid state.
18567
+ */
18568
+ updateStateClasses() {
18569
+ const el = this.htmlElement;
18570
+ el.classList.remove(Grid_Core_Globals.getClassName('hoveredRow'), Grid_Core_Globals.getClassName('syncedRow'));
18571
+ if (this.viewport.grid.hoveredRowIndex === this.index) {
18572
+ el.classList.add(Grid_Core_Globals.getClassName('hoveredRow'));
18573
+ }
18574
+ if (this.viewport.grid.syncedRowIndex === this.index) {
18575
+ el.classList.add(Grid_Core_Globals.getClassName('syncedRow'));
18576
+ }
18577
+ }
17814
18578
  /**
17815
18579
  * Sets the vertical translation of the row. Used for virtual scrolling.
17816
18580
  *
@@ -17841,11 +18605,11 @@ class TableRow extends Table_Row {
17841
18605
  *
17842
18606
  * Grid Rows Renderer class.
17843
18607
  *
17844
- * (c) 2020-2025 Highsoft AS
18608
+ * (c) 2020-2026 Highsoft AS
17845
18609
  *
17846
- * License: www.highcharts.com/license
18610
+ * A commercial license may be required depending on use.
18611
+ * See www.highcharts.com/license
17847
18612
  *
17848
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
17849
18613
  *
17850
18614
  * Authors:
17851
18615
  * - Dawid Dragula
@@ -17884,6 +18648,15 @@ class RowsVirtualizer {
17884
18648
  * flickering loops when scrolling to the last row.
17885
18649
  */
17886
18650
  this.preventScroll = false;
18651
+ /**
18652
+ * Reuse pool for rows that are currently out of viewport.
18653
+ */
18654
+ this.rowPool = [];
18655
+ /**
18656
+ * Flag indicating if a scroll update is queued for the next animation
18657
+ * frame.
18658
+ */
18659
+ this.scrollQueued = false;
17887
18660
  this.rowSettings =
17888
18661
  viewport.grid.options?.rendering?.rows;
17889
18662
  this.viewport = viewport;
@@ -17920,6 +18693,12 @@ class RowsVirtualizer {
17920
18693
  let rows = this.viewport.rows;
17921
18694
  const oldScrollLeft = tbody.scrollLeft;
17922
18695
  let oldScrollTop;
18696
+ if (this.rowPool.length) {
18697
+ for (let i = this.rowPool.length - 1; i >= 0; --i) {
18698
+ this.rowPool[i].destroy();
18699
+ }
18700
+ this.rowPool.length = 0;
18701
+ }
17923
18702
  if (rows.length) {
17924
18703
  oldScrollTop = tbody.scrollTop;
17925
18704
  for (let i = 0, iEnd = rows.length; i < iEnd; ++i) {
@@ -17946,6 +18725,19 @@ class RowsVirtualizer {
17946
18725
  * is enabled.
17947
18726
  */
17948
18727
  scroll() {
18728
+ if (this.scrollQueued) {
18729
+ return;
18730
+ }
18731
+ this.scrollQueued = true;
18732
+ requestAnimationFrame(() => {
18733
+ this.scrollQueued = false;
18734
+ this.applyScroll();
18735
+ });
18736
+ }
18737
+ /**
18738
+ * Applies the scroll logic for virtualized rows.
18739
+ */
18740
+ applyScroll() {
17949
18741
  const target = this.viewport.tbodyElement;
17950
18742
  const { defaultRowHeight: rowHeight } = this;
17951
18743
  const lastScrollTop = target.scrollTop;
@@ -18034,36 +18826,70 @@ class RowsVirtualizer {
18034
18826
  const to = Math.min(rowCursor + rowsPerPage + buffer, rows[rows.length - 1].index - 1);
18035
18827
  const alwaysLastRow = rows.pop();
18036
18828
  const tempRows = [];
18037
- // Remove rows that are out of the range except the last row.
18038
- for (let i = 0, iEnd = rows.length; i < iEnd; ++i) {
18039
- const row = rows[i];
18040
- const rowIndex = row.index;
18041
- if (rowIndex < from || rowIndex > to) {
18042
- row.destroy();
18829
+ const currentFrom = rows[0]?.index;
18830
+ const currentTo = rows[rows.length - 1]?.index;
18831
+ const hasOverlap = (rows.length > 0 &&
18832
+ currentFrom !== void 0 &&
18833
+ currentTo !== void 0 &&
18834
+ !(to < currentFrom || from > currentTo));
18835
+ if (!hasOverlap) {
18836
+ // Remove rows that are out of the range except the last row.
18837
+ for (let i = 0, iEnd = rows.length; i < iEnd; ++i) {
18838
+ const row = rows[i];
18839
+ const rowIndex = row.index;
18840
+ if (rowIndex < from || rowIndex > to) {
18841
+ this.poolRow(row);
18842
+ }
18843
+ else {
18844
+ tempRows.push(row);
18845
+ }
18043
18846
  }
18044
- else {
18045
- tempRows.push(row);
18847
+ rows = tempRows;
18848
+ vp.rows = rows;
18849
+ for (let i = from; i <= to; ++i) {
18850
+ const row = rows[i - (rows[0]?.index || 0)];
18851
+ // Recreate row when it is destroyed and it is in the range.
18852
+ if (!row) {
18853
+ rows.push(this.getOrCreateRow(i));
18854
+ }
18046
18855
  }
18856
+ rows.sort((a, b) => a.index - b.index);
18047
18857
  }
18048
- rows = tempRows;
18049
- vp.rows = rows;
18050
- for (let i = from; i <= to; ++i) {
18051
- const row = rows[i - (rows[0]?.index || 0)];
18052
- // Recreate row when it is destroyed and it is in the range.
18053
- if (!row) {
18054
- const newRow = new Body_TableRow(vp, i);
18055
- rows.push(newRow);
18056
- newRow.rendered = false;
18057
- if (isVirtualization) {
18058
- newRow.setTranslateY(newRow.getDefaultTopOffset());
18858
+ else {
18859
+ // Remove rows outside the range from the start.
18860
+ while (rows.length && rows[0].index < from) {
18861
+ this.poolRow(rows.shift());
18862
+ }
18863
+ // Remove rows outside the range from the end.
18864
+ while (rows.length && rows[rows.length - 1].index > to) {
18865
+ this.poolRow(rows.pop());
18866
+ }
18867
+ if (!rows.length) {
18868
+ for (let i = from; i <= to; ++i) {
18869
+ rows.push(this.getOrCreateRow(i));
18870
+ }
18871
+ }
18872
+ else {
18873
+ // Add rows before the current range.
18874
+ for (let i = rows[0].index - 1; i >= from; --i) {
18875
+ rows.unshift(this.getOrCreateRow(i));
18876
+ }
18877
+ // Add rows after the current range.
18878
+ for (let i = rows[rows.length - 1].index + 1; i <= to; ++i) {
18879
+ rows.push(this.getOrCreateRow(i));
18059
18880
  }
18060
18881
  }
18882
+ vp.rows = rows;
18061
18883
  }
18062
- rows.sort((a, b) => a.index - b.index);
18063
18884
  for (let i = 0, iEnd = rows.length; i < iEnd; ++i) {
18064
- if (!rows[i].rendered) {
18065
- vp.tbodyElement.insertBefore(rows[i].htmlElement, vp.tbodyElement.lastChild);
18066
- rows[i].render();
18885
+ const row = rows[i];
18886
+ if (!row.rendered) {
18887
+ vp.tbodyElement.insertBefore(row.htmlElement, vp.tbodyElement.lastChild);
18888
+ row.render();
18889
+ continue;
18890
+ }
18891
+ if (!row.htmlElement.isConnected) {
18892
+ vp.tbodyElement.insertBefore(row.htmlElement, vp.tbodyElement.lastChild);
18067
18893
  }
18068
18894
  }
18069
18895
  if (alwaysLastRow) {
@@ -18161,9 +18987,54 @@ class RowsVirtualizer {
18161
18987
  }
18162
18988
  this.adjustRowHeights();
18163
18989
  }
18990
+ /**
18991
+ * Gets a row from the pool or creates a new one for the given index.
18992
+ *
18993
+ * @param index
18994
+ * The row index in the data table.
18995
+ *
18996
+ * @returns
18997
+ * A TableRow instance ready for use.
18998
+ */
18999
+ getOrCreateRow(index) {
19000
+ const vp = this.viewport;
19001
+ const isVirtualization = vp.virtualRows;
19002
+ const pooledRow = this.rowPool.pop();
19003
+ if (pooledRow) {
19004
+ pooledRow.reuse(index, false);
19005
+ if (isVirtualization) {
19006
+ pooledRow.setTranslateY(pooledRow.getDefaultTopOffset());
19007
+ }
19008
+ return pooledRow;
19009
+ }
19010
+ const newRow = new Body_TableRow(vp, index);
19011
+ newRow.rendered = false;
19012
+ if (isVirtualization) {
19013
+ newRow.setTranslateY(newRow.getDefaultTopOffset());
19014
+ }
19015
+ return newRow;
19016
+ }
19017
+ /**
19018
+ * Adds a row to the reuse pool, or destroys it if the pool is full.
19019
+ *
19020
+ * @param row
19021
+ * The row to pool.
19022
+ */
19023
+ poolRow(row) {
19024
+ row.htmlElement.remove();
19025
+ if (this.rowPool.length < RowsVirtualizer.MAX_POOL_SIZE) {
19026
+ this.rowPool.push(row);
19027
+ }
19028
+ else {
19029
+ row.destroy();
19030
+ }
19031
+ }
18164
19032
  /**
18165
19033
  * Returns the default height of a row. This method should be called only
18166
19034
  * once on initialization.
19035
+ *
19036
+ * @returns
19037
+ * The default height of a row.
18167
19038
  */
18168
19039
  getDefaultRowHeight() {
18169
19040
  const vp = this.viewport;
@@ -18177,6 +19048,10 @@ class RowsVirtualizer {
18177
19048
  return defaultRowHeight;
18178
19049
  }
18179
19050
  }
19051
+ /**
19052
+ * Maximum number of rows to keep in the reuse pool.
19053
+ */
19054
+ RowsVirtualizer.MAX_POOL_SIZE = 100;
18180
19055
  /* *
18181
19056
  *
18182
19057
  * Default Export
@@ -18189,11 +19064,11 @@ class RowsVirtualizer {
18189
19064
  *
18190
19065
  * Grid Columns Resizer class.
18191
19066
  *
18192
- * (c) 2020-2025 Highsoft AS
19067
+ * (c) 2020-2026 Highsoft AS
18193
19068
  *
18194
- * License: www.highcharts.com/license
19069
+ * A commercial license may be required depending on use.
19070
+ * See www.highcharts.com/license
18195
19071
  *
18196
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
18197
19072
  *
18198
19073
  * Authors:
18199
19074
  * - Dawid Dragula
@@ -18373,11 +19248,11 @@ class ColumnsResizer {
18373
19248
  *
18374
19249
  * Grid Table Viewport class
18375
19250
  *
18376
- * (c) 2020-2025 Highsoft AS
19251
+ * (c) 2020-2026 Highsoft AS
18377
19252
  *
18378
- * License: www.highcharts.com/license
19253
+ * A commercial license may be required depending on use.
19254
+ * See www.highcharts.com/license
18379
19255
  *
18380
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
18381
19256
  *
18382
19257
  * Authors:
18383
19258
  * - Dawid Dragula
@@ -18453,20 +19328,77 @@ class Table {
18453
19328
  }
18454
19329
  this.header?.scrollHorizontally(this.tbodyElement.scrollLeft);
18455
19330
  };
19331
+ /**
19332
+ * Delegated click handler for cells.
19333
+ * @param e Mouse event
19334
+ */
19335
+ this.onCellClick = (e) => {
19336
+ const cell = this.getCellFromElement(e.target);
19337
+ if (cell) {
19338
+ cell
19339
+ .onClick(e);
19340
+ }
19341
+ };
19342
+ /**
19343
+ * Delegated double-click handler for cells.
19344
+ * @param e Mouse event
19345
+ */
19346
+ this.onCellDblClick = (e) => {
19347
+ const cell = this.getCellFromElement(e.target);
19348
+ if (cell && 'onDblClick' in cell) {
19349
+ cell.onDblClick(e);
19350
+ }
19351
+ };
19352
+ /**
19353
+ * Delegated mousedown handler for cells.
19354
+ * @param e Mouse event
19355
+ */
19356
+ this.onCellMouseDown = (e) => {
19357
+ const cell = this.getCellFromElement(e.target);
19358
+ if (cell && 'onMouseDown' in cell) {
19359
+ cell.onMouseDown(e);
19360
+ }
19361
+ };
19362
+ /**
19363
+ * Delegated mouseover handler for cells.
19364
+ * @param e Mouse event
19365
+ */
19366
+ this.onCellMouseOver = (e) => {
19367
+ const cell = this.getCellFromElement(e.target);
19368
+ if (cell) {
19369
+ cell.onMouseOver();
19370
+ }
19371
+ };
19372
+ /**
19373
+ * Delegated mouseout handler for cells.
19374
+ * @param e Mouse event
19375
+ */
19376
+ this.onCellMouseOut = (e) => {
19377
+ const cell = this.getCellFromElement(e.target);
19378
+ if (cell) {
19379
+ cell.onMouseOut();
19380
+ }
19381
+ };
19382
+ /**
19383
+ * Delegated keydown handler for cells.
19384
+ * @param e Keyboard event
19385
+ */
19386
+ this.onCellKeyDown = (e) => {
19387
+ const cell = this.getCellFromElement(e.target);
19388
+ if (cell) {
19389
+ cell.onKeyDown(e);
19390
+ }
19391
+ };
18456
19392
  this.grid = grid;
18457
19393
  this.tableElement = tableElement;
18458
19394
  this.dataTable = this.grid.presentationTable;
18459
19395
  const dgOptions = grid.options;
18460
19396
  const customClassName = dgOptions?.rendering?.table?.className;
18461
19397
  this.columnResizing = ColumnResizing.initMode(this);
18462
- this.virtualRows = this.shouldVirtualizeRows();
18463
19398
  if (dgOptions?.rendering?.header?.enabled) {
18464
19399
  this.theadElement = Table_makeHTMLElement('thead', {}, tableElement);
18465
19400
  }
18466
19401
  this.tbodyElement = Table_makeHTMLElement('tbody', {}, tableElement);
18467
- if (this.virtualRows) {
18468
- tableElement.classList.add(Grid_Core_Globals.getClassName('virtualization'));
18469
- }
18470
19402
  if (dgOptions?.rendering?.columns?.resizing?.enabled) {
18471
19403
  this.columnsResizer = new Actions_ColumnsResizer(this);
18472
19404
  }
@@ -18477,6 +19409,10 @@ class Table {
18477
19409
  // Load columns
18478
19410
  this.loadColumns();
18479
19411
  // Virtualization
19412
+ this.virtualRows = this.shouldVirtualizeRows();
19413
+ if (this.virtualRows) {
19414
+ tableElement.classList.add(Grid_Core_Globals.getClassName('virtualization'));
19415
+ }
18480
19416
  this.rowsVirtualizer = new Actions_RowsVirtualizer(this);
18481
19417
  // Init Table
18482
19418
  this.init();
@@ -18485,6 +19421,13 @@ class Table {
18485
19421
  this.resizeObserver.observe(tableElement);
18486
19422
  this.tbodyElement.addEventListener('scroll', this.onScroll);
18487
19423
  this.tbodyElement.addEventListener('focus', this.onTBodyFocus);
19424
+ // Delegated cell events
19425
+ this.tbodyElement.addEventListener('click', this.onCellClick);
19426
+ this.tbodyElement.addEventListener('dblclick', this.onCellDblClick);
19427
+ this.tbodyElement.addEventListener('mousedown', this.onCellMouseDown);
19428
+ this.tbodyElement.addEventListener('mouseover', this.onCellMouseOver);
19429
+ this.tbodyElement.addEventListener('mouseout', this.onCellMouseOut);
19430
+ this.tbodyElement.addEventListener('keydown', this.onCellKeyDown);
18488
19431
  }
18489
19432
  /* *
18490
19433
  *
@@ -18680,12 +19623,55 @@ class Table {
18680
19623
  getWidthFromRatio(ratio) {
18681
19624
  return this.tbodyElement.clientWidth * ratio;
18682
19625
  }
19626
+ /**
19627
+ * Finds a cell from a DOM element within the table body.
19628
+ *
19629
+ * @param element
19630
+ * The DOM element to find the cell for (typically event.target).
19631
+ *
19632
+ * @returns
19633
+ * The Cell instance or undefined if not found.
19634
+ *
19635
+ * @internal
19636
+ */
19637
+ getCellFromElement(element) {
19638
+ if (!(element instanceof Element)) {
19639
+ return;
19640
+ }
19641
+ const td = element.closest('td');
19642
+ if (!td) {
19643
+ return;
19644
+ }
19645
+ const tr = td.parentElement;
19646
+ if (!tr) {
19647
+ return;
19648
+ }
19649
+ const rowIndexAttr = tr.getAttribute('data-row-index');
19650
+ if (rowIndexAttr === null) {
19651
+ return;
19652
+ }
19653
+ const rowIndex = parseInt(rowIndexAttr, 10);
19654
+ const firstRowIndex = this.rows[0]?.index ?? 0;
19655
+ const row = this.rows[rowIndex - firstRowIndex];
19656
+ if (!row) {
19657
+ return;
19658
+ }
19659
+ // Find cell index by position in row
19660
+ const cellIndex = Array.prototype.indexOf.call(tr.children, td);
19661
+ return row.cells[cellIndex];
19662
+ }
18683
19663
  /**
18684
19664
  * Destroys the grid table.
18685
19665
  */
18686
19666
  destroy() {
18687
19667
  this.tbodyElement.removeEventListener('focus', this.onTBodyFocus);
18688
19668
  this.tbodyElement.removeEventListener('scroll', this.onScroll);
19669
+ this.tbodyElement.removeEventListener('click', this.onCellClick);
19670
+ this.tbodyElement.removeEventListener('dblclick', this.onCellDblClick);
19671
+ this.tbodyElement.removeEventListener('mousedown', this.onCellMouseDown);
19672
+ this.tbodyElement.removeEventListener('mouseover', this.onCellMouseOver);
19673
+ this.tbodyElement.removeEventListener('mouseout', this.onCellMouseOut);
19674
+ this.tbodyElement.removeEventListener('keydown', this.onCellKeyDown);
18689
19675
  this.resizeObserver.disconnect();
18690
19676
  this.columnsResizer?.removeEventListeners();
18691
19677
  this.header?.destroy();
@@ -18776,11 +19762,11 @@ class Table {
18776
19762
  ;// ./code/grid/es-modules/Data/Modifiers/ChainModifier.js
18777
19763
  /* *
18778
19764
  *
18779
- * (c) 2009-2025 Highsoft AS
19765
+ * (c) 2009-2026 Highsoft AS
18780
19766
  *
18781
- * License: www.highcharts.com/license
19767
+ * A commercial license may be required depending on use.
19768
+ * See www.highcharts.com/license
18782
19769
  *
18783
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
18784
19770
  *
18785
19771
  * Authors:
18786
19772
  * - Sophie Bremer
@@ -19009,11 +19995,11 @@ Modifiers_DataModifier.registerType('Chain', ChainModifier);
19009
19995
  ;// ./code/grid/es-modules/Data/Modifiers/SortModifier.js
19010
19996
  /* *
19011
19997
  *
19012
- * (c) 2009-2025 Highsoft AS
19998
+ * (c) 2009-2026 Highsoft AS
19013
19999
  *
19014
- * License: www.highcharts.com/license
20000
+ * A commercial license may be required depending on use.
20001
+ * See www.highcharts.com/license
19015
20002
  *
19016
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
19017
20003
  *
19018
20004
  * Authors:
19019
20005
  * - Sophie Bremer
@@ -19104,9 +20090,35 @@ class SortModifier extends Modifiers_DataModifier {
19104
20090
  modifyTable(table, eventDetail) {
19105
20091
  const modifier = this;
19106
20092
  modifier.emit({ type: 'modify', detail: eventDetail, table });
19107
- const columnIds = table.getColumnIds(), rowCount = table.getRowCount(), rowReferences = this.getRowReferences(table), { direction, orderByColumn, orderInColumn, compare: customCompare } = modifier.options, compare = SortModifier.compareFactory(direction, customCompare), orderByColumnIndex = columnIds.indexOf(orderByColumn), modified = table.getModified();
19108
- if (orderByColumnIndex !== -1) {
19109
- rowReferences.sort((a, b) => compare(a.row[orderByColumnIndex], b.row[orderByColumnIndex]));
20093
+ const columnIds = table.getColumnIds(), rowCount = table.getRowCount(), rowReferences = this.getRowReferences(table), { direction, orderInColumn, compare: customCompare } = modifier.options, modified = table.getModified();
20094
+ const orderBy = ('columns' in modifier.options ?
20095
+ modifier.options.columns :
20096
+ [modifier.options.orderByColumn]);
20097
+ const orderByIndexes = [];
20098
+ for (let i = 0, iEnd = orderBy.length; i < iEnd; ++i) {
20099
+ const sort = orderBy[i];
20100
+ const isString = typeof sort === 'string';
20101
+ const column = isString ? sort : sort.column;
20102
+ const columnIndex = columnIds.indexOf(column);
20103
+ if (columnIndex === -1) {
20104
+ continue;
20105
+ }
20106
+ orderByIndexes.push({
20107
+ columnIndex,
20108
+ compare: SortModifier.compareFactory(isString ? direction : (sort.direction || direction), isString ? customCompare : (sort.compare || customCompare))
20109
+ });
20110
+ }
20111
+ if (orderByIndexes.length) {
20112
+ rowReferences.sort((a, b) => {
20113
+ for (let i = 0, iEnd = orderByIndexes.length; i < iEnd; ++i) {
20114
+ const { columnIndex, compare } = orderByIndexes[i];
20115
+ const result = compare(a.row[columnIndex], b.row[columnIndex]);
20116
+ if (result) {
20117
+ return result;
20118
+ }
20119
+ }
20120
+ return a.index - b.index;
20121
+ });
19110
20122
  }
19111
20123
  if (orderInColumn) {
19112
20124
  const column = [];
@@ -19157,11 +20169,11 @@ Modifiers_DataModifier.registerType('Sort', SortModifier);
19157
20169
  *
19158
20170
  * Grid Sorting Controller class
19159
20171
  *
19160
- * (c) 2020-2025 Highsoft AS
20172
+ * (c) 2020-2026 Highsoft AS
19161
20173
  *
19162
- * License: www.highcharts.com/license
20174
+ * A commercial license may be required depending on use.
20175
+ * See www.highcharts.com/license
19163
20176
  *
19164
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
19165
20177
  *
19166
20178
  * Authors:
19167
20179
  * - Dawid Dragula
@@ -19192,23 +20204,24 @@ class SortingController {
19192
20204
  constructor(querying) {
19193
20205
  this.querying = querying;
19194
20206
  }
19195
- /* *
19196
- *
19197
- * Functions
19198
- *
19199
- * */
19200
- /**
19201
- * Sets the sorting state. If the new sorting state is different than the
19202
- * current one, the `shouldBeUpdated` flag is set to `true`. If the
19203
- * same, the flag is set to `false`.
19204
- *
19205
- * @param order
19206
- * The sorting order.
19207
- *
19208
- * @param columnId
19209
- * The column ID to sort by.
19210
- */
19211
- setSorting(order, columnId) {
20207
+ setSorting(orderOrSortings, columnId) {
20208
+ if (Array.isArray(orderOrSortings)) {
20209
+ const sortings = orderOrSortings
20210
+ .filter((sorting) => !!(sorting.columnId && sorting.order))
20211
+ .map((sorting) => ({
20212
+ columnId: sorting.columnId,
20213
+ order: sorting.order
20214
+ }));
20215
+ const currentSortings = this.currentSortings || [];
20216
+ if (!SortingController.sortingsEqual(sortings, currentSortings)) {
20217
+ this.querying.shouldBeUpdated = true;
20218
+ this.currentSortings = sortings;
20219
+ this.currentSorting = sortings[0] || { order: null };
20220
+ }
20221
+ this.modifier = this.createModifier();
20222
+ return;
20223
+ }
20224
+ const order = orderOrSortings;
19212
20225
  if (this.currentSorting?.columnId !== columnId ||
19213
20226
  this.currentSorting?.order !== order) {
19214
20227
  this.querying.shouldBeUpdated = true;
@@ -19216,69 +20229,106 @@ class SortingController {
19216
20229
  columnId,
19217
20230
  order
19218
20231
  };
20232
+ this.currentSortings = (order && columnId ?
20233
+ [{ columnId, order }] :
20234
+ []);
19219
20235
  }
19220
20236
  this.modifier = this.createModifier();
19221
20237
  }
20238
+ /**
20239
+ * Checks whether two sorting state arrays are equal.
20240
+ *
20241
+ * @param a
20242
+ * First sorting state array.
20243
+ *
20244
+ * @param b
20245
+ * Second sorting state array.
20246
+ */
20247
+ static sortingsEqual(a, b) {
20248
+ if (a.length !== b.length) {
20249
+ return false;
20250
+ }
20251
+ for (let i = 0, iEnd = a.length; i < iEnd; ++i) {
20252
+ if (a[i].columnId !== b[i].columnId ||
20253
+ a[i].order !== b[i].order) {
20254
+ return false;
20255
+ }
20256
+ }
20257
+ return true;
20258
+ }
19222
20259
  /**
19223
20260
  * Returns the sorting options from the data grid options.
19224
20261
  */
19225
20262
  getSortingOptions() {
19226
20263
  const grid = this.querying.grid, { columnOptionsMap } = grid;
19227
20264
  if (!columnOptionsMap) {
19228
- return { order: null };
20265
+ return [];
19229
20266
  }
19230
20267
  const columnIDs = Object.keys(columnOptionsMap);
19231
- let foundOrder = null;
19232
- let foundColumnId;
19233
- for (let i = columnIDs.length - 1; i > -1; --i) {
20268
+ const sortings = [];
20269
+ for (let i = 0, iEnd = columnIDs.length; i < iEnd; ++i) {
19234
20270
  const columnId = columnIDs[i];
19235
20271
  const columnOptions = columnOptionsMap[columnId]?.options || {};
19236
20272
  const order = columnOptions.sorting?.order;
19237
20273
  if (order) {
19238
- if (foundColumnId) {
19239
- // eslint-disable-next-line no-console
19240
- console.warn('Grid: Only one column can be sorted at a time. ' +
19241
- 'Data will be sorted only by the last found column ' +
19242
- `with the sorting order defined in the options: "${foundColumnId}".`);
19243
- break;
19244
- }
19245
- foundOrder = order;
19246
- foundColumnId = columnId;
20274
+ sortings.push({
20275
+ columnId,
20276
+ order,
20277
+ priority: columnOptions.sorting?.priority,
20278
+ index: i
20279
+ });
19247
20280
  }
19248
20281
  }
19249
- return {
19250
- columnId: foundColumnId,
19251
- order: foundOrder
19252
- };
20282
+ if (sortings.some((sorting) => typeof sorting.priority === 'number')) {
20283
+ sortings.sort((a, b) => {
20284
+ const aPriority = (typeof a.priority === 'number' ?
20285
+ a.priority :
20286
+ Number.POSITIVE_INFINITY);
20287
+ const bPriority = (typeof b.priority === 'number' ?
20288
+ b.priority :
20289
+ Number.POSITIVE_INFINITY);
20290
+ if (aPriority !== bPriority) {
20291
+ return aPriority - bPriority;
20292
+ }
20293
+ return a.index - b.index;
20294
+ });
20295
+ }
20296
+ else {
20297
+ sortings.reverse();
20298
+ }
20299
+ return sortings.map((sorting) => ({
20300
+ columnId: sorting.columnId,
20301
+ order: sorting.order
20302
+ }));
19253
20303
  }
19254
20304
  /**
19255
20305
  * Loads sorting options from the data grid options.
19256
20306
  */
19257
20307
  loadOptions() {
19258
- const stateFromOptions = this.getSortingOptions();
19259
- if (stateFromOptions.columnId !== this.currentSorting?.columnId ||
19260
- stateFromOptions.order !== this.currentSorting?.order) {
19261
- this.setSorting(stateFromOptions.order, stateFromOptions.columnId);
20308
+ const sortingsFromOptions = this.getSortingOptions();
20309
+ if (!SortingController.sortingsEqual(sortingsFromOptions, this.currentSortings || [])) {
20310
+ this.setSorting(sortingsFromOptions);
19262
20311
  }
19263
20312
  }
19264
20313
  /**
19265
20314
  * Returns the sorting modifier based on the loaded sorting options.
19266
20315
  */
19267
20316
  createModifier() {
19268
- if (!this.currentSorting) {
19269
- return;
19270
- }
19271
- const { columnId, order } = this.currentSorting;
19272
- if (!order || !columnId) {
20317
+ const sortings = (this.currentSortings ||
20318
+ (this.currentSorting ? [this.currentSorting] : [])).filter((sorting) => !!(sorting.columnId && sorting.order));
20319
+ if (!sortings.length) {
19273
20320
  return;
19274
20321
  }
19275
20322
  const grid = this.querying.grid;
20323
+ const defaultCompare = grid.options?.columnDefaults?.sorting?.compare;
19276
20324
  return new Modifiers_SortModifier({
19277
- orderByColumn: columnId,
19278
- direction: order,
19279
- compare: grid.columnOptionsMap?.[columnId]?.options
19280
- ?.sorting?.compare ||
19281
- grid.options?.columnDefaults?.sorting?.compare
20325
+ direction: sortings[0].order,
20326
+ columns: sortings.map((sorting) => ({
20327
+ column: sorting.columnId,
20328
+ direction: sorting.order,
20329
+ compare: grid.columnOptionsMap?.[sorting.columnId]
20330
+ ?.options?.sorting?.compare || defaultCompare
20331
+ }))
19282
20332
  });
19283
20333
  }
19284
20334
  }
@@ -19292,11 +20342,11 @@ class SortingController {
19292
20342
  ;// ./code/grid/es-modules/Data/Modifiers/FilterModifier.js
19293
20343
  /* *
19294
20344
  *
19295
- * (c) 2009-2025 Highsoft AS
20345
+ * (c) 2009-2026 Highsoft AS
19296
20346
  *
19297
- * License: www.highcharts.com/license
20347
+ * A commercial license may be required depending on use.
20348
+ * See www.highcharts.com/license
19298
20349
  *
19299
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
19300
20350
  *
19301
20351
  * Authors:
19302
20352
  * - Dawid Dragula
@@ -19468,11 +20518,11 @@ Modifiers_DataModifier.registerType('Filter', FilterModifier);
19468
20518
  *
19469
20519
  * Grid Filtering Controller class
19470
20520
  *
19471
- * (c) 2020-2025 Highsoft AS
20521
+ * (c) 2020-2026 Highsoft AS
19472
20522
  *
19473
- * License: www.highcharts.com/license
20523
+ * A commercial license may be required depending on use.
20524
+ * See www.highcharts.com/license
19474
20525
  *
19475
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
19476
20526
  *
19477
20527
  * Authors:
19478
20528
  * - Dawid Dragula
@@ -19724,11 +20774,11 @@ class FilteringController {
19724
20774
  ;// ./code/grid/es-modules/Data/Modifiers/RangeModifier.js
19725
20775
  /* *
19726
20776
  *
19727
- * (c) 2009-2025 Highsoft AS
20777
+ * (c) 2009-2026 Highsoft AS
19728
20778
  *
19729
- * License: www.highcharts.com/license
20779
+ * A commercial license may be required depending on use.
20780
+ * See www.highcharts.com/license
19730
20781
  *
19731
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
19732
20782
  *
19733
20783
  * Authors:
19734
20784
  * - Sophie Bremer
@@ -19824,11 +20874,11 @@ Modifiers_DataModifier.registerType('Range', RangeModifier);
19824
20874
  *
19825
20875
  * Grid Pagination Controller class
19826
20876
  *
19827
- * (c) 2020-2025 Highsoft AS
20877
+ * (c) 2020-2026 Highsoft AS
19828
20878
  *
19829
- * License: www.highcharts.com/license
20879
+ * A commercial license may be required depending on use.
20880
+ * See www.highcharts.com/license
19830
20881
  *
19831
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
19832
20882
  *
19833
20883
  * Authors:
19834
20884
  * - Sebastian Bochan
@@ -19967,11 +21017,11 @@ class PaginationController {
19967
21017
  *
19968
21018
  * Grid Querying Controller class
19969
21019
  *
19970
- * (c) 2020-2025 Highsoft AS
21020
+ * (c) 2020-2026 Highsoft AS
19971
21021
  *
19972
- * License: www.highcharts.com/license
21022
+ * A commercial license may be required depending on use.
21023
+ * See www.highcharts.com/license
19973
21024
  *
19974
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
19975
21025
  *
19976
21026
  * Authors:
19977
21027
  * - Dawid Dragula
@@ -20096,11 +21146,11 @@ class QueryingController {
20096
21146
  *
20097
21147
  * Highcharts Grid class
20098
21148
  *
20099
- * (c) 2020-2025 Highsoft AS
21149
+ * (c) 2020-2026 Highsoft AS
20100
21150
  *
20101
- * License: www.highcharts.com/license
21151
+ * A commercial license may be required depending on use.
21152
+ * See www.highcharts.com/license
20102
21153
  *
20103
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
20104
21154
  *
20105
21155
  * Authors:
20106
21156
  * - Dawid Dragula
@@ -20119,8 +21169,8 @@ class QueryingController {
20119
21169
 
20120
21170
 
20121
21171
 
20122
- const { makeHTMLElement: Grid_makeHTMLElement, setHTMLContent: Grid_setHTMLContent } = GridUtils;
20123
- const { defined: Grid_defined, diffObjects: Grid_diffObjects, extend: Grid_extend, fireEvent: Grid_fireEvent, getStyle: Grid_getStyle, merge: Grid_merge, pick: Grid_pick } = Core_Utilities;
21172
+ const { makeHTMLElement: Grid_makeHTMLElement, setHTMLContent: Grid_setHTMLContent, createOptionsProxy: Grid_createOptionsProxy } = GridUtils;
21173
+ const { defined: Grid_defined, diffObjects: Grid_diffObjects, extend: Grid_extend, fireEvent: Grid_fireEvent, merge: Grid_merge, pick: Grid_pick } = Core_Utilities;
20124
21174
  /* *
20125
21175
  *
20126
21176
  * Class
@@ -20247,8 +21297,8 @@ class Grid {
20247
21297
  throw new Error('Rendering div not found. It is unable to find the HTML ' +
20248
21298
  'element to render the Grid in.');
20249
21299
  }
20250
- this.initialContainerHeight = Grid_getStyle(container, 'height', true) || 0;
20251
21300
  this.container = container;
21301
+ this.container.style.minHeight = 0 + 'px';
20252
21302
  this.container.innerHTML = HTML_AST.emptyHTML;
20253
21303
  this.contentWrapper = Grid_makeHTMLElement('div', {
20254
21304
  className: Grid_Core_Globals.getClassName('container')
@@ -20289,6 +21339,9 @@ class Grid {
20289
21339
  Grid_merge(true, diff, Grid_diffObjects(newOptions, this.userOptions));
20290
21340
  this.userOptions = Grid_merge(this.userOptions, newOptions);
20291
21341
  this.options = Grid_merge(this.options ?? Defaults_defaultOptions, this.userOptions);
21342
+ this.viewport?.columns.forEach((column) => {
21343
+ column.options = Grid_createOptionsProxy(this.columnOptionsMap?.[column.id]?.options ?? {}, this.options?.columnDefaults);
21344
+ });
20292
21345
  return diff;
20293
21346
  }
20294
21347
  /**
@@ -20590,7 +21643,9 @@ class Grid {
20590
21643
  Grid_fireEvent(this, 'beforeRedraw');
20591
21644
  const flags = this.dirtyFlags;
20592
21645
  if (flags.has('grid')) {
20593
- return await this.render();
21646
+ await this.render();
21647
+ Grid_fireEvent(this, 'afterRedraw');
21648
+ return;
20594
21649
  }
20595
21650
  const { viewport: vp, pagination } = this;
20596
21651
  const colResizing = vp?.columnResizing;
@@ -20677,6 +21732,90 @@ class Grid {
20677
21732
  columnId
20678
21733
  });
20679
21734
  }
21735
+ /**
21736
+ * Sets the sorting order for one or more columns. Provide the sortings
21737
+ * in priority order. Use `null` to clear sorting.
21738
+ *
21739
+ * @param sortings
21740
+ * The sorting definition in priority order.
21741
+ */
21742
+ async setSorting(sortings) {
21743
+ const viewport = this.viewport;
21744
+ if (!viewport) {
21745
+ return;
21746
+ }
21747
+ if (viewport.validator?.errorCell) {
21748
+ return;
21749
+ }
21750
+ const normalized = (sortings || []).filter((sorting) => !!(sorting.columnId && sorting.order));
21751
+ const sortingController = this.querying.sorting;
21752
+ const previousSortings = sortingController.currentSortings || [];
21753
+ const eventColumnIds = new Set();
21754
+ for (const sorting of previousSortings) {
21755
+ if (sorting.columnId) {
21756
+ eventColumnIds.add(sorting.columnId);
21757
+ }
21758
+ }
21759
+ for (const sorting of normalized) {
21760
+ eventColumnIds.add(sorting.columnId);
21761
+ }
21762
+ const eventColumns = Array.from(eventColumnIds)
21763
+ .map((columnId) => {
21764
+ const column = viewport.getColumn(columnId);
21765
+ if (!column) {
21766
+ return null;
21767
+ }
21768
+ const order = normalized.find((sorting) => sorting.columnId === columnId)?.order || null;
21769
+ return { column, order };
21770
+ })
21771
+ .filter((item) => !!item);
21772
+ for (const { column, order } of eventColumns) {
21773
+ [column, this].forEach((source) => {
21774
+ Grid_fireEvent(source, 'beforeSort', {
21775
+ target: column,
21776
+ order
21777
+ });
21778
+ });
21779
+ }
21780
+ sortingController.setSorting(normalized);
21781
+ await viewport.updateRows();
21782
+ const currentSortings = sortingController.currentSortings || [];
21783
+ const hasMultiple = currentSortings.length > 1;
21784
+ for (const column of viewport.columns) {
21785
+ const sortingIndex = currentSortings.findIndex((sorting) => sorting.columnId === column.id);
21786
+ if (sortingIndex !== -1 && currentSortings[sortingIndex].order) {
21787
+ const sorting = currentSortings[sortingIndex];
21788
+ const sortingOptions = {
21789
+ order: sorting.order
21790
+ };
21791
+ if (hasMultiple) {
21792
+ sortingOptions.priority = sortingIndex + 1;
21793
+ }
21794
+ column.setOptions({ sorting: sortingOptions });
21795
+ if (!hasMultiple) {
21796
+ delete column.options.sorting?.priority;
21797
+ }
21798
+ }
21799
+ else {
21800
+ delete column.options.sorting?.order;
21801
+ delete column.options.sorting?.priority;
21802
+ if (column.options.sorting &&
21803
+ Object.keys(column.options.sorting).length < 1) {
21804
+ delete column.options.sorting;
21805
+ }
21806
+ }
21807
+ column.sorting?.refreshHeaderAttributes();
21808
+ }
21809
+ this.accessibility?.userSortedColumn(currentSortings[0]?.order || null);
21810
+ for (const { column, order } of eventColumns) {
21811
+ [column, this].forEach((source) => {
21812
+ Grid_fireEvent(source, 'afterSort', {
21813
+ target: column,
21814
+ order
21815
+ });
21816
+ });
21817
+ }
21818
+ }
20680
21819
  async render() {
20681
21820
  if (this.isRendered) {
20682
21821
  this.destroy(true);
@@ -20859,7 +21998,7 @@ class Grid {
20859
21998
  else {
20860
21999
  this.renderNoData();
20861
22000
  }
20862
- this.accessibility?.setA11yOptions();
22001
+ this.renderAccessibility();
20863
22002
  // Render bottom pagination, footer pagination,
20864
22003
  // or custom container pagination (after table).
20865
22004
  if (paginationPosition !== 'top') {
@@ -20869,6 +22008,19 @@ class Grid {
20869
22008
  Grid_fireEvent(this, 'afterRenderViewport');
20870
22009
  this.viewport?.reflow();
20871
22010
  }
22011
+ /**
22012
+ * Renders the Grid accessibility.
22013
+ * @internal
22014
+ */
22015
+ renderAccessibility() {
22016
+ const accessibility = this.accessibility;
22017
+ if (!accessibility) {
22018
+ return;
22019
+ }
22020
+ accessibility.setA11yOptions();
22021
+ accessibility.addScreenReaderSection('before');
22022
+ accessibility.addScreenReaderSection('after');
22023
+ }
20872
22024
  /**
20873
22025
  * Renders the table (viewport) of the Grid.
20874
22026
  *
@@ -21116,11 +22268,11 @@ Grid.grids = [];
21116
22268
  ;// ./code/grid/es-modules/Data/DataPool.js
21117
22269
  /* *
21118
22270
  *
21119
- * (c) 2009-2025 Highsoft AS
22271
+ * (c) 2009-2026 Highsoft AS
21120
22272
  *
21121
- * License: www.highcharts.com/license
22273
+ * A commercial license may be required depending on use.
22274
+ * See www.highcharts.com/license
21122
22275
  *
21123
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
21124
22276
  *
21125
22277
  * Authors:
21126
22278
  * - Sophie Bremer
@@ -21375,11 +22527,11 @@ DataPool.defaultOptions = {
21375
22527
  ;// ./code/grid/es-modules/Grid/Pro/GridEvents.js
21376
22528
  /* *
21377
22529
  *
21378
- * (c) 2020-2025 Highsoft AS
22530
+ * (c) 2020-2026 Highsoft AS
21379
22531
  *
21380
- * License: www.highcharts.com/license
22532
+ * A commercial license may be required depending on use.
22533
+ * See www.highcharts.com/license
21381
22534
  *
21382
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
21383
22535
  *
21384
22536
  * Authors:
21385
22537
  * - Dawid Dragula
@@ -21490,11 +22642,11 @@ function compose(GridClass, ColumnClass, HeaderCellClass, TableCellClass) {
21490
22642
  *
21491
22643
  * Grid Cell Editing class.
21492
22644
  *
21493
- * (c) 2020-2025 Highsoft AS
22645
+ * (c) 2020-2026 Highsoft AS
21494
22646
  *
21495
- * License: www.highcharts.com/license
22647
+ * A commercial license may be required depending on use.
22648
+ * See www.highcharts.com/license
21496
22649
  *
21497
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
21498
22650
  *
21499
22651
  * Authors:
21500
22652
  * - Dawid Dragula
@@ -21700,11 +22852,11 @@ const classNames = {
21700
22852
  *
21701
22853
  * Cell Renderer Registry
21702
22854
  *
21703
- * (c) 2020-2025 Highsoft AS
22855
+ * (c) 2020-2026 Highsoft AS
21704
22856
  *
21705
- * License: www.highcharts.com/license
22857
+ * A commercial license may be required depending on use.
22858
+ * See www.highcharts.com/license
21706
22859
  *
21707
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
21708
22860
  *
21709
22861
  * Authors:
21710
22862
  * - Dawid Dragula
@@ -21754,11 +22906,11 @@ function registerRenderer(key, CellRendererClass) {
21754
22906
  *
21755
22907
  * Grid Cell Editing class.
21756
22908
  *
21757
- * (c) 2020-2025 Highsoft AS
22909
+ * (c) 2020-2026 Highsoft AS
21758
22910
  *
21759
- * License: www.highcharts.com/license
22911
+ * A commercial license may be required depending on use.
22912
+ * See www.highcharts.com/license
21760
22913
  *
21761
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
21762
22914
  *
21763
22915
  * Authors:
21764
22916
  * - Dawid Dragula
@@ -21954,11 +23106,11 @@ function announceA11yUserEditedCell(cell, msgType) {
21954
23106
  *
21955
23107
  * Grid Credits class
21956
23108
  *
21957
- * (c) 2020-2025 Highsoft AS
23109
+ * (c) 2020-2026 Highsoft AS
21958
23110
  *
21959
- * License: www.highcharts.com/license
23111
+ * A commercial license may be required depending on use.
23112
+ * See www.highcharts.com/license
21960
23113
  *
21961
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
21962
23114
  *
21963
23115
  * Authors:
21964
23116
  * - Dawid Dragula
@@ -22081,11 +23233,11 @@ Credits.defaultOptions = {
22081
23233
  *
22082
23234
  * Grid Credits class
22083
23235
  *
22084
- * (c) 2020-2025 Highsoft AS
23236
+ * (c) 2020-2026 Highsoft AS
22085
23237
  *
22086
- * License: www.highcharts.com/license
23238
+ * A commercial license may be required depending on use.
23239
+ * See www.highcharts.com/license
22087
23240
  *
22088
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
22089
23241
  *
22090
23242
  * Authors:
22091
23243
  * - Dawid Dragula
@@ -22195,11 +23347,11 @@ class CreditsPro extends Core_Credits {
22195
23347
  *
22196
23348
  * Grid Credits class
22197
23349
  *
22198
- * (c) 2020-2025 Highsoft AS
23350
+ * (c) 2020-2026 Highsoft AS
22199
23351
  *
22200
- * License: www.highcharts.com/license
23352
+ * A commercial license may be required depending on use.
23353
+ * See www.highcharts.com/license
22201
23354
  *
22202
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
22203
23355
  *
22204
23356
  * Authors:
22205
23357
  * - Dawid Dragula
@@ -22254,11 +23406,12 @@ function initCredits() {
22254
23406
  ;// ./code/grid/es-modules/Shared/DownloadURL.js
22255
23407
  /* *
22256
23408
  *
22257
- * (c) 2015-2025 Oystein Moseng
23409
+ * (c) 2015-2026 Highsoft AS
23410
+ * Author: Oystein Moseng
22258
23411
  *
22259
- * License: www.highcharts.com/license
23412
+ * A commercial license may be required depending on use.
23413
+ * See www.highcharts.com/license
22260
23414
  *
22261
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
22262
23415
  *
22263
23416
  * Mixin for downloading content in the browser
22264
23417
  *
@@ -22287,7 +23440,7 @@ const domurl = DownloadURL_win.URL || DownloadURL_win.webkitURL || DownloadURL_w
22287
23440
  /**
22288
23441
  * Convert base64 dataURL to Blob if supported, otherwise returns undefined.
22289
23442
  *
22290
- * @private
23443
+ * @internal
22291
23444
  * @function Highcharts.dataURLtoBlob
22292
23445
  *
22293
23446
  * @param {string} dataURL
@@ -22319,7 +23472,7 @@ function dataURLtoBlob(dataURL) {
22319
23472
  /**
22320
23473
  * Download a data URL in the browser. Can also take a blob as first param.
22321
23474
  *
22322
- * @private
23475
+ * @internal
22323
23476
  * @function Highcharts.downloadURL
22324
23477
  *
22325
23478
  * @param {string | global.URL} dataURL
@@ -22378,7 +23531,7 @@ function downloadURL(dataURL, filename) {
22378
23531
  /**
22379
23532
  * Asynchronously downloads a script from a provided location.
22380
23533
  *
22381
- * @private
23534
+ * @internal
22382
23535
  * @function Highcharts.getScript
22383
23536
  *
22384
23537
  * @param {string} scriptLocation
@@ -22407,7 +23560,7 @@ function getScript(scriptLocation) {
22407
23560
  /**
22408
23561
  * Get a blob object from content, if blob is supported.
22409
23562
  *
22410
- * @private
23563
+ * @internal
22411
23564
  * @function Highcharts.getBlobFromContent
22412
23565
  *
22413
23566
  * @param {string} content
@@ -22443,24 +23596,26 @@ function getBlobFromContent(content, type) {
22443
23596
  * Default Export
22444
23597
  *
22445
23598
  * */
23599
+ /** @internal */
22446
23600
  const DownloadURL = {
22447
23601
  dataURLtoBlob,
22448
23602
  downloadURL,
22449
23603
  getBlobFromContent,
22450
23604
  getScript
22451
23605
  };
22452
- /* harmony default export */ const Shared_DownloadURL = (DownloadURL);
23606
+ /** @internal */
23607
+ /* harmony default export */ const Shared_DownloadURL = ((/* unused pure expression or super */ null && (DownloadURL)));
22453
23608
 
22454
23609
  ;// ./code/grid/es-modules/Grid/Pro/Export/Exporting.js
22455
23610
  /* *
22456
23611
  *
22457
23612
  * Grid Exporting class
22458
23613
  *
22459
- * (c) 2020-2025 Highsoft AS
23614
+ * (c) 2020-2026 Highsoft AS
22460
23615
  *
22461
- * License: www.highcharts.com/license
23616
+ * A commercial license may be required depending on use.
23617
+ * See www.highcharts.com/license
22462
23618
  *
22463
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
22464
23619
  *
22465
23620
  * Authors:
22466
23621
  * - Karol Kolodziej
@@ -22469,7 +23624,6 @@ const DownloadURL = {
22469
23624
 
22470
23625
 
22471
23626
 
22472
- const { downloadURL: Exporting_downloadURL, getBlobFromContent: Exporting_getBlobFromContent } = Shared_DownloadURL;
22473
23627
  const { defined: Exporting_defined } = Core_Utilities;
22474
23628
  /* *
22475
23629
  *
@@ -22508,7 +23662,7 @@ class Exporting {
22508
23662
  */
22509
23663
  downloadCSV(modified = true) {
22510
23664
  const csv = this.getCSV(modified);
22511
- Exporting_downloadURL(Exporting_getBlobFromContent(csv, 'text/csv') ||
23665
+ downloadURL(getBlobFromContent(csv, 'text/csv') ||
22512
23666
  'data:text/csv,\uFEFF' + encodeURIComponent(csv), this.getFilename() + '.csv');
22513
23667
  }
22514
23668
  /**
@@ -22520,7 +23674,7 @@ class Exporting {
22520
23674
  */
22521
23675
  downloadJSON(modified = true) {
22522
23676
  const json = this.getJSON(modified);
22523
- Exporting_downloadURL(Exporting_getBlobFromContent(json, 'application/json') ||
23677
+ downloadURL(getBlobFromContent(json, 'application/json') ||
22524
23678
  'data:application/json,\uFEFF' + encodeURIComponent(json), this.getFilename() + '.json');
22525
23679
  }
22526
23680
  /**
@@ -22666,11 +23820,11 @@ Exporting.defaultOptions = {
22666
23820
  *
22667
23821
  * Grid Exporting composition
22668
23822
  *
22669
- * (c) 2020-2025 Highsoft AS
23823
+ * (c) 2020-2026 Highsoft AS
22670
23824
  *
22671
- * License: www.highcharts.com/license
23825
+ * A commercial license may be required depending on use.
23826
+ * See www.highcharts.com/license
22672
23827
  *
22673
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
22674
23828
  *
22675
23829
  * Authors:
22676
23830
  * - Karol Kolodziej
@@ -22721,11 +23875,11 @@ function initExporting() {
22721
23875
  *
22722
23876
  * Grid cell content validator
22723
23877
  *
22724
- * (c) 2009-2024 Highsoft AS
23878
+ * (c) 2009-2026 Highsoft AS
22725
23879
  *
22726
- * License: www.highcharts.com/license
23880
+ * A commercial license may be required depending on use.
23881
+ * See www.highcharts.com/license
22727
23882
  *
22728
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
22729
23883
  *
22730
23884
  * Authors:
22731
23885
  * - Dawid Dragula
@@ -22777,6 +23931,7 @@ class Validator {
22777
23931
  validate(cell, errors = []) {
22778
23932
  const { options, dataType } = cell.column;
22779
23933
  const validationErrors = cell.row.viewport.grid.options?.lang?.validationErrors;
23934
+ const rendererType = cell.column.options?.cells?.renderer?.type;
22780
23935
  let rules = Array.from(options?.cells?.editMode?.validationRules || []);
22781
23936
  // Remove duplicates in validationRules
22782
23937
  const isArrayString = rules.every((rule) => typeof rule === 'string');
@@ -22784,7 +23939,12 @@ class Validator {
22784
23939
  rules = [...new Set(rules)];
22785
23940
  }
22786
23941
  else {
22787
- const predefined = Validator.predefinedRules[dataType] || [];
23942
+ const predefined = [
23943
+ ...(Validator.predefinedRules.dataType[dataType] ?? [])
23944
+ ];
23945
+ if (rendererType) {
23946
+ predefined.push(...Validator.predefinedRules.renderer[rendererType] ?? []);
23947
+ }
22788
23948
  const hasPredefined = rules.some((rule) => typeof rule !== 'string' &&
22789
23949
  typeof rule.validate === 'string' &&
22790
23950
  predefined.includes(rule.validate));
@@ -22955,16 +24115,52 @@ Validator.rulesRegistry = {
22955
24115
  return !isDuplicate;
22956
24116
  },
22957
24117
  notification: 'Value must be unique within this column (case-sensitive).'
24118
+ },
24119
+ arrayNumber: {
24120
+ validate: function ({ rawValue }) {
24121
+ return rawValue
24122
+ .split(',')
24123
+ .every((item) => !Number.isNaN(Number(item.trim())));
24124
+ },
24125
+ notification: 'Value should be a list of numbers separated by commas.'
24126
+ },
24127
+ json: {
24128
+ validate: function ({ rawValue }) {
24129
+ try {
24130
+ JSON.parse(rawValue);
24131
+ return true;
24132
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
24133
+ }
24134
+ catch (e) {
24135
+ return false;
24136
+ }
24137
+ },
24138
+ notification: 'Value should be a valid JSON.'
24139
+ },
24140
+ sparkline: {
24141
+ validate: function ({ rawValue }) {
24142
+ const arrayNumberValidate = Validator.rulesRegistry.arrayNumber.validate;
24143
+ const jsonValidate = Validator.rulesRegistry.json.validate;
24144
+ return arrayNumberValidate({ rawValue }) ||
24145
+ jsonValidate({ rawValue });
24146
+ },
24147
+ // eslint-disable-next-line max-len
24148
+ notification: 'Value should be a valid JSON or a list of numbers separated by commas.'
22958
24149
  }
22959
24150
  };
22960
24151
  /**
22961
24152
  * Default validation rules for each dataType.
22962
24153
  */
22963
24154
  Validator.predefinedRules = {
22964
- 'boolean': ['boolean'],
22965
- datetime: ['datetime'],
22966
- number: ['number'],
22967
- string: []
24155
+ dataType: {
24156
+ 'boolean': ['boolean'],
24157
+ datetime: ['datetime'],
24158
+ number: ['number'],
24159
+ string: []
24160
+ },
24161
+ renderer: {
24162
+ sparkline: ['sparkline']
24163
+ }
22968
24164
  };
22969
24165
  /* *
22970
24166
  *
@@ -22978,11 +24174,11 @@ Validator.predefinedRules = {
22978
24174
  *
22979
24175
  * Validator Composition.
22980
24176
  *
22981
- * (c) 2020-2024 Highsoft AS
24177
+ * (c) 2020-2026 Highsoft AS
22982
24178
  *
22983
- * License: www.highcharts.com/license
24179
+ * A commercial license may be required depending on use.
24180
+ * See www.highcharts.com/license
22984
24181
  *
22985
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
22986
24182
  *
22987
24183
  * Authors:
22988
24184
  * - Sebastian Bochan
@@ -23038,11 +24234,11 @@ function destroy() {
23038
24234
  *
23039
24235
  * Cell Content Pro composition
23040
24236
  *
23041
- * (c) 2020-2025 Highsoft AS
24237
+ * (c) 2020-2026 Highsoft AS
23042
24238
  *
23043
- * License: www.highcharts.com/license
24239
+ * A commercial license may be required depending on use.
24240
+ * See www.highcharts.com/license
23044
24241
  *
23045
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
23046
24242
  *
23047
24243
  * Authors:
23048
24244
  * - Dawid Dragula
@@ -23114,11 +24310,11 @@ function createCellContent(cell) {
23114
24310
  *
23115
24311
  * Grid Pro Pagination class
23116
24312
  *
23117
- * (c) 2020-2025 Highsoft AS
24313
+ * (c) 2020-2026 Highsoft AS
23118
24314
  *
23119
- * License: www.highcharts.com/license
24315
+ * A commercial license may be required depending on use.
24316
+ * See www.highcharts.com/license
23120
24317
  *
23121
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
23122
24318
  *
23123
24319
  * Authors:
23124
24320
  * - Sebastian Bochan
@@ -23191,11 +24387,11 @@ function PaginationComposition_compose(PaginationClass) {
23191
24387
  *
23192
24388
  * Cell Content Pro abstract class
23193
24389
  *
23194
- * (c) 2020-2025 Highsoft AS
24390
+ * (c) 2020-2026 Highsoft AS
23195
24391
  *
23196
- * License: www.highcharts.com/license
24392
+ * A commercial license may be required depending on use.
24393
+ * See www.highcharts.com/license
23197
24394
  *
23198
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
23199
24395
  *
23200
24396
  * Authors:
23201
24397
  * - Dawid Dragula
@@ -23238,11 +24434,11 @@ class CellContentPro extends CellContent_CellContent {
23238
24434
  *
23239
24435
  * Cell Renderer abstract class
23240
24436
  *
23241
- * (c) 2020-2025 Highsoft AS
24437
+ * (c) 2020-2026 Highsoft AS
23242
24438
  *
23243
- * License: www.highcharts.com/license
24439
+ * A commercial license may be required depending on use.
24440
+ * See www.highcharts.com/license
23244
24441
  *
23245
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
23246
24442
  *
23247
24443
  * Authors:
23248
24444
  * - Dawid Dragula
@@ -23279,11 +24475,11 @@ class CellRenderer {
23279
24475
  ;// ./code/grid/es-modules/Data/Converters/CSVConverter.js
23280
24476
  /* *
23281
24477
  *
23282
- * (c) 2009-2025 Highsoft AS
24478
+ * (c) 2009-2026 Highsoft AS
23283
24479
  *
23284
- * License: www.highcharts.com/license
24480
+ * A commercial license may be required depending on use.
24481
+ * See www.highcharts.com/license
23285
24482
  *
23286
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
23287
24483
  *
23288
24484
  * Authors:
23289
24485
  * - Torstein Hønsi
@@ -23655,11 +24851,11 @@ Converters_DataConverter.registerType('CSV', CSVConverter);
23655
24851
  ;// ./code/grid/es-modules/Data/Connectors/CSVConnector.js
23656
24852
  /* *
23657
24853
  *
23658
- * (c) 2009-2025 Highsoft AS
24854
+ * (c) 2009-2026 Highsoft AS
23659
24855
  *
23660
- * License: www.highcharts.com/license
24856
+ * A commercial license may be required depending on use.
24857
+ * See www.highcharts.com/license
23661
24858
  *
23662
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
23663
24859
  *
23664
24860
  * Authors:
23665
24861
  * - Torstein Hønsi
@@ -23806,11 +25002,11 @@ Connectors_DataConnector.registerType('CSV', CSVConnector);
23806
25002
  ;// ./code/grid/es-modules/Data/Converters/GoogleSheetsConverter.js
23807
25003
  /* *
23808
25004
  *
23809
- * (c) 2009-2025 Highsoft AS
25005
+ * (c) 2009-2026 Highsoft AS
23810
25006
  *
23811
- * License: www.highcharts.com/license
25007
+ * A commercial license may be required depending on use.
25008
+ * See www.highcharts.com/license
23812
25009
  *
23813
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
23814
25010
  *
23815
25011
  * Authors:
23816
25012
  * - Torstein Hønsi
@@ -23943,11 +25139,11 @@ function isDateObject(value) {
23943
25139
  ;// ./code/grid/es-modules/Data/Connectors/GoogleSheetsConnector.js
23944
25140
  /* *
23945
25141
  *
23946
- * (c) 2009-2025 Highsoft AS
25142
+ * (c) 2009-2026 Highsoft AS
23947
25143
  *
23948
- * License: www.highcharts.com/license
25144
+ * A commercial license may be required depending on use.
25145
+ * See www.highcharts.com/license
23949
25146
  *
23950
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
23951
25147
  *
23952
25148
  * Authors:
23953
25149
  * - Torstein Hønsi
@@ -24171,11 +25367,11 @@ Connectors_DataConnector.registerType('GoogleSheets', GoogleSheetsConnector);
24171
25367
  ;// ./code/grid/es-modules/Data/Converters/HTMLTableConverter.js
24172
25368
  /* *
24173
25369
  *
24174
- * (c) 2009-2025 Highsoft AS
25370
+ * (c) 2009-2026 Highsoft AS
24175
25371
  *
24176
- * License: www.highcharts.com/license
25372
+ * A commercial license may be required depending on use.
25373
+ * See www.highcharts.com/license
24177
25374
  *
24178
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
24179
25375
  *
24180
25376
  * Authors:
24181
25377
  * - Torstein Hønsi
@@ -24535,11 +25731,11 @@ Converters_DataConverter.registerType('HTMLTable', HTMLTableConverter);
24535
25731
  ;// ./code/grid/es-modules/Data/Connectors/HTMLTableConnector.js
24536
25732
  /* *
24537
25733
  *
24538
- * (c) 2009-2025 Highsoft AS
25734
+ * (c) 2009-2026 Highsoft AS
24539
25735
  *
24540
- * License: www.highcharts.com/license
25736
+ * A commercial license may be required depending on use.
25737
+ * See www.highcharts.com/license
24541
25738
  *
24542
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
24543
25739
  *
24544
25740
  * Authors:
24545
25741
  * - Torstein Hønsi
@@ -24656,11 +25852,11 @@ Connectors_DataConnector.registerType('HTMLTable', HTMLTableConnector);
24656
25852
  ;// ./code/grid/es-modules/Data/Converters/JSONConverter.js
24657
25853
  /* *
24658
25854
  *
24659
- * (c) 2009-2025 Highsoft AS
25855
+ * (c) 2009-2026 Highsoft AS
24660
25856
  *
24661
- * License: www.highcharts.com/license
25857
+ * A commercial license may be required depending on use.
25858
+ * See www.highcharts.com/license
24662
25859
  *
24663
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
24664
25860
  *
24665
25861
  * Authors:
24666
25862
  * - Pawel Lysy
@@ -24897,11 +26093,11 @@ Converters_DataConverter.registerType('JSON', JSONConverter);
24897
26093
  ;// ./code/grid/es-modules/Data/Connectors/JSONConnector.js
24898
26094
  /* *
24899
26095
  *
24900
- * (c) 2009-2025 Highsoft AS
26096
+ * (c) 2009-2026 Highsoft AS
24901
26097
  *
24902
- * License: www.highcharts.com/license
26098
+ * A commercial license may be required depending on use.
26099
+ * See www.highcharts.com/license
24903
26100
  *
24904
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
24905
26101
  *
24906
26102
  * Authors:
24907
26103
  * - Pawel Lysy
@@ -25055,11 +26251,11 @@ Connectors_DataConnector.registerType('JSON', JSONConnector);
25055
26251
  ;// ./code/grid/es-modules/Data/Modifiers/InvertModifier.js
25056
26252
  /* *
25057
26253
  *
25058
- * (c) 2009-2025 Highsoft AS
26254
+ * (c) 2009-2026 Highsoft AS
25059
26255
  *
25060
- * License: www.highcharts.com/license
26256
+ * A commercial license may be required depending on use.
26257
+ * See www.highcharts.com/license
25061
26258
  *
25062
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
25063
26259
  *
25064
26260
  * Authors:
25065
26261
  * - Wojciech Chmiel
@@ -25175,11 +26371,11 @@ Modifiers_DataModifier.registerType('Invert', InvertModifier);
25175
26371
  *
25176
26372
  * Text Cell Renderer class
25177
26373
  *
25178
- * (c) 2020-2025 Highsoft AS
26374
+ * (c) 2020-2026 Highsoft AS
25179
26375
  *
25180
- * License: www.highcharts.com/license
26376
+ * A commercial license may be required depending on use.
26377
+ * See www.highcharts.com/license
25181
26378
  *
25182
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
25183
26379
  *
25184
26380
  * Authors:
25185
26381
  * - Dawid Dragula
@@ -25251,11 +26447,11 @@ registerRenderer('text', TextRenderer);
25251
26447
  *
25252
26448
  * Checkbox Cell Content class
25253
26449
  *
25254
- * (c) 2020-2025 Highsoft AS
26450
+ * (c) 2020-2026 Highsoft AS
25255
26451
  *
25256
- * License: www.highcharts.com/license
26452
+ * A commercial license may be required depending on use.
26453
+ * See www.highcharts.com/license
25257
26454
  *
25258
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
25259
26455
  *
25260
26456
  * Authors:
25261
26457
  * - Dawid Dragula
@@ -25375,11 +26571,11 @@ class CheckboxContent extends CellRendering_CellContentPro {
25375
26571
  *
25376
26572
  * Checkbox Cell Renderer class
25377
26573
  *
25378
- * (c) 2020-2025 Highsoft AS
26574
+ * (c) 2020-2026 Highsoft AS
25379
26575
  *
25380
- * License: www.highcharts.com/license
26576
+ * A commercial license may be required depending on use.
26577
+ * See www.highcharts.com/license
25381
26578
  *
25382
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
25383
26579
  *
25384
26580
  * Authors:
25385
26581
  * - Dawid Dragula
@@ -25442,11 +26638,11 @@ registerRenderer('checkbox', CheckboxRenderer);
25442
26638
  *
25443
26639
  * Select Cell Content class
25444
26640
  *
25445
- * (c) 2020-2025 Highsoft AS
26641
+ * (c) 2020-2026 Highsoft AS
25446
26642
  *
25447
- * License: www.highcharts.com/license
26643
+ * A commercial license may be required depending on use.
26644
+ * See www.highcharts.com/license
25448
26645
  *
25449
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
25450
26646
  *
25451
26647
  * Authors:
25452
26648
  * - Dawid Dragula
@@ -25619,11 +26815,11 @@ class SelectContent extends CellRendering_CellContentPro {
25619
26815
  *
25620
26816
  * Select Cell Renderer class
25621
26817
  *
25622
- * (c) 2020-2025 Highsoft AS
26818
+ * (c) 2020-2026 Highsoft AS
25623
26819
  *
25624
- * License: www.highcharts.com/license
26820
+ * A commercial license may be required depending on use.
26821
+ * See www.highcharts.com/license
25625
26822
  *
25626
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
25627
26823
  *
25628
26824
  * Authors:
25629
26825
  * - Dawid Dragula
@@ -25687,11 +26883,11 @@ registerRenderer('select', SelectRenderer);
25687
26883
  *
25688
26884
  * Text Input Cell Content class
25689
26885
  *
25690
- * (c) 2020-2025 Highsoft AS
26886
+ * (c) 2020-2026 Highsoft AS
25691
26887
  *
25692
- * License: www.highcharts.com/license
26888
+ * A commercial license may be required depending on use.
26889
+ * See www.highcharts.com/license
25693
26890
  *
25694
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
25695
26891
  *
25696
26892
  * Authors:
25697
26893
  * - Dawid Dragula
@@ -25859,11 +27055,11 @@ class TextInputContent extends CellRendering_CellContentPro {
25859
27055
  *
25860
27056
  * Text Input Cell Renderer class
25861
27057
  *
25862
- * (c) 2020-2025 Highsoft AS
27058
+ * (c) 2020-2026 Highsoft AS
25863
27059
  *
25864
- * License: www.highcharts.com/license
27060
+ * A commercial license may be required depending on use.
27061
+ * See www.highcharts.com/license
25865
27062
  *
25866
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
25867
27063
  *
25868
27064
  * Authors:
25869
27065
  * - Dawid Dragula
@@ -25926,11 +27122,11 @@ registerRenderer('textInput', TextInputRenderer);
25926
27122
  *
25927
27123
  * Date Input Cell Content Base class
25928
27124
  *
25929
- * (c) 2020-2025 Highsoft AS
27125
+ * (c) 2020-2026 Highsoft AS
25930
27126
  *
25931
- * License: www.highcharts.com/license
27127
+ * A commercial license may be required depending on use.
27128
+ * See www.highcharts.com/license
25932
27129
  *
25933
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
25934
27130
  *
25935
27131
  * Authors:
25936
27132
  * - Dawid Dragula
@@ -26075,11 +27271,11 @@ class DateInputContentBase extends CellRendering_CellContentPro {
26075
27271
  *
26076
27272
  * Date Input Cell Content class
26077
27273
  *
26078
- * (c) 2020-2025 Highsoft AS
27274
+ * (c) 2020-2026 Highsoft AS
26079
27275
  *
26080
- * License: www.highcharts.com/license
27276
+ * A commercial license may be required depending on use.
27277
+ * See www.highcharts.com/license
26081
27278
  *
26082
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
26083
27279
  *
26084
27280
  * Authors:
26085
27281
  * - Dawid Dragula
@@ -26116,11 +27312,11 @@ class DateInputContent extends ContentTypes_DateInputContentBase {
26116
27312
  *
26117
27313
  * Date Input Cell Renderer class
26118
27314
  *
26119
- * (c) 2020-2025 Highsoft AS
27315
+ * (c) 2020-2026 Highsoft AS
26120
27316
  *
26121
- * License: www.highcharts.com/license
27317
+ * A commercial license may be required depending on use.
27318
+ * See www.highcharts.com/license
26122
27319
  *
26123
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
26124
27320
  *
26125
27321
  * Authors:
26126
27322
  * - Dawid Dragula
@@ -26183,11 +27379,11 @@ registerRenderer('dateInput', DateInputRenderer);
26183
27379
  *
26184
27380
  * DateTime Input Cell Content class
26185
27381
  *
26186
- * (c) 2020-2025 Highsoft AS
27382
+ * (c) 2020-2026 Highsoft AS
26187
27383
  *
26188
- * License: www.highcharts.com/license
27384
+ * A commercial license may be required depending on use.
27385
+ * See www.highcharts.com/license
26189
27386
  *
26190
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
26191
27387
  *
26192
27388
  * Authors:
26193
27389
  * - Dawid Dragula
@@ -26223,11 +27419,11 @@ class DateTimeInputContent extends ContentTypes_DateInputContentBase {
26223
27419
  *
26224
27420
  * Date Time Input Cell Renderer class
26225
27421
  *
26226
- * (c) 2020-2025 Highsoft AS
27422
+ * (c) 2020-2026 Highsoft AS
26227
27423
  *
26228
- * License: www.highcharts.com/license
27424
+ * A commercial license may be required depending on use.
27425
+ * See www.highcharts.com/license
26229
27426
  *
26230
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
26231
27427
  *
26232
27428
  * Authors:
26233
27429
  * - Dawid Dragula
@@ -26289,11 +27485,11 @@ registerRenderer('dateTimeInput', DateTimeInputRenderer);
26289
27485
  *
26290
27486
  * Time Input Cell Content class
26291
27487
  *
26292
- * (c) 2020-2025 Highsoft AS
27488
+ * (c) 2020-2026 Highsoft AS
26293
27489
  *
26294
- * License: www.highcharts.com/license
27490
+ * A commercial license may be required depending on use.
27491
+ * See www.highcharts.com/license
26295
27492
  *
26296
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
26297
27493
  *
26298
27494
  * Authors:
26299
27495
  * - Dawid Dragula
@@ -26332,11 +27528,11 @@ class TimeInputContent extends ContentTypes_DateInputContentBase {
26332
27528
  *
26333
27529
  * Time Input Cell Renderer class
26334
27530
  *
26335
- * (c) 2020-2025 Highsoft AS
27531
+ * (c) 2020-2026 Highsoft AS
26336
27532
  *
26337
- * License: www.highcharts.com/license
27533
+ * A commercial license may be required depending on use.
27534
+ * See www.highcharts.com/license
26338
27535
  *
26339
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
26340
27536
  *
26341
27537
  * Authors:
26342
27538
  * - Dawid Dragula
@@ -26398,11 +27594,11 @@ registerRenderer('timeInput', TimeInputRenderer);
26398
27594
  *
26399
27595
  * Sparkline Cell Content class
26400
27596
  *
26401
- * (c) 2020-2025 Highsoft AS
27597
+ * (c) 2020-2026 Highsoft AS
26402
27598
  *
26403
- * License: www.highcharts.com/license
27599
+ * A commercial license may be required depending on use.
27600
+ * See www.highcharts.com/license
26404
27601
  *
26405
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
26406
27602
  *
26407
27603
  * Authors:
26408
27604
  * - Dawid Dragula
@@ -26561,11 +27757,11 @@ SparklineContent.defaultChartOptions = {
26561
27757
  *
26562
27758
  * Sparkline Cell Renderer class
26563
27759
  *
26564
- * (c) 2020-2025 Highsoft AS
27760
+ * (c) 2020-2026 Highsoft AS
26565
27761
  *
26566
- * License: www.highcharts.com/license
27762
+ * A commercial license may be required depending on use.
27763
+ * See www.highcharts.com/license
26567
27764
  *
26568
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
26569
27765
  *
26570
27766
  * Authors:
26571
27767
  * - Dawid Dragula
@@ -26644,11 +27840,11 @@ registerRenderer('sparkline', SparklineRenderer);
26644
27840
  *
26645
27841
  * Text Input Cell Content class
26646
27842
  *
26647
- * (c) 2020-2025 Highsoft AS
27843
+ * (c) 2020-2026 Highsoft AS
26648
27844
  *
26649
- * License: www.highcharts.com/license
27845
+ * A commercial license may be required depending on use.
27846
+ * See www.highcharts.com/license
26650
27847
  *
26651
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
26652
27848
  *
26653
27849
  * Authors:
26654
27850
  * - Sebastian Bochan
@@ -26806,11 +28002,11 @@ class NumberInputContent extends CellRendering_CellContentPro {
26806
28002
  *
26807
28003
  * Date Input Cell Renderer class
26808
28004
  *
26809
- * (c) 2020-2025 Highsoft AS
28005
+ * (c) 2020-2026 Highsoft AS
26810
28006
  *
26811
- * License: www.highcharts.com/license
28007
+ * A commercial license may be required depending on use.
28008
+ * See www.highcharts.com/license
26812
28009
  *
26813
- * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
26814
28010
  *
26815
28011
  * Authors:
26816
28012
  * - Sebastian Bochan
@@ -26983,9 +28179,15 @@ PaginationComposition.compose(G.Pagination);
26983
28179
  *
26984
28180
  * */
26985
28181
 
26986
- const { classNamePrefix: grid_pro_src_classNamePrefix, defaultOptions: grid_pro_src_defaultOptions, Grid: grid_pro_src_Grid, grid, grids, isHighContrastModeActive: grid_pro_src_isHighContrastModeActive, merge: grid_pro_src_merge, product, setOptions: grid_pro_src_setOptions, version: grid_pro_src_version, win: grid_pro_src_win } = G;
26987
- if (G.win.Highcharts) {
26988
- G.CellRendererRegistry.types.sparkline.useHighcharts(G.win.Highcharts);
28182
+ const { classNamePrefix: grid_pro_src_classNamePrefix, defaultOptions: grid_pro_src_defaultOptions, grid, grids, isHighContrastModeActive: grid_pro_src_isHighContrastModeActive, merge: grid_pro_src_merge, product, setOptions: grid_pro_src_setOptions, version: grid_pro_src_version, win: grid_pro_src_win } = G;
28183
+ /* *
28184
+ *
28185
+ * Classic Extensions
28186
+ *
28187
+ * */
28188
+ const wnd = G.win;
28189
+ if (wnd.Highcharts) {
28190
+ G.CellRendererRegistry.types.sparkline.useHighcharts(wnd.Highcharts);
26989
28191
  }
26990
28192
  /* harmony default export */ const grid_pro_src = (G);
26991
28193