@glideappsfinal/glide-data-grid 6.0.9

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 (745) hide show
  1. package/.eslintignore +4 -0
  2. package/.eslintrc +68 -0
  3. package/API.md +1466 -0
  4. package/CHANGELOG.md +895 -0
  5. package/LICENSE +21 -0
  6. package/README.md +190 -0
  7. package/build.sh +21 -0
  8. package/dist/cjs/cells/boolean-cell.js +87 -0
  9. package/dist/cjs/cells/boolean-cell.js.map +1 -0
  10. package/dist/cjs/cells/bubble-cell.js +53 -0
  11. package/dist/cjs/cells/bubble-cell.js.map +1 -0
  12. package/dist/cjs/cells/cell-types.js +2 -0
  13. package/dist/cjs/cells/cell-types.js.map +1 -0
  14. package/dist/cjs/cells/drilldown-cell.js +171 -0
  15. package/dist/cjs/cells/drilldown-cell.js.map +1 -0
  16. package/dist/cjs/cells/image-cell.js +94 -0
  17. package/dist/cjs/cells/image-cell.js.map +1 -0
  18. package/dist/cjs/cells/index.js +29 -0
  19. package/dist/cjs/cells/index.js.map +1 -0
  20. package/dist/cjs/cells/loading-cell.js +41 -0
  21. package/dist/cjs/cells/loading-cell.js.map +1 -0
  22. package/dist/cjs/cells/markdown-cell.js +30 -0
  23. package/dist/cjs/cells/markdown-cell.js.map +1 -0
  24. package/dist/cjs/cells/marker-cell.js +80 -0
  25. package/dist/cjs/cells/marker-cell.js.map +1 -0
  26. package/dist/cjs/cells/new-row-cell.js +53 -0
  27. package/dist/cjs/cells/new-row-cell.js.map +1 -0
  28. package/dist/cjs/cells/number-cell.js +44 -0
  29. package/dist/cjs/cells/number-cell.js.map +1 -0
  30. package/dist/cjs/cells/protected-cell.js +35 -0
  31. package/dist/cjs/cells/protected-cell.js.map +1 -0
  32. package/dist/cjs/cells/row-id-cell.js +23 -0
  33. package/dist/cjs/cells/row-id-cell.js.map +1 -0
  34. package/dist/cjs/cells/text-cell.js +48 -0
  35. package/dist/cjs/cells/text-cell.js.map +1 -0
  36. package/dist/cjs/cells/uri-cell.js +104 -0
  37. package/dist/cjs/cells/uri-cell.js.map +1 -0
  38. package/dist/cjs/common/browser-detect.js +20 -0
  39. package/dist/cjs/common/browser-detect.js.map +1 -0
  40. package/dist/cjs/common/image-window-loader.js +98 -0
  41. package/dist/cjs/common/image-window-loader.js.map +1 -0
  42. package/dist/cjs/common/is-hotkey.js +76 -0
  43. package/dist/cjs/common/is-hotkey.js.map +1 -0
  44. package/dist/cjs/common/math.js +297 -0
  45. package/dist/cjs/common/math.js.map +1 -0
  46. package/dist/cjs/common/render-state-provider.js +70 -0
  47. package/dist/cjs/common/render-state-provider.js.map +1 -0
  48. package/dist/cjs/common/resize-detector.js +27 -0
  49. package/dist/cjs/common/resize-detector.js.map +1 -0
  50. package/dist/cjs/common/styles.js +135 -0
  51. package/dist/cjs/common/styles.js.map +1 -0
  52. package/dist/cjs/common/support.js +60 -0
  53. package/dist/cjs/common/support.js.map +1 -0
  54. package/dist/cjs/common/utils.js +193 -0
  55. package/dist/cjs/common/utils.js.map +1 -0
  56. package/dist/cjs/data-editor/copy-paste.js +269 -0
  57. package/dist/cjs/data-editor/copy-paste.js.map +1 -0
  58. package/dist/cjs/data-editor/data-editor-fns.js +190 -0
  59. package/dist/cjs/data-editor/data-editor-fns.js.map +1 -0
  60. package/dist/cjs/data-editor/data-editor-keybindings.js +126 -0
  61. package/dist/cjs/data-editor/data-editor-keybindings.js.map +1 -0
  62. package/dist/cjs/data-editor/data-editor.js +2892 -0
  63. package/dist/cjs/data-editor/data-editor.js.map +1 -0
  64. package/dist/cjs/data-editor/group-rename.css +2 -0
  65. package/dist/cjs/data-editor/group-rename.js +49 -0
  66. package/dist/cjs/data-editor/group-rename.js.map +1 -0
  67. package/dist/cjs/data-editor/row-grouping-api.js +34 -0
  68. package/dist/cjs/data-editor/row-grouping-api.js.map +1 -0
  69. package/dist/cjs/data-editor/row-grouping.js +189 -0
  70. package/dist/cjs/data-editor/row-grouping.js.map +1 -0
  71. package/dist/cjs/data-editor/use-autoscroll.js +36 -0
  72. package/dist/cjs/data-editor/use-autoscroll.js.map +1 -0
  73. package/dist/cjs/data-editor/use-cells-for-selection.js +53 -0
  74. package/dist/cjs/data-editor/use-cells-for-selection.js.map +1 -0
  75. package/dist/cjs/data-editor/use-column-sizer.js +189 -0
  76. package/dist/cjs/data-editor/use-column-sizer.js.map +1 -0
  77. package/dist/cjs/data-editor/use-initial-scroll-offset.js +81 -0
  78. package/dist/cjs/data-editor/use-initial-scroll-offset.js.map +1 -0
  79. package/dist/cjs/data-editor/use-rem-adjuster.js +29 -0
  80. package/dist/cjs/data-editor/use-rem-adjuster.js.map +1 -0
  81. package/dist/cjs/data-editor/visible-region.js +2 -0
  82. package/dist/cjs/data-editor/visible-region.js.map +1 -0
  83. package/dist/cjs/data-editor-all.js +19 -0
  84. package/dist/cjs/data-editor-all.js.map +1 -0
  85. package/dist/cjs/index.js +36 -0
  86. package/dist/cjs/index.js.map +1 -0
  87. package/dist/cjs/internal/click-outside-container/click-outside-container.js +34 -0
  88. package/dist/cjs/internal/click-outside-container/click-outside-container.js.map +1 -0
  89. package/dist/cjs/internal/data-editor-container/data-grid-container.js +36 -0
  90. package/dist/cjs/internal/data-editor-container/data-grid-container.js.map +1 -0
  91. package/dist/cjs/internal/data-grid/animation-manager.js +95 -0
  92. package/dist/cjs/internal/data-grid/animation-manager.js.map +1 -0
  93. package/dist/cjs/internal/data-grid/cell-set.js +56 -0
  94. package/dist/cjs/internal/data-grid/cell-set.js.map +1 -0
  95. package/dist/cjs/internal/data-grid/color-parser.js +122 -0
  96. package/dist/cjs/internal/data-grid/color-parser.js.map +1 -0
  97. package/dist/cjs/internal/data-grid/data-grid-sprites.js +64 -0
  98. package/dist/cjs/internal/data-grid/data-grid-sprites.js.map +1 -0
  99. package/dist/cjs/internal/data-grid/data-grid-types.js +299 -0
  100. package/dist/cjs/internal/data-grid/data-grid-types.js.map +1 -0
  101. package/dist/cjs/internal/data-grid/data-grid.js +1208 -0
  102. package/dist/cjs/internal/data-grid/data-grid.js.map +1 -0
  103. package/dist/cjs/internal/data-grid/event-args.js +30 -0
  104. package/dist/cjs/internal/data-grid/event-args.js.map +1 -0
  105. package/dist/cjs/internal/data-grid/image-window-loader-interface.js +2 -0
  106. package/dist/cjs/internal/data-grid/image-window-loader-interface.js.map +1 -0
  107. package/dist/cjs/internal/data-grid/render/data-grid-lib.js +652 -0
  108. package/dist/cjs/internal/data-grid/render/data-grid-lib.js.map +1 -0
  109. package/dist/cjs/internal/data-grid/render/data-grid-render.blit.js +218 -0
  110. package/dist/cjs/internal/data-grid/render/data-grid-render.blit.js.map +1 -0
  111. package/dist/cjs/internal/data-grid/render/data-grid-render.cells.js +369 -0
  112. package/dist/cjs/internal/data-grid/render/data-grid-render.cells.js.map +1 -0
  113. package/dist/cjs/internal/data-grid/render/data-grid-render.header.js +440 -0
  114. package/dist/cjs/internal/data-grid/render/data-grid-render.header.js.map +1 -0
  115. package/dist/cjs/internal/data-grid/render/data-grid-render.js +316 -0
  116. package/dist/cjs/internal/data-grid/render/data-grid-render.js.map +1 -0
  117. package/dist/cjs/internal/data-grid/render/data-grid-render.lines.js +256 -0
  118. package/dist/cjs/internal/data-grid/render/data-grid-render.lines.js.map +1 -0
  119. package/dist/cjs/internal/data-grid/render/data-grid-render.walk.js +157 -0
  120. package/dist/cjs/internal/data-grid/render/data-grid-render.walk.js.map +1 -0
  121. package/dist/cjs/internal/data-grid/render/data-grid.render.rings.js +203 -0
  122. package/dist/cjs/internal/data-grid/render/data-grid.render.rings.js.map +1 -0
  123. package/dist/cjs/internal/data-grid/render/draw-checkbox.js +65 -0
  124. package/dist/cjs/internal/data-grid/render/draw-checkbox.js.map +1 -0
  125. package/dist/cjs/internal/data-grid/render/draw-edit-hover-indicator.js +38 -0
  126. package/dist/cjs/internal/data-grid/render/draw-edit-hover-indicator.js.map +1 -0
  127. package/dist/cjs/internal/data-grid/render/draw-grid-arg.js +2 -0
  128. package/dist/cjs/internal/data-grid/render/draw-grid-arg.js.map +1 -0
  129. package/dist/cjs/internal/data-grid/sprites.js +288 -0
  130. package/dist/cjs/internal/data-grid/sprites.js.map +1 -0
  131. package/dist/cjs/internal/data-grid/use-animation-queue.js +33 -0
  132. package/dist/cjs/internal/data-grid/use-animation-queue.js.map +1 -0
  133. package/dist/cjs/internal/data-grid/use-selection-behavior.js +112 -0
  134. package/dist/cjs/internal/data-grid/use-selection-behavior.js.map +1 -0
  135. package/dist/cjs/internal/data-grid-dnd/data-grid-dnd.js +239 -0
  136. package/dist/cjs/internal/data-grid-dnd/data-grid-dnd.js.map +1 -0
  137. package/dist/cjs/internal/data-grid-overlay-editor/data-grid-overlay-editor-style.js +77 -0
  138. package/dist/cjs/internal/data-grid-overlay-editor/data-grid-overlay-editor-style.js.map +1 -0
  139. package/dist/cjs/internal/data-grid-overlay-editor/data-grid-overlay-editor.js +124 -0
  140. package/dist/cjs/internal/data-grid-overlay-editor/data-grid-overlay-editor.js.map +1 -0
  141. package/dist/cjs/internal/data-grid-overlay-editor/private/bubbles-overlay-editor-style.js +34 -0
  142. package/dist/cjs/internal/data-grid-overlay-editor/private/bubbles-overlay-editor-style.js.map +1 -0
  143. package/dist/cjs/internal/data-grid-overlay-editor/private/bubbles-overlay-editor.js +10 -0
  144. package/dist/cjs/internal/data-grid-overlay-editor/private/bubbles-overlay-editor.js.map +1 -0
  145. package/dist/cjs/internal/data-grid-overlay-editor/private/drilldown-overlay-editor.js +50 -0
  146. package/dist/cjs/internal/data-grid-overlay-editor/private/drilldown-overlay-editor.js.map +1 -0
  147. package/dist/cjs/internal/data-grid-overlay-editor/private/image-overlay-editor-style.js +56 -0
  148. package/dist/cjs/internal/data-grid-overlay-editor/private/image-overlay-editor-style.js.map +1 -0
  149. package/dist/cjs/internal/data-grid-overlay-editor/private/image-overlay-editor.js +21 -0
  150. package/dist/cjs/internal/data-grid-overlay-editor/private/image-overlay-editor.js.map +1 -0
  151. package/dist/cjs/internal/data-grid-overlay-editor/private/markdown-overlay-editor-style.js +76 -0
  152. package/dist/cjs/internal/data-grid-overlay-editor/private/markdown-overlay-editor-style.js.map +1 -0
  153. package/dist/cjs/internal/data-grid-overlay-editor/private/markdown-overlay-editor.js +32 -0
  154. package/dist/cjs/internal/data-grid-overlay-editor/private/markdown-overlay-editor.js.map +1 -0
  155. package/dist/cjs/internal/data-grid-overlay-editor/private/number-overlay-editor-style.js +15 -0
  156. package/dist/cjs/internal/data-grid-overlay-editor/private/number-overlay-editor-style.js.map +1 -0
  157. package/dist/cjs/internal/data-grid-overlay-editor/private/number-overlay-editor.js +30 -0
  158. package/dist/cjs/internal/data-grid-overlay-editor/private/number-overlay-editor.js.map +1 -0
  159. package/dist/cjs/internal/data-grid-overlay-editor/private/uri-overlay-editor-style.js +53 -0
  160. package/dist/cjs/internal/data-grid-overlay-editor/private/uri-overlay-editor-style.js.map +1 -0
  161. package/dist/cjs/internal/data-grid-overlay-editor/private/uri-overlay-editor.js +21 -0
  162. package/dist/cjs/internal/data-grid-overlay-editor/private/uri-overlay-editor.js.map +1 -0
  163. package/dist/cjs/internal/data-grid-overlay-editor/use-stay-on-screen.js +47 -0
  164. package/dist/cjs/internal/data-grid-overlay-editor/use-stay-on-screen.js.map +1 -0
  165. package/dist/cjs/internal/data-grid-search/data-grid-search-style.js +96 -0
  166. package/dist/cjs/internal/data-grid-search/data-grid-search-style.js.map +1 -0
  167. package/dist/cjs/internal/data-grid-search/data-grid-search.js +297 -0
  168. package/dist/cjs/internal/data-grid-search/data-grid-search.js.map +1 -0
  169. package/dist/cjs/internal/growing-entry/growing-entry-style.js +60 -0
  170. package/dist/cjs/internal/growing-entry/growing-entry-style.js.map +1 -0
  171. package/dist/cjs/internal/growing-entry/growing-entry.js +41 -0
  172. package/dist/cjs/internal/growing-entry/growing-entry.js.map +1 -0
  173. package/dist/cjs/internal/markdown-div/markdown-div.js +41 -0
  174. package/dist/cjs/internal/markdown-div/markdown-div.js.map +1 -0
  175. package/dist/cjs/internal/markdown-div/private/markdown-container.js +19 -0
  176. package/dist/cjs/internal/markdown-div/private/markdown-container.js.map +1 -0
  177. package/dist/cjs/internal/scrolling-data-grid/infinite-scroller.js +265 -0
  178. package/dist/cjs/internal/scrolling-data-grid/infinite-scroller.js.map +1 -0
  179. package/dist/cjs/internal/scrolling-data-grid/scrolling-data-grid.js +155 -0
  180. package/dist/cjs/internal/scrolling-data-grid/scrolling-data-grid.js.map +1 -0
  181. package/dist/cjs/internal/scrolling-data-grid/use-kinetic-scroll.js +65 -0
  182. package/dist/cjs/internal/scrolling-data-grid/use-kinetic-scroll.js.map +1 -0
  183. package/dist/dts/cells/boolean-cell.d.ts +4 -0
  184. package/dist/dts/cells/boolean-cell.d.ts.map +1 -0
  185. package/dist/dts/cells/bubble-cell.d.ts +4 -0
  186. package/dist/dts/cells/bubble-cell.d.ts.map +1 -0
  187. package/dist/dts/cells/cell-types.d.ts +89 -0
  188. package/dist/dts/cells/cell-types.d.ts.map +1 -0
  189. package/dist/dts/cells/drilldown-cell.d.ts +4 -0
  190. package/dist/dts/cells/drilldown-cell.d.ts.map +1 -0
  191. package/dist/dts/cells/image-cell.d.ts +5 -0
  192. package/dist/dts/cells/image-cell.d.ts.map +1 -0
  193. package/dist/dts/cells/index.d.ts +4 -0
  194. package/dist/dts/cells/index.d.ts.map +1 -0
  195. package/dist/dts/cells/loading-cell.d.ts +4 -0
  196. package/dist/dts/cells/loading-cell.d.ts.map +1 -0
  197. package/dist/dts/cells/markdown-cell.d.ts +4 -0
  198. package/dist/dts/cells/markdown-cell.d.ts.map +1 -0
  199. package/dist/dts/cells/marker-cell.d.ts +4 -0
  200. package/dist/dts/cells/marker-cell.d.ts.map +1 -0
  201. package/dist/dts/cells/new-row-cell.d.ts +4 -0
  202. package/dist/dts/cells/new-row-cell.d.ts.map +1 -0
  203. package/dist/dts/cells/number-cell.d.ts +4 -0
  204. package/dist/dts/cells/number-cell.d.ts.map +1 -0
  205. package/dist/dts/cells/protected-cell.d.ts +4 -0
  206. package/dist/dts/cells/protected-cell.d.ts.map +1 -0
  207. package/dist/dts/cells/row-id-cell.d.ts +4 -0
  208. package/dist/dts/cells/row-id-cell.d.ts.map +1 -0
  209. package/dist/dts/cells/text-cell.d.ts +4 -0
  210. package/dist/dts/cells/text-cell.d.ts.map +1 -0
  211. package/dist/dts/cells/uri-cell.d.ts +4 -0
  212. package/dist/dts/cells/uri-cell.d.ts.map +1 -0
  213. package/dist/dts/common/browser-detect.d.ts +11 -0
  214. package/dist/dts/common/browser-detect.d.ts.map +1 -0
  215. package/dist/dts/common/image-window-loader.d.ts +15 -0
  216. package/dist/dts/common/image-window-loader.d.ts.map +1 -0
  217. package/dist/dts/common/is-hotkey.d.ts +7 -0
  218. package/dist/dts/common/is-hotkey.d.ts.map +1 -0
  219. package/dist/dts/common/math.d.ts +20 -0
  220. package/dist/dts/common/math.d.ts.map +1 -0
  221. package/dist/dts/common/render-state-provider.d.ts +20 -0
  222. package/dist/dts/common/render-state-provider.d.ts.map +1 -0
  223. package/dist/dts/common/resize-detector.d.ts +11 -0
  224. package/dist/dts/common/resize-detector.d.ts.map +1 -0
  225. package/dist/dts/common/styles.d.ts +61 -0
  226. package/dist/dts/common/styles.d.ts.map +1 -0
  227. package/dist/dts/common/support.d.ts +13 -0
  228. package/dist/dts/common/support.d.ts.map +1 -0
  229. package/dist/dts/common/utils.d.ts +38 -0
  230. package/dist/dts/common/utils.d.ts.map +1 -0
  231. package/dist/dts/data-editor/copy-paste.d.ts +22 -0
  232. package/dist/dts/data-editor/copy-paste.d.ts.map +1 -0
  233. package/dist/dts/data-editor/data-editor-fns.d.ts +16 -0
  234. package/dist/dts/data-editor/data-editor-fns.d.ts.map +1 -0
  235. package/dist/dts/data-editor/data-editor-keybindings.d.ts +62 -0
  236. package/dist/dts/data-editor/data-editor-keybindings.d.ts.map +1 -0
  237. package/dist/dts/data-editor/data-editor.d.ts +532 -0
  238. package/dist/dts/data-editor/data-editor.d.ts.map +1 -0
  239. package/dist/dts/data-editor/group-rename.d.ts +12 -0
  240. package/dist/dts/data-editor/group-rename.d.ts.map +1 -0
  241. package/dist/dts/data-editor/row-grouping-api.d.ts +21 -0
  242. package/dist/dts/data-editor/row-grouping-api.d.ts.map +1 -0
  243. package/dist/dts/data-editor/row-grouping.d.ts +82 -0
  244. package/dist/dts/data-editor/row-grouping.d.ts.map +1 -0
  245. package/dist/dts/data-editor/use-autoscroll.d.ts +4 -0
  246. package/dist/dts/data-editor/use-autoscroll.d.ts.map +1 -0
  247. package/dist/dts/data-editor/use-cells-for-selection.d.ts +7 -0
  248. package/dist/dts/data-editor/use-cells-for-selection.d.ts.map +1 -0
  249. package/dist/dts/data-editor/use-column-sizer.d.ts +11 -0
  250. package/dist/dts/data-editor/use-column-sizer.d.ts.map +1 -0
  251. package/dist/dts/data-editor/use-initial-scroll-offset.d.ts +9 -0
  252. package/dist/dts/data-editor/use-initial-scroll-offset.d.ts.map +1 -0
  253. package/dist/dts/data-editor/use-rem-adjuster.d.ts +22 -0
  254. package/dist/dts/data-editor/use-rem-adjuster.d.ts.map +1 -0
  255. package/dist/dts/data-editor/visible-region.d.ts +19 -0
  256. package/dist/dts/data-editor/visible-region.d.ts.map +1 -0
  257. package/dist/dts/data-editor-all.d.ts +8 -0
  258. package/dist/dts/data-editor-all.d.ts.map +1 -0
  259. package/dist/dts/index.d.ts +52 -0
  260. package/dist/dts/index.d.ts.map +1 -0
  261. package/dist/dts/internal/click-outside-container/click-outside-container.d.ts +15 -0
  262. package/dist/dts/internal/click-outside-container/click-outside-container.d.ts.map +1 -0
  263. package/dist/dts/internal/data-editor-container/data-grid-container.d.ts +10 -0
  264. package/dist/dts/internal/data-editor-container/data-grid-container.d.ts.map +1 -0
  265. package/dist/dts/internal/data-grid/animation-manager.d.ts +26 -0
  266. package/dist/dts/internal/data-grid/animation-manager.d.ts.map +1 -0
  267. package/dist/dts/internal/data-grid/cell-set.d.ts +17 -0
  268. package/dist/dts/internal/data-grid/cell-set.d.ts.map +1 -0
  269. package/dist/dts/internal/data-grid/color-parser.d.ts +16 -0
  270. package/dist/dts/internal/data-grid/color-parser.d.ts.map +1 -0
  271. package/dist/dts/internal/data-grid/data-grid-sprites.d.ts +35 -0
  272. package/dist/dts/internal/data-grid/data-grid-sprites.d.ts.map +1 -0
  273. package/dist/dts/internal/data-grid/data-grid-types.d.ts +443 -0
  274. package/dist/dts/internal/data-grid/data-grid-types.d.ts.map +1 -0
  275. package/dist/dts/internal/data-grid/data-grid.d.ts +244 -0
  276. package/dist/dts/internal/data-grid/data-grid.d.ts.map +1 -0
  277. package/dist/dts/internal/data-grid/event-args.d.ts +117 -0
  278. package/dist/dts/internal/data-grid/event-args.d.ts.map +1 -0
  279. package/dist/dts/internal/data-grid/image-window-loader-interface.d.ts +9 -0
  280. package/dist/dts/internal/data-grid/image-window-loader-interface.d.ts.map +1 -0
  281. package/dist/dts/internal/data-grid/render/data-grid-lib.d.ts +60 -0
  282. package/dist/dts/internal/data-grid/render/data-grid-lib.d.ts.map +1 -0
  283. package/dist/dts/internal/data-grid/render/data-grid-render.blit.d.ts +20 -0
  284. package/dist/dts/internal/data-grid/render/data-grid-render.blit.d.ts.map +1 -0
  285. package/dist/dts/internal/data-grid/render/data-grid-render.cells.d.ts +32 -0
  286. package/dist/dts/internal/data-grid/render/data-grid-render.cells.d.ts.map +1 -0
  287. package/dist/dts/internal/data-grid/render/data-grid-render.d.ts +3 -0
  288. package/dist/dts/internal/data-grid/render/data-grid-render.d.ts.map +1 -0
  289. package/dist/dts/internal/data-grid/render/data-grid-render.header.d.ts +22 -0
  290. package/dist/dts/internal/data-grid/render/data-grid-render.header.d.ts.map +1 -0
  291. package/dist/dts/internal/data-grid/render/data-grid-render.lines.d.ts +10 -0
  292. package/dist/dts/internal/data-grid/render/data-grid-render.lines.d.ts.map +1 -0
  293. package/dist/dts/internal/data-grid/render/data-grid-render.walk.d.ts +14 -0
  294. package/dist/dts/internal/data-grid/render/data-grid-render.walk.d.ts.map +1 -0
  295. package/dist/dts/internal/data-grid/render/data-grid.render.rings.d.ts +8 -0
  296. package/dist/dts/internal/data-grid/render/data-grid.render.rings.d.ts.map +1 -0
  297. package/dist/dts/internal/data-grid/render/draw-checkbox.d.ts +4 -0
  298. package/dist/dts/internal/data-grid/render/draw-checkbox.d.ts.map +1 -0
  299. package/dist/dts/internal/data-grid/render/draw-edit-hover-indicator.d.ts +4 -0
  300. package/dist/dts/internal/data-grid/render/draw-edit-hover-indicator.d.ts.map +1 -0
  301. package/dist/dts/internal/data-grid/render/draw-grid-arg.d.ts +73 -0
  302. package/dist/dts/internal/data-grid/render/draw-grid-arg.d.ts.map +1 -0
  303. package/dist/dts/internal/data-grid/sprites.d.ts +34 -0
  304. package/dist/dts/internal/data-grid/sprites.d.ts.map +1 -0
  305. package/dist/dts/internal/data-grid/use-animation-queue.d.ts +5 -0
  306. package/dist/dts/internal/data-grid/use-animation-queue.d.ts.map +1 -0
  307. package/dist/dts/internal/data-grid/use-selection-behavior.d.ts +13 -0
  308. package/dist/dts/internal/data-grid/use-selection-behavior.d.ts.map +1 -0
  309. package/dist/dts/internal/data-grid-dnd/data-grid-dnd.d.ts +63 -0
  310. package/dist/dts/internal/data-grid-dnd/data-grid-dnd.d.ts.map +1 -0
  311. package/dist/dts/internal/data-grid-overlay-editor/data-grid-overlay-editor-style.d.ts +9 -0
  312. package/dist/dts/internal/data-grid-overlay-editor/data-grid-overlay-editor-style.d.ts.map +1 -0
  313. package/dist/dts/internal/data-grid-overlay-editor/data-grid-overlay-editor.d.ts +32 -0
  314. package/dist/dts/internal/data-grid-overlay-editor/data-grid-overlay-editor.d.ts.map +1 -0
  315. package/dist/dts/internal/data-grid-overlay-editor/private/bubbles-overlay-editor-style.d.ts +2 -0
  316. package/dist/dts/internal/data-grid-overlay-editor/private/bubbles-overlay-editor-style.d.ts.map +1 -0
  317. package/dist/dts/internal/data-grid-overlay-editor/private/bubbles-overlay-editor.d.ts +7 -0
  318. package/dist/dts/internal/data-grid-overlay-editor/private/bubbles-overlay-editor.d.ts.map +1 -0
  319. package/dist/dts/internal/data-grid-overlay-editor/private/drilldown-overlay-editor.d.ts +8 -0
  320. package/dist/dts/internal/data-grid-overlay-editor/private/drilldown-overlay-editor.d.ts.map +1 -0
  321. package/dist/dts/internal/data-grid-overlay-editor/private/image-overlay-editor-style.d.ts +2 -0
  322. package/dist/dts/internal/data-grid-overlay-editor/private/image-overlay-editor-style.d.ts.map +1 -0
  323. package/dist/dts/internal/data-grid-overlay-editor/private/image-overlay-editor.d.ts +13 -0
  324. package/dist/dts/internal/data-grid-overlay-editor/private/image-overlay-editor.d.ts.map +1 -0
  325. package/dist/dts/internal/data-grid-overlay-editor/private/markdown-overlay-editor-style.d.ts +6 -0
  326. package/dist/dts/internal/data-grid-overlay-editor/private/markdown-overlay-editor-style.d.ts.map +1 -0
  327. package/dist/dts/internal/data-grid-overlay-editor/private/markdown-overlay-editor.d.ts +14 -0
  328. package/dist/dts/internal/data-grid-overlay-editor/private/markdown-overlay-editor.d.ts.map +1 -0
  329. package/dist/dts/internal/data-grid-overlay-editor/private/number-overlay-editor-style.d.ts +2 -0
  330. package/dist/dts/internal/data-grid-overlay-editor/private/number-overlay-editor-style.d.ts.map +1 -0
  331. package/dist/dts/internal/data-grid-overlay-editor/private/number-overlay-editor.d.ts +17 -0
  332. package/dist/dts/internal/data-grid-overlay-editor/private/number-overlay-editor.d.ts.map +1 -0
  333. package/dist/dts/internal/data-grid-overlay-editor/private/uri-overlay-editor-style.d.ts +2 -0
  334. package/dist/dts/internal/data-grid-overlay-editor/private/uri-overlay-editor-style.d.ts.map +1 -0
  335. package/dist/dts/internal/data-grid-overlay-editor/private/uri-overlay-editor.d.ts +13 -0
  336. package/dist/dts/internal/data-grid-overlay-editor/private/uri-overlay-editor.d.ts.map +1 -0
  337. package/dist/dts/internal/data-grid-overlay-editor/use-stay-on-screen.d.ts +8 -0
  338. package/dist/dts/internal/data-grid-overlay-editor/use-stay-on-screen.d.ts.map +1 -0
  339. package/dist/dts/internal/data-grid-search/data-grid-search-style.d.ts +2 -0
  340. package/dist/dts/internal/data-grid-search/data-grid-search-style.d.ts.map +1 -0
  341. package/dist/dts/internal/data-grid-search/data-grid-search.d.ts +41 -0
  342. package/dist/dts/internal/data-grid-search/data-grid-search.d.ts.map +1 -0
  343. package/dist/dts/internal/growing-entry/growing-entry-style.d.ts +4 -0
  344. package/dist/dts/internal/growing-entry/growing-entry-style.d.ts.map +1 -0
  345. package/dist/dts/internal/growing-entry/growing-entry.d.ts +12 -0
  346. package/dist/dts/internal/growing-entry/growing-entry.d.ts.map +1 -0
  347. package/dist/dts/internal/markdown-div/markdown-div.d.ts +14 -0
  348. package/dist/dts/internal/markdown-div/markdown-div.d.ts.map +1 -0
  349. package/dist/dts/internal/markdown-div/private/markdown-container.d.ts +2 -0
  350. package/dist/dts/internal/markdown-div/private/markdown-container.d.ts.map +1 -0
  351. package/dist/dts/internal/scrolling-data-grid/infinite-scroller.d.ts +38 -0
  352. package/dist/dts/internal/scrolling-data-grid/infinite-scroller.d.ts.map +1 -0
  353. package/dist/dts/internal/scrolling-data-grid/scrolling-data-grid.d.ts +57 -0
  354. package/dist/dts/internal/scrolling-data-grid/scrolling-data-grid.d.ts.map +1 -0
  355. package/dist/dts/internal/scrolling-data-grid/use-kinetic-scroll.d.ts +3 -0
  356. package/dist/dts/internal/scrolling-data-grid/use-kinetic-scroll.d.ts.map +1 -0
  357. package/dist/esm/cells/boolean-cell.js +87 -0
  358. package/dist/esm/cells/boolean-cell.js.map +1 -0
  359. package/dist/esm/cells/bubble-cell.js +53 -0
  360. package/dist/esm/cells/bubble-cell.js.map +1 -0
  361. package/dist/esm/cells/cell-types.js +2 -0
  362. package/dist/esm/cells/cell-types.js.map +1 -0
  363. package/dist/esm/cells/drilldown-cell.js +171 -0
  364. package/dist/esm/cells/drilldown-cell.js.map +1 -0
  365. package/dist/esm/cells/image-cell.js +94 -0
  366. package/dist/esm/cells/image-cell.js.map +1 -0
  367. package/dist/esm/cells/index.js +30 -0
  368. package/dist/esm/cells/index.js.map +1 -0
  369. package/dist/esm/cells/loading-cell.js +41 -0
  370. package/dist/esm/cells/loading-cell.js.map +1 -0
  371. package/dist/esm/cells/markdown-cell.js +30 -0
  372. package/dist/esm/cells/markdown-cell.js.map +1 -0
  373. package/dist/esm/cells/marker-cell.js +80 -0
  374. package/dist/esm/cells/marker-cell.js.map +1 -0
  375. package/dist/esm/cells/new-row-cell.js +53 -0
  376. package/dist/esm/cells/new-row-cell.js.map +1 -0
  377. package/dist/esm/cells/number-cell.js +44 -0
  378. package/dist/esm/cells/number-cell.js.map +1 -0
  379. package/dist/esm/cells/protected-cell.js +35 -0
  380. package/dist/esm/cells/protected-cell.js.map +1 -0
  381. package/dist/esm/cells/row-id-cell.js +23 -0
  382. package/dist/esm/cells/row-id-cell.js.map +1 -0
  383. package/dist/esm/cells/text-cell.js +48 -0
  384. package/dist/esm/cells/text-cell.js.map +1 -0
  385. package/dist/esm/cells/uri-cell.js +104 -0
  386. package/dist/esm/cells/uri-cell.js.map +1 -0
  387. package/dist/esm/common/browser-detect.js +20 -0
  388. package/dist/esm/common/browser-detect.js.map +1 -0
  389. package/dist/esm/common/image-window-loader.js +98 -0
  390. package/dist/esm/common/image-window-loader.js.map +1 -0
  391. package/dist/esm/common/is-hotkey.js +76 -0
  392. package/dist/esm/common/is-hotkey.js.map +1 -0
  393. package/dist/esm/common/math.js +297 -0
  394. package/dist/esm/common/math.js.map +1 -0
  395. package/dist/esm/common/render-state-provider.js +70 -0
  396. package/dist/esm/common/render-state-provider.js.map +1 -0
  397. package/dist/esm/common/resize-detector.js +27 -0
  398. package/dist/esm/common/resize-detector.js.map +1 -0
  399. package/dist/esm/common/styles.js +135 -0
  400. package/dist/esm/common/styles.js.map +1 -0
  401. package/dist/esm/common/support.js +60 -0
  402. package/dist/esm/common/support.js.map +1 -0
  403. package/dist/esm/common/utils.js +193 -0
  404. package/dist/esm/common/utils.js.map +1 -0
  405. package/dist/esm/data-editor/copy-paste.js +269 -0
  406. package/dist/esm/data-editor/copy-paste.js.map +1 -0
  407. package/dist/esm/data-editor/data-editor-fns.js +197 -0
  408. package/dist/esm/data-editor/data-editor-fns.js.map +1 -0
  409. package/dist/esm/data-editor/data-editor-keybindings.js +126 -0
  410. package/dist/esm/data-editor/data-editor-keybindings.js.map +1 -0
  411. package/dist/esm/data-editor/data-editor.js +2892 -0
  412. package/dist/esm/data-editor/data-editor.js.map +1 -0
  413. package/dist/esm/data-editor/group-rename.css +2 -0
  414. package/dist/esm/data-editor/group-rename.js +49 -0
  415. package/dist/esm/data-editor/group-rename.js.map +1 -0
  416. package/dist/esm/data-editor/row-grouping-api.js +34 -0
  417. package/dist/esm/data-editor/row-grouping-api.js.map +1 -0
  418. package/dist/esm/data-editor/row-grouping.js +189 -0
  419. package/dist/esm/data-editor/row-grouping.js.map +1 -0
  420. package/dist/esm/data-editor/use-autoscroll.js +36 -0
  421. package/dist/esm/data-editor/use-autoscroll.js.map +1 -0
  422. package/dist/esm/data-editor/use-cells-for-selection.js +53 -0
  423. package/dist/esm/data-editor/use-cells-for-selection.js.map +1 -0
  424. package/dist/esm/data-editor/use-column-sizer.js +189 -0
  425. package/dist/esm/data-editor/use-column-sizer.js.map +1 -0
  426. package/dist/esm/data-editor/use-initial-scroll-offset.js +81 -0
  427. package/dist/esm/data-editor/use-initial-scroll-offset.js.map +1 -0
  428. package/dist/esm/data-editor/use-rem-adjuster.js +29 -0
  429. package/dist/esm/data-editor/use-rem-adjuster.js.map +1 -0
  430. package/dist/esm/data-editor/visible-region.js +2 -0
  431. package/dist/esm/data-editor/visible-region.js.map +1 -0
  432. package/dist/esm/data-editor-all.js +19 -0
  433. package/dist/esm/data-editor-all.js.map +1 -0
  434. package/dist/esm/index.js +36 -0
  435. package/dist/esm/index.js.map +1 -0
  436. package/dist/esm/internal/click-outside-container/click-outside-container.js +34 -0
  437. package/dist/esm/internal/click-outside-container/click-outside-container.js.map +1 -0
  438. package/dist/esm/internal/data-editor-container/data-grid-container.js +36 -0
  439. package/dist/esm/internal/data-editor-container/data-grid-container.js.map +1 -0
  440. package/dist/esm/internal/data-grid/animation-manager.js +95 -0
  441. package/dist/esm/internal/data-grid/animation-manager.js.map +1 -0
  442. package/dist/esm/internal/data-grid/cell-set.js +56 -0
  443. package/dist/esm/internal/data-grid/cell-set.js.map +1 -0
  444. package/dist/esm/internal/data-grid/color-parser.js +122 -0
  445. package/dist/esm/internal/data-grid/color-parser.js.map +1 -0
  446. package/dist/esm/internal/data-grid/data-grid-sprites.js +65 -0
  447. package/dist/esm/internal/data-grid/data-grid-sprites.js.map +1 -0
  448. package/dist/esm/internal/data-grid/data-grid-types.js +299 -0
  449. package/dist/esm/internal/data-grid/data-grid-types.js.map +1 -0
  450. package/dist/esm/internal/data-grid/data-grid.js +1209 -0
  451. package/dist/esm/internal/data-grid/data-grid.js.map +1 -0
  452. package/dist/esm/internal/data-grid/event-args.js +30 -0
  453. package/dist/esm/internal/data-grid/event-args.js.map +1 -0
  454. package/dist/esm/internal/data-grid/image-window-loader-interface.js +2 -0
  455. package/dist/esm/internal/data-grid/image-window-loader-interface.js.map +1 -0
  456. package/dist/esm/internal/data-grid/render/data-grid-lib.js +653 -0
  457. package/dist/esm/internal/data-grid/render/data-grid-lib.js.map +1 -0
  458. package/dist/esm/internal/data-grid/render/data-grid-render.blit.js +219 -0
  459. package/dist/esm/internal/data-grid/render/data-grid-render.blit.js.map +1 -0
  460. package/dist/esm/internal/data-grid/render/data-grid-render.cells.js +370 -0
  461. package/dist/esm/internal/data-grid/render/data-grid-render.cells.js.map +1 -0
  462. package/dist/esm/internal/data-grid/render/data-grid-render.header.js +440 -0
  463. package/dist/esm/internal/data-grid/render/data-grid-render.header.js.map +1 -0
  464. package/dist/esm/internal/data-grid/render/data-grid-render.js +320 -0
  465. package/dist/esm/internal/data-grid/render/data-grid-render.js.map +1 -0
  466. package/dist/esm/internal/data-grid/render/data-grid-render.lines.js +261 -0
  467. package/dist/esm/internal/data-grid/render/data-grid-render.lines.js.map +1 -0
  468. package/dist/esm/internal/data-grid/render/data-grid-render.walk.js +158 -0
  469. package/dist/esm/internal/data-grid/render/data-grid-render.walk.js.map +1 -0
  470. package/dist/esm/internal/data-grid/render/data-grid.render.rings.js +205 -0
  471. package/dist/esm/internal/data-grid/render/data-grid.render.rings.js.map +1 -0
  472. package/dist/esm/internal/data-grid/render/draw-checkbox.js +65 -0
  473. package/dist/esm/internal/data-grid/render/draw-checkbox.js.map +1 -0
  474. package/dist/esm/internal/data-grid/render/draw-edit-hover-indicator.js +38 -0
  475. package/dist/esm/internal/data-grid/render/draw-edit-hover-indicator.js.map +1 -0
  476. package/dist/esm/internal/data-grid/render/draw-grid-arg.js +2 -0
  477. package/dist/esm/internal/data-grid/render/draw-grid-arg.js.map +1 -0
  478. package/dist/esm/internal/data-grid/sprites.js +288 -0
  479. package/dist/esm/internal/data-grid/sprites.js.map +1 -0
  480. package/dist/esm/internal/data-grid/use-animation-queue.js +34 -0
  481. package/dist/esm/internal/data-grid/use-animation-queue.js.map +1 -0
  482. package/dist/esm/internal/data-grid/use-selection-behavior.js +112 -0
  483. package/dist/esm/internal/data-grid/use-selection-behavior.js.map +1 -0
  484. package/dist/esm/internal/data-grid-dnd/data-grid-dnd.js +239 -0
  485. package/dist/esm/internal/data-grid-dnd/data-grid-dnd.js.map +1 -0
  486. package/dist/esm/internal/data-grid-overlay-editor/data-grid-overlay-editor-style.js +77 -0
  487. package/dist/esm/internal/data-grid-overlay-editor/data-grid-overlay-editor-style.js.map +1 -0
  488. package/dist/esm/internal/data-grid-overlay-editor/data-grid-overlay-editor.js +124 -0
  489. package/dist/esm/internal/data-grid-overlay-editor/data-grid-overlay-editor.js.map +1 -0
  490. package/dist/esm/internal/data-grid-overlay-editor/private/bubbles-overlay-editor-style.js +34 -0
  491. package/dist/esm/internal/data-grid-overlay-editor/private/bubbles-overlay-editor-style.js.map +1 -0
  492. package/dist/esm/internal/data-grid-overlay-editor/private/bubbles-overlay-editor.js +10 -0
  493. package/dist/esm/internal/data-grid-overlay-editor/private/bubbles-overlay-editor.js.map +1 -0
  494. package/dist/esm/internal/data-grid-overlay-editor/private/drilldown-overlay-editor.js +50 -0
  495. package/dist/esm/internal/data-grid-overlay-editor/private/drilldown-overlay-editor.js.map +1 -0
  496. package/dist/esm/internal/data-grid-overlay-editor/private/image-overlay-editor-style.js +56 -0
  497. package/dist/esm/internal/data-grid-overlay-editor/private/image-overlay-editor-style.js.map +1 -0
  498. package/dist/esm/internal/data-grid-overlay-editor/private/image-overlay-editor.js +21 -0
  499. package/dist/esm/internal/data-grid-overlay-editor/private/image-overlay-editor.js.map +1 -0
  500. package/dist/esm/internal/data-grid-overlay-editor/private/markdown-overlay-editor-style.js +76 -0
  501. package/dist/esm/internal/data-grid-overlay-editor/private/markdown-overlay-editor-style.js.map +1 -0
  502. package/dist/esm/internal/data-grid-overlay-editor/private/markdown-overlay-editor.js +32 -0
  503. package/dist/esm/internal/data-grid-overlay-editor/private/markdown-overlay-editor.js.map +1 -0
  504. package/dist/esm/internal/data-grid-overlay-editor/private/number-overlay-editor-style.js +15 -0
  505. package/dist/esm/internal/data-grid-overlay-editor/private/number-overlay-editor-style.js.map +1 -0
  506. package/dist/esm/internal/data-grid-overlay-editor/private/number-overlay-editor.js +30 -0
  507. package/dist/esm/internal/data-grid-overlay-editor/private/number-overlay-editor.js.map +1 -0
  508. package/dist/esm/internal/data-grid-overlay-editor/private/uri-overlay-editor-style.js +53 -0
  509. package/dist/esm/internal/data-grid-overlay-editor/private/uri-overlay-editor-style.js.map +1 -0
  510. package/dist/esm/internal/data-grid-overlay-editor/private/uri-overlay-editor.js +21 -0
  511. package/dist/esm/internal/data-grid-overlay-editor/private/uri-overlay-editor.js.map +1 -0
  512. package/dist/esm/internal/data-grid-overlay-editor/use-stay-on-screen.js +47 -0
  513. package/dist/esm/internal/data-grid-overlay-editor/use-stay-on-screen.js.map +1 -0
  514. package/dist/esm/internal/data-grid-search/data-grid-search-style.js +96 -0
  515. package/dist/esm/internal/data-grid-search/data-grid-search-style.js.map +1 -0
  516. package/dist/esm/internal/data-grid-search/data-grid-search.js +297 -0
  517. package/dist/esm/internal/data-grid-search/data-grid-search.js.map +1 -0
  518. package/dist/esm/internal/growing-entry/growing-entry-style.js +60 -0
  519. package/dist/esm/internal/growing-entry/growing-entry-style.js.map +1 -0
  520. package/dist/esm/internal/growing-entry/growing-entry.js +41 -0
  521. package/dist/esm/internal/growing-entry/growing-entry.js.map +1 -0
  522. package/dist/esm/internal/markdown-div/markdown-div.js +41 -0
  523. package/dist/esm/internal/markdown-div/markdown-div.js.map +1 -0
  524. package/dist/esm/internal/markdown-div/private/markdown-container.js +19 -0
  525. package/dist/esm/internal/markdown-div/private/markdown-container.js.map +1 -0
  526. package/dist/esm/internal/scrolling-data-grid/infinite-scroller.js +265 -0
  527. package/dist/esm/internal/scrolling-data-grid/infinite-scroller.js.map +1 -0
  528. package/dist/esm/internal/scrolling-data-grid/scrolling-data-grid.js +155 -0
  529. package/dist/esm/internal/scrolling-data-grid/scrolling-data-grid.js.map +1 -0
  530. package/dist/esm/internal/scrolling-data-grid/use-kinetic-scroll.js +65 -0
  531. package/dist/esm/internal/scrolling-data-grid/use-kinetic-scroll.js.map +1 -0
  532. package/dist/index.css +2 -0
  533. package/package.json +81 -0
  534. package/src/cells/boolean-cell.tsx +135 -0
  535. package/src/cells/bubble-cell.tsx +68 -0
  536. package/src/cells/cell-types.ts +124 -0
  537. package/src/cells/drilldown-cell.tsx +244 -0
  538. package/src/cells/image-cell.tsx +117 -0
  539. package/src/cells/index.ts +31 -0
  540. package/src/cells/loading-cell.tsx +56 -0
  541. package/src/cells/markdown-cell.tsx +44 -0
  542. package/src/cells/marker-cell.tsx +110 -0
  543. package/src/cells/new-row-cell.tsx +60 -0
  544. package/src/cells/number-cell.tsx +64 -0
  545. package/src/cells/protected-cell.tsx +42 -0
  546. package/src/cells/row-id-cell.tsx +35 -0
  547. package/src/cells/text-cell.tsx +63 -0
  548. package/src/cells/uri-cell.tsx +155 -0
  549. package/src/common/browser-detect.ts +25 -0
  550. package/src/common/image-window-loader.ts +114 -0
  551. package/src/common/is-hotkey.ts +86 -0
  552. package/src/common/math.ts +357 -0
  553. package/src/common/render-state-provider.ts +87 -0
  554. package/src/common/resize-detector.ts +43 -0
  555. package/src/common/styles.ts +214 -0
  556. package/src/common/support.ts +67 -0
  557. package/src/common/utils.tsx +284 -0
  558. package/src/data-editor/copy-paste.ts +320 -0
  559. package/src/data-editor/data-editor-fns.ts +227 -0
  560. package/src/data-editor/data-editor-keybindings.ts +198 -0
  561. package/src/data-editor/data-editor.tsx +4382 -0
  562. package/src/data-editor/group-rename.tsx +67 -0
  563. package/src/data-editor/row-grouping-api.ts +72 -0
  564. package/src/data-editor/row-grouping.ts +326 -0
  565. package/src/data-editor/stories/data-editor-repros.stories.tsx +107 -0
  566. package/src/data-editor/stories/data-editor.stories.tsx +796 -0
  567. package/src/data-editor/stories/utils.tsx +827 -0
  568. package/src/data-editor/use-autoscroll.ts +41 -0
  569. package/src/data-editor/use-cells-for-selection.ts +72 -0
  570. package/src/data-editor/use-column-sizer.ts +253 -0
  571. package/src/data-editor/use-initial-scroll-offset.ts +102 -0
  572. package/src/data-editor/use-rem-adjuster.ts +59 -0
  573. package/src/data-editor/visible-region.ts +20 -0
  574. package/src/data-editor-all.tsx +36 -0
  575. package/src/docs/00-faq.stories.tsx +63 -0
  576. package/src/docs/01-getting-started.stories.tsx +299 -0
  577. package/src/docs/02-editing-data.stories.tsx +365 -0
  578. package/src/docs/03-grid-column.stories.tsx +146 -0
  579. package/src/docs/04-streaming-data.stories.tsx +434 -0
  580. package/src/docs/05-copy-paste.stories.tsx.tsx +279 -0
  581. package/src/docs/06-search.stories.tsx +219 -0
  582. package/src/docs/07-column-grouping.stories.tsx +212 -0
  583. package/src/docs/08-theming.stories.tsx +409 -0
  584. package/src/docs/09-menus.stories.tsx +344 -0
  585. package/src/docs/doc-wrapper.tsx +512 -0
  586. package/src/docs/examples/add-column.stories.tsx +62 -0
  587. package/src/docs/examples/add-data-to-middle.stories.tsx +93 -0
  588. package/src/docs/examples/add-data-to-top.stories.tsx +70 -0
  589. package/src/docs/examples/add-data.stories.tsx +74 -0
  590. package/src/docs/examples/all-cell-kinds.stories.tsx +61 -0
  591. package/src/docs/examples/append-row-handle.stories.tsx +79 -0
  592. package/src/docs/examples/automatic-row-markers.stories.tsx +57 -0
  593. package/src/docs/examples/built-in-search.stories.tsx +83 -0
  594. package/src/docs/examples/cell-activated-event.stories.tsx +92 -0
  595. package/src/docs/examples/column-group-collapse.stories.tsx +105 -0
  596. package/src/docs/examples/column-groups.stories.tsx +51 -0
  597. package/src/docs/examples/content-alignment.stories.tsx +64 -0
  598. package/src/docs/examples/controlled-search.stories.tsx +93 -0
  599. package/src/docs/examples/controlled-selection.stories.tsx +98 -0
  600. package/src/docs/examples/copy-support.stories.tsx +63 -0
  601. package/src/docs/examples/custom-editors.stories.tsx +90 -0
  602. package/src/docs/examples/custom-event-target.stories.tsx +157 -0
  603. package/src/docs/examples/custom-group-header.stories.tsx +423 -0
  604. package/src/docs/examples/custom-header-icons.stories.tsx +76 -0
  605. package/src/docs/examples/custom-header.stories.tsx +67 -0
  606. package/src/docs/examples/custom-renderers.stories.tsx +72 -0
  607. package/src/docs/examples/drag-source.stories.tsx +63 -0
  608. package/src/docs/examples/drop-events.stories.tsx +155 -0
  609. package/src/docs/examples/fill-handle.stories.tsx +118 -0
  610. package/src/docs/examples/freeze-columns.stories.tsx +59 -0
  611. package/src/docs/examples/freeze-rows.stories.tsx +71 -0
  612. package/src/docs/examples/get-mouse-args.stories.tsx +61 -0
  613. package/src/docs/examples/header-menus.stories.tsx +162 -0
  614. package/src/docs/examples/highlight-cells.stories.tsx +84 -0
  615. package/src/docs/examples/imperative-scroll.stories.tsx +96 -0
  616. package/src/docs/examples/input-blending.stories.tsx +116 -0
  617. package/src/docs/examples/keybindings.stories.tsx +90 -0
  618. package/src/docs/examples/layout-integration.stories.tsx +48 -0
  619. package/src/docs/examples/multi-level-column-groups.stories.tsx +119 -0
  620. package/src/docs/examples/multi-select-columns.stories.tsx +47 -0
  621. package/src/docs/examples/new-column-button.stories.tsx +56 -0
  622. package/src/docs/examples/obscured-grid.stories.tsx +70 -0
  623. package/src/docs/examples/observe-visible-region.stories.tsx +56 -0
  624. package/src/docs/examples/one-hundred-thousand-columns.stories.tsx +31 -0
  625. package/src/docs/examples/one-million-rows.stories.tsx +37 -0
  626. package/src/docs/examples/overscroll.stories.tsx +74 -0
  627. package/src/docs/examples/padding.stories.tsx +74 -0
  628. package/src/docs/examples/paste-support.stories.tsx +73 -0
  629. package/src/docs/examples/prevent-diagonal-scroll.stories.tsx +47 -0
  630. package/src/docs/examples/rapid-updates.stories.tsx +108 -0
  631. package/src/docs/examples/rearrange-columns.stories.tsx +76 -0
  632. package/src/docs/examples/reorder-rows.stories.tsx +83 -0
  633. package/src/docs/examples/resizable-columns.stories.tsx +67 -0
  634. package/src/docs/examples/right-element.stories.tsx +87 -0
  635. package/src/docs/examples/right-to-left.stories.tsx +73 -0
  636. package/src/docs/examples/row-and-header-sizes.stories.tsx +75 -0
  637. package/src/docs/examples/row-grouping.stories.tsx +142 -0
  638. package/src/docs/examples/row-hover.stories.tsx +67 -0
  639. package/src/docs/examples/row-markers.stories.tsx +74 -0
  640. package/src/docs/examples/row-selections.stories.tsx +84 -0
  641. package/src/docs/examples/scaled-view.stories.tsx +36 -0
  642. package/src/docs/examples/scroll-offset.stories.tsx +49 -0
  643. package/src/docs/examples/scroll-shadows.stories.tsx +83 -0
  644. package/src/docs/examples/search-as-filter.stories.tsx +76 -0
  645. package/src/docs/examples/selection-serialization.stories.tsx +208 -0
  646. package/src/docs/examples/server-side-data.stories.tsx +219 -0
  647. package/src/docs/examples/shadow-dom.stories.tsx +107 -0
  648. package/src/docs/examples/silly-numbers.stories.tsx +40 -0
  649. package/src/docs/examples/small-editable-grid.stories.tsx +39 -0
  650. package/src/docs/examples/smooth-scrolling-grid.stories.tsx +56 -0
  651. package/src/docs/examples/span-cell.stories.tsx +99 -0
  652. package/src/docs/examples/stretch-column-size.stories.tsx +55 -0
  653. package/src/docs/examples/ten-million-cells.stories.tsx +34 -0
  654. package/src/docs/examples/theme-per-column.stories.tsx +88 -0
  655. package/src/docs/examples/theme-per-row.stories.tsx +73 -0
  656. package/src/docs/examples/theme-support.stories.tsx +150 -0
  657. package/src/docs/examples/tooltips.stories.tsx +119 -0
  658. package/src/docs/examples/trailing-row-options.stories.tsx +106 -0
  659. package/src/docs/examples/uneven-rows.stories.tsx +44 -0
  660. package/src/docs/examples/validate-data.stories.tsx +63 -0
  661. package/src/docs/examples/wrapping-text.stories.tsx +97 -0
  662. package/src/docs/template.tsx +69 -0
  663. package/src/index.ts +87 -0
  664. package/src/internal/click-outside-container/click-outside-container.tsx +50 -0
  665. package/src/internal/data-editor-container/data-grid-container.tsx +48 -0
  666. package/src/internal/data-grid/animation-manager.ts +119 -0
  667. package/src/internal/data-grid/cell-set.ts +65 -0
  668. package/src/internal/data-grid/color-parser.ts +141 -0
  669. package/src/internal/data-grid/data-grid-sprites.ts +107 -0
  670. package/src/internal/data-grid/data-grid-types.ts +742 -0
  671. package/src/internal/data-grid/data-grid.stories.tsx +410 -0
  672. package/src/internal/data-grid/data-grid.tsx +1978 -0
  673. package/src/internal/data-grid/event-args.ts +157 -0
  674. package/src/internal/data-grid/image-window-loader-interface.ts +9 -0
  675. package/src/internal/data-grid/render/data-grid-lib.ts +906 -0
  676. package/src/internal/data-grid/render/data-grid-render.blit.ts +291 -0
  677. package/src/internal/data-grid/render/data-grid-render.cells.ts +564 -0
  678. package/src/internal/data-grid/render/data-grid-render.header.ts +842 -0
  679. package/src/internal/data-grid/render/data-grid-render.lines.ts +379 -0
  680. package/src/internal/data-grid/render/data-grid-render.ts +825 -0
  681. package/src/internal/data-grid/render/data-grid-render.walk.ts +243 -0
  682. package/src/internal/data-grid/render/data-grid.render.rings.ts +348 -0
  683. package/src/internal/data-grid/render/draw-checkbox.ts +122 -0
  684. package/src/internal/data-grid/render/draw-edit-hover-indicator.ts +61 -0
  685. package/src/internal/data-grid/render/draw-grid-arg.ts +85 -0
  686. package/src/internal/data-grid/sprites.ts +321 -0
  687. package/src/internal/data-grid/use-animation-queue.ts +41 -0
  688. package/src/internal/data-grid/use-selection-behavior.ts +152 -0
  689. package/src/internal/data-grid-dnd/data-grid-dnd.tsx +450 -0
  690. package/src/internal/data-grid-overlay-editor/data-grid-overlay-editor-style.tsx +83 -0
  691. package/src/internal/data-grid-overlay-editor/data-grid-overlay-editor.tsx +262 -0
  692. package/src/internal/data-grid-overlay-editor/private/bubbles-overlay-editor-style.tsx +34 -0
  693. package/src/internal/data-grid-overlay-editor/private/bubbles-overlay-editor.tsx +21 -0
  694. package/src/internal/data-grid-overlay-editor/private/drilldown-overlay-editor.tsx +63 -0
  695. package/src/internal/data-grid-overlay-editor/private/image-overlay-editor-style.tsx +56 -0
  696. package/src/internal/data-grid-overlay-editor/private/image-overlay-editor.tsx +51 -0
  697. package/src/internal/data-grid-overlay-editor/private/markdown-overlay-editor-style.tsx +80 -0
  698. package/src/internal/data-grid-overlay-editor/private/markdown-overlay-editor.tsx +65 -0
  699. package/src/internal/data-grid-overlay-editor/private/number-overlay-editor-style.tsx +15 -0
  700. package/src/internal/data-grid-overlay-editor/private/number-overlay-editor.tsx +77 -0
  701. package/src/internal/data-grid-overlay-editor/private/uri-overlay-editor-style.tsx +53 -0
  702. package/src/internal/data-grid-overlay-editor/private/uri-overlay-editor.tsx +52 -0
  703. package/src/internal/data-grid-overlay-editor/use-stay-on-screen.ts +61 -0
  704. package/src/internal/data-grid-search/data-grid-search-style.tsx +96 -0
  705. package/src/internal/data-grid-search/data-grid-search.tsx +578 -0
  706. package/src/internal/growing-entry/growing-entry-style.tsx +62 -0
  707. package/src/internal/growing-entry/growing-entry.tsx +74 -0
  708. package/src/internal/markdown-div/markdown-div.tsx +55 -0
  709. package/src/internal/markdown-div/private/markdown-container.tsx +19 -0
  710. package/src/internal/scrolling-data-grid/infinite-scroller.tsx +379 -0
  711. package/src/internal/scrolling-data-grid/scrolling-data-grid.stories.tsx +164 -0
  712. package/src/internal/scrolling-data-grid/scrolling-data-grid.tsx +353 -0
  713. package/src/internal/scrolling-data-grid/use-kinetic-scroll.ts +78 -0
  714. package/src/stories/story-utils.tsx +72 -0
  715. package/test/animation-manager.test.ts +147 -0
  716. package/test/cells.test.tsx +122 -0
  717. package/test/click-outside-container.test.tsx +62 -0
  718. package/test/color-parser.test.ts +68 -0
  719. package/test/common.test.ts +74 -0
  720. package/test/compact-selection.test.ts +221 -0
  721. package/test/copy-paste.test.ts +485 -0
  722. package/test/data-editor-fns.test.ts +153 -0
  723. package/test/data-editor-input.test.tsx +683 -0
  724. package/test/data-editor-resize.test.tsx +271 -0
  725. package/test/data-editor.test.tsx +4945 -0
  726. package/test/data-grid-lib.test.ts +457 -0
  727. package/test/data-grid-overlay.test.tsx +67 -0
  728. package/test/data-grid-types.test.ts +52 -0
  729. package/test/data-grid.test.tsx +399 -0
  730. package/test/image-window-loader.test.ts +211 -0
  731. package/test/math.test.ts +201 -0
  732. package/test/render-state-provider.test.ts +86 -0
  733. package/test/row-grouping-api.test.ts +77 -0
  734. package/test/row-grouping.test.ts +586 -0
  735. package/test/test-utils.tsx +365 -0
  736. package/test/uri-cell.test.ts +124 -0
  737. package/test/use-animation-queue.test.ts +53 -0
  738. package/test/use-autoscroll.test.tsx +108 -0
  739. package/test/use-column-sizer.test.tsx +414 -0
  740. package/test/use-deep-memo.test.ts +41 -0
  741. package/test/use-kinetic-scroll.test.ts +57 -0
  742. package/test/use-rem-adjuster.test.ts +69 -0
  743. package/test/utils.test.ts +127 -0
  744. package/vitest.config.ts +40 -0
  745. package/vitest.setup.ts +13 -0
