@dnanpm/ui-components 0.9.0 → 0.10.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 (240) hide show
  1. package/README.md +13 -0
  2. package/dist/components/Accordion/Accordion.css +5 -1
  3. package/dist/components/AccordionItem/AccordionItem.cjs +4 -4
  4. package/dist/components/AccordionItem/AccordionItem.cjs.map +1 -1
  5. package/dist/components/AccordionItem/AccordionItem.css +4 -1
  6. package/dist/components/AccordionItem/AccordionItem.d.ts.map +1 -1
  7. package/dist/components/AccordionItem/AccordionItem.js +2 -2
  8. package/dist/components/AccordionItem/AccordionItem.js.map +1 -1
  9. package/dist/components/Avatar/Avatar.cjs +83 -0
  10. package/dist/components/Avatar/Avatar.cjs.map +1 -0
  11. package/dist/components/Avatar/Avatar.css +188 -0
  12. package/dist/components/Avatar/Avatar.d.ts +3 -0
  13. package/dist/components/Avatar/Avatar.d.ts.map +1 -0
  14. package/dist/components/Avatar/Avatar.js +83 -0
  15. package/dist/components/Avatar/Avatar.js.map +1 -0
  16. package/dist/components/Avatar/Avatar.module.css.cjs +40 -0
  17. package/dist/components/Avatar/Avatar.module.css.cjs.map +1 -0
  18. package/dist/components/Avatar/Avatar.module.css.js +40 -0
  19. package/dist/components/Avatar/Avatar.module.css.js.map +1 -0
  20. package/dist/components/Avatar/Avatar.types.d.ts +66 -0
  21. package/dist/components/Avatar/Avatar.types.d.ts.map +1 -0
  22. package/dist/components/Avatar/Avatar.utils.cjs +17 -0
  23. package/dist/components/Avatar/Avatar.utils.cjs.map +1 -0
  24. package/dist/components/Avatar/Avatar.utils.d.ts +6 -0
  25. package/dist/components/Avatar/Avatar.utils.d.ts.map +1 -0
  26. package/dist/components/Avatar/Avatar.utils.js +17 -0
  27. package/dist/components/Avatar/Avatar.utils.js.map +1 -0
  28. package/dist/components/Avatar/index.d.ts +3 -0
  29. package/dist/components/Avatar/index.d.ts.map +1 -0
  30. package/dist/components/Breadcrumb/Breadcrumb.cjs +9 -12
  31. package/dist/components/Breadcrumb/Breadcrumb.cjs.map +1 -1
  32. package/dist/components/Breadcrumb/Breadcrumb.css +16 -16
  33. package/dist/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  34. package/dist/components/Breadcrumb/Breadcrumb.js +2 -5
  35. package/dist/components/Breadcrumb/Breadcrumb.js.map +1 -1
  36. package/dist/components/Breadcrumb/Breadcrumb.module.css.cjs +5 -8
  37. package/dist/components/Breadcrumb/Breadcrumb.module.css.cjs.map +1 -1
  38. package/dist/components/Breadcrumb/Breadcrumb.module.css.js +5 -8
  39. package/dist/components/Breadcrumb/Breadcrumb.module.css.js.map +1 -1
  40. package/dist/components/Button/Button.cjs +29 -3
  41. package/dist/components/Button/Button.cjs.map +1 -1
  42. package/dist/components/Button/Button.css +78 -31
  43. package/dist/components/Button/Button.d.ts +1 -1
  44. package/dist/components/Button/Button.d.ts.map +1 -1
  45. package/dist/components/Button/Button.js +28 -2
  46. package/dist/components/Button/Button.js.map +1 -1
  47. package/dist/components/Button/Button.module.css.cjs +19 -11
  48. package/dist/components/Button/Button.module.css.cjs.map +1 -1
  49. package/dist/components/Button/Button.module.css.js +19 -11
  50. package/dist/components/Button/Button.module.css.js.map +1 -1
  51. package/dist/components/Button/Button.types.d.ts +20 -3
  52. package/dist/components/Button/Button.types.d.ts.map +1 -1
  53. package/dist/components/Button/index.d.ts +1 -1
  54. package/dist/components/Button/index.d.ts.map +1 -1
  55. package/dist/components/ButtonCard/ButtonCard.cjs +19 -14
  56. package/dist/components/ButtonCard/ButtonCard.cjs.map +1 -1
  57. package/dist/components/ButtonCard/ButtonCard.css +63 -20
  58. package/dist/components/ButtonCard/ButtonCard.d.ts +2 -1
  59. package/dist/components/ButtonCard/ButtonCard.d.ts.map +1 -1
  60. package/dist/components/ButtonCard/ButtonCard.js +17 -12
  61. package/dist/components/ButtonCard/ButtonCard.js.map +1 -1
  62. package/dist/components/ButtonCard/ButtonCard.module.css.cjs +14 -12
  63. package/dist/components/ButtonCard/ButtonCard.module.css.cjs.map +1 -1
  64. package/dist/components/ButtonCard/ButtonCard.module.css.js +14 -12
  65. package/dist/components/ButtonCard/ButtonCard.module.css.js.map +1 -1
  66. package/dist/components/ButtonCard/ButtonCard.types.d.ts +3 -2
  67. package/dist/components/ButtonCard/ButtonCard.types.d.ts.map +1 -1
  68. package/dist/components/Checkbox/Checkbox.cjs +105 -0
  69. package/dist/components/Checkbox/Checkbox.cjs.map +1 -0
  70. package/dist/components/Checkbox/Checkbox.css +323 -0
  71. package/dist/components/Checkbox/Checkbox.d.ts +3 -0
  72. package/dist/components/Checkbox/Checkbox.d.ts.map +1 -0
  73. package/dist/components/Checkbox/Checkbox.js +105 -0
  74. package/dist/components/Checkbox/Checkbox.js.map +1 -0
  75. package/dist/components/Checkbox/Checkbox.module.css.cjs +35 -0
  76. package/dist/components/Checkbox/Checkbox.module.css.cjs.map +1 -0
  77. package/dist/components/Checkbox/Checkbox.module.css.js +35 -0
  78. package/dist/components/Checkbox/Checkbox.module.css.js.map +1 -0
  79. package/dist/components/Checkbox/Checkbox.types.d.ts +47 -0
  80. package/dist/components/Checkbox/Checkbox.types.d.ts.map +1 -0
  81. package/dist/components/Checkbox/index.d.ts +3 -0
  82. package/dist/components/Checkbox/index.d.ts.map +1 -0
  83. package/dist/components/ContentCard/ContentCard.cjs +8 -7
  84. package/dist/components/ContentCard/ContentCard.cjs.map +1 -1
  85. package/dist/components/ContentCard/ContentCard.css +39 -34
  86. package/dist/components/ContentCard/ContentCard.d.ts.map +1 -1
  87. package/dist/components/ContentCard/ContentCard.js +3 -2
  88. package/dist/components/ContentCard/ContentCard.js.map +1 -1
  89. package/dist/components/ContentCard/ContentCard.module.css.cjs +18 -18
  90. package/dist/components/ContentCard/ContentCard.module.css.js +18 -18
  91. package/dist/components/ContentCard/ContentCard.types.d.ts +2 -1
  92. package/dist/components/ContentCard/ContentCard.types.d.ts.map +1 -1
  93. package/dist/components/Drawer/Drawer.cjs +15 -7
  94. package/dist/components/Drawer/Drawer.cjs.map +1 -1
  95. package/dist/components/Drawer/Drawer.css +48 -45
  96. package/dist/components/Drawer/Drawer.d.ts.map +1 -1
  97. package/dist/components/Drawer/Drawer.js +12 -4
  98. package/dist/components/Drawer/Drawer.js.map +1 -1
  99. package/dist/components/Drawer/Drawer.module.css.cjs +16 -16
  100. package/dist/components/Drawer/Drawer.module.css.js +16 -16
  101. package/dist/components/Footer/Footer.cjs +8 -9
  102. package/dist/components/Footer/Footer.cjs.map +1 -1
  103. package/dist/components/Footer/Footer.css +87 -83
  104. package/dist/components/Footer/Footer.d.ts.map +1 -1
  105. package/dist/components/Footer/Footer.js +1 -2
  106. package/dist/components/Footer/Footer.js.map +1 -1
  107. package/dist/components/Footer/Footer.module.css.cjs +39 -39
  108. package/dist/components/Footer/Footer.module.css.js +39 -39
  109. package/dist/components/FunctionButton/FunctionButton.cjs +2 -2
  110. package/dist/components/FunctionButton/FunctionButton.cjs.map +1 -1
  111. package/dist/components/FunctionButton/FunctionButton.css +5 -1
  112. package/dist/components/FunctionButton/FunctionButton.js +1 -1
  113. package/dist/components/FunctionButton/FunctionButton.js.map +1 -1
  114. package/dist/components/Hero/Hero.cjs +30 -27
  115. package/dist/components/Hero/Hero.cjs.map +1 -1
  116. package/dist/components/Hero/Hero.css +49 -44
  117. package/dist/components/Hero/Hero.d.ts +1 -1
  118. package/dist/components/Hero/Hero.d.ts.map +1 -1
  119. package/dist/components/Hero/Hero.js +30 -27
  120. package/dist/components/Hero/Hero.js.map +1 -1
  121. package/dist/components/Hero/Hero.module.css.cjs +18 -18
  122. package/dist/components/Hero/Hero.module.css.js +18 -18
  123. package/dist/components/Hero/Hero.types.d.ts +2 -6
  124. package/dist/components/Hero/Hero.types.d.ts.map +1 -1
  125. package/dist/components/IconButton/IconButton.cjs +3 -4
  126. package/dist/components/IconButton/IconButton.cjs.map +1 -1
  127. package/dist/components/IconButton/IconButton.css +5 -1
  128. package/dist/components/IconButton/IconButton.d.ts.map +1 -1
  129. package/dist/components/IconButton/IconButton.js +1 -2
  130. package/dist/components/IconButton/IconButton.js.map +1 -1
  131. package/dist/components/Label/Label.css +5 -1
  132. package/dist/components/MainNavigation/MainNavigation.cjs +216 -162
  133. package/dist/components/MainNavigation/MainNavigation.cjs.map +1 -1
  134. package/dist/components/MainNavigation/MainNavigation.css +206 -183
  135. package/dist/components/MainNavigation/MainNavigation.d.ts +1 -1
  136. package/dist/components/MainNavigation/MainNavigation.d.ts.map +1 -1
  137. package/dist/components/MainNavigation/MainNavigation.js +177 -123
  138. package/dist/components/MainNavigation/MainNavigation.js.map +1 -1
  139. package/dist/components/MainNavigation/MainNavigation.module.css.cjs +80 -78
  140. package/dist/components/MainNavigation/MainNavigation.module.css.cjs.map +1 -1
  141. package/dist/components/MainNavigation/MainNavigation.module.css.js +80 -78
  142. package/dist/components/MainNavigation/MainNavigation.module.css.js.map +1 -1
  143. package/dist/components/MainNavigation/MainNavigation.types.d.ts +0 -13
  144. package/dist/components/MainNavigation/MainNavigation.types.d.ts.map +1 -1
  145. package/dist/components/MainNavigation/MainNavigation.utils.cjs +8 -4
  146. package/dist/components/MainNavigation/MainNavigation.utils.cjs.map +1 -1
  147. package/dist/components/MainNavigation/MainNavigation.utils.d.ts +1 -0
  148. package/dist/components/MainNavigation/MainNavigation.utils.d.ts.map +1 -1
  149. package/dist/components/MainNavigation/MainNavigation.utils.js +8 -4
  150. package/dist/components/MainNavigation/MainNavigation.utils.js.map +1 -1
  151. package/dist/components/Modal/Modal.cjs +14 -6
  152. package/dist/components/Modal/Modal.cjs.map +1 -1
  153. package/dist/components/Modal/Modal.css +44 -40
  154. package/dist/components/Modal/Modal.d.ts.map +1 -1
  155. package/dist/components/Modal/Modal.js +12 -4
  156. package/dist/components/Modal/Modal.js.map +1 -1
  157. package/dist/components/Modal/Modal.module.css.cjs +18 -18
  158. package/dist/components/Modal/Modal.module.css.js +18 -18
  159. package/dist/components/Notification/Notification.cjs +3 -2
  160. package/dist/components/Notification/Notification.cjs.map +1 -1
  161. package/dist/components/Notification/Notification.css +16 -11
  162. package/dist/components/Notification/Notification.d.ts.map +1 -1
  163. package/dist/components/Notification/Notification.js +2 -1
  164. package/dist/components/Notification/Notification.js.map +1 -1
  165. package/dist/components/Notification/Notification.module.css.cjs +9 -9
  166. package/dist/components/Notification/Notification.module.css.js +9 -9
  167. package/dist/components/Pagination/Pagination.cjs +142 -0
  168. package/dist/components/Pagination/Pagination.cjs.map +1 -0
  169. package/dist/components/Pagination/Pagination.css +256 -0
  170. package/dist/components/Pagination/Pagination.d.ts +3 -0
  171. package/dist/components/Pagination/Pagination.d.ts.map +1 -0
  172. package/dist/components/Pagination/Pagination.js +142 -0
  173. package/dist/components/Pagination/Pagination.js.map +1 -0
  174. package/dist/components/Pagination/Pagination.module.css.cjs +34 -0
  175. package/dist/components/Pagination/Pagination.module.css.cjs.map +1 -0
  176. package/dist/components/Pagination/Pagination.module.css.js +34 -0
  177. package/dist/components/Pagination/Pagination.module.css.js.map +1 -0
  178. package/dist/components/Pagination/Pagination.types.d.ts +20 -0
  179. package/dist/components/Pagination/Pagination.types.d.ts.map +1 -0
  180. package/dist/components/Pagination/Pagination.utils.cjs +76 -0
  181. package/dist/components/Pagination/Pagination.utils.cjs.map +1 -0
  182. package/dist/components/Pagination/Pagination.utils.d.ts +21 -0
  183. package/dist/components/Pagination/Pagination.utils.d.ts.map +1 -0
  184. package/dist/components/Pagination/Pagination.utils.js +76 -0
  185. package/dist/components/Pagination/Pagination.utils.js.map +1 -0
  186. package/dist/components/Pagination/index.d.ts +3 -0
  187. package/dist/components/Pagination/index.d.ts.map +1 -0
  188. package/dist/components/Pictograph/Pictograph.css +5 -1
  189. package/dist/components/Pictograph/PictographItem.css +5 -1
  190. package/dist/components/Quote/Quote.css +5 -1
  191. package/dist/components/Spinner/Spinner.css +5 -1
  192. package/dist/design-tokens/dist/tokens.cjs +5 -0
  193. package/dist/design-tokens/dist/tokens.cjs.map +1 -0
  194. package/dist/design-tokens/dist/tokens.js +5 -0
  195. package/dist/design-tokens/dist/tokens.js.map +1 -0
  196. package/dist/index.cjs +6 -0
  197. package/dist/index.cjs.map +1 -1
  198. package/dist/index.d.ts +7 -1
  199. package/dist/index.d.ts.map +1 -1
  200. package/dist/index.js +6 -0
  201. package/dist/index.js.map +1 -1
  202. package/dist/styles/utilities.css +6 -0
  203. package/dist/styles/utils/elevation.css +35 -26
  204. package/dist/styles/utils/focus.css +63 -68
  205. package/dist/styles/utils/index.cjs +33 -0
  206. package/dist/styles/utils/index.cjs.map +1 -0
  207. package/dist/styles/utils/index.d.ts +20 -0
  208. package/dist/styles/utils/index.d.ts.map +1 -0
  209. package/dist/styles/utils/index.js +33 -0
  210. package/dist/styles/utils/index.js.map +1 -0
  211. package/dist/styles/utils/overlay.css +35 -27
  212. package/dist/styles/utils/text-decoration.css +20 -12
  213. package/dist/styles.css +27 -3
  214. package/dist/utils/index.d.ts +1 -0
  215. package/dist/utils/index.d.ts.map +1 -1
  216. package/dist/utils/isRenderable/index.d.ts +2 -0
  217. package/dist/utils/isRenderable/index.d.ts.map +1 -0
  218. package/dist/utils/isRenderable/isRenderable.cjs +5 -0
  219. package/dist/utils/isRenderable/isRenderable.cjs.map +1 -0
  220. package/dist/utils/isRenderable/isRenderable.d.ts +4 -0
  221. package/dist/utils/isRenderable/isRenderable.d.ts.map +1 -0
  222. package/dist/utils/isRenderable/isRenderable.js +5 -0
  223. package/dist/utils/isRenderable/isRenderable.js.map +1 -0
  224. package/package.json +12 -4
  225. package/dist/styles/utils/elevation.module.css.cjs +0 -16
  226. package/dist/styles/utils/elevation.module.css.cjs.map +0 -1
  227. package/dist/styles/utils/elevation.module.css.js +0 -16
  228. package/dist/styles/utils/elevation.module.css.js.map +0 -1
  229. package/dist/styles/utils/focus.module.css.cjs +0 -16
  230. package/dist/styles/utils/focus.module.css.cjs.map +0 -1
  231. package/dist/styles/utils/focus.module.css.js +0 -16
  232. package/dist/styles/utils/focus.module.css.js.map +0 -1
  233. package/dist/styles/utils/overlay.module.css.cjs +0 -13
  234. package/dist/styles/utils/overlay.module.css.cjs.map +0 -1
  235. package/dist/styles/utils/overlay.module.css.js +0 -13
  236. package/dist/styles/utils/overlay.module.css.js.map +0 -1
  237. package/dist/styles/utils/text-decoration.module.css.cjs +0 -13
  238. package/dist/styles/utils/text-decoration.module.css.cjs.map +0 -1
  239. package/dist/styles/utils/text-decoration.module.css.js +0 -13
  240. package/dist/styles/utils/text-decoration.module.css.js.map +0 -1
@@ -1,3 +1,3 @@
1
1
  import { MainNavigationProps } from './MainNavigation.types';
2
- export declare const MainNavigation: ({ organizations, items, loginLabel, logoHref, languages, renderLanguageLink, searchLabel, cartLabel, cartCounter, cartCounterLabel, defaultCartOpen, cartOpen, onCartOpenChange, defaultOpenDropdown, onSearchOpenChange, onLanguageOpenChange, onLoginOpenChange, searchDropdownContent, loginDropdownContent, cartContent, mobileMenuOpenAriaLabel, mobileMenuCloseAriaLabel, organizationStripAriaLabel, logoAriaLabel, mobilePrimaryNavigationAriaLabel, externalLinkAriaLabel, defaultMobileMenuOpen, defaultOpenItemIndex, currentPathname, overflowCategoryLabel, onMobileMenuToggle, onDesktopItemToggle, renderLink, className, "aria-label": ariaLabel, ref, ...props }: MainNavigationProps) => import("react/jsx-runtime").JSX.Element;
2
+ export declare const MainNavigation: ({ organizations, items, loginLabel, logoHref, languages, renderLanguageLink, searchLabel, cartLabel, cartCounter, cartCounterLabel, cartOpen, onCartOpenChange, onSearchOpenChange, onLanguageOpenChange, onLoginOpenChange, searchDropdownContent, loginDropdownContent, cartContent, mobileMenuOpenAriaLabel, mobileMenuCloseAriaLabel, organizationStripAriaLabel, logoAriaLabel, mobilePrimaryNavigationAriaLabel, externalLinkAriaLabel, currentPathname, overflowCategoryLabel, onMobileMenuToggle, onDesktopItemToggle, renderLink, className, "aria-label": ariaLabel, ref, ...props }: MainNavigationProps) => import("react/jsx-runtime").JSX.Element;
3
3
  //# sourceMappingURL=MainNavigation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MainNavigation.d.ts","sourceRoot":"","sources":["../../../src/components/MainNavigation/MainNavigation.tsx"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAMR,mBAAmB,EAEtB,MAAM,wBAAwB,CAAC;AAehC,eAAO,MAAM,cAAc,GAAI,mpBAsC5B,mBAAmB,4CA8sDrB,CAAC"}
1
+ {"version":3,"file":"MainNavigation.d.ts","sourceRoot":"","sources":["../../../src/components/MainNavigation/MainNavigation.tsx"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAMR,mBAAmB,EAEtB,MAAM,wBAAwB,CAAC;AAchC,eAAO,MAAM,cAAc,GAAI,gkBAkC5B,mBAAmB,4CA8zDrB,CAAC"}
@@ -1,12 +1,9 @@
1
1
  import { jsxs, jsx, Fragment as Fragment$1 } from "react/jsx-runtime";
2
- import { useState, useRef, useId, useCallback, useEffect, Fragment } from "react";
2
+ import { useState, useId, useRef, useCallback, useEffect, Fragment } from "react";
3
3
  import { Globe, Search, Cart, Close, Menu, ChevronRight, Open, ArrowRight } from "@dnanpm/icons";
4
- import focusStyles from "../../styles/utils/focus.module.css.js";
5
- import overlayStyles from "../../styles/utils/overlay.module.css.js";
6
- import elevationStyles from "../../styles/utils/elevation.module.css.js";
7
- import textDecorationStyles from "../../styles/utils/text-decoration.module.css.js";
4
+ import { focusStyles, textDecorationStyles, elevationStyles, overlayStyles } from "../../styles/utils/index.js";
8
5
  import styles from "./MainNavigation.module.css.js";
9
- import { assignRef, isMobileViewportByEnvironment, isMobileIosDeviceByEnvironment, isDesktopViewportByEnvironment, getLinkTarget, getLinkRel, toNavigableHref, isExternalLink, getLanguageToggleAnnouncements, languageLinkAriaLabels, isItemInCurrentPath, isExternalTarget, isLinkInCurrentPage } from "./MainNavigation.utils.js";
6
+ import { assignRef, desktopMinWidthMediaQuery, isMobileViewportByEnvironment, isMobileIosDeviceByEnvironment, isDesktopViewportByEnvironment, getLinkTarget, getLinkRel, toNavigableHref, isExternalLink, getLanguageToggleAnnouncements, languageLinkAriaLabels, isItemInCurrentPath, isExternalTarget, isLinkInCurrentPath, isLinkInCurrentPage } from "./MainNavigation.utils.js";
10
7
  import { cn } from "../../utils/cn/cn.js";
11
8
  import { Button } from "../Button/Button.js";
12
9
  import { Drawer } from "../Drawer/Drawer.js";
@@ -18,7 +15,6 @@ const defaultLogoSrc = `data:image/svg+xml,${encodeURIComponent(defaultLogoSvg)}
18
15
  const mobilePanelAnimationDurationMs = 200;
19
16
  const mobileBodyScrollLockClass = "dds-un-scrollable";
20
17
  const defaultOverflowCategoryLabel = "Muut kategoriat";
21
- const desktopMinWidthMediaQuery = "(min-width: 1024px)";
22
18
  const defaultRenderLink = (props) => /* @__PURE__ */ jsx("a", { ...props });
23
19
  const defaultRenderLanguageLink = (props) => /* @__PURE__ */ jsx("a", { ...props });
24
20
  const MainNavigation = ({
@@ -32,10 +28,8 @@ const MainNavigation = ({
32
28
  cartLabel = "Ostoskori",
33
29
  cartCounter,
34
30
  cartCounterLabel = "tuotetta ostoskorissa",
35
- defaultCartOpen = false,
36
31
  cartOpen,
37
32
  onCartOpenChange,
38
- defaultOpenDropdown,
39
33
  onSearchOpenChange,
40
34
  onLanguageOpenChange,
41
35
  onLoginOpenChange,
@@ -48,8 +42,6 @@ const MainNavigation = ({
48
42
  logoAriaLabel = "Siirry etusivulle",
49
43
  mobilePrimaryNavigationAriaLabel = "Päävalikko",
50
44
  externalLinkAriaLabel = "avautuu uuteen välilehteen",
51
- defaultMobileMenuOpen = false,
52
- defaultOpenItemIndex = null,
53
45
  currentPathname,
54
46
  overflowCategoryLabel = defaultOverflowCategoryLabel,
55
47
  onMobileMenuToggle,
@@ -60,19 +52,21 @@ const MainNavigation = ({
60
52
  ref,
61
53
  ...props
62
54
  }) => {
63
- const [mobileMenuOpen, setMobileMenuOpen] = useState(defaultMobileMenuOpen);
55
+ const isCartControlled = cartOpen !== void 0;
56
+ const showSearch = searchDropdownContent != null && typeof searchDropdownContent !== "boolean";
57
+ const showLogin = loginDropdownContent != null && typeof loginDropdownContent !== "boolean";
58
+ const showCart = cartContent != null && typeof cartContent !== "boolean";
59
+ const currentLanguage = languages?.find((language) => language.current) ?? languages?.[0];
60
+ const alternativeLanguages = currentLanguage != null ? (languages ?? []).filter((language) => language.code !== currentLanguage.code) : [];
61
+ const showLanguage = currentLanguage != null && alternativeLanguages.length > 0;
62
+ const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
64
63
  const [isMobileMenuClosing, setIsMobileMenuClosing] = useState(false);
65
- const [openTopLevelItemIndex, setOpenTopLevelItemIndex] = useState(
66
- defaultOpenItemIndex
67
- );
64
+ const [openTopLevelItemIndex, setOpenTopLevelItemIndex] = useState(null);
68
65
  const [isHeaderOpen, setIsHeaderOpen] = useState(true);
69
66
  const [mobileActiveCategoryIndex, setMobileActiveCategoryIndex] = useState(null);
70
- const [internalCartOpen, setInternalCartOpen] = useState(defaultCartOpen);
71
- const isCartControlled = cartOpen !== void 0;
67
+ const [internalCartOpen, setInternalCartOpen] = useState(false);
72
68
  const isCartOpen = cartOpen ?? internalCartOpen;
73
- const hasInitialNavigationSurface = (cartOpen ?? defaultCartOpen) || defaultMobileMenuOpen || defaultOpenItemIndex != null && items[defaultOpenItemIndex]?.panel != null;
74
- const [openUtilityDropdown, setOpenUtilityDropdown] = useState(hasInitialNavigationSurface ? null : defaultOpenDropdown ?? null);
75
- const openUtilityDropdownRef = useRef(openUtilityDropdown);
69
+ const [openUtilityDropdown, setOpenUtilityDropdown] = useState(null);
76
70
  const searchDropdownId = useId();
77
71
  const languageDropdownId = useId();
78
72
  const loginDropdownId = useId();
@@ -107,10 +101,14 @@ const MainNavigation = ({
107
101
  const focusReturnToMobileCategoryTimeoutRef = useRef(
108
102
  null
109
103
  );
110
- const mobileMenuOpenRef = useRef(mobileMenuOpen);
111
- const openTopLevelItemIndexRef = useRef(openTopLevelItemIndex);
112
- const lastAppliedViewportModeRef = useRef(null);
113
- const internalCartOpenRef = useRef(internalCartOpen);
104
+ const notifyRef = useRef({
105
+ mobileMenu: false,
106
+ desktopItem: null,
107
+ search: false,
108
+ language: false,
109
+ login: false,
110
+ cart: false
111
+ });
114
112
  const setHeaderRef = useCallback(
115
113
  (node) => {
116
114
  headerElementRef.current = node;
@@ -253,12 +251,7 @@ const MainNavigation = ({
253
251
  return;
254
252
  }
255
253
  const desktopQuery = window.matchMedia(desktopMinWidthMediaQuery);
256
- const applyViewportModeChange = ({ matches: isDesktopViewport2 }) => {
257
- const viewportMode = isDesktopViewport2 ? "desktop" : "mobile";
258
- if (lastAppliedViewportModeRef.current === viewportMode) {
259
- return;
260
- }
261
- lastAppliedViewportModeRef.current = viewportMode;
254
+ const handleViewportModeChange = ({ matches: isDesktopViewport2 }) => {
262
255
  if (isDesktopViewport2) {
263
256
  clearTimeout(mobileSecondPanelCloseTimeoutRef.current ?? void 0);
264
257
  mobileSecondPanelCloseTimeoutRef.current = null;
@@ -266,9 +259,8 @@ const MainNavigation = ({
266
259
  mobileThirdPanelCloseTimeoutRef.current = null;
267
260
  clearTimeout(resetMobileThirdPanelScrollTimeoutRef.current ?? void 0);
268
261
  resetMobileThirdPanelScrollTimeoutRef.current = null;
269
- const wasMobileMenuOpen = mobileMenuOpenRef.current;
270
- mobileMenuOpenRef.current = false;
271
- if (wasMobileMenuOpen) {
262
+ if (notifyRef.current.mobileMenu) {
263
+ notifyRef.current.mobileMenu = false;
272
264
  onMobileMenuToggle?.(false);
273
265
  }
274
266
  setMobileMenuOpen(false);
@@ -277,21 +269,18 @@ const MainNavigation = ({
277
269
  setIsMobileThirdPanelClosing(false);
278
270
  return;
279
271
  }
280
- const hadOpenDesktopItem = openTopLevelItemIndexRef.current !== null;
281
- openTopLevelItemIndexRef.current = null;
282
- if (hadOpenDesktopItem) {
272
+ if (notifyRef.current.desktopItem !== null) {
273
+ notifyRef.current.desktopItem = null;
283
274
  onDesktopItemToggle?.(null);
284
275
  }
285
276
  setOpenTopLevelItemIndex(null);
286
277
  };
287
- applyViewportModeChange(desktopQuery);
288
- desktopQuery.addEventListener("change", applyViewportModeChange);
278
+ desktopQuery.addEventListener("change", handleViewportModeChange);
289
279
  return () => {
290
- desktopQuery.removeEventListener("change", applyViewportModeChange);
280
+ desktopQuery.removeEventListener("change", handleViewportModeChange);
291
281
  };
292
282
  }, [onDesktopItemToggle, onMobileMenuToggle]);
293
283
  const resetMobilePanelState = useCallback(() => {
294
- openTopLevelItemIndexRef.current = null;
295
284
  setOpenTopLevelItemIndex(null);
296
285
  setMobileActiveCategoryIndex(null);
297
286
  setIsMobileSecondPanelClosing(false);
@@ -308,14 +297,12 @@ const MainNavigation = ({
308
297
  return;
309
298
  }
310
299
  const shouldAnimateMobileClose = mobileMenuOpen;
311
- const wasMobileMenuOpen = mobileMenuOpenRef.current;
312
- const openDesktopItemIndex = openTopLevelItemIndexRef.current;
313
- mobileMenuOpenRef.current = false;
314
- openTopLevelItemIndexRef.current = null;
315
- if (wasMobileMenuOpen) {
300
+ if (mobileMenuOpen) {
301
+ notifyRef.current.mobileMenu = false;
316
302
  onMobileMenuToggle?.(false);
317
303
  }
318
- if (openDesktopItemIndex !== null) {
304
+ if (openTopLevelItemIndex !== null) {
305
+ notifyRef.current.desktopItem = null;
319
306
  onDesktopItemToggle?.(null);
320
307
  }
321
308
  clearTimeout(mobileMenuCloseResetTimeoutRef.current ?? void 0);
@@ -345,7 +332,7 @@ const MainNavigation = ({
345
332
  return;
346
333
  }
347
334
  closeUtilityDropdown();
348
- mobileMenuOpenRef.current = true;
335
+ notifyRef.current.mobileMenu = true;
349
336
  setMobileMenuOpen(true);
350
337
  setIsMobileMenuClosing(false);
351
338
  onMobileMenuToggle?.(true);
@@ -353,7 +340,7 @@ const MainNavigation = ({
353
340
  const toggleTopLevelItem = (index) => {
354
341
  closeUtilityDropdown();
355
342
  const next = openTopLevelItemIndex === index ? null : index;
356
- openTopLevelItemIndexRef.current = next;
343
+ notifyRef.current.desktopItem = next;
357
344
  setOpenTopLevelItemIndex(next);
358
345
  setMobileActiveCategoryIndex(null);
359
346
  setIsMobileSecondPanelClosing(false);
@@ -483,9 +470,9 @@ const MainNavigation = ({
483
470
  [onLanguageOpenChange, onLoginOpenChange, onSearchOpenChange]
484
471
  );
485
472
  const closeUtilityDropdown = useCallback(() => {
486
- const openDropdown = openUtilityDropdownRef.current;
473
+ const openDropdown = notifyRef.current.search ? "search" : notifyRef.current.language ? "language" : notifyRef.current.login ? "login" : null;
487
474
  if (openDropdown != null) {
488
- openUtilityDropdownRef.current = null;
475
+ notifyRef.current[openDropdown] = false;
489
476
  notifyUtilityOpenChange(openDropdown, false);
490
477
  }
491
478
  setOpenUtilityDropdown(null);
@@ -497,17 +484,19 @@ const MainNavigation = ({
497
484
  mobileThirdPanelCloseTimeoutRef.current = null;
498
485
  clearTimeout(focusMobileSecondPanelTimeoutRef.current ?? void 0);
499
486
  focusMobileSecondPanelTimeoutRef.current = null;
487
+ focusMobilePanelBackOnOpenRef.current = false;
500
488
  clearTimeout(focusMobileThirdPanelTimeoutRef.current ?? void 0);
501
489
  focusMobileThirdPanelTimeoutRef.current = null;
490
+ focusMobileThirdPanelBackOnOpenRef.current = false;
502
491
  clearTimeout(resetMobileThirdPanelScrollTimeoutRef.current ?? void 0);
503
492
  resetMobileThirdPanelScrollTimeoutRef.current = null;
504
493
  clearTimeout(focusReturnToMobileTopLevelItemTimeoutRef.current ?? void 0);
505
494
  focusReturnToMobileTopLevelItemTimeoutRef.current = null;
506
495
  clearTimeout(focusReturnToMobileCategoryTimeoutRef.current ?? void 0);
507
496
  focusReturnToMobileCategoryTimeoutRef.current = null;
508
- const openDropdown = openUtilityDropdownRef.current;
497
+ const openDropdown = notifyRef.current.search ? "search" : notifyRef.current.language ? "language" : notifyRef.current.login ? "login" : null;
509
498
  if (openDropdown != null) {
510
- openUtilityDropdownRef.current = null;
499
+ notifyRef.current[openDropdown] = false;
511
500
  notifyUtilityOpenChange(openDropdown, false);
512
501
  }
513
502
  setOpenUtilityDropdown(null);
@@ -562,13 +551,7 @@ const MainNavigation = ({
562
551
  const openPanel = openItem?.panel;
563
552
  const isMobilePanelClosingOut = isMobileMenuClosing && !mobileMenuOpen;
564
553
  const isOverlayClosingOut = isMobilePanelClosingOut && openPanel == null;
565
- const showSearch = searchDropdownContent != null && typeof searchDropdownContent !== "boolean";
566
- const showLogin = loginDropdownContent != null && typeof loginDropdownContent !== "boolean";
567
- const showCart = cartContent != null && typeof cartContent !== "boolean";
568
554
  const cartAccessibleLabel = cartCounter != null ? `${cartLabel} ${cartCounter} ${cartCounterLabel}` : cartLabel;
569
- const currentLanguage = languages?.find((language) => language.current) ?? languages?.[0];
570
- const alternativeLanguages = currentLanguage != null ? (languages ?? []).filter((language) => language.code !== currentLanguage.code) : [];
571
- const showLanguage = currentLanguage != null && alternativeLanguages.length > 0;
572
555
  const languageAnnouncements = currentLanguage != null ? getLanguageToggleAnnouncements(
573
556
  (languages ?? []).map((language) => language.code),
574
557
  currentLanguage.code
@@ -577,25 +560,27 @@ const MainNavigation = ({
577
560
  const isSearchOpen = activeUtilityDropdown === "search";
578
561
  const isLanguageOpen = activeUtilityDropdown === "language";
579
562
  const isLoginOpen = activeUtilityDropdown === "login";
563
+ const effectiveCartOpen = isCartOpen && showCart;
580
564
  const showPageOverlay = mobileMenuOpen || openPanel != null || isMobilePanelClosingOut || activeUtilityDropdown != null;
581
565
  const toggleUtilityDropdown = (kind) => {
582
566
  const previous = openUtilityDropdown;
583
567
  const next = previous === kind ? null : kind;
584
568
  if (previous != null && previous !== next) {
569
+ notifyRef.current[previous] = false;
585
570
  notifyUtilityOpenChange(previous, false);
586
571
  }
587
572
  if (next != null) {
573
+ notifyRef.current[next] = true;
588
574
  notifyUtilityOpenChange(next, true);
589
575
  closeMobileMenu();
590
576
  if (isCartOpen) {
591
577
  if (!isCartControlled) {
592
- internalCartOpenRef.current = false;
578
+ notifyRef.current.cart = false;
593
579
  setInternalCartOpen(false);
594
580
  }
595
581
  onCartOpenChange?.(false);
596
582
  }
597
583
  }
598
- openUtilityDropdownRef.current = next;
599
584
  setOpenUtilityDropdown(next);
600
585
  };
601
586
  const handleLanguageClick = () => {
@@ -613,35 +598,85 @@ const MainNavigation = ({
613
598
  closeMenus();
614
599
  }
615
600
  if (!isCartControlled) {
616
- internalCartOpenRef.current = next;
601
+ notifyRef.current.cart = next && showCart;
617
602
  setInternalCartOpen(next);
618
603
  }
619
604
  onCartOpenChange?.(next);
620
605
  };
621
606
  const handleCartOpenChange = (open) => {
622
607
  if (!isCartControlled) {
623
- internalCartOpenRef.current = open;
608
+ notifyRef.current.cart = open && showCart;
624
609
  setInternalCartOpen(open);
625
610
  }
626
611
  onCartOpenChange?.(open);
627
612
  };
628
- useEffect(() => {
629
- if (isCartOpen) {
630
- closeMenus();
613
+ if (effectiveCartOpen) {
614
+ if (openUtilityDropdown !== null) {
615
+ setOpenUtilityDropdown(null);
616
+ }
617
+ if (mobileMenuOpen) {
618
+ setMobileMenuOpen(false);
619
+ }
620
+ if (isMobileMenuClosing) {
621
+ setIsMobileMenuClosing(false);
622
+ }
623
+ if (openTopLevelItemIndex !== null || mobileActiveCategoryIndex !== null || isMobileSecondPanelClosing || isMobileThirdPanelClosing) {
624
+ resetMobilePanelState();
631
625
  }
632
- }, [closeMenus, isCartOpen]);
626
+ } else if (openUtilityDropdown !== null && activeUtilityDropdown === null) {
627
+ setOpenUtilityDropdown(null);
628
+ }
629
+ if (!isCartControlled && internalCartOpen && !showCart) {
630
+ setInternalCartOpen(false);
631
+ }
633
632
  useEffect(() => {
634
- if (openUtilityDropdown != null && activeUtilityDropdown == null) {
635
- closeUtilityDropdown();
633
+ const lastNotified = notifyRef.current;
634
+ if (mobileMenuOpen !== lastNotified.mobileMenu) {
635
+ lastNotified.mobileMenu = mobileMenuOpen;
636
+ onMobileMenuToggle?.(mobileMenuOpen);
637
+ }
638
+ if (openTopLevelItemIndex !== lastNotified.desktopItem) {
639
+ lastNotified.desktopItem = openTopLevelItemIndex;
640
+ onDesktopItemToggle?.(openTopLevelItemIndex);
636
641
  }
637
- }, [activeUtilityDropdown, closeUtilityDropdown, openUtilityDropdown]);
642
+ ["search", "language", "login"].forEach((kind) => {
643
+ const open = activeUtilityDropdown === kind;
644
+ if (open !== lastNotified[kind]) {
645
+ lastNotified[kind] = open;
646
+ notifyUtilityOpenChange(kind, open);
647
+ }
648
+ });
649
+ if (!isCartControlled) {
650
+ const open = internalCartOpen && showCart;
651
+ if (open !== lastNotified.cart) {
652
+ lastNotified.cart = open;
653
+ onCartOpenChange?.(open);
654
+ }
655
+ }
656
+ });
638
657
  useEffect(() => {
639
- if (!showCart && !isCartControlled && internalCartOpen && internalCartOpenRef.current) {
640
- internalCartOpenRef.current = false;
641
- setInternalCartOpen(false);
642
- onCartOpenChange?.(false);
658
+ if (!effectiveCartOpen) {
659
+ return;
643
660
  }
644
- }, [internalCartOpen, isCartControlled, onCartOpenChange, showCart]);
661
+ clearTimeout(mobileSecondPanelCloseTimeoutRef.current ?? void 0);
662
+ mobileSecondPanelCloseTimeoutRef.current = null;
663
+ clearTimeout(mobileThirdPanelCloseTimeoutRef.current ?? void 0);
664
+ mobileThirdPanelCloseTimeoutRef.current = null;
665
+ clearTimeout(mobileMenuCloseResetTimeoutRef.current ?? void 0);
666
+ mobileMenuCloseResetTimeoutRef.current = null;
667
+ clearTimeout(focusMobileSecondPanelTimeoutRef.current ?? void 0);
668
+ focusMobileSecondPanelTimeoutRef.current = null;
669
+ focusMobilePanelBackOnOpenRef.current = false;
670
+ clearTimeout(focusMobileThirdPanelTimeoutRef.current ?? void 0);
671
+ focusMobileThirdPanelTimeoutRef.current = null;
672
+ focusMobileThirdPanelBackOnOpenRef.current = false;
673
+ clearTimeout(resetMobileThirdPanelScrollTimeoutRef.current ?? void 0);
674
+ resetMobileThirdPanelScrollTimeoutRef.current = null;
675
+ clearTimeout(focusReturnToMobileTopLevelItemTimeoutRef.current ?? void 0);
676
+ focusReturnToMobileTopLevelItemTimeoutRef.current = null;
677
+ clearTimeout(focusReturnToMobileCategoryTimeoutRef.current ?? void 0);
678
+ focusReturnToMobileCategoryTimeoutRef.current = null;
679
+ }, [effectiveCartOpen]);
645
680
  useEffect(() => {
646
681
  if (!showPageOverlay) {
647
682
  return;
@@ -749,7 +784,7 @@ const MainNavigation = ({
749
784
  closeTimeoutRef: mobileSecondPanelCloseTimeoutRef,
750
785
  onClosed: () => {
751
786
  const closedTopLevelItemIndex = openTopLevelItemIndex;
752
- openTopLevelItemIndexRef.current = null;
787
+ notifyRef.current.desktopItem = null;
753
788
  setOpenTopLevelItemIndex(null);
754
789
  setMobileActiveCategoryIndex(null);
755
790
  onDesktopItemToggle?.(null);
@@ -823,39 +858,49 @@ const MainNavigation = ({
823
858
  {
824
859
  className: styles["main-navigation__mobile-level-2-category-list"],
825
860
  "aria-hidden": shouldHideLevelTwoFromAssistiveTech || void 0,
826
- children: mobilePanelColumns.map((column, index) => /* @__PURE__ */ jsx(
827
- "li",
828
- {
829
- className: styles["main-navigation__mobile-level-2-category-item"],
830
- children: /* @__PURE__ */ jsxs(
831
- "button",
832
- {
833
- ref: (node) => {
834
- mobileLevelTwoCategoryButtonRefs.current[index] = node;
835
- },
836
- type: "button",
837
- className: cn(
838
- styles["main-navigation__mobile-level-2-category-button"],
839
- focusStyles.focusableInset
840
- ),
841
- onClick: () => openMobileCategoryPanel(index),
842
- onKeyDown: (event) => {
843
- if (event.key !== "Enter" || isDesktopViewport()) {
844
- return;
845
- }
846
- event.preventDefault();
847
- focusMobileThirdPanelBackOnOpenRef.current = true;
848
- openMobileCategoryPanel(index);
849
- },
850
- children: [
851
- /* @__PURE__ */ jsx("span", { children: getColumnHeading(column.heading, column.overflow) }),
852
- /* @__PURE__ */ jsx(ChevronRight, {})
853
- ]
854
- }
855
- )
856
- },
857
- `mobile-category-${column.heading}-${index}`
858
- ))
861
+ children: mobilePanelColumns.map((column, index) => {
862
+ const isInCurrentPath = column.links.some(
863
+ (link) => isLinkInCurrentPath(link, currentPathname)
864
+ );
865
+ return /* @__PURE__ */ jsx(
866
+ "li",
867
+ {
868
+ className: styles["main-navigation__mobile-level-2-category-item"],
869
+ children: /* @__PURE__ */ jsxs(
870
+ "button",
871
+ {
872
+ ref: (node) => {
873
+ mobileLevelTwoCategoryButtonRefs.current[index] = node;
874
+ },
875
+ type: "button",
876
+ className: cn(
877
+ styles["main-navigation__mobile-level-2-category-button"],
878
+ isInCurrentPath && styles["main-navigation__mobile-level-2-category-button--current"],
879
+ focusStyles.focusableInset
880
+ ),
881
+ "aria-current": isInCurrentPath ? "true" : void 0,
882
+ onClick: () => openMobileCategoryPanel(index),
883
+ onKeyDown: (event) => {
884
+ if (event.key !== "Enter" || isDesktopViewport()) {
885
+ return;
886
+ }
887
+ event.preventDefault();
888
+ focusMobileThirdPanelBackOnOpenRef.current = true;
889
+ openMobileCategoryPanel(index);
890
+ },
891
+ children: [
892
+ /* @__PURE__ */ jsx("span", { children: getColumnHeading(
893
+ column.heading,
894
+ column.overflow
895
+ ) }),
896
+ /* @__PURE__ */ jsx(ChevronRight, {})
897
+ ]
898
+ }
899
+ )
900
+ },
901
+ `mobile-category-${column.heading}-${index}`
902
+ );
903
+ })
859
904
  }
860
905
  ),
861
906
  /* @__PURE__ */ jsx(
@@ -910,21 +955,29 @@ const MainNavigation = ({
910
955
  ]
911
956
  }
912
957
  ),
913
- /* @__PURE__ */ jsx("ul", { className: styles["main-navigation__mobile-level-3-list"], children: selectedColumn.links.map((link, index) => /* @__PURE__ */ jsx(
914
- "li",
915
- {
916
- className: styles["main-navigation__mobile-level-3-item"],
917
- children: renderNavigationLink({
918
- link,
919
- className: cn(
920
- styles["main-navigation__mobile-level-3-link"],
921
- focusStyles.focusableInset
922
- ),
923
- children: link.label
924
- })
925
- },
926
- `${selectedColumn.heading}-${index}`
927
- )) })
958
+ /* @__PURE__ */ jsx("ul", { className: styles["main-navigation__mobile-level-3-list"], children: selectedColumn.links.map((link, index) => {
959
+ const isInCurrentPage = isLinkInCurrentPage(
960
+ link,
961
+ currentPathname
962
+ );
963
+ return /* @__PURE__ */ jsx(
964
+ "li",
965
+ {
966
+ className: styles["main-navigation__mobile-level-3-item"],
967
+ children: renderNavigationLink({
968
+ link,
969
+ className: cn(
970
+ styles["main-navigation__mobile-level-3-link"],
971
+ isInCurrentPage && styles["main-navigation__mobile-level-3-link--current"],
972
+ focusStyles.focusableInset
973
+ ),
974
+ ariaCurrent: isInCurrentPage ? "page" : void 0,
975
+ children: link.label
976
+ })
977
+ },
978
+ `${selectedColumn.heading}-${index}`
979
+ );
980
+ }) })
928
981
  ] })
929
982
  }
930
983
  )
@@ -1051,6 +1104,7 @@ const MainNavigation = ({
1051
1104
  isCurrentPathItem && styles["main-navigation__item-toggle--current"],
1052
1105
  isOpen && styles["main-navigation__item-toggle--open"]
1053
1106
  ),
1107
+ "aria-current": isCurrentPathItem ? "true" : void 0,
1054
1108
  "aria-expanded": isOpen,
1055
1109
  onClick: () => toggleTopLevelItem(index),
1056
1110
  onKeyDown: (event) => {