@royaloperahouse/harmonic 0.6.1 → 0.6.2
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/dist/components/atoms/ControlledDropdown/ControlledDropdown.d.ts +2 -2
- package/dist/components/atoms/ControlledDropdown/ControlledDropdown.style.d.ts +2 -2
- package/dist/components/atoms/Search/Search.d.ts +1 -1
- package/dist/components/atoms/Search/Search.style.d.ts +1 -1
- package/dist/components/molecules/NavTop/NavTop.d.ts +1 -1
- package/dist/components/molecules/SearchBar/SearchBar.d.ts +1 -1
- package/dist/components/molecules/SearchBar/SearchBar.style.d.ts +1 -1
- package/dist/harmonic.cjs.development.js +163 -79
- package/dist/harmonic.cjs.development.js.map +1 -1
- package/dist/harmonic.cjs.production.min.js +1 -1
- package/dist/harmonic.cjs.production.min.js.map +1 -1
- package/dist/harmonic.esm.js +164 -80
- package/dist/harmonic.esm.js.map +1 -1
- package/dist/helpers/accessibility.d.ts +1 -0
- package/dist/types/navigation.d.ts +12 -0
- package/dist/types/types.d.ts +4 -0
- package/package.json +1 -1
package/dist/harmonic.esm.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React__default, { createElement, memo, useCallback, useRef,
|
|
1
|
+
import React__default, { createElement, memo, useCallback, useRef, useImperativeHandle, useMemo, useEffect, useState, forwardRef, cloneElement, useLayoutEffect } from 'react';
|
|
2
2
|
import styled, { css, ThemeProvider, createGlobalStyle } from 'styled-components';
|
|
3
3
|
import moment from 'moment';
|
|
4
4
|
import Modal from 'react-modal';
|
|
@@ -394,7 +394,7 @@ var HarmonicHeader = function HarmonicHeader(_ref2) {
|
|
|
394
394
|
size = _ref2.size,
|
|
395
395
|
em = _ref2.em,
|
|
396
396
|
_ref2$color = _ref2.color,
|
|
397
|
-
color = _ref2$color === void 0 ? '
|
|
397
|
+
color = _ref2$color === void 0 ? 'inherit' : _ref2$color,
|
|
398
398
|
serif = _ref2.serif,
|
|
399
399
|
Tag = _ref2.hierarchy,
|
|
400
400
|
className = _ref2.className;
|
|
@@ -414,7 +414,7 @@ var HarmonicSubtitle = function HarmonicSubtitle(_ref3) {
|
|
|
414
414
|
var children = _ref3.children,
|
|
415
415
|
size = _ref3.size,
|
|
416
416
|
_ref3$color = _ref3.color,
|
|
417
|
-
color = _ref3$color === void 0 ? '
|
|
417
|
+
color = _ref3$color === void 0 ? 'inherit' : _ref3$color,
|
|
418
418
|
className = _ref3.className;
|
|
419
419
|
var classNames = createClassNames('subtitle', {
|
|
420
420
|
size: size,
|
|
@@ -431,7 +431,7 @@ var BodyCopyHarmonic = function BodyCopyHarmonic(_ref4) {
|
|
|
431
431
|
_ref4$size = _ref4.size,
|
|
432
432
|
size = _ref4$size === void 0 ? 'medium' : _ref4$size,
|
|
433
433
|
_ref4$color = _ref4.color,
|
|
434
|
-
color = _ref4$color === void 0 ? '
|
|
434
|
+
color = _ref4$color === void 0 ? 'inherit' : _ref4$color,
|
|
435
435
|
className = _ref4.className,
|
|
436
436
|
props = _objectWithoutPropertiesLoose(_ref4, _excluded);
|
|
437
437
|
var classNames = createClassNames('bodycopy', {
|
|
@@ -448,7 +448,7 @@ var HarmonicOverline = function HarmonicOverline(_ref5) {
|
|
|
448
448
|
var children = _ref5.children,
|
|
449
449
|
size = _ref5.size,
|
|
450
450
|
_ref5$color = _ref5.color,
|
|
451
|
-
color = _ref5$color === void 0 ? '
|
|
451
|
+
color = _ref5$color === void 0 ? 'inherit' : _ref5$color,
|
|
452
452
|
className = _ref5.className,
|
|
453
453
|
props = _objectWithoutPropertiesLoose(_ref5, _excluded2);
|
|
454
454
|
var classNames = createClassNames('overline', {
|
|
@@ -464,7 +464,7 @@ var HarmonicOverline = function HarmonicOverline(_ref5) {
|
|
|
464
464
|
var ButtonText = function ButtonText(_ref6) {
|
|
465
465
|
var children = _ref6.children,
|
|
466
466
|
_ref6$color = _ref6.color,
|
|
467
|
-
color = _ref6$color === void 0 ? '
|
|
467
|
+
color = _ref6$color === void 0 ? 'inherit' : _ref6$color,
|
|
468
468
|
className = _ref6.className;
|
|
469
469
|
var classNames = createClassNames('buttontext', {
|
|
470
470
|
color: color,
|
|
@@ -477,7 +477,7 @@ var ButtonText = function ButtonText(_ref6) {
|
|
|
477
477
|
var Caption = function Caption(_ref7) {
|
|
478
478
|
var children = _ref7.children,
|
|
479
479
|
_ref7$color = _ref7.color,
|
|
480
|
-
color = _ref7$color === void 0 ? '
|
|
480
|
+
color = _ref7$color === void 0 ? 'inherit' : _ref7$color,
|
|
481
481
|
className = _ref7.className;
|
|
482
482
|
var classNames = createClassNames('captiontext', {
|
|
483
483
|
color: color,
|
|
@@ -490,7 +490,7 @@ var Caption = function Caption(_ref7) {
|
|
|
490
490
|
var NavigationText = function NavigationText(_ref8) {
|
|
491
491
|
var children = _ref8.children,
|
|
492
492
|
_ref8$color = _ref8.color,
|
|
493
|
-
color = _ref8$color === void 0 ? '
|
|
493
|
+
color = _ref8$color === void 0 ? 'inherit' : _ref8$color,
|
|
494
494
|
className = _ref8.className;
|
|
495
495
|
var classNames = createClassNames('navigationtext', {
|
|
496
496
|
color: color,
|
|
@@ -2962,7 +2962,7 @@ var OptionsContainer = /*#__PURE__*/styled.div(_templateObject3 || (_templateObj
|
|
|
2962
2962
|
|
|
2963
2963
|
var _templateObject$7, _templateObject2$5, _templateObject3$1, _templateObject4;
|
|
2964
2964
|
var ControlledDropdownWrapper = /*#__PURE__*/styled.div(_templateObject$7 || (_templateObject$7 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n position: relative;\n width: fit-content;\n"])));
|
|
2965
|
-
var ControlledDropdownHeaderContainer = /*#__PURE__*/styled.
|
|
2965
|
+
var ControlledDropdownHeaderContainer = /*#__PURE__*/styled.button(_templateObject2$5 || (_templateObject2$5 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n all: unset;\n display: flex;\n gap: 6px;\n border-bottom: 1px solid transparent;\n height: 24px;\n line-height: 24px;\n font-size: var(--harmonic-font-size-navigation);\n font-family: var(--font-family-sans);\n font-weight: var(--font-weight-navigation);\n letter-spacing: var(--harmonic-letter-spacing-navigation);\n color: var(--color-primary-black);\n text-decoration: none;\n cursor: pointer;\n width: max-content;\n\n &:focus {\n outline: 2px solid var(--color-primary-black);\n outline-offset: 2px;\n }\n\n ", "\n"])), function (_ref) {
|
|
2966
2966
|
var active = _ref.active;
|
|
2967
2967
|
if (active) {
|
|
2968
2968
|
return "\n & {\n color: var(--color-primary-red);\n }\n && svg path {\n fill: var(--color-primary-red);\n } \n ";
|
|
@@ -2970,12 +2970,12 @@ var ControlledDropdownHeaderContainer = /*#__PURE__*/styled.span(_templateObject
|
|
|
2970
2970
|
return '';
|
|
2971
2971
|
});
|
|
2972
2972
|
var ControlledDropdownHeaderContainerLink = /*#__PURE__*/styled(ControlledDropdownHeaderContainer).attrs({
|
|
2973
|
-
as: '
|
|
2973
|
+
as: 'button'
|
|
2974
2974
|
})(_templateObject3$1 || (_templateObject3$1 = /*#__PURE__*/_taggedTemplateLiteralLoose([""])));
|
|
2975
2975
|
var IconWrapper = /*#__PURE__*/styled.span(_templateObject4 || (_templateObject4 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n width: 24px;\n height: 24px;\n\n span > svg path {\n fill: var(--color-primary-black);\n }\n"])));
|
|
2976
2976
|
|
|
2977
2977
|
/* eslint-disable no-useless-return */
|
|
2978
|
-
var ControlledDropdown = function
|
|
2978
|
+
var ControlledDropdown = /*#__PURE__*/React__default.forwardRef(function (_ref, ref) {
|
|
2979
2979
|
var text = _ref.text,
|
|
2980
2980
|
options = _ref.options,
|
|
2981
2981
|
active = _ref.active,
|
|
@@ -2983,32 +2983,22 @@ var ControlledDropdown = function ControlledDropdown(_ref) {
|
|
|
2983
2983
|
onOptionClick = _ref.onOptionClick,
|
|
2984
2984
|
_onMouseEnter = _ref.onMouseEnter,
|
|
2985
2985
|
_onMouseLeave = _ref.onMouseLeave,
|
|
2986
|
+
_onFocusLeave = _ref.onFocusLeave,
|
|
2986
2987
|
onReset = _ref.onReset,
|
|
2987
2988
|
_onFocus = _ref.onFocus,
|
|
2988
2989
|
_onBlur = _ref.onBlur,
|
|
2989
2990
|
className = _ref.className;
|
|
2990
|
-
|
|
2991
|
-
var
|
|
2991
|
+
ControlledDropdown.displayName = 'ControlledDropdown';
|
|
2992
|
+
var internalRef = useRef(null);
|
|
2993
|
+
useImperativeHandle(ref, function () {
|
|
2994
|
+
return internalRef.current;
|
|
2995
|
+
});
|
|
2996
|
+
var resetHandler = function resetHandler() {
|
|
2992
2997
|
return onReset == null ? void 0 : onReset();
|
|
2993
|
-
}
|
|
2994
|
-
|
|
2995
|
-
|
|
2996
|
-
|
|
2997
|
-
var _ref$current;
|
|
2998
|
-
if (ref != null && (_ref$current = ref.current) != null && _ref$current.contains(e.target)) {
|
|
2999
|
-
return;
|
|
3000
|
-
} else if (active) {
|
|
3001
|
-
resetHandler();
|
|
3002
|
-
}
|
|
3003
|
-
};
|
|
3004
|
-
document.addEventListener('click', mouseClickHandler);
|
|
3005
|
-
return function () {
|
|
3006
|
-
document.removeEventListener('click', mouseClickHandler);
|
|
3007
|
-
};
|
|
3008
|
-
}
|
|
3009
|
-
// eslint-disable-next-line consistent-return
|
|
3010
|
-
return;
|
|
3011
|
-
}, [ref, resetHandler, active]);
|
|
2998
|
+
};
|
|
2999
|
+
var isDropdown = useMemo(function () {
|
|
3000
|
+
return !!(options != null && options.length);
|
|
3001
|
+
}, [options]);
|
|
3012
3002
|
var handleOptionKeyDown = function handleOptionKeyDown(e, link) {
|
|
3013
3003
|
if (e.key === 'Enter') {
|
|
3014
3004
|
onOptionClick == null || onOptionClick(link);
|
|
@@ -3028,13 +3018,15 @@ var ControlledDropdown = function ControlledDropdown(_ref) {
|
|
|
3028
3018
|
_onBlur == null || _onBlur();
|
|
3029
3019
|
}
|
|
3030
3020
|
};
|
|
3031
|
-
var isDropdown = !!(options != null && options.length);
|
|
3032
3021
|
var wrapperEvents = {
|
|
3033
3022
|
onMouseEnter: function onMouseEnter() {
|
|
3034
3023
|
return _onMouseEnter == null ? void 0 : _onMouseEnter();
|
|
3035
3024
|
},
|
|
3036
3025
|
onMouseLeave: function onMouseLeave() {
|
|
3037
3026
|
return _onMouseLeave == null ? void 0 : _onMouseLeave();
|
|
3027
|
+
},
|
|
3028
|
+
onFocusLeave: function onFocusLeave() {
|
|
3029
|
+
return _onFocusLeave == null ? void 0 : _onFocusLeave();
|
|
3038
3030
|
}
|
|
3039
3031
|
};
|
|
3040
3032
|
var headerEvents = {
|
|
@@ -3050,21 +3042,51 @@ var ControlledDropdown = function ControlledDropdown(_ref) {
|
|
|
3050
3042
|
},
|
|
3051
3043
|
onKeyDown: handleHeaderKeyDown
|
|
3052
3044
|
};
|
|
3045
|
+
useEffect(function () {
|
|
3046
|
+
var mouseEvent = function mouseEvent(e) {
|
|
3047
|
+
var _internalRef$current;
|
|
3048
|
+
if (internalRef != null && (_internalRef$current = internalRef.current) != null && _internalRef$current.contains(e.target)) return;
|
|
3049
|
+
if (active) resetHandler();
|
|
3050
|
+
};
|
|
3051
|
+
if (window.innerWidth > breakpoints.sm) {
|
|
3052
|
+
document.addEventListener('click', mouseEvent);
|
|
3053
|
+
}
|
|
3054
|
+
return function () {
|
|
3055
|
+
document.removeEventListener('click', mouseEvent);
|
|
3056
|
+
};
|
|
3057
|
+
}, [resetHandler, active]);
|
|
3058
|
+
useEffect(function () {
|
|
3059
|
+
var handleFocusOut = function handleFocusOut(e) {
|
|
3060
|
+
if (internalRef.current && !internalRef.current.contains(e.relatedTarget)) {
|
|
3061
|
+
_onFocusLeave == null || _onFocusLeave();
|
|
3062
|
+
}
|
|
3063
|
+
};
|
|
3064
|
+
var node = internalRef.current;
|
|
3065
|
+
if (node) node.addEventListener('focusout', handleFocusOut);
|
|
3066
|
+
return function () {
|
|
3067
|
+
return node == null ? void 0 : node.removeEventListener('focusout', handleFocusOut);
|
|
3068
|
+
};
|
|
3069
|
+
}, [_onFocusLeave]);
|
|
3053
3070
|
return /*#__PURE__*/React__default.createElement(ControlledDropdownWrapper, Object.assign({
|
|
3054
|
-
ref:
|
|
3071
|
+
ref: internalRef
|
|
3055
3072
|
}, wrapperEvents, {
|
|
3056
3073
|
className: className
|
|
3057
3074
|
}), isDropdown ? (/*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(ControlledDropdownHeaderContainer, Object.assign({
|
|
3058
3075
|
active: active
|
|
3059
3076
|
}, headerEvents, {
|
|
3060
|
-
|
|
3061
|
-
|
|
3077
|
+
"data-testid": "span-container",
|
|
3078
|
+
role: "menuitem",
|
|
3079
|
+
"aria-controls": "dropdown-menu",
|
|
3080
|
+
"aria-haspopup": "menu",
|
|
3081
|
+
"aria-expanded": active
|
|
3062
3082
|
}), text, /*#__PURE__*/React__default.createElement(IconWrapper, {
|
|
3063
3083
|
"data-testid": "dropdown-icon"
|
|
3064
3084
|
}, /*#__PURE__*/React__default.createElement(Icon, {
|
|
3065
3085
|
iconName: "DropdownArrow"
|
|
3066
3086
|
}))), active && options ? (/*#__PURE__*/React__default.createElement(OptionsContainer, {
|
|
3067
|
-
withOptionsInMobile: true
|
|
3087
|
+
withOptionsInMobile: true,
|
|
3088
|
+
role: "menu",
|
|
3089
|
+
id: "dropdown-menu"
|
|
3068
3090
|
}, options.map(function (optionItem, index) {
|
|
3069
3091
|
return /*#__PURE__*/React__default.createElement(OptionItem, {
|
|
3070
3092
|
key: "key-" + index + "-" + optionItem.option,
|
|
@@ -3078,15 +3100,18 @@ var ControlledDropdown = function ControlledDropdown(_ref) {
|
|
|
3078
3100
|
onBlur: function onBlur() {
|
|
3079
3101
|
return handleOptionBlur(index);
|
|
3080
3102
|
},
|
|
3081
|
-
href: optionItem.optionLink
|
|
3103
|
+
href: optionItem.optionLink,
|
|
3104
|
+
role: "menuitem"
|
|
3082
3105
|
}, optionItem.option);
|
|
3083
3106
|
}))) : null)) : (/*#__PURE__*/React__default.createElement(ControlledDropdownHeaderContainerLink, Object.assign({
|
|
3084
3107
|
active: active
|
|
3085
3108
|
}, headerEvents, {
|
|
3086
3109
|
"data-testid": "link-container",
|
|
3110
|
+
"aria-label": text,
|
|
3111
|
+
role: "menuitem",
|
|
3087
3112
|
tabIndex: 0
|
|
3088
3113
|
}), text)));
|
|
3089
|
-
};
|
|
3114
|
+
});
|
|
3090
3115
|
|
|
3091
3116
|
var _templateObject$8;
|
|
3092
3117
|
var Grid = /*#__PURE__*/styled.div(_templateObject$8 || (_templateObject$8 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n display: grid;\n grid-template-columns: var(--grid-template-columns);\n grid-template-rows: max-content;\n gap: var(--grid-column-gap);\n margin: 0;\n"])));
|
|
@@ -5311,7 +5336,7 @@ var Basket$1 = function Basket(_ref) {
|
|
|
5311
5336
|
};
|
|
5312
5337
|
|
|
5313
5338
|
var _templateObject$A, _templateObject2$q;
|
|
5314
|
-
var SearchContainer = /*#__PURE__*/styled.
|
|
5339
|
+
var SearchContainer = /*#__PURE__*/styled.button(_templateObject$A || (_templateObject$A = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n all: unset;\n display: inline-flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n cursor: pointer;\n border-bottom: 1px solid transparent;\n padding-top: 3px;\n padding-bottom: 3px;\n\n svg path {\n fill: var(--color-primary-black);\n }\n\n ", "\n\n :hover {\n border-bottom: 1px solid var(--color-primary-red);\n && svg path {\n fill: var(--color-primary-red);\n }\n }\n\n &:focus {\n outline: 2px solid var(--color-primary-black);\n outline-offset: 2px;\n }\n"])), function (_ref) {
|
|
5315
5340
|
var selected = _ref.selected;
|
|
5316
5341
|
if (selected) {
|
|
5317
5342
|
return "\n border-bottom: 1px solid var(--color-primary-red);\n && svg path {\n fill: var(--color-primary-red);\n }\n ";
|
|
@@ -5320,31 +5345,26 @@ var SearchContainer = /*#__PURE__*/styled.div(_templateObject$A || (_templateObj
|
|
|
5320
5345
|
});
|
|
5321
5346
|
var SvgContainer$1 = /*#__PURE__*/styled.div(_templateObject2$q || (_templateObject2$q = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n svg {\n width: var(--navigation-large-gap);\n height: var(--navigation-large-gap);\n }\n"])));
|
|
5322
5347
|
|
|
5323
|
-
var Search$1 = function
|
|
5348
|
+
var Search$1 = /*#__PURE__*/forwardRef(function (_ref, ref) {
|
|
5324
5349
|
var _ref$selected = _ref.selected,
|
|
5325
5350
|
selected = _ref$selected === void 0 ? false : _ref$selected,
|
|
5326
5351
|
onClick = _ref.onClick,
|
|
5327
5352
|
className = _ref.className;
|
|
5328
|
-
|
|
5329
|
-
if (e.key === 'Enter') {
|
|
5330
|
-
onClick == null || onClick();
|
|
5331
|
-
}
|
|
5332
|
-
};
|
|
5353
|
+
Search$1.displayName = 'Search';
|
|
5333
5354
|
return /*#__PURE__*/React__default.createElement(SearchContainer, {
|
|
5334
|
-
role: "button",
|
|
5335
5355
|
"aria-label": "Search",
|
|
5336
5356
|
selected: selected,
|
|
5337
5357
|
onClick: onClick,
|
|
5338
|
-
onKeyDown: onKeyDownHandler,
|
|
5339
5358
|
"data-testid": "search-icon",
|
|
5340
5359
|
tabIndex: 0,
|
|
5341
|
-
className: className
|
|
5360
|
+
className: className,
|
|
5361
|
+
ref: ref
|
|
5342
5362
|
}, /*#__PURE__*/React__default.createElement(SvgContainer$1, {
|
|
5343
5363
|
"aria-hidden": "true"
|
|
5344
5364
|
}, /*#__PURE__*/React__default.createElement(Icon, {
|
|
5345
5365
|
iconName: "Search"
|
|
5346
5366
|
})));
|
|
5347
|
-
};
|
|
5367
|
+
});
|
|
5348
5368
|
|
|
5349
5369
|
/* eslint-disable react/jsx-no-useless-fragment */
|
|
5350
5370
|
var Dropdown = function Dropdown(_ref) {
|
|
@@ -5559,12 +5579,14 @@ var NavTop = function NavTop(_ref) {
|
|
|
5559
5579
|
onClickSearch = _ref.onClickSearch,
|
|
5560
5580
|
_ref$isShowSearch = _ref.isShowSearch,
|
|
5561
5581
|
isShowSearch = _ref$isShowSearch === void 0 ? false : _ref$isShowSearch,
|
|
5562
|
-
className = _ref.className
|
|
5582
|
+
className = _ref.className,
|
|
5583
|
+
searchButtonRef = _ref.searchButtonRef;
|
|
5563
5584
|
return /*#__PURE__*/React__default.createElement(NavTopContainer$1, {
|
|
5564
5585
|
className: className
|
|
5565
5586
|
}, /*#__PURE__*/React__default.createElement(Search$1, {
|
|
5566
5587
|
onClick: onClickSearch,
|
|
5567
|
-
selected: isShowSearch
|
|
5588
|
+
selected: isShowSearch,
|
|
5589
|
+
ref: searchButtonRef
|
|
5568
5590
|
}), /*#__PURE__*/React__default.createElement(Basket$1, {
|
|
5569
5591
|
link: basketLink,
|
|
5570
5592
|
text: basketText,
|
|
@@ -5610,6 +5632,7 @@ var Tabs = function Tabs(_ref) {
|
|
|
5610
5632
|
var _useState3 = useState(-1),
|
|
5611
5633
|
hoverOverDropdown = _useState3[0],
|
|
5612
5634
|
setHoverOverDropdown = _useState3[1];
|
|
5635
|
+
var dropdownRefs = useRef([]);
|
|
5613
5636
|
var onClickHandler = function onClickHandler(value) {
|
|
5614
5637
|
setOpenMenu(value);
|
|
5615
5638
|
if (onShowMenu) {
|
|
@@ -5649,23 +5672,25 @@ var Tabs = function Tabs(_ref) {
|
|
|
5649
5672
|
setHoverOverDropdown(-1);
|
|
5650
5673
|
}
|
|
5651
5674
|
};
|
|
5652
|
-
var
|
|
5653
|
-
|
|
5675
|
+
var onDropdownFocusLeave = function onDropdownFocusLeave() {
|
|
5676
|
+
onResetActive();
|
|
5654
5677
|
};
|
|
5655
|
-
var
|
|
5656
|
-
var
|
|
5657
|
-
|
|
5678
|
+
var handleBlur = function handleBlur(index) {
|
|
5679
|
+
var currentDropdown = dropdownRefs.current[index];
|
|
5680
|
+
var active = document.activeElement;
|
|
5681
|
+
if (currentDropdown && (!active || !currentDropdown.contains(active))) {
|
|
5658
5682
|
onResetActive();
|
|
5659
5683
|
}
|
|
5660
5684
|
};
|
|
5661
5685
|
return /*#__PURE__*/React__default.createElement(TabsContainer, {
|
|
5686
|
+
role: "menubar",
|
|
5662
5687
|
className: className
|
|
5663
5688
|
}, /*#__PURE__*/React__default.createElement(ItemsContainer, {
|
|
5664
5689
|
showMenu: showMenu
|
|
5665
5690
|
}, items.map(function (item, index) {
|
|
5666
5691
|
return /*#__PURE__*/React__default.createElement(ControlledDropdown, {
|
|
5667
5692
|
key: "key-" + item.title,
|
|
5668
|
-
text: item.title,
|
|
5693
|
+
text: item.title || '',
|
|
5669
5694
|
options: item.options,
|
|
5670
5695
|
onClick: function onClick() {
|
|
5671
5696
|
return onDropdownClick(index, item.titleLink);
|
|
@@ -5677,17 +5702,23 @@ var Tabs = function Tabs(_ref) {
|
|
|
5677
5702
|
onMouseLeave: function onMouseLeave() {
|
|
5678
5703
|
return onDropdownMouseLeave();
|
|
5679
5704
|
},
|
|
5680
|
-
|
|
5681
|
-
return
|
|
5705
|
+
onFocusLeave: function onFocusLeave() {
|
|
5706
|
+
return onDropdownFocusLeave();
|
|
5682
5707
|
},
|
|
5683
5708
|
onBlur: function onBlur() {
|
|
5684
|
-
return
|
|
5709
|
+
return handleBlur(index);
|
|
5685
5710
|
},
|
|
5686
5711
|
onReset: onResetActive,
|
|
5687
|
-
active: isActiveDropdown(index)
|
|
5712
|
+
active: isActiveDropdown(index),
|
|
5713
|
+
ref: function ref(el) {
|
|
5714
|
+
dropdownRefs.current[index] = el;
|
|
5715
|
+
}
|
|
5688
5716
|
});
|
|
5689
5717
|
})), !showMenu && (/*#__PURE__*/React__default.createElement(MenuContainer$1, null, openMenu ? (/*#__PURE__*/React__default.createElement("a", {
|
|
5690
5718
|
"data-testid": "mobile-menu-close",
|
|
5719
|
+
role: "button",
|
|
5720
|
+
"aria-label": "Close menu",
|
|
5721
|
+
tabIndex: 0,
|
|
5691
5722
|
onClick: function onClick(e) {
|
|
5692
5723
|
e.preventDefault();
|
|
5693
5724
|
onClickHandler(false);
|
|
@@ -5697,6 +5728,9 @@ var Tabs = function Tabs(_ref) {
|
|
|
5697
5728
|
iconName: "Close"
|
|
5698
5729
|
}))) : (/*#__PURE__*/React__default.createElement(MenuItem, null, /*#__PURE__*/React__default.createElement("a", {
|
|
5699
5730
|
"data-testid": "mobile-menu-button",
|
|
5731
|
+
role: "button",
|
|
5732
|
+
"aria-label": "Open menu",
|
|
5733
|
+
tabIndex: 0,
|
|
5700
5734
|
onClick: function onClick(e) {
|
|
5701
5735
|
e.preventDefault();
|
|
5702
5736
|
onClickHandler(true);
|
|
@@ -5707,30 +5741,56 @@ var Tabs = function Tabs(_ref) {
|
|
|
5707
5741
|
var _templateObject$C, _templateObject2$s, _templateObject3$i, _templateObject5$a, _templateObject6$7, _templateObject7$4;
|
|
5708
5742
|
var SearchBarContainer = /*#__PURE__*/styled.div(_templateObject$C || (_templateObject$C = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n display: flex;\n flex-direction: row;\n column-gap: 64px;\n justify-content: space-between;\n align-items: center;\n height: 100%;\n background-color: transparent;\n\n @media ", " {\n column-gap: 12px;\n }\n"])), devices.mobile);
|
|
5709
5743
|
var SvgContainerSearch = /*#__PURE__*/styled.div(_templateObject2$s || (_templateObject2$s = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n svg {\n width: var(--navigation-xlarge-gap);\n height: var(--navigation-xlarge-gap);\n }\n"])));
|
|
5710
|
-
var SvgContainerClose = /*#__PURE__*/styled.
|
|
5744
|
+
var SvgContainerClose = /*#__PURE__*/styled.button(_templateObject3$i || (_templateObject3$i = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n all: unset;\n\n svg {\n width: var(--navigation-large-gap);\n height: var(--navigation-large-gap);\n }\n\n :hover {\n cursor: pointer;\n && svg path {\n fill: var(--color-primary-red);\n }\n }\n\n &:focus {\n outline: 2px solid var(--color-primary-black);\n outline-offset: 2px;\n }\n"])));
|
|
5711
5745
|
var InputContainer = /*#__PURE__*/styled.div(_templateObject5$a || (_templateObject5$a = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n background-color: blue;\n width: 100%;\n\n input {\n font-size: var(--font-size-search);\n font-family: var(--font-family-serif);\n border: none;\n border-radius: 0;\n outline: none;\n outline-color: var(--color-base-white);\n height: 48px;\n box-sizing: border-box;\n width: 100%;\n -webkit-appearance: none;\n\n &.search-input {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n @media ", " {\n column-gap: 24px;\n }\n }\n"])), devices.mobile);
|
|
5712
5746
|
var TextLinkWrapper$1 = /*#__PURE__*/styled(TextLink)(_templateObject6$7 || (_templateObject6$7 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n color: var(--color-primary-red);\n"])));
|
|
5713
5747
|
var SearchArrowContainer = /*#__PURE__*/styled.a(_templateObject7$4 || (_templateObject7$4 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n padding-right: 8px;\n\n svg {\n width: var(--navigation-large-gap);\n height: var(--navigation-large-gap);\n }\n"])));
|
|
5714
5748
|
|
|
5749
|
+
function useFocusTrap(containerRef, onEscape) {
|
|
5750
|
+
useEffect(function () {
|
|
5751
|
+
var container = containerRef.current;
|
|
5752
|
+
if (!container) return undefined;
|
|
5753
|
+
var focusableSelectors = 'input, button, select, textarea, a[href], [tabindex]:not([tabindex="-1"])';
|
|
5754
|
+
var focusableEls = container.querySelectorAll(focusableSelectors);
|
|
5755
|
+
var firstEl = focusableEls[0];
|
|
5756
|
+
var lastEl = focusableEls[focusableEls.length - 1];
|
|
5757
|
+
var handleKeyDown = function handleKeyDown(e) {
|
|
5758
|
+
if (e.key === 'Tab') {
|
|
5759
|
+
if (focusableEls.length === 0) return;
|
|
5760
|
+
if (e.shiftKey && document.activeElement === firstEl) {
|
|
5761
|
+
e.preventDefault();
|
|
5762
|
+
lastEl == null || lastEl.focus();
|
|
5763
|
+
} else if (!e.shiftKey && document.activeElement === lastEl) {
|
|
5764
|
+
e.preventDefault();
|
|
5765
|
+
firstEl == null || firstEl.focus();
|
|
5766
|
+
}
|
|
5767
|
+
}
|
|
5768
|
+
if (e.key === 'Escape') {
|
|
5769
|
+
onEscape == null || onEscape();
|
|
5770
|
+
}
|
|
5771
|
+
};
|
|
5772
|
+
document.addEventListener('keydown', handleKeyDown);
|
|
5773
|
+
return function () {
|
|
5774
|
+
return document.removeEventListener('keydown', handleKeyDown);
|
|
5775
|
+
};
|
|
5776
|
+
}, [containerRef, onEscape]);
|
|
5777
|
+
}
|
|
5778
|
+
|
|
5715
5779
|
var SearchBar = function SearchBar(_ref) {
|
|
5716
5780
|
var onClick = _ref.onClick,
|
|
5717
5781
|
onClose = _ref.onClose,
|
|
5718
|
-
className = _ref.className
|
|
5782
|
+
className = _ref.className,
|
|
5783
|
+
inputRef = _ref.inputRef;
|
|
5719
5784
|
var _useState = useState(false),
|
|
5720
5785
|
showSearchLink = _useState[0],
|
|
5721
5786
|
setShowSearchLink = _useState[1];
|
|
5722
5787
|
var _useState2 = useState(''),
|
|
5723
5788
|
searchValue = _useState2[0],
|
|
5724
5789
|
setSearchValue = _useState2[1];
|
|
5725
|
-
var
|
|
5726
|
-
|
|
5727
|
-
|
|
5728
|
-
|
|
5729
|
-
return function () {
|
|
5730
|
-
var _inputRef$current2;
|
|
5731
|
-
return inputRef == null || (_inputRef$current2 = inputRef.current) == null ? void 0 : _inputRef$current2.blur();
|
|
5732
|
-
};
|
|
5733
|
-
}, [inputRef]);
|
|
5790
|
+
var internalRef = useRef(null);
|
|
5791
|
+
var finalInputRef = inputRef != null ? inputRef : internalRef;
|
|
5792
|
+
var containerRef = useRef(null);
|
|
5793
|
+
useFocusTrap(containerRef, onClose);
|
|
5734
5794
|
var onSearchHandler = function onSearchHandler(value) {
|
|
5735
5795
|
onClick(value);
|
|
5736
5796
|
setSearchValue('');
|
|
@@ -5766,12 +5826,13 @@ var SearchBar = function SearchBar(_ref) {
|
|
|
5766
5826
|
var _useViewport = useViewport(),
|
|
5767
5827
|
isDesktop = _useViewport.isDesktop;
|
|
5768
5828
|
return /*#__PURE__*/React__default.createElement(SearchBarContainer, {
|
|
5769
|
-
className: className
|
|
5829
|
+
className: className,
|
|
5830
|
+
ref: containerRef
|
|
5770
5831
|
}, /*#__PURE__*/React__default.createElement(SvgContainerSearch, null, /*#__PURE__*/React__default.createElement(Icon, {
|
|
5771
5832
|
iconName: "Search"
|
|
5772
5833
|
})), /*#__PURE__*/React__default.createElement(InputContainer, null, /*#__PURE__*/React__default.createElement("input", {
|
|
5773
5834
|
"data-testid": "input-html",
|
|
5774
|
-
ref:
|
|
5835
|
+
ref: finalInputRef,
|
|
5775
5836
|
className: "search-input",
|
|
5776
5837
|
placeholder: "Search the website...",
|
|
5777
5838
|
type: "text",
|
|
@@ -5785,7 +5846,9 @@ var SearchBar = function SearchBar(_ref) {
|
|
|
5785
5846
|
})), showSearchLink && (isDesktop ? (/*#__PURE__*/React__default.createElement("div", {
|
|
5786
5847
|
"data-testid": "search-button"
|
|
5787
5848
|
}, /*#__PURE__*/React__default.createElement(TextLinkWrapper$1, {
|
|
5849
|
+
role: "button",
|
|
5788
5850
|
"data-testid": "search-link",
|
|
5851
|
+
"aria-label": "Submit search",
|
|
5789
5852
|
onClick: function onClick() {
|
|
5790
5853
|
return onSearchHandler(searchValue);
|
|
5791
5854
|
},
|
|
@@ -5794,6 +5857,8 @@ var SearchBar = function SearchBar(_ref) {
|
|
|
5794
5857
|
},
|
|
5795
5858
|
tabIndex: 0
|
|
5796
5859
|
}, "Search"))) : (/*#__PURE__*/React__default.createElement(SearchArrowContainer, {
|
|
5860
|
+
role: "button",
|
|
5861
|
+
"aria-label": "Submit search",
|
|
5797
5862
|
"data-testid": "search-arrow-button",
|
|
5798
5863
|
onClick: function onClick() {
|
|
5799
5864
|
return onSearchHandler(searchValue);
|
|
@@ -5804,7 +5869,8 @@ var SearchBar = function SearchBar(_ref) {
|
|
|
5804
5869
|
tabIndex: 0,
|
|
5805
5870
|
onClick: onCloseHandler,
|
|
5806
5871
|
onKeyDown: onKeyboardCloseHandler,
|
|
5807
|
-
"data-testid": "close-icon"
|
|
5872
|
+
"data-testid": "close-icon",
|
|
5873
|
+
"aria-label": "Close search bar"
|
|
5808
5874
|
}, /*#__PURE__*/React__default.createElement(Icon, {
|
|
5809
5875
|
iconName: "Close"
|
|
5810
5876
|
})));
|
|
@@ -5821,6 +5887,8 @@ var Navigation = function Navigation(_ref) {
|
|
|
5821
5887
|
crest = _ref$crest === void 0 ? false : _ref$crest,
|
|
5822
5888
|
className = _ref.className,
|
|
5823
5889
|
logoLink = _ref.logoLink;
|
|
5890
|
+
var searchInputRef = useRef(null);
|
|
5891
|
+
var searchButtonRef = useRef(null);
|
|
5824
5892
|
var _useState = useState(dataNavTop),
|
|
5825
5893
|
navTopData = _useState[0],
|
|
5826
5894
|
setNavTopData = _useState[1];
|
|
@@ -5853,9 +5921,7 @@ var Navigation = function Navigation(_ref) {
|
|
|
5853
5921
|
setNavTopData(dataNavTop);
|
|
5854
5922
|
}, [dataNavTop]);
|
|
5855
5923
|
var onClickSearchHandler = function onClickSearchHandler() {
|
|
5856
|
-
setshowSearch(
|
|
5857
|
-
return !prev;
|
|
5858
|
-
});
|
|
5924
|
+
setshowSearch(true);
|
|
5859
5925
|
};
|
|
5860
5926
|
var onLinkHandler = function onLinkHandler(link) {
|
|
5861
5927
|
onLink(link);
|
|
@@ -5872,7 +5938,23 @@ var Navigation = function Navigation(_ref) {
|
|
|
5872
5938
|
};
|
|
5873
5939
|
var onCloseSearchHandler = function onCloseSearchHandler() {
|
|
5874
5940
|
setshowSearch(false);
|
|
5941
|
+
setTimeout(function () {
|
|
5942
|
+
var _searchButtonRef$curr;
|
|
5943
|
+
(_searchButtonRef$curr = searchButtonRef.current) == null || _searchButtonRef$curr.focus();
|
|
5944
|
+
}, 0);
|
|
5875
5945
|
};
|
|
5946
|
+
useEffect(function () {
|
|
5947
|
+
if (showSearch) {
|
|
5948
|
+
var timer = setTimeout(function () {
|
|
5949
|
+
var _searchInputRef$curre;
|
|
5950
|
+
(_searchInputRef$curre = searchInputRef.current) == null || _searchInputRef$curre.focus();
|
|
5951
|
+
}, 50);
|
|
5952
|
+
return function () {
|
|
5953
|
+
return clearTimeout(timer);
|
|
5954
|
+
};
|
|
5955
|
+
}
|
|
5956
|
+
return undefined;
|
|
5957
|
+
}, [showSearch]);
|
|
5876
5958
|
var _useViewport = useViewport(),
|
|
5877
5959
|
isMobile = _useViewport.isMobile;
|
|
5878
5960
|
return /*#__PURE__*/React__default.createElement(NavigationWrapper, {
|
|
@@ -5914,7 +5996,8 @@ var Navigation = function Navigation(_ref) {
|
|
|
5914
5996
|
basketNumVirtualItems: navTopData.basketNumVirtualItems,
|
|
5915
5997
|
onClickSearch: onClickSearchHandler,
|
|
5916
5998
|
onLink: onLinkHandler,
|
|
5917
|
-
isShowSearch: showSearch
|
|
5999
|
+
isShowSearch: showSearch,
|
|
6000
|
+
searchButtonRef: searchButtonRef
|
|
5918
6001
|
}))))), /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(SearchBackground, {
|
|
5919
6002
|
visible: showSearch
|
|
5920
6003
|
}), /*#__PURE__*/React__default.createElement(GridItemSearch, {
|
|
@@ -5925,6 +6008,7 @@ var Navigation = function Navigation(_ref) {
|
|
|
5925
6008
|
columnStartDevice: 2,
|
|
5926
6009
|
columnSpanDevice: 12
|
|
5927
6010
|
}, /*#__PURE__*/React__default.createElement(SearchBar, {
|
|
6011
|
+
inputRef: searchInputRef,
|
|
5928
6012
|
onClick: onSearchHandler,
|
|
5929
6013
|
onClose: onCloseSearchHandler
|
|
5930
6014
|
})))), showMenu && (/*#__PURE__*/React__default.createElement(NavigationGridMobile, {
|