@micromag/viewer 0.3.251 → 0.3.252

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/es/index.js CHANGED
@@ -5,13 +5,14 @@ import React, { useEffect, useState, useCallback, useMemo, useRef } from 'react'
5
5
  import { Switch, Route, MemoryRouter } from 'react-router';
6
6
  import { Link, BrowserRouter } from 'react-router-dom';
7
7
  import { PropTypes as PropTypes$1 } from '@micromag/core';
8
- import { useViewerSize, usePlaybackContext, useViewerWebView, useViewerInteraction, VisitorProvider, ScreenSizeProvider, ViewerProvider, useRoutes, useRoutePush, GoogleKeysProvider, GoogleMapsClientProvider, FieldsProvider, ComponentsProvider, SCREENS_NAMESPACE, UserInteractionProvider, PlaybackProvider, TrackingProvider, RoutesProvider } from '@micromag/core/contexts';
8
+ import { useViewerSize, usePlaybackContext, useViewerWebView, useViewerInteraction, StoryProvider, ScreenSizeProvider, ViewerProvider, useRoutes, useRoutePush, GoogleKeysProvider, GoogleMapsClientProvider, FieldsProvider, ComponentsProvider, SCREENS_NAMESPACE, VisitorProvider, PlaybackProvider, TrackingProvider, RoutesProvider } from '@micromag/core/contexts';
9
9
  import fieldsManager from '@micromag/fields/manager';
10
10
  import { IntlProvider } from '@micromag/intl';
11
11
  import { ScreensProvider } from '@micromag/screens';
12
12
  import _defineProperty from '@babel/runtime/helpers/defineProperty';
13
13
  import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
14
14
  import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
15
+ import { animated } from '@react-spring/web';
15
16
  import classNames from 'classnames';
16
17
  import { Helmet } from 'react-helmet';
17
18
  import EventEmitter from 'wolfy87-eventemitter';
@@ -22,7 +23,6 @@ import { useIntl, FormattedMessage } from 'react-intl';
22
23
  import { faTimes } from '@fortawesome/free-solid-svg-icons/faTimes';
23
24
  import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
24
25
  import { useSpring } from '@react-spring/core';
25
- import { animated } from '@react-spring/web';
26
26
  import Scroll from '@micromag/element-scroll';
27
27
  import ShareOptions from '@micromag/element-share-options';
28
28
  import { useGesture } from '@use-gesture/react';
