@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
@@ -0,0 +1,168 @@
1
+ 'use client';
2
+ import * as React from 'react';
3
+ import {CSSTransition} from 'react-transition-group';
4
+ import FocusTrap from './focus-trap';
5
+ import {Portal} from './portal';
6
+ import {useTheme} from './hooks';
7
+ import {isRunningAcceptanceTest} from './utils/platform';
8
+ import * as tokens from './text-tokens';
9
+ import * as styles from './navigation-shared.css';
10
+
11
+ /**
12
+ * The panel that a burger menu opens on mobile. It holds two panes that slide horizontally: the first
13
+ * level, and the second level of the item the user pressed. `MainNavigationBar` and `SidenavBar` share it,
14
+ * so both keep the same animation, the same focus behavior and the same overlay.
15
+ *
16
+ * The panel is a shell: each component passes the content of the two panes, because their data models
17
+ * differ.
18
+ */
19
+
20
+ type MobileNavigationMenuStatus = 'opening' | 'opened' | 'closing' | 'closed';
21
+ type MobileNavigationMenuAction = 'open' | 'finishOpen' | 'close' | 'finishClose';
22
+
23
+ const mobileNavigationMenuTransitions: Record<
24
+ MobileNavigationMenuStatus,
25
+ Partial<Record<MobileNavigationMenuAction, MobileNavigationMenuStatus>>
26
+ > = {
27
+ opening: {
28
+ close: 'closing',
29
+ finishOpen: 'opened',
30
+ },
31
+ opened: {
32
+ close: 'closing',
33
+ },
34
+ closing: {
35
+ open: 'opening',
36
+ finishClose: 'closed',
37
+ },
38
+ closed: {
39
+ open: 'opening',
40
+ },
41
+ };
42
+
43
+ const secondLevelReducer = (state: MobileNavigationMenuStatus, action: MobileNavigationMenuAction) => {
44
+ return mobileNavigationMenuTransitions[state][action] || state;
45
+ };
46
+
47
+ type MobileNavigationMenuProps = {
48
+ /** True while the menu shows. The panel animates on every change of this prop. */
49
+ open: boolean;
50
+ /** Id of the panel, which the burger button points to with `aria-controls`. */
51
+ id: string;
52
+ /** Distance from the top of the viewport, which leaves the top bar visible. */
53
+ topOffset: number;
54
+ /** Content of the first pane. */
55
+ firstLevel: React.ReactNode;
56
+ /** Content of the second pane. */
57
+ secondLevel?: React.ReactNode;
58
+ /** True if the second pane must show. The panel slides both panes on every change of this prop. */
59
+ showSecondLevel?: boolean;
60
+ /** Called once the panel finished its exit, so the consumer resets its own state. */
61
+ onExited?: () => void;
62
+ /** Accessible name of the navigation landmark. */
63
+ 'aria-label'?: string;
64
+ /** Group of the focus trap, which the consumer shares with its own top bar. */
65
+ focusTrapGroup: string;
66
+ disableFocusTrap: boolean;
67
+ setDisableFocusTrap: (value: boolean) => void;
68
+ };
69
+
70
+ const MobileNavigationMenu = ({
71
+ open,
72
+ id,
73
+ topOffset,
74
+ firstLevel,
75
+ secondLevel,
76
+ showSecondLevel = false,
77
+ onExited,
78
+ 'aria-label': ariaLabel,
79
+ focusTrapGroup,
80
+ disableFocusTrap,
81
+ setDisableFocusTrap,
82
+ }: MobileNavigationMenuProps): JSX.Element => {
83
+ const {isDarkMode, texts, t} = useTheme();
84
+ const [secondLevelStatus, dispatch] = React.useReducer(secondLevelReducer, 'closed');
85
+ const menuRef = React.useRef<HTMLDivElement>(null);
86
+ const secondLevelRef = React.useRef<HTMLDivElement>(null);
87
+
88
+ const shadowAlpha = isDarkMode ? 1 : 0.2;
89
+ const menuAnimationDuration = isRunningAcceptanceTest() ? 0 : styles.BURGER_MENU_ANIMATION_DURATION_MS;
90
+
91
+ React.useEffect(() => {
92
+ let id: NodeJS.Timeout;
93
+
94
+ if (showSecondLevel) {
95
+ dispatch('open');
96
+ id = setTimeout(() => dispatch('finishOpen'), menuAnimationDuration);
97
+ } else {
98
+ dispatch('close');
99
+ id = setTimeout(() => dispatch('finishClose'), menuAnimationDuration);
100
+ }
101
+
102
+ return () => clearTimeout(id);
103
+ }, [showSecondLevel, menuAnimationDuration]);
104
+
105
+ React.useEffect(() => {
106
+ // Make screen reader focus on back button when opening any section's menu
107
+ if (secondLevelStatus === 'opening') {
108
+ const backButtonElement = secondLevelRef.current?.querySelector<HTMLButtonElement>(
109
+ `button[aria-label="${texts.backNavigationBar || t(tokens.backNavigationBar)}"]`
110
+ );
111
+
112
+ backButtonElement?.focus();
113
+ }
114
+ }, [secondLevelStatus, t, texts]);
115
+
116
+ return (
117
+ <Portal>
118
+ <FocusTrap disabled={disableFocusTrap} group={focusTrapGroup}>
119
+ <CSSTransition
120
+ onEntered={() => setDisableFocusTrap(false)}
121
+ onExiting={() => setDisableFocusTrap(true)}
122
+ onExited={onExited}
123
+ classNames={styles.burgerMenuTransition}
124
+ in={open}
125
+ nodeRef={menuRef}
126
+ timeout={menuAnimationDuration}
127
+ mountOnEnter
128
+ unmountOnExit
129
+ >
130
+ <nav
131
+ className={styles.burgerMenu}
132
+ style={{
133
+ boxShadow: `6px 0 4px -4px rgba(0, 0, 0, ${shadowAlpha})`,
134
+ top: topOffset,
135
+ }}
136
+ id={id}
137
+ ref={menuRef}
138
+ aria-label={ariaLabel}
139
+ >
140
+ <div className={styles.burgerMenuContainer}>
141
+ <div
142
+ className={styles.burgerMenuContentContainer}
143
+ style={{
144
+ transform: `translate(${showSecondLevel ? '-100vw' : '0'})`,
145
+ }}
146
+ >
147
+ {secondLevelStatus !== 'opened' && firstLevel}
148
+ </div>
149
+
150
+ <div
151
+ className={styles.burgerMenuContentContainer}
152
+ ref={secondLevelRef}
153
+ style={{
154
+ transform: `translate(${showSecondLevel ? '0' : '100vw'})`,
155
+ }}
156
+ >
157
+ {secondLevelStatus !== 'closed' && secondLevel}
158
+ </div>
159
+ </div>
160
+ </nav>
161
+ </CSSTransition>
162
+ </FocusTrap>
163
+ </Portal>
164
+ );
165
+ };
166
+
167
+ export {MobileNavigationMenu};
168
+ export type {MobileNavigationMenuProps};
@@ -1,121 +1,15 @@
1
1
  import {style, styleVariants} from '@vanilla-extract/css';
