@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,1209 @@
1
+ import * as React from "react";
2
+ import { computeBounds, getColumnIndexForX, getEffectiveColumns, getRowIndexForY, getStickyWidth, rectBottomRight, useMappedColumns, } from "./render/data-grid-lib.js";
3
+ import { GridCellKind, InnerGridCellKind, CompactSelection, isReadWriteCell, isInnerOnlyCell, booleanCellIsEditable, DEFAULT_FILL_HANDLE, } from "./data-grid-types.js";
4
+ import { CellSet } from "./cell-set.js";
5
+ import { SpriteManager } from "./data-grid-sprites.js";
6
+ import { direction, getScrollBarWidth, useDebouncedMemo, useEventListener } from "../../common/utils.js";
7
+ import clamp from "lodash/clamp.js";
8
+ import makeRange from "lodash/range.js";
9
+ import { drawGrid } from "./render/data-grid-render.js";
10
+ import {} from "./render/data-grid-render.blit.js";
11
+ import { AnimationManager } from "./animation-manager.js";
12
+ import { RenderStateProvider, packColRowToNumber } from "../../common/render-state-provider.js";
13
+ import { browserIsFirefox, browserIsSafari } from "../../common/browser-detect.js";
14
+ import { useAnimationQueue } from "./use-animation-queue.js";
15
+ import { assert } from "../../common/support.js";
16
+ import { OutOfBoundsRegionAxis, outOfBoundsKind, groupHeaderKind, headerKind, mouseEventArgsAreEqual, } from "./event-args.js";
17
+ import { pointInRect } from "../../common/math.js";
18
+ import { drawCell, } from "./render/data-grid-render.cells.js";
19
+ import { getActionBoundsForGroup, drawHeader, computeHeaderLayout } from "./render/data-grid-render.header.js";
20
+ const getRowData = (cell, getCellRenderer) => {
21
+ if (cell.kind === GridCellKind.Custom)
22
+ return cell.copyData;
23
+ const r = getCellRenderer?.(cell);
24
+ return r?.getAccessibilityString(cell) ?? "";
25
+ };
26
+ const DataGrid = (p, forwardedRef) => {
27
+ const { width, height, accessibilityHeight, columns, cellXOffset: cellXOffsetReal, cellYOffset, headerHeight, fillHandle = false, groupHeaderHeight, rowHeight, rows, getCellContent, getRowThemeOverride, onHeaderMenuClick, onHeaderIndicatorClick, enableGroups, isFilling, onCanvasFocused, onCanvasBlur, isFocused, selection, freezeColumns, onContextMenu, freezeTrailingRows, fixedShadowX = true, fixedShadowY = true, drawFocusRing, onMouseDown, onMouseUp, onMouseMoveRaw, onMouseMove, onItemHovered, dragAndDropState, firstColAccessible, onKeyDown, onKeyUp, highlightRegions, canvasRef, onDragStart, onDragEnd, eventTargetRef, isResizing, resizeColumn: resizeCol, isDragging, isDraggable = false, allowResize, disabledRows, hasAppendRow, getGroupDetails, theme, prelightCells, headerIcons, verticalBorder, drawCell: drawCellCallback, drawHeader: drawHeaderCallback, drawGroupHeader: drawGroupHeaderCallback, onCellFocused, onDragOverCell, onDrop, onDragLeave, imageWindowLoader, smoothScrollX = false, smoothScrollY = false, experimental, getCellRenderer, resizeIndicator = "full", } = p;
28
+ const translateX = p.translateX ?? 0;
29
+ const translateY = p.translateY ?? 0;
30
+ const cellXOffset = Math.max(freezeColumns, Math.min(columns.length - 1, cellXOffsetReal));
31
+ const ref = React.useRef(null);
32
+ const windowEventTargetRef = React.useRef(experimental?.eventTarget ?? window);
33
+ const windowEventTarget = windowEventTargetRef.current;
34
+ const imageLoader = imageWindowLoader;
35
+ const damageRegion = React.useRef(undefined);
36
+ const [scrolling, setScrolling] = React.useState(false);
37
+ const hoverValues = React.useRef([]);
38
+ const lastBlitData = React.useRef(undefined);
39
+ const [hoveredItemInfo, setHoveredItemInfo] = React.useState();
40
+ const [hoveredOnEdge, setHoveredOnEdge] = React.useState();
41
+ const overlayRef = React.useRef(null);
42
+ const [drawCursorOverride, setDrawCursorOverride] = React.useState();
43
+ const [lastWasTouch, setLastWasTouch] = React.useState(false);
44
+ const lastWasTouchRef = React.useRef(lastWasTouch);
45
+ lastWasTouchRef.current = lastWasTouch;
46
+ const spriteManager = React.useMemo(() => new SpriteManager(headerIcons, () => {
47
+ lastArgsRef.current = undefined;
48
+ lastDrawRef.current();
49
+ }), [headerIcons]);
50
+ const groupHeights = enableGroups
51
+ ? (Array.isArray(groupHeaderHeight)
52
+ ? groupHeaderHeight.reduce((sum, h) => sum + h, 0)
53
+ : groupHeaderHeight)
54
+ : 0;
55
+ const totalHeaderHeight = headerHeight + groupHeights;
56
+ const scrollingStopRef = React.useRef(-1);
57
+ const enableFirefoxRescaling = (experimental?.enableFirefoxRescaling ?? false) && browserIsFirefox.value;
58
+ const enableSafariRescaling = (experimental?.enableSafariRescaling ?? false) && browserIsSafari.value;
59
+ React.useLayoutEffect(() => {
60
+ if (window.devicePixelRatio === 1 || (!enableFirefoxRescaling && !enableSafariRescaling))
61
+ return;
62
+ // We don't want to go into scroll mode for a single repaint
63
+ if (scrollingStopRef.current !== -1) {
64
+ setScrolling(true);
65
+ }
66
+ window.clearTimeout(scrollingStopRef.current);
67
+ scrollingStopRef.current = window.setTimeout(() => {
68
+ setScrolling(false);
69
+ scrollingStopRef.current = -1;
70
+ }, 200);
71
+ }, [cellYOffset, cellXOffset, translateX, translateY, enableFirefoxRescaling, enableSafariRescaling]);
72
+ const mappedColumns = useMappedColumns(columns, freezeColumns);
73
+ const stickyX = React.useMemo(() => (fixedShadowX ? getStickyWidth(mappedColumns, dragAndDropState) : 0), [mappedColumns, dragAndDropState, fixedShadowX]);
74
+ // row: -1 === columnHeader, -2, -3, -4... === groupHeader levels (from top to bottom)
75
+ const getBoundsForItem = React.useCallback((canvas, col, row) => {
76
+ const rect = canvas.getBoundingClientRect();
77
+ if (col >= mappedColumns.length || row >= rows) {
78
+ return undefined;
79
+ }
80
+ const scale = rect.width / width;
81
+ const result = computeBounds(col, row, width, height, groupHeaderHeight, totalHeaderHeight, cellXOffset, cellYOffset, translateX, translateY, rows, freezeColumns, freezeTrailingRows, mappedColumns, rowHeight);
82
+ if (scale !== 1) {
83
+ result.x *= scale;
84
+ result.y *= scale;
85
+ result.width *= scale;
86
+ result.height *= scale;
87
+ }
88
+ result.x += rect.x;
89
+ result.y += rect.y;
90
+ return result;
91
+ }, [
92
+ width,
93
+ height,
94
+ groupHeaderHeight,
95
+ totalHeaderHeight,
96
+ cellXOffset,
97
+ cellYOffset,
98
+ translateX,
99
+ translateY,
100
+ rows,
101
+ freezeColumns,
102
+ freezeTrailingRows,
103
+ mappedColumns,
104
+ rowHeight,
105
+ ]);
106
+ const getMouseArgsForPosition = React.useCallback((canvas, posX, posY, ev) => {
107
+ const rect = canvas.getBoundingClientRect();
108
+ const scale = rect.width / width;
109
+ const x = (posX - rect.left) / scale;
110
+ const y = (posY - rect.top) / scale;
111
+ const edgeDetectionBuffer = 5;
112
+ const effectiveCols = getEffectiveColumns(mappedColumns, cellXOffset, width, undefined, translateX);
113
+ let button = 0;
114
+ let buttons = 0;
115
+ const isMouse = (typeof PointerEvent !== "undefined" && ev instanceof PointerEvent && ev.pointerType === "mouse") ||
116
+ (typeof MouseEvent !== "undefined" && ev instanceof MouseEvent);
117
+ const isTouch = (typeof PointerEvent !== "undefined" && ev instanceof PointerEvent && ev.pointerType === "touch") ||
118
+ (typeof TouchEvent !== "undefined" && ev instanceof TouchEvent);
119
+ if (isMouse) {
120
+ button = ev.button;
121
+ buttons = ev.buttons;
122
+ }
123
+ // -1 === off right edge
124
+ const col = getColumnIndexForX(x, effectiveCols, translateX);
125
+ // -1: header or above
126
+ // undefined: offbottom
127
+ const row = getRowIndexForY(y, height, enableGroups, headerHeight, groupHeaderHeight, rows, rowHeight, cellYOffset, translateY, freezeTrailingRows);
128
+ const shiftKey = ev?.shiftKey === true;
129
+ const ctrlKey = ev?.ctrlKey === true;
130
+ const metaKey = ev?.metaKey === true;
131
+ const scrollEdge = [
132
+ x < 0 ? -1 : width < x ? 1 : 0,
133
+ y < totalHeaderHeight ? -1 : height < y ? 1 : 0,
134
+ ];
135
+ let result;
136
+ if (col === -1 || y < 0 || x < 0 || row === undefined || x > width || y > height) {
137
+ const horizontal = x > width ? 1 : x < 0 ? -1 : 0;
138
+ const vertical = y > height ? 1 : y < 0 ? -1 : 0;
139
+ let innerHorizontal = horizontal * 2;
140
+ let innerVertical = vertical * 2;
141
+ if (horizontal === 0)
142
+ innerHorizontal = col === -1 ? OutOfBoundsRegionAxis.EndPadding : OutOfBoundsRegionAxis.Center;
143
+ if (vertical === 0)
144
+ innerVertical = row === undefined ? OutOfBoundsRegionAxis.EndPadding : OutOfBoundsRegionAxis.Center;
145
+ let isEdge = false;
146
+ if (col === -1 && row === -1) {
147
+ const b = getBoundsForItem(canvas, mappedColumns.length - 1, -1);
148
+ assert(b !== undefined);
149
+ isEdge = posX < b.x + b.width + edgeDetectionBuffer;
150
+ }
151
+ // This is used to ensure that clicking on the scrollbar doesn't unset the selection.
152
+ // Unfortunately this doesn't work for overlay scrollbars because they are just a broken interaction
153
+ // by design.
154
+ const isMaybeScrollbar = (x > width && x < width + getScrollBarWidth()) || (y > height && y < height + getScrollBarWidth());
155
+ result = {
156
+ kind: outOfBoundsKind,
157
+ location: [col !== -1 ? col : x < 0 ? 0 : mappedColumns.length - 1, row ?? rows - 1],
158
+ region: [innerHorizontal, innerVertical],
159
+ shiftKey,
160
+ ctrlKey,
161
+ metaKey,
162
+ isEdge,
163
+ isTouch,
164
+ button,
165
+ buttons,
166
+ scrollEdge,
167
+ isMaybeScrollbar,
168
+ };
169
+ }
170
+ else if (row <= -1) {
171
+ let bounds = getBoundsForItem(canvas, col, row);
172
+ assert(bounds !== undefined);
173
+ let isEdge = bounds !== undefined && bounds.x + bounds.width - posX <= edgeDetectionBuffer;
174
+ const previousCol = col - 1;
175
+ if (posX - bounds.x <= edgeDetectionBuffer && previousCol >= 0) {
176
+ isEdge = true;
177
+ bounds = getBoundsForItem(canvas, previousCol, row);
178
+ assert(bounds !== undefined);
179
+ result = {
180
+ kind: enableGroups && row <= -2 ? groupHeaderKind : headerKind,
181
+ location: [previousCol, row],
182
+ bounds: bounds,
183
+ group: row <= -2
184
+ ? (Array.isArray(mappedColumns[previousCol].group)
185
+ ? mappedColumns[previousCol].group[-2 - row] ?? ""
186
+ : (row === -2 ? mappedColumns[previousCol].group ?? "" : ""))
187
+ : "",
188
+ isEdge,
189
+ shiftKey,
190
+ ctrlKey,
191
+ metaKey,
192
+ isTouch,
193
+ localEventX: posX - bounds.x,
194
+ localEventY: posY - bounds.y,
195
+ button,
196
+ buttons,
197
+ scrollEdge,
198
+ };
199
+ }
200
+ else {
201
+ result = {
202
+ kind: enableGroups && row <= -2 ? groupHeaderKind : headerKind,
203
+ group: row <= -2
204
+ ? (Array.isArray(mappedColumns[col].group)
205
+ ? mappedColumns[col].group[-2 - row] ?? ""
206
+ : (row === -2 ? mappedColumns[col].group ?? "" : ""))
207
+ : "",
208
+ location: [col, row],
209
+ bounds: bounds,
210
+ isEdge,
211
+ shiftKey,
212
+ ctrlKey,
213
+ metaKey,
214
+ isTouch,
215
+ localEventX: posX - bounds.x,
216
+ localEventY: posY - bounds.y,
217
+ button,
218
+ buttons,
219
+ scrollEdge,
220
+ };
221
+ }
222
+ }
223
+ else {
224
+ const bounds = getBoundsForItem(canvas, col, row);
225
+ assert(bounds !== undefined);
226
+ const isEdge = bounds !== undefined && bounds.x + bounds.width - posX < edgeDetectionBuffer;
227
+ let isFillHandle = false;
228
+ const drawFill = fillHandle !== false && fillHandle !== undefined;
229
+ if (drawFill && selection.current !== undefined) {
230
+ const fill = typeof fillHandle === "object"
231
+ ? { ...DEFAULT_FILL_HANDLE, ...fillHandle }
232
+ : DEFAULT_FILL_HANDLE;
233
+ const fillHandleClickSize = fill.size;
234
+ const half = fillHandleClickSize / 2;
235
+ const fillHandleLocation = rectBottomRight(selection.current.range);
236
+ const fillBounds = getBoundsForItem(canvas, fillHandleLocation[0], fillHandleLocation[1]);
237
+ if (fillBounds !== undefined) {
238
+ // Handle center sits exactly on the bottom-right corner of the cell.
239
+ // Offset by half pixel to align with grid lines.
240
+ const centerX = fillBounds.x + fillBounds.width + fill.offsetX - half + 0.5;
241
+ const centerY = fillBounds.y + fillBounds.height + fill.offsetY - half + 0.5;
242
+ // Check if posX and posY are within fillHandleClickSize from handleLogicalCenter
243
+ isFillHandle =
244
+ Math.abs(centerX - posX) < fillHandleClickSize &&
245
+ Math.abs(centerY - posY) < fillHandleClickSize;
246
+ }
247
+ }
248
+ result = {
249
+ kind: "cell",
250
+ location: [col, row],
251
+ bounds: bounds,
252
+ isEdge,
253
+ shiftKey,
254
+ ctrlKey,
255
+ isFillHandle,
256
+ metaKey,
257
+ isTouch,
258
+ localEventX: posX - bounds.x,
259
+ localEventY: posY - bounds.y,
260
+ button,
261
+ buttons,
262
+ scrollEdge,
263
+ };
264
+ }
265
+ return result;
266
+ }, [
267
+ width,
268
+ mappedColumns,
269
+ cellXOffset,
270
+ translateX,
271
+ height,
272
+ enableGroups,
273
+ headerHeight,
274
+ groupHeaderHeight,
275
+ rows,
276
+ rowHeight,
277
+ cellYOffset,
278
+ translateY,
279
+ freezeTrailingRows,
280
+ getBoundsForItem,
281
+ fillHandle,
282
+ selection,
283
+ totalHeaderHeight,
284
+ ]);
285
+ const [hoveredItem] = hoveredItemInfo ?? [];
286
+ const enqueueRef = React.useRef(() => {
287
+ // do nothing
288
+ });
289
+ const hoverInfoRef = React.useRef(hoveredItemInfo);
290
+ hoverInfoRef.current = hoveredItemInfo;
291
+ const [bufferACtx, bufferBCtx] = React.useMemo(() => {
292
+ const a = document.createElement("canvas");
293
+ const b = document.createElement("canvas");
294
+ a.style["display"] = "none";
295
+ a.style["opacity"] = "0";
296
+ a.style["position"] = "fixed";
297
+ b.style["display"] = "none";
298
+ b.style["opacity"] = "0";
299
+ b.style["position"] = "fixed";
300
+ return [a.getContext("2d", { alpha: false }), b.getContext("2d", { alpha: false })];
301
+ }, []);
302
+ React.useLayoutEffect(() => {
303
+ if (bufferACtx === null || bufferBCtx === null)
304
+ return;
305
+ document.documentElement.append(bufferACtx.canvas);
306
+ document.documentElement.append(bufferBCtx.canvas);
307
+ return () => {
308
+ bufferACtx.canvas.remove();
309
+ bufferBCtx.canvas.remove();
310
+ };
311
+ }, [bufferACtx, bufferBCtx]);
312
+ const renderStateProvider = React.useMemo(() => new RenderStateProvider(), []);
313
+ const maxDPR = enableFirefoxRescaling && scrolling ? 1 : enableSafariRescaling && scrolling ? 2 : 5;
314
+ const minimumCellWidth = experimental?.disableMinimumCellWidth === true ? 1 : 10;
315
+ const lastArgsRef = React.useRef(undefined);
316
+ const canvasCtx = React.useRef(null);
317
+ const overlayCtx = React.useRef(null);
318
+ const draw = React.useCallback(() => {
319
+ const canvas = ref.current;
320
+ const overlay = overlayRef.current;
321
+ if (canvas === null || overlay === null)
322
+ return;
323
+ if (canvasCtx.current === null) {
324
+ canvasCtx.current = canvas.getContext("2d", { alpha: false });
325
+ canvas.width = 0;
326
+ canvas.height = 0;
327
+ }
328
+ if (overlayCtx.current === null) {
329
+ overlayCtx.current = overlay.getContext("2d", { alpha: false });
330
+ overlay.width = 0;
331
+ overlay.height = 0;
332
+ }
333
+ if (canvasCtx.current === null || overlayCtx.current === null || bufferACtx === null || bufferBCtx === null) {
334
+ return;
335
+ }
336
+ let didOverride = false;
337
+ const overrideCursor = (cursor) => {
338
+ didOverride = true;
339
+ setDrawCursorOverride(cursor);
340
+ };
341
+ const last = lastArgsRef.current;
342
+ const current = {
343
+ headerCanvasCtx: overlayCtx.current,
344
+ canvasCtx: canvasCtx.current,
345
+ bufferACtx,
346
+ bufferBCtx,
347
+ width,
348
+ height,
349
+ cellXOffset,
350
+ cellYOffset,
351
+ translateX: Math.round(translateX),
352
+ translateY: Math.round(translateY),
353
+ mappedColumns,
354
+ enableGroups,
355
+ freezeColumns,
356
+ dragAndDropState,
357
+ theme,
358
+ headerHeight,
359
+ groupHeaderHeight,
360
+ disabledRows: disabledRows ?? CompactSelection.empty(),
361
+ rowHeight,
362
+ verticalBorder,
363
+ isResizing,
364
+ resizeCol,
365
+ isFocused,
366
+ selection,
367
+ fillHandle,
368
+ drawCellCallback,
369
+ hasAppendRow,
370
+ overrideCursor,
371
+ maxScaleFactor: maxDPR,
372
+ freezeTrailingRows,
373
+ rows,
374
+ drawFocus: drawFocusRing,
375
+ getCellContent,
376
+ getGroupDetails: getGroupDetails ?? (name => ({ name })),
377
+ getRowThemeOverride,
378
+ drawHeaderCallback,
379
+ drawGroupHeaderCallback,
380
+ prelightCells,
381
+ highlightRegions,
382
+ imageLoader,
383
+ lastBlitData,
384
+ damage: damageRegion.current,
385
+ hoverValues: hoverValues.current,
386
+ hoverInfo: hoverInfoRef.current,
387
+ spriteManager,
388
+ scrolling,
389
+ hyperWrapping: experimental?.hyperWrapping ?? false,
390
+ touchMode: lastWasTouch,
391
+ enqueue: enqueueRef.current,
392
+ renderStateProvider,
393
+ renderStrategy: experimental?.renderStrategy ?? (browserIsSafari.value ? "double-buffer" : "single-buffer"),
394
+ getCellRenderer,
395
+ minimumCellWidth,
396
+ resizeIndicator,
397
+ };
398
+ // This confusing bit of code due to some poor design. Long story short, the damage property is only used
399
+ // with what is effectively the "last args" for the last normal draw anyway. We don't want the drawing code
400
+ // to look at this and go "shit dawg, nothing changed" so we force it to draw frash, but the damage restricts
401
+ // the draw anyway.
402
+ //
403
+ // Dear future Jason, I'm sorry. It was expedient, it worked, and had almost zero perf overhead. THe universe
404
+ // basically made me do it. What choice did I have?
405
+ if (current.damage === undefined) {
406
+ lastArgsRef.current = current;
407
+ drawGrid(current, last);
408
+ }
409
+ else {
410
+ drawGrid(current, undefined);
411
+ }
412
+ // don't reset on damage events
413
+ if (!didOverride && (current.damage === undefined || current.damage.has(hoverInfoRef?.current?.[0]))) {
414
+ setDrawCursorOverride(undefined);
415
+ }
416
+ }, [
417
+ bufferACtx,
418
+ bufferBCtx,
419
+ width,
420
+ height,
421
+ cellXOffset,
422
+ cellYOffset,
423
+ translateX,
424
+ translateY,
425
+ mappedColumns,
426
+ enableGroups,
427
+ freezeColumns,
428
+ dragAndDropState,
429
+ theme,
430
+ headerHeight,
431
+ groupHeaderHeight,
432
+ disabledRows,
433
+ rowHeight,
434
+ verticalBorder,
435
+ isResizing,
436
+ hasAppendRow,
437
+ resizeCol,
438
+ isFocused,
439
+ selection,
440
+ fillHandle,
441
+ freezeTrailingRows,
442
+ rows,
443
+ drawFocusRing,
444
+ maxDPR,
445
+ getCellContent,
446
+ getGroupDetails,
447
+ getRowThemeOverride,
448
+ drawCellCallback,
449
+ drawHeaderCallback,
450
+ drawGroupHeaderCallback,
451
+ prelightCells,
452
+ highlightRegions,
453
+ imageLoader,
454
+ spriteManager,
455
+ scrolling,
456
+ experimental?.hyperWrapping,
457
+ experimental?.renderStrategy,
458
+ lastWasTouch,
459
+ renderStateProvider,
460
+ getCellRenderer,
461
+ minimumCellWidth,
462
+ resizeIndicator,
463
+ ]);
464
+ const lastDrawRef = React.useRef(draw);
465
+ React.useLayoutEffect(() => {
466
+ draw();
467
+ lastDrawRef.current = draw;
468
+ }, [draw]);
469
+ React.useLayoutEffect(() => {
470
+ const fn = async () => {
471
+ if (document?.fonts?.ready === undefined)
472
+ return;
473
+ await document.fonts.ready;
474
+ lastArgsRef.current = undefined;
475
+ lastDrawRef.current();
476
+ };
477
+ void fn();
478
+ }, []);
479
+ const damageInternal = React.useCallback((locations) => {
480
+ damageRegion.current = locations;
481
+ lastDrawRef.current();
482
+ damageRegion.current = undefined;
483
+ }, []);
484
+ const enqueue = useAnimationQueue(damageInternal);
485
+ enqueueRef.current = enqueue;
486
+ const damage = React.useCallback((cells) => {
487
+ damageInternal(new CellSet(cells.map(x => x.cell)));
488
+ }, [damageInternal]);
489
+ imageLoader.setCallback(damageInternal);
490
+ const [overFill, setOverFill] = React.useState(false);
491
+ const [hCol, hRow] = hoveredItem ?? [];
492
+ const headerHovered = hCol !== undefined &&
493
+ hRow === -1 &&
494
+ hCol >= 0 &&
495
+ hCol < mappedColumns.length &&
496
+ mappedColumns[hCol].headerRowMarkerDisabled !== true;
497
+ const groupHeaderHovered = hCol !== undefined && hRow === -2;
498
+ let clickableInnerCellHovered = false;
499
+ let editableBoolHovered = false;
500
+ let cursorOverride = drawCursorOverride;
501
+ if (cursorOverride === undefined && hCol !== undefined && hRow !== undefined && hRow > -1 && hRow < rows) {
502
+ const cell = getCellContent([hCol, hRow], true);
503
+ clickableInnerCellHovered =
504
+ cell.kind === InnerGridCellKind.NewRow ||
505
+ (cell.kind === InnerGridCellKind.Marker && cell.markerKind !== "number");
506
+ editableBoolHovered = cell.kind === GridCellKind.Boolean && booleanCellIsEditable(cell);
507
+ cursorOverride = cell.cursor;
508
+ }
509
+ const canDrag = hoveredOnEdge ?? false;
510
+ const cursor = isDragging
511
+ ? "grabbing"
512
+ : canDrag || isResizing
513
+ ? "col-resize"
514
+ : overFill || isFilling
515
+ ? "crosshair"
516
+ : cursorOverride !== undefined
517
+ ? cursorOverride
518
+ : headerHovered || clickableInnerCellHovered || editableBoolHovered || groupHeaderHovered
519
+ ? "pointer"
520
+ : "default";
521
+ const style = React.useMemo(() => ({
522
+ // width,
523
+ // height,
524
+ contain: "strict",
525
+ display: "block",
526
+ cursor,
527
+ }), [cursor]);
528
+ const lastSetCursor = React.useRef("default");
529
+ const target = eventTargetRef?.current;
530
+ if (target !== null && target !== undefined && lastSetCursor.current !== style.cursor) {
531
+ // because we have an event target we need to set its cursor instead.
532
+ target.style.cursor = lastSetCursor.current = style.cursor;
533
+ }
534
+ const groupHeaderActionForEvent = React.useCallback((group, bounds, localEventX, localEventY) => {
535
+ if (getGroupDetails === undefined)
536
+ return undefined;
537
+ const groupDesc = getGroupDetails(group);
538
+ if (groupDesc.actions !== undefined) {
539
+ const boxes = getActionBoundsForGroup(bounds, groupDesc.actions);
540
+ for (const [i, box] of boxes.entries()) {
541
+ if (pointInRect(box, localEventX + bounds.x, localEventY + box.y)) {
542
+ return groupDesc.actions[i];
543
+ }
544
+ }
545
+ }
546
+ return undefined;
547
+ }, [getGroupDetails]);
548
+ const isOverHeaderElement = React.useCallback((canvas, col, clientX, clientY) => {
549
+ const header = mappedColumns[col];
550
+ if (!isDragging && !isResizing && !(hoveredOnEdge ?? false)) {
551
+ const headerBounds = getBoundsForItem(canvas, col, -1);
552
+ assert(headerBounds !== undefined);
553
+ const headerLayout = computeHeaderLayout(undefined, header, headerBounds.x, headerBounds.y, headerBounds.width, headerBounds.height, theme, direction(header.title) === "rtl");
554
+ if (header.hasMenu === true &&
555
+ headerLayout.menuBounds !== undefined &&
556
+ pointInRect(headerLayout.menuBounds, clientX, clientY)) {
557
+ return {
558
+ area: "menu",
559
+ bounds: headerLayout.menuBounds,
560
+ };
561
+ }
562
+ else if (header.indicatorIcon !== undefined &&
563
+ headerLayout.indicatorIconBounds !== undefined &&
564
+ pointInRect(headerLayout.indicatorIconBounds, clientX, clientY)) {
565
+ return {
566
+ area: "indicator",
567
+ bounds: headerLayout.indicatorIconBounds,
568
+ };
569
+ }
570
+ }
571
+ return undefined;
572
+ }, [mappedColumns, getBoundsForItem, hoveredOnEdge, isDragging, isResizing, theme]);
573
+ const downTime = React.useRef(0);
574
+ const downPosition = React.useRef(undefined);
575
+ const mouseDown = React.useRef(false);
576
+ const onPointerDown = React.useCallback((ev) => {
577
+ const canvas = ref.current;
578
+ const eventTarget = eventTargetRef?.current;
579
+ if (canvas === null || (ev.target !== canvas && ev.target !== eventTarget))
580
+ return;
581
+ mouseDown.current = true;
582
+ const clientX = ev.clientX;
583
+ const clientY = ev.clientY;
584
+ if (ev.target === eventTarget && eventTarget !== null) {
585
+ const bounds = eventTarget.getBoundingClientRect();
586
+ if (clientX > bounds.right || clientY > bounds.bottom)
587
+ return;
588
+ }
589
+ const args = getMouseArgsForPosition(canvas, clientX, clientY, ev);
590
+ downPosition.current = args.location;
591
+ if (args.isTouch) {
592
+ downTime.current = Date.now();
593
+ }
594
+ if (lastWasTouchRef.current !== args.isTouch) {
595
+ setLastWasTouch(args.isTouch);
596
+ }
597
+ if (args.kind === headerKind &&
598
+ isOverHeaderElement(canvas, args.location[0], clientX, clientY) !== undefined) {
599
+ return;
600
+ }
601
+ else if (args.kind === groupHeaderKind) {
602
+ const action = groupHeaderActionForEvent(args.group, args.bounds, args.localEventX, args.localEventY);
603
+ if (action !== undefined) {
604
+ return;
605
+ }
606
+ }
607
+ onMouseDown?.(args);
608
+ if (!args.isTouch &&
609
+ isDraggable !== true &&
610
+ isDraggable !== args.kind &&
611
+ args.button < 3 &&
612
+ args.button !== 1) {
613
+ // preventing default in touch events stops scroll
614
+ ev.preventDefault();
615
+ }
616
+ }, [
617
+ eventTargetRef,
618
+ isDraggable,
619
+ getMouseArgsForPosition,
620
+ groupHeaderActionForEvent,
621
+ isOverHeaderElement,
622
+ onMouseDown,
623
+ ]);
624
+ useEventListener("pointerdown", onPointerDown, windowEventTarget, false);
625
+ const lastUpTime = React.useRef(0);
626
+ const onPointerUp = React.useCallback((ev) => {
627
+ const lastUpTimeValue = lastUpTime.current;
628
+ lastUpTime.current = Date.now();
629
+ const canvas = ref.current;
630
+ mouseDown.current = false;
631
+ if (onMouseUp === undefined || canvas === null)
632
+ return;
633
+ const eventTarget = eventTargetRef?.current;
634
+ const isOutside = ev.target !== canvas && ev.target !== eventTarget;
635
+ const clientX = ev.clientX;
636
+ const clientY = ev.clientY;
637
+ const canCancel = ev.pointerType === "mouse" ? ev.button < 3 : true;
638
+ let args = getMouseArgsForPosition(canvas, clientX, clientY, ev);
639
+ if (args.isTouch && downTime.current !== 0 && Date.now() - downTime.current > 500) {
640
+ args = {
641
+ ...args,
642
+ isLongTouch: true,
643
+ };
644
+ }
645
+ if (lastUpTimeValue !== 0 && Date.now() - lastUpTimeValue < (args.isTouch ? 1000 : 500)) {
646
+ args = {
647
+ ...args,
648
+ isDoubleClick: true,
649
+ };
650
+ }
651
+ if (lastWasTouchRef.current !== args.isTouch) {
652
+ setLastWasTouch(args.isTouch);
653
+ }
654
+ if (!isOutside && ev.cancelable && canCancel) {
655
+ ev.preventDefault();
656
+ }
657
+ const [col] = args.location;
658
+ const headerBounds = isOverHeaderElement(canvas, col, clientX, clientY);
659
+ if (args.kind === headerKind && headerBounds !== undefined) {
660
+ if (args.button !== 0 || downPosition.current?.[0] !== col || downPosition.current?.[1] !== -1) {
661
+ // force outside so that click will not process
662
+ onMouseUp(args, true);
663
+ }
664
+ return;
665
+ }
666
+ else if (args.kind === groupHeaderKind) {
667
+ const action = groupHeaderActionForEvent(args.group, args.bounds, args.localEventX, args.localEventY);
668
+ if (action !== undefined) {
669
+ if (args.button === 0) {
670
+ action.onClick(args);
671
+ }
672
+ return;
673
+ }
674
+ }
675
+ onMouseUp(args, isOutside);
676
+ }, [onMouseUp, eventTargetRef, getMouseArgsForPosition, isOverHeaderElement, groupHeaderActionForEvent]);
677
+ useEventListener("pointerup", onPointerUp, windowEventTarget, false);
678
+ const onClickImpl = React.useCallback((ev) => {
679
+ const canvas = ref.current;
680
+ if (canvas === null)
681
+ return;
682
+ const eventTarget = eventTargetRef?.current;
683
+ const isOutside = ev.target !== canvas && ev.target !== eventTarget;
684
+ let clientX;
685
+ let clientY;
686
+ let canCancel = true;
687
+ if (ev instanceof MouseEvent) {
688
+ clientX = ev.clientX;
689
+ clientY = ev.clientY;
690
+ canCancel = ev.button < 3;
691
+ }
692
+ else {
693
+ clientX = ev.changedTouches[0].clientX;
694
+ clientY = ev.changedTouches[0].clientY;
695
+ }
696
+ const args = getMouseArgsForPosition(canvas, clientX, clientY, ev);
697
+ if (lastWasTouchRef.current !== args.isTouch) {
698
+ setLastWasTouch(args.isTouch);
699
+ }
700
+ if (!isOutside && ev.cancelable && canCancel) {
701
+ ev.preventDefault();
702
+ }
703
+ const [col] = args.location;
704
+ if (args.kind === headerKind) {
705
+ const headerBounds = isOverHeaderElement(canvas, col, clientX, clientY);
706
+ if (headerBounds !== undefined &&
707
+ args.button === 0 &&
708
+ downPosition.current?.[0] === col &&
709
+ downPosition.current?.[1] === -1) {
710
+ if (headerBounds.area === "menu") {
711
+ onHeaderMenuClick?.(col, headerBounds.bounds);
712
+ }
713
+ else if (headerBounds.area === "indicator") {
714
+ onHeaderIndicatorClick?.(col, headerBounds.bounds);
715
+ }
716
+ }
717
+ }
718
+ }, [eventTargetRef, getMouseArgsForPosition, isOverHeaderElement, onHeaderMenuClick, onHeaderIndicatorClick]);
719
+ useEventListener("click", onClickImpl, windowEventTarget, false);
720
+ const onContextMenuImpl = React.useCallback((ev) => {
721
+ const canvas = ref.current;
722
+ const eventTarget = eventTargetRef?.current;
723
+ if (canvas === null || (ev.target !== canvas && ev.target !== eventTarget) || onContextMenu === undefined)
724
+ return;
725
+ const args = getMouseArgsForPosition(canvas, ev.clientX, ev.clientY, ev);
726
+ onContextMenu(args, () => {
727
+ if (ev.cancelable)
728
+ ev.preventDefault();
729
+ });
730
+ }, [eventTargetRef, getMouseArgsForPosition, onContextMenu]);
731
+ useEventListener("contextmenu", onContextMenuImpl, eventTargetRef?.current ?? null, false);
732
+ const onAnimationFrame = React.useCallback(values => {
733
+ damageRegion.current = new CellSet(values.map(x => x.item));
734
+ hoverValues.current = values;
735
+ lastDrawRef.current();
736
+ damageRegion.current = undefined;
737
+ }, []);
738
+ const animManagerValue = React.useMemo(() => new AnimationManager(onAnimationFrame), [onAnimationFrame]);
739
+ const animationManager = React.useRef(animManagerValue);
740
+ animationManager.current = animManagerValue;
741
+ React.useLayoutEffect(() => {
742
+ const am = animationManager.current;
743
+ if (hoveredItem === undefined || hoveredItem[1] < 0) {
744
+ am.setHovered(hoveredItem);
745
+ return;
746
+ }
747
+ const cell = getCellContent(hoveredItem, true);
748
+ const r = getCellRenderer(cell);
749
+ const cellNeedsHover = (r === undefined && cell.kind === GridCellKind.Custom) ||
750
+ (r?.needsHover !== undefined && (typeof r.needsHover === "boolean" ? r.needsHover : r.needsHover(cell)));
751
+ am.setHovered(cellNeedsHover ? hoveredItem : undefined);
752
+ }, [getCellContent, getCellRenderer, hoveredItem]);
753
+ const hoveredRef = React.useRef(undefined);
754
+ const onPointerMove = React.useCallback((ev) => {
755
+ const canvas = ref.current;
756
+ if (canvas === null)
757
+ return;
758
+ const eventTarget = eventTargetRef?.current;
759
+ const isIndirect = ev.target !== canvas && ev.target !== eventTarget;
760
+ const args = getMouseArgsForPosition(canvas, ev.clientX, ev.clientY, ev);
761
+ if (args.kind !== "out-of-bounds" && isIndirect && !mouseDown.current && !args.isTouch) {
762
+ // we are obscured by something else, so we want to not register events if we are not doing anything
763
+ // important already
764
+ return;
765
+ }
766
+ // the point here is not to trigger re-renders every time the mouse moves over a cell
767
+ // that doesn't care about the mouse positon.
768
+ const maybeSetHoveredInfo = (newVal, needPosition) => {
769
+ setHoveredItemInfo(cv => {
770
+ if (cv === newVal)
771
+ return cv;
772
+ if (cv?.[0][0] === newVal?.[0][0] &&
773
+ cv?.[0][1] === newVal?.[0][1] &&
774
+ ((cv?.[1][0] === newVal?.[1][0] && cv?.[1][1] === newVal?.[1][1]) || !needPosition)) {
775
+ return cv;
776
+ }
777
+ return newVal;
778
+ });
779
+ };
780
+ if (!mouseEventArgsAreEqual(args, hoveredRef.current)) {
781
+ setDrawCursorOverride(undefined);
782
+ onItemHovered?.(args);
783
+ maybeSetHoveredInfo(args.kind === outOfBoundsKind ? undefined : [args.location, [args.localEventX, args.localEventY]], true);
784
+ hoveredRef.current = args;
785
+ }
786
+ else if (args.kind === "cell" || args.kind === headerKind || args.kind === groupHeaderKind) {
787
+ let needsDamageCell = false;
788
+ let needsHoverPosition = true;
789
+ if (args.kind === "cell") {
790
+ const toCheck = getCellContent(args.location);
791
+ const rendererNeeds = getCellRenderer(toCheck)?.needsHoverPosition;
792
+ // custom cells we will assume need the position if they don't explicitly say they don't, everything
793
+ // else we will assume doesn't need it.
794
+ needsHoverPosition = rendererNeeds ?? toCheck.kind === GridCellKind.Custom;
795
+ needsDamageCell = needsHoverPosition;
796
+ }
797
+ else {
798
+ needsDamageCell = true;
799
+ }
800
+ const newInfo = [args.location, [args.localEventX, args.localEventY]];
801
+ maybeSetHoveredInfo(newInfo, needsHoverPosition);
802
+ hoverInfoRef.current = newInfo;
803
+ if (needsDamageCell) {
804
+ damageInternal(new CellSet([args.location]));
805
+ }
806
+ }
807
+ const notRowMarkerCol = args.location[0] >= (firstColAccessible ? 0 : 1);
808
+ setHoveredOnEdge(args.kind === headerKind && args.isEdge && notRowMarkerCol && allowResize === true);
809
+ setOverFill(args.kind === "cell" && args.isFillHandle);
810
+ onMouseMoveRaw?.(ev);
811
+ onMouseMove(args);
812
+ }, [
813
+ eventTargetRef,
814
+ getMouseArgsForPosition,
815
+ firstColAccessible,
816
+ allowResize,
817
+ onMouseMoveRaw,
818
+ onMouseMove,
819
+ onItemHovered,
820
+ getCellContent,
821
+ getCellRenderer,
822
+ damageInternal,
823
+ ]);
824
+ useEventListener("pointermove", onPointerMove, windowEventTarget, true);
825
+ const onKeyDownImpl = React.useCallback((event) => {
826
+ const canvas = ref.current;
827
+ if (canvas === null)
828
+ return;
829
+ let bounds;
830
+ let location = undefined;
831
+ if (selection.current !== undefined) {
832
+ bounds = getBoundsForItem(canvas, selection.current.cell[0], selection.current.cell[1]);
833
+ location = selection.current.cell;
834
+ }
835
+ onKeyDown?.({
836
+ bounds,
837
+ stopPropagation: () => event.stopPropagation(),
838
+ preventDefault: () => event.preventDefault(),
839
+ cancel: () => undefined,
840
+ ctrlKey: event.ctrlKey,
841
+ metaKey: event.metaKey,
842
+ shiftKey: event.shiftKey,
843
+ altKey: event.altKey,
844
+ key: event.key,
845
+ keyCode: event.keyCode,
846
+ rawEvent: event,
847
+ location,
848
+ });
849
+ }, [onKeyDown, selection, getBoundsForItem]);
850
+ const onKeyUpImpl = React.useCallback((event) => {
851
+ const canvas = ref.current;
852
+ if (canvas === null)
853
+ return;
854
+ let bounds;
855
+ let location = undefined;
856
+ if (selection.current !== undefined) {
857
+ bounds = getBoundsForItem(canvas, selection.current.cell[0], selection.current.cell[1]);
858
+ location = selection.current.cell;
859
+ }
860
+ onKeyUp?.({
861
+ bounds,
862
+ stopPropagation: () => event.stopPropagation(),
863
+ preventDefault: () => event.preventDefault(),
864
+ cancel: () => undefined,
865
+ ctrlKey: event.ctrlKey,
866
+ metaKey: event.metaKey,
867
+ shiftKey: event.shiftKey,
868
+ altKey: event.altKey,
869
+ key: event.key,
870
+ keyCode: event.keyCode,
871
+ rawEvent: event,
872
+ location,
873
+ });
874
+ }, [onKeyUp, selection, getBoundsForItem]);
875
+ const refImpl = React.useCallback((instance) => {
876
+ ref.current = instance;
877
+ if (canvasRef !== undefined) {
878
+ canvasRef.current = instance;
879
+ }
880
+ if (experimental?.eventTarget) {
881
+ windowEventTargetRef.current = experimental.eventTarget;
882
+ }
883
+ else if (instance === null) {
884
+ windowEventTargetRef.current = window;
885
+ }
886
+ else {
887
+ const docRoot = instance.getRootNode();
888
+ if (docRoot === document)
889
+ windowEventTargetRef.current = window;
890
+ windowEventTargetRef.current = docRoot;
891
+ }
892
+ }, [canvasRef, experimental?.eventTarget]);
893
+ const onDragStartImpl = React.useCallback((event) => {
894
+ const canvas = ref.current;
895
+ if (canvas === null || isDraggable === false || isResizing) {
896
+ event.preventDefault();
897
+ return;
898
+ }
899
+ let dragMime;
900
+ let dragData;
901
+ const args = getMouseArgsForPosition(canvas, event.clientX, event.clientY);
902
+ if (isDraggable !== true && args.kind !== isDraggable) {
903
+ event.preventDefault();
904
+ return;
905
+ }
906
+ const setData = (mime, payload) => {
907
+ dragMime = mime;
908
+ dragData = payload;
909
+ };
910
+ let dragImage;
911
+ let dragImageX;
912
+ let dragImageY;
913
+ const setDragImage = (image, x, y) => {
914
+ dragImage = image;
915
+ dragImageX = x;
916
+ dragImageY = y;
917
+ };
918
+ let prevented = false;
919
+ onDragStart?.({
920
+ ...args,
921
+ setData,
922
+ setDragImage,
923
+ preventDefault: () => (prevented = true),
924
+ defaultPrevented: () => prevented,
925
+ });
926
+ if (!prevented && dragMime !== undefined && dragData !== undefined && event.dataTransfer !== null) {
927
+ event.dataTransfer.setData(dragMime, dragData);
928
+ event.dataTransfer.effectAllowed = "copyLink";
929
+ if (dragImage !== undefined && dragImageX !== undefined && dragImageY !== undefined) {
930
+ event.dataTransfer.setDragImage(dragImage, dragImageX, dragImageY);
931
+ }
932
+ else {
933
+ const [col, row] = args.location;
934
+ if (row !== undefined) {
935
+ const offscreen = document.createElement("canvas");
936
+ const boundsForDragTarget = getBoundsForItem(canvas, col, row);
937
+ assert(boundsForDragTarget !== undefined);
938
+ const dpr = Math.ceil(window.devicePixelRatio ?? 1);
939
+ offscreen.width = boundsForDragTarget.width * dpr;
940
+ offscreen.height = boundsForDragTarget.height * dpr;
941
+ const ctx = offscreen.getContext("2d");
942
+ if (ctx !== null) {
943
+ ctx.scale(dpr, dpr);
944
+ ctx.textBaseline = "middle";
945
+ if (row === -1) {
946
+ ctx.font = theme.headerFontFull;
947
+ ctx.fillStyle = theme.bgHeader;
948
+ ctx.fillRect(0, 0, offscreen.width, offscreen.height);
949
+ drawHeader(ctx, 0, 0, boundsForDragTarget.width, boundsForDragTarget.height, mappedColumns[col], false, theme, false, undefined, undefined, false, 0, spriteManager, drawHeaderCallback, false);
950
+ }
951
+ else {
952
+ ctx.font = theme.baseFontFull;
953
+ ctx.fillStyle = theme.bgCell;
954
+ ctx.fillRect(0, 0, offscreen.width, offscreen.height);
955
+ drawCell(ctx, getCellContent([col, row]), 0, row, false, false, 0, 0, boundsForDragTarget.width, boundsForDragTarget.height, false, theme, theme.bgCell, imageLoader, spriteManager, 1, undefined, false, 0, undefined, undefined, undefined, renderStateProvider, getCellRenderer, () => undefined);
956
+ }
957
+ }
958
+ offscreen.style.left = "-100%";
959
+ offscreen.style.position = "absolute";
960
+ offscreen.style.width = `${boundsForDragTarget.width}px`;
961
+ offscreen.style.height = `${boundsForDragTarget.height}px`;
962
+ document.body.append(offscreen);
963
+ event.dataTransfer.setDragImage(offscreen, boundsForDragTarget.width / 2, boundsForDragTarget.height / 2);
964
+ window.setTimeout(() => {
965
+ offscreen.remove();
966
+ }, 0);
967
+ }
968
+ }
969
+ }
970
+ else {
971
+ event.preventDefault();
972
+ }
973
+ }, [
974
+ isDraggable,
975
+ isResizing,
976
+ getMouseArgsForPosition,
977
+ onDragStart,
978
+ getBoundsForItem,
979
+ theme,
980
+ mappedColumns,
981
+ spriteManager,
982
+ drawHeaderCallback,
983
+ getCellContent,
984
+ imageLoader,
985
+ renderStateProvider,
986
+ getCellRenderer,
987
+ ]);
988
+ useEventListener("dragstart", onDragStartImpl, eventTargetRef?.current ?? null, false, false);
989
+ const activeDropTarget = React.useRef(undefined);
990
+ const onDragOverImpl = React.useCallback((event) => {
991
+ const canvas = ref.current;
992
+ if (onDrop !== undefined) {
993
+ // Need to preventDefault to allow drop
994
+ event.preventDefault();
995
+ }
996
+ if (canvas === null || onDragOverCell === undefined) {
997
+ return;
998
+ }
999
+ const args = getMouseArgsForPosition(canvas, event.clientX, event.clientY);
1000
+ const [rawCol, row] = args.location;
1001
+ const col = rawCol - (firstColAccessible ? 0 : 1);
1002
+ const [activeCol, activeRow] = activeDropTarget.current ?? [];
1003
+ if (activeCol !== col || activeRow !== row) {
1004
+ activeDropTarget.current = [col, row];
1005
+ onDragOverCell([col, row], event.dataTransfer);
1006
+ }
1007
+ }, [firstColAccessible, getMouseArgsForPosition, onDragOverCell, onDrop]);
1008
+ useEventListener("dragover", onDragOverImpl, eventTargetRef?.current ?? null, false, false);
1009
+ const onDragEndImpl = React.useCallback(() => {
1010
+ activeDropTarget.current = undefined;
1011
+ onDragEnd?.();
1012
+ }, [onDragEnd]);
1013
+ useEventListener("dragend", onDragEndImpl, eventTargetRef?.current ?? null, false, false);
1014
+ const onDropImpl = React.useCallback((event) => {
1015
+ const canvas = ref.current;
1016
+ if (canvas === null || onDrop === undefined) {
1017
+ return;
1018
+ }
1019
+ // Default can mess up sometimes.
1020
+ event.preventDefault();
1021
+ const args = getMouseArgsForPosition(canvas, event.clientX, event.clientY);
1022
+ const [rawCol, row] = args.location;
1023
+ const col = rawCol - (firstColAccessible ? 0 : 1);
1024
+ onDrop([col, row], event.dataTransfer);
1025
+ }, [firstColAccessible, getMouseArgsForPosition, onDrop]);
1026
+ useEventListener("drop", onDropImpl, eventTargetRef?.current ?? null, false, false);
1027
+ const onDragLeaveImpl = React.useCallback(() => {
1028
+ onDragLeave?.();
1029
+ }, [onDragLeave]);
1030
+ useEventListener("dragleave", onDragLeaveImpl, eventTargetRef?.current ?? null, false, false);
1031
+ const selectionRef = React.useRef(selection);
1032
+ selectionRef.current = selection;
1033
+ const focusRef = React.useRef(null);
1034
+ const focusElement = React.useCallback((el) => {
1035
+ // We don't want to steal the focus if we don't currently own the focus.
1036
+ if (ref.current === null || !ref.current.contains(document.activeElement))
1037
+ return;
1038
+ if (el === null && selectionRef.current.current !== undefined) {
1039
+ canvasRef?.current?.focus({
1040
+ preventScroll: true,
1041
+ });
1042
+ }
1043
+ else if (el !== null) {
1044
+ el.focus({
1045
+ preventScroll: true,
1046
+ });
1047
+ }
1048
+ focusRef.current = el;
1049
+ }, [canvasRef]);
1050
+ React.useImperativeHandle(forwardedRef, () => ({
1051
+ focus: () => {
1052
+ const el = focusRef.current;
1053
+ // The element in the ref may have been removed however our callback method ref
1054
+ // won't see the removal so bad things happen. Checking to see if the element is
1055
+ // no longer attached is enough to resolve the problem. In the future this
1056
+ // should be replaced with something much more robust.
1057
+ if (el === null || !document.contains(el)) {
1058
+ canvasRef?.current?.focus({
1059
+ preventScroll: true,
1060
+ });
1061
+ }
1062
+ else {
1063
+ el.focus({
1064
+ preventScroll: true,
1065
+ });
1066
+ }
1067
+ },
1068
+ getBounds: (col, row) => {
1069
+ if (canvasRef === undefined || canvasRef.current === null) {
1070
+ return undefined;
1071
+ }
1072
+ return getBoundsForItem(canvasRef.current, col ?? 0, row ?? -1);
1073
+ },
1074
+ damage,
1075
+ getMouseArgsForPosition: (posX, posY, ev) => {
1076
+ if (canvasRef === undefined || canvasRef.current === null) {
1077
+ return undefined;
1078
+ }
1079
+ return getMouseArgsForPosition(canvasRef.current, posX, posY, ev);
1080
+ },
1081
+ }), [canvasRef, damage, getBoundsForItem, getMouseArgsForPosition]);
1082
+ const lastFocusedSubdomNode = React.useRef(undefined);
1083
+ const accessibilityTree = useDebouncedMemo(() => {
1084
+ if (width < 50 || experimental?.disableAccessibilityTree === true)
1085
+ return null;
1086
+ let effectiveCols = getEffectiveColumns(mappedColumns, cellXOffset, width, dragAndDropState, translateX);
1087
+ const colOffset = firstColAccessible ? 0 : -1;
1088
+ if (!firstColAccessible && effectiveCols[0]?.sourceIndex === 0) {
1089
+ effectiveCols = effectiveCols.slice(1);
1090
+ }
1091
+ const [fCol, fRow] = selection.current?.cell ?? [];
1092
+ const range = selection.current?.range;
1093
+ const visibleCols = effectiveCols.map(c => c.sourceIndex);
1094
+ const visibleRows = makeRange(cellYOffset, Math.min(rows, cellYOffset + accessibilityHeight));
1095
+ // Maintain focus within grid if we own it but focused cell is outside visible viewport
1096
+ // and not rendered.
1097
+ if (fCol !== undefined &&
1098
+ fRow !== undefined &&
1099
+ !(visibleCols.includes(fCol) && visibleRows.includes(fRow))) {
1100
+ focusElement(null);
1101
+ }
1102
+ return (React.createElement("table", { key: "access-tree", role: "grid", "aria-rowcount": rows + 1, "aria-multiselectable": "true", "aria-colcount": mappedColumns.length + colOffset },
1103
+ React.createElement("thead", { role: "rowgroup" },
1104
+ React.createElement("tr", { role: "row", "aria-rowindex": 1 }, effectiveCols.map(c => (React.createElement("th", { role: "columnheader", "aria-selected": selection.columns.hasIndex(c.sourceIndex), "aria-colindex": c.sourceIndex + 1 + colOffset, tabIndex: -1, onFocus: e => {
1105
+ if (e.target === focusRef.current)
1106
+ return;
1107
+ return onCellFocused?.([c.sourceIndex, -1]);
1108
+ }, key: c.sourceIndex }, c.title))))),
1109
+ React.createElement("tbody", { role: "rowgroup" }, visibleRows.map(row => (React.createElement("tr", { role: "row", "aria-selected": selection.rows.hasIndex(row), key: row, "aria-rowindex": row + 2 }, effectiveCols.map(c => {
1110
+ const col = c.sourceIndex;
1111
+ const key = packColRowToNumber(col, row);
1112
+ const focused = fCol === col && fRow === row;
1113
+ const selected = range !== undefined &&
1114
+ col >= range.x &&
1115
+ col < range.x + range.width &&
1116
+ row >= range.y &&
1117
+ row < range.y + range.height;
1118
+ const id = `glide-cell-${col}-${row}`;
1119
+ const location = [col, row];
1120
+ const cellContent = getCellContent(location, true);
1121
+ return (React.createElement("td", { key: key, role: "gridcell", "aria-colindex": col + 1 + colOffset, "aria-selected": selected, "aria-readonly": isInnerOnlyCell(cellContent) || !isReadWriteCell(cellContent), id: id, "data-testid": id, onClick: () => {
1122
+ const canvas = canvasRef?.current;
1123
+ if (canvas === null || canvas === undefined)
1124
+ return;
1125
+ return onKeyDown?.({
1126
+ bounds: getBoundsForItem(canvas, col, row),
1127
+ cancel: () => undefined,
1128
+ preventDefault: () => undefined,
1129
+ stopPropagation: () => undefined,
1130
+ ctrlKey: false,
1131
+ key: "Enter",
1132
+ keyCode: 13,
1133
+ metaKey: false,
1134
+ shiftKey: false,
1135
+ altKey: false,
1136
+ rawEvent: undefined,
1137
+ location,
1138
+ });
1139
+ }, onFocusCapture: e => {
1140
+ if (e.target === focusRef.current ||
1141
+ (lastFocusedSubdomNode.current?.[0] === col &&
1142
+ lastFocusedSubdomNode.current?.[1] === row))
1143
+ return;
1144
+ lastFocusedSubdomNode.current = location;
1145
+ return onCellFocused?.(location);
1146
+ }, ref: focused ? focusElement : undefined, tabIndex: -1 }, getRowData(cellContent, getCellRenderer)));
1147
+ })))))));
1148
+ }, [
1149
+ width,
1150
+ mappedColumns,
1151
+ cellXOffset,
1152
+ dragAndDropState,
1153
+ translateX,
1154
+ rows,
1155
+ cellYOffset,
1156
+ accessibilityHeight,
1157
+ selection,
1158
+ focusElement,
1159
+ getCellContent,
1160
+ canvasRef,
1161
+ onKeyDown,
1162
+ getBoundsForItem,
1163
+ onCellFocused,
1164
+ ], 200);
1165
+ const opacityX = freezeColumns === 0 || !fixedShadowX ? 0 : cellXOffset > freezeColumns ? 1 : clamp(-translateX / 100, 0, 1);
1166
+ const absoluteOffsetY = -cellYOffset * 32 + translateY;
1167
+ const opacityY = !fixedShadowY ? 0 : clamp(-absoluteOffsetY / 100, 0, 1);
1168
+ const stickyShadow = React.useMemo(() => {
1169
+ if (!opacityX && !opacityY) {
1170
+ return null;
1171
+ }
1172
+ const styleX = {
1173
+ position: "absolute",
1174
+ top: 0,
1175
+ left: stickyX,
1176
+ width: width - stickyX,
1177
+ height: height,
1178
+ opacity: opacityX,
1179
+ pointerEvents: "none",
1180
+ transition: !smoothScrollX ? "opacity 0.2s" : undefined,
1181
+ boxShadow: "inset 13px 0 10px -13px rgba(0, 0, 0, 0.2)",
1182
+ };
1183
+ const styleY = {
1184
+ position: "absolute",
1185
+ top: totalHeaderHeight,
1186
+ left: 0,
1187
+ width: width,
1188
+ height: height,
1189
+ opacity: opacityY,
1190
+ pointerEvents: "none",
1191
+ transition: !smoothScrollY ? "opacity 0.2s" : undefined,
1192
+ boxShadow: "inset 0 13px 10px -13px rgba(0, 0, 0, 0.2)",
1193
+ };
1194
+ return (React.createElement(React.Fragment, null,
1195
+ opacityX > 0 && React.createElement("div", { id: "shadow-x", style: styleX }),
1196
+ opacityY > 0 && React.createElement("div", { id: "shadow-y", style: styleY })));
1197
+ }, [opacityX, opacityY, stickyX, width, smoothScrollX, totalHeaderHeight, height, smoothScrollY]);
1198
+ const overlayStyle = React.useMemo(() => ({
1199
+ position: "absolute",
1200
+ top: 0,
1201
+ left: 0,
1202
+ }), []);
1203
+ return (React.createElement(React.Fragment, null,
1204
+ React.createElement("canvas", { "data-testid": "data-grid-canvas", tabIndex: 0, onKeyDown: onKeyDownImpl, onKeyUp: onKeyUpImpl, onFocus: onCanvasFocused, onBlur: onCanvasBlur, ref: refImpl, style: style }, accessibilityTree),
1205
+ React.createElement("canvas", { ref: overlayRef, style: overlayStyle }),
1206
+ stickyShadow));
1207
+ };
1208
+ export default React.memo(React.forwardRef(DataGrid));
1209
+ //# sourceMappingURL=data-grid.js.map