@amboss/design-system 4.8.2-canary.0 → 4.9.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 (371) hide show
  1. package/build/cjs/components/AIButton/AIButton.js +1 -1
  2. package/build/cjs/components/AccessCardItem/AccessCardItem.js +1 -1
  3. package/build/cjs/components/Avatar/Avatar.js +1 -1
  4. package/build/cjs/components/BulkActionsToolbar/BulkActionsToolbar.js +1 -1
  5. package/build/cjs/components/Button/Button.js +1 -1
  6. package/build/cjs/components/Card/CardHeader/CardHeader.js +1 -1
  7. package/build/cjs/components/CatalogCard/CatalogCard.d.ts +5 -1
  8. package/build/cjs/components/CatalogCard/CatalogCard.js +1 -1
  9. package/build/cjs/components/CheckboxCard/CheckboxCard.js +1 -1
  10. package/build/cjs/components/Collapsible/Collapsible.js +1 -1
  11. package/build/cjs/components/Container/Container.js +1 -1
  12. package/build/cjs/components/Content/ContentBadge/ContentBadge.js +1 -1
  13. package/build/cjs/components/Content/ContentCheckbox/ContentCheckbox.js +1 -1
  14. package/build/cjs/components/Content/ContentLink/ContentLink.js +1 -1
  15. package/build/cjs/components/Content/ContentPictogramButton/ContentPictogramButton.js +1 -1
  16. package/build/cjs/components/Content/ContentTableModal/ContentTableModal.js +2 -2
  17. package/build/cjs/components/Content/ContentText/ContentText.d.ts +1 -1
  18. package/build/cjs/components/Content/ContentText/ContentText.js +1 -1
  19. package/build/cjs/components/Content/DosageButton/DosageButton.d.ts +1 -1
  20. package/build/cjs/components/CountButton/CountButton.js +1 -1
  21. package/build/cjs/components/DataTable/header/SortableCellContent.js +1 -1
  22. package/build/cjs/components/DataTable/header/TableHeader.js +1 -1
  23. package/build/cjs/components/DataTable/useDataTableSelectRows.d.ts +2 -2
  24. package/build/cjs/components/DataTable/useDataTableSelectRows.js +1 -1
  25. package/build/cjs/components/DataTable/useDataTableSort.d.ts +3 -3
  26. package/build/cjs/components/Divider/Divider.js +1 -1
  27. package/build/cjs/components/DropdownMenu/DropdownMenu.d.ts +5 -1
  28. package/build/cjs/components/DropdownMenu/DropdownMenu.js +1 -1
  29. package/build/cjs/components/DropdownMenu/Menu.d.ts +1 -1
  30. package/build/cjs/components/DropdownMenu/Menu.js +1 -1
  31. package/build/cjs/components/EntityList/BaseEntityList.js +1 -1
  32. package/build/cjs/components/EntityList/EntityItemBody.d.ts +3 -1
  33. package/build/cjs/components/EntityList/EntityItemBody.js +1 -1
  34. package/build/cjs/components/EntityList/EntityListItem.js +1 -1
  35. package/build/cjs/components/EntityTree/BaseEntityTree.d.ts +3 -2
  36. package/build/cjs/components/EntityTree/BaseEntityTree.js +1 -1
  37. package/build/cjs/components/EntityTree/EntityTreeItem.js +1 -1
  38. package/build/cjs/components/EntityTree/EntityTreeItemExpandButton.d.ts +3 -1
  39. package/build/cjs/components/EntityTree/EntityTreeItemExpandButton.js +1 -1
  40. package/build/cjs/components/EntityTree/tree.d.ts +1 -1
  41. package/build/cjs/components/EntityTree/tree.js +1 -1
  42. package/build/cjs/components/Form/Checkbox/Checkbox.js +1 -1
  43. package/build/cjs/components/Form/Combobox/Combobox.js +1 -1
  44. package/build/cjs/components/Form/Combobox/MultiSelect.d.ts +1 -1
  45. package/build/cjs/components/Form/Combobox/MultiSelect.js +1 -1
  46. package/build/cjs/components/Form/Combobox/MultiSelectReducer.d.ts +1 -1
  47. package/build/cjs/components/Form/Combobox/OptionsList.d.ts +6 -3
  48. package/build/cjs/components/Form/Combobox/OptionsList.js +1 -1
  49. package/build/cjs/components/Form/Combobox/SingleSelect.d.ts +1 -1
  50. package/build/cjs/components/Form/Combobox/SingleSelect.js +1 -1
  51. package/build/cjs/components/Form/Combobox/constants.js +1 -1
  52. package/build/cjs/components/Form/FormFieldGroup/FormFieldGroup.js +1 -1
  53. package/build/cjs/components/Form/Input/Input.js +1 -1
  54. package/build/cjs/components/Form/PasswordInput/PasswordInput.js +1 -1
  55. package/build/cjs/components/Form/PasswordInput/PasswordInputButton.d.ts +2 -2
  56. package/build/cjs/components/Form/PasswordInput/PasswordInputButton.js +1 -1
  57. package/build/cjs/components/Form/Radio/Radio.js +1 -1
  58. package/build/cjs/components/Form/RangeInput/RangeInput.js +1 -1
  59. package/build/cjs/components/Form/SearchInput/SearchInput.js +1 -1
  60. package/build/cjs/components/Form/SegmentedControl/-types.d.ts +2 -2
  61. package/build/cjs/components/Form/SegmentedControl/SegmentedControl.js +1 -1
  62. package/build/cjs/components/Form/SegmentedControl/SegmentedControlOption.js +1 -1
  63. package/build/cjs/components/Form/Select/Select.js +1 -1
  64. package/build/cjs/components/Form/Select/SelectWithCustomTrigger.js +1 -1
  65. package/build/cjs/components/Form/Select/useTypeAheadSearch.js +1 -1
  66. package/build/cjs/components/Form/Textarea/Textarea.js +1 -1
  67. package/build/cjs/components/Form/Toggle/Toggle.js +1 -1
  68. package/build/cjs/components/Form/ToggleButton/ToggleButton.js +1 -1
  69. package/build/cjs/components/Grid/Grid.js +1 -1
  70. package/build/cjs/components/Icon/Icon.js +1 -1
  71. package/build/cjs/components/Image/Image.js +1 -1
  72. package/build/cjs/components/Inline/Inline.js +1 -1
  73. package/build/cjs/components/Internal/BaseTag/BaseTag.d.ts +5 -1
  74. package/build/cjs/components/Internal/BaseTag/BaseTag.js +1 -1
  75. package/build/cjs/components/Internal/Float/Float.d.ts +1 -1
  76. package/build/cjs/components/Internal/Float/Float.js +1 -1
  77. package/build/cjs/components/Internal/PanelHeader/PanelHeader.d.ts +4 -0
  78. package/build/cjs/components/Internal/PanelHeader/PanelHeader.js +1 -1
  79. package/build/cjs/components/Internal/Sandwich/useSandwichContext.d.ts +1 -1
  80. package/build/cjs/components/Layout/-constants.d.ts +4 -0
  81. package/build/cjs/components/Layout/-constants.js +1 -1
  82. package/build/cjs/components/Layout/-types.d.ts +16 -24
  83. package/build/cjs/components/Layout/Layout.js +1 -1
  84. package/build/cjs/components/Layout/LayoutCssVars.d.ts +1 -1
  85. package/build/cjs/components/Layout/LeftPanel/LeftBarLayers.d.ts +2 -3
  86. package/build/cjs/components/Layout/LeftPanel/LeftBarLayers.js +1 -1
  87. package/build/cjs/components/Layout/LeftPanel/LeftBarToggle.d.ts +3 -4
  88. package/build/cjs/components/Layout/LeftPanel/LeftBarToggle.js +1 -1
  89. package/build/cjs/components/Layout/LeftPanel/LeftPanel.d.ts +2 -2
  90. package/build/cjs/components/Layout/LeftPanel/LeftPanel.js +1 -1
  91. package/build/cjs/components/Layout/LeftPanel/LeftPanelDocked.d.ts +4 -9
  92. package/build/cjs/components/Layout/LeftPanel/LeftPanelDocked.js +1 -1
  93. package/build/cjs/components/Layout/LeftPanel/LeftPanelFooter.js +1 -1
  94. package/build/cjs/components/Layout/LeftPanel/LeftPanelHeader.js +1 -1
  95. package/build/cjs/components/Layout/LeftPanel/LeftPanelOffcanvas.d.ts +2 -3
  96. package/build/cjs/components/Layout/LeftPanel/LeftPanelOffcanvas.js +1 -1
  97. package/build/cjs/components/Layout/LeftPanel/useLeftBarContext.d.ts +1 -1
  98. package/build/cjs/components/Layout/LeftPanel/useLeftBarContext.js +1 -1
  99. package/build/cjs/components/Layout/LeftPanel/useLeftPanelCollapseContext.d.ts +3 -3
  100. package/build/cjs/components/Layout/LeftPanel/useLeftPanelCollapseContext.js +1 -1
  101. package/build/cjs/components/Layout/Split/MobileSplitView/useMobileSplitStack.d.ts +1 -1
  102. package/build/cjs/components/Layout/context.d.ts +1 -1
  103. package/build/cjs/components/Layout/reducer.js +1 -1
  104. package/build/cjs/components/Layout/registry.d.ts +5 -5
  105. package/build/cjs/components/Layout/registry.js +1 -1
  106. package/build/cjs/components/Layout/useLayout.js +1 -1
  107. package/build/cjs/components/Layout/useLayoutRules.js +1 -1
  108. package/build/cjs/components/Layout/usePanelDockedSlide.d.ts +1 -1
  109. package/build/cjs/components/Layout/usePanelDockedSlide.js +1 -1
  110. package/build/cjs/components/Lightbox/Lightbox.js +2 -2
  111. package/build/cjs/components/Link/Link.js +1 -1
  112. package/build/cjs/components/MediaItem/MediaItem.d.ts +1 -0
  113. package/build/cjs/components/MediaItem/MediaItem.js +1 -1
  114. package/build/cjs/components/MediaItem/MediaItemSkeleton.js +1 -1
  115. package/build/cjs/components/MediaViewerBar/MediaViewerBar.js +1 -1
  116. package/build/cjs/components/MediaViewerCarousel/CarouselThumbnail/CarouselThumbnail.js +1 -1
  117. package/build/cjs/components/MediaViewerCarousel/MediaCarousel/MediaCarousel.js +1 -1
  118. package/build/cjs/components/Notification/Notification.d.ts +1 -1
  119. package/build/cjs/components/Notification/Notification.js +1 -1
  120. package/build/cjs/components/Patterns/ButtonGroup/ButtonGroup.d.ts +1 -1
  121. package/build/cjs/components/Patterns/EmptyState/EmptyState.js +1 -1
  122. package/build/cjs/components/Patterns/Modal/Modal.js +2 -2
  123. package/build/cjs/components/PictogramButton/PictogramButton.js +1 -1
  124. package/build/cjs/components/Portal/Portal.d.ts +2 -2
  125. package/build/cjs/components/PromptButton/PromptButton.js +1 -1
  126. package/build/cjs/components/PromptInput/AutocompleteList.d.ts +1 -1
  127. package/build/cjs/components/PromptInput/AutocompleteList.js +1 -1
  128. package/build/cjs/components/PromptInput/PromptInput.js +1 -1
  129. package/build/cjs/components/PromptInput/PromptTextArea.js +1 -1
  130. package/build/cjs/components/RadioCard/RadioCard.js +1 -1
  131. package/build/cjs/components/RoundButton/RoundButton.js +1 -1
  132. package/build/cjs/components/SearchResult/SearchResult.js +1 -1
  133. package/build/cjs/components/SegmentedProgressBar/-utils/getPercentagesForVariants.d.ts +4 -2
  134. package/build/cjs/components/SegmentedProgressBar/-utils/getPercentagesForVariants.js +1 -1
  135. package/build/cjs/components/SegmentedProgressBar/LegendPopover.d.ts +2 -1
  136. package/build/cjs/components/SegmentedProgressBar/LegendPopover.js +1 -1
  137. package/build/cjs/components/SegmentedProgressBar/SegmentedProgressBar.js +1 -1
  138. package/build/cjs/components/ShadowWebComponent/ShadowWebComponent.js +1 -1
  139. package/build/cjs/components/Sheet/Sheet.d.ts +1 -1
  140. package/build/cjs/components/Sheet/Sheet.js +1 -1
  141. package/build/cjs/components/SplashCard/SplashCard.js +1 -1
  142. package/build/cjs/components/SplashCardMedia/SplashCardMedia.js +1 -1
  143. package/build/cjs/components/Stack/Stack.js +1 -1
  144. package/build/cjs/components/SubThemeProvider/SubThemeContext.d.ts +1 -1
  145. package/build/cjs/components/SubThemeProvider/SubThemeProvider.d.ts +2 -1
  146. package/build/cjs/components/SubThemeProvider/SubThemeProvider.js +1 -1
  147. package/build/cjs/components/Tabs/Tabs.js +1 -1
  148. package/build/cjs/components/TagGroup/TagGroup.js +1 -1
  149. package/build/cjs/components/Toast/Toast.d.ts +2 -1
  150. package/build/cjs/components/Toast/Toast.js +1 -1
  151. package/build/cjs/components/Toast/ToastProvider.d.ts +5 -3
  152. package/build/cjs/components/Toggletip/BasePopover.js +1 -1
  153. package/build/cjs/components/Tooltip/TooltipContent.d.ts +1 -1
  154. package/build/cjs/components/Tooltip/TooltipContent.js +1 -1
  155. package/build/cjs/components/Typography/StyledText/StyledText.d.ts +1 -1
  156. package/build/cjs/components/Typography/StyledText/StyledText.js +1 -1
  157. package/build/cjs/components/Typography/Text/Text.d.ts +1 -1
  158. package/build/cjs/components/Typography/Text/Text.js +1 -1
  159. package/build/cjs/components/Typography/Text/TextSkeleton.js +1 -1
  160. package/build/cjs/components/Typography/TextClamped/TextClamped.js +1 -1
  161. package/build/cjs/components/UserHighlightTooltip/UserHighlightTooltip.d.ts +1 -1
  162. package/build/cjs/components/UserHighlightTooltip/UserHighlightTooltip.js +1 -1
  163. package/build/cjs/components/Utilities/ContainerQuery/ContainerQueryContext.d.ts +1 -1
  164. package/build/cjs/components/Utilities/Expandable/Expandable.js +1 -1
  165. package/build/cjs/components/Utilities/FloatingPosition/utils.d.ts +1 -1
  166. package/build/cjs/components/VirtualScrollList/VirtualScrollList.d.ts +1 -1
  167. package/build/cjs/components/VirtualScrollList/VirtualScrollList.js +1 -1
  168. package/build/cjs/components/VirtualScrollList/VirtualScrollListReducer.d.ts +2 -2
  169. package/build/cjs/components/VirtualScrollList/VirtualScrollListReducer.js +1 -1
  170. package/build/cjs/shared/appendId.d.ts +1 -1
  171. package/build/cjs/shared/forwardRefPolymorphic.d.ts +2 -0
  172. package/build/cjs/shared/forwardRefPolymorphic.js +1 -0
  173. package/build/cjs/shared/intl/translations/de.json +7 -1
  174. package/build/cjs/shared/intl/translations/en.json +7 -1
  175. package/build/cjs/shared/mediaQueries.d.ts +3 -3
  176. package/build/cjs/shared/mixins/Button/getPillStyles.js +1 -1
  177. package/build/cjs/shared/useAutoPosition.js +1 -1
  178. package/build/cjs/shared/useHover.d.ts +1 -1
  179. package/build/cjs/shared/useHover.js +1 -1
  180. package/build/cjs/shared/useOutsideClickDeactivatesWithinPortal.d.ts +1 -1
  181. package/build/cjs/shared/useOutsideClickDeactivatesWithinPortal.js +1 -1
  182. package/build/cjs/web-tokens/_colors.json +12 -12
  183. package/build/cjs/web-tokens/_sizes.json +55 -55
  184. package/build/cjs/web-tokens/visualConfig.d.ts +1 -0
  185. package/build/cjs/web-tokens/visualConfig.js +1 -1
  186. package/build/esm/components/AIButton/AIButton.js +1 -1
  187. package/build/esm/components/AccessCardItem/AccessCardItem.js +1 -1
  188. package/build/esm/components/Avatar/Avatar.js +1 -1
  189. package/build/esm/components/BulkActionsToolbar/BulkActionsToolbar.js +1 -1
  190. package/build/esm/components/Button/Button.js +1 -1
  191. package/build/esm/components/Card/CardHeader/CardHeader.js +1 -1
  192. package/build/esm/components/CatalogCard/CatalogCard.d.ts +5 -1
  193. package/build/esm/components/CatalogCard/CatalogCard.js +1 -1
  194. package/build/esm/components/CheckboxCard/CheckboxCard.js +1 -1
  195. package/build/esm/components/Collapsible/Collapsible.js +1 -1
  196. package/build/esm/components/Container/Container.js +1 -1
  197. package/build/esm/components/Content/ContentBadge/ContentBadge.js +1 -1
  198. package/build/esm/components/Content/ContentCheckbox/ContentCheckbox.js +1 -1
  199. package/build/esm/components/Content/ContentLink/ContentLink.js +1 -1
  200. package/build/esm/components/Content/ContentPictogramButton/ContentPictogramButton.js +1 -1
  201. package/build/esm/components/Content/ContentTableModal/ContentTableModal.js +2 -2
  202. package/build/esm/components/Content/ContentText/ContentText.d.ts +1 -1
  203. package/build/esm/components/Content/ContentText/ContentText.js +1 -1
  204. package/build/esm/components/Content/DosageButton/DosageButton.d.ts +1 -1
  205. package/build/esm/components/CountButton/CountButton.js +1 -1
  206. package/build/esm/components/DataTable/header/SortableCellContent.js +1 -1
  207. package/build/esm/components/DataTable/header/TableHeader.js +1 -1
  208. package/build/esm/components/DataTable/useDataTableSelectRows.d.ts +2 -2
  209. package/build/esm/components/DataTable/useDataTableSelectRows.js +1 -1
  210. package/build/esm/components/DataTable/useDataTableSort.d.ts +3 -3
  211. package/build/esm/components/Divider/Divider.js +1 -1
  212. package/build/esm/components/DropdownMenu/DropdownMenu.d.ts +5 -1
  213. package/build/esm/components/DropdownMenu/DropdownMenu.js +1 -1
  214. package/build/esm/components/DropdownMenu/Menu.d.ts +1 -1
  215. package/build/esm/components/DropdownMenu/Menu.js +1 -1
  216. package/build/esm/components/EntityList/BaseEntityList.js +1 -1
  217. package/build/esm/components/EntityList/EntityItemBody.d.ts +3 -1
  218. package/build/esm/components/EntityList/EntityItemBody.js +1 -1
  219. package/build/esm/components/EntityList/EntityListItem.js +1 -1
  220. package/build/esm/components/EntityTree/BaseEntityTree.d.ts +3 -2
  221. package/build/esm/components/EntityTree/BaseEntityTree.js +1 -1
  222. package/build/esm/components/EntityTree/EntityTreeItem.js +1 -1
  223. package/build/esm/components/EntityTree/EntityTreeItemExpandButton.d.ts +3 -1
  224. package/build/esm/components/EntityTree/EntityTreeItemExpandButton.js +1 -1
  225. package/build/esm/components/EntityTree/tree.d.ts +1 -1
  226. package/build/esm/components/EntityTree/tree.js +1 -1
  227. package/build/esm/components/Form/Checkbox/Checkbox.js +1 -1
  228. package/build/esm/components/Form/Combobox/Combobox.js +1 -1
  229. package/build/esm/components/Form/Combobox/MultiSelect.d.ts +1 -1
  230. package/build/esm/components/Form/Combobox/MultiSelect.js +1 -1
  231. package/build/esm/components/Form/Combobox/MultiSelectReducer.d.ts +1 -1
  232. package/build/esm/components/Form/Combobox/OptionsList.d.ts +6 -3
  233. package/build/esm/components/Form/Combobox/OptionsList.js +1 -1
  234. package/build/esm/components/Form/Combobox/SingleSelect.d.ts +1 -1
  235. package/build/esm/components/Form/Combobox/SingleSelect.js +1 -1
  236. package/build/esm/components/Form/Combobox/constants.js +1 -1
  237. package/build/esm/components/Form/FormFieldGroup/FormFieldGroup.js +1 -1
  238. package/build/esm/components/Form/Input/Input.js +1 -1
  239. package/build/esm/components/Form/PasswordInput/PasswordInput.js +1 -1
  240. package/build/esm/components/Form/PasswordInput/PasswordInputButton.d.ts +2 -2
  241. package/build/esm/components/Form/PasswordInput/PasswordInputButton.js +1 -1
  242. package/build/esm/components/Form/Radio/Radio.js +1 -1
  243. package/build/esm/components/Form/RangeInput/RangeInput.js +1 -1
  244. package/build/esm/components/Form/SearchInput/SearchInput.js +1 -1
  245. package/build/esm/components/Form/SegmentedControl/-types.d.ts +2 -2
  246. package/build/esm/components/Form/SegmentedControl/SegmentedControl.js +1 -1
  247. package/build/esm/components/Form/SegmentedControl/SegmentedControlOption.js +1 -1
  248. package/build/esm/components/Form/Select/Select.js +1 -1
  249. package/build/esm/components/Form/Select/SelectWithCustomTrigger.js +1 -1
  250. package/build/esm/components/Form/Select/useTypeAheadSearch.js +1 -1
  251. package/build/esm/components/Form/Textarea/Textarea.js +1 -1
  252. package/build/esm/components/Form/Toggle/Toggle.js +1 -1
  253. package/build/esm/components/Form/ToggleButton/ToggleButton.js +1 -1
  254. package/build/esm/components/Grid/Grid.js +1 -1
  255. package/build/esm/components/Icon/Icon.js +1 -1
  256. package/build/esm/components/Image/Image.js +1 -1
  257. package/build/esm/components/Inline/Inline.js +1 -1
  258. package/build/esm/components/Internal/BaseTag/BaseTag.d.ts +5 -1
  259. package/build/esm/components/Internal/BaseTag/BaseTag.js +1 -1
  260. package/build/esm/components/Internal/Float/Float.d.ts +1 -1
  261. package/build/esm/components/Internal/Float/Float.js +1 -1
  262. package/build/esm/components/Internal/PanelHeader/PanelHeader.d.ts +4 -0
  263. package/build/esm/components/Internal/PanelHeader/PanelHeader.js +1 -1
  264. package/build/esm/components/Internal/Sandwich/useSandwichContext.d.ts +1 -1
  265. package/build/esm/components/Layout/-constants.d.ts +4 -0
  266. package/build/esm/components/Layout/-constants.js +1 -1
  267. package/build/esm/components/Layout/-types.d.ts +16 -24
  268. package/build/esm/components/Layout/Layout.js +1 -1
  269. package/build/esm/components/Layout/LayoutCssVars.d.ts +1 -1
  270. package/build/esm/components/Layout/LeftPanel/LeftBarLayers.d.ts +2 -3
  271. package/build/esm/components/Layout/LeftPanel/LeftBarLayers.js +1 -1
  272. package/build/esm/components/Layout/LeftPanel/LeftBarToggle.d.ts +3 -4
  273. package/build/esm/components/Layout/LeftPanel/LeftBarToggle.js +1 -1
  274. package/build/esm/components/Layout/LeftPanel/LeftPanel.d.ts +2 -2
  275. package/build/esm/components/Layout/LeftPanel/LeftPanel.js +1 -1
  276. package/build/esm/components/Layout/LeftPanel/LeftPanelDocked.d.ts +4 -9
  277. package/build/esm/components/Layout/LeftPanel/LeftPanelDocked.js +1 -1
  278. package/build/esm/components/Layout/LeftPanel/LeftPanelFooter.js +1 -1
  279. package/build/esm/components/Layout/LeftPanel/LeftPanelHeader.js +1 -1
  280. package/build/esm/components/Layout/LeftPanel/LeftPanelOffcanvas.d.ts +2 -3
  281. package/build/esm/components/Layout/LeftPanel/LeftPanelOffcanvas.js +1 -1
  282. package/build/esm/components/Layout/LeftPanel/useLeftBarContext.d.ts +1 -1
  283. package/build/esm/components/Layout/LeftPanel/useLeftBarContext.js +1 -1
  284. package/build/esm/components/Layout/LeftPanel/useLeftPanelCollapseContext.d.ts +3 -3
  285. package/build/esm/components/Layout/LeftPanel/useLeftPanelCollapseContext.js +1 -1
  286. package/build/esm/components/Layout/Split/MobileSplitView/useMobileSplitStack.d.ts +1 -1
  287. package/build/esm/components/Layout/context.d.ts +1 -1
  288. package/build/esm/components/Layout/reducer.js +1 -1
  289. package/build/esm/components/Layout/registry.d.ts +5 -5
  290. package/build/esm/components/Layout/registry.js +1 -1
  291. package/build/esm/components/Layout/useLayout.js +1 -1
  292. package/build/esm/components/Layout/useLayoutRules.js +1 -1
  293. package/build/esm/components/Layout/usePanelDockedSlide.d.ts +1 -1
  294. package/build/esm/components/Layout/usePanelDockedSlide.js +1 -1
  295. package/build/esm/components/Lightbox/Lightbox.js +2 -2
  296. package/build/esm/components/Link/Link.js +1 -1
  297. package/build/esm/components/MediaItem/MediaItem.d.ts +1 -0
  298. package/build/esm/components/MediaItem/MediaItem.js +1 -1
  299. package/build/esm/components/MediaItem/MediaItemSkeleton.js +1 -1
  300. package/build/esm/components/MediaViewerBar/MediaViewerBar.js +1 -1
  301. package/build/esm/components/MediaViewerCarousel/CarouselThumbnail/CarouselThumbnail.js +1 -1
  302. package/build/esm/components/MediaViewerCarousel/MediaCarousel/MediaCarousel.js +1 -1
  303. package/build/esm/components/Notification/Notification.d.ts +1 -1
  304. package/build/esm/components/Notification/Notification.js +1 -1
  305. package/build/esm/components/Patterns/ButtonGroup/ButtonGroup.d.ts +1 -1
  306. package/build/esm/components/Patterns/EmptyState/EmptyState.js +1 -1
  307. package/build/esm/components/Patterns/Modal/Modal.js +2 -2
  308. package/build/esm/components/PictogramButton/PictogramButton.js +1 -1
  309. package/build/esm/components/Portal/Portal.d.ts +2 -2
  310. package/build/esm/components/PromptButton/PromptButton.js +1 -1
  311. package/build/esm/components/PromptInput/AutocompleteList.d.ts +1 -1
  312. package/build/esm/components/PromptInput/AutocompleteList.js +1 -1
  313. package/build/esm/components/PromptInput/PromptInput.js +1 -1
  314. package/build/esm/components/PromptInput/PromptTextArea.js +1 -1
  315. package/build/esm/components/RadioCard/RadioCard.js +1 -1
  316. package/build/esm/components/RoundButton/RoundButton.js +1 -1
  317. package/build/esm/components/SearchResult/SearchResult.js +1 -1
  318. package/build/esm/components/SegmentedProgressBar/-utils/getPercentagesForVariants.d.ts +4 -2
  319. package/build/esm/components/SegmentedProgressBar/-utils/getPercentagesForVariants.js +1 -1
  320. package/build/esm/components/SegmentedProgressBar/LegendPopover.d.ts +2 -1
  321. package/build/esm/components/SegmentedProgressBar/LegendPopover.js +1 -1
  322. package/build/esm/components/SegmentedProgressBar/SegmentedProgressBar.js +1 -1
  323. package/build/esm/components/ShadowWebComponent/ShadowWebComponent.js +1 -1
  324. package/build/esm/components/Sheet/Sheet.d.ts +1 -1
  325. package/build/esm/components/Sheet/Sheet.js +1 -1
  326. package/build/esm/components/SplashCard/SplashCard.js +1 -1
  327. package/build/esm/components/SplashCardMedia/SplashCardMedia.js +1 -1
  328. package/build/esm/components/Stack/Stack.js +1 -1
  329. package/build/esm/components/SubThemeProvider/SubThemeContext.d.ts +1 -1
  330. package/build/esm/components/SubThemeProvider/SubThemeProvider.d.ts +2 -1
  331. package/build/esm/components/SubThemeProvider/SubThemeProvider.js +1 -1
  332. package/build/esm/components/Tabs/Tabs.js +1 -1
  333. package/build/esm/components/TagGroup/TagGroup.js +1 -1
  334. package/build/esm/components/Toast/Toast.d.ts +2 -1
  335. package/build/esm/components/Toast/Toast.js +1 -1
  336. package/build/esm/components/Toast/ToastProvider.d.ts +5 -3
  337. package/build/esm/components/Toggletip/BasePopover.js +1 -1
  338. package/build/esm/components/Tooltip/TooltipContent.d.ts +1 -1
  339. package/build/esm/components/Tooltip/TooltipContent.js +1 -1
  340. package/build/esm/components/Typography/StyledText/StyledText.d.ts +1 -1
  341. package/build/esm/components/Typography/StyledText/StyledText.js +1 -1
  342. package/build/esm/components/Typography/Text/Text.d.ts +1 -1
  343. package/build/esm/components/Typography/Text/Text.js +1 -1
  344. package/build/esm/components/Typography/Text/TextSkeleton.js +1 -1
  345. package/build/esm/components/Typography/TextClamped/TextClamped.js +1 -1
  346. package/build/esm/components/UserHighlightTooltip/UserHighlightTooltip.d.ts +1 -1
  347. package/build/esm/components/UserHighlightTooltip/UserHighlightTooltip.js +1 -1
  348. package/build/esm/components/Utilities/ContainerQuery/ContainerQueryContext.d.ts +1 -1
  349. package/build/esm/components/Utilities/Expandable/Expandable.js +1 -1
  350. package/build/esm/components/Utilities/FloatingPosition/utils.d.ts +1 -1
  351. package/build/esm/components/VirtualScrollList/VirtualScrollList.d.ts +1 -1
  352. package/build/esm/components/VirtualScrollList/VirtualScrollList.js +1 -1
  353. package/build/esm/components/VirtualScrollList/VirtualScrollListReducer.d.ts +2 -2
  354. package/build/esm/components/VirtualScrollList/VirtualScrollListReducer.js +1 -1
  355. package/build/esm/shared/appendId.d.ts +1 -1
  356. package/build/esm/shared/forwardRefPolymorphic.d.ts +2 -0
  357. package/build/esm/shared/forwardRefPolymorphic.js +1 -0
  358. package/build/esm/shared/intl/translations/de.json +7 -1
  359. package/build/esm/shared/intl/translations/en.json +7 -1
  360. package/build/esm/shared/mediaQueries.d.ts +3 -3
  361. package/build/esm/shared/mixins/Button/getPillStyles.js +1 -1
  362. package/build/esm/shared/useAutoPosition.js +1 -1
  363. package/build/esm/shared/useHover.d.ts +1 -1
  364. package/build/esm/shared/useHover.js +1 -1
  365. package/build/esm/shared/useOutsideClickDeactivatesWithinPortal.d.ts +1 -1
  366. package/build/esm/shared/useOutsideClickDeactivatesWithinPortal.js +1 -1
  367. package/build/esm/web-tokens/_colors.json +12 -12
  368. package/build/esm/web-tokens/_sizes.json +55 -55
  369. package/build/esm/web-tokens/visualConfig.d.ts +1 -0
  370. package/build/esm/web-tokens/visualConfig.js +1 -1
  371. package/package.json +9 -5
