@geotab/zenith 3.8.0-beta.1 → 3.9.0-beta.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 (204) hide show
  1. package/README.md +11 -12
  2. package/dist/button/button.d.ts +2 -1
  3. package/dist/button/button.js +3 -3
  4. package/dist/calendar/calendar.js +201 -4
  5. package/dist/card/card.d.ts +1 -1
  6. package/dist/card/card.js +1 -1
  7. package/dist/card/components/cardButton/cardButton.d.ts +2 -1
  8. package/dist/card/components/cardButton/cardButton.js +5 -3
  9. package/dist/card/helpers/getIconTypeFromStatus.d.ts +1 -1
  10. package/dist/chart/barChart/getBarLegendItems.js +3 -5
  11. package/dist/chart/lineChart/getLineLegendItems.js +7 -7
  12. package/dist/chart/pieChart/centerTextPlugin.js +13 -5
  13. package/dist/chart/pieChart/getPieLegendItems.js +8 -12
  14. package/dist/chart/pieChart.js +13 -11
  15. package/dist/chart/plugins/legend/interfaces.d.ts +1 -1
  16. package/dist/commonHelpers/generateId.d.ts +8 -0
  17. package/dist/commonHelpers/generateId.js +8 -0
  18. package/dist/commonHelpers/hooks/ssrProvider.d.ts +14 -0
  19. package/dist/commonHelpers/hooks/ssrProvider.js +12 -0
  20. package/dist/commonHelpers/hooks/useClientReady.js +3 -1
  21. package/dist/commonHelpers/hooks/useDeviceType.js +6 -2
  22. package/dist/commonHelpers/hooks/useIsomorphicLayoutEffect.d.ts +2 -0
  23. package/dist/commonHelpers/hooks/useIsomorphicLayoutEffect.js +6 -0
  24. package/dist/commonHelpers/hooks/useMobile.js +4 -3
  25. package/dist/commonHelpers/hooks/usePortal.js +2 -5
  26. package/dist/commonHelpers/isDomEnv.js +1 -2
  27. package/dist/commonHelpers/useUniqueId.d.ts +6 -0
  28. package/dist/commonHelpers/useUniqueId.js +8 -2
  29. package/dist/commonHelpers/utils.d.ts +0 -1
  30. package/dist/commonHelpers/utils.js +1 -3
  31. package/dist/commonStyles/common.less +13 -1
  32. package/dist/commonStyles/fonts/notosarabic/LICENSE.txt +93 -0
  33. package/dist/commonStyles/fonts/notosarabic/NotoSansArabic-Bold.woff +0 -0
  34. package/dist/commonStyles/fonts/notosarabic/NotoSansArabic-Bold.woff2 +0 -0
  35. package/dist/commonStyles/fonts/notosarabic/NotoSansArabic-Medium.woff +0 -0
  36. package/dist/commonStyles/fonts/notosarabic/NotoSansArabic-Medium.woff2 +0 -0
  37. package/dist/commonStyles/fonts/notosarabic/NotoSansArabic-Regular.woff +0 -0
  38. package/dist/commonStyles/fonts/notosarabic/NotoSansArabic-Regular.woff2 +0 -0
  39. package/dist/commonStyles/fonts/notosarabic/NotoSansArabic-SemiBold.woff +0 -0
  40. package/dist/commonStyles/fonts/notosarabic/NotoSansArabic-SemiBold.woff2 +0 -0
  41. package/dist/commonStyles/fonts/notosarabic.less +43 -0
  42. package/dist/commonStyles/pillStyles/pillContent.less +2 -3
  43. package/dist/commonStyles/pillStyles/pillStyles.less +1 -2
  44. package/dist/commonStyles/pillStyles/pillTextContent.less +2 -2
  45. package/dist/commonStyles/typography/typography.less +440 -305
  46. package/dist/dataGrid/withSelectableRows/components/bulkActions/bulkActions.d.ts +5 -3
  47. package/dist/dataGrid/withSelectableRows/components/bulkActions/bulkActions.js +2 -38
  48. package/dist/dateInputInner/dateInputInnerControlBlock.js +12 -8
  49. package/dist/dateRangeRaw/dateRangeRaw.js +5 -1
  50. package/dist/dialog/dialog.js +4 -3
  51. package/dist/feedbackContainer/feedbackContainer.js +4 -4
  52. package/dist/fileUpload/fileUpload.js +21 -12
  53. package/dist/filters/components/filtersSidePanel.d.ts +1 -1
  54. package/dist/filters/components/filtersSidePanel.js +123 -116
  55. package/dist/filters/filters.js +1 -2
  56. package/dist/filtersBar/filtersBar.d.ts +2 -0
  57. package/dist/filtersBar/filtersBar.js +5 -3
  58. package/dist/filtersBar/filtersBarActions/filtersBarActions.js +3 -1
  59. package/dist/filtersBar/filtersBarSidePanel/components/filtersBarSidePanelRange/filtersBarSidePanelRange.js +3 -0
  60. package/dist/filtersBar/filtersBarSidePanel/filtersBarSidePanel.d.ts +1 -1
  61. package/dist/filtersBar/filtersBarSidePanel/filtersBarSidePanel.js +86 -80
  62. package/dist/formFieldError/formFieldError.d.ts +2 -1
  63. package/dist/formFieldError/formFieldError.js +2 -2
  64. package/dist/header/components/collapsedItemsControl/utils/handleCustomMenuWrapper.js +1 -1
  65. package/dist/index.css +3210 -2238
  66. package/dist/index.d.ts +3 -5
  67. package/dist/index.js +24 -29
  68. package/dist/menu/components/menuItem.js +4 -4
  69. package/dist/menu/controlledMenu.js +4 -4
  70. package/dist/nav/nav.js +10 -5
  71. package/dist/nav/navAddMenu/navAddMenu.js +1 -2
  72. package/dist/nav/navEditList/navEditListUtils.d.ts +1 -1
  73. package/dist/nav/navEditList/navEditListUtils.js +2 -1
  74. package/dist/nav/navItem/navActionItem.js +3 -3
  75. package/dist/nav/navItem/navItem.js +1 -2
  76. package/dist/pageHeader/pageHeaderActions.js +4 -3
  77. package/dist/rangeRaw/rangeRaw.js +7 -1
  78. package/dist/selectList/selectList.js +11 -7
  79. package/dist/selectRaw/selectRaw.js +1 -1
  80. package/dist/shield/shield.js +5 -3
  81. package/dist/sidePanel/sidePanel.js +9 -8
  82. package/dist/summaryTile/summaryTile.d.ts +1 -3
  83. package/dist/summaryTile/summaryTile.js +1 -2
  84. package/dist/table/children/useTableChildren.d.ts +1 -1
  85. package/dist/table/children/useTableChildren.js +3 -3
  86. package/dist/table/flexible/useFlexibleColumns.js +39 -1
  87. package/dist/table/nested/useNestedRows.d.ts +1 -0
  88. package/dist/table/nested/useNestedRows.js +3 -3
  89. package/dist/table/selectable/useSelectableRows.d.ts +9 -0
  90. package/dist/table/selectable/useSelectableRows.js +18 -11
  91. package/dist/table/table.js +1 -7
  92. package/dist/{card/components → title}/title.d.ts +1 -1
  93. package/dist/title/title.js +27 -0
  94. package/dist/toggleButtonRaw/toggleButtonRaw.js +3 -1
  95. package/dist/toggleButtonRaw/types.d.ts +1 -0
  96. package/dist/tooltip/tooltip.d.ts +2 -1
  97. package/dist/tooltip/tooltip.js +68 -64
  98. package/dist/utils/localization/directionContext.d.ts +3 -0
  99. package/dist/utils/localization/directionContext.js +5 -0
  100. package/dist/utils/localization/getTextDirection.d.ts +2 -0
  101. package/dist/utils/localization/getTextDirection.js +6 -0
  102. package/dist/utils/localization/languageProvider.js +15 -1
  103. package/dist/utils/localization/translations/en-json.d.ts +2 -0
  104. package/dist/utils/localization/translations/en-json.js +3 -1
  105. package/dist/utils/localization/translations/en.json +3 -0
  106. package/dist/utils/localization/useDirection.d.ts +2 -0
  107. package/dist/utils/localization/useDirection.js +7 -0
  108. package/esm/button/button.d.ts +2 -1
  109. package/esm/button/button.js +3 -3
  110. package/esm/calendar/calendar.js +201 -4
  111. package/esm/card/card.d.ts +1 -1
  112. package/esm/card/card.js +1 -1
  113. package/esm/card/components/cardButton/cardButton.d.ts +2 -1
  114. package/esm/card/components/cardButton/cardButton.js +5 -3
  115. package/esm/card/helpers/getIconTypeFromStatus.d.ts +1 -1
  116. package/esm/chart/barChart/getBarLegendItems.js +3 -5
  117. package/esm/chart/lineChart/getLineLegendItems.js +7 -7
  118. package/esm/chart/pieChart/centerTextPlugin.js +13 -5
  119. package/esm/chart/pieChart/getPieLegendItems.js +8 -12
  120. package/esm/chart/pieChart.js +14 -12
  121. package/esm/chart/plugins/legend/interfaces.d.ts +1 -1
  122. package/esm/commonHelpers/generateId.d.ts +8 -0
  123. package/esm/commonHelpers/generateId.js +8 -0
  124. package/esm/commonHelpers/hooks/ssrProvider.d.ts +14 -0
  125. package/esm/commonHelpers/hooks/ssrProvider.js +6 -0
  126. package/esm/commonHelpers/hooks/useClientReady.js +4 -2
  127. package/esm/commonHelpers/hooks/useDeviceType.js +7 -3
  128. package/esm/commonHelpers/hooks/useIsomorphicLayoutEffect.d.ts +2 -0
  129. package/esm/commonHelpers/hooks/useIsomorphicLayoutEffect.js +3 -0
  130. package/esm/commonHelpers/hooks/useMobile.js +4 -3
  131. package/esm/commonHelpers/hooks/usePortal.js +2 -5
  132. package/esm/commonHelpers/isDomEnv.js +1 -2
  133. package/esm/commonHelpers/useUniqueId.d.ts +6 -0
  134. package/esm/commonHelpers/useUniqueId.js +7 -1
  135. package/esm/commonHelpers/utils.d.ts +0 -1
  136. package/esm/commonHelpers/utils.js +0 -1
  137. package/esm/dataGrid/withSelectableRows/components/bulkActions/bulkActions.d.ts +5 -3
  138. package/esm/dataGrid/withSelectableRows/components/bulkActions/bulkActions.js +2 -38
  139. package/esm/dateInputInner/dateInputInnerControlBlock.js +13 -9
  140. package/esm/dateRangeRaw/dateRangeRaw.js +5 -1
  141. package/esm/dialog/dialog.js +4 -3
  142. package/esm/feedbackContainer/feedbackContainer.js +4 -4
  143. package/esm/fileUpload/fileUpload.js +21 -12
  144. package/esm/filters/components/filtersSidePanel.d.ts +1 -1
  145. package/esm/filters/components/filtersSidePanel.js +123 -116
  146. package/esm/filters/filters.js +2 -3
  147. package/esm/filtersBar/filtersBar.d.ts +2 -0
  148. package/esm/filtersBar/filtersBar.js +5 -3
  149. package/esm/filtersBar/filtersBarActions/filtersBarActions.js +3 -1
  150. package/esm/filtersBar/filtersBarSidePanel/components/filtersBarSidePanelRange/filtersBarSidePanelRange.js +3 -0
  151. package/esm/filtersBar/filtersBarSidePanel/filtersBarSidePanel.d.ts +1 -1
  152. package/esm/filtersBar/filtersBarSidePanel/filtersBarSidePanel.js +86 -80
  153. package/esm/formFieldError/formFieldError.d.ts +2 -1
  154. package/esm/formFieldError/formFieldError.js +2 -2
  155. package/esm/header/components/collapsedItemsControl/utils/handleCustomMenuWrapper.js +1 -1
  156. package/esm/index.d.ts +3 -5
  157. package/esm/index.js +3 -5
  158. package/esm/menu/components/menuItem.js +1 -1
  159. package/esm/menu/controlledMenu.js +1 -1
  160. package/esm/nav/nav.js +10 -5
  161. package/esm/nav/navAddMenu/navAddMenu.js +2 -3
  162. package/esm/nav/navEditList/navEditListUtils.d.ts +1 -1
  163. package/esm/nav/navEditList/navEditListUtils.js +2 -1
  164. package/esm/nav/navItem/navActionItem.js +3 -2
  165. package/esm/nav/navItem/navItem.js +2 -3
  166. package/esm/pageHeader/pageHeaderActions.js +4 -3
  167. package/esm/rangeRaw/rangeRaw.js +7 -1
  168. package/esm/selectList/selectList.js +11 -7
  169. package/esm/selectRaw/selectRaw.js +1 -1
  170. package/esm/shield/shield.js +5 -3
  171. package/esm/sidePanel/sidePanel.js +9 -8
  172. package/esm/summaryTile/summaryTile.d.ts +1 -3
  173. package/esm/summaryTile/summaryTile.js +1 -2
  174. package/esm/table/children/useTableChildren.d.ts +1 -1
  175. package/esm/table/children/useTableChildren.js +3 -3
  176. package/esm/table/flexible/useFlexibleColumns.js +39 -1
  177. package/esm/table/nested/useNestedRows.d.ts +1 -0
  178. package/esm/table/nested/useNestedRows.js +1 -1
  179. package/esm/table/selectable/useSelectableRows.d.ts +9 -0
  180. package/esm/table/selectable/useSelectableRows.js +15 -8
  181. package/esm/table/table.js +1 -7
  182. package/esm/{card/components → title}/title.d.ts +1 -1
  183. package/esm/title/title.js +23 -0
  184. package/esm/toggleButtonRaw/toggleButtonRaw.js +3 -1
  185. package/esm/toggleButtonRaw/types.d.ts +1 -0
  186. package/esm/tooltip/tooltip.d.ts +2 -1
  187. package/esm/tooltip/tooltip.js +68 -64
  188. package/esm/utils/localization/directionContext.d.ts +3 -0
  189. package/esm/utils/localization/directionContext.js +2 -0
  190. package/esm/utils/localization/getTextDirection.d.ts +2 -0
  191. package/esm/utils/localization/getTextDirection.js +2 -0
  192. package/esm/utils/localization/languageProvider.js +15 -1
  193. package/esm/utils/localization/translations/en-json.d.ts +2 -0
  194. package/esm/utils/localization/translations/en-json.js +3 -1
  195. package/esm/utils/localization/translations/en.json +3 -0
  196. package/esm/utils/localization/useDirection.d.ts +2 -0
  197. package/esm/utils/localization/useDirection.js +3 -0
  198. package/package.json +33 -31
  199. package/dist/card/components/title.js +0 -22
  200. package/dist/commonHelpers/hooks/deviceProvider.d.ts +0 -7
  201. package/dist/commonHelpers/hooks/deviceProvider.js +0 -11
  202. package/esm/card/components/title.js +0 -18
  203. package/esm/commonHelpers/hooks/deviceProvider.d.ts +0 -7
  204. package/esm/commonHelpers/hooks/deviceProvider.js +0 -4
