@danske/sapphire-react-lab 0.106.2 → 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 +553 -10
  186. package/package.json +8 -8
  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 @@
1
+ {"version":3,"file":"Autocomplete.js","sources":["../../../../../../src/Autocomplete/src/Autocomplete.tsx"],"sourcesContent":["import React, { Key, ReactElement, useRef } from 'react';\nimport {\n ListBoxProps,\n useThemeCheck,\n useSapphireStyleProps,\n SapphireStyleProps,\n ListBoxPopover,\n useComboBoxState,\n GlobalDomAttributes,\n} from '@danske/sapphire-react';\nimport { useComboBox } from 'react-aria/useComboBox';\nimport { useMessageFormatter } from '@react-aria/i18n';\nimport intlMessages from '../i18n';\nimport { useFocusableRef } from '@react-spectrum/utils';\nimport type { ComboBoxProps } from 'react-stately/useComboBoxState';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\n\nexport type AutocompleteProps<T extends object> = GlobalDomAttributes &\n SapphireStyleProps &\n Pick<\n ComboBoxProps<T>,\n | 'items'\n | 'children'\n | 'inputValue'\n | 'defaultInputValue'\n | 'onInputChange'\n | 'isDisabled'\n > &\n Pick<ListBoxProps<T>, 'loadingState' | 'loadingSkeletonRowsCount'> & {\n /**\n * This prop is badly named. It is NOT related to a selection state being\n * changed since there is no selection state in this component.\n *\n * This callback simply notifies you when the user filled in the text field\n * by selecting an option from the autocomplete dropdown. Similar to an\n * onClick.\n *\n * @deprecated\n * Use `onSuggestionSelected` instead.\n */\n onSelectionChange?: Pick<\n ComboBoxProps<T>,\n 'onSelectionChange'\n >['onSelectionChange'];\n\n /*\n * This callback simply notifies you when the user filled in the text field\n * by selecting an option from the autocomplete dropdown. Similar to an\n * onClick.\n */\n onSuggestionSelected?: (key: Key) => void;\n /**\n * Render function for the input element.\n * Receives props that should be spread onto the input component.\n */\n renderInput: (inputProps: any) => ReactElement;\n\n /**\n * Accessible label for the suggestions listbox.\n */\n listboxAriaLabel?: string;\n\n /**\n * Controlled selected value.\n */\n value?: React.Key | null;\n\n /**\n * Decide what items to display in the dropdown menu.\n * @default 'String.includes'\n */\n defaultFilter?: (textValue: string, inputValue: string) => boolean;\n };\n\nexport function Autocomplete<T extends object>(\n props: AutocompleteProps<T>\n): ReactElement {\n useThemeCheck();\n const formatMessage = useMessageFormatter(intlMessages);\n\n const {\n inputValue,\n renderInput,\n loadingState,\n loadingSkeletonRowsCount,\n listboxAriaLabel,\n onSuggestionSelected,\n onSelectionChange,\n ...otherProps\n } = props;\n\n const {\n styleProps: { style, className },\n } = useSapphireStyleProps(props);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const listBoxRef = useFocusableRef<HTMLUListElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n const triggerRef = useFocusableRef<HTMLDivElement>(null);\n const collectionRef = useRef<\n ReturnType<typeof useComboBoxState>['collection'] | null\n >(null);\n\n const state = useComboBoxState({\n ...props,\n inputValue,\n allowsEmptyCollection: loadingState === 'loading',\n allowsCustomValue: true,\n shouldCloseOnBlur: true,\n onSelectionChange: (key) => {\n if (key !== null) {\n onSelectionChange?.(key);\n onSuggestionSelected?.(key);\n // When both value and inputValue are controlled, react-stately skips\n // updating inputValue\n const itemText = collectionRef.current?.getItem(key)?.textValue ?? '';\n if (itemText) {\n props.onInputChange?.(itemText);\n }\n }\n },\n });\n\n collectionRef.current = state.collection;\n\n const { inputProps, listBoxProps } = useComboBox(\n {\n ...props,\n 'aria-label': listboxAriaLabel || formatMessage('listbox-suggestions'),\n inputRef,\n listBoxRef,\n popoverRef,\n },\n state\n );\n\n const inputElement = renderInput({\n ...inputProps,\n isDisabled: props.isDisabled,\n inputRef,\n 'aria-haspopup': 'listbox',\n 'aria-expanded': state.isOpen,\n onChange: (value: string) => {\n inputProps.onChange?.({\n target: { value },\n currentTarget: { value },\n } as React.ChangeEvent<HTMLInputElement>);\n },\n });\n\n return (\n <div\n ref={triggerRef}\n {...filterDOMProps(otherProps, { global: true })}\n style={{ display: 'inline-flex', ...style }}\n className={className}\n >\n {inputElement}\n {state.isOpen && (\n <ListBoxPopover<T>\n state={state}\n triggerRef={triggerRef}\n popoverRef={popoverRef}\n listBoxRef={listBoxRef}\n listBoxProps={listBoxProps}\n loadingState={loadingState}\n loadingSkeletonRowsCount={loadingSkeletonRowsCount}\n selectWidth={triggerRef.current?.offsetWidth}\n disableSelectedStyles\n isNonModal\n >\n {props.children || []}\n </ListBoxPopover>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BreadcrumbItem.js","sources":["../../../../../../src/Breadcrumbs/src/BreadcrumbItem.tsx"],"sourcesContent":["import React, { useContext, ForwardedRef } from 'react';\nimport type { BreadcrumbProps as RACBreadcrumbProps } from 'react-aria-components';\nimport { CollectionNode } from 'react-aria/private/collections/BaseCollection';\nimport { createLeafComponent } from 'react-aria/CollectionBuilder';\nimport {\n useSapphireStyleProps,\n useThemeCheck,\n SapphireStyleProps,\n Typography,\n GlobalDomAttributes,\n} from '@danske/sapphire-react';\nimport { BreadcrumbsSeparator } from './BreadcrumbsSeparator';\nimport clsx from 'clsx';\nimport styles from '@danske/sapphire-css/components/breadcrumbs/breadcrumbs.module.css';\nimport { BreadcrumbsContext } from './Breadcrumbs';\nimport { BreadcrumbOverflowMenu } from './BreadcrumbOverflowMenu';\nimport { BreadcrumbItemNode } from './types';\nimport {\n BreadcrumbItemLink,\n BreadcrumbItemLinkProps,\n} from './BreadcrumbItemLink';\n\nexport type BreadcrumbItemProps = {\n isDisabled?: boolean;\n} & SapphireStyleProps &\n GlobalDomAttributes &\n Pick<RACBreadcrumbProps, 'children'> &\n BreadcrumbItemLinkProps;\n\nclass BreadcrumbItemCollectionNode extends CollectionNode<unknown> {\n static readonly type = 'item';\n}\n\n/**\n * The implementation is based on React Aria's BreadcrumbItem, with added support for\n * overflow menu data handling.\n */\nexport const BreadcrumbItem = createLeafComponent(\n BreadcrumbItemCollectionNode,\n function BreadcrumbItem(\n props: BreadcrumbItemProps,\n ref: ForwardedRef<HTMLLIElement>,\n node: BreadcrumbItemNode\n ): JSX.Element {\n useThemeCheck();\n const { styleProps } = useSapphireStyleProps(props);\n const {\n size,\n overflowNodes,\n isDisabled: breadcrumbsDisabled,\n } = useContext(BreadcrumbsContext);\n const { isDisabled: individualDisabled = false } = props;\n\n const isCurrent = node.nextKey == null;\n const isDisabled = individualDisabled || breadcrumbsDisabled;\n\n /**\n * The item should not be rendered if it's in the overflow indexes.\n * The only exception is the first overflow menu item, which will be rendered\n * as the overflow menu trigger.\n */\n const shouldRender = !overflowNodes.some((item) => item?.key === node.key);\n const showOverflowMenu = overflowNodes[0]?.key === node.key;\n\n if (!shouldRender && !showOverflowMenu) {\n return <></>;\n }\n\n if (!shouldRender && showOverflowMenu) {\n return <BreadcrumbOverflowMenu />;\n }\n\n node.href = props.href;\n\n return (\n <li\n ref={ref}\n className={clsx(styles['sapphire-breadcrumbs__item'])}\n style={{ ...styleProps.style }}\n data-disabled={isDisabled || undefined}\n data-current={isCurrent || undefined}\n >\n {isCurrent ? (\n <Typography.Body\n elementType=\"span\"\n isSemibold\n size={size === 'lg' ? 'md' : size === 'md' ? 'sm' : 'xs'}\n >\n {node.rendered}\n </Typography.Body>\n ) : (\n <BreadcrumbItemLink isDisabled={isDisabled} {...props}>\n {node.rendered}\n </BreadcrumbItemLink>\n )}\n {!isCurrent && <BreadcrumbsSeparator />}\n </li>\n );\n }\n);\n"],"names":["BreadcrumbItem"],"mappings":";;;;;;;;;;;AA6BA,MAAM,qCAAqC,cAAA,CAAwB;AAAA,EACjE,OAAgB,IAAA,GAAO,MAAA;AACzB;AAMO,MAAM,cAAA,GAAiB,mBAAA;AAAA,EAC5B,4BAAA;AAAA,EACA,SAASA,eAAAA,CACP,KAAA,EACA,GAAA,EACA,IAAA,EACa;AACb,IAAA,aAAA,EAAc;AACd,IAAA,MAAM,EAAE,UAAA,EAAW,GAAI,qBAAA,CAAsB,KAAK,CAAA;AAClD,IAAA,MAAM;AAAA,MACJ,IAAA;AAAA,MACA,aAAA;AAAA,MACA,UAAA,EAAY;AAAA,KACd,GAAI,WAAW,kBAAkB,CAAA;AACjC,IAAA,MAAM,EAAE,UAAA,EAAY,kBAAA,GAAqB,KAAA,EAAM,GAAI,KAAA;AAEnD,IAAA,MAAM,SAAA,GAAY,KAAK,OAAA,IAAW,IAAA;AAClC,IAAA,MAAM,aAAa,kBAAA,IAAsB,mBAAA;AAOzC,IAAA,MAAM,YAAA,GAAe,CAAC,aAAA,CAAc,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,EAAM,GAAA,KAAQ,IAAA,CAAK,GAAG,CAAA;AACzE,IAAA,MAAM,gBAAA,GAAmB,aAAA,CAAc,CAAC,CAAA,EAAG,QAAQ,IAAA,CAAK,GAAA;AAExD,IAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,gBAAA,EAAkB;AACtC,MAAA,uBAAO,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAE,CAAA;AAAA,IACX;AAEA,IAAA,IAAI,CAAC,gBAAgB,gBAAA,EAAkB;AACrC,MAAA,2CAAQ,sBAAA,EAAA,IAAuB,CAAA;AAAA,IACjC;AAEA,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,IAAA;AAElB,IAAA,uBACE,KAAA,CAAA,aAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,IAAA,CAAK,MAAA,CAAO,4BAA4B,CAAC,CAAA;AAAA,QACpD,KAAA,EAAO,EAAE,GAAG,UAAA,CAAW,KAAA,EAAM;AAAA,QAC7B,iBAAe,UAAA,IAAc,MAAA;AAAA,QAC7B,gBAAc,SAAA,IAAa;AAAA,OAAA;AAAA,MAE1B,SAAA,mBACC,KAAA,CAAA,aAAA;AAAA,QAAC,UAAA,CAAW,IAAA;AAAA,QAAX;AAAA,UACC,WAAA,EAAY,MAAA;AAAA,UACZ,UAAA,EAAU,IAAA;AAAA,UACV,MAAM,IAAA,KAAS,IAAA,GAAO,IAAA,GAAO,IAAA,KAAS,OAAO,IAAA,GAAO;AAAA,SAAA;AAAA,QAEnD,IAAA,CAAK;AAAA,0BAGR,KAAA,CAAA,aAAA,CAAC,kBAAA,EAAA,EAAmB,YAAyB,GAAG,KAAA,EAAA,EAC7C,KAAK,QACR,CAAA;AAAA,MAED,CAAC,SAAA,oBAAa,KAAA,CAAA,aAAA,CAAC,oBAAA,EAAA,IAAqB;AAAA,KACvC;AAAA,EAEJ;AACF;;;;"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BreadcrumbItemLink.js","sources":["../../../../../../src/Breadcrumbs/src/BreadcrumbItemLink.tsx"],"sourcesContent":["import React, { useContext, forwardRef } from 'react';\nimport {\n Button,\n ButtonProps,\n SapphireStyleProps,\n useSapphireStyleProps,\n useThemeCheck,\n GlobalDomAttributes,\n} from '@danske/sapphire-react';\nimport { FocusableRef } from '@react-types/shared';\nimport { BreadcrumbsContext } from './Breadcrumbs';\nimport { BreadcrumbItemStatic } from './BreadcrumbItemStatic';\n\nexport type BreadcrumbItemLinkProps = Pick<\n ButtonProps<'a'>,\n | 'children'\n | 'href'\n | 'hrefLang'\n | 'target'\n | 'rel'\n | 'isDisabled'\n | 'icon'\n // TODO when moving to \"core\", use types under `types.ts` instead of plain strings\n | 'aria-label'\n | 'aria-labelledby'\n | 'aria-describedby'\n | 'aria-details'\n | 'UNSAFE_onClick'\n> &\n SapphireStyleProps &\n GlobalDomAttributes;\n\nexport const BreadcrumbItemLink = forwardRef(function BreadcrumbItemLink(\n { children, ...props }: BreadcrumbItemLinkProps,\n ref: FocusableRef<HTMLAnchorElement>\n): JSX.Element {\n useThemeCheck();\n const { styleProps: sapphireStyleProps } = useSapphireStyleProps(props);\n const { style, className, ...styleProps } = sapphireStyleProps;\n const { size } = useContext(BreadcrumbsContext);\n\n if (!props.href && !props.UNSAFE_onClick) {\n return (\n <BreadcrumbItemStatic {...props} size={size}>\n {children}\n </BreadcrumbItemStatic>\n );\n }\n\n return (\n <Button\n {...props}\n {...styleProps}\n UNSAFE_className={className}\n UNSAFE_style={{ ...style }}\n ref={ref}\n size={size}\n variant=\"tertiary\"\n isDisabled={props.isDisabled}\n >\n {children}\n </Button>\n );\n});\n\nBreadcrumbItemLink.displayName = 'BreadcrumbItemLink';\n"],"names":["BreadcrumbItemLink"],"mappings":";;;;;AAgCO,MAAM,kBAAA,GAAqB,WAAW,SAASA,mBAAAA,CACpD,EAAE,QAAA,EAAU,GAAG,KAAA,EAAM,EACrB,GAAA,EACa;AACb,EAAA,aAAA,EAAc;AACd,EAAA,MAAM,EAAE,UAAA,EAAY,kBAAA,EAAmB,GAAI,sBAAsB,KAAK,CAAA;AACtE,EAAA,MAAM,EAAE,KAAA,EAAO,SAAA,EAAW,GAAG,YAAW,GAAI,kBAAA;AAC5C,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,UAAA,CAAW,kBAAkB,CAAA;AAE9C,EAAA,IAAI,CAAC,KAAA,CAAM,IAAA,IAAQ,CAAC,MAAM,cAAA,EAAgB;AACxC,IAAA,uBACE,KAAA,CAAA,aAAA,CAAC,oBAAA,EAAA,EAAsB,GAAG,KAAA,EAAO,QAC9B,QACH,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACE,KAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACH,GAAG,UAAA;AAAA,MACJ,gBAAA,EAAkB,SAAA;AAAA,MAClB,YAAA,EAAc,EAAE,GAAG,KAAA,EAAM;AAAA,MACzB,GAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA,EAAQ,UAAA;AAAA,MACR,YAAY,KAAA,CAAM;AAAA,KAAA;AAAA,IAEjB;AAAA,GACH;AAEJ,CAAC;AAED,kBAAA,CAAmB,WAAA,GAAc,oBAAA;;;;"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BreadcrumbItemStatic.js","sources":["../../../../../../src/Breadcrumbs/src/BreadcrumbItemStatic.tsx"],"sourcesContent":["import React, { forwardRef } from 'react';\nimport {\n SapphireStyleProps,\n useSapphireStyleProps,\n useThemeCheck,\n GlobalDomAttributes,\n TooltipIfNeeded,\n} from '@danske/sapphire-react';\nimport clsx from 'clsx';\nimport styles from '@danske/sapphire-css/components/breadcrumbs/breadcrumbs.module.css';\nimport { mergeRefs } from 'react-aria/mergeRefs';\n\nexport type BreadcrumbItemStaticProps = Pick<\n React.HTMLAttributes<HTMLSpanElement>,\n 'children'\n> &\n SapphireStyleProps &\n GlobalDomAttributes & { size: 'sm' | 'md' | 'lg' };\n\nexport const BreadcrumbItemStatic = forwardRef<\n HTMLSpanElement,\n BreadcrumbItemStaticProps\n>(function BreadcrumbItemStatic({ size, ...props }, ref): JSX.Element {\n useThemeCheck();\n const { styleProps } = useSapphireStyleProps(props);\n return (\n <TooltipIfNeeded<HTMLSpanElement> title={props.children}>\n {(tooltipContentRef, tooltipProps) => {\n const positioningRef = tooltipProps?.ref;\n return (\n <span\n {...tooltipProps}\n ref={\n mergeRefs(\n ref,\n tooltipContentRef,\n positioningRef\n ) as React.LegacyRef<HTMLSpanElement>\n }\n className={clsx(\n styles['sapphire-breadcrumbs__item--static'],\n {\n [styles['sapphire-breadcrumbs__item--static--sm']]:\n size === 'sm',\n [styles['sapphire-breadcrumbs__item--static--lg']]:\n size === 'lg',\n },\n styleProps.className\n )}\n style={styleProps.style}\n >\n {props.children}\n </span>\n );\n }}\n </TooltipIfNeeded>\n );\n});\n"],"names":["BreadcrumbItemStatic"],"mappings":";;;;;;AAmBO,MAAM,oBAAA,GAAuB,WAGlC,SAASA,qBAAAA,CAAqB,EAAE,IAAA,EAAM,GAAG,KAAA,EAAM,EAAG,GAAA,EAAkB;AACpE,EAAA,aAAA,EAAc;AACd,EAAA,MAAM,EAAE,UAAA,EAAW,GAAI,qBAAA,CAAsB,KAAK,CAAA;AAClD,EAAA,2CACG,eAAA,EAAA,EAAiC,KAAA,EAAO,MAAM,QAAA,EAAA,EAC5C,CAAC,mBAAmB,YAAA,KAAiB;AACpC,IAAA,MAAM,iBAAiB,YAAA,EAAc,GAAA;AACrC,IAAA,uBACE,KAAA,CAAA,aAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACE,GAAG,YAAA;AAAA,QACJ,GAAA,EACE,SAAA;AAAA,UACE,GAAA;AAAA,UACA,iBAAA;AAAA,UACA;AAAA,SACF;AAAA,QAEF,SAAA,EAAW,IAAA;AAAA,UACT,OAAO,oCAAoC,CAAA;AAAA,UAC3C;AAAA,YACE,CAAC,MAAA,CAAO,wCAAwC,CAAC,GAC/C,IAAA,KAAS,IAAA;AAAA,YACX,CAAC,MAAA,CAAO,wCAAwC,CAAC,GAC/C,IAAA,KAAS;AAAA,WACb;AAAA,UACA,UAAA,CAAW;AAAA,SACb;AAAA,QACA,OAAO,UAAA,CAAW;AAAA,OAAA;AAAA,MAEjB,KAAA,CAAM;AAAA,KACT;AAAA,EAEJ,CACF,CAAA;AAEJ,CAAC;;;;"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BreadcrumbOverflowMenu.js","sources":["../../../../../../src/Breadcrumbs/src/BreadcrumbOverflowMenu.tsx"],"sourcesContent":["import { Menu, MenuItem, IconButton } from '@danske/sapphire-react';\nimport { OverflowMenuHorizontal } from '@danske/sapphire-icons/react';\nimport React from 'react';\nimport { useContext } from 'react';\nimport { BreadcrumbsContext } from './Breadcrumbs';\nimport { BreadcrumbsSeparator } from './BreadcrumbsSeparator';\n\n/**\n * Component that is being rendered in the case of overflowed breadcrumbs.\n * It is an internal component, so it's automatically rendered when the Breadcrumb\n * component detects overflow.\n */\nexport const BreadcrumbOverflowMenu = (): JSX.Element => {\n const { size, overflowNodes } = useContext(BreadcrumbsContext);\n\n return (\n <>\n <Menu\n triggerElement={\n <IconButton aria-label=\"Show more breadcrumbs\" size={size}>\n <OverflowMenuHorizontal />\n </IconButton>\n }\n >\n {overflowNodes.map((item) =>\n !item ? null : (\n <MenuItem\n key={item.key}\n id={item.key}\n href={item.href}\n isDisabled={!item.href}\n >\n {item.rendered}\n </MenuItem>\n )\n )}\n </Menu>\n <BreadcrumbsSeparator />\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;AAYO,MAAM,yBAAyB,MAAmB;AACvD,EAAA,MAAM,EAAE,IAAA,EAAM,aAAA,EAAc,GAAI,WAAW,kBAAkB,CAAA;AAE7D,EAAA,uBACE,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,kBACE,KAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,cAAA,sCACG,UAAA,EAAA,EAAW,YAAA,EAAW,yBAAwB,IAAA,EAAA,kBAC7C,KAAA,CAAA,aAAA,CAAC,4BAAuB,CAC1B;AAAA,KAAA;AAAA,IAGD,aAAA,CAAc,GAAA;AAAA,MAAI,CAAC,IAAA,KAClB,CAAC,IAAA,GAAO,IAAA,mBACN,KAAA,CAAA,aAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,KAAK,IAAA,CAAK,GAAA;AAAA,UACV,IAAI,IAAA,CAAK,GAAA;AAAA,UACT,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,UAAA,EAAY,CAAC,IAAA,CAAK;AAAA,SAAA;AAAA,QAEjB,IAAA,CAAK;AAAA;AACR;AAEJ,GACF,kBACA,KAAA,CAAA,aAAA,CAAC,oBAAA,EAAA,IAAqB,CACxB,CAAA;AAEJ;;;;"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Breadcrumbs.js","sources":["../../../../../../src/Breadcrumbs/src/Breadcrumbs.tsx"],"sourcesContent":["import React, { createContext } from 'react';\nimport { useBreadcrumbs } from 'react-aria/useBreadcrumbs';\nimport { Collection } from 'react-aria/Collection';\nimport { CollectionBuilder } from 'react-aria/CollectionBuilder';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\nimport { mergeProps } from 'react-aria/mergeProps';\nimport { forwardRefType } from '@react-types/shared';\nimport { ForwardedRef, forwardRef, useContext, useRef } from 'react';\nimport {\n BreadcrumbsContext as RACBreadcrumbsContext,\n BreadcrumbsProps as RACBreadcrumbsProps,\n CollectionRendererContext,\n useContextProps,\n} from 'react-aria-components';\nimport { useBreadcrumbThreshold } from './useBreadcrumbThreshold';\nimport {\n SapphireStyleProps,\n useSapphireStyleProps,\n GlobalDomAttributes,\n} from '@danske/sapphire-react';\nimport styles from '@danske/sapphire-css/components/breadcrumbs/breadcrumbs.module.css';\nimport clsx from 'clsx';\nimport { BreadcrumbItemNode } from './types';\n\nexport type BreadcrumbsProps<T extends object> = Pick<\n RACBreadcrumbsProps<T>,\n 'aria-label' | 'isDisabled' | 'children'\n> & {\n /**\n * The size of the breadcrumbs component.\n *\n * @default 'md'\n */\n size?: 'sm' | 'md' | 'lg';\n /**\n * Maximum width for the breadcrumbs container. When content overflows,\n * it will show an overflow menu with the first and last items.\n */\n maxWidth?: React.CSSProperties['maxWidth'];\n} & SapphireStyleProps &\n GlobalDomAttributes;\n\nexport const BreadcrumbsContext = createContext<{\n size: 'sm' | 'md' | 'lg';\n overflowNodes: (BreadcrumbItemNode | null)[];\n isDisabled?: boolean;\n}>({ size: 'md', overflowNodes: [] });\n\n/**\n * Shows the path to the current page through a hierarchical trail of links,\n * helping users understand their location within the application and navigate back to\n * parent pages.\n */\nexport const Breadcrumbs = (forwardRef as forwardRefType)(function Breadcrumbs<\n T extends object\n>(\n { maxWidth, size = 'md', ...props }: BreadcrumbsProps<T>,\n fwdRef: ForwardedRef<HTMLOListElement>\n) {\n const [RACprops, ref] = useContextProps(props, fwdRef, RACBreadcrumbsContext);\n const { styleProps } = useSapphireStyleProps(RACprops);\n const containerRef = useRef<HTMLDivElement>(null);\n const { CollectionRoot } = useContext(CollectionRendererContext);\n const { navProps } = useBreadcrumbs(RACprops);\n const DOMProps = filterDOMProps(RACprops, { global: true });\n\n return (\n <CollectionBuilder content={<Collection {...RACprops} />}>\n {(collection) => {\n const { overflowNodes } = useBreadcrumbThreshold(\n collection.size,\n containerRef,\n ref\n );\n const keys = Array.from(collection.getKeys());\n return (\n <div\n ref={containerRef}\n style={{\n ...styleProps.style,\n maxWidth,\n display: 'flex',\n }}\n >\n <ol\n ref={ref}\n {...mergeProps(DOMProps, navProps)}\n className={clsx(styles['sapphire-breadcrumbs'], {\n [styles['sapphire-breadcrumbs--sm']]: size === 'sm',\n [styles['sapphire-breadcrumbs--lg']]: size === 'lg',\n })}\n >\n <BreadcrumbsContext.Provider\n value={{\n size,\n overflowNodes: overflowNodes.map((index) =>\n collection.getItem(keys[index])\n ),\n isDisabled: RACprops.isDisabled,\n }}\n >\n <RACBreadcrumbsContext.Provider value={RACprops}>\n <CollectionRoot collection={collection} />\n </RACBreadcrumbsContext.Provider>\n </BreadcrumbsContext.Provider>\n </ol>\n </div>\n );\n }}\n </CollectionBuilder>\n );\n});\n"],"names":["Breadcrumbs","RACBreadcrumbsContext"],"mappings":";;;;;;;;;;;;AA0CO,MAAM,kBAAA,GAAqB,cAI/B,EAAE,IAAA,EAAM,MAAM,aAAA,EAAe,IAAI;AAO7B,MAAM,WAAA,GAAe,UAAA,CAA8B,SAASA,YAAAA,CAGjE,EAAE,QAAA,EAAU,IAAA,GAAO,IAAA,EAAM,GAAG,KAAA,EAAM,EAClC,MAAA,EACA;AACA,EAAA,MAAM,CAAC,QAAA,EAAU,GAAG,IAAI,eAAA,CAAgB,KAAA,EAAO,QAAQC,oBAAqB,CAAA;AAC5E,EAAA,MAAM,EAAE,UAAA,EAAW,GAAI,qBAAA,CAAsB,QAAQ,CAAA;AACrD,EAAA,MAAM,YAAA,GAAe,OAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,EAAE,cAAA,EAAe,GAAI,UAAA,CAAW,yBAAyB,CAAA;AAC/D,EAAA,MAAM,EAAE,QAAA,EAAS,GAAI,cAAA,CAAe,QAAQ,CAAA;AAC5C,EAAA,MAAM,WAAW,cAAA,CAAe,QAAA,EAAU,EAAE,MAAA,EAAQ,MAAM,CAAA;AAE1D,EAAA,uBACE,KAAA,CAAA,aAAA,CAAC,qBAAkB,OAAA,kBAAS,KAAA,CAAA,aAAA,CAAC,cAAY,GAAG,QAAA,EAAU,CAAA,EAAA,EACnD,CAAC,UAAA,KAAe;AACf,IAAA,MAAM,EAAE,eAAc,GAAI,sBAAA;AAAA,MACxB,UAAA,CAAW,IAAA;AAAA,MACX,YAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA;AAC5C,IAAA,uBACE,KAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,YAAA;AAAA,QACL,KAAA,EAAO;AAAA,UACL,GAAG,UAAA,CAAW,KAAA;AAAA,UACd,QAAA;AAAA,UACA,OAAA,EAAS;AAAA;AACX,OAAA;AAAA,sBAEA,KAAA,CAAA,aAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,GAAA;AAAA,UACC,GAAG,UAAA,CAAW,QAAA,EAAU,QAAQ,CAAA;AAAA,UACjC,SAAA,EAAW,IAAA,CAAK,MAAA,CAAO,sBAAsB,CAAA,EAAG;AAAA,YAC9C,CAAC,MAAA,CAAO,0BAA0B,CAAC,GAAG,IAAA,KAAS,IAAA;AAAA,YAC/C,CAAC,MAAA,CAAO,0BAA0B,CAAC,GAAG,IAAA,KAAS;AAAA,WAChD;AAAA,SAAA;AAAA,wBAED,KAAA,CAAA,aAAA;AAAA,UAAC,kBAAA,CAAmB,QAAA;AAAA,UAAnB;AAAA,YACC,KAAA,EAAO;AAAA,cACL,IAAA;AAAA,cACA,eAAe,aAAA,CAAc,GAAA;AAAA,gBAAI,CAAC,KAAA,KAChC,UAAA,CAAW,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAC;AAAA,eAChC;AAAA,cACA,YAAY,QAAA,CAAS;AAAA;AACvB,WAAA;AAAA,0BAEA,KAAA,CAAA,aAAA,CAACA,qBAAsB,QAAA,EAAtB,EAA+B,OAAO,QAAA,EAAA,kBACrC,KAAA,CAAA,aAAA,CAAC,cAAA,EAAA,EAAe,UAAA,EAAwB,CAC1C;AAAA;AACF;AACF,KACF;AAAA,EAEJ,CACF,CAAA;AAEJ,CAAC;;;;"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BreadcrumbsSeparator.js","sources":["../../../../../../src/Breadcrumbs/src/BreadcrumbsSeparator.tsx"],"sourcesContent":["import clsx from 'clsx';\nimport React, { useContext } from 'react';\nimport styles from '@danske/sapphire-css/components/breadcrumbs/breadcrumbs.module.css';\nimport { ChevronRight } from '@danske/sapphire-icons/react';\nimport { Icon } from '@danske/sapphire-react';\nimport { BreadcrumbsContext } from './Breadcrumbs';\n\nexport const BreadcrumbsSeparator = (): JSX.Element => {\n const { size } = useContext(BreadcrumbsContext);\n\n // Based on the design\n const iconSize = size === 'lg' ? 'md' : 'sm';\n\n return (\n <span\n className={clsx(styles['sapphire-breadcrumbs__separator'])}\n aria-hidden=\"true\"\n >\n <Icon size={iconSize}>\n <ChevronRight />\n </Icon>\n </span>\n );\n};\n"],"names":[],"mappings":";;;;;;;AAOO,MAAM,uBAAuB,MAAmB;AACrD,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,UAAA,CAAW,kBAAkB,CAAA;AAG9C,EAAA,MAAM,QAAA,GAAW,IAAA,KAAS,IAAA,GAAO,IAAA,GAAO,IAAA;AAExC,EAAA,uBACE,KAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,IAAA,CAAK,MAAA,CAAO,iCAAiC,CAAC,CAAA;AAAA,MACzD,aAAA,EAAY;AAAA,KAAA;AAAA,wCAEX,IAAA,EAAA,EAAK,IAAA,EAAM,QAAA,EAAA,kBACV,KAAA,CAAA,aAAA,CAAC,kBAAa,CAChB;AAAA,GACF;AAEJ;;;;"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBreadcrumbThreshold.js","sources":["../../../../../../src/Breadcrumbs/src/useBreadcrumbThreshold.ts"],"sourcesContent":["import { useState, useMemo, useEffect } from 'react';\nimport { useResizeObserver } from 'react-aria/private/utils/useResizeObserver';\n\nexport const useBreadcrumbThreshold = (\n childrenCount: number,\n containerRef: React.RefObject<HTMLElement>,\n breadcrumbRef: React.RefObject<HTMLOListElement>\n) => {\n const [itemWidths, setItemWidths] = useState<number[]>([]);\n const [containerWidth, setContainerWidth] = useState<number>(0);\n\n const { shouldRenderOverflow, maxVisibleTailChildren } = useMemo(() => {\n if (!containerWidth || itemWidths.length === 0) {\n return {\n shouldRenderOverflow: false,\n maxVisibleTailChildren: childrenCount,\n };\n }\n\n // Exit early if the container is wider than all items combined\n const totalItemWidth = itemWidths.reduce((a, b) => a + b, 0);\n if (totalItemWidth <= containerWidth) {\n return {\n shouldRenderOverflow: false,\n maxVisibleTailChildren: itemWidths.length - 1,\n };\n }\n\n // The minimum number of items in the container is 2 (first and last).\n let totalWidth = itemWidths[0] + itemWidths[itemWidths.length - 1];\n let visibleTailCount = 1; // Last item counted by default\n\n for (\n let i = itemWidths.length - 2;\n i > 0 && totalWidth + itemWidths[i] < containerWidth;\n i--\n ) {\n totalWidth += itemWidths[i];\n visibleTailCount++;\n }\n\n visibleTailCount--; // When we are overflowing, take into account the icon button that will be rendered\n return {\n shouldRenderOverflow: true,\n maxVisibleTailChildren: Math.max(1, visibleTailCount),\n };\n }, [itemWidths, containerWidth, childrenCount]);\n\n /**\n * Compute the individual widths of the breadcrumb items.\n * It's important to have these values for all the items, since they disappear if the container\n * is overflowing. We need these values to recompute the number of items that can fit,\n * but we can't do that once they have disappeared from the container.\n */\n const computeItemWidths = () => {\n if (!breadcrumbRef.current) return;\n const breadcrumbItems = Array.from(\n breadcrumbRef.current.children\n ) as HTMLElement[];\n const widths = breadcrumbItems\n .map((item) => item.offsetWidth)\n .filter(Boolean);\n\n if (widths.length === breadcrumbItems.length) {\n setItemWidths(widths);\n }\n };\n\n /**\n * Recompute the item widths when the children change.\n */\n useEffect(() => {\n if (childrenCount !== itemWidths.length) {\n computeItemWidths();\n }\n }, [containerRef.current, childrenCount]);\n\n useResizeObserver({\n ref: containerRef,\n onResize: () => {\n if (!containerRef.current) return;\n setContainerWidth(containerRef.current.offsetWidth);\n },\n });\n\n const overflowNodes = useMemo(() => {\n if (childrenCount > 0 && shouldRenderOverflow) {\n const tailCount = maxVisibleTailChildren > 1 ? maxVisibleTailChildren : 1;\n const actualTailCount =\n maxVisibleTailChildren === 1 ? maxVisibleTailChildren : tailCount;\n const limitedTailCount = Math.min(actualTailCount, 5); // By design, we limit the number of visible tail items to 6\n const tailStartIndex = childrenCount - limitedTailCount;\n // Return overflow indexes (hidden items) - all items except first and tail items\n return Array.from({ length: tailStartIndex - 1 }, (_, i) => i + 1);\n }\n return [];\n }, [childrenCount, shouldRenderOverflow, maxVisibleTailChildren]);\n\n return {\n overflowNodes,\n };\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { EditableCellContent } from './src/EditableCellContent.js';
2
+ import { DataGrid } from './src/DataGrid.js';
3
+
4
+ const _DataGrid = Object.assign(DataGrid, {
5
+ EditableCellContent
6
+ });
7
+
8
+ export { _DataGrid as DataGrid };
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../../src/DataGrid/index.ts"],"sourcesContent":["import { EditableCellContent } from './src/EditableCellContent';\nimport { DataGrid } from './src/DataGrid';\n\nexport {\n type DataGridColumn,\n type DataGridAccessorKeyColumn,\n type DataGridAccessorFnColumn,\n type DataGridDisplayColumn,\n type DataGridBodyCellRenderProps,\n type DataGridProps,\n type DataGridSortDescriptor,\n type DataGridSelectionMode,\n type Layout,\n type ColumnSizingFor,\n type FixedColumnSizing,\n type AutoColumnSizing,\n} from './src/DataGrid';\n\nexport {\n createDataGridColumnHelper,\n type CreateDataGridColumnHelperOptions,\n type DataGridColumnHelper,\n} from './src/createDataGridColumnHelper';\n\nconst _DataGrid = Object.assign(DataGrid, {\n EditableCellContent,\n});\n\nexport { _DataGrid as DataGrid };\n"],"names":[],"mappings":";;;AAwBA,MAAM,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU;AAAA,EACxC;AACF,CAAC;;;;"}
@@ -0,0 +1,463 @@
1
+ import React, { useRef, useMemo } from 'react';
2
+ import { useReactTable, getExpandedRowModel, getSortedRowModel, getCoreRowModel, flexRender } from '@tanstack/react-table';
3
+ import { useVirtualizer } from '@tanstack/react-virtual';
4
+ import { useThemeCheck, useSapphireStyleProps, Skeleton, Checkbox, Table } from '@danske/sapphire-react';
5
+ import { useControlledState } from 'react-stately/useControlledState';
6
+ import { useLoadMore } from 'react-aria/private/utils/useLoadMore';
7
+ import { useMeasureColumnWidths } from './useMeasureColumnWidths.js';
8
+ import { useGridKeyboardNavigation } from './useGridKeyboardNavigation.js';
9
+ import { RadioBox } from '../../../../core/src/Radio/src/RadioBox.js';
10
+ import { PaginationContext } from '../../../../core/src/Pagination/src/usePaginationContext.js';
11
+ import { DataGridCellContext } from './DataGridCellContext.js';
12
+
13
+ const DEFAULT_ROW_HEIGHTS = {
14
+ sm: 40,
15
+ md: 48,
16
+ lg: 56,
17
+ xl: 64
18
+ };
19
+ const SELECTION_COLUMN_ID = "__selection";
20
+ function DataGrid({
21
+ "aria-label": ariaLabel,
22
+ columns,
23
+ data,
24
+ cellSpacing = "md",
25
+ sortDescriptor,
26
+ onSortChange,
27
+ defaultSortDescriptor,
28
+ selectionMode = "none",
29
+ disallowEmptySelection,
30
+ getRowId,
31
+ selectedRowIds: selectedRowsProp,
32
+ defaultSelectedRowIds,
33
+ onSelectionChange,
34
+ emptyState,
35
+ loadingState,
36
+ loadingSkeletonRowsCount = 3,
37
+ hideLastDivider,
38
+ enableRowVirtualization,
39
+ estimatedRowHeight,
40
+ rowExpansion,
41
+ expandedRowIds,
42
+ defaultExpandedRowIds,
43
+ onExpandedRowsChange,
44
+ onLoadMore,
45
+ onRowAction,
46
+ isDisabled,
47
+ disabledBehavior = "all",
48
+ layout = "auto",
49
+ footer,
50
+ stickyHeader = "auto",
51
+ stickyFooter = "auto",
52
+ context,
53
+ ...otherProps
54
+ }) {
55
+ useThemeCheck();
56
+ const { styleProps, filteredProps } = useSapphireStyleProps(otherProps);
57
+ const [sorting, setSorting] = useControlledState(
58
+ toSortingState(sortDescriptor),
59
+ toSortingState(defaultSortDescriptor) ?? [],
60
+ (sortingState) => {
61
+ onSortChange?.(fromSortingState(sortingState));
62
+ }
63
+ );
64
+ const [rowSelection, setRowSelection] = useControlledState(
65
+ toBooleanMap(selectedRowsProp),
66
+ toBooleanMap(defaultSelectedRowIds) ?? {},
67
+ (state) => {
68
+ onSelectionChange?.(
69
+ fromBooleanMap(state),
70
+ pendingSelectionInteraction.current
71
+ );
72
+ }
73
+ );
74
+ const pendingSelectionInteraction = useRef("select");
75
+ const handleRowSelectionChange = (updater) => {
76
+ const newValue = typeof updater === "function" ? updater(rowSelection) : updater;
77
+ if (!disallowEmptySelection || Object.values(newValue).filter(Boolean).length > 0) {
78
+ setRowSelection(newValue);
79
+ pendingSelectionInteraction.current = "select";
80
+ }
81
+ };
82
+ const [expanded, setExpanded] = useControlledState(
83
+ toBooleanMap(expandedRowIds),
84
+ toBooleanMap(defaultExpandedRowIds) ?? {},
85
+ (expandedState) => {
86
+ onExpandedRowsChange?.(
87
+ expandedState === true ? [] : fromBooleanMap(expandedState)
88
+ );
89
+ }
90
+ );
91
+ const contextRef = useRef(context);
92
+ contextRef.current = context;
93
+ const allColumns = useMemo(() => {
94
+ const result = [];
95
+ if (selectionMode !== "none") {
96
+ result.push({
97
+ id: SELECTION_COLUMN_ID,
98
+ header: selectionMode === "multiple" ? ({ table: table2 }) => /* @__PURE__ */ React.createElement(
99
+ Checkbox,
100
+ {
101
+ "aria-label": "Select all",
102
+ isSelected: table2.getIsAllRowsSelected(),
103
+ isIndeterminate: table2.getIsSomeRowsSelected(),
104
+ isDisabled: isDisabled === true,
105
+ onChange: (isSelected) => {
106
+ pendingSelectionInteraction.current = "select-all";
107
+ table2.toggleAllRowsSelected(isSelected);
108
+ }
109
+ }
110
+ ) : () => null,
111
+ cell: ({ row }) => {
112
+ const checkboxProps = {
113
+ "aria-label": "Select",
114
+ // TODO(i18n)
115
+ isSelected: row.getIsSelected(),
116
+ isDisabled: !row.getCanSelect(),
117
+ onChange: (isSelected) => row.toggleSelected(isSelected)
118
+ };
119
+ return selectionMode === "single" && disallowEmptySelection ? /* @__PURE__ */ React.createElement(RadioBox, { role: "checkbox", ...checkboxProps }) : /* @__PURE__ */ React.createElement(Checkbox, { ...checkboxProps });
120
+ },
121
+ renderLoadingSkeleton: (i) => /* @__PURE__ */ React.createElement(Skeleton.From, { index: i, margin: "auto" }, /* @__PURE__ */ React.createElement(Checkbox, null))
122
+ });
123
+ }
124
+ result.push(
125
+ ...columns.map(({ header, cell, footer: footer2, ...column }) => {
126
+ return {
127
+ ...column,
128
+ header: typeof header === "function" ? () => header({ context: contextRef.current }) : header,
129
+ footer: typeof footer2 === "function" ? () => footer2({ context: contextRef.current }) : footer2,
130
+ cell: ({ row, getValue }) => {
131
+ const value = getValue();
132
+ if (!cell) {
133
+ return value;
134
+ }
135
+ return cell({
136
+ rowData: row.original,
137
+ value,
138
+ rowIndex: row.index,
139
+ context: contextRef.current
140
+ });
141
+ }
142
+ };
143
+ })
144
+ );
145
+ return result;
146
+ }, [
147
+ selectionMode,
148
+ disallowEmptySelection,
149
+ isDisabled,
150
+ disabledBehavior,
151
+ columns
152
+ ]);
153
+ const table = useReactTable({
154
+ data,
155
+ columns: allColumns,
156
+ state: { sorting, rowSelection, expanded },
157
+ defaultColumn: {
158
+ enableSorting: false,
159
+ // TODO(decision): should sorting be enabled or disabled by default?
160
+ size: void 0
161
+ },
162
+ getRowId,
163
+ getSubRows: rowExpansion?.type === "subRows" ? rowExpansion.getSubRows : void 0,
164
+ getCoreRowModel: getCoreRowModel(),
165
+ getSortedRowModel: getSortedRowModel(),
166
+ getExpandedRowModel: getExpandedRowModel(),
167
+ // sorting
168
+ enableMultiSort: false,
169
+ sortDescFirst: false,
170
+ // TODO(decision): should it be an option?
171
+ manualSorting: sortDescriptor !== void 0,
172
+ onSortingChange: setSorting,
173
+ // row selection
174
+ enableRowSelection: selectionMode === "none" ? false : isDisabled !== void 0 ? (tanStackRow) => {
175
+ const disabled = typeof isDisabled === "function" ? isDisabled?.(tanStackRow.original) : isDisabled;
176
+ return !disabled;
177
+ } : true,
178
+ enableMultiRowSelection: selectionMode === "multiple",
179
+ onRowSelectionChange: handleRowSelectionChange,
180
+ // row expansion
181
+ onExpandedChange: setExpanded
182
+ });
183
+ const containerRef = useRef(null);
184
+ const tableRef = useRef(null);
185
+ const { measuredColumnWidths } = useMeasureColumnWidths({
186
+ table,
187
+ data,
188
+ tableRef,
189
+ enabled: Boolean(enableRowVirtualization && layout === "auto")
190
+ });
191
+ const rows = table.getRowModel().rows;
192
+ const rowItems = [];
193
+ if (loadingState !== "loading") {
194
+ for (const row of rows) {
195
+ const disabled = typeof isDisabled === "function" ? isDisabled?.(row.original) : isDisabled ?? false;
196
+ const expandedView = rowExpansion?.type === "expandedView" ? rowExpansion.getExpandedView(row.original, row.index) : void 0;
197
+ rowItems.push({
198
+ type: "data",
199
+ row,
200
+ hasExpandedView: Boolean(expandedView),
201
+ disabled
202
+ });
203
+ if (expandedView && row.getIsExpanded()) {
204
+ rowItems.push({
205
+ type: "expandedView",
206
+ row,
207
+ expandedView
208
+ });
209
+ }
210
+ }
211
+ }
212
+ if (loadingState) {
213
+ for (let skeletonIndex = 0; skeletonIndex < loadingSkeletonRowsCount; skeletonIndex++) {
214
+ rowItems.push({ type: "skeleton", skeletonIndex });
215
+ }
216
+ }
217
+ const { gridKeyboardNavigationProps, rangeExtractor } = useGridKeyboardNavigation({
218
+ tableRef,
219
+ enabled: true,
220
+ scrollContainerRef: containerRef,
221
+ rowItemCount: rowItems.length,
222
+ onScrollToRowIndex: enableRowVirtualization ? (...args) => {
223
+ virtualizer.scrollToIndex(...args);
224
+ } : void 0
225
+ });
226
+ const virtualizer = useVirtualizer({
227
+ count: rowItems.length,
228
+ getScrollElement: () => containerRef.current,
229
+ estimateSize: () => estimatedRowHeight ?? DEFAULT_ROW_HEIGHTS[cellSpacing],
230
+ overscan: 5,
231
+ enabled: enableRowVirtualization,
232
+ rangeExtractor
233
+ });
234
+ const virtualRows = enableRowVirtualization ? virtualizer.getVirtualItems() : null;
235
+ const topGap = (virtualRows?.[1]?.start || 0) - (virtualRows?.[0]?.end || 0);
236
+ const bottomGap = (virtualRows?.[virtualRows.length - 2]?.end || 0) - (virtualRows?.[virtualRows.length - 1]?.start || 0);
237
+ const virtualPaddingTop = virtualRows?.length ? virtualRows[0].start + topGap : 0;
238
+ const virtualPaddingBottom = virtualRows?.length ? virtualizer.getTotalSize() - virtualRows[virtualRows.length - 1].end + bottomGap : 0;
239
+ const renderedRowItems = virtualRows ? virtualRows.map((vi) => ({ rowItem: rowItems[vi.index], index: vi.index })).filter(({ rowItem }) => !!rowItem) : rowItems.map((rowItem, index) => ({ rowItem, index }));
240
+ const columnCount = table.getVisibleLeafColumns().length;
241
+ const hasFooterRow = columns.some((col) => col.footer != null);
242
+ useLoadMore(
243
+ { isLoading: !!loadingState, onLoadMore, items: data },
244
+ containerRef
245
+ );
246
+ const columnSizeVars = Object.fromEntries(
247
+ table.getVisibleLeafColumns().flatMap((col) => {
248
+ const columnDef = col.columnDef;
249
+ const width = measuredColumnWidths?.[col.id] ?? columnDef.sizing?.width;
250
+ if (width === void 0) return [];
251
+ const cssValue = typeof width === "number" ? `${width}px` : width;
252
+ return [[`--col-${col.id}-width`, cssValue]];
253
+ })
254
+ );
255
+ return /* @__PURE__ */ React.createElement(
256
+ Table.Container,
257
+ {
258
+ ref: containerRef,
259
+ hideLastDivider: hideLastDivider || data.length === 0 && !loadingState,
260
+ stickyHeader,
261
+ stickyFooter,
262
+ UNSAFE_style: styleProps.style,
263
+ UNSAFE_className: styleProps.className,
264
+ footer: footer ? /* @__PURE__ */ React.createElement(PaginationContext.Provider, { value: { scrollableRef: containerRef } }, footer) : void 0,
265
+ ...filteredProps
266
+ },
267
+ /* @__PURE__ */ React.createElement(
268
+ Table,
269
+ {
270
+ ref: tableRef,
271
+ role: "grid",
272
+ "aria-label": ariaLabel,
273
+ cellSpacing,
274
+ "aria-busy": Boolean(loadingState) || void 0,
275
+ layout: layout === "fixed" || measuredColumnWidths !== null ? "fixed" : "auto",
276
+ UNSAFE_style: columnSizeVars,
277
+ ...gridKeyboardNavigationProps
278
+ },
279
+ /* @__PURE__ */ React.createElement("colgroup", null, table.getVisibleLeafColumns().map((col) => {
280
+ const varName = `--col-${col.id}-width`;
281
+ return /* @__PURE__ */ React.createElement(
282
+ "col",
283
+ {
284
+ key: col.id,
285
+ style: columnSizeVars[varName] ? { width: `var(${varName})` } : void 0
286
+ }
287
+ );
288
+ })),
289
+ /* @__PURE__ */ React.createElement(Table.Header, null, table.getHeaderGroups().map((headerGroup) => /* @__PURE__ */ React.createElement(Table.HeaderRow, { key: headerGroup.id }, headerGroup.headers.map((header) => {
290
+ const columnDef = header.column.columnDef;
291
+ return /* @__PURE__ */ React.createElement(
292
+ Table.HeaderCell,
293
+ {
294
+ key: header.id,
295
+ allowsSorting: header.column.getCanSort(),
296
+ sortDirection: mapSortDirection(
297
+ header.column.getIsSorted()
298
+ ),
299
+ onPress: header.column.getToggleSortingHandler(),
300
+ align: columnDef.align,
301
+ variant: header.column.id === SELECTION_COLUMN_ID ? "selection" : "normal",
302
+ minWidth: columnDef.sizing?.minWidth,
303
+ maxWidth: columnDef.sizing?.maxWidth
304
+ },
305
+ header.isPlaceholder ? null : flexRender(columnDef.header, header.getContext())
306
+ );
307
+ })))),
308
+ /* @__PURE__ */ React.createElement(Table.Body, null, virtualPaddingTop > 0 && /* @__PURE__ */ React.createElement("tr", { "aria-hidden": true, style: { height: virtualPaddingTop } }, /* @__PURE__ */ React.createElement("td", { colSpan: columnCount })), renderedRowItems.map(({ rowItem, index: itemIndex }) => {
309
+ if (rowItem.type === "skeleton") {
310
+ const { skeletonIndex: i } = rowItem;
311
+ return /* @__PURE__ */ React.createElement(Table.Row, { key: `skeleton-${i}`, "aria-hidden": true }, table.getVisibleLeafColumns().map((col) => {
312
+ const columnDef = col.columnDef;
313
+ const renderLoadingSkeleton = columnDef.renderLoadingSkeleton ?? ((i2) => /* @__PURE__ */ React.createElement(Skeleton.Text, { index: i2, widthType: "randomPct" }));
314
+ return /* @__PURE__ */ React.createElement(
315
+ Table.Cell,
316
+ {
317
+ key: col.id,
318
+ align: columnDef.align,
319
+ overflow: "none",
320
+ variant: col.id === SELECTION_COLUMN_ID ? "selection" : "normal"
321
+ },
322
+ renderLoadingSkeleton(i)
323
+ );
324
+ }));
325
+ }
326
+ if (rowItem.type === "expandedView") {
327
+ const { row: row2 } = rowItem;
328
+ return /* @__PURE__ */ React.createElement(
329
+ Table.Row,
330
+ {
331
+ key: `${row2.id}-expanded-view`,
332
+ "data-index": itemIndex,
333
+ ref: (element) => {
334
+ virtualizer.measureElement(element);
335
+ }
336
+ },
337
+ /* @__PURE__ */ React.createElement(Table.Cell, { colSpan: columnCount, overflow: "none" }, rowItem.expandedView)
338
+ );
339
+ }
340
+ const { row, disabled } = rowItem;
341
+ const canExpand = row.getCanExpand() || rowItem.hasExpandedView;
342
+ const toggleRowExpansion = canExpand ? () => row?.toggleExpanded() : void 0;
343
+ const toggleRowSelection = row.getCanSelect() ? () => row?.toggleSelected() : void 0;
344
+ const rowAction = onRowAction ? () => onRowAction(row.original) : void 0;
345
+ const isRowActionDisabled = disabled && disabledBehavior !== "selection";
346
+ const onAction = !isRowActionDisabled ? rowAction ?? toggleRowExpansion ?? toggleRowSelection : void 0;
347
+ const firstUserColumnId = row.getVisibleCells().find((c) => c.column.id !== SELECTION_COLUMN_ID)?.column.id;
348
+ return /* @__PURE__ */ React.createElement(
349
+ Table.Row,
350
+ {
351
+ key: row.id,
352
+ isDisabled: isRowActionDisabled,
353
+ isSelected: selectionMode !== "none" ? row.getIsSelected() : void 0,
354
+ "aria-selected": selectionMode !== "none" ? row.getIsSelected() : void 0,
355
+ onAction: onAction && ((e) => {
356
+ if (e.pointerType === "keyboard" && e.key === " " && toggleRowSelection) {
357
+ toggleRowSelection();
358
+ } else {
359
+ onAction?.();
360
+ }
361
+ }),
362
+ triggerActionOnPressStart: onAction === toggleRowSelection,
363
+ isExpanded: row.getIsExpanded() && rowExpansion?.type === "expandedView",
364
+ "aria-level": rowExpansion != null ? row.depth + 1 : void 0,
365
+ "data-grid-row": isRowActionDisabled ? void 0 : "",
366
+ "data-index": itemIndex,
367
+ ref: (element) => {
368
+ virtualizer.measureElement(element);
369
+ }
370
+ },
371
+ row.getVisibleCells().map((cell) => {
372
+ const columnDef = cell.column.columnDef;
373
+ const isTreeColumn = rowExpansion != null && cell.column.id === firstUserColumnId;
374
+ return /* @__PURE__ */ React.createElement(
375
+ DataGridCell,
376
+ {
377
+ key: cell.id,
378
+ align: columnDef.align,
379
+ isRowHeader: columnDef.isRowHeader,
380
+ variant: cell.column.id === SELECTION_COLUMN_ID ? "selection" : isTreeColumn ? "tree" : "normal"
381
+ },
382
+ isTreeColumn && canExpand && /* @__PURE__ */ React.createElement(
383
+ Table.ToggleExpandButton,
384
+ {
385
+ isExpanded: row.getIsExpanded(),
386
+ onPress: toggleRowExpansion,
387
+ isDisabled: isRowActionDisabled
388
+ }
389
+ ),
390
+ flexRender(columnDef.cell, cell.getContext())
391
+ );
392
+ })
393
+ );
394
+ }), virtualPaddingBottom > 0 && /* @__PURE__ */ React.createElement("tr", { "aria-hidden": true, style: { height: virtualPaddingBottom } }, /* @__PURE__ */ React.createElement("td", { colSpan: columnCount })), !loadingState && data.length === 0 && emptyState != null && /* @__PURE__ */ React.createElement(Table.Row, null, /* @__PURE__ */ React.createElement(Table.Cell, { colSpan: columnCount, overflow: "none" }, emptyState))),
395
+ hasFooterRow && table.getFooterGroups().map((footerGroup) => /* @__PURE__ */ React.createElement(Table.Footer, { key: footerGroup.id }, /* @__PURE__ */ React.createElement(Table.Row, null, footerGroup.headers.map((footer2) => {
396
+ const columnDef = footer2.column.columnDef;
397
+ return /* @__PURE__ */ React.createElement(
398
+ Table.Cell,
399
+ {
400
+ key: footer2.id,
401
+ role: "gridcell",
402
+ align: columnDef.align,
403
+ overflow: "none"
404
+ },
405
+ footer2.isPlaceholder ? null : flexRender(columnDef.footer, footer2.getContext())
406
+ );
407
+ }))))
408
+ )
409
+ );
410
+ }
411
+ function DataGridCell({
412
+ align,
413
+ isRowHeader,
414
+ children,
415
+ variant
416
+ }) {
417
+ const ref = React.useRef(null);
418
+ return /* @__PURE__ */ React.createElement(DataGridCellContext.Provider, { value: { ref } }, /* @__PURE__ */ React.createElement(
419
+ Table.Cell,
420
+ {
421
+ ref,
422
+ role: isRowHeader ? "rowheader" : "gridcell",
423
+ align,
424
+ overflow: "none",
425
+ variant
426
+ },
427
+ children
428
+ ));
429
+ }
430
+ function fromBooleanMap(state) {
431
+ return Object.entries(state).filter(([, isExpanded]) => isExpanded).map(([id]) => id);
432
+ }
433
+ function toBooleanMap(ids) {
434
+ return ids?.reduce((acc, id) => {
435
+ acc[id] = true;
436
+ return acc;
437
+ }, {});
438
+ }
439
+ function toSortingState(sorting) {
440
+ return sorting ? [
441
+ {
442
+ id: sorting.column,
443
+ desc: sorting.direction === "descending"
444
+ }
445
+ ] : void 0;
446
+ }
447
+ function fromSortingState(sorting) {
448
+ return sorting[0] ? {
449
+ column: sorting[0].id,
450
+ direction: sorting[0].desc ? "descending" : "ascending"
451
+ } : void 0;
452
+ }
453
+ function mapSortDirection(tanStackSortDirection) {
454
+ if (tanStackSortDirection === "asc") {
455
+ return "ascending";
456
+ } else if (tanStackSortDirection === "desc") {
457
+ return "descending";
458
+ }
459
+ return void 0;
460
+ }
461
+
462
+ export { DataGrid };
463
+ //# sourceMappingURL=DataGrid.js.map