@@ -7,6 +7,6 @@ export type ContentTextProps = TypographyTextProps & {
7
7
  /** Provides additional line-height */
8
8
  isSpacedOut?: boolean;
9
9
  };
10
- export declare const ContentTextContext: React.Context<Pick<ContentTextProps, "color" | "size" | "weight" | "isSpacedOut">>;
10
+ export declare const ContentTextContext: React.Context<Pick<ContentTextProps, "color" | "size" | "weight" | "isSpacedOut"> | null>;
11
11
  export declare const CONTENT_TEXT_LINE_HEIGHT_OFFSET = 0.14;
12
12
  export declare function ContentText({ size, color, weight, isSpacedOut, children, ...rest }: ContentTextProps): React.ReactElement;
@@ -1 +1 @@
1
- import React,{createContext,useContext,useMemo}from"react";import styled from"@emotion/styled";import{Text}from"../../Typography/Text";import{FontSizeOffsetContext}from"../ContentFontResizer/FontSizeOffsetContext";import{ContentTableContext}from"../ContentTable/ContentTableContext";import{getTextFontSize,getTextLineHeight}from"../../Typography/Text/Text";import{isContentColor}from"../utils/isContentColor";export const ContentTextContext=createContext(null);export const CONTENT_TEXT_LINE_HEIGHT_OFFSET=.14;let TextComponent=styled(Text,{target:"e1ygjcq60",label:"TextComponent"})(({theme,fontSizeOffset,contentColor,size,isSpacedOut})=>{let fontSize=getTextFontSize({theme,size}),lineHeight=getTextLineHeight({theme,size}),textLineHeightOffset=.14*!!isSpacedOut;return{fontSize:0!==fontSizeOffset?`calc(${fontSize} + ${fontSizeOffset}px)`:fontSize,lineHeight:0!==textLineHeightOffset?`calc(${lineHeight} + ${textLineHeightOffset})`:lineHeight,...contentColor&&{color:theme.values.color.content.text[contentColor].default}}});export function ContentText({size="m",color,weight,isSpacedOut=!1,children,...rest}){let fontSizeOffset=useContext(FontSizeOffsetContext),contentTableContext=useContext(ContentTableContext),tableFontSizeOffset=contentTableContext?.fontSizeOffset??0,contentColor=isContentColor(color)?color:void 0,textColor=isContentColor(color)?void 0:color,contextValue=useMemo(()=>({color,size,weight,isSpacedOut}),[color,size,weight,isSpacedOut]);return React.createElement(TextComponent,{"data-ds-id":"ContentText",fontSizeOffset:fontSizeOffset+tableFontSizeOffset,size:size,color:textColor,contentColor:contentColor,weight:weight,isSpacedOut:isSpacedOut,...rest},React.createElement(ContentTextContext.Provider,{value:contextValue},children))}
1
+ import React,{createContext,useContext,useMemo}from"react";import styled from"@emotion/styled";import{Text}from"../../Typography/Text";import{FontSizeOffsetContext}from"../ContentFontResizer/FontSizeOffsetContext";import{ContentTableContext}from"../ContentTable/ContentTableContext";import{getTextFontSize,getTextLineHeight}from"../../Typography/Text/Text";import{isContentColor}from"../utils/isContentColor";export const ContentTextContext=createContext(null);export const CONTENT_TEXT_LINE_HEIGHT_OFFSET=.14;let TextComponent=styled(Text,{target:"e10ozzjp0",label:"TextComponent"})(({theme,fontSizeOffset,contentColor,size="m",isSpacedOut})=>{let fontSize=getTextFontSize({theme,size}),lineHeight=getTextLineHeight({theme,size}),textLineHeightOffset=.14*!!isSpacedOut;return{fontSize:0!==fontSizeOffset?`calc(${fontSize} + ${fontSizeOffset}px)`:fontSize,lineHeight:0!==textLineHeightOffset?`calc(${lineHeight} + ${textLineHeightOffset})`:lineHeight,...contentColor&&{color:theme.values.color.content.text[contentColor].default}}});export function ContentText({size="m",color,weight,isSpacedOut=!1,children,...rest}){let fontSizeOffset=useContext(FontSizeOffsetContext),contentTableContext=useContext(ContentTableContext),tableFontSizeOffset=contentTableContext?.fontSizeOffset??0,contentColor=isContentColor(color)?color:void 0,textColor=isContentColor(color)?void 0:color,contextValue=useMemo(()=>({color,size,weight,isSpacedOut}),[color,size,weight,isSpacedOut]);return React.createElement(TextComponent,{"data-ds-id":"ContentText",fontSizeOffset:fontSizeOffset+tableFontSizeOffset,size:size,color:textColor,contentColor:contentColor,weight:weight,isSpacedOut:isSpacedOut,...rest},React.createElement(ContentTextContext.Provider,{value:contextValue},children))}
@@ -1,5 +1,5 @@
1
1
  import React from "react";
2
2
  export type DosageButtonProps = React.ComponentPropsWithRef<"button">;