package/esm/index.d.ts CHANGED
@@ -20,7 +20,6 @@ export { type ICardButton, CardButton } from "./card/components/cardButton/cardB
20
20
  export { type ICardToggle, CardToggle } from "./card/components/cardToggle/cardToggle";
21
21
  export { type IContent, Content } from "./card/components/content";
22
22
  export { type TCardStatus, Status } from "./card/components/status";
23
- export { Title } from "./card/components/title";
24
23
  export { TitleLink } from "./card/components/titleLink";
25
24
  export { getDefaultFullWidthValue } from "./card/helpers/getDefaultFullWidthValue";
26
25
  export { getIconFromStatus } from "./card/helpers/getIconFromStatus";
@@ -48,8 +47,8 @@ export { classNames } from "./commonHelpers/classNames/classNames";
48
47
  export { hexToRGBA } from "./commonHelpers/colorUtils";
49
48
  export { type IEntityWithId } from "./commonHelpers/entity";
50
49
  export { generateId } from "./commonHelpers/generateId";
51
- export { DeviceContext, DeviceProvider } from "./commonHelpers/hooks/deviceProvider";
52
50
  export { DeviceType } from "./commonHelpers/hooks/deviceType";
51
+ export { SSRProvider } from "./commonHelpers/hooks/ssrProvider";
53
52
  export { useDebounce } from "./commonHelpers/hooks/useDebounce";
