@telefonica/mistica 17.3.0 → 17.4.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 (334) hide show
  1. package/css/blau.css +24 -16
  2. package/css/esimflag.css +35 -18
  3. package/css/mistica.css +1 -1
  4. package/css/movistar.css +29 -18
  5. package/css/o2.css +26 -18
  6. package/css/telefonica.css +38 -18
  7. package/css/vivo-evolution.css +66 -20
  8. package/css/vivo.css +26 -18
  9. package/dist/accordion.css-mistica.js +10 -10
  10. package/dist/align.css-mistica.js +1 -1
  11. package/dist/autocomplete.css-mistica.js +4 -4
  12. package/dist/avatar.css-mistica.js +1 -1
  13. package/dist/badge.css-mistica.js +1 -1
  14. package/dist/box.css-mistica.js +13 -13
  15. package/dist/boxed.css-mistica.js +24 -24
  16. package/dist/boxed.d.ts +9 -0
  17. package/dist/boxed.js +18 -15
  18. package/dist/button-group.css-mistica.js +1 -1
  19. package/dist/button-layout.css-mistica.js +19 -19
  20. package/dist/button.css-mistica.js +50 -50
  21. package/dist/callout.css-mistica.js +13 -13
  22. package/dist/card-internal.css-mistica.js +22 -22
  23. package/dist/carousel.css-mistica.js +30 -30
  24. package/dist/checkbox.css-mistica.js +15 -15
  25. package/dist/chip.css-mistica.js +18 -18
  26. package/dist/circle.css-mistica.js +2 -2
  27. package/dist/community/advanced-data-card.css-mistica.js +19 -19
  28. package/dist/community/ai-card.css-mistica.js +12 -12
  29. package/dist/community/blocks.css-mistica.js +1 -1
  30. package/dist/community/cyber/example-component.css-mistica.js +1 -1
  31. package/dist/community/example-component.css-mistica.js +2 -2
  32. package/dist/community/skins/cyber-skin.js +19 -17
  33. package/dist/counter.css-mistica.js +6 -6
  34. package/dist/cover-hero.css-mistica.js +7 -7
  35. package/dist/credit-card-number-field.css-mistica.js +3 -3
  36. package/dist/date-field.css-mistica.js +1 -1
  37. package/dist/date-time-picker.css-mistica.js +1 -1
  38. package/dist/dialog.css-mistica.js +10 -10
  39. package/dist/divider.css-mistica.js +5 -5
  40. package/dist/double-field.css-mistica.js +2 -2
  41. package/dist/drawer.css-mistica.js +4 -4
  42. package/dist/empty-state-card.css-mistica.js +1 -1
  43. package/dist/empty-state.css-mistica.js +8 -8
  44. package/dist/fade-in.css-mistica.js +1 -1
  45. package/dist/feedback.css-mistica.js +5 -5
  46. package/dist/file-upload.css-mistica.js +10 -10
  47. package/dist/fixed-footer-layout.css-mistica.js +6 -6
  48. package/dist/form.css-mistica.js +1 -1
  49. package/dist/generated/mistica-icons/icon-panel-collapse-regular.js +165 -0
  50. package/dist/generated/mistica-icons/icon-panel-expand-regular.js +159 -0
  51. package/dist/grid-layout.css-mistica.js +3 -3
  52. package/dist/grid.css-mistica.js +120 -120
  53. package/dist/header.css-mistica.js +1 -1
  54. package/dist/hero.css-mistica.js +4 -4
  55. package/dist/horizontal-scroll.css-mistica.js +1 -1
  56. package/dist/icon-button.css-mistica.js +53 -53
  57. package/dist/icons/icon-chevron.css-mistica.js +2 -2
  58. package/dist/icons/icon-error.css-mistica.js +1 -1
  59. package/dist/image.css-mistica.js +8 -8
  60. package/dist/index.d.ts +5 -0
  61. package/dist/index.js +10 -1
  62. package/dist/inline.css-mistica.js +11 -11
  63. package/dist/list.css-mistica.js +40 -28
  64. package/dist/list.css.d.ts +2 -0
  65. package/dist/list.d.ts +3 -1
  66. package/dist/list.js +176 -165
  67. package/dist/loading-bar.css-mistica.js +1 -1
  68. package/dist/loading-screen.css-mistica.js +12 -12
  69. package/dist/logo.css-mistica.js +5 -5
  70. package/dist/menu.css-mistica.js +13 -13
  71. package/dist/mobile-navigation-menu.d.ts +26 -0
  72. package/dist/mobile-navigation-menu.js +145 -0
  73. package/dist/mosaic.css-mistica.js +1 -1
  74. package/dist/navigation-bar.css-mistica.js +31 -97
  75. package/dist/navigation-bar.css.d.ts +0 -24
  76. package/dist/navigation-bar.d.ts +3 -38
  77. package/dist/navigation-bar.js +399 -586
  78. package/dist/navigation-breadcrumbs.css-mistica.js +1 -1
  79. package/dist/navigation-shared.css-mistica.js +79 -0
  80. package/dist/navigation-shared.css.d.ts +26 -0
  81. package/dist/navigation-shared.d.ts +66 -0
  82. package/dist/navigation-shared.js +264 -0
  83. package/dist/package-version.js +1 -1
  84. package/dist/pagination.css-mistica.js +22 -22
  85. package/dist/pin-field.css-mistica.js +4 -4
  86. package/dist/popover.css-mistica.js +1 -1
  87. package/dist/portal.d.ts +1 -1
  88. package/dist/progress-bar.css-mistica.js +7 -7
  89. package/dist/radio-button.css-mistica.js +27 -27
  90. package/dist/rating.css-mistica.js +4 -4
  91. package/dist/responsive-layout.css-mistica.js +6 -6
  92. package/dist/screen-reader-only.css-mistica.js +1 -1
  93. package/dist/select.css-mistica.js +21 -21
  94. package/dist/sheet-action-row.css-mistica.js +1 -1
  95. package/dist/sheet-common.css-mistica.js +7 -7
  96. package/dist/sheet-info.css-mistica.js +1 -1
  97. package/dist/sidenav-bar-context.d.ts +25 -0
  98. package/dist/sidenav-bar-context.js +72 -0
  99. package/dist/sidenav-bar-data.d.ts +15 -0
  100. package/dist/sidenav-bar-data.js +38 -0
  101. package/dist/sidenav-bar-first-level-item.d.ts +42 -0
  102. package/dist/sidenav-bar-first-level-item.js +174 -0
  103. package/dist/sidenav-bar-keyboard.d.ts +13 -0
  104. package/dist/sidenav-bar-keyboard.js +314 -0
  105. package/dist/sidenav-bar-layout.css-mistica.js +28 -0
  106. package/dist/sidenav-bar-layout.css.d.ts +5 -0
  107. package/dist/sidenav-bar-layout.d.ts +22 -0
  108. package/dist/sidenav-bar-layout.js +103 -0
  109. package/dist/sidenav-bar-mobile.d.ts +24 -0
  110. package/dist/sidenav-bar-mobile.js +332 -0
  111. package/dist/sidenav-bar-motion.d.ts +32 -0
  112. package/dist/sidenav-bar-motion.js +84 -0
  113. package/dist/sidenav-bar-panel.d.ts +31 -0
  114. package/dist/sidenav-bar-panel.js +208 -0
  115. package/dist/sidenav-bar-row.d.ts +82 -0
  116. package/dist/sidenav-bar-row.js +230 -0
  117. package/dist/sidenav-bar-second-level-item.d.ts +43 -0
  118. package/dist/sidenav-bar-second-level-item.js +89 -0
  119. package/dist/sidenav-bar-section.d.ts +23 -0
  120. package/dist/sidenav-bar-section.js +167 -0
  121. package/dist/sidenav-bar-types.d.ts +192 -0
  122. package/dist/sidenav-bar-types.js +11 -0
  123. package/dist/sidenav-bar.css-mistica.js +325 -0
  124. package/dist/sidenav-bar.css.d.ts +93 -0
  125. package/dist/sidenav-bar.d.ts +102 -0
  126. package/dist/sidenav-bar.js +492 -0
  127. package/dist/skeletons.css-mistica.js +8 -8
  128. package/dist/skins/blau.js +12 -8
  129. package/dist/skins/esimflag.js +13 -9
  130. package/dist/skins/movistar.js +13 -9
  131. package/dist/skins/o2.js +13 -9
  132. package/dist/skins/skin-contract.css-mistica.js +735 -731
  133. package/dist/skins/skin-contract.css.d.ts +4 -0
  134. package/dist/skins/telefonica.js +13 -9
  135. package/dist/skins/types/colors.d.ts +2 -0
  136. package/dist/skins/vivo-evolution.js +14 -10
  137. package/dist/skins/vivo.js +13 -9
  138. package/dist/skip-link.css-mistica.js +2 -2
  139. package/dist/slider.css-mistica.js +24 -24
  140. package/dist/snackbar.css-mistica.js +14 -14
  141. package/dist/spinner.css-mistica.js +1 -1
  142. package/dist/square.css-mistica.js +1 -1
  143. package/dist/stack.css-mistica.js +5 -5
  144. package/dist/stacking-group.css-mistica.js +1 -1
  145. package/dist/stepper.css-mistica.js +9 -9
  146. package/dist/switch-component.css-mistica.js +48 -42
  147. package/dist/switch-component.css.d.ts +2 -0
  148. package/dist/switch-component.js +18 -18
  149. package/dist/table.css-mistica.js +9 -9
  150. package/dist/tabs.css-mistica.js +22 -22
  151. package/dist/tag.css-mistica.js +3 -3
  152. package/dist/text-field-base.css-mistica.js +19 -19
  153. package/dist/text-field-components.css-mistica.js +10 -10
  154. package/dist/text-link.css-mistica.js +6 -6
  155. package/dist/text-tokens.d.ts +6 -0
  156. package/dist/text-tokens.js +157 -133
  157. package/dist/text.css-mistica.js +6 -6
  158. package/dist/timeline.css-mistica.js +11 -11
  159. package/dist/timer.css-mistica.js +6 -6
  160. package/dist/tooltip.css-mistica.js +2 -2
  161. package/dist/touchable.css-mistica.js +4 -4
  162. package/dist/utils/aspect-ratio-support.css-mistica.js +2 -2
  163. package/dist/video.css-mistica.js +1 -1
  164. package/dist/vivinho-loading-animation/vivinho-loading-animation.css-mistica.js +1 -1
  165. package/dist-es/accordion.css-mistica.js +7 -7
  166. package/dist-es/align.css-mistica.js +1 -1
  167. package/dist-es/autocomplete.css-mistica.js +2 -2
  168. package/dist-es/avatar.css-mistica.js +1 -1
  169. package/dist-es/badge.css-mistica.js +1 -1
  170. package/dist-es/box.css-mistica.js +13 -13
  171. package/dist-es/boxed.css-mistica.js +23 -23
  172. package/dist-es/boxed.js +25 -25
  173. package/dist-es/button-group.css-mistica.js +1 -1
  174. package/dist-es/button-layout.css-mistica.js +16 -16
  175. package/dist-es/button.css-mistica.js +38 -38
  176. package/dist-es/callout.css-mistica.js +12 -12
  177. package/dist-es/card-internal.css-mistica.js +17 -17
  178. package/dist-es/carousel.css-mistica.js +10 -10
  179. package/dist-es/checkbox.css-mistica.js +13 -13
  180. package/dist-es/chip.css-mistica.js +17 -17
  181. package/dist-es/circle.css-mistica.js +2 -2
  182. package/dist-es/community/advanced-data-card.css-mistica.js +7 -7
  183. package/dist-es/community/ai-card.css-mistica.js +4 -4
  184. package/dist-es/community/blocks.css-mistica.js +1 -1
  185. package/dist-es/community/cyber/example-component.css-mistica.js +1 -1
  186. package/dist-es/community/example-component.css-mistica.js +2 -2
  187. package/dist-es/community/skins/cyber-skin.js +19 -17
  188. package/dist-es/counter.css-mistica.js +2 -2
  189. package/dist-es/cover-hero.css-mistica.js +4 -4
  190. package/dist-es/credit-card-number-field.css-mistica.js +3 -3
  191. package/dist-es/date-field.css-mistica.js +1 -1
  192. package/dist-es/date-time-picker.css-mistica.js +1 -1
  193. package/dist-es/dialog.css-mistica.js +5 -5
  194. package/dist-es/divider.css-mistica.js +5 -5
  195. package/dist-es/double-field.css-mistica.js +2 -2
  196. package/dist-es/drawer.css-mistica.js +2 -2
  197. package/dist-es/empty-state-card.css-mistica.js +1 -1
  198. package/dist-es/empty-state.css-mistica.js +7 -7
  199. package/dist-es/fade-in.css-mistica.js +1 -1
  200. package/dist-es/feedback.css-mistica.js +2 -2
  201. package/dist-es/file-upload.css-mistica.js +8 -8
  202. package/dist-es/fixed-footer-layout.css-mistica.js +3 -3
  203. package/dist-es/form.css-mistica.js +1 -1
  204. package/dist-es/generated/mistica-icons/icon-panel-collapse-regular.js +115 -0
  205. package/dist-es/generated/mistica-icons/icon-panel-expand-regular.js +109 -0
  206. package/dist-es/grid-layout.css-mistica.js +3 -3
  207. package/dist-es/grid.css-mistica.js +120 -120
  208. package/dist-es/header.css-mistica.js +1 -1
  209. package/dist-es/hero.css-mistica.js +3 -3
  210. package/dist-es/horizontal-scroll.css-mistica.js +1 -1
  211. package/dist-es/icon-button.css-mistica.js +53 -53
  212. package/dist-es/icons/icon-chevron.css-mistica.js +2 -2
  213. package/dist-es/icons/icon-error.css-mistica.js +1 -1
  214. package/dist-es/image.css-mistica.js +4 -4
  215. package/dist-es/index.js +2279 -2276
  216. package/dist-es/inline.css-mistica.js +11 -11
  217. package/dist-es/list.css-mistica.js +8 -2
  218. package/dist-es/list.js +275 -264
  219. package/dist-es/loading-bar.css-mistica.js +1 -1
  220. package/dist-es/loading-screen.css-mistica.js +5 -5
  221. package/dist-es/logo.css-mistica.js +5 -5
  222. package/dist-es/menu.css-mistica.js +13 -13
  223. package/dist-es/mobile-navigation-menu.js +90 -0
  224. package/dist-es/mosaic.css-mistica.js +1 -1
  225. package/dist-es/navigation-bar.css-mistica.js +11 -20
  226. package/dist-es/navigation-bar.js +469 -656
  227. package/dist-es/navigation-breadcrumbs.css-mistica.js +1 -1
  228. package/dist-es/navigation-shared.css-mistica.js +11 -0
  229. package/dist-es/navigation-shared.js +192 -0
  230. package/dist-es/package-version.js +1 -1
  231. package/dist-es/pagination.css-mistica.js +19 -19
  232. package/dist-es/pin-field.css-mistica.js +2 -2
  233. package/dist-es/popover.css-mistica.js +1 -1
  234. package/dist-es/progress-bar.css-mistica.js +7 -7
  235. package/dist-es/radio-button.css-mistica.js +22 -22
  236. package/dist-es/rating.css-mistica.js +3 -3
  237. package/dist-es/responsive-layout.css-mistica.js +6 -6
  238. package/dist-es/screen-reader-only.css-mistica.js +1 -1
  239. package/dist-es/select.css-mistica.js +18 -18
  240. package/dist-es/sheet-action-row.css-mistica.js +1 -1
  241. package/dist-es/sheet-common.css-mistica.js +2 -2
  242. package/dist-es/sheet-info.css-mistica.js +1 -1
  243. package/dist-es/sidenav-bar-context.js +14 -0
  244. package/dist-es/sidenav-bar-data.js +12 -0
  245. package/dist-es/sidenav-bar-first-level-item.js +124 -0
  246. package/dist-es/sidenav-bar-keyboard.js +253 -0
  247. package/dist-es/sidenav-bar-layout.css-mistica.js +2 -0
  248. package/dist-es/sidenav-bar-layout.js +86 -0
  249. package/dist-es/sidenav-bar-mobile.js +277 -0
  250. package/dist-es/sidenav-bar-motion.js +26 -0
  251. package/dist-es/sidenav-bar-panel.js +146 -0
  252. package/dist-es/sidenav-bar-row.js +208 -0
  253. package/dist-es/sidenav-bar-second-level-item.js +72 -0
  254. package/dist-es/sidenav-bar-section.js +112 -0
  255. package/dist-es/sidenav-bar-types.js +2 -0
  256. package/dist-es/sidenav-bar.css-mistica.js +74 -0
  257. package/dist-es/sidenav-bar.js +429 -0
  258. package/dist-es/skeletons.css-mistica.js +7 -7
  259. package/dist-es/skins/blau.js +12 -8
  260. package/dist-es/skins/esimflag.js +13 -9
  261. package/dist-es/skins/movistar.js +13 -9
  262. package/dist-es/skins/o2.js +13 -9
  263. package/dist-es/skins/skin-contract.css-mistica.js +735 -731
  264. package/dist-es/skins/telefonica.js +13 -9
  265. package/dist-es/skins/vivo-evolution.js +14 -10
  266. package/dist-es/skins/vivo.js +13 -9
  267. package/dist-es/skip-link.css-mistica.js +2 -2
  268. package/dist-es/slider.css-mistica.js +20 -20
  269. package/dist-es/snackbar.css-mistica.js +5 -5
  270. package/dist-es/spinner.css-mistica.js +1 -1
  271. package/dist-es/square.css-mistica.js +1 -1
  272. package/dist-es/stack.css-mistica.js +5 -5
  273. package/dist-es/stacking-group.css-mistica.js +1 -1
  274. package/dist-es/stepper.css-mistica.js +3 -3
  275. package/dist-es/style.css +1 -1
  276. package/dist-es/switch-component.css-mistica.js +37 -37
  277. package/dist-es/switch-component.js +26 -26
  278. package/dist-es/table.css-mistica.js +9 -9
  279. package/dist-es/tabs.css-mistica.js +19 -19
  280. package/dist-es/tag.css-mistica.js +2 -2
  281. package/dist-es/text-field-base.css-mistica.js +17 -17
  282. package/dist-es/text-field-components.css-mistica.js +4 -4
  283. package/dist-es/text-link.css-mistica.js +6 -6
  284. package/dist-es/text-tokens.js +82 -67
  285. package/dist-es/text.css-mistica.js +6 -6
  286. package/dist-es/timeline.css-mistica.js +10 -10
  287. package/dist-es/timer.css-mistica.js +6 -6
  288. package/dist-es/tooltip.css-mistica.js +2 -2
  289. package/dist-es/touchable.css-mistica.js +2 -2
  290. package/dist-es/utils/aspect-ratio-support.css-mistica.js +2 -2
  291. package/dist-es/video.css-mistica.js +1 -1
  292. package/dist-es/vivinho-loading-animation/vivinho-loading-animation.css-mistica.js +1 -1
  293. package/package.json +2 -1
  294. package/src/boxed.css.ts +1 -0
  295. package/src/boxed.tsx +18 -5
  296. package/src/callout.css.ts +4 -2
  297. package/src/community/skins/cyber-skin.tsx +19 -16
  298. package/src/index.tsx +14 -0
  299. package/src/list.css.ts +36 -1
  300. package/src/list.tsx +370 -344
  301. package/src/mobile-navigation-menu.tsx +168 -0
  302. package/src/navigation-bar.css.ts +2 -267
  303. package/src/navigation-bar.tsx +77 -370
  304. package/src/navigation-shared.css.ts +289 -0
  305. package/src/navigation-shared.tsx +262 -0
  306. package/src/package-version.tsx +1 -1
  307. package/src/portal.tsx +1 -1
  308. package/src/sidenav-bar-context.tsx +41 -0
  309. package/src/sidenav-bar-data.ts +49 -0
  310. package/src/sidenav-bar-first-level-item.tsx +203 -0
  311. package/src/sidenav-bar-keyboard.tsx +393 -0
  312. package/src/sidenav-bar-layout.css.ts +89 -0
  313. package/src/sidenav-bar-layout.tsx +61 -0
  314. package/src/sidenav-bar-mobile.tsx +302 -0
  315. package/src/sidenav-bar-motion.tsx +70 -0
  316. package/src/sidenav-bar-panel.tsx +269 -0
  317. package/src/sidenav-bar-row.tsx +272 -0
  318. package/src/sidenav-bar-second-level-item.tsx +99 -0
  319. package/src/sidenav-bar-section.tsx +98 -0
  320. package/src/sidenav-bar-types.ts +224 -0
  321. package/src/sidenav-bar.css.ts +1018 -0
  322. package/src/sidenav-bar.tsx +821 -0
  323. package/src/skins/blau.tsx +12 -8
  324. package/src/skins/esimflag.tsx +13 -9
  325. package/src/skins/movistar.tsx +13 -9
  326. package/src/skins/o2.tsx +13 -9
  327. package/src/skins/skin-contract.css.ts +2 -0
  328. package/src/skins/telefonica.tsx +13 -9
  329. package/src/skins/types/colors.tsx +2 -0
  330. package/src/skins/vivo-evolution.tsx +14 -10
  331. package/src/skins/vivo.tsx +13 -9
  332. package/src/switch-component.css.ts +20 -0
  333. package/src/switch-component.tsx +9 -1
  334. package/src/text-tokens.tsx +24 -0