@@ -114,6 +114,7 @@ function useScreenInteraction() {
114
114
  var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
115
115
  screens = _ref.screens,
116
116
  screenIndex = _ref.screenIndex,
117
+ screenWidth = _ref.screenWidth,
117
118
  _ref$disableCurrentSc = _ref.disableCurrentScreenNavigation,
118
119
  disableCurrentScreenNavigation = _ref$disableCurrentSc === void 0 ? false : _ref$disableCurrentSc,
119
120
  _ref$clickOnSiblings = _ref.clickOnSiblings,
@@ -183,13 +184,14 @@ function useScreenInteraction() {
183
184
  }
184
185
 
185
186
  var _currentTarget$getBou = currentTarget.getBoundingClientRect(),
186
- left = _currentTarget$getBou.left,
187
187
  width = _currentTarget$getBou.width;
188
188
 
189
- var relativeX = x - left;
190
- var direction = relativeX < width * (1 - nextScreenWidthPercent) ? 'previous' : 'next';
189
+ var margin = (width - screenWidth) / 2;
190
+ var screenPreviousZone = screenWidth * (1 - nextScreenWidthPercent);
191
+ var previousZone = margin + screenPreviousZone;
192
+ var direction = x < previousZone ? 'previous' : 'next';
191
193
  var lastIndex = screensCount - 1;
192
- var nextIndex = index; // @todo investigate what clickOnSiblings is doing
194
+ var nextIndex = index;
193
195
 
194
196
  if (direction === 'previous' && !clickOnSiblings) {
195
197
  nextIndex = Math.max(0, screenIndex - 1);
@@ -511,14 +513,14 @@ var styles$e = {"container":"micromag-viewer-buttons-toggle-button-container","n
511
513
 
512
514
  var propTypes$i = {
513
515
  className: PropTypes.string,
514
- toggled: PropTypes.number,
516
+ progressSpring: PropTypes.number,
515
517
  button: PropTypes.node,
516
518
  toggledButton: PropTypes.node,
517
519
  toggledButtonClassName: PropTypes.string
518
520
  };
519
521
  var defaultProps$i = {
520
522
  className: null,
521
- toggled: 0,
523
+ progressSpring: 0,
522
524
  button: null,
523
525
  toggledButton: null,
524
526
  toggledButtonClassName: null
@@ -526,26 +528,27 @@ var defaultProps$i = {
526
528
 
527
529
  var ToggleButton = function ToggleButton(_ref) {
528
530
  var className = _ref.className,
529
- toggled = _ref.toggled,
531
+ progressSpring = _ref.progressSpring,
530
532
  button = _ref.button,
531
533
  toggledButton = _ref.toggledButton,
532
534
  toggledButtonClassName = _ref.toggledButtonClassName;
533
535
  if (button === null) return false;
534
-
535
- var getToggleButtonStyles = function getToggleButtonStyles(t) {
536
- return {
537
- transform: "translateY(".concat(t * -100, "%)")
538
- };
539
- };
540
-
541
536
  return /*#__PURE__*/React.createElement("div", {
542
537
  className: classNames([styles$e.container, _defineProperty({}, className, className !== null)])
543
- }, /*#__PURE__*/React.createElement("div", {
538
+ }, /*#__PURE__*/React.createElement(animated.div, {
544
539
  className: styles$e.normal,
545
- style: getToggleButtonStyles(toggled)
546
- }, button), /*#__PURE__*/React.createElement("div", {
540
+ style: {
541
+ transform: progressSpring.to(function (p) {
542
+ return "translateY(".concat(p * -100, "%)");
543
+ })
544
+ }
545
+ }, button), /*#__PURE__*/React.createElement(animated.div, {
547
546
  className: classNames([styles$e.toggled, _defineProperty({}, toggledButtonClassName, toggledButtonClassName !== null)]),
548
- style: getToggleButtonStyles(toggled - 1)
547
+ style: {
548
+ transform: progressSpring.to(function (p) {
549
+ return "translateY(".concat((p - 1) * -100, "%)");
550
+ })
551
+ }
549
552
  }, toggledButton));
550
553
  };
551
554
 
@@ -556,20 +559,20 @@ var styles$d = {"backdrop":"micromag-viewer-menus-menu-container-backdrop","heig
556
559
 
557
560
  var propTypes$h = {
558
561
  className: PropTypes.string,
559
- transitionProgress: PropTypes.number,
562
+ progressSpring: PropTypes.number,
560
563
  theme: PropTypes$1.viewerTheme,
561
564
  children: PropTypes.node
562
565
  };
563
566
  var defaultProps$h = {
564
567
  className: null,
565
- transitionProgress: 0,
568
+ progressSpring: 0,
566
569
  theme: null,
567
570
  children: null
568
571
  };
569
572
 
570
573
  var ViewerMenuContainer = function ViewerMenuContainer(_ref) {
571
574
  var className = _ref.className,
572
- transitionProgress = _ref.transitionProgress,
575
+ progressSpring = _ref.progressSpring,
573
576
  viewerTheme = _ref.theme,
574
577
  children = _ref.children;
575
578
 
@@ -587,17 +590,26 @@ var ViewerMenuContainer = function ViewerMenuContainer(_ref) {
587
590
  style: {
588
591
  pointerEvents: 'none'
589
592
  }
590
- }, /*#__PURE__*/React.createElement("div", {
593
+ }, /*#__PURE__*/React.createElement(animated.div, {
591
594
  className: styles$d.heightContainer,
592
595
  style: _objectSpread({
593
- height: "".concat(transitionProgress * 100, "%"),
594
- pointerEvents: transitionProgress < 0.25 ? 'none' : 'auto',
595
- zIndex: Math.round(2 + transitionProgress)
596
+ opacity: progressSpring,
597
+ transform: progressSpring.to(function (p) {
598
+ return "translateY(".concat((1 - p) * -2, "rem)");
599
+ }),
600
+ pointerEvents: progressSpring.to(function (p) {
601
+ return p < 0.25 ? 'none' : 'auto';
602
+ }),
603
+ zIndex: progressSpring.to(function (p) {
604
+ return Math.round(2 + p);
605
+ })
596
606
  }, backgroundColorStyle)
597
- }, children), /*#__PURE__*/React.createElement("div", {
607
+ }, children), /*#__PURE__*/React.createElement(animated.div, {
598
608
  className: styles$d.backdrop,
599
609
  style: {
600
- opacity: easings.easeOutQuint(transitionProgress)
610
+ opacity: progressSpring.to(function (p) {
611
+ return easings.easeOutQuint(p);
612
+ })
601
613
  }
602
614
  }));
603
615
  };
@@ -924,7 +936,10 @@ var ViewerMenuScreen = function ViewerMenuScreen(_ref) {
924
936
  }]
925
937
  })) : '');
926
938
  return /*#__PURE__*/React.createElement("div", {
927
- className: classNames([styles$a.container, (_ref4 = {}, _defineProperty(_ref4, className, className !== null), _defineProperty(_ref4, styles$a.isCurrent, current), _ref4)])
939
+ className: classNames([styles$a.container, (_ref4 = {}, _defineProperty(_ref4, className, className !== null), _defineProperty(_ref4, styles$a.isCurrent, current), _ref4)]),
940
+ style: {
941
+ paddingBottom: "".concat(screenHeight / screenWidth * 100, "%")
942
+ }
928
943
  }, /*#__PURE__*/React.createElement("button", {
929
944
  type: "button",
930
945
  className: styles$a.button,
@@ -957,7 +972,7 @@ var ViewerMenuScreen = function ViewerMenuScreen(_ref) {
957
972
  ViewerMenuScreen.propTypes = propTypes$d;
958
973
  ViewerMenuScreen.defaultProps = defaultProps$d;
959
974
 
960
- var styles$9 = {"scroll":"micromag-viewer-menus-menu-preview-scroll","container":"micromag-viewer-menus-menu-preview-container","disabled":"micromag-viewer-menus-menu-preview-disabled","screenButton":"micromag-viewer-menus-menu-preview-screenButton","buttons":"micromag-viewer-menus-menu-preview-buttons","content":"micromag-viewer-menus-menu-preview-content","organisation":"micromag-viewer-menus-menu-preview-organisation","icon":"micromag-viewer-menus-menu-preview-icon","title":"micromag-viewer-menus-menu-preview-title","nav":"micromag-viewer-menus-menu-preview-nav","item":"micromag-viewer-menus-menu-preview-item","items":"micromag-viewer-menus-menu-preview-items","screen":"micromag-viewer-menus-menu-preview-screen","loading":"micromag-viewer-menus-menu-preview-loading","fillPulse":"micromag-viewer-menus-menu-preview-fillPulse"};
975
+ var styles$9 = {"scroll":"micromag-viewer-menus-menu-preview-scroll","container":"micromag-viewer-menus-menu-preview-container","disabled":"micromag-viewer-menus-menu-preview-disabled","screenButton":"micromag-viewer-menus-menu-preview-screenButton","content":"micromag-viewer-menus-menu-preview-content","buttons":"micromag-viewer-menus-menu-preview-buttons","organisation":"micromag-viewer-menus-menu-preview-organisation","icon":"micromag-viewer-menus-menu-preview-icon","title":"micromag-viewer-menus-menu-preview-title","nav":"micromag-viewer-menus-menu-preview-nav","item":"micromag-viewer-menus-menu-preview-item","items":"micromag-viewer-menus-menu-preview-items","inner":"micromag-viewer-menus-menu-preview-inner","frame":"micromag-viewer-menus-menu-preview-frame","screen":"micromag-viewer-menus-menu-preview-screen","intro":"micromag-viewer-menus-menu-preview-intro"};
961
976
 
962
977
  var propTypes$c = {
963
978
  viewerTheme: PropTypes$1.viewerTheme,
@@ -968,6 +983,7 @@ var propTypes$c = {
968
983
  onClickScreen: PropTypes.func,
969
984
  maxThumbsWidth: PropTypes.number,
970
985
  paddingTop: PropTypes.number,
986
+ scrollDisabled: PropTypes.bool,
971
987
  // @todo to reimplement:
972
988
  // shouldLoad: PropTypes.bool,
973
989
  // toggleFullscreen: PropTypes.func,
@@ -985,6 +1001,7 @@ var defaultProps$c = {
985
1001
  onClickScreen: null,
986
1002
  maxThumbsWidth: 140,
987
1003
  paddingTop: null,
1004
+ scrollDisabled: false,
988
1005
  // toggleFullscreen: null,
989
1006
  // fullscreenActive: false,
990
1007
  // fullscreenEnabled: false,
@@ -1000,6 +1017,7 @@ var ViewerMenuPreview = function ViewerMenuPreview(_ref) {
1000
1017
  onClickScreen = _ref.onClickScreen,
1001
1018
  maxThumbsWidth = _ref.maxThumbsWidth,
1002
1019
  paddingTop = _ref.paddingTop,
1020
+ scrollDisabled = _ref.scrollDisabled,
1003
1021
  className = _ref.className;
1004
1022
 
1005
1023
  var _useDimensionObserver = useDimensionObserver(),
@@ -1026,12 +1044,29 @@ var ViewerMenuPreview = function ViewerMenuPreview(_ref) {
1026
1044
  var brandImageStyle = brandImageUrl !== null ? {
1027
1045
  backgroundImage: "url(".concat(brandImageUrl, ")")
1028
1046
  } : null; // const { url: brandLogoUrl = null } = brandLogo || {};
1029
- // @todo optimize all of this the proper way
1047
+
1048
+ var _useState = useState([]),
1049
+ _useState2 = _slicedToArray(_useState, 2),
1050
+ screensMounted = _useState2[0],
1051
+ setScreensMounted = _useState2[1]; // @todo optimize all of this the proper way
1030
1052
  // const finalItems = useMemo(
1031
1053
  // () => (!focusable ? items.map((s, i) => (i > 6 ? { screenId: s.screenId } : s)) : items),
1032
1054
  // [items, focusable],
1033
1055
  // );
1034
1056
 
1057
+
1058
+ useEffect(function () {
1059
+ if (items.length === screensMounted.length) {
1060
+ return null;
1061
+ }
1062
+
1063
+ var timeout = setTimeout(function () {
1064
+ setScreensMounted([].concat(_toConsumableArray(screensMounted), [true]));
1065
+ }, 40);
1066
+ return function () {
1067
+ clearTimeout(timeout);
1068
+ };
1069
+ }, [items, screensMounted, setScreensMounted]);
1035
1070
  return /*#__PURE__*/React.createElement("div", {
1036
1071
  className: classNames([styles$9.container, _defineProperty({}, className, className !== null)]),
1037
1072
  style: _objectSpread(_objectSpread({}, brandImageStyle), {}, {
@@ -1042,7 +1077,8 @@ var ViewerMenuPreview = function ViewerMenuPreview(_ref) {
1042
1077
  className: styles$9.content,
1043
1078
  ref: containerRef
1044
1079
  }, /*#__PURE__*/React.createElement(Scroll, {
1045
- className: styles$9.scroll
1080
+ className: styles$9.scroll,
1081
+ disabled: scrollDisabled
1046
1082
  }, /*#__PURE__*/React.createElement("nav", {
1047
1083
  className: styles$9.nav,
1048
1084
  style: {
@@ -1052,38 +1088,36 @@ var ViewerMenuPreview = function ViewerMenuPreview(_ref) {
1052
1088
  className: styles$9.items
1053
1089
  }, items.map(function (item, index) {
1054
1090
  var _ref6 = item || {},
1055
- screenId = _ref6.screenId,
1056
- _ref6$screen = _ref6.screen,
1057
- screen = _ref6$screen === void 0 ? null : _ref6$screen;
1091
+ screenId = _ref6.screenId;
1058
1092
 
1059
1093
  var itemStyles = {
1060
1094
  width: "".concat(100 / thumbsPerLine, "%")
1061
1095
  };
1096
+
1097
+ var _ref7 = screenSize || {},
1098
+ screenWidth = _ref7.width,
1099
+ screenHeight = _ref7.height;
1100
+
1101
+ var screenMounted = screensMounted[index] || false;
1062
1102
  return /*#__PURE__*/React.createElement("li", {
1063
1103
  key: "item-".concat(screenId),
1064
1104
  className: styles$9.item,
1065
1105
  style: itemStyles
1066
1106
  }, /*#__PURE__*/React.createElement("div", {
1067
- className: styles$9.screen
1068
- }, screen === null ? /*#__PURE__*/React.createElement("svg", {
1069
- className: styles$9.loading,
1070
- xmlns: "http://www.w3.org/2000/svg",
1071
- width: "10",
1072
- height: "16",
1073
- viewBox: "0 0 10 16",
1107
+ className: styles$9.inner
1108
+ }, /*#__PURE__*/React.createElement("div", {
1109
+ className: classNames([styles$9.frame, _defineProperty({}, styles$9.isLoading, !screenMounted)]),
1074
1110
  style: {
1075
- animationDelay: "".concat(index * -50, "ms")
1111
+ paddingBottom: "".concat(screenHeight / screenWidth * 100, "%")
1076
1112
  }
1077
- }, /*#__PURE__*/React.createElement("rect", {
1078
- width: "10",
1079
- height: "16"
1080
- })) : /*#__PURE__*/React.createElement(ViewerMenuScreen, {
1113
+ }, screenMounted ? /*#__PURE__*/React.createElement(ViewerMenuScreen, {
1114
+ className: styles$9.screen,
1081
1115
  item: item,
1082
1116
  index: index,
1083
1117
  screenSize: screenSize,
1084
1118
  onClick: onClickScreen,
1085
1119
  focusable: focusable
1086
- })));
1120
+ }) : null)));
1087
1121
  }))))));
1088
1122
  };
1089
1123
 
@@ -1143,7 +1177,6 @@ var propTypes$a = {
1143
1177
  description: PropTypes.string,
1144
1178
  items: PropTypes$1.menuItems,
1145
1179
  focusable: PropTypes.bool,
1146
- // shouldLoad: PropTypes.bool, // @todo still needed? to re-implement?
1147
1180
  paddingTop: PropTypes.number,
1148
1181
  currentScreenIndex: PropTypes.number,
1149
1182
  shareUrl: PropTypes.string,
@@ -1233,7 +1266,7 @@ var ViewerMenuShare = function ViewerMenuShare(_ref) {
1233
1266
  setFinalShareUrl = _useState4[1];
1234
1267
 
1235
1268
  useEffect(function () {
1236
- setFinalShareUrl(shareCurrentScreen && currentScreenIndex !== 0 ? "".concat(shareUrl, "/").concat(currentScreenIndex) : shareUrl);
1269
+ setFinalShareUrl(shareCurrentScreen && currentScreenIndex !== 0 ? "".concat(shareUrl, "/").concat(currentScreenIndex + 1) : shareUrl);
1237
1270
  }, [shareCurrentScreen, currentScreenIndex, setFinalShareUrl]);
1238
1271
  return /*#__PURE__*/React.createElement("div", {
1239
1272
  className: classNames([styles$7.container, _defineProperty({}, className, className !== null)]),
@@ -1288,7 +1321,7 @@ var ViewerMenuShare = function ViewerMenuShare(_ref) {
1288
1321
  ViewerMenuShare.propTypes = propTypes$a;
1289
1322
  ViewerMenuShare.defaultProps = defaultProps$a;
1290
1323
 
1291
- var styles$6 = {"container":"micromag-viewer-container","menuContainer":"micromag-viewer-menuContainer","menuPreview":"micromag-viewer-menuPreview","screenContainer":"micromag-viewer-screenContainer","screensFrame":"micromag-viewer-screensFrame","landscape":"micromag-viewer-landscape","hideMenu":"micromag-viewer-hideMenu","menuNavContainer":"micromag-viewer-menuNavContainer","dots":"micromag-viewer-dots","menuTopContainer":"micromag-viewer-menuTopContainer","content":"micromag-viewer-content","withoutGestures":"micromag-viewer-withoutGestures","fadeMenu":"micromag-viewer-fadeMenu","withShadow":"micromag-viewer-withShadow","isOpened":"micromag-viewer-isOpened","menuItem":"micromag-viewer-menuItem","menuItemScreens":"micromag-viewer-menuItemScreens","menuButton":"micromag-viewer-menuButton","slidingButton":"micromag-viewer-slidingButton","screensMenuButtonToggled":"micromag-viewer-screensMenuButtonToggled","isHidden":"micromag-viewer-isHidden","navButton":"micromag-viewer-navButton","previous":"micromag-viewer-previous","next":"micromag-viewer-next","screen":"micromag-viewer-screen","current":"micromag-viewer-current","playbackControls":"micromag-viewer-playbackControls","arrowHint":"micromag-viewer-arrowHint","webView":"micromag-viewer-webView"};
1324
+ var styles$6 = {"container":"micromag-viewer-container","menuContainer":"micromag-viewer-menuContainer","menuPreview":"micromag-viewer-menuPreview","menuShare":"micromag-viewer-menuShare","screenContainer":"micromag-viewer-screenContainer","screensFrame":"micromag-viewer-screensFrame","landscape":"micromag-viewer-landscape","hideMenu":"micromag-viewer-hideMenu","menuNavContainer":"micromag-viewer-menuNavContainer","dots":"micromag-viewer-dots","menuTopContainer":"micromag-viewer-menuTopContainer","content":"micromag-viewer-content","withoutGestures":"micromag-viewer-withoutGestures","fadeMenu":"micromag-viewer-fadeMenu","withShadow":"micromag-viewer-withShadow","isOpened":"micromag-viewer-isOpened","menuItem":"micromag-viewer-menuItem","menuButton":"micromag-viewer-menuButton","slidingButton":"micromag-viewer-slidingButton","screensMenuButtonToggled":"micromag-viewer-screensMenuButtonToggled","navButton":"micromag-viewer-navButton","previous":"micromag-viewer-previous","next":"micromag-viewer-next","screen":"micromag-viewer-screen","current":"micromag-viewer-current","playbackControls":"micromag-viewer-playbackControls","arrowHint":"micromag-viewer-arrowHint","webView":"micromag-viewer-webView"};
1292
1325
 
1293
1326
  var propTypes$9 = {
1294
1327
  story: PropTypes$1.story.isRequired,
@@ -1393,6 +1426,11 @@ var ViewerMenu = function ViewerMenu(_ref) {
1393
1426
  shareOpened = _useState4[0],
1394
1427
  setShareOpened = _useState4[1];
1395
1428
 
1429
+ var _useState5 = useState(false),
1430
+ _useState6 = _slicedToArray(_useState5, 2),
1431
+ menuMounted = _useState6[0],
1432
+ setMenuMounted = _useState6[1];
1433
+
1396
1434
  var _useDimensionObserver = useDimensionObserver(),
1397
1435
  navContainerRef = _useDimensionObserver.ref,
1398
1436
  _useDimensionObserver2 = _useDimensionObserver.height,
@@ -1441,8 +1479,7 @@ var ViewerMenu = function ViewerMenu(_ref) {
1441
1479
  var base = typeof window !== 'undefined' ? window.location.host : '';
1442
1480
  var path = shareBasePath !== null ? "".concat(base).concat(shareBasePath) : base;
1443
1481
  return path;
1444
- }, [shareBasePath]); // @note possible to extract some of that logic
1445
-
1482
+ }, [shareBasePath]);
1446
1483
  var onOpenMenu = useCallback(function () {
1447
1484
  setMenuOpened(true);
1448
1485
  setShareOpened(false);
@@ -1533,6 +1570,7 @@ var ViewerMenu = function ViewerMenu(_ref) {
1533
1570
  springParams: springParams
1534
1571
  }),
1535
1572
  bindShareDrag = _useDragProgress.bind,
1573
+ draggingShare = _useDragProgress.dragging,
1536
1574
  shareOpenedProgress = _useDragProgress.progress;
1537
1575
 
1538
1576
  var computeMenuProgress = useCallback(function (_ref9) {
@@ -1580,6 +1618,7 @@ var ViewerMenu = function ViewerMenu(_ref) {
1580
1618
  springParams: springParams
1581
1619
  }),
1582
1620
  bindMenuDrag = _useDragProgress2.bind,
1621
+ draggingMenu = _useDragProgress2.dragging,
1583
1622
  menuOpenedProgress = _useDragProgress2.progress;
1584
1623
 
1585
1624
  var keyboardShortcuts = useMemo(function () {
@@ -1595,6 +1634,13 @@ var ViewerMenu = function ViewerMenu(_ref) {
1595
1634
  useKeyboardShortcuts(keyboardShortcuts); // should be zero if either screens menu or share menu is opened
1596
1635
 
1597
1636
  var dotsOpacity = Math.min(1, Math.max(0, 1 - (menuOpenedProgress + shareOpenedProgress)));
1637
+ useEffect(function () {
1638
+ if ((menuOpened || draggingMenu) && !menuMounted) {
1639
+ setMenuMounted(true);
1640
+ } else if (!menuOpened && !draggingMenu && menuMounted) {
1641
+ setMenuMounted(false);
1642
+ }
1643
+ }, [menuOpened, draggingMenu, menuMounted, setMenuMounted]);
1598
1644
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
1599
1645
  className: classNames([styles$6.menuNavContainer, (_ref11 = {}, _defineProperty(_ref11, styles$6.withShadow, withShadow), _defineProperty(_ref11, styles$6.isOpened, menuOpened || shareOpened), _ref11)]),
1600
1646
  ref: refDots,
@@ -1605,38 +1651,42 @@ var ViewerMenu = function ViewerMenu(_ref) {
1605
1651
  className: styles$6.menuTopContainer,
1606
1652
  ref: navContainerRef
1607
1653
  }, !withoutShareMenu ? /*#__PURE__*/React.createElement("div", Object.assign({
1608
- className: classNames([styles$6.menuItem, styles$6.menuShare])
1654
+ className: styles$6.menuItem
1609
1655
  }, bindShareDrag()), /*#__PURE__*/React.createElement(ToggleButton, {
1610
1656
  className: styles$6.slidingButton,
1611
1657
  button: /*#__PURE__*/React.createElement(ShareButton, {
1612
1658
  className: styles$6.menuButton,
1613
1659
  onClick: onOpenShare,
1614
1660
  theme: menuTheme,
1615
- iconPosition: "left"
1661
+ iconPosition: "left",
1662
+ focusable: !shareOpened
1616
1663
  }),
1617
1664
  toggledButton: /*#__PURE__*/React.createElement(CloseButton, {
1618
1665
  className: styles$6.menuButton,
1619
1666
  onClick: onCloseShare,
1620
1667
  theme: menuTheme,
1621
- iconPosition: "left"
1668
+ iconPosition: "left",
1669
+ focusable: shareOpened
1622
1670
  }),
1623
- toggled: shareOpenedProgress
1671
+ progressSpring: shareOpenedProgress
1624
1672
  })) : null, !withoutScreensMenu ? /*#__PURE__*/React.createElement("div", Object.assign({
1625
- className: classNames([styles$6.menuItem, styles$6.menuItemScreens])
1673
+ className: styles$6.menuItem
1626
1674
  }, bindMenuDrag()), /*#__PURE__*/React.createElement(ToggleButton, {
1627
1675
  className: styles$6.slidingButton,
1628
1676
  button: /*#__PURE__*/React.createElement(MenuButton, {
1629
1677
  className: styles$6.menuButton,
1630
1678
  onClick: onOpenMenu,
1631
- theme: menuTheme
1679
+ theme: menuTheme,
1680
+ focusable: !menuOpened
1632
1681
  }),
1633
1682
  toggledButton: /*#__PURE__*/React.createElement(CloseButton, {
1634
1683
  className: styles$6.menuButton,
1635
1684
  onClick: onCloseMenu,
1636
1685
  theme: menuTheme,
1637
- iconPosition: "right"
1686
+ iconPosition: "right",
1687
+ focusable: menuOpened
1638
1688
  }),
1639
- toggled: menuOpenedProgress,
1689
+ progressSpring: menuOpenedProgress,
1640
1690
  toggledButtonClassName: styles$6.screensMenuButtonToggled
1641
1691
  })) : null), /*#__PURE__*/React.createElement(ViewerMenuDots, Object.assign({}, menuTheme, {
1642
1692
  direction: "horizontal",
@@ -1650,15 +1700,14 @@ var ViewerMenu = function ViewerMenu(_ref) {
1650
1700
  onClose: onClickCloseViewer,
1651
1701
  className: styles$6.dots,
1652
1702
  style: {
1653
- opacity: Math.pow(dotsOpacity, 5),
1654
- // @note this is like a "quint" easing, meaning it'll go towards 1 slowly first and then fast as it approaches 1
1655
- pointerEvents: dotsOpacity < 1 ? 'none' : 'auto'
1703
+ opacity: Math.pow(dotsOpacity, 5) // @note this is like a "quint" easing, meaning it'll go towards 1 slowly first and then fast as it approaches 1
1704
+
1656
1705
  }
1657
1706
  }))), /*#__PURE__*/React.createElement(ViewerMenuContainer, {
1658
1707
  className: styles$6.menuContainer,
1659
- transitionProgress: shareOpenedProgress,
1708
+ progressSpring: shareOpenedProgress,
1660
1709
  theme: viewerTheme
1661
- }, shareOpenedProgress > 0 ? /*#__PURE__*/React.createElement(ViewerMenuShare, {
1710
+ }, draggingShare || shareOpened ? /*#__PURE__*/React.createElement(ViewerMenuShare, {
1662
1711
  viewerTheme: viewerTheme,
1663
1712
  className: styles$6.menuShare,
1664
1713
  title: title,
@@ -1673,9 +1722,9 @@ var ViewerMenu = function ViewerMenu(_ref) {
1673
1722
  onClose: onCloseShare
1674
1723
  }) : null), /*#__PURE__*/React.createElement(ViewerMenuContainer, {
1675
1724
  className: styles$6.menuContainer,
1676
- transitionProgress: menuOpenedProgress,
1725
+ progressSpring: menuOpenedProgress,
1677
1726
  theme: viewerTheme
1678
- }, menuOpenedProgress > 0 ? /*#__PURE__*/React.createElement(ViewerMenuPreview, {
1727
+ }, menuMounted ? /*#__PURE__*/React.createElement(ViewerMenuPreview, {
1679
1728
  viewerTheme: viewerTheme,
1680
1729
  className: styles$6.menuPreview,
1681
1730
  screenSize: screenSize,
@@ -1687,6 +1736,7 @@ var ViewerMenu = function ViewerMenu(_ref) {
1687
1736
  onShare: onShare,
1688
1737
  onClickScreen: onClickScreen,
1689
1738
  onClose: onCloseMenu,
1739
+ scrollDisabled: draggingMenu,
1690
1740
  toggleFullscreen: toggleFullscreen,
1691
1741
  fullscreenActive: fullscreenActive,
1692
1742
  fullscreenEnabled: fullscreenEnabled
@@ -1695,8 +1745,9 @@ var ViewerMenu = function ViewerMenu(_ref) {
1695
1745
 
1696
1746
  ViewerMenu.propTypes = propTypes$9;
1697
1747
  ViewerMenu.defaultProps = defaultProps$9;
1748
+ var ViewerMenu$1 = /*#__PURE__*/React.memo(ViewerMenu);
1698
1749
 
1699
- var styles$5 = {"container":"micromag-viewer-screen-container","navigationHint":"micromag-viewer-screen-navigationHint"};
1750
+ var styles$5 = {"container":"micromag-viewer-screen-container","inner":"micromag-viewer-screen-inner","navigationHint":"micromag-viewer-screen-navigationHint"};
1700
1751
 
1701
1752
  var propTypes$8 = {
1702
1753
  screen: PropTypes$1.screenComponent,
@@ -1706,6 +1757,7 @@ var propTypes$8 = {
1706
1757
  active: PropTypes.bool,
1707
1758
  mediaRef: PropTypes.func,
1708
1759
  width: PropTypes.number,
1760
+ index: PropTypes.number,
1709
1761
  height: PropTypes.number,
1710
1762
  scale: PropTypes.number,
1711
1763
  // withNavigationHint: PropTypes.bool, // @todo
@@ -1717,6 +1769,7 @@ var defaultProps$8 = {
1717
1769
  screenState: null,
1718
1770
  current: false,
1719
1771
  active: true,
1772
+ index: null,
1720
1773
  mediaRef: null,
1721
1774
  width: null,
1722
1775
  height: null,
@@ -1728,6 +1781,7 @@ var defaultProps$8 = {
1728
1781
  function ViewerScreen(_ref) {
1729
1782
  var screen = _ref.screen,
1730
1783
  renderContext = _ref.renderContext,
1784
+ index = _ref.index,
1731
1785
  screenState = _ref.screenState,
1732
1786
  active = _ref.active,
1733
1787
  current = _ref.current,
@@ -1736,23 +1790,47 @@ function ViewerScreen(_ref) {
1736
1790
  height = _ref.height,
1737
1791
  scale = _ref.scale,
1738
1792
  className = _ref.className;
1793
+
1794
+ var _useState = useState(active || current),
1795
+ _useState2 = _slicedToArray(_useState, 2),
1796
+ mounted = _useState2[0],
1797
+ setMounted = _useState2[1];
1798
+
1799
+ useEffect(function () {
1800
+ var timeout = null;
1801
+
1802
+ if (active !== mounted) {
1803
+ timeout = setTimeout(function () {
1804
+ setMounted(active);
1805
+ }, 200);
1806
+ }
1807
+
1808
+ return function () {
1809
+ if (timeout !== null) {
1810
+ clearTimeout(timeout);
1811
+ }
1812
+ };
1813
+ }, [active, mounted, setMounted, index]);
1739
1814
  return /*#__PURE__*/React.createElement("div", {
1740
1815
  className: classNames([styles$5.container, _defineProperty({}, className, className !== null)])
1741
1816
  }, /*#__PURE__*/React.createElement("div", {
1817
+ className: styles$5.inner,
1742
1818
  style: {
1743
1819
  width: width,
1744
1820
  height: height,
1745
1821
  transform: scale !== null ? "scale(".concat(scale, ")") : null,
1746
- transformOrigin: scale !== null ? '0 0' : null
1822
+ transformOrigin: scale !== null ? '0 0' : null,
1823
+ opacity: mounted ? 1 : null
1747
1824
  }
1748
- }, /*#__PURE__*/React.createElement(Screen, {
1825
+ }, mounted ? /*#__PURE__*/React.createElement(Screen, {
1749
1826
  screen: screen,
1750
1827
  renderContext: renderContext,
1751
1828
  screenState: screenState,
1829
+ index: index,
1752
1830
  active: active,
1753
1831
  current: current,
1754
1832
  mediaRef: mediaRef
1755
- })));
1833
+ }) : null));
1756
1834
  }
1757
1835
 
1758
1836
  ViewerScreen.propTypes = propTypes$8;
@@ -1865,9 +1943,10 @@ var stopDragEventsPropagation = {
1865
1943
 
1866
1944
  function getFormattedTimestamp(s) {
1867
1945
  var withMilliseconds = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
1868
- var sparts = withMilliseconds ? "".concat(s).split('.') : [];
1869
- var ms = sparts.length > 1 ? ":".concat(sparts[1].substring(0, 3)) : '';
1870
- return (s - (s %= 60)) / 60 + (9 < s ? ':' : ':0') + ~~s + ms; // eslint-disable-line
1946
+ var parts = "".concat(s).split('.');
1947
+ var seconds = parts[0];
1948
+ var ms = withMilliseconds && parts.length > 1 ? ":".concat(parts[1].substring(0, 3)) : '';
1949
+ return (s - (s %= 60)) / 60 + (9 < seconds ? ':' : ':0') + ~~s + ms; // eslint-disable-line
1871
1950
  }
1872
1951
 
1873
1952
  var SHOW_MILLISECONDS_THRESHOLD = 5; // show milliseconds when scrubbing if length of video is shorter than 5 seconds
@@ -2361,7 +2440,6 @@ var propTypes$2 = {
2361
2440
  screenState: PropTypes.string,
2362
2441
  deviceScreens: PropTypes$1.deviceScreens,
2363
2442
  renderContext: PropTypes$1.renderContext,
2364
- visitor: PropTypes$1.visitor,
2365
2443
  onScreenChange: PropTypes.func,
2366
2444
  tapNextScreenWidthPercent: PropTypes.number,
2367
2445
  storyIsParsed: PropTypes.bool,
@@ -2405,11 +2483,10 @@ var defaultProps$2 = {
2405
2483
  screenState: null,
2406
2484
  deviceScreens: getDeviceScreens(),
2407
2485
  renderContext: 'view',
2408
- visitor: null,
2409
2486
  onScreenChange: null,
2410
2487
  tapNextScreenWidthPercent: 0.8,
2411
2488
  storyIsParsed: false,
2412
- neighborScreensActive: 2,
2489
+ neighborScreensActive: 1,
2413
2490
  neighborScreenOffset: 105,
2414
2491
  neighborScreenScale: 0.8,
2415
2492
  withMetadata: false,
@@ -2448,7 +2525,6 @@ var Viewer = function Viewer(_ref) {
2448
2525
  screenState = _ref.screenState,
2449
2526
  deviceScreens = _ref.deviceScreens,
2450
2527
  renderContext = _ref.renderContext,
2451
- visitor = _ref.visitor,
2452
2528
  tapNextScreenWidthPercent = _ref.tapNextScreenWidthPercent,
2453
2529
  storyIsParsed = _ref.storyIsParsed,
2454
2530
  neighborScreensActive = _ref.neighborScreensActive,
@@ -2769,34 +2845,48 @@ var Viewer = function Viewer(_ref) {
2769
2845
  springParams: springParams
2770
2846
  }),
2771
2847
  isDragging = _useDragProgress.dragging,
2772
- screenIndexProgress = _useDragProgress.progress,
2848
+ progressSpring = _useDragProgress.progress,
2773
2849
  dragContentBind = _useDragProgress.bind;
2774
2850
 
2775
- var getScreenStylesByIndex = function getScreenStylesByIndex(index, progress) {
2851
+ var getScreenStylesByIndex = function getScreenStylesByIndex(index, spring) {
2776
2852
  if (transitionType === 'stack') {
2777
- var _t = index - progress;
2778
-
2779
- var _clamped = Math.min(1, Math.max(0, _t));
2780
-
2781
- var invert = Math.min(1, Math.max(0, -_t));
2782
- var opacity = Math.max(0, 1 - 0.75 * invert + (_t + 1)); // just hide other screens
2783
-
2784
- if (Math.abs(_t) > neighborScreensActive) return {
2785
- opacity: 0
2786
- };
2787
2853
  return {
2788
- opacity: opacity,
2789
- transform: "translateX(".concat(_clamped * 100, "%) scale(").concat(1 - 0.2 * invert, ")"),
2790
- boxShadow: "0 0 ".concat(4 * (1 - _clamped), "rem ").concat(-0.5 * (1 - _clamped), "rem black"),
2791
- zIndex: index
2854
+ zIndex: index,
2855
+ opacity: spring.to(function (progress) {
2856
+ var t = index - progress;
2857
+ var invert = Math.min(1, Math.max(0, -t));
2858
+ if (Math.abs(t) > neighborScreensActive) return 0;
2859
+ return Math.max(0, 1 - 0.75 * invert + (t + 1));
2860
+ }),
2861
+ transform: spring.to(function (progress) {
2862
+ var t = index - progress;
2863
+ var clamped = Math.min(1, Math.max(0, t));
2864
+ var invert = Math.min(1, Math.max(0, -t));
2865
+ if (Math.abs(t) > neighborScreensActive) return 'translateX(100%)';
2866
+ return "translateX(".concat(clamped * 100, "%) scale(").concat(1 - 0.2 * invert, ")");
2867
+ }),
2868
+ boxShadow: spring.to(function (progress) {
2869
+ var t = index - progress;
2870
+ if (Math.abs(t) > neighborScreensActive) return null;
2871
+ var clamped = Math.min(1, Math.max(0, t));
2872
+ return "0 0 ".concat(4 * (1 - clamped), "rem ").concat(-0.5 * (1 - clamped), "rem black");
2873
+ })
2792
2874
  };
2793
2875
  }
2794
2876
 
2795
- var t = index - progress;
2796
- var clamped = Math.min(1, Math.max(0, Math.abs(t)));
2797
2877
  return {
2798
- opacity: 1 - 0.75 * clamped,
2799
- transform: "translateX(".concat(t * neighborScreenOffset, "%) scale(").concat(1 - (1 - neighborScreenScale) * clamped, ")"),
2878
+ opacity: spring.to(function (progress) {
2879
+ var t = index - progress;
2880
+ if (Math.abs(t) > neighborScreensActive) return 0;
2881
+ var clamped = Math.min(1, Math.max(0, Math.abs(t)));
2882
+ return 1 - 0.75 * clamped;
2883
+ }),
2884
+ transform: spring.to(function (progress) {
2885
+ var t = index - progress;
2886
+ if (Math.abs(t) > neighborScreensActive) return "translate(100%)";
2887
+ var clamped = Math.min(1, Math.max(0, Math.abs(t)));
2888
+ return "translateX(".concat(t * neighborScreenOffset, "%) scale(").concat(1 - (1 - neighborScreenScale) * clamped, ")");
2889
+ }),
2800
2890
  zIndex: screensCount - index
2801
2891
  };
2802
2892
  };
@@ -2853,8 +2943,8 @@ var Viewer = function Viewer(_ref) {
2853
2943
  useKeyboardShortcuts(keyboardShortcuts, {
2854
2944
  disabled: renderContext !== 'view'
2855
2945
  });
2856
- return /*#__PURE__*/React.createElement(VisitorProvider, {
2857
- visitor: visitor
2946
+ return /*#__PURE__*/React.createElement(StoryProvider, {
2947
+ story: parsedStory
2858
2948
  }, /*#__PURE__*/React.createElement(ScreenSizeProvider, {
2859
2949
  size: screenSize
2860
2950
  }, /*#__PURE__*/React.createElement(ViewerProvider, {
@@ -2882,7 +2972,7 @@ var Viewer = function Viewer(_ref) {
2882
2972
  }), (_ref15 = {}, _defineProperty(_ref15, styles$6.landscape, landscape), _defineProperty(_ref15, styles$6.withoutGestures, withoutGestures), _defineProperty(_ref15, styles$6.hideMenu, !menuVisible), _defineProperty(_ref15, styles$6.fadeMenu, playing && playbackControls && !playbackcontrolsVisible), _defineProperty(_ref15, styles$6.ready, ready || withoutScreensTransforms), _defineProperty(_ref15, styles$6.hasInteracted, hasInteracted), _defineProperty(_ref15, styles$6.isDragging, isDragging), _defineProperty(_ref15, className, className), _ref15)]),
2883
2973
  ref: containerRef,
2884
2974
  onContextMenu: onContextMenu
2885
- }, !withoutMenu ? /*#__PURE__*/React.createElement(ViewerMenu, {
2975
+ }, !withoutMenu ? /*#__PURE__*/React.createElement(ViewerMenu$1, {
2886
2976
  story: parsedStory,
2887
2977
  currentScreenIndex: screenIndex,
2888
2978
  withShadow: menuOverScreen && !withoutMenuShadow,
@@ -2917,12 +3007,12 @@ var Viewer = function Viewer(_ref) {
2917
3007
  }, screens.map(function (screen, i) {
2918
3008
  var current = screenIndex === i;
2919
3009
  var active = i >= screenIndex - neighborScreensActive && i <= screenIndex + neighborScreensActive;
2920
- var screenStyles = getScreenStylesByIndex(i, screenIndexProgress);
2921
- return /*#__PURE__*/React.createElement("div", {
3010
+ var screenStyles = getScreenStylesByIndex(i, progressSpring);
3011
+ return /*#__PURE__*/React.createElement(animated.div, {
2922
3012
  key: "screen-viewer-".concat(screen.id || '', "-").concat(i + 1),
2923
3013
  style: screenStyles,
2924
3014
  className: classNames([styles$6.screenContainer, _defineProperty({}, styles$6.current, current)])
2925
- }, screen !== null && active ? /*#__PURE__*/React.createElement(ViewerScreen, {
3015
+ }, screen !== null ? /*#__PURE__*/React.createElement(ViewerScreen, {
2926
3016
  className: styles$6.screen,
2927
3017
  screen: screen,
2928
3018
  screenState: current ? screenState : null,
@@ -3036,7 +3126,7 @@ var defaultRoutes = {
3036
3126
  screen: screen
3037
3127
  };
3038
3128
 
3039
- var _excluded = ["story", "screenComponents", "memoryRouter", "basePath", "routes", "withoutRouter", "googleApiKey", "trackingVariables", "locale", "locales", "translations", "pathWithIndex"];
3129
+ var _excluded = ["story", "screenComponents", "memoryRouter", "basePath", "routes", "withoutRouter", "googleApiKey", "visitor", "trackingVariables", "locale", "locales", "translations", "pathWithIndex"];
3040
3130
  var propTypes = {
3041
3131
  story: PropTypes$1.story,
3042
3132
  screen: PropTypes.string,
@@ -3046,6 +3136,7 @@ var propTypes = {
3046
3136
  routes: routes,
3047
3137
  withoutRouter: PropTypes.bool,
3048
3138
  googleApiKey: PropTypes.string,
3139
+ visitor: PropTypes$1.visitor,
3049
3140
  trackingVariables: PropTypes$1.trackingVariables,
3050
3141
  locale: PropTypes.string,
3051
3142
  locales: PropTypes.arrayOf(PropTypes.string),
@@ -3062,6 +3153,7 @@ var defaultProps = {
3062
3153
  routes: defaultRoutes,
3063
3154
  withoutRouter: false,
3064
3155
  googleApiKey: null,
3156
+ visitor: null,
3065
3157
  trackingVariables: null,
3066
3158
  locale: 'en',
3067
3159
  locales: ['fr', 'en'],
@@ -3078,6 +3170,7 @@ var ViewerContainer = function ViewerContainer(_ref) {
3078
3170
  routes = _ref.routes,
3079
3171
  withoutRouter = _ref.withoutRouter,
3080
3172
  googleApiKey = _ref.googleApiKey,
3173
+ visitor = _ref.visitor,
3081
3174
  trackingVariables = _ref.trackingVariables,
3082
3175
  locale = _ref.locale,
3083
3176
  locales = _ref.locales,
@@ -3127,7 +3220,9 @@ var ViewerContainer = function ViewerContainer(_ref) {
3127
3220
  }, /*#__PURE__*/React.createElement(ScreensProvider, null, /*#__PURE__*/React.createElement(ComponentsProvider, {
3128
3221
  namespace: SCREENS_NAMESPACE,
3129
3222
  components: screenComponents || {}
3130
- }, /*#__PURE__*/React.createElement(UserInteractionProvider, null, /*#__PURE__*/React.createElement(PlaybackProvider, null, /*#__PURE__*/React.createElement(TrackingProvider, {
3223
+ }, /*#__PURE__*/React.createElement(VisitorProvider, {
3224
+ visitor: visitor
3225
+ }, /*#__PURE__*/React.createElement(PlaybackProvider, null, /*#__PURE__*/React.createElement(TrackingProvider, {
3131
3226
  variables: finalTrackingVariables
3132
3227
  }, withoutRouter ? /*#__PURE__*/React.createElement(Viewer, Object.assign({
3133
3228
  story: story,