54
53
  export { useDebouncedMemo } from "./commonHelpers/hooks/useDebouncedMemo";
55
54
  export { useDeviceType } from "./commonHelpers/hooks/useDeviceType";
@@ -74,8 +73,6 @@ export { useDropdownState } from "./dropdown/useDropdownState";
74
73
  export { type IEmptyState, EmptyState } from "./emptyState/emptyState";
75
74
  export { type IFavoriteButton, FavoriteButton } from "./favoriteButton/favoriteButton";
76
75
  export { FeedbackProvider } from "./feedbackProvider/feedbackProvider";
77
- export { TemplateDownloadSection } from "./fileUpload/components/templateDownloadSection";
78
- export { UploadedFilesSection } from "./fileUpload/components/uploadedFilesSection";
79
76
  export { FileUpload } from "./fileUpload/fileUpload";
80
77
  export { type IUploadedFile, type ITemplateDownload, type IFileUploadMeta, type IFileUpload } from "./fileUpload/fileUploadType";
81
78
  export { type TFilterButton, type IFilterButton, FilterButton } from "./filterButton/filterButton";
@@ -760,6 +757,7 @@ export { type ITextInputRaw, TextInputRaw } from "./textInputRaw/textInputRaw";
760
757
  export { type ITextarea, Textarea } from "./textarea/textarea";
761
758
  export { type ITextareaRaw, TextareaRaw } from "./textareaRaw/textareaRaw";
762
759
  export { type ITimePicker, type TTimePicker, TimePicker } from "./timePicker/timePicker";
760
+ export { Title } from "./title/title";
763
761
  export { type IShowToast, useToast } from "./toast/hooks/useToast";
764
762
  export { type IToast, Toast } from "./toast/toast";
765
763
  export { type IToggleButton, type TToggleButton, ToggleButton } from "./toggleButton/toggleButton";
@@ -773,7 +771,7 @@ export { HeaderButtonsProvider } from "./utils/headerButtons/headerButtonsProvid
773
771
  export { getNewFocusableItem, getFirstFocusableItem } from "./utils/keyboardHelpers";
774
772
  export { LanguageProvider } from "./utils/localization/languageProvider";
775
773
  export { dictionaries, injectString } from "./utils/localization/translationsDictionary";
776
- export { useLanguage } from "./utils/localization/useLanguage";
774
+ export { useDirection } from "./utils/localization/useDirection";
777
775
  export { ThemeDark } from "./utils/theme/themeDark";
778
776
  export { ThemeDrive } from "./utils/theme/themeDrive";
779
777
  export { ThemeProvider } from "./utils/theme/themeProvider";
package/esm/index.js CHANGED
@@ -21,7 +21,6 @@ export { CardButton } from "./card/components/cardButton/cardButton";
21
21
  export { CardToggle } from "./card/components/cardToggle/cardToggle";
22
22
  export { Content } from "./card/components/content";
23
23
  export { Status } from "./card/components/status";
24
- export { Title } from "./card/components/title";
25
24
  export { TitleLink } from "./card/components/titleLink";
26
25
  export { getDefaultFullWidthValue } from "./card/helpers/getDefaultFullWidthValue";
27
26
  export { getIconFromStatus } from "./card/helpers/getIconFromStatus";
@@ -48,8 +47,8 @@ export { getCheckboxState } from "./checkbox/checkboxUtils";
48
47
  export { classNames } from "./commonHelpers/classNames/classNames";
49
48
  export { hexToRGBA } from "./commonHelpers/colorUtils";
50
49
  export { generateId } from "./commonHelpers/generateId";
51
- export { DeviceContext, DeviceProvider } from "./commonHelpers/hooks/deviceProvider";
52
50
  export { DeviceType } from "./commonHelpers/hooks/deviceType";
51
+ export { SSRProvider } from "./commonHelpers/hooks/ssrProvider";
53
52
  export { useDebounce } from "./commonHelpers/hooks/useDebounce";
54
53
  export { useDebouncedMemo } from "./commonHelpers/hooks/useDebouncedMemo";
55
54
  export { useDeviceType } from "./commonHelpers/hooks/useDeviceType";
@@ -73,8 +72,6 @@ export { useDropdownState } from "./dropdown/useDropdownState";
73
72
  export { EmptyState } from "./emptyState/emptyState";
74
73
  export { FavoriteButton } from "./favoriteButton/favoriteButton";
75
74
  export { FeedbackProvider } from "./feedbackProvider/feedbackProvider";
76
- export { TemplateDownloadSection } from "./fileUpload/components/templateDownloadSection";
77
- export { UploadedFilesSection } from "./fileUpload/components/uploadedFilesSection";
78
75
  export { FileUpload } from "./fileUpload/fileUpload";
79
76
  export { FilterButton } from "./filterButton/filterButton";
80
77
  export { FiltersChip } from "./filters/components/filtersChip";
@@ -745,6 +742,7 @@ export { TextInputRaw } from "./textInputRaw/textInputRaw";
745
742
  export { Textarea } from "./textarea/textarea";
746
743
  export { TextareaRaw } from "./textareaRaw/textareaRaw";
747
744
  export { TimePicker } from "./timePicker/timePicker";
745
+ export { Title } from "./title/title";
748
746
  export { useToast } from "./toast/hooks/useToast";
749
747
  export { Toast } from "./toast/toast";
750
748
  export { ToggleButton } from "./toggleButton/toggleButton";
@@ -757,7 +755,7 @@ export { HeaderButtonsProvider } from "./utils/headerButtons/headerButtonsProvid
757
755
  export { getNewFocusableItem, getFirstFocusableItem } from "./utils/keyboardHelpers";
758
756
  export { LanguageProvider } from "./utils/localization/languageProvider";
759
757
  export { dictionaries, injectString } from "./utils/localization/translationsDictionary";
760
- export { useLanguage } from "./utils/localization/useLanguage";
758
+ export { useDirection } from "./utils/localization/useDirection";
761
759
  export { ThemeDark } from "./utils/theme/themeDark";