2
2
  import {sprinkles} from './sprinkles.css';
3
- import {NAVBAR_HEIGHT_DESKTOP, NAVBAR_HEIGHT_DESKTOP_LARGE, NAVBAR_HEIGHT_MOBILE} from './theme';
3
+ import {NAVBAR_HEIGHT_DESKTOP, NAVBAR_HEIGHT_DESKTOP_LARGE} from './theme';
4
4
  import * as mq from './media-queries.css';
5
5
  import {vars} from './skins/skin-contract.css';
6
-
7
- const NAVBAR_ZINDEX = 25;
6
+ import {NAVBAR_ZINDEX, spacerMobile} from './navigation-shared.css';
8
7
 
9
8
  export const DESKTOP_SMALL_MENU_WIDTH = 184;
10
9
 
11
- export const BURGER_MENU_ANIMATION_DURATION_MS = 300;
12
10
  export const DESKTOP_MENU_ANIMATION_DURATION_MS = 400;
13
11
  const DESKTOP_MENU_CONTENT_ANIMATION_DURATION_MS = 800;
14
12
 
15
- export const burgerIconContainer = style([
16
- sprinkles({
17
- position: 'relative',
18
- width: 24,
19
- height: 24,
20
- }),
21
- {
22
- verticalAlign: 'middle',
23
- borderRadius: 50,
24
- },
25
- ]);
26
-
27
- const iconBase = style([
28
- sprinkles({
29
- position: 'absolute',
30
- }),
31
- {
32
- top: 0,
33
- left: 0,
34
- transition: 'transform 300ms, opacity 100ms',
35
- },
36
- ]);
37
-
38
- export const iconCloseOpen = style([
39
- iconBase,
40
- {
41
- opacity: 1,
42
- transform: 'rotate(0) scale(1)',
43
- },
44
- ]);
45
-
46
- export const iconCloseHidden = style([
47
- iconBase,
48
- {
49
- opacity: 0,
50
- transform: 'rotate(-45deg) scale(0.9)',
51
- },
52
- ]);
53
-
54
- export const iconMenuOpen = style([
55
- iconBase,
56
- {
57
- opacity: 1,
58
- transform: 'scale(1)',
59
- },
60
- ]);
61
-
62
- export const iconMenuHidden = style([
63
- iconBase,
64
- {
65
- opacity: 0,
66
- transform: 'scale(0.7)',
67
- },
68
- ]);
69
-
70
- export const topFixed = style([
71
- sprinkles({
72
- position: 'fixed',
73
- top: 0,
74
- left: 0,
75
- right: 0,
76
- }),
77
- {
78
- zIndex: NAVBAR_ZINDEX,
79
- },
80
- ]);
81
-
82
- const borderWidth = 1;
83
-
84
- const navbarBase = style([
85
- sprinkles({
86
- display: 'flex',
87
- alignItems: 'center',
88
- width: '100%',
89
- }),
90
- {
91
- borderWidth,
92
- borderBottomStyle: 'solid',
93
-
94
- '@media': {
95
- [mq.tabletOrSmaller]: {
96
- transition: 'border-color 300ms',
97
- },
98
- },
99
- },
100
- ]);
101
-
102
- export const navbarBorderColorVariants = styleVariants({
103
- default: [navbarBase, {borderColor: vars.colors.divider}],
104
- noBorder: [navbarBase, {borderColor: 'transparent'}],
105
- menuOpen: [
106
- navbarBase,
107
- {
108
- borderColor: vars.colors.divider,
109
-
110
- '@media': {
111
- [mq.tabletOrSmaller]: {
112
- borderColor: 'transparent',
113
- },
114
- },
115
- },
116
- ],
117
- });
118
-
119
13
  export const desktopMenuFirstSection = style({});
