@danske/sapphire-react-lab 0.106.3 → 0.107.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 (327) hide show
  1. package/build/cjs/index.js +2557 -64
  2. package/build/cjs/index.js.map +1 -1
  3. package/build/esm/core/src/BreakpointProvider/useBreakpointContext.js +11 -0
  4. package/build/esm/core/src/BreakpointProvider/useBreakpointContext.js.map +1 -0
  5. package/build/esm/core/src/Flex/src/Flex.js +64 -0
  6. package/build/esm/core/src/Flex/src/Flex.js.map +1 -0
  7. package/build/esm/core/src/Grid/src/Grid.js +55 -0
  8. package/build/esm/core/src/Grid/src/Grid.js.map +1 -0
  9. package/build/esm/core/src/Icon/src/Icon.js +37 -0
  10. package/build/esm/core/src/Icon/src/Icon.js.map +1 -0
  11. package/build/esm/core/src/ListBox/i18n/da-DK.json.js +7 -0
  12. package/build/esm/core/src/ListBox/i18n/de-DE.json.js +7 -0
  13. package/build/esm/core/src/ListBox/i18n/en-US.json.js +7 -0
  14. package/build/esm/core/src/ListBox/i18n/fi-FI.json.js +7 -0
  15. package/build/esm/core/src/ListBox/i18n/index.js.map +1 -0
  16. package/build/esm/core/src/ListBox/i18n/nb-NO.json.js +7 -0
  17. package/build/esm/core/src/ListBox/i18n/pl-PL.json.js +7 -0
  18. package/build/esm/core/src/ListBox/i18n/sv-SE.json.js +7 -0
  19. package/build/esm/core/src/ListBox/src/ListBoxContext.js +8 -0
  20. package/build/esm/core/src/ListBox/src/ListBoxContext.js.map +1 -0
  21. package/build/esm/core/src/ListBox/src/ListBoxEmptyState.js +26 -0
  22. package/build/esm/core/src/ListBox/src/ListBoxEmptyState.js.map +1 -0
  23. package/build/esm/core/src/ListBox/src/ListBoxItemSkeleton.js +37 -0
  24. package/build/esm/core/src/ListBox/src/ListBoxItemSkeleton.js.map +1 -0
  25. package/build/esm/core/src/ListBox/src/ListBoxOption.js +105 -0
  26. package/build/esm/core/src/ListBox/src/ListBoxOption.js.map +1 -0
  27. package/build/esm/core/src/ListBox/src/ListBoxSection.js +86 -0
  28. package/build/esm/core/src/ListBox/src/ListBoxSection.js.map +1 -0
  29. package/build/esm/core/src/ListBox/src/StatelessListBox.js +162 -0
  30. package/build/esm/core/src/ListBox/src/StatelessListBox.js.map +1 -0
  31. package/build/esm/core/src/Pagination/src/usePaginationContext.js +8 -0
  32. package/build/esm/core/src/Pagination/src/usePaginationContext.js.map +1 -0
  33. package/build/esm/core/src/Popover/src/Popover.js +62 -0
  34. package/build/esm/core/src/Popover/src/Popover.js.map +1 -0
  35. package/build/esm/core/src/Radio/src/RadioBox.js +58 -0
  36. package/build/esm/core/src/Radio/src/RadioBox.js.map +1 -0
  37. package/build/esm/core/src/Separator/src/Separator.js +32 -0
  38. package/build/esm/core/src/Separator/src/Separator.js.map +1 -0
  39. package/build/esm/core/src/Skeleton/src/Skeleton.js +19 -0
  40. package/build/esm/core/src/Skeleton/src/Skeleton.js.map +1 -0
  41. package/build/esm/core/src/Skeleton/src/SkeletonCircle.js +39 -0
  42. package/build/esm/core/src/Skeleton/src/SkeletonCircle.js.map +1 -0
  43. package/build/esm/core/src/Skeleton/src/SkeletonText.js +59 -0
  44. package/build/esm/core/src/Skeleton/src/SkeletonText.js.map +1 -0
  45. package/build/esm/core/src/Skeleton/src/animation.js +4 -0
  46. package/build/esm/core/src/Skeleton/src/animation.js.map +1 -0
  47. package/build/esm/core/src/ThemeRoot/src/ThemeRoot.js +42 -0
  48. package/build/esm/core/src/ThemeRoot/src/ThemeRoot.js.map +1 -0
  49. package/build/esm/core/src/View/src/View.js +60 -0
  50. package/build/esm/core/src/View/src/View.js.map +1 -0
  51. package/build/esm/core/src/utils/SapphireStyleProps.js +48 -0
  52. package/build/esm/core/src/utils/SapphireStyleProps.js.map +1 -0
  53. package/build/esm/core/src/utils/useCollectionFocusProxy.js +53 -0
  54. package/build/esm/core/src/utils/useCollectionFocusProxy.js.map +1 -0
  55. package/build/esm/core/src/utils/usePreventTouchEnd.js +16 -0
  56. package/build/esm/core/src/utils/usePreventTouchEnd.js.map +1 -0
  57. package/build/esm/core/src/utils/useSapphireStyleProps.js +179 -0
  58. package/build/esm/core/src/utils/useSapphireStyleProps.js.map +1 -0
  59. package/build/esm/core/src/utils/useSapphireTextStyleProps.js +9 -0
  60. package/build/esm/core/src/utils/useSapphireTextStyleProps.js.map +1 -0
  61. package/build/esm/core/src/utils/useScrollCheck.js +38 -0
  62. package/build/esm/core/src/utils/useScrollCheck.js.map +1 -0
  63. package/build/esm/core/src/utils/useThemeCheck.js +14 -0
  64. package/build/esm/core/src/utils/useThemeCheck.js.map +1 -0
  65. package/build/esm/core/src/utils/virtualization/ListWithLoadingStateLayout.js +158 -0
  66. package/build/esm/core/src/utils/virtualization/ListWithLoadingStateLayout.js.map +1 -0
  67. package/build/esm/core/src/utils/virtualization/VariableWidthListLayout.js +69 -0
  68. package/build/esm/core/src/utils/virtualization/VariableWidthListLayout.js.map +1 -0
  69. package/build/esm/core/src/utils/virtualization/VirtualizerWithLoadingSkeleton.js +40 -0
  70. package/build/esm/core/src/utils/virtualization/VirtualizerWithLoadingSkeleton.js.map +1 -0
  71. package/build/esm/core/src/utils/virtualization/useListWithLoadingStateLayout.js +35 -0
  72. package/build/esm/core/src/utils/virtualization/useListWithLoadingStateLayout.js.map +1 -0
  73. package/build/esm/index.js +23 -20
  74. package/build/esm/index.js.map +1 -1
  75. package/build/esm/lab/src/Accordion/index.js.map +1 -0
  76. package/build/esm/lab/src/Accordion/src/Accordion.js.map +1 -0
  77. package/build/esm/lab/src/Accordion/src/AccordionContext.js.map +1 -0
  78. package/build/esm/lab/src/Accordion/src/AccordionHeading.js.map +1 -0
  79. package/build/esm/lab/src/Accordion/src/AccordionItem.js.map +1 -0
  80. package/build/esm/lab/src/Accordion/src/AccordionPanel.js.map +1 -0
  81. package/build/esm/lab/src/Accordion/src/utils.js.map +1 -0
  82. package/build/esm/lab/src/Alert/src/Alert.js.map +1 -0
  83. package/build/esm/lab/src/Amount/src/Amount.js.map +1 -0
  84. package/build/esm/lab/src/Amount/src/useGroupAmount.js.map +1 -0
  85. package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/da-DK.json.js +2 -2
  86. package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/de-DE.json.js +2 -2
  87. package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/en-US.json.js +2 -2
  88. package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/fi-FI.json.js +2 -2
  89. package/build/esm/lab/src/Autocomplete/i18n/index.js +20 -0
  90. package/build/esm/lab/src/Autocomplete/i18n/index.js.map +1 -0
  91. package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/nb-NO.json.js +2 -2
  92. package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/pl-PL.json.js +2 -2
  93. package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/sv-SE.json.js +2 -2
  94. package/build/esm/lab/src/Autocomplete/src/Autocomplete.js.map +1 -0
  95. package/build/esm/lab/src/Breadcrumbs/src/BreadcrumbItem.js.map +1 -0
  96. package/build/esm/lab/src/Breadcrumbs/src/BreadcrumbItemLink.js.map +1 -0
  97. package/build/esm/lab/src/Breadcrumbs/src/BreadcrumbItemStatic.js.map +1 -0
  98. package/build/esm/lab/src/Breadcrumbs/src/BreadcrumbOverflowMenu.js.map +1 -0
  99. package/build/esm/lab/src/Breadcrumbs/src/Breadcrumbs.js.map +1 -0
  100. package/build/esm/lab/src/Breadcrumbs/src/BreadcrumbsSeparator.js.map +1 -0
  101. package/build/esm/lab/src/Breadcrumbs/src/useBreadcrumbThreshold.js.map +1 -0
  102. package/build/esm/lab/src/DataGrid/index.js +9 -0
  103. package/build/esm/lab/src/DataGrid/index.js.map +1 -0
  104. package/build/esm/lab/src/DataGrid/src/DataGrid.js +463 -0
  105. package/build/esm/lab/src/DataGrid/src/DataGrid.js.map +1 -0
  106. package/build/esm/lab/src/DataGrid/src/DataGridCellContext.js +6 -0
  107. package/build/esm/lab/src/DataGrid/src/DataGridCellContext.js.map +1 -0
  108. package/build/esm/lab/src/DataGrid/src/EditableCellContent.js +125 -0
  109. package/build/esm/lab/src/DataGrid/src/EditableCellContent.js.map +1 -0
  110. package/build/esm/lab/src/DataGrid/src/createDataGridColumnHelper.js +15 -0
  111. package/build/esm/lab/src/DataGrid/src/createDataGridColumnHelper.js.map +1 -0
  112. package/build/esm/lab/src/DataGrid/src/useGridKeyboardNavigation.js +417 -0
  113. package/build/esm/lab/src/DataGrid/src/useGridKeyboardNavigation.js.map +1 -0
  114. package/build/esm/lab/src/DataGrid/src/useMeasureColumnWidths.js +55 -0
  115. package/build/esm/lab/src/DataGrid/src/useMeasureColumnWidths.js.map +1 -0
  116. package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/da-DK.json.js +2 -2
  117. package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/de-DE.json.js +2 -2
  118. package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/en-US.json.js +2 -2
  119. package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/fi-FI.json.js +2 -2
  120. package/build/esm/lab/src/FileDropzone/i18n/index.js.map +1 -0
  121. package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/nb-NO.json.js +2 -2
  122. package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/pl-PL.json.js +2 -2
  123. package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/sv-SE.json.js +2 -2
  124. package/build/esm/lab/src/FileDropzone/src/FileDropzone.js.map +1 -0
  125. package/build/esm/lab/src/FileDropzone/src/FileTrigger.js.map +1 -0
  126. package/build/esm/lab/src/FileDropzone/src/utils.js.map +1 -0
  127. package/build/esm/lab/src/Filtering/src/FilterDropdown.js.map +1 -0
  128. package/build/esm/{Filtering → lab/src/Filtering}/src/SearchableSelectFilter.js +2 -0
  129. package/build/esm/lab/src/Filtering/src/SearchableSelectFilter.js.map +1 -0
  130. package/build/esm/lab/src/Flag/src/Flag.js.map +1 -0
  131. package/build/esm/lab/src/LabeledValue/src/LabeledValue.js.map +1 -0
  132. package/build/esm/{NumberField → lab/src/NumberField}/i18n/da-DK.json.js +2 -2
  133. package/build/esm/{NumberField → lab/src/NumberField}/i18n/de-DE.json.js +2 -2
  134. package/build/esm/{NumberField → lab/src/NumberField}/i18n/en-US.json.js +2 -2
  135. package/build/esm/{NumberField → lab/src/NumberField}/i18n/fi-FI.json.js +2 -2
  136. package/build/esm/lab/src/NumberField/i18n/index.js.map +1 -0
  137. package/build/esm/{NumberField → lab/src/NumberField}/i18n/nb-NO.json.js +2 -2
  138. package/build/esm/{NumberField → lab/src/NumberField}/i18n/pl-PL.json.js +2 -2
  139. package/build/esm/{NumberField → lab/src/NumberField}/i18n/sv-SE.json.js +2 -2
  140. package/build/esm/lab/src/NumberField/src/NumberField.js.map +1 -0
  141. package/build/esm/lab/src/NumberField/src/StepperButton.js.map +1 -0
  142. package/build/esm/lab/src/NumberField/src/cursorHelpers.js.map +1 -0
  143. package/build/esm/lab/src/NumberField/src/formatHelpers.js.map +1 -0
  144. package/build/esm/lab/src/NumberField/src/keyboardHelpers.js.map +1 -0
  145. package/build/esm/lab/src/NumberField/src/useAutofillStyle.js.map +1 -0
  146. package/build/esm/lab/src/NumberField/src/useNumberFieldFormatting.js.map +1 -0
  147. package/build/esm/lab/src/NumberField/src/useSapphireNumberField.js.map +1 -0
  148. package/build/esm/lab/src/ProgressIndicator/src/ProgressIndicator.js.map +1 -0
  149. package/build/esm/lab/src/Sidebar/index.js.map +1 -0
  150. package/build/esm/lab/src/Sidebar/src/Body.js.map +1 -0
  151. package/build/esm/lab/src/Sidebar/src/ExpandableItem.js.map +1 -0
  152. package/build/esm/lab/src/Sidebar/src/Header.js.map +1 -0
  153. package/build/esm/lab/src/Sidebar/src/Item.js.map +1 -0
  154. package/build/esm/lab/src/Sidebar/src/List.js.map +1 -0
  155. package/build/esm/lab/src/Sidebar/src/Panel.js.map +1 -0
  156. package/build/esm/lab/src/Sidebar/src/ResponsiveSidebarContext.js.map +1 -0
  157. package/build/esm/lab/src/Sidebar/src/SecondarySidebarContext.js.map +1 -0
  158. package/build/esm/lab/src/Sidebar/src/Section.js.map +1 -0
  159. package/build/esm/lab/src/Sidebar/src/Sidebar.js.map +1 -0
  160. package/build/esm/lab/src/Sidebar/src/useSidebar.js.map +1 -0
  161. package/build/esm/lab/src/Slider/index.js.map +1 -0
  162. package/build/esm/lab/src/Slider/src/Slider.js.map +1 -0
  163. package/build/esm/lab/src/TagGroup/src/Tag.js.map +1 -0
  164. package/build/esm/lab/src/TagGroup/src/TagGroup.js.map +1 -0
  165. package/build/esm/lab/src/TagGroup/src/TagItem.js.map +1 -0
  166. package/build/esm/{TimeField → lab/src/TimeField}/i18n/da-DK.json.js +2 -2
  167. package/build/esm/lab/src/TimeField/i18n/da-DK.json.js.map +1 -0
  168. package/build/esm/{TimeField → lab/src/TimeField}/i18n/de-DE.json.js +2 -2
  169. package/build/esm/lab/src/TimeField/i18n/de-DE.json.js.map +1 -0
  170. package/build/esm/{TimeField → lab/src/TimeField}/i18n/en-US.json.js +2 -2
  171. package/build/esm/lab/src/TimeField/i18n/en-US.json.js.map +1 -0
  172. package/build/esm/{TimeField → lab/src/TimeField}/i18n/fi-FI.json.js +2 -2
  173. package/build/esm/lab/src/TimeField/i18n/fi-FI.json.js.map +1 -0
  174. package/build/esm/lab/src/TimeField/i18n/index.js.map +1 -0
  175. package/build/esm/{TimeField → lab/src/TimeField}/i18n/nb-NO.json.js +2 -2
  176. package/build/esm/lab/src/TimeField/i18n/nb-NO.json.js.map +1 -0
  177. package/build/esm/{TimeField → lab/src/TimeField}/i18n/pl-PL.json.js +2 -2
  178. package/build/esm/lab/src/TimeField/i18n/pl-PL.json.js.map +1 -0
  179. package/build/esm/{TimeField → lab/src/TimeField}/i18n/sv-SE.json.js +2 -2
  180. package/build/esm/lab/src/TimeField/i18n/sv-SE.json.js.map +1 -0
  181. package/build/esm/lab/src/TimeField/src/TimeField.js.map +1 -0
  182. package/build/esm/lab/src/TimeField/src/TimeFieldSegment.js.map +1 -0
  183. package/build/esm/lab/src/TruncateOverflow/src/TruncateOverflow.js +46 -0
  184. package/build/esm/lab/src/TruncateOverflow/src/TruncateOverflow.js.map +1 -0
  185. package/build/index.d.ts +551 -8
  186. package/package.json +7 -5
  187. package/build/esm/Accordion/index.js.map +0 -1
  188. package/build/esm/Accordion/src/Accordion.js.map +0 -1
  189. package/build/esm/Accordion/src/AccordionContext.js.map +0 -1
  190. package/build/esm/Accordion/src/AccordionHeading.js.map +0 -1
  191. package/build/esm/Accordion/src/AccordionItem.js.map +0 -1
  192. package/build/esm/Accordion/src/AccordionPanel.js.map +0 -1
  193. package/build/esm/Accordion/src/utils.js.map +0 -1
  194. package/build/esm/Alert/src/Alert.js.map +0 -1
  195. package/build/esm/Amount/src/Amount.js.map +0 -1
  196. package/build/esm/Amount/src/useGroupAmount.js.map +0 -1
  197. package/build/esm/Autocomplete/i18n/index.js.map +0 -1
  198. package/build/esm/Autocomplete/src/Autocomplete.js.map +0 -1
  199. package/build/esm/Breadcrumbs/src/BreadcrumbItem.js.map +0 -1
  200. package/build/esm/Breadcrumbs/src/BreadcrumbItemLink.js.map +0 -1
  201. package/build/esm/Breadcrumbs/src/BreadcrumbItemStatic.js.map +0 -1
  202. package/build/esm/Breadcrumbs/src/BreadcrumbOverflowMenu.js.map +0 -1
  203. package/build/esm/Breadcrumbs/src/Breadcrumbs.js.map +0 -1
  204. package/build/esm/Breadcrumbs/src/BreadcrumbsSeparator.js.map +0 -1
  205. package/build/esm/Breadcrumbs/src/useBreadcrumbThreshold.js.map +0 -1
  206. package/build/esm/FileDropzone/i18n/index.js.map +0 -1
  207. package/build/esm/FileDropzone/src/FileDropzone.js.map +0 -1
  208. package/build/esm/FileDropzone/src/FileTrigger.js.map +0 -1
  209. package/build/esm/FileDropzone/src/utils.js.map +0 -1
  210. package/build/esm/Filtering/src/FilterDropdown.js.map +0 -1
  211. package/build/esm/Filtering/src/SearchableSelectFilter.js.map +0 -1
  212. package/build/esm/Flag/src/Flag.js.map +0 -1
  213. package/build/esm/LabeledValue/src/LabeledValue.js.map +0 -1
  214. package/build/esm/NumberField/i18n/index.js.map +0 -1
  215. package/build/esm/NumberField/src/NumberField.js.map +0 -1
  216. package/build/esm/NumberField/src/StepperButton.js.map +0 -1
  217. package/build/esm/NumberField/src/cursorHelpers.js.map +0 -1
  218. package/build/esm/NumberField/src/formatHelpers.js.map +0 -1
  219. package/build/esm/NumberField/src/keyboardHelpers.js.map +0 -1
  220. package/build/esm/NumberField/src/useAutofillStyle.js.map +0 -1
  221. package/build/esm/NumberField/src/useNumberFieldFormatting.js.map +0 -1
  222. package/build/esm/NumberField/src/useSapphireNumberField.js.map +0 -1
  223. package/build/esm/ProgressIndicator/src/ProgressIndicator.js.map +0 -1
  224. package/build/esm/Sidebar/index.js.map +0 -1
  225. package/build/esm/Sidebar/src/Body.js.map +0 -1
  226. package/build/esm/Sidebar/src/ExpandableItem.js.map +0 -1
  227. package/build/esm/Sidebar/src/Header.js.map +0 -1
  228. package/build/esm/Sidebar/src/Item.js.map +0 -1
  229. package/build/esm/Sidebar/src/List.js.map +0 -1
  230. package/build/esm/Sidebar/src/Panel.js.map +0 -1
  231. package/build/esm/Sidebar/src/ResponsiveSidebarContext.js.map +0 -1
  232. package/build/esm/Sidebar/src/SecondarySidebarContext.js.map +0 -1
  233. package/build/esm/Sidebar/src/Section.js.map +0 -1
  234. package/build/esm/Sidebar/src/Sidebar.js.map +0 -1
  235. package/build/esm/Sidebar/src/useSidebar.js.map +0 -1
  236. package/build/esm/Slider/index.js.map +0 -1
  237. package/build/esm/Slider/src/Slider.js.map +0 -1
  238. package/build/esm/TagGroup/src/Tag.js.map +0 -1
  239. package/build/esm/TagGroup/src/TagGroup.js.map +0 -1
  240. package/build/esm/TagGroup/src/TagItem.js.map +0 -1
  241. package/build/esm/TimeField/i18n/index.js.map +0 -1
  242. package/build/esm/TimeField/src/TimeField.js.map +0 -1
  243. package/build/esm/TimeField/src/TimeFieldSegment.js.map +0 -1
  244. /package/build/esm/{TimeField → core/src/ListBox}/i18n/da-DK.json.js.map +0 -0
  245. /package/build/esm/{TimeField → core/src/ListBox}/i18n/de-DE.json.js.map +0 -0
  246. /package/build/esm/{TimeField → core/src/ListBox}/i18n/en-US.json.js.map +0 -0
  247. /package/build/esm/{TimeField → core/src/ListBox}/i18n/fi-FI.json.js.map +0 -0
  248. /package/build/esm/{TimeField → core/src/ListBox}/i18n/index.js +0 -0
  249. /package/build/esm/{TimeField → core/src/ListBox}/i18n/nb-NO.json.js.map +0 -0
  250. /package/build/esm/{TimeField → core/src/ListBox}/i18n/pl-PL.json.js.map +0 -0
  251. /package/build/esm/{TimeField → core/src/ListBox}/i18n/sv-SE.json.js.map +0 -0
  252. /package/build/esm/{Accordion → lab/src/Accordion}/index.js +0 -0
  253. /package/build/esm/{Accordion → lab/src/Accordion}/src/Accordion.js +0 -0
  254. /package/build/esm/{Accordion → lab/src/Accordion}/src/AccordionContext.js +0 -0
  255. /package/build/esm/{Accordion → lab/src/Accordion}/src/AccordionHeading.js +0 -0
  256. /package/build/esm/{Accordion → lab/src/Accordion}/src/AccordionItem.js +0 -0
  257. /package/build/esm/{Accordion → lab/src/Accordion}/src/AccordionPanel.js +0 -0
  258. /package/build/esm/{Accordion → lab/src/Accordion}/src/utils.js +0 -0
  259. /package/build/esm/{Alert → lab/src/Alert}/src/Alert.js +0 -0
  260. /package/build/esm/{Amount → lab/src/Amount}/src/Amount.js +0 -0
  261. /package/build/esm/{Amount → lab/src/Amount}/src/useGroupAmount.js +0 -0
  262. /package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/da-DK.json.js.map +0 -0
  263. /package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/de-DE.json.js.map +0 -0
  264. /package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/en-US.json.js.map +0 -0
  265. /package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/fi-FI.json.js.map +0 -0
  266. /package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/nb-NO.json.js.map +0 -0
  267. /package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/pl-PL.json.js.map +0 -0
  268. /package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/sv-SE.json.js.map +0 -0
  269. /package/build/esm/{Autocomplete → lab/src/Autocomplete}/src/Autocomplete.js +0 -0
  270. /package/build/esm/{Breadcrumbs → lab/src/Breadcrumbs}/src/BreadcrumbItem.js +0 -0
  271. /package/build/esm/{Breadcrumbs → lab/src/Breadcrumbs}/src/BreadcrumbItemLink.js +0 -0
  272. /package/build/esm/{Breadcrumbs → lab/src/Breadcrumbs}/src/BreadcrumbItemStatic.js +0 -0
  273. /package/build/esm/{Breadcrumbs → lab/src/Breadcrumbs}/src/BreadcrumbOverflowMenu.js +0 -0
  274. /package/build/esm/{Breadcrumbs → lab/src/Breadcrumbs}/src/Breadcrumbs.js +0 -0
  275. /package/build/esm/{Breadcrumbs → lab/src/Breadcrumbs}/src/BreadcrumbsSeparator.js +0 -0
  276. /package/build/esm/{Breadcrumbs → lab/src/Breadcrumbs}/src/useBreadcrumbThreshold.js +0 -0
  277. /package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/da-DK.json.js.map +0 -0
  278. /package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/de-DE.json.js.map +0 -0
  279. /package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/en-US.json.js.map +0 -0
  280. /package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/fi-FI.json.js.map +0 -0
  281. /package/build/esm/{Autocomplete → lab/src/FileDropzone}/i18n/index.js +0 -0
  282. /package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/nb-NO.json.js.map +0 -0
  283. /package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/pl-PL.json.js.map +0 -0
  284. /package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/sv-SE.json.js.map +0 -0
  285. /package/build/esm/{FileDropzone → lab/src/FileDropzone}/src/FileDropzone.js +0 -0
  286. /package/build/esm/{FileDropzone → lab/src/FileDropzone}/src/FileTrigger.js +0 -0
  287. /package/build/esm/{FileDropzone → lab/src/FileDropzone}/src/utils.js +0 -0
  288. /package/build/esm/{Filtering → lab/src/Filtering}/src/FilterDropdown.js +0 -0
  289. /package/build/esm/{Flag → lab/src/Flag}/src/Flag.js +0 -0
  290. /package/build/esm/{LabeledValue → lab/src/LabeledValue}/src/LabeledValue.js +0 -0
  291. /package/build/esm/{NumberField → lab/src/NumberField}/i18n/da-DK.json.js.map +0 -0
  292. /package/build/esm/{NumberField → lab/src/NumberField}/i18n/de-DE.json.js.map +0 -0
  293. /package/build/esm/{NumberField → lab/src/NumberField}/i18n/en-US.json.js.map +0 -0
  294. /package/build/esm/{NumberField → lab/src/NumberField}/i18n/fi-FI.json.js.map +0 -0
  295. /package/build/esm/{FileDropzone → lab/src/NumberField}/i18n/index.js +0 -0
  296. /package/build/esm/{NumberField → lab/src/NumberField}/i18n/nb-NO.json.js.map +0 -0
  297. /package/build/esm/{NumberField → lab/src/NumberField}/i18n/pl-PL.json.js.map +0 -0
  298. /package/build/esm/{NumberField → lab/src/NumberField}/i18n/sv-SE.json.js.map +0 -0
  299. /package/build/esm/{NumberField → lab/src/NumberField}/src/NumberField.js +0 -0
  300. /package/build/esm/{NumberField → lab/src/NumberField}/src/StepperButton.js +0 -0
  301. /package/build/esm/{NumberField → lab/src/NumberField}/src/cursorHelpers.js +0 -0
  302. /package/build/esm/{NumberField → lab/src/NumberField}/src/formatHelpers.js +0 -0
  303. /package/build/esm/{NumberField → lab/src/NumberField}/src/keyboardHelpers.js +0 -0
  304. /package/build/esm/{NumberField → lab/src/NumberField}/src/useAutofillStyle.js +0 -0
  305. /package/build/esm/{NumberField → lab/src/NumberField}/src/useNumberFieldFormatting.js +0 -0
  306. /package/build/esm/{NumberField → lab/src/NumberField}/src/useSapphireNumberField.js +0 -0
  307. /package/build/esm/{ProgressIndicator → lab/src/ProgressIndicator}/src/ProgressIndicator.js +0 -0
  308. /package/build/esm/{Sidebar → lab/src/Sidebar}/index.js +0 -0
  309. /package/build/esm/{Sidebar → lab/src/Sidebar}/src/Body.js +0 -0
  310. /package/build/esm/{Sidebar → lab/src/Sidebar}/src/ExpandableItem.js +0 -0
  311. /package/build/esm/{Sidebar → lab/src/Sidebar}/src/Header.js +0 -0
  312. /package/build/esm/{Sidebar → lab/src/Sidebar}/src/Item.js +0 -0
  313. /package/build/esm/{Sidebar → lab/src/Sidebar}/src/List.js +0 -0
  314. /package/build/esm/{Sidebar → lab/src/Sidebar}/src/Panel.js +0 -0
  315. /package/build/esm/{Sidebar → lab/src/Sidebar}/src/ResponsiveSidebarContext.js +0 -0
  316. /package/build/esm/{Sidebar → lab/src/Sidebar}/src/SecondarySidebarContext.js +0 -0
  317. /package/build/esm/{Sidebar → lab/src/Sidebar}/src/Section.js +0 -0
  318. /package/build/esm/{Sidebar → lab/src/Sidebar}/src/Sidebar.js +0 -0
  319. /package/build/esm/{Sidebar → lab/src/Sidebar}/src/useSidebar.js +0 -0
  320. /package/build/esm/{Slider → lab/src/Slider}/index.js +0 -0
  321. /package/build/esm/{Slider → lab/src/Slider}/src/Slider.js +0 -0
  322. /package/build/esm/{TagGroup → lab/src/TagGroup}/src/Tag.js +0 -0
  323. /package/build/esm/{TagGroup → lab/src/TagGroup}/src/TagGroup.js +0 -0
  324. /package/build/esm/{TagGroup → lab/src/TagGroup}/src/TagItem.js +0 -0
  325. /package/build/esm/{NumberField → lab/src/TimeField}/i18n/index.js +0 -0
  326. /package/build/esm/{TimeField → lab/src/TimeField}/src/TimeField.js +0 -0
  327. /package/build/esm/{TimeField → lab/src/TimeField}/src/TimeFieldSegment.js +0 -0