762
760
  export { ThemeDrive } from "./utils/theme/themeDrive";
763
761
  export { ThemeProvider } from "./utils/theme/themeProvider";
@@ -6,7 +6,7 @@ import { ControlledMenu } from "../controlledMenu";
6
6
  import { ControlledPopup } from "../../controlledPopup/controlledPopup";
7
7
  import { PathContext } from "../contexts/pathContext";
8
8
  import { classNames } from "../../commonHelpers/classNames/classNames";
9
- import { generateId } from "../../commonHelpers/utils";
9
+ import { generateId } from "../../commonHelpers/generateId";
10
10
  import { MenuAlignmentContext } from "../../header/headerContext";
11
11
  import { isSeparator } from "./menuSeparator";
12
12
  export const isMenuItem = (element) => {
@@ -16,7 +16,7 @@ import { ControlledPopup } from "../controlledPopup/controlledPopup";
16
16
  import { MobileSheet } from "../mobileSheet/mobileSheet";
17
17
  import { DeviceType } from "../commonHelpers/hooks/deviceType";
18
18
  import { useDeviceType } from "../commonHelpers/hooks/useDeviceType";
19
- import { generateId } from "../commonHelpers/utils";
19
+ import { generateId } from "../commonHelpers/generateId";
20
20
  import { PathProvider } from "./contexts/pathProvider";
21
21
  import { isSeparator, MenuSeparator } from "./components/menuSeparator";
22
22
  import { FOCUSABLE_SELECTOR } from "../utils/focusableSelector";
package/esm/nav/nav.js CHANGED
@@ -5,7 +5,7 @@ import { Children, cloneElement, Fragment, useCallback, useEffect, useLayoutEffe
5
5
  import { NavDivider } from "./navDivider/navDivider";
6
6
  import { detectOverlayScrollbar, filterPrimaryNavItems, collectNavItems } from "./utils/navUtils";
7
7
  import { useResize } from "../commonHelpers/hooks/useResize";
8
- import { createPortal } from "react-dom";
8
+ import { usePortal } from "../commonHelpers/hooks/usePortal";
9
9
  import { NavMobileBar } from "./navMobileBar/navMobileBar";
10
10
  import { useMobile } from "../commonHelpers/hooks/useMobile";
11
11
  import { FOCUSABLE_SELECTOR } from "../utils/focusableSelector";
@@ -132,6 +132,7 @@ export const Nav = ({ children, className, collapsed = false, onCollapseToggle,
132
132
  useEffect(() => {
133
133
  onMenuVisibilityToggle === null || onMenuVisibilityToggle === void 0 ? void 0 : onMenuVisibilityToggle(!isMobile || isMobileMenuOpen);
134
134
  }, [isMobile, isMobileMenuOpen, onMenuVisibilityToggle]);
135
+ const navMobileBarPortal = usePortal(_jsx(NavMobileBar, { onMenuToggle: onMobileMenuToggle, isMenuOpen: isMobileMenuOpen, children: isEditState ? editListItems : primaryItems }), mobileBarContainer !== null && mobileBarContainer !== void 0 ? mobileBarContainer : undefined);
135
136
  return (_jsxs(NavContext, { value: {
136
137
  collapsed,
137
138
  onCollapseToggle,
@@ -142,13 +143,17 @@ export const Nav = ({ children, className, collapsed = false, onCollapseToggle,
142
143
  searchTerm,
143
144
  onSearch: setSearchTerm,
144
145
  onNavigate: () => onIsMobileMenuOpenToggle && onIsMobileMenuOpenToggle(false)
145
- }, children: [!isMobile || isMobileMenuOpen ? (_jsxs("div", { ref: menuRef, className: classNames(["zen-nav", isMobile ? "zen-nav--mobile" : "", collapsed ? "zen-nav--collapsed" : "", className || ""]), children: [header
146
+ }, children: [!isMobile || isMobileMenuOpen ? (_jsxs("div", { ref: menuRef, className: classNames([
147
+ "zen-nav",
148
+ isMobile ? "zen-nav--mobile" : "",
149
+ isMobile && isEditState ? "zen-nav--mobile-edit" : "",
150
+ collapsed ? "zen-nav--collapsed" : "",
151
+ className || ""
152
+ ]), children: [header
146
153
  ? cloneElement(header, Object.assign(Object.assign({}, header.props), { className: classNames(["zen-nav__header", header.props.className || ""]) }))
147
154
  : null, _jsx(NavContent, { children: isEditState
148
155
  ? editListItems
149
156
  : sectionsToRender.map((section, index) => (_jsxs(Fragment, { children: [cloneElement(section, {
150
157
  className: classNames(["zen-nav__section", section.props.className || ""])
151
- }), isMobile || index < sectionsToRender.length - 1 ? _jsx(NavDivider, {}) : null] }, index))) }), footerToRender] })) : null, mobileBarContainer &&
152
- isMobile &&
153
- createPortal(_jsx(NavMobileBar, { onMenuToggle: onMobileMenuToggle, isMenuOpen: isMobileMenuOpen, children: isEditState ? editListItems : primaryItems }), mobileBarContainer)] }));
158
+ }), isMobile || index < sectionsToRender.length - 1 ? _jsx(NavDivider, {}) : null] }, index))) }), footerToRender] })) : null, mobileBarContainer && isMobile && navMobileBarPortal] }));
154
159
  };
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Children, cloneElement, useRef, useState } from "react";
2
+ import { Children, cloneElement, useId, useRef, useState } from "react";
3
3
  import { classNames } from "../../commonHelpers/classNames/classNames";
4
4
  import { NavItemContext } from "../navItem/navItem";
5
5
  import { useMobile } from "../../commonHelpers/hooks/useMobile";
@@ -9,13 +9,12 @@ import { IconClose } from "../../icons/iconClose";
9
9
  import { IconPlus } from "../../icons/iconPlus";
10
10
  import { Tooltip } from "../../tooltip/tooltip";
11
11
  import { useNavContext } from "../context/nav.context";