@@ -1,26 +1,29 @@
1
1
  'use client';
2
2
  import * as React from 'react';
3
- import {CSSTransition} from 'react-transition-group';
4
3
  import classnames from 'classnames';
5
4
  import ResponsiveLayout, {ResetResponsiveLayout} from './responsive-layout';
6
5
  import Inline from './inline';
7
6
  import Touchable, {BaseTouchable} from './touchable';
8
7
  import {Text2, Text3} from './text';
9
8
  import {useElementDimensions, useScreenSize, useTheme} from './hooks';
10
- import IconMenuRegular from './generated/mistica-icons/icon-menu-regular';
11
- import IconCloseRegular from './generated/mistica-icons/icon-close-regular';
12
- import IconChevronLeftRegular from './generated/mistica-icons/icon-chevron-left-regular';
13
- import {IconButton} from './icon-button';
14
9
  import {Row, RowList} from './list';
15
10
  import {ThemeVariant, normalizeVariant, useThemeVariant} from './theme-variant-context';
16
11
  import FocusTrap from './focus-trap';
17
- import {Portal} from './portal';
12
+ import {MobileNavigationMenu} from './mobile-navigation-menu';
13
+ import {
14
+ BurgerMenuIcon,
15
+ Header,
16
+ NavigationBar,
17
+ NavigationBarContentContainer,
18
+ NavigationBarSideMargins,
19
+ } from './navigation-shared';
18
20
  import GridLayout from './grid-layout';
