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