12
- import { generateId } from "../../commonHelpers/utils";
13
12
  export const NavAddMenu = ({ title, alignment, className, children }) => {
14
13
  const [isOpen, setIsOpen] = useState(false);
15
14
  const isMobile = useMobile();
16
15
  const { collapsed } = useNavContext();
17
16
  const triggerRef = useRef(null);
18
- const triggerId = generateId();
17
+ const triggerId = useId();
19
18
  const validChildren = Children.toArray(children)
20
19
  .filter((child) => {
21
20
  const element = child;
@@ -1,3 +1,3 @@
1
1
  import { PointerEvent, ReactElement } from "react";
2
2
  import { INavActionItem } from "../navItem/navActionItem";
3
- export declare const attachDndHandler: (item: ReactElement<INavActionItem>, onPointerDown: (e: PointerEvent<HTMLElement>) => void) => ReactElement<INavActionItem, string | import("react").JSXElementConstructor<any>>;
3
+ export declare const attachDndHandler: (item: ReactElement<INavActionItem>, onPointerDown: (e: PointerEvent<HTMLDivElement>) => void) => ReactElement<INavActionItem>;
@@ -4,7 +4,8 @@ import { NavActionItem } from "../navItem/navActionItem";
4
4
  import { IconGrab } from "../../icons/iconGrab";
5
5
  export const attachDndHandler = (item, onPointerDown) => {
6
6
  if (item.type === NavActionItem) {
7
- return cloneElement(item, Object.assign(Object.assign({}, item.props), { startNode: (_jsx("div", { className: "zen-nav-item__dnd", onPointerDown: onPointerDown, children: _jsx(IconGrab, { size: "large" }) })) }));
7
+ const navActionItem = item;
8
+ return cloneElement(navActionItem, Object.assign(Object.assign({}, navActionItem.props), { onLeftContentPointerDown: onPointerDown, startNode: (_jsx("div", { className: "zen-nav-item__dnd", children: _jsx(IconGrab, { size: "large" }) })) }));
8
9
  }
9
10
  return item;
10
11
  };
@@ -1,9 +1,10 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { classNames } from "../../commonHelpers/classNames/classNames";
3
- export const NavActionItem = ({ title, id, icon, className, startNode, endButtonIcon, endButtonTitle, onEndButtonClick }) => {
3
+ const NavActionItemComponent = ({ title, id, icon, className, startNode, endButtonIcon, endButtonTitle, onEndButtonClick, onLeftContentPointerDown }) => {
4
4
  const PrimaryIconComponent = typeof icon === "function" ? icon : null;
5
5
  const EndButtonIconComponent = typeof endButtonIcon === "function" ? endButtonIcon : null;
6
6
  const itemClasses = classNames(["zen-nav-item", className || ""]);
7
- return (_jsxs("div", { className: itemClasses, id: id, children: [_jsx("div", { className: "zen-nav-item__main", children: _jsxs("div", { className: "zen-nav-item__content-left", children: [startNode ? _jsx("span", { className: "zen-nav-item__icon", children: startNode }) : null, PrimaryIconComponent ? _jsx(PrimaryIconComponent, { size: "huge" }) : null, _jsx("span", { className: "zen-nav-item__title", children: _jsx("span", { className: "zen-nav-item__title-text", children: title }) })] }) }), EndButtonIconComponent && endButtonTitle && onEndButtonClick ? (_jsx("button", { type: "button", className: "zen-nav-item__action", "aria-label": endButtonTitle, title: endButtonTitle, onClick: onEndButtonClick, children: _jsx(EndButtonIconComponent, { size: "huge" }) })) : null] }));
7
+ return (_jsxs("div", { className: itemClasses, id: id, children: [_jsx("div", { className: "zen-nav-item__main", children: _jsxs("div", { className: "zen-nav-item__content-left", onPointerDown: onLeftContentPointerDown, children: [startNode ? _jsx("span", { className: "zen-nav-item__icon", children: startNode }) : null, PrimaryIconComponent ? _jsx(PrimaryIconComponent, { size: "huge" }) : null, _jsx("span", { className: "zen-nav-item__title", children: _jsx("span", { className: "zen-nav-item__title-text", children: title }) })] }) }), EndButtonIconComponent && endButtonTitle && onEndButtonClick ? (_jsx("button", { type: "button", className: "zen-nav-item__action", "aria-label": endButtonTitle, title: endButtonTitle, onClick: onEndButtonClick, children: _jsx(EndButtonIconComponent, { size: "huge" }) })) : null] }));
8
8
  };
9
+ export const NavActionItem = NavActionItemComponent;
9
10
  NavActionItem.displayName = "NavActionItem";
@@ -11,7 +11,7 @@ var __rest = (this && this.__rest) || function (s, e) {
11
11
  };
12
12
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
13
13
  import { classNames } from "../../commonHelpers/classNames/classNames";
14
- import { useRef, useState, useEffect, Children, cloneElement, createContext, useContext } from "react";
14
+ import { useRef, useState, useEffect, Children, cloneElement, createContext, useContext, useId } from "react";
15
15
  import { IconBeta } from "../../icons/iconBeta";
16
16
  import { IconChevronRight } from "../../icons/iconChevronRight";
17
17
  import { IconOpen2 } from "../../icons/iconOpen2";
@@ -19,7 +19,6 @@ import { Tooltip } from "../../tooltip/tooltip";
19
19
  import { ControlledMenu } from "../../menu/controlledMenu";
20
20
  import { useNavContext } from "../context/nav.context";
21
21
  import { useMobile } from "../../commonHelpers/hooks/useMobile";
22
- import { generateId } from "../../commonHelpers/utils";
23
22
  const ICON_SIZE = "huge";
24
23
  const SUBMENU_ICON_SIZE = "large";
25
24
  export const NavItemContext = createContext({ parentLevel: 0 });
@@ -101,7 +100,7 @@ const ButtonNavItem = (_a) => {
101
100
  };
102
101
  const isMobile = useMobile();
103
102
  const isActive = active || (hasNestedItems && menuOpen);
104
- const triggerId = generateId();
103
+ const triggerId = useId();
105
104
  const buttonElement = (_jsx("button", { id: triggerId, ref: triggerRef, "aria-label": title, title: title, tabIndex: tabIndex, role: isMenuItem ? "menuitem" : undefined, className: "zen-nav-item__main", onClick: handleClick, onKeyDown: handleKeyPress, children: _jsx(NavItemContent, Object.assign({ title: title, collapsed: collapsed, hasSubmenu: hasNestedItems, level: currentLevel }, rest, { children: _jsx("span", { className: "zen-nav-item__title-text", children: title }) })) }));
106
105
  const trigger = collapsed ? (_jsx(Tooltip, { trigger: buttonElement, alignment: tooltipAlignment, children: title })) : (buttonElement);
107
106
  if (hasNestedItems) {
@@ -8,7 +8,7 @@ import { PageToolbarCollapsedItemsControl } from "../header/components/collapsed
8
8
  import { PageHeaderButtonDisplayName } from "./pageHeaderButton";
9
9
  import { PageHeaderMenuDisplayName } from "./pageHeaderMenu";
10
10
  import { getItemsFromFragments } from "./pageHeaderHelpers";
11
- import { createPortal } from "react-dom";
11
+ import { usePortal } from "../commonHelpers/hooks/usePortal";
12
12
  import { zen } from "../utils/zen";
13
13
  export const PageHeaderActions = ({ className = "", children }) => {
14
14
  var _a, _b;
@@ -32,10 +32,11 @@ export const PageHeaderActions = ({ className = "", children }) => {
32
32
  isMobile ? "zen-page-header-component__actions--mobile-portal" : "",
33
33
  className
34
34
  ]), children: [nonFittingElements.length > 0 ? moreButton : null, fittingElements] })) : null;
35
+ const modalRoot = ((_a = zen.document) === null || _a === void 0 ? void 0 : _a.fullscreenElement) || ((_b = zen.document) === null || _b === void 0 ? void 0 : _b.body);
36
+ const portal = usePortal(actionsContent, modalRoot);
35
37
  // For mobile, render actions in a portal at the bottom center of viewport
36
38
  if (isMobile && actionsContent) {
37
- const modalRoot = ((_a = zen.document) === null || _a === void 0 ? void 0 : _a.fullscreenElement) || ((_b = zen.document) === null || _b === void 0 ? void 0 : _b.body);
38
- return createPortal(actionsContent, modalRoot);
39
+ return portal;
39
40
  }
40
41
  return actionsContent;
41
42
  };
@@ -252,6 +252,9 @@ export const RangeRaw = props => {
252
252
  } else {
253
253
  defaultValueInner = defaultValue;
254
254
  }
255
+ const generatedId = useId();
256
+ const intId = id || generatedId;
257
+ const rangeErrorId = `${intId}-error`;
255
258
  const [isOpen, setIsOpen] = useState(false);
256
259
  const [currentValue, setCurrentValue] = useState(value);
257
260
  const [errorType, setErrorType] = useState(undefined);
@@ -400,14 +403,17 @@ export const RangeRaw = props => {
400
403
  const memoizedContent = useMemo(() => _jsxs("div", {
401
404
  className: "zen-range__fields-wrapper",
402
405
  children: [_jsxs("div", {
406
+ id: intId,
403
407
  ref: setFieldsContainerRef,
408
+ "aria-describedby": errorType !== undefined && directionState === "row" ? rangeErrorId : undefined,
404
409
  className: classNames(["zen-range__fields-container", directionState === "row" ? "zen-range__fields-container--row" : "zen-range__fields-container--column"]),
405
410
  children: [memoizedMinRangeField, memoizedMaxRangeField]
406
411
  }), errorType !== undefined && directionState === "row" ? _jsx(FormFieldError, {
412
+ id: rangeErrorId,
407
413
  className: "zen-range__error",
408
414
  error: [getErrorString("min", currentValue.min, translate, errorType, min, max) || "", getErrorString("max", currentValue.max, translate, errorType, min, max) || ""]
409
415
  }) : null]
410
- }), [setFieldsContainerRef, directionState, memoizedMinRangeField, memoizedMaxRangeField, errorType, currentValue.min, currentValue.max, translate, min, max]);
416
+ }), [setFieldsContainerRef, directionState, memoizedMinRangeField, memoizedMaxRangeField, errorType, currentValue.min, currentValue.max, translate, min, max, intId, rangeErrorId]);
411
417
  const memoizedDesktopView = useMemo(() => _jsx(ControlledPopup, {
412
418
  isOpen: isOpen,
413
419
  className: classNames(["zen-range-popup zen-shadow-dropdown-default", className ? className : ""]),
@@ -45,7 +45,7 @@ export const SelectList = (_a) => {
45
45
  dispatchState({ type: ListAction.Reset, payload: { items, value: new Map(parsedValue), multiselect } });
46
46
  }, [innerValue, multiselect, items]);
47
47
  useEffect(() => {
48
- if (!multiselect) {
48
+ if (!multiselect && selectItemOnFocus) {
49
49
  dispatchState({ type: ListAction.FocusFirst, payload: { items } });
50
50
  }
51
51
  dispatchState({ type: ListAction.Focus, payload: { items, multiselect } });
@@ -56,14 +56,18 @@ export const SelectList = (_a) => {
56
56
  const onChangeItem = useCallback((updatedId, updatedState) => {
57
57
  dispatchState({ type: ListAction.ChangeItemState, payload: { updatedId, updatedState, multiselect } });
58
58
  }, [multiselect]);
59
+ const hasScrolledToInitial = useRef(false);
59
60
  useEffect(() => {
60
61
  var _a;
61
- if (state.activeIndex >= 0 &&
62
- ((_a = zen.document) === null || _a === void 0 ? void 0 : _a.activeElement) &&
63
- listRef.current &&
64
- isChildOf(zen.document.activeElement, listRef.current)) {
65
- const itemEl = listRef.current.querySelector(`.zen-select-list__item:nth-child(${state.activeIndex + 1})`);
66
- itemEl === null || itemEl === void 0 ? void 0 : itemEl.scrollIntoView({ block: "nearest" });
62
+ if (state.activeIndex >= 0 && listRef.current) {
63
+ const isFocusInList = ((_a = zen.document) === null || _a === void 0 ? void 0 : _a.activeElement) && isChildOf(zen.document.activeElement, listRef.current);
64
+ if (isFocusInList || !hasScrolledToInitial.current) {
65
+ const itemEl = listRef.current.querySelector(`.zen-select-list__item:nth-child(${state.activeIndex + 1})`);
66
+ itemEl === null || itemEl === void 0 ? void 0 : itemEl.scrollIntoView({ block: "nearest" });
67
+ if (itemEl) {
68
+ hasScrolledToInitial.current = true;
69
+ }
70
+ }
67
71
  }
68
72
  }, [state.activeIndex]);
69
73
  useEffect(() => {
@@ -147,6 +147,6 @@ export const SelectRaw = (props) => {
147
147
  "zen-ellipsis",
148
148
  "zen-caption__content",
149
149
  !selectValue ? "zen-select__text--placeholder" : ""
150
- ]), children: text }), _jsx(IconChevronDownSmall, { className: "zen-select__arrow zen-caption__post-content", size: "large" })] }), _jsx(Absolute, { recalculateOnScroll: true, className: classNames(["zen-select__popup", classNamePopup || ""]), triggerRef: innerTriggerRef, id: popupId, isOpen: isOpen, onOpenChange: onPopupVisibilityChange, children: _jsx(PassiveSelectListComp, { id: listId, title: title, disabled: disabled, multiselect: false, items: items.map(item => (Object.assign(Object.assign({}, item), { state: selectValue === item.id ? CheckboxState.On : CheckboxState.Off }))), value: new Map(items.map(item => [item.id, selectValue === item.id ? CheckboxState.On : CheckboxState.Off])), activeIndex: state.activeIndex, size: pageSize, onChangeItem: onChangeItem, style: { width, minWidth, maxWidth } }) })] }));
150
+ ]), children: text }), _jsx(IconChevronDownSmall, { className: "zen-select__arrow zen-caption__post-content", size: "large" })] }), _jsx(Absolute, { recalculateOnScroll: true, className: classNames(["zen-select__popup", classNamePopup || ""]), triggerRef: innerTriggerRef, id: popupId, isOpen: isOpen, onOpenChange: onPopupVisibilityChange, focusOnOpen: false, children: _jsx(PassiveSelectListComp, { id: listId, title: title, disabled: disabled, multiselect: false, items: items.map(item => (Object.assign(Object.assign({}, item), { state: selectValue === item.id ? CheckboxState.On : CheckboxState.Off }))), value: new Map(items.map(item => [item.id, selectValue === item.id ? CheckboxState.On : CheckboxState.Off])), activeIndex: state.activeIndex, size: pageSize, onChangeItem: onChangeItem, style: { width, minWidth, maxWidth } }) })] }));
151
151
  };