3
3
  export declare const DosageButton: React.ForwardRefExoticComponent<Omit<Omit<React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & {
4
- ref?: React.Ref<HTMLButtonElement>;
4
+ ref?: ((instance: HTMLButtonElement | null) => void | React.DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof React.DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | React.RefObject<HTMLButtonElement> | null | undefined;
5
5
  }, "ref"> & React.RefAttributes<HTMLButtonElement>>;
@@ -1 +1 @@
1
- import React,{useCallback}from"react";import styled from"@emotion/styled";import isPropValid from"@emotion/is-prop-valid";import{keyframes}from"@emotion/react";import{Inline}from"../Inline/Inline";import{Icon}from"../Icon/Icon";import{getDisabledStyles,getButtonAppearanceReset,getBaseButtonStyles,getSecondaryVariantStyles}from"../../shared/mixins";import{BaseTag}from"../Internal/BaseTag/BaseTag";let StyledButton=styled("button",{shouldForwardProp:prop=>isPropValid(prop)&&"loading"!==prop,target:"e1efm8850",label:"StyledButton"})(({theme,fullWidth,size,disabled,loading})=>({...getButtonAppearanceReset(),...getBaseButtonStyles({theme,size}),...getSecondaryVariantStyles({theme,disabled,size}),...loading&&{borderColor:theme.values.color.border.primary.disabled},...disabled&&{...!loading&&{...getDisabledStyles({theme})},cursor:"not-allowed"},...fullWidth&&{width:"100%"}})),StyledInner=styled("div",{shouldForwardProp:prop=>isPropValid(prop)&&"loading"!==prop,target:"e1efm8851",label:"StyledInner"})(({loading})=>loading&&{color:"transparent"}),StyledTagWrapper=styled("span",{shouldForwardProp:prop=>isPropValid(prop)&&"loading"!==prop,target:"e1efm8852",label:"StyledTagWrapper"})(({loading})=>({display:"flex",...loading&&{opacity:0}})),StyledLoaderWrap=styled("div",{target:"e1efm8853",label:"StyledLoaderWrap"})(()=>({position:"relative",width:"100%",height:"100%",top:0,left:0,display:"flex",justifyContent:"center"})),rotation=keyframes({from:{transform:"rotate(0deg)"},to:{transform:"rotate(360deg)"}},"label:rotation"),StyledLoader=styled("div",{target:"e1efm8854",label:"StyledLoader"})(()=>({position:"absolute",animation:`${rotation} 1s infinite linear`}));export const CountButton=React.forwardRef(({"data-e2e-test-id":dataE2eTestId,as,children,disabled=!1,fullWidth=!1,leftIcon,rightIcon,loading=!1,onBlur,onClick,onFocus,count,size="m",type="button",...rest},ref)=>{let handleClick=useCallback(e=>{disabled&&e.preventDefault(),onClick&&onClick(e)},[disabled,onClick]);return React.createElement(StyledButton,{ref:ref,"data-e2e-test-id":dataE2eTestId,"data-ds-id":"Button",as:as,disabled:disabled||loading,loading:loading,type:as&&"button"!==as?void 0:type,fullWidth:fullWidth,size:size,onClick:handleClick,onFocus:onFocus,onBlur:onBlur,...rest},loading&&React.createElement(StyledLoaderWrap,null,React.createElement(StyledLoader,null,React.createElement(Icon,{"aria-hidden":!0,size:"s",name:"loader",color:"primary","data-testid":"loader","data-e2e-test-id":"loader"}))),React.createElement(StyledInner,{loading:loading},React.createElement(Inline,{vAlignItems:"center",alignItems:"center",space:"s"===size?"xxs":"xs",noWrap:!0},leftIcon&&React.createElement(Icon,{"aria-hidden":!0,size:"s",name:leftIcon,"data-testid":leftIcon,"data-e2e-test-id":leftIcon}),React.createElement(Inline,{space:"xxs",vAlignItems:"center",alignItems:"center",noWrap:!0},children,null!==count&&React.createElement(StyledTagWrapper,{loading:loading},React.createElement(BaseTag,{colorVariant:"blue",size:"s",label:count.toString()}))),rightIcon&&React.createElement(Icon,{size:"s",name:rightIcon,"data-testid":rightIcon,"data-e2e-test-id":rightIcon,"aria-hidden":!0}))))});
1
+ import React,{useCallback}from"react";import styled from"@emotion/styled";import isPropValid from"@emotion/is-prop-valid";import{keyframes}from"@emotion/react";import{forwardRefPolymorphic}from"../../shared/forwardRefPolymorphic";import{Inline}from"../Inline/Inline";import{Icon}from"../Icon/Icon";import{getDisabledStyles,getButtonAppearanceReset,getBaseButtonStyles,getSecondaryVariantStyles}from"../../shared/mixins";import{BaseTag}from"../Internal/BaseTag/BaseTag";let StyledButton=styled("button",{shouldForwardProp:prop=>isPropValid(prop)&&"loading"!==prop,target:"e1uvurwy0",label:"StyledButton"})(({theme,fullWidth,size,disabled,loading})=>({...getButtonAppearanceReset(),...getBaseButtonStyles({theme,size}),...getSecondaryVariantStyles({theme,disabled,size}),...loading&&{borderColor:theme.values.color.border.primary.disabled},...disabled&&{...!loading&&{...getDisabledStyles({theme})},cursor:"not-allowed"},...fullWidth&&{width:"100%"}})),StyledInner=styled("div",{shouldForwardProp:prop=>isPropValid(prop)&&"loading"!==prop,target:"e1uvurwy1",label:"StyledInner"})(({loading})=>loading&&{color:"transparent"}),StyledTagWrapper=styled("span",{shouldForwardProp:prop=>isPropValid(prop)&&"loading"!==prop,target:"e1uvurwy2",label:"StyledTagWrapper"})(({loading})=>({display:"flex",...loading&&{opacity:0}})),StyledLoaderWrap=styled("div",{target:"e1uvurwy3",label:"StyledLoaderWrap"})(()=>({position:"relative",width:"100%",height:"100%",top:0,left:0,display:"flex",justifyContent:"center"})),rotation=keyframes({from:{transform:"rotate(0deg)"},to:{transform:"rotate(360deg)"}},"label:rotation"),StyledLoader=styled("div",{target:"e1uvurwy4",label:"StyledLoader"})(()=>({position:"absolute",animation:`${rotation} 1s infinite linear`}));export const CountButton=forwardRefPolymorphic(({"data-e2e-test-id":dataE2eTestId,as,children,disabled=!1,fullWidth=!1,leftIcon,rightIcon,loading=!1,onBlur,onClick,onFocus,count,size="m",type="button",...rest},ref)=>{let handleClick=useCallback(e=>{disabled&&e.preventDefault(),onClick&&onClick(e)},[disabled,onClick]);return React.createElement(StyledButton,{ref:ref,"data-e2e-test-id":dataE2eTestId,"data-ds-id":"Button",as:as,disabled:disabled||loading,loading:loading,type:as&&"button"!==as?void 0:type??void 0,fullWidth:fullWidth,size:size,onClick:handleClick,onFocus:onFocus,onBlur:onBlur,...rest},loading&&React.createElement(StyledLoaderWrap,null,React.createElement(StyledLoader,null,React.createElement(Icon,{"aria-hidden":!0,size:"s",name:"loader",color:"primary","data-testid":"loader","data-e2e-test-id":"loader"}))),React.createElement(StyledInner,{loading:loading},React.createElement(Inline,{vAlignItems:"center",alignItems:"center",space:"s"===size?"xxs":"xs",noWrap:!0},leftIcon&&React.createElement(Icon,{"aria-hidden":!0,size:"s",name:leftIcon,"data-testid":leftIcon,"data-e2e-test-id":leftIcon}),React.createElement(Inline,{space:"xxs",vAlignItems:"center",alignItems:"center",noWrap:!0},children,null!==count&&React.createElement(StyledTagWrapper,{loading:loading},React.createElement(BaseTag,{colorVariant:"blue",size:"s",label:count.toString()}))),rightIcon&&React.createElement(Icon,{size:"s",name:rightIcon,"data-testid":rightIcon,"data-e2e-test-id":rightIcon,"aria-hidden":!0}))))});
@@ -1 +1 @@
1
- import React,{useState}from"react";import styled from"@emotion/styled";import{Text}from"../../Typography/Text/Text";import{Icon}from"../../Icon/Icon";import{useResponsiveValue}from"../../../shared/mediaQueries";import{DataTableHeaderToggletip}from"./DataTableHeaderToggletip";let SORT_DIRECTION_ICON={asc:"sort-ascending",desc:"sort-descending"},SortIcon=styled("span",{target:"e109ymrb0",label:"SortIcon"})(({theme})=>({marginLeft:theme.variables.size.spacing.xxxs,verticalAlign:"middle",color:theme.values.color.text.primary.default,display:"flex"})),StyledSortableCellWrapper=styled("div",{target:"e109ymrb1",label:"StyledSortableCellWrapper"})(({theme})=>({display:"inline-flex",gap:theme.variables.size.spacing.xs}));export const StyledLabel=styled(Text,{target:"e109ymrb2",label:"StyledLabel"})(({theme,alignColumn,normalizeHeight})=>({display:"flex",alignItems:"center",flexWrap:"nowrap",fontWeight:theme.variables.weight.bold,lineHeight:theme.variables.size.lineHeight.m,...useResponsiveValue({textAlign:alignColumn}),...normalizeHeight&&{paddingTop:theme.variables.size.spacing.xxs,paddingBottom:theme.variables.size.spacing.xxs}}));let StyledSortableCellContent=styled("button",{target:"e109ymrb3",label:"StyledSortableCellContent"})(({theme,alignColumn})=>({width:"100%",padding:0,background:"none",border:"none",cursor:"pointer",...useResponsiveValue({textAlign:alignColumn}),[`&:hover ${StyledLabel}`]:{color:theme.values.color.text.primary.default}}));export function SortableCellContent({name,label,align,toggletipContent,toggletipAriaLabel,sortDirection="asc",currentlySortedByColumn,onSort}){let[hovered,setHovered]=useState(!1),desiredSortDirection="asc"===sortDirection?"desc":"asc",iconName="sort-neutral";return name===currentlySortedByColumn&&(iconName=SORT_DIRECTION_ICON[sortDirection]),hovered&&(iconName=SORT_DIRECTION_ICON[desiredSortDirection]),React.createElement(StyledSortableCellWrapper,null,React.createElement(StyledSortableCellContent,{onClick:()=>{setHovered(!1),onSort&&onSort(name,desiredSortDirection)},type:"button",alignColumn:align,onPointerEnter:()=>setHovered(!0),onPointerLeave:()=>setHovered(!1)},React.createElement(StyledLabel,{as:"span",size:"s",variant:"tertiary",normalizeHeight:!toggletipContent},label,React.createElement(SortIcon,{"aria-hidden":"true"},React.createElement(Icon,{size:"s",name:iconName,color:"primary"})))),toggletipContent&&React.createElement(DataTableHeaderToggletip,{content:toggletipContent,"aria-label":toggletipAriaLabel}))}
1
+ import React,{useState}from"react";import styled from"@emotion/styled";import{Text}from"../../Typography/Text/Text";import{Icon}from"../../Icon/Icon";import{useResponsiveValue}from"../../../shared/mediaQueries";import{DataTableHeaderToggletip}from"./DataTableHeaderToggletip";let SORT_DIRECTION_ICON={asc:"sort-ascending",desc:"sort-descending"},SortIcon=styled("span",{target:"e8dg4370",label:"SortIcon"})(({theme})=>({marginLeft:theme.variables.size.spacing.xxxs,verticalAlign:"middle",color:theme.values.color.text.primary.default,display:"flex"})),StyledSortableCellWrapper=styled("div",{target:"e8dg4371",label:"StyledSortableCellWrapper"})(({theme})=>({display:"inline-flex",gap:theme.variables.size.spacing.xs}));export const StyledLabel=styled(Text,{target:"e8dg4372",label:"StyledLabel"})(({theme,alignColumn,normalizeHeight})=>({display:"flex",alignItems:"center",flexWrap:"nowrap",fontWeight:theme.variables.weight.bold,lineHeight:theme.variables.size.lineHeight.m,...useResponsiveValue({textAlign:alignColumn}),...normalizeHeight&&{paddingTop:theme.variables.size.spacing.xxs,paddingBottom:theme.variables.size.spacing.xxs}}));let StyledSortableCellContent=styled("button",{target:"e8dg4373",label:"StyledSortableCellContent"})(({theme,alignColumn})=>({width:"100%",padding:0,background:"none",border:"none",cursor:"pointer",...useResponsiveValue({textAlign:alignColumn}),[`&:hover ${StyledLabel}`]:{color:theme.values.color.text.primary.default}}));export function SortableCellContent({name,label,align,toggletipContent,toggletipAriaLabel,sortDirection="asc",currentlySortedByColumn,onSort}){let[hovered,setHovered]=useState(!1),desiredSortDirection="asc"===sortDirection?"desc":"asc",iconName="sort-neutral";return name===currentlySortedByColumn&&(iconName=SORT_DIRECTION_ICON[sortDirection]),hovered&&(iconName=SORT_DIRECTION_ICON[desiredSortDirection]),React.createElement(StyledSortableCellWrapper,null,React.createElement(StyledSortableCellContent,{onClick:()=>{setHovered(!1),onSort&&onSort(name,desiredSortDirection)},type:"button",alignColumn:align,onPointerEnter:()=>setHovered(!0),onPointerLeave:()=>setHovered(!1)},React.createElement(StyledLabel,{as:"span",size:"s",variant:"tertiary",normalizeHeight:!toggletipContent},label,React.createElement(SortIcon,{"aria-hidden":"true"},React.createElement(Icon,{size:"s",name:iconName,color:"primary"})))),toggletipContent&&React.createElement(DataTableHeaderToggletip,{content:toggletipContent,"aria-label":toggletipAriaLabel}))}
@@ -1 +1 @@
1
- import React from"react";import styled from"@emotion/styled";import TableCell from"../TableCell";import{getColumnSticky}from"../internal/getColumnSticky";import{isControlColumn}from"../internal/types";import{buildColumnSegments}from"../internal/buildColumnSegments";import{SortableCellContent}from"./SortableCellContent";import{DataTableHeaderLabel,toToggletipSlotProps}from"./DataTableHeaderLabel";let SORT_DIRECTION_TEXT={asc:"ascending",desc:"descending"},StyledThead=styled("thead",{target:"elv391v0",label:"StyledThead"})(({maxHeight})=>({...maxHeight&&{position:"sticky",top:0,zIndex:2}})),StyledTh=styled(TableCell,{target:"elv391v1",label:"StyledTh"})(({theme,hasDivider})=>({padding:`${theme.variables.size.spacing.s} ${theme.variables.size.spacing.m}`,whiteSpace:"nowrap",backgroundColor:theme.values.color.background.primary.default,...hasDivider&&{borderRight:`1px solid ${theme.values.color.divider.primary}`}}));export default React.memo(function({className,columns,isFirstColumnSticky,isLastColumnSticky,currentlySortedByColumn,isTableScrolledToLeft,isTableScrolledToRight,maxHeight,allRowsSelected,selectedRowIds,selectAllRowsCheckboxAriaLabel,onAllRowsSelectionChange,onSort}){let headerContext={onSort,currentlySortedByColumn,allRowsSelected,selectedRowIds,selectAllRowsCheckboxAriaLabel,onAllRowsSelectionChange},renderColumnCell=({column,columnIndex},rowSpan)=>{let headerElm,isLastColumn=columnIndex===columns.length-1,sticky=getColumnSticky({column,columnIndex,columns,isFirstColumnSticky,isLastColumnSticky});if(isControlColumn(column))return React.createElement(StyledTh,{as:"th",alignColumn:"left",columnWidth:column.width,key:column.name,rowSpan:rowSpan,sticky:sticky,isTableScrolledToLeft:isTableScrolledToLeft,isTableScrolledToRight:isTableScrolledToRight,hasDivider:!1,scope:"col"},column.renderHeader(headerContext));let{isSortable,label,align="left",width,name,sortDirection,toggletipContent,toggletipAriaLabel}=column;headerElm=isSortable?React.createElement(SortableCellContent,{onSort:onSort,name:name,label:label,sortDirection:sortDirection,align:align,currentlySortedByColumn:currentlySortedByColumn,toggletipContent:toggletipContent,toggletipAriaLabel:toggletipAriaLabel}):React.createElement(DataTableHeaderLabel,{label:label,align:align,slotProps:toToggletipSlotProps(column)});let ariaSortAttr=currentlySortedByColumn===name&&{"aria-sort":SORT_DIRECTION_TEXT[sortDirection]};return React.createElement(StyledTh,{as:"th",alignColumn:align,columnWidth:width,key:name,rowSpan:rowSpan,sticky:sticky,isTableScrolledToLeft:isTableScrolledToLeft,isTableScrolledToRight:isTableScrolledToRight,hasDivider:!isLastColumn,scope:"col",...ariaSortAttr},headerElm)},renderGroupCell=(group,groupColumns)=>{let{name,label,align="center"}=group,isLastColumn=groupColumns[groupColumns.length-1].columnIndex===columns.length-1;return React.createElement(StyledTh,{as:"th",alignColumn:align,key:name,colSpan:groupColumns.length,sticky:!1,isTableScrolledToLeft:isTableScrolledToLeft,isTableScrolledToRight:isTableScrolledToRight,hasDivider:!isLastColumn,scope:"colgroup"},React.createElement(DataTableHeaderLabel,{label:label,align:align,slotProps:toToggletipSlotProps(group)}))},segments=buildColumnSegments(columns),hasColumnGroups=segments.some(({group})=>group),ungroupedRowSpan=hasColumnGroups?2:void 0;return React.createElement(StyledThead,{className:className,maxHeight:maxHeight},React.createElement("tr",null,segments.map(segment=>segment.group?renderGroupCell(segment.group,segment.columns):renderColumnCell(segment.columns[0],ungroupedRowSpan))),hasColumnGroups&&React.createElement("tr",null,segments.flatMap(segment=>segment.group?segment.columns.map(indexed=>renderColumnCell(indexed)):[])))});
1
+ import React from"react";import styled from"@emotion/styled";import TableCell from"../TableCell";import{getColumnSticky}from"../internal/getColumnSticky";import{isControlColumn}from"../internal/types";import{buildColumnSegments}from"../internal/buildColumnSegments";import{SortableCellContent}from"./SortableCellContent";import{DataTableHeaderLabel,toToggletipSlotProps}from"./DataTableHeaderLabel";let SORT_DIRECTION_TEXT={asc:"ascending",desc:"descending"},StyledThead=styled("thead",{target:"emk25r90",label:"StyledThead"})(({maxHeight})=>({...maxHeight&&{position:"sticky",top:0,zIndex:2}})),StyledTh=styled(TableCell,{target:"emk25r91",label:"StyledTh"})(({theme,hasDivider})=>({padding:`${theme.variables.size.spacing.s} ${theme.variables.size.spacing.m}`,whiteSpace:"nowrap",backgroundColor:theme.values.color.background.primary.default,...hasDivider&&{borderRight:`1px solid ${theme.values.color.divider.primary}`}}));export default React.memo(function({className,columns,isFirstColumnSticky,isLastColumnSticky,currentlySortedByColumn,isTableScrolledToLeft,isTableScrolledToRight,maxHeight,allRowsSelected,selectedRowIds,selectAllRowsCheckboxAriaLabel,onAllRowsSelectionChange,onSort}){let headerContext={onSort,currentlySortedByColumn,allRowsSelected,selectedRowIds,selectAllRowsCheckboxAriaLabel,onAllRowsSelectionChange},renderColumnCell=({column,columnIndex},rowSpan)=>{let headerElm,isLastColumn=columnIndex===columns.length-1,sticky=getColumnSticky({column,columnIndex,columns,isFirstColumnSticky,isLastColumnSticky});if(isControlColumn(column))return React.createElement(StyledTh,{as:"th",alignColumn:"left",columnWidth:column.width,key:column.name,rowSpan:rowSpan,sticky:sticky,isTableScrolledToLeft:isTableScrolledToLeft,isTableScrolledToRight:isTableScrolledToRight,hasDivider:!1,scope:"col"},column.renderHeader(headerContext));let{isSortable,label,align="left",width,name,sortDirection}=column;if(isSortable){let toggletipProps=column.toggletipContent?{toggletipContent:column.toggletipContent,toggletipAriaLabel:column.toggletipAriaLabel}:{toggletipContent:void 0,toggletipAriaLabel:void 0};headerElm=React.createElement(SortableCellContent,{onSort:onSort,name:name,label:label,sortDirection:sortDirection,align:align,currentlySortedByColumn:currentlySortedByColumn,...toggletipProps})}else headerElm=React.createElement(DataTableHeaderLabel,{label:label,align:align,slotProps:toToggletipSlotProps(column)});let ariaSortAttr=currentlySortedByColumn===name&&sortDirection&&{"aria-sort":SORT_DIRECTION_TEXT[sortDirection]};return React.createElement(StyledTh,{as:"th",alignColumn:align,columnWidth:width,key:name,rowSpan:rowSpan,sticky:sticky,isTableScrolledToLeft:isTableScrolledToLeft,isTableScrolledToRight:isTableScrolledToRight,hasDivider:!isLastColumn,scope:"col",...ariaSortAttr},headerElm)},renderGroupCell=(group,groupColumns)=>{let{name,label,align="center"}=group,isLastColumn=groupColumns[groupColumns.length-1].columnIndex===columns.length-1;return React.createElement(StyledTh,{as:"th",alignColumn:align,key:name,colSpan:groupColumns.length,sticky:!1,isTableScrolledToLeft:isTableScrolledToLeft,isTableScrolledToRight:isTableScrolledToRight,hasDivider:!isLastColumn,scope:"colgroup"},React.createElement(DataTableHeaderLabel,{label:label,align:align,slotProps:toToggletipSlotProps(group)}))},segments=buildColumnSegments(columns),hasColumnGroups=segments.some(({group})=>group),ungroupedRowSpan=hasColumnGroups?2:void 0;return React.createElement(StyledThead,{className:className,maxHeight:maxHeight},React.createElement("tr",null,segments.map(segment=>segment.group?renderGroupCell(segment.group,segment.columns):renderColumnCell(segment.columns[0],ungroupedRowSpan))),hasColumnGroups&&React.createElement("tr",null,segments.flatMap(segment=>segment.group?segment.columns.map(indexed=>renderColumnCell(indexed)):[])))});
@@ -12,8 +12,8 @@ type UseDataTableSelectRowsArgs = {
12
12
  type UseDataTableSelectRowsReturn = {
13
13
  handleAllRowsSelectionChange: DataTableProps["onAllRowsSelectionChange"];
14
14
  handleRowSelectionChange: DataTableProps["onRowSelectionChange"];
15
- setAllRowsSelected: Dispatch<React.SetStateAction<DataTableProps["allRowsSelected"]>>;
16
- setSelectedRowIds: Dispatch<React.SetStateAction<DataTableProps["selectedRowIds"]>>;
15
+ setAllRowsSelected: Dispatch<React.SetStateAction<NonNullable<DataTableProps["allRowsSelected"]>>>;
16
+ setSelectedRowIds: Dispatch<React.SetStateAction<NonNullable<DataTableProps["selectedRowIds"]>>>;
17
17
  } & Required<Pick<DataTableProps, "selectedRowIds" | "allRowsSelected">>;
18
18
  export declare function useDataTableSelectRows({ rows, getRowProps, initialAllRowsSelected, initialSelectedRowIds, }: UseDataTableSelectRowsArgs): UseDataTableSelectRowsReturn;
19
19
  export {};
@@ -1 +1 @@
1
- import{useState}from"react";let defaultGetRowProps=()=>({isSelectable:!0});export function useDataTableSelectRows({rows,getRowProps=defaultGetRowProps,initialAllRowsSelected=!1,initialSelectedRowIds=[]}){let[allRowsSelected,setAllRowsSelected]=useState(initialAllRowsSelected),[selectedRowIds,setSelectedRowIds]=useState(initialSelectedRowIds);return{handleAllRowsSelectionChange:currentValue=>{currentValue?setSelectedRowIds(rows.filter(row=>!1!==getRowProps(row).isSelectable).map(({id})=>id)):setSelectedRowIds([]),setAllRowsSelected(currentValue)},handleRowSelectionChange:ids=>{let numOfSelectableRows=rows.filter(row=>!1!==getRowProps(row).isSelectable).length;ids.length===numOfSelectableRows?setAllRowsSelected(!0):setAllRowsSelected(!1),setSelectedRowIds(ids)},allRowsSelected,selectedRowIds,setAllRowsSelected,setSelectedRowIds}}
1
+ import{useState}from"react";let defaultGetRowProps=()=>({isSelectable:!0});export function useDataTableSelectRows({rows=[],getRowProps=defaultGetRowProps,initialAllRowsSelected=!1,initialSelectedRowIds=[]}){let[allRowsSelected,setAllRowsSelected]=useState(initialAllRowsSelected),[selectedRowIds,setSelectedRowIds]=useState(initialSelectedRowIds);return{handleAllRowsSelectionChange:currentValue=>{currentValue?setSelectedRowIds(rows.filter(row=>!1!==getRowProps(row).isSelectable).map(({id})=>id)):setSelectedRowIds([]),setAllRowsSelected(currentValue)},handleRowSelectionChange:ids=>{let numOfSelectableRows=rows.filter(row=>!1!==getRowProps(row).isSelectable).length;ids.length===numOfSelectableRows?setAllRowsSelected(!0):setAllRowsSelected(!1),setSelectedRowIds(ids)},allRowsSelected,selectedRowIds,setAllRowsSelected,setSelectedRowIds}}
@@ -6,11 +6,11 @@ export declare const defaultSortCompareFn: (a: DataTableRow, b: DataTableRow, co
6
6
  export declare function useDataTableSort(initialColumns: DataTableColumnOrGroup[], initialRows: DataTableRow[], initialSortedByColumn?: DataTableColumn["name"], sortCompareFn?: SortCompareFn): {
7
7
  columns: DataTableColumnOrGroup[];
8
8
  rows: DataTableRow[];
9
- currentlySortedByColumn: DataTableColumn["name"];
10
- handleSort: DataTableProps["onSort"];
9
+ currentlySortedByColumn: DataTableColumn["name"] | undefined;
10
+ handleSort: NonNullable<DataTableProps["onSort"]>;
11
11
  resetColumns: VoidFunction;
12
12
  setColumns: Dispatch<SetStateAction<DataTableColumnOrGroup[]>>;
13
13
  setRows: Dispatch<SetStateAction<DataTableRow[]>>;
14
- setCurrentlySortedByColumn: Dispatch<SetStateAction<DataTableColumn["name"]>>;
14
+ setCurrentlySortedByColumn: Dispatch<SetStateAction<DataTableColumn["name"] | undefined>>;
15
15
  };
16
16
  export {};
@@ -1 +1 @@
1
- import React from"react";import styled from"@emotion/styled";import{Text}from"../Typography/Text/Text";import{Box}from"../Box/Box";let StyledContainer=styled("div",{target:"e16wu7470",label:"StyledContainer"})(()=>({display:"flex",justifyContent:"center",alignItems:"center"})),HorizontalStyledDivider=styled("hr",{target:"e16wu7471",label:"HorizontalStyledDivider"})(({theme})=>({border:0,margin:0,padding:0,height:0,borderTopColor:theme.values.color.divider.primary,borderTopWidth:"1px",borderTopStyle:"solid",flex:"1"})),VerticalStyledDivider=styled("span",{target:"e16wu7472",label:"VerticalStyledDivider"})(({theme,size})=>({display:"flex",margin:0,padding:0,width:"1px",backgroundColor:theme.values.color.divider.secondary,alignSelf:"stretch",minHeight:theme.variables.size.dimension.divider[size]})),StyledContent=styled("div",{target:"e16wu7473",label:"StyledContent"})(()=>({maxWidth:"50%"}));export function Divider({text,"data-e2e-test-id":dataE2eTestId,orientation="horizontal",size="m",...ariaAttributes}){return"vertical"===orientation?React.createElement(VerticalStyledDivider,{size:size,"data-e2e-test-id":dataE2eTestId,"data-ds-id":"Divider",...ariaAttributes,role:"separator","aria-orientation":"vertical"}):text?React.createElement(StyledContainer,{"data-e2e-test-id":dataE2eTestId,"data-ds-id":"Divider",...ariaAttributes,role:"separator","aria-orientation":"horizontal"},React.createElement(HorizontalStyledDivider,{"aria-hidden":"true"}),React.createElement(StyledContent,null,React.createElement(Box,{space:"xxl",vSpace:"zero"},React.createElement(Text,{color:"tertiary"},text))),React.createElement(HorizontalStyledDivider,{"aria-hidden":"true"})):React.createElement(HorizontalStyledDivider,{"data-e2e-test-id":dataE2eTestId,"data-ds-id":"Divider",...ariaAttributes})}
1
+ import React from"react";import styled from"@emotion/styled";import{Text}from"../Typography/Text/Text";import{Box}from"../Box/Box";let StyledContainer=styled("div",{target:"e1jrix1f0",label:"StyledContainer"})(()=>({display:"flex",justifyContent:"center",alignItems:"center"})),HorizontalStyledDivider=styled("hr",{target:"e1jrix1f1",label:"HorizontalStyledDivider"})(({theme})=>({border:0,margin:0,padding:0,height:0,borderTopColor:theme.values.color.divider.primary,borderTopWidth:"1px",borderTopStyle:"solid",flex:"1"})),VerticalStyledDivider=styled("span",{target:"e1jrix1f2",label:"VerticalStyledDivider"})(({theme,size})=>({display:"flex",margin:0,padding:0,width:"1px",backgroundColor:theme.values.color.divider.secondary,alignSelf:"stretch",minHeight:theme.variables.size.dimension.divider[size]})),StyledContent=styled("div",{target:"e1jrix1f3",label:"StyledContent"})(()=>({maxWidth:"50%"}));export function Divider({text,"data-e2e-test-id":dataE2eTestId,orientation="horizontal",size="m",...ariaAttributes}){return"vertical"===orientation?React.createElement(VerticalStyledDivider,{size:size,"data-e2e-test-id":dataE2eTestId,"data-ds-id":"Divider",...ariaAttributes,role:"separator","aria-orientation":"vertical"}):text?React.createElement(StyledContainer,{"data-e2e-test-id":dataE2eTestId,"data-ds-id":"Divider",...ariaAttributes,role:"separator","aria-orientation":"horizontal"},React.createElement(HorizontalStyledDivider,{"aria-hidden":"true"}),React.createElement(StyledContent,null,React.createElement(Box,{space:"xxl",vSpace:"zero"},React.createElement(Text,{color:"tertiary"},text))),React.createElement(HorizontalStyledDivider,{"aria-hidden":"true"})):React.createElement(HorizontalStyledDivider,{"data-e2e-test-id":dataE2eTestId,"data-ds-id":"Divider",...ariaAttributes})}
@@ -15,6 +15,10 @@ export type DropdownMenuProps = {
15
15
  disabled?: boolean;
16
16
  /** Horizontal alignment of the menu relative to the trigger. `"auto"` detects based on available viewport space. */
17
17
  placement?: "auto" | "left" | "right";
18
+ /**
19
+ * aria-label for trigger (especially if it only has icon).
20
+ * TODO(DS): make required for the icon-only trigger. See follow-up.
21
+ */
18
22
  triggerAriaLabel?: string;
19
23
  /** Dropdown menu open state callback */
20
24
  onMenuOpen?: (e: MouseEvent | KeyboardEvent) => void;
@@ -36,5 +40,5 @@ type ConditionalProps = {
36
40
  size?: DropdownMenuSize;
37
41
  label?: never;
38
42
  };
39
- export declare function DropdownMenu({ menuItems, label, placement, iconName, size, variant, disabled, portalContainer, triggerAriaLabel, onMenuOpen, onMenuClose, privateProps: { dropdownSquareCorners }, "data-e2e-test-id": dataE2eTestId, ...ariaAttributes }: DropdownMenuProps): React.ReactElement;
43
+ export declare function DropdownMenu(props: DropdownMenuProps): React.ReactElement;
40
44
  export {};
@@ -1 +1 @@
1
- import React,{useCallback,useRef,useState}from"react";import{useKeyboard}from"../../shared/useKeyboard";import{Button}from"../Button/Button";import{PictogramButton}from"../PictogramButton/PictogramButton";import{Menu}from"./Menu";let isSeperator=item=>"separator"===item;export function DropdownMenu({menuItems,label,placement="auto",iconName="more-horizontal",size="m",variant="tertiary",disabled=!1,portalContainer,triggerAriaLabel,onMenuOpen=()=>void 0,onMenuClose=()=>void 0,privateProps:{dropdownSquareCorners}={dropdownSquareCorners:!1},"data-e2e-test-id":dataE2eTestId,...ariaAttributes}){let[isOpen,setIsOpen]=useState(!1),buttonRef=useRef(null),openMenu=useCallback(e=>{setIsOpen(!0),onMenuOpen(e)},[setIsOpen,onMenuOpen]),closeMenu=useCallback(e=>{setIsOpen(!1),buttonRef.current.focus({preventScroll:!0}),onMenuClose(e)},[setIsOpen,onMenuClose]),toggleMenu=useCallback(e=>{isOpen?closeMenu(e.nativeEvent):openMenu(e.nativeEvent)},[isOpen,openMenu,closeMenu]),items=menuItems.map(item=>isSeperator(item)?item:{...item,onSelect:e=>{item.onSelect(e),closeMenu(e.nativeEvent)}});useKeyboard({"ArrowUp ArrowDown":openMenu},buttonRef,!isOpen);let usePictogramTrigger="secondary"===variant||"xs"===size;return React.createElement(React.Fragment,null,usePictogramTrigger?React.createElement(PictogramButton,{tabIndex:0,ref:buttonRef,size:size,icon:iconName,variant:variant,onClick:toggleMenu,disabled:disabled,"data-e2e-test-id":dataE2eTestId,"data-ds-id":"DropdownMenu","aria-label":triggerAriaLabel,...ariaAttributes,"aria-haspopup":"true","aria-expanded":isOpen}):React.createElement(Button,{tabIndex:0,ref:buttonRef,size:size,leftIcon:iconName,variant:variant,onClick:toggleMenu,disabled:disabled,"data-e2e-test-id":dataE2eTestId,"data-ds-id":"DropdownMenu",privateProps:{squareCorners:dropdownSquareCorners},"aria-label":triggerAriaLabel,...ariaAttributes,"aria-haspopup":"true","aria-expanded":isOpen},label),React.createElement(Menu,{items:items,isOpen:isOpen,onCloseMenu:closeMenu,triggerRef:buttonRef,placement:placement,portalContainer:portalContainer}))}
1
+ import React,{useCallback,useRef,useState}from"react";import{useIntl}from"../../shared/intl/useIntl";import{useKeyboard}from"../../shared/useKeyboard";import{Button}from"../Button/Button";import{PictogramButton}from"../PictogramButton/PictogramButton";import{Menu}from"./Menu";let isSeperator=item=>"separator"===item;export function DropdownMenu(props){let{menuItems,label,placement="auto",iconName="more-horizontal",size="m",variant="tertiary",disabled=!1,portalContainer,triggerAriaLabel,onMenuOpen=()=>void 0,onMenuClose=()=>void 0,privateProps:{dropdownSquareCorners}={dropdownSquareCorners:!1},"data-e2e-test-id":dataE2eTestId,...ariaAttributes}=props,[isOpen,setIsOpen]=useState(!1),{formatMessage}=useIntl(),buttonRef=useRef(null),openMenu=useCallback(e=>{setIsOpen(!0),onMenuOpen(e)},[setIsOpen,onMenuOpen]),closeMenu=useCallback(e=>{setIsOpen(!1),buttonRef.current?.focus({preventScroll:!0}),onMenuClose(e)},[setIsOpen,onMenuClose]),toggleMenu=useCallback(e=>{isOpen?closeMenu(e.nativeEvent):openMenu(e.nativeEvent)},[isOpen,openMenu,closeMenu]),items=menuItems.map(item=>isSeperator(item)?item:{...item,onSelect:e=>{item.onSelect(e),closeMenu(e.nativeEvent)}});return useKeyboard({"ArrowUp ArrowDown":openMenu},buttonRef,!isOpen),React.createElement(React.Fragment,null,"secondary"===props.variant||"xs"===props.size?React.createElement(PictogramButton,{tabIndex:0,ref:buttonRef,size:size,icon:iconName,variant:variant,onClick:toggleMenu,disabled:disabled,"data-e2e-test-id":dataE2eTestId,"data-ds-id":"DropdownMenu","aria-label":triggerAriaLabel??formatMessage("DropdownMenu.Trigger.AriaLabel"),...ariaAttributes,"aria-haspopup":"true","aria-expanded":isOpen}):React.createElement(Button,{tabIndex:0,ref:buttonRef,size:"xs"===size?"s":size,leftIcon:iconName,variant:variant,onClick:toggleMenu,disabled:disabled,"data-e2e-test-id":dataE2eTestId,"data-ds-id":"DropdownMenu",privateProps:{squareCorners:dropdownSquareCorners},"aria-label":triggerAriaLabel,...ariaAttributes,"aria-haspopup":"true","aria-expanded":isOpen},label),React.createElement(Menu,{items:items,isOpen:isOpen,onCloseMenu:closeMenu,triggerRef:buttonRef,placement:placement,portalContainer:portalContainer}))}
@@ -7,5 +7,5 @@ type MenuProps = {
7
7
  triggerRef: RefObject<HTMLButtonElement>;
8
8
  onCloseMenu: (e: any) => void;
9
9
  } & Pick<DropdownMenuProps, "portalContainer" | "placement">;
10
- export declare function Menu({ isOpen, items, portalContainer, triggerRef, placement, onCloseMenu, }: MenuProps): React.ReactElement;
10
+ export declare function Menu({ isOpen, items, portalContainer, triggerRef, placement, onCloseMenu, }: MenuProps): React.ReactElement | null;
11
11
  export {};
@@ -1 +1 @@
1
- import React,{useEffect,useRef,useState}from"react";import styled from"@emotion/styled";import{useKeyboard}from"../../shared/useKeyboard";import{Divider}from"../Divider/Divider";import{MenuItem}from"./MenuItem";import{usePopupMenu}from"../../shared/popupMenu/usePopupMenu";import{useOutsideInteract}from"../../shared/useOutsideInteract";import{Portal,usePortalChildZIndex}from"../Portal/Portal";let isSeperator=item=>"separator"===item,StyledMenu=styled("div",{target:"e1esauyt0",label:"StyledMenu"})(({theme})=>{let zIndex=usePortalChildZIndex(theme.variables.zIndex.dropdown);return{position:"absolute",display:"inline-block",width:"fit-content",minWidth:theme.variables.size.dimension.dropdownMenu.width,zIndex,borderRadius:theme.variables.size.borderRadius.s,backgroundColor:theme.values.color.background.primary.default,paddingTop:theme.variables.size.spacing.xs,paddingBottom:theme.variables.size.spacing.xs,":after":{content:'" "',position:"absolute",top:0,left:0,width:"100%",height:"100%",pointerEvents:"none",borderRadius:"inherit",boxShadow:theme.values.elevation[3]}}}),StyledUl=styled("ul",{target:"e1esauyt1",label:"StyledUl"})(()=>({margin:0,padding:0,overflow:"hidden"})),StyledLi=styled("li",{target:"e1esauyt2",label:"StyledLi"})(()=>({margin:0,padding:0,width:"100%",listStyleType:"none",whiteSpace:"nowrap"})),StyledLiSeparator=styled(StyledLi,{target:"e1esauyt3",label:"StyledLiSeparator"})(({theme})=>({marginTop:theme.variables.size.spacing.xs,marginBottom:theme.variables.size.spacing.xs}));export function Menu({isOpen,items,portalContainer,triggerRef,placement,onCloseMenu}){let menuRef=useRef(null),[focusIndex,setFocusIndex]=useState(0),{menuStyle}=usePopupMenu({triggerRef,menuRef,isOpen,placement});useOutsideInteract({ref:menuRef,excludeRefs:[triggerRef],onInteractOutside:onCloseMenu,isActive:isOpen}),useKeyboard({Escape:onCloseMenu,ArrowUp:()=>{setFocusIndex(index=>index-1)},ArrowDown:()=>{setFocusIndex(index=>index+1)}},menuRef,isOpen),useEffect(()=>{if(menuRef&&menuRef.current){let buttons=menuRef.current.querySelectorAll("button");buttons[Math.abs(focusIndex)%buttons.length].focus({preventScroll:!0})}isOpen||setFocusIndex(0)},[menuRef,focusIndex,isOpen]);let menuElm=React.createElement(StyledMenu,{ref:menuRef,style:menuStyle},React.createElement(StyledUl,{role:"menu"},items.map((item,index)=>{if(isSeperator(item))return React.createElement(StyledLiSeparator,{role:"separator",key:`menuitem-separator-${index}`},React.createElement(Divider,{"aria-hidden":"true"}));let{label,destructive,disabled,emphasized,icon,onSelect}=item;return React.createElement(StyledLi,{role:"menuitem",key:`menuitem-${label}`},React.createElement(MenuItem,{onSelect:onSelect,icon:icon,label:label,disabled:disabled,destructive:destructive,emphasized:emphasized}))})));return isOpen?React.createElement(Portal,{portalContainer:portalContainer},menuElm):null}
1
+ import React,{useEffect,useRef,useState}from"react";import styled from"@emotion/styled";import{useKeyboard}from"../../shared/useKeyboard";import{Divider}from"../Divider/Divider";import{MenuItem}from"./MenuItem";import{usePopupMenu}from"../../shared/popupMenu/usePopupMenu";import{useOutsideInteract}from"../../shared/useOutsideInteract";import{Portal,usePortalChildZIndex}from"../Portal/Portal";let isSeperator=item=>"separator"===item,StyledMenu=styled("div",{target:"e1gy87fm0",label:"StyledMenu"})(({theme})=>{let zIndex=usePortalChildZIndex(theme.variables.zIndex.dropdown);return{position:"absolute",display:"inline-block",width:"fit-content",minWidth:theme.variables.size.dimension.dropdownMenu.width,zIndex,borderRadius:theme.variables.size.borderRadius.s,backgroundColor:theme.values.color.background.primary.default,paddingTop:theme.variables.size.spacing.xs,paddingBottom:theme.variables.size.spacing.xs,":after":{content:'" "',position:"absolute",top:0,left:0,width:"100%",height:"100%",pointerEvents:"none",borderRadius:"inherit",boxShadow:theme.values.elevation[3]}}}),StyledUl=styled("ul",{target:"e1gy87fm1",label:"StyledUl"})(()=>({margin:0,padding:0,overflow:"hidden"})),StyledLi=styled("li",{target:"e1gy87fm2",label:"StyledLi"})(()=>({margin:0,padding:0,width:"100%",listStyleType:"none",whiteSpace:"nowrap"})),StyledLiSeparator=styled(StyledLi,{target:"e1gy87fm3",label:"StyledLiSeparator"})(({theme})=>({marginTop:theme.variables.size.spacing.xs,marginBottom:theme.variables.size.spacing.xs}));export function Menu({isOpen,items,portalContainer,triggerRef,placement,onCloseMenu}){let menuRef=useRef(null),[focusIndex,setFocusIndex]=useState(0),{menuStyle}=usePopupMenu({triggerRef,menuRef,isOpen,placement});useOutsideInteract({ref:menuRef,excludeRefs:[triggerRef],onInteractOutside:onCloseMenu,isActive:isOpen}),useKeyboard({Escape:onCloseMenu,ArrowUp:()=>{setFocusIndex(index=>index-1)},ArrowDown:()=>{setFocusIndex(index=>index+1)}},menuRef,isOpen),useEffect(()=>{if(menuRef&&menuRef.current){let buttons=menuRef.current.querySelectorAll("button");buttons[Math.abs(focusIndex)%buttons.length].focus({preventScroll:!0})}isOpen||setFocusIndex(0)},[menuRef,focusIndex,isOpen]);let menuElm=React.createElement(StyledMenu,{ref:menuRef,style:menuStyle},React.createElement(StyledUl,{role:"menu"},items.map((item,index)=>{if(isSeperator(item))return React.createElement(StyledLiSeparator,{role:"separator",key:`menuitem-separator-${index}`},React.createElement(Divider,{"aria-hidden":"true"}));let{label,destructive,disabled,emphasized,icon,onSelect}=item;return React.createElement(StyledLi,{role:"menuitem",key:`menuitem-${label}`},React.createElement(MenuItem,{onSelect:onSelect,icon:icon,label:label,disabled:disabled,destructive:destructive,emphasized:emphasized}))})));return isOpen?React.createElement(Portal,{portalContainer:portalContainer},menuElm):null}
@@ -1 +1 @@
1
- import React,{useEffect,useRef,useMemo,useCallback}from"react";import{StyledList}from"./styled-components";import{useKeyboard}from"../../shared/useKeyboard";import{Icon}from"../Icon/Icon";import{EntityListItem}from"./EntityListItem";import{VirtualizedEntityList}from"./VirtualizedEntityList";import{useFocusByIndex}from"./useFocusByIndex";import{ROLE_TO_ITEM_ROLE}from"./roles";export function BaseEntityList({data,size="m",onClick,focusOnMount,isSelectable,selectedIds,onSelectionChange,onSelectionToggle,renderRightContent,renderItemWrapper,getLeftIconProps,hideBorder,filterFn,isVirtualized,maxHeight,ariaAttributes:deprecatedAriaAttributes,slotProps,role:roleProp,truncateLabels=!1,"data-e2e-test-id":dataE2eTestId,...ariaAttributes}){let rootRole,{itemRole,...rootAriaProps}=(rootRole=roleProp??"list",isSelectable&&(rootRole="listbox"),{role:rootRole,itemRole:ROLE_TO_ITEM_ROLE[rootRole],"aria-multiselectable":"listbox"===rootRole&&!!isSelectable||void 0}),ariaLabelExpand=slotProps?.toggle?.["aria-label-expand"]??deprecatedAriaAttributes?.ariaLabelExpand,ariaLabelCollapse=slotProps?.toggle?.["aria-label-collapse"]??deprecatedAriaAttributes?.ariaLabelCollapse,dataShown=useMemo(()=>data.length&&filterFn?data.filter(filterFn):data,[data,filterFn]),selectedIdsSet=useMemo(()=>new Set(selectedIds),[selectedIds]),listRef=useRef(null),{moveFocus,focusItemAtIndex,focusedIndex:selectedIndex}=useFocusByIndex({containerRef:listRef,nodeSelector:"data-list-item",data:useMemo(()=>dataShown.map(item=>({id:item.id,isDisabled:!!item.isDisabled})),[dataShown]),preventScroll:isVirtualized,initialIndex:useMemo(()=>{let index=dataShown.findIndex(item=>item.isActive);return -1!==index?index:0},[dataShown])});useEffect(()=>{focusOnMount&&focusItemAtIndex(selectedIndex)},[]),useKeyboard({ArrowDown:()=>{moveFocus(1)},ArrowUp:()=>{moveFocus(-1)}},listRef,isSelectable||!!onClick);let handleOnClick=useCallback(item=>{let{id}=item;if(isSelectable){let willBeSelected=!selectedIdsSet.has(id),newSelectedIdsSet=new Set(selectedIdsSet);willBeSelected?newSelectedIdsSet.add(id):newSelectedIdsSet.delete(id),onSelectionToggle?.(id,willBeSelected),onSelectionChange?.(Array.from(newSelectedIdsSet))}onClick?.(item)},[selectedIdsSet,onSelectionChange,onSelectionToggle,onClick,isSelectable]),renderEntityItem=index=>{let tabIndex,item=dataShown[index];if(!item)return null;let isLastItem=index===dataShown.length-1,isSelected=selectedIdsSet.has(item.id);if(isSelectable||onClick){let defaultTabIndex=0===index&&!selectedIndex;tabIndex=!item.isDisabled&&(index===selectedIndex||defaultTabIndex)?0:-1}let itemElm=React.createElement(EntityListItem,{"data-list-item":index,"aria-label":item["aria-label"]||item.label,size:size,hideBorder:hideBorder||isLastItem,isActive:item.isActive,isDisabled:item.isDisabled,isClickable:!!(onClick||selectedIds),isSelected:isSelectable?isSelected:void 0,role:itemRole,description:item.description,truncateLabel:truncateLabels,onSpaceEnterPress:()=>handleOnClick(item),tabIndex:tabIndex,ariaLabelExpand:ariaLabelExpand,ariaLabelCollapse:ariaLabelCollapse,onClick:e=>{e.target instanceof Element&&e.target.closest("label")||handleOnClick(item)},checkboxProps:isSelectable&&{name:"list-checkbox",size:"s",checked:isSelected,onChange:()=>handleOnClick(item)},renderLabel:()=>item.label,renderLeft:getLeftIconProps?({textSize})=>React.createElement(Icon,{...getLeftIconProps(item),size:textSize}):null,renderRight:renderRightProps=>renderRightContent?renderRightContent({...renderRightProps,...item}):void 0});return React.createElement(React.Fragment,{key:item.id},renderItemWrapper?renderItemWrapper({item,children:itemElm}):itemElm)};return React.createElement("div",{ref:listRef},isVirtualized&&maxHeight?React.createElement(VirtualizedEntityList,{id:dataE2eTestId,maxHeight:maxHeight,size:size,dataShown:dataShown,selectedIndex:selectedIndex,itemTemplate:renderEntityItem,"data-e2e-test-id":dataE2eTestId,...rootAriaProps,...ariaAttributes}):React.createElement(StyledList,{size:size,"data-e2e-test-id":dataE2eTestId,"data-ds-id":"EntityList",...rootAriaProps,...ariaAttributes},dataShown.map((_item,i)=>renderEntityItem(i))))}
1
+ import React,{useEffect,useRef,useMemo,useCallback}from"react";import{StyledList}from"./styled-components";import{useKeyboard}from"../../shared/useKeyboard";import{Icon}from"../Icon/Icon";import{EntityListItem}from"./EntityListItem";import{VirtualizedEntityList}from"./VirtualizedEntityList";import{useFocusByIndex}from"./useFocusByIndex";import{ROLE_TO_ITEM_ROLE}from"./roles";export function BaseEntityList({data,size="m",onClick,focusOnMount,isSelectable,selectedIds,onSelectionChange,onSelectionToggle,renderRightContent,renderItemWrapper,getLeftIconProps,hideBorder,filterFn,isVirtualized,maxHeight,ariaAttributes:deprecatedAriaAttributes,slotProps,role:roleProp,truncateLabels=!1,"data-e2e-test-id":dataE2eTestId,...ariaAttributes}){let rootRole,{itemRole,...rootAriaProps}=(rootRole=roleProp??"list",isSelectable&&(rootRole="listbox"),{role:rootRole,itemRole:ROLE_TO_ITEM_ROLE[rootRole],"aria-multiselectable":"listbox"===rootRole&&!!isSelectable||void 0}),ariaLabelExpand=slotProps?.toggle?.["aria-label-expand"]??deprecatedAriaAttributes?.ariaLabelExpand,ariaLabelCollapse=slotProps?.toggle?.["aria-label-collapse"]??deprecatedAriaAttributes?.ariaLabelCollapse,dataShown=useMemo(()=>data.length&&filterFn?data.filter(filterFn):data,[data,filterFn]),selectedIdsSet=useMemo(()=>new Set(selectedIds),[selectedIds]),listRef=useRef(null),{moveFocus,focusItemAtIndex,focusedIndex:selectedIndex}=useFocusByIndex({containerRef:listRef,nodeSelector:"data-list-item",data:useMemo(()=>dataShown.map(item=>({id:item.id,isDisabled:!!item.isDisabled})),[dataShown]),preventScroll:isVirtualized,initialIndex:useMemo(()=>{let index=dataShown.findIndex(item=>item.isActive);return -1!==index?index:0},[dataShown])});useEffect(()=>{focusOnMount&&focusItemAtIndex(selectedIndex)},[]),useKeyboard({ArrowDown:()=>{moveFocus(1)},ArrowUp:()=>{moveFocus(-1)}},listRef,isSelectable||!!onClick);let handleOnClick=useCallback(item=>{let{id}=item;if(isSelectable){let willBeSelected=!selectedIdsSet.has(id),newSelectedIdsSet=new Set(selectedIdsSet);willBeSelected?newSelectedIdsSet.add(id):newSelectedIdsSet.delete(id),onSelectionToggle?.(id,willBeSelected),onSelectionChange?.(Array.from(newSelectedIdsSet))}onClick?.(item)},[selectedIdsSet,onSelectionChange,onSelectionToggle,onClick,isSelectable]),renderEntityItem=index=>{let tabIndex,item=dataShown[index];if(!item)return null;let isLastItem=index===dataShown.length-1,isSelected=selectedIdsSet.has(item.id);if(isSelectable||onClick){let defaultTabIndex=0===index&&!selectedIndex;tabIndex=!item.isDisabled&&(index===selectedIndex||defaultTabIndex)?0:-1}let itemElm=React.createElement(EntityListItem,{"data-list-item":index,"aria-label":item["aria-label"]||item.label,size:size,hideBorder:hideBorder||isLastItem,isActive:item.isActive,isDisabled:item.isDisabled,isClickable:!!(onClick||selectedIds),isSelected:isSelectable?isSelected:void 0,role:itemRole,description:item.description,truncateLabel:truncateLabels,onSpaceEnterPress:()=>handleOnClick(item),tabIndex:tabIndex,ariaLabelExpand:ariaLabelExpand,ariaLabelCollapse:ariaLabelCollapse,onClick:e=>{e.target instanceof Element&&e.target.closest("label")||handleOnClick(item)},checkboxProps:isSelectable?{name:"list-checkbox",size:"s",checked:isSelected,onChange:()=>handleOnClick(item)}:void 0,renderLabel:()=>item.label,renderLeft:getLeftIconProps?({textSize})=>React.createElement(Icon,{...getLeftIconProps(item),size:textSize}):void 0,renderRight:renderRightProps=>renderRightContent?renderRightContent({...renderRightProps,...item}):void 0});return React.createElement(React.Fragment,{key:item.id},renderItemWrapper?renderItemWrapper({item,children:itemElm}):itemElm)};return React.createElement("div",{ref:listRef},isVirtualized&&maxHeight?React.createElement(VirtualizedEntityList,{id:dataE2eTestId,maxHeight:maxHeight,size:size,dataShown:dataShown,selectedIndex:selectedIndex,itemTemplate:renderEntityItem,"data-e2e-test-id":dataE2eTestId,...rootAriaProps,...ariaAttributes}):React.createElement(StyledList,{size:size,"data-e2e-test-id":dataE2eTestId,"data-ds-id":"EntityList",...rootAriaProps,...ariaAttributes},dataShown.map((_item,i)=>renderEntityItem(i))))}
@@ -1,3 +1,5 @@
1
1
  import React from "react";
2
2
  import type { EntityListItemProps } from "./types";
3
- export declare function EntityItemBody({ checkboxProps, description, renderLabel, renderLeft, renderRight, tabIndex, size, truncateLabel, }: Partial<EntityListItemProps>): React.ReactElement;
3
+ type EntityItemBodyProps = Partial<EntityListItemProps> & Pick<EntityListItemProps, "renderLabel">;
4
+ export declare function EntityItemBody({ checkboxProps, description, renderLabel, renderLeft, renderRight, tabIndex, size, truncateLabel, }: EntityItemBodyProps): React.ReactElement;
5
+ export {};
@@ -1 +1 @@
1
- import React,{cloneElement,isValidElement}from"react";import styled from"@emotion/styled";import{CheckboxRaw}from"../Form/Checkbox/Checkbox";import{EntityListItemText}from"./EntityListItemText";import{Inline}from"../Inline/Inline";import{StyledWrapperOffset}from"./styled-components";let StyledLabel=styled(StyledWrapperOffset,{target:"e1l7tkuv0",label:"StyledLabel"})(({theme,size})=>({cursor:"pointer",display:"block",margin:`-${theme.variables.size.spacing["xs"===size?"xxs":size]} 0`})),StyledMinHeightCell=styled("div",{target:"e1l7tkuv1",label:"StyledMinHeightCell"})(({theme,textSize})=>({minHeight:"s"===textSize?`calc(${theme.variables.size.spacing.m} + ${theme.variables.size.spacing.xxs})`:theme.variables.size.spacing.l,display:"flex",alignItems:"center"})),hasInteractiveProps=element=>["onClick","onMouseDown","onPointerDown"].some(p=>"function"==typeof element.props?.[p]),isInteractiveElement=element=>isValidElement(element)&&(hasInteractiveProps(element)||"href"in(element.props??{}));export function EntityItemBody({checkboxProps,description,renderLabel,renderLeft,renderRight,tabIndex,size="m",truncateLabel}){let textSize="xs"===size?"s":"m",rightElement=renderRight?.({textSize,actionSize:"l"===size?"m":"s",tabIndex});return React.createElement(Inline,{noWrap:!0,alignItems:"spaceBetween",space:["xs","m"]},checkboxProps?React.createElement(StyledLabel,{as:"label",size:size,"aria-hidden":"true"},React.createElement(Inline,{noWrap:!0,space:["xs","m"]},React.createElement(CheckboxRaw,{...checkboxProps,inert:""}),React.createElement(EntityListItemText,{size:textSize,description:description,truncateLabel:truncateLabel},renderLabel({textSize})))):React.createElement(Inline,{noWrap:!0,space:["xs","m"]},renderLeft&&renderLeft({textSize}),React.createElement(EntityListItemText,{size:textSize,description:description,truncateLabel:truncateLabel},renderLabel({textSize}))),rightElement&&React.createElement(StyledMinHeightCell,{textSize:textSize},isInteractiveElement(rightElement)?cloneElement(rightElement,{tabIndex,onClick:event=>{event.stopPropagation(),rightElement.props.onClick?.(event)},...rightElement.props.onMouseDown&&{onMouseDown:event=>{event.stopPropagation(),rightElement.props.onMouseDown?.(event)}},...rightElement.props.onPointerDown&&{onPointerDown:event=>{event.stopPropagation(),rightElement.props.onPointerDown?.(event)}}}):rightElement))}
1
+ import React,{cloneElement,isValidElement}from"react";import styled from"@emotion/styled";import{CheckboxRaw}from"../Form/Checkbox/Checkbox";import{EntityListItemText}from"./EntityListItemText";import{Inline}from"../Inline/Inline";import{StyledWrapperOffset}from"./styled-components";let StyledLabel=styled(StyledWrapperOffset,{target:"e1acsa3u0",label:"StyledLabel"})(({theme,size})=>({cursor:"pointer",display:"block",margin:`-${theme.variables.size.spacing["xs"===size?"xxs":size]} 0`})),StyledMinHeightCell=styled("div",{target:"e1acsa3u1",label:"StyledMinHeightCell"})(({theme,textSize})=>({minHeight:"s"===textSize?`calc(${theme.variables.size.spacing.m} + ${theme.variables.size.spacing.xxs})`:theme.variables.size.spacing.l,display:"flex",alignItems:"center"})),hasInteractiveProps=element=>["onClick","onMouseDown","onPointerDown"].some(p=>"function"==typeof element.props?.[p]),isInteractiveElement=element=>isValidElement(element)&&(hasInteractiveProps(element)||"href"in(element.props??{}));export function EntityItemBody({checkboxProps,description,renderLabel,renderLeft,renderRight,tabIndex,size="m",truncateLabel}){let textSize="xs"===size?"s":"m",rightElement=renderRight?.({textSize,actionSize:"l"===size?"m":"s",tabIndex});return React.createElement(Inline,{noWrap:!0,alignItems:"spaceBetween",space:["xs","m"]},checkboxProps?React.createElement(StyledLabel,{as:"label",size:size,"aria-hidden":"true"},React.createElement(Inline,{noWrap:!0,space:["xs","m"]},React.createElement(CheckboxRaw,{...checkboxProps,inert:""}),React.createElement(EntityListItemText,{size:textSize,description:description,truncateLabel:truncateLabel},renderLabel({textSize})))):React.createElement(Inline,{noWrap:!0,space:["xs","m"]},renderLeft&&renderLeft({textSize}),React.createElement(EntityListItemText,{size:textSize,description:description,truncateLabel:truncateLabel},renderLabel({textSize}))),rightElement&&React.createElement(StyledMinHeightCell,{textSize:textSize},isInteractiveElement(rightElement)?cloneElement(rightElement,{tabIndex,onClick:event=>{event.stopPropagation(),rightElement.props.onClick?.(event)},...rightElement.props.onMouseDown&&{onMouseDown:event=>{event.stopPropagation(),rightElement.props.onMouseDown?.(event)}},...rightElement.props.onPointerDown&&{onPointerDown:event=>{event.stopPropagation(),rightElement.props.onPointerDown?.(event)}}}):rightElement))}
@@ -1 +1 @@
1
- import React,{useCallback,useImperativeHandle,useRef}from"react";import{EntityItemBody}from"./EntityItemBody";import{useKeyboard}from"../../shared/useKeyboard";import{StyledEntityListItemWrapper,StyledEntityListItemButton}from"./styled-components";let isSelfEvent=e=>e.target===e.currentTarget,useButtonKeyboard=({ref:globalRef,isActive,onSpaceEnterPress})=>{let localRef=useRef(null);return useKeyboard({"Space Enter":onSpaceEnterPress},localRef,isActive,!0),useImperativeHandle(globalRef,()=>localRef.current),localRef};export const EntityListItem=React.forwardRef(({checkboxProps,description,hideBorder,isActive,isClickable,isDisabled,onClick,renderLabel,renderLeft,renderRight,role,tabIndex,onSpaceEnterPress,size="m","aria-label":ariaLabel,"data-list-item":dataListItem,isSelected,truncateLabel,onPointerEnter,onPointerLeave,onFocus,onBlur,onKeyDown,"aria-describedby":ariaDescribedBy},ref)=>{let handleOnClick=useCallback(e=>{isClickable&&onClick&&onClick(e)},[onClick,isClickable]),buttonRef=useButtonKeyboard({ref,isActive:isClickable&&!isDisabled&&void 0!==tabIndex,onSpaceEnterPress}),supportsAriaSelected="menuitem"!==role,supportsAriaCurrent="option"!==role;return React.createElement(StyledEntityListItemButton,{role:role,"aria-label":ariaLabel,"aria-describedby":ariaDescribedBy,"aria-selected":supportsAriaSelected?isSelected:void 0,"aria-current":supportsAriaCurrent&&isActive?isActive:void 0,"aria-disabled":isDisabled,size:size,tabIndex:tabIndex,ref:buttonRef,"data-list-item":dataListItem,"data-id":"list-item",onClick:handleOnClick,onPointerEnter:onPointerEnter,onPointerLeave:onPointerLeave,onFocus:e=>{isSelfEvent(e)&&onFocus?.(e)},onBlur:e=>{isSelfEvent(e)&&onBlur?.(e)},onKeyDown:onKeyDown,isClickable:isClickable,isActive:isActive,isDisabled:isDisabled},React.createElement(StyledEntityListItemWrapper,{size:size,hideBorder:hideBorder||"xs"===size},React.createElement(EntityItemBody,{size:size,tabIndex:tabIndex,checkboxProps:checkboxProps,description:description,renderLabel:renderLabel,renderLeft:renderLeft,renderRight:renderRight,truncateLabel:truncateLabel})))});
1
+ import React,{useCallback,useImperativeHandle,useRef}from"react";import{EntityItemBody}from"./EntityItemBody";import{useKeyboard}from"../../shared/useKeyboard";import{StyledEntityListItemWrapper,StyledEntityListItemButton}from"./styled-components";let isSelfEvent=e=>e.target===e.currentTarget,useButtonKeyboard=({ref:globalRef,isActive,onSpaceEnterPress})=>{let localRef=useRef(null);return useKeyboard({"Space Enter":e=>onSpaceEnterPress?.(e)},localRef,isActive,!0),useImperativeHandle(globalRef,()=>localRef.current),localRef};export const EntityListItem=React.forwardRef(({checkboxProps,description,hideBorder,isActive,isClickable,isDisabled,onClick,renderLabel,renderLeft,renderRight,role,tabIndex,onSpaceEnterPress,size="m","aria-label":ariaLabel,"data-list-item":dataListItem,isSelected,truncateLabel,onPointerEnter,onPointerLeave,onFocus,onBlur,onKeyDown,"aria-describedby":ariaDescribedBy},ref)=>{let handleOnClick=useCallback(e=>{isClickable&&onClick&&onClick(e)},[onClick,isClickable]),buttonRef=useButtonKeyboard({ref,isActive:!!isClickable&&!isDisabled&&void 0!==tabIndex,onSpaceEnterPress}),supportsAriaSelected="menuitem"!==role,supportsAriaCurrent="option"!==role;return React.createElement(StyledEntityListItemButton,{role:role,"aria-label":ariaLabel,"aria-describedby":ariaDescribedBy,"aria-selected":supportsAriaSelected?isSelected:void 0,"aria-current":supportsAriaCurrent&&isActive?isActive:void 0,"aria-disabled":isDisabled,size:size,tabIndex:tabIndex,ref:buttonRef,"data-list-item":dataListItem,"data-id":"list-item",onClick:handleOnClick,onPointerEnter:onPointerEnter,onPointerLeave:onPointerLeave,onFocus:e=>{isSelfEvent(e)&&onFocus?.(e)},onBlur:e=>{isSelfEvent(e)&&onBlur?.(e)},onKeyDown:onKeyDown,isClickable:isClickable,isActive:isActive,isDisabled:isDisabled},React.createElement(StyledEntityListItemWrapper,{size:size,hideBorder:hideBorder||"xs"===size},React.createElement(EntityItemBody,{size:size,tabIndex:tabIndex,checkboxProps:checkboxProps,description:description,renderLabel:renderLabel,renderLeft:renderLeft,renderRight:renderRight,truncateLabel:truncateLabel})))});
@@ -1,7 +1,7 @@
1
1
  import type { AriaAttributes } from "react";
2
2
  import React from "react";
3
- import type { EntityListAriaAttributes, EntityListItemProps } from "../EntityList/types";
4
3
  import type { SlotProps } from "../../shared/slotProps";
4
+ import type { EntityListAriaAttributes, EntityListItemProps } from "../EntityList/types";
5
5
  import type { NodeID, TreeNode, CheckboxState } from "./types";
6
6
  export type TreeNodeWithUIState = TreeNode & {
7
7
  isExpanded: boolean;
@@ -17,6 +17,7 @@ export type RenderTreeItemWrapperProps = {
17
17
  };
18
18
  export type EntityTreeSlotProps = SlotProps<{
19
19
  toggle: {
20
+ /** TODO(DS): make required — the toggle is icon-only. See follow-up. */
20
21
  "aria-label-expand"?: string;
21
22
  "aria-label-collapse"?: string;
22
23
  };
@@ -69,7 +70,7 @@ export type EntityTreeProps = {
69
70
  /** How many expanded nodes we render at once. The tree slows down a page if the size 1000+ */
70
71
  chunkSize?: number;
71
72
  /** If provided, the function is used to render an element in the trail of a node. */
72
- renderRightContent?: (props: TreeNode & Parameters<EntityListItemProps["renderRight"]>[0]) => React.ReactNode;
73
+ renderRightContent?: (props: TreeNode & Parameters<NonNullable<EntityListItemProps["renderRight"]>>[0]) => React.ReactNode;
73
74
  /**
74
75
  * Wraps each rendered row, so an overlay (e.g. `Tooltip`) can be composed around
75
76
  * it from the outside. The wrapper is applied inside the `treeitem` element, so it
@@ -1 +1 @@
1
- import React,{useMemo,useState,useEffect,useCallback}from"react";import{Button}from"../Button/Button";import{Box}from"../Box/Box";import{StyledList,StyledShowMore}from"../EntityList/styled-components";import{EntityTreeItem}from"./EntityTreeItem";import{useKeyboard}from"../../shared/useKeyboard";import{useFocusByIndex}from"../EntityList/useFocusByIndex";import{Text}from"../Typography/Text/Text";import{getNodeChildrenMap,getTreeCheckboxState,getVisibleActiveNodeId,getLeafNodeIds,filterTree,mapTree,trimDataByMaxSize}from"./tree";let flattenTree=(data,expandedIds,expadedAll)=>{let flattened=[];return data.forEach(node=>{flattened.push(node),(node.children.length>0&&expandedIds[node.id]||expadedAll)&&flattened.push(...flattenTree(node.children,expandedIds,expadedAll))}),flattened},getLastNodeOfList=({node,data,level,isParentsLastOfLvl})=>{let currentLastNodeOfLvl=node.id===data[data.length-1].id;return 0===level?currentLastNodeOfLvl:isParentsLastOfLvl&&currentLastNodeOfLvl},useTreeTruncation=({chunkSize,data,expandAll,nodeExpandedState})=>{let[maxNodesCount,setMaxNodesCount]=useState(chunkSize),{result,hasMoreNodes}=useMemo(()=>trimDataByMaxSize(data,nodeExpandedState,expandAll,maxNodesCount),[data,nodeExpandedState,expandAll,maxNodesCount]);return{handleIncreaseMaxNodeCount:useCallback(()=>{setMaxNodesCount(prev=>prev+chunkSize)},[chunkSize]),result,hasMoreNodes}},Node=({isFirstNode,nodeChildrenMap,nodeCheckboxState,nodeExpandedState,handleSelectionChange,handleToggle,expandAll,onNodeClick,hideBorder,size,showItemsCount,renderRightContent,renderItemWrapper,activeId,focusedNodeId,node,level,renderFn,isLastNodeOfList,ariaLabelExpand,ariaLabelCollapse,visibleNodeIndexMap})=>{let readOnly=null===nodeCheckboxState,hasChildren=node.children.length>0,expandedState=!!expandAll||!!nodeExpandedState[node.id],leafItems=getLeafNodeIds(nodeChildrenMap,node.id),totalItemsCount=leafItems.length,selectedItemsCount=nodeCheckboxState?leafItems.filter(leafId=>"checked"===nodeCheckboxState[leafId]).length:null,countLabel=nodeCheckboxState?`(${selectedItemsCount}/${totalItemsCount})`:`(${totalItemsCount})`,lastLeaf=!hasChildren&&!node.isFiltered,isExpanded=lastLeaf?void 0:expandedState,{children,...nodeDataWithoutChildren}=node,isFocused=focusedNodeId===node.id,treeItemElm=React.createElement(EntityTreeItem,{"data-list-item":visibleNodeIndexMap[node.id],hideBorder:hideBorder||isLastNodeOfList&&(!isExpanded||node.isFiltered),tabIndex:isFocused||null===focusedNodeId&&isFirstNode?0:-1,size:size,lSpaceStep:level,onSpaceEnterPress:()=>{if(readOnly){handleToggle(node.id),onNodeClick?.(nodeDataWithoutChildren);return}handleSelectionChange(node.id)},description:node.description,renderLabel:({textSize})=>React.createElement(React.Fragment,null,node.label,showItemsCount&&!lastLeaf&&React.createElement(Text,{as:"span",size:textSize,color:"tertiary"}," ",countLabel)),isActive:activeId===node.id,isExpanded:isExpanded,isDisabledExpand:expandAll,checkboxProps:!readOnly&&{size:"s",name:node.label,checked:nodeCheckboxState?.[node.id]==="checked",indeterminate:nodeCheckboxState?.[node.id]==="indeterminate",onChange:()=>handleSelectionChange(node.id)},onExpandClick:e=>{e.stopPropagation(),handleToggle(node.id)},isClickable:readOnly,onClick:()=>{handleToggle(node.id),onNodeClick?.(nodeDataWithoutChildren)},renderRight:renderRightContent?renderRightProps=>renderRightContent({...renderRightProps,...node}):void 0,ariaLabelExpand:ariaLabelExpand,ariaLabelCollapse:ariaLabelCollapse,"aria-label":node.label,"aria-level":level+1},hasChildren&&React.createElement("div",{role:"group"},renderFn({data:children,level:level+1,renderFn,isParentsLastOfLvl:isLastNodeOfList})));return renderItemWrapper?renderItemWrapper({item:node,children:treeItemElm}):treeItemElm},makeRenderTreeBranches=renderTreeArgs=>({data,level,renderFn,isParentsLastOfLvl})=>data.map((node,i)=>{let isFirstNode=0===level&&0===i,isLastNodeOfList=getLastNodeOfList({node,data,level,isParentsLastOfLvl});return React.createElement(Node,{key:node.id,level:level,node:node,isFirstNode:isFirstNode,renderFn:renderFn,isLastNodeOfList:isLastNodeOfList,...renderTreeArgs})});export const BaseEntityTree=({ariaAttributes:deprecatedAriaAttributes,slotProps,data,selectedIds,onSelectionChange,onSelectionToggle,onNodeClick,expandedIds=[],onToggle,activeId,chunkSize=10,filterFn,onTreeChange,hideBorder=!1,size="m",showItemsCount=!0,showMoreButtonLabel,renderRightContent,renderItemWrapper,"data-e2e-test-id":dataE2eTestId,...ariaAttributes})=>{let nodeChildrenMap=Object.assign({},...data.map(tree=>getNodeChildrenMap(tree))),nodeCheckboxState=selectedIds?Object.assign({},...data.map(tree=>getTreeCheckboxState(nodeChildrenMap,tree.id,selectedIds))):null,nodeExpandedState=expandedIds.reduce((acc,id)=>(acc[id]=!0,acc),{}),visibleActiveNodeId=getVisibleActiveNodeId(nodeChildrenMap,nodeExpandedState,activeId),handleExpand=useCallback(targetId=>{onToggle&&!expandedIds.includes(targetId)&&onToggle(expandedIds.concat([targetId]))},[expandedIds,onToggle]),handleCollapse=useCallback(targetId=>{onToggle&&expandedIds.includes(targetId)&&onToggle(expandedIds.filter(id=>id!==targetId))},[expandedIds,onToggle]),handleToggle=useCallback(targetId=>{expandedIds.includes(targetId)?handleCollapse(targetId):handleExpand(targetId)},[expandedIds,handleCollapse,handleExpand]),dataShown=filterFn?data.map(tree=>filterTree(tree,filterFn)).filter(Boolean):data;useEffect(()=>{onTreeChange&&onTreeChange(dataShown.map(tree=>mapTree(tree,node=>({...node,checkedState:!!nodeCheckboxState&&nodeCheckboxState[node.id],isExpanded:!!nodeExpandedState[node.id]}))))},[dataShown,nodeCheckboxState,nodeExpandedState,onTreeChange]);let expandAll=!!filterFn,{hasMoreNodes,handleIncreaseMaxNodeCount,result}=useTreeTruncation({chunkSize,data:dataShown,nodeExpandedState,expandAll}),listRef=React.useRef(null),visibleNodes=useMemo(()=>flattenTree(result,nodeExpandedState,expandAll),[result,nodeExpandedState,expandAll]),visibleNodeIndexMap=useMemo(()=>visibleNodes.reduce((acc,node,index)=>(acc[node.id]=index,acc),{}),[visibleNodes]),{moveFocus,focusedIndex}=useFocusByIndex({containerRef:listRef,nodeSelector:"data-list-item",data:useMemo(()=>visibleNodes.map(node=>({id:node.id,isDisabled:!!node.isDisabled})),[visibleNodes])}),focusedNodeId=focusedIndex>=0?visibleNodes[focusedIndex]?.id??null:null;useKeyboard({ArrowDown:()=>{moveFocus(1)},ArrowUp:()=>{moveFocus(-1)},ArrowRight:()=>{!expandAll&&focusedNodeId&&nodeChildrenMap[focusedNodeId]?.length&&!nodeExpandedState[focusedNodeId]&&handleExpand(focusedNodeId)},ArrowLeft:()=>{!expandAll&&focusedNodeId&&nodeChildrenMap[focusedNodeId]?.length&&nodeExpandedState[focusedNodeId]&&handleCollapse(focusedNodeId)}},listRef,!!visibleNodes.length);let renderTreeBranches=makeRenderTreeBranches({nodeChildrenMap,nodeCheckboxState,nodeExpandedState,handleSelectionChange:targetId=>{if(onSelectionChange){let isSelected,updatedSelectedIds=[];if(0===nodeChildrenMap[targetId].length)isSelected=!selectedIds.includes(targetId),updatedSelectedIds=selectedIds.includes(targetId)?selectedIds.filter(id=>id!==targetId):selectedIds.concat([targetId]);else{let affectedLeafNodeIds=getLeafNodeIds(nodeChildrenMap,targetId),hasUncheckedChildren=affectedLeafNodeIds.some(leafId=>!selectedIds.includes(leafId));updatedSelectedIds=hasUncheckedChildren?selectedIds.concat(affectedLeafNodeIds.filter(id=>!selectedIds.includes(id))):selectedIds.filter(id=>!affectedLeafNodeIds.includes(id)),isSelected=hasUncheckedChildren}onSelectionToggle?.(targetId,isSelected),onSelectionChange(updatedSelectedIds)}},handleToggle,onNodeClick:node=>{onNodeClick?.(node)},expandAll,hideBorder,size,showItemsCount,renderRightContent,renderItemWrapper,activeId:visibleActiveNodeId,focusedNodeId,visibleNodeIndexMap,ariaLabelExpand:slotProps?.toggle?.["aria-label-expand"]??deprecatedAriaAttributes?.ariaLabelExpand,ariaLabelCollapse:slotProps?.toggle?.["aria-label-collapse"]??deprecatedAriaAttributes?.ariaLabelCollapse});return React.createElement("div",null,React.createElement(StyledList,{ref:listRef,"data-e2e-test-id":dataE2eTestId,"data-ds-id":"EntityTree",size:size,...ariaAttributes,role:"tree","aria-multiselectable":!!nodeCheckboxState||void 0},renderTreeBranches({data:result,level:0,renderFn:renderTreeBranches})),hasMoreNodes&&React.createElement(StyledShowMore,null,React.createElement(Box,{alignText:"center",space:"xs"},React.createElement(Button,{fullWidth:!0,size:"s",variant:"tertiary",onClick:handleIncreaseMaxNodeCount},showMoreButtonLabel))))};
1
+ import React,{useMemo,useState,useEffect,useCallback}from"react";import{Button}from"../Button/Button";import{Box}from"../Box/Box";import{StyledList,StyledShowMore}from"../EntityList/styled-components";import{EntityTreeItem}from"./EntityTreeItem";import{useKeyboard}from"../../shared/useKeyboard";import{useFocusByIndex}from"../EntityList/useFocusByIndex";import{Text}from"../Typography/Text/Text";import{getNodeChildrenMap,getTreeCheckboxState,getVisibleActiveNodeId,getLeafNodeIds,filterTree,mapTree,trimDataByMaxSize}from"./tree";let flattenTree=(data,expandedIds,expadedAll)=>{let flattened=[];return data.forEach(node=>{flattened.push(node),(node.children.length>0&&expandedIds[node.id]||expadedAll)&&flattened.push(...flattenTree(node.children,expandedIds,expadedAll))}),flattened},getLastNodeOfList=({node,data,level,isParentsLastOfLvl})=>{let currentLastNodeOfLvl=node.id===data[data.length-1].id;return 0===level?currentLastNodeOfLvl:isParentsLastOfLvl&&currentLastNodeOfLvl},useTreeTruncation=({chunkSize,data,expandAll,nodeExpandedState})=>{let[maxNodesCount,setMaxNodesCount]=useState(chunkSize),{result,hasMoreNodes}=useMemo(()=>trimDataByMaxSize(data,nodeExpandedState,expandAll,maxNodesCount),[data,nodeExpandedState,expandAll,maxNodesCount]);return{handleIncreaseMaxNodeCount:useCallback(()=>{setMaxNodesCount(prev=>prev+chunkSize)},[chunkSize]),result,hasMoreNodes}},Node=({isFirstNode,nodeChildrenMap,nodeCheckboxState,nodeExpandedState,handleSelectionChange,handleToggle,expandAll,onNodeClick,hideBorder,size,showItemsCount,renderRightContent,renderItemWrapper,activeId,focusedNodeId,node,level,renderFn,isLastNodeOfList,ariaLabelExpand,ariaLabelCollapse,visibleNodeIndexMap})=>{let readOnly=null===nodeCheckboxState,hasChildren=node.children.length>0,expandedState=!!expandAll||!!nodeExpandedState[node.id],leafItems=getLeafNodeIds(nodeChildrenMap,node.id),totalItemsCount=leafItems.length,selectedItemsCount=nodeCheckboxState?leafItems.filter(leafId=>"checked"===nodeCheckboxState[leafId]).length:null,countLabel=nodeCheckboxState?`(${selectedItemsCount}/${totalItemsCount})`:`(${totalItemsCount})`,lastLeaf=!hasChildren&&!node.isFiltered,isExpanded=lastLeaf?void 0:expandedState,{children,...nodeDataWithoutChildren}=node,isFocused=focusedNodeId===node.id,treeItemElm=React.createElement(EntityTreeItem,{"data-list-item":visibleNodeIndexMap[node.id],hideBorder:hideBorder||isLastNodeOfList&&(!isExpanded||node.isFiltered),tabIndex:isFocused||null===focusedNodeId&&isFirstNode?0:-1,size:size,lSpaceStep:level,onSpaceEnterPress:()=>{if(readOnly){handleToggle(node.id),onNodeClick?.(nodeDataWithoutChildren);return}handleSelectionChange(node.id)},description:node.description,renderLabel:({textSize})=>React.createElement(React.Fragment,null,node.label,showItemsCount&&!lastLeaf&&React.createElement(Text,{as:"span",size:textSize,color:"tertiary"}," ",countLabel)),isActive:activeId===node.id,isExpanded:isExpanded,isDisabledExpand:expandAll,checkboxProps:readOnly?void 0:{size:"s",name:node.label,checked:nodeCheckboxState?.[node.id]==="checked",indeterminate:nodeCheckboxState?.[node.id]==="indeterminate",onChange:()=>handleSelectionChange(node.id)},onExpandClick:e=>{e.stopPropagation(),handleToggle(node.id)},isClickable:readOnly,onClick:()=>{handleToggle(node.id),onNodeClick?.(nodeDataWithoutChildren)},renderRight:renderRightContent?renderRightProps=>renderRightContent({...renderRightProps,...node}):void 0,ariaLabelExpand:ariaLabelExpand,ariaLabelCollapse:ariaLabelCollapse,"aria-label":node.label,"aria-level":level+1},hasChildren&&React.createElement("div",{role:"group"},renderFn({data:children,level:level+1,renderFn,isParentsLastOfLvl:isLastNodeOfList})));return renderItemWrapper?renderItemWrapper({item:node,children:treeItemElm}):treeItemElm},makeRenderTreeBranches=renderTreeArgs=>({data,level,renderFn,isParentsLastOfLvl=!1})=>data.map((node,i)=>{let isFirstNode=0===level&&0===i,isLastNodeOfList=getLastNodeOfList({node,data,level,isParentsLastOfLvl});return React.createElement(Node,{key:node.id,level:level,node:node,isFirstNode:isFirstNode,renderFn:renderFn,isLastNodeOfList:isLastNodeOfList,...renderTreeArgs})}),isMatchingTreeNode=tree=>null!==tree;export const BaseEntityTree=({ariaAttributes:deprecatedAriaAttributes,slotProps,data,selectedIds,onSelectionChange,onSelectionToggle,onNodeClick,expandedIds=[],onToggle,activeId,chunkSize=10,filterFn,onTreeChange,hideBorder=!1,size="m",showItemsCount=!0,showMoreButtonLabel,renderRightContent,renderItemWrapper,"data-e2e-test-id":dataE2eTestId,...ariaAttributes})=>{let nodeChildrenMap=Object.assign({},...data.map(tree=>getNodeChildrenMap(tree))),nodeCheckboxState=selectedIds?Object.assign({},...data.map(tree=>getTreeCheckboxState(nodeChildrenMap,tree.id,selectedIds))):null,nodeExpandedState=expandedIds.reduce((acc,id)=>(acc[id]=!0,acc),{}),visibleActiveNodeId=getVisibleActiveNodeId(nodeChildrenMap,nodeExpandedState,activeId),handleExpand=useCallback(targetId=>{onToggle&&!expandedIds.includes(targetId)&&onToggle(expandedIds.concat([targetId]))},[expandedIds,onToggle]),handleCollapse=useCallback(targetId=>{onToggle&&expandedIds.includes(targetId)&&onToggle(expandedIds.filter(id=>id!==targetId))},[expandedIds,onToggle]),handleToggle=useCallback(targetId=>{expandedIds.includes(targetId)?handleCollapse(targetId):handleExpand(targetId)},[expandedIds,handleCollapse,handleExpand]),dataShown=filterFn?data.map(tree=>filterTree(tree,filterFn)).filter(isMatchingTreeNode):data;useEffect(()=>{onTreeChange&&onTreeChange(dataShown.map(tree=>mapTree(tree,node=>({...node,checkedState:!!nodeCheckboxState&&nodeCheckboxState[node.id],isExpanded:!!nodeExpandedState[node.id]}))))},[dataShown,nodeCheckboxState,nodeExpandedState,onTreeChange]);let expandAll=!!filterFn,{hasMoreNodes,handleIncreaseMaxNodeCount,result}=useTreeTruncation({chunkSize,data:dataShown,nodeExpandedState,expandAll}),listRef=React.useRef(null),visibleNodes=useMemo(()=>flattenTree(result,nodeExpandedState,expandAll),[result,nodeExpandedState,expandAll]),visibleNodeIndexMap=useMemo(()=>visibleNodes.reduce((acc,node,index)=>(acc[node.id]=index,acc),{}),[visibleNodes]),{moveFocus,focusedIndex}=useFocusByIndex({containerRef:listRef,nodeSelector:"data-list-item",data:useMemo(()=>visibleNodes.map(node=>({id:node.id,isDisabled:!!node.isDisabled})),[visibleNodes])}),focusedNodeId=focusedIndex>=0?visibleNodes[focusedIndex]?.id??null:null;useKeyboard({ArrowDown:()=>{moveFocus(1)},ArrowUp:()=>{moveFocus(-1)},ArrowRight:()=>{!expandAll&&focusedNodeId&&nodeChildrenMap[focusedNodeId]?.length&&!nodeExpandedState[focusedNodeId]&&handleExpand(focusedNodeId)},ArrowLeft:()=>{!expandAll&&focusedNodeId&&nodeChildrenMap[focusedNodeId]?.length&&nodeExpandedState[focusedNodeId]&&handleCollapse(focusedNodeId)}},listRef,!!visibleNodes.length);let renderTreeBranches=makeRenderTreeBranches({nodeChildrenMap,nodeCheckboxState,nodeExpandedState,handleSelectionChange:targetId=>{if(onSelectionChange&&selectedIds){let isSelected,updatedSelectedIds=[];if(0===nodeChildrenMap[targetId].length)isSelected=!selectedIds.includes(targetId),updatedSelectedIds=selectedIds.includes(targetId)?selectedIds.filter(id=>id!==targetId):selectedIds.concat([targetId]);else{let affectedLeafNodeIds=getLeafNodeIds(nodeChildrenMap,targetId),hasUncheckedChildren=affectedLeafNodeIds.some(leafId=>!selectedIds.includes(leafId));updatedSelectedIds=hasUncheckedChildren?selectedIds.concat(affectedLeafNodeIds.filter(id=>!selectedIds.includes(id))):selectedIds.filter(id=>!affectedLeafNodeIds.includes(id)),isSelected=hasUncheckedChildren}onSelectionToggle?.(targetId,isSelected),onSelectionChange(updatedSelectedIds)}},handleToggle,onNodeClick:node=>{onNodeClick?.(node)},expandAll,hideBorder,size,showItemsCount,renderRightContent,renderItemWrapper,activeId:visibleActiveNodeId,focusedNodeId,visibleNodeIndexMap,ariaLabelExpand:slotProps?.toggle?.["aria-label-expand"]??deprecatedAriaAttributes?.ariaLabelExpand,ariaLabelCollapse:slotProps?.toggle?.["aria-label-collapse"]??deprecatedAriaAttributes?.ariaLabelCollapse});return React.createElement("div",null,React.createElement(StyledList,{ref:listRef,"data-e2e-test-id":dataE2eTestId,"data-ds-id":"EntityTree",size:size,...ariaAttributes,role:"tree","aria-multiselectable":!!nodeCheckboxState||void 0},renderTreeBranches({data:result,level:0,renderFn:renderTreeBranches})),hasMoreNodes&&React.createElement(StyledShowMore,null,React.createElement(Box,{alignText:"center",space:"xs"},React.createElement(Button,{fullWidth:!0,size:"s",variant:"tertiary",onClick:handleIncreaseMaxNodeCount},showMoreButtonLabel))))};
@@ -1 +1 @@
1
- import React,{useCallback,useImperativeHandle,useRef}from"react";import styled from"@emotion/styled";import{useResponsiveValue}from"../../shared/mediaQueries";import{EntityTreeItemExpandButton}from"./EntityTreeItemExpandButton";import{useKeyboard}from"../../shared/useKeyboard";import{getFocusStyles}from"../../shared/mixins";import{EntityItemBody}from"../EntityList/EntityItemBody";import{StyledEntityItem,StyledEntityListItemWrapper,StyledEntityListItemButton}from"../EntityList/styled-components";let isSelfEvent=e=>e.target===e.currentTarget,StyledEntityTreeItemWrapper=styled(StyledEntityListItemWrapper,{target:"e18sww000",label:"StyledEntityTreeItemWrapper"})({paddingLeft:"0 !important"}),StyledEntityTreeItemContainer=styled(StyledEntityListItemButton,{target:"e18sww001",label:"StyledEntityTreeItemContainer"})(({theme,hasExpandableIcon,lSpaceStep})=>{let getSize=(baseOffset,deepestNodeOffset)=>`calc(${baseOffset} * ${lSpaceStep} + ${hasExpandableIcon?"0px":deepestNodeOffset} + ${theme.variables.size.spacing.xxs})`;return{...getFocusStyles({offset:-2}),...useResponsiveValue({paddingLeft:[getSize(theme.variables.size.spacing.m,"42px"),getSize(theme.variables.size.spacing.xl,"56px")]})}});export const EntityTreeItem=React.forwardRef(({checkboxProps,children,description,hideBorder,isActive,isClickable,isDisabled,isDisabledExpand,isExpanded,lSpaceStep,onClick,onExpandClick,onSpaceEnterPress,renderLabel,renderLeft,renderRight,size="m",tabIndex,ariaLabelExpand,ariaLabelCollapse,"aria-level":ariaLevel,"aria-label":ariaLabel,"data-list-item":dataListItem,onPointerEnter,onPointerLeave,onFocus,onBlur,onKeyDown,"aria-describedby":ariaDescribedBy},ref)=>{let hasExpandableIcon=void 0!==isExpanded,handleOnClick=useCallback(e=>{onClick&&onClick(e)},[onClick]),buttonRef=useRef(null);return useKeyboard({"Space Enter":onSpaceEnterPress},buttonRef,0===tabIndex&&(isClickable||!!checkboxProps),!0),useImperativeHandle(ref,()=>buttonRef.current),React.createElement(StyledEntityItem,{role:"treeitem","aria-expanded":hasExpandableIcon?isExpanded:void 0,"aria-checked":checkboxProps?.checked,"aria-label":ariaLabel,"aria-level":ariaLevel},React.createElement(StyledEntityTreeItemContainer,{"data-list-item":dataListItem,size:size,ref:buttonRef,"data-id":"list-item",tabIndex:tabIndex,role:"presentation",isActive:isActive,hasExpandableIcon:hasExpandableIcon,lSpaceStep:lSpaceStep,isDisabled:isDisabled,onClick:handleOnClick,isClickable:isClickable,"aria-describedby":ariaDescribedBy,onPointerEnter:onPointerEnter,onPointerLeave:onPointerLeave,onFocus:e=>{isSelfEvent(e)&&onFocus?.(e)},onBlur:e=>{isSelfEvent(e)&&onBlur?.(e)},onKeyDown:onKeyDown},hasExpandableIcon&&React.createElement(EntityTreeItemExpandButton,{size:size,tabIndex:-1,isDisabled:isDisabledExpand||isDisabled,isExpanded:isExpanded,onClick:onExpandClick,ariaLabelExpand:ariaLabelExpand,ariaLabelCollapse:ariaLabelCollapse}),React.createElement(StyledEntityTreeItemWrapper,{size:size,hideBorder:hideBorder||"xs"===size},React.createElement(EntityItemBody,{size:size,tabIndex:tabIndex,description:description,renderLabel:renderLabel,renderLeft:renderLeft,renderRight:renderRight,checkboxProps:checkboxProps}))),isExpanded&&children)});
1
+ import React,{useCallback,useImperativeHandle,useRef}from"react";import styled from"@emotion/styled";import{useResponsiveValue}from"../../shared/mediaQueries";import{EntityTreeItemExpandButton}from"./EntityTreeItemExpandButton";import{useKeyboard}from"../../shared/useKeyboard";import{getFocusStyles}from"../../shared/mixins";import{EntityItemBody}from"../EntityList/EntityItemBody";import{StyledEntityItem,StyledEntityListItemWrapper,StyledEntityListItemButton}from"../EntityList/styled-components";let isSelfEvent=e=>e.target===e.currentTarget,StyledEntityTreeItemWrapper=styled(StyledEntityListItemWrapper,{target:"ek85a5p0",label:"StyledEntityTreeItemWrapper"})({paddingLeft:"0 !important"}),StyledEntityTreeItemContainer=styled(StyledEntityListItemButton,{target:"ek85a5p1",label:"StyledEntityTreeItemContainer"})(({theme,hasExpandableIcon,lSpaceStep})=>{let getSize=(baseOffset,deepestNodeOffset)=>`calc(${baseOffset} * ${lSpaceStep} + ${hasExpandableIcon?"0px":deepestNodeOffset} + ${theme.variables.size.spacing.xxs})`;return{...getFocusStyles({offset:-2}),...useResponsiveValue({paddingLeft:[getSize(theme.variables.size.spacing.m,"42px"),getSize(theme.variables.size.spacing.xl,"56px")]})}});export const EntityTreeItem=React.forwardRef(({checkboxProps,children,description,hideBorder,isActive,isClickable,isDisabled,isDisabledExpand,isExpanded,lSpaceStep,onClick,onExpandClick,onSpaceEnterPress,renderLabel,renderLeft,renderRight,size="m",tabIndex,ariaLabelExpand,ariaLabelCollapse,"aria-level":ariaLevel,"aria-label":ariaLabel,"data-list-item":dataListItem,onPointerEnter,onPointerLeave,onFocus,onBlur,onKeyDown,"aria-describedby":ariaDescribedBy},ref)=>{let hasExpandableIcon=void 0!==isExpanded,handleOnClick=useCallback(e=>{onClick&&onClick(e)},[onClick]),buttonRef=useRef(null);return useKeyboard({"Space Enter":e=>onSpaceEnterPress?.(e)},buttonRef,0===tabIndex&&(isClickable||!!checkboxProps),!0),useImperativeHandle(ref,()=>buttonRef.current),React.createElement(StyledEntityItem,{role:"treeitem","aria-expanded":hasExpandableIcon?isExpanded:void 0,"aria-checked":checkboxProps?.checked,"aria-label":ariaLabel,"aria-level":ariaLevel},React.createElement(StyledEntityTreeItemContainer,{"data-list-item":dataListItem,size:size,ref:buttonRef,"data-id":"list-item",tabIndex:tabIndex,role:"presentation",isActive:isActive,hasExpandableIcon:hasExpandableIcon,lSpaceStep:lSpaceStep,isDisabled:isDisabled,onClick:handleOnClick,isClickable:isClickable,"aria-describedby":ariaDescribedBy,onPointerEnter:onPointerEnter,onPointerLeave:onPointerLeave,onFocus:e=>{isSelfEvent(e)&&onFocus?.(e)},onBlur:e=>{isSelfEvent(e)&&onBlur?.(e)},onKeyDown:onKeyDown},hasExpandableIcon&&React.createElement(EntityTreeItemExpandButton,{size:size,tabIndex:-1,isDisabled:isDisabledExpand||isDisabled,isExpanded:isExpanded,onClick:onExpandClick,ariaLabelExpand:ariaLabelExpand,ariaLabelCollapse:ariaLabelCollapse}),React.createElement(StyledEntityTreeItemWrapper,{size:size,hideBorder:hideBorder||"xs"===size},React.createElement(EntityItemBody,{size:size,tabIndex:tabIndex,description:description,renderLabel:renderLabel,renderLeft:renderLeft,renderRight:renderRight,checkboxProps:checkboxProps}))),isExpanded&&children)});
@@ -1,3 +1,5 @@
1
1
  import React from "react";
2
2
  import type { EntityListItemProps } from "../EntityList/types";
3
- export declare function EntityTreeItemExpandButton({ size, onClick, isExpanded, isDisabled, ariaLabelExpand, ariaLabelCollapse, tabIndex, }: Partial<EntityListItemProps>): React.ReactElement;
3
+ type EntityTreeItemExpandButtonProps = Pick<EntityListItemProps, "onClick" | "isExpanded" | "isDisabled" | "ariaLabelExpand" | "ariaLabelCollapse" | "tabIndex"> & Required<Pick<EntityListItemProps, "size">>;
4
+ export declare function EntityTreeItemExpandButton({ size, onClick, isExpanded, isDisabled, ariaLabelExpand, ariaLabelCollapse, tabIndex, }: EntityTreeItemExpandButtonProps): React.ReactElement;
5
+ export {};
@@ -1 +1 @@
1
- import React from"react";import{PictogramButton}from"../PictogramButton/PictogramButton";import{Box}from"../Box/Box";import{StyledWrapperOffset}from"../EntityList/styled-components";export function EntityTreeItemExpandButton({size,onClick,isExpanded,isDisabled,ariaLabelExpand,ariaLabelCollapse,tabIndex}){return React.createElement(Box,{vSpace:"zero",space:["xs","m"]},React.createElement(StyledWrapperOffset,{size:size},React.createElement(PictogramButton,{tabIndex:tabIndex,disabled:isDisabled,onClick:onClick,icon:isExpanded?"chevron-down":"chevron-right","aria-label":isExpanded?ariaLabelExpand:ariaLabelCollapse,"aria-expanded":isExpanded})))}
1
+ import React from"react";import{useIntl}from"../../shared/intl/useIntl";import{PictogramButton}from"../PictogramButton/PictogramButton";import{Box}from"../Box/Box";import{StyledWrapperOffset}from"../EntityList/styled-components";export function EntityTreeItemExpandButton({size,onClick,isExpanded,isDisabled,ariaLabelExpand,ariaLabelCollapse,tabIndex}){let{formatMessage}=useIntl();return React.createElement(Box,{vSpace:"zero",space:["xs","m"]},React.createElement(StyledWrapperOffset,{size:size},React.createElement(PictogramButton,{tabIndex:tabIndex,disabled:isDisabled,onClick:onClick,icon:isExpanded?"chevron-down":"chevron-right","aria-label":isExpanded?ariaLabelCollapse??formatMessage("EntityTree.ExpandButton.CollapseAriaLabel"):ariaLabelExpand??formatMessage("EntityTree.ExpandButton.ExpandAriaLabel"),"aria-expanded":isExpanded})))}
@@ -6,7 +6,7 @@ export declare function trimDataByMaxSize(data: TreeNode[], expandedIds: NodeExp
6
6
  hasMoreNodes: boolean;
7
7
  };
8
8
  export declare function getTreeCheckboxState(nodeChildrenMap: NodeChildrenMap, rootID: NodeID, selectedLeafNodeIds: NodeID[]): NodeCheckboxState;
9
- export declare function getVisibleActiveNodeId(nodeChildrenMap: NodeChildrenMap, nodeExpandState: NodeExpandedState, activeId: NodeID): NodeID;
9
+ export declare function getVisibleActiveNodeId(nodeChildrenMap: NodeChildrenMap, nodeExpandState: NodeExpandedState, activeId: NodeID | undefined): NodeID | undefined;
10
10
  export declare function getLeafNodeIds(nodeChildrenMap: NodeChildrenMap, rootID: NodeID): NodeID[];
11
11
  export declare function filterTree(tree: TreeNode, filterFn: (node: TreeNode) => boolean): TreeNode | null;
12
12
  export declare function mapTree(tree: TreeNode, mapFn: (node: TreeNode) => TreeNode): TreeNode;
@@ -1 +1 @@
1
- import{CheckboxState}from"./types";function foldTree(f,nodeChildrenMap,rootID){let go=nodeID=>f(nodeID,nodeChildrenMap[nodeID].map(go));return go(rootID)}export function getNodeChildrenMap(tree){let nodeChildrenMap={};return!function traverse(node){let{children}=node;nodeChildrenMap[node.id]=children.map(child=>(traverse(child),child.id))}(tree),nodeChildrenMap}export function findPathToNode(nodeChildrenMap,targetNodeID){let findParent=nodeId=>Object.keys(nodeChildrenMap).find(parentId=>nodeChildrenMap[parentId].includes(nodeId))||null,path=[],currNodeId=targetNodeID;for(;currNodeId;)path.push(currNodeId),currNodeId=findParent(currNodeId);return path.reverse()}export function trimDataByMaxSize(data,expandedIds,expandAll,maxNodesSize){let visibleNodesCount=0,hasMoreNodes=!1;return{result:function getVisibleNodes(nodes){return nodes.reduce((filteredNodes,node)=>{if(visibleNodesCount>=maxNodesSize)return hasMoreNodes=!0,filteredNodes;visibleNodesCount+=1;let newNode={...node};return(expandedIds[node.id]||expandAll)&&node.children.length>0&&(newNode.children=getVisibleNodes(node.children)),[...filteredNodes,newNode]},[])}(data),hasMoreNodes}}export function getTreeCheckboxState(nodeChildrenMap,rootID,selectedLeafNodeIds){return foldTree((currId,childrenResults)=>{if(0===nodeChildrenMap[currId].length)return{[currId]:selectedLeafNodeIds.includes(currId)?CheckboxState.Checked:CheckboxState.Unchecked};let mergedChildrenResult=childrenResults.reduce((acc,result)=>Object.assign(acc,result)),childrenStates=new Set(nodeChildrenMap[currId].map(childId=>mergedChildrenResult[childId]));return{[currId]:1===childrenStates.size?childrenStates.values().next().value:CheckboxState.Indeterminate,...mergedChildrenResult}},nodeChildrenMap,rootID)}export function getVisibleActiveNodeId(nodeChildrenMap,nodeExpandState,activeId){return findPathToNode(nodeChildrenMap,activeId).find(nodeId=>!nodeExpandState[nodeId])}export function getLeafNodeIds(nodeChildrenMap,rootID){return foldTree((currId,childrenResults)=>0===nodeChildrenMap[currId].length?[currId]:childrenResults.flat(),nodeChildrenMap,rootID)}export function filterTree(tree,filterFn){let filteredChildren=tree.children.map(child=>filterTree(child,filterFn)).filter(child=>child);return 0!==filteredChildren.length||filterFn(tree)?{...tree,isFiltered:tree.children.length!==filteredChildren.length,children:filteredChildren}:null}export function mapTree(tree,mapFn){return{...mapFn(tree),children:tree.children.map(child=>mapTree(child,mapFn))}}
1
+ import{CheckboxState}from"./types";function foldTree(f,nodeChildrenMap,rootID){let go=nodeID=>f(nodeID,nodeChildrenMap[nodeID].map(go));return go(rootID)}export function getNodeChildrenMap(tree){let nodeChildrenMap={};return!function traverse(node){let{id,children}=node;void 0!==id&&void 0!==children&&(nodeChildrenMap[id]=children.map(child=>(traverse(child),child.id)))}(tree),nodeChildrenMap}export function findPathToNode(nodeChildrenMap,targetNodeID){let findParent=nodeId=>Object.keys(nodeChildrenMap).find(parentId=>nodeChildrenMap[parentId].includes(nodeId))||null,path=[],currNodeId=targetNodeID;for(;currNodeId;)path.push(currNodeId),currNodeId=findParent(currNodeId);return path.reverse()}export function trimDataByMaxSize(data,expandedIds,expandAll,maxNodesSize){let visibleNodesCount=0,hasMoreNodes=!1;return{result:function getVisibleNodes(nodes){return nodes.reduce((filteredNodes,node)=>{if(visibleNodesCount>=maxNodesSize)return hasMoreNodes=!0,filteredNodes;visibleNodesCount+=1;let newNode={...node};return(expandedIds[node.id]||expandAll)&&node.children.length>0&&(newNode.children=getVisibleNodes(node.children)),[...filteredNodes,newNode]},[])}(data),hasMoreNodes}}export function getTreeCheckboxState(nodeChildrenMap,rootID,selectedLeafNodeIds){return foldTree((currId,childrenResults)=>{if(0===nodeChildrenMap[currId].length)return{[currId]:selectedLeafNodeIds.includes(currId)?CheckboxState.Checked:CheckboxState.Unchecked};let mergedChildrenResult=childrenResults.reduce((acc,result)=>Object.assign(acc,result)),childrenStates=new Set(nodeChildrenMap[currId].map(childId=>mergedChildrenResult[childId])),[firstChildState]=childrenStates;return{[currId]:1===childrenStates.size?firstChildState:CheckboxState.Indeterminate,...mergedChildrenResult}},nodeChildrenMap,rootID)}export function getVisibleActiveNodeId(nodeChildrenMap,nodeExpandState,activeId){if(activeId)return findPathToNode(nodeChildrenMap,activeId).find(nodeId=>!nodeExpandState[nodeId])}export function getLeafNodeIds(nodeChildrenMap,rootID){return foldTree((currId,childrenResults)=>0===nodeChildrenMap[currId].length?[currId]:childrenResults.flat(),nodeChildrenMap,rootID)}export function filterTree(tree,filterFn){let filteredChildren=tree.children.map(child=>filterTree(child,filterFn)).filter(child=>child);return 0!==filteredChildren.length||filterFn(tree)?{...tree,isFiltered:tree.children.length!==filteredChildren.length,children:filteredChildren}:null}export function mapTree(tree,mapFn){return{...mapFn(tree),children:tree.children.map(child=>mapTree(child,mapFn))}}
@@ -1 +1 @@
1
- import React,{useRef,useLayoutEffect}from"react";import styled from"@emotion/styled";import{FormField}from"../FormField/FormField";import{Inline}from"../../Inline/Inline";import{Text,getTextLineHeight}from"../../Typography/Text/Text";import{Icon}from"../../Icon/Icon";import{useFormFieldMessageId}from"../FormField/useFormFieldMessageId";export const StyledInputContainer=styled("div",{target:"e1qs9wfy0",label:"StyledInputContainer"})(({theme,vSize,hSize})=>({userSelect:"none",display:"flex",position:"relative",width:theme.variables.size.dimension.checkbox[hSize],height:`calc(${theme.variables.size.font[vSize]} * ${getTextLineHeight({size:vSize,theme})})`,boxSizing:"border-box",alignItems:"center"}));export const StyledRealInput=styled("input",{target:"e1qs9wfy1",label:"StyledRealInput"})(({theme})=>({opacity:theme.variables.opacity.hidden,cursor:"pointer",height:0,width:0,position:"absolute"}));export const StyledFakeInput=styled("span",{target:"e1qs9wfy2",label:"StyledFakeInput"})(({theme,size})=>({boxSizing:"border-box",width:theme.variables.size.dimension.checkbox[size],height:theme.variables.size.dimension.checkbox[size],borderRadius:theme.variables.size.borderRadius.xs,border:"2px solid",display:"flex",alignItems:"center",justifyContent:"center",background:theme.values.color.background.primary.default,color:theme.values.color.text.onAccent.default,borderColor:theme.values.color.border.primary.default,lineHeight:0,"& svg":{opacity:theme.variables.opacity.hidden},"input: focus-visible + &":{outlineWidth:"2px",outlineStyle:"solid",outlineColor:"Highlight"},"@media (-webkit-min-device-pixel-ratio:0)":{"input: focus-visible + &":{outlineColor:"-webkit-focus-ring-color",outlineStyle:"auto"}},"input:checked + &, input:indeterminate + &":{border:0,background:theme.values.color.background.accent.default,svg:{opacity:theme.variables.opacity.visible}},"input:disabled + &":{pointerEvents:"none"}}));export const StyledCheckboxContainer=styled("div",{target:"e1qs9wfy3",label:"StyledCheckboxContainer"})(({theme,isInteractable})=>({"&:hover":{...isInteractable&&{cursor:"pointer",[`input:checked + ${StyledFakeInput}, input:indeterminate + ${StyledFakeInput}`]:{background:theme.values.color.background.accent.hover},[`${StyledFakeInput}`]:{borderColor:theme.values.color.border.primary.hover}},...!isInteractable&&{cursor:"not-allowed"}}}));export const CheckboxRaw=React.forwardRef(({indeterminate,size="m",disabled,checked,label,labelHint,labelSize="m",...rest},ref)=>{let internalRef=useRef(null),inputRef=ref??internalRef;return useLayoutEffect(()=>{inputRef.current&&(inputRef.current.indeterminate=indeterminate)},[indeterminate,inputRef]),React.createElement(StyledCheckboxContainer,{isInteractable:!disabled},React.createElement(Inline,{space:"xs",vAlignItems:"top",noWrap:!0},React.createElement(StyledInputContainer,{hSize:size,vSize:labelSize},React.createElement(StyledRealInput,{...rest,ref:inputRef,"aria-checked":indeterminate?"mixed":checked,type:"checkbox",disabled:disabled,checked:checked}),React.createElement(StyledFakeInput,{size:size},indeterminate?React.createElement(Icon,{size:"s",name:"minus"}):React.createElement(Icon,{size:"s",name:"m"===size?"check":"check-small"}))),label&&React.createElement("div",null,"string"==typeof label?React.createElement(Text,{size:labelSize},label):label,labelHint&&React.createElement(Text,{color:"tertiary",size:"s"},labelHint))))});export const Checkbox=React.forwardRef(({label,labelHint,hint,errorMessages,size="m",disabled,"data-e2e-test-id":dataE2eTestId,"aria-describedby":ariaDescribedBy,...rest},ref)=>{let{id,ariaDescribedByProp}=useFormFieldMessageId({ariaDescribedBy,errorMessages,hint});return React.createElement(FormField,{"data-e2e-test-id":dataE2eTestId,"data-ds-id":"Checkbox",disabled:disabled,errorMessages:errorMessages,hint:hint,messageId:id},React.createElement(CheckboxRaw,{...rest,ref:ref,size:size,label:label,labelHint:labelHint,disabled:disabled,...ariaDescribedByProp}))});
1
+ import React,{useRef,useLayoutEffect}from"react";import styled from"@emotion/styled";import{FormField}from"../FormField/FormField";import{Inline}from"../../Inline/Inline";import{Text,getTextLineHeight}from"../../Typography/Text/Text";import{Icon}from"../../Icon/Icon";import{useFormFieldMessageId}from"../FormField/useFormFieldMessageId";export const StyledInputContainer=styled("div",{target:"e13evtie0",label:"StyledInputContainer"})(({theme,vSize,hSize})=>({userSelect:"none",display:"flex",position:"relative",width:theme.variables.size.dimension.checkbox[hSize],height:`calc(${theme.variables.size.font[vSize]} * ${getTextLineHeight({size:vSize,theme})})`,boxSizing:"border-box",alignItems:"center"}));export const StyledRealInput=styled("input",{target:"e13evtie1",label:"StyledRealInput"})(({theme})=>({opacity:theme.variables.opacity.hidden,cursor:"pointer",height:0,width:0,position:"absolute"}));export const StyledFakeInput=styled("span",{target:"e13evtie2",label:"StyledFakeInput"})(({theme,size="m"})=>({boxSizing:"border-box",width:theme.variables.size.dimension.checkbox[size],height:theme.variables.size.dimension.checkbox[size],borderRadius:theme.variables.size.borderRadius.xs,border:"2px solid",display:"flex",alignItems:"center",justifyContent:"center",background:theme.values.color.background.primary.default,color:theme.values.color.text.onAccent.default,borderColor:theme.values.color.border.primary.default,lineHeight:0,"& svg":{opacity:theme.variables.opacity.hidden},"input: focus-visible + &":{outlineWidth:"2px",outlineStyle:"solid",outlineColor:"Highlight"},"@media (-webkit-min-device-pixel-ratio:0)":{"input: focus-visible + &":{outlineColor:"-webkit-focus-ring-color",outlineStyle:"auto"}},"input:checked + &, input:indeterminate + &":{border:0,background:theme.values.color.background.accent.default,svg:{opacity:theme.variables.opacity.visible}},"input:disabled + &":{pointerEvents:"none"}}));export const StyledCheckboxContainer=styled("div",{target:"e13evtie3",label:"StyledCheckboxContainer"})(({theme,isInteractable})=>({"&:hover":{...isInteractable&&{cursor:"pointer",[`input:checked + ${StyledFakeInput}, input:indeterminate + ${StyledFakeInput}`]:{background:theme.values.color.background.accent.hover},[`${StyledFakeInput}`]:{borderColor:theme.values.color.border.primary.hover}},...!isInteractable&&{cursor:"not-allowed"}}}));export const CheckboxRaw=React.forwardRef(({indeterminate,size="m",disabled,checked,label,labelHint,labelSize="m",...rest},ref)=>{let internalRef=useRef(null),inputRef=ref??internalRef;return useLayoutEffect(()=>{"object"==typeof inputRef&&inputRef.current&&(inputRef.current.indeterminate=!!indeterminate)},[indeterminate,inputRef]),React.createElement(StyledCheckboxContainer,{isInteractable:!disabled},React.createElement(Inline,{space:"xs",vAlignItems:"top",noWrap:!0},React.createElement(StyledInputContainer,{hSize:size,vSize:labelSize},React.createElement(StyledRealInput,{...rest,ref:inputRef,"aria-checked":indeterminate?"mixed":checked,type:"checkbox",disabled:disabled,checked:checked}),React.createElement(StyledFakeInput,{size:size},indeterminate?React.createElement(Icon,{size:"s",name:"minus"}):React.createElement(Icon,{size:"s",name:"m"===size?"check":"check-small"}))),label&&React.createElement("div",null,"string"==typeof label?React.createElement(Text,{size:labelSize},label):label,labelHint&&React.createElement(Text,{color:"tertiary",size:"s"},labelHint))))});export const Checkbox=React.forwardRef(({label,labelHint,hint,errorMessages,size="m",disabled,"data-e2e-test-id":dataE2eTestId,"aria-describedby":ariaDescribedBy,...rest},ref)=>{let{id,ariaDescribedByProp}=useFormFieldMessageId({ariaDescribedBy,errorMessages,hint});return React.createElement(FormField,{"data-e2e-test-id":dataE2eTestId,"data-ds-id":"Checkbox",disabled:disabled,errorMessages:errorMessages,hint:hint,messageId:id},React.createElement(CheckboxRaw,{...rest,ref:ref,size:size,label:label,labelHint:labelHint,disabled:disabled,...ariaDescribedByProp}))});
@@ -1 +1 @@
1
- import React from"react";import{FormField}from"../FormField/FormField";import{SingleSelect}from"./SingleSelect";import{MultiSelect}from"./MultiSelect";import{useFormFieldMessageId}from"../FormField/useFormFieldMessageId";let defaultFilterMethod=(option,value)=>option.label.toLowerCase().indexOf(value.toLowerCase())>-1;export function Combobox({options=[],name,value,placeholder,emptyStateMessage,hasError,filterMethod=defaultFilterMethod,formatSelectedOptionsLabel,onChange=()=>{},onBlur=()=>null,onFocus=()=>null,maxHeight=230,autoComplete="on",multiple=!1,privateProps,portalContainer,optionsListWidth,readOnly,errorMessages,hint,slotProps,"aria-describedby":ariaDescribedBy,"data-e2e-test-id":dataE2eTestId,...rest}){let{disabled,label}=rest,{tag}=slotProps??{},{id,ariaDescribedByProp}=useFormFieldMessageId({ariaDescribedBy,errorMessages,hint});return React.createElement(FormField,{"data-ds-id":"Combobox",disabled:disabled,errorMessages:errorMessages,hint:hint,messageId:id,"data-e2e-test-id":dataE2eTestId,...rest},multiple?React.createElement(MultiSelect,{name:name,options:options,value:value,placeholder:placeholder,emptyStateMessage:emptyStateMessage,hasError:hasError,disabled:disabled,filterMethod:filterMethod,onChange:onChange,onFocus:onFocus,onBlur:onBlur,maxHeight:maxHeight,autoComplete:autoComplete,label:label,formatSelectedOptionsLabel:formatSelectedOptionsLabel,portalContainer:portalContainer,optionsListWidth:optionsListWidth,slotProps:{tag},...ariaDescribedByProp,...rest}):React.createElement(SingleSelect,{name:name,options:options,value:value,placeholder:placeholder,emptyStateMessage:emptyStateMessage,hasError:hasError,disabled:disabled,filterMethod:filterMethod,onChange:onChange,onFocus:onFocus,onBlur:onBlur,maxHeight:maxHeight,autoComplete:autoComplete,label:label,privateProps:privateProps,portalContainer:portalContainer,optionsListWidth:optionsListWidth,readOnly:readOnly,...ariaDescribedByProp,...rest}))}
1
+ import React from"react";import{FormField}from"../FormField/FormField";import{SingleSelect}from"./SingleSelect";import{MultiSelect}from"./MultiSelect";import{useFormFieldMessageId}from"../FormField/useFormFieldMessageId";let defaultFilterMethod=(option,value)=>option.label.toLowerCase().indexOf(value.toLowerCase())>-1;export function Combobox({options=[],name,value,placeholder,emptyStateMessage,hasError,filterMethod=defaultFilterMethod,formatSelectedOptionsLabel,onChange=()=>{},onBlur=()=>null,onFocus=()=>null,maxHeight=230,autoComplete="on",multiple,privateProps,portalContainer,optionsListWidth,readOnly,errorMessages,hint,slotProps,"aria-describedby":ariaDescribedBy,"data-e2e-test-id":dataE2eTestId,...rest}){let{disabled,label}=rest,{id,ariaDescribedByProp}=useFormFieldMessageId({ariaDescribedBy,errorMessages,hint});return React.createElement(FormField,{"data-ds-id":"Combobox",disabled:disabled,errorMessages:errorMessages,hint:hint,messageId:id,"data-e2e-test-id":dataE2eTestId,...rest},multiple?React.createElement(MultiSelect,{name:name,options:options,value:value,placeholder:placeholder,emptyStateMessage:emptyStateMessage,hasError:hasError,disabled:disabled,filterMethod:filterMethod,onChange:onChange,onFocus:onFocus,onBlur:onBlur,maxHeight:maxHeight,autoComplete:autoComplete,label:label,formatSelectedOptionsLabel:formatSelectedOptionsLabel,portalContainer:portalContainer,optionsListWidth:optionsListWidth,slotProps:{tag:slotProps.tag},...ariaDescribedByProp,...rest}):React.createElement(SingleSelect,{name:name,options:options,value:value,placeholder:placeholder,emptyStateMessage:emptyStateMessage,hasError:hasError,disabled:disabled,filterMethod:filterMethod,onChange:onChange,onFocus:onFocus,onBlur:onBlur,maxHeight:maxHeight,autoComplete:autoComplete,label:label,privateProps:privateProps,portalContainer:portalContainer,optionsListWidth:optionsListWidth,readOnly:readOnly,...ariaDescribedByProp,...rest}))}
@@ -13,7 +13,7 @@ export type UniqueMultiSelectProps = {
13
13
  onChange?: (value: string[], actionData: ActionData, event: React.ChangeEvent<HTMLSelectElement>) => void;
14
14
  formatSelectedOptionsLabel?: (count?: number) => string;
15
15
  };
16
- type MultiSelectProps = CommonSelectProps & Pick<FormFieldProps, "label"> & UniqueMultiSelectProps & AriaAttributes & {
16
+ type MultiSelectProps = Omit<CommonSelectProps, "value" | "onChange" | "formatSelectedOptionsLabel" | "options" | "filterMethod" | "maxHeight"> & Required<Pick<CommonSelectProps, "options" | "filterMethod" | "maxHeight">> & Pick<FormFieldProps, "label"> & UniqueMultiSelectProps & AriaAttributes & {
17
17
  slotProps: {
18
18
  tag: NonNullable<ComboboxSlotProps["tag"]>;
19
19
  };
@@ -1 +1 @@
1
- import React,{useRef,useMemo,useEffect,useCallback,useReducer}from"react";import styled from"@emotion/styled";import{useKeyboard}from"../../../shared/useKeyboard";import{InputRaw}from"../Input/Input";import{Tag}from"../../Tag/Tag";import{StyledContainer,StyledFakeInputWrap}from"./StyledSelectComponents";import{MultiSelectReducer}from"./MultiSelectReducer";import{getOptionId,getOptionsListId,OptionsList}from"./OptionsList";let StyledInputWrap=styled("div",{target:"e1c8shqu0",label:"StyledInputWrap"})(({theme,hasValue})=>({zIndex:1,display:"flex",alignItems:"center",position:"relative","& input":{...hasValue&&{paddingLeft:theme.variables.size.spacing.xxs}}})),StyledTagWrap=styled("div",{target:"e1c8shqu1",label:"StyledTagWrap"})(({theme})=>({marginLeft:theme.variables.size.spacing.xs,order:-1})),getSelectedOptions=(options,value)=>{let mapFromValue=new Set(value);return options.filter(opt=>mapFromValue.has(opt.value))};export function MultiSelect({options,name,value,placeholder,emptyStateMessage,hasError,filterMethod,onChange,onBlur,onFocus,maxHeight,formatSelectedOptionsLabel=count=>`${count} selected`,autoComplete,disabled,label,portalContainer,optionsListWidth,slotProps,"aria-describedby":ariaDescribedBy,privateProps,...ariaAttributes}){let selectRef=useRef(null),initialSelectedOptions=useMemo(()=>getSelectedOptions(options,value),[options,value]),{clearButtonAriaLabel}=slotProps.tag,[{selectedOptions,actionName,changedOptions,isOpen,preselectedIndex,innerValue},dispatch]=useReducer(MultiSelectReducer,{selectedOptions:initialSelectedOptions,isOpen:!1,preselectedIndex:-1,innerValue:""}),innerInputRef=useRef(null),inputWrapperRef=useRef(null),handleOnChange=useCallback(event=>{onChange(selectedOptions.map(opt=>opt.value),{name,action:actionName,data:changedOptions},event)},[selectedOptions,actionName,changedOptions,name,onChange]),forceChangeFakeSelect=useCallback(option=>{dispatch({type:"onChange",option})},[dispatch]);useEffect(()=>{dispatch({type:"updateSelectedOptions",selectedOptions:initialSelectedOptions})},[initialSelectedOptions]);let closeDropdown=useCallback(()=>{dispatch({type:"close"}),dispatch({type:"setInnerValue",value:""}),dispatch({type:"setPreselectedIndex",index:-1}),onBlur()},[onBlur,dispatch]);useEffect(()=>{selectRef.current&&selectRef.current.dispatchEvent(new Event("change",{bubbles:!0}))},[changedOptions,selectRef.current]);let filteredOptions=useMemo(()=>innerValue?options.filter(option=>filterMethod(option,innerValue)):options,[options,filterMethod,innerValue]);useEffect(()=>{dispatch({type:"setPreselectedIndex",index:-1})},[filteredOptions]),useKeyboard({"ArrowUp ArrowDown":()=>{dispatch({type:"open"})}},innerInputRef,!isOpen&&!disabled);let optionsListId=getOptionsListId(name),preselectedOption=filteredOptions[preselectedIndex]??null,ariaActiveDescendant=-1!==preselectedIndex&&preselectedOption?getOptionId(name,preselectedOption.value):"";return React.createElement(StyledContainer,{onBlur:()=>{closeDropdown()}},React.createElement(StyledInputWrap,{hasValue:value.length>0,ref:inputWrapperRef},React.createElement(InputRaw,{name:`${name}-innerInput`,value:innerValue,hasError:hasError,privateProps:{isTransparent:!0,hideOutline:!0},icon:isOpen?"chevron-up":"chevron-down",disabled:disabled,placeholder:0===value.length?placeholder:void 0,onFocus:onFocus,onClick:()=>{dispatch({type:"open"})},onChange:e=>{e.currentTarget.value&&dispatch({type:"open"}),dispatch({type:"setInnerValue",value:e.currentTarget.value})},ref:innerInputRef,autoComplete:autoComplete,...ariaAttributes,"aria-label":label,role:"combobox","aria-activedescendant":isOpen?ariaActiveDescendant:"","aria-controls":isOpen?optionsListId:"","aria-expanded":isOpen,"aria-describedby":ariaDescribedBy}),initialSelectedOptions.length>0&&React.createElement(StyledTagWrap,{role:"status"},React.createElement(Tag,{label:formatSelectedOptionsLabel(initialSelectedOptions.length),isRemovable:!0,onClear:()=>{dispatch({type:"clear"})},clearBtnAriaLabel:clearButtonAriaLabel}))),React.createElement(StyledFakeInputWrap,null,React.createElement(InputRaw,{"aria-hidden":!0,name:`${name}-fakeInput`,value:void 0,type:"text",onChange:()=>null,icon:isOpen?"chevron-up":"chevron-down",tabIndex:-1,autoComplete:"off",hasError:hasError})),React.createElement(OptionsList,{isMultiSelect:!0,name:name,isOpen:isOpen,options:filteredOptions,triggerRef:innerInputRef,triggerWrapperRef:inputWrapperRef,onCloseDropdown:closeDropdown,portalContainer:portalContainer,selectedIndex:preselectedIndex,onSelectedIndexChange:index=>{dispatch({type:"setPreselectedIndex",index})},forceChangeFakeSelect:forceChangeFakeSelect,value:value,emptyStateMessage:emptyStateMessage,disabled:disabled,maxHeight:maxHeight,optionsListWidth:optionsListWidth}),React.createElement("select",{ref:selectRef,name:name,onChange:handleOnChange,"data-e2e-test-id":"multiSelect",tabIndex:-1,"aria-hidden":!0,hidden:!0,value:value,multiple:!0},selectedOptions.map(o=>React.createElement("option",{key:o.value,value:o.value},o.label))))}
1
+ import React,{useRef,useMemo,useEffect,useCallback,useReducer}from"react";import styled from"@emotion/styled";import{useKeyboard}from"../../../shared/useKeyboard";import{InputRaw}from"../Input/Input";import{Tag}from"../../Tag/Tag";import{StyledContainer,StyledFakeInputWrap}from"./StyledSelectComponents";import{MultiSelectReducer}from"./MultiSelectReducer";import{getOptionId,getOptionsListId,OptionsList}from"./OptionsList";let StyledInputWrap=styled("div",{target:"e1p1zl000",label:"StyledInputWrap"})(({theme,hasValue})=>({zIndex:1,display:"flex",alignItems:"center",position:"relative","& input":{...hasValue&&{paddingLeft:theme.variables.size.spacing.xxs}}})),StyledTagWrap=styled("div",{target:"e1p1zl001",label:"StyledTagWrap"})(({theme})=>({marginLeft:theme.variables.size.spacing.xs,order:-1})),getSelectedOptions=(options,value)=>{let mapFromValue=new Set(value);return options.filter(opt=>mapFromValue.has(opt.value))};export function MultiSelect({options,name,value,placeholder,emptyStateMessage,hasError,filterMethod,onChange,onBlur,onFocus,maxHeight,formatSelectedOptionsLabel=count=>`${count} selected`,autoComplete,disabled,label,portalContainer,optionsListWidth,slotProps,"aria-describedby":ariaDescribedBy,privateProps,...ariaAttributes}){let selectRef=useRef(null),initialSelectedOptions=useMemo(()=>getSelectedOptions(options,value),[options,value]),{clearButtonAriaLabel}=slotProps.tag,[{selectedOptions,actionName,changedOptions,isOpen,preselectedIndex,innerValue},dispatch]=useReducer(MultiSelectReducer,{selectedOptions:initialSelectedOptions,isOpen:!1,preselectedIndex:-1,innerValue:""}),innerInputRef=useRef(null),inputWrapperRef=useRef(null),handleOnChange=useCallback(event=>{actionName&&changedOptions&&onChange?.(selectedOptions.map(opt=>opt.value),{name,action:actionName,data:changedOptions},event)},[selectedOptions,actionName,changedOptions,name,onChange]),forceChangeFakeSelect=useCallback(option=>{dispatch({type:"onChange",option})},[dispatch]);useEffect(()=>{dispatch({type:"updateSelectedOptions",selectedOptions:initialSelectedOptions})},[initialSelectedOptions]);let closeDropdown=useCallback(()=>{dispatch({type:"close"}),dispatch({type:"setInnerValue",value:""}),dispatch({type:"setPreselectedIndex",index:-1}),onBlur?.()},[onBlur,dispatch]);useEffect(()=>{selectRef.current&&selectRef.current.dispatchEvent(new Event("change",{bubbles:!0}))},[changedOptions,selectRef.current]);let filteredOptions=useMemo(()=>innerValue?options.filter(option=>filterMethod(option,innerValue)):options,[options,filterMethod,innerValue]);useEffect(()=>{dispatch({type:"setPreselectedIndex",index:-1})},[filteredOptions]),useKeyboard({"ArrowUp ArrowDown":()=>{dispatch({type:"open"})}},innerInputRef,!isOpen&&!disabled);let optionsListId=getOptionsListId(name),preselectedOption=filteredOptions[preselectedIndex]??null,ariaActiveDescendant=-1!==preselectedIndex&&preselectedOption?getOptionId(name,preselectedOption.value):"";return React.createElement(StyledContainer,{onBlur:()=>{closeDropdown()}},React.createElement(StyledInputWrap,{hasValue:value.length>0,ref:inputWrapperRef},React.createElement(InputRaw,{name:`${name}-innerInput`,value:innerValue,hasError:hasError,privateProps:{isTransparent:!0,hideOutline:!0},icon:isOpen?"chevron-up":"chevron-down",disabled:disabled,placeholder:0===value.length?placeholder:void 0,onFocus:onFocus,onClick:()=>{dispatch({type:"open"})},onChange:e=>{e.currentTarget.value&&dispatch({type:"open"}),dispatch({type:"setInnerValue",value:e.currentTarget.value})},ref:innerInputRef,autoComplete:autoComplete,...ariaAttributes,"aria-label":label,role:"combobox","aria-activedescendant":isOpen?ariaActiveDescendant:"","aria-controls":isOpen?optionsListId:"","aria-expanded":isOpen,"aria-describedby":ariaDescribedBy}),initialSelectedOptions.length>0&&React.createElement(StyledTagWrap,{role:"status"},React.createElement(Tag,{label:formatSelectedOptionsLabel(initialSelectedOptions.length),isRemovable:!0,onClear:()=>{dispatch({type:"clear"})},clearBtnAriaLabel:clearButtonAriaLabel}))),React.createElement(StyledFakeInputWrap,null,React.createElement(InputRaw,{"aria-hidden":!0,name:`${name}-fakeInput`,value:void 0,type:"text",onChange:()=>null,icon:isOpen?"chevron-up":"chevron-down",tabIndex:-1,autoComplete:"off",hasError:hasError})),React.createElement(OptionsList,{isMultiSelect:!0,name:name,isOpen:isOpen,options:filteredOptions,triggerRef:innerInputRef,triggerWrapperRef:inputWrapperRef,onCloseDropdown:closeDropdown,portalContainer:portalContainer,selectedIndex:preselectedIndex,onSelectedIndexChange:index=>{dispatch({type:"setPreselectedIndex",index})},forceChangeFakeSelect:forceChangeFakeSelect,value:value,emptyStateMessage:emptyStateMessage,disabled:disabled,maxHeight:maxHeight,optionsListWidth:optionsListWidth}),React.createElement("select",{ref:selectRef,name:name,onChange:handleOnChange,"data-e2e-test-id":"multiSelect",tabIndex:-1,"aria-hidden":!0,hidden:!0,value:value,multiple:!0},selectedOptions.map(o=>React.createElement("option",{key:o.value,value:o.value},o.label))))}
@@ -1,7 +1,7 @@
1
1
  import type { SelectOption } from "./Combobox";
2
2
  type ChangeAction = "select-option" | "deselect-option" | "clear";
3
3
  type State = {
4
- selectedOptions?: SelectOption[];
4
+ selectedOptions: SelectOption[];
5
5
  changedOptions?: SelectOption[];
6
6
  isOpen: boolean;
7
7
  preselectedIndex: number;
@@ -11,15 +11,18 @@ export declare const OPTIONS_LIST_SELECTOR = "[role=\"listbox\"], [role=\"option
11
11
  type OptionsListProps = {
12
12
  isOpen: boolean;
13
13
  isMultiSelect?: boolean;
14
- triggerRef: RefObject<HTMLInputElement>;
14
+ triggerRef: RefObject<HTMLElement>;
15
15
  triggerWrapperRef?: RefObject<HTMLDivElement>;
16
16
  onCloseDropdown: (noSelect?: boolean) => void;
17
17
  selectedIndex: number;
18
18
  onSelectedIndexChange: (index: number) => void;
19
19
  forceChangeFakeSelect: (selectedOption: SelectOption) => void;
20
20
  isVirtualized?: boolean;
21
- } & Partial<CommonSelectProps>;
21
+ name: string;
22
+ value: string | string[];
23
+ maxHeight: number;
24
+ } & Omit<Partial<CommonSelectProps>, "name" | "value" | "maxHeight">;
22
25
  export declare function getOptionId(selectName: string, optionValue: string): string;
23
26
  export declare function getOptionsListId(selectName: string): string;
24
- export declare function OptionsList({ isOpen, isMultiSelect, value, disabled, options, portalContainer, triggerRef, triggerWrapperRef, maxHeight, emptyStateMessage, selectedIndex, optionsListWidth, isVirtualized, name, onCloseDropdown, onSelectedIndexChange, forceChangeFakeSelect, }: OptionsListProps): React.ReactElement;
27
+ export declare function OptionsList({ isOpen, isMultiSelect, value, disabled, options, portalContainer, triggerRef, triggerWrapperRef, maxHeight, emptyStateMessage, selectedIndex, optionsListWidth, isVirtualized, name, onCloseDropdown, onSelectedIndexChange, forceChangeFakeSelect, }: OptionsListProps): React.ReactElement | null;
25
28
  export {};
@@ -1 +1 @@
1
- import React,{useRef,useEffect,useLayoutEffect,useMemo}from"react";import{useTheme}from"@emotion/react";import styled from"@emotion/styled";import{useKeyboard}from"../../../shared/useKeyboard";import{useWindow}from"../../../shared/useWindow";import{usePopupMenu}from"../../../shared/popupMenu/usePopupMenu";import{VirtualScrollList}from"../../VirtualScrollList/VirtualScrollList";import{Text}from"../../Typography/Text/Text";import{Box}from"../../Box/Box";import{Inline}from"../../Inline/Inline";import{Icon}from"../../Icon/Icon";import{StyledDropdown,StyledOption}from"./StyledSelectComponents";import{dropdownContainerStyle}from"./constants";import{Stack}from"../../Stack/Stack";import{CheckboxRaw}from"../Checkbox/Checkbox";import{Portal}from"../../Portal/Portal";import{ScreenReaderText}from"../../Utilities/ScreenReaderText/ScreenReaderText";export const OPTIONS_LIST_SELECTOR='[role="listbox"], [role="option"]';export function getOptionId(selectName,optionValue){return`${selectName}Option${optionValue}`}export function getOptionsListId(selectName){return`${selectName}OptionsList`}let scrollToItem=({list,itemIndex,behavior})=>{list[itemIndex]?.scrollIntoView?.({behavior,block:"nearest"})},CustomOption=styled(StyledOption,{target:"eubbn5p0",label:"CustomOption"})(({theme})=>({paddingTop:0,paddingBottom:0,"& > div":{paddingTop:theme.variables.size.spacing.xs,paddingBottom:theme.variables.size.spacing.xs},"& > div *":{marginTop:0}})),StyledListContainer=styled("div",{target:"eubbn5p1",label:"StyledListContainer"})(({theme,maxHeight})=>({maxHeight,boxSizing:"border-box",overflow:"auto",padding:`${theme.variables.size.spacing.xxs} 0`}));export function OptionsList({isOpen,isMultiSelect=!1,value,disabled,options,portalContainer,triggerRef,triggerWrapperRef,maxHeight,emptyStateMessage="No options available",selectedIndex,optionsListWidth,isVirtualized=!0,name,onCloseDropdown,onSelectedIndexChange,forceChangeFakeSelect}){let optionsListRef=useRef(null),listContainerRef=useRef(null),listItemsRef=useRef(null),refForPositioning=triggerWrapperRef||triggerRef,activeItemIndex=useMemo(()=>options.findIndex(option=>isMultiSelect?value.includes(option.value):option.value===value),[options,isMultiSelect,value]),{menuStyle:optionsListStyle,calculateStyle}=usePopupMenu({triggerRef:refForPositioning,menuRef:optionsListRef,isOpen}),win=useWindow(),{variables}=useTheme(),effectiveMaxHeight=useMemo(()=>{if(!win||!optionsListStyle.top)return maxHeight;let menuViewportMargin=parseInt(variables.size.spacing.xs,10),menuTopInViewport=optionsListStyle.top-(win.scrollY??0),spaceBelow=win.innerHeight-menuTopInViewport-menuViewportMargin;return!Number.isFinite(spaceBelow)||spaceBelow<=0?maxHeight:maxHeight?Math.min(maxHeight,spaceBelow):spaceBelow},[maxHeight,optionsListStyle,win,variables]);useLayoutEffect(()=>{if(isOpen&&listContainerRef.current&&!isVirtualized&&optionsListStyle.top){let listElm=listContainerRef.current;listElm.clientHeight<listElm.scrollHeight&&(listItemsRef.current=listElm.querySelectorAll("[data-list-item]"),scrollToItem({list:listItemsRef.current,itemIndex:activeItemIndex,behavior:"instant"}))}else listItemsRef.current=null},[isOpen,isVirtualized,listContainerRef,options,maxHeight,optionsListStyle,activeItemIndex]),useEffect(()=>{listItemsRef.current&&scrollToItem({list:listItemsRef.current,itemIndex:selectedIndex,behavior:"smooth"})},[listItemsRef,selectedIndex]),useKeyboard({Escape:()=>onCloseDropdown(!0),Enter:()=>{let preselectedOption=options[selectedIndex];if(!preselectedOption?.disabled){if(preselectedOption){forceChangeFakeSelect(preselectedOption),isMultiSelect||onCloseDropdown(!0);return}isMultiSelect||onCloseDropdown()}},ArrowUp:()=>{let newIndex=-1===selectedIndex?activeItemIndex:selectedIndex;for(;newIndex>0&&(newIndex-=1,options[newIndex]?.disabled););options[newIndex]?.disabled||onSelectedIndexChange(newIndex)},ArrowDown:()=>{let newIndex=-1===selectedIndex?activeItemIndex:selectedIndex;for(;newIndex<options.length-1&&(newIndex+=1,options[newIndex]?.disabled););options[newIndex]?.disabled||onSelectedIndexChange(newIndex)}},triggerRef,isOpen&&!disabled);let renderItem=index=>{let option=options[index],id=getOptionId(name,option.value);if(isMultiSelect){let isActive=value.includes(option.value);return React.createElement(CustomOption,{role:"option","aria-selected":isActive,"aria-disabled":option.disabled,id:id,key:option.value,active:isActive,disabled:option.disabled,preSelected:selectedIndex===index,"data-list-item":!0,onMouseDown:()=>{option.disabled||forceChangeFakeSelect(option)},onClick:evt=>evt.stopPropagation()},React.createElement(CheckboxRaw,{name:"",disabled:option.disabled,checked:isActive,size:"s",label:option.label,onChange:()=>null,labelHint:option?.description}))}let isActive=value===option.value,optionText=React.createElement(Stack,{space:"zero"},React.createElement(Text,{color:"primary",size:"m"},option.label),option.description&&React.createElement(Text,{color:"tertiary",size:"s"},option.description));return React.createElement(StyledOption,{role:"option","aria-selected":isActive,"aria-disabled":option.disabled,id:id,key:option.value,active:isActive,disabled:option.disabled,preSelected:selectedIndex===index,"data-list-item":!0,onMouseDown:()=>{option.disabled||(forceChangeFakeSelect(option),onCloseDropdown(!0))}},isActive?React.createElement(Inline,{noWrap:!0,alignItems:"spaceBetween"},optionText,React.createElement(Box,{space:"zero",tSpace:"xxxs"},React.createElement(Icon,{name:"check",size:"s",color:"accent"}))):optionText)},listStyle={...optionsListStyle,width:optionsListWidth||refForPositioning.current?.getBoundingClientRect().width},listElm=React.createElement(StyledDropdown,{style:listStyle,ref:optionsListRef,onMouseDown:e=>e.preventDefault(),"data-e2e-test-id":"optionsList"},isVirtualized?React.createElement(VirtualScrollList,{id:getOptionsListId(name),maxHeight:effectiveMaxHeight,itemHeight:36,itemAmount:options.length,emptyState:()=>null,containerStyle:dropdownContainerStyle,itemInView:selectedIndex,itemTemplate:renderItem,onContentHeightChange:calculateStyle,role:"listbox"}):React.createElement(StyledListContainer,{maxHeight:effectiveMaxHeight,role:"listbox",id:getOptionsListId(name),ref:listContainerRef},options.map((_option,index)=>renderItem(index))));if(!isOpen)return null;let listPortal=options.length?React.createElement(Portal,{portalContainer:portalContainer},listElm):null;return React.createElement(React.Fragment,null,React.createElement(ScreenReaderText,{role:"status","aria-live":"polite"},options.length?"":emptyStateMessage),listPortal)}
1
+ import React,{useRef,useEffect,useLayoutEffect,useMemo}from"react";import{useTheme}from"@emotion/react";import styled from"@emotion/styled";import{useKeyboard}from"../../../shared/useKeyboard";import{useWindow}from"../../../shared/useWindow";import{usePopupMenu}from"../../../shared/popupMenu/usePopupMenu";import{VirtualScrollList}from"../../VirtualScrollList/VirtualScrollList";import{Text}from"../../Typography/Text/Text";import{Box}from"../../Box/Box";import{Inline}from"../../Inline/Inline";import{Icon}from"../../Icon/Icon";import{StyledDropdown,StyledOption}from"./StyledSelectComponents";import{dropdownContainerStyle}from"./constants";import{Stack}from"../../Stack/Stack";import{CheckboxRaw}from"../Checkbox/Checkbox";import{Portal}from"../../Portal/Portal";import{ScreenReaderText}from"../../Utilities/ScreenReaderText/ScreenReaderText";export const OPTIONS_LIST_SELECTOR='[role="listbox"], [role="option"]';export function getOptionId(selectName,optionValue){return`${selectName}Option${optionValue}`}export function getOptionsListId(selectName){return`${selectName}OptionsList`}let scrollToItem=({list,itemIndex,behavior})=>{list[itemIndex]?.scrollIntoView?.({behavior,block:"nearest"})},CustomOption=styled(StyledOption,{target:"e1bzrm20",label:"CustomOption"})(({theme})=>({paddingTop:0,paddingBottom:0,"& > div":{paddingTop:theme.variables.size.spacing.xs,paddingBottom:theme.variables.size.spacing.xs},"& > div *":{marginTop:0}})),StyledListContainer=styled("div",{target:"e1bzrm21",label:"StyledListContainer"})(({theme,maxHeight})=>({maxHeight,boxSizing:"border-box",overflow:"auto",padding:`${theme.variables.size.spacing.xxs} 0`}));export function OptionsList({isOpen,isMultiSelect=!1,value,disabled,options=[],portalContainer,triggerRef,triggerWrapperRef,maxHeight,emptyStateMessage="No options available",selectedIndex,optionsListWidth,isVirtualized=!0,name,onCloseDropdown,onSelectedIndexChange,forceChangeFakeSelect}){let optionsListRef=useRef(null),listContainerRef=useRef(null),listItemsRef=useRef(null),refForPositioning=triggerWrapperRef||triggerRef,activeItemIndex=useMemo(()=>options.findIndex(option=>isMultiSelect?value.includes(option.value):option.value===value),[options,isMultiSelect,value]),{menuStyle:optionsListStyle,calculateStyle}=usePopupMenu({triggerRef:refForPositioning,menuRef:optionsListRef,isOpen}),win=useWindow(),{variables}=useTheme(),effectiveMaxHeight=useMemo(()=>{if(!win||!optionsListStyle.top)return maxHeight;let menuViewportMargin=parseInt(variables.size.spacing.xs,10),menuTopInViewport=optionsListStyle.top-(win.scrollY??0),spaceBelow=win.innerHeight-menuTopInViewport-menuViewportMargin;return!Number.isFinite(spaceBelow)||spaceBelow<=0?maxHeight:maxHeight?Math.min(maxHeight,spaceBelow):spaceBelow},[maxHeight,optionsListStyle,win,variables]);useLayoutEffect(()=>{if(isOpen&&listContainerRef.current&&!isVirtualized&&optionsListStyle.top){let listElm=listContainerRef.current;listElm.clientHeight<listElm.scrollHeight&&(listItemsRef.current=listElm.querySelectorAll("[data-list-item]"),scrollToItem({list:listItemsRef.current,itemIndex:activeItemIndex,behavior:"instant"}))}else listItemsRef.current=null},[isOpen,isVirtualized,listContainerRef,options,maxHeight,optionsListStyle,activeItemIndex]),useEffect(()=>{listItemsRef.current&&scrollToItem({list:listItemsRef.current,itemIndex:selectedIndex,behavior:"smooth"})},[listItemsRef,selectedIndex]),useKeyboard({Escape:()=>onCloseDropdown(!0),Enter:()=>{let preselectedOption=options[selectedIndex];if(!preselectedOption?.disabled){if(preselectedOption){forceChangeFakeSelect(preselectedOption),isMultiSelect||onCloseDropdown(!0);return}isMultiSelect||onCloseDropdown()}},ArrowUp:()=>{let newIndex=-1===selectedIndex?activeItemIndex:selectedIndex;for(;newIndex>0&&(newIndex-=1,options[newIndex]?.disabled););options[newIndex]?.disabled||onSelectedIndexChange(newIndex)},ArrowDown:()=>{let newIndex=-1===selectedIndex?activeItemIndex:selectedIndex;for(;newIndex<options.length-1&&(newIndex+=1,options[newIndex]?.disabled););options[newIndex]?.disabled||onSelectedIndexChange(newIndex)}},triggerRef,isOpen&&!disabled);let renderItem=index=>{let option=options[index],id=getOptionId(name,option.value);if(isMultiSelect){let isActive=value.includes(option.value);return React.createElement(CustomOption,{role:"option","aria-selected":isActive,"aria-disabled":option.disabled,id:id,key:option.value,active:isActive,disabled:option.disabled??!1,preSelected:selectedIndex===index,"data-list-item":!0,onMouseDown:()=>{option.disabled||forceChangeFakeSelect(option)},onClick:evt=>evt.stopPropagation()},React.createElement(CheckboxRaw,{name:"",disabled:option.disabled,checked:isActive,size:"s",label:option.label,onChange:()=>null,labelHint:option?.description}))}let isActive=value===option.value,optionText=React.createElement(Stack,{space:"zero"},React.createElement(Text,{color:"primary",size:"m"},option.label),option.description&&React.createElement(Text,{color:"tertiary",size:"s"},option.description));return React.createElement(StyledOption,{role:"option","aria-selected":isActive,"aria-disabled":option.disabled,id:id,key:option.value,active:isActive,disabled:option.disabled??!1,preSelected:selectedIndex===index,"data-list-item":!0,onMouseDown:()=>{option.disabled||(forceChangeFakeSelect(option),onCloseDropdown(!0))}},isActive?React.createElement(Inline,{noWrap:!0,alignItems:"spaceBetween"},optionText,React.createElement(Box,{space:"zero",tSpace:"xxxs"},React.createElement(Icon,{name:"check",size:"s",color:"accent"}))):optionText)},listStyle={...optionsListStyle,width:optionsListWidth||refForPositioning.current?.getBoundingClientRect().width},listElm=React.createElement(StyledDropdown,{style:listStyle,ref:optionsListRef,onMouseDown:e=>e.preventDefault(),"data-e2e-test-id":"optionsList"},isVirtualized?React.createElement(VirtualScrollList,{id:getOptionsListId(name),maxHeight:effectiveMaxHeight,itemHeight:36,itemAmount:options.length,emptyState:()=>null,containerStyle:dropdownContainerStyle,itemInView:selectedIndex,itemTemplate:renderItem,onContentHeightChange:calculateStyle,role:"listbox"}):React.createElement(StyledListContainer,{maxHeight:effectiveMaxHeight,role:"listbox",id:getOptionsListId(name),ref:listContainerRef},options.map((_option,index)=>renderItem(index))));if(!isOpen)return null;let listPortal=options.length?React.createElement(Portal,{portalContainer:portalContainer},listElm):null;return React.createElement(React.Fragment,null,React.createElement(ScreenReaderText,{role:"status","aria-live":"polite"},options.length?"":emptyStateMessage),listPortal)}
@@ -1,7 +1,7 @@
1
1
  import React from "react";
2
2
  import type { CommonSelectProps } from "./Combobox";
3
3
  import type { FormFieldProps } from "../FormField/FormField";
4
- type SingleSelectProps = CommonSelectProps & Pick<FormFieldProps, "label"> & {
4
+ type SingleSelectProps = Omit<CommonSelectProps, "value" | "onChange" | "options" | "filterMethod" | "maxHeight"> & Required<Pick<CommonSelectProps, "options" | "filterMethod" | "maxHeight">> & Pick<FormFieldProps, "label"> & {
5
5
  value: string;
6
6
  onChange: (e: React.ChangeEvent<HTMLSelectElement>) => void;
7
7
  };