@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.
@@ -1,4 +1,4 @@
1
- import React__default, { createElement, memo, useCallback, useRef, useEffect, useState, forwardRef, useMemo, useImperativeHandle, cloneElement, useLayoutEffect } from 'react';
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 ? 'primary' : _ref2$color,
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 ? 'primary' : _ref3$color,
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 ? 'primary' : _ref4$color,
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 ? 'primary' : _ref5$color,
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 ? 'primary' : _ref6$color,
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 ? 'primary' : _ref7$color,
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 ? 'primary' : _ref8$color,
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.span(_templateObject2$5 || (_templateObject2$5 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\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 ", "\n"])), function (_ref) {
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: 'a'
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 ControlledDropdown(_ref) {
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
- var ref = useRef();
2991
- var resetHandler = useCallback(function () {
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
- useEffect(function () {
2995
- if (window.innerWidth > breakpoints.sm) {
2996
- var mouseClickHandler = function mouseClickHandler(e) {
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: 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
- tabIndex: 0,
3061
- "data-testid": "span-container"
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.div(_templateObject$A || (_templateObject$A = /*#__PURE__*/_taggedTemplateLiteralLoose(["\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"])), function (_ref) {
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 Search(_ref) {
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
- var onKeyDownHandler = function onKeyDownHandler(e) {
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 _onFocus = function onFocus(i) {
5653
- return setActiveDropdown(i);
5675
+ var onDropdownFocusLeave = function onDropdownFocusLeave() {
5676
+ onResetActive();
5654
5677
  };
5655
- var _onBlur = function onBlur(i) {
5656
- var _items$length;
5657
- if (i === ((_items$length = items == null ? void 0 : items.length) != null ? _items$length : 0) - 1) {
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
- onFocus: function onFocus() {
5681
- return _onFocus(index);
5705
+ onFocusLeave: function onFocusLeave() {
5706
+ return onDropdownFocusLeave();
5682
5707
  },
5683
5708
  onBlur: function onBlur() {
5684
- return _onBlur(index);
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.div(_templateObject3$i || (_templateObject3$i = /*#__PURE__*/_taggedTemplateLiteralLoose(["\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"])));
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 inputRef = useRef(null);
5726
- useEffect(function () {
5727
- var _inputRef$current;
5728
- inputRef == null || (_inputRef$current = inputRef.current) == null || _inputRef$current.focus();
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: inputRef,
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(function (prev) {
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, {