152
152
  SelectRaw.displayName = "SelectRaw";
@@ -2,16 +2,18 @@ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { useEffect } from "react";
3
3
  import { classNames } from "../commonHelpers/classNames/classNames";
4
4
  import { useFadeComponent } from "../utils/useFadeComponent";
5
- import { createPortal } from "react-dom";
5
+ import { usePortal } from "../commonHelpers/hooks/usePortal";
6
6
  import { zen } from "../utils/zen";
7
7
  export const Shield = ({ className, dataShieldId, isVisible }) => {
8
- var _a, _b;
8
+ var _a, _b, _c, _d;
9
9
  const { renderComponent, showContent, setIsOpen, handleTransitionEnd } = useFadeComponent(isVisible || false);
10
+ const container = (_d = (_b = (_a = zen.document) === null || _a === void 0 ? void 0 : _a.fullscreenElement) !== null && _b !== void 0 ? _b : (_c = zen.document) === null || _c === void 0 ? void 0 : _c.body) !== null && _d !== void 0 ? _d : undefined;
11
+ const portal = usePortal(_jsx("div", { onTransitionEnd: handleTransitionEnd, className: classNames(["zen-shield", "zen-shield-faded", showContent ? "zen-shield-faded--visible" : "", className !== null && className !== void 0 ? className : ""]), "data-shield-id": dataShieldId || "" }), container);
10
12
  useEffect(() => {
11
13
  setIsOpen(isVisible || false);
12
14
  }, [isVisible, setIsOpen]);
13
15
  if (!renderComponent && !isVisible) {
14
16
  return isVisible === undefined ? (_jsx("div", { className: classNames(["zen-shield", className !== null && className !== void 0 ? className : ""]), "data-shield-id": dataShieldId || "" })) : null;
15
17
  }
16
- return createPortal(_jsx("div", { onTransitionEnd: handleTransitionEnd, className: classNames(["zen-shield", "zen-shield-faded", showContent ? "zen-shield-faded--visible" : "", className !== null && className !== void 0 ? className : ""]), "data-shield-id": dataShieldId || "" }), ((_a = zen.document) === null || _a === void 0 ? void 0 : _a.fullscreenElement) || ((_b = zen.document) === null || _b === void 0 ? void 0 : _b.body));
18
+ return portal;
17
19
  };
