@royaloperahouse/harmonic 0.4.1-i → 0.4.1-j

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 { FunctionComponent } from 'react';
1
+ import React from 'react';
2
2
  import { IControlledDropdownProps } from '../../../types/types';
3
- declare const ControlledDropdown: FunctionComponent<IControlledDropdownProps>;
3
+ declare const ControlledDropdown: React.ForwardRefExoticComponent<IControlledDropdownProps & React.RefAttributes<HTMLDivElement>>;
4
4
  export default ControlledDropdown;
@@ -1,7 +1,7 @@
1
1
  import { IControlledDropdownHeaderProps } from '../../../types/types';
2
2
  export declare const ControlledDropdownWrapper: import("styled-components").StyledComponent<"div", any, {}, never>;
3
- export declare const ControlledDropdownHeaderContainer: import("styled-components").StyledComponent<"span", any, IControlledDropdownHeaderProps, never>;
4
- export declare const ControlledDropdownHeaderContainerLink: import("styled-components").StyledComponent<"span", any, IControlledDropdownHeaderProps & {
3
+ export declare const ControlledDropdownHeaderContainer: import("styled-components").StyledComponent<"button", any, IControlledDropdownHeaderProps, never>;
4
+ export declare const ControlledDropdownHeaderContainerLink: import("styled-components").StyledComponent<"button", any, IControlledDropdownHeaderProps & {
5
5
  as: string;
6
6
  }, "as">;
7
7
  export declare const IconWrapper: import("styled-components").StyledComponent<"span", any, {}, never>;
@@ -2939,7 +2939,7 @@ var OptionsContainer = /*#__PURE__*/styled__default.div(_templateObject3 || (_te
2939
2939
 
2940
2940
  var _templateObject$7, _templateObject2$5, _templateObject3$1, _templateObject4;
2941
2941
  var ControlledDropdownWrapper = /*#__PURE__*/styled__default.div(_templateObject$7 || (_templateObject$7 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n position: relative;\n width: fit-content;\n"])));
2942
- var ControlledDropdownHeaderContainer = /*#__PURE__*/styled__default.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) {
2942
+ var ControlledDropdownHeaderContainer = /*#__PURE__*/styled__default.button(_templateObject2$5 || (_templateObject2$5 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n all: unset;\n\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) {
2943
2943
  var active = _ref.active;
2944
2944
  if (active) {
2945
2945
  return "\n & {\n color: var(--color-primary-red);\n }\n && svg path {\n fill: var(--color-primary-red);\n } \n ";
@@ -2947,12 +2947,12 @@ var ControlledDropdownHeaderContainer = /*#__PURE__*/styled__default.span(_templ
2947
2947
  return '';
2948
2948
  });
2949
2949
  var ControlledDropdownHeaderContainerLink = /*#__PURE__*/styled__default(ControlledDropdownHeaderContainer).attrs({
2950
- as: 'a'
2950
+ as: 'button'
2951
2951
  })(_templateObject3$1 || (_templateObject3$1 = /*#__PURE__*/_taggedTemplateLiteralLoose([""])));
2952
2952
  var IconWrapper = /*#__PURE__*/styled__default.span(_templateObject4 || (_templateObject4 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n width: 24px;\n height: 24px;\n\n span > svg path {\n fill: var(--color-primary-black);\n }\n"])));
2953
2953
 
2954
2954
  /* eslint-disable no-useless-return */
2955
- var ControlledDropdown = function ControlledDropdown(_ref) {
2955
+ var ControlledDropdown = /*#__PURE__*/React__default.forwardRef(function (_ref, ref) {
2956
2956
  var text = _ref.text,
2957
2957
  options = _ref.options,
2958
2958
  active = _ref.active,
@@ -2960,32 +2960,22 @@ var ControlledDropdown = function ControlledDropdown(_ref) {
2960
2960
  onOptionClick = _ref.onOptionClick,
2961
2961
  _onMouseEnter = _ref.onMouseEnter,
2962
2962
  _onMouseLeave = _ref.onMouseLeave,
2963
+ _onFocusLeave = _ref.onFocusLeave,
2963
2964
  onReset = _ref.onReset,
2964
2965
  _onFocus = _ref.onFocus,
2965
2966
  _onBlur = _ref.onBlur,
2966
2967
  className = _ref.className;
2967
- var ref = React.useRef();
2968
- var resetHandler = React.useCallback(function () {
2968
+ ControlledDropdown.displayName = 'ControlledDropdown';
2969
+ var internalRef = React.useRef(null);
2970
+ React.useImperativeHandle(ref, function () {
2971
+ return internalRef.current;
2972
+ });
2973
+ var resetHandler = function resetHandler() {
2969
2974
  return onReset == null ? void 0 : onReset();
2970
- }, []);
2971
- React.useEffect(function () {
2972
- if (window.innerWidth > breakpoints.sm) {
2973
- var mouseClickHandler = function mouseClickHandler(e) {
2974
- var _ref$current;
2975
- if (ref != null && (_ref$current = ref.current) != null && _ref$current.contains(e.target)) {
2976
- return;
2977
- } else if (active) {
2978
- resetHandler();
2979
- }
2980
- };
2981
- document.addEventListener('click', mouseClickHandler);
2982
- return function () {
2983
- document.removeEventListener('click', mouseClickHandler);
2984
- };
2985
- }
2986
- // eslint-disable-next-line consistent-return
2987
- return;
2988
- }, [ref, resetHandler, active]);
2975
+ };
2976
+ var isDropdown = React.useMemo(function () {
2977
+ return !!(options != null && options.length);
2978
+ }, [options]);
2989
2979
  var handleOptionKeyDown = function handleOptionKeyDown(e, link) {
2990
2980
  if (e.key === 'Enter') {
2991
2981
  onOptionClick == null || onOptionClick(link);
@@ -3005,13 +2995,15 @@ var ControlledDropdown = function ControlledDropdown(_ref) {
3005
2995
  _onBlur == null || _onBlur();
3006
2996
  }
3007
2997
  };
3008
- var isDropdown = !!(options != null && options.length);
3009
2998
  var wrapperEvents = {
3010
2999
  onMouseEnter: function onMouseEnter() {
3011
3000
  return _onMouseEnter == null ? void 0 : _onMouseEnter();
3012
3001
  },
3013
3002
  onMouseLeave: function onMouseLeave() {
3014
3003
  return _onMouseLeave == null ? void 0 : _onMouseLeave();
3004
+ },
3005
+ onFocusLeave: function onFocusLeave() {
3006
+ return _onFocusLeave == null ? void 0 : _onFocusLeave();
3015
3007
  }
3016
3008
  };
3017
3009
  var headerEvents = {
@@ -3027,21 +3019,51 @@ var ControlledDropdown = function ControlledDropdown(_ref) {
3027
3019
  },
3028
3020
  onKeyDown: handleHeaderKeyDown
3029
3021
  };
3022
+ React.useEffect(function () {
3023
+ var mouseEvent = function mouseEvent(e) {
3024
+ var _internalRef$current;
3025
+ if (internalRef != null && (_internalRef$current = internalRef.current) != null && _internalRef$current.contains(e.target)) return;
3026
+ if (active) resetHandler();
3027
+ };
3028
+ if (window.innerWidth > breakpoints.sm) {
3029
+ document.addEventListener('click', mouseEvent);
3030
+ }
3031
+ return function () {
3032
+ document.removeEventListener('click', mouseEvent);
3033
+ };
3034
+ }, [resetHandler, active]);
3035
+ React.useEffect(function () {
3036
+ var handleFocusOut = function handleFocusOut(e) {
3037
+ if (internalRef.current && !internalRef.current.contains(e.relatedTarget)) {
3038
+ _onFocusLeave == null || _onFocusLeave();
3039
+ }
3040
+ };
3041
+ var node = internalRef.current;
3042
+ if (node) node.addEventListener('focusout', handleFocusOut);
3043
+ return function () {
3044
+ return node == null ? void 0 : node.removeEventListener('focusout', handleFocusOut);
3045
+ };
3046
+ }, [_onFocusLeave]);
3030
3047
  return /*#__PURE__*/React__default.createElement(ControlledDropdownWrapper, Object.assign({
3031
- ref: ref
3048
+ ref: internalRef
3032
3049
  }, wrapperEvents, {
3033
3050
  className: className
3034
3051
  }), isDropdown ? (/*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(ControlledDropdownHeaderContainer, Object.assign({
3035
3052
  active: active
3036
3053
  }, headerEvents, {
3037
- tabIndex: 0,
3038
- "data-testid": "span-container"
3054
+ "data-testid": "span-container",
3055
+ role: "menuitem",
3056
+ "aria-controls": "dropdown-menu",
3057
+ "aria-haspopup": "menu",
3058
+ "aria-expanded": active
3039
3059
  }), text, /*#__PURE__*/React__default.createElement(IconWrapper, {
3040
3060
  "data-testid": "dropdown-icon"
3041
3061
  }, /*#__PURE__*/React__default.createElement(Icon, {
3042
3062
  iconName: "DropdownArrow"
3043
3063
  }))), active && options ? (/*#__PURE__*/React__default.createElement(OptionsContainer, {
3044
- withOptionsInMobile: true
3064
+ withOptionsInMobile: true,
3065
+ role: "menu",
3066
+ id: "dropdown-menu"
3045
3067
  }, options.map(function (optionItem, index) {
3046
3068
  return /*#__PURE__*/React__default.createElement(OptionItem, {
3047
3069
  key: "key-" + index + "-" + optionItem.option,
@@ -3055,15 +3077,17 @@ var ControlledDropdown = function ControlledDropdown(_ref) {
3055
3077
  onBlur: function onBlur() {
3056
3078
  return handleOptionBlur(index);
3057
3079
  },
3058
- href: optionItem.optionLink
3080
+ href: optionItem.optionLink,
3081
+ role: "menuitem"
3059
3082
  }, optionItem.option);
3060
3083
  }))) : null)) : (/*#__PURE__*/React__default.createElement(ControlledDropdownHeaderContainerLink, Object.assign({
3061
3084
  active: active
3062
3085
  }, headerEvents, {
3063
3086
  "data-testid": "link-container",
3087
+ role: "menuitem",
3064
3088
  tabIndex: 0
3065
3089
  }), text)));
3066
- };
3090
+ });
3067
3091
 
3068
3092
  var _templateObject$8;
3069
3093
  var Grid = /*#__PURE__*/styled__default.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"])));
@@ -5582,6 +5606,7 @@ var Tabs = function Tabs(_ref) {
5582
5606
  var _useState3 = React.useState(-1),
5583
5607
  hoverOverDropdown = _useState3[0],
5584
5608
  setHoverOverDropdown = _useState3[1];
5609
+ var dropdownRefs = React.useRef([]);
5585
5610
  var onClickHandler = function onClickHandler(value) {
5586
5611
  setOpenMenu(value);
5587
5612
  if (onShowMenu) {
@@ -5621,23 +5646,25 @@ var Tabs = function Tabs(_ref) {
5621
5646
  setHoverOverDropdown(-1);
5622
5647
  }
5623
5648
  };
5624
- var _onFocus = function onFocus(i) {
5625
- return setActiveDropdown(i);
5649
+ var onDropdownFocusLeave = function onDropdownFocusLeave() {
5650
+ onResetActive();
5626
5651
  };
5627
- var _onBlur = function onBlur(i) {
5628
- var _items$length;
5629
- if (i === ((_items$length = items == null ? void 0 : items.length) != null ? _items$length : 0) - 1) {
5652
+ var handleBlur = function handleBlur(index) {
5653
+ var currentDropdown = dropdownRefs.current[index];
5654
+ var active = document.activeElement;
5655
+ if (currentDropdown && (!active || !currentDropdown.contains(active))) {
5630
5656
  onResetActive();
5631
5657
  }
5632
5658
  };
5633
5659
  return /*#__PURE__*/React__default.createElement(TabsContainer, {
5660
+ role: "menubar",
5634
5661
  className: className
5635
5662
  }, /*#__PURE__*/React__default.createElement(ItemsContainer, {
5636
5663
  showMenu: showMenu
5637
5664
  }, items.map(function (item, index) {
5638
5665
  return /*#__PURE__*/React__default.createElement(ControlledDropdown, {
5639
5666
  key: "key-" + item.title,
5640
- text: item.title,
5667
+ text: item.title || '',
5641
5668
  options: item.options,
5642
5669
  onClick: function onClick() {
5643
5670
  return onDropdownClick(index, item.titleLink);
@@ -5649,14 +5676,17 @@ var Tabs = function Tabs(_ref) {
5649
5676
  onMouseLeave: function onMouseLeave() {
5650
5677
  return onDropdownMouseLeave();
5651
5678
  },
5652
- onFocus: function onFocus() {
5653
- return _onFocus(index);
5679
+ onFocusLeave: function onFocusLeave() {
5680
+ return onDropdownFocusLeave();
5654
5681
  },
5655
5682
  onBlur: function onBlur() {
5656
- return _onBlur(index);
5683
+ return handleBlur(index);
5657
5684
  },
5658
5685
  onReset: onResetActive,
5659
- active: isActiveDropdown(index)
5686
+ active: isActiveDropdown(index),
5687
+ ref: function ref(el) {
5688
+ dropdownRefs.current[index] = el;
5689
+ }
5660
5690
  });
5661
5691
  })), !showMenu && (/*#__PURE__*/React__default.createElement(MenuContainer$1, null, openMenu ? (/*#__PURE__*/React__default.createElement("a", {
5662
5692
  "data-testid": "mobile-menu-close",
@@ -8919,6 +8949,7 @@ var PageHeading = function PageHeading(_ref) {
8919
8949
  "data-testid": "page-heading-text"
8920
8950
  }, /*#__PURE__*/React__default.createElement(BodyCopyHarmonic, {
8921
8951
  color: "white",
8952
+ size: "large",
8922
8953
  dangerouslySetInnerHTML: {
8923
8954
  __html: truncatedText
8924
8955
  }