120
14
  export const desktopMenuLastSection = style({});
121
15
 
@@ -248,89 +142,12 @@ export const textWrapperVariants = styleVariants({
248
142
  },
249
143
  });
250
144
 
251
- export const navigationBarContent = style([
252
- sprinkles({
253
- alignItems: 'center',
254
- width: '100%',
255
- display: 'flex',
256
- }),
257
- {
258
- height: NAVBAR_HEIGHT_DESKTOP,
259
- '@media': {
260
- [mq.tabletOrSmaller]: {
261
- height: NAVBAR_HEIGHT_MOBILE - borderWidth,
262
- },
263
- [mq.desktopOrBigger]: {
264
- ':last-child': {
265
- height: NAVBAR_HEIGHT_DESKTOP - borderWidth,
266
- },
267
- },
268
- },
269
- },
270
- ]);
271
-
272
145
  export const navigationBarAction = sprinkles({
273
146
  border: 'none',
274
147
  background: 'transparent',
275
148
  padding: 0,
276
149
  });
277
150
 
278
- export const desktopOnly = style({
279
- '@media': {
280
- [mq.tabletOrSmaller]: {
281
- display: 'none',
282
- },
283
- },
284
- });
285
-
286
- export const navigationBarContentRight = style([
287
- sprinkles({
288
- display: 'flex',
289
- alignItems: 'center',
290
- justifyContent: 'flex-end',
291
- }),
292
- {
293
- height: NAVBAR_HEIGHT_DESKTOP,
294
- '@media': {
295
- [mq.tabletOrSmaller]: {
296
- paddingLeft: 24,
297
- flex: 1,
298
- height: NAVBAR_HEIGHT_MOBILE - borderWidth,
299
- },
300
- [mq.desktopOrBigger]: {
301
- ':last-child': {
302
- height: NAVBAR_HEIGHT_DESKTOP - borderWidth,
303
- },
304
- },
305
- },
306
- },
307
- ]);
308
-
309
- export const navigationBarContentRightExpanded = style([
310
- navigationBarContentRight,
311
- sprinkles({
312
- flex: 1,
313
- }),
314
- {
315
- paddingLeft: 56,
316
- },
317
- ]);
318
-
319
- const spacerMobile = style({
320
- '@media': {
321
- [mq.tabletOrSmaller]: {
322
- height: NAVBAR_HEIGHT_MOBILE,
323
- },
324
- },
325
- });
326
-
327
- export const spacer = style([
328
- sprinkles({
329
- height: NAVBAR_HEIGHT_DESKTOP,
330
- }),
331
- spacerMobile,
332
- ]);
333
-
334
151
  export const spacerLarge = style([
335
152
  {
336
153
  height: NAVBAR_HEIGHT_DESKTOP_LARGE,
@@ -338,33 +155,6 @@ export const spacerLarge = style([
338
155
  spacerMobile,
339
156
  ]);
340
157
 
341
- export const burgerMenuTransition = {
342
- enter: style({
343
- transform: 'translate(-100vw)',
344
- }),
345
- enterActive: style({
346
- transform: 'translate(0)',
347
- transition: `transform ${BURGER_MENU_ANIMATION_DURATION_MS}ms ease-out`,
348
- '@media': {
349
- ['(prefers-reduced-motion)']: {
350
- transition: 'none',
351
- },
352
- },
353
- }),
354
- exit: style({
355
- transform: 'translate(0)',
356
- }),
357
- exitActive: style({
358
- transform: 'translate(-100vw)',
359
- transition: `transform ${BURGER_MENU_ANIMATION_DURATION_MS}ms ease-out`,
360
- '@media': {
361
- ['(prefers-reduced-motion)']: {
362
- transition: 'none',
363
- },
364
- },
365
- }),
366
- };
367
-
368
158
  export const mainNavbarContent = sprinkles({
369
159
  display: 'flex',
370
160
  alignItems: 'center',
@@ -375,61 +165,6 @@ export const mainNavBarSectionsContainer = style([
375
165
  {minWidth: 'fit-content'},
376
166
  ]);
377
167
 
378
- export const logoContainer = style([
379
- sprinkles({
380
- display: 'flex',
381
- justifyContent: 'center',
382
- }),
383
- {
384
- '@media': {
385
- [mq.tabletOrSmaller]: {
386
- marginRight: 0,
387
- },
388
- },
389
- },
390
- ]);
391
-
392
- export const burgerMenuButton = style({
393
- marginRight: 24,
394
- width: 'fit-content',
395
- '@media': {
396
- [mq.desktopOrBigger]: {
397
- display: 'none',
398
- },
399
- },
400
- });
401
-
402
- export const burgerMenu = sprinkles({
403
- position: 'fixed',
404
- left: 0,
405
- right: 0,
406
- bottom: 0,
407
- background: vars.colors.background,
408
- });
409
-
410
- export const burgerMenuContainer = sprinkles({
411
- height: '100%',
412
- position: 'relative',
413
- });
414
-
415
- export const burgerMenuContentContainer = style([
416
- sprinkles({
417
- overflowY: 'auto',
418
- width: '100%',
419
- height: '100%',
420
- position: 'absolute',
421
- top: 0,
422
- }),
423
- {
424
- transition: `transform ${BURGER_MENU_ANIMATION_DURATION_MS}ms ease-out`,
425
- '@media': {
426
- ['(prefers-reduced-motion)']: {
427
- transition: 'none',
428
- },
429
- },
430
- },
431
- ]);
432
-
433
168
  export const iconButtonVariants = styleVariants({
434
169
  default: [
435
170
  sprinkles({color: vars.colors.neutralHigh}),