@@ -18,7 +18,7 @@ import { isModalTarget } from "../modal/utils/isModalTarget";
18
18
  import { isBannerTarget } from "../banner/utils/isBannerTarget";
19
19
  import { useClientReady } from "../commonHelpers/hooks/useClientReady";
20
20
  import { zen } from "../utils/zen";
21
- import { createPortal } from "react-dom";
21
+ import { usePortal } from "../commonHelpers/hooks/usePortal";
22
22
  /* eslint-enable @typescript-eslint/naming-convention */
23
23
  const OVERLAY_TARGET_CHECKS = [isAlertTarget, isToastTarget, isModalTarget, isBannerTarget];
24
24
  export const isChildPopup = (target, stopElement) => {
@@ -171,14 +171,8 @@ export const SidePanel = ({ label, className, id, isOpen, onHidePanel, children,
171
171
  }
172
172
  return attributes;
173
173
  }, [role, label]);
174
- if (!renderComponent && !isOpen) {
175
- return null;
176
- }
177
- if (!isClientReady) {
178
- return undefined;
179
- }
180
174
  const portalContainer = ((_a = zen.document) === null || _a === void 0 ? void 0 : _a.fullscreenElement) || ((_b = zen.document) === null || _b === void 0 ? void 0 : _b.body);
181
- return createPortal(_jsx("div", Object.assign({ ref: sidePanelRef, id: popupId }, memoizedStyles, roleAttributes, { onTransitionEnd: handleTransitionEnd, className: classNames([
175
+ const portal = usePortal(_jsx("div", Object.assign({ ref: sidePanelRef, id: popupId }, memoizedStyles, roleAttributes, { onTransitionEnd: handleTransitionEnd, className: classNames([
182
176
  "zen-side-panel",
183
177
  driveClassName || "",
184
178
  dark ? "zen-dark" : "",
@@ -186,5 +180,12 @@ export const SidePanel = ({ label, className, id, isOpen, onHidePanel, children,
186
180
  positioningClass,
187
181
  className !== null && className !== void 0 ? className : ""
188
182
  ]), children: memoizedChildForRender })), portalContainer);
183
+ if (!renderComponent && !isOpen) {
184
+ return null;
185
+ }
186
+ if (!isClientReady) {
187
+ return undefined;
188
+ }
189
+ return portal;
189
190
  };
190
191
  SidePanel.Cell = SidePanelCell;
@@ -54,8 +54,6 @@ export interface ISummaryTile extends IZenComponentProps, IZenGridItem {
54
54
  tooltipSize?: TooltipSize;
55
55
  /** When `true`, shows a skeleton placeholder while data is being fetched — two skeleton elements replace the title and content areas. */
56
56
  isLoading?: boolean;
57
- /** When `true` and the tile is interactive, sets `aria-current="page"` on the tile. */
58
- isSelected?: boolean;
59
57
  /** Analytics identifier applied as `data-analytics-id`. Defaults to a kebab-cased version of `title`. */
60
58
  dataAnalyticsId?: string;
61
59
  }
@@ -75,6 +73,6 @@ export declare const SummaryTileDisplayName = "SummaryTile";
75
73
  * Use inside `SummaryTileBar` to group multiple tiles in a scrollable row.
76
74
  */
77
75
  export declare const SummaryTile: {
78
- ({ className, children, size, title, tileType, id, onClick, tooltipText, tooltipAlignment, isLoading, isSelected, dataAnalyticsId }: ISummaryTile): import("react/jsx-runtime").JSX.Element;
76
+ ({ className, children, size, title, tileType, id, onClick, tooltipText, tooltipAlignment, isLoading, dataAnalyticsId }: ISummaryTile): import("react/jsx-runtime").JSX.Element;
79
77
  displayName: string;
80
78
  };
@@ -83,7 +83,6 @@ export const SummaryTile = ({
83
83
  tooltipText,
84
84
  tooltipAlignment = "top",
85
85
  isLoading = false,
86
- isSelected = false,
87
86
  dataAnalyticsId
88
87
  }) => {
89
88
  const {
@@ -139,7 +138,7 @@ export const SummaryTile = ({
139
138
  }),
140
139
  children: tooltipText
141
140
  }) : null;
142
- const ariaCurrentProps = isSelected && isInteractive ? {
141
+ const ariaCurrentProps = tileType === SummaryTileType.Active && isInteractive ? {
143
142
  "aria-current": "page"
144
143
  } : {};
145
144
  // When both onClick and tooltipText are present, the tooltip trigger
@@ -1,5 +1,5 @@
1
1
  import { ReactElement, ReactNode, RefObject } from "react";
2
- export declare const useTableChildren: (children: ReactNode, isMobile: boolean, selected: number, allSelected: boolean, clearSelection: () => void, selectAll: () => void, turnOffSelectAll?: boolean, activeId?: string, gridRef?: RefObject<HTMLElement | null>, onCloseDetailPanel?: () => void) => {
2
+ export declare const useTableChildren: (children: ReactNode, isMobile: boolean, selected: number, allSelected: boolean, clearSelection: () => void, activeId?: string, gridRef?: RefObject<HTMLElement | null>, onCloseDetailPanel?: () => void) => {
3
3
  bulkActions: ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | undefined;
4
4
  pagination: ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | undefined;
5
5
  activePage: number | undefined;
@@ -24,7 +24,7 @@ const isChildElement = function (child, expectedType) {
24
24
  }
25
25
  return false;
26
26
  };
27
- export const useTableChildren = (children, isMobile, selected, allSelected, clearSelection, selectAll, turnOffSelectAll, activeId, gridRef, onCloseDetailPanel) => useMemo(() => {
27
+ export const useTableChildren = (children, isMobile, selected, allSelected, clearSelection, activeId, gridRef, onCloseDetailPanel) => useMemo(() => {
28
28
  let bulkActions = undefined;
29
29
  let tablePagination = undefined;
30
30
  let activePage = undefined;
@@ -39,7 +39,7 @@ export const useTableChildren = (children, isMobile, selected, allSelected, clea
39
39
  }
40
40
  if (isChildElement(child, TableBulkActions.displayName)) {
41
41
  const bulkActionButtons = child.props.children || [];
42
- bulkActions = (_jsx(BulkActions, { gridType: isMobile ? DeviceType.Mobile : DeviceType.Desktop, selected: selected, allSelected: allSelected, onClearSelection: clearSelection, onSelectAll: selectAll, turnOffSelectAll: turnOffSelectAll, children: bulkActionButtons }));
42
+ bulkActions = (_jsx(BulkActions, { gridType: isMobile ? DeviceType.Mobile : DeviceType.Desktop, selected: selected, allSelected: allSelected, onClearSelection: clearSelection, children: bulkActionButtons }));
43
43
  return;
44
44
  }
45
45
  if (isChildElement(child, TablePagination.displayName)) {
@@ -100,4 +100,4 @@ export const useTableChildren = (children, isMobile, selected, allSelected, clea
100
100
  detailPanel: detailPanel,
101
101
  other: other
102
102
  };
103
- }, [children, clearSelection, isMobile, selected, gridRef, allSelected, selectAll, turnOffSelectAll, activeId, onCloseDetailPanel]);
103
+ }, [children, clearSelection, isMobile, selected, gridRef, allSelected, activeId, onCloseDetailPanel]);
@@ -10,6 +10,8 @@ import { ColumnSettingsStorage } from "./columnSettingsStorage";
10
10
  import { ActionsColumn } from "../../dataGrid/columns/actionsColumn/actionsColumn";
11
11
  import { mergeColumnsSettings } from "./mergeColumnSettings";
12
12
  import { zen } from "../../utils/zen";
13
+ import { SelectableWrapperName } from "../selectable/useSelectableRows";
14
+ import { NestedWrapperName } from "../nested/useNestedRows";
13
15
  export const getColumnSettings = (pageName, defaultValue) => {
14
16
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
15
17
  const storage = new ColumnSettingsStorage(pageName || "", zen === null || zen === void 0 ? void 0 : zen.localStorage, defaultValue);
@@ -42,11 +44,12 @@ export const useFlexibleColumns = (columns, flexible, gridRef, columnsPopupRef,
42
44
  onChangeColumnSettings(newSettings);
43
45
  }, [onChangeColumnSettings, saveSettingsToTheStorage]);
44
46
  const flexibleColumns = useMemo(() => {
47
+ var _a, _b, _c, _d, _e;
45
48
  if (!flexible) {
46
49
  return columns;
47
50
  }
48
51
  const visibleColumnsMap = new Map(columns.map(c => [c.id, c]));
49
- return columnSettings
52
+ const result = columnSettings
50
53
  .map((s, index) => {
51
54
  var _a;
52
55
  const column = visibleColumnsMap.get(s.name);
@@ -63,6 +66,41 @@ export const useFlexibleColumns = (columns, flexible, gridRef, columnsPopupRef,
63
66
  return Object.assign(Object.assign({}, column), { meta: Object.assign(Object.assign({}, (column.meta || {})), { defaultWidth: width }), wrappers: [...wrappers, wrapper] });
64
67
  })
65
68
  .filter(c => c !== undefined);
69
+ // Ensure selectable and nested wrappers are always on the first visible column
70
+ if (result.length > 0) {
71
+ const pinnedWrapperWidth = 32;
72
+ let widthDelta = 0;
73
+ let donorCol = undefined;
74
+ for (const wrapperName of [NestedWrapperName, SelectableWrapperName]) {
75
+ if ((_a = result[0].wrappers) === null || _a === void 0 ? void 0 : _a.some(w => w.name === wrapperName)) {
76
+ continue;
77
+ }
78
+ let pinnedWrapper;
79
+ for (const col of result.slice(1)) {
80
+ if (col.wrappers) {
81
+ const found = col.wrappers.find(w => w.name === wrapperName);
82
+ if (found) {
83
+ pinnedWrapper = found;
84
+ donorCol = donorCol !== null && donorCol !== void 0 ? donorCol : col;
85
+ widthDelta += pinnedWrapperWidth;
86
+ col.wrappers = col.wrappers.filter(w => w.name !== wrapperName);
87
+ break;
88
+ }
89
+ }
90
+ }
91
+ if (pinnedWrapper) {
92
+ result[0].wrappers = [...(result[0].wrappers || []), pinnedWrapper];
93
+ }
94
+ }
95
+ if (widthDelta > 0) {
96
+ result[0] = Object.assign(Object.assign({}, result[0]), { meta: Object.assign(Object.assign({}, (result[0].meta || {})), { defaultWidth: ((_c = (_b = result[0].meta) === null || _b === void 0 ? void 0 : _b.defaultWidth) !== null && _c !== void 0 ? _c : 0) + widthDelta }) });
97
+ if (donorCol) {
98
+ const donorIndex = result.indexOf(donorCol);
99
+ result[donorIndex] = Object.assign(Object.assign({}, donorCol), { meta: Object.assign(Object.assign({}, (donorCol.meta || {})), { defaultWidth: Math.max(0, ((_e = (_d = donorCol.meta) === null || _d === void 0 ? void 0 : _d.defaultWidth) !== null && _e !== void 0 ? _e : 0) - widthDelta) }) });
100
+ }
101
+ }
102
+ }
103
+ return result;
66
104
  }, [columnSettings, columns, flexible]);
67
105
  const columnsPopup = useMemo(() => {
68
106
  if (!flexible) {
@@ -3,6 +3,7 @@ import { IListColumn } from "../../dataGrid/listColumn";
3
3
  import { IRowEntity } from "../../dataGrid/row/row";
4
4
  import "./nestedButton.less";
5
5
  import { IEntityWithId } from "../../commonHelpers/entity";
6
+ export declare const NestedWrapperName = "Nested";
6
7
  export declare const useNestedRows: <T extends IRowEntity<N>, N extends IEntityWithId>(expandedRows: string[] | undefined, onExpand: ((id: string, isExpanded: boolean) => void) | undefined, columns: IListColumn<T, N>[], isMobile: boolean) => {
7
8
  nestedColumns: {
8
9
  id: string;
@@ -58,7 +58,7 @@ injectString("zh-Hans", "Expand", "\u5C55\u5F00");
58
58
  injectString("zh-TW", "Expand", "\u5C55\u958B");
59
59
  injectString("ro-RO", "Expand", "Extinde\u021Bi");
60
60
  injectString("ar-SA", "Expand", "\u062A\u0648\u0633\u064A\u0639");
61
- const NestedWrapperName = "Nested";
61
+ export const NestedWrapperName = "Nested";
62
62
  export const useNestedRows = (expandedRows, onExpand, columns, isMobile) => {
63
63
  const {
64
64
  translate
@@ -16,6 +16,14 @@ export interface ISelectableRowsOptions<T extends IRowEntity<N>, N extends IEnti
16
16
  checkboxTitle?: (entity: T | N) => string;
17
17
  headerTitle?: (state: SelectionState) => string;
18
18
  turnOffSelectAll?: boolean;
19
+ /**
20
+ * When `true`, the header checkbox emits the current page's IDs instead of `{ all: true }`.
21
+ * When `undefined`, falls back to `turnOffSelectAll` for backward compatibility.
22
+ *
23
+ * Note: avoid setting this to `false` alongside `turnOffSelectAll: true` — the checkbox
24
+ * will emit `{ all: true }` while the dropdown hides the "Select all" option, which is inconsistent.
25
+ */
26
+ checkboxSelectsCurrentPage?: boolean;
19
27
  checkboxPlaceholder?: boolean;
20
28
  strategy?: TSelectionStrategy;
21
29
  selectAll?: boolean;
@@ -24,6 +32,7 @@ export declare const getEmptySelection: () => {
24
32
  all: boolean;
25
33
  selected: string[];
26
34
  };
35
+ export declare const SelectableWrapperName = "Selectable";
27
36
  export declare const useSelectableRows: <T extends IRowEntity<N>, N extends IEntityWithId>(columns: IListColumn<T, N>[], entities: T[], isMobile: boolean, selectMode: boolean, setSelectMode: (value: boolean) => void, selectable?: ISelectableRowsOptions<T, N>) => {
28
37
  selectableColumns: IListColumn<T, N>[];
29
38
  selectableFeedWrapper: (primaryData: ReactNode, secondaryData: ReactNode, entity: T | N, isNested: boolean) => [ReactNode, ReactNode];