@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.
- package/css/blau.css +24 -16
- package/css/esimflag.css +35 -18
- package/css/mistica.css +1 -1
- package/css/movistar.css +29 -18
- package/css/o2.css +26 -18
- package/css/telefonica.css +38 -18
- package/css/vivo-evolution.css +66 -20
- package/css/vivo.css +26 -18
- package/dist/accordion.css-mistica.js +10 -10
- package/dist/align.css-mistica.js +1 -1
- package/dist/autocomplete.css-mistica.js +4 -4
- package/dist/avatar.css-mistica.js +1 -1
- package/dist/badge.css-mistica.js +1 -1
- package/dist/box.css-mistica.js +13 -13
- package/dist/boxed.css-mistica.js +24 -24
- package/dist/boxed.d.ts +9 -0
- package/dist/boxed.js +18 -15
- package/dist/button-group.css-mistica.js +1 -1
- package/dist/button-layout.css-mistica.js +19 -19
- package/dist/button.css-mistica.js +50 -50
- package/dist/callout.css-mistica.js +13 -13
- package/dist/card-internal.css-mistica.js +22 -22
- package/dist/carousel.css-mistica.js +30 -30
- package/dist/checkbox.css-mistica.js +15 -15
- package/dist/chip.css-mistica.js +18 -18
- package/dist/circle.css-mistica.js +2 -2
- package/dist/community/advanced-data-card.css-mistica.js +19 -19
- package/dist/community/ai-card.css-mistica.js +12 -12
- package/dist/community/blocks.css-mistica.js +1 -1
- package/dist/community/cyber/example-component.css-mistica.js +1 -1
- package/dist/community/example-component.css-mistica.js +2 -2
- package/dist/community/skins/cyber-skin.js +19 -17
- package/dist/counter.css-mistica.js +6 -6
- package/dist/cover-hero.css-mistica.js +7 -7
- package/dist/credit-card-number-field.css-mistica.js +3 -3
- package/dist/date-field.css-mistica.js +1 -1
- package/dist/date-time-picker.css-mistica.js +1 -1
- package/dist/dialog.css-mistica.js +10 -10
- package/dist/divider.css-mistica.js +5 -5
- package/dist/double-field.css-mistica.js +2 -2
- package/dist/drawer.css-mistica.js +4 -4
- package/dist/empty-state-card.css-mistica.js +1 -1
- package/dist/empty-state.css-mistica.js +8 -8
- package/dist/fade-in.css-mistica.js +1 -1
- package/dist/feedback.css-mistica.js +5 -5
- package/dist/file-upload.css-mistica.js +10 -10
- package/dist/fixed-footer-layout.css-mistica.js +6 -6
- package/dist/form.css-mistica.js +1 -1
- package/dist/generated/mistica-icons/icon-panel-collapse-regular.js +165 -0
- package/dist/generated/mistica-icons/icon-panel-expand-regular.js +159 -0
- package/dist/grid-layout.css-mistica.js +3 -3
- package/dist/grid.css-mistica.js +120 -120
- package/dist/header.css-mistica.js +1 -1
- package/dist/hero.css-mistica.js +4 -4
- package/dist/horizontal-scroll.css-mistica.js +1 -1
- package/dist/icon-button.css-mistica.js +53 -53
- package/dist/icons/icon-chevron.css-mistica.js +2 -2
- package/dist/icons/icon-error.css-mistica.js +1 -1
- package/dist/image.css-mistica.js +8 -8
- package/dist/index.d.ts +5 -0
- package/dist/index.js +10 -1
- package/dist/inline.css-mistica.js +11 -11
- package/dist/list.css-mistica.js +40 -28
- package/dist/list.css.d.ts +2 -0
- package/dist/list.d.ts +3 -1
- package/dist/list.js +176 -165
- package/dist/loading-bar.css-mistica.js +1 -1
- package/dist/loading-screen.css-mistica.js +12 -12
- package/dist/logo.css-mistica.js +5 -5
- package/dist/menu.css-mistica.js +13 -13
- package/dist/mobile-navigation-menu.d.ts +26 -0
- package/dist/mobile-navigation-menu.js +145 -0
- package/dist/mosaic.css-mistica.js +1 -1
- package/dist/navigation-bar.css-mistica.js +31 -97
- package/dist/navigation-bar.css.d.ts +0 -24
- package/dist/navigation-bar.d.ts +3 -38
- package/dist/navigation-bar.js +399 -586
- package/dist/navigation-breadcrumbs.css-mistica.js +1 -1
- package/dist/navigation-shared.css-mistica.js +79 -0
- package/dist/navigation-shared.css.d.ts +26 -0
- package/dist/navigation-shared.d.ts +66 -0
- package/dist/navigation-shared.js +264 -0
- package/dist/package-version.js +1 -1
- package/dist/pagination.css-mistica.js +22 -22
- package/dist/pin-field.css-mistica.js +4 -4
- package/dist/popover.css-mistica.js +1 -1
- package/dist/portal.d.ts +1 -1
- package/dist/progress-bar.css-mistica.js +7 -7
- package/dist/radio-button.css-mistica.js +27 -27
- package/dist/rating.css-mistica.js +4 -4
- package/dist/responsive-layout.css-mistica.js +6 -6
- package/dist/screen-reader-only.css-mistica.js +1 -1
- package/dist/select.css-mistica.js +21 -21
- package/dist/sheet-action-row.css-mistica.js +1 -1
- package/dist/sheet-common.css-mistica.js +7 -7
- package/dist/sheet-info.css-mistica.js +1 -1
- package/dist/sidenav-bar-context.d.ts +25 -0
- package/dist/sidenav-bar-context.js +72 -0
- package/dist/sidenav-bar-data.d.ts +15 -0
- package/dist/sidenav-bar-data.js +38 -0
- package/dist/sidenav-bar-first-level-item.d.ts +42 -0
- package/dist/sidenav-bar-first-level-item.js +174 -0
- package/dist/sidenav-bar-keyboard.d.ts +13 -0
- package/dist/sidenav-bar-keyboard.js +314 -0
- package/dist/sidenav-bar-layout.css-mistica.js +28 -0
- package/dist/sidenav-bar-layout.css.d.ts +5 -0
- package/dist/sidenav-bar-layout.d.ts +22 -0
- package/dist/sidenav-bar-layout.js +103 -0
- package/dist/sidenav-bar-mobile.d.ts +24 -0
- package/dist/sidenav-bar-mobile.js +332 -0
- package/dist/sidenav-bar-motion.d.ts +32 -0
- package/dist/sidenav-bar-motion.js +84 -0
- package/dist/sidenav-bar-panel.d.ts +31 -0
- package/dist/sidenav-bar-panel.js +208 -0
- package/dist/sidenav-bar-row.d.ts +82 -0
- package/dist/sidenav-bar-row.js +230 -0
- package/dist/sidenav-bar-second-level-item.d.ts +43 -0
- package/dist/sidenav-bar-second-level-item.js +89 -0
- package/dist/sidenav-bar-section.d.ts +23 -0
- package/dist/sidenav-bar-section.js +167 -0
- package/dist/sidenav-bar-types.d.ts +192 -0
- package/dist/sidenav-bar-types.js +11 -0
- package/dist/sidenav-bar.css-mistica.js +325 -0
- package/dist/sidenav-bar.css.d.ts +93 -0
- package/dist/sidenav-bar.d.ts +102 -0
- package/dist/sidenav-bar.js +492 -0
- package/dist/skeletons.css-mistica.js +8 -8
- package/dist/skins/blau.js +12 -8
- package/dist/skins/esimflag.js +13 -9
- package/dist/skins/movistar.js +13 -9
- package/dist/skins/o2.js +13 -9
- package/dist/skins/skin-contract.css-mistica.js +735 -731
- package/dist/skins/skin-contract.css.d.ts +4 -0
- package/dist/skins/telefonica.js +13 -9
- package/dist/skins/types/colors.d.ts +2 -0
- package/dist/skins/vivo-evolution.js +14 -10
- package/dist/skins/vivo.js +13 -9
- package/dist/skip-link.css-mistica.js +2 -2
- package/dist/slider.css-mistica.js +24 -24
- package/dist/snackbar.css-mistica.js +14 -14
- package/dist/spinner.css-mistica.js +1 -1
- package/dist/square.css-mistica.js +1 -1
- package/dist/stack.css-mistica.js +5 -5
- package/dist/stacking-group.css-mistica.js +1 -1
- package/dist/stepper.css-mistica.js +9 -9
- package/dist/switch-component.css-mistica.js +48 -42
- package/dist/switch-component.css.d.ts +2 -0
- package/dist/switch-component.js +18 -18
- package/dist/table.css-mistica.js +9 -9
- package/dist/tabs.css-mistica.js +22 -22
- package/dist/tag.css-mistica.js +3 -3
- package/dist/text-field-base.css-mistica.js +19 -19
- package/dist/text-field-components.css-mistica.js +10 -10
- package/dist/text-link.css-mistica.js +6 -6
- package/dist/text-tokens.d.ts +6 -0
- package/dist/text-tokens.js +157 -133
- package/dist/text.css-mistica.js +6 -6
- package/dist/timeline.css-mistica.js +11 -11
- package/dist/timer.css-mistica.js +6 -6
- package/dist/tooltip.css-mistica.js +2 -2
- package/dist/touchable.css-mistica.js +4 -4
- package/dist/utils/aspect-ratio-support.css-mistica.js +2 -2
- package/dist/video.css-mistica.js +1 -1
- package/dist/vivinho-loading-animation/vivinho-loading-animation.css-mistica.js +1 -1
- package/dist-es/accordion.css-mistica.js +7 -7
- package/dist-es/align.css-mistica.js +1 -1
- package/dist-es/autocomplete.css-mistica.js +2 -2
- package/dist-es/avatar.css-mistica.js +1 -1
- package/dist-es/badge.css-mistica.js +1 -1
- package/dist-es/box.css-mistica.js +13 -13
- package/dist-es/boxed.css-mistica.js +23 -23
- package/dist-es/boxed.js +25 -25
- package/dist-es/button-group.css-mistica.js +1 -1
- package/dist-es/button-layout.css-mistica.js +16 -16
- package/dist-es/button.css-mistica.js +38 -38
- package/dist-es/callout.css-mistica.js +12 -12
- package/dist-es/card-internal.css-mistica.js +17 -17
- package/dist-es/carousel.css-mistica.js +10 -10
- package/dist-es/checkbox.css-mistica.js +13 -13
- package/dist-es/chip.css-mistica.js +17 -17
- package/dist-es/circle.css-mistica.js +2 -2
- package/dist-es/community/advanced-data-card.css-mistica.js +7 -7
- package/dist-es/community/ai-card.css-mistica.js +4 -4
- package/dist-es/community/blocks.css-mistica.js +1 -1
- package/dist-es/community/cyber/example-component.css-mistica.js +1 -1
- package/dist-es/community/example-component.css-mistica.js +2 -2
- package/dist-es/community/skins/cyber-skin.js +19 -17
- package/dist-es/counter.css-mistica.js +2 -2
- package/dist-es/cover-hero.css-mistica.js +4 -4
- package/dist-es/credit-card-number-field.css-mistica.js +3 -3
- package/dist-es/date-field.css-mistica.js +1 -1
- package/dist-es/date-time-picker.css-mistica.js +1 -1
- package/dist-es/dialog.css-mistica.js +5 -5
- package/dist-es/divider.css-mistica.js +5 -5
- package/dist-es/double-field.css-mistica.js +2 -2
- package/dist-es/drawer.css-mistica.js +2 -2
- package/dist-es/empty-state-card.css-mistica.js +1 -1
- package/dist-es/empty-state.css-mistica.js +7 -7
- package/dist-es/fade-in.css-mistica.js +1 -1
- package/dist-es/feedback.css-mistica.js +2 -2
- package/dist-es/file-upload.css-mistica.js +8 -8
- package/dist-es/fixed-footer-layout.css-mistica.js +3 -3
- package/dist-es/form.css-mistica.js +1 -1
- package/dist-es/generated/mistica-icons/icon-panel-collapse-regular.js +115 -0
- package/dist-es/generated/mistica-icons/icon-panel-expand-regular.js +109 -0
- package/dist-es/grid-layout.css-mistica.js +3 -3
- package/dist-es/grid.css-mistica.js +120 -120
- package/dist-es/header.css-mistica.js +1 -1
- package/dist-es/hero.css-mistica.js +3 -3
- package/dist-es/horizontal-scroll.css-mistica.js +1 -1
- package/dist-es/icon-button.css-mistica.js +53 -53
- package/dist-es/icons/icon-chevron.css-mistica.js +2 -2
- package/dist-es/icons/icon-error.css-mistica.js +1 -1
- package/dist-es/image.css-mistica.js +4 -4
- package/dist-es/index.js +2279 -2276
- package/dist-es/inline.css-mistica.js +11 -11
- package/dist-es/list.css-mistica.js +8 -2
- package/dist-es/list.js +275 -264
- package/dist-es/loading-bar.css-mistica.js +1 -1
- package/dist-es/loading-screen.css-mistica.js +5 -5
- package/dist-es/logo.css-mistica.js +5 -5
- package/dist-es/menu.css-mistica.js +13 -13
- package/dist-es/mobile-navigation-menu.js +90 -0
- package/dist-es/mosaic.css-mistica.js +1 -1
- package/dist-es/navigation-bar.css-mistica.js +11 -20
- package/dist-es/navigation-bar.js +469 -656
- package/dist-es/navigation-breadcrumbs.css-mistica.js +1 -1
- package/dist-es/navigation-shared.css-mistica.js +11 -0
- package/dist-es/navigation-shared.js +192 -0
- package/dist-es/package-version.js +1 -1
- package/dist-es/pagination.css-mistica.js +19 -19
- package/dist-es/pin-field.css-mistica.js +2 -2
- package/dist-es/popover.css-mistica.js +1 -1
- package/dist-es/progress-bar.css-mistica.js +7 -7
- package/dist-es/radio-button.css-mistica.js +22 -22
- package/dist-es/rating.css-mistica.js +3 -3
- package/dist-es/responsive-layout.css-mistica.js +6 -6
- package/dist-es/screen-reader-only.css-mistica.js +1 -1
- package/dist-es/select.css-mistica.js +18 -18
- package/dist-es/sheet-action-row.css-mistica.js +1 -1
- package/dist-es/sheet-common.css-mistica.js +2 -2
- package/dist-es/sheet-info.css-mistica.js +1 -1
- package/dist-es/sidenav-bar-context.js +14 -0
- package/dist-es/sidenav-bar-data.js +12 -0
- package/dist-es/sidenav-bar-first-level-item.js +124 -0
- package/dist-es/sidenav-bar-keyboard.js +253 -0
- package/dist-es/sidenav-bar-layout.css-mistica.js +2 -0
- package/dist-es/sidenav-bar-layout.js +86 -0
- package/dist-es/sidenav-bar-mobile.js +277 -0
- package/dist-es/sidenav-bar-motion.js +26 -0
- package/dist-es/sidenav-bar-panel.js +146 -0
- package/dist-es/sidenav-bar-row.js +208 -0
- package/dist-es/sidenav-bar-second-level-item.js +72 -0
- package/dist-es/sidenav-bar-section.js +112 -0
- package/dist-es/sidenav-bar-types.js +2 -0
- package/dist-es/sidenav-bar.css-mistica.js +74 -0
- package/dist-es/sidenav-bar.js +429 -0
- package/dist-es/skeletons.css-mistica.js +7 -7
- package/dist-es/skins/blau.js +12 -8
- package/dist-es/skins/esimflag.js +13 -9
- package/dist-es/skins/movistar.js +13 -9
- package/dist-es/skins/o2.js +13 -9
- package/dist-es/skins/skin-contract.css-mistica.js +735 -731
- package/dist-es/skins/telefonica.js +13 -9
- package/dist-es/skins/vivo-evolution.js +14 -10
- package/dist-es/skins/vivo.js +13 -9
- package/dist-es/skip-link.css-mistica.js +2 -2
- package/dist-es/slider.css-mistica.js +20 -20
- package/dist-es/snackbar.css-mistica.js +5 -5
- package/dist-es/spinner.css-mistica.js +1 -1
- package/dist-es/square.css-mistica.js +1 -1
- package/dist-es/stack.css-mistica.js +5 -5
- package/dist-es/stacking-group.css-mistica.js +1 -1
- package/dist-es/stepper.css-mistica.js +3 -3
- package/dist-es/style.css +1 -1
- package/dist-es/switch-component.css-mistica.js +37 -37
- package/dist-es/switch-component.js +26 -26
- package/dist-es/table.css-mistica.js +9 -9
- package/dist-es/tabs.css-mistica.js +19 -19
- package/dist-es/tag.css-mistica.js +2 -2
- package/dist-es/text-field-base.css-mistica.js +17 -17
- package/dist-es/text-field-components.css-mistica.js +4 -4
- package/dist-es/text-link.css-mistica.js +6 -6
- package/dist-es/text-tokens.js +82 -67
- package/dist-es/text.css-mistica.js +6 -6
- package/dist-es/timeline.css-mistica.js +10 -10
- package/dist-es/timer.css-mistica.js +6 -6
- package/dist-es/tooltip.css-mistica.js +2 -2
- package/dist-es/touchable.css-mistica.js +2 -2
- package/dist-es/utils/aspect-ratio-support.css-mistica.js +2 -2
- package/dist-es/video.css-mistica.js +1 -1
- package/dist-es/vivinho-loading-animation/vivinho-loading-animation.css-mistica.js +1 -1
- package/package.json +2 -1
- package/src/boxed.css.ts +1 -0
- package/src/boxed.tsx +18 -5
- package/src/callout.css.ts +4 -2
- package/src/community/skins/cyber-skin.tsx +19 -16
- package/src/index.tsx +14 -0
- package/src/list.css.ts +36 -1
- package/src/list.tsx +370 -344
- package/src/mobile-navigation-menu.tsx +168 -0
- package/src/navigation-bar.css.ts +2 -267
- package/src/navigation-bar.tsx +77 -370
- package/src/navigation-shared.css.ts +289 -0
- package/src/navigation-shared.tsx +262 -0
- package/src/package-version.tsx +1 -1
- package/src/portal.tsx +1 -1
- package/src/sidenav-bar-context.tsx +41 -0
- package/src/sidenav-bar-data.ts +49 -0
- package/src/sidenav-bar-first-level-item.tsx +203 -0
- package/src/sidenav-bar-keyboard.tsx +393 -0
- package/src/sidenav-bar-layout.css.ts +89 -0
- package/src/sidenav-bar-layout.tsx +61 -0
- package/src/sidenav-bar-mobile.tsx +302 -0
- package/src/sidenav-bar-motion.tsx +70 -0
- package/src/sidenav-bar-panel.tsx +269 -0
- package/src/sidenav-bar-row.tsx +272 -0
- package/src/sidenav-bar-second-level-item.tsx +99 -0
- package/src/sidenav-bar-section.tsx +98 -0
- package/src/sidenav-bar-types.ts +224 -0
- package/src/sidenav-bar.css.ts +1018 -0
- package/src/sidenav-bar.tsx +821 -0
- package/src/skins/blau.tsx +12 -8
- package/src/skins/esimflag.tsx +13 -9
- package/src/skins/movistar.tsx +13 -9
- package/src/skins/o2.tsx +13 -9
- package/src/skins/skin-contract.css.ts +2 -0
- package/src/skins/telefonica.tsx +13 -9
- package/src/skins/types/colors.tsx +2 -0
- package/src/skins/vivo-evolution.tsx +14 -10
- package/src/skins/vivo.tsx +13 -9
- package/src/switch-component.css.ts +20 -0
- package/src/switch-component.tsx +9 -1
- package/src/text-tokens.tsx +24 -0
package/src/navigation-bar.tsx
CHANGED
|
@@ -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 {
|
|
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
|
|
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 {
|
|
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 {
|
|
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
|
-
<
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
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={
|
|
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={
|
|
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={
|
|
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(
|
|
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={
|
|
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={
|
|
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 :
|
|
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=
|
|
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={
|
|
1290
|
+
{topFixed && <div className={sharedStyles.spacer} />}
|
|
1584
1291
|
</ThemeVariant>
|
|
1585
1292
|
);
|
|
1586
1293
|
};
|