@@ -0,0 +1,842 @@
1
+ import { intersectRect, pointInRect } from "../../../common/math.js";
2
+ import { mergeAndRealizeTheme, type FullTheme } from "../../../common/styles.js";
3
+ import { direction } from "../../../common/utils.js";
4
+ import type { HoverValues } from "../animation-manager.js";
5
+ import type { CellSet } from "../cell-set.js";
6
+ import { withAlpha } from "../color-parser.js";
7
+ import type { SpriteManager, SpriteVariant } from "../data-grid-sprites.js";
8
+ import {
9
+ GridColumnMenuIcon,
10
+ type DrawHeaderCallback,
11
+ type DrawGroupHeaderCallback,
12
+ type GridSelection,
13
+ type Rectangle,
14
+ } from "../data-grid-types.js";
15
+ import {
16
+ drawMenuDots,
17
+ getMeasuredTextCache,
18
+ getMiddleCenterBias,
19
+ measureTextCached,
20
+ roundedPoly,
21
+ type MappedGridColumn,
22
+ } from "./data-grid-lib.js";
23
+ import type { GroupDetails, GroupDetailsCallback } from "./data-grid-render.cells.js";
24
+ import { walkColumns, walkGroups, getGroupLevels, getTotalGroupHeaderHeight } from "./data-grid-render.walk.js";
25
+ import { drawCheckbox } from "./draw-checkbox.js";
26
+ import type { DragAndDropState, HoverInfo } from "./draw-grid-arg.js";
27
+
28
+ export function drawGridHeaders(
29
+ ctx: CanvasRenderingContext2D,
30
+ effectiveCols: readonly MappedGridColumn[],
31
+ enableGroups: boolean,
32
+ hovered: HoverInfo | undefined,
33
+ width: number,
34
+ translateX: number,
35
+ headerHeight: number,
36
+ groupHeaderHeight: number | number[],
37
+ dragAndDropState: DragAndDropState | undefined,
38
+ isResizing: boolean,
39
+ selection: GridSelection,
40
+ outerTheme: FullTheme,
41
+ spriteManager: SpriteManager,
42
+ hoverValues: HoverValues,
43
+ verticalBorder: (col: number) => boolean,
44
+ getGroupDetails: GroupDetailsCallback,
45
+ damage: CellSet | undefined,
46
+ drawHeaderCallback: DrawHeaderCallback | undefined,
47
+ drawGroupHeaderCallback: DrawGroupHeaderCallback | undefined,
48
+ touchMode: boolean
49
+ ) {
50
+ const totalGroupHeaderHeight = getTotalGroupHeaderHeight(groupHeaderHeight, effectiveCols);
51
+ const totalHeaderHeight = headerHeight + totalGroupHeaderHeight;
52
+ if (totalHeaderHeight <= 0) return;
53
+
54
+ ctx.fillStyle = outerTheme.bgHeader;
55
+ ctx.fillRect(0, 0, width, totalHeaderHeight);
56
+
57
+ const hCol = hovered?.[0]?.[0];
58
+ const hRow = hovered?.[0]?.[1];
59
+ const hPosX = hovered?.[1]?.[0];
60
+ const hPosY = hovered?.[1]?.[1];
61
+
62
+ const font = outerTheme.headerFontFull;
63
+ // Assinging the context font too much can be expensive, it can be worth it to minimze this
64
+ ctx.font = font;
65
+ walkColumns(effectiveCols, 0, translateX, 0, totalHeaderHeight, (c, x, _y, clipX) => {
66
+ if (damage !== undefined && !damage.has([c.sourceIndex, -1])) return;
67
+ const diff = Math.max(0, clipX - x);
68
+ ctx.save();
69
+ ctx.beginPath();
70
+ ctx.rect(x + diff, totalGroupHeaderHeight, c.width - diff, headerHeight);
71
+ ctx.clip();
72
+
73
+ const groupName = Array.isArray(c.group) ? (c.group[0] ?? "") : (c.group ?? "");
74
+ const groupTheme = getGroupDetails(groupName).overrideTheme;
75
+ const theme =
76
+ c.themeOverride === undefined && groupTheme === undefined
77
+ ? outerTheme
78
+ : mergeAndRealizeTheme(outerTheme, groupTheme, c.themeOverride);
79
+
80
+ if (theme.bgHeader !== outerTheme.bgHeader) {
81
+ ctx.fillStyle = theme.bgHeader;
82
+ ctx.fill();
83
+ }
84
+
85
+ if (theme !== outerTheme) {
86
+ ctx.font = theme.headerFontFull;
87
+ }
88
+ const selected = selection.columns.hasIndex(c.sourceIndex);
89
+ const noHover = dragAndDropState !== undefined || isResizing || c.headerRowMarkerDisabled === true;
90
+ const hoveredBoolean = !noHover && hRow === -1 && hCol === c.sourceIndex;
91
+ const hover = noHover
92
+ ? 0
93
+ : (hoverValues.find(s => s.item[0] === c.sourceIndex && s.item[1] === -1)?.hoverAmount ?? 0);
94
+
95
+ const hasSelectedCell = selection?.current !== undefined && selection.current.cell[0] === c.sourceIndex;
96
+
97
+ const bgFillStyle = selected ? theme.accentColor : hasSelectedCell ? theme.bgHeaderHasFocus : theme.bgHeader;
98
+
99
+ const y = enableGroups ? totalGroupHeaderHeight : 0;
100
+ const xOffset = c.sourceIndex === 0 ? 0 : 1;
101
+
102
+ if (selected) {
103
+ ctx.fillStyle = bgFillStyle;
104
+ ctx.fillRect(x + xOffset, y, c.width - xOffset, headerHeight);
105
+ } else if (hasSelectedCell || hover > 0) {
106
+ ctx.beginPath();
107
+ ctx.rect(x + xOffset, y, c.width - xOffset, headerHeight);
108
+ if (hasSelectedCell) {
109
+ ctx.fillStyle = theme.bgHeaderHasFocus;
110
+ ctx.fill();
111
+ }
112
+ if (hover > 0) {
113
+ ctx.globalAlpha = hover;
114
+ ctx.fillStyle = theme.bgHeaderHovered;
115
+ ctx.fill();
116
+ ctx.globalAlpha = 1;
117
+ }
118
+ }
119
+
120
+ drawHeader(
121
+ ctx,
122
+ x,
123
+ y,
124
+ c.width,
125
+ headerHeight,
126
+ c,
127
+ selected,
128
+ theme,
129
+ hoveredBoolean,
130
+ hoveredBoolean ? hPosX : undefined,
131
+ hoveredBoolean ? hPosY : undefined,
132
+ hasSelectedCell,
133
+ hover,
134
+ spriteManager,
135
+ drawHeaderCallback,
136
+ touchMode
137
+ );
138
+ ctx.restore();
139
+ });
140
+
141
+ if (enableGroups) {
142
+ drawGroups(
143
+ ctx,
144
+ effectiveCols,
145
+ width,
146
+ translateX,
147
+ groupHeaderHeight,
148
+ hovered,
149
+ outerTheme,
150
+ spriteManager,
151
+ hoverValues,
152
+ verticalBorder,
153
+ getGroupDetails,
154
+ damage,
155
+ selection,
156
+ drawGroupHeaderCallback
157
+ );
158
+ }
159
+ }
160
+
161
+ export function drawGroups(
162
+ ctx: CanvasRenderingContext2D,
163
+ effectiveCols: readonly MappedGridColumn[],
164
+ width: number,
165
+ translateX: number,
166
+ groupHeaderHeight: number | number[],
167
+ hovered: HoverInfo | undefined,
168
+ theme: FullTheme,
169
+ spriteManager: SpriteManager,
170
+ _hoverValues: HoverValues,
171
+ verticalBorder: (col: number) => boolean,
172
+ getGroupDetails: GroupDetailsCallback,
173
+ damage: CellSet | undefined,
174
+ selection?: GridSelection,
175
+ drawGroupHeaderCallback?: DrawGroupHeaderCallback
176
+ ) {
177
+ const levels = getGroupLevels(effectiveCols);
178
+ if (levels === 0) return;
179
+
180
+ const heights = Array.isArray(groupHeaderHeight)
181
+ ? groupHeaderHeight
182
+ : Array.from({ length: levels }, () => groupHeaderHeight);
183
+
184
+ let currentY = 0;
185
+
186
+ for (let level = 0; level < levels; level++) {
187
+ const levelHeight = heights[level] ?? heights[0] ?? 0;
188
+ if (levelHeight <= 0) continue;
189
+ drawGroupLevel(
190
+ ctx,
191
+ effectiveCols,
192
+ width,
193
+ translateX,
194
+ levelHeight,
195
+ currentY,
196
+ level,
197
+ hovered,
198
+ theme,
199
+ spriteManager,
200
+ _hoverValues,
201
+ verticalBorder,
202
+ getGroupDetails,
203
+ damage,
204
+ selection,
205
+ drawGroupHeaderCallback
206
+ );
207
+ currentY += levelHeight;
208
+
209
+ // Draw horizontal border between levels
210
+ ctx.beginPath();
211
+ ctx.moveTo(0, currentY + 0.5);
212
+ ctx.lineTo(width, currentY + 0.5);
213
+ ctx.strokeStyle = theme.borderColor;
214
+ ctx.lineWidth = 1;
215
+ ctx.stroke();
216
+ }
217
+ }
218
+
219
+ function drawGroupHeaderInner(
220
+ ctx: CanvasRenderingContext2D,
221
+ x: number,
222
+ y: number,
223
+ width: number,
224
+ height: number,
225
+ groupName: string,
226
+ _level: number,
227
+ span: readonly [number, number],
228
+ isSelected: boolean,
229
+ isHovered: boolean,
230
+ theme: FullTheme,
231
+ groupTheme: FullTheme,
232
+ group: GroupDetails,
233
+ spriteManager: SpriteManager,
234
+ hovered: HoverInfo | undefined,
235
+ verticalBorder: (col: number) => boolean
236
+ ) {
237
+ const xPad = 8;
238
+ const fillColor = isSelected
239
+ ? (groupTheme.accentColor ?? theme.accentColor)
240
+ : isHovered
241
+ ? (groupTheme.bgGroupHeaderHovered ?? groupTheme.bgHeaderHovered)
242
+ : (groupTheme.bgGroupHeader ?? groupTheme.bgHeader);
243
+
244
+ if (fillColor !== theme.bgHeader) {
245
+ ctx.fillStyle = fillColor;
246
+ ctx.fill();
247
+ }
248
+
249
+ ctx.fillStyle = groupTheme.textGroupHeader ?? groupTheme.textHeader;
250
+ if (groupName !== "") {
251
+ let drawX = x;
252
+ if (group?.icon !== undefined) {
253
+ spriteManager.drawSprite(group.icon, "normal", ctx, drawX + xPad, y + (height - 20) / 2, 20, groupTheme);
254
+ drawX += 26;
255
+ }
256
+ if (group?.name !== undefined && group.name !== "") {
257
+ ctx.fillText(group.name, drawX + xPad, y + height / 2 + getMiddleCenterBias(ctx, theme.headerFontFull));
258
+ }
259
+
260
+ if (group?.actions !== undefined && isHovered) {
261
+ const actionBoxes = getActionBoundsForGroup({ x, y, width, height }, group.actions);
262
+
263
+ ctx.beginPath();
264
+ const fadeStartX = actionBoxes[0].x - 10;
265
+ const fadeWidth = x + width - fadeStartX;
266
+ ctx.rect(fadeStartX, y, fadeWidth, height);
267
+ const grad = ctx.createLinearGradient(fadeStartX, 0, fadeStartX + fadeWidth, 0);
268
+ const trans = withAlpha(fillColor, 0);
269
+ grad.addColorStop(0, trans);
270
+ grad.addColorStop(10 / fadeWidth, fillColor);
271
+ grad.addColorStop(1, fillColor);
272
+ ctx.fillStyle = grad;
273
+
274
+ ctx.fill();
275
+
276
+ ctx.globalAlpha = 0.6;
277
+
278
+ // eslint-disable-next-line prefer-const
279
+ const [mouseX, mouseY] = hovered?.[1] ?? [-1, -1];
280
+ for (let i = 0; i < group.actions.length; i++) {
281
+ const action = group.actions[i];
282
+ const box = actionBoxes[i];
283
+ const actionHovered = pointInRect(box, mouseX + x, mouseY + y);
284
+ if (actionHovered) {
285
+ ctx.globalAlpha = 1;
286
+ }
287
+ spriteManager.drawSprite(
288
+ action.icon,
289
+ "normal",
290
+ ctx,
291
+ box.x + box.width / 2 - 10,
292
+ box.y + box.height / 2 - 10,
293
+ 20,
294
+ groupTheme
295
+ );
296
+ if (actionHovered) {
297
+ ctx.globalAlpha = 0.6;
298
+ }
299
+ }
300
+
301
+ ctx.globalAlpha = 1;
302
+ }
303
+ }
304
+
305
+ if (x !== 0 && verticalBorder(span[0])) {
306
+ ctx.beginPath();
307
+ ctx.moveTo(x + 0.5, y);
308
+ ctx.lineTo(x + 0.5, y + height);
309
+ ctx.strokeStyle = theme.borderColor;
310
+ ctx.lineWidth = 1;
311
+ ctx.stroke();
312
+ }
313
+ }
314
+
315
+ function drawGroupLevel(
316
+ ctx: CanvasRenderingContext2D,
317
+ effectiveCols: readonly MappedGridColumn[],
318
+ width: number,
319
+ translateX: number,
320
+ groupHeaderHeight: number,
321
+ yOffset: number,
322
+ level: number,
323
+ hovered: HoverInfo | undefined,
324
+ theme: FullTheme,
325
+ spriteManager: SpriteManager,
326
+ _hoverValues: HoverValues,
327
+ verticalBorder: (col: number) => boolean,
328
+ getGroupDetails: GroupDetailsCallback,
329
+ damage: CellSet | undefined,
330
+ selection?: GridSelection,
331
+ drawGroupHeaderCallback?: DrawGroupHeaderCallback
332
+ ) {
333
+ const [hCol, hRow] = hovered?.[0] ?? [];
334
+ const hPosX = hovered?.[1]?.[0];
335
+ const hPosY = hovered?.[1]?.[1];
336
+ // hRow: -2 is group header, we use -2 - level for multi-level
337
+ const targetRow = -2 - level;
338
+
339
+ let finalX = 0;
340
+ walkGroups(effectiveCols, width, translateX, groupHeaderHeight, level, (span, groupName, x, y, w, h) => {
341
+ if (
342
+ damage !== undefined &&
343
+ !damage.hasItemInRectangle({
344
+ x: span[0],
345
+ y: targetRow,
346
+ width: span[1] - span[0] + 1,
347
+ height: 1,
348
+ })
349
+ )
350
+ return;
351
+ ctx.save();
352
+ ctx.beginPath();
353
+ ctx.rect(x, y + yOffset, w, h);
354
+ ctx.clip();
355
+
356
+ const group = getGroupDetails(groupName);
357
+ const groupTheme =
358
+ group?.overrideTheme === undefined ? theme : mergeAndRealizeTheme(theme, group.overrideTheme);
359
+ const isHovered = hRow === targetRow && hCol !== undefined && hCol >= span[0] && hCol <= span[1];
360
+
361
+ // Check if all columns in this group span are selected
362
+ let isSelected = false;
363
+ if (selection !== undefined) {
364
+ isSelected = selection.columns.hasAll([span[0], span[1] + 1]);
365
+ }
366
+
367
+ if (drawGroupHeaderCallback !== undefined) {
368
+ drawGroupHeaderCallback(
369
+ {
370
+ ctx,
371
+ groupName,
372
+ level,
373
+ span,
374
+ theme: groupTheme,
375
+ rect: { x, y: y + yOffset, width: w, height: h },
376
+ isSelected,
377
+ isHovered,
378
+ spriteManager,
379
+ hoverX: isHovered ? hPosX : undefined,
380
+ hoverY: isHovered ? hPosY : undefined,
381
+ },
382
+ () =>
383
+ drawGroupHeaderInner(
384
+ ctx,
385
+ x,
386
+ y + yOffset,
387
+ w,
388
+ h,
389
+ groupName,
390
+ level,
391
+ span,
392
+ isSelected,
393
+ isHovered,
394
+ theme,
395
+ groupTheme,
396
+ group,
397
+ spriteManager,
398
+ hovered,
399
+ verticalBorder
400
+ )
401
+ );
402
+ } else {
403
+ drawGroupHeaderInner(
404
+ ctx,
405
+ x,
406
+ y + yOffset,
407
+ w,
408
+ h,
409
+ groupName,
410
+ level,
411
+ span,
412
+ isSelected,
413
+ isHovered,
414
+ theme,
415
+ groupTheme,
416
+ group,
417
+ spriteManager,
418
+ hovered,
419
+ verticalBorder
420
+ );
421
+ }
422
+
423
+ ctx.restore();
424
+
425
+ finalX = x + w;
426
+ });
427
+
428
+ ctx.beginPath();
429
+ ctx.moveTo(finalX + 0.5, yOffset);
430
+ ctx.lineTo(finalX + 0.5, yOffset + groupHeaderHeight);
431
+ ctx.strokeStyle = theme.borderColor;
432
+ ctx.lineWidth = 1;
433
+ ctx.stroke();
434
+
435
+ // Horizontal border at the bottom of the last level (level 0 is the bottommost)
436
+ // This will be drawn in drawGroups function between levels
437
+ }
438
+
439
+ const menuButtonSize = 30;
440
+ function getHeaderMenuBounds(x: number, y: number, width: number, height: number, isRtl: boolean): Rectangle {
441
+ if (isRtl) return { x, y, width: menuButtonSize, height: Math.min(menuButtonSize, height) };
442
+ return {
443
+ x: x + width - menuButtonSize, // right align
444
+ y: Math.max(y, y + height / 2 - menuButtonSize / 2), // center vertically
445
+ width: menuButtonSize,
446
+ height: Math.min(menuButtonSize, height),
447
+ };
448
+ }
449
+
450
+ export function getActionBoundsForGroup(
451
+ box: Rectangle,
452
+ actions: NonNullable<GroupDetails["actions"]>
453
+ ): readonly Rectangle[] {
454
+ const result: Rectangle[] = [];
455
+ let x = box.x + box.width - 26 * actions.length;
456
+ const y = box.y + box.height / 2 - 13;
457
+ const height = 26;
458
+ const width = 26;
459
+ for (let i = 0; i < actions.length; i++) {
460
+ result.push({
461
+ x,
462
+ y,
463
+ width,
464
+ height,
465
+ });
466
+ x += 26;
467
+ }
468
+ return result;
469
+ }
470
+
471
+ type Mutable<T> = {
472
+ -readonly [P in keyof T]: T[P];
473
+ };
474
+
475
+ interface HeaderLayout {
476
+ readonly textBounds: Rectangle | undefined;
477
+ readonly iconBounds: Rectangle | undefined;
478
+ readonly iconOverlayBounds: Rectangle | undefined;
479
+ readonly indicatorIconBounds: Rectangle | undefined;
480
+ readonly menuBounds: Rectangle | undefined;
481
+ }
482
+
483
+ function flipHorizontal(
484
+ toFlip: Mutable<Rectangle> | undefined,
485
+ mirrorX: number,
486
+ isRTL: boolean
487
+ ): Mutable<Rectangle> | undefined {
488
+ if (!isRTL || toFlip === undefined) return toFlip;
489
+ toFlip.x = mirrorX - (toFlip.x - mirrorX) - toFlip.width;
490
+ return toFlip;
491
+ }
492
+
493
+ export function computeHeaderLayout(
494
+ ctx: CanvasRenderingContext2D | undefined,
495
+ c: MappedGridColumn,
496
+ x: number,
497
+ y: number,
498
+ width: number,
499
+ height: number,
500
+ theme: FullTheme,
501
+ isRTL: boolean
502
+ ): HeaderLayout {
503
+ const xPad = theme.cellHorizontalPadding;
504
+ const headerIconSize = theme.headerIconSize;
505
+ const menuBounds = getHeaderMenuBounds(x, y, width, height, false);
506
+
507
+ let drawX = x + xPad;
508
+ const iconBounds =
509
+ c.icon === undefined
510
+ ? undefined
511
+ : {
512
+ x: drawX,
513
+ y: y + (height - headerIconSize) / 2,
514
+ width: headerIconSize,
515
+ height: headerIconSize,
516
+ };
517
+
518
+ const iconOverlayBounds =
519
+ iconBounds === undefined || c.overlayIcon === undefined
520
+ ? undefined
521
+ : {
522
+ x: iconBounds.x + 9,
523
+ y: iconBounds.y + 6,
524
+ width: 18,
525
+ height: 18,
526
+ };
527
+
528
+ if (iconBounds !== undefined) {
529
+ drawX += Math.ceil(headerIconSize * 1.3);
530
+ }
531
+
532
+ const textBounds = {
533
+ x: drawX,
534
+ y: y,
535
+ width: width - drawX,
536
+ height: height,
537
+ };
538
+
539
+ let indicatorIconBounds: Rectangle | undefined = undefined;
540
+ if (c.indicatorIcon !== undefined) {
541
+ const textWidth =
542
+ ctx === undefined
543
+ ? (getMeasuredTextCache(c.title, theme.headerFontFull)?.width ?? 0)
544
+ : measureTextCached(c.title, ctx, theme.headerFontFull).width;
545
+ textBounds.width = textWidth;
546
+ drawX += textWidth + xPad;
547
+ indicatorIconBounds = {
548
+ x: drawX,
549
+ y: y + (height - headerIconSize) / 2,
550
+ width: headerIconSize,
551
+ height: headerIconSize,
552
+ };
553
+ }
554
+
555
+ const mirrorPoint = x + width / 2;
556
+
557
+ return {
558
+ menuBounds: flipHorizontal(menuBounds, mirrorPoint, isRTL),
559
+ iconBounds: flipHorizontal(iconBounds, mirrorPoint, isRTL),
560
+ iconOverlayBounds: flipHorizontal(iconOverlayBounds, mirrorPoint, isRTL),
561
+ textBounds: flipHorizontal(textBounds, mirrorPoint, isRTL),
562
+ indicatorIconBounds: flipHorizontal(indicatorIconBounds, mirrorPoint, isRTL),
563
+ };
564
+ }
565
+
566
+ function drawHeaderInner(
567
+ ctx: CanvasRenderingContext2D,
568
+ x: number,
569
+ y: number,
570
+ width: number,
571
+ height: number,
572
+ c: MappedGridColumn,
573
+ selected: boolean,
574
+ theme: FullTheme,
575
+ isHovered: boolean,
576
+ posX: number | undefined,
577
+ posY: number | undefined,
578
+ hoverAmount: number,
579
+ spriteManager: SpriteManager,
580
+ touchMode: boolean,
581
+ isRtl: boolean,
582
+ headerLayout: HeaderLayout
583
+ ) {
584
+ if (c.rowMarker !== undefined && c.headerRowMarkerDisabled !== true) {
585
+ const checked = c.rowMarkerChecked;
586
+ if (checked !== true && c.headerRowMarkerAlwaysVisible !== true) {
587
+ ctx.globalAlpha = hoverAmount;
588
+ }
589
+ const markerTheme =
590
+ c.headerRowMarkerTheme !== undefined ? mergeAndRealizeTheme(theme, c.headerRowMarkerTheme) : theme;
591
+ drawCheckbox(
592
+ ctx,
593
+ markerTheme,
594
+ checked,
595
+ x,
596
+ y,
597
+ width,
598
+ height,
599
+ false,
600
+ undefined,
601
+ undefined,
602
+ theme.checkboxMaxSize,
603
+ "center",
604
+ c.rowMarker
605
+ );
606
+ if (checked !== true && c.headerRowMarkerAlwaysVisible !== true) {
607
+ ctx.globalAlpha = 1;
608
+ }
609
+ return;
610
+ }
611
+
612
+ const fillStyle = selected ? theme.textHeaderSelected : theme.textHeader;
613
+
614
+ const shouldDrawMenu =
615
+ c.hasMenu === true && (isHovered || (touchMode && selected)) && headerLayout.menuBounds !== undefined;
616
+
617
+ if (c.icon !== undefined && headerLayout.iconBounds !== undefined) {
618
+ let variant: SpriteVariant = selected ? "selected" : "normal";
619
+ if (c.style === "highlight") {
620
+ variant = selected ? "selected" : "special";
621
+ }
622
+ spriteManager.drawSprite(
623
+ c.icon,
624
+ variant,
625
+ ctx,
626
+ headerLayout.iconBounds.x,
627
+ headerLayout.iconBounds.y,
628
+ headerLayout.iconBounds.width,
629
+ theme
630
+ );
631
+
632
+ if (c.overlayIcon !== undefined && headerLayout.iconOverlayBounds !== undefined) {
633
+ spriteManager.drawSprite(
634
+ c.overlayIcon,
635
+ selected ? "selected" : "special",
636
+ ctx,
637
+ headerLayout.iconOverlayBounds.x,
638
+ headerLayout.iconOverlayBounds.y,
639
+ headerLayout.iconOverlayBounds.width,
640
+ theme
641
+ );
642
+ }
643
+ }
644
+
645
+ if (shouldDrawMenu && width > 35) {
646
+ const fadeWidth = 35;
647
+ const fadeStart = isRtl ? fadeWidth : width - fadeWidth;
648
+ const fadeEnd = isRtl ? fadeWidth * 0.7 : width - fadeWidth * 0.7;
649
+
650
+ const fadeStartPercent = fadeStart / width;
651
+ const fadeEndPercent = fadeEnd / width;
652
+
653
+ const grad = ctx.createLinearGradient(x, 0, x + width, 0);
654
+ const trans = withAlpha(fillStyle, 0);
655
+
656
+ grad.addColorStop(isRtl ? 1 : 0, fillStyle);
657
+ grad.addColorStop(fadeStartPercent, fillStyle);
658
+ grad.addColorStop(fadeEndPercent, trans);
659
+ grad.addColorStop(isRtl ? 0 : 1, trans);
660
+ ctx.fillStyle = grad;
661
+ } else {
662
+ ctx.fillStyle = fillStyle;
663
+ }
664
+
665
+ if (isRtl) {
666
+ ctx.textAlign = "right";
667
+ }
668
+ if (headerLayout.textBounds !== undefined) {
669
+ ctx.fillText(
670
+ c.title,
671
+ isRtl ? headerLayout.textBounds.x + headerLayout.textBounds.width : headerLayout.textBounds.x,
672
+ y + height / 2 + getMiddleCenterBias(ctx, theme.headerFontFull)
673
+ );
674
+ }
675
+ if (isRtl) {
676
+ ctx.textAlign = "left";
677
+ }
678
+
679
+ if (
680
+ c.indicatorIcon !== undefined &&
681
+ headerLayout.indicatorIconBounds !== undefined &&
682
+ (!shouldDrawMenu ||
683
+ !intersectRect(
684
+ headerLayout.menuBounds.x,
685
+ headerLayout.menuBounds.y,
686
+ headerLayout.menuBounds.width,
687
+ headerLayout.menuBounds.height,
688
+ headerLayout.indicatorIconBounds.x,
689
+ headerLayout.indicatorIconBounds.y,
690
+ headerLayout.indicatorIconBounds.width,
691
+ headerLayout.indicatorIconBounds.height
692
+ ))
693
+ ) {
694
+ let variant: SpriteVariant = selected ? "selected" : "normal";
695
+ if (c.style === "highlight") {
696
+ variant = selected ? "selected" : "special";
697
+ }
698
+ spriteManager.drawSprite(
699
+ c.indicatorIcon,
700
+ variant,
701
+ ctx,
702
+ headerLayout.indicatorIconBounds.x,
703
+ headerLayout.indicatorIconBounds.y,
704
+ headerLayout.indicatorIconBounds.width,
705
+ theme
706
+ );
707
+ }
708
+
709
+ if (shouldDrawMenu && headerLayout.menuBounds !== undefined) {
710
+ const menuBounds = headerLayout.menuBounds;
711
+
712
+ const hovered = posX !== undefined && posY !== undefined && pointInRect(menuBounds, posX + x, posY + y);
713
+
714
+ if (!hovered) {
715
+ ctx.globalAlpha = 0.7;
716
+ }
717
+
718
+ if (c.menuIcon === undefined || c.menuIcon === GridColumnMenuIcon.Triangle) {
719
+ // Draw the default triangle menu icon:
720
+ ctx.beginPath();
721
+ const triangleX = menuBounds.x + menuBounds.width / 2 - 5.5;
722
+ const triangleY = menuBounds.y + menuBounds.height / 2 - 3;
723
+ roundedPoly(
724
+ ctx,
725
+ [
726
+ {
727
+ x: triangleX,
728
+ y: triangleY,
729
+ },
730
+ {
731
+ x: triangleX + 11,
732
+ y: triangleY,
733
+ },
734
+ {
735
+ x: triangleX + 5.5,
736
+ y: triangleY + 6,
737
+ },
738
+ ],
739
+ 1
740
+ );
741
+ ctx.fillStyle = fillStyle;
742
+ ctx.fill();
743
+ } else if (c.menuIcon === GridColumnMenuIcon.Dots) {
744
+ // Draw the three dots menu icon:
745
+ ctx.beginPath();
746
+ const dotsX = menuBounds.x + menuBounds.width / 2;
747
+ const dotsY = menuBounds.y + menuBounds.height / 2;
748
+ drawMenuDots(ctx, dotsX, dotsY);
749
+ ctx.fillStyle = fillStyle;
750
+ ctx.fill();
751
+ } else {
752
+ // Assume that the user has specified a valid sprite image as header icon:
753
+ const iconX = menuBounds.x + (menuBounds.width - theme.headerIconSize) / 2;
754
+ const iconY = menuBounds.y + (menuBounds.height - theme.headerIconSize) / 2;
755
+ spriteManager.drawSprite(c.menuIcon, "normal", ctx, iconX, iconY, theme.headerIconSize, theme);
756
+ }
757
+
758
+ if (!hovered) {
759
+ ctx.globalAlpha = 1;
760
+ }
761
+ }
762
+ }
763
+
764
+ export function drawHeader(
765
+ ctx: CanvasRenderingContext2D,
766
+ x: number,
767
+ y: number,
768
+ width: number,
769
+ height: number,
770
+ c: MappedGridColumn,
771
+ selected: boolean,
772
+ theme: FullTheme,
773
+ isHovered: boolean,
774
+ posX: number | undefined,
775
+ posY: number | undefined,
776
+ hasSelectedCell: boolean,
777
+ hoverAmount: number,
778
+ spriteManager: SpriteManager,
779
+ drawHeaderCallback: DrawHeaderCallback | undefined,
780
+ touchMode: boolean
781
+ ) {
782
+ const isRtl = direction(c.title) === "rtl";
783
+ const headerLayout = computeHeaderLayout(ctx, c, x, y, width, height, theme, isRtl);
784
+
785
+ if (drawHeaderCallback !== undefined) {
786
+ drawHeaderCallback(
787
+ {
788
+ ctx,
789
+ theme,
790
+ rect: { x, y, width, height },
791
+ column: c,
792
+ columnIndex: c.sourceIndex,
793
+ isSelected: selected,
794
+ hoverAmount,
795
+ isHovered,
796
+ hasSelectedCell,
797
+ spriteManager,
798
+ menuBounds: headerLayout?.menuBounds ?? { x: 0, y: 0, height: 0, width: 0 },
799
+ hoverX: posX,
800
+ hoverY: posY,
801
+ },
802
+ () =>
803
+ drawHeaderInner(
804
+ ctx,
805
+ x,
806
+ y,
807
+ width,
808
+ height,
809
+ c,
810
+ selected,
811
+ theme,
812
+ isHovered,
813
+ posX,
814
+ posY,
815
+ hoverAmount,
816
+ spriteManager,
817
+ touchMode,
818
+ isRtl,
819
+ headerLayout
820
+ )
821
+ );
822
+ } else {
823
+ drawHeaderInner(
824
+ ctx,
825
+ x,
826
+ y,
827
+ width,
828
+ height,
829
+ c,
830
+ selected,
831
+ theme,
832
+ isHovered,
833
+ posX,
834
+ posY,
835
+ hoverAmount,
836
+ spriteManager,
837
+ touchMode,
838
+ isRtl,
839
+ headerLayout
840
+ );
841
+ }
842
+ }