@@ -0,0 +1,417 @@
1
+ import { useRef, useState, useLayoutEffect, useCallback } from 'react';
2
+ import { defaultRangeExtractor } from '@tanstack/react-virtual';
3
+ import { getInteractionModality } from 'react-aria/private/interactions/useFocusVisible';
4
+
5
+ const INTERACTIVE_SELECTOR = [
6
+ "a[href]",
7
+ "button:not([disabled])",
8
+ 'input:not([disabled]):not([type="hidden"])',
9
+ "select:not([disabled])",
10
+ "textarea:not([disabled])"
11
+ ].join(", ");
12
+ const GRID_ROW_ATTR = "data-grid-row";
13
+ const DATA_INDEX_ATTR = "data-index";
14
+ function buildGrid(table) {
15
+ const grid = [];
16
+ const thead = table.querySelector("thead");
17
+ if (thead) {
18
+ thead.querySelectorAll(":scope > tr").forEach((tr) => {
19
+ const cells = rowCells(tr);
20
+ if (cells.length > 0) grid.push(cells);
21
+ });
22
+ }
23
+ const tbody = table.querySelector("tbody");
24
+ if (tbody) {
25
+ tbody.querySelectorAll(`:scope > tr[${GRID_ROW_ATTR}]`).forEach((tr) => {
26
+ const cells = rowCells(tr);
27
+ if (cells.length > 0) grid.push(cells);
28
+ });
29
+ }
30
+ return grid;
31
+ }
32
+ function rowCells(tr) {
33
+ const cells = [];
34
+ tr.querySelectorAll(":scope > th, :scope > td").forEach(
35
+ (cell) => {
36
+ cells.push({ element: cell, focusTarget: getFocusTarget(cell) });
37
+ }
38
+ );
39
+ return cells;
40
+ }
41
+ function getFocusTarget(cell) {
42
+ const interactive = cell.querySelectorAll(INTERACTIVE_SELECTOR);
43
+ return interactive.length === 1 ? interactive[0] : cell;
44
+ }
45
+ function isEditableTarget(target) {
46
+ if (target instanceof HTMLTextAreaElement) return true;
47
+ if (target instanceof HTMLSelectElement) return true;
48
+ if (target instanceof HTMLInputElement && target.type !== "checkbox" && target.type !== "radio" && target.type !== "button")
49
+ return true;
50
+ return target instanceof HTMLElement && target.isContentEditable;
51
+ }
52
+ function getDataIndexOfCell(cell) {
53
+ const tr = cell.closest("tr");
54
+ const raw = tr?.getAttribute(DATA_INDEX_ATTR);
55
+ if (raw == null) return null;
56
+ const n = parseInt(raw, 10);
57
+ return isNaN(n) ? null : n;
58
+ }
59
+ function findGridRowByDataIndex(grid, dataIndex) {
60
+ for (let r = grid.length - 1; r >= 0; r--) {
61
+ const tr = grid[r][0]?.element.closest("tr");
62
+ if (tr?.getAttribute(DATA_INDEX_ATTR) === String(dataIndex)) return r;
63
+ }
64
+ return -1;
65
+ }
66
+ function getVisiblePageSize(scrollContainer, table) {
67
+ const fallback = 7;
68
+ if (!scrollContainer) return fallback;
69
+ const containerHeight = scrollContainer.clientHeight;
70
+ if (containerHeight <= 0) return fallback;
71
+ const firstBodyRow = table.querySelector(
72
+ `tbody > tr[${GRID_ROW_ATTR}]`
73
+ );
74
+ if (!firstBodyRow) return fallback;
75
+ const rowHeight = firstBodyRow.getBoundingClientRect().height;
76
+ if (rowHeight <= 0) return fallback;
77
+ return Math.max(1, Math.floor(containerHeight / rowHeight));
78
+ }
79
+ function countHeaderRows(grid) {
80
+ let count = 0;
81
+ for (const row of grid) {
82
+ const tr = row[0]?.element.closest("tr");
83
+ if (tr?.closest("thead")) count++;
84
+ else break;
85
+ }
86
+ return count;
87
+ }
88
+ function useGridKeyboardNavigation({
89
+ tableRef,
90
+ enabled = true,
91
+ scrollContainerRef,
92
+ rowItemCount,
93
+ onScrollToRowIndex
94
+ }) {
95
+ const activeCoordsRef = useRef({ row: 0, col: 0 });
96
+ const pendingFocusRef = useRef(null);
97
+ const [focusedRowIndex, setFocusedRowIndex] = useState(null);
98
+ const syncTabIndices = () => {
99
+ const table = tableRef.current;
100
+ if (!table || !enabled) return;
101
+ const grid = buildGrid(table);
102
+ if (grid.length === 0) return;
103
+ let { row, col } = activeCoordsRef.current;
104
+ const activeEl = table.ownerDocument.activeElement;
105
+ if (activeEl && table.contains(activeEl)) {
106
+ const focusedCell = activeEl.closest?.(
107
+ "th, td"
108
+ );
109
+ if (focusedCell) {
110
+ for (let r = 0; r < grid.length; r++) {
111
+ for (let c = 0; c < grid[r].length; c++) {
112
+ if (grid[r][c].element === focusedCell) {
113
+ row = r;
114
+ col = c;
115
+ break;
116
+ }
117
+ }
118
+ }
119
+ }
120
+ }
121
+ const clampedRow = clamp(row, 0, grid.length - 1);
122
+ const clampedCol = clamp(col, 0, grid[clampedRow].length - 1);
123
+ activeCoordsRef.current = { row: clampedRow, col: clampedCol };
124
+ for (let r = 0; r < grid.length; r++) {
125
+ for (let c = 0; c < grid[r].length; c++) {
126
+ const { element, focusTarget } = grid[r][c];
127
+ const isActive = r === clampedRow && c === clampedCol;
128
+ element.setAttribute("tabindex", "-1");
129
+ element.querySelectorAll(INTERACTIVE_SELECTOR).forEach((child) => {
130
+ child.setAttribute("tabindex", "-1");
131
+ });
132
+ if (isActive) {
133
+ focusTarget.setAttribute("tabindex", "0");
134
+ }
135
+ }
136
+ }
137
+ };
138
+ useLayoutEffect(() => {
139
+ if (!enabled) return;
140
+ const table = tableRef.current;
141
+ if (!table) return;
142
+ const pending = pendingFocusRef.current;
143
+ if (pending) {
144
+ const grid = buildGrid(table);
145
+ const gridRow = findNearestGridRowByDataIndex(grid, pending.dataIndex);
146
+ if (gridRow >= 0) {
147
+ pendingFocusRef.current = null;
148
+ const col = clamp(pending.col, 0, grid[gridRow].length - 1);
149
+ activeCoordsRef.current = { row: gridRow, col };
150
+ syncTabIndices();
151
+ grid[gridRow][col].focusTarget.focus();
152
+ return;
153
+ }
154
+ }
155
+ syncTabIndices();
156
+ });
157
+ const navigateTo = (targetRow, targetCol) => {
158
+ const table = tableRef.current;
159
+ if (!table) return;
160
+ const grid = buildGrid(table);
161
+ if (grid.length === 0) return;
162
+ const row = clamp(targetRow, 0, grid.length - 1);
163
+ const col = clamp(targetCol, 0, grid[row].length - 1);
164
+ activeCoordsRef.current = { row, col };
165
+ syncTabIndices();
166
+ const cell = grid[row]?.[col];
167
+ if (cell) {
168
+ cell.focusTarget.focus({ preventScroll: true });
169
+ cell.element.scrollIntoView?.({ block: "nearest", inline: "nearest" });
170
+ }
171
+ };
172
+ const navigateToDataIndex = (dataIndex, col) => {
173
+ const table = tableRef.current;
174
+ if (!table) return;
175
+ const grid = buildGrid(table);
176
+ const gridRow = findGridRowByDataIndex(grid, dataIndex);
177
+ if (gridRow >= 0) {
178
+ const clampedCol = clamp(col, 0, grid[gridRow].length - 1);
179
+ activeCoordsRef.current = { row: gridRow, col: clampedCol };
180
+ syncTabIndices();
181
+ grid[gridRow][clampedCol].focusTarget.focus({ preventScroll: true });
182
+ grid[gridRow][clampedCol].element.scrollIntoView?.({
183
+ block: "nearest",
184
+ inline: "nearest"
185
+ });
186
+ return;
187
+ }
188
+ if (onScrollToRowIndex) {
189
+ onScrollToRowIndex(dataIndex);
190
+ pendingFocusRef.current = { dataIndex, col };
191
+ }
192
+ };
193
+ const onKeyDown = (e) => {
194
+ if (!enabled) return;
195
+ const table = tableRef.current;
196
+ if (!table) return;
197
+ if (isEditableTarget(e.target)) return;
198
+ const grid = buildGrid(table);
199
+ if (grid.length === 0) return;
200
+ const cell = e.target.closest?.(
201
+ "th, td"
202
+ );
203
+ if (!cell || !table.contains(cell)) return;
204
+ let curRow = -1;
205
+ let curCol = -1;
206
+ outer: for (let r = 0; r < grid.length; r++) {
207
+ for (let c = 0; c < grid[r].length; c++) {
208
+ if (grid[r][c].element === cell) {
209
+ curRow = r;
210
+ curCol = c;
211
+ break outer;
212
+ }
213
+ }
214
+ }
215
+ if (curRow < 0) return;
216
+ const curDataIndex = getDataIndexOfCell(cell);
217
+ const headerRows = countHeaderRows(grid);
218
+ const isBodyRow = curDataIndex != null;
219
+ const maxRow = grid.length - 1;
220
+ let targetRow = curRow;
221
+ let targetCol = curCol;
222
+ let handled = true;
223
+ switch (e.key) {
224
+ case "ArrowRight":
225
+ targetCol = Math.min(curCol + 1, grid[curRow].length - 1);
226
+ break;
227
+ case "ArrowLeft":
228
+ targetCol = Math.max(curCol - 1, 0);
229
+ break;
230
+ case "ArrowDown":
231
+ if (isBodyRow && rowItemCount != null) {
232
+ const nextDataIndex = findNextNavigableDataIndex(
233
+ grid,
234
+ curDataIndex,
235
+ 1,
236
+ rowItemCount
237
+ );
238
+ if (nextDataIndex != null) {
239
+ e.preventDefault();
240
+ navigateToDataIndex(nextDataIndex, curCol);
241
+ return;
242
+ }
243
+ } else {
244
+ targetRow = Math.min(curRow + 1, maxRow);
245
+ }
246
+ break;
247
+ case "ArrowUp":
248
+ if (isBodyRow) {
249
+ const prevDataIndex = findNextNavigableDataIndex(
250
+ grid,
251
+ curDataIndex,
252
+ -1,
253
+ rowItemCount ?? curDataIndex
254
+ );
255
+ if (prevDataIndex != null) {
256
+ e.preventDefault();
257
+ navigateToDataIndex(prevDataIndex, curCol);
258
+ return;
259
+ }
260
+ targetRow = Math.max(headerRows - 1, 0);
261
+ } else {
262
+ targetRow = Math.max(curRow - 1, 0);
263
+ }
264
+ break;
265
+ case "Home":
266
+ if (e.ctrlKey || e.metaKey) {
267
+ targetRow = 0;
268
+ targetCol = 0;
269
+ } else {
270
+ targetCol = 0;
271
+ }
272
+ break;
273
+ case "End":
274
+ if (e.ctrlKey || e.metaKey) {
275
+ targetRow = maxRow;
276
+ targetCol = grid[maxRow].length - 1;
277
+ } else {
278
+ targetCol = grid[curRow].length - 1;
279
+ }
280
+ break;
281
+ case "PageDown":
282
+ case "PageUp": {
283
+ const pageSize = getVisiblePageSize(
284
+ scrollContainerRef?.current ?? null,
285
+ table
286
+ );
287
+ const direction = e.key === "PageDown" ? 1 : -1;
288
+ if (isBodyRow && rowItemCount != null) {
289
+ let target = curDataIndex;
290
+ let stepsUsed = 0;
291
+ for (let i = 0; i < pageSize; i++) {
292
+ const next = findNextNavigableDataIndex(
293
+ grid,
294
+ target,
295
+ direction,
296
+ rowItemCount
297
+ );
298
+ if (next == null) break;
299
+ target = next;
300
+ stepsUsed++;
301
+ }
302
+ const hasRemainingSteps = stepsUsed < pageSize;
303
+ if (direction === -1 && hasRemainingSteps) {
304
+ targetRow = 0;
305
+ break;
306
+ }
307
+ if (target !== curDataIndex) {
308
+ e.preventDefault();
309
+ navigateToDataIndex(target, curCol);
310
+ return;
311
+ }
312
+ }
313
+ targetRow = clamp(curRow + direction * pageSize, 0, maxRow);
314
+ break;
315
+ }
316
+ default:
317
+ handled = false;
318
+ }
319
+ if (handled) {
320
+ e.preventDefault();
321
+ targetCol = Math.min(targetCol, grid[targetRow].length - 1);
322
+ navigateTo(targetRow, targetCol);
323
+ }
324
+ };
325
+ const onFocus = (e) => {
326
+ if (!enabled) return;
327
+ const table = tableRef.current;
328
+ if (!table) return;
329
+ const cell = e.target.closest?.(
330
+ "th, td"
331
+ );
332
+ if (!cell || !table.contains(cell)) return;
333
+ if (focusedRowIndex != null && !table.contains(e.relatedTarget) && getInteractionModality() !== "pointer") {
334
+ onScrollToRowIndex?.(focusedRowIndex, { align: "start" });
335
+ }
336
+ const grid = buildGrid(table);
337
+ for (let r = 0; r < grid.length; r++) {
338
+ for (let c = 0; c < grid[r].length; c++) {
339
+ if (grid[r][c].element === cell) {
340
+ activeCoordsRef.current = { row: r, col: c };
341
+ syncTabIndices();
342
+ const dataIndex = getDataIndexOfCell(cell);
343
+ if (dataIndex !== focusedRowIndex) {
344
+ setFocusedRowIndex(dataIndex);
345
+ }
346
+ return;
347
+ }
348
+ }
349
+ }
350
+ };
351
+ const rangeExtractor = useCallback(
352
+ (range) => {
353
+ const indices = defaultRangeExtractor(range);
354
+ if (focusedRowIndex != null && !indices.includes(focusedRowIndex)) {
355
+ indices.push(focusedRowIndex);
356
+ indices.sort((a, b) => a - b);
357
+ }
358
+ return indices;
359
+ },
360
+ [focusedRowIndex]
361
+ );
362
+ return {
363
+ gridKeyboardNavigationProps: { onKeyDown, onFocus },
364
+ rangeExtractor
365
+ };
366
+ }
367
+ function clamp(value, min, max) {
368
+ return Math.min(Math.max(value, min), max);
369
+ }
370
+ function findNextNavigableDataIndex(grid, fromDataIndex, direction, rowItemCount) {
371
+ const navigable = /* @__PURE__ */ new Set();
372
+ const nonNavigable = /* @__PURE__ */ new Set();
373
+ const table = grid[0]?.[0]?.element.closest("table");
374
+ if (table) {
375
+ const tbody = table.querySelector("tbody");
376
+ if (tbody) {
377
+ tbody.querySelectorAll(":scope > tr[data-index]").forEach((tr) => {
378
+ const idx = parseInt(tr.getAttribute(DATA_INDEX_ATTR), 10);
379
+ if (isNaN(idx)) return;
380
+ if (tr.hasAttribute(GRID_ROW_ATTR)) {
381
+ navigable.add(idx);
382
+ } else {
383
+ nonNavigable.add(idx);
384
+ }
385
+ });
386
+ }
387
+ }
388
+ let candidate = fromDataIndex + direction;
389
+ while (candidate >= 0 && candidate < rowItemCount) {
390
+ if (nonNavigable.has(candidate)) {
391
+ candidate += direction;
392
+ continue;
393
+ }
394
+ return candidate;
395
+ }
396
+ return null;
397
+ }
398
+ function findNearestGridRowByDataIndex(grid, targetDataIndex) {
399
+ let bestRow = -1;
400
+ let bestDist = Infinity;
401
+ for (let r = 0; r < grid.length; r++) {
402
+ const tr = grid[r][0]?.element.closest("tr");
403
+ const raw = tr?.getAttribute(DATA_INDEX_ATTR);
404
+ if (raw == null) continue;
405
+ const idx = parseInt(raw, 10);
406
+ if (isNaN(idx)) continue;
407
+ const dist = Math.abs(idx - targetDataIndex);
408
+ if (dist < bestDist) {
409
+ bestDist = dist;
410
+ bestRow = r;
411
+ }
412
+ }
413
+ return bestRow;
414
+ }
415
+
416
+ export { GRID_ROW_ATTR, useGridKeyboardNavigation };
417
+ //# sourceMappingURL=useGridKeyboardNavigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGridKeyboardNavigation.js","sources":["../../../../../../src/DataGrid/src/useGridKeyboardNavigation.ts"],"sourcesContent":["import {\n type RefObject,\n useCallback,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport type {\n KeyboardEvent as ReactKeyboardEvent,\n FocusEvent as ReactFocusEvent,\n} from 'react';\nimport { defaultRangeExtractor, Virtualizer } from '@tanstack/react-virtual';\nimport { getInteractionModality } from 'react-aria/private/interactions/useFocusVisible';\n\n/**\n * Selector for elements that are inherently focusable through HTML semantics —\n * used to detect interactive widgets inside grid cells.\n */\nconst INTERACTIVE_SELECTOR = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled]):not([type=\"hidden\"])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n].join(', ');\n\n/**\n * Attribute placed on `<tr>` elements in `<tbody>` to mark them as\n * navigable grid rows. Only rows carrying this attribute participate in\n * keyboard navigation.\n */\nexport const GRID_ROW_ATTR = 'data-grid-row';\n\n/** Attribute that stores the row-item index in the full (possibly virtualised) list. */\nconst DATA_INDEX_ATTR = 'data-index';\n\n// ---------------------------------------------------------------------------\n// Grid model helpers\n// ---------------------------------------------------------------------------\n\n/** @internal */\ninterface GridCell {\n /** The `<th>` or `<td>` element. */\n element: HTMLElement;\n /**\n * The element that should receive focus — either the cell itself (for\n * text-only cells) or a single interactive widget within the cell\n * (checkbox, button, link …).\n */\n focusTarget: HTMLElement;\n}\n\n/**\n * Builds a 2-D grid model from the DOM structure of an HTML `<table>`.\n *\n * - Header rows are taken from `<thead> > tr`.\n * - Body rows from `<tbody> > tr[data-grid-row]` (only navigable rows).\n */\nfunction buildGrid(table: HTMLTableElement): GridCell[][] {\n const grid: GridCell[][] = [];\n\n const thead = table.querySelector('thead');\n if (thead) {\n thead.querySelectorAll<HTMLTableRowElement>(':scope > tr').forEach((tr) => {\n const cells = rowCells(tr);\n if (cells.length > 0) grid.push(cells);\n });\n }\n\n const tbody = table.querySelector('tbody');\n if (tbody) {\n tbody\n .querySelectorAll<HTMLTableRowElement>(`:scope > tr[${GRID_ROW_ATTR}]`)\n .forEach((tr) => {\n const cells = rowCells(tr);\n if (cells.length > 0) grid.push(cells);\n });\n }\n\n return grid;\n}\n\nfunction rowCells(tr: HTMLTableRowElement): GridCell[] {\n const cells: GridCell[] = [];\n tr.querySelectorAll<HTMLElement>(':scope > th, :scope > td').forEach(\n (cell) => {\n cells.push({ element: cell, focusTarget: getFocusTarget(cell) });\n }\n );\n return cells;\n}\n\n/**\n * Determines the focus target inside a grid cell per the WAI-ARIA grid\n * pattern specification:\n *\n * - If the cell contains **exactly one** interactive widget whose operation\n * does not require arrow keys (link, button, checkbox …) → focus the widget.\n * - Otherwise → focus the cell itself.\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/grid/#gridNav_focus\n */\nfunction getFocusTarget(cell: HTMLElement): HTMLElement {\n const interactive = cell.querySelectorAll<HTMLElement>(INTERACTIVE_SELECTOR);\n return interactive.length === 1 ? interactive[0] : cell;\n}\n\n/**\n * Returns `true` when the target is an editable form control where arrow\n * keys have their own native meaning (text caret, dropdown navigation …).\n */\nfunction isEditableTarget(target: EventTarget | null): boolean {\n if (target instanceof HTMLTextAreaElement) return true;\n if (target instanceof HTMLSelectElement) return true;\n if (\n target instanceof HTMLInputElement &&\n target.type !== 'checkbox' &&\n target.type !== 'radio' &&\n target.type !== 'button'\n )\n return true;\n return target instanceof HTMLElement && target.isContentEditable;\n}\n\n/**\n * Reads the `data-index` attribute from the `<tr>` that owns a grid cell.\n * Returns `null` for header cells (which don't carry this attribute).\n */\nfunction getDataIndexOfCell(cell: HTMLElement): number | null {\n const tr = cell.closest('tr');\n const raw = tr?.getAttribute(DATA_INDEX_ATTR);\n if (raw == null) return null;\n const n = parseInt(raw, 10);\n return isNaN(n) ? null : n;\n}\n\n/**\n * Find the grid-row index in `grid` for a `<tr>` identified by its\n * `data-index` attribute value. Returns `-1` when not found.\n */\nfunction findGridRowByDataIndex(grid: GridCell[][], dataIndex: number): number {\n for (let r = grid.length - 1; r >= 0; r--) {\n const tr = grid[r][0]?.element.closest('tr');\n if (tr?.getAttribute(DATA_INDEX_ATTR) === String(dataIndex)) return r;\n }\n return -1;\n}\n\n/**\n * Compute visible page size (number of body rows that fit in the scroll\n * container) from the container height and the first visible body-row height.\n */\nfunction getVisiblePageSize(\n scrollContainer: HTMLElement | null,\n table: HTMLTableElement\n): number {\n const fallback = 7;\n if (!scrollContainer) return fallback;\n\n const containerHeight = scrollContainer.clientHeight;\n if (containerHeight <= 0) return fallback;\n\n const firstBodyRow = table.querySelector<HTMLElement>(\n `tbody > tr[${GRID_ROW_ATTR}]`\n );\n if (!firstBodyRow) return fallback;\n\n const rowHeight = firstBodyRow.getBoundingClientRect().height;\n if (rowHeight <= 0) return fallback;\n\n return Math.max(1, Math.floor(containerHeight / rowHeight));\n}\n\n/** Count header rows in the grid (rows from `<thead>`). */\nfunction countHeaderRows(grid: GridCell[][]): number {\n let count = 0;\n for (const row of grid) {\n const tr = row[0]?.element.closest('tr');\n if (tr?.closest('thead')) count++;\n else break;\n }\n return count;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport interface UseGridKeyboardNavigationOptions {\n /** Reference to the `<table>` element that represents the grid. */\n tableRef: RefObject<HTMLTableElement | null>;\n /**\n * Whether grid keyboard navigation is active.\n * @default true\n */\n enabled?: boolean;\n\n /**\n * Ref to the scrollable container. Used to compute the visible page size\n * dynamically so that PageUp/PageDown jump by exactly one screen of rows.\n *\n * When omitted a fallback page size of 7 rows is used.\n */\n scrollContainerRef?: RefObject<HTMLElement | null>;\n\n /**\n * Total number of row items in the (possibly virtualised) list.\n * Needed so PageUp/PageDown can navigate beyond the currently rendered DOM\n * rows.\n *\n * When omitted, page navigation is limited to rows present in the DOM.\n */\n rowItemCount?: number;\n\n /**\n * Scroll a row item into view by its `data-index`. Called when\n * PageUp/PageDown targets a row that is not currently in the DOM (e.g.\n * because of virtualisation). The hook will focus the row once it appears\n * on the next render.\n */\n onScrollToRowIndex?: Virtualizer<Element, Element>['scrollToIndex'];\n}\n\nexport interface UseGridKeyboardNavigationResult {\n /** Props to spread onto the grid `<table>` element. */\n gridKeyboardNavigationProps: {\n onKeyDown: (e: ReactKeyboardEvent) => void;\n onFocus: (e: ReactFocusEvent) => void;\n };\n\n /**\n * A wrapper around the virtualizer's `rangeExtractor` that ensures the currently focused row is included in\n * the extracted range, even if it would normally be excluded by the virtualizer's default range extraction logic.\n */\n rangeExtractor: typeof defaultRangeExtractor;\n}\n\n/**\n * Implements WAI-ARIA Grid Pattern keyboard navigation with roving tabindex.\n *\n * Only **one** cell in the entire grid has `tabIndex={0}` (the active cell);\n * all others have `tabIndex={-1}`. When the user tabs into the grid, focus\n * lands on the active cell. Arrow keys then move focus between cells.\n *\n * ### Supported keys (Data Grid pattern)\n *\n * | Key | Action |\n * |-----|--------|\n * | `→` | Move focus one cell to the right |\n * | `←` | Move focus one cell to the left |\n * | `↓` | Move focus one cell down |\n * | `↑` | Move focus one cell up |\n * | `Home` | First cell in the current row |\n * | `End` | Last cell in the current row |\n * | `Ctrl/⌘ + Home` | First cell in the first row |\n * | `Ctrl/⌘ + End` | Last cell in the last row |\n * | `Page Down` | Jump down by one visible page of rows |\n * | `Page Up` | Jump up by one visible page of rows |\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/grid/\n */\nexport function useGridKeyboardNavigation({\n tableRef,\n enabled = true,\n scrollContainerRef,\n rowItemCount,\n onScrollToRowIndex,\n}: UseGridKeyboardNavigationOptions): UseGridKeyboardNavigationResult {\n const activeCoordsRef = useRef({ row: 0, col: 0 });\n\n const pendingFocusRef = useRef<{\n dataIndex: number;\n col: number;\n } | null>(null);\n\n /**\n * The `data-index` of the body row that currently holds focus.\n * Returned so the DataGrid can persist it in the virtualizer.\n */\n const [focusedRowIndex, setFocusedRowIndex] = useState<number | null>(null);\n\n // ------------------------------------------------------------------\n // Synchronize tabindex across every navigable cell.\n // ------------------------------------------------------------------\n const syncTabIndices = () => {\n const table = tableRef.current;\n if (!table || !enabled) return;\n\n const grid = buildGrid(table);\n if (grid.length === 0) return;\n\n // If a cell inside the table currently has DOM focus, always prefer it\n // as the active cell. This handles the case where the grid was rebuilt\n // after a virtualiser scroll but the focused cell's grid-row index has\n // shifted (e.g. a persisted row that moved from the middle to the end).\n let { row, col } = activeCoordsRef.current;\n const activeEl = table.ownerDocument.activeElement;\n if (activeEl && table.contains(activeEl)) {\n const focusedCell = (activeEl as HTMLElement).closest?.(\n 'th, td'\n ) as HTMLElement | null;\n if (focusedCell) {\n for (let r = 0; r < grid.length; r++) {\n for (let c = 0; c < grid[r].length; c++) {\n if (grid[r][c].element === focusedCell) {\n row = r;\n col = c;\n break;\n }\n }\n }\n }\n }\n\n const clampedRow = clamp(row, 0, grid.length - 1);\n const clampedCol = clamp(col, 0, grid[clampedRow].length - 1);\n activeCoordsRef.current = { row: clampedRow, col: clampedCol };\n\n for (let r = 0; r < grid.length; r++) {\n for (let c = 0; c < grid[r].length; c++) {\n const { element, focusTarget } = grid[r][c];\n const isActive = r === clampedRow && c === clampedCol;\n\n element.setAttribute('tabindex', '-1');\n element\n .querySelectorAll<HTMLElement>(INTERACTIVE_SELECTOR)\n .forEach((child) => {\n child.setAttribute('tabindex', '-1');\n });\n\n if (isActive) {\n focusTarget.setAttribute('tabindex', '0');\n }\n }\n }\n };\n\n // Re-sync after every React render and resolve any pending focus.\n useLayoutEffect(() => {\n if (!enabled) return;\n const table = tableRef.current;\n if (!table) return;\n\n const pending = pendingFocusRef.current;\n if (pending) {\n const grid = buildGrid(table);\n const gridRow = findNearestGridRowByDataIndex(grid, pending.dataIndex);\n if (gridRow >= 0) {\n pendingFocusRef.current = null;\n const col = clamp(pending.col, 0, grid[gridRow].length - 1);\n activeCoordsRef.current = { row: gridRow, col };\n syncTabIndices();\n grid[gridRow][col].focusTarget.focus();\n return;\n }\n }\n\n syncTabIndices();\n });\n\n // ------------------------------------------------------------------\n // Navigate to a specific cell (by grid-row index) and focus it.\n // ------------------------------------------------------------------\n const navigateTo = (targetRow: number, targetCol: number) => {\n const table = tableRef.current;\n if (!table) return;\n\n const grid = buildGrid(table);\n if (grid.length === 0) return;\n\n const row = clamp(targetRow, 0, grid.length - 1);\n const col = clamp(targetCol, 0, grid[row].length - 1);\n activeCoordsRef.current = { row, col };\n syncTabIndices();\n\n const cell = grid[row]?.[col];\n if (cell) {\n cell.focusTarget.focus({ preventScroll: true });\n cell.element.scrollIntoView?.({ block: 'nearest', inline: 'nearest' });\n }\n };\n\n // ------------------------------------------------------------------\n // Navigate to a cell identified by data-index. Falls back to\n // scrolling + deferred focus when the row is not in the DOM.\n // ------------------------------------------------------------------\n const navigateToDataIndex = (dataIndex: number, col: number) => {\n const table = tableRef.current;\n if (!table) return;\n\n const grid = buildGrid(table);\n const gridRow = findGridRowByDataIndex(grid, dataIndex);\n if (gridRow >= 0) {\n const clampedCol = clamp(col, 0, grid[gridRow].length - 1);\n activeCoordsRef.current = { row: gridRow, col: clampedCol };\n syncTabIndices();\n grid[gridRow][clampedCol].focusTarget.focus({ preventScroll: true });\n grid[gridRow][clampedCol].element.scrollIntoView?.({\n block: 'nearest',\n inline: 'nearest',\n });\n return;\n }\n if (onScrollToRowIndex) {\n onScrollToRowIndex(dataIndex);\n pendingFocusRef.current = { dataIndex, col };\n }\n };\n\n // ------------------------------------------------------------------\n // Keyboard handler\n // ------------------------------------------------------------------\n const onKeyDown = (e: ReactKeyboardEvent) => {\n if (!enabled) return;\n\n const table = tableRef.current;\n if (!table) return;\n\n if (isEditableTarget(e.target)) return;\n\n const grid = buildGrid(table);\n if (grid.length === 0) return;\n\n const cell = (e.target as HTMLElement).closest?.(\n 'th, td'\n ) as HTMLElement | null;\n if (!cell || !table.contains(cell)) return;\n\n let curRow = -1;\n let curCol = -1;\n outer: for (let r = 0; r < grid.length; r++) {\n for (let c = 0; c < grid[r].length; c++) {\n if (grid[r][c].element === cell) {\n curRow = r;\n curCol = c;\n break outer;\n }\n }\n }\n if (curRow < 0) return;\n\n const curDataIndex = getDataIndexOfCell(cell);\n const headerRows = countHeaderRows(grid);\n const isBodyRow = curDataIndex != null;\n\n const maxRow = grid.length - 1;\n let targetRow = curRow;\n let targetCol = curCol;\n let handled = true;\n\n switch (e.key) {\n case 'ArrowRight':\n targetCol = Math.min(curCol + 1, grid[curRow].length - 1);\n break;\n case 'ArrowLeft':\n targetCol = Math.max(curCol - 1, 0);\n break;\n\n case 'ArrowDown':\n if (isBodyRow && rowItemCount != null) {\n const nextDataIndex = findNextNavigableDataIndex(\n grid,\n curDataIndex,\n 1,\n rowItemCount\n );\n if (nextDataIndex != null) {\n e.preventDefault();\n navigateToDataIndex(nextDataIndex, curCol);\n return;\n }\n // No navigable row below — stay put.\n } else {\n targetRow = Math.min(curRow + 1, maxRow);\n }\n break;\n\n case 'ArrowUp':\n if (isBodyRow) {\n const prevDataIndex = findNextNavigableDataIndex(\n grid,\n curDataIndex,\n -1,\n rowItemCount ?? curDataIndex\n );\n if (prevDataIndex != null) {\n e.preventDefault();\n navigateToDataIndex(prevDataIndex, curCol);\n return;\n }\n // No navigable body row above → last header row.\n targetRow = Math.max(headerRows - 1, 0);\n } else {\n targetRow = Math.max(curRow - 1, 0);\n }\n break;\n\n case 'Home':\n if (e.ctrlKey || e.metaKey) {\n targetRow = 0;\n targetCol = 0;\n } else {\n targetCol = 0;\n }\n break;\n case 'End':\n if (e.ctrlKey || e.metaKey) {\n targetRow = maxRow;\n targetCol = grid[maxRow].length - 1;\n } else {\n targetCol = grid[curRow].length - 1;\n }\n break;\n\n case 'PageDown':\n case 'PageUp': {\n const pageSize = getVisiblePageSize(\n scrollContainerRef?.current ?? null,\n table\n );\n const direction = e.key === 'PageDown' ? 1 : -1;\n\n if (isBodyRow && rowItemCount != null) {\n // Jump by `pageSize` navigable rows in the given direction.\n let target = curDataIndex;\n let stepsUsed = 0;\n for (let i = 0; i < pageSize; i++) {\n const next = findNextNavigableDataIndex(\n grid,\n target,\n direction,\n rowItemCount\n );\n if (next == null) break;\n target = next;\n stepsUsed++;\n }\n const hasRemainingSteps = stepsUsed < pageSize;\n\n // PageUp with remaining steps at data-index 0 → go to header.\n if (direction === -1 && hasRemainingSteps) {\n targetRow = 0;\n break;\n }\n\n if (target !== curDataIndex) {\n e.preventDefault();\n navigateToDataIndex(target, curCol);\n return;\n }\n }\n\n targetRow = clamp(curRow + direction * pageSize, 0, maxRow);\n break;\n }\n\n default:\n handled = false;\n }\n\n if (handled) {\n e.preventDefault();\n targetCol = Math.min(targetCol, grid[targetRow].length - 1);\n navigateTo(targetRow, targetCol);\n }\n };\n\n // ------------------------------------------------------------------\n // Focus handler\n // ------------------------------------------------------------------\n const onFocus = (e: ReactFocusEvent) => {\n if (!enabled) return;\n\n const table = tableRef.current;\n if (!table) return;\n\n const cell = (e.target as HTMLElement).closest?.(\n 'th, td'\n ) as HTMLElement | null;\n if (!cell || !table.contains(cell)) return;\n\n // if tabbing back to the table, make sure the focused row is scrolled into view\n if (\n focusedRowIndex != null &&\n !table.contains(e.relatedTarget) &&\n getInteractionModality() !== 'pointer'\n ) {\n onScrollToRowIndex?.(focusedRowIndex, { align: 'start' });\n }\n\n const grid = buildGrid(table);\n for (let r = 0; r < grid.length; r++) {\n for (let c = 0; c < grid[r].length; c++) {\n if (grid[r][c].element === cell) {\n activeCoordsRef.current = { row: r, col: c };\n syncTabIndices();\n\n const dataIndex = getDataIndexOfCell(cell);\n if (dataIndex !== focusedRowIndex) {\n setFocusedRowIndex(dataIndex);\n }\n return;\n }\n }\n }\n };\n\n const rangeExtractor = useCallback(\n (range: Parameters<typeof defaultRangeExtractor>[0]) => {\n const indices = defaultRangeExtractor(range);\n if (focusedRowIndex != null && !indices.includes(focusedRowIndex)) {\n indices.push(focusedRowIndex);\n indices.sort((a, b) => a - b);\n }\n return indices;\n },\n [focusedRowIndex]\n );\n\n return {\n gridKeyboardNavigationProps: { onKeyDown, onFocus },\n rangeExtractor,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\n/**\n * Starting from `fromDataIndex`, scan in `direction` (+1 or −1) to find the\n * next data-index that corresponds to a navigable grid row (a `<tr>` with the\n * `data-grid-row` attribute). Skips expandedView / skeleton rows.\n *\n * Returns `null` when no navigable row exists in the given direction.\n */\nfunction findNextNavigableDataIndex(\n grid: GridCell[][],\n fromDataIndex: number,\n direction: 1 | -1,\n rowItemCount: number\n): number | null {\n // Collect data-indices of all rows in the DOM, split into navigable\n // (data-grid-row) and non-navigable (expandedView, skeleton, etc.).\n const navigable = new Set<number>();\n const nonNavigable = new Set<number>();\n\n const table = grid[0]?.[0]?.element.closest('table');\n if (table) {\n const tbody = table.querySelector('tbody');\n if (tbody) {\n tbody\n .querySelectorAll<HTMLTableRowElement>(':scope > tr[data-index]')\n .forEach((tr) => {\n const idx = parseInt(tr.getAttribute(DATA_INDEX_ATTR)!, 10);\n if (isNaN(idx)) return;\n if (tr.hasAttribute(GRID_ROW_ATTR)) {\n navigable.add(idx);\n } else {\n nonNavigable.add(idx);\n }\n });\n }\n }\n\n let candidate = fromDataIndex + direction;\n while (candidate >= 0 && candidate < rowItemCount) {\n // Skip indices we know are non-navigable (expanded views in the DOM).\n if (nonNavigable.has(candidate)) {\n candidate += direction;\n continue;\n }\n // Accept if it's a known navigable row or if it's off-screen (we'll\n // discover its type when the virtualiser renders it).\n return candidate;\n }\n return null;\n}\n\n/**\n * Find the grid-row whose `data-index` is closest to `targetDataIndex`.\n * Only considers body rows (those with the `data-index` attribute).\n * Returns `-1` when no suitable row is found.\n */\nfunction findNearestGridRowByDataIndex(\n grid: GridCell[][],\n targetDataIndex: number\n): number {\n let bestRow = -1;\n let bestDist = Infinity;\n for (let r = 0; r < grid.length; r++) {\n const tr = grid[r][0]?.element.closest('tr');\n const raw = tr?.getAttribute(DATA_INDEX_ATTR);\n if (raw == null) continue;\n const idx = parseInt(raw, 10);\n if (isNaN(idx)) continue;\n const dist = Math.abs(idx - targetDataIndex);\n if (dist < bestDist) {\n bestDist = dist;\n bestRow = r;\n }\n }\n return bestRow;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import { useState, useLayoutEffect } from 'react';
2
+
3
+ function useMeasureColumnWidths({
4
+ data,
5
+ table,
6
+ enabled: shouldAutoMeasure,
7
+ tableRef
8
+ }) {
9
+ const [measuredColumnWidths, setMeasuredColumnWidths] = useState(null);
10
+ const columnKey = table.getVisibleLeafColumns().map((c) => c.id).join(",");
11
+ useLayoutEffect(() => {
12
+ if (shouldAutoMeasure) {
13
+ setMeasuredColumnWidths(null);
14
+ }
15
+ }, [columnKey, shouldAutoMeasure]);
16
+ useLayoutEffect(() => {
17
+ if (!shouldAutoMeasure || measuredColumnWidths !== null) return;
18
+ if (data.length === 0) return;
19
+ const tableEl = tableRef.current;
20
+ if (!tableEl) return;
21
+ let rafId;
22
+ let cancelled = false;
23
+ const measureColumnWidths = () => {
24
+ if (cancelled) return;
25
+ const bodyRows = tableEl.querySelectorAll("tbody tr:not([aria-hidden])");
26
+ if (bodyRows.length === 0) {
27
+ rafId = requestAnimationFrame(measureColumnWidths);
28
+ return;
29
+ }
30
+ const headerCells = tableEl.querySelectorAll("thead th");
31
+ const visibleColumns = table.getVisibleLeafColumns();
32
+ const widths = {};
33
+ visibleColumns.forEach((col, i) => {
34
+ const thEl = headerCells[i];
35
+ if (thEl) {
36
+ widths[col.id] = thEl.getBoundingClientRect().width;
37
+ }
38
+ });
39
+ if (Object.keys(widths).length > 0 && !cancelled) {
40
+ setMeasuredColumnWidths(widths);
41
+ }
42
+ };
43
+ rafId = requestAnimationFrame(measureColumnWidths);
44
+ return () => {
45
+ cancelled = true;
46
+ cancelAnimationFrame(rafId);
47
+ };
48
+ }, [shouldAutoMeasure, measuredColumnWidths, data.length, table]);
49
+ return {
50
+ measuredColumnWidths
51
+ };
52
+ }
53
+
54
+ export { useMeasureColumnWidths };
55
+ //# sourceMappingURL=useMeasureColumnWidths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMeasureColumnWidths.js","sources":["../../../../../../src/DataGrid/src/useMeasureColumnWidths.tsx"],"sourcesContent":["import { Table as TanstackTable } from '@tanstack/react-table';\nimport React, { useLayoutEffect, useState } from 'react';\n\n/**\n * Measures column widths. Used to mimic `table-layout: auto` for virtualized tables by measuring column widths after\n * the initial render and then locking them in with `table-layout: fixed`,\n * to prevent column widths from shifting as different rows are scrolled in and out of view.\n */\nexport function useMeasureColumnWidths<TData>({\n data,\n table,\n enabled: shouldAutoMeasure,\n tableRef,\n}: {\n table: TanstackTable<TData>;\n enabled: boolean;\n tableRef: React.RefObject<HTMLTableElement>;\n data: TData[];\n}): { measuredColumnWidths: Record<string, number> | null } {\n const [measuredColumnWidths, setMeasuredColumnWidths] = useState<Record<\n string,\n number\n > | null>(null);\n\n // Create a stable key from column IDs to detect column changes\n const columnKey = table\n .getVisibleLeafColumns()\n .map((c) => c.id)\n .join(',');\n\n // Reset measured widths when columns change\n useLayoutEffect(() => {\n if (shouldAutoMeasure) {\n setMeasuredColumnWidths(null);\n }\n }, [columnKey, shouldAutoMeasure]);\n\n // Measure column widths after initial render\n useLayoutEffect(() => {\n if (!shouldAutoMeasure || measuredColumnWidths !== null) return;\n if (data.length === 0) return; // Don't measure with empty data\n\n const tableEl = tableRef.current;\n if (!tableEl) return;\n\n let rafId: number;\n let cancelled = false;\n\n // When virtualization is enabled, the virtualizer needs a frame to initialize\n // and render rows. We use requestAnimationFrame to defer measurement until\n // after the virtualizer has populated the DOM.\n const measureColumnWidths = () => {\n if (cancelled) return;\n\n // Verify rows are actually rendered before measuring\n const bodyRows = tableEl.querySelectorAll('tbody tr:not([aria-hidden])');\n if (bodyRows.length === 0) {\n rafId = requestAnimationFrame(measureColumnWidths);\n return;\n }\n\n const headerCells = tableEl.querySelectorAll('thead th');\n const visibleColumns = table.getVisibleLeafColumns();\n\n const widths: Record<string, number> = {};\n visibleColumns.forEach((col, i) => {\n const thEl = headerCells[i] as HTMLElement | undefined;\n if (thEl) {\n // Use getBoundingClientRect for sub-pixel accuracy\n widths[col.id] = thEl.getBoundingClientRect().width;\n }\n });\n\n // Only lock if we successfully measured at least one column\n if (Object.keys(widths).length > 0 && !cancelled) {\n setMeasuredColumnWidths(widths);\n }\n };\n\n rafId = requestAnimationFrame(measureColumnWidths);\n\n return () => {\n cancelled = true;\n cancelAnimationFrame(rafId);\n };\n }, [shouldAutoMeasure, measuredColumnWidths, data.length, table]);\n\n return {\n measuredColumnWidths,\n };\n}\n"],"names":[],"mappings":";;AAQO,SAAS,sBAAA,CAA8B;AAAA,EAC5C,IAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA,EAAS,iBAAA;AAAA,EACT;AACF,CAAA,EAK4D;AAC1D,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAAI,SAG9C,IAAI,CAAA;AAGd,EAAA,MAAM,SAAA,GAAY,KAAA,CACf,qBAAA,EAAsB,CACtB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA,CACf,IAAA,CAAK,GAAG,CAAA;AAGX,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,IAAI,iBAAA,EAAmB;AACrB,MAAA,uBAAA,CAAwB,IAAI,CAAA;AAAA,IAC9B;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,iBAAiB,CAAC,CAAA;AAGjC,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,IAAI,CAAC,iBAAA,IAAqB,oBAAA,KAAyB,IAAA,EAAM;AACzD,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AAEvB,IAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,SAAA,GAAY,KAAA;AAKhB,IAAA,MAAM,sBAAsB,MAAM;AAChC,MAAA,IAAI,SAAA,EAAW;AAGf,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,gBAAA,CAAiB,6BAA6B,CAAA;AACvE,MAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,QAAA,KAAA,GAAQ,sBAAsB,mBAAmB,CAAA;AACjD,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,gBAAA,CAAiB,UAAU,CAAA;AACvD,MAAA,MAAM,cAAA,GAAiB,MAAM,qBAAA,EAAsB;AAEnD,MAAA,MAAM,SAAiC,EAAC;AACxC,MAAA,cAAA,CAAe,OAAA,CAAQ,CAAC,GAAA,EAAK,CAAA,KAAM;AACjC,QAAA,MAAM,IAAA,GAAO,YAAY,CAAC,CAAA;AAC1B,QAAA,IAAI,IAAA,EAAM;AAER,UAAA,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA,GAAI,IAAA,CAAK,uBAAsB,CAAE,KAAA;AAAA,QAChD;AAAA,MACF,CAAC,CAAA;AAGD,MAAA,IAAI,OAAO,IAAA,CAAK,MAAM,EAAE,MAAA,GAAS,CAAA,IAAK,CAAC,SAAA,EAAW;AAChD,QAAA,uBAAA,CAAwB,MAAM,CAAA;AAAA,MAChC;AAAA,IACF,CAAA;AAEA,IAAA,KAAA,GAAQ,sBAAsB,mBAAmB,CAAA;AAEjD,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,oBAAA,CAAqB,KAAK,CAAA;AAAA,IAC5B,CAAA;AAAA,EACF,GAAG,CAAC,iBAAA,EAAmB,sBAAsB,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAC,CAAA;AAEhE,EAAA,OAAO;AAAA,IACL;AAAA,GACF;AACF;;;;"}
@@ -1,8 +1,8 @@
1
- var da$2 = {
1
+ var da$3 = {
2
2
  "dropzone-heading-default": "Træk filer hertil, eller klik for at vælge",
3
3
  "dropzone-heading-default-single": "Træk fil her, eller klik for at vælge",
4
4
  "dropzone-heading-dropping": "Slip fil"
5
5
  };
6
6
 
7
- export { da$2 as default };
7
+ export { da$3 as default };
8
8
  //# sourceMappingURL=da-DK.json.js.map
@@ -1,8 +1,8 @@
1
- var de$2 = {
1
+ var de$3 = {
2
2
  "dropzone-heading-default": "Ziehen Sie Dateien hierher oder klicken Sie, um sie auszuwählen",
3
3
  "dropzone-heading-default-single": "Ziehen Sie die Datei hierher oder klicken Sie, um sie auszuwählen",
4
4
  "dropzone-heading-dropping": "Datei ablegen"
5
5
  };
6
6
 
7
- export { de$2 as default };
7
+ export { de$3 as default };
8
8
  //# sourceMappingURL=de-DE.json.js.map
@@ -1,8 +1,8 @@
1
- var en$2 = {
1
+ var en$3 = {
2
2
  "dropzone-heading-default": "Drag files here or click to select",
3
3
  "dropzone-heading-default-single": "Drag a file here or click to select",
4
4
  "dropzone-heading-dropping": "Drop file"
5
5
  };
6
6
 
7
- export { en$2 as default };
7
+ export { en$3 as default };
8
8
  //# sourceMappingURL=en-US.json.js.map
@@ -1,8 +1,8 @@
1
- var fi$2 = {
1
+ var fi$3 = {
2
2
  "dropzone-heading-default": "Vedä tiedostoja tähän tai valitse napsauttamalla",
3
3
  "dropzone-heading-default-single": "Vedä tiedosto tähän tai valitse napsauttamalla",
4
4
  "dropzone-heading-dropping": "Pudota tiedosto"
5
5
  };
6
6
 
7
- export { fi$2 as default };
7
+ export { fi$3 as default };
8
8
  //# sourceMappingURL=fi-FI.json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../../../src/FileDropzone/i18n/index.ts"],"sourcesContent":["import da from './da-DK.json';\nimport en from './en-US.json';\nimport de from './de-DE.json';\nimport fi from './fi-FI.json';\nimport no from './nb-NO.json';\nimport pl from './pl-PL.json';\nimport se from './sv-SE.json';\n\nexport default {\n 'da-DK': da,\n 'en-US': en,\n 'de-DE': de,\n 'fi-FI': fi,\n 'nb-NO': no,\n 'pl-PL': pl,\n 'sv-SE': se,\n};\n"],"names":[],"mappings":";;;;;;;;AAQA,qBAAe;AAAA,EACb,OAAA,EAAS,EAAA;AAAA,EACT,OAAA,EAAS,EAAA;AAAA,EACT,OAAA,EAAS,EAAA;AAAA,EACT,OAAA,EAAS,EAAA;AAAA,EACT,OAAA,EAAS,EAAA;AAAA,EACT,OAAA,EAAS,EAAA;AAAA,EACT,OAAA,EAAS;AACX,CAAA;;;;"}
@@ -1,8 +1,8 @@
1
- var no$2 = {
1
+ var no$3 = {
2
2
  "dropzone-heading-default": "Dra filer her eller klikk for å velge",
3
3
  "dropzone-heading-default-single": "Dra fil her eller klikk for å velge",
4
4
  "dropzone-heading-dropping": "Slipp fil"
5
5
  };
6
6
 
7
- export { no$2 as default };
7
+ export { no$3 as default };
8
8
  //# sourceMappingURL=nb-NO.json.js.map
@@ -1,8 +1,8 @@
1
- var pl$2 = {
1
+ var pl$3 = {
2
2
  "dropzone-heading-default": "Przeciągnij pliki tutaj lub kliknij, aby wybrać",
3
3
  "dropzone-heading-default-single": "Przeciągnij plik tutaj lub kliknij, aby wybrać",
4
4
  "dropzone-heading-dropping": "Upuść plik"
5
5
  };
6
6
 
7
- export { pl$2 as default };
7
+ export { pl$3 as default };
8
8
  //# sourceMappingURL=pl-PL.json.js.map
@@ -1,8 +1,8 @@
1
- var se$2 = {
1
+ var se$3 = {
2
2
  "dropzone-heading-default": "Dra filer hit eller klicka för att välja",
3
3
  "dropzone-heading-default-single": "Dra fil hit eller klicka för att välja",
4
4
  "dropzone-heading-dropping": "Släpp filen"
5
5
  };
6
6
 
7
- export { se$2 as default };
7
+ export { se$3 as default };
8
8
  //# sourceMappingURL=sv-SE.json.js.map