@ahrowe/ui 0.34.0 → 0.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1172) hide show
  1. package/README.md +158 -68
  2. package/dist/cjs-types/common/accordion/accordion.d.ts +4 -0
  3. package/dist/cjs-types/common/accordion/accordion.types.d.ts +21 -0
  4. package/dist/cjs-types/common/accordion/index.d.ts +2 -0
  5. package/dist/cjs-types/common/actionButtons/actionButtons.d.ts +2 -0
  6. package/dist/cjs-types/common/actionButtons/actionButtons.types.d.ts +34 -0
  7. package/dist/cjs-types/common/actionButtons/index.d.ts +2 -0
  8. package/dist/cjs-types/common/actionIcon/actionIcon.d.ts +4 -0
  9. package/dist/cjs-types/common/actionIcon/actionIcon.types.d.ts +15 -0
  10. package/dist/cjs-types/common/actionIcon/index.d.ts +2 -0
  11. package/dist/cjs-types/common/alert/alert.d.ts +4 -0
  12. package/dist/cjs-types/common/alert/alert.types.d.ts +30 -0
  13. package/dist/cjs-types/common/alert/index.d.ts +2 -0
  14. package/dist/cjs-types/common/animatedIcon/animatedIcon.d.ts +3 -0
  15. package/dist/cjs-types/common/animatedIcon/animatedIcon.types.d.ts +25 -0
  16. package/dist/cjs-types/common/animatedIcon/index.d.ts +2 -0
  17. package/dist/cjs-types/common/animatedLogo/animatedLogo.d.ts +4 -0
  18. package/dist/cjs-types/common/animatedLogo/animatedLogo.types.d.ts +35 -0
  19. package/dist/cjs-types/common/animatedLogo/index.d.ts +2 -0
  20. package/dist/cjs-types/common/animatedText/animatedText.d.ts +4 -0
  21. package/dist/cjs-types/common/animatedText/animatedText.types.d.ts +65 -0
  22. package/dist/cjs-types/common/animatedText/index.d.ts +2 -0
  23. package/dist/cjs-types/common/avatar/avatar.d.ts +4 -0
  24. package/dist/cjs-types/common/avatar/avatar.types.d.ts +26 -0
  25. package/dist/cjs-types/common/avatar/avatarGroup.d.ts +4 -0
  26. package/dist/cjs-types/common/avatar/index.d.ts +3 -0
  27. package/dist/cjs-types/common/badge/badge.d.ts +4 -0
  28. package/dist/cjs-types/common/badge/badge.types.d.ts +31 -0
  29. package/dist/cjs-types/common/badge/index.d.ts +2 -0
  30. package/dist/cjs-types/common/bodyEnd/bodyEnd.d.ts +4 -0
  31. package/dist/cjs-types/common/bodyEnd/bodyEnd.types.d.ts +4 -0
  32. package/dist/cjs-types/common/bodyEnd/index.d.ts +2 -0
  33. package/dist/cjs-types/common/breadcrumb/breadcrumb.d.ts +4 -0
  34. package/dist/cjs-types/common/breadcrumb/breadcrumb.types.d.ts +33 -0
  35. package/dist/cjs-types/common/breadcrumb/index.d.ts +2 -0
  36. package/dist/cjs-types/common/button/button.d.ts +9 -0
  37. package/dist/cjs-types/common/button/button.types.d.ts +42 -0
  38. package/dist/cjs-types/common/button/index.d.ts +2 -0
  39. package/dist/cjs-types/common/buttonGroup/buttonGroup.d.ts +4 -0
  40. package/dist/cjs-types/common/buttonGroup/buttonGroup.types.d.ts +12 -0
  41. package/dist/cjs-types/common/buttonGroup/index.d.ts +2 -0
  42. package/dist/cjs-types/common/card/Card.d.ts +4 -0
  43. package/dist/cjs-types/common/card/CardActions.d.ts +4 -0
  44. package/dist/cjs-types/common/card/CardContent.d.ts +4 -0
  45. package/dist/cjs-types/common/card/CardHeader.d.ts +4 -0
  46. package/dist/cjs-types/common/card/CardMedia.d.ts +4 -0
  47. package/dist/cjs-types/common/card/card.types.d.ts +55 -0
  48. package/dist/cjs-types/common/card/index.d.ts +6 -0
  49. package/dist/cjs-types/common/carousel/carousel.d.ts +4 -0
  50. package/dist/cjs-types/common/carousel/carousel.types.d.ts +35 -0
  51. package/dist/cjs-types/common/carousel/index.d.ts +2 -0
  52. package/dist/cjs-types/common/checkbox/checkbox.d.ts +4 -0
  53. package/dist/cjs-types/common/checkbox/checkbox.types.d.ts +27 -0
  54. package/dist/cjs-types/common/checkbox/index.d.ts +2 -0
  55. package/dist/cjs-types/common/chip/chip.d.ts +4 -0
  56. package/dist/cjs-types/common/chip/chip.types.d.ts +35 -0
  57. package/dist/cjs-types/common/chip/chipContainer.d.ts +4 -0
  58. package/dist/cjs-types/common/chip/index.d.ts +3 -0
  59. package/dist/cjs-types/common/colorPicker/colorPicker.d.ts +4 -0
  60. package/dist/cjs-types/common/colorPicker/colorPicker.types.d.ts +25 -0
  61. package/dist/cjs-types/common/colorPicker/index.d.ts +2 -0
  62. package/dist/cjs-types/common/colorPicker/toHex.d.ts +11 -0
  63. package/dist/cjs-types/common/configProvider/configProvider.d.ts +13 -0
  64. package/dist/cjs-types/common/configProvider/configProvider.types.d.ts +133 -0
  65. package/dist/cjs-types/common/configProvider/index.d.ts +6 -0
  66. package/dist/cjs-types/common/configProvider/presentation.types.d.ts +14 -0
  67. package/dist/cjs-types/common/configProvider/useComponentDefaults.d.ts +17 -0
  68. package/dist/cjs-types/common/configProvider/useLabels.d.ts +22 -0
  69. package/dist/cjs-types/common/configProvider/usePresentationDefault.d.ts +8 -0
  70. package/dist/cjs-types/common/confirmModal/confirmModal.d.ts +4 -0
  71. package/dist/cjs-types/common/confirmModal/confirmModal.types.d.ts +24 -0
  72. package/dist/cjs-types/common/confirmModal/index.d.ts +2 -0
  73. package/dist/cjs-types/common/datePicker/components/datePickerMonth/datePickerMonth.d.ts +2 -0
  74. package/dist/cjs-types/common/datePicker/components/datePickerMonth/datePickerMonth.types.d.ts +23 -0
  75. package/dist/cjs-types/common/datePicker/components/datePickerMonth/index.d.ts +1 -0
  76. package/dist/cjs-types/common/datePicker/dateFunctions.d.ts +44 -0
  77. package/dist/cjs-types/common/datePicker/datePicker.d.ts +3 -0
  78. package/dist/cjs-types/common/datePicker/datePicker.types.d.ts +60 -0
  79. package/dist/cjs-types/common/datePicker/index.d.ts +2 -0
  80. package/dist/cjs-types/common/divider/divider.d.ts +4 -0
  81. package/dist/cjs-types/common/divider/divider.types.d.ts +21 -0
  82. package/dist/cjs-types/common/divider/index.d.ts +2 -0
  83. package/dist/cjs-types/common/drawer/drawer.d.ts +4 -0
  84. package/dist/cjs-types/common/drawer/drawer.types.d.ts +15 -0
  85. package/dist/cjs-types/common/drawer/index.d.ts +2 -0
  86. package/dist/cjs-types/common/dropZone/dropZone.d.ts +4 -0
  87. package/dist/cjs-types/common/dropZone/dropZone.types.d.ts +90 -0
  88. package/dist/cjs-types/common/dropZone/index.d.ts +2 -0
  89. package/dist/cjs-types/common/dropdown/dropdown.d.ts +4 -0
  90. package/dist/cjs-types/common/dropdown/dropdown.types.d.ts +47 -0
  91. package/dist/cjs-types/common/dropdown/index.d.ts +2 -0
  92. package/dist/cjs-types/common/emptyState/emptyState.d.ts +3 -0
  93. package/dist/cjs-types/common/emptyState/emptyState.types.d.ts +20 -0
  94. package/dist/cjs-types/common/emptyState/index.d.ts +2 -0
  95. package/dist/cjs-types/common/errorBoundary/errorBoundary.d.ts +14 -0
  96. package/dist/cjs-types/common/errorBoundary/errorBoundary.types.d.ts +57 -0
  97. package/dist/cjs-types/common/errorBoundary/index.d.ts +2 -0
  98. package/dist/cjs-types/common/fab/components/fabBase/fabBase.d.ts +3 -0
  99. package/dist/cjs-types/common/fab/components/fabBase/fabBase.types.d.ts +12 -0
  100. package/dist/cjs-types/common/fab/components/fabBase/index.d.ts +1 -0
  101. package/dist/cjs-types/common/fab/fab.d.ts +3 -0
  102. package/dist/cjs-types/common/fab/fab.types.d.ts +22 -0
  103. package/dist/cjs-types/common/fab/index.d.ts +2 -0
  104. package/dist/cjs-types/common/flip/flip.d.ts +3 -0
  105. package/dist/cjs-types/common/flip/flip.types.d.ts +44 -0
  106. package/dist/cjs-types/common/flip/index.d.ts +2 -0
  107. package/dist/cjs-types/common/floorPlan/floorPlan.faces.d.ts +33 -0
  108. package/dist/cjs-types/common/floorPlan/floorPlan.fixtures.d.ts +35 -0
  109. package/dist/cjs-types/common/floorPlan/floorPlan.geometry.d.ts +111 -0
  110. package/dist/cjs-types/common/floorPlan/floorPlan.graph.d.ts +184 -0
  111. package/dist/cjs-types/common/floorPlan/floorPlan.hit.d.ts +26 -0
  112. package/dist/cjs-types/common/floorPlan/floorPlan.json.d.ts +23 -0
  113. package/dist/cjs-types/common/floorPlan/floorPlan.mesh.d.ts +36 -0
  114. package/dist/cjs-types/common/floorPlan/floorPlan.path.d.ts +59 -0
  115. package/dist/cjs-types/common/floorPlan/floorPlan.plan.d.ts +98 -0
  116. package/dist/cjs-types/common/floorPlan/floorPlan.rooms.d.ts +47 -0
  117. package/dist/cjs-types/common/floorPlan/floorPlan.snap.d.ts +101 -0
  118. package/dist/cjs-types/common/floorPlan/floorPlan.triangulate.d.ts +11 -0
  119. package/dist/cjs-types/common/floorPlan/floorPlan.types.d.ts +276 -0
  120. package/dist/cjs-types/common/floorPlan/index.d.ts +30 -0
  121. package/dist/cjs-types/common/floorPlan/legacySvg.d.ts +27 -0
  122. package/dist/cjs-types/common/hooks/useAnchorTracking.d.ts +40 -0
  123. package/dist/cjs-types/common/hooks/useCoarsePointer.d.ts +3 -0
  124. package/dist/cjs-types/common/hooks/useFocusBoundary.d.ts +20 -0
  125. package/dist/cjs-types/common/hooks/useMediaQuery.d.ts +9 -0
  126. package/dist/cjs-types/common/hooks/useOverlay.d.ts +26 -0
  127. package/dist/cjs-types/common/hooks/useScrollEdges.d.ts +18 -0
  128. package/dist/cjs-types/common/hooks/useSheet.d.ts +19 -0
  129. package/dist/cjs-types/common/hooks/useSwipeDismiss.d.ts +33 -0
  130. package/dist/cjs-types/common/hooks/useVisualViewportSize.d.ts +13 -0
  131. package/dist/cjs-types/common/iconPicker/iconPicker.d.ts +3 -0
  132. package/dist/cjs-types/common/iconPicker/iconPicker.types.d.ts +23 -0
  133. package/dist/cjs-types/common/iconPicker/index.d.ts +2 -0
  134. package/dist/cjs-types/common/idleManager/idleManager.d.ts +3 -0
  135. package/dist/cjs-types/common/idleManager/idleManager.types.d.ts +8 -0
  136. package/dist/cjs-types/common/idleManager/index.d.ts +2 -0
  137. package/dist/cjs-types/common/infiniteBlock/useInfiniteScroll.d.ts +5 -0
  138. package/dist/cjs-types/common/input/index.d.ts +2 -0
  139. package/dist/cjs-types/common/input/input.d.ts +4 -0
  140. package/dist/cjs-types/common/input/input.types.d.ts +84 -0
  141. package/dist/cjs-types/common/inputDropdown/index.d.ts +2 -0
  142. package/dist/cjs-types/common/inputDropdown/inputDropdown.d.ts +3 -0
  143. package/dist/cjs-types/common/inputDropdown/inputDropdown.types.d.ts +36 -0
  144. package/dist/cjs-types/common/interactableDiv/index.d.ts +2 -0
  145. package/dist/cjs-types/common/interactableDiv/interactableDiv.d.ts +8 -0
  146. package/dist/cjs-types/common/kanbanBoard/KanbanBoard.d.ts +3 -0
  147. package/dist/cjs-types/common/kanbanBoard/KanbanColumn.d.ts +45 -0
  148. package/dist/cjs-types/common/kanbanBoard/KanbanItem.d.ts +3 -0
  149. package/dist/cjs-types/common/kanbanBoard/index.d.ts +3 -0
  150. package/dist/cjs-types/common/kanbanBoard/kanbanBoard.types.d.ts +129 -0
  151. package/dist/cjs-types/common/kanbanBoard/kanbanBoard.utils.d.ts +60 -0
  152. package/dist/cjs-types/common/klipyPicker/components/gifPreview/gifPreview.d.ts +3 -0
  153. package/dist/cjs-types/common/klipyPicker/components/gifPreview/gifPreview.types.d.ts +7 -0
  154. package/dist/cjs-types/common/klipyPicker/components/gifPreview/index.d.ts +1 -0
  155. package/dist/cjs-types/common/klipyPicker/components/gifView/gifView.d.ts +3 -0
  156. package/dist/cjs-types/common/klipyPicker/components/gifView/gifView.types.d.ts +4 -0
  157. package/dist/cjs-types/common/klipyPicker/components/gifView/index.d.ts +1 -0
  158. package/dist/cjs-types/common/klipyPicker/index.d.ts +2 -0
  159. package/dist/cjs-types/common/klipyPicker/klipyPicker.d.ts +3 -0
  160. package/dist/cjs-types/common/klipyPicker/klipyPicker.types.d.ts +15 -0
  161. package/dist/cjs-types/common/loading/iconLoading/iconLoading.d.ts +5 -0
  162. package/dist/cjs-types/common/loading/iconLoading/index.d.ts +2 -0
  163. package/dist/cjs-types/common/loading/index.d.ts +2 -0
  164. package/dist/cjs-types/common/loading/spinnerLoading/index.d.ts +2 -0
  165. package/dist/cjs-types/common/loading/spinnerLoading/spinnerLoading.d.ts +6 -0
  166. package/dist/cjs-types/common/maskedInput/index.d.ts +2 -0
  167. package/dist/cjs-types/common/maskedInput/mask.d.ts +48 -0
  168. package/dist/cjs-types/common/maskedInput/maskedInput.d.ts +13 -0
  169. package/dist/cjs-types/common/maskedInput/maskedInput.types.d.ts +38 -0
  170. package/dist/cjs-types/common/menu/index.d.ts +2 -0
  171. package/dist/cjs-types/common/menu/menu.d.ts +14 -0
  172. package/dist/cjs-types/common/menu/menu.types.d.ts +55 -0
  173. package/dist/cjs-types/common/modal/index.d.ts +2 -0
  174. package/dist/cjs-types/common/modal/modal.d.ts +3 -0
  175. package/dist/cjs-types/common/modal/modal.types.d.ts +31 -0
  176. package/dist/cjs-types/common/multiSelect/index.d.ts +2 -0
  177. package/dist/cjs-types/common/multiSelect/multiSelect.d.ts +4 -0
  178. package/dist/cjs-types/common/multiSelect/multiSelect.types.d.ts +69 -0
  179. package/dist/cjs-types/common/numberInput/index.d.ts +3 -0
  180. package/dist/cjs-types/common/numberInput/numberInput.d.ts +5 -0
  181. package/dist/cjs-types/common/numberInput/numberInput.types.d.ts +76 -0
  182. package/dist/cjs-types/common/numberInput/useStepRepeat.d.ts +17 -0
  183. package/dist/cjs-types/common/optionPicker/index.d.ts +2 -0
  184. package/dist/cjs-types/common/optionPicker/optionPicker.d.ts +4 -0
  185. package/dist/cjs-types/common/optionPicker/optionPicker.types.d.ts +16 -0
  186. package/dist/cjs-types/common/otpInput/index.d.ts +2 -0
  187. package/dist/cjs-types/common/otpInput/otpInput.d.ts +4 -0
  188. package/dist/cjs-types/common/otpInput/otpInput.types.d.ts +60 -0
  189. package/dist/cjs-types/common/overscroll/index.d.ts +2 -0
  190. package/dist/cjs-types/common/overscroll/overscroll.d.ts +2 -0
  191. package/dist/cjs-types/common/overscroll/overscroll.types.d.ts +14 -0
  192. package/dist/cjs-types/common/pagination/index.d.ts +2 -0
  193. package/dist/cjs-types/common/pagination/pagination.d.ts +4 -0
  194. package/dist/cjs-types/common/pagination/pagination.types.d.ts +45 -0
  195. package/dist/cjs-types/common/planCanvas/index.d.ts +2 -0
  196. package/dist/cjs-types/common/planCanvas/planCanvas.d.ts +7 -0
  197. package/dist/cjs-types/common/planCanvas/planCanvas.types.d.ts +64 -0
  198. package/dist/cjs-types/common/popover/index.d.ts +2 -0
  199. package/dist/cjs-types/common/popover/popover.d.ts +3 -0
  200. package/dist/cjs-types/common/popover/popover.types.d.ts +94 -0
  201. package/dist/cjs-types/common/popover/usePopoverPosition.d.ts +44 -0
  202. package/dist/cjs-types/common/progressBar/index.d.ts +2 -0
  203. package/dist/cjs-types/common/progressBar/progressBar.d.ts +5 -0
  204. package/dist/cjs-types/common/progressBar/progressBar.types.d.ts +18 -0
  205. package/dist/cjs-types/common/radioGroup/index.d.ts +2 -0
  206. package/dist/cjs-types/common/radioGroup/radioGroup.d.ts +4 -0
  207. package/dist/cjs-types/common/radioGroup/radioGroup.types.d.ts +45 -0
  208. package/dist/cjs-types/common/rating/index.d.ts +2 -0
  209. package/dist/cjs-types/common/rating/rating.d.ts +4 -0
  210. package/dist/cjs-types/common/rating/rating.types.d.ts +19 -0
  211. package/dist/cjs-types/common/revealLens/index.d.ts +2 -0
  212. package/dist/cjs-types/common/revealLens/revealLens.d.ts +4 -0
  213. package/dist/cjs-types/common/revealLens/revealLens.types.d.ts +24 -0
  214. package/dist/cjs-types/common/ripple/index.d.ts +2 -0
  215. package/dist/cjs-types/common/ripple/ripple.d.ts +5 -0
  216. package/dist/cjs-types/common/ripple/ripple.types.d.ts +16 -0
  217. package/dist/cjs-types/common/roomDrawer/index.d.ts +2 -0
  218. package/dist/cjs-types/common/roomDrawer/roomDrawer.d.ts +3 -0
  219. package/dist/cjs-types/common/roomDrawer/roomDrawer.types.d.ts +308 -0
  220. package/dist/cjs-types/common/roomDrawer/usePlanHistory.d.ts +24 -0
  221. package/dist/cjs-types/common/roomViewer/index.d.ts +2 -0
  222. package/dist/cjs-types/common/roomViewer/roomViewer.d.ts +10 -0
  223. package/dist/cjs-types/common/roomViewer/roomViewer.types.d.ts +91 -0
  224. package/dist/cjs-types/common/scrollFade/index.d.ts +2 -0
  225. package/dist/cjs-types/common/scrollFade/scrollFade.d.ts +4 -0
  226. package/dist/cjs-types/common/scrollFade/scrollFade.types.d.ts +20 -0
  227. package/dist/cjs-types/common/scrollbarProvider/index.d.ts +2 -0
  228. package/dist/cjs-types/common/scrollbarProvider/scrollbarProvider.d.ts +7 -0
  229. package/dist/cjs-types/common/searchInput/index.d.ts +2 -0
  230. package/dist/cjs-types/common/searchInput/searchInput.d.ts +3 -0
  231. package/dist/cjs-types/common/searchInput/searchInput.types.d.ts +28 -0
  232. package/dist/cjs-types/common/sectionHeader/index.d.ts +2 -0
  233. package/dist/cjs-types/common/sectionHeader/sectionHeader.d.ts +4 -0
  234. package/dist/cjs-types/common/sectionHeader/sectionHeader.types.d.ts +27 -0
  235. package/dist/cjs-types/common/sheetBackdrop/index.d.ts +2 -0
  236. package/dist/cjs-types/common/sheetBackdrop/sheetBackdrop.d.ts +16 -0
  237. package/dist/cjs-types/common/sheetBackdrop/sheetBackdrop.types.d.ts +7 -0
  238. package/dist/cjs-types/common/skeleton/index.d.ts +2 -0
  239. package/dist/cjs-types/common/skeleton/skeleton.d.ts +4 -0
  240. package/dist/cjs-types/common/skeleton/skeleton.types.d.ts +22 -0
  241. package/dist/cjs-types/common/slider/index.d.ts +2 -0
  242. package/dist/cjs-types/common/slider/slider.d.ts +3 -0
  243. package/dist/cjs-types/common/slider/slider.types.d.ts +68 -0
  244. package/dist/cjs-types/common/splitButton/index.d.ts +2 -0
  245. package/dist/cjs-types/common/splitButton/splitButton.d.ts +3 -0
  246. package/dist/cjs-types/common/splitButton/splitButton.types.d.ts +35 -0
  247. package/dist/cjs-types/common/stepper/index.d.ts +2 -0
  248. package/dist/cjs-types/common/stepper/stepper.d.ts +3 -0
  249. package/dist/cjs-types/common/stepper/stepper.types.d.ts +77 -0
  250. package/dist/cjs-types/common/sticky/index.d.ts +1 -0
  251. package/dist/cjs-types/common/sticky/sticky.d.ts +3 -0
  252. package/dist/cjs-types/common/sticky/sticky.types.d.ts +22 -0
  253. package/dist/cjs-types/common/sticky/stickyStack.d.ts +46 -0
  254. package/dist/cjs-types/common/switch/index.d.ts +2 -0
  255. package/dist/cjs-types/common/switch/switch.d.ts +4 -0
  256. package/dist/cjs-types/common/switch/switch.types.d.ts +21 -0
  257. package/dist/cjs-types/common/tabHeader/index.d.ts +2 -0
  258. package/dist/cjs-types/common/tabHeader/tabHeader.d.ts +4 -0
  259. package/dist/cjs-types/common/tabHeader/tabHeader.types.d.ts +20 -0
  260. package/dist/cjs-types/common/textarea/index.d.ts +2 -0
  261. package/dist/cjs-types/common/textarea/textarea.d.ts +3 -0
  262. package/dist/cjs-types/common/textarea/textarea.types.d.ts +2 -0
  263. package/dist/cjs-types/common/themeProvider/defaultTheme.d.ts +7 -0
  264. package/dist/cjs-types/common/themeProvider/index.d.ts +4 -0
  265. package/dist/cjs-types/common/themeProvider/lightTheme.d.ts +13 -0
  266. package/dist/cjs-types/common/themeProvider/theme.types.d.ts +272 -0
  267. package/dist/cjs-types/common/themeProvider/themeProvider.d.ts +38 -0
  268. package/dist/cjs-types/common/themeProvider/themeVariablesContext.d.ts +11 -0
  269. package/dist/cjs-types/common/themeProvider/useTheme.d.ts +4 -0
  270. package/dist/cjs-types/common/tilt/index.d.ts +4 -0
  271. package/dist/cjs-types/common/tilt/tilt.d.ts +3 -0
  272. package/dist/cjs-types/common/tilt/tilt.types.d.ts +40 -0
  273. package/dist/cjs-types/common/tilt/tiltMath.d.ts +24 -0
  274. package/dist/cjs-types/common/tiltGroup/index.d.ts +3 -0
  275. package/dist/cjs-types/common/tiltGroup/tiltGroup.d.ts +6 -0
  276. package/dist/cjs-types/common/tiltGroup/tiltGroup.types.d.ts +16 -0
  277. package/dist/cjs-types/common/timeInput/components/clockDial/clockDial.d.ts +3 -0
  278. package/dist/cjs-types/common/timeInput/components/clockDial/clockDial.types.d.ts +24 -0
  279. package/dist/cjs-types/common/timeInput/components/clockDial/index.d.ts +1 -0
  280. package/dist/cjs-types/common/timeInput/index.d.ts +1 -0
  281. package/dist/cjs-types/common/timeInput/timeFunctions.d.ts +36 -0
  282. package/dist/cjs-types/common/timeInput/timeInput.d.ts +3 -0
  283. package/dist/cjs-types/common/timeInput/timeInput.types.d.ts +44 -0
  284. package/dist/cjs-types/common/timeline/index.d.ts +2 -0
  285. package/dist/cjs-types/common/timeline/timeline.d.ts +3 -0
  286. package/dist/cjs-types/common/timeline/timeline.types.d.ts +51 -0
  287. package/dist/cjs-types/common/timer/index.d.ts +2 -0
  288. package/dist/cjs-types/common/timer/timer.chime.d.ts +1 -0
  289. package/dist/cjs-types/common/timer/timer.d.ts +3 -0
  290. package/dist/cjs-types/common/timer/timer.types.d.ts +110 -0
  291. package/dist/cjs-types/common/toast/index.d.ts +3 -0
  292. package/dist/cjs-types/common/toast/toast.d.ts +11 -0
  293. package/dist/cjs-types/common/toast/toast.types.d.ts +50 -0
  294. package/dist/cjs-types/common/toast/toastProvider.d.ts +8 -0
  295. package/dist/cjs-types/common/toast/toastService.d.ts +7 -0
  296. package/dist/cjs-types/common/tooltip/index.d.ts +2 -0
  297. package/dist/cjs-types/common/tooltip/tooltip.d.ts +3 -0
  298. package/dist/cjs-types/common/tooltip/tooltip.types.d.ts +17 -0
  299. package/dist/cjs-types/common/tree/flattenTree.d.ts +3 -0
  300. package/dist/cjs-types/common/tree/index.d.ts +3 -0
  301. package/dist/cjs-types/common/tree/tree.d.ts +4 -0
  302. package/dist/cjs-types/common/tree/tree.types.d.ts +67 -0
  303. package/dist/cjs-types/common/types/actions.types.d.ts +7 -0
  304. package/dist/cjs-types/common/types/baseProps.types.d.ts +29 -0
  305. package/dist/cjs-types/common/types/icon.types.d.ts +17 -0
  306. package/dist/cjs-types/common/types/slots.types.d.ts +4 -0
  307. package/dist/cjs-types/common/utils/activationKey.d.ts +9 -0
  308. package/dist/cjs-types/common/utils/interactiveTarget.d.ts +7 -0
  309. package/dist/cjs-types/common/utils/listNavigation.d.ts +49 -0
  310. package/dist/cjs-types/common/utils/mergeRefs.d.ts +12 -0
  311. package/dist/cjs-types/common/utils/renderIcon.d.ts +29 -0
  312. package/dist/cjs-types/common/utils/scrollAncestors.d.ts +2 -0
  313. package/dist/cjs-types/common/utils/visualViewport.d.ts +7 -0
  314. package/dist/cjs-types/common/virtualList/index.d.ts +2 -0
  315. package/dist/cjs-types/common/virtualList/useColumnResize.d.ts +59 -0
  316. package/dist/cjs-types/common/virtualList/useColumns.d.ts +52 -0
  317. package/dist/cjs-types/common/virtualList/useHeaderNavigation.d.ts +22 -0
  318. package/dist/cjs-types/common/virtualList/useRowDrag.d.ts +58 -0
  319. package/dist/cjs-types/common/virtualList/useRowNavigation.d.ts +50 -0
  320. package/dist/cjs-types/common/virtualList/useSelection.d.ts +24 -0
  321. package/dist/cjs-types/common/virtualList/useSorting.d.ts +26 -0
  322. package/dist/cjs-types/common/virtualList/useVirtualWindow.d.ts +36 -0
  323. package/dist/cjs-types/common/virtualList/virtualList.d.ts +5 -0
  324. package/dist/cjs-types/common/virtualList/virtualList.types.d.ts +317 -0
  325. package/dist/cjs-types/common/virtualList/virtualList.utils.d.ts +126 -0
  326. package/dist/cjs-types/common/virtualList/virtualListHeader.d.ts +35 -0
  327. package/dist/cjs-types/common/virtualList/virtualRow.d.ts +62 -0
  328. package/dist/cjs-types/common/wizard/index.d.ts +1 -0
  329. package/dist/cjs-types/common/wizard/wizard.d.ts +3 -0
  330. package/dist/cjs-types/common/wizard/wizard.types.d.ts +12 -0
  331. package/dist/cjs-types/hooks/useWindowSize.d.ts +6 -0
  332. package/dist/cjs-types/index.d.ts +154 -0
  333. package/dist/cjs-types/package.json +3 -0
  334. package/dist/cjs-types/services/formValidation/FormValidatorGroupWithForm.d.ts +18 -0
  335. package/dist/cjs-types/services/formValidation/index.d.ts +5 -0
  336. package/dist/cjs-types/services/formValidation/useFormValidatorGroup.d.ts +10 -0
  337. package/dist/cjs-types/services/formValidation/validatableComponent.d.ts +36 -0
  338. package/dist/cjs-types/services/klipy.d.ts +36 -0
  339. package/dist/cjs-types/services/localization.d.ts +3 -0
  340. package/dist/esm/common/accordion/accordion.mjs +1 -1
  341. package/dist/esm/common/accordion/accordion.mjs.map +1 -1
  342. package/dist/esm/common/accordion/accordion.module.mjs +1 -1
  343. package/dist/esm/common/accordion/accordion.module.mjs.map +1 -1
  344. package/dist/esm/common/accordion/accordion.plain.module.mjs +1 -1
  345. package/dist/esm/common/accordion/accordion.plain.module.mjs.map +1 -1
  346. package/dist/esm/common/accordion/accordion.primary.module.mjs +1 -1
  347. package/dist/esm/common/accordion/accordion.primary.module.mjs.map +1 -1
  348. package/dist/esm/common/accordion/accordion.types.mjs +1 -1
  349. package/dist/esm/common/accordion/accordion.types.mjs.map +1 -1
  350. package/dist/esm/common/actionButtons/actionButtons.mjs +1 -1
  351. package/dist/esm/common/actionButtons/actionButtons.mjs.map +1 -1
  352. package/dist/esm/common/actionButtons/actionButtons.module.mjs +1 -1
  353. package/dist/esm/common/actionIcon/actionIcon.mjs +1 -1
  354. package/dist/esm/common/actionIcon/actionIcon.mjs.map +1 -1
  355. package/dist/esm/common/actionIcon/actionIcon.module.mjs +1 -1
  356. package/dist/esm/common/alert/alert.mjs +1 -1
  357. package/dist/esm/common/alert/alert.mjs.map +1 -1
  358. package/dist/esm/common/alert/alert.module.mjs +1 -1
  359. package/dist/esm/common/alert/alert.types.mjs +1 -1
  360. package/dist/esm/common/alert/alert.types.mjs.map +1 -1
  361. package/dist/esm/common/animatedIcon/animatedIcon.mjs +1 -1
  362. package/dist/esm/common/animatedIcon/animatedIcon.mjs.map +1 -1
  363. package/dist/esm/common/animatedIcon/animatedIcon.module.mjs +1 -1
  364. package/dist/esm/common/animatedLogo/animatedLogo.mjs +1 -1
  365. package/dist/esm/common/animatedLogo/animatedLogo.mjs.map +1 -1
  366. package/dist/esm/common/animatedLogo/animatedLogo.module.mjs +1 -1
  367. package/dist/esm/common/animatedText/animatedText.mjs +1 -1
  368. package/dist/esm/common/animatedText/animatedText.mjs.map +1 -1
  369. package/dist/esm/common/animatedText/animatedText.module.mjs +1 -1
  370. package/dist/esm/common/animatedText/animatedText.types.mjs +1 -1
  371. package/dist/esm/common/animatedText/animatedText.types.mjs.map +1 -1
  372. package/dist/esm/common/avatar/avatar.mjs +1 -1
  373. package/dist/esm/common/avatar/avatar.mjs.map +1 -1
  374. package/dist/esm/common/avatar/avatar.module.mjs +1 -1
  375. package/dist/esm/common/avatar/avatarGroup.mjs +1 -1
  376. package/dist/esm/common/avatar/avatarGroup.mjs.map +1 -1
  377. package/dist/esm/common/badge/badge.mjs +1 -1
  378. package/dist/esm/common/badge/badge.mjs.map +1 -1
  379. package/dist/esm/common/badge/badge.module.mjs +1 -1
  380. package/dist/esm/common/badge/badge.types.mjs +1 -1
  381. package/dist/esm/common/badge/badge.types.mjs.map +1 -1
  382. package/dist/esm/common/bodyEnd/bodyEnd.mjs +1 -1
  383. package/dist/esm/common/bodyEnd/bodyEnd.mjs.map +1 -1
  384. package/dist/esm/common/breadcrumb/breadcrumb.mjs +1 -1
  385. package/dist/esm/common/breadcrumb/breadcrumb.mjs.map +1 -1
  386. package/dist/esm/common/breadcrumb/breadcrumb.module.mjs +1 -1
  387. package/dist/esm/common/button/button.mjs +1 -1
  388. package/dist/esm/common/button/button.mjs.map +1 -1
  389. package/dist/esm/common/button/button.module.mjs +1 -1
  390. package/dist/esm/common/button/button.types.mjs +1 -1
  391. package/dist/esm/common/button/button.types.mjs.map +1 -1
  392. package/dist/esm/common/buttonGroup/buttonGroup.mjs +1 -1
  393. package/dist/esm/common/buttonGroup/buttonGroup.mjs.map +1 -1
  394. package/dist/esm/common/buttonGroup/buttonGroup.module.mjs +1 -1
  395. package/dist/esm/common/buttonGroup/buttonGroup.types.mjs +1 -1
  396. package/dist/esm/common/buttonGroup/buttonGroup.types.mjs.map +1 -1
  397. package/dist/esm/common/card/Card.mjs +1 -1
  398. package/dist/esm/common/card/Card.mjs.map +1 -1
  399. package/dist/esm/common/card/CardActions.mjs +1 -1
  400. package/dist/esm/common/card/CardActions.mjs.map +1 -1
  401. package/dist/esm/common/card/CardContent.mjs +1 -1
  402. package/dist/esm/common/card/CardContent.mjs.map +1 -1
  403. package/dist/esm/common/card/CardHeader.mjs +1 -1
  404. package/dist/esm/common/card/CardHeader.mjs.map +1 -1
  405. package/dist/esm/common/card/CardMedia.mjs +1 -1
  406. package/dist/esm/common/card/CardMedia.mjs.map +1 -1
  407. package/dist/esm/common/card/card.module.mjs +1 -1
  408. package/dist/esm/common/card/card.module.mjs.map +1 -1
  409. package/dist/esm/common/card/card.types.mjs +1 -1
  410. package/dist/esm/common/card/card.types.mjs.map +1 -1
  411. package/dist/esm/common/carousel/carousel.mjs +1 -1
  412. package/dist/esm/common/carousel/carousel.mjs.map +1 -1
  413. package/dist/esm/common/carousel/carousel.module.mjs +1 -1
  414. package/dist/esm/common/carousel/carousel.module.mjs.map +1 -1
  415. package/dist/esm/common/checkbox/checkbox.mjs +1 -1
  416. package/dist/esm/common/checkbox/checkbox.mjs.map +1 -1
  417. package/dist/esm/common/checkbox/checkbox.module.mjs +1 -1
  418. package/dist/esm/common/checkbox/checkbox.module.mjs.map +1 -1
  419. package/dist/esm/common/chip/chip.mjs +1 -1
  420. package/dist/esm/common/chip/chip.mjs.map +1 -1
  421. package/dist/esm/common/chip/chip.module.mjs +1 -1
  422. package/dist/esm/common/chip/chip.types.mjs +1 -1
  423. package/dist/esm/common/chip/chip.types.mjs.map +1 -1
  424. package/dist/esm/common/chip/chipContainer.mjs +1 -1
  425. package/dist/esm/common/chip/chipContainer.mjs.map +1 -1
  426. package/dist/esm/common/colorPicker/colorPicker.mjs +1 -1
  427. package/dist/esm/common/colorPicker/colorPicker.mjs.map +1 -1
  428. package/dist/esm/common/colorPicker/colorPicker.module.mjs +1 -1
  429. package/dist/esm/common/colorPicker/colorPicker.module.mjs.map +1 -1
  430. package/dist/esm/common/colorPicker/toHex.mjs +1 -1
  431. package/dist/esm/common/colorPicker/toHex.mjs.map +1 -1
  432. package/dist/esm/common/configProvider/configProvider.mjs +1 -1
  433. package/dist/esm/common/configProvider/configProvider.mjs.map +1 -1
  434. package/dist/esm/common/configProvider/presentation.types.mjs +1 -1
  435. package/dist/esm/common/configProvider/presentation.types.mjs.map +1 -1
  436. package/dist/esm/common/configProvider/useComponentDefaults.mjs +1 -1
  437. package/dist/esm/common/configProvider/useComponentDefaults.mjs.map +1 -1
  438. package/dist/esm/common/configProvider/useLabels.mjs +1 -1
  439. package/dist/esm/common/configProvider/useLabels.mjs.map +1 -1
  440. package/dist/esm/common/configProvider/usePresentationDefault.mjs +1 -1
  441. package/dist/esm/common/configProvider/usePresentationDefault.mjs.map +1 -1
  442. package/dist/esm/common/confirmModal/confirmModal.mjs +1 -1
  443. package/dist/esm/common/confirmModal/confirmModal.mjs.map +1 -1
  444. package/dist/esm/common/datePicker/components/datePickerMonth/datePickerMonth.mjs +1 -1
  445. package/dist/esm/common/datePicker/components/datePickerMonth/datePickerMonth.mjs.map +1 -1
  446. package/dist/esm/common/datePicker/components/datePickerMonth/datePickerMonth.module.mjs +1 -1
  447. package/dist/esm/common/datePicker/dateFunctions.mjs +1 -1
  448. package/dist/esm/common/datePicker/dateFunctions.mjs.map +1 -1
  449. package/dist/esm/common/datePicker/datePicker.mjs +1 -1
  450. package/dist/esm/common/datePicker/datePicker.mjs.map +1 -1
  451. package/dist/esm/common/datePicker/datePicker.module.mjs +1 -1
  452. package/dist/esm/common/divider/divider.mjs +1 -1
  453. package/dist/esm/common/divider/divider.mjs.map +1 -1
  454. package/dist/esm/common/divider/divider.module.mjs +1 -1
  455. package/dist/esm/common/divider/divider.types.mjs +1 -1
  456. package/dist/esm/common/divider/divider.types.mjs.map +1 -1
  457. package/dist/esm/common/drawer/drawer.mjs +1 -1
  458. package/dist/esm/common/drawer/drawer.mjs.map +1 -1
  459. package/dist/esm/common/drawer/drawer.module.mjs +1 -1
  460. package/dist/esm/common/drawer/drawer.module.mjs.map +1 -1
  461. package/dist/esm/common/dropZone/dropZone.mjs +1 -1
  462. package/dist/esm/common/dropZone/dropZone.mjs.map +1 -1
  463. package/dist/esm/common/dropZone/dropZone.module.mjs +1 -1
  464. package/dist/esm/common/dropZone/dropZone.types.mjs +1 -1
  465. package/dist/esm/common/dropZone/dropZone.types.mjs.map +1 -1
  466. package/dist/esm/common/dropdown/dropdown.mjs +1 -1
  467. package/dist/esm/common/dropdown/dropdown.mjs.map +1 -1
  468. package/dist/esm/common/dropdown/dropdown.module.mjs +1 -1
  469. package/dist/esm/common/dropdown/dropdown.module.mjs.map +1 -1
  470. package/dist/esm/common/emptyState/emptyState.mjs +1 -1
  471. package/dist/esm/common/emptyState/emptyState.mjs.map +1 -1
  472. package/dist/esm/common/emptyState/emptyState.module.mjs +1 -1
  473. package/dist/esm/common/errorBoundary/errorBoundary.mjs +1 -1
  474. package/dist/esm/common/errorBoundary/errorBoundary.mjs.map +1 -1
  475. package/dist/esm/common/errorBoundary/errorBoundary.module.mjs +1 -1
  476. package/dist/esm/common/fab/components/fabBase/fabBase.mjs +1 -1
  477. package/dist/esm/common/fab/components/fabBase/fabBase.mjs.map +1 -1
  478. package/dist/esm/common/fab/components/fabBase/fabBase.module.mjs +1 -1
  479. package/dist/esm/common/fab/fab.mjs +1 -1
  480. package/dist/esm/common/fab/fab.mjs.map +1 -1
  481. package/dist/esm/common/fab/fab.module.mjs +1 -1
  482. package/dist/esm/common/fab/fab.module.mjs.map +1 -1
  483. package/dist/esm/common/flip/flip.mjs +1 -1
  484. package/dist/esm/common/flip/flip.mjs.map +1 -1
  485. package/dist/esm/common/flip/flip.module.mjs +1 -1
  486. package/dist/esm/common/floorPlan/floorPlan.faces.mjs +1 -1
  487. package/dist/esm/common/floorPlan/floorPlan.faces.mjs.map +1 -1
  488. package/dist/esm/common/floorPlan/floorPlan.geometry.mjs +1 -1
  489. package/dist/esm/common/floorPlan/floorPlan.geometry.mjs.map +1 -1
  490. package/dist/esm/common/floorPlan/floorPlan.graph.mjs +1 -1
  491. package/dist/esm/common/floorPlan/floorPlan.graph.mjs.map +1 -1
  492. package/dist/esm/common/floorPlan/floorPlan.hit.mjs +1 -1
  493. package/dist/esm/common/floorPlan/floorPlan.hit.mjs.map +1 -1
  494. package/dist/esm/common/floorPlan/floorPlan.json.mjs +1 -1
  495. package/dist/esm/common/floorPlan/floorPlan.json.mjs.map +1 -1
  496. package/dist/esm/common/floorPlan/floorPlan.mesh.mjs +1 -1
  497. package/dist/esm/common/floorPlan/floorPlan.mesh.mjs.map +1 -1
  498. package/dist/esm/common/floorPlan/floorPlan.path.mjs +1 -1
  499. package/dist/esm/common/floorPlan/floorPlan.path.mjs.map +1 -1
  500. package/dist/esm/common/floorPlan/floorPlan.plan.mjs +1 -1
  501. package/dist/esm/common/floorPlan/floorPlan.plan.mjs.map +1 -1
  502. package/dist/esm/common/floorPlan/floorPlan.rooms.mjs +1 -1
  503. package/dist/esm/common/floorPlan/floorPlan.rooms.mjs.map +1 -1
  504. package/dist/esm/common/floorPlan/floorPlan.snap.mjs +1 -1
  505. package/dist/esm/common/floorPlan/floorPlan.snap.mjs.map +1 -1
  506. package/dist/esm/common/floorPlan/floorPlan.triangulate.mjs +1 -1
  507. package/dist/esm/common/floorPlan/floorPlan.triangulate.mjs.map +1 -1
  508. package/dist/esm/common/floorPlan/floorPlan.types.mjs +1 -1
  509. package/dist/esm/common/floorPlan/floorPlan.types.mjs.map +1 -1
  510. package/dist/esm/common/floorPlan/legacySvg.mjs +1 -1
  511. package/dist/esm/common/floorPlan/legacySvg.mjs.map +1 -1
  512. package/dist/esm/common/hooks/useAnchorTracking.mjs +1 -1
  513. package/dist/esm/common/hooks/useAnchorTracking.mjs.map +1 -1
  514. package/dist/esm/common/hooks/useCoarsePointer.mjs +1 -1
  515. package/dist/esm/common/hooks/useCoarsePointer.mjs.map +1 -1
  516. package/dist/esm/common/hooks/useFocusBoundary.mjs +1 -1
  517. package/dist/esm/common/hooks/useFocusBoundary.mjs.map +1 -1
  518. package/dist/esm/common/hooks/useMediaQuery.mjs +1 -1
  519. package/dist/esm/common/hooks/useMediaQuery.mjs.map +1 -1
  520. package/dist/esm/common/hooks/useOverlay.mjs +1 -1
  521. package/dist/esm/common/hooks/useOverlay.mjs.map +1 -1
  522. package/dist/esm/common/hooks/useScrollEdges.mjs +2 -0
  523. package/dist/esm/common/hooks/useScrollEdges.mjs.map +1 -0
  524. package/dist/esm/common/hooks/useSheet.mjs +1 -1
  525. package/dist/esm/common/hooks/useSheet.mjs.map +1 -1
  526. package/dist/esm/common/hooks/useSwipeDismiss.mjs +1 -1
  527. package/dist/esm/common/hooks/useSwipeDismiss.mjs.map +1 -1
  528. package/dist/esm/common/hooks/useVisualViewportSize.mjs +1 -1
  529. package/dist/esm/common/hooks/useVisualViewportSize.mjs.map +1 -1
  530. package/dist/esm/common/iconPicker/iconPicker.mjs +1 -1
  531. package/dist/esm/common/iconPicker/iconPicker.mjs.map +1 -1
  532. package/dist/esm/common/iconPicker/iconPicker.module.mjs +1 -1
  533. package/dist/esm/common/idleManager/idleManager.mjs +1 -1
  534. package/dist/esm/common/idleManager/idleManager.mjs.map +1 -1
  535. package/dist/esm/common/infiniteBlock/useInfiniteScroll.mjs +2 -0
  536. package/dist/esm/common/infiniteBlock/useInfiniteScroll.mjs.map +1 -0
  537. package/dist/esm/common/input/input.mjs +1 -1
  538. package/dist/esm/common/input/input.mjs.map +1 -1
  539. package/dist/esm/common/input/input.module.mjs +1 -1
  540. package/dist/esm/common/input/input.module.mjs.map +1 -1
  541. package/dist/esm/common/input/input.types.mjs +1 -1
  542. package/dist/esm/common/input/input.types.mjs.map +1 -1
  543. package/dist/esm/common/inputDropdown/inputDropdown.mjs +1 -1
  544. package/dist/esm/common/inputDropdown/inputDropdown.mjs.map +1 -1
  545. package/dist/esm/common/inputDropdown/inputDropdown.module.mjs +1 -1
  546. package/dist/esm/common/interactableDiv/index.mjs +1 -1
  547. package/dist/esm/common/interactableDiv/index.mjs.map +1 -1
  548. package/dist/esm/common/interactableDiv/interactableDiv.mjs +1 -1
  549. package/dist/esm/common/interactableDiv/interactableDiv.mjs.map +1 -1
  550. package/dist/esm/common/interactableDiv/interactableDiv.module.mjs +1 -1
  551. package/dist/esm/common/kanbanBoard/KanbanBoard.mjs +1 -1
  552. package/dist/esm/common/kanbanBoard/KanbanBoard.mjs.map +1 -1
  553. package/dist/esm/common/kanbanBoard/KanbanColumn.mjs +1 -1
  554. package/dist/esm/common/kanbanBoard/KanbanColumn.mjs.map +1 -1
  555. package/dist/esm/common/kanbanBoard/KanbanItem.mjs +1 -1
  556. package/dist/esm/common/kanbanBoard/KanbanItem.mjs.map +1 -1
  557. package/dist/esm/common/kanbanBoard/kanbanBoard.module.mjs +1 -1
  558. package/dist/esm/common/kanbanBoard/kanbanBoard.utils.mjs +1 -1
  559. package/dist/esm/common/kanbanBoard/kanbanBoard.utils.mjs.map +1 -1
  560. package/dist/esm/common/klipyPicker/components/gifPreview/gifPreview.mjs +1 -1
  561. package/dist/esm/common/klipyPicker/components/gifPreview/gifPreview.mjs.map +1 -1
  562. package/dist/esm/common/klipyPicker/components/gifPreview/gifPreview.module.mjs +1 -1
  563. package/dist/esm/common/klipyPicker/components/gifPreview/gifPreview.module.mjs.map +1 -1
  564. package/dist/esm/common/klipyPicker/components/gifView/gifView.mjs +1 -1
  565. package/dist/esm/common/klipyPicker/components/gifView/gifView.mjs.map +1 -1
  566. package/dist/esm/common/klipyPicker/components/gifView/gifView.module.mjs +1 -1
  567. package/dist/esm/common/klipyPicker/components/gifView/gifView.module.mjs.map +1 -1
  568. package/dist/esm/common/klipyPicker/klipyPicker.mjs +1 -1
  569. package/dist/esm/common/klipyPicker/klipyPicker.mjs.map +1 -1
  570. package/dist/esm/common/klipyPicker/klipyPicker.module.mjs +1 -1
  571. package/dist/esm/common/loading/iconLoading/iconLoading.mjs +1 -1
  572. package/dist/esm/common/loading/iconLoading/iconLoading.mjs.map +1 -1
  573. package/dist/esm/common/loading/iconLoading/iconLoading.module.mjs +1 -1
  574. package/dist/esm/common/loading/iconLoading/index.mjs +1 -1
  575. package/dist/esm/common/loading/iconLoading/index.mjs.map +1 -1
  576. package/dist/esm/common/loading/spinnerLoading/index.mjs +1 -1
  577. package/dist/esm/common/loading/spinnerLoading/index.mjs.map +1 -1
  578. package/dist/esm/common/loading/spinnerLoading/spinnerLoading.mjs +1 -1
  579. package/dist/esm/common/loading/spinnerLoading/spinnerLoading.mjs.map +1 -1
  580. package/dist/esm/common/loading/spinnerLoading/spinnerLoading.module.mjs +1 -1
  581. package/dist/esm/common/maskedInput/mask.mjs +2 -0
  582. package/dist/esm/common/maskedInput/mask.mjs.map +1 -0
  583. package/dist/esm/common/maskedInput/maskedInput.mjs +2 -0
  584. package/dist/esm/common/maskedInput/maskedInput.mjs.map +1 -0
  585. package/dist/esm/common/menu/menu.mjs +1 -1
  586. package/dist/esm/common/menu/menu.mjs.map +1 -1
  587. package/dist/esm/common/menu/menu.module.mjs +1 -1
  588. package/dist/esm/common/menu/menu.types.mjs +1 -1
  589. package/dist/esm/common/menu/menu.types.mjs.map +1 -1
  590. package/dist/esm/common/modal/modal.mjs +1 -1
  591. package/dist/esm/common/modal/modal.mjs.map +1 -1
  592. package/dist/esm/common/modal/modal.module.mjs +1 -1
  593. package/dist/esm/common/modal/modal.module.mjs.map +1 -1
  594. package/dist/esm/common/multiSelect/multiSelect.mjs +1 -1
  595. package/dist/esm/common/multiSelect/multiSelect.mjs.map +1 -1
  596. package/dist/esm/common/multiSelect/multiSelect.module.mjs +1 -1
  597. package/dist/esm/common/multiSelect/multiSelect.module.mjs.map +1 -1
  598. package/dist/esm/common/numberInput/index.mjs +1 -1
  599. package/dist/esm/common/numberInput/index.mjs.map +1 -1
  600. package/dist/esm/common/numberInput/numberInput.mjs +1 -1
  601. package/dist/esm/common/numberInput/numberInput.mjs.map +1 -1
  602. package/dist/esm/common/numberInput/numberInput.module.mjs +1 -1
  603. package/dist/esm/common/numberInput/useStepRepeat.mjs +1 -1
  604. package/dist/esm/common/numberInput/useStepRepeat.mjs.map +1 -1
  605. package/dist/esm/common/optionPicker/optionPicker.mjs +1 -1
  606. package/dist/esm/common/optionPicker/optionPicker.mjs.map +1 -1
  607. package/dist/esm/common/optionPicker/optionPicker.module.mjs +1 -1
  608. package/dist/esm/common/otpInput/otpInput.mjs +1 -1
  609. package/dist/esm/common/otpInput/otpInput.mjs.map +1 -1
  610. package/dist/esm/common/otpInput/otpInput.module.mjs +1 -1
  611. package/dist/esm/common/otpInput/otpInput.types.mjs +1 -1
  612. package/dist/esm/common/otpInput/otpInput.types.mjs.map +1 -1
  613. package/dist/esm/common/overscroll/overscroll.mjs +1 -1
  614. package/dist/esm/common/overscroll/overscroll.mjs.map +1 -1
  615. package/dist/esm/common/overscroll/overscroll.module.mjs +1 -1
  616. package/dist/esm/common/pagination/pagination.mjs +1 -1
  617. package/dist/esm/common/pagination/pagination.mjs.map +1 -1
  618. package/dist/esm/common/pagination/pagination.module.mjs +1 -1
  619. package/dist/esm/common/planCanvas/planCanvas.mjs +1 -1
  620. package/dist/esm/common/planCanvas/planCanvas.mjs.map +1 -1
  621. package/dist/esm/common/planCanvas/planCanvas.module.mjs +1 -1
  622. package/dist/esm/common/popover/popover.mjs +1 -1
  623. package/dist/esm/common/popover/popover.mjs.map +1 -1
  624. package/dist/esm/common/popover/popover.module.mjs +1 -1
  625. package/dist/esm/common/popover/popover.types.mjs +1 -1
  626. package/dist/esm/common/popover/popover.types.mjs.map +1 -1
  627. package/dist/esm/common/popover/usePopoverPosition.mjs +1 -1
  628. package/dist/esm/common/popover/usePopoverPosition.mjs.map +1 -1
  629. package/dist/esm/common/progressBar/progressBar.mjs +1 -1
  630. package/dist/esm/common/progressBar/progressBar.mjs.map +1 -1
  631. package/dist/esm/common/progressBar/progressBar.module.mjs +1 -1
  632. package/dist/esm/common/progressBar/progressBar.module.mjs.map +1 -1
  633. package/dist/esm/common/radioGroup/radioGroup.mjs +1 -1
  634. package/dist/esm/common/radioGroup/radioGroup.mjs.map +1 -1
  635. package/dist/esm/common/radioGroup/radioGroup.module.mjs +1 -1
  636. package/dist/esm/common/radioGroup/radioGroup.module.mjs.map +1 -1
  637. package/dist/esm/common/radioGroup/radioGroup.types.mjs +1 -1
  638. package/dist/esm/common/radioGroup/radioGroup.types.mjs.map +1 -1
  639. package/dist/esm/common/rating/rating.mjs +1 -1
  640. package/dist/esm/common/rating/rating.mjs.map +1 -1
  641. package/dist/esm/common/rating/rating.module.mjs +1 -1
  642. package/dist/esm/common/rating/rating.module.mjs.map +1 -1
  643. package/dist/esm/common/revealLens/revealLens.mjs +1 -1
  644. package/dist/esm/common/revealLens/revealLens.mjs.map +1 -1
  645. package/dist/esm/common/revealLens/revealLens.module.mjs +1 -1
  646. package/dist/esm/common/ripple/ripple.mjs +1 -1
  647. package/dist/esm/common/ripple/ripple.mjs.map +1 -1
  648. package/dist/esm/common/ripple/ripple.module.mjs +1 -1
  649. package/dist/esm/common/ripple/ripple.module.mjs.map +1 -1
  650. package/dist/esm/common/roomDrawer/roomDrawer.mjs +1 -1
  651. package/dist/esm/common/roomDrawer/roomDrawer.mjs.map +1 -1
  652. package/dist/esm/common/roomDrawer/roomDrawer.module.mjs +1 -1
  653. package/dist/esm/common/roomDrawer/usePlanHistory.mjs +1 -1
  654. package/dist/esm/common/roomDrawer/usePlanHistory.mjs.map +1 -1
  655. package/dist/esm/common/roomViewer/roomViewer.mjs +1 -1
  656. package/dist/esm/common/roomViewer/roomViewer.mjs.map +1 -1
  657. package/dist/esm/common/roomViewer/roomViewer.module.mjs +1 -1
  658. package/dist/esm/common/scrollFade/scrollFade.mjs +2 -0
  659. package/dist/esm/common/scrollFade/scrollFade.mjs.map +1 -0
  660. package/dist/esm/common/scrollFade/scrollFade.module.mjs +2 -0
  661. package/dist/esm/common/scrollFade/scrollFade.module.mjs.map +1 -0
  662. package/dist/esm/common/scrollFade/scrollFade.types.mjs +2 -0
  663. package/dist/esm/common/scrollFade/scrollFade.types.mjs.map +1 -0
  664. package/dist/esm/common/scrollbarProvider/index.mjs +1 -1
  665. package/dist/esm/common/scrollbarProvider/index.mjs.map +1 -1
  666. package/dist/esm/common/scrollbarProvider/scrollbarProvider.mjs +1 -1
  667. package/dist/esm/common/scrollbarProvider/scrollbarProvider.mjs.map +1 -1
  668. package/dist/esm/common/scrollbarProvider/scrollbarProvider.module.mjs +1 -1
  669. package/dist/esm/common/searchInput/searchInput.mjs +1 -1
  670. package/dist/esm/common/searchInput/searchInput.mjs.map +1 -1
  671. package/dist/esm/common/searchInput/searchInput.module.mjs +1 -1
  672. package/dist/esm/common/sectionHeader/sectionHeader.mjs +1 -1
  673. package/dist/esm/common/sectionHeader/sectionHeader.mjs.map +1 -1
  674. package/dist/esm/common/sectionHeader/sectionHeader.module.mjs +1 -1
  675. package/dist/esm/common/sectionHeader/sectionHeader.types.mjs +1 -1
  676. package/dist/esm/common/sectionHeader/sectionHeader.types.mjs.map +1 -1
  677. package/dist/esm/common/sheetBackdrop/sheetBackdrop.mjs +1 -1
  678. package/dist/esm/common/sheetBackdrop/sheetBackdrop.mjs.map +1 -1
  679. package/dist/esm/common/skeleton/skeleton.mjs +1 -1
  680. package/dist/esm/common/skeleton/skeleton.mjs.map +1 -1
  681. package/dist/esm/common/skeleton/skeleton.module.mjs +1 -1
  682. package/dist/esm/common/skeleton/skeleton.types.mjs +1 -1
  683. package/dist/esm/common/skeleton/skeleton.types.mjs.map +1 -1
  684. package/dist/esm/common/slider/slider.mjs +1 -1
  685. package/dist/esm/common/slider/slider.mjs.map +1 -1
  686. package/dist/esm/common/slider/slider.module.mjs +1 -1
  687. package/dist/esm/common/splitButton/splitButton.mjs +1 -1
  688. package/dist/esm/common/splitButton/splitButton.mjs.map +1 -1
  689. package/dist/esm/common/splitButton/splitButton.module.mjs +1 -1
  690. package/dist/esm/common/stepper/stepper.mjs +1 -1
  691. package/dist/esm/common/stepper/stepper.mjs.map +1 -1
  692. package/dist/esm/common/stepper/stepper.module.mjs +1 -1
  693. package/dist/esm/common/stepper/stepper.types.mjs +1 -1
  694. package/dist/esm/common/stepper/stepper.types.mjs.map +1 -1
  695. package/dist/esm/common/sticky/sticky.mjs +1 -1
  696. package/dist/esm/common/sticky/sticky.mjs.map +1 -1
  697. package/dist/esm/common/sticky/sticky.module.mjs +1 -1
  698. package/dist/esm/common/sticky/stickyStack.mjs +1 -1
  699. package/dist/esm/common/sticky/stickyStack.mjs.map +1 -1
  700. package/dist/esm/common/styles/scrollFade.module.mjs +2 -0
  701. package/dist/esm/common/styles/scrollFade.module.mjs.map +1 -0
  702. package/dist/esm/common/styles/sheet.module.mjs +1 -1
  703. package/dist/esm/common/styles/sheet.module.mjs.map +1 -1
  704. package/dist/esm/common/switch/switch.mjs +1 -1
  705. package/dist/esm/common/switch/switch.mjs.map +1 -1
  706. package/dist/esm/common/switch/switch.module.mjs +1 -1
  707. package/dist/esm/common/switch/switch.module.mjs.map +1 -1
  708. package/dist/esm/common/tabHeader/tabHeader.mjs +1 -1
  709. package/dist/esm/common/tabHeader/tabHeader.mjs.map +1 -1
  710. package/dist/esm/common/tabHeader/tabHeader.module.mjs +1 -1
  711. package/dist/esm/common/textarea/textarea.mjs +1 -1
  712. package/dist/esm/common/textarea/textarea.mjs.map +1 -1
  713. package/dist/esm/common/themeProvider/defaultTheme.mjs +1 -1
  714. package/dist/esm/common/themeProvider/defaultTheme.mjs.map +1 -1
  715. package/dist/esm/common/themeProvider/lightTheme.mjs +2 -0
  716. package/dist/esm/common/themeProvider/lightTheme.mjs.map +1 -0
  717. package/dist/esm/common/themeProvider/theme.module.mjs +1 -1
  718. package/dist/esm/common/themeProvider/themeProvider.mjs +1 -1
  719. package/dist/esm/common/themeProvider/themeProvider.mjs.map +1 -1
  720. package/dist/esm/common/themeProvider/themeVariablesContext.mjs +1 -1
  721. package/dist/esm/common/themeProvider/themeVariablesContext.mjs.map +1 -1
  722. package/dist/esm/common/themeProvider/useTheme.mjs +1 -1
  723. package/dist/esm/common/themeProvider/useTheme.mjs.map +1 -1
  724. package/dist/esm/common/tilt/tilt.mjs +1 -1
  725. package/dist/esm/common/tilt/tilt.mjs.map +1 -1
  726. package/dist/esm/common/tilt/tilt.module.mjs +1 -1
  727. package/dist/esm/common/tilt/tiltMath.mjs +1 -1
  728. package/dist/esm/common/tilt/tiltMath.mjs.map +1 -1
  729. package/dist/esm/common/tiltGroup/tiltGroup.mjs +1 -1
  730. package/dist/esm/common/tiltGroup/tiltGroup.mjs.map +1 -1
  731. package/dist/esm/common/timeInput/components/clockDial/clockDial.mjs +1 -1
  732. package/dist/esm/common/timeInput/components/clockDial/clockDial.mjs.map +1 -1
  733. package/dist/esm/common/timeInput/components/clockDial/clockDial.module.mjs +1 -1
  734. package/dist/esm/common/timeInput/timeFunctions.mjs +1 -1
  735. package/dist/esm/common/timeInput/timeFunctions.mjs.map +1 -1
  736. package/dist/esm/common/timeInput/timeInput.mjs +1 -1
  737. package/dist/esm/common/timeInput/timeInput.mjs.map +1 -1
  738. package/dist/esm/common/timeInput/timeInput.module.mjs +1 -1
  739. package/dist/esm/common/timeline/timeline.mjs +1 -1
  740. package/dist/esm/common/timeline/timeline.mjs.map +1 -1
  741. package/dist/esm/common/timeline/timeline.module.mjs +1 -1
  742. package/dist/esm/common/timeline/timeline.types.mjs +1 -1
  743. package/dist/esm/common/timeline/timeline.types.mjs.map +1 -1
  744. package/dist/esm/common/timer/timer.chime.mjs +1 -1
  745. package/dist/esm/common/timer/timer.chime.mjs.map +1 -1
  746. package/dist/esm/common/timer/timer.mjs +1 -1
  747. package/dist/esm/common/timer/timer.mjs.map +1 -1
  748. package/dist/esm/common/timer/timer.module.mjs +1 -1
  749. package/dist/esm/common/toast/toast.mjs +1 -1
  750. package/dist/esm/common/toast/toast.mjs.map +1 -1
  751. package/dist/esm/common/toast/toast.module.mjs +1 -1
  752. package/dist/esm/common/toast/toast.module.mjs.map +1 -1
  753. package/dist/esm/common/toast/toastProvider.mjs +1 -1
  754. package/dist/esm/common/toast/toastProvider.mjs.map +1 -1
  755. package/dist/esm/common/toast/toastService.mjs +1 -1
  756. package/dist/esm/common/toast/toastService.mjs.map +1 -1
  757. package/dist/esm/common/tooltip/tooltip.mjs +1 -1
  758. package/dist/esm/common/tooltip/tooltip.mjs.map +1 -1
  759. package/dist/esm/common/tooltip/tooltip.module.mjs +1 -1
  760. package/dist/esm/common/tree/flattenTree.mjs +1 -1
  761. package/dist/esm/common/tree/flattenTree.mjs.map +1 -1
  762. package/dist/esm/common/tree/tree.mjs +1 -1
  763. package/dist/esm/common/tree/tree.mjs.map +1 -1
  764. package/dist/esm/common/tree/tree.module.mjs +1 -1
  765. package/dist/esm/common/tree/tree.module.mjs.map +1 -1
  766. package/dist/esm/common/utils/activationKey.mjs +1 -1
  767. package/dist/esm/common/utils/activationKey.mjs.map +1 -1
  768. package/dist/esm/common/utils/interactiveTarget.mjs +2 -0
  769. package/dist/esm/common/utils/interactiveTarget.mjs.map +1 -0
  770. package/dist/esm/common/utils/listNavigation.mjs +2 -0
  771. package/dist/esm/common/utils/listNavigation.mjs.map +1 -0
  772. package/dist/esm/common/utils/mergeRefs.mjs +2 -0
  773. package/dist/esm/common/utils/mergeRefs.mjs.map +1 -0
  774. package/dist/esm/common/utils/renderIcon.mjs +1 -1
  775. package/dist/esm/common/utils/renderIcon.mjs.map +1 -1
  776. package/dist/esm/common/utils/scrollAncestors.mjs +1 -1
  777. package/dist/esm/common/utils/scrollAncestors.mjs.map +1 -1
  778. package/dist/esm/common/utils/visualViewport.mjs +1 -1
  779. package/dist/esm/common/utils/visualViewport.mjs.map +1 -1
  780. package/dist/esm/common/virtualList/useColumnResize.mjs +1 -1
  781. package/dist/esm/common/virtualList/useColumnResize.mjs.map +1 -1
  782. package/dist/esm/common/virtualList/useColumns.mjs +1 -1
  783. package/dist/esm/common/virtualList/useColumns.mjs.map +1 -1
  784. package/dist/esm/common/virtualList/useHeaderNavigation.mjs +1 -1
  785. package/dist/esm/common/virtualList/useHeaderNavigation.mjs.map +1 -1
  786. package/dist/esm/common/virtualList/useRowDrag.mjs +1 -1
  787. package/dist/esm/common/virtualList/useRowDrag.mjs.map +1 -1
  788. package/dist/esm/common/virtualList/useRowNavigation.mjs +1 -1
  789. package/dist/esm/common/virtualList/useRowNavigation.mjs.map +1 -1
  790. package/dist/esm/common/virtualList/useSelection.mjs +1 -1
  791. package/dist/esm/common/virtualList/useSelection.mjs.map +1 -1
  792. package/dist/esm/common/virtualList/useSorting.mjs +1 -1
  793. package/dist/esm/common/virtualList/useSorting.mjs.map +1 -1
  794. package/dist/esm/common/virtualList/useVirtualWindow.mjs +1 -1
  795. package/dist/esm/common/virtualList/useVirtualWindow.mjs.map +1 -1
  796. package/dist/esm/common/virtualList/virtualList.mjs +1 -1
  797. package/dist/esm/common/virtualList/virtualList.mjs.map +1 -1
  798. package/dist/esm/common/virtualList/virtualList.module.mjs +1 -1
  799. package/dist/esm/common/virtualList/virtualList.utils.mjs +1 -1
  800. package/dist/esm/common/virtualList/virtualList.utils.mjs.map +1 -1
  801. package/dist/esm/common/virtualList/virtualListHeader.mjs +1 -1
  802. package/dist/esm/common/virtualList/virtualListHeader.mjs.map +1 -1
  803. package/dist/esm/common/virtualList/virtualRow.mjs +1 -1
  804. package/dist/esm/common/virtualList/virtualRow.mjs.map +1 -1
  805. package/dist/esm/common/wizard/wizard.mjs +1 -1
  806. package/dist/esm/common/wizard/wizard.mjs.map +1 -1
  807. package/dist/esm/common/wizard/wizard.module.mjs +1 -1
  808. package/dist/esm/common/wizard/wizard.module.mjs.map +1 -1
  809. package/dist/esm/hooks/useWindowSize.mjs +1 -1
  810. package/dist/esm/hooks/useWindowSize.mjs.map +1 -1
  811. package/dist/esm/index.mjs +1 -1
  812. package/dist/esm/og.png +0 -0
  813. package/dist/esm/services/formValidation/FormValidatorGroupWithForm.mjs +1 -1
  814. package/dist/esm/services/formValidation/FormValidatorGroupWithForm.mjs.map +1 -1
  815. package/dist/esm/services/formValidation/index.mjs +1 -1
  816. package/dist/esm/services/formValidation/useFormValidatorGroup.mjs +1 -1
  817. package/dist/esm/services/formValidation/useFormValidatorGroup.mjs.map +1 -1
  818. package/dist/esm/services/formValidation/validatableComponent.mjs +1 -1
  819. package/dist/esm/services/formValidation/validatableComponent.mjs.map +1 -1
  820. package/dist/esm/services/klipy.mjs +1 -1
  821. package/dist/esm/services/klipy.mjs.map +1 -1
  822. package/dist/esm/services/localization.mjs +1 -1
  823. package/dist/esm/services/localization.mjs.map +1 -1
  824. package/dist/index.cjs +3 -3
  825. package/dist/index.cjs.map +1 -1
  826. package/dist/mcp.js +21432 -56
  827. package/dist/og.png +0 -0
  828. package/dist/style.css +1 -1
  829. package/dist/types/common/accordion/accordion.d.ts +1 -1
  830. package/dist/types/common/accordion/accordion.types.d.ts +1 -1
  831. package/dist/types/common/accordion/index.d.ts +2 -2
  832. package/dist/types/common/actionButtons/actionButtons.d.ts +1 -1
  833. package/dist/types/common/actionButtons/actionButtons.types.d.ts +3 -3
  834. package/dist/types/common/actionButtons/index.d.ts +2 -2
  835. package/dist/types/common/actionIcon/actionIcon.d.ts +1 -1
  836. package/dist/types/common/actionIcon/actionIcon.types.d.ts +5 -3
  837. package/dist/types/common/actionIcon/index.d.ts +2 -2
  838. package/dist/types/common/alert/alert.d.ts +1 -1
  839. package/dist/types/common/alert/alert.types.d.ts +2 -2
  840. package/dist/types/common/alert/index.d.ts +2 -2
  841. package/dist/types/common/animatedIcon/animatedIcon.d.ts +1 -1
  842. package/dist/types/common/animatedIcon/animatedIcon.types.d.ts +1 -1
  843. package/dist/types/common/animatedIcon/index.d.ts +2 -2
  844. package/dist/types/common/animatedLogo/animatedLogo.d.ts +1 -1
  845. package/dist/types/common/animatedLogo/animatedLogo.types.d.ts +1 -1
  846. package/dist/types/common/animatedLogo/index.d.ts +2 -2
  847. package/dist/types/common/animatedText/animatedText.d.ts +1 -1
  848. package/dist/types/common/animatedText/animatedText.types.d.ts +1 -1
  849. package/dist/types/common/animatedText/index.d.ts +2 -2
  850. package/dist/types/common/avatar/avatar.d.ts +1 -1
  851. package/dist/types/common/avatar/avatar.types.d.ts +2 -2
  852. package/dist/types/common/avatar/avatarGroup.d.ts +1 -1
  853. package/dist/types/common/avatar/index.d.ts +3 -3
  854. package/dist/types/common/badge/badge.d.ts +1 -1
  855. package/dist/types/common/badge/badge.types.d.ts +1 -1
  856. package/dist/types/common/badge/index.d.ts +2 -2
  857. package/dist/types/common/bodyEnd/bodyEnd.d.ts +1 -1
  858. package/dist/types/common/bodyEnd/index.d.ts +2 -2
  859. package/dist/types/common/breadcrumb/breadcrumb.d.ts +1 -1
  860. package/dist/types/common/breadcrumb/breadcrumb.types.d.ts +2 -2
  861. package/dist/types/common/breadcrumb/index.d.ts +2 -2
  862. package/dist/types/common/button/button.d.ts +1 -1
  863. package/dist/types/common/button/button.types.d.ts +2 -2
  864. package/dist/types/common/button/index.d.ts +2 -2
  865. package/dist/types/common/buttonGroup/buttonGroup.d.ts +1 -1
  866. package/dist/types/common/buttonGroup/buttonGroup.types.d.ts +1 -1
  867. package/dist/types/common/buttonGroup/index.d.ts +2 -2
  868. package/dist/types/common/card/Card.d.ts +1 -1
  869. package/dist/types/common/card/CardActions.d.ts +1 -1
  870. package/dist/types/common/card/CardContent.d.ts +1 -1
  871. package/dist/types/common/card/CardHeader.d.ts +1 -1
  872. package/dist/types/common/card/CardMedia.d.ts +1 -1
  873. package/dist/types/common/card/card.types.d.ts +6 -4
  874. package/dist/types/common/card/index.d.ts +6 -6
  875. package/dist/types/common/carousel/carousel.d.ts +1 -1
  876. package/dist/types/common/carousel/carousel.types.d.ts +1 -1
  877. package/dist/types/common/carousel/index.d.ts +2 -2
  878. package/dist/types/common/checkbox/checkbox.d.ts +1 -1
  879. package/dist/types/common/checkbox/checkbox.types.d.ts +5 -3
  880. package/dist/types/common/checkbox/index.d.ts +2 -2
  881. package/dist/types/common/chip/chip.d.ts +1 -1
  882. package/dist/types/common/chip/chip.types.d.ts +1 -1
  883. package/dist/types/common/chip/chipContainer.d.ts +1 -1
  884. package/dist/types/common/chip/index.d.ts +3 -3
  885. package/dist/types/common/colorPicker/colorPicker.d.ts +1 -1
  886. package/dist/types/common/colorPicker/colorPicker.types.d.ts +5 -1
  887. package/dist/types/common/colorPicker/index.d.ts +2 -2
  888. package/dist/types/common/configProvider/configProvider.d.ts +2 -2
  889. package/dist/types/common/configProvider/configProvider.types.d.ts +47 -43
  890. package/dist/types/common/configProvider/index.d.ts +6 -6
  891. package/dist/types/common/configProvider/useComponentDefaults.d.ts +1 -1
  892. package/dist/types/common/configProvider/useLabels.d.ts +1 -1
  893. package/dist/types/common/configProvider/usePresentationDefault.d.ts +1 -1
  894. package/dist/types/common/confirmModal/confirmModal.d.ts +1 -1
  895. package/dist/types/common/confirmModal/confirmModal.types.d.ts +2 -2
  896. package/dist/types/common/confirmModal/index.d.ts +2 -2
  897. package/dist/types/common/datePicker/components/datePickerMonth/datePickerMonth.d.ts +1 -1
  898. package/dist/types/common/datePicker/components/datePickerMonth/index.d.ts +1 -1
  899. package/dist/types/common/datePicker/datePicker.d.ts +1 -1
  900. package/dist/types/common/datePicker/datePicker.types.d.ts +2 -2
  901. package/dist/types/common/datePicker/index.d.ts +2 -2
  902. package/dist/types/common/divider/divider.d.ts +1 -1
  903. package/dist/types/common/divider/divider.types.d.ts +1 -1
  904. package/dist/types/common/divider/index.d.ts +2 -2
  905. package/dist/types/common/drawer/drawer.d.ts +1 -1
  906. package/dist/types/common/drawer/drawer.types.d.ts +1 -1
  907. package/dist/types/common/drawer/index.d.ts +2 -2
  908. package/dist/types/common/dropZone/dropZone.d.ts +1 -1
  909. package/dist/types/common/dropZone/dropZone.types.d.ts +1 -1
  910. package/dist/types/common/dropZone/index.d.ts +2 -2
  911. package/dist/types/common/dropdown/dropdown.d.ts +1 -1
  912. package/dist/types/common/dropdown/dropdown.types.d.ts +3 -3
  913. package/dist/types/common/dropdown/index.d.ts +2 -2
  914. package/dist/types/common/emptyState/emptyState.d.ts +1 -1
  915. package/dist/types/common/emptyState/emptyState.types.d.ts +2 -2
  916. package/dist/types/common/emptyState/index.d.ts +2 -2
  917. package/dist/types/common/errorBoundary/errorBoundary.d.ts +1 -1
  918. package/dist/types/common/errorBoundary/errorBoundary.types.d.ts +1 -1
  919. package/dist/types/common/errorBoundary/index.d.ts +2 -2
  920. package/dist/types/common/fab/components/fabBase/fabBase.d.ts +1 -1
  921. package/dist/types/common/fab/components/fabBase/fabBase.types.d.ts +1 -1
  922. package/dist/types/common/fab/components/fabBase/index.d.ts +1 -1
  923. package/dist/types/common/fab/fab.d.ts +1 -1
  924. package/dist/types/common/fab/fab.types.d.ts +2 -2
  925. package/dist/types/common/fab/index.d.ts +2 -2
  926. package/dist/types/common/flip/flip.d.ts +2 -2
  927. package/dist/types/common/flip/flip.types.d.ts +4 -2
  928. package/dist/types/common/flip/index.d.ts +2 -2
  929. package/dist/types/common/floorPlan/floorPlan.faces.d.ts +2 -2
  930. package/dist/types/common/floorPlan/floorPlan.fixtures.d.ts +1 -1
  931. package/dist/types/common/floorPlan/floorPlan.geometry.d.ts +1 -1
  932. package/dist/types/common/floorPlan/floorPlan.graph.d.ts +1 -1
  933. package/dist/types/common/floorPlan/floorPlan.hit.d.ts +1 -1
  934. package/dist/types/common/floorPlan/floorPlan.json.d.ts +1 -1
  935. package/dist/types/common/floorPlan/floorPlan.mesh.d.ts +1 -1
  936. package/dist/types/common/floorPlan/floorPlan.path.d.ts +1 -1
  937. package/dist/types/common/floorPlan/floorPlan.plan.d.ts +1 -1
  938. package/dist/types/common/floorPlan/floorPlan.rooms.d.ts +1 -1
  939. package/dist/types/common/floorPlan/floorPlan.snap.d.ts +1 -1
  940. package/dist/types/common/floorPlan/floorPlan.triangulate.d.ts +1 -1
  941. package/dist/types/common/floorPlan/index.d.ts +22 -22
  942. package/dist/types/common/floorPlan/legacySvg.d.ts +2 -2
  943. package/dist/types/common/hooks/useScrollEdges.d.ts +18 -0
  944. package/dist/types/common/hooks/useSheet.d.ts +1 -1
  945. package/dist/types/common/iconPicker/iconPicker.d.ts +1 -1
  946. package/dist/types/common/iconPicker/iconPicker.types.d.ts +2 -2
  947. package/dist/types/common/iconPicker/index.d.ts +2 -1
  948. package/dist/types/common/idleManager/idleManager.d.ts +1 -1
  949. package/dist/types/common/idleManager/index.d.ts +2 -1
  950. package/dist/types/common/infiniteBlock/useInfiniteScroll.d.ts +5 -0
  951. package/dist/types/common/input/index.d.ts +2 -2
  952. package/dist/types/common/input/input.d.ts +1 -1
  953. package/dist/types/common/input/input.types.d.ts +7 -2
  954. package/dist/types/common/inputDropdown/index.d.ts +2 -1
  955. package/dist/types/common/inputDropdown/inputDropdown.d.ts +1 -1
  956. package/dist/types/common/inputDropdown/inputDropdown.types.d.ts +2 -2
  957. package/dist/types/common/interactableDiv/index.d.ts +1 -1
  958. package/dist/types/common/interactableDiv/interactableDiv.d.ts +4 -3
  959. package/dist/types/common/kanbanBoard/KanbanBoard.d.ts +1 -1
  960. package/dist/types/common/kanbanBoard/KanbanColumn.d.ts +1 -1
  961. package/dist/types/common/kanbanBoard/KanbanItem.d.ts +1 -1
  962. package/dist/types/common/kanbanBoard/index.d.ts +3 -3
  963. package/dist/types/common/kanbanBoard/kanbanBoard.types.d.ts +1 -1
  964. package/dist/types/common/kanbanBoard/kanbanBoard.utils.d.ts +1 -1
  965. package/dist/types/common/klipyPicker/components/gifPreview/gifPreview.d.ts +1 -1
  966. package/dist/types/common/klipyPicker/components/gifPreview/gifPreview.types.d.ts +1 -1
  967. package/dist/types/common/klipyPicker/components/gifPreview/index.d.ts +1 -1
  968. package/dist/types/common/klipyPicker/components/gifView/gifView.d.ts +1 -1
  969. package/dist/types/common/klipyPicker/components/gifView/index.d.ts +1 -1
  970. package/dist/types/common/klipyPicker/index.d.ts +2 -2
  971. package/dist/types/common/klipyPicker/klipyPicker.d.ts +1 -1
  972. package/dist/types/common/klipyPicker/klipyPicker.types.d.ts +1 -1
  973. package/dist/types/common/loading/index.d.ts +2 -2
  974. package/dist/types/common/loading/spinnerLoading/index.d.ts +1 -1
  975. package/dist/types/common/loading/spinnerLoading/spinnerLoading.d.ts +0 -5
  976. package/dist/types/common/maskedInput/index.d.ts +2 -0
  977. package/dist/types/common/maskedInput/mask.d.ts +48 -0
  978. package/dist/types/common/maskedInput/maskedInput.d.ts +13 -0
  979. package/dist/types/common/maskedInput/maskedInput.types.d.ts +38 -0
  980. package/dist/types/common/menu/index.d.ts +2 -2
  981. package/dist/types/common/menu/menu.d.ts +1 -1
  982. package/dist/types/common/menu/menu.types.d.ts +4 -4
  983. package/dist/types/common/modal/index.d.ts +2 -2
  984. package/dist/types/common/modal/modal.d.ts +1 -1
  985. package/dist/types/common/modal/modal.types.d.ts +6 -3
  986. package/dist/types/common/multiSelect/index.d.ts +2 -2
  987. package/dist/types/common/multiSelect/multiSelect.d.ts +1 -1
  988. package/dist/types/common/multiSelect/multiSelect.types.d.ts +3 -3
  989. package/dist/types/common/numberInput/index.d.ts +2 -2
  990. package/dist/types/common/numberInput/numberInput.d.ts +2 -2
  991. package/dist/types/common/numberInput/numberInput.types.d.ts +4 -2
  992. package/dist/types/common/optionPicker/index.d.ts +2 -2
  993. package/dist/types/common/optionPicker/optionPicker.d.ts +1 -1
  994. package/dist/types/common/optionPicker/optionPicker.types.d.ts +1 -1
  995. package/dist/types/common/otpInput/index.d.ts +2 -2
  996. package/dist/types/common/otpInput/otpInput.d.ts +1 -1
  997. package/dist/types/common/otpInput/otpInput.types.d.ts +4 -2
  998. package/dist/types/common/overscroll/index.d.ts +2 -2
  999. package/dist/types/common/overscroll/overscroll.d.ts +1 -1
  1000. package/dist/types/common/pagination/index.d.ts +2 -2
  1001. package/dist/types/common/pagination/pagination.d.ts +1 -1
  1002. package/dist/types/common/pagination/pagination.types.d.ts +2 -2
  1003. package/dist/types/common/planCanvas/index.d.ts +2 -2
  1004. package/dist/types/common/planCanvas/planCanvas.d.ts +2 -2
  1005. package/dist/types/common/planCanvas/planCanvas.types.d.ts +5 -3
  1006. package/dist/types/common/popover/index.d.ts +2 -2
  1007. package/dist/types/common/popover/popover.d.ts +1 -1
  1008. package/dist/types/common/popover/popover.types.d.ts +2 -2
  1009. package/dist/types/common/popover/usePopoverPosition.d.ts +1 -1
  1010. package/dist/types/common/progressBar/index.d.ts +2 -2
  1011. package/dist/types/common/progressBar/progressBar.d.ts +1 -1
  1012. package/dist/types/common/progressBar/progressBar.types.d.ts +1 -1
  1013. package/dist/types/common/radioGroup/index.d.ts +2 -2
  1014. package/dist/types/common/radioGroup/radioGroup.d.ts +1 -1
  1015. package/dist/types/common/radioGroup/radioGroup.types.d.ts +3 -3
  1016. package/dist/types/common/rating/index.d.ts +2 -2
  1017. package/dist/types/common/rating/rating.d.ts +1 -1
  1018. package/dist/types/common/rating/rating.types.d.ts +2 -2
  1019. package/dist/types/common/revealLens/index.d.ts +2 -2
  1020. package/dist/types/common/revealLens/revealLens.d.ts +1 -1
  1021. package/dist/types/common/revealLens/revealLens.types.d.ts +1 -1
  1022. package/dist/types/common/ripple/index.d.ts +2 -2
  1023. package/dist/types/common/ripple/ripple.d.ts +2 -2
  1024. package/dist/types/common/ripple/ripple.types.d.ts +2 -1
  1025. package/dist/types/common/roomDrawer/index.d.ts +2 -2
  1026. package/dist/types/common/roomDrawer/roomDrawer.d.ts +2 -2
  1027. package/dist/types/common/roomDrawer/roomDrawer.types.d.ts +6 -4
  1028. package/dist/types/common/roomDrawer/usePlanHistory.d.ts +2 -2
  1029. package/dist/types/common/roomViewer/index.d.ts +2 -2
  1030. package/dist/types/common/roomViewer/roomViewer.d.ts +2 -2
  1031. package/dist/types/common/roomViewer/roomViewer.types.d.ts +6 -4
  1032. package/dist/types/common/scrollFade/index.d.ts +2 -0
  1033. package/dist/types/common/scrollFade/scrollFade.d.ts +4 -0
  1034. package/dist/types/common/scrollFade/scrollFade.types.d.ts +20 -0
  1035. package/dist/types/common/scrollbarProvider/index.d.ts +1 -1
  1036. package/dist/types/common/searchInput/index.d.ts +2 -2
  1037. package/dist/types/common/searchInput/searchInput.d.ts +2 -2
  1038. package/dist/types/common/searchInput/searchInput.types.d.ts +4 -1
  1039. package/dist/types/common/sectionHeader/index.d.ts +2 -2
  1040. package/dist/types/common/sectionHeader/sectionHeader.d.ts +1 -1
  1041. package/dist/types/common/sectionHeader/sectionHeader.types.d.ts +3 -3
  1042. package/dist/types/common/sheetBackdrop/index.d.ts +2 -2
  1043. package/dist/types/common/sheetBackdrop/sheetBackdrop.d.ts +1 -1
  1044. package/dist/types/common/skeleton/index.d.ts +2 -2
  1045. package/dist/types/common/skeleton/skeleton.d.ts +1 -1
  1046. package/dist/types/common/skeleton/skeleton.types.d.ts +1 -1
  1047. package/dist/types/common/slider/index.d.ts +2 -2
  1048. package/dist/types/common/slider/slider.d.ts +1 -1
  1049. package/dist/types/common/slider/slider.types.d.ts +2 -2
  1050. package/dist/types/common/splitButton/index.d.ts +2 -2
  1051. package/dist/types/common/splitButton/splitButton.d.ts +1 -1
  1052. package/dist/types/common/splitButton/splitButton.types.d.ts +4 -4
  1053. package/dist/types/common/stepper/index.d.ts +2 -2
  1054. package/dist/types/common/stepper/stepper.d.ts +1 -1
  1055. package/dist/types/common/stepper/stepper.types.d.ts +2 -2
  1056. package/dist/types/common/sticky/index.d.ts +1 -1
  1057. package/dist/types/common/sticky/sticky.d.ts +1 -1
  1058. package/dist/types/common/sticky/sticky.types.d.ts +1 -1
  1059. package/dist/types/common/switch/index.d.ts +2 -2
  1060. package/dist/types/common/switch/switch.d.ts +1 -1
  1061. package/dist/types/common/switch/switch.types.d.ts +5 -3
  1062. package/dist/types/common/tabHeader/index.d.ts +2 -2
  1063. package/dist/types/common/tabHeader/tabHeader.d.ts +1 -1
  1064. package/dist/types/common/tabHeader/tabHeader.types.d.ts +2 -2
  1065. package/dist/types/common/textarea/index.d.ts +2 -2
  1066. package/dist/types/common/textarea/textarea.d.ts +1 -1
  1067. package/dist/types/common/textarea/textarea.types.d.ts +1 -1
  1068. package/dist/types/common/themeProvider/defaultTheme.d.ts +1 -1
  1069. package/dist/types/common/themeProvider/index.d.ts +4 -3
  1070. package/dist/types/common/themeProvider/lightTheme.d.ts +13 -0
  1071. package/dist/types/common/themeProvider/theme.types.d.ts +28 -0
  1072. package/dist/types/common/themeProvider/themeProvider.d.ts +1 -1
  1073. package/dist/types/common/tilt/index.d.ts +4 -4
  1074. package/dist/types/common/tilt/tilt.d.ts +2 -2
  1075. package/dist/types/common/tilt/tilt.types.d.ts +5 -3
  1076. package/dist/types/common/tiltGroup/index.d.ts +3 -3
  1077. package/dist/types/common/tiltGroup/tiltGroup.d.ts +1 -1
  1078. package/dist/types/common/tiltGroup/tiltGroup.types.d.ts +1 -1
  1079. package/dist/types/common/timeInput/components/clockDial/clockDial.d.ts +1 -1
  1080. package/dist/types/common/timeInput/components/clockDial/clockDial.types.d.ts +3 -3
  1081. package/dist/types/common/timeInput/components/clockDial/index.d.ts +1 -1
  1082. package/dist/types/common/timeInput/index.d.ts +1 -1
  1083. package/dist/types/common/timeInput/timeInput.d.ts +1 -1
  1084. package/dist/types/common/timeInput/timeInput.types.d.ts +2 -2
  1085. package/dist/types/common/timeline/index.d.ts +2 -2
  1086. package/dist/types/common/timeline/timeline.d.ts +1 -1
  1087. package/dist/types/common/timeline/timeline.types.d.ts +2 -2
  1088. package/dist/types/common/timer/index.d.ts +2 -2
  1089. package/dist/types/common/timer/timer.d.ts +2 -2
  1090. package/dist/types/common/timer/timer.types.d.ts +5 -3
  1091. package/dist/types/common/toast/index.d.ts +3 -3
  1092. package/dist/types/common/toast/toast.d.ts +1 -1
  1093. package/dist/types/common/toast/toast.types.d.ts +1 -1
  1094. package/dist/types/common/toast/toastProvider.d.ts +1 -1
  1095. package/dist/types/common/toast/toastService.d.ts +1 -1
  1096. package/dist/types/common/tooltip/index.d.ts +2 -2
  1097. package/dist/types/common/tooltip/tooltip.d.ts +2 -2
  1098. package/dist/types/common/tooltip/tooltip.types.d.ts +7 -0
  1099. package/dist/types/common/tree/flattenTree.d.ts +1 -1
  1100. package/dist/types/common/tree/index.d.ts +3 -3
  1101. package/dist/types/common/tree/tree.d.ts +1 -1
  1102. package/dist/types/common/tree/tree.types.d.ts +2 -2
  1103. package/dist/types/common/types/actions.types.d.ts +1 -1
  1104. package/dist/types/common/types/baseProps.types.d.ts +6 -0
  1105. package/dist/types/common/types/slots.types.d.ts +1 -1
  1106. package/dist/types/common/utils/interactiveTarget.d.ts +7 -0
  1107. package/dist/types/common/utils/listNavigation.d.ts +49 -0
  1108. package/dist/types/common/utils/mergeRefs.d.ts +12 -0
  1109. package/dist/types/common/utils/renderIcon.d.ts +1 -1
  1110. package/dist/types/common/virtualList/index.d.ts +2 -2
  1111. package/dist/types/common/virtualList/useColumnResize.d.ts +1 -1
  1112. package/dist/types/common/virtualList/useColumns.d.ts +1 -1
  1113. package/dist/types/common/virtualList/useRowDrag.d.ts +1 -1
  1114. package/dist/types/common/virtualList/useRowNavigation.d.ts +1 -1
  1115. package/dist/types/common/virtualList/useSorting.d.ts +1 -1
  1116. package/dist/types/common/virtualList/useVirtualWindow.d.ts +1 -1
  1117. package/dist/types/common/virtualList/virtualList.d.ts +3 -5
  1118. package/dist/types/common/virtualList/virtualList.types.d.ts +4 -2
  1119. package/dist/types/common/virtualList/virtualList.utils.d.ts +1 -1
  1120. package/dist/types/common/virtualList/virtualListHeader.d.ts +4 -4
  1121. package/dist/types/common/virtualList/virtualRow.d.ts +1 -1
  1122. package/dist/types/common/wizard/index.d.ts +1 -1
  1123. package/dist/types/common/wizard/wizard.d.ts +1 -1
  1124. package/dist/types/common/wizard/wizard.types.d.ts +1 -1
  1125. package/dist/types/index.d.ts +153 -153
  1126. package/dist/types/services/formValidation/index.d.ts +3 -3
  1127. package/dist/types/services/formValidation/useFormValidatorGroup.d.ts +1 -1
  1128. package/docs/Accordion.md +9 -0
  1129. package/docs/ActionIcon.md +3 -0
  1130. package/docs/CLAUDE.md +123 -193
  1131. package/docs/Card.md +2 -1
  1132. package/docs/Checkbox.md +1 -0
  1133. package/docs/ColorPicker.md +12 -2
  1134. package/docs/Divider.md +2 -0
  1135. package/docs/Dropdown.md +20 -0
  1136. package/docs/IdleManager.md +38 -8
  1137. package/docs/Input.md +1 -0
  1138. package/docs/InputDropdown.md +11 -0
  1139. package/docs/InteractableDiv.md +7 -1
  1140. package/docs/KlipyPicker.md +2 -2
  1141. package/docs/Loading.md +3 -1
  1142. package/docs/Menu.md +2 -0
  1143. package/docs/Modal.md +34 -10
  1144. package/docs/MultiSelect.md +2 -2
  1145. package/docs/NumberInput.md +1 -0
  1146. package/docs/OtpInput.md +1 -0
  1147. package/docs/Pagination.md +1 -1
  1148. package/docs/Popover.md +2 -0
  1149. package/docs/RadioGroup.md +1 -1
  1150. package/docs/Rating.md +2 -0
  1151. package/docs/Ripple.md +3 -0
  1152. package/docs/RoomViewer.md +3 -5
  1153. package/docs/ScrollFade.md +77 -0
  1154. package/docs/ScrollbarProvider.md +2 -0
  1155. package/docs/SearchInput.md +1 -0
  1156. package/docs/Slider.md +1 -1
  1157. package/docs/Switch.md +1 -0
  1158. package/docs/Textarea.md +1 -0
  1159. package/docs/ThemeProvider.md +30 -1
  1160. package/docs/Timer.md +1 -1
  1161. package/docs/Tooltip.md +23 -1
  1162. package/docs/Wizard.md +1 -1
  1163. package/package.json +39 -16
  1164. package/dist/esm/common/infiniteBlock/infiniteBlock.mjs +0 -2
  1165. package/dist/esm/common/infiniteBlock/infiniteBlock.mjs.map +0 -1
  1166. package/dist/esm/common/infiniteBlock/infiniteBlock.module.mjs +0 -2
  1167. package/dist/esm/common/infiniteBlock/infiniteBlock.module.mjs.map +0 -1
  1168. package/dist/types/common/infiniteBlock/index.d.ts +0 -1
  1169. package/dist/types/common/infiniteBlock/infiniteBlock.d.ts +0 -4
  1170. package/dist/types/common/infiniteBlock/infiniteBlock.types.d.ts +0 -13
  1171. package/docs/Icon.md +0 -27
  1172. package/docs/InfiniteBlock.md +0 -23
@@ -1 +1 @@
1
- {"version":3,"file":"useRowDrag.mjs","names":[],"sources":["../../../../package/common/virtualList/useRowDrag.ts"],"sourcesContent":["import React, { useState, useRef, useEffect, useLayoutEffect, useCallback } from 'react';\n\nimport styles from './virtualList.module.pcss';\nimport { resolveReorderTarget, resolveTreeDropTarget, lastDescendantIndex } from './virtualList.utils';\nimport type { TreeDropPosition, TreeDropTarget } from './virtualList.types';\n\ninterface UseRowDragArgs {\n reorderable: boolean;\n treeReorder: boolean;\n onReorder?: (fromIndex: number, toIndex: number) => void;\n onTreeDrop?: (dragKey: string | number, target: TreeDropTarget) => void;\n longPressDelay: number;\n dragHandle: boolean;\n treeIndentPx: number;\n /** Current flat ordering and depth tags (mouse handlers read these directly). */\n keys: (string | number)[];\n depths: number[];\n isGroupAt: (index: number) => boolean;\n rootRef: React.RefObject<HTMLDivElement | null>;\n /** Latest keys for async (touch / rAF) consumers — owned by useVirtualWindow. */\n keysRef: React.RefObject<(string | number)[]>;\n}\n\n/** The drag-related props the parent spreads onto a given row. */\nexport interface RowDragProps {\n reorderable: boolean;\n /** Native mouse DnD is active for the list (independent of which row is armed). */\n mouseDragEnabled: boolean;\n draggable: boolean | undefined;\n isDragging: boolean;\n onMouseDown: ((e: React.MouseEvent<HTMLDivElement>) => void) | undefined;\n onMouseOver: ((e: React.MouseEvent<HTMLDivElement>) => void) | undefined;\n onMouseLeave: ((e: React.MouseEvent<HTMLDivElement>) => void) | undefined;\n onDragStart: ((e: React.DragEvent<HTMLDivElement>) => void) | undefined;\n onDragOver: ((e: React.DragEvent<HTMLDivElement>) => void) | undefined;\n onDragEnd: (() => void) | undefined;\n onDrop: ((e: React.DragEvent<HTMLDivElement>) => void) | undefined;\n onTouchStart: ((e: React.TouchEvent<HTMLDivElement>) => void) | undefined;\n dropPosition: TreeDropPosition | undefined;\n dropIndentPx: number | undefined;\n}\n\ninterface UseRowDragResult {\n /** True while a row is being dragged (for the root reordering style). */\n draggingKey: string | number | null;\n /** Whether either drag mode is active. */\n dragEnabled: boolean;\n /** Drag props for the row at `index` / `key`. */\n getRowDragProps: (index: number, key: string | number) => RowDragProps;\n /** Returns true (and resets) if the next click should be swallowed (post-drag). */\n consumeSuppressedClick: () => boolean;\n}\n\n/**\n * Row drag-and-drop for both modes:\n * - `reorderable` (flat): native HTML5 drag on desktop; rows move live via\n * `onReorder` with midpoint hysteresis.\n * - `treeReorder`: a drop indicator (before/after/inside) is shown during the\n * drag and `onTreeDrop` fires once on release; dropping onto the dragged\n * node's own subtree is forbidden.\n * Touch uses a long-press → lifted-clone → pointer-move path with edge\n * auto-scroll. `dragHandle` restricts initiation to `[data-drag-handle]`.\n */\nexport function useRowDrag({\n reorderable,\n treeReorder,\n onReorder,\n onTreeDrop,\n longPressDelay,\n dragHandle,\n treeIndentPx,\n keys,\n depths,\n isGroupAt,\n rootRef,\n keysRef,\n}: UseRowDragArgs): UseRowDragResult {\n // The dragged item is tracked by its stable key (indices shift after each\n // live reorder); the ref drives the logic, the state drives the row's style.\n const dragKeyRef = useRef<string | number | null>(null);\n const [draggingKey, setDraggingKey] = useState<string | number | null>(null);\n // Tree-reorder drop indicator. Unlike flat reorder (which moves rows live),\n // tree mode shows where the drop will land and commits once on release.\n const [dropTarget, setDropTarget] = useState<TreeDropTarget | null>(null);\n const dropTargetRef = useRef<TreeDropTarget | null>(null);\n const onReorderRef = useRef(onReorder);\n const onTreeDropRef = useRef(onTreeDrop);\n const treeModeRef = useRef(treeReorder);\n const depthsRef = useRef<number[]>(depths);\n const isGroupAtRef = useRef<(i: number) => boolean>(isGroupAt);\n // When `dragHandle` is on, a mousedown sets this to whether it landed on a\n // `[data-drag-handle]` element, gating whether the ensuing dragstart is honoured.\n const dragFromHandleRef = useRef(true);\n // In `dragHandle` mode the `draggable` attribute is only on the row whose\n // handle the pointer is currently over (\"armed\"). A permanently `draggable`\n // row breaks mouse text selection (caret placement, double-click word select,\n // drag select) inside any child input in Firefox — see Mozilla bugs 739071 /\n // 800050 / 1189486. Arming on hover rather than on mousedown means the\n // attribute is already in place before the press, so the browser never has to\n // notice it appearing mid-gesture, and any pointer move re-derives it.\n const armedKeyRef = useRef<string | number | null>(null);\n const [armedKey, setArmedKeyState] = useState<string | number | null>(null);\n const longPressRef = useRef<number | null>(null);\n const touchActiveRef = useRef(false);\n const touchStartYRef = useRef<number | null>(null);\n const pointerXRef = useRef(0);\n const pointerYRef = useRef(0);\n const autoScrollRef = useRef<number | null>(null);\n const suppressNextClickRef = useRef(false);\n // Floating clone that follows the finger during a touch drag.\n const dragCloneRef = useRef<HTMLElement | null>(null);\n const grabOffsetYRef = useRef(0);\n const cloneLeftRef = useRef(0);\n const dragHeightRef = useRef(0);\n // The native `draggable` attribute (mouse DnD) makes a long-press start the\n // browser's own drag on touch devices, which hijacks our touch handlers. So\n // expose it only where the primary pointer is fine (mouse/trackpad); touch\n // devices use the touch handlers below instead.\n const [isCoarsePointer] = useState(() =>\n typeof window !== 'undefined' && typeof window.matchMedia === 'function'\n ? window.matchMedia('(pointer: coarse)').matches\n : false,\n );\n\n useLayoutEffect(() => {\n onReorderRef.current = onReorder;\n onTreeDropRef.current = onTreeDrop;\n treeModeRef.current = treeReorder;\n depthsRef.current = depths;\n dropTargetRef.current = dropTarget;\n isGroupAtRef.current = isGroupAt;\n });\n\n // ── Mouse / shared start ──────────────────────────────────────────────────\n\n /** Move the `draggable` attribute to `next` (or off entirely for `null`). */\n function arm(next: string | number | null) {\n // Arming exists purely to place the native `draggable` attribute, which is\n // never set on a coarse pointer (touch uses the handlers below instead). A\n // tap still synthesises mouseover/mousedown, so without this a touch device\n // would re-render the list on every handle tap to no effect whatsoever.\n if (isCoarsePointer) return;\n if (armedKeyRef.current === next) return; // mouseover fires constantly — no-op\n armedKeyRef.current = next;\n setArmedKeyState(next);\n }\n\n // Arm while the pointer rests on this row's handle, disarm as it moves off.\n // `buttons !== 0` means a press is already in progress: the pointer can drift\n // off the handle before the browser reaches its drag threshold, so hover is\n // ignored until release rather than disarming a drag that is about to start.\n function handleRowMouseOver(key: string | number, e: React.MouseEvent<HTMLDivElement>) {\n if (e.buttons !== 0) return;\n arm((e.target as HTMLElement).closest('[data-drag-handle]') ? key : null);\n }\n\n function handleRowMouseLeave(e: React.MouseEvent<HTMLDivElement>) {\n if (e.buttons !== 0) return;\n arm(null);\n }\n\n // With `dragHandle`, remember on mousedown whether the press landed on a\n // handle, so the dragstart that follows can be ignored if it didn't. Arming\n // here too covers a handle that came to sit under an already-stationary cursor\n // (the list scrolled), which produces no mouseover.\n function handleRowMouseDown(key: string | number, e: React.MouseEvent<HTMLDivElement>) {\n if (e.button !== 0) return; // only a primary press can begin a drag\n const fromHandle = !!(e.target as HTMLElement).closest('[data-drag-handle]');\n dragFromHandleRef.current = fromHandle;\n if (fromHandle) arm(key);\n }\n\n function handleReorderStart(key: string | number, e: React.DragEvent<HTMLDivElement>) {\n if (dragHandle && !dragFromHandleRef.current) {\n e.preventDefault(); // not started from a handle — let the row stay put\n return;\n }\n dragKeyRef.current = key;\n setDraggingKey(key);\n if (treeReorder) setDropTarget(null);\n }\n\n // ── Tree mode ─────────────────────────────────────────────────────────────\n\n /** Resolve the tree drop target for the row at `overIndex` under pointer `y`. */\n function computeTreeDrop(overIndex: number, y: number, rect: DOMRect): TreeDropTarget | null {\n const dragKey = dragKeyRef.current;\n if (dragKey == null) return null;\n const fromIndex = keys.indexOf(dragKey);\n // Forbid dropping onto the dragged node or anything in its own subtree.\n if (fromIndex !== -1 && overIndex >= fromIndex && overIndex <= lastDescendantIndex(fromIndex, depths)) {\n return null;\n }\n const position = resolveTreeDropTarget(y, rect.top, rect.height, isGroupAt(overIndex));\n return { key: keys[overIndex], position };\n }\n\n function handleTreeDragOver(overIndex: number, e: React.DragEvent<HTMLDivElement>) {\n e.preventDefault(); // allow the drop\n const rect = e.currentTarget.getBoundingClientRect();\n const next = computeTreeDrop(overIndex, e.clientY, rect);\n setDropTarget((prev) => (prev?.key === next?.key && prev?.position === next?.position ? prev : next));\n }\n\n function commitTreeDrop() {\n const dragKey = dragKeyRef.current;\n const target = dropTargetRef.current;\n if (dragKey != null && target && target.key !== dragKey) onTreeDrop?.(dragKey, target);\n }\n\n function handleTreeDrop(e: React.DragEvent<HTMLDivElement>) {\n e.preventDefault();\n commitTreeDrop();\n setDropTarget(null);\n dragKeyRef.current = null;\n setDraggingKey(null);\n arm(null);\n }\n\n function handleTreeDragEnd() {\n // Fires after `drop` (or on its own when released off a valid target).\n setDropTarget(null);\n dragKeyRef.current = null;\n setDraggingKey(null);\n arm(null);\n }\n\n // ── Flat mode ─────────────────────────────────────────────────────────────\n\n function handleReorderOver(overIndex: number, e: React.DragEvent<HTMLDivElement>) {\n e.preventDefault(); // allow the drop\n const dragKey = dragKeyRef.current;\n if (dragKey == null) return;\n const fromIndex = keys.indexOf(dragKey);\n // Midpoint hysteresis (see resolveReorderTarget): a move only happens once\n // the pointer crosses the centre of the row it's over. After a swap the\n // dragged row sits under the cursor, so moving again needs real pointer\n // travel — this stops the oscillation that made dragging feel jumpy.\n const rect = e.currentTarget.getBoundingClientRect();\n const target = resolveReorderTarget(fromIndex, overIndex, e.clientY, rect.top, rect.height);\n if (target != null) onReorder?.(fromIndex, target);\n }\n\n function handleReorderEnd() {\n dragKeyRef.current = null;\n setDraggingKey(null);\n arm(null);\n }\n\n // ── Touch reordering (long-press to arm, then drag) ──────────────────────────\n // These handlers run from window listeners during a touch drag, so they read\n // mutable state from refs and are stable across renders.\n\n const reorderAtPoint = useCallback(\n (x: number) => {\n const dragKey = dragKeyRef.current;\n const root = rootRef.current;\n if (dragKey == null || !root) return;\n // Reorder against the centre of the lifted clone, not the raw finger — the\n // finger sits below the clone's top by the grab offset, so using it would\n // make the top (and bottom) rows unreachable. The clone is what the user\n // aims with, so match it.\n const y = dragCloneRef.current\n ? pointerYRef.current - grabOffsetYRef.current + dragHeightRef.current / 2\n : pointerYRef.current;\n const el = document.elementFromPoint(x, y) as HTMLElement | null;\n const rowEl = el && root.contains(el) ? el.closest<HTMLElement>('[data-index]') : null;\n if (!rowEl) return;\n const overIndex = Number(rowEl.dataset.index);\n if (Number.isNaN(overIndex)) return;\n const fromIndex = keysRef.current.indexOf(dragKey);\n const rect = rowEl.getBoundingClientRect();\n if (treeModeRef.current) {\n // Tree mode: don't move live — just track where the drop will land.\n const ks = keysRef.current;\n const ds = depthsRef.current;\n if (fromIndex !== -1 && overIndex >= fromIndex && overIndex <= lastDescendantIndex(fromIndex, ds)) {\n setDropTarget(null);\n return;\n }\n const position = resolveTreeDropTarget(y, rect.top, rect.height, isGroupAtRef.current(overIndex));\n const next: TreeDropTarget = { key: ks[overIndex], position };\n setDropTarget((prev) => (prev?.key === next.key && prev?.position === next.position ? prev : next));\n return;\n }\n const target = resolveReorderTarget(fromIndex, overIndex, y, rect.top, rect.height);\n if (target != null) onReorderRef.current?.(fromIndex, target);\n },\n [rootRef, keysRef],\n );\n\n // Keep the floating clone glued under the finger (same grab point).\n const positionDragClone = useCallback(() => {\n const clone = dragCloneRef.current;\n if (!clone) return;\n clone.style.transform = `translate(${cloneLeftRef.current}px, ${pointerYRef.current - grabOffsetYRef.current}px)`;\n }, []);\n\n // While the finger sits near a top/bottom edge (and within the list's width),\n // scroll the list and keep reordering against the rows now passing under it.\n const autoScrollTick = useCallback(() => {\n const root = rootRef.current;\n if (!root || !touchActiveRef.current) {\n autoScrollRef.current = null;\n return;\n }\n const rect = root.getBoundingClientRect();\n const x = pointerXRef.current;\n const y = pointerYRef.current;\n const EDGE = 48;\n let dy = 0;\n // Only auto-scroll while the finger is actually over the list — moving it\n // outside (any direction) stops the scroll instead of running away; pinning\n // the dragged row keeps touch events alive so it resumes when you come back.\n const inside = x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom;\n if (inside) {\n if (y < rect.top + EDGE) dy = -Math.min(18, Math.ceil((rect.top + EDGE - y) / 3));\n else if (y > rect.bottom - EDGE) dy = Math.min(18, Math.ceil((y - (rect.bottom - EDGE)) / 3));\n }\n if (dy !== 0) {\n root.scrollTop += dy;\n reorderAtPoint(x);\n }\n autoScrollRef.current = requestAnimationFrame(autoScrollTick);\n }, [reorderAtPoint, rootRef]);\n\n const endTouchDrag = useCallback(() => {\n if (longPressRef.current != null) {\n clearTimeout(longPressRef.current);\n longPressRef.current = null;\n }\n window.removeEventListener('touchmove', handleTouchMove);\n window.removeEventListener('touchend', endTouchDrag);\n window.removeEventListener('touchcancel', endTouchDrag);\n if (autoScrollRef.current != null) {\n cancelAnimationFrame(autoScrollRef.current);\n autoScrollRef.current = null;\n }\n if (dragCloneRef.current) {\n dragCloneRef.current.remove();\n dragCloneRef.current = null;\n }\n // Restore native scrolling that was locked for the duration of the drag.\n document.body.style.touchAction = '';\n document.body.style.overscrollBehavior = '';\n if (touchActiveRef.current) {\n // A real drag happened — swallow the click the browser fires afterwards\n // so it doesn't, e.g., toggle row selection.\n suppressNextClickRef.current = true;\n setTimeout(() => {\n suppressNextClickRef.current = false;\n }, 350);\n // Tree mode commits the pending drop on release (flat mode already moved\n // rows live during the drag, so there's nothing to commit here).\n if (treeModeRef.current) {\n const dk = dragKeyRef.current;\n const target = dropTargetRef.current;\n if (dk != null && target && target.key !== dk) onTreeDropRef.current?.(dk, target);\n }\n }\n setDropTarget(null);\n touchActiveRef.current = false;\n touchStartYRef.current = null;\n dragKeyRef.current = null;\n setDraggingKey(null);\n // handleTouchMove and endTouchDrag remove each other’s listeners, so neither can list\n // the other without a cycle.\n // oxlint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const handleTouchMove = useCallback(\n (e: TouchEvent) => {\n const t = e.touches[0];\n if (!t) return;\n pointerXRef.current = t.clientX;\n pointerYRef.current = t.clientY;\n if (!touchActiveRef.current) {\n // Before the long-press fires: if the finger travels, the user means to\n // scroll, so disarm and let the browser handle it (we don't preventDefault).\n const sy = touchStartYRef.current;\n if (sy != null && Math.abs(t.clientY - sy) > 10 && longPressRef.current != null) {\n clearTimeout(longPressRef.current);\n longPressRef.current = null;\n }\n return;\n }\n // Non-passive listener: preventDefault cancels the native scroll for this\n // gesture — the only reliable way once touch-action has been latched at\n // touchstart. This is what makes the drag actually move on touch devices.\n if (e.cancelable) e.preventDefault();\n positionDragClone();\n reorderAtPoint(t.clientX);\n },\n [reorderAtPoint, positionDragClone],\n );\n\n function handleRowTouchStart(key: string | number, e: React.TouchEvent<HTMLDivElement>) {\n if (!reorderable && !treeReorder) return;\n // With a drag handle, only a press that starts on it arms the drag, so the\n // rest of the row stays free for tapping/typing into inputs.\n if (dragHandle && !(e.target as HTMLElement).closest('[data-drag-handle]')) return;\n if (longPressRef.current != null || touchActiveRef.current) return; // ignore extra fingers\n const t = e.touches[0];\n if (!t) return;\n touchStartYRef.current = t.clientY;\n pointerXRef.current = t.clientX;\n pointerYRef.current = t.clientY;\n window.addEventListener('touchmove', handleTouchMove, { passive: false });\n window.addEventListener('touchend', endTouchDrag);\n window.addEventListener('touchcancel', endTouchDrag);\n longPressRef.current = window.setTimeout(() => {\n longPressRef.current = null;\n touchActiveRef.current = true;\n dragKeyRef.current = key;\n setDraggingKey(key);\n navigator.vibrate?.(10);\n // Lock native scrolling for the whole gesture — relying on per-move\n // preventDefault isn't enough once the finger leaves and re-enters the\n // list (the browser commits to a scroll and ignores it). We do all the\n // scrolling ourselves via autoScrollTick.\n document.body.style.touchAction = 'none';\n document.body.style.overscrollBehavior = 'none';\n createDragClone(key);\n if (autoScrollRef.current == null) autoScrollRef.current = requestAnimationFrame(autoScrollTick);\n }, longPressDelay);\n }\n\n // Build a floating copy of the picked-up row that tracks the finger, so the\n // drag has a visible \"lifted\" element (the original row stays dimmed in place\n // as a drop placeholder).\n function createDragClone(key: string | number) {\n const root = rootRef.current;\n if (!root) return;\n const idx = keysRef.current.indexOf(key);\n const src = root.querySelector<HTMLElement>(`[data-index=\"${idx}\"]`);\n if (!src) return;\n const r = src.getBoundingClientRect();\n grabOffsetYRef.current = pointerYRef.current - r.top;\n cloneLeftRef.current = r.left;\n dragHeightRef.current = r.height;\n const clone = src.cloneNode(true) as HTMLElement;\n clone.removeAttribute('data-index');\n clone.setAttribute('data-drag-clone', 'true');\n clone.setAttribute('aria-hidden', 'true');\n clone.classList.add(styles.virtualListDragClone);\n Object.assign(clone.style, {\n position: 'fixed',\n left: '0',\n top: '0',\n width: `${r.width}px`,\n height: `${r.height}px`,\n margin: '0',\n opacity: '1',\n pointerEvents: 'none',\n // Above the sticky header (z-index 2) and any focused row (z-index 1).\n zIndex: '3',\n background: 'var(--background)',\n boxShadow: 'var(--card-shadow)',\n borderRadius: 'var(--default-border-radius)',\n } as Partial<CSSStyleDeclaration>);\n // Appended inside the list so it inherits the active theme's CSS variables;\n // position:fixed keeps it in viewport coordinates regardless.\n root.appendChild(clone);\n dragCloneRef.current = clone;\n positionDragClone();\n }\n\n // Tear down any in-flight touch drag if the component unmounts mid-gesture.\n useEffect(() => endTouchDrag, [endTouchDrag]);\n\n // Either drag mode arms the same row gestures; the handlers above branch on\n // `treeReorder` for the differing target resolution / commit behaviour.\n const dragEnabled = reorderable || treeReorder;\n // Native mouse DnD is in play for this list. Row-level fallbacks that must\n // cover *every* row — swallowing the browser's own drop and context menu —\n // key off this, not off `draggable`, which in `dragHandle` mode is only ever\n // on the single armed row.\n const mouseDragEnabled = dragEnabled && !isCoarsePointer;\n\n function getRowDragProps(index: number, key: string | number): RowDragProps {\n // The drop indicator only renders on the row currently targeted. `before`/\n // `after` lines indent to the target's depth so they sit under where the\n // dropped content will start; `inside` highlights the whole row instead.\n const rowDrop = treeReorder && dropTarget?.key === key ? dropTarget.position : undefined;\n return {\n // Drives the row-wide grab cursor. With `dragHandle`, only the handle\n // initiates a drag, so the cursor belongs on the handle (styled by the\n // consumer), not across the whole row.\n reorderable: dragEnabled && !dragHandle,\n mouseDragEnabled,\n // In `dragHandle` mode the attribute only goes on the row the pointer has\n // armed, so rows stay text-selectable in Firefox the rest of the time.\n draggable: (mouseDragEnabled && (!dragHandle || key === armedKey)) || undefined,\n isDragging: dragEnabled && key === draggingKey,\n onMouseDown: dragEnabled && dragHandle ? (e) => handleRowMouseDown(key, e) : undefined,\n onMouseOver: dragEnabled && dragHandle ? (e) => handleRowMouseOver(key, e) : undefined,\n onMouseLeave: dragEnabled && dragHandle ? handleRowMouseLeave : undefined,\n onDragStart: dragEnabled ? (e) => handleReorderStart(key, e) : undefined,\n onDragOver: treeReorder\n ? (e) => handleTreeDragOver(index, e)\n : reorderable\n ? (e) => handleReorderOver(index, e)\n : undefined,\n onDragEnd: treeReorder ? handleTreeDragEnd : reorderable ? handleReorderEnd : undefined,\n onDrop: treeReorder ? handleTreeDrop : undefined,\n onTouchStart: dragEnabled ? (e) => handleRowTouchStart(key, e) : undefined,\n dropPosition: rowDrop,\n dropIndentPx: rowDrop ? (depths[index] ?? 0) * treeIndentPx : undefined,\n };\n }\n\n function consumeSuppressedClick(): boolean {\n if (suppressNextClickRef.current) {\n suppressNextClickRef.current = false;\n return true;\n }\n return false;\n }\n\n return { draggingKey, dragEnabled, getRowDragProps, consumeSuppressedClick };\n}\n"],"mappings":"6PA+DA,SAAgB,EAAW,CACzB,cACA,cACA,YACA,aACA,kBACA,aACA,eACA,OACA,SACA,YACA,UACA,WACmC,CAGnC,IAAM,EAAa,EAA+B,IAAI,EAChD,CAAC,EAAa,GAAkB,EAAiC,IAAI,EAGrE,CAAC,EAAY,GAAiB,EAAgC,IAAI,EAClE,EAAgB,EAA8B,IAAI,EAClD,EAAe,EAAO,CAAS,EAC/B,EAAgB,EAAO,CAAU,EACjC,EAAc,EAAO,CAAW,EAChC,EAAY,EAAiB,CAAM,EACnC,EAAe,EAA+B,CAAS,EAGvD,EAAoB,EAAO,EAAI,EAQ/B,EAAc,EAA+B,IAAI,EACjD,CAAC,EAAU,IAAoB,EAAiC,IAAI,EACpE,EAAe,EAAsB,IAAI,EACzC,EAAiB,EAAO,EAAK,EAC7B,EAAiB,EAAsB,IAAI,EAC3C,EAAc,EAAO,CAAC,EACtB,EAAc,EAAO,CAAC,EACtB,EAAgB,EAAsB,IAAI,EAC1C,EAAuB,EAAO,EAAK,EAEnC,EAAe,EAA2B,IAAI,EAC9C,EAAiB,EAAO,CAAC,EACzB,EAAe,EAAO,CAAC,EACvB,EAAgB,EAAO,CAAC,EAKxB,CAAC,GAAmB,MACxB,OAAO,OAAW,KAAe,OAAO,OAAO,YAAe,YAC1D,OAAO,WAAW,mBAAmB,CAAC,CAAC,OAE7C,EAEA,MAAsB,CACpB,EAAa,QAAU,EACvB,EAAc,QAAU,EACxB,EAAY,QAAU,EACtB,EAAU,QAAU,EACpB,EAAc,QAAU,EACxB,EAAa,QAAU,CACzB,CAAC,EAKD,SAAS,EAAI,EAA8B,CAKrC,GACA,EAAY,UAAY,IAC5B,EAAY,QAAU,EACtB,GAAiB,CAAI,EACvB,CAMA,SAAS,GAAmB,EAAsB,EAAqC,CACjF,EAAE,UAAY,GAClB,EAAK,EAAE,OAAuB,QAAQ,oBAAoB,EAAI,EAAM,IAAI,CAC1E,CAEA,SAAS,GAAoB,EAAqC,CAC5D,EAAE,UAAY,GAClB,EAAI,IAAI,CACV,CAMA,SAAS,GAAmB,EAAsB,EAAqC,CACrF,GAAI,EAAE,SAAW,EAAG,OACpB,IAAM,EAAa,CAAC,CAAE,EAAE,OAAuB,QAAQ,oBAAoB,EAC3E,EAAkB,QAAU,EACxB,GAAY,EAAI,CAAG,CACzB,CAEA,SAAS,GAAmB,EAAsB,EAAoC,CACpF,GAAI,GAAc,CAAC,EAAkB,QAAS,CAC5C,EAAE,eAAe,EACjB,MACF,CACA,EAAW,QAAU,EACrB,EAAe,CAAG,EACd,GAAa,EAAc,IAAI,CACrC,CAKA,SAAS,GAAgB,EAAmB,EAAW,EAAsC,CAC3F,IAAM,EAAU,EAAW,QAC3B,GAAI,GAAW,KAAM,OAAO,KAC5B,IAAM,EAAY,EAAK,QAAQ,CAAO,EAEtC,GAAI,IAAc,IAAM,GAAa,GAAa,GAAa,EAAoB,EAAW,CAAM,EAClG,OAAO,KAET,IAAM,EAAW,EAAsB,EAAG,EAAK,IAAK,EAAK,OAAQ,EAAU,CAAS,CAAC,EACrF,MAAO,CAAE,IAAK,EAAK,GAAY,UAAS,CAC1C,CAEA,SAAS,GAAmB,EAAmB,EAAoC,CACjF,EAAE,eAAe,EACjB,IAAM,EAAO,EAAE,cAAc,sBAAsB,EAC7C,EAAO,GAAgB,EAAW,EAAE,QAAS,CAAI,EACvD,EAAe,GAAU,GAAM,MAAQ,GAAM,KAAO,GAAM,WAAa,GAAM,SAAW,EAAO,CAAK,CACtG,CAEA,SAAS,IAAiB,CACxB,IAAM,EAAU,EAAW,QACrB,EAAS,EAAc,QACzB,GAAW,MAAQ,GAAU,EAAO,MAAQ,GAAS,IAAa,EAAS,CAAM,CACvF,CAEA,SAAS,GAAe,EAAoC,CAC1D,EAAE,eAAe,EACjB,GAAe,EACf,EAAc,IAAI,EAClB,EAAW,QAAU,KACrB,EAAe,IAAI,EACnB,EAAI,IAAI,CACV,CAEA,SAAS,IAAoB,CAE3B,EAAc,IAAI,EAClB,EAAW,QAAU,KACrB,EAAe,IAAI,EACnB,EAAI,IAAI,CACV,CAIA,SAAS,GAAkB,EAAmB,EAAoC,CAChF,EAAE,eAAe,EACjB,IAAM,EAAU,EAAW,QAC3B,GAAI,GAAW,KAAM,OACrB,IAAM,EAAY,EAAK,QAAQ,CAAO,EAKhC,EAAO,EAAE,cAAc,sBAAsB,EAC7C,EAAS,EAAqB,EAAW,EAAW,EAAE,QAAS,EAAK,IAAK,EAAK,MAAM,EACtF,GAAU,MAAM,IAAY,EAAW,CAAM,CACnD,CAEA,SAAS,IAAmB,CAC1B,EAAW,QAAU,KACrB,EAAe,IAAI,EACnB,EAAI,IAAI,CACV,CAMA,IAAM,EAAiB,EACpB,GAAc,CACb,IAAM,EAAU,EAAW,QACrB,EAAO,EAAQ,QACrB,GAAI,GAAW,MAAQ,CAAC,EAAM,OAK9B,IAAM,EAAI,EAAa,QACnB,EAAY,QAAU,EAAe,QAAU,EAAc,QAAU,EACvE,EAAY,QACV,EAAK,SAAS,iBAAiB,EAAG,CAAC,EACnC,EAAQ,GAAM,EAAK,SAAS,CAAE,EAAI,EAAG,QAAqB,cAAc,EAAI,KAClF,GAAI,CAAC,EAAO,OACZ,IAAM,EAAY,OAAO,EAAM,QAAQ,KAAK,EAC5C,GAAI,OAAO,MAAM,CAAS,EAAG,OAC7B,IAAM,EAAY,EAAQ,QAAQ,QAAQ,CAAO,EAC3C,EAAO,EAAM,sBAAsB,EACzC,GAAI,EAAY,QAAS,CAEvB,IAAM,EAAK,EAAQ,QACb,EAAK,EAAU,QACrB,GAAI,IAAc,IAAM,GAAa,GAAa,GAAa,EAAoB,EAAW,CAAE,EAAG,CACjG,EAAc,IAAI,EAClB,MACF,CACA,IAAM,EAAW,EAAsB,EAAG,EAAK,IAAK,EAAK,OAAQ,EAAa,QAAQ,CAAS,CAAC,EAC1F,EAAuB,CAAE,IAAK,EAAG,GAAY,UAAS,EAC5D,EAAe,GAAU,GAAM,MAAQ,EAAK,KAAO,GAAM,WAAa,EAAK,SAAW,EAAO,CAAK,EAClG,MACF,CACA,IAAM,EAAS,EAAqB,EAAW,EAAW,EAAG,EAAK,IAAK,EAAK,MAAM,EAC9E,GAAU,MAAM,EAAa,UAAU,EAAW,CAAM,CAC9D,EACA,CAAC,EAAS,CAAO,CACnB,EAGM,EAAoB,MAAkB,CAC1C,IAAM,EAAQ,EAAa,QACtB,IACL,EAAM,MAAM,UAAY,aAAa,EAAa,QAAQ,MAAM,EAAY,QAAU,EAAe,QAAQ,KAC/G,EAAG,CAAC,CAAC,EAIC,EAAiB,MAAkB,CACvC,IAAM,EAAO,EAAQ,QACrB,GAAI,CAAC,GAAQ,CAAC,EAAe,QAAS,CACpC,EAAc,QAAU,KACxB,MACF,CACA,IAAM,EAAO,EAAK,sBAAsB,EAClC,EAAI,EAAY,QAChB,EAAI,EAAY,QAElB,EAAK,EAIM,GAAK,EAAK,MAAQ,GAAK,EAAK,OAAS,GAAK,EAAK,KAAO,GAAK,EAAK,SAEzE,EAAI,EAAK,IAAM,GAAM,EAAK,CAAC,KAAK,IAAI,GAAI,KAAK,MAAM,EAAK,IAAM,GAAO,GAAK,CAAC,CAAC,EACvE,EAAI,EAAK,OAAS,KAAM,EAAK,KAAK,IAAI,GAAI,KAAK,MAAM,GAAK,EAAK,OAAS,KAAS,CAAC,CAAC,IAE1F,IAAO,IACT,EAAK,WAAa,EAClB,EAAe,CAAC,GAElB,EAAc,QAAU,sBAAsB,CAAc,CAC9D,EAAG,CAAC,EAAgB,CAAO,CAAC,EAEtB,EAAe,MAAkB,CAmBrC,GAlBI,EAAa,SAAW,OAC1B,aAAa,EAAa,OAAO,EACjC,EAAa,QAAU,MAEzB,OAAO,oBAAoB,YAAa,CAAe,EACvD,OAAO,oBAAoB,WAAY,CAAY,EACnD,OAAO,oBAAoB,cAAe,CAAY,EAClD,EAAc,SAAW,OAC3B,qBAAqB,EAAc,OAAO,EAC1C,EAAc,QAAU,MAE1B,AAEE,EAAa,WADb,EAAa,QAAQ,OAAO,EACL,MAGzB,SAAS,KAAK,MAAM,YAAc,GAClC,SAAS,KAAK,MAAM,mBAAqB,GACrC,EAAe,UAGjB,EAAqB,QAAU,GAC/B,eAAiB,CACf,EAAqB,QAAU,EACjC,EAAG,GAAG,EAGF,EAAY,SAAS,CACvB,IAAM,EAAK,EAAW,QAChB,EAAS,EAAc,QACzB,GAAM,MAAQ,GAAU,EAAO,MAAQ,GAAI,EAAc,UAAU,EAAI,CAAM,CACnF,CAEF,EAAc,IAAI,EAClB,EAAe,QAAU,GACzB,EAAe,QAAU,KACzB,EAAW,QAAU,KACrB,EAAe,IAAI,CAIrB,EAAG,CAAC,CAAC,EAEC,EAAkB,EACrB,GAAkB,CACjB,IAAM,EAAI,EAAE,QAAQ,GACf,KAGL,IAFA,EAAY,QAAU,EAAE,QACxB,EAAY,QAAU,EAAE,QACpB,CAAC,EAAe,QAAS,CAG3B,IAAM,EAAK,EAAe,QACtB,GAAM,MAAQ,KAAK,IAAI,EAAE,QAAU,CAAE,EAAI,IAAM,EAAa,SAAW,OACzE,aAAa,EAAa,OAAO,EACjC,EAAa,QAAU,MAEzB,MACF,CAII,EAAE,YAAY,EAAE,eAAe,EACnC,EAAkB,EAClB,EAAe,EAAE,OAAO,CANxB,CAOF,EACA,CAAC,EAAgB,CAAiB,CACpC,EAEA,SAAS,GAAoB,EAAsB,EAAqC,CAKtF,GAJI,CAAC,GAAe,CAAC,GAGjB,GAAc,CAAE,EAAE,OAAuB,QAAQ,oBAAoB,GACrE,EAAa,SAAW,MAAQ,EAAe,QAAS,OAC5D,IAAM,EAAI,EAAE,QAAQ,GACf,IACL,EAAe,QAAU,EAAE,QAC3B,EAAY,QAAU,EAAE,QACxB,EAAY,QAAU,EAAE,QACxB,OAAO,iBAAiB,YAAa,EAAiB,CAAE,QAAS,EAAM,CAAC,EACxE,OAAO,iBAAiB,WAAY,CAAY,EAChD,OAAO,iBAAiB,cAAe,CAAY,EACnD,EAAa,QAAU,OAAO,eAAiB,CAC7C,EAAa,QAAU,KACvB,EAAe,QAAU,GACzB,EAAW,QAAU,EACrB,EAAe,CAAG,EAClB,UAAU,UAAU,EAAE,EAKtB,SAAS,KAAK,MAAM,YAAc,OAClC,SAAS,KAAK,MAAM,mBAAqB,OACzC,GAAgB,CAAG,EACnB,AAAmC,EAAc,UAAU,sBAAsB,CAAc,CACjG,EAAG,EAAc,EACnB,CAKA,SAAS,GAAgB,EAAsB,CAC7C,IAAM,EAAO,EAAQ,QACrB,GAAI,CAAC,EAAM,OACX,IAAM,EAAM,EAAQ,QAAQ,QAAQ,CAAG,EACjC,EAAM,EAAK,cAA2B,gBAAgB,EAAI,GAAG,EACnE,GAAI,CAAC,EAAK,OACV,IAAM,EAAI,EAAI,sBAAsB,EACpC,EAAe,QAAU,EAAY,QAAU,EAAE,IACjD,EAAa,QAAU,EAAE,KACzB,EAAc,QAAU,EAAE,OAC1B,IAAM,EAAQ,EAAI,UAAU,EAAI,EAChC,EAAM,gBAAgB,YAAY,EAClC,EAAM,aAAa,kBAAmB,MAAM,EAC5C,EAAM,aAAa,cAAe,MAAM,EACxC,EAAM,UAAU,IAAI,EAAO,oBAAoB,EAC/C,OAAO,OAAO,EAAM,MAAO,CACzB,SAAU,QACV,KAAM,IACN,IAAK,IACL,MAAO,GAAG,EAAE,MAAM,IAClB,OAAQ,GAAG,EAAE,OAAO,IACpB,OAAQ,IACR,QAAS,IACT,cAAe,OAEf,OAAQ,IACR,WAAY,oBACZ,UAAW,qBACX,aAAc,8BAChB,CAAiC,EAGjC,EAAK,YAAY,CAAK,EACtB,EAAa,QAAU,EACvB,EAAkB,CACpB,CAGA,MAAgB,EAAc,CAAC,CAAY,CAAC,EAI5C,IAAM,EAAc,GAAe,EAK7B,EAAmB,GAAe,CAAC,EAEzC,SAAS,GAAgB,EAAe,EAAoC,CAI1E,IAAM,EAAU,GAAe,GAAY,MAAQ,EAAM,EAAW,SAAW,IAAA,GAC/E,MAAO,CAIL,YAAa,GAAe,CAAC,EAC7B,mBAGA,UAAY,IAAqB,CAAC,GAAc,IAAQ,IAAc,IAAA,GACtE,WAAY,GAAe,IAAQ,EACnC,YAAa,GAAe,EAAc,GAAM,GAAmB,EAAK,CAAC,EAAI,IAAA,GAC7E,YAAa,GAAe,EAAc,GAAM,GAAmB,EAAK,CAAC,EAAI,IAAA,GAC7E,aAAc,GAAe,EAAa,GAAsB,IAAA,GAChE,YAAa,EAAe,GAAM,GAAmB,EAAK,CAAC,EAAI,IAAA,GAC/D,WAAY,EACP,GAAM,GAAmB,EAAO,CAAC,EAClC,EACG,GAAM,GAAkB,EAAO,CAAC,EACjC,IAAA,GACN,UAAW,EAAc,GAAoB,EAAc,GAAmB,IAAA,GAC9E,OAAQ,EAAc,GAAiB,IAAA,GACvC,aAAc,EAAe,GAAM,GAAoB,EAAK,CAAC,EAAI,IAAA,GACjE,aAAc,EACd,aAAc,GAAW,EAAO,IAAU,GAAK,EAAe,IAAA,EAChE,CACF,CAEA,SAAS,IAAkC,CAKzC,OAJI,EAAqB,SACvB,EAAqB,QAAU,GACxB,IAEF,EACT,CAEA,MAAO,CAAE,cAAa,cAAa,mBAAiB,yBAAuB,CAC7E"}
1
+ {"version":3,"file":"useRowDrag.mjs","names":[],"sources":["../../../../package/common/virtualList/useRowDrag.ts"],"sourcesContent":["import React, { useState, useRef, useEffect, useLayoutEffect, useCallback } from 'react';\n\nimport styles from './virtualList.module.pcss';\nimport { resolveReorderTarget, resolveTreeDropTarget, lastDescendantIndex } from './virtualList.utils';\nimport type { TreeDropPosition, TreeDropTarget } from './virtualList.types';\n\ninterface UseRowDragArgs {\n reorderable: boolean;\n treeReorder: boolean;\n onReorder?: (fromIndex: number, toIndex: number) => void;\n onTreeDrop?: (dragKey: string | number, target: TreeDropTarget) => void;\n longPressDelay: number;\n dragHandle: boolean;\n treeIndentPx: number;\n /** Current flat ordering and depth tags (mouse handlers read these directly). */\n keys: (string | number)[];\n depths: number[];\n isGroupAt: (index: number) => boolean;\n rootRef: React.RefObject<HTMLDivElement | null>;\n /** Latest keys for async (touch / rAF) consumers — owned by useVirtualWindow. */\n keysRef: React.RefObject<(string | number)[]>;\n}\n\n/** The drag-related props the parent spreads onto a given row. */\nexport interface RowDragProps {\n reorderable: boolean;\n /** Native mouse DnD is active for the list (independent of which row is armed). */\n mouseDragEnabled: boolean;\n draggable: boolean | undefined;\n isDragging: boolean;\n onMouseDown: ((e: React.MouseEvent<HTMLDivElement>) => void) | undefined;\n onMouseOver: ((e: React.MouseEvent<HTMLDivElement>) => void) | undefined;\n onMouseLeave: ((e: React.MouseEvent<HTMLDivElement>) => void) | undefined;\n onDragStart: ((e: React.DragEvent<HTMLDivElement>) => void) | undefined;\n onDragOver: ((e: React.DragEvent<HTMLDivElement>) => void) | undefined;\n onDragEnd: (() => void) | undefined;\n onDrop: ((e: React.DragEvent<HTMLDivElement>) => void) | undefined;\n onTouchStart: ((e: React.TouchEvent<HTMLDivElement>) => void) | undefined;\n dropPosition: TreeDropPosition | undefined;\n dropIndentPx: number | undefined;\n}\n\ninterface UseRowDragResult {\n /** True while a row is being dragged (for the root reordering style). */\n draggingKey: string | number | null;\n /** Whether either drag mode is active. */\n dragEnabled: boolean;\n /** Drag props for the row at `index` / `key`. */\n getRowDragProps: (index: number, key: string | number) => RowDragProps;\n /** Returns true (and resets) if the next click should be swallowed (post-drag). */\n consumeSuppressedClick: () => boolean;\n}\n\n/**\n * Row drag-and-drop for both modes:\n * - `reorderable` (flat): native HTML5 drag on desktop; rows move live via\n * `onReorder` with midpoint hysteresis.\n * - `treeReorder`: a drop indicator (before/after/inside) is shown during the\n * drag and `onTreeDrop` fires once on release; dropping onto the dragged\n * node's own subtree is forbidden.\n * Touch uses a long-press → lifted-clone → pointer-move path with edge\n * auto-scroll. `dragHandle` restricts initiation to `[data-drag-handle]`.\n */\nexport function useRowDrag({\n reorderable,\n treeReorder,\n onReorder,\n onTreeDrop,\n longPressDelay,\n dragHandle,\n treeIndentPx,\n keys,\n depths,\n isGroupAt,\n rootRef,\n keysRef,\n}: UseRowDragArgs): UseRowDragResult {\n // The dragged item is tracked by its stable key (indices shift after each\n // live reorder); the ref drives the logic, the state drives the row's style.\n const dragKeyRef = useRef<string | number | null>(null);\n const [draggingKey, setDraggingKey] = useState<string | number | null>(null);\n // Tree-reorder drop indicator. Unlike flat reorder (which moves rows live),\n // tree mode shows where the drop will land and commits once on release.\n const [dropTarget, setDropTarget] = useState<TreeDropTarget | null>(null);\n const dropTargetRef = useRef<TreeDropTarget | null>(null);\n const onReorderRef = useRef(onReorder);\n const onTreeDropRef = useRef(onTreeDrop);\n const treeModeRef = useRef(treeReorder);\n const depthsRef = useRef<number[]>(depths);\n const isGroupAtRef = useRef<(i: number) => boolean>(isGroupAt);\n // When `dragHandle` is on, a mousedown sets this to whether it landed on a\n // `[data-drag-handle]` element, gating whether the ensuing dragstart is honoured.\n const dragFromHandleRef = useRef(true);\n // In `dragHandle` mode the `draggable` attribute is only on the row whose\n // handle the pointer is currently over (\"armed\"). A permanently `draggable`\n // row breaks mouse text selection (caret placement, double-click word select,\n // drag select) inside any child input in Firefox — see Mozilla bugs 739071 /\n // 800050 / 1189486. Arming on hover rather than on mousedown means the\n // attribute is already in place before the press, so the browser never has to\n // notice it appearing mid-gesture, and any pointer move re-derives it.\n const armedKeyRef = useRef<string | number | null>(null);\n const [armedKey, setArmedKeyState] = useState<string | number | null>(null);\n const longPressRef = useRef<number | null>(null);\n const touchActiveRef = useRef(false);\n const touchStartYRef = useRef<number | null>(null);\n const pointerXRef = useRef(0);\n const pointerYRef = useRef(0);\n const autoScrollRef = useRef<number | null>(null);\n const suppressNextClickRef = useRef(false);\n // Floating clone that follows the finger during a touch drag.\n const dragCloneRef = useRef<HTMLElement | null>(null);\n const grabOffsetYRef = useRef(0);\n const cloneLeftRef = useRef(0);\n const dragHeightRef = useRef(0);\n // The native `draggable` attribute (mouse DnD) makes a long-press start the\n // browser's own drag on touch devices, which hijacks our touch handlers. So\n // expose it only where the primary pointer is fine (mouse/trackpad); touch\n // devices use the touch handlers below instead.\n const [isCoarsePointer] = useState(() =>\n typeof window !== 'undefined' && typeof window.matchMedia === 'function'\n ? window.matchMedia('(pointer: coarse)').matches\n : false,\n );\n\n useLayoutEffect(() => {\n onReorderRef.current = onReorder;\n onTreeDropRef.current = onTreeDrop;\n treeModeRef.current = treeReorder;\n depthsRef.current = depths;\n dropTargetRef.current = dropTarget;\n isGroupAtRef.current = isGroupAt;\n });\n\n // ── Mouse / shared start ──────────────────────────────────────────────────\n\n /** Move the `draggable` attribute to `next` (or off entirely for `null`). */\n function arm(next: string | number | null) {\n // Arming exists purely to place the native `draggable` attribute, which is\n // never set on a coarse pointer (touch uses the handlers below instead). A\n // tap still synthesises mouseover/mousedown, so without this a touch device\n // would re-render the list on every handle tap to no effect whatsoever.\n if (isCoarsePointer) return;\n if (armedKeyRef.current === next) return; // mouseover fires constantly — no-op\n armedKeyRef.current = next;\n setArmedKeyState(next);\n }\n\n // Arm while the pointer rests on this row's handle, disarm as it moves off.\n // `buttons !== 0` means a press is already in progress: the pointer can drift\n // off the handle before the browser reaches its drag threshold, so hover is\n // ignored until release rather than disarming a drag that is about to start.\n function handleRowMouseOver(key: string | number, e: React.MouseEvent<HTMLDivElement>) {\n if (e.buttons !== 0) return;\n arm((e.target as HTMLElement).closest('[data-drag-handle]') ? key : null);\n }\n\n function handleRowMouseLeave(e: React.MouseEvent<HTMLDivElement>) {\n if (e.buttons !== 0) return;\n arm(null);\n }\n\n // With `dragHandle`, remember on mousedown whether the press landed on a\n // handle, so the dragstart that follows can be ignored if it didn't. Arming\n // here too covers a handle that came to sit under an already-stationary cursor\n // (the list scrolled), which produces no mouseover.\n function handleRowMouseDown(key: string | number, e: React.MouseEvent<HTMLDivElement>) {\n if (e.button !== 0) return; // only a primary press can begin a drag\n const fromHandle = !!(e.target as HTMLElement).closest('[data-drag-handle]');\n dragFromHandleRef.current = fromHandle;\n if (fromHandle) arm(key);\n }\n\n function handleReorderStart(key: string | number, e: React.DragEvent<HTMLDivElement>) {\n if (dragHandle && !dragFromHandleRef.current) {\n e.preventDefault(); // not started from a handle — let the row stay put\n return;\n }\n dragKeyRef.current = key;\n setDraggingKey(key);\n if (treeReorder) setDropTarget(null);\n }\n\n // ── Tree mode ─────────────────────────────────────────────────────────────\n\n /** Resolve the tree drop target for the row at `overIndex` under pointer `y`. */\n function computeTreeDrop(overIndex: number, y: number, rect: DOMRect): TreeDropTarget | null {\n const dragKey = dragKeyRef.current;\n if (dragKey == null) return null;\n const fromIndex = keys.indexOf(dragKey);\n // Forbid dropping onto the dragged node or anything in its own subtree.\n if (fromIndex !== -1 && overIndex >= fromIndex && overIndex <= lastDescendantIndex(fromIndex, depths)) {\n return null;\n }\n const position = resolveTreeDropTarget(y, rect.top, rect.height, isGroupAt(overIndex));\n return { key: keys[overIndex], position };\n }\n\n function handleTreeDragOver(overIndex: number, e: React.DragEvent<HTMLDivElement>) {\n e.preventDefault(); // allow the drop\n const rect = e.currentTarget.getBoundingClientRect();\n const next = computeTreeDrop(overIndex, e.clientY, rect);\n setDropTarget((prev) => (prev?.key === next?.key && prev?.position === next?.position ? prev : next));\n }\n\n function commitTreeDrop() {\n const dragKey = dragKeyRef.current;\n const target = dropTargetRef.current;\n if (dragKey != null && target && target.key !== dragKey) onTreeDrop?.(dragKey, target);\n }\n\n function handleTreeDrop(e: React.DragEvent<HTMLDivElement>) {\n e.preventDefault();\n commitTreeDrop();\n setDropTarget(null);\n dragKeyRef.current = null;\n setDraggingKey(null);\n arm(null);\n }\n\n function handleTreeDragEnd() {\n // Fires after `drop` (or on its own when released off a valid target).\n setDropTarget(null);\n dragKeyRef.current = null;\n setDraggingKey(null);\n arm(null);\n }\n\n // ── Flat mode ─────────────────────────────────────────────────────────────\n\n function handleReorderOver(overIndex: number, e: React.DragEvent<HTMLDivElement>) {\n e.preventDefault(); // allow the drop\n const dragKey = dragKeyRef.current;\n if (dragKey == null) return;\n const fromIndex = keys.indexOf(dragKey);\n // Midpoint hysteresis (see resolveReorderTarget): a move only happens once\n // the pointer crosses the centre of the row it's over. After a swap the\n // dragged row sits under the cursor, so moving again needs real pointer\n // travel — this stops the oscillation that made dragging feel jumpy.\n const rect = e.currentTarget.getBoundingClientRect();\n const target = resolveReorderTarget(fromIndex, overIndex, e.clientY, rect.top, rect.height);\n if (target != null) onReorder?.(fromIndex, target);\n }\n\n function handleReorderEnd() {\n dragKeyRef.current = null;\n setDraggingKey(null);\n arm(null);\n }\n\n // ── Touch reordering (long-press to arm, then drag) ──────────────────────────\n // These handlers run from window listeners during a touch drag, so they read\n // mutable state from refs and are stable across renders.\n\n const reorderAtPoint = useCallback(\n (x: number) => {\n const dragKey = dragKeyRef.current;\n const root = rootRef.current;\n if (dragKey == null || !root) return;\n // Reorder against the centre of the lifted clone, not the raw finger — the\n // finger sits below the clone's top by the grab offset, so using it would\n // make the top (and bottom) rows unreachable. The clone is what the user\n // aims with, so match it.\n const y = dragCloneRef.current\n ? pointerYRef.current - grabOffsetYRef.current + dragHeightRef.current / 2\n : pointerYRef.current;\n const el = document.elementFromPoint(x, y) as HTMLElement | null;\n const rowEl = el && root.contains(el) ? el.closest<HTMLElement>('[data-index]') : null;\n if (!rowEl) return;\n const overIndex = Number(rowEl.dataset.index);\n if (Number.isNaN(overIndex)) return;\n const fromIndex = keysRef.current.indexOf(dragKey);\n const rect = rowEl.getBoundingClientRect();\n if (treeModeRef.current) {\n // Tree mode: don't move live — just track where the drop will land.\n const ks = keysRef.current;\n const ds = depthsRef.current;\n if (fromIndex !== -1 && overIndex >= fromIndex && overIndex <= lastDescendantIndex(fromIndex, ds)) {\n setDropTarget(null);\n return;\n }\n const position = resolveTreeDropTarget(y, rect.top, rect.height, isGroupAtRef.current(overIndex));\n const next: TreeDropTarget = { key: ks[overIndex], position };\n setDropTarget((prev) => (prev?.key === next.key && prev?.position === next.position ? prev : next));\n return;\n }\n const target = resolveReorderTarget(fromIndex, overIndex, y, rect.top, rect.height);\n if (target != null) onReorderRef.current?.(fromIndex, target);\n },\n [rootRef, keysRef],\n );\n\n // Keep the floating clone glued under the finger (same grab point).\n const positionDragClone = useCallback(() => {\n const clone = dragCloneRef.current;\n if (!clone) return;\n clone.style.transform = `translate(${cloneLeftRef.current}px, ${pointerYRef.current - grabOffsetYRef.current}px)`;\n }, []);\n\n // While the finger sits near a top/bottom edge (and within the list's width),\n // scroll the list and keep reordering against the rows now passing under it.\n const autoScrollTick = useCallback(() => {\n const root = rootRef.current;\n if (!root || !touchActiveRef.current) {\n autoScrollRef.current = null;\n return;\n }\n const rect = root.getBoundingClientRect();\n const x = pointerXRef.current;\n const y = pointerYRef.current;\n const EDGE = 48;\n let dy = 0;\n // Only auto-scroll while the finger is actually over the list — moving it\n // outside (any direction) stops the scroll instead of running away; pinning\n // the dragged row keeps touch events alive so it resumes when you come back.\n const inside = x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom;\n if (inside) {\n if (y < rect.top + EDGE) dy = -Math.min(18, Math.ceil((rect.top + EDGE - y) / 3));\n else if (y > rect.bottom - EDGE) dy = Math.min(18, Math.ceil((y - (rect.bottom - EDGE)) / 3));\n }\n if (dy !== 0) {\n root.scrollTop += dy;\n reorderAtPoint(x);\n }\n autoScrollRef.current = requestAnimationFrame(autoScrollTick);\n }, [reorderAtPoint, rootRef]);\n\n const endTouchDrag = useCallback(() => {\n if (longPressRef.current != null) {\n clearTimeout(longPressRef.current);\n longPressRef.current = null;\n }\n window.removeEventListener('touchmove', handleTouchMove);\n window.removeEventListener('touchend', endTouchDrag);\n window.removeEventListener('touchcancel', endTouchDrag);\n if (autoScrollRef.current != null) {\n cancelAnimationFrame(autoScrollRef.current);\n autoScrollRef.current = null;\n }\n if (dragCloneRef.current) {\n dragCloneRef.current.remove();\n dragCloneRef.current = null;\n }\n // Restore native scrolling that was locked for the duration of the drag.\n document.body.style.touchAction = '';\n document.body.style.overscrollBehavior = '';\n if (touchActiveRef.current) {\n // A real drag happened — swallow the click the browser fires afterwards\n // so it doesn't, e.g., toggle row selection.\n suppressNextClickRef.current = true;\n setTimeout(() => {\n suppressNextClickRef.current = false;\n }, 350);\n // Tree mode commits the pending drop on release (flat mode already moved\n // rows live during the drag, so there's nothing to commit here).\n if (treeModeRef.current) {\n const dk = dragKeyRef.current;\n const target = dropTargetRef.current;\n if (dk != null && target && target.key !== dk) onTreeDropRef.current?.(dk, target);\n }\n }\n setDropTarget(null);\n touchActiveRef.current = false;\n touchStartYRef.current = null;\n dragKeyRef.current = null;\n setDraggingKey(null);\n // handleTouchMove and endTouchDrag remove each other’s listeners, so neither can list\n // the other without a cycle.\n // oxlint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const handleTouchMove = useCallback(\n (e: TouchEvent) => {\n const t = e.touches[0];\n if (!t) return;\n pointerXRef.current = t.clientX;\n pointerYRef.current = t.clientY;\n if (!touchActiveRef.current) {\n // Before the long-press fires: if the finger travels, the user means to\n // scroll, so disarm and let the browser handle it (we don't preventDefault).\n const sy = touchStartYRef.current;\n if (sy != null && Math.abs(t.clientY - sy) > 10 && longPressRef.current != null) {\n clearTimeout(longPressRef.current);\n longPressRef.current = null;\n }\n return;\n }\n // Non-passive listener: preventDefault cancels the native scroll for this\n // gesture — the only reliable way once touch-action has been latched at\n // touchstart. This is what makes the drag actually move on touch devices.\n if (e.cancelable) e.preventDefault();\n positionDragClone();\n reorderAtPoint(t.clientX);\n },\n [reorderAtPoint, positionDragClone],\n );\n\n function handleRowTouchStart(key: string | number, e: React.TouchEvent<HTMLDivElement>) {\n if (!reorderable && !treeReorder) return;\n // With a drag handle, only a press that starts on it arms the drag, so the\n // rest of the row stays free for tapping/typing into inputs.\n if (dragHandle && !(e.target as HTMLElement).closest('[data-drag-handle]')) return;\n if (longPressRef.current != null || touchActiveRef.current) return; // ignore extra fingers\n const t = e.touches[0];\n if (!t) return;\n touchStartYRef.current = t.clientY;\n pointerXRef.current = t.clientX;\n pointerYRef.current = t.clientY;\n window.addEventListener('touchmove', handleTouchMove, { passive: false });\n window.addEventListener('touchend', endTouchDrag);\n window.addEventListener('touchcancel', endTouchDrag);\n longPressRef.current = window.setTimeout(() => {\n longPressRef.current = null;\n touchActiveRef.current = true;\n dragKeyRef.current = key;\n setDraggingKey(key);\n navigator.vibrate?.(10);\n // Lock native scrolling for the whole gesture — relying on per-move\n // preventDefault isn't enough once the finger leaves and re-enters the\n // list (the browser commits to a scroll and ignores it). We do all the\n // scrolling ourselves via autoScrollTick.\n document.body.style.touchAction = 'none';\n document.body.style.overscrollBehavior = 'none';\n createDragClone(key);\n if (autoScrollRef.current == null) autoScrollRef.current = requestAnimationFrame(autoScrollTick);\n }, longPressDelay);\n }\n\n // Build a floating copy of the picked-up row that tracks the finger, so the\n // drag has a visible \"lifted\" element (the original row stays dimmed in place\n // as a drop placeholder).\n function createDragClone(key: string | number) {\n const root = rootRef.current;\n if (!root) return;\n const idx = keysRef.current.indexOf(key);\n const src = root.querySelector<HTMLElement>(`[data-index=\"${idx}\"]`);\n if (!src) return;\n const r = src.getBoundingClientRect();\n grabOffsetYRef.current = pointerYRef.current - r.top;\n cloneLeftRef.current = r.left;\n dragHeightRef.current = r.height;\n const clone = src.cloneNode(true) as HTMLElement;\n clone.removeAttribute('data-index');\n clone.setAttribute('data-drag-clone', 'true');\n clone.setAttribute('aria-hidden', 'true');\n clone.classList.add(styles.virtualListDragClone);\n Object.assign(clone.style, {\n position: 'fixed',\n left: '0',\n top: '0',\n width: `${r.width}px`,\n height: `${r.height}px`,\n margin: '0',\n opacity: '1',\n pointerEvents: 'none',\n // Above the sticky header (z-index 2) and any focused row (z-index 1).\n zIndex: '3',\n background: 'var(--background)',\n boxShadow: 'var(--card-shadow)',\n borderRadius: 'var(--default-border-radius)',\n } as Partial<CSSStyleDeclaration>);\n // Appended inside the list so it inherits the active theme's CSS variables;\n // position:fixed keeps it in viewport coordinates regardless.\n root.appendChild(clone);\n dragCloneRef.current = clone;\n positionDragClone();\n }\n\n // Tear down any in-flight touch drag if the component unmounts mid-gesture.\n useEffect(() => endTouchDrag, [endTouchDrag]);\n\n // Either drag mode arms the same row gestures; the handlers above branch on\n // `treeReorder` for the differing target resolution / commit behaviour.\n const dragEnabled = reorderable || treeReorder;\n // Native mouse DnD is in play for this list. Row-level fallbacks that must\n // cover *every* row — swallowing the browser's own drop and context menu —\n // key off this, not off `draggable`, which in `dragHandle` mode is only ever\n // on the single armed row.\n const mouseDragEnabled = dragEnabled && !isCoarsePointer;\n\n function getRowDragProps(index: number, key: string | number): RowDragProps {\n // The drop indicator only renders on the row currently targeted. `before`/\n // `after` lines indent to the target's depth so they sit under where the\n // dropped content will start; `inside` highlights the whole row instead.\n const rowDrop = treeReorder && dropTarget?.key === key ? dropTarget.position : undefined;\n return {\n // Drives the row-wide grab cursor. With `dragHandle`, only the handle\n // initiates a drag, so the cursor belongs on the handle (styled by the\n // consumer), not across the whole row.\n reorderable: dragEnabled && !dragHandle,\n mouseDragEnabled,\n // In `dragHandle` mode the attribute only goes on the row the pointer has\n // armed, so rows stay text-selectable in Firefox the rest of the time.\n draggable: (mouseDragEnabled && (!dragHandle || key === armedKey)) || undefined,\n isDragging: dragEnabled && key === draggingKey,\n onMouseDown: dragEnabled && dragHandle ? (e) => handleRowMouseDown(key, e) : undefined,\n onMouseOver: dragEnabled && dragHandle ? (e) => handleRowMouseOver(key, e) : undefined,\n onMouseLeave: dragEnabled && dragHandle ? handleRowMouseLeave : undefined,\n onDragStart: dragEnabled ? (e) => handleReorderStart(key, e) : undefined,\n onDragOver: treeReorder\n ? (e) => handleTreeDragOver(index, e)\n : reorderable\n ? (e) => handleReorderOver(index, e)\n : undefined,\n onDragEnd: treeReorder ? handleTreeDragEnd : reorderable ? handleReorderEnd : undefined,\n onDrop: treeReorder ? handleTreeDrop : undefined,\n onTouchStart: dragEnabled ? (e) => handleRowTouchStart(key, e) : undefined,\n dropPosition: rowDrop,\n dropIndentPx: rowDrop ? (depths[index] ?? 0) * treeIndentPx : undefined,\n };\n }\n\n function consumeSuppressedClick(): boolean {\n if (suppressNextClickRef.current) {\n suppressNextClickRef.current = false;\n return true;\n }\n return false;\n }\n\n return { draggingKey, dragEnabled, getRowDragProps, consumeSuppressedClick };\n}\n"],"mappings":"0QA+DA,SAAgB,EAAW,CACzB,cACA,cACA,YACA,aACA,kBACA,aACA,eACA,OACA,SACA,YACA,UACA,WACmC,CAGnC,IAAM,EAAa,EAA+B,IAAI,EAChD,CAAC,EAAa,GAAkB,EAAiC,IAAI,EAGrE,CAAC,EAAY,GAAiB,EAAgC,IAAI,EAClE,EAAgB,EAA8B,IAAI,EAClD,EAAe,EAAO,CAAS,EAC/B,EAAgB,EAAO,CAAU,EACjC,EAAc,EAAO,CAAW,EAChC,EAAY,EAAiB,CAAM,EACnC,EAAe,EAA+B,CAAS,EAGvD,EAAoB,EAAO,EAAI,EAQ/B,EAAc,EAA+B,IAAI,EACjD,CAAC,EAAU,IAAoB,EAAiC,IAAI,EACpE,EAAe,EAAsB,IAAI,EACzC,EAAiB,EAAO,EAAK,EAC7B,EAAiB,EAAsB,IAAI,EAC3C,EAAc,EAAO,CAAC,EACtB,EAAc,EAAO,CAAC,EACtB,EAAgB,EAAsB,IAAI,EAC1C,EAAuB,EAAO,EAAK,EAEnC,EAAe,EAA2B,IAAI,EAC9C,EAAiB,EAAO,CAAC,EACzB,EAAe,EAAO,CAAC,EACvB,EAAgB,EAAO,CAAC,EAKxB,CAAC,GAAmB,MACxB,OAAO,OAAW,KAAe,OAAO,OAAO,YAAe,YAC1D,OAAO,WAAW,mBAAmB,CAAC,CAAC,OAE7C,EAEA,MAAsB,CACpB,EAAa,QAAU,EACvB,EAAc,QAAU,EACxB,EAAY,QAAU,EACtB,EAAU,QAAU,EACpB,EAAc,QAAU,EACxB,EAAa,QAAU,CACzB,CAAC,EAKD,SAAS,EAAI,EAA8B,CAKrC,GACA,EAAY,UAAY,IAC5B,EAAY,QAAU,EACtB,GAAiB,CAAI,EACvB,CAMA,SAAS,GAAmB,EAAsB,EAAqC,CACjF,EAAE,UAAY,GAClB,EAAK,EAAE,OAAuB,QAAQ,oBAAoB,EAAI,EAAM,IAAI,CAC1E,CAEA,SAAS,GAAoB,EAAqC,CAC5D,EAAE,UAAY,GAClB,EAAI,IAAI,CACV,CAMA,SAAS,GAAmB,EAAsB,EAAqC,CACrF,GAAI,EAAE,SAAW,EAAG,OACpB,IAAM,EAAa,CAAC,CAAE,EAAE,OAAuB,QAAQ,oBAAoB,EAC3E,EAAkB,QAAU,EACxB,GAAY,EAAI,CAAG,CACzB,CAEA,SAAS,GAAmB,EAAsB,EAAoC,CACpF,GAAI,GAAc,CAAC,EAAkB,QAAS,CAC5C,EAAE,eAAe,EACjB,MACF,CACA,EAAW,QAAU,EACrB,EAAe,CAAG,EACd,GAAa,EAAc,IAAI,CACrC,CAKA,SAAS,GAAgB,EAAmB,EAAW,EAAsC,CAC3F,IAAM,EAAU,EAAW,QAC3B,GAAI,GAAW,KAAM,OAAO,KAC5B,IAAM,EAAY,EAAK,QAAQ,CAAO,EAEtC,GAAI,IAAc,IAAM,GAAa,GAAa,GAAa,EAAoB,EAAW,CAAM,EAClG,OAAO,KAET,IAAM,EAAW,EAAsB,EAAG,EAAK,IAAK,EAAK,OAAQ,EAAU,CAAS,CAAC,EACrF,MAAO,CAAE,IAAK,EAAK,GAAY,UAAS,CAC1C,CAEA,SAAS,GAAmB,EAAmB,EAAoC,CACjF,EAAE,eAAe,EACjB,IAAM,EAAO,EAAE,cAAc,sBAAsB,EAC7C,EAAO,GAAgB,EAAW,EAAE,QAAS,CAAI,EACvD,EAAe,GAAU,GAAM,MAAQ,GAAM,KAAO,GAAM,WAAa,GAAM,SAAW,EAAO,CAAK,CACtG,CAEA,SAAS,IAAiB,CACxB,IAAM,EAAU,EAAW,QACrB,EAAS,EAAc,QACzB,GAAW,MAAQ,GAAU,EAAO,MAAQ,GAAS,IAAa,EAAS,CAAM,CACvF,CAEA,SAAS,GAAe,EAAoC,CAC1D,EAAE,eAAe,EACjB,GAAe,EACf,EAAc,IAAI,EAClB,EAAW,QAAU,KACrB,EAAe,IAAI,EACnB,EAAI,IAAI,CACV,CAEA,SAAS,IAAoB,CAE3B,EAAc,IAAI,EAClB,EAAW,QAAU,KACrB,EAAe,IAAI,EACnB,EAAI,IAAI,CACV,CAIA,SAAS,GAAkB,EAAmB,EAAoC,CAChF,EAAE,eAAe,EACjB,IAAM,EAAU,EAAW,QAC3B,GAAI,GAAW,KAAM,OACrB,IAAM,EAAY,EAAK,QAAQ,CAAO,EAKhC,EAAO,EAAE,cAAc,sBAAsB,EAC7C,EAAS,EAAqB,EAAW,EAAW,EAAE,QAAS,EAAK,IAAK,EAAK,MAAM,EACtF,GAAU,MAAM,IAAY,EAAW,CAAM,CACnD,CAEA,SAAS,IAAmB,CAC1B,EAAW,QAAU,KACrB,EAAe,IAAI,EACnB,EAAI,IAAI,CACV,CAMA,IAAM,EAAiB,EACpB,GAAc,CACb,IAAM,EAAU,EAAW,QACrB,EAAO,EAAQ,QACrB,GAAI,GAAW,MAAQ,CAAC,EAAM,OAK9B,IAAM,EAAI,EAAa,QACnB,EAAY,QAAU,EAAe,QAAU,EAAc,QAAU,EACvE,EAAY,QACV,EAAK,SAAS,iBAAiB,EAAG,CAAC,EACnC,EAAQ,GAAM,EAAK,SAAS,CAAE,EAAI,EAAG,QAAqB,cAAc,EAAI,KAClF,GAAI,CAAC,EAAO,OACZ,IAAM,EAAY,OAAO,EAAM,QAAQ,KAAK,EAC5C,GAAI,OAAO,MAAM,CAAS,EAAG,OAC7B,IAAM,EAAY,EAAQ,QAAQ,QAAQ,CAAO,EAC3C,EAAO,EAAM,sBAAsB,EACzC,GAAI,EAAY,QAAS,CAEvB,IAAM,EAAK,EAAQ,QACb,EAAK,EAAU,QACrB,GAAI,IAAc,IAAM,GAAa,GAAa,GAAa,EAAoB,EAAW,CAAE,EAAG,CACjG,EAAc,IAAI,EAClB,MACF,CACA,IAAM,EAAW,EAAsB,EAAG,EAAK,IAAK,EAAK,OAAQ,EAAa,QAAQ,CAAS,CAAC,EAC1F,EAAuB,CAAE,IAAK,EAAG,GAAY,UAAS,EAC5D,EAAe,GAAU,GAAM,MAAQ,EAAK,KAAO,GAAM,WAAa,EAAK,SAAW,EAAO,CAAK,EAClG,MACF,CACA,IAAM,EAAS,EAAqB,EAAW,EAAW,EAAG,EAAK,IAAK,EAAK,MAAM,EAC9E,GAAU,MAAM,EAAa,UAAU,EAAW,CAAM,CAC9D,EACA,CAAC,EAAS,CAAO,CACnB,EAGM,EAAoB,MAAkB,CAC1C,IAAM,EAAQ,EAAa,QACtB,IACL,EAAM,MAAM,UAAY,aAAa,EAAa,QAAQ,MAAM,EAAY,QAAU,EAAe,QAAQ,KAC/G,EAAG,CAAC,CAAC,EAIC,EAAiB,MAAkB,CACvC,IAAM,EAAO,EAAQ,QACrB,GAAI,CAAC,GAAQ,CAAC,EAAe,QAAS,CACpC,EAAc,QAAU,KACxB,MACF,CACA,IAAM,EAAO,EAAK,sBAAsB,EAClC,EAAI,EAAY,QAChB,EAAI,EAAY,QAElB,EAAK,EAIM,GAAK,EAAK,MAAQ,GAAK,EAAK,OAAS,GAAK,EAAK,KAAO,GAAK,EAAK,SAEzE,EAAI,EAAK,IAAM,GAAM,EAAK,CAAC,KAAK,IAAI,GAAI,KAAK,MAAM,EAAK,IAAM,GAAO,GAAK,CAAC,CAAC,EACvE,EAAI,EAAK,OAAS,KAAM,EAAK,KAAK,IAAI,GAAI,KAAK,MAAM,GAAK,EAAK,OAAS,KAAS,CAAC,CAAC,IAE1F,IAAO,IACT,EAAK,WAAa,EAClB,EAAe,CAAC,GAElB,EAAc,QAAU,sBAAsB,CAAc,CAC9D,EAAG,CAAC,EAAgB,CAAO,CAAC,EAEtB,EAAe,MAAkB,CAmBrC,GAlBI,EAAa,SAAW,OAC1B,aAAa,EAAa,OAAO,EACjC,EAAa,QAAU,MAEzB,OAAO,oBAAoB,YAAa,CAAe,EACvD,OAAO,oBAAoB,WAAY,CAAY,EACnD,OAAO,oBAAoB,cAAe,CAAY,EAClD,EAAc,SAAW,OAC3B,qBAAqB,EAAc,OAAO,EAC1C,EAAc,QAAU,MAE1B,AAEE,EAAa,WADb,EAAa,QAAQ,OAAO,EACL,MAGzB,SAAS,KAAK,MAAM,YAAc,GAClC,SAAS,KAAK,MAAM,mBAAqB,GACrC,EAAe,UAGjB,EAAqB,QAAU,GAC/B,eAAiB,CACf,EAAqB,QAAU,EACjC,EAAG,GAAG,EAGF,EAAY,SAAS,CACvB,IAAM,EAAK,EAAW,QAChB,EAAS,EAAc,QACzB,GAAM,MAAQ,GAAU,EAAO,MAAQ,GAAI,EAAc,UAAU,EAAI,CAAM,CACnF,CAEF,EAAc,IAAI,EAClB,EAAe,QAAU,GACzB,EAAe,QAAU,KACzB,EAAW,QAAU,KACrB,EAAe,IAAI,CAIrB,EAAG,CAAC,CAAC,EAEC,EAAkB,EACrB,GAAkB,CACjB,IAAM,EAAI,EAAE,QAAQ,GACf,KAGL,IAFA,EAAY,QAAU,EAAE,QACxB,EAAY,QAAU,EAAE,QACpB,CAAC,EAAe,QAAS,CAG3B,IAAM,EAAK,EAAe,QACtB,GAAM,MAAQ,KAAK,IAAI,EAAE,QAAU,CAAE,EAAI,IAAM,EAAa,SAAW,OACzE,aAAa,EAAa,OAAO,EACjC,EAAa,QAAU,MAEzB,MACF,CAII,EAAE,YAAY,EAAE,eAAe,EACnC,EAAkB,EAClB,EAAe,EAAE,OAAO,CANxB,CAOF,EACA,CAAC,EAAgB,CAAiB,CACpC,EAEA,SAAS,GAAoB,EAAsB,EAAqC,CAKtF,GAJI,CAAC,GAAe,CAAC,GAGjB,GAAc,CAAE,EAAE,OAAuB,QAAQ,oBAAoB,GACrE,EAAa,SAAW,MAAQ,EAAe,QAAS,OAC5D,IAAM,EAAI,EAAE,QAAQ,GACf,IACL,EAAe,QAAU,EAAE,QAC3B,EAAY,QAAU,EAAE,QACxB,EAAY,QAAU,EAAE,QACxB,OAAO,iBAAiB,YAAa,EAAiB,CAAE,QAAS,EAAM,CAAC,EACxE,OAAO,iBAAiB,WAAY,CAAY,EAChD,OAAO,iBAAiB,cAAe,CAAY,EACnD,EAAa,QAAU,OAAO,eAAiB,CAC7C,EAAa,QAAU,KACvB,EAAe,QAAU,GACzB,EAAW,QAAU,EACrB,EAAe,CAAG,EAClB,UAAU,UAAU,EAAE,EAKtB,SAAS,KAAK,MAAM,YAAc,OAClC,SAAS,KAAK,MAAM,mBAAqB,OACzC,GAAgB,CAAG,EACnB,AAAmC,EAAc,UAAU,sBAAsB,CAAc,CACjG,EAAG,EAAc,EACnB,CAKA,SAAS,GAAgB,EAAsB,CAC7C,IAAM,EAAO,EAAQ,QACrB,GAAI,CAAC,EAAM,OACX,IAAM,EAAM,EAAQ,QAAQ,QAAQ,CAAG,EACjC,EAAM,EAAK,cAA2B,gBAAgB,EAAI,GAAG,EACnE,GAAI,CAAC,EAAK,OACV,IAAM,EAAI,EAAI,sBAAsB,EACpC,EAAe,QAAU,EAAY,QAAU,EAAE,IACjD,EAAa,QAAU,EAAE,KACzB,EAAc,QAAU,EAAE,OAC1B,IAAM,EAAQ,EAAI,UAAU,EAAI,EAChC,EAAM,gBAAgB,YAAY,EAClC,EAAM,aAAa,kBAAmB,MAAM,EAC5C,EAAM,aAAa,cAAe,MAAM,EACxC,EAAM,UAAU,IAAI,EAAO,oBAAoB,EAC/C,OAAO,OAAO,EAAM,MAAO,CACzB,SAAU,QACV,KAAM,IACN,IAAK,IACL,MAAO,GAAG,EAAE,MAAM,IAClB,OAAQ,GAAG,EAAE,OAAO,IACpB,OAAQ,IACR,QAAS,IACT,cAAe,OAEf,OAAQ,IACR,WAAY,oBACZ,UAAW,qBACX,aAAc,8BAChB,CAAiC,EAGjC,EAAK,YAAY,CAAK,EACtB,EAAa,QAAU,EACvB,EAAkB,CACpB,CAGA,MAAgB,EAAc,CAAC,CAAY,CAAC,EAI5C,IAAM,EAAc,GAAe,EAK7B,EAAmB,GAAe,CAAC,EAEzC,SAAS,GAAgB,EAAe,EAAoC,CAI1E,IAAM,EAAU,GAAe,GAAY,MAAQ,EAAM,EAAW,SAAW,IAAA,GAC/E,MAAO,CAIL,YAAa,GAAe,CAAC,EAC7B,mBAGA,UAAY,IAAqB,CAAC,GAAc,IAAQ,IAAc,IAAA,GACtE,WAAY,GAAe,IAAQ,EACnC,YAAa,GAAe,EAAc,GAAM,GAAmB,EAAK,CAAC,EAAI,IAAA,GAC7E,YAAa,GAAe,EAAc,GAAM,GAAmB,EAAK,CAAC,EAAI,IAAA,GAC7E,aAAc,GAAe,EAAa,GAAsB,IAAA,GAChE,YAAa,EAAe,GAAM,GAAmB,EAAK,CAAC,EAAI,IAAA,GAC/D,WAAY,EACP,GAAM,GAAmB,EAAO,CAAC,EAClC,EACG,GAAM,GAAkB,EAAO,CAAC,EACjC,IAAA,GACN,UAAW,EAAc,GAAoB,EAAc,GAAmB,IAAA,GAC9E,OAAQ,EAAc,GAAiB,IAAA,GACvC,aAAc,EAAe,GAAM,GAAoB,EAAK,CAAC,EAAI,IAAA,GACjE,aAAc,EACd,aAAc,GAAW,EAAO,IAAU,GAAK,EAAe,IAAA,EAChE,CACF,CAEA,SAAS,IAAkC,CAKzC,OAJI,EAAqB,SACvB,EAAqB,QAAU,GACxB,IAEF,EACT,CAEA,MAAO,CAAE,cAAa,cAAa,mBAAiB,yBAAuB,CAC7E"}
@@ -1,2 +1,2 @@
1
- import{ROW_ENTER_SELECTOR as e,findStartIndex as t}from"./virtualList.utils.mjs";import{useRef as n,useState as r}from"react";function i({enabled:i,rowCount:a,offsets:o,rootRef:s,headerRef:c,scrollToIndex:l,initialIndex:u,multiSelect:d,onActivate:f,onToggleSelect:p}){let[m,h]=r(u),[g,_]=r(-1),v=n(o);v.current=o;let y=i&&a>0?Math.min(Math.max(m,0),a-1):-1;y>=0&&y!==m&&h(y);function b(e){let t=s.current;if(!t)return;let n=c.current?.offsetHeight??0,r=v.current[e]??0,i=v.current[e+1]??r;r<t.scrollTop+n?l(e,{align:`start`}):i>t.scrollTop+t.clientHeight&&l(e,{align:`end`})}function x(e){let t=Math.max(0,Math.min(e,a-1));h(t),b(t)}function S(e){let n=s.current;if(!n)return 1;let r=Math.max(0,n.clientHeight-(c.current?.offsetHeight??0)),i=t(v.current,(v.current[e]??0)+r,a);return Math.max(1,i-e)}function C(t){let n=(s.current?.querySelector(`[data-index="${t}"]`))?.querySelector(e);return n?(_(t),n.focus(),!0):!1}function w(e){let t=e?.closest?.(`[data-index]`),n=Number(t?.dataset.index);return Number.isFinite(n)?n:-1}function T(e){if(e.target===e.currentTarget)return;let t=w(e.target);t<0||(_(t),h(t))}function E(e){w(e.relatedTarget)!==g&&_(-1)}function D(e){if(e.key!==`Escape`||e.defaultPrevented)return;let t=w(e.target);t>=0&&h(t),_(-1),s.current?.focus(),e.preventDefault()}function O(e){if(e.target!==e.currentTarget){D(e);return}switch(e.key){case`ArrowDown`:x(y+1);break;case`ArrowUp`:x(y-1);break;case`Home`:x(0);break;case`End`:x(a-1);break;case`PageDown`:x(y+S(y));break;case`PageUp`:x(y-S(Math.max(0,y-1)));break;case`Enter`:if(f)f(y);else if(!C(y))return;break;case`F2`:if(!C(y))return;break;case` `:if(!d)return;p(y);break;default:return}e.preventDefault()}return y<0?{activeIndex:y,enteredIndex:-1,setActiveIndex:h,containerProps:{}}:{activeIndex:y,enteredIndex:g,setActiveIndex:h,containerProps:{tabIndex:0,onKeyDown:O,onFocus:T,onBlur:E}}}export{i as useRowNavigation};
1
+ "use client";import{ROW_ENTER_SELECTOR as e,findStartIndex as t}from"./virtualList.utils.mjs";import{useRef as n,useState as r}from"react";function i({enabled:i,rowCount:a,offsets:o,rootRef:s,headerRef:c,scrollToIndex:l,initialIndex:u,multiSelect:d,onActivate:f,onToggleSelect:p}){let[m,h]=r(u),[g,_]=r(-1),v=n(o);v.current=o;let y=i&&a>0?Math.min(Math.max(m,0),a-1):-1;y>=0&&y!==m&&h(y);function b(e){let t=s.current;if(!t)return;let n=c.current?.offsetHeight??0,r=v.current[e]??0,i=v.current[e+1]??r;r<t.scrollTop+n?l(e,{align:`start`}):i>t.scrollTop+t.clientHeight&&l(e,{align:`end`})}function x(e){let t=Math.max(0,Math.min(e,a-1));h(t),b(t)}function S(e){let n=s.current;if(!n)return 1;let r=Math.max(0,n.clientHeight-(c.current?.offsetHeight??0)),i=t(v.current,(v.current[e]??0)+r,a);return Math.max(1,i-e)}function C(t){let n=(s.current?.querySelector(`[data-index="${t}"]`))?.querySelector(e);return n?(_(t),n.focus(),!0):!1}function w(e){let t=e?.closest?.(`[data-index]`),n=Number(t?.dataset.index);return Number.isFinite(n)?n:-1}function T(e){if(e.target===e.currentTarget)return;let t=w(e.target);t<0||(_(t),h(t))}function E(e){w(e.relatedTarget)!==g&&_(-1)}function D(e){if(e.key!==`Escape`||e.defaultPrevented)return;let t=w(e.target);t>=0&&h(t),_(-1),s.current?.focus(),e.preventDefault()}function O(e){if(e.target!==e.currentTarget){D(e);return}switch(e.key){case`ArrowDown`:x(y+1);break;case`ArrowUp`:x(y-1);break;case`Home`:x(0);break;case`End`:x(a-1);break;case`PageDown`:x(y+S(y));break;case`PageUp`:x(y-S(Math.max(0,y-1)));break;case`Enter`:if(f)f(y);else if(!C(y))return;break;case`F2`:if(!C(y))return;break;case` `:if(!d)return;p(y);break;default:return}e.preventDefault()}return y<0?{activeIndex:y,enteredIndex:-1,setActiveIndex:h,containerProps:{}}:{activeIndex:y,enteredIndex:g,setActiveIndex:h,containerProps:{tabIndex:0,onKeyDown:O,onFocus:T,onBlur:E}}}export{i as useRowNavigation};
2
2
  //# sourceMappingURL=useRowNavigation.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"useRowNavigation.mjs","names":[],"sources":["../../../../package/common/virtualList/useRowNavigation.ts"],"sourcesContent":["import React, { useRef, useState } from 'react';\n\nimport { findStartIndex, ROW_ENTER_SELECTOR } from './virtualList.utils';\nimport type { VirtualListScrollOptions } from './virtualList.types';\n\ninterface UseRowNavigationArgs {\n enabled: boolean;\n rowCount: number;\n /** Row tops, from the windowing engine, used for paging and visibility. */\n offsets: number[];\n rootRef: React.RefObject<HTMLDivElement | null>;\n headerRef: React.RefObject<HTMLDivElement | null>;\n scrollToIndex: (index: number, options?: VirtualListScrollOptions) => void;\n /** Row index the active row starts on, normally the selected one. */\n initialIndex: number;\n multiSelect: boolean;\n /** Undefined when the consumer gave the rows no activation of their own. */\n onActivate?: (index: number) => void;\n onToggleSelect: (index: number) => void;\n}\n\ninterface UseRowNavigationResult {\n /** Index of the row the arrow keys are on, or -1 when navigation is off. */\n activeIndex: number;\n /** Keeps the arrow keys where the pointer last was. */\n setActiveIndex: (index: number) => void;\n /**\n * The row currently being used, or -1. Its controls are in the tab order and\n * it stays mounted even when it scrolls out of the window.\n */\n enteredIndex: number;\n containerProps: {\n tabIndex?: number;\n onKeyDown?: (event: React.KeyboardEvent) => void;\n onFocus?: (event: React.FocusEvent) => void;\n onBlur?: (event: React.FocusEvent) => void;\n };\n}\n\n/**\n * Arrow-key navigation over the rows, with the tab stop on the list itself.\n *\n * The stop cannot sit on the active row, the way a roving tabindex normally\n * would: a virtualized row unmounts when it scrolls out of the window, and the\n * list would be left with no tab stop at all (the same reason `Tree` puts its\n * stop on its container). Instead the list keeps the focus and points at the\n * active row with `aria-activedescendant`.\n *\n * Keys are only handled when the list element itself has the focus. A cell may\n * hold an input, a dropdown or a button, and every one of them wants the arrows,\n * Enter and Space for itself. `F2` steps into such a row and `Escape` steps back\n * out, which is the one pair of keys that does work from inside a cell.\n */\nexport function useRowNavigation({\n enabled,\n rowCount,\n offsets,\n rootRef,\n headerRef,\n scrollToIndex,\n initialIndex,\n multiSelect,\n onActivate,\n onToggleSelect,\n}: UseRowNavigationArgs): UseRowNavigationResult {\n const [index, setIndex] = useState(initialIndex);\n const [enteredIndex, setEnteredIndex] = useState(-1);\n const offsetsRef = useRef(offsets);\n offsetsRef.current = offsets;\n\n // Rows come and go (a filter, a page, a reset), so the active index is clamped\n // during render rather than corrected in an effect.\n const activeIndex = enabled && rowCount > 0 ? Math.min(Math.max(index, 0), rowCount - 1) : -1;\n if (activeIndex >= 0 && activeIndex !== index) setIndex(activeIndex);\n\n /** Scrolls only when the row isn't already fully in view, so paging doesn't jump. */\n function revealRow(target: number) {\n const el = rootRef.current;\n if (!el) return;\n const headerHeight = headerRef.current?.offsetHeight ?? 0;\n const rowTop = offsetsRef.current[target] ?? 0;\n const rowBottom = offsetsRef.current[target + 1] ?? rowTop;\n if (rowTop < el.scrollTop + headerHeight) scrollToIndex(target, { align: 'start' });\n else if (rowBottom > el.scrollTop + el.clientHeight) scrollToIndex(target, { align: 'end' });\n }\n\n function moveTo(target: number) {\n const next = Math.max(0, Math.min(target, rowCount - 1));\n setIndex(next);\n revealRow(next);\n }\n\n /** How many rows fit in the viewport below the sticky header, at least one. */\n function pageSize(from: number): number {\n const el = rootRef.current;\n if (!el) return 1;\n const usable = Math.max(0, el.clientHeight - (headerRef.current?.offsetHeight ?? 0));\n const edge = findStartIndex(offsetsRef.current, (offsetsRef.current[from] ?? 0) + usable, rowCount);\n return Math.max(1, edge - from);\n }\n\n /** Moves the focus into the row's first control. False when it has none. */\n function enterRow(target: number): boolean {\n const row = rootRef.current?.querySelector(`[data-index=\"${target}\"]`);\n const focusable = row?.querySelector<HTMLElement>(ROW_ENTER_SELECTOR);\n if (!focusable) return false;\n // The row's controls are still out of the tab order at this point, which is\n // no obstacle to focusing one directly; the render that follows puts them\n // back in, so Tab then moves along that row.\n setEnteredIndex(target);\n focusable.focus();\n return true;\n }\n\n function rowIndexOf(node: EventTarget | null): number {\n const row = (node as HTMLElement | null)?.closest?.<HTMLElement>('[data-index]');\n const parsed = Number(row?.dataset.index);\n return Number.isFinite(parsed) ? parsed : -1;\n }\n\n /** A click or a Tab landing in a row counts as entering it, same as F2. */\n function handleFocus(event: React.FocusEvent) {\n if (event.target === event.currentTarget) return;\n const rowIndex = rowIndexOf(event.target);\n if (rowIndex < 0) return;\n setEnteredIndex(rowIndex);\n setIndex(rowIndex);\n }\n\n /** Leaving the entered row puts its controls back out of the tab order. */\n function handleBlur(event: React.FocusEvent) {\n if (rowIndexOf(event.relatedTarget) === enteredIndex) return;\n setEnteredIndex(-1);\n }\n\n /** Escape from inside a cell: hands the focus back to the list. */\n function handleExitKey(event: React.KeyboardEvent): void {\n // Something inside the row may own Escape, a dropdown closing for instance.\n if (event.key !== 'Escape' || event.defaultPrevented) return;\n const rowIndex = rowIndexOf(event.target);\n if (rowIndex >= 0) setIndex(rowIndex);\n setEnteredIndex(-1);\n rootRef.current?.focus();\n event.preventDefault();\n }\n\n function handleKeyDown(event: React.KeyboardEvent) {\n // Focus inside a cell means the row's own content is being used.\n if (event.target !== event.currentTarget) {\n handleExitKey(event);\n return;\n }\n switch (event.key) {\n case 'ArrowDown':\n moveTo(activeIndex + 1);\n break;\n case 'ArrowUp':\n moveTo(activeIndex - 1);\n break;\n case 'Home':\n moveTo(0);\n break;\n case 'End':\n moveTo(rowCount - 1);\n break;\n case 'PageDown':\n moveTo(activeIndex + pageSize(activeIndex));\n break;\n case 'PageUp':\n moveTo(activeIndex - pageSize(Math.max(0, activeIndex - 1)));\n break;\n case 'Enter':\n // With no activation of its own, a row's content is the only thing\n // Enter could mean, so it steps in rather than doing nothing.\n if (onActivate) onActivate(activeIndex);\n else if (!enterRow(activeIndex)) return;\n break;\n case 'F2':\n if (!enterRow(activeIndex)) return;\n break;\n case ' ':\n if (!multiSelect) return;\n onToggleSelect(activeIndex);\n break;\n default:\n return;\n }\n // Reached only by a handled key, so the page never scrolls under the list.\n event.preventDefault();\n }\n\n if (activeIndex < 0) return { activeIndex, enteredIndex: -1, setActiveIndex: setIndex, containerProps: {} };\n return {\n activeIndex,\n enteredIndex,\n setActiveIndex: setIndex,\n containerProps: { tabIndex: 0, onKeyDown: handleKeyDown, onFocus: handleFocus, onBlur: handleBlur },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"useRowNavigation.mjs","names":[],"sources":["../../../../package/common/virtualList/useRowNavigation.ts"],"sourcesContent":["import React, { useRef, useState } from 'react';\n\nimport { findStartIndex, ROW_ENTER_SELECTOR } from './virtualList.utils';\nimport type { VirtualListScrollOptions } from './virtualList.types';\n\ninterface UseRowNavigationArgs {\n enabled: boolean;\n rowCount: number;\n /** Row tops, from the windowing engine, used for paging and visibility. */\n offsets: number[];\n rootRef: React.RefObject<HTMLDivElement | null>;\n headerRef: React.RefObject<HTMLDivElement | null>;\n scrollToIndex: (index: number, options?: VirtualListScrollOptions) => void;\n /** Row index the active row starts on, normally the selected one. */\n initialIndex: number;\n multiSelect: boolean;\n /** Undefined when the consumer gave the rows no activation of their own. */\n onActivate?: (index: number) => void;\n onToggleSelect: (index: number) => void;\n}\n\ninterface UseRowNavigationResult {\n /** Index of the row the arrow keys are on, or -1 when navigation is off. */\n activeIndex: number;\n /** Keeps the arrow keys where the pointer last was. */\n setActiveIndex: (index: number) => void;\n /**\n * The row currently being used, or -1. Its controls are in the tab order and\n * it stays mounted even when it scrolls out of the window.\n */\n enteredIndex: number;\n containerProps: {\n tabIndex?: number;\n onKeyDown?: (event: React.KeyboardEvent) => void;\n onFocus?: (event: React.FocusEvent) => void;\n onBlur?: (event: React.FocusEvent) => void;\n };\n}\n\n/**\n * Arrow-key navigation over the rows, with the tab stop on the list itself.\n *\n * The stop cannot sit on the active row, the way a roving tabindex normally\n * would: a virtualized row unmounts when it scrolls out of the window, and the\n * list would be left with no tab stop at all (the same reason `Tree` puts its\n * stop on its container). Instead the list keeps the focus and points at the\n * active row with `aria-activedescendant`.\n *\n * Keys are only handled when the list element itself has the focus. A cell may\n * hold an input, a dropdown or a button, and every one of them wants the arrows,\n * Enter and Space for itself. `F2` steps into such a row and `Escape` steps back\n * out, which is the one pair of keys that does work from inside a cell.\n */\nexport function useRowNavigation({\n enabled,\n rowCount,\n offsets,\n rootRef,\n headerRef,\n scrollToIndex,\n initialIndex,\n multiSelect,\n onActivate,\n onToggleSelect,\n}: UseRowNavigationArgs): UseRowNavigationResult {\n const [index, setIndex] = useState(initialIndex);\n const [enteredIndex, setEnteredIndex] = useState(-1);\n const offsetsRef = useRef(offsets);\n offsetsRef.current = offsets;\n\n // Rows come and go (a filter, a page, a reset), so the active index is clamped\n // during render rather than corrected in an effect.\n const activeIndex = enabled && rowCount > 0 ? Math.min(Math.max(index, 0), rowCount - 1) : -1;\n if (activeIndex >= 0 && activeIndex !== index) setIndex(activeIndex);\n\n /** Scrolls only when the row isn't already fully in view, so paging doesn't jump. */\n function revealRow(target: number) {\n const el = rootRef.current;\n if (!el) return;\n const headerHeight = headerRef.current?.offsetHeight ?? 0;\n const rowTop = offsetsRef.current[target] ?? 0;\n const rowBottom = offsetsRef.current[target + 1] ?? rowTop;\n if (rowTop < el.scrollTop + headerHeight) scrollToIndex(target, { align: 'start' });\n else if (rowBottom > el.scrollTop + el.clientHeight) scrollToIndex(target, { align: 'end' });\n }\n\n function moveTo(target: number) {\n const next = Math.max(0, Math.min(target, rowCount - 1));\n setIndex(next);\n revealRow(next);\n }\n\n /** How many rows fit in the viewport below the sticky header, at least one. */\n function pageSize(from: number): number {\n const el = rootRef.current;\n if (!el) return 1;\n const usable = Math.max(0, el.clientHeight - (headerRef.current?.offsetHeight ?? 0));\n const edge = findStartIndex(offsetsRef.current, (offsetsRef.current[from] ?? 0) + usable, rowCount);\n return Math.max(1, edge - from);\n }\n\n /** Moves the focus into the row's first control. False when it has none. */\n function enterRow(target: number): boolean {\n const row = rootRef.current?.querySelector(`[data-index=\"${target}\"]`);\n const focusable = row?.querySelector<HTMLElement>(ROW_ENTER_SELECTOR);\n if (!focusable) return false;\n // The row's controls are still out of the tab order at this point, which is\n // no obstacle to focusing one directly; the render that follows puts them\n // back in, so Tab then moves along that row.\n setEnteredIndex(target);\n focusable.focus();\n return true;\n }\n\n function rowIndexOf(node: EventTarget | null): number {\n const row = (node as HTMLElement | null)?.closest?.<HTMLElement>('[data-index]');\n const parsed = Number(row?.dataset.index);\n return Number.isFinite(parsed) ? parsed : -1;\n }\n\n /** A click or a Tab landing in a row counts as entering it, same as F2. */\n function handleFocus(event: React.FocusEvent) {\n if (event.target === event.currentTarget) return;\n const rowIndex = rowIndexOf(event.target);\n if (rowIndex < 0) return;\n setEnteredIndex(rowIndex);\n setIndex(rowIndex);\n }\n\n /** Leaving the entered row puts its controls back out of the tab order. */\n function handleBlur(event: React.FocusEvent) {\n if (rowIndexOf(event.relatedTarget) === enteredIndex) return;\n setEnteredIndex(-1);\n }\n\n /** Escape from inside a cell: hands the focus back to the list. */\n function handleExitKey(event: React.KeyboardEvent): void {\n // Something inside the row may own Escape, a dropdown closing for instance.\n if (event.key !== 'Escape' || event.defaultPrevented) return;\n const rowIndex = rowIndexOf(event.target);\n if (rowIndex >= 0) setIndex(rowIndex);\n setEnteredIndex(-1);\n rootRef.current?.focus();\n event.preventDefault();\n }\n\n function handleKeyDown(event: React.KeyboardEvent) {\n // Focus inside a cell means the row's own content is being used.\n if (event.target !== event.currentTarget) {\n handleExitKey(event);\n return;\n }\n switch (event.key) {\n case 'ArrowDown':\n moveTo(activeIndex + 1);\n break;\n case 'ArrowUp':\n moveTo(activeIndex - 1);\n break;\n case 'Home':\n moveTo(0);\n break;\n case 'End':\n moveTo(rowCount - 1);\n break;\n case 'PageDown':\n moveTo(activeIndex + pageSize(activeIndex));\n break;\n case 'PageUp':\n moveTo(activeIndex - pageSize(Math.max(0, activeIndex - 1)));\n break;\n case 'Enter':\n // With no activation of its own, a row's content is the only thing\n // Enter could mean, so it steps in rather than doing nothing.\n if (onActivate) onActivate(activeIndex);\n else if (!enterRow(activeIndex)) return;\n break;\n case 'F2':\n if (!enterRow(activeIndex)) return;\n break;\n case ' ':\n if (!multiSelect) return;\n onToggleSelect(activeIndex);\n break;\n default:\n return;\n }\n // Reached only by a handled key, so the page never scrolls under the list.\n event.preventDefault();\n }\n\n if (activeIndex < 0) return { activeIndex, enteredIndex: -1, setActiveIndex: setIndex, containerProps: {} };\n return {\n activeIndex,\n enteredIndex,\n setActiveIndex: setIndex,\n containerProps: { tabIndex: 0, onKeyDown: handleKeyDown, onFocus: handleFocus, onBlur: handleBlur },\n };\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{useMemo as e,useState as t}from"react";function n({items:n,getKey:r,multiSelect:i,selectedKeys:a,onSelectionChange:o}){let s=a!==void 0,[c,l]=t(new Set),u=s?a:c;function d(e){s||l(e),o?.(e)}function f(e){let t=new Set(u);t.has(e)?t.delete(e):t.add(e),d(t)}function p(){let e=n.map((e,t)=>r(e,t));d(e.every(e=>u.has(e))?new Set:new Set(e))}let{allSelected:m,someSelected:h}=e(()=>{if(!i||n.length===0)return{allSelected:!1,someSelected:!1};let e=n.every((e,t)=>u.has(r(e,t)));return{allSelected:e,someSelected:!e&&n.some((e,t)=>u.has(r(e,t)))}},[i,n,u,r]);return{effectiveSelectedKeys:u,handleRowSelect:f,handleSelectAll:p,allSelected:m,someSelected:h}}export{n as useSelection};
1
+ "use client";import{useMemo as e,useState as t}from"react";function n({items:n,getKey:r,multiSelect:i,selectedKeys:a,onSelectionChange:o}){let s=a!==void 0,[c,l]=t(new Set),u=s?a:c;function d(e){s||l(e),o?.(e)}function f(e){let t=new Set(u);t.has(e)?t.delete(e):t.add(e),d(t)}function p(){let e=n.map((e,t)=>r(e,t));d(e.every(e=>u.has(e))?new Set:new Set(e))}let{allSelected:m,someSelected:h}=e(()=>{if(!i||n.length===0)return{allSelected:!1,someSelected:!1};let e=n.every((e,t)=>u.has(r(e,t)));return{allSelected:e,someSelected:!e&&n.some((e,t)=>u.has(r(e,t)))}},[i,n,u,r]);return{effectiveSelectedKeys:u,handleRowSelect:f,handleSelectAll:p,allSelected:m,someSelected:h}}export{n as useSelection};
2
2
  //# sourceMappingURL=useSelection.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSelection.mjs","names":[],"sources":["../../../../package/common/virtualList/useSelection.ts"],"sourcesContent":["import { useState, useMemo } from 'react';\n\ninterface UseSelectionArgs<T> {\n items: T[];\n getKey: (item: T, index: number) => string | number;\n multiSelect: boolean;\n /** Controlled selected keys. When provided, internal state is ignored. */\n selectedKeys?: Set<string | number>;\n onSelectionChange?: (keys: Set<string | number>) => void;\n}\n\ninterface UseSelectionResult {\n effectiveSelectedKeys: Set<string | number>;\n /** Toggle one row's membership in the selection. */\n handleRowSelect: (key: string | number) => void;\n /** Select all rows, or clear if all are already selected. */\n handleSelectAll: () => void;\n allSelected: boolean;\n someSelected: boolean;\n}\n\n/**\n * Multi-row selection, controlled or uncontrolled. `allSelected`/`someSelected`\n * (for the header checkbox) are O(n) scans, so they're only computed when\n * `multiSelect` is on.\n */\nexport function useSelection<T>({\n items,\n getKey,\n multiSelect,\n selectedKeys,\n onSelectionChange,\n}: UseSelectionArgs<T>): UseSelectionResult {\n const isControlled = selectedKeys !== undefined;\n const [internalSelectedKeys, setInternalSelectedKeys] = useState<Set<string | number>>(new Set());\n const effectiveSelectedKeys = isControlled ? selectedKeys! : internalSelectedKeys;\n\n function applySelection(next: Set<string | number>) {\n if (!isControlled) setInternalSelectedKeys(next);\n onSelectionChange?.(next);\n }\n\n function handleRowSelect(key: string | number) {\n const next = new Set(effectiveSelectedKeys);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n applySelection(next);\n }\n\n function handleSelectAll() {\n const allKeys = items.map((item, i) => getKey(item, i));\n const allChosen = allKeys.every((k) => effectiveSelectedKeys.has(k));\n applySelection(allChosen ? new Set() : new Set(allKeys));\n }\n\n // O(n) header-checkbox state. The component re-renders every scroll frame\n // (scrollTop is state), but these depend only on the items and the selection —\n // so memoise to keep two full-list scans off the scroll path.\n const { allSelected, someSelected } = useMemo(() => {\n if (!multiSelect || items.length === 0) return { allSelected: false, someSelected: false };\n const all = items.every((item, i) => effectiveSelectedKeys.has(getKey(item, i)));\n const some = !all && items.some((item, i) => effectiveSelectedKeys.has(getKey(item, i)));\n return { allSelected: all, someSelected: some };\n }, [multiSelect, items, effectiveSelectedKeys, getKey]);\n\n return { effectiveSelectedKeys, handleRowSelect, handleSelectAll, allSelected, someSelected };\n}\n"],"mappings":"8CA0BA,SAAgB,EAAgB,CAC9B,QACA,SACA,cACA,eACA,qBAC0C,CAC1C,IAAM,EAAe,IAAiB,IAAA,GAChC,CAAC,EAAsB,GAA2B,EAA+B,IAAI,GAAK,EAC1F,EAAwB,EAAe,EAAgB,EAE7D,SAAS,EAAe,EAA4B,CAC7C,GAAc,EAAwB,CAAI,EAC/C,IAAoB,CAAI,CAC1B,CAEA,SAAS,EAAgB,EAAsB,CAC7C,IAAM,EAAO,IAAI,IAAI,CAAqB,EACtC,EAAK,IAAI,CAAG,EAAG,EAAK,OAAO,CAAG,EAC7B,EAAK,IAAI,CAAG,EACjB,EAAe,CAAI,CACrB,CAEA,SAAS,GAAkB,CACzB,IAAM,EAAU,EAAM,KAAK,EAAM,IAAM,EAAO,EAAM,CAAC,CAAC,EAEtD,EADkB,EAAQ,MAAO,GAAM,EAAsB,IAAI,CAAC,CACnD,EAAY,IAAI,IAAQ,IAAI,IAAI,CAAO,CAAC,CACzD,CAKA,GAAM,CAAE,cAAa,gBAAiB,MAAc,CAClD,GAAI,CAAC,GAAe,EAAM,SAAW,EAAG,MAAO,CAAE,YAAa,GAAO,aAAc,EAAM,EACzF,IAAM,EAAM,EAAM,OAAO,EAAM,IAAM,EAAsB,IAAI,EAAO,EAAM,CAAC,CAAC,CAAC,EAE/E,MAAO,CAAE,YAAa,EAAK,aADd,CAAC,GAAO,EAAM,MAAM,EAAM,IAAM,EAAsB,IAAI,EAAO,EAAM,CAAC,CAAC,CAAC,CACzC,CAChD,EAAG,CAAC,EAAa,EAAO,EAAuB,CAAM,CAAC,EAEtD,MAAO,CAAE,wBAAuB,kBAAiB,kBAAiB,cAAa,cAAa,CAC9F"}
1
+ {"version":3,"file":"useSelection.mjs","names":[],"sources":["../../../../package/common/virtualList/useSelection.ts"],"sourcesContent":["import { useState, useMemo } from 'react';\n\ninterface UseSelectionArgs<T> {\n items: T[];\n getKey: (item: T, index: number) => string | number;\n multiSelect: boolean;\n /** Controlled selected keys. When provided, internal state is ignored. */\n selectedKeys?: Set<string | number>;\n onSelectionChange?: (keys: Set<string | number>) => void;\n}\n\ninterface UseSelectionResult {\n effectiveSelectedKeys: Set<string | number>;\n /** Toggle one row's membership in the selection. */\n handleRowSelect: (key: string | number) => void;\n /** Select all rows, or clear if all are already selected. */\n handleSelectAll: () => void;\n allSelected: boolean;\n someSelected: boolean;\n}\n\n/**\n * Multi-row selection, controlled or uncontrolled. `allSelected`/`someSelected`\n * (for the header checkbox) are O(n) scans, so they're only computed when\n * `multiSelect` is on.\n */\nexport function useSelection<T>({\n items,\n getKey,\n multiSelect,\n selectedKeys,\n onSelectionChange,\n}: UseSelectionArgs<T>): UseSelectionResult {\n const isControlled = selectedKeys !== undefined;\n const [internalSelectedKeys, setInternalSelectedKeys] = useState<Set<string | number>>(new Set());\n const effectiveSelectedKeys = isControlled ? selectedKeys! : internalSelectedKeys;\n\n function applySelection(next: Set<string | number>) {\n if (!isControlled) setInternalSelectedKeys(next);\n onSelectionChange?.(next);\n }\n\n function handleRowSelect(key: string | number) {\n const next = new Set(effectiveSelectedKeys);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n applySelection(next);\n }\n\n function handleSelectAll() {\n const allKeys = items.map((item, i) => getKey(item, i));\n const allChosen = allKeys.every((k) => effectiveSelectedKeys.has(k));\n applySelection(allChosen ? new Set() : new Set(allKeys));\n }\n\n // O(n) header-checkbox state. The component re-renders every scroll frame\n // (scrollTop is state), but these depend only on the items and the selection —\n // so memoise to keep two full-list scans off the scroll path.\n const { allSelected, someSelected } = useMemo(() => {\n if (!multiSelect || items.length === 0) return { allSelected: false, someSelected: false };\n const all = items.every((item, i) => effectiveSelectedKeys.has(getKey(item, i)));\n const some = !all && items.some((item, i) => effectiveSelectedKeys.has(getKey(item, i)));\n return { allSelected: all, someSelected: some };\n }, [multiSelect, items, effectiveSelectedKeys, getKey]);\n\n return { effectiveSelectedKeys, handleRowSelect, handleSelectAll, allSelected, someSelected };\n}\n"],"mappings":"2DA0BA,SAAgB,EAAgB,CAC9B,QACA,SACA,cACA,eACA,qBAC0C,CAC1C,IAAM,EAAe,IAAiB,IAAA,GAChC,CAAC,EAAsB,GAA2B,EAA+B,IAAI,GAAK,EAC1F,EAAwB,EAAe,EAAgB,EAE7D,SAAS,EAAe,EAA4B,CAC7C,GAAc,EAAwB,CAAI,EAC/C,IAAoB,CAAI,CAC1B,CAEA,SAAS,EAAgB,EAAsB,CAC7C,IAAM,EAAO,IAAI,IAAI,CAAqB,EACtC,EAAK,IAAI,CAAG,EAAG,EAAK,OAAO,CAAG,EAC7B,EAAK,IAAI,CAAG,EACjB,EAAe,CAAI,CACrB,CAEA,SAAS,GAAkB,CACzB,IAAM,EAAU,EAAM,KAAK,EAAM,IAAM,EAAO,EAAM,CAAC,CAAC,EAEtD,EADkB,EAAQ,MAAO,GAAM,EAAsB,IAAI,CAAC,CACnD,EAAY,IAAI,IAAQ,IAAI,IAAI,CAAO,CAAC,CACzD,CAKA,GAAM,CAAE,cAAa,gBAAiB,MAAc,CAClD,GAAI,CAAC,GAAe,EAAM,SAAW,EAAG,MAAO,CAAE,YAAa,GAAO,aAAc,EAAM,EACzF,IAAM,EAAM,EAAM,OAAO,EAAM,IAAM,EAAsB,IAAI,EAAO,EAAM,CAAC,CAAC,CAAC,EAE/E,MAAO,CAAE,YAAa,EAAK,aADd,CAAC,GAAO,EAAM,MAAM,EAAM,IAAM,EAAsB,IAAI,EAAO,EAAM,CAAC,CAAC,CAAC,CACzC,CAChD,EAAG,CAAC,EAAa,EAAO,EAAuB,CAAM,CAAC,EAEtD,MAAO,CAAE,wBAAuB,kBAAiB,kBAAiB,cAAa,cAAa,CAC9F"}
@@ -1,2 +1,2 @@
1
- import{nextSort as e,sortItems as t}from"./virtualList.utils.mjs";import{useMemo as n,useState as r}from"react";function i({items:i,columns:a,sort:o,defaultSort:s=null,onSortChange:c}){let l=o!==void 0,[u,d]=r(s),f=l?o:u,p=n(()=>t(i,f,a),[i,f,a]);function m(t){let n=e(f,t);l||d(n),c?.(n)}return{rows:p,effectiveSort:f,isSorted:p!==i,handleHeaderSort:m}}export{i as useSorting};
1
+ "use client";import{nextSort as e,sortItems as t}from"./virtualList.utils.mjs";import{useMemo as n,useState as r}from"react";function i({items:i,columns:a,sort:o,defaultSort:s=null,onSortChange:c}){let l=o!==void 0,[u,d]=r(s),f=l?o:u,p=n(()=>t(i,f,a),[i,f,a]);function m(t){let n=e(f,t);l||d(n),c?.(n)}return{rows:p,effectiveSort:f,isSorted:p!==i,handleHeaderSort:m}}export{i as useSorting};
2
2
  //# sourceMappingURL=useSorting.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSorting.mjs","names":[],"sources":["../../../../package/common/virtualList/useSorting.ts"],"sourcesContent":["import { useMemo, useState } from 'react';\n\nimport { nextSort, sortItems } from './virtualList.utils';\nimport type { VirtualListColumn, VirtualListSort } from './virtualList.types';\n\ninterface UseSortingArgs<T> {\n items: T[];\n columns?: VirtualListColumn<T>[];\n /** Controlled sort. When provided, internal state is ignored. */\n sort?: VirtualListSort | null;\n defaultSort?: VirtualListSort | null;\n onSortChange?: (sort: VirtualListSort | null) => void;\n}\n\ninterface UseSortingResult<T> {\n /** `items`, reordered when the sorted column carries a comparator. */\n rows: T[];\n effectiveSort: VirtualListSort | null;\n /** True only when this hook reordered the rows, not when it merely reported. */\n isSorted: boolean;\n handleHeaderSort: (key: string) => void;\n}\n\n/**\n * Header sorting, controlled or uncontrolled. Whether the list reorders the data\n * or only reports the click is the column's decision, not a prop: a column with\n * `sortValue`/`compare` is sorted here, a bare `sortable` one is left alone so a\n * server-side sort can own it. Sorting a paginated list here would silently\n * order only the rows loaded so far.\n */\nexport function useSorting<T>({\n items,\n columns,\n sort,\n defaultSort = null,\n onSortChange,\n}: UseSortingArgs<T>): UseSortingResult<T> {\n const isControlled = sort !== undefined;\n const [internalSort, setInternalSort] = useState<VirtualListSort | null>(defaultSort);\n const effectiveSort = isControlled ? sort! : internalSort;\n\n // Returns `items` itself when nothing applies, which is what `isSorted` reads.\n const rows = useMemo(() => sortItems(items, effectiveSort, columns), [items, effectiveSort, columns]);\n\n function handleHeaderSort(key: string) {\n const next = nextSort(effectiveSort, key);\n if (!isControlled) setInternalSort(next);\n onSortChange?.(next);\n }\n\n return { rows, effectiveSort, isSorted: rows !== items, handleHeaderSort };\n}\n"],"mappings":"gHA8BA,SAAgB,EAAc,CAC5B,QACA,UACA,OACA,cAAc,KACd,gBACyC,CACzC,IAAM,EAAe,IAAS,IAAA,GACxB,CAAC,EAAc,GAAmB,EAAiC,CAAW,EAC9E,EAAgB,EAAe,EAAQ,EAGvC,EAAO,MAAc,EAAU,EAAO,EAAe,CAAO,EAAG,CAAC,EAAO,EAAe,CAAO,CAAC,EAEpG,SAAS,EAAiB,EAAa,CACrC,IAAM,EAAO,EAAS,EAAe,CAAG,EACnC,GAAc,EAAgB,CAAI,EACvC,IAAe,CAAI,CACrB,CAEA,MAAO,CAAE,OAAM,gBAAe,SAAU,IAAS,EAAO,kBAAiB,CAC3E"}
1
+ {"version":3,"file":"useSorting.mjs","names":[],"sources":["../../../../package/common/virtualList/useSorting.ts"],"sourcesContent":["import { useMemo, useState } from 'react';\n\nimport { nextSort, sortItems } from './virtualList.utils';\nimport type { VirtualListColumn, VirtualListSort } from './virtualList.types';\n\ninterface UseSortingArgs<T> {\n items: T[];\n columns?: VirtualListColumn<T>[];\n /** Controlled sort. When provided, internal state is ignored. */\n sort?: VirtualListSort | null;\n defaultSort?: VirtualListSort | null;\n onSortChange?: (sort: VirtualListSort | null) => void;\n}\n\ninterface UseSortingResult<T> {\n /** `items`, reordered when the sorted column carries a comparator. */\n rows: T[];\n effectiveSort: VirtualListSort | null;\n /** True only when this hook reordered the rows, not when it merely reported. */\n isSorted: boolean;\n handleHeaderSort: (key: string) => void;\n}\n\n/**\n * Header sorting, controlled or uncontrolled. Whether the list reorders the data\n * or only reports the click is the column's decision, not a prop: a column with\n * `sortValue`/`compare` is sorted here, a bare `sortable` one is left alone so a\n * server-side sort can own it. Sorting a paginated list here would silently\n * order only the rows loaded so far.\n */\nexport function useSorting<T>({\n items,\n columns,\n sort,\n defaultSort = null,\n onSortChange,\n}: UseSortingArgs<T>): UseSortingResult<T> {\n const isControlled = sort !== undefined;\n const [internalSort, setInternalSort] = useState<VirtualListSort | null>(defaultSort);\n const effectiveSort = isControlled ? sort! : internalSort;\n\n // Returns `items` itself when nothing applies, which is what `isSorted` reads.\n const rows = useMemo(() => sortItems(items, effectiveSort, columns), [items, effectiveSort, columns]);\n\n function handleHeaderSort(key: string) {\n const next = nextSort(effectiveSort, key);\n if (!isControlled) setInternalSort(next);\n onSortChange?.(next);\n }\n\n return { rows, effectiveSort, isSorted: rows !== items, handleHeaderSort };\n}\n"],"mappings":"6HA8BA,SAAgB,EAAc,CAC5B,QACA,UACA,OACA,cAAc,KACd,gBACyC,CACzC,IAAM,EAAe,IAAS,IAAA,GACxB,CAAC,EAAc,GAAmB,EAAiC,CAAW,EAC9E,EAAgB,EAAe,EAAQ,EAGvC,EAAO,MAAc,EAAU,EAAO,EAAe,CAAO,EAAG,CAAC,EAAO,EAAe,CAAO,CAAC,EAEpG,SAAS,EAAiB,EAAa,CACrC,IAAM,EAAO,EAAS,EAAe,CAAG,EACnC,GAAc,EAAgB,CAAI,EACvC,IAAe,CAAI,CACrB,CAEA,MAAO,CAAE,OAAM,gBAAe,SAAU,IAAS,EAAO,kBAAiB,CAC3E"}
@@ -1,2 +1,2 @@
1
- import{buildOffsets as e,findStartIndex as t,getVisibleRange as n}from"./virtualList.utils.mjs";import{useCallback as r,useEffect as i,useLayoutEffect as a,useMemo as o,useRef as s,useState as c}from"react";function l(e,t){if(typeof e==`number`)return e;let n=e.trim();if(n===``)return 0;let r=Number(n);if(!Number.isNaN(r))return r;let i=/^(-?\d*\.?\d+)px$/.exec(n);if(i)return parseFloat(i[1]);if(typeof document>`u`||!t)return 0;let a=document.createElement(`div`);a.style.cssText=`position:absolute;visibility:hidden;height:${n};`,t.appendChild(a);let o=a.getBoundingClientRect().height;return t.removeChild(a),Number.isFinite(o)?o:0}var u=20;function d({items:d,keys:f,getItemKey:p,estimatedRowHeight:m,rowGap:h,overscan:g,onLoadMore:_,loadMoreThreshold:v,isLoading:y}){let[b,x]=c(0),[S,C]=c(0),[w,T]=c(0),[E,D]=c(()=>l(h,null)),[O,k]=c(new Map),[A,j]=c(!1),M=s(!1),N=s(null),P=s(null),F=s([]),I=s(null),L=s(0),R=s([]),[z]=c(()=>typeof ResizeObserver>`u`?null:new ResizeObserver(e=>{k(t=>{let n=null;for(let r of e){let e=r.target,i=Number(e.dataset.index);if(Number.isNaN(i))continue;let a=R.current[i];if(a===void 0)continue;let o=r.borderBoxSize?.[0],s=o?Math.round(o.blockSize):e.offsetHeight;t.get(a)!==s&&(n||=new Map(t),n.set(a,s))}return n??t})}));i(()=>()=>z?.disconnect(),[z]),a(()=>{let e=N.current;if(!e)return;C(e.clientHeight),T(e.clientWidth);let t=new ResizeObserver(()=>{C(e.clientHeight),T(e.clientWidth)});return t.observe(e),()=>t.disconnect()},[]);let B=s(_);a(()=>{B.current=_});let V=r(()=>{let e=B.current;e&&!M.current&&(M.current=!0,j(!0),e().finally(()=>{M.current=!1,j(!1)}))},[]),H=r(e=>{let t=e.currentTarget;L.current=t.scrollTop,I.current??=requestAnimationFrame(()=>{I.current=null,x(L.current)}),t.scrollTop+t.clientHeight>=t.scrollHeight-v&&V()},[v,V]);i(()=>()=>{I.current!=null&&cancelAnimationFrame(I.current)},[]),a(()=>{R.current=f}),a(()=>{let e=l(h,N.current);D(t=>t===e?t:e)},[h,w,S]);let U=o(()=>{if(O.size===0)return m;let e=0;for(let t of O.values())e+=t;return e/O.size},[O,m]),{offsets:W,totalHeight:G}=o(()=>e(f,O,U,E),[f,O,U,E]),K=s(``);i(()=>{if(!_||y||A||S===0)return;let e=P.current?.offsetHeight??0;if(G>=S-e)return;let t=`${d.length}:${S}`;K.current!==t&&(K.current=t,V())},[_,y,A,d.length,G,S,V]),a(()=>{let e=N.current,n=F.current;if(F.current=W,!e||n.length===0||Y.current)return;let r=e.scrollTop;if(r<=0)return;let i=n.length-1,a=t(n,r,i);if(a>=d.length)return;let o=r-n[a],s=W[a]+o;Math.abs(s-r)>.5&&(e.scrollTop=s,L.current=s,x(s))},[W,d.length]);let q=r((e,t)=>{let n=N.current;if(!n)return;let r=Math.max(0,e);typeof n.scrollTo==`function`?n.scrollTo({top:r,behavior:t??`auto`}):n.scrollTop=r},[]),J=r((e,t)=>{let n=N.current;if(!n||d.length===0)return null;let r=Math.max(0,Math.min(e,d.length-1)),i=W[r]??0,a=(W[r+1]??i)-i,o=P.current?.offsetHeight??0,s=Math.max(0,n.clientHeight-o),c=t?.align??`start`,l=i;return c===`center`?l-=(s-a)/2:c===`end`&&(l-=s-a),l},[d.length,W]),Y=s(null);a(()=>{let e=Y.current,t=N.current;if(!e)return;let n=e.items===d&&t?J(e.index,e.options):null;if(n==null){Y.current=null;return}let r=Math.abs(n-e.lastTarget)<=1;if(r&&Math.abs(t.scrollTop-n)<=1||e.attempts>=u){Y.current=null;return}r||(e.lastTarget=n,e.attempts+=1,q(n,e.options?.behavior))}),i(()=>{let e=N.current;if(!e)return;let t=()=>{Y.current=null};return e.addEventListener(`wheel`,t,{passive:!0}),e.addEventListener(`touchstart`,t,{passive:!0}),e.addEventListener(`keydown`,t),()=>{e.removeEventListener(`wheel`,t),e.removeEventListener(`touchstart`,t),e.removeEventListener(`keydown`,t)}},[]);let X=o(()=>{function e(e,t){let n=J(e,t);n!=null&&(Y.current={index:e,options:t,lastTarget:n,attempts:0,items:d},q(n,t?.behavior))}return{scrollToIndex:e,scrollToKey(t,n){let r=d.findIndex((e,n)=>(p?p(e,n):n)===t);r>=0&&e(r,n)},scrollToTop(e){Y.current=null,q(0,e?.behavior)},getScrollElement:()=>N.current}},[d,p,J,q]),{startIndex:Z,endIndex:Q}=o(()=>n(W,b,S,g,d.length),[W,b,S,g,d.length]);return{rootRef:N,headerRef:P,rowObserver:z,keysRef:R,offsets:W,totalHeight:G,containerHeight:S,containerWidth:w,startIndex:Z,endIndex:Q,handleScroll:H,showLoadMoreSpinner:A,scrollApi:X}}export{d as useVirtualWindow};
1
+ "use client";import{buildOffsets as e,findStartIndex as t,getVisibleRange as n}from"./virtualList.utils.mjs";import{useCallback as r,useEffect as i,useLayoutEffect as a,useMemo as o,useRef as s,useState as c}from"react";function l(e,t){if(typeof e==`number`)return e;let n=e.trim();if(n===``)return 0;let r=Number(n);if(!Number.isNaN(r))return r;let i=/^(-?\d*\.?\d+)px$/.exec(n);if(i)return parseFloat(i[1]);if(typeof document>`u`||!t)return 0;let a=document.createElement(`div`);a.style.cssText=`position:absolute;visibility:hidden;height:${n};`,t.appendChild(a);let o=a.getBoundingClientRect().height;return t.removeChild(a),Number.isFinite(o)?o:0}var u=20;function d({items:d,keys:f,getItemKey:p,estimatedRowHeight:m,rowGap:h,overscan:g,onLoadMore:_,loadMoreThreshold:v,isLoading:y}){let[b,x]=c(0),[S,C]=c(0),[w,T]=c(0),[E,D]=c(()=>l(h,null)),[O,k]=c(new Map),[A,j]=c(!1),M=s(!1),N=s(null),P=s(null),F=s([]),I=s(null),L=s(0),R=s([]),[z]=c(()=>typeof ResizeObserver>`u`?null:new ResizeObserver(e=>{k(t=>{let n=null;for(let r of e){let e=r.target,i=Number(e.dataset.index);if(Number.isNaN(i))continue;let a=R.current[i];if(a===void 0)continue;let o=r.borderBoxSize?.[0],s=o?Math.round(o.blockSize):e.offsetHeight;t.get(a)!==s&&(n||=new Map(t),n.set(a,s))}return n??t})}));i(()=>()=>z?.disconnect(),[z]),a(()=>{let e=N.current;if(!e)return;C(e.clientHeight),T(e.clientWidth);let t=new ResizeObserver(()=>{C(e.clientHeight),T(e.clientWidth)});return t.observe(e),()=>t.disconnect()},[]);let B=s(_);a(()=>{B.current=_});let V=r(()=>{let e=B.current;e&&!M.current&&(M.current=!0,j(!0),e().finally(()=>{M.current=!1,j(!1)}))},[]),H=r(e=>{let t=e.currentTarget;L.current=t.scrollTop,I.current??=requestAnimationFrame(()=>{I.current=null,x(L.current)}),t.scrollTop+t.clientHeight>=t.scrollHeight-v&&V()},[v,V]);i(()=>()=>{I.current!=null&&cancelAnimationFrame(I.current)},[]),a(()=>{R.current=f}),a(()=>{let e=l(h,N.current);D(t=>t===e?t:e)},[h,w,S]);let U=o(()=>{if(O.size===0)return m;let e=0;for(let t of O.values())e+=t;return e/O.size},[O,m]),{offsets:W,totalHeight:G}=o(()=>e(f,O,U,E),[f,O,U,E]),K=s(``);i(()=>{if(!_||y||A||S===0)return;let e=P.current?.offsetHeight??0;if(G>=S-e)return;let t=`${d.length}:${S}`;K.current!==t&&(K.current=t,V())},[_,y,A,d.length,G,S,V]),a(()=>{let e=N.current,n=F.current;if(F.current=W,!e||n.length===0||Y.current)return;let r=e.scrollTop;if(r<=0)return;let i=n.length-1,a=t(n,r,i);if(a>=d.length)return;let o=r-n[a],s=W[a]+o;Math.abs(s-r)>.5&&(e.scrollTop=s,L.current=s,x(s))},[W,d.length]);let q=r((e,t)=>{let n=N.current;if(!n)return;let r=Math.max(0,e);typeof n.scrollTo==`function`?n.scrollTo({top:r,behavior:t??`auto`}):n.scrollTop=r},[]),J=r((e,t)=>{let n=N.current;if(!n||d.length===0)return null;let r=Math.max(0,Math.min(e,d.length-1)),i=W[r]??0,a=(W[r+1]??i)-i,o=P.current?.offsetHeight??0,s=Math.max(0,n.clientHeight-o),c=t?.align??`start`,l=i;return c===`center`?l-=(s-a)/2:c===`end`&&(l-=s-a),l},[d.length,W]),Y=s(null);a(()=>{let e=Y.current,t=N.current;if(!e)return;let n=e.items===d&&t?J(e.index,e.options):null;if(n==null){Y.current=null;return}let r=Math.abs(n-e.lastTarget)<=1;if(r&&Math.abs(t.scrollTop-n)<=1||e.attempts>=u){Y.current=null;return}r||(e.lastTarget=n,e.attempts+=1,q(n,e.options?.behavior))}),i(()=>{let e=N.current;if(!e)return;let t=()=>{Y.current=null};return e.addEventListener(`wheel`,t,{passive:!0}),e.addEventListener(`touchstart`,t,{passive:!0}),e.addEventListener(`keydown`,t),()=>{e.removeEventListener(`wheel`,t),e.removeEventListener(`touchstart`,t),e.removeEventListener(`keydown`,t)}},[]);let X=o(()=>{function e(e,t){let n=J(e,t);n!=null&&(Y.current={index:e,options:t,lastTarget:n,attempts:0,items:d},q(n,t?.behavior))}return{scrollToIndex:e,scrollToKey(t,n){let r=d.findIndex((e,n)=>(p?p(e,n):n)===t);r>=0&&e(r,n)},scrollToTop(e){Y.current=null,q(0,e?.behavior)},getScrollElement:()=>N.current}},[d,p,J,q]),{startIndex:Z,endIndex:Q}=o(()=>n(W,b,S,g,d.length),[W,b,S,g,d.length]);return{rootRef:N,headerRef:P,rowObserver:z,keysRef:R,offsets:W,totalHeight:G,containerHeight:S,containerWidth:w,startIndex:Z,endIndex:Q,handleScroll:H,showLoadMoreSpinner:A,scrollApi:X}}export{d as useVirtualWindow};
2
2
  //# sourceMappingURL=useVirtualWindow.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"useVirtualWindow.mjs","names":[],"sources":["../../../../package/common/virtualList/useVirtualWindow.ts"],"sourcesContent":["import React, { useState, useRef, useEffect, useLayoutEffect, useMemo, useCallback } from 'react';\n\nimport { buildOffsets, findStartIndex, getVisibleRange } from './virtualList.utils';\nimport type { VirtualListHandle, VirtualListScrollOptions } from './virtualList.types';\n\n/**\n * Resolve a `rowGap` value to pixels for the offset math. Numbers and plain\n * `px`/numeric strings parse directly (no DOM, SSR/test-safe); any other CSS\n * length (`em`, `rem`, `%`, `var(...)`) is resolved via a hidden probe appended\n * to `contextEl` so it inherits the list's font-size and custom properties.\n */\nfunction resolveCssLength(value: number | string, contextEl: HTMLElement | null): number {\n if (typeof value === 'number') return value;\n const trimmed = value.trim();\n if (trimmed === '') return 0;\n const asNumber = Number(trimmed);\n if (!Number.isNaN(asNumber)) return asNumber; // \"8\" → 8\n const pxMatch = /^(-?\\d*\\.?\\d+)px$/.exec(trimmed);\n if (pxMatch) return parseFloat(pxMatch[1]); // \"8px\" → 8\n if (typeof document === 'undefined' || !contextEl) return 0;\n const probe = document.createElement('div');\n probe.style.cssText = `position:absolute;visibility:hidden;height:${trimmed};`;\n contextEl.appendChild(probe);\n const px = probe.getBoundingClientRect().height;\n contextEl.removeChild(probe);\n return Number.isFinite(px) ? px : 0;\n}\n\ninterface UseVirtualWindowArgs<T> {\n items: T[];\n /** Stable key per row (already derived by the caller). */\n keys: (string | number)[];\n getItemKey?: (item: T, index: number) => string | number;\n estimatedRowHeight: number;\n rowGap: number | string;\n overscan: number;\n onLoadMore?: () => Promise<void>;\n loadMoreThreshold: number;\n /** Initial/filter load in progress — the body is replaced by a spinner. */\n isLoading: boolean;\n}\n\ninterface UseVirtualWindowResult {\n rootRef: React.RefObject<HTMLDivElement | null>;\n headerRef: React.RefObject<HTMLDivElement | null>;\n /** Shared by every row to measure its height (read back via `data-index`). */\n rowObserver: ResizeObserver | null;\n /** Latest index → key mapping, for async consumers (e.g. the drag hook). */\n keysRef: React.RefObject<(string | number)[]>;\n offsets: number[];\n totalHeight: number;\n containerHeight: number;\n containerWidth: number;\n startIndex: number;\n endIndex: number;\n handleScroll: (e: React.UIEvent<HTMLDivElement>) => void;\n showLoadMoreSpinner: boolean;\n /** The scroll-related imperative methods, for the component to compose into\n * the forwarded handle alongside column controls. */\n scrollApi: Omit<VirtualListHandle, 'recalculateColumns' | 'resetColumnWidths'>;\n}\n\n/**\n * The generic virtualization engine: viewport measurement, per-row height\n * caching, offset/visible-range computation, scroll coalescing, scroll\n * anchoring on height changes, infinite-load triggering, and the imperative\n * scroll handle. Mode-agnostic — knows nothing about columns, selection or\n * dragging.\n */\n/**\n * Loop guard for a jump re-aiming at its target. It normally ends because the\n * target stops moving, long before this; the cap is only there so a target that\n * can never be reached, the last row asked for with `align: 'start'`, can't\n * re-aim forever.\n */\nconst MAX_JUMP_CORRECTIONS = 20;\n\nexport function useVirtualWindow<T>({\n items,\n keys,\n getItemKey,\n estimatedRowHeight,\n rowGap,\n overscan,\n onLoadMore,\n loadMoreThreshold,\n isLoading,\n}: UseVirtualWindowArgs<T>): UseVirtualWindowResult {\n const [scrollTop, setScrollTop] = useState(0);\n const [containerHeight, setContainerHeight] = useState(0);\n const [containerWidth, setContainerWidth] = useState(0);\n // rowGap may be any CSS length; resolve it to px for the offset math. Seed with\n // the synchronous fast path (number / px), then refine before paint for units\n // that need the DOM (em/rem/%/var).\n const [resolvedRowGap, setResolvedRowGap] = useState<number>(() => resolveCssLength(rowGap, null));\n const [heightsMap, setHeightsMap] = useState<Map<string | number, number>>(new Map());\n const [showLoadMoreSpinner, setShowLoadMoreSpinner] = useState(false);\n const isLoadingMoreRef = useRef(false);\n\n const rootRef = useRef<HTMLDivElement>(null);\n const headerRef = useRef<HTMLDivElement>(null);\n const prevOffsetsRef = useRef<number[]>([]);\n const scrollRafRef = useRef<number | null>(null);\n const pendingScrollTopRef = useRef(0);\n const keysRef = useRef<(string | number)[]>([]);\n\n // One ResizeObserver shared by every row, created once via a lazy state\n // initializer so rows mounting in the same commit can register in their\n // layout effect. Batching all entries into a single setState avoids a\n // re-render per row when many rows enter the viewport at once (the main\n // source of scroll jank). The row index is read back from `data-index`.\n const [rowObserver] = useState<ResizeObserver | null>(() => {\n if (typeof ResizeObserver === 'undefined') return null;\n return new ResizeObserver((entries) => {\n setHeightsMap((prev) => {\n let next: Map<string | number, number> | null = null;\n for (const entry of entries) {\n const el = entry.target as HTMLElement;\n const idx = Number(el.dataset.index);\n if (Number.isNaN(idx)) continue;\n // Resolve the row's stable key so the cache survives reorders/filters.\n const key = keysRef.current[idx];\n if (key === undefined) continue;\n // Prefer the size the observer already computed — reading offsetHeight\n // here would force a synchronous reflow on every measurement batch.\n const box = entry.borderBoxSize?.[0];\n const h = box ? Math.round(box.blockSize) : el.offsetHeight;\n if (prev.get(key) === h) continue;\n if (!next) next = new Map(prev);\n next.set(key, h);\n }\n return next ?? prev;\n });\n });\n });\n useEffect(() => () => rowObserver?.disconnect(), [rowObserver]);\n\n useLayoutEffect(() => {\n const el = rootRef.current;\n if (!el) return;\n // Measure synchronously before the first paint so the initial render fills\n // the viewport, instead of painting a few overscan rows and re-rendering.\n setContainerHeight(el.clientHeight);\n setContainerWidth(el.clientWidth);\n // Track width too: `fit` columns are measured against this box and capped at\n // its width, so when the container settles to its real width after a route\n // transition / async layout, that change has to re-trigger the measure —\n // otherwise an early measure against a 0/tiny width gets pinned and sticks.\n const observer = new ResizeObserver(() => {\n setContainerHeight(el.clientHeight);\n setContainerWidth(el.clientWidth);\n });\n observer.observe(el);\n return () => observer.disconnect();\n }, []);\n\n // Read through a ref so the trigger below stays stable even when the consumer\n // passes a fresh `onLoadMore` closure on every render.\n const onLoadMoreRef = useRef(onLoadMore);\n useLayoutEffect(() => {\n onLoadMoreRef.current = onLoadMore;\n });\n\n /** Start a load unless one is already in flight (and drive the bottom spinner). */\n const triggerLoadMore = useCallback(() => {\n const load = onLoadMoreRef.current;\n if (!load || isLoadingMoreRef.current) return;\n isLoadingMoreRef.current = true;\n setShowLoadMoreSpinner(true);\n load().finally(() => {\n isLoadingMoreRef.current = false;\n setShowLoadMoreSpinner(false);\n });\n }, []);\n\n const handleScroll = useCallback(\n (e: React.UIEvent<HTMLDivElement>) => {\n const el = e.currentTarget;\n // Coalesce scroll-driven re-renders to at most one per animation frame.\n // Scroll events can fire several times per frame (especially while dragging\n // the scrollbar thumb); rendering the visible window once per frame keeps\n // the content in step with the cursor instead of lagging behind.\n pendingScrollTopRef.current = el.scrollTop;\n if (scrollRafRef.current == null) {\n scrollRafRef.current = requestAnimationFrame(() => {\n scrollRafRef.current = null;\n setScrollTop(pendingScrollTopRef.current);\n });\n }\n\n if (el.scrollTop + el.clientHeight >= el.scrollHeight - loadMoreThreshold) triggerLoadMore();\n },\n [loadMoreThreshold, triggerLoadMore],\n );\n\n useEffect(\n () => () => {\n if (scrollRafRef.current != null) cancelAnimationFrame(scrollRafRef.current);\n },\n [],\n );\n\n useLayoutEffect(() => {\n keysRef.current = keys;\n });\n\n // Resolve the gap to px before paint, re-running when the value or the\n // container's layout changes (a theme/font change that alters em/var is caught\n // by the container ResizeObserver feeding containerWidth/Height).\n useLayoutEffect(() => {\n const px = resolveCssLength(rowGap, rootRef.current);\n setResolvedRowGap((prev) => (prev === px ? prev : px));\n }, [rowGap, containerWidth, containerHeight]);\n\n // What an unmeasured row is assumed to be. `estimatedRowHeight` is only the\n // seed: once rows have been measured, their average is a far better guess, and\n // it is the guess every row between here and a distant jump target is made of.\n // With a fixed estimate the error compounds over that distance (40 assumed\n // against 35 real puts row 75 at row 86), and no amount of re-aiming fixes it,\n // because the rows that are wrong are precisely the ones never rendered.\n const assumedRowHeight = useMemo(() => {\n if (heightsMap.size === 0) return estimatedRowHeight;\n let total = 0;\n for (const height of heightsMap.values()) total += height;\n return total / heightsMap.size;\n }, [heightsMap, estimatedRowHeight]);\n\n const { offsets, totalHeight } = useMemo(\n () => buildOffsets(keys, heightsMap, assumedRowHeight, resolvedRowGap),\n [keys, heightsMap, assumedRowHeight, resolvedRowGap],\n );\n\n // The scroll trigger above can only fire on a list that actually scrolls. When\n // a batch is smaller than the viewport there is no overflow, so no scroll event\n // ever happens and lazy loading dead-ends after the first batch. Keep asking\n // for more until the content overflows; the consumer ends the loop by appending\n // nothing (or by dropping `onLoadMore` once its source is exhausted).\n //\n // Each (row count, viewport height) pair is probed at most once, so rows\n // settling to their measured heights can't re-ask a source that already ran\n // dry, and progress depends entirely on the consumer appending rows.\n const fillProbeRef = useRef('');\n useEffect(() => {\n if (!onLoadMore || isLoading || showLoadMoreSpinner) return;\n // 0 while the list is unmeasured or `display: none` — nothing to fill yet.\n if (containerHeight === 0) return;\n // The sticky header eats into the scroll area, so it isn't usable space.\n const headerH = headerRef.current?.offsetHeight ?? 0;\n if (totalHeight >= containerHeight - headerH) return; // already scrollable\n const probe = `${items.length}:${containerHeight}`;\n if (fillProbeRef.current === probe) return;\n fillProbeRef.current = probe;\n triggerLoadMore();\n }, [onLoadMore, isLoading, showLoadMoreSpinner, items.length, totalHeight, containerHeight, triggerLoadMore]);\n\n useLayoutEffect(() => {\n const el = rootRef.current;\n const prevOffsets = prevOffsetsRef.current;\n prevOffsetsRef.current = offsets;\n\n // Nothing to anchor against on the first pass or when pinned at the top.\n if (!el || prevOffsets.length === 0) return;\n // A jump in flight is aiming at a row; anchoring would hold the row it\n // happens to be passing instead, and the two would fight to a standstill.\n if (pendingJumpRef.current) return;\n const curScrollTop = el.scrollTop;\n if (curScrollTop <= 0) return;\n\n // Scroll anchoring: pin the row at the top of the viewport. Find it under\n // the *previous* offsets, then re-derive scrollTop from its *new* offset so\n // it stays visually fixed when rows above it are measured or resized. This\n // is more robust than summing per-row height deltas — it can't drift, and\n // one correction covers any number of simultaneous changes above the fold.\n const prevCount = prevOffsets.length - 1;\n const anchor = findStartIndex(prevOffsets, curScrollTop, prevCount);\n if (anchor >= items.length) return;\n const within = curScrollTop - prevOffsets[anchor];\n const target = offsets[anchor] + within;\n if (Math.abs(target - curScrollTop) > 0.5) {\n el.scrollTop = target;\n pendingScrollTopRef.current = target;\n setScrollTop(target);\n }\n }, [offsets, items.length]);\n\n const scrollToOffset = useCallback((top: number, behavior?: ScrollBehavior) => {\n const el = rootRef.current;\n if (!el) return;\n const clamped = Math.max(0, top);\n if (typeof el.scrollTo === 'function') el.scrollTo({ top: clamped, behavior: behavior ?? 'auto' });\n else el.scrollTop = clamped;\n }, []);\n\n /** Scroll position that puts row `index` where `align` asks for, or null if there is none. */\n const computeScrollTop = useCallback(\n (index: number, options?: VirtualListScrollOptions): number | null => {\n const el = rootRef.current;\n if (!el || items.length === 0) return null;\n const i = Math.max(0, Math.min(index, items.length - 1));\n const rowTop = offsets[i] ?? 0;\n const rowHeight = (offsets[i + 1] ?? rowTop) - rowTop;\n // Row offsets are measured from the top of the body, which itself starts\n // below the sticky header: the header is in flow, so scrolling by exactly\n // `rowTop` already puts the row flush under it. Subtracting the header\n // height on top of that, as this once did, left the row one header lower,\n // which in a table whose rows are about as tall as its header reads as\n // landing a row short.\n const headerHeight = headerRef.current?.offsetHeight ?? 0;\n // What is left of the viewport once the header has taken its share.\n const usable = Math.max(0, el.clientHeight - headerHeight);\n const align = options?.align ?? 'start';\n let top = rowTop;\n if (align === 'center') top -= (usable - rowHeight) / 2;\n else if (align === 'end') top -= usable - rowHeight;\n return top;\n },\n [items.length, offsets],\n );\n\n // A jump lands on the wrong row while the rows between here and there have\n // never been rendered: their offsets are `estimatedRowHeight` guesses, and the\n // error compounds over the distance (40px guessed against 35px real puts row\n // 75 at row 86). Scrolling there renders those rows, measuring corrects the\n // offsets, and the effect below re-aims at the target until it stops moving.\n // This is why the same jump is accurate once the list has been scrolled\n // through: by then every row in between carries a measured height.\n const pendingJumpRef = useRef<{\n index: number;\n options?: VirtualListScrollOptions;\n lastTarget: number;\n attempts: number;\n items: T[];\n } | null>(null);\n\n // Deliberately without a dependency list: every commit is a chance that new\n // measurements have moved the target, including the ones that come from the\n // scroll position itself changing mid-animation.\n useLayoutEffect(() => {\n const pending = pendingJumpRef.current;\n const el = rootRef.current;\n if (!pending) return;\n const target = pending.items === items && el ? computeScrollTop(pending.index, pending.options) : null;\n if (target == null) {\n pendingJumpRef.current = null; // new data supersedes an in-flight jump\n return;\n }\n const isStable = Math.abs(target - pending.lastTarget) <= 1;\n // Only once it has both stopped moving and been reached: with a smooth\n // behaviour the target can sit still for several frames while the animation\n // is still on its way there, and giving up then would leave it short.\n if ((isStable && Math.abs(el!.scrollTop - target) <= 1) || pending.attempts >= MAX_JUMP_CORRECTIONS) {\n pendingJumpRef.current = null;\n return;\n }\n if (isStable) return;\n pending.lastTarget = target;\n pending.attempts += 1;\n scrollToOffset(target, pending.options?.behavior);\n });\n\n // Any input of the user's own outranks a jump still in flight: being pulled\n // back to a row you just scrolled away from is worse than not arriving.\n useEffect(() => {\n const el = rootRef.current;\n if (!el) return;\n const cancel = () => {\n pendingJumpRef.current = null;\n };\n el.addEventListener('wheel', cancel, { passive: true });\n el.addEventListener('touchstart', cancel, { passive: true });\n el.addEventListener('keydown', cancel);\n return () => {\n el.removeEventListener('wheel', cancel);\n el.removeEventListener('touchstart', cancel);\n el.removeEventListener('keydown', cancel);\n };\n }, []);\n\n const scrollApi = useMemo<Omit<VirtualListHandle, 'recalculateColumns' | 'resetColumnWidths'>>(() => {\n function scrollToIndex(index: number, options?: VirtualListScrollOptions) {\n const target = computeScrollTop(index, options);\n if (target == null) return;\n pendingJumpRef.current = { index, options, lastTarget: target, attempts: 0, items };\n scrollToOffset(target, options?.behavior);\n }\n return {\n scrollToIndex,\n scrollToKey(key, options) {\n const i = items.findIndex((item, idx) => (getItemKey ? getItemKey(item, idx) : idx) === key);\n if (i >= 0) scrollToIndex(i, options);\n },\n scrollToTop(options) {\n pendingJumpRef.current = null;\n scrollToOffset(0, options?.behavior);\n },\n getScrollElement: () => rootRef.current,\n };\n }, [items, getItemKey, computeScrollTop, scrollToOffset]);\n\n const { startIndex, endIndex } = useMemo(\n () => getVisibleRange(offsets, scrollTop, containerHeight, overscan, items.length),\n [offsets, scrollTop, containerHeight, overscan, items.length],\n );\n\n return {\n rootRef,\n headerRef,\n rowObserver,\n keysRef,\n offsets,\n totalHeight,\n containerHeight,\n containerWidth,\n startIndex,\n endIndex,\n handleScroll,\n showLoadMoreSpinner,\n scrollApi,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"useVirtualWindow.mjs","names":[],"sources":["../../../../package/common/virtualList/useVirtualWindow.ts"],"sourcesContent":["import React, { useState, useRef, useEffect, useLayoutEffect, useMemo, useCallback } from 'react';\n\nimport { buildOffsets, findStartIndex, getVisibleRange } from './virtualList.utils';\nimport type { VirtualListHandle, VirtualListScrollOptions } from './virtualList.types';\n\n/**\n * Resolve a `rowGap` value to pixels for the offset math. Numbers and plain\n * `px`/numeric strings parse directly (no DOM, SSR/test-safe); any other CSS\n * length (`em`, `rem`, `%`, `var(...)`) is resolved via a hidden probe appended\n * to `contextEl` so it inherits the list's font-size and custom properties.\n */\nfunction resolveCssLength(value: number | string, contextEl: HTMLElement | null): number {\n if (typeof value === 'number') return value;\n const trimmed = value.trim();\n if (trimmed === '') return 0;\n const asNumber = Number(trimmed);\n if (!Number.isNaN(asNumber)) return asNumber; // \"8\" → 8\n const pxMatch = /^(-?\\d*\\.?\\d+)px$/.exec(trimmed);\n if (pxMatch) return parseFloat(pxMatch[1]); // \"8px\" → 8\n if (typeof document === 'undefined' || !contextEl) return 0;\n const probe = document.createElement('div');\n probe.style.cssText = `position:absolute;visibility:hidden;height:${trimmed};`;\n contextEl.appendChild(probe);\n const px = probe.getBoundingClientRect().height;\n contextEl.removeChild(probe);\n return Number.isFinite(px) ? px : 0;\n}\n\ninterface UseVirtualWindowArgs<T> {\n items: T[];\n /** Stable key per row (already derived by the caller). */\n keys: (string | number)[];\n getItemKey?: (item: T, index: number) => string | number;\n estimatedRowHeight: number;\n rowGap: number | string;\n overscan: number;\n onLoadMore?: () => Promise<void>;\n loadMoreThreshold: number;\n /** Initial/filter load in progress — the body is replaced by a spinner. */\n isLoading: boolean;\n}\n\ninterface UseVirtualWindowResult {\n rootRef: React.RefObject<HTMLDivElement | null>;\n headerRef: React.RefObject<HTMLDivElement | null>;\n /** Shared by every row to measure its height (read back via `data-index`). */\n rowObserver: ResizeObserver | null;\n /** Latest index → key mapping, for async consumers (e.g. the drag hook). */\n keysRef: React.RefObject<(string | number)[]>;\n offsets: number[];\n totalHeight: number;\n containerHeight: number;\n containerWidth: number;\n startIndex: number;\n endIndex: number;\n handleScroll: (e: React.UIEvent<HTMLDivElement>) => void;\n showLoadMoreSpinner: boolean;\n /** The scroll-related imperative methods, for the component to compose into\n * the forwarded handle alongside column controls. */\n scrollApi: Omit<VirtualListHandle, 'recalculateColumns' | 'resetColumnWidths'>;\n}\n\n/**\n * The generic virtualization engine: viewport measurement, per-row height\n * caching, offset/visible-range computation, scroll coalescing, scroll\n * anchoring on height changes, infinite-load triggering, and the imperative\n * scroll handle. Mode-agnostic — knows nothing about columns, selection or\n * dragging.\n */\n/**\n * Loop guard for a jump re-aiming at its target. It normally ends because the\n * target stops moving, long before this; the cap is only there so a target that\n * can never be reached, the last row asked for with `align: 'start'`, can't\n * re-aim forever.\n */\nconst MAX_JUMP_CORRECTIONS = 20;\n\nexport function useVirtualWindow<T>({\n items,\n keys,\n getItemKey,\n estimatedRowHeight,\n rowGap,\n overscan,\n onLoadMore,\n loadMoreThreshold,\n isLoading,\n}: UseVirtualWindowArgs<T>): UseVirtualWindowResult {\n const [scrollTop, setScrollTop] = useState(0);\n const [containerHeight, setContainerHeight] = useState(0);\n const [containerWidth, setContainerWidth] = useState(0);\n // rowGap may be any CSS length; resolve it to px for the offset math. Seed with\n // the synchronous fast path (number / px), then refine before paint for units\n // that need the DOM (em/rem/%/var).\n const [resolvedRowGap, setResolvedRowGap] = useState<number>(() => resolveCssLength(rowGap, null));\n const [heightsMap, setHeightsMap] = useState<Map<string | number, number>>(new Map());\n const [showLoadMoreSpinner, setShowLoadMoreSpinner] = useState(false);\n const isLoadingMoreRef = useRef(false);\n\n const rootRef = useRef<HTMLDivElement>(null);\n const headerRef = useRef<HTMLDivElement>(null);\n const prevOffsetsRef = useRef<number[]>([]);\n const scrollRafRef = useRef<number | null>(null);\n const pendingScrollTopRef = useRef(0);\n const keysRef = useRef<(string | number)[]>([]);\n\n // One ResizeObserver shared by every row, created once via a lazy state\n // initializer so rows mounting in the same commit can register in their\n // layout effect. Batching all entries into a single setState avoids a\n // re-render per row when many rows enter the viewport at once (the main\n // source of scroll jank). The row index is read back from `data-index`.\n const [rowObserver] = useState<ResizeObserver | null>(() => {\n if (typeof ResizeObserver === 'undefined') return null;\n return new ResizeObserver((entries) => {\n setHeightsMap((prev) => {\n let next: Map<string | number, number> | null = null;\n for (const entry of entries) {\n const el = entry.target as HTMLElement;\n const idx = Number(el.dataset.index);\n if (Number.isNaN(idx)) continue;\n // Resolve the row's stable key so the cache survives reorders/filters.\n const key = keysRef.current[idx];\n if (key === undefined) continue;\n // Prefer the size the observer already computed — reading offsetHeight\n // here would force a synchronous reflow on every measurement batch.\n const box = entry.borderBoxSize?.[0];\n const h = box ? Math.round(box.blockSize) : el.offsetHeight;\n if (prev.get(key) === h) continue;\n if (!next) next = new Map(prev);\n next.set(key, h);\n }\n return next ?? prev;\n });\n });\n });\n useEffect(() => () => rowObserver?.disconnect(), [rowObserver]);\n\n useLayoutEffect(() => {\n const el = rootRef.current;\n if (!el) return;\n // Measure synchronously before the first paint so the initial render fills\n // the viewport, instead of painting a few overscan rows and re-rendering.\n setContainerHeight(el.clientHeight);\n setContainerWidth(el.clientWidth);\n // Track width too: `fit` columns are measured against this box and capped at\n // its width, so when the container settles to its real width after a route\n // transition / async layout, that change has to re-trigger the measure —\n // otherwise an early measure against a 0/tiny width gets pinned and sticks.\n const observer = new ResizeObserver(() => {\n setContainerHeight(el.clientHeight);\n setContainerWidth(el.clientWidth);\n });\n observer.observe(el);\n return () => observer.disconnect();\n }, []);\n\n // Read through a ref so the trigger below stays stable even when the consumer\n // passes a fresh `onLoadMore` closure on every render.\n const onLoadMoreRef = useRef(onLoadMore);\n useLayoutEffect(() => {\n onLoadMoreRef.current = onLoadMore;\n });\n\n /** Start a load unless one is already in flight (and drive the bottom spinner). */\n const triggerLoadMore = useCallback(() => {\n const load = onLoadMoreRef.current;\n if (!load || isLoadingMoreRef.current) return;\n isLoadingMoreRef.current = true;\n setShowLoadMoreSpinner(true);\n load().finally(() => {\n isLoadingMoreRef.current = false;\n setShowLoadMoreSpinner(false);\n });\n }, []);\n\n const handleScroll = useCallback(\n (e: React.UIEvent<HTMLDivElement>) => {\n const el = e.currentTarget;\n // Coalesce scroll-driven re-renders to at most one per animation frame.\n // Scroll events can fire several times per frame (especially while dragging\n // the scrollbar thumb); rendering the visible window once per frame keeps\n // the content in step with the cursor instead of lagging behind.\n pendingScrollTopRef.current = el.scrollTop;\n if (scrollRafRef.current == null) {\n scrollRafRef.current = requestAnimationFrame(() => {\n scrollRafRef.current = null;\n setScrollTop(pendingScrollTopRef.current);\n });\n }\n\n if (el.scrollTop + el.clientHeight >= el.scrollHeight - loadMoreThreshold) triggerLoadMore();\n },\n [loadMoreThreshold, triggerLoadMore],\n );\n\n useEffect(\n () => () => {\n if (scrollRafRef.current != null) cancelAnimationFrame(scrollRafRef.current);\n },\n [],\n );\n\n useLayoutEffect(() => {\n keysRef.current = keys;\n });\n\n // Resolve the gap to px before paint, re-running when the value or the\n // container's layout changes (a theme/font change that alters em/var is caught\n // by the container ResizeObserver feeding containerWidth/Height).\n useLayoutEffect(() => {\n const px = resolveCssLength(rowGap, rootRef.current);\n setResolvedRowGap((prev) => (prev === px ? prev : px));\n }, [rowGap, containerWidth, containerHeight]);\n\n // What an unmeasured row is assumed to be. `estimatedRowHeight` is only the\n // seed: once rows have been measured, their average is a far better guess, and\n // it is the guess every row between here and a distant jump target is made of.\n // With a fixed estimate the error compounds over that distance (40 assumed\n // against 35 real puts row 75 at row 86), and no amount of re-aiming fixes it,\n // because the rows that are wrong are precisely the ones never rendered.\n const assumedRowHeight = useMemo(() => {\n if (heightsMap.size === 0) return estimatedRowHeight;\n let total = 0;\n for (const height of heightsMap.values()) total += height;\n return total / heightsMap.size;\n }, [heightsMap, estimatedRowHeight]);\n\n const { offsets, totalHeight } = useMemo(\n () => buildOffsets(keys, heightsMap, assumedRowHeight, resolvedRowGap),\n [keys, heightsMap, assumedRowHeight, resolvedRowGap],\n );\n\n // The scroll trigger above can only fire on a list that actually scrolls. When\n // a batch is smaller than the viewport there is no overflow, so no scroll event\n // ever happens and lazy loading dead-ends after the first batch. Keep asking\n // for more until the content overflows; the consumer ends the loop by appending\n // nothing (or by dropping `onLoadMore` once its source is exhausted).\n //\n // Each (row count, viewport height) pair is probed at most once, so rows\n // settling to their measured heights can't re-ask a source that already ran\n // dry, and progress depends entirely on the consumer appending rows.\n const fillProbeRef = useRef('');\n useEffect(() => {\n if (!onLoadMore || isLoading || showLoadMoreSpinner) return;\n // 0 while the list is unmeasured or `display: none` — nothing to fill yet.\n if (containerHeight === 0) return;\n // The sticky header eats into the scroll area, so it isn't usable space.\n const headerH = headerRef.current?.offsetHeight ?? 0;\n if (totalHeight >= containerHeight - headerH) return; // already scrollable\n const probe = `${items.length}:${containerHeight}`;\n if (fillProbeRef.current === probe) return;\n fillProbeRef.current = probe;\n triggerLoadMore();\n }, [onLoadMore, isLoading, showLoadMoreSpinner, items.length, totalHeight, containerHeight, triggerLoadMore]);\n\n useLayoutEffect(() => {\n const el = rootRef.current;\n const prevOffsets = prevOffsetsRef.current;\n prevOffsetsRef.current = offsets;\n\n // Nothing to anchor against on the first pass or when pinned at the top.\n if (!el || prevOffsets.length === 0) return;\n // A jump in flight is aiming at a row; anchoring would hold the row it\n // happens to be passing instead, and the two would fight to a standstill.\n if (pendingJumpRef.current) return;\n const curScrollTop = el.scrollTop;\n if (curScrollTop <= 0) return;\n\n // Scroll anchoring: pin the row at the top of the viewport. Find it under\n // the *previous* offsets, then re-derive scrollTop from its *new* offset so\n // it stays visually fixed when rows above it are measured or resized. This\n // is more robust than summing per-row height deltas — it can't drift, and\n // one correction covers any number of simultaneous changes above the fold.\n const prevCount = prevOffsets.length - 1;\n const anchor = findStartIndex(prevOffsets, curScrollTop, prevCount);\n if (anchor >= items.length) return;\n const within = curScrollTop - prevOffsets[anchor];\n const target = offsets[anchor] + within;\n if (Math.abs(target - curScrollTop) > 0.5) {\n el.scrollTop = target;\n pendingScrollTopRef.current = target;\n setScrollTop(target);\n }\n }, [offsets, items.length]);\n\n const scrollToOffset = useCallback((top: number, behavior?: ScrollBehavior) => {\n const el = rootRef.current;\n if (!el) return;\n const clamped = Math.max(0, top);\n if (typeof el.scrollTo === 'function') el.scrollTo({ top: clamped, behavior: behavior ?? 'auto' });\n else el.scrollTop = clamped;\n }, []);\n\n /** Scroll position that puts row `index` where `align` asks for, or null if there is none. */\n const computeScrollTop = useCallback(\n (index: number, options?: VirtualListScrollOptions): number | null => {\n const el = rootRef.current;\n if (!el || items.length === 0) return null;\n const i = Math.max(0, Math.min(index, items.length - 1));\n const rowTop = offsets[i] ?? 0;\n const rowHeight = (offsets[i + 1] ?? rowTop) - rowTop;\n // Row offsets are measured from the top of the body, which itself starts\n // below the sticky header: the header is in flow, so scrolling by exactly\n // `rowTop` already puts the row flush under it. Subtracting the header\n // height on top of that, as this once did, left the row one header lower,\n // which in a table whose rows are about as tall as its header reads as\n // landing a row short.\n const headerHeight = headerRef.current?.offsetHeight ?? 0;\n // What is left of the viewport once the header has taken its share.\n const usable = Math.max(0, el.clientHeight - headerHeight);\n const align = options?.align ?? 'start';\n let top = rowTop;\n if (align === 'center') top -= (usable - rowHeight) / 2;\n else if (align === 'end') top -= usable - rowHeight;\n return top;\n },\n [items.length, offsets],\n );\n\n // A jump lands on the wrong row while the rows between here and there have\n // never been rendered: their offsets are `estimatedRowHeight` guesses, and the\n // error compounds over the distance (40px guessed against 35px real puts row\n // 75 at row 86). Scrolling there renders those rows, measuring corrects the\n // offsets, and the effect below re-aims at the target until it stops moving.\n // This is why the same jump is accurate once the list has been scrolled\n // through: by then every row in between carries a measured height.\n const pendingJumpRef = useRef<{\n index: number;\n options?: VirtualListScrollOptions;\n lastTarget: number;\n attempts: number;\n items: T[];\n } | null>(null);\n\n // Deliberately without a dependency list: every commit is a chance that new\n // measurements have moved the target, including the ones that come from the\n // scroll position itself changing mid-animation.\n useLayoutEffect(() => {\n const pending = pendingJumpRef.current;\n const el = rootRef.current;\n if (!pending) return;\n const target = pending.items === items && el ? computeScrollTop(pending.index, pending.options) : null;\n if (target == null) {\n pendingJumpRef.current = null; // new data supersedes an in-flight jump\n return;\n }\n const isStable = Math.abs(target - pending.lastTarget) <= 1;\n // Only once it has both stopped moving and been reached: with a smooth\n // behaviour the target can sit still for several frames while the animation\n // is still on its way there, and giving up then would leave it short.\n if ((isStable && Math.abs(el!.scrollTop - target) <= 1) || pending.attempts >= MAX_JUMP_CORRECTIONS) {\n pendingJumpRef.current = null;\n return;\n }\n if (isStable) return;\n pending.lastTarget = target;\n pending.attempts += 1;\n scrollToOffset(target, pending.options?.behavior);\n });\n\n // Any input of the user's own outranks a jump still in flight: being pulled\n // back to a row you just scrolled away from is worse than not arriving.\n useEffect(() => {\n const el = rootRef.current;\n if (!el) return;\n const cancel = () => {\n pendingJumpRef.current = null;\n };\n el.addEventListener('wheel', cancel, { passive: true });\n el.addEventListener('touchstart', cancel, { passive: true });\n el.addEventListener('keydown', cancel);\n return () => {\n el.removeEventListener('wheel', cancel);\n el.removeEventListener('touchstart', cancel);\n el.removeEventListener('keydown', cancel);\n };\n }, []);\n\n const scrollApi = useMemo<Omit<VirtualListHandle, 'recalculateColumns' | 'resetColumnWidths'>>(() => {\n function scrollToIndex(index: number, options?: VirtualListScrollOptions) {\n const target = computeScrollTop(index, options);\n if (target == null) return;\n pendingJumpRef.current = { index, options, lastTarget: target, attempts: 0, items };\n scrollToOffset(target, options?.behavior);\n }\n return {\n scrollToIndex,\n scrollToKey(key, options) {\n const i = items.findIndex((item, idx) => (getItemKey ? getItemKey(item, idx) : idx) === key);\n if (i >= 0) scrollToIndex(i, options);\n },\n scrollToTop(options) {\n pendingJumpRef.current = null;\n scrollToOffset(0, options?.behavior);\n },\n getScrollElement: () => rootRef.current,\n };\n }, [items, getItemKey, computeScrollTop, scrollToOffset]);\n\n const { startIndex, endIndex } = useMemo(\n () => getVisibleRange(offsets, scrollTop, containerHeight, overscan, items.length),\n [offsets, scrollTop, containerHeight, overscan, items.length],\n );\n\n return {\n rootRef,\n headerRef,\n rowObserver,\n keysRef,\n offsets,\n totalHeight,\n containerHeight,\n containerWidth,\n startIndex,\n endIndex,\n handleScroll,\n showLoadMoreSpinner,\n scrollApi,\n };\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{useLabels as e}from"../configProvider/useLabels.mjs";import t from"../loading/spinnerLoading/index.mjs";import n from"../checkbox/checkbox.mjs";import r from"./virtualList.module.mjs";import"./virtualList.utils.mjs";import ee from"./virtualRow.mjs";import i from"./virtualListHeader.mjs";import{useVirtualWindow as a}from"./useVirtualWindow.mjs";import{useSelection as o}from"./useSelection.mjs";import{useColumns as te}from"./useColumns.mjs";import{useRowDrag as ne}from"./useRowDrag.mjs";import{useSorting as re}from"./useSorting.mjs";import{useColumnResize as ie}from"./useColumnResize.mjs";import{useRowNavigation as ae}from"./useRowNavigation.mjs";import oe,{useCallback as s,useEffect as se,useId as ce,useImperativeHandle as le,useMemo as c,useRef as ue}from"react";import l from"classnames";import{Fragment as de,jsx as u,jsxs as d}from"react/jsx-runtime";var fe={selectRow:`Select row`,selectAllRows:`Select all rows`,toggleColumns:`Toggle column visibility`,columnsHidden:e=>`${e} columns hidden`,resetColumnWidths:`Reset column widths`};function f({items:oe,renderRow:f,ariaRoles:p,columns:m,height:pe=`100%`,estimatedRowHeight:me=40,overscan:he=3,rowGap:ge=0,rowPadding:h,selectedKey:g,getItemKey:_,onRowClick:v,keyboardNavigation:y=!0,visibleColumnKeys:_e,onVisibleColumnsChange:ve,persistColumnsKey:b,resizableColumns:ye=!1,columnWidths:be,onColumnWidthsChange:xe,labels:Se,sort:Ce,defaultSort:we,onSortChange:Te,showColumnToggle:Ee,onLoadMore:De,loadMoreThreshold:Oe=100,isLoading:x=!1,multiSelect:S=!1,selectedKeys:ke,onSelectionChange:Ae,reorderable:C=!1,onReorder:je,longPressDelay:Me=400,treeReorder:w=!1,getItemDepth:T,isGroup:E,onTreeDrop:Ne,treeIndentPx:Pe=24,dragHandle:Fe=!1,showDivider:Ie=!0,rowHover:Le=!0,className:Re,style:ze,classNames:D,styles:O,...Be},Ve){let k=e(`VirtualList`,Se,fe),{rows:A,effectiveSort:He,isSorted:j,handleHeaderSort:Ue}=re({items:oe,columns:m,sort:Ce,defaultSort:we,onSortChange:Te}),M=s((e,t)=>_?_(e,t):t,[_]),N=c(()=>A.map((e,t)=>M(e,t)),[A,M]),We=c(()=>T?A.map((e,t)=>T(e,t)):[],[A,T]),Ge=s(e=>E?E(A[e],e):!1,[E,A]),P=a({items:A,keys:N,getItemKey:_,estimatedRowHeight:me,rowGap:ge,overscan:he,onLoadMore:De,loadMoreThreshold:Oe,isLoading:x}),{rootRef:F,headerRef:I,rowObserver:Ke,keysRef:qe,offsets:L,totalHeight:Je,startIndex:R,endIndex:z}=P,B=ue([]),V=ie({columns:m,visibleColumnsRef:B,resizableColumns:ye,columnWidths:be,onColumnWidthsChange:xe,persistColumnsKey:b,rootRef:F}),H=o({items:A,getKey:M,multiSelect:S,selectedKeys:ke,onSelectionChange:Ae}),{effectiveSelectedKeys:U}=H,W=te({columns:m,items:A,multiSelect:S,visibleColumnKeys:_e,onVisibleColumnsChange:ve,persistColumnsKey:b,showColumnToggle:Ee,userWidths:V.widths,isFrozen:V.isFrozen,rootRef:F,startIndex:R,endIndex:z,containerHeight:P.containerHeight,containerWidth:P.containerWidth}),{hasColumns:G,visibleColumns:K,columnTemplate:Ye,widthVars:Xe,shouldShowToggle:Ze,recalculateColumns:q}=W;B.current=K,le(Ve,()=>({...P.scrollApi,recalculateColumns:q,resetColumnWidths:V.reset}),[P.scrollApi,q,V.reset]);let J=j&&(C||w);se(()=>{J&&console.warn(`VirtualList: row reordering is disabled while the list is sorted. Clear the sort to drag rows.`)},[J]);let Y=ne({reorderable:C&&!j,treeReorder:w&&!j,onReorder:je,onTreeDrop:Ne,longPressDelay:Me,dragHandle:Fe,treeIndentPx:Pe,keys:N,depths:We,isGroupAt:Ge,rootRef:F,keysRef:qe}),Qe=ce(),$e=e=>`${Qe}-row-${e}`,X=ae({enabled:y,rowCount:A.length,offsets:L,rootRef:F,headerRef:I,scrollToIndex:P.scrollApi.scrollToIndex,initialIndex:g==null?0:Math.max(0,N.indexOf(g)),multiSelect:S,onActivate:v&&(e=>v(A[e],e)),onToggleSelect:e=>H.handleRowSelect(N[e])}),et=typeof h==`number`?`${h}px`:h,Z=e=>{let t=A[e],i=M(t,e),a=g!=null&&i===g||U.has(i),o=Y.getRowDragProps(e,i);return u(ee,{id:$e(e),index:e,top:L[e],padding:et,columnTemplate:Ye,isSelected:a,isActive:e===X.activeIndex,manageTabStops:y,isEntered:e===X.enteredIndex,activeClassName:D?.activeRow,activeStyle:O?.activeRow,showDivider:Ie,hover:Le,onClick:()=>{Y.consumeSuppressedClick()||(X.setActiveIndex(e),v?.(t,e))},observer:Ke,ariaRowIndex:G?e+2:void 0,ariaPosInSet:G?void 0:e+1,ariaSetSize:G?void 0:A.length,rowRole:p?.row??(G?`row`:`listitem`),reserveToggleGutter:Ze,...o,dropIndicatorClassName:D?.dropIndicator,dropIndicatorStyle:O?.dropIndicator,rowClassName:D?.row,rowStyle:O?.row,children:G?d(de,{children:[S&&u(`div`,{className:l(r.virtualListSelectCell,D?.selectCell),style:O?.selectCell,role:`gridcell`,onClick:e=>e.stopPropagation(),children:u(n,{selected:U.has(i),onToggle:()=>H.handleRowSelect(i),"aria-label":k.selectRow,tabIndex:-1})}),K.map(n=>u(`div`,{className:l(r.virtualListCell,D?.cell),style:O?.cell,role:`gridcell`,"data-col-key":n.key,"data-fit-key":n.width.type===`fit`?n.key:void 0,children:n.renderCell(t,e)},n.key))]}):f?.(t,e)},i)},Q=[];for(let e=R;e<=z;e++)Q.push(Z(e));let $=Y.draggingKey==null?-1:N.indexOf(Y.draggingKey);return $>=0&&($<R||$>z)&&Q.push(Z($)),X.enteredIndex>=0&&(X.enteredIndex<R||X.enteredIndex>z)&&Q.push(Z(X.enteredIndex)),d(`div`,{...Be,...X.containerProps,ref:F,className:l(r.virtualList,Y.draggingKey!=null&&r.virtualListReordering,V.isResizing&&r.virtualListResizing,Re,D?.root),style:{height:pe,...Xe,...ze,...O?.root},onScroll:P.handleScroll,role:p?.container??(G?`grid`:`list`),"aria-rowcount":G?A.length+1:void 0,"aria-activedescendant":X.activeIndex>=0&&(p?.container??(G?`grid`:`list`))!==`list`?$e(X.activeIndex):void 0,children:[G&&u(i,{headerRef:I,columns:m,cols:W,resize:V,sort:He,onSort:Ue,multiSelect:S,allSelected:H.allSelected,someSelected:H.someSelected,onSelectAll:H.handleSelectAll,labels:k,classNames:D,styles:O}),x?u(`div`,{className:r.virtualListLoadingFull,children:u(t,{className:r.virtualListSpinner})}):u(`div`,{className:l(r.virtualListBody,D?.body),style:{height:Je,...O?.body},children:Q}),P.showLoadMoreSpinner&&u(`div`,{className:l(r.virtualListLoadingIndicator,D?.loadingIndicator),style:O?.loadingIndicator,children:u(t,{className:r.virtualListSpinner})})]})}var p=oe.forwardRef(f);export{p as default};
1
+ "use client";import{useLabels as e}from"../configProvider/useLabels.mjs";import t from"../loading/spinnerLoading/index.mjs";import n from"../checkbox/checkbox.mjs";import r from"./virtualList.module.mjs";import"./virtualList.utils.mjs";import ee from"./virtualRow.mjs";import i from"./virtualListHeader.mjs";import{useVirtualWindow as a}from"./useVirtualWindow.mjs";import{useSelection as o}from"./useSelection.mjs";import{useColumns as te}from"./useColumns.mjs";import{useRowDrag as ne}from"./useRowDrag.mjs";import{useSorting as re}from"./useSorting.mjs";import{useColumnResize as ie}from"./useColumnResize.mjs";import{useRowNavigation as ae}from"./useRowNavigation.mjs";import{useCallback as s,useEffect as oe,useId as se,useImperativeHandle as ce,useMemo as c,useRef as le}from"react";import l from"classnames";import{Fragment as ue,jsx as u,jsxs as d}from"react/jsx-runtime";var de={selectRow:`Select row`,selectAllRows:`Select all rows`,toggleColumns:`Toggle column visibility`,columnsHidden:e=>`${e} columns hidden`,resetColumnWidths:`Reset column widths`};function f({ref:f,items:fe,renderRow:pe,ariaRoles:p,columns:m,height:me=`100%`,estimatedRowHeight:he=40,overscan:ge=3,rowGap:_e=0,rowPadding:h,selectedKey:g,getItemKey:_,onRowClick:v,keyboardNavigation:y=!0,visibleColumnKeys:ve,onVisibleColumnsChange:ye,persistColumnsKey:b,resizableColumns:be=!1,columnWidths:xe,onColumnWidthsChange:Se,labels:Ce,sort:we,defaultSort:Te,onSortChange:Ee,showColumnToggle:De,onLoadMore:Oe,loadMoreThreshold:ke=100,isLoading:x=!1,multiSelect:S=!1,selectedKeys:Ae,onSelectionChange:je,reorderable:C=!1,onReorder:Me,longPressDelay:Ne=400,treeReorder:w=!1,getItemDepth:T,isGroup:E,onTreeDrop:Pe,treeIndentPx:Fe=24,dragHandle:Ie=!1,showDivider:Le=!0,rowHover:Re=!0,className:ze,style:Be,classNames:D,styles:O,...Ve}){let k=e(`VirtualList`,Ce,de),{rows:A,effectiveSort:He,isSorted:j,handleHeaderSort:Ue}=re({items:fe,columns:m,sort:we,defaultSort:Te,onSortChange:Ee}),M=s((e,t)=>_?_(e,t):t,[_]),N=c(()=>A.map((e,t)=>M(e,t)),[A,M]),We=c(()=>T?A.map((e,t)=>T(e,t)):[],[A,T]),Ge=s(e=>E?E(A[e],e):!1,[E,A]),P=a({items:A,keys:N,getItemKey:_,estimatedRowHeight:he,rowGap:_e,overscan:ge,onLoadMore:Oe,loadMoreThreshold:ke,isLoading:x}),{rootRef:F,headerRef:I,rowObserver:Ke,keysRef:qe,offsets:L,totalHeight:Je,startIndex:R,endIndex:z}=P,B=le([]),V=ie({columns:m,visibleColumnsRef:B,resizableColumns:be,columnWidths:xe,onColumnWidthsChange:Se,persistColumnsKey:b,rootRef:F}),H=o({items:A,getKey:M,multiSelect:S,selectedKeys:Ae,onSelectionChange:je}),{effectiveSelectedKeys:U}=H,W=te({columns:m,items:A,multiSelect:S,visibleColumnKeys:ve,onVisibleColumnsChange:ye,persistColumnsKey:b,showColumnToggle:De,userWidths:V.widths,isFrozen:V.isFrozen,rootRef:F,startIndex:R,endIndex:z,containerHeight:P.containerHeight,containerWidth:P.containerWidth}),{hasColumns:G,visibleColumns:K,columnTemplate:Ye,widthVars:Xe,shouldShowToggle:Ze,recalculateColumns:q}=W;B.current=K,ce(f,()=>({...P.scrollApi,recalculateColumns:q,resetColumnWidths:V.reset}),[P.scrollApi,q,V.reset]);let Qe=j&&(C||w);oe(()=>{Qe&&console.warn(`VirtualList: row reordering is disabled while the list is sorted. Clear the sort to drag rows.`)},[Qe]);let J=ne({reorderable:C&&!j,treeReorder:w&&!j,onReorder:Me,onTreeDrop:Pe,longPressDelay:Ne,dragHandle:Ie,treeIndentPx:Fe,keys:N,depths:We,isGroupAt:Ge,rootRef:F,keysRef:qe}),$e=se(),Y=e=>`${$e}-row-${e}`,X=ae({enabled:y,rowCount:A.length,offsets:L,rootRef:F,headerRef:I,scrollToIndex:P.scrollApi.scrollToIndex,initialIndex:g==null?0:Math.max(0,N.indexOf(g)),multiSelect:S,onActivate:v&&(e=>v(A[e],e)),onToggleSelect:e=>H.handleRowSelect(N[e])}),et=typeof h==`number`?`${h}px`:h,Z=e=>{let t=A[e],i=M(t,e),a=g!=null&&i===g||U.has(i),o=J.getRowDragProps(e,i);return u(ee,{id:Y(e),index:e,top:L[e],padding:et,columnTemplate:Ye,isSelected:a,isActive:e===X.activeIndex,manageTabStops:y,isEntered:e===X.enteredIndex,activeClassName:D?.activeRow,activeStyle:O?.activeRow,showDivider:Le,hover:Re,onClick:()=>{J.consumeSuppressedClick()||(X.setActiveIndex(e),v?.(t,e))},observer:Ke,ariaRowIndex:G?e+2:void 0,ariaPosInSet:G?void 0:e+1,ariaSetSize:G?void 0:A.length,rowRole:p?.row??(G?`row`:`listitem`),reserveToggleGutter:Ze,...o,dropIndicatorClassName:D?.dropIndicator,dropIndicatorStyle:O?.dropIndicator,rowClassName:D?.row,rowStyle:O?.row,children:G?d(ue,{children:[S&&u(`div`,{className:l(r.virtualListSelectCell,D?.selectCell),style:O?.selectCell,role:`gridcell`,onClick:e=>e.stopPropagation(),children:u(n,{selected:U.has(i),onToggle:()=>H.handleRowSelect(i),"aria-label":k.selectRow,tabIndex:-1})}),K.map(n=>u(`div`,{className:l(r.virtualListCell,D?.cell),style:O?.cell,role:`gridcell`,"data-col-key":n.key,"data-fit-key":n.width.type===`fit`?n.key:void 0,children:n.renderCell(t,e)},n.key))]}):pe?.(t,e)},i)},Q=[];for(let e=R;e<=z;e++)Q.push(Z(e));let $=J.draggingKey==null?-1:N.indexOf(J.draggingKey);return $>=0&&($<R||$>z)&&Q.push(Z($)),X.enteredIndex>=0&&(X.enteredIndex<R||X.enteredIndex>z)&&Q.push(Z(X.enteredIndex)),d(`div`,{...Ve,...X.containerProps,ref:F,className:l(r.virtualList,J.draggingKey!=null&&r.virtualListReordering,V.isResizing&&r.virtualListResizing,ze,D?.root),style:{height:me,...Xe,...Be,...O?.root},onScroll:P.handleScroll,role:p?.container??(G?`grid`:`list`),"aria-rowcount":G?A.length+1:void 0,"aria-activedescendant":X.activeIndex>=0&&(p?.container??(G?`grid`:`list`))!==`list`?Y(X.activeIndex):void 0,children:[G&&u(i,{headerRef:I,columns:m,cols:W,resize:V,sort:He,onSort:Ue,multiSelect:S,allSelected:H.allSelected,someSelected:H.someSelected,onSelectAll:H.handleSelectAll,labels:k,classNames:D,styles:O}),x?u(`div`,{className:r.virtualListLoadingFull,children:u(t,{className:r.virtualListSpinner})}):u(`div`,{className:l(r.virtualListBody,D?.body),style:{height:Je,...O?.body},children:Q}),P.showLoadMoreSpinner&&u(`div`,{className:l(r.virtualListLoadingIndicator,D?.loadingIndicator),style:O?.loadingIndicator,children:u(t,{className:r.virtualListSpinner})})]})}export{f as default};
2
2
  //# sourceMappingURL=virtualList.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"virtualList.mjs","names":[],"sources":["../../../../package/common/virtualList/virtualList.tsx"],"sourcesContent":["import React, { useMemo, useCallback, useEffect, useId, useImperativeHandle, useRef } from 'react';\nimport cx from 'classnames';\nimport styles from './virtualList.module.pcss';\nimport SpinnerLoading from '../loading/spinnerLoading';\nimport Checkbox from '../checkbox';\nimport VirtualRow from './virtualRow';\nimport VirtualListHeader from './virtualListHeader';\nimport { useVirtualWindow } from './useVirtualWindow';\nimport { useSelection } from './useSelection';\nimport { useColumns } from './useColumns';\nimport { useRowDrag } from './useRowDrag';\nimport { useSorting } from './useSorting';\nimport { useColumnResize } from './useColumnResize';\nimport { useRowNavigation } from './useRowNavigation';\nimport { useLabels } from '../configProvider';\nimport type { VirtualListColumn, VirtualListLabels, VirtualListProps, VirtualListHandle } from './virtualList.types';\n\nconst DEFAULT_LABELS: Required<VirtualListLabels> = {\n selectRow: 'Select row',\n selectAllRows: 'Select all rows',\n toggleColumns: 'Toggle column visibility',\n columnsHidden: (count) => `${count} columns hidden`,\n resetColumnWidths: 'Reset column widths',\n};\n\n// Pure helpers live in ./virtualList.utils; re-exported here so existing\n// imports (and unit tests) keep working against the component entry point.\nexport {\n buildOffsets,\n findStartIndex,\n getVisibleRange,\n resolveReorderTarget,\n resolveTreeDropTarget,\n lastDescendantIndex,\n buildColumnTemplate,\n compareSortValues,\n isColumnSortable,\n isEmptySortValue,\n nextSort,\n sortItems,\n} from './virtualList.utils';\n\n// ─── Orchestrator ─────────────────────────────────────────────────────────────\n// VirtualListInner wires the hooks together and renders the two pieces of\n// markup. Each concern lives in its own module:\n// useSorting — table mode: header sort state, and the sorted row order\n// useVirtualWindow — generic scroll / measurement / windowing (all modes)\n// useColumnResize — table mode: user column widths, and the drag that sets them\n// useSelection — multi-row selection\n// useColumns — table mode: columns, visibility, persistence, fit widths\n// useRowDrag — reorder + tree drag-and-drop (mouse + touch)\n// useRowNavigation — arrow-key navigation over the rows\n// virtualListHeader — the header row: sorting, resizing, the column menu\n// virtualRow — one positioned row, with its drag wiring\n//\n// The hook order is not free: useColumnResize decides whether the layout is\n// frozen, which useColumns needs to build the grid template.\n\nfunction VirtualListInner<T>(\n {\n items,\n renderRow,\n ariaRoles,\n columns,\n height = '100%',\n estimatedRowHeight = 40,\n overscan = 3,\n rowGap = 0,\n rowPadding,\n selectedKey,\n getItemKey,\n onRowClick,\n keyboardNavigation = true,\n visibleColumnKeys,\n onVisibleColumnsChange,\n persistColumnsKey,\n resizableColumns = false,\n columnWidths,\n onColumnWidthsChange,\n labels,\n sort,\n defaultSort,\n onSortChange,\n showColumnToggle,\n onLoadMore,\n loadMoreThreshold = 100,\n isLoading = false,\n multiSelect = false,\n selectedKeys,\n onSelectionChange,\n reorderable = false,\n onReorder,\n longPressDelay = 400,\n treeReorder = false,\n getItemDepth,\n isGroup,\n onTreeDrop,\n treeIndentPx = 24,\n dragHandle = false,\n showDivider = true,\n rowHover = true,\n className,\n style,\n classNames,\n styles: slotStyles,\n ...rest\n }: VirtualListProps<T>,\n ref: React.ForwardedRef<VirtualListHandle>,\n) {\n const text = useLabels('VirtualList', labels, DEFAULT_LABELS);\n const { rows, effectiveSort, isSorted, handleHeaderSort } = useSorting<T>({\n items,\n columns,\n sort,\n defaultSort,\n onSortChange,\n });\n\n const getKey = useCallback(\n (item: T, index: number): string | number => (getItemKey ? getItemKey(item, index) : index),\n [getItemKey],\n );\n const keys = useMemo(() => rows.map((item, i) => getKey(item, i)), [rows, getKey]);\n const depths = useMemo(\n () => (getItemDepth ? rows.map((item, i) => getItemDepth(item, i)) : []),\n [rows, getItemDepth],\n );\n const isGroupAt = useCallback((i: number) => (isGroup ? isGroup(rows[i], i) : false), [isGroup, rows]);\n\n const win = useVirtualWindow<T>({\n items: rows,\n keys,\n getItemKey,\n estimatedRowHeight,\n rowGap,\n overscan,\n onLoadMore,\n loadMoreThreshold,\n isLoading,\n });\n const { rootRef, headerRef, rowObserver, keysRef, offsets, totalHeight, startIndex, endIndex } = win;\n\n // Filled from `cols` below: the resize hook only reads the visible set when a\n // handle is actually used, which is what lets it run before the hook that\n // derives it.\n const visibleColumnsRef = useRef<VirtualListColumn<T>[]>([]);\n const columnResize = useColumnResize<T>({\n columns,\n visibleColumnsRef,\n resizableColumns,\n columnWidths,\n onColumnWidthsChange,\n persistColumnsKey,\n rootRef,\n });\n\n const selection = useSelection<T>({ items: rows, getKey, multiSelect, selectedKeys, onSelectionChange });\n const { effectiveSelectedKeys } = selection;\n\n const cols = useColumns<T>({\n columns,\n items: rows,\n multiSelect,\n visibleColumnKeys,\n onVisibleColumnsChange,\n persistColumnsKey,\n showColumnToggle,\n userWidths: columnResize.widths,\n isFrozen: columnResize.isFrozen,\n rootRef,\n startIndex,\n endIndex,\n containerHeight: win.containerHeight,\n containerWidth: win.containerWidth,\n });\n // The rest of `cols` is the header's business and goes there whole.\n const { hasColumns, visibleColumns, columnTemplate, widthVars, shouldShowToggle, recalculateColumns } = cols;\n visibleColumnsRef.current = visibleColumns;\n\n // Compose the forwarded handle from the hooks that own each piece: scroll\n // methods from the windowing engine, column controls from the column hooks.\n useImperativeHandle(ref, () => ({ ...win.scrollApi, recalculateColumns, resetColumnWidths: columnResize.reset }), [\n win.scrollApi,\n recalculateColumns,\n columnResize.reset,\n ]);\n\n // Dragging a row to position N is meaningless while the list decides the\n // order: the drop would be undone by the next sort pass.\n const dragBlockedBySort = isSorted && (reorderable || treeReorder);\n useEffect(() => {\n if (dragBlockedBySort)\n console.warn('VirtualList: row reordering is disabled while the list is sorted. Clear the sort to drag rows.');\n }, [dragBlockedBySort]);\n\n const drag = useRowDrag({\n reorderable: reorderable && !isSorted,\n treeReorder: treeReorder && !isSorted,\n onReorder,\n onTreeDrop,\n longPressDelay,\n dragHandle,\n treeIndentPx,\n keys,\n depths,\n isGroupAt,\n rootRef,\n keysRef,\n });\n\n const listId = useId();\n const rowDomId = (index: number) => `${listId}-row-${index}`;\n const nav = useRowNavigation({\n enabled: keyboardNavigation,\n rowCount: rows.length,\n offsets,\n rootRef,\n headerRef,\n scrollToIndex: win.scrollApi.scrollToIndex,\n initialIndex: selectedKey != null ? Math.max(0, keys.indexOf(selectedKey)) : 0,\n multiSelect,\n onActivate: onRowClick && ((index: number) => onRowClick(rows[index], index)),\n onToggleSelect: (index) => selection.handleRowSelect(keys[index]),\n });\n\n const rowPaddingValue = typeof rowPadding === 'number' ? `${rowPadding}px` : rowPadding;\n\n const renderRowAt = (i: number) => {\n const item = rows[i];\n const key = getKey(item, i);\n const isSelected = (selectedKey != null && key === selectedKey) || effectiveSelectedKeys.has(key);\n const dragProps = drag.getRowDragProps(i, key);\n\n return (\n <VirtualRow\n key={key}\n id={rowDomId(i)}\n index={i}\n top={offsets[i]}\n padding={rowPaddingValue}\n columnTemplate={columnTemplate}\n isSelected={isSelected}\n isActive={i === nav.activeIndex}\n manageTabStops={keyboardNavigation}\n isEntered={i === nav.enteredIndex}\n activeClassName={classNames?.activeRow}\n activeStyle={slotStyles?.activeRow}\n showDivider={showDivider}\n hover={rowHover}\n onClick={() => {\n if (drag.consumeSuppressedClick()) return;\n // Keep the arrows where the pointer last was.\n nav.setActiveIndex(i);\n onRowClick?.(item, i);\n }}\n observer={rowObserver}\n ariaRowIndex={hasColumns ? i + 2 : undefined}\n ariaPosInSet={hasColumns ? undefined : i + 1}\n ariaSetSize={hasColumns ? undefined : rows.length}\n rowRole={ariaRoles?.row ?? (hasColumns ? 'row' : 'listitem')}\n reserveToggleGutter={shouldShowToggle}\n {...dragProps}\n dropIndicatorClassName={classNames?.dropIndicator}\n dropIndicatorStyle={slotStyles?.dropIndicator}\n rowClassName={classNames?.row}\n rowStyle={slotStyles?.row}\n >\n {hasColumns ? (\n <>\n {multiSelect && (\n <div\n className={cx(styles.virtualListSelectCell, classNames?.selectCell)}\n style={slotStyles?.selectCell}\n role='gridcell'\n onClick={(e) => e.stopPropagation()}\n >\n <Checkbox\n selected={effectiveSelectedKeys.has(key)}\n onToggle={() => selection.handleRowSelect(key)}\n aria-label={text.selectRow}\n // One tab stop per rendered row, changing as the list scrolls,\n // would strand the focus the moment a row unmounts. Space on\n // the active row is the keyboard path instead.\n tabIndex={-1}\n />\n </div>\n )}\n {visibleColumns.map((col) => (\n <div\n key={col.key}\n className={cx(styles.virtualListCell, classNames?.cell)}\n style={slotStyles?.cell}\n role='gridcell'\n data-col-key={col.key}\n data-fit-key={col.width.type === 'fit' ? col.key : undefined}\n >\n {col.renderCell(item, i)}\n </div>\n ))}\n </>\n ) : (\n renderRow?.(item, i)\n )}\n </VirtualRow>\n );\n };\n\n const visibleRows: React.ReactNode[] = [];\n for (let i = startIndex; i <= endIndex; i++) visibleRows.push(renderRowAt(i));\n\n // Keep the row being touch-dragged mounted even if it scrolls out of the\n // window. Touch events are dispatched to the element under the finger at\n // touchstart; if that row unmounts, the browser stops delivering touchmove\n // and the drag freezes. Pinning its DOM node keeps the gesture alive.\n const draggedIndex = drag.draggingKey != null ? keys.indexOf(drag.draggingKey) : -1;\n if (draggedIndex >= 0 && (draggedIndex < startIndex || draggedIndex > endIndex)) {\n visibleRows.push(renderRowAt(draggedIndex));\n }\n\n // Same reason, one step further: the row being used holds the focus, and\n // unmounting it would drop that focus to the document body mid-scroll.\n if (nav.enteredIndex >= 0 && (nav.enteredIndex < startIndex || nav.enteredIndex > endIndex)) {\n visibleRows.push(renderRowAt(nav.enteredIndex));\n }\n\n return (\n <div\n {...rest}\n {...nav.containerProps}\n ref={rootRef}\n className={cx(\n styles.virtualList,\n drag.draggingKey != null && styles.virtualListReordering,\n columnResize.isResizing && styles.virtualListResizing,\n className,\n classNames?.root,\n )}\n style={{ height, ...widthVars, ...style, ...slotStyles?.root }}\n onScroll={win.handleScroll}\n role={ariaRoles?.container ?? (hasColumns ? 'grid' : 'list')}\n aria-rowcount={hasColumns ? rows.length + 1 : undefined}\n // Only a composite role may point at an active descendant, and the default\n // `list` is not one. In list mode, pass `ariaRoles` (e.g. listbox/option)\n // to have the active row announced.\n aria-activedescendant={\n nav.activeIndex >= 0 && (ariaRoles?.container ?? (hasColumns ? 'grid' : 'list')) !== 'list'\n ? rowDomId(nav.activeIndex)\n : undefined\n }\n >\n {hasColumns && (\n <VirtualListHeader<T>\n headerRef={headerRef}\n columns={columns!}\n cols={cols}\n resize={columnResize}\n sort={effectiveSort}\n onSort={handleHeaderSort}\n multiSelect={multiSelect}\n allSelected={selection.allSelected}\n someSelected={selection.someSelected}\n onSelectAll={selection.handleSelectAll}\n labels={text}\n classNames={classNames}\n styles={slotStyles}\n />\n )}\n {isLoading ? (\n <div className={styles.virtualListLoadingFull}>\n <SpinnerLoading className={styles.virtualListSpinner} />\n </div>\n ) : (\n <div\n className={cx(styles.virtualListBody, classNames?.body)}\n style={{ height: totalHeight, ...slotStyles?.body }}\n >\n {visibleRows}\n </div>\n )}\n {win.showLoadMoreSpinner && (\n <div\n className={cx(styles.virtualListLoadingIndicator, classNames?.loadingIndicator)}\n style={slotStyles?.loadingIndicator}\n >\n <SpinnerLoading className={styles.virtualListSpinner} />\n </div>\n )}\n </div>\n );\n}\n\n// forwardRef erases the generic, so cast back to a generic-preserving signature.\nconst VirtualList = React.forwardRef(VirtualListInner) as <T>(\n props: VirtualListProps<T> & { ref?: React.Ref<VirtualListHandle> },\n) => React.ReactElement | null;\n\nexport default VirtualList;\n"],"mappings":"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"}
1
+ {"version":3,"file":"virtualList.mjs","names":[],"sources":["../../../../package/common/virtualList/virtualList.tsx"],"sourcesContent":["import React, { useMemo, useCallback, useEffect, useId, useImperativeHandle, useRef } from 'react';\nimport cx from 'classnames';\nimport styles from './virtualList.module.pcss';\nimport SpinnerLoading from '../loading/spinnerLoading';\nimport Checkbox from '../checkbox';\nimport VirtualRow from './virtualRow';\nimport VirtualListHeader from './virtualListHeader';\nimport { useVirtualWindow } from './useVirtualWindow';\nimport { useSelection } from './useSelection';\nimport { useColumns } from './useColumns';\nimport { useRowDrag } from './useRowDrag';\nimport { useSorting } from './useSorting';\nimport { useColumnResize } from './useColumnResize';\nimport { useRowNavigation } from './useRowNavigation';\nimport { useLabels } from '../configProvider';\nimport type { VirtualListColumn, VirtualListLabels, VirtualListProps } from './virtualList.types';\n\nconst DEFAULT_LABELS: Required<VirtualListLabels> = {\n selectRow: 'Select row',\n selectAllRows: 'Select all rows',\n toggleColumns: 'Toggle column visibility',\n columnsHidden: (count) => `${count} columns hidden`,\n resetColumnWidths: 'Reset column widths',\n};\n\n// Pure helpers live in ./virtualList.utils; re-exported here so existing\n// imports (and unit tests) keep working against the component entry point.\nexport {\n buildOffsets,\n findStartIndex,\n getVisibleRange,\n resolveReorderTarget,\n resolveTreeDropTarget,\n lastDescendantIndex,\n buildColumnTemplate,\n compareSortValues,\n isColumnSortable,\n isEmptySortValue,\n nextSort,\n sortItems,\n} from './virtualList.utils';\n\n// ─── Orchestrator ─────────────────────────────────────────────────────────────\n// VirtualListInner wires the hooks together and renders the two pieces of\n// markup. Each concern lives in its own module:\n// useSorting — table mode: header sort state, and the sorted row order\n// useVirtualWindow — generic scroll / measurement / windowing (all modes)\n// useColumnResize — table mode: user column widths, and the drag that sets them\n// useSelection — multi-row selection\n// useColumns — table mode: columns, visibility, persistence, fit widths\n// useRowDrag — reorder + tree drag-and-drop (mouse + touch)\n// useRowNavigation — arrow-key navigation over the rows\n// virtualListHeader — the header row: sorting, resizing, the column menu\n// virtualRow — one positioned row, with its drag wiring\n//\n// The hook order is not free: useColumnResize decides whether the layout is\n// frozen, which useColumns needs to build the grid template.\n\nfunction VirtualList<T>({\n ref,\n items,\n renderRow,\n ariaRoles,\n columns,\n height = '100%',\n estimatedRowHeight = 40,\n overscan = 3,\n rowGap = 0,\n rowPadding,\n selectedKey,\n getItemKey,\n onRowClick,\n keyboardNavigation = true,\n visibleColumnKeys,\n onVisibleColumnsChange,\n persistColumnsKey,\n resizableColumns = false,\n columnWidths,\n onColumnWidthsChange,\n labels,\n sort,\n defaultSort,\n onSortChange,\n showColumnToggle,\n onLoadMore,\n loadMoreThreshold = 100,\n isLoading = false,\n multiSelect = false,\n selectedKeys,\n onSelectionChange,\n reorderable = false,\n onReorder,\n longPressDelay = 400,\n treeReorder = false,\n getItemDepth,\n isGroup,\n onTreeDrop,\n treeIndentPx = 24,\n dragHandle = false,\n showDivider = true,\n rowHover = true,\n className,\n style,\n classNames,\n styles: slotStyles,\n ...rest\n}: VirtualListProps<T>) {\n const text = useLabels('VirtualList', labels, DEFAULT_LABELS);\n const { rows, effectiveSort, isSorted, handleHeaderSort } = useSorting<T>({\n items,\n columns,\n sort,\n defaultSort,\n onSortChange,\n });\n\n const getKey = useCallback(\n (item: T, index: number): string | number => (getItemKey ? getItemKey(item, index) : index),\n [getItemKey],\n );\n const keys = useMemo(() => rows.map((item, i) => getKey(item, i)), [rows, getKey]);\n const depths = useMemo(\n () => (getItemDepth ? rows.map((item, i) => getItemDepth(item, i)) : []),\n [rows, getItemDepth],\n );\n const isGroupAt = useCallback((i: number) => (isGroup ? isGroup(rows[i], i) : false), [isGroup, rows]);\n\n const win = useVirtualWindow<T>({\n items: rows,\n keys,\n getItemKey,\n estimatedRowHeight,\n rowGap,\n overscan,\n onLoadMore,\n loadMoreThreshold,\n isLoading,\n });\n const { rootRef, headerRef, rowObserver, keysRef, offsets, totalHeight, startIndex, endIndex } = win;\n\n // Filled from `cols` below: the resize hook only reads the visible set when a\n // handle is actually used, which is what lets it run before the hook that\n // derives it.\n const visibleColumnsRef = useRef<VirtualListColumn<T>[]>([]);\n const columnResize = useColumnResize<T>({\n columns,\n visibleColumnsRef,\n resizableColumns,\n columnWidths,\n onColumnWidthsChange,\n persistColumnsKey,\n rootRef,\n });\n\n const selection = useSelection<T>({ items: rows, getKey, multiSelect, selectedKeys, onSelectionChange });\n const { effectiveSelectedKeys } = selection;\n\n const cols = useColumns<T>({\n columns,\n items: rows,\n multiSelect,\n visibleColumnKeys,\n onVisibleColumnsChange,\n persistColumnsKey,\n showColumnToggle,\n userWidths: columnResize.widths,\n isFrozen: columnResize.isFrozen,\n rootRef,\n startIndex,\n endIndex,\n containerHeight: win.containerHeight,\n containerWidth: win.containerWidth,\n });\n // The rest of `cols` is the header's business and goes there whole.\n const { hasColumns, visibleColumns, columnTemplate, widthVars, shouldShowToggle, recalculateColumns } = cols;\n visibleColumnsRef.current = visibleColumns;\n\n // Compose the forwarded handle from the hooks that own each piece: scroll\n // methods from the windowing engine, column controls from the column hooks.\n useImperativeHandle(ref, () => ({ ...win.scrollApi, recalculateColumns, resetColumnWidths: columnResize.reset }), [\n win.scrollApi,\n recalculateColumns,\n columnResize.reset,\n ]);\n\n // Dragging a row to position N is meaningless while the list decides the\n // order: the drop would be undone by the next sort pass.\n const dragBlockedBySort = isSorted && (reorderable || treeReorder);\n useEffect(() => {\n if (dragBlockedBySort)\n console.warn('VirtualList: row reordering is disabled while the list is sorted. Clear the sort to drag rows.');\n }, [dragBlockedBySort]);\n\n const drag = useRowDrag({\n reorderable: reorderable && !isSorted,\n treeReorder: treeReorder && !isSorted,\n onReorder,\n onTreeDrop,\n longPressDelay,\n dragHandle,\n treeIndentPx,\n keys,\n depths,\n isGroupAt,\n rootRef,\n keysRef,\n });\n\n const listId = useId();\n const rowDomId = (index: number) => `${listId}-row-${index}`;\n const nav = useRowNavigation({\n enabled: keyboardNavigation,\n rowCount: rows.length,\n offsets,\n rootRef,\n headerRef,\n scrollToIndex: win.scrollApi.scrollToIndex,\n initialIndex: selectedKey != null ? Math.max(0, keys.indexOf(selectedKey)) : 0,\n multiSelect,\n onActivate: onRowClick && ((index: number) => onRowClick(rows[index], index)),\n onToggleSelect: (index) => selection.handleRowSelect(keys[index]),\n });\n\n const rowPaddingValue = typeof rowPadding === 'number' ? `${rowPadding}px` : rowPadding;\n\n const renderRowAt = (i: number) => {\n const item = rows[i];\n const key = getKey(item, i);\n const isSelected = (selectedKey != null && key === selectedKey) || effectiveSelectedKeys.has(key);\n const dragProps = drag.getRowDragProps(i, key);\n\n return (\n <VirtualRow\n key={key}\n id={rowDomId(i)}\n index={i}\n top={offsets[i]}\n padding={rowPaddingValue}\n columnTemplate={columnTemplate}\n isSelected={isSelected}\n isActive={i === nav.activeIndex}\n manageTabStops={keyboardNavigation}\n isEntered={i === nav.enteredIndex}\n activeClassName={classNames?.activeRow}\n activeStyle={slotStyles?.activeRow}\n showDivider={showDivider}\n hover={rowHover}\n onClick={() => {\n if (drag.consumeSuppressedClick()) return;\n // Keep the arrows where the pointer last was.\n nav.setActiveIndex(i);\n onRowClick?.(item, i);\n }}\n observer={rowObserver}\n ariaRowIndex={hasColumns ? i + 2 : undefined}\n ariaPosInSet={hasColumns ? undefined : i + 1}\n ariaSetSize={hasColumns ? undefined : rows.length}\n rowRole={ariaRoles?.row ?? (hasColumns ? 'row' : 'listitem')}\n reserveToggleGutter={shouldShowToggle}\n {...dragProps}\n dropIndicatorClassName={classNames?.dropIndicator}\n dropIndicatorStyle={slotStyles?.dropIndicator}\n rowClassName={classNames?.row}\n rowStyle={slotStyles?.row}\n >\n {hasColumns ? (\n <>\n {multiSelect && (\n <div\n className={cx(styles.virtualListSelectCell, classNames?.selectCell)}\n style={slotStyles?.selectCell}\n role='gridcell'\n onClick={(e) => e.stopPropagation()}\n >\n <Checkbox\n selected={effectiveSelectedKeys.has(key)}\n onToggle={() => selection.handleRowSelect(key)}\n aria-label={text.selectRow}\n // One tab stop per rendered row, changing as the list scrolls,\n // would strand the focus the moment a row unmounts. Space on\n // the active row is the keyboard path instead.\n tabIndex={-1}\n />\n </div>\n )}\n {visibleColumns.map((col) => (\n <div\n key={col.key}\n className={cx(styles.virtualListCell, classNames?.cell)}\n style={slotStyles?.cell}\n role='gridcell'\n data-col-key={col.key}\n data-fit-key={col.width.type === 'fit' ? col.key : undefined}\n >\n {col.renderCell(item, i)}\n </div>\n ))}\n </>\n ) : (\n renderRow?.(item, i)\n )}\n </VirtualRow>\n );\n };\n\n const visibleRows: React.ReactNode[] = [];\n for (let i = startIndex; i <= endIndex; i++) visibleRows.push(renderRowAt(i));\n\n // Keep the row being touch-dragged mounted even if it scrolls out of the\n // window. Touch events are dispatched to the element under the finger at\n // touchstart; if that row unmounts, the browser stops delivering touchmove\n // and the drag freezes. Pinning its DOM node keeps the gesture alive.\n const draggedIndex = drag.draggingKey != null ? keys.indexOf(drag.draggingKey) : -1;\n if (draggedIndex >= 0 && (draggedIndex < startIndex || draggedIndex > endIndex)) {\n visibleRows.push(renderRowAt(draggedIndex));\n }\n\n // Same reason, one step further: the row being used holds the focus, and\n // unmounting it would drop that focus to the document body mid-scroll.\n if (nav.enteredIndex >= 0 && (nav.enteredIndex < startIndex || nav.enteredIndex > endIndex)) {\n visibleRows.push(renderRowAt(nav.enteredIndex));\n }\n\n return (\n <div\n {...rest}\n {...nav.containerProps}\n ref={rootRef}\n className={cx(\n styles.virtualList,\n drag.draggingKey != null && styles.virtualListReordering,\n columnResize.isResizing && styles.virtualListResizing,\n className,\n classNames?.root,\n )}\n style={{ height, ...widthVars, ...style, ...slotStyles?.root }}\n onScroll={win.handleScroll}\n role={ariaRoles?.container ?? (hasColumns ? 'grid' : 'list')}\n aria-rowcount={hasColumns ? rows.length + 1 : undefined}\n // Only a composite role may point at an active descendant, and the default\n // `list` is not one. In list mode, pass `ariaRoles` (e.g. listbox/option)\n // to have the active row announced.\n aria-activedescendant={\n nav.activeIndex >= 0 && (ariaRoles?.container ?? (hasColumns ? 'grid' : 'list')) !== 'list'\n ? rowDomId(nav.activeIndex)\n : undefined\n }\n >\n {hasColumns && (\n <VirtualListHeader<T>\n headerRef={headerRef}\n columns={columns!}\n cols={cols}\n resize={columnResize}\n sort={effectiveSort}\n onSort={handleHeaderSort}\n multiSelect={multiSelect}\n allSelected={selection.allSelected}\n someSelected={selection.someSelected}\n onSelectAll={selection.handleSelectAll}\n labels={text}\n classNames={classNames}\n styles={slotStyles}\n />\n )}\n {isLoading ? (\n <div className={styles.virtualListLoadingFull}>\n <SpinnerLoading className={styles.virtualListSpinner} />\n </div>\n ) : (\n <div\n className={cx(styles.virtualListBody, classNames?.body)}\n style={{ height: totalHeight, ...slotStyles?.body }}\n >\n {visibleRows}\n </div>\n )}\n {win.showLoadMoreSpinner && (\n <div\n className={cx(styles.virtualListLoadingIndicator, classNames?.loadingIndicator)}\n style={slotStyles?.loadingIndicator}\n >\n <SpinnerLoading className={styles.virtualListSpinner} />\n </div>\n )}\n </div>\n );\n}\n\nexport default VirtualList;\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- var e=`virtualList_qBPNc`,t=`virtualList-drag-clone_artnC`,n=`virtualList-header_0Ellb`,r=`virtualList-header-cell_c8NGV`,i=`virtualList-header-resize_cbYFc`,a=`virtualList-header-sort_Cdpe3`,o=`virtualList-header-sort-label_6MaZ3`,s=`virtualList-header-sort-icon_Z-Nrd`,c=`virtualList-header-sort-icon-active_g7qrb`,l=`virtualList-header-toggle_pYFxD`,u=`virtualList-toggle-panel_Uksmk`,d=`virtualList-toggle-wrapper_JP32M`,f=`virtualList-toggle-popover_gbpd7`,p=`virtualList-toggle-item_5gu5d`,m=`virtualList-toggle-reset_3UANJ`,h=`virtualList-column-chip_nOqr6`,g=`virtualList-select-cell_s9kAy`,_=`virtualList-body_k-fRr`,v=`virtualList-row-active_H5r5-`,y=`virtualList-resizing_28Mn4`,b=`virtualList-row_TTY50`,x=`virtualList-row-no-divider_Ct0gV`,S=`virtualList-row-no-hover_2d3mH`,C=`virtualList-row-selected_hwEN-`,w=`virtualList-row-draggable_I86ha`,T=`virtualList-row-dragging_6T5tQ`,E=`virtualList-row-drop-inside_Uhi9n`,D=`virtualList-drop-line_EM-g4`,O=`virtualList-drop-line-before_n-0iZ`,k=`virtualList-drop-line-after_2dld-`,A=`virtualList-reordering_Rt9E3`,j=`virtualList-cell_H0zBv`,M=`virtualList-loading-full_wzZNM`,N=`virtualList-loading-indicator_EJced`,P=`virtualList-spinner_apClW`,F={virtualList:e,"virtualList-drag-clone":`virtualList-drag-clone_artnC`,virtualListDragClone:t,"virtualList-header":`virtualList-header_0Ellb`,virtualListHeader:n,"virtualList-header-cell":`virtualList-header-cell_c8NGV`,virtualListHeaderCell:r,"virtualList-header-resize":`virtualList-header-resize_cbYFc`,virtualListHeaderResize:i,"virtualList-header-sort":`virtualList-header-sort_Cdpe3`,virtualListHeaderSort:a,"virtualList-header-sort-label":`virtualList-header-sort-label_6MaZ3`,virtualListHeaderSortLabel:o,"virtualList-header-sort-icon":`virtualList-header-sort-icon_Z-Nrd`,virtualListHeaderSortIcon:s,"virtualList-header-sort-icon-active":`virtualList-header-sort-icon-active_g7qrb`,virtualListHeaderSortIconActive:c,"virtualList-header-toggle":`virtualList-header-toggle_pYFxD`,virtualListHeaderToggle:l,"virtualList-toggle-panel":`virtualList-toggle-panel_Uksmk`,virtualListTogglePanel:u,"virtualList-toggle-wrapper":`virtualList-toggle-wrapper_JP32M`,virtualListToggleWrapper:d,"virtualList-toggle-popover":`virtualList-toggle-popover_gbpd7`,virtualListTogglePopover:f,"virtualList-toggle-item":`virtualList-toggle-item_5gu5d`,virtualListToggleItem:p,"virtualList-toggle-reset":`virtualList-toggle-reset_3UANJ`,virtualListToggleReset:m,"virtualList-column-chip":`virtualList-column-chip_nOqr6`,virtualListColumnChip:h,"virtualList-select-cell":`virtualList-select-cell_s9kAy`,virtualListSelectCell:g,"virtualList-body":`virtualList-body_k-fRr`,virtualListBody:_,"virtualList-row-active":`virtualList-row-active_H5r5-`,virtualListRowActive:v,"virtualList-resizing":`virtualList-resizing_28Mn4`,virtualListResizing:y,"virtualList-row":`virtualList-row_TTY50`,virtualListRow:b,"virtualList-row-no-divider":`virtualList-row-no-divider_Ct0gV`,virtualListRowNoDivider:x,"virtualList-row-no-hover":`virtualList-row-no-hover_2d3mH`,virtualListRowNoHover:S,"virtualList-row-selected":`virtualList-row-selected_hwEN-`,virtualListRowSelected:C,"virtualList-row-draggable":`virtualList-row-draggable_I86ha`,virtualListRowDraggable:w,"virtualList-row-dragging":`virtualList-row-dragging_6T5tQ`,virtualListRowDragging:T,"virtualList-row-drop-inside":`virtualList-row-drop-inside_Uhi9n`,virtualListRowDropInside:E,"virtualList-drop-line":`virtualList-drop-line_EM-g4`,virtualListDropLine:D,"virtualList-drop-line-before":`virtualList-drop-line-before_n-0iZ`,virtualListDropLineBefore:O,"virtualList-drop-line-after":`virtualList-drop-line-after_2dld-`,virtualListDropLineAfter:k,"virtualList-reordering":`virtualList-reordering_Rt9E3`,virtualListReordering:A,"virtualList-cell":`virtualList-cell_H0zBv`,virtualListCell:j,"virtualList-loading-full":`virtualList-loading-full_wzZNM`,virtualListLoadingFull:M,"virtualList-loading-indicator":`virtualList-loading-indicator_EJced`,virtualListLoadingIndicator:N,"virtualList-spinner":`virtualList-spinner_apClW`,virtualListSpinner:P};export{F as default,e as virtualList,_ as virtualListBody,j as virtualListCell,h as virtualListColumnChip,t as virtualListDragClone,D as virtualListDropLine,k as virtualListDropLineAfter,O as virtualListDropLineBefore,n as virtualListHeader,r as virtualListHeaderCell,i as virtualListHeaderResize,a as virtualListHeaderSort,s as virtualListHeaderSortIcon,c as virtualListHeaderSortIconActive,o as virtualListHeaderSortLabel,l as virtualListHeaderToggle,M as virtualListLoadingFull,N as virtualListLoadingIndicator,A as virtualListReordering,y as virtualListResizing,b as virtualListRow,v as virtualListRowActive,w as virtualListRowDraggable,T as virtualListRowDragging,E as virtualListRowDropInside,x as virtualListRowNoDivider,S as virtualListRowNoHover,C as virtualListRowSelected,g as virtualListSelectCell,P as virtualListSpinner,p as virtualListToggleItem,u as virtualListTogglePanel,f as virtualListTogglePopover,m as virtualListToggleReset,d as virtualListToggleWrapper};
1
+ "use client";var e=`virtualList_qBPNc`,t=`virtualList-drag-clone_artnC`,n=`virtualList-header_0Ellb`,r=`virtualList-header-cell_c8NGV`,i=`virtualList-header-resize_cbYFc`,a=`virtualList-header-sort_Cdpe3`,o=`virtualList-header-sort-label_6MaZ3`,s=`virtualList-header-sort-icon_Z-Nrd`,c=`virtualList-header-sort-icon-active_g7qrb`,l=`virtualList-header-toggle_pYFxD`,u=`virtualList-toggle-panel_Uksmk`,d=`virtualList-toggle-wrapper_JP32M`,f=`virtualList-toggle-popover_gbpd7`,p=`virtualList-toggle-item_5gu5d`,m=`virtualList-toggle-reset_3UANJ`,h=`virtualList-column-chip_nOqr6`,g=`virtualList-select-cell_s9kAy`,_=`virtualList-body_k-fRr`,v=`virtualList-row-active_H5r5-`,y=`virtualList-resizing_28Mn4`,b=`virtualList-row_TTY50`,x=`virtualList-row-no-divider_Ct0gV`,S=`virtualList-row-no-hover_2d3mH`,C=`virtualList-row-selected_hwEN-`,w=`virtualList-row-draggable_I86ha`,T=`virtualList-row-dragging_6T5tQ`,E=`virtualList-row-drop-inside_Uhi9n`,D=`virtualList-drop-line_EM-g4`,O=`virtualList-drop-line-before_n-0iZ`,k=`virtualList-drop-line-after_2dld-`,A=`virtualList-reordering_Rt9E3`,j=`virtualList-cell_H0zBv`,M=`virtualList-loading-full_wzZNM`,N=`virtualList-loading-indicator_EJced`,P=`virtualList-spinner_apClW`,F={virtualList:e,"virtualList-drag-clone":`virtualList-drag-clone_artnC`,virtualListDragClone:t,"virtualList-header":`virtualList-header_0Ellb`,virtualListHeader:n,"virtualList-header-cell":`virtualList-header-cell_c8NGV`,virtualListHeaderCell:r,"virtualList-header-resize":`virtualList-header-resize_cbYFc`,virtualListHeaderResize:i,"virtualList-header-sort":`virtualList-header-sort_Cdpe3`,virtualListHeaderSort:a,"virtualList-header-sort-label":`virtualList-header-sort-label_6MaZ3`,virtualListHeaderSortLabel:o,"virtualList-header-sort-icon":`virtualList-header-sort-icon_Z-Nrd`,virtualListHeaderSortIcon:s,"virtualList-header-sort-icon-active":`virtualList-header-sort-icon-active_g7qrb`,virtualListHeaderSortIconActive:c,"virtualList-header-toggle":`virtualList-header-toggle_pYFxD`,virtualListHeaderToggle:l,"virtualList-toggle-panel":`virtualList-toggle-panel_Uksmk`,virtualListTogglePanel:u,"virtualList-toggle-wrapper":`virtualList-toggle-wrapper_JP32M`,virtualListToggleWrapper:d,"virtualList-toggle-popover":`virtualList-toggle-popover_gbpd7`,virtualListTogglePopover:f,"virtualList-toggle-item":`virtualList-toggle-item_5gu5d`,virtualListToggleItem:p,"virtualList-toggle-reset":`virtualList-toggle-reset_3UANJ`,virtualListToggleReset:m,"virtualList-column-chip":`virtualList-column-chip_nOqr6`,virtualListColumnChip:h,"virtualList-select-cell":`virtualList-select-cell_s9kAy`,virtualListSelectCell:g,"virtualList-body":`virtualList-body_k-fRr`,virtualListBody:_,"virtualList-row-active":`virtualList-row-active_H5r5-`,virtualListRowActive:v,"virtualList-resizing":`virtualList-resizing_28Mn4`,virtualListResizing:y,"virtualList-row":`virtualList-row_TTY50`,virtualListRow:b,"virtualList-row-no-divider":`virtualList-row-no-divider_Ct0gV`,virtualListRowNoDivider:x,"virtualList-row-no-hover":`virtualList-row-no-hover_2d3mH`,virtualListRowNoHover:S,"virtualList-row-selected":`virtualList-row-selected_hwEN-`,virtualListRowSelected:C,"virtualList-row-draggable":`virtualList-row-draggable_I86ha`,virtualListRowDraggable:w,"virtualList-row-dragging":`virtualList-row-dragging_6T5tQ`,virtualListRowDragging:T,"virtualList-row-drop-inside":`virtualList-row-drop-inside_Uhi9n`,virtualListRowDropInside:E,"virtualList-drop-line":`virtualList-drop-line_EM-g4`,virtualListDropLine:D,"virtualList-drop-line-before":`virtualList-drop-line-before_n-0iZ`,virtualListDropLineBefore:O,"virtualList-drop-line-after":`virtualList-drop-line-after_2dld-`,virtualListDropLineAfter:k,"virtualList-reordering":`virtualList-reordering_Rt9E3`,virtualListReordering:A,"virtualList-cell":`virtualList-cell_H0zBv`,virtualListCell:j,"virtualList-loading-full":`virtualList-loading-full_wzZNM`,virtualListLoadingFull:M,"virtualList-loading-indicator":`virtualList-loading-indicator_EJced`,virtualListLoadingIndicator:N,"virtualList-spinner":`virtualList-spinner_apClW`,virtualListSpinner:P};export{F as default,e as virtualList,_ as virtualListBody,j as virtualListCell,h as virtualListColumnChip,t as virtualListDragClone,D as virtualListDropLine,k as virtualListDropLineAfter,O as virtualListDropLineBefore,n as virtualListHeader,r as virtualListHeaderCell,i as virtualListHeaderResize,a as virtualListHeaderSort,s as virtualListHeaderSortIcon,c as virtualListHeaderSortIconActive,o as virtualListHeaderSortLabel,l as virtualListHeaderToggle,M as virtualListLoadingFull,N as virtualListLoadingIndicator,A as virtualListReordering,y as virtualListResizing,b as virtualListRow,v as virtualListRowActive,w as virtualListRowDraggable,T as virtualListRowDragging,E as virtualListRowDropInside,x as virtualListRowNoDivider,S as virtualListRowNoHover,C as virtualListRowSelected,g as virtualListSelectCell,P as virtualListSpinner,p as virtualListToggleItem,u as virtualListTogglePanel,f as virtualListTogglePopover,m as virtualListToggleReset,d as virtualListToggleWrapper};
2
2
  //# sourceMappingURL=virtualList.module.mjs.map