@royaloperahouse/chord 2.3.3 → 2.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/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## [2.4.0]
2
+ - Added optional semantic level props to Page Heading, Alt Header, Promo With Title, and Section Title
3
+ - Added optional character limit prop to Page Heading
4
+
1
5
  ## [2.3.3]
2
6
  - Reintroduced legacy behaviour of <TextField /> via opt-in component
3
7
 
@@ -2789,9 +2789,10 @@ var StyledTag = function StyledTag(_ref) {
2789
2789
  }, children);
2790
2790
  };
2791
2791
  var AltHeader = function AltHeader(_ref2) {
2792
- var level = _ref2.level,
2792
+ var semanticLevel = _ref2.semanticLevel,
2793
+ level = _ref2.level,
2793
2794
  children = _ref2.children;
2794
- var renderedTag = "h" + level;
2795
+ var renderedTag = semanticLevel ? "h" + semanticLevel : "h" + level;
2795
2796
  return /*#__PURE__*/React__default.createElement(StyledTag, {
2796
2797
  tag: renderedTag,
2797
2798
  typography: "altHeader",
@@ -4991,7 +4992,7 @@ var _templateObject$w, _templateObject2$j, _templateObject3$d, _templateObject4$
4991
4992
  var VideoPlayButton = /*#__PURE__*/styled__default.button(_templateObject$w || (_templateObject$w = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n width: 48px;\n height: 48px;\n border-radius: 50%;\n background-color: #fff;\n border: none;\n padding: 12px;\n cursor: pointer;\n"])));
4992
4993
  var VideoFullscreenButton = /*#__PURE__*/styled__default.button(_templateObject2$j || (_templateObject2$j = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n width: 56px;\n height: 36px;\n background-color: rgb(26, 26, 26, 0.6);\n border-radius: 5px;\n padding: 5px 14px;\n border: none;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n"])));
4993
4994
  var VideoControlsWrapper = /*#__PURE__*/styled__default.div(_templateObject3$d || (_templateObject3$d = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n position: absolute;\n bottom: 0;\n width: 100%;\n"])));
4994
- var VideoControlsInnerWrapper = /*#__PURE__*/styled__default.div(_templateObject4$a || (_templateObject4$a = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin: 10px;\n"])));
4995
+ var VideoControlsInnerWrapper = /*#__PURE__*/styled__default.div(_templateObject4$a || (_templateObject4$a = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin: 0 40px 17px 30px;\n"])));
4995
4996
  var LeftWrapper = /*#__PURE__*/styled__default.div(_templateObject5$6 || (_templateObject5$6 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n display: flex;\n align-items: center;\n"])));
4996
4997
  var VideoVolume = /*#__PURE__*/styled__default.input(_templateObject6$4 || (_templateObject6$4 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n width: 100px;\n margin-left: 24px;\n"])));
4997
4998
  var VideoMute = /*#__PURE__*/styled__default.button(_templateObject7$1 || (_templateObject7$1 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n width: 17px;\n height: 17px;\n background: none;\n border: none;\n padding: 0;\n svg {\n width: 100%;\n height: 100%;\n }\n cursor: pointer;\n"])));
@@ -5061,6 +5062,16 @@ var VideoControls = function VideoControls(_ref2) {
5061
5062
  video.loop = loop;
5062
5063
  }
5063
5064
  }, [loop]);
5065
+ React.useEffect(function () {
5066
+ var handleFullscreenChange = function handleFullscreenChange() {
5067
+ setIsFullscreen(!!document.fullscreenElement);
5068
+ };
5069
+
5070
+ document.addEventListener('fullscreenchange', handleFullscreenChange);
5071
+ return function () {
5072
+ document.removeEventListener('fullscreenchange', handleFullscreenChange);
5073
+ };
5074
+ }, []);
5064
5075
  var handleFullscreen = React.useCallback( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/runtime_1.mark(function _callee() {
5065
5076
  var videoContainer;
5066
5077
  return runtime_1.wrap(function _callee$(_context) {
@@ -5159,7 +5170,9 @@ var VideoControls = function VideoControls(_ref2) {
5159
5170
  setVolume(newVolume);
5160
5171
  }
5161
5172
  }, [isMuted]);
5162
- return /*#__PURE__*/React__default.createElement(VideoControlsWrapper, null, /*#__PURE__*/React__default.createElement(VideoControlsInnerWrapper, null, /*#__PURE__*/React__default.createElement(LeftWrapper, null, /*#__PURE__*/React__default.createElement(VideoPlayButton, {
5173
+ return /*#__PURE__*/React__default.createElement(VideoControlsWrapper, {
5174
+ className: "video-controls-container"
5175
+ }, /*#__PURE__*/React__default.createElement(VideoControlsInnerWrapper, null, /*#__PURE__*/React__default.createElement(LeftWrapper, null, /*#__PURE__*/React__default.createElement(VideoPlayButton, {
5163
5176
  id: "play",
5164
5177
  onClick: handlePlay,
5165
5178
  className: "video-play-button",
@@ -7840,14 +7853,20 @@ var PageHeading = function PageHeading(_ref) {
7840
7853
  link = _ref.link,
7841
7854
  _ref$sponsor = _ref.sponsor,
7842
7855
  sponsor = _ref$sponsor === void 0 ? false : _ref$sponsor,
7843
- children = _ref.children;
7856
+ children = _ref.children,
7857
+ _ref$semanticLevel = _ref.semanticLevel,
7858
+ semanticLevel = _ref$semanticLevel === void 0 ? 1 : _ref$semanticLevel,
7859
+ _ref$copyCharLimit = _ref.copyCharLimit,
7860
+ copyCharLimit = _ref$copyCharLimit === void 0 ? 250 : _ref$copyCharLimit,
7861
+ _ref$titleCharLimit = _ref.titleCharLimit,
7862
+ titleCharLimit = _ref$titleCharLimit === void 0 ? 40 : _ref$titleCharLimit;
7844
7863
 
7845
7864
  var _ref2 = link || {},
7846
7865
  linkText = _ref2.text,
7847
7866
  restLink = _objectWithoutPropertiesLoose(_ref2, ["text"]);
7848
7867
 
7849
- var truncatedText = text == null ? void 0 : text.substring(0, 250);
7850
- var truncatedTitle = title && title.substring(0, 40);
7868
+ var truncatedText = text == null ? void 0 : text.substring(0, copyCharLimit);
7869
+ var truncatedTitle = title && title.substring(0, titleCharLimit);
7851
7870
  var isTitleUnAvailable = !title;
7852
7871
  return /*#__PURE__*/React__default.createElement(PageHeadingWrapper, {
7853
7872
  "data-testid": "page-heading-wrapper",
@@ -7858,7 +7877,8 @@ var PageHeading = function PageHeading(_ref) {
7858
7877
  }, children ? /*#__PURE__*/React__default.createElement(ChildrenWrapper, {
7859
7878
  isPageHeadingWithoutTitle: isTitleUnAvailable
7860
7879
  }, children) : null, !isTitleUnAvailable && /*#__PURE__*/React__default.createElement(Header, {
7861
- level: 2
7880
+ level: 2,
7881
+ semanticLevel: semanticLevel
7862
7882
  }, truncatedTitle)), text ? /*#__PURE__*/React__default.createElement(TextWrapper, {
7863
7883
  "data-testid": "page-heading-text"
7864
7884
  }, /*#__PURE__*/React__default.createElement(PageHeadingText, {
@@ -7925,7 +7945,9 @@ var PageHeadingImpact = function PageHeadingImpact(_ref) {
7925
7945
  bgUrlDesktop = _ref.bgUrlDesktop,
7926
7946
  bgUrlDevice = _ref.bgUrlDevice,
7927
7947
  _ref$bgImageAltText = _ref.bgImageAltText,
7928
- bgImageAltText = _ref$bgImageAltText === void 0 ? '' : _ref$bgImageAltText;
7948
+ bgImageAltText = _ref$bgImageAltText === void 0 ? '' : _ref$bgImageAltText,
7949
+ _ref$semanticLevel = _ref.semanticLevel,
7950
+ semanticLevel = _ref$semanticLevel === void 0 ? 3 : _ref$semanticLevel;
7929
7951
  var truncatedText = text && text.substring(0, 75);
7930
7952
 
7931
7953
  var _ref2 = link || {},
@@ -7961,7 +7983,8 @@ var PageHeadingImpact = function PageHeadingImpact(_ref) {
7961
7983
  }, children) : null, text ? /*#__PURE__*/React__default.createElement(TextWrapper$1, {
7962
7984
  "data-testid": "impact-text"
7963
7985
  }, /*#__PURE__*/React__default.createElement(Header, {
7964
- level: 3
7986
+ level: 3,
7987
+ semanticLevel: semanticLevel
7965
7988
  }, truncatedText)) : null, link ? /*#__PURE__*/React__default.createElement(ButtonWrapper$2, {
7966
7989
  "data-testid": "impact-link"
7967
7990
  }, /*#__PURE__*/React__default.createElement(PrimaryButton, Object.assign({}, restLink), linkText)) : null), scrollHref ? /*#__PURE__*/React__default.createElement(ScrollDownWrapper, {
@@ -8329,7 +8352,11 @@ var PageHeadingCompact = function PageHeadingCompact(_ref4) {
8329
8352
  _ref4$brandingStyle = _ref4.brandingStyle,
8330
8353
  brandingStyle = _ref4$brandingStyle === void 0 ? 'BlockText' : _ref4$brandingStyle,
8331
8354
  brandingText = _ref4.brandingText,
8332
- brandingLink = _ref4.brandingLink;
8355
+ brandingLink = _ref4.brandingLink,
8356
+ _ref4$showCopy = _ref4.showCopy,
8357
+ showCopy = _ref4$showCopy === void 0 ? true : _ref4$showCopy,
8358
+ _ref4$semanticLevel = _ref4.semanticLevel,
8359
+ semanticLevel = _ref4$semanticLevel === void 0 ? 1 : _ref4$semanticLevel;
8333
8360
 
8334
8361
  var _ref5 = link || {},
8335
8362
  linkText = _ref5.text,
@@ -8355,7 +8382,7 @@ var PageHeadingCompact = function PageHeadingCompact(_ref4) {
8355
8382
  })) : /*#__PURE__*/React__default.createElement(Sponsorship, null)) : null, /*#__PURE__*/React__default.createElement(CompactHeaderAssetWrapper, null, /*#__PURE__*/React__default.createElement(CompactHeaderVideo, {
8356
8383
  video: video,
8357
8384
  poster: poster
8358
- })), /*#__PURE__*/React__default.createElement(CompactHeaderCopyWrapper, {
8385
+ })), showCopy && /*#__PURE__*/React__default.createElement(CompactHeaderCopyWrapper, {
8359
8386
  className: "page-heading-compact__background",
8360
8387
  invert: invert
8361
8388
  }, /*#__PURE__*/React__default.createElement(CompactHeaderBranding, {
@@ -8365,7 +8392,7 @@ var PageHeadingCompact = function PageHeadingCompact(_ref4) {
8365
8392
  invert: invert
8366
8393
  }), /*#__PURE__*/React__default.createElement(CompactHeaderTitleWrapper, null, /*#__PURE__*/React__default.createElement(Header, {
8367
8394
  level: titleSize,
8368
- semanticLevel: 1
8395
+ semanticLevel: semanticLevel
8369
8396
  }, title && truncate(title, 40))), link && /*#__PURE__*/React__default.createElement(CompactHeaderCTAWrapper, null, /*#__PURE__*/React__default.createElement(PrimaryButtonWithInversion, Object.assign({}, restLink, {
8370
8397
  invert: invert,
8371
8398
  className: "page-heading-compact__button"
@@ -8913,7 +8940,7 @@ var ButtonsContainer$3 = /*#__PURE__*/styled__default.div(_templateObject7$d ||
8913
8940
  });
8914
8941
 
8915
8942
  var _templateObject$15;
8916
- var VideoContainer = /*#__PURE__*/styled__default.div(_templateObject$15 || (_templateObject$15 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n position: relative;\n aspect-ratio: ", ";\n\n @supports not (aspect-ratio: ", ") {\n width: 100%;\n padding-top: ", "%;\n }\n"])), function (_ref) {
8943
+ var VideoContainer = /*#__PURE__*/styled__default.div(_templateObject$15 || (_templateObject$15 = /*#__PURE__*/_taggedTemplateLiteralLoose(["\n position: relative;\n aspect-ratio: ", ";\n\n @supports not (aspect-ratio: ", ") {\n width: 100%;\n padding-top: ", "%;\n }\n\n video {\n display: block;\n width: 100%;\n height: 100%;\n object-fit: cover;\n\n @supports not (aspect-ratio: ", ") {\n position: absolute;\n top: 0;\n left: 0;\n }\n }\n"])), function (_ref) {
8917
8944
  var _ref$aspectRatio = _ref.aspectRatio,
8918
8945
  aspectRatio = _ref$aspectRatio === void 0 ? exports.AspectRatio['1:1'] : _ref$aspectRatio;
8919
8946
  return aspectRatio;
@@ -8925,6 +8952,10 @@ var VideoContainer = /*#__PURE__*/styled__default.div(_templateObject$15 || (_te
8925
8952
  var _ref3$aspectRatio = _ref3.aspectRatio,
8926
8953
  aspectRatio = _ref3$aspectRatio === void 0 ? exports.AspectRatio['1:1'] : _ref3$aspectRatio;
8927
8954
  return AspectRatioLegacy[aspectRatio];
8955
+ }, function (_ref4) {
8956
+ var _ref4$aspectRatio = _ref4.aspectRatio,
8957
+ aspectRatio = _ref4$aspectRatio === void 0 ? exports.AspectRatio['1:1'] : _ref4$aspectRatio;
8958
+ return aspectRatio;
8928
8959
  });
8929
8960
 
8930
8961
  var getAspectRatioFromVideo = function getAspectRatioFromVideo(video) {
@@ -8941,17 +8972,50 @@ var getAspectRatioFromVideo = function getAspectRatioFromVideo(video) {
8941
8972
  return exports.AspectRatio[aspectRatioKey] || exports.AspectRatio['16:9'];
8942
8973
  };
8943
8974
 
8975
+ /**
8976
+ * Generates a random string in the format XXX-XXX.
8977
+ * Does not meet UUID standards.
8978
+ * To be used where only a small number of unique IDs are required, e.g. DOM element IDs.
8979
+ *
8980
+ * @return {string} A random string in the format XXX-XXX.
8981
+ */
8982
+ var generateDomElementId = function generateDomElementId() {
8983
+ var randomPart = Math.floor(100 + Math.random() * 900).toString();
8984
+ var datePart = Date.now().toString().slice(-3);
8985
+ return randomPart + "-" + datePart;
8986
+ };
8987
+
8944
8988
  var VideoWithControls$1 = function VideoWithControls(_ref) {
8945
8989
  var video = _ref.video,
8946
8990
  settings = _ref.settings;
8947
- var muted = settings.muted,
8948
- autoPlay = settings.autoPlay;
8991
+ var videoRef = React.useRef(null);
8949
8992
 
8950
8993
  var _useState = React.useState(exports.AspectRatio['16:9']),
8951
8994
  aspectRatio = _useState[0],
8952
8995
  setAspectRatio = _useState[1];
8953
8996
 
8954
- var videoRef = React.useRef(null);
8997
+ var _React$useState = React__default.useState(false),
8998
+ isVideoReady = _React$useState[0],
8999
+ setIsVideoReady = _React$useState[1];
9000
+
9001
+ var muted = settings.muted,
9002
+ autoPlay = settings.autoPlay;
9003
+ React__default.useEffect(function () {
9004
+ var changeVideoReadiness = function changeVideoReadiness() {
9005
+ setIsVideoReady(true);
9006
+ };
9007
+
9008
+ if (videoRef.current) {
9009
+ videoRef.current.addEventListener('canplay', changeVideoReadiness);
9010
+ return function () {
9011
+ var _videoRef$current;
9012
+
9013
+ return (_videoRef$current = videoRef.current) == null ? void 0 : _videoRef$current.removeEventListener('canplay', changeVideoReadiness);
9014
+ };
9015
+ }
9016
+
9017
+ return undefined;
9018
+ }, []);
8955
9019
 
8956
9020
  var handleMetadataLoaded = function handleMetadataLoaded() {
8957
9021
  if (videoRef.current) {
@@ -8960,18 +9024,24 @@ var VideoWithControls$1 = function VideoWithControls(_ref) {
8960
9024
  }
8961
9025
  };
8962
9026
 
8963
- var clonedVideo = /*#__PURE__*/React.cloneElement(video, _extends({}, muted ? {
9027
+ var videoElementId = React.useMemo(function () {
9028
+ return "video-id-" + generateDomElementId();
9029
+ }, []);
9030
+ var clonedVideo = /*#__PURE__*/React.cloneElement(video, _extends({
9031
+ playsInline: true
9032
+ }, muted ? {
8964
9033
  muted: true
8965
9034
  } : {}, autoPlay && muted ? {
8966
9035
  autoPlay: true
8967
9036
  } : {}, {
8968
9037
  height: '100%',
8969
9038
  width: '100%',
8970
- onLoadedMetadata: handleMetadataLoaded
9039
+ onLoadedMetadata: handleMetadataLoaded,
9040
+ id: videoElementId
8971
9041
  }, {
9042
+ poster: autoPlay && isVideoReady ? undefined : video.props.poster,
8972
9043
  ref: videoRef
8973
9044
  }));
8974
- var videoElementId = clonedVideo.props.id;
8975
9045
  var videoContainerId = "video-container-for-" + videoElementId;
8976
9046
 
8977
9047
  var videoControlsProps = _extends({}, settings, {
@@ -8979,14 +9049,13 @@ var VideoWithControls$1 = function VideoWithControls(_ref) {
8979
9049
  videoContainerId: videoContainerId
8980
9050
  });
8981
9051
 
8982
- React.useEffect(function () {
8983
- setAspectRatio(exports.AspectRatio['16:9']);
8984
- }, [video.props.src]);
9052
+ var showVideoControls = autoPlay ? isVideoReady : true;
8985
9053
  return /*#__PURE__*/React__default.createElement(VideoContainer, {
9054
+ className: "video-with-controls-container",
8986
9055
  aspectRatio: aspectRatio,
8987
9056
  id: videoContainerId,
8988
- "data-testid": videoContainerId
8989
- }, clonedVideo, /*#__PURE__*/React__default.createElement(VideoControls, Object.assign({}, videoControlsProps)));
9057
+ "data-testid": 'video-container'
9058
+ }, clonedVideo, showVideoControls && /*#__PURE__*/React__default.createElement(VideoControls, Object.assign({}, videoControlsProps)));
8990
9059
  };
8991
9060
 
8992
9061
  var PromoChild = function PromoChild(_ref) {
@@ -9020,7 +9089,8 @@ var PromoWithTitle = function PromoWithTitle(_ref) {
9020
9089
  text = _ref.text,
9021
9090
  links = _ref.links,
9022
9091
  children = _ref.children,
9023
- videoSettings = _ref.videoSettings;
9092
+ videoSettings = _ref.videoSettings,
9093
+ titleSemanticLevel = _ref.titleSemanticLevel;
9024
9094
 
9025
9095
  var truncate = function truncate(str, n) {
9026
9096
  return str.length >= n ? str.substr(0, n) : str;
@@ -9061,7 +9131,8 @@ var PromoWithTitle = function PromoWithTitle(_ref) {
9061
9131
  "data-testid": "content-wrapper",
9062
9132
  imageToLeft: imageToLeft
9063
9133
  }, /*#__PURE__*/React__default.createElement(PromoWithTitleContainer, null, /*#__PURE__*/React__default.createElement(Header, {
9064
- level: titleLevel
9134
+ level: titleLevel,
9135
+ semanticLevel: titleSemanticLevel != null ? titleSemanticLevel : titleLevel
9065
9136
  }, title)), subtitle ? /*#__PURE__*/React__default.createElement(PromoWithTitleSubtitle, null, subtitle) : null, /*#__PURE__*/React__default.createElement(PromoWithTitleText, {
9066
9137
  dangerouslySetInnerHTML: {
9067
9138
  __html: text
@@ -9294,7 +9365,8 @@ var SectionTitle = function SectionTitle(_ref) {
9294
9365
  var title = _ref.title,
9295
9366
  _ref$size = _ref.size,
9296
9367
  size = _ref$size === void 0 ? 'small' : _ref$size,
9297
- description = _ref.description;
9368
+ description = _ref.description,
9369
+ semanticLevel = _ref.semanticLevel;
9298
9370
  var headingLevel = size === 'large' ? 1 : 2;
9299
9371
  return /*#__PURE__*/React__default.createElement(SectionTitleWrapper, null, /*#__PURE__*/React__default.createElement(Grid, null, /*#__PURE__*/React__default.createElement(GridItem, {
9300
9372
  columnStartDesktop: 3,
@@ -9302,7 +9374,8 @@ var SectionTitle = function SectionTitle(_ref) {
9302
9374
  columnStartDevice: 2,
9303
9375
  columnSpanDevice: 12
9304
9376
  }, /*#__PURE__*/React__default.createElement(Header, {
9305
- level: headingLevel
9377
+ level: headingLevel,
9378
+ semanticLevel: semanticLevel != null ? semanticLevel : headingLevel
9306
9379
  }, title)), description && /*#__PURE__*/React__default.createElement(GridItem, {
9307
9380
  columnStartDesktop: 3,
9308
9381
  columnSpanDesktop: 8,
@@ -11871,6 +11944,7 @@ exports.TypeTags = TypeTags;
11871
11944
  exports.UpsellCard = UpsellCard;
11872
11945
  exports.UpsellSection = UpsellSection;
11873
11946
  exports.VideoControls = VideoControls;
11947
+ exports.VideoWithControls = VideoWithControls$1;
11874
11948
  exports.breakpoints = breakpoints;
11875
11949
  exports.devices = devices;
11876
11950
  exports.zIndexes = zIndexes;