@dnanpm/ui-components 0.6.0 → 0.8.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 (205) hide show
  1. package/dist/components/AccordionItem/AccordionItem.css +16 -16
  2. package/dist/components/AccordionItem/AccordionItem.module.css.cjs +11 -11
  3. package/dist/components/AccordionItem/AccordionItem.module.css.js +11 -11
  4. package/dist/components/Breadcrumb/Breadcrumb.css +9 -9
  5. package/dist/components/Breadcrumb/Breadcrumb.module.css.cjs +6 -6
  6. package/dist/components/Breadcrumb/Breadcrumb.module.css.js +6 -6
  7. package/dist/components/Button/Button.css +32 -30
  8. package/dist/components/Button/Button.module.css.cjs +11 -11
  9. package/dist/components/Button/Button.module.css.js +11 -11
  10. package/dist/components/ButtonCard/ButtonCard.cjs +105 -0
  11. package/dist/components/ButtonCard/ButtonCard.cjs.map +1 -0
  12. package/dist/components/ButtonCard/ButtonCard.css +167 -0
  13. package/dist/components/ButtonCard/ButtonCard.d.ts +3 -0
  14. package/dist/components/ButtonCard/ButtonCard.d.ts.map +1 -0
  15. package/dist/components/ButtonCard/ButtonCard.js +105 -0
  16. package/dist/components/ButtonCard/ButtonCard.js.map +1 -0
  17. package/dist/components/ButtonCard/ButtonCard.module.css.cjs +18 -0
  18. package/dist/components/ButtonCard/ButtonCard.module.css.cjs.map +1 -0
  19. package/dist/components/ButtonCard/ButtonCard.module.css.js +19 -0
  20. package/dist/components/ButtonCard/ButtonCard.module.css.js.map +1 -0
  21. package/dist/components/ButtonCard/ButtonCard.types.d.ts +103 -0
  22. package/dist/components/ButtonCard/ButtonCard.types.d.ts.map +1 -0
  23. package/dist/components/ButtonCard/index.d.ts +3 -0
  24. package/dist/components/ButtonCard/index.d.ts.map +1 -0
  25. package/dist/components/Drawer/Drawer.cjs +101 -0
  26. package/dist/components/Drawer/Drawer.cjs.map +1 -0
  27. package/dist/components/Drawer/Drawer.css +219 -0
  28. package/dist/components/Drawer/Drawer.d.ts +3 -0
  29. package/dist/components/Drawer/Drawer.d.ts.map +1 -0
  30. package/dist/components/Drawer/Drawer.js +101 -0
  31. package/dist/components/Drawer/Drawer.js.map +1 -0
  32. package/dist/components/Drawer/Drawer.module.css.cjs +37 -0
  33. package/dist/components/Drawer/Drawer.module.css.cjs.map +1 -0
  34. package/dist/components/Drawer/Drawer.module.css.js +37 -0
  35. package/dist/components/Drawer/Drawer.module.css.js.map +1 -0
  36. package/dist/components/Drawer/Drawer.types.d.ts +63 -0
  37. package/dist/components/Drawer/Drawer.types.d.ts.map +1 -0
  38. package/dist/components/Drawer/index.d.ts +3 -0
  39. package/dist/components/Drawer/index.d.ts.map +1 -0
  40. package/dist/components/Footer/Footer.cjs +272 -0
  41. package/dist/components/Footer/Footer.cjs.map +1 -0
  42. package/dist/components/Footer/Footer.css +473 -0
  43. package/dist/components/Footer/Footer.d.ts +3 -0
  44. package/dist/components/Footer/Footer.d.ts.map +1 -0
  45. package/dist/components/Footer/Footer.js +272 -0
  46. package/dist/components/Footer/Footer.js.map +1 -0
  47. package/dist/components/Footer/Footer.module.css.cjs +80 -0
  48. package/dist/components/Footer/Footer.module.css.cjs.map +1 -0
  49. package/dist/components/Footer/Footer.module.css.js +80 -0
  50. package/dist/components/Footer/Footer.module.css.js.map +1 -0
  51. package/dist/components/Footer/Footer.types.d.ts +128 -0
  52. package/dist/components/Footer/Footer.types.d.ts.map +1 -0
  53. package/dist/components/Footer/Footer.utils.cjs +41 -0
  54. package/dist/components/Footer/Footer.utils.cjs.map +1 -0
  55. package/dist/components/Footer/Footer.utils.d.ts +13 -0
  56. package/dist/components/Footer/Footer.utils.d.ts.map +1 -0
  57. package/dist/components/Footer/Footer.utils.js +41 -0
  58. package/dist/components/Footer/Footer.utils.js.map +1 -0
  59. package/dist/components/Footer/assets/app-store-badge.svg.cjs +4 -0
  60. package/dist/components/Footer/assets/app-store-badge.svg.cjs.map +1 -0
  61. package/dist/components/Footer/assets/app-store-badge.svg.js +5 -0
  62. package/dist/components/Footer/assets/app-store-badge.svg.js.map +1 -0
  63. package/dist/components/Footer/assets/google-play-badge.svg.cjs +4 -0
  64. package/dist/components/Footer/assets/google-play-badge.svg.cjs.map +1 -0
  65. package/dist/components/Footer/assets/google-play-badge.svg.js +5 -0
  66. package/dist/components/Footer/assets/google-play-badge.svg.js.map +1 -0
  67. package/dist/components/Footer/index.d.ts +3 -0
  68. package/dist/components/Footer/index.d.ts.map +1 -0
  69. package/dist/components/FunctionButton/FunctionButton.cjs +34 -0
  70. package/dist/components/FunctionButton/FunctionButton.cjs.map +1 -0
  71. package/dist/components/FunctionButton/FunctionButton.css +125 -0
  72. package/dist/components/FunctionButton/FunctionButton.d.ts +3 -0
  73. package/dist/components/FunctionButton/FunctionButton.d.ts.map +1 -0
  74. package/dist/components/FunctionButton/FunctionButton.js +34 -0
  75. package/dist/components/FunctionButton/FunctionButton.js.map +1 -0
  76. package/dist/components/FunctionButton/FunctionButton.module.css.cjs +11 -0
  77. package/dist/components/FunctionButton/FunctionButton.module.css.cjs.map +1 -0
  78. package/dist/components/FunctionButton/FunctionButton.module.css.js +12 -0
  79. package/dist/components/FunctionButton/FunctionButton.module.css.js.map +1 -0
  80. package/dist/components/FunctionButton/FunctionButton.types.d.ts +21 -0
  81. package/dist/components/FunctionButton/FunctionButton.types.d.ts.map +1 -0
  82. package/dist/components/FunctionButton/index.d.ts +3 -0
  83. package/dist/components/FunctionButton/index.d.ts.map +1 -0
  84. package/dist/components/Hero/Hero.cjs +44 -30
  85. package/dist/components/Hero/Hero.cjs.map +1 -1
  86. package/dist/components/Hero/Hero.css +89 -100
  87. package/dist/components/Hero/Hero.d.ts +1 -1
  88. package/dist/components/Hero/Hero.d.ts.map +1 -1
  89. package/dist/components/Hero/Hero.js +45 -31
  90. package/dist/components/Hero/Hero.js.map +1 -1
  91. package/dist/components/Hero/Hero.module.css.cjs +17 -20
  92. package/dist/components/Hero/Hero.module.css.cjs.map +1 -1
  93. package/dist/components/Hero/Hero.module.css.js +17 -20
  94. package/dist/components/Hero/Hero.module.css.js.map +1 -1
  95. package/dist/components/Hero/Hero.types.d.ts +8 -3
  96. package/dist/components/Hero/Hero.types.d.ts.map +1 -1
  97. package/dist/components/Hero/Hero.utils.cjs +5 -8
  98. package/dist/components/Hero/Hero.utils.cjs.map +1 -1
  99. package/dist/components/Hero/Hero.utils.d.ts +2 -2
  100. package/dist/components/Hero/Hero.utils.d.ts.map +1 -1
  101. package/dist/components/Hero/Hero.utils.js +5 -8
  102. package/dist/components/Hero/Hero.utils.js.map +1 -1
  103. package/dist/components/IconButton/IconButton.css +31 -32
  104. package/dist/components/IconButton/IconButton.module.css.cjs +9 -9
  105. package/dist/components/IconButton/IconButton.module.css.js +9 -9
  106. package/dist/components/MainNavigation/MainNavigation.cjs +1094 -0
  107. package/dist/components/MainNavigation/MainNavigation.cjs.map +1 -0
  108. package/dist/components/MainNavigation/MainNavigation.css +948 -0
  109. package/dist/components/MainNavigation/MainNavigation.d.ts +3 -0
  110. package/dist/components/MainNavigation/MainNavigation.d.ts.map +1 -0
  111. package/dist/components/MainNavigation/MainNavigation.js +1094 -0
  112. package/dist/components/MainNavigation/MainNavigation.js.map +1 -0
  113. package/dist/components/MainNavigation/MainNavigation.module.css.cjs +74 -0
  114. package/dist/components/MainNavigation/MainNavigation.module.css.cjs.map +1 -0
  115. package/dist/components/MainNavigation/MainNavigation.module.css.js +75 -0
  116. package/dist/components/MainNavigation/MainNavigation.module.css.js.map +1 -0
  117. package/dist/components/MainNavigation/MainNavigation.types.d.ts +149 -0
  118. package/dist/components/MainNavigation/MainNavigation.types.d.ts.map +1 -0
  119. package/dist/components/MainNavigation/MainNavigation.utils.cjs +168 -0
  120. package/dist/components/MainNavigation/MainNavigation.utils.cjs.map +1 -0
  121. package/dist/components/MainNavigation/MainNavigation.utils.d.ts +29 -0
  122. package/dist/components/MainNavigation/MainNavigation.utils.d.ts.map +1 -0
  123. package/dist/components/MainNavigation/MainNavigation.utils.js +168 -0
  124. package/dist/components/MainNavigation/MainNavigation.utils.js.map +1 -0
  125. package/dist/components/MainNavigation/index.d.ts +3 -0
  126. package/dist/components/MainNavigation/index.d.ts.map +1 -0
  127. package/dist/components/Modal/Modal.cjs +101 -0
  128. package/dist/components/Modal/Modal.cjs.map +1 -0
  129. package/dist/components/Modal/Modal.css +205 -0
  130. package/dist/components/Modal/Modal.d.ts +3 -0
  131. package/dist/components/Modal/Modal.d.ts.map +1 -0
  132. package/dist/components/Modal/Modal.js +101 -0
  133. package/dist/components/Modal/Modal.js.map +1 -0
  134. package/dist/components/Modal/Modal.module.css.cjs +39 -0
  135. package/dist/components/Modal/Modal.module.css.cjs.map +1 -0
  136. package/dist/components/Modal/Modal.module.css.js +39 -0
  137. package/dist/components/Modal/Modal.module.css.js.map +1 -0
  138. package/dist/components/Modal/Modal.types.d.ts +62 -0
  139. package/dist/components/Modal/Modal.types.d.ts.map +1 -0
  140. package/dist/components/Modal/index.d.ts +3 -0
  141. package/dist/components/Modal/index.d.ts.map +1 -0
  142. package/dist/components/Modal/useDialogDismissal.cjs +41 -0
  143. package/dist/components/Modal/useDialogDismissal.cjs.map +1 -0
  144. package/dist/components/Modal/useDialogDismissal.d.ts +17 -0
  145. package/dist/components/Modal/useDialogDismissal.d.ts.map +1 -0
  146. package/dist/components/Modal/useDialogDismissal.js +41 -0
  147. package/dist/components/Modal/useDialogDismissal.js.map +1 -0
  148. package/dist/components/Modal/useNativeDialog.cjs +126 -0
  149. package/dist/components/Modal/useNativeDialog.cjs.map +1 -0
  150. package/dist/components/Modal/useNativeDialog.d.ts +14 -0
  151. package/dist/components/Modal/useNativeDialog.d.ts.map +1 -0
  152. package/dist/components/Modal/useNativeDialog.js +126 -0
  153. package/dist/components/Modal/useNativeDialog.js.map +1 -0
  154. package/dist/components/Pictograph/Pictograph.css +69 -57
  155. package/dist/components/Pictograph/Pictograph.module.css.cjs +11 -11
  156. package/dist/components/Pictograph/Pictograph.module.css.js +11 -11
  157. package/dist/components/Pictograph/Pictograph.types.d.ts +2 -2
  158. package/dist/components/Pictograph/PictographItem.cjs +15 -4
  159. package/dist/components/Pictograph/PictographItem.cjs.map +1 -1
  160. package/dist/components/Pictograph/PictographItem.css +26 -23
  161. package/dist/components/Pictograph/PictographItem.d.ts.map +1 -1
  162. package/dist/components/Pictograph/PictographItem.js +15 -4
  163. package/dist/components/Pictograph/PictographItem.js.map +1 -1
  164. package/dist/components/Pictograph/PictographItem.module.css.cjs +3 -3
  165. package/dist/components/Pictograph/PictographItem.module.css.js +3 -3
  166. package/dist/components/Quote/Quote.cjs +32 -0
  167. package/dist/components/Quote/Quote.cjs.map +1 -0
  168. package/dist/components/Quote/Quote.css +95 -0
  169. package/dist/components/Quote/Quote.d.ts +3 -0
  170. package/dist/components/Quote/Quote.d.ts.map +1 -0
  171. package/dist/components/Quote/Quote.js +32 -0
  172. package/dist/components/Quote/Quote.js.map +1 -0
  173. package/dist/components/Quote/Quote.module.css.cjs +22 -0
  174. package/dist/components/Quote/Quote.module.css.cjs.map +1 -0
  175. package/dist/components/Quote/Quote.module.css.js +22 -0
  176. package/dist/components/Quote/Quote.module.css.js.map +1 -0
  177. package/dist/components/Quote/Quote.types.d.ts +12 -0
  178. package/dist/components/Quote/Quote.types.d.ts.map +1 -0
  179. package/dist/components/Quote/index.d.ts +3 -0
  180. package/dist/components/Quote/index.d.ts.map +1 -0
  181. package/dist/index.cjs +14 -0
  182. package/dist/index.cjs.map +1 -1
  183. package/dist/index.d.ts +14 -0
  184. package/dist/index.d.ts.map +1 -1
  185. package/dist/index.js +14 -0
  186. package/dist/index.js.map +1 -1
  187. package/dist/styles/utils/elevation.module.css.cjs +3 -0
  188. package/dist/styles/utils/elevation.module.css.cjs.map +1 -1
  189. package/dist/styles/utils/elevation.module.css.js +4 -1
  190. package/dist/styles/utils/elevation.module.css.js.map +1 -1
  191. package/dist/styles/utils/focus.css +21 -13
  192. package/dist/styles/utils/focus.module.css.cjs +3 -3
  193. package/dist/styles/utils/focus.module.css.js +3 -3
  194. package/dist/styles/utils/overlay.css +37 -0
  195. package/dist/styles/utils/overlay.module.css.cjs +13 -0
  196. package/dist/styles/utils/overlay.module.css.cjs.map +1 -0
  197. package/dist/styles/utils/overlay.module.css.js +13 -0
  198. package/dist/styles/utils/overlay.module.css.js.map +1 -0
  199. package/dist/styles/utils/text-decoration.css +9 -1
  200. package/dist/styles/utils/text-decoration.module.css.cjs +5 -2
  201. package/dist/styles/utils/text-decoration.module.css.cjs.map +1 -1
  202. package/dist/styles/utils/text-decoration.module.css.js +6 -3
  203. package/dist/styles/utils/text-decoration.module.css.js.map +1 -1
  204. package/dist/styles.css +24 -7
  205. package/package.json +4 -3
@@ -0,0 +1,1094 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const react = require("react");
5
+ const icons = require("@dnanpm/icons");
6
+ const focus_module = require("../../styles/utils/focus.module.css.cjs");
7
+ const overlay_module = require("../../styles/utils/overlay.module.css.cjs");
8
+ const elevation_module = require("../../styles/utils/elevation.module.css.cjs");
9
+ const textDecoration_module = require("../../styles/utils/text-decoration.module.css.cjs");
10
+ const MainNavigation_module = require("./MainNavigation.module.css.cjs");
11
+ const MainNavigation_utils = require("./MainNavigation.utils.cjs");
12
+ const cn = require("../../utils/cn/cn.cjs");
13
+ const Button = require("../Button/Button.cjs");
14
+ const IconButton = require("../IconButton/IconButton.cjs");
15
+ const defaultOrganizations = [];
16
+ const defaultItems = [];
17
+ const defaultLogoSvg = '<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_6509_143)"><g clip-path="url(#clip1_6509_143)"><rect width="40" height="40" fill="white"/><path fill-rule="evenodd" clip-rule="evenodd" d="M-0.0314789 40V0H40.0019V40H-0.0314789ZM9.33519 27.05C11.6685 27.05 13.5685 25.15 13.5685 22.7667V17.1667C13.5685 14.7833 11.6685 12.8833 9.33519 12.8833H5.10186V27.05H9.33519ZM21.6352 27.05H24.1685V17.1167C24.1685 14.7833 22.2685 12.8833 19.9352 12.8833H15.7019V27.05H18.1852V15.4167H19.9352C20.9019 15.4167 21.6352 16.15 21.6352 17.1167V27.05ZM32.4019 27.05H34.9352V17.05C34.9352 14.7167 33.0352 12.8167 30.7019 12.8167H30.6519C28.3185 12.8167 26.4185 14.7167 26.4185 17.05V27.0667H28.9519V22H32.4019V27.05ZM30.65 15.3333H30.7C31.6167 15.3333 32.4 16.1 32.4 17.0333V19.6167H28.95V17.0333C28.95 16.1167 29.6833 15.3333 30.65 15.3333ZM7.56667 15.4333H9.36667C10.3 15.4333 11.0833 16.15 11.0667 17.1333V22.8333C11.0667 23.75 10.3 24.5333 9.36667 24.5333H7.56667V15.4333Z" fill="#FF007D"/></g></g><defs><clipPath id="clip0_6509_143"><rect width="40" height="40" fill="white"/></clipPath><clipPath id="clip1_6509_143"><rect width="40" height="40" fill="white"/></clipPath></defs></svg>';
18
+ const defaultLogoSrc = `data:image/svg+xml,${encodeURIComponent(defaultLogoSvg)}`;
19
+ const mobilePanelAnimationDurationMs = 200;
20
+ const mobileBodyScrollLockClass = "dds-un-scrollable";
21
+ const defaultOverflowCategoryLabel = "Muut kategoriat";
22
+ const desktopMinWidthMediaQuery = "(min-width: 1024px)";
23
+ const defaultRenderLink = (props) => /* @__PURE__ */ jsxRuntime.jsx("a", { ...props });
24
+ const MainNavigation = ({
25
+ organizations = defaultOrganizations,
26
+ items = defaultItems,
27
+ loginHref = "#",
28
+ loginLabel = "Kirjaudu",
29
+ logoHref = "/",
30
+ languageSelectorLabel = "FI",
31
+ searchLabel = "Haku",
32
+ cartLabel = "Ostoskori",
33
+ showLanguageSelector = false,
34
+ showSearch = false,
35
+ showCart = false,
36
+ cartCounter,
37
+ cartCounterLabel = "tuotetta ostoskorissa",
38
+ onLanguageSelectorClick,
39
+ onSearchClick,
40
+ onCartClick,
41
+ mobileMenuOpenAriaLabel = "Avaa valikko",
42
+ mobileMenuCloseAriaLabel = "Sulje valikko",
43
+ organizationStripAriaLabel = "Sivustot",
44
+ logoAriaLabel = "Siirry etusivulle",
45
+ mobilePrimaryNavigationAriaLabel = "Päävalikko",
46
+ externalLinkAriaLabel = "avautuu uuteen välilehteen",
47
+ defaultMobileMenuOpen = false,
48
+ defaultOpenItemIndex = null,
49
+ currentPathname,
50
+ overflowCategoryLabel = defaultOverflowCategoryLabel,
51
+ onMobileMenuToggle,
52
+ onDesktopItemToggle,
53
+ renderLink = defaultRenderLink,
54
+ className,
55
+ "aria-label": ariaLabel = "Päänavigaatio",
56
+ ref,
57
+ ...props
58
+ }) => {
59
+ const [mobileMenuOpen, setMobileMenuOpen] = react.useState(defaultMobileMenuOpen);
60
+ const [isMobileMenuClosing, setIsMobileMenuClosing] = react.useState(false);
61
+ const [openTopLevelItemIndex, setOpenTopLevelItemIndex] = react.useState(
62
+ defaultOpenItemIndex
63
+ );
64
+ const [isDesktopHeaderOpen, setIsDesktopHeaderOpen] = react.useState(true);
65
+ const [mobileActiveCategoryIndex, setMobileActiveCategoryIndex] = react.useState(null);
66
+ const [isMobileSecondPanelClosing, setIsMobileSecondPanelClosing] = react.useState(false);
67
+ const [isMobileThirdPanelClosing, setIsMobileThirdPanelClosing] = react.useState(false);
68
+ const mobileSecondPanelCloseTimeoutRef = react.useRef(null);
69
+ const mobileThirdPanelCloseTimeoutRef = react.useRef(null);
70
+ const mobileMenuCloseResetTimeoutRef = react.useRef(null);
71
+ const focusMobileSecondPanelTimeoutRef = react.useRef(null);
72
+ const focusMobileThirdPanelTimeoutRef = react.useRef(null);
73
+ const focusReturnToMobileTopLevelItemTimeoutRef = react.useRef(
74
+ null
75
+ );
76
+ const resetMobileThirdPanelScrollTimeoutRef = react.useRef(
77
+ null
78
+ );
79
+ const headerElementRef = react.useRef(null);
80
+ const desktopPanelTriggerButtonRefs = react.useRef([]);
81
+ const mobilePrimaryNavRef = react.useRef(null);
82
+ const mobileMenuToggleButtonRef = react.useRef(null);
83
+ const mobileModalPanelRef = react.useRef(null);
84
+ const mobileThirdPanelRef = react.useRef(null);
85
+ const mobilePanelBackButtonRef = react.useRef(null);
86
+ const mobileThirdPanelBackButtonRef = react.useRef(null);
87
+ const mobileLevelTwoCategoryButtonRefs = react.useRef([]);
88
+ const focusMobilePanelBackOnOpenRef = react.useRef(false);
89
+ const focusMobileThirdPanelBackOnOpenRef = react.useRef(false);
90
+ const focusReturnToMobileCategoryTimeoutRef = react.useRef(
91
+ null
92
+ );
93
+ const setHeaderRef = react.useCallback(
94
+ (node) => {
95
+ headerElementRef.current = node;
96
+ MainNavigation_utils.assignRef(ref, node);
97
+ },
98
+ [ref]
99
+ );
100
+ react.useEffect(() => {
101
+ return () => {
102
+ if (mobileSecondPanelCloseTimeoutRef.current != null) {
103
+ clearTimeout(mobileSecondPanelCloseTimeoutRef.current);
104
+ }
105
+ if (mobileThirdPanelCloseTimeoutRef.current != null) {
106
+ clearTimeout(mobileThirdPanelCloseTimeoutRef.current);
107
+ }
108
+ if (focusMobileSecondPanelTimeoutRef.current != null) {
109
+ clearTimeout(focusMobileSecondPanelTimeoutRef.current);
110
+ }
111
+ if (focusMobileThirdPanelTimeoutRef.current != null) {
112
+ clearTimeout(focusMobileThirdPanelTimeoutRef.current);
113
+ }
114
+ clearTimeout(focusReturnToMobileTopLevelItemTimeoutRef.current ?? void 0);
115
+ if (resetMobileThirdPanelScrollTimeoutRef.current != null) {
116
+ clearTimeout(resetMobileThirdPanelScrollTimeoutRef.current);
117
+ }
118
+ if (mobileMenuCloseResetTimeoutRef.current != null) {
119
+ clearTimeout(mobileMenuCloseResetTimeoutRef.current);
120
+ }
121
+ if (focusReturnToMobileCategoryTimeoutRef.current != null) {
122
+ clearTimeout(focusReturnToMobileCategoryTimeoutRef.current);
123
+ }
124
+ };
125
+ }, []);
126
+ react.useEffect(() => {
127
+ if (typeof window === "undefined" || typeof window.matchMedia !== "function") {
128
+ return;
129
+ }
130
+ const headerElement = headerElementRef.current;
131
+ const desktopQuery = window.matchMedia(desktopMinWidthMediaQuery);
132
+ let previousScrollY = window.pageYOffset;
133
+ let headerHeight = parseFloat(window.getComputedStyle(headerElement).height.replace("px", "")) || headerElement.offsetHeight;
134
+ const openHeader = () => {
135
+ setIsDesktopHeaderOpen(true);
136
+ };
137
+ const closeHeader = () => {
138
+ setIsDesktopHeaderOpen(false);
139
+ };
140
+ const handleScroll = () => {
141
+ const currentScrollY = window.pageYOffset;
142
+ if (!desktopQuery.matches) {
143
+ openHeader();
144
+ previousScrollY = currentScrollY;
145
+ return;
146
+ }
147
+ if (mobileMenuOpen || openTopLevelItemIndex != null) {
148
+ openHeader();
149
+ previousScrollY = currentScrollY;
150
+ return;
151
+ }
152
+ if (currentScrollY <= headerHeight) {
153
+ openHeader();
154
+ } else if (currentScrollY > previousScrollY) {
155
+ closeHeader();
156
+ } else if (currentScrollY < previousScrollY) {
157
+ openHeader();
158
+ }
159
+ previousScrollY = currentScrollY;
160
+ };
161
+ const handleViewportChange = () => {
162
+ openHeader();
163
+ previousScrollY = window.pageYOffset;
164
+ headerHeight = parseFloat(window.getComputedStyle(headerElement).height.replace("px", "")) || headerElement.offsetHeight;
165
+ };
166
+ window.addEventListener("scroll", handleScroll, { passive: true });
167
+ window.addEventListener("resize", handleViewportChange);
168
+ desktopQuery.addEventListener("change", handleViewportChange);
169
+ handleScroll();
170
+ return () => {
171
+ window.removeEventListener("scroll", handleScroll);
172
+ window.removeEventListener("resize", handleViewportChange);
173
+ desktopQuery.removeEventListener("change", handleViewportChange);
174
+ };
175
+ }, [mobileMenuOpen, openTopLevelItemIndex]);
176
+ react.useEffect(() => {
177
+ const browserWindow = globalThis.window;
178
+ const browserDocument = globalThis.document;
179
+ if (!mobileMenuOpen || browserWindow == null || browserDocument == null) {
180
+ return;
181
+ }
182
+ const isMobileViewport = MainNavigation_utils.isMobileViewportByEnvironment(browserWindow);
183
+ if (!isMobileViewport) {
184
+ return;
185
+ }
186
+ const body = browserDocument.body;
187
+ if (MainNavigation_utils.isMobileIosDeviceByEnvironment(browserWindow, globalThis.navigator)) {
188
+ const scrollY = browserWindow.pageYOffset;
189
+ body.style.position = "fixed";
190
+ body.style.top = `-${scrollY}px`;
191
+ body.style.width = "100%";
192
+ return () => {
193
+ const top = body.style.top;
194
+ body.style.position = "";
195
+ body.style.top = "";
196
+ body.style.width = "";
197
+ if (top !== "") {
198
+ browserWindow.scrollTo(0, Number.parseInt(top, 10) * -1);
199
+ }
200
+ };
201
+ }
202
+ body.classList.add(mobileBodyScrollLockClass);
203
+ return () => {
204
+ body.classList.remove(mobileBodyScrollLockClass);
205
+ };
206
+ }, [mobileMenuOpen]);
207
+ react.useEffect(() => {
208
+ if (typeof window === "undefined" || typeof window.matchMedia !== "function") {
209
+ return;
210
+ }
211
+ const desktopQuery = window.matchMedia(desktopMinWidthMediaQuery);
212
+ const applyViewportModeChange = ({ matches: isDesktopViewport2 }) => {
213
+ if (isDesktopViewport2) {
214
+ clearTimeout(mobileSecondPanelCloseTimeoutRef.current ?? void 0);
215
+ mobileSecondPanelCloseTimeoutRef.current = null;
216
+ clearTimeout(mobileThirdPanelCloseTimeoutRef.current ?? void 0);
217
+ mobileThirdPanelCloseTimeoutRef.current = null;
218
+ clearTimeout(resetMobileThirdPanelScrollTimeoutRef.current ?? void 0);
219
+ resetMobileThirdPanelScrollTimeoutRef.current = null;
220
+ setMobileMenuOpen((previous) => {
221
+ if (previous) {
222
+ onMobileMenuToggle?.(false);
223
+ }
224
+ return false;
225
+ });
226
+ setMobileActiveCategoryIndex(null);
227
+ setIsMobileSecondPanelClosing(false);
228
+ setIsMobileThirdPanelClosing(false);
229
+ return;
230
+ }
231
+ setOpenTopLevelItemIndex((previous) => {
232
+ if (previous !== null) {
233
+ onDesktopItemToggle?.(null);
234
+ }
235
+ return null;
236
+ });
237
+ };
238
+ applyViewportModeChange(desktopQuery);
239
+ desktopQuery.addEventListener("change", applyViewportModeChange);
240
+ return () => {
241
+ desktopQuery.removeEventListener("change", applyViewportModeChange);
242
+ };
243
+ }, [onDesktopItemToggle, onMobileMenuToggle]);
244
+ const resetMobilePanelState = react.useCallback(() => {
245
+ setOpenTopLevelItemIndex(null);
246
+ setMobileActiveCategoryIndex(null);
247
+ setIsMobileSecondPanelClosing(false);
248
+ setIsMobileThirdPanelClosing(false);
249
+ }, []);
250
+ const closeMobileMenu = react.useCallback(() => {
251
+ clearTimeout(mobileSecondPanelCloseTimeoutRef.current ?? void 0);
252
+ mobileSecondPanelCloseTimeoutRef.current = null;
253
+ clearTimeout(mobileThirdPanelCloseTimeoutRef.current ?? void 0);
254
+ mobileThirdPanelCloseTimeoutRef.current = null;
255
+ clearTimeout(resetMobileThirdPanelScrollTimeoutRef.current ?? void 0);
256
+ resetMobileThirdPanelScrollTimeoutRef.current = null;
257
+ if (!mobileMenuOpen && openTopLevelItemIndex === null) {
258
+ return;
259
+ }
260
+ const shouldAnimateMobileClose = mobileMenuOpen;
261
+ clearTimeout(mobileMenuCloseResetTimeoutRef.current ?? void 0);
262
+ setIsMobileMenuClosing(shouldAnimateMobileClose);
263
+ setMobileMenuOpen((previous) => {
264
+ if (previous) {
265
+ onMobileMenuToggle?.(false);
266
+ }
267
+ return false;
268
+ });
269
+ setOpenTopLevelItemIndex((previous) => {
270
+ if (previous !== null) {
271
+ onDesktopItemToggle?.(null);
272
+ }
273
+ return null;
274
+ });
275
+ if (shouldAnimateMobileClose) {
276
+ mobileMenuCloseResetTimeoutRef.current = setTimeout(() => {
277
+ resetMobilePanelState();
278
+ setIsMobileMenuClosing(false);
279
+ mobileMenuCloseResetTimeoutRef.current = null;
280
+ }, mobilePanelAnimationDurationMs);
281
+ return;
282
+ }
283
+ resetMobilePanelState();
284
+ setIsMobileMenuClosing(false);
285
+ }, [
286
+ mobileMenuOpen,
287
+ onDesktopItemToggle,
288
+ onMobileMenuToggle,
289
+ openTopLevelItemIndex,
290
+ resetMobilePanelState
291
+ ]);
292
+ const toggleMobileMenu = () => {
293
+ if (mobileMenuOpen) {
294
+ closeMobileMenu();
295
+ return;
296
+ }
297
+ setMobileMenuOpen(true);
298
+ setIsMobileMenuClosing(false);
299
+ onMobileMenuToggle?.(true);
300
+ };
301
+ const toggleTopLevelItem = (index) => {
302
+ setOpenTopLevelItemIndex((previous) => {
303
+ const next = previous === index ? null : index;
304
+ setMobileActiveCategoryIndex(null);
305
+ setIsMobileSecondPanelClosing(false);
306
+ setIsMobileThirdPanelClosing(false);
307
+ onDesktopItemToggle?.(next);
308
+ return next;
309
+ });
310
+ };
311
+ const isDesktopViewport = react.useCallback(() => {
312
+ return MainNavigation_utils.isDesktopViewportByEnvironment(globalThis.window);
313
+ }, []);
314
+ const isFocusable = react.useCallback((element) => {
315
+ if (element.tabIndex < 0 || element.hasAttribute("disabled")) {
316
+ return false;
317
+ }
318
+ if (element.getAttribute("aria-hidden") === "true") {
319
+ return false;
320
+ }
321
+ if (element.closest("[hidden]") != null) {
322
+ return false;
323
+ }
324
+ let currentElement = element;
325
+ while (currentElement != null) {
326
+ const computedStyle = window.getComputedStyle(currentElement);
327
+ if (computedStyle.display === "none" || computedStyle.visibility === "hidden") {
328
+ return false;
329
+ }
330
+ currentElement = currentElement.parentElement;
331
+ }
332
+ return true;
333
+ }, []);
334
+ const getFocusableElements = react.useCallback(
335
+ (container, selector) => (
336
+ /* v8 ignore next -- defensive null guard for transient panel refs */
337
+ container == null ? [] : Array.from(container.querySelectorAll(selector)).filter(isFocusable)
338
+ ),
339
+ [isFocusable]
340
+ );
341
+ const getDesktopPanelInteractiveElements = react.useCallback(() => {
342
+ return getFocusableElements(
343
+ headerElementRef.current,
344
+ `.${MainNavigation_module["main-navigation__panel--desktop"]} a[href], .${MainNavigation_module["main-navigation__panel--desktop"]} button:not([disabled]), .${MainNavigation_module["main-navigation__panel--desktop"]} [tabindex]:not([tabindex="-1"])`
345
+ );
346
+ }, [getFocusableElements]);
347
+ const getDesktopFocusLoopElements = react.useCallback(
348
+ (openDesktopItemIndex) => {
349
+ const focusLoopElements = /* @__PURE__ */ new Set();
350
+ const triggerButton = desktopPanelTriggerButtonRefs.current[openDesktopItemIndex];
351
+ if (triggerButton != null && isFocusable(triggerButton)) {
352
+ focusLoopElements.add(triggerButton);
353
+ }
354
+ getDesktopPanelInteractiveElements().forEach((element) => {
355
+ focusLoopElements.add(element);
356
+ });
357
+ return Array.from(focusLoopElements);
358
+ },
359
+ [getDesktopPanelInteractiveElements, isFocusable]
360
+ );
361
+ const getMobileFocusableElements = react.useCallback(() => {
362
+ const focusableElements = [];
363
+ const addFocusableElements = (elements) => {
364
+ focusableElements.push(...elements);
365
+ };
366
+ if (mobileMenuToggleButtonRef.current != null && isFocusable(mobileMenuToggleButtonRef.current)) {
367
+ focusableElements.push(mobileMenuToggleButtonRef.current);
368
+ }
369
+ if (openTopLevelItemIndex == null) {
370
+ addFocusableElements(
371
+ getFocusableElements(
372
+ mobilePrimaryNavRef.current,
373
+ `.${MainNavigation_module["main-navigation__primary-list"]} .${MainNavigation_module["main-navigation__item-toggle"]}, .${MainNavigation_module["main-navigation__primary-list"]} .${MainNavigation_module["main-navigation__item-link"]}`
374
+ )
375
+ );
376
+ return Array.from(new Set(focusableElements));
377
+ }
378
+ if (mobileActiveCategoryIndex == null) {
379
+ addFocusableElements(
380
+ getFocusableElements(
381
+ mobileModalPanelRef.current,
382
+ `.${MainNavigation_module["main-navigation__mobile-back-item"]}, .${MainNavigation_module["main-navigation__mobile-feature-link"]}, .${MainNavigation_module["main-navigation__mobile-level-2-category-button"]}`
383
+ )
384
+ );
385
+ return Array.from(new Set(focusableElements));
386
+ }
387
+ addFocusableElements(
388
+ getFocusableElements(
389
+ mobileThirdPanelRef.current,
390
+ `.${MainNavigation_module["main-navigation__mobile-back-item"]}, .${MainNavigation_module["main-navigation__mobile-level-3-link"]}`
391
+ )
392
+ );
393
+ return Array.from(new Set(focusableElements));
394
+ }, [getFocusableElements, isFocusable, mobileActiveCategoryIndex, openTopLevelItemIndex]);
395
+ const openMobileCategoryPanel = react.useCallback((index) => {
396
+ clearTimeout(resetMobileThirdPanelScrollTimeoutRef.current ?? void 0);
397
+ setIsMobileThirdPanelClosing(false);
398
+ setMobileActiveCategoryIndex(index);
399
+ resetMobileThirdPanelScrollTimeoutRef.current = setTimeout(() => {
400
+ (mobileThirdPanelRef.current ?? { scrollTop: 0 }).scrollTop = 0;
401
+ resetMobileThirdPanelScrollTimeoutRef.current = null;
402
+ }, 0);
403
+ }, []);
404
+ const closeMenus = react.useCallback(() => {
405
+ clearTimeout(mobileSecondPanelCloseTimeoutRef.current ?? void 0);
406
+ mobileSecondPanelCloseTimeoutRef.current = null;
407
+ clearTimeout(mobileThirdPanelCloseTimeoutRef.current ?? void 0);
408
+ mobileThirdPanelCloseTimeoutRef.current = null;
409
+ clearTimeout(focusMobileSecondPanelTimeoutRef.current ?? void 0);
410
+ focusMobileSecondPanelTimeoutRef.current = null;
411
+ clearTimeout(focusMobileThirdPanelTimeoutRef.current ?? void 0);
412
+ focusMobileThirdPanelTimeoutRef.current = null;
413
+ clearTimeout(resetMobileThirdPanelScrollTimeoutRef.current ?? void 0);
414
+ resetMobileThirdPanelScrollTimeoutRef.current = null;
415
+ clearTimeout(focusReturnToMobileTopLevelItemTimeoutRef.current ?? void 0);
416
+ focusReturnToMobileTopLevelItemTimeoutRef.current = null;
417
+ clearTimeout(focusReturnToMobileCategoryTimeoutRef.current ?? void 0);
418
+ focusReturnToMobileCategoryTimeoutRef.current = null;
419
+ closeMobileMenu();
420
+ }, [closeMobileMenu]);
421
+ const closeMobilePanel = react.useCallback(
422
+ ({
423
+ isClosing,
424
+ setIsClosing,
425
+ closeTimeoutRef,
426
+ onClosed
427
+ }) => {
428
+ if (isClosing) {
429
+ return;
430
+ }
431
+ clearTimeout(closeTimeoutRef.current ?? void 0);
432
+ setIsClosing(true);
433
+ closeTimeoutRef.current = setTimeout(() => {
434
+ onClosed?.();
435
+ setIsClosing(false);
436
+ closeTimeoutRef.current = null;
437
+ }, mobilePanelAnimationDurationMs);
438
+ },
439
+ []
440
+ );
441
+ const renderNavigationLink = react.useCallback(
442
+ ({
443
+ link,
444
+ className: className2,
445
+ children,
446
+ ariaCurrent,
447
+ onKeyDown
448
+ }) => renderLink(
449
+ {
450
+ href: MainNavigation_utils.toNavigableHref(link.href),
451
+ className: className2,
452
+ rel: MainNavigation_utils.getLinkRel(link.target),
453
+ target: MainNavigation_utils.getLinkTarget(link.target),
454
+ "aria-current": ariaCurrent,
455
+ onKeyDown,
456
+ children
457
+ },
458
+ { external: MainNavigation_utils.isExternalLink(link) }
459
+ ),
460
+ [renderLink]
461
+ );
462
+ const renderUtilityLink = react.useCallback(
463
+ (props2) => renderLink(props2, { external: false }),
464
+ [renderLink]
465
+ );
466
+ const openItem = openTopLevelItemIndex != null ? items[openTopLevelItemIndex] : void 0;
467
+ const openPanel = openItem?.panel;
468
+ const isMobilePanelClosingOut = isMobileMenuClosing && !mobileMenuOpen;
469
+ const showPageOverlay = mobileMenuOpen || openPanel != null || isMobilePanelClosingOut;
470
+ const isOverlayClosingOut = isMobilePanelClosingOut && openPanel == null;
471
+ const cartAccessibleLabel = cartCounter != null ? `${cartLabel} ${cartCounter} ${cartCounterLabel}` : cartLabel;
472
+ react.useEffect(() => {
473
+ if (!showPageOverlay) {
474
+ return;
475
+ }
476
+ const handleOutsidePointerDown = (event) => {
477
+ const target = event.target;
478
+ if (!(target instanceof Node)) {
479
+ return;
480
+ }
481
+ if (headerElementRef.current?.contains(target)) {
482
+ return;
483
+ }
484
+ closeMenus();
485
+ };
486
+ document.addEventListener("pointerdown", handleOutsidePointerDown, true);
487
+ return () => {
488
+ document.removeEventListener("pointerdown", handleOutsidePointerDown, true);
489
+ };
490
+ }, [closeMenus, showPageOverlay]);
491
+ react.useEffect(() => {
492
+ if (!focusMobilePanelBackOnOpenRef.current || openTopLevelItemIndex == null || mobileMenuOpen === false) {
493
+ return;
494
+ }
495
+ if (isDesktopViewport()) {
496
+ focusMobilePanelBackOnOpenRef.current = false;
497
+ return;
498
+ }
499
+ clearTimeout(focusMobileSecondPanelTimeoutRef.current ?? void 0);
500
+ focusMobileSecondPanelTimeoutRef.current = setTimeout(() => {
501
+ mobilePanelBackButtonRef.current?.focus();
502
+ focusMobilePanelBackOnOpenRef.current = false;
503
+ focusMobileSecondPanelTimeoutRef.current = null;
504
+ }, mobilePanelAnimationDurationMs);
505
+ }, [isDesktopViewport, mobileMenuOpen, openTopLevelItemIndex]);
506
+ react.useEffect(() => {
507
+ if (!focusMobileThirdPanelBackOnOpenRef.current || mobileActiveCategoryIndex == null) {
508
+ return;
509
+ }
510
+ focusMobileThirdPanelBackOnOpenRef.current = focusMobileThirdPanelBackOnOpenRef.current && !isDesktopViewport();
511
+ if (focusMobileThirdPanelBackOnOpenRef.current) {
512
+ clearTimeout(focusMobileThirdPanelTimeoutRef.current ?? void 0);
513
+ focusMobileThirdPanelTimeoutRef.current = setTimeout(() => {
514
+ mobileThirdPanelBackButtonRef.current?.focus();
515
+ focusMobileThirdPanelBackOnOpenRef.current = false;
516
+ focusMobileThirdPanelTimeoutRef.current = null;
517
+ }, mobilePanelAnimationDurationMs);
518
+ }
519
+ }, [isDesktopViewport, mobileActiveCategoryIndex]);
520
+ react.useEffect(() => {
521
+ if (!mobileMenuOpen || openTopLevelItemIndex == null || isDesktopViewport()) {
522
+ return;
523
+ }
524
+ const mobileSecondPanel = mobileModalPanelRef.current;
525
+ if (mobileSecondPanel == null) {
526
+ return;
527
+ }
528
+ mobileSecondPanel.scrollTop = 0;
529
+ }, [isDesktopViewport, mobileMenuOpen, openTopLevelItemIndex]);
530
+ const renderPanel = (panelClassName, isMobileModal = false) => {
531
+ if (openPanel == null || openItem == null) {
532
+ return null;
533
+ }
534
+ const hasFeatureLinks = openPanel.featureLinks != null && openPanel.featureLinks.length > 0;
535
+ const panelColumns = openPanel.columns ?? [];
536
+ const lastDesktopVisibleColumnIndex = panelColumns.reduce((lastIndex, column, index) => {
537
+ if (column.mobileOnly) {
538
+ return lastIndex;
539
+ }
540
+ return index;
541
+ }, -1);
542
+ const mobilePanelColumns = panelColumns.filter((column) => !column.desktopOnly);
543
+ const getColumnHeading = (heading, isOverflow) => {
544
+ if (!isOverflow) {
545
+ return heading;
546
+ }
547
+ return heading.trim() === "" ? overflowCategoryLabel : heading;
548
+ };
549
+ if (isMobileModal) {
550
+ const selectedColumn = mobileActiveCategoryIndex != null ? mobilePanelColumns[mobileActiveCategoryIndex] : null;
551
+ const isLevelThreePanelOpen = selectedColumn != null && !isMobileThirdPanelClosing;
552
+ const shouldHideLevelTwoFromAssistiveTech = isLevelThreePanelOpen;
553
+ return /* @__PURE__ */ jsxRuntime.jsx(
554
+ "div",
555
+ {
556
+ ref: mobileModalPanelRef,
557
+ className: cn.cn(
558
+ panelClassName,
559
+ isMobileSecondPanelClosing && MainNavigation_module["main-navigation__panel--is-closing"]
560
+ ),
561
+ "aria-label": openItem.label,
562
+ "aria-hidden": isMobilePanelClosingOut || void 0,
563
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: MainNavigation_module["main-navigation__mobile-level-2-content"], children: [
564
+ /* @__PURE__ */ jsxRuntime.jsxs(
565
+ "button",
566
+ {
567
+ ref: mobilePanelBackButtonRef,
568
+ type: "button",
569
+ className: cn.cn(
570
+ MainNavigation_module["main-navigation__mobile-back-item"],
571
+ focus_module.default.focusableInset
572
+ ),
573
+ onClick: () => closeMobilePanel({
574
+ isClosing: isMobileSecondPanelClosing,
575
+ setIsClosing: setIsMobileSecondPanelClosing,
576
+ closeTimeoutRef: mobileSecondPanelCloseTimeoutRef,
577
+ onClosed: () => {
578
+ const closedTopLevelItemIndex = openTopLevelItemIndex;
579
+ setOpenTopLevelItemIndex(null);
580
+ setMobileActiveCategoryIndex(null);
581
+ onDesktopItemToggle?.(null);
582
+ clearTimeout(
583
+ focusReturnToMobileTopLevelItemTimeoutRef.current ?? void 0
584
+ );
585
+ focusReturnToMobileTopLevelItemTimeoutRef.current = setTimeout(() => {
586
+ desktopPanelTriggerButtonRefs.current[closedTopLevelItemIndex]?.focus();
587
+ focusReturnToMobileTopLevelItemTimeoutRef.current = null;
588
+ }, 0);
589
+ }
590
+ }),
591
+ children: [
592
+ /* @__PURE__ */ jsxRuntime.jsx(icons.ChevronRight, { className: MainNavigation_module["main-navigation__mobile-back-icon"] }),
593
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: MainNavigation_module["main-navigation__mobile-back-label"], children: openItem.label })
594
+ ]
595
+ }
596
+ ),
597
+ hasFeatureLinks && /* @__PURE__ */ jsxRuntime.jsx(
598
+ "div",
599
+ {
600
+ className: MainNavigation_module["main-navigation__mobile-level-2-feature-links"],
601
+ "aria-hidden": shouldHideLevelTwoFromAssistiveTech || void 0,
602
+ children: /* @__PURE__ */ jsxRuntime.jsx(
603
+ "ul",
604
+ {
605
+ className: MainNavigation_module["main-navigation__mobile-level-2-feature-list"],
606
+ children: openPanel.featureLinks.map((link, index) => {
607
+ const href = MainNavigation_utils.toNavigableHref(link.href);
608
+ const isExternalFeatureLink = MainNavigation_utils.isExternalTarget(link.target);
609
+ const MobileFeatureIcon = isExternalFeatureLink ? icons.Open : icons.ArrowRight;
610
+ return /* @__PURE__ */ jsxRuntime.jsx(
611
+ "li",
612
+ {
613
+ className: MainNavigation_module["main-navigation__mobile-level-2-feature-list-item"],
614
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
615
+ IconButton.IconButton,
616
+ {
617
+ href,
618
+ renderLink: (linkProps) => renderLink(linkProps, {
619
+ external: MainNavigation_utils.isExternalLink(link)
620
+ }),
621
+ className: MainNavigation_module["main-navigation__mobile-feature-link"],
622
+ icon: MobileFeatureIcon,
623
+ size: "small",
624
+ labelBehavior: "wrap",
625
+ rel: MainNavigation_utils.getLinkRel(link.target),
626
+ target: MainNavigation_utils.getLinkTarget(link.target),
627
+ children: [
628
+ link.label,
629
+ isExternalFeatureLink && externalLinkAriaLabel && /* @__PURE__ */ jsxRuntime.jsx(
630
+ "span",
631
+ {
632
+ className: MainNavigation_module["main-navigation__sr-only"],
633
+ children: ` (${externalLinkAriaLabel})`
634
+ }
635
+ )
636
+ ]
637
+ }
638
+ )
639
+ },
640
+ `mobile-feature-${index}`
641
+ );
642
+ })
643
+ }
644
+ )
645
+ }
646
+ ),
647
+ /* @__PURE__ */ jsxRuntime.jsx(
648
+ "ul",
649
+ {
650
+ className: MainNavigation_module["main-navigation__mobile-level-2-category-list"],
651
+ "aria-hidden": shouldHideLevelTwoFromAssistiveTech || void 0,
652
+ children: mobilePanelColumns.map((column, index) => /* @__PURE__ */ jsxRuntime.jsx(
653
+ "li",
654
+ {
655
+ className: MainNavigation_module["main-navigation__mobile-level-2-category-item"],
656
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
657
+ "button",
658
+ {
659
+ ref: (node) => {
660
+ mobileLevelTwoCategoryButtonRefs.current[index] = node;
661
+ },
662
+ type: "button",
663
+ className: cn.cn(
664
+ MainNavigation_module["main-navigation__mobile-level-2-category-button"],
665
+ focus_module.default.focusableInset
666
+ ),
667
+ onClick: () => openMobileCategoryPanel(index),
668
+ onKeyDown: (event) => {
669
+ if (event.key !== "Enter" || isDesktopViewport()) {
670
+ return;
671
+ }
672
+ event.preventDefault();
673
+ focusMobileThirdPanelBackOnOpenRef.current = true;
674
+ openMobileCategoryPanel(index);
675
+ },
676
+ children: [
677
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: getColumnHeading(column.heading, column.overflow) }),
678
+ /* @__PURE__ */ jsxRuntime.jsx(icons.ChevronRight, {})
679
+ ]
680
+ }
681
+ )
682
+ },
683
+ `mobile-category-${column.heading}-${index}`
684
+ ))
685
+ }
686
+ ),
687
+ /* @__PURE__ */ jsxRuntime.jsx(
688
+ "div",
689
+ {
690
+ ref: mobileThirdPanelRef,
691
+ className: cn.cn(
692
+ MainNavigation_module["main-navigation__mobile-level-3-panel"],
693
+ isLevelThreePanelOpen && MainNavigation_module["main-navigation__mobile-level-3-panel--open"],
694
+ isMobileThirdPanelClosing && MainNavigation_module["main-navigation__mobile-level-3-panel--is-closing"]
695
+ ),
696
+ children: selectedColumn != null && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
697
+ /* @__PURE__ */ jsxRuntime.jsxs(
698
+ "button",
699
+ {
700
+ ref: mobileThirdPanelBackButtonRef,
701
+ type: "button",
702
+ className: cn.cn(
703
+ MainNavigation_module["main-navigation__mobile-back-item"],
704
+ focus_module.default.focusableInset
705
+ ),
706
+ onClick: () => closeMobilePanel({
707
+ isClosing: isMobileThirdPanelClosing,
708
+ setIsClosing: setIsMobileThirdPanelClosing,
709
+ closeTimeoutRef: mobileThirdPanelCloseTimeoutRef,
710
+ onClosed: () => {
711
+ const closedCategoryIndex = mobileActiveCategoryIndex;
712
+ setMobileActiveCategoryIndex(null);
713
+ clearTimeout(
714
+ focusReturnToMobileCategoryTimeoutRef.current ?? void 0
715
+ );
716
+ focusReturnToMobileCategoryTimeoutRef.current = setTimeout(() => {
717
+ mobileLevelTwoCategoryButtonRefs.current[closedCategoryIndex]?.focus();
718
+ focusReturnToMobileCategoryTimeoutRef.current = null;
719
+ }, 0);
720
+ }
721
+ }),
722
+ children: [
723
+ /* @__PURE__ */ jsxRuntime.jsx(
724
+ icons.ChevronRight,
725
+ {
726
+ className: MainNavigation_module["main-navigation__mobile-back-icon"]
727
+ }
728
+ ),
729
+ /* @__PURE__ */ jsxRuntime.jsx(
730
+ "span",
731
+ {
732
+ className: MainNavigation_module["main-navigation__mobile-back-label"],
733
+ children: selectedColumn.heading
734
+ }
735
+ )
736
+ ]
737
+ }
738
+ ),
739
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { className: MainNavigation_module["main-navigation__mobile-level-3-list"], children: selectedColumn.links.map((link, index) => /* @__PURE__ */ jsxRuntime.jsx(
740
+ "li",
741
+ {
742
+ className: MainNavigation_module["main-navigation__mobile-level-3-item"],
743
+ children: renderNavigationLink({
744
+ link,
745
+ className: cn.cn(
746
+ MainNavigation_module["main-navigation__mobile-level-3-link"],
747
+ focus_module.default.focusableInset
748
+ ),
749
+ children: link.label
750
+ })
751
+ },
752
+ `${selectedColumn.heading}-${index}`
753
+ )) })
754
+ ] })
755
+ }
756
+ )
757
+ ] })
758
+ }
759
+ );
760
+ }
761
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: panelClassName, "aria-label": openItem.label, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: MainNavigation_module["main-navigation__panel-content"], children: [
762
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: MainNavigation_module["main-navigation__panel-main"], children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: MainNavigation_module["main-navigation__panel-columns"], children: panelColumns.map((column, columnIndex) => /* @__PURE__ */ jsxRuntime.jsxs(
763
+ "section",
764
+ {
765
+ className: cn.cn(
766
+ MainNavigation_module["main-navigation__panel-column"],
767
+ column.highlighted && MainNavigation_module["main-navigation__panel-column--highlighted"],
768
+ column.mobileOnly && MainNavigation_module["main-navigation__panel-column--mobile-only"],
769
+ column.desktopOnly && MainNavigation_module["main-navigation__panel-column--desktop-only"],
770
+ !hasFeatureLinks && columnIndex === lastDesktopVisibleColumnIndex && MainNavigation_module["main-navigation__panel-column--last"]
771
+ ),
772
+ children: [
773
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: MainNavigation_module["main-navigation__panel-heading"], children: getColumnHeading(column.heading, column.overflow) }),
774
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { className: MainNavigation_module["main-navigation__panel-list"], children: column.links.map((link, index) => {
775
+ const isInCurrentPage = MainNavigation_utils.isLinkInCurrentPage(
776
+ link,
777
+ currentPathname
778
+ );
779
+ return /* @__PURE__ */ jsxRuntime.jsx(
780
+ "li",
781
+ {
782
+ className: MainNavigation_module["main-navigation__panel-list-item"],
783
+ children: renderNavigationLink({
784
+ link,
785
+ className: cn.cn(
786
+ MainNavigation_module["main-navigation__panel-link"],
787
+ focus_module.default.focusableInset,
788
+ textDecoration_module.default.underlineLinkOnHover,
789
+ isInCurrentPage && MainNavigation_module["main-navigation__panel-link--current"]
790
+ ),
791
+ ariaCurrent: isInCurrentPage ? "page" : void 0,
792
+ children: link.label
793
+ })
794
+ },
795
+ `${column.heading}-${index}`
796
+ );
797
+ }) })
798
+ ]
799
+ },
800
+ `column-${columnIndex}`
801
+ )) }) }),
802
+ /* @__PURE__ */ jsxRuntime.jsx(
803
+ "aside",
804
+ {
805
+ className: cn.cn(
806
+ elevation_module.default.elevationHigh,
807
+ MainNavigation_module["main-navigation__panel-column"],
808
+ MainNavigation_module["main-navigation__feature-links"],
809
+ MainNavigation_module["main-navigation__panel-column--last"],
810
+ openPanel.featureLinksHighlighted && MainNavigation_module["main-navigation__panel-column--highlighted"],
811
+ !hasFeatureLinks && MainNavigation_module["main-navigation__feature-links--empty"]
812
+ ),
813
+ children: /* @__PURE__ */ jsxRuntime.jsx("ul", { className: MainNavigation_module["main-navigation__feature-list"], children: (openPanel.featureLinks ?? []).map((link, index) => {
814
+ const href = MainNavigation_utils.toNavigableHref(link.href);
815
+ const isExternalFeatureLink = MainNavigation_utils.isExternalTarget(link.target);
816
+ return /* @__PURE__ */ jsxRuntime.jsx(
817
+ "li",
818
+ {
819
+ className: MainNavigation_module["main-navigation__panel-list-item"],
820
+ children: renderNavigationLink({
821
+ link: { ...link, href },
822
+ className: cn.cn(
823
+ MainNavigation_module["main-navigation__feature-link"],
824
+ textDecoration_module.default.underlineLinkOnHover,
825
+ focus_module.default.focusableInset
826
+ ),
827
+ children: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
828
+ isExternalFeatureLink ? /* @__PURE__ */ jsxRuntime.jsx(
829
+ icons.Open,
830
+ {
831
+ className: MainNavigation_module["main-navigation__feature-link-icon"]
832
+ }
833
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
834
+ icons.ArrowRight,
835
+ {
836
+ className: MainNavigation_module["main-navigation__feature-link-icon"]
837
+ }
838
+ ),
839
+ /* @__PURE__ */ jsxRuntime.jsx(
840
+ "span",
841
+ {
842
+ className: MainNavigation_module["main-navigation__feature-link-label"],
843
+ children: link.label
844
+ }
845
+ ),
846
+ isExternalFeatureLink && externalLinkAriaLabel && /* @__PURE__ */ jsxRuntime.jsx(
847
+ "span",
848
+ {
849
+ className: MainNavigation_module["main-navigation__sr-only"],
850
+ children: ` (${externalLinkAriaLabel})`
851
+ }
852
+ )
853
+ ] })
854
+ })
855
+ },
856
+ `feature-${index}`
857
+ );
858
+ }) })
859
+ }
860
+ )
861
+ ] }) });
862
+ };
863
+ const renderPrimaryList = () => /* @__PURE__ */ jsxRuntime.jsx("ul", { className: MainNavigation_module["main-navigation__primary-list"], children: items.map((item, index) => {
864
+ const hasPanel = item.panel != null;
865
+ const isOpen = openTopLevelItemIndex === index;
866
+ const isCurrentPathItem = MainNavigation_utils.isItemInCurrentPath(item, currentPathname);
867
+ return /* @__PURE__ */ jsxRuntime.jsx("li", { className: MainNavigation_module["main-navigation__item"], children: hasPanel ? /* @__PURE__ */ jsxRuntime.jsxs(
868
+ "button",
869
+ {
870
+ ref: (node) => {
871
+ desktopPanelTriggerButtonRefs.current[index] = node;
872
+ },
873
+ type: "button",
874
+ className: cn.cn(
875
+ MainNavigation_module["main-navigation__item-toggle"],
876
+ focus_module.default.focusableInset,
877
+ isCurrentPathItem && MainNavigation_module["main-navigation__item-toggle--current"],
878
+ isOpen && MainNavigation_module["main-navigation__item-toggle--open"]
879
+ ),
880
+ "aria-expanded": isOpen,
881
+ onClick: () => toggleTopLevelItem(index),
882
+ onKeyDown: (event) => {
883
+ if (event.key === "Enter" && !isDesktopViewport()) {
884
+ focusMobilePanelBackOnOpenRef.current = true;
885
+ }
886
+ },
887
+ children: [
888
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: MainNavigation_module["main-navigation__item-label"], children: item.label }),
889
+ /* @__PURE__ */ jsxRuntime.jsx(
890
+ icons.ChevronRight,
891
+ {
892
+ className: MainNavigation_module["main-navigation__top-level-toggle-icon"]
893
+ }
894
+ )
895
+ ]
896
+ }
897
+ ) : renderNavigationLink({
898
+ link: item,
899
+ className: cn.cn(
900
+ MainNavigation_module["main-navigation__item-link"],
901
+ focus_module.default.focusableInset,
902
+ isCurrentPathItem && MainNavigation_module["main-navigation__item-link--current"]
903
+ ),
904
+ ariaCurrent: isCurrentPathItem ? "page" : void 0,
905
+ children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: MainNavigation_module["main-navigation__item-label"], children: item.label })
906
+ }) }, item.label);
907
+ }) });
908
+ return /* @__PURE__ */ jsxRuntime.jsxs(
909
+ "header",
910
+ {
911
+ ref: setHeaderRef,
912
+ className: cn.cn(
913
+ MainNavigation_module["main-navigation"],
914
+ isDesktopHeaderOpen && MainNavigation_module["main-navigation--open"],
915
+ mobileMenuOpen && MainNavigation_module["main-navigation--menu-open"],
916
+ isMobileMenuClosing && MainNavigation_module["main-navigation--menu-closing"],
917
+ showPageOverlay && MainNavigation_module["main-navigation--overlay"],
918
+ showPageOverlay && overlay_module.default.overlayStrong,
919
+ isOverlayClosingOut && overlay_module.default.overlayClosing,
920
+ className
921
+ ),
922
+ ...props,
923
+ onKeyDown: (event) => {
924
+ if (event.key === "Tab" && mobileMenuOpen && !isDesktopViewport()) {
925
+ const focusableElements = getMobileFocusableElements();
926
+ if (focusableElements.length > 0) {
927
+ event.preventDefault();
928
+ const currentIndex = focusableElements.indexOf(
929
+ document.activeElement
930
+ );
931
+ const direction = event.shiftKey ? -1 : 1;
932
+ const nextIndex = currentIndex === -1 ? event.shiftKey ? focusableElements.length - 1 : 0 : (currentIndex + direction + focusableElements.length) % focusableElements.length;
933
+ focusableElements[nextIndex]?.focus();
934
+ }
935
+ return;
936
+ }
937
+ if (event.key === "Tab" && openTopLevelItemIndex != null && isDesktopViewport()) {
938
+ const focusLoopElements = getDesktopFocusLoopElements(openTopLevelItemIndex);
939
+ if (focusLoopElements.length > 0) {
940
+ event.preventDefault();
941
+ const currentIndex = focusLoopElements.indexOf(
942
+ document.activeElement
943
+ );
944
+ const direction = event.shiftKey ? -1 : 1;
945
+ const nextIndex = currentIndex === -1 ? event.shiftKey ? focusLoopElements.length - 1 : 0 : (currentIndex + direction + focusLoopElements.length) % focusLoopElements.length;
946
+ focusLoopElements[nextIndex]?.focus();
947
+ return;
948
+ }
949
+ }
950
+ if (event.key === "Escape") {
951
+ closeMenus();
952
+ }
953
+ props.onKeyDown?.(event);
954
+ },
955
+ children: [
956
+ /* @__PURE__ */ jsxRuntime.jsx(
957
+ "nav",
958
+ {
959
+ "aria-label": organizationStripAriaLabel,
960
+ className: MainNavigation_module["main-navigation__organization-strip"],
961
+ children: organizations.map((organization) => /* @__PURE__ */ jsxRuntime.jsx(react.Fragment, { children: renderNavigationLink({
962
+ link: organization,
963
+ className: cn.cn(
964
+ MainNavigation_module["main-navigation__organization-link"],
965
+ focus_module.default.focusable,
966
+ organization.current && MainNavigation_module["main-navigation__organization-link--current"]
967
+ ),
968
+ ariaCurrent: organization.current ? "page" : void 0,
969
+ children: organization.label
970
+ }) }, organization.label))
971
+ }
972
+ ),
973
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: MainNavigation_module["main-navigation__navbar"], children: [
974
+ renderUtilityLink({
975
+ href: MainNavigation_utils.toNavigableHref(logoHref),
976
+ className: cn.cn(MainNavigation_module["main-navigation__logo"], focus_module.default.focusable),
977
+ "aria-label": logoAriaLabel,
978
+ children: /* @__PURE__ */ jsxRuntime.jsx("img", { src: defaultLogoSrc, alt: "", "aria-hidden": "true" })
979
+ }),
980
+ /* @__PURE__ */ jsxRuntime.jsxs(
981
+ "nav",
982
+ {
983
+ ref: mobilePrimaryNavRef,
984
+ "aria-label": mobileMenuOpen ? mobilePrimaryNavigationAriaLabel : ariaLabel,
985
+ "data-open": mobileMenuOpen ? "true" : "false",
986
+ className: cn.cn(
987
+ MainNavigation_module["main-navigation__primary"],
988
+ mobileMenuOpen && MainNavigation_module["main-navigation__primary--open"]
989
+ ),
990
+ children: [
991
+ renderPrimaryList(),
992
+ (mobileMenuOpen || isMobileMenuClosing) && renderPanel(
993
+ cn.cn(
994
+ MainNavigation_module["main-navigation__panel"],
995
+ MainNavigation_module["main-navigation__panel--mobile"]
996
+ ),
997
+ true
998
+ )
999
+ ]
1000
+ }
1001
+ ),
1002
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: MainNavigation_module["main-navigation__icon-nav"], children: [
1003
+ showLanguageSelector && /* @__PURE__ */ jsxRuntime.jsxs(
1004
+ "button",
1005
+ {
1006
+ type: "button",
1007
+ className: cn.cn(
1008
+ MainNavigation_module["main-navigation__icon-nav-item"],
1009
+ focus_module.default.focusableInset
1010
+ ),
1011
+ "aria-label": languageSelectorLabel,
1012
+ onClick: onLanguageSelectorClick,
1013
+ children: [
1014
+ /* @__PURE__ */ jsxRuntime.jsx(icons.Globe, {}),
1015
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: MainNavigation_module["main-navigation__icon-nav-label"], children: languageSelectorLabel })
1016
+ ]
1017
+ }
1018
+ ),
1019
+ showSearch && /* @__PURE__ */ jsxRuntime.jsxs(
1020
+ "button",
1021
+ {
1022
+ type: "button",
1023
+ className: cn.cn(
1024
+ MainNavigation_module["main-navigation__icon-nav-item"],
1025
+ focus_module.default.focusableInset
1026
+ ),
1027
+ "aria-label": searchLabel,
1028
+ onClick: onSearchClick,
1029
+ children: [
1030
+ /* @__PURE__ */ jsxRuntime.jsx(icons.Search, {}),
1031
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: MainNavigation_module["main-navigation__icon-nav-label"], children: searchLabel })
1032
+ ]
1033
+ }
1034
+ ),
1035
+ showCart && /* @__PURE__ */ jsxRuntime.jsxs(
1036
+ "button",
1037
+ {
1038
+ type: "button",
1039
+ className: cn.cn(
1040
+ MainNavigation_module["main-navigation__icon-nav-item"],
1041
+ focus_module.default.focusableInset
1042
+ ),
1043
+ "aria-label": cartAccessibleLabel,
1044
+ onClick: onCartClick,
1045
+ children: [
1046
+ /* @__PURE__ */ jsxRuntime.jsx(icons.Cart, {}),
1047
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: MainNavigation_module["main-navigation__icon-nav-label"], children: cartLabel }),
1048
+ cartCounter != null && /* @__PURE__ */ jsxRuntime.jsx(
1049
+ "span",
1050
+ {
1051
+ "aria-hidden": "true",
1052
+ className: MainNavigation_module["main-navigation__icon-nav-item--counter"],
1053
+ children: cartCounter
1054
+ }
1055
+ )
1056
+ ]
1057
+ }
1058
+ ),
1059
+ /* @__PURE__ */ jsxRuntime.jsx(
1060
+ Button.Button,
1061
+ {
1062
+ href: MainNavigation_utils.toNavigableHref(loginHref),
1063
+ size: "small",
1064
+ renderLink: renderUtilityLink,
1065
+ children: loginLabel
1066
+ }
1067
+ )
1068
+ ] }),
1069
+ /* @__PURE__ */ jsxRuntime.jsx(
1070
+ "button",
1071
+ {
1072
+ ref: mobileMenuToggleButtonRef,
1073
+ type: "button",
1074
+ className: cn.cn(
1075
+ MainNavigation_module["main-navigation__menu-toggle"],
1076
+ mobileMenuOpen && MainNavigation_module["main-navigation__menu-toggle--open"],
1077
+ focus_module.default.focusableInset
1078
+ ),
1079
+ "aria-label": mobileMenuOpen ? mobileMenuCloseAriaLabel : mobileMenuOpenAriaLabel,
1080
+ "aria-expanded": mobileMenuOpen,
1081
+ onClick: toggleMobileMenu,
1082
+ children: mobileMenuOpen ? /* @__PURE__ */ jsxRuntime.jsx(icons.Close, { size: "32px" }) : /* @__PURE__ */ jsxRuntime.jsx(icons.Menu, { size: "32px" })
1083
+ }
1084
+ )
1085
+ ] }),
1086
+ !mobileMenuOpen && renderPanel(
1087
+ cn.cn(MainNavigation_module["main-navigation__panel"], MainNavigation_module["main-navigation__panel--desktop"])
1088
+ )
1089
+ ]
1090
+ }
1091
+ );
1092
+ };
1093
+ exports.MainNavigation = MainNavigation;
1094
+ //# sourceMappingURL=MainNavigation.cjs.map