19
21
  import {useSetModalState} from './modal-context-provider';
20
22
  import {Logo} from './logo';
21
23
  import {vars} from './skins/skin-contract.css';
22
24
  import * as styles from './navigation-bar.css';
23
- import {cancelEvent, getPrefixedDataAttributes} from './utils/dom';
25
+ import * as sharedStyles from './navigation-shared.css';
26
+ import {cancelEvent} from './utils/dom';
24
27
  import Stack from './stack';
25
28
  import Box from './box';
26
29
  import {isRunningAcceptanceTest} from './utils/platform';
@@ -34,14 +37,21 @@ import {DOWN, ESC, UP} from './utils/keys';
34
37
  import {debounce, isEqual} from './utils/helpers';
35
38
  import NegativeBox from './negative-box';
36
39
 
37
- import type {BoxProps} from './box';
40
+ import type {WideConfig, InteractiveProps, MaybeInteractiveProps} from './navigation-shared';
38
41
  import type {ExclusifyUnion} from './utils/utility-types';
39
42
  import type {NonDeprecatedVariant, Variant} from './theme-variant-context';
40
43
  import type {TouchableProps} from './touchable';
41
- import type {DataAttributes, HeadingType, IconProps} from './utils/types';
44
+ import type {IconProps} from './utils/types';
45
+
46
+ // `NavigationBar` builds the simplest bar of the family, and the second level of both burger menus paints
47
+ // its back bar with it, so it lives in the shared module. The package still publishes it from here.
48
+ export {NavigationBar};
42
49
 
43
50
  const MAIN_NAVIGATION_BAR_MENU_DEBOUNCE_TIME = 120;
44
51
 
52
+ // The top bar and the burger menu share one focus trap, so the focus moves between the two of them.
53
+ const MAIN_NAVIGATION_BAR_FOCUS_TRAP_GROUP = 'burger-menu-lock';
54
+
45
55
  const MenuSectionArrow = ({size = 24, color = vars.colors.neutralHigh, style, className}: IconProps) => (
46
56
  <svg width={size} height={size} viewBox="0 0 8 8" style={style} className={className}>
47
57
  <path
@@ -51,219 +61,6 @@ const MenuSectionArrow = ({size = 24, color = vars.colors.neutralHigh, style, cl
51
61
  </svg>
52
62
  );
53
63
 
54
- const BurgerMenuIcon = ({isOpen}: {isOpen: boolean}) => {
55
- return (
56
- <div className={styles.burgerIconContainer} role="presentation" data-testid="BurgerMenuIcon">
57
- <div className={isOpen ? styles.iconCloseOpen : styles.iconCloseHidden}>
58
- <IconCloseRegular />
59
- </div>
60
- <div className={isOpen ? styles.iconMenuHidden : styles.iconMenuOpen}>
61
- <IconMenuRegular />
62
- </div>
63
- </div>
64
- );
65
- };
66
-
67
- type HeaderProps = {
68
- children: React.ReactNode;
69
- topFixed?: boolean;
70
- variant: NonDeprecatedVariant;
71
- withBorder?: boolean;
72
- isBurgerMenuOpen?: boolean;
73
- dataAttributes?: DataAttributes;
74
- isBottomRow?: boolean;
75
- };
76
-
77
- const Header = ({children, topFixed, withBorder, isBurgerMenuOpen, variant, dataAttributes}: HeaderProps) => {
78
- const {isDarkMode} = useTheme();
79
-
80
- const getBorderClass = () => {
81
- const isBrandVariant = (variant === 'brand' || variant === 'negative') && !isDarkMode;
82
- if (isBrandVariant || !withBorder) return styles.navbarBorderColorVariants.noBorder;
83
- if (isBurgerMenuOpen) return styles.navbarBorderColorVariants.menuOpen;
84
-
85
- return styles.navbarBorderColorVariants.default;
86
- };
87
-
88
- const backgroundColor = {
89
- default: vars.colors.background,
90
- brand: vars.colors.navigationBarBackground,
91
- negative: vars.colors.backgroundNegative,
92
- alternative: vars.colors.backgroundAlternative,
93
- media: vars.colors.navigationBarBackground,
94
- } as const;
95
-
96
- return (
97
- <header
98
- className={classnames(getBorderClass(), {[styles.topFixed]: topFixed})}
99
- style={{
100
- background: backgroundColor[variant],
101
- }}
102
- {...getPrefixedDataAttributes(dataAttributes)}
103
- >
104
- {children}
105
- </header>
106
- );
107
- };
108
-
109
- type NavigationBarContentContainerProps = {
110
- right?: React.ReactNode;
111
- children?: React.ReactNode;
112
- desktopOnly?: boolean;
113
- expandRightContent?: boolean;
114
- };
115
-
116
- const NavigationBarContentContainer = React.forwardRef<HTMLDivElement, NavigationBarContentContainerProps>(
117
- ({right, children, desktopOnly, expandRightContent}, ref) => {
118
- return (
119
- <div
120
- ref={ref}
121
- className={classnames(styles.navigationBarContent, {[styles.desktopOnly]: desktopOnly})}
122
- >
123
- {children}
124
- {right && (
125
- <div
126
- className={
127
- expandRightContent
128
- ? styles.navigationBarContentRightExpanded
129
- : styles.navigationBarContentRight
130
- }
131
- >
132
- {right}
133
- </div>
134
- )}
135
- </div>
136
- );
137
- }
138
- );
139
-
140
- type WideConfig = {
141
- paddingX: BoxProps['paddingX'];
142
- };
143
-
144
- const NavigationBarSideMargins = ({
145
- children,
146
- wide,
147
- backgroundColor,
148
- }: {
149
- children: React.ReactNode;
150
- wide: boolean | WideConfig;
151
- backgroundColor?: string;
152
- }) => {
153
- if (!wide) {
154
- return <ResponsiveLayout backgroundColor={backgroundColor}>{children}</ResponsiveLayout>;
155
- }
156
-
157
- const defaultWidePaddingX: BoxProps['paddingX'] = {
158
- mobile: 16,
159
- tablet: 24,
160
- desktop: 24,
161
- };
162
-
163
- return (
164
- <Box
165
- width="100%"
166
- paddingX={
167
- wide === true
168
- ? defaultWidePaddingX
169
- : typeof wide.paddingX === 'number'
170
- ? wide.paddingX
171
- : {
172
- ...defaultWidePaddingX,
173
- ...wide.paddingX,
174
- }
175
- }
176
- background={backgroundColor}
177
- >
178
- {children}
179
- </Box>
180
- );
181
- };
182
-
183
- interface NavigationBarCommonProps {
184
- variant?: Variant;
185
- onBack?: () => void;
186
- title?: string;
187
- titleAs?: HeadingType;
188
- right?: React.ReactElement;
189
- withBorder?: boolean;
190
- children?: undefined;
191
- wide?: boolean | WideConfig;
192
- }
193
-
194
- interface NavigationBarTopFixedProps extends NavigationBarCommonProps {
195
- topFixed?: true;
196
- }
197
-
198
- interface NavigationBarNotFixedProps extends NavigationBarCommonProps {
199
- topFixed: false;
200
- }
201
-
202
- type NavigationBarProps = NavigationBarTopFixedProps | NavigationBarNotFixedProps;
203
-
204
- export const NavigationBar = ({
205
- onBack,
206
- title,
207
- titleAs,
208
- right,
209
- variant = 'default',
210
- topFixed = true,
211
- withBorder = true,
212
- wide = false,
213
- }: NavigationBarProps): JSX.Element => {
214
- const {texts, t} = useTheme();
215
- const content = (
216
- <NavigationBarContentContainer right={right} expandRightContent>
217
- <Inline space={24} alignItems="center">
218
- {onBack && (
219
- <IconButton
220
- aria-label={texts.backNavigationBar || t(tokens.backNavigationBar)}
221
- onPress={onBack}
222
- Icon={IconChevronLeftRegular}
223
- bleedLeft
224
- bleedRight
225
- />
226
- )}
227
- <Text3 regular truncate as={titleAs}>
228
- {title}
229
- </Text3>
230
- </Inline>
231
- </NavigationBarContentContainer>
232
- );
233
-
234
- const calcPaddingXWhenNotTopFixed = (): BoxProps['paddingX'] => {
235
- if (typeof wide !== 'object') {
236
- return 0;
237
- }
238
- return wide.paddingX ?? 0;
239
- };
240
-
241
- const normalizedVariant = normalizeVariant(variant);
242
-
243
- return (
244
- <ThemeVariant variant={normalizedVariant}>
245
- <Header
246
- topFixed={topFixed}
247
- withBorder={withBorder}
248
- variant={normalizedVariant}
249
- dataAttributes={{testid: 'NavigationBar'}}
250
- >
251
- {topFixed ? (
252
- <NavigationBarSideMargins wide={wide}>{content}</NavigationBarSideMargins>
253
- ) : (
254
- <Box width="100%" paddingX={calcPaddingXWhenNotTopFixed()}>
255
- {content}
256
- </Box>
257
- )}
258
- </Header>
259
- {topFixed && <div className={styles.spacer} />}
260
- </ThemeVariant>
261
- );
262
- };
263
-
264
- type InteractiveProps = ExclusifyUnion<{href: string} | {to: string} | {onPress: () => void}>;
265
- type MaybeInteractiveProps = ExclusifyUnion<{href?: string} | {to?: string} | {onPress?: () => void}>;
266
-
267
64
  type SectionItem = {title: string} & InteractiveProps;
268
65
 
269
66
  type SectionColumn = {
@@ -322,30 +119,6 @@ type MainNavigationBarProps = {
322
119
  type MainNavigationBarMenuStatus = 'opening' | 'opened' | 'closing' | 'closed';
323
120
  type MainNavigationBarMenuAction = 'open' | 'finishOpen' | 'close' | 'finishClose';
324
121
 
325
- const mainNavigationBurgerMenuTranstions: Record<
326
- MainNavigationBarMenuStatus,
327
- Partial<Record<MainNavigationBarMenuAction, MainNavigationBarMenuStatus>>
328
- > = {
329
- opening: {
330
- close: 'closing',
331
- finishOpen: 'opened',
332
- },
333
- opened: {
334
- close: 'closing',
335
- },
336
- closing: {
337
- open: 'opening',
338
- finishClose: 'closed',
339
- },
340
- closed: {
341
- open: 'opening',
342
- },
343
- };
344
-
345
- const burgerMenuReducer = (state: MainNavigationBarMenuStatus, action: MainNavigationBarMenuAction) => {
346
- return mainNavigationBurgerMenuTranstions[state][action] || state;
347
- };
348
-
349
122
  const MainNavigationBarBurgerSection = ({
350
123
  section,
351
124
  closeSubMenu,
@@ -452,125 +225,59 @@ const MainNavigationBarBurgerMenu = ({
452
225
  disableFocusTrap: boolean;
453
226
  setDisableFocusTrap: (value: boolean) => void;
454
227
  }) => {
455
- const {isDarkMode, texts, t} = useTheme();
456
228
  const [openedSection, setOpenedSection] = React.useState(-1);
457
229
  const [isSubMenuOpen, setIsSubMenuOpen] = React.useState(false);
458
- const [subMenuStatus, dispatch] = React.useReducer(burgerMenuReducer, 'closed');
459
- const menuRef = React.useRef<HTMLDivElement>(null);
460
-
461
- const shadowAlpha = isDarkMode ? 1 : 0.2;
462
- const menuAnimationDuration = isRunningAcceptanceTest() ? 0 : styles.BURGER_MENU_ANIMATION_DURATION_MS;
463
-
464
- React.useEffect(() => {
465
- let id: NodeJS.Timeout;
466
-
467
- // menu starts opening or closing
468
- if (isSubMenuOpen) {
469
- dispatch('open');
470
- id = setTimeout(() => dispatch('finishOpen'), menuAnimationDuration);
471
- } else {
472
- dispatch('close');
473
- id = setTimeout(() => dispatch('finishClose'), menuAnimationDuration);
474
- }
475
-
476
- return () => clearTimeout(id);
477
- }, [isSubMenuOpen, menuAnimationDuration]);
478
-
479
- const sectionContainerRef = React.useRef<HTMLDivElement>(null);
480
-
481
- React.useEffect(() => {
482
- // Make screen reader focus on back button when opening any section's menu
483
- if (subMenuStatus === 'opening') {
484
- const sectionBackButtonElement = sectionContainerRef.current?.querySelector<HTMLButtonElement>(
485
- `button[aria-label="${texts.backNavigationBar || t(tokens.backNavigationBar)}"]`
486
- );
487
-
488
- sectionBackButtonElement?.focus();
489
- }
490
- }, [subMenuStatus, t, texts]);
491
230
 
492
231
  return (
493
- <Portal>
494
- <FocusTrap disabled={disableFocusTrap} group="burger-menu-lock">
495
- <CSSTransition
496
- onEntered={() => setDisableFocusTrap(false)}
497
- onExiting={() => setDisableFocusTrap(true)}
498
- onExited={() => {
499
- setIsSubMenuOpen(false);
500
- setOpenedSection(-1);
501
- }}
502
- classNames={styles.burgerMenuTransition}
503
- in={open}
504
- nodeRef={menuRef}
505
- timeout={menuAnimationDuration}
506
- mountOnEnter
507
- unmountOnExit
508
- >
509
- <nav
510
- className={styles.burgerMenu}
511
- style={{
512
- boxShadow: `6px 0 4px -4px rgba(0, 0, 0, ${shadowAlpha})`,
513
- top: NAVBAR_HEIGHT_MOBILE + topSlotHeight,
514
- }}
515
- id={id}
516
- ref={menuRef}
517
- >
518
- <div className={styles.burgerMenuContainer}>
519
- <div
520
- className={styles.burgerMenuContentContainer}
521
- style={{
522
- transform: `translate(${isSubMenuOpen ? '-100vw' : '0'})`,
523
- }}
524
- >
525
- {subMenuStatus !== 'opened' && (
526
- <ResponsiveLayout>
527
- <ResetResponsiveLayout>
528
- <RowList>
529
- {sections.map(({title, menu, ...interactiveProps}, index) => (
530
- <Row
531
- key={index}
532
- title={title}
533
- {...(menu
534
- ? {
535
- onPress: () => {
536
- setIsSubMenuOpen(true);
537
- setOpenedSection(index);
538
- },
539
- }
540
- : // Close the menu when one of the rows is pressed
541
- getInteractivePropsWithCloseMenu(
542
- interactiveProps as InteractiveProps,
543
- closeMenu
544
- ))}
545
- />
546
- ))}
547
- </RowList>
548
- </ResetResponsiveLayout>
549
- {slot && <Box paddingY={16}>{slot}</Box>}
550
- </ResponsiveLayout>
551
- )}
552
- </div>
553
-
554
- <div
555
- className={styles.burgerMenuContentContainer}
556
- ref={sectionContainerRef}
557
- style={{
558
- transform: `translate(${isSubMenuOpen ? '0' : '100vw'})`,
559
- }}
560
- >
561
- {subMenuStatus !== 'closed' && openedSection !== -1 && (
562
- <MainNavigationBarBurgerSection
563
- section={sections[openedSection]}
564
- closeMenu={closeMenu}
565
- closeSubMenu={() => setIsSubMenuOpen(false)}
566
- />
567
- )}
568
- </div>
569
- </div>
570
- </nav>
571
- </CSSTransition>
572
- </FocusTrap>
573
- </Portal>
232
+ <MobileNavigationMenu
233
+ open={open}
234
+ id={id}
235
+ topOffset={NAVBAR_HEIGHT_MOBILE + topSlotHeight}
236
+ showSecondLevel={isSubMenuOpen}
237
+ onExited={() => {
238
+ setIsSubMenuOpen(false);
239
+ setOpenedSection(-1);
240
+ }}
241
+ focusTrapGroup={MAIN_NAVIGATION_BAR_FOCUS_TRAP_GROUP}
242
+ disableFocusTrap={disableFocusTrap}
243
+ setDisableFocusTrap={setDisableFocusTrap}
244
+ firstLevel={
245
+ <ResponsiveLayout>
246
+ <ResetResponsiveLayout>
247
+ <RowList>
248
+ {sections.map(({title, menu, ...interactiveProps}, index) => (
249
+ <Row
250
+ key={index}
251
+ title={title}
252
+ {...(menu
253
+ ? {
254
+ onPress: () => {
255
+ setIsSubMenuOpen(true);
256
+ setOpenedSection(index);
257
+ },
258
+ }
259
+ : // Close the menu when one of the rows is pressed
260
+ getInteractivePropsWithCloseMenu(
261
+ interactiveProps as InteractiveProps,
262
+ closeMenu
263
+ ))}
264
+ />
265
+ ))}
266
+ </RowList>
267
+ </ResetResponsiveLayout>
268
+ {slot && <Box paddingY={16}>{slot}</Box>}
269
+ </ResponsiveLayout>
270
+ }
271
+ secondLevel={
272
+ openedSection !== -1 ? (
273
+ <MainNavigationBarBurgerSection
274
+ section={sections[openedSection]}
275
+ closeMenu={closeMenu}
276
+ closeSubMenu={() => setIsSubMenuOpen(false)}
277
+ />
278
+ ) : null
279
+ }
280
+ />
574
281
  );
575
282
  };
576
283
 
@@ -927,7 +634,7 @@ const MainNavigationBarDesktopMenuContent = ({
927
634
  const customContent = section?.menu?.content;
928
635
 
929
636
  return (
930
- <div className={styles.desktopOnly}>
637
+ <div className={sharedStyles.desktopOnly}>
931
638
  <ThemeVariant variant="default">
932
639
  {openedSection === index && (
933
640
  <ResetResponsiveLayout>
@@ -1005,7 +712,7 @@ const MainNavigationBarDesktopMenuBackground = ({
1005
712
  const {menuHeight} = useMainNavigationBarDesktopMenuState();
1006
713
 
1007
714
  return (
1008
- <div className={styles.desktopOnly}>
715
+ <div className={sharedStyles.desktopOnly}>
1009
716
  <div className={styles.desktopMenuWrapper} style={{top: topSpace}}>
1010
717
  <div
1011
718
  className={styles.desktopMenuBackgroundContainer}
@@ -1041,7 +748,7 @@ const MainNavigationBarDesktopSmallMenu = ({
1041
748
  const {openedSection, menuStatus, setIsMenuHovered, closeMenu} = useMainNavigationBarDesktopMenuState();
1042
749
 
1043
750
  return (
1044
- <div className={styles.desktopOnly}>
751
+ <div className={sharedStyles.desktopOnly}>
1045
752
  {index === openedSection && (
1046
753
  <ThemeVariant variant="default">
1047
754
  <div
@@ -1327,7 +1034,7 @@ const MainNavigationBarDesktopSections = ({
1327
1034
  return (
1328
1035
  // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions
1329
1036
  <nav
1330
- className={classnames(styles.desktopOnly, styles.mainNavBarSectionsContainer)}
1037
+ className={classnames(sharedStyles.desktopOnly, styles.mainNavBarSectionsContainer)}
1331
1038
  style={{
1332
1039
  paddingLeft: !isLargeNavigationBar ? 48 : 0,
1333
1040
  paddingRight: !isLargeNavigationBar && hasRightContent ? 136 : 0,
@@ -1487,7 +1194,7 @@ export const MainNavigationBar = ({
1487
1194
  >
1488
1195
  {showBurger && (
1489
1196
  <Touchable
1490
- className={styles.burgerMenuButton}
1197
+ className={sharedStyles.burgerMenuButton}
1491
1198
  aria-live="polite"
1492
1199
  aria-label={
1493
1200
  isBurgerMenuOpen
@@ -1501,7 +1208,7 @@ export const MainNavigationBar = ({
1501
1208
  <BurgerMenuIcon isOpen={isBurgerMenuOpen} />
1502
1209
  </Touchable>
1503
1210
  )}
1504
- <div className={styles.logoContainer}>{logoElement}</div>
1211
+ <div className={sharedStyles.logoContainer}>{logoElement}</div>
1505
1212
  {!hasBottomSections && desktopSections}
1506
1213
  </NavigationBarContentContainer>
1507
1214
  {hasBottomSections && (
@@ -1513,7 +1220,7 @@ export const MainNavigationBar = ({
1513
1220
  </MainNavigationBarContentWrapper>
1514
1221
  </Header>
1515
1222
  {topFixed && topSlotHeight > 0 && <div style={{height: topSlotHeight}} />}
1516
- {topFixed && <div className={hasBottomSections ? styles.spacerLarge : styles.spacer} />}
1223
+ {topFixed && <div className={hasBottomSections ? styles.spacerLarge : sharedStyles.spacer} />}
1517
1224
  </ThemeVariant>
1518
1225
  );
1519
1226
 
@@ -1523,7 +1230,7 @@ export const MainNavigationBar = ({
1523
1230
  mainNavBar
1524
1231
  ) : (
1525
1232
  <>
1526
- <FocusTrap disabled={disableFocusTrap} group="burger-menu-lock">
1233
+ <FocusTrap disabled={disableFocusTrap} group={MAIN_NAVIGATION_BAR_FOCUS_TRAP_GROUP}>
1527
1234
  {mainNavBar}
1528
1235
  </FocusTrap>
1529
1236
  <MainNavigationBarBurgerMenu
@@ -1580,7 +1287,7 @@ export const FunnelNavigationBar = ({
1580
1287
  </GridLayout>
1581
1288
  </NavigationBarSideMargins>
1582
1289
  </Header>
1583
- {topFixed && <div className={styles.spacer} />}
1290
+ {topFixed && <div className={sharedStyles.spacer} />}
1584
1291
  </ThemeVariant>
1585
1292
  );
1586
1293
  };