@micromag/viewer 0.3.251 → 0.3.262

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/lib/index.js CHANGED
@@ -16,6 +16,7 @@ var screens = require('@micromag/screens');
16
16
  var _defineProperty = require('@babel/runtime/helpers/defineProperty');
17
17
  var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
18
18
  var _toConsumableArray = require('@babel/runtime/helpers/toConsumableArray');
19
+ var web = require('@react-spring/web');
19
20
  var classNames = require('classnames');
20
21
  var reactHelmet = require('react-helmet');
21
22
  var EventEmitter = require('wolfy87-eventemitter');
@@ -26,7 +27,6 @@ var reactIntl = require('react-intl');
26
27
  var faTimes = require('@fortawesome/free-solid-svg-icons/faTimes');
27
28
  var reactFontawesome = require('@fortawesome/react-fontawesome');
28
29
  var core$1 = require('@react-spring/core');
29
- var web = require('@react-spring/web');
30
30
  var Scroll = require('@micromag/element-scroll');
31
31
  var ShareOptions = require('@micromag/element-share-options');
32
32
  var react = require('@use-gesture/react');
@@ -134,6 +134,7 @@ function useScreenInteraction() {
134
134
  var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
135
135
  screens = _ref.screens,
136
136
  screenIndex = _ref.screenIndex,
137
+ screenWidth = _ref.screenWidth,
137
138
  _ref$disableCurrentSc = _ref.disableCurrentScreenNavigation,
138
139
  disableCurrentScreenNavigation = _ref$disableCurrentSc === void 0 ? false : _ref$disableCurrentSc,
139
140
  _ref$clickOnSiblings = _ref.clickOnSiblings,
@@ -203,13 +204,14 @@ function useScreenInteraction() {
203
204
  }
204
205
 
205
206
  var _currentTarget$getBou = currentTarget.getBoundingClientRect(),
206
- left = _currentTarget$getBou.left,
207
207
  width = _currentTarget$getBou.width;
208
208
 
209
- var relativeX = x - left;
210
- var direction = relativeX < width * (1 - nextScreenWidthPercent) ? 'previous' : 'next';
209
+ var margin = (width - screenWidth) / 2;
210
+ var screenPreviousZone = screenWidth * (1 - nextScreenWidthPercent);
211
+ var previousZone = margin + screenPreviousZone;
212
+ var direction = x < previousZone ? 'previous' : 'next';
211
213
  var lastIndex = screensCount - 1;
212
- var nextIndex = index; // @todo investigate what clickOnSiblings is doing
214
+ var nextIndex = index;
213
215
 
214
216
  if (direction === 'previous' && !clickOnSiblings) {
215
217
  nextIndex = Math.max(0, screenIndex - 1);
@@ -531,14 +533,14 @@ var styles$e = {"container":"micromag-viewer-buttons-toggle-button-container","n
531
533
 
532
534
  var propTypes$i = {
533
535
  className: PropTypes__default["default"].string,
534
- toggled: PropTypes__default["default"].number,
536
+ progressSpring: PropTypes__default["default"].number,
535
537
  button: PropTypes__default["default"].node,
536
538
  toggledButton: PropTypes__default["default"].node,
537
539
  toggledButtonClassName: PropTypes__default["default"].string
538
540
  };
539
541
  var defaultProps$i = {
540
542
  className: null,
541
- toggled: 0,
543
+ progressSpring: 0,
542
544
  button: null,
543
545
  toggledButton: null,
544
546
  toggledButtonClassName: null
@@ -546,26 +548,27 @@ var defaultProps$i = {
546
548
 
547
549
  var ToggleButton = function ToggleButton(_ref) {
548
550
  var className = _ref.className,
549
- toggled = _ref.toggled,
551
+ progressSpring = _ref.progressSpring,
550
552
  button = _ref.button,
551
553
  toggledButton = _ref.toggledButton,
552
554
  toggledButtonClassName = _ref.toggledButtonClassName;
553
555
  if (button === null) return false;
554
-
555
- var getToggleButtonStyles = function getToggleButtonStyles(t) {
556
- return {
557
- transform: "translateY(".concat(t * -100, "%)")
558
- };
559
- };
560
-
561
556
  return /*#__PURE__*/React__default["default"].createElement("div", {
562
557
  className: classNames__default["default"]([styles$e.container, _defineProperty__default["default"]({}, className, className !== null)])
563
- }, /*#__PURE__*/React__default["default"].createElement("div", {
558
+ }, /*#__PURE__*/React__default["default"].createElement(web.animated.div, {
564
559
  className: styles$e.normal,
565
- style: getToggleButtonStyles(toggled)
566
- }, button), /*#__PURE__*/React__default["default"].createElement("div", {
560
+ style: {
561
+ transform: progressSpring.to(function (p) {
562
+ return "translateY(".concat(p * -100, "%)");
563
+ })
564
+ }
565
+ }, button), /*#__PURE__*/React__default["default"].createElement(web.animated.div, {
567
566
  className: classNames__default["default"]([styles$e.toggled, _defineProperty__default["default"]({}, toggledButtonClassName, toggledButtonClassName !== null)]),
568
- style: getToggleButtonStyles(toggled - 1)
567
+ style: {
568
+ transform: progressSpring.to(function (p) {
569
+ return "translateY(".concat((p - 1) * -100, "%)");
570
+ })
571
+ }
569
572
  }, toggledButton));
570
573
  };
571
574
 
@@ -576,20 +579,20 @@ var styles$d = {"backdrop":"micromag-viewer-menus-menu-container-backdrop","heig
576
579
 
577
580
  var propTypes$h = {
578
581
  className: PropTypes__default["default"].string,
579
- transitionProgress: PropTypes__default["default"].number,
582
+ progressSpring: PropTypes__default["default"].number,
580
583
  theme: core.PropTypes.viewerTheme,
581
584
  children: PropTypes__default["default"].node
582
585
  };
583
586
  var defaultProps$h = {
584
587
  className: null,
585
- transitionProgress: 0,
588
+ progressSpring: 0,
586
589
  theme: null,
587
590
  children: null
588
591
  };
589
592
 
590
593
  var ViewerMenuContainer = function ViewerMenuContainer(_ref) {
591
594
  var className = _ref.className,
592
- transitionProgress = _ref.transitionProgress,
595
+ progressSpring = _ref.progressSpring,
593
596
  viewerTheme = _ref.theme,
594
597
  children = _ref.children;
595
598
 
@@ -607,17 +610,26 @@ var ViewerMenuContainer = function ViewerMenuContainer(_ref) {
607
610
  style: {
608
611
  pointerEvents: 'none'
609
612
  }
610
- }, /*#__PURE__*/React__default["default"].createElement("div", {
613
+ }, /*#__PURE__*/React__default["default"].createElement(web.animated.div, {
611
614
  className: styles$d.heightContainer,
612
615
  style: _objectSpread__default["default"]({
613
- height: "".concat(transitionProgress * 100, "%"),
614
- pointerEvents: transitionProgress < 0.25 ? 'none' : 'auto',
615
- zIndex: Math.round(2 + transitionProgress)
616
+ opacity: progressSpring,
617
+ transform: progressSpring.to(function (p) {
618
+ return "translateY(".concat((1 - p) * -2, "rem)");
619
+ }),
620
+ pointerEvents: progressSpring.to(function (p) {
621
+ return p < 0.25 ? 'none' : 'auto';
622
+ }),
623
+ zIndex: progressSpring.to(function (p) {
624
+ return Math.round(2 + p);
625
+ })
616
626
  }, backgroundColorStyle)
617
- }, children), /*#__PURE__*/React__default["default"].createElement("div", {
627
+ }, children), /*#__PURE__*/React__default["default"].createElement(web.animated.div, {
618
628
  className: styles$d.backdrop,
619
629
  style: {
620
- opacity: utils.easings.easeOutQuint(transitionProgress)
630
+ opacity: progressSpring.to(function (p) {
631
+ return utils.easings.easeOutQuint(p);
632
+ })
621
633
  }
622
634
  }));
623
635
  };
@@ -944,7 +956,10 @@ var ViewerMenuScreen = function ViewerMenuScreen(_ref) {
944
956
  }]
945
957
  })) : '');
946
958
  return /*#__PURE__*/React__default["default"].createElement("div", {
947
- className: classNames__default["default"]([styles$a.container, (_ref4 = {}, _defineProperty__default["default"](_ref4, className, className !== null), _defineProperty__default["default"](_ref4, styles$a.isCurrent, current), _ref4)])
959
+ className: classNames__default["default"]([styles$a.container, (_ref4 = {}, _defineProperty__default["default"](_ref4, className, className !== null), _defineProperty__default["default"](_ref4, styles$a.isCurrent, current), _ref4)]),
960
+ style: {
961
+ paddingBottom: "".concat(screenHeight / screenWidth * 100, "%")
962
+ }
948
963
  }, /*#__PURE__*/React__default["default"].createElement("button", {
949
964
  type: "button",
950
965
  className: styles$a.button,
@@ -977,7 +992,7 @@ var ViewerMenuScreen = function ViewerMenuScreen(_ref) {
977
992
  ViewerMenuScreen.propTypes = propTypes$d;
978
993
  ViewerMenuScreen.defaultProps = defaultProps$d;
979
994
 
980
- 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"};
995
+ 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"};
981
996
 
982
997
  var propTypes$c = {
983
998
  viewerTheme: core.PropTypes.viewerTheme,
@@ -988,6 +1003,7 @@ var propTypes$c = {
988
1003
  onClickScreen: PropTypes__default["default"].func,
989
1004
  maxThumbsWidth: PropTypes__default["default"].number,
990
1005
  paddingTop: PropTypes__default["default"].number,
1006
+ scrollDisabled: PropTypes__default["default"].bool,
991
1007
  // @todo to reimplement:
992
1008
  // shouldLoad: PropTypes.bool,
993
1009
  // toggleFullscreen: PropTypes.func,
@@ -1005,6 +1021,7 @@ var defaultProps$c = {
1005
1021
  onClickScreen: null,
1006
1022
  maxThumbsWidth: 140,
1007
1023
  paddingTop: null,
1024
+ scrollDisabled: false,
1008
1025
  // toggleFullscreen: null,
1009
1026
  // fullscreenActive: false,
1010
1027
  // fullscreenEnabled: false,
@@ -1020,6 +1037,7 @@ var ViewerMenuPreview = function ViewerMenuPreview(_ref) {
1020
1037
  onClickScreen = _ref.onClickScreen,
1021
1038
  maxThumbsWidth = _ref.maxThumbsWidth,
1022
1039
  paddingTop = _ref.paddingTop,
1040
+ scrollDisabled = _ref.scrollDisabled,
1023
1041
  className = _ref.className;
1024
1042
 
1025
1043
  var _useDimensionObserver = hooks.useDimensionObserver(),
@@ -1046,12 +1064,29 @@ var ViewerMenuPreview = function ViewerMenuPreview(_ref) {
1046
1064
  var brandImageStyle = brandImageUrl !== null ? {
1047
1065
  backgroundImage: "url(".concat(brandImageUrl, ")")
1048
1066
  } : null; // const { url: brandLogoUrl = null } = brandLogo || {};
1049
- // @todo optimize all of this the proper way
1067
+
1068
+ var _useState = React.useState([]),
1069
+ _useState2 = _slicedToArray__default["default"](_useState, 2),
1070
+ screensMounted = _useState2[0],
1071
+ setScreensMounted = _useState2[1]; // @todo optimize all of this the proper way
1050
1072
  // const finalItems = useMemo(
1051
1073
  // () => (!focusable ? items.map((s, i) => (i > 6 ? { screenId: s.screenId } : s)) : items),
1052
1074
  // [items, focusable],
1053
1075
  // );
1054
1076
 
1077
+
1078
+ React.useEffect(function () {
1079
+ if (items.length === screensMounted.length) {
1080
+ return null;
1081
+ }
1082
+
1083
+ var timeout = setTimeout(function () {
1084
+ setScreensMounted([].concat(_toConsumableArray__default["default"](screensMounted), [true]));
1085
+ }, 40);
1086
+ return function () {
1087
+ clearTimeout(timeout);
1088
+ };
1089
+ }, [items, screensMounted, setScreensMounted]);
1055
1090
  return /*#__PURE__*/React__default["default"].createElement("div", {
1056
1091
  className: classNames__default["default"]([styles$9.container, _defineProperty__default["default"]({}, className, className !== null)]),
1057
1092
  style: _objectSpread__default["default"](_objectSpread__default["default"]({}, brandImageStyle), {}, {
@@ -1062,7 +1097,8 @@ var ViewerMenuPreview = function ViewerMenuPreview(_ref) {
1062
1097
  className: styles$9.content,
1063
1098
  ref: containerRef
1064
1099
  }, /*#__PURE__*/React__default["default"].createElement(Scroll__default["default"], {
1065
- className: styles$9.scroll
1100
+ className: styles$9.scroll,
1101
+ disabled: scrollDisabled
1066
1102
  }, /*#__PURE__*/React__default["default"].createElement("nav", {
1067
1103
  className: styles$9.nav,
1068
1104
  style: {
@@ -1072,38 +1108,36 @@ var ViewerMenuPreview = function ViewerMenuPreview(_ref) {
1072
1108
  className: styles$9.items
1073
1109
  }, items.map(function (item, index) {
1074
1110
  var _ref6 = item || {},
1075
- screenId = _ref6.screenId,
1076
- _ref6$screen = _ref6.screen,
1077
- screen = _ref6$screen === void 0 ? null : _ref6$screen;
1111
+ screenId = _ref6.screenId;
1078
1112
 
1079
1113
  var itemStyles = {
1080
1114
  width: "".concat(100 / thumbsPerLine, "%")
1081
1115
  };
1116
+
1117
+ var _ref7 = screenSize || {},
1118
+ screenWidth = _ref7.width,
1119
+ screenHeight = _ref7.height;
1120
+
1121
+ var screenMounted = screensMounted[index] || false;
1082
1122
  return /*#__PURE__*/React__default["default"].createElement("li", {
1083
1123
  key: "item-".concat(screenId),
1084
1124
  className: styles$9.item,
1085
1125
  style: itemStyles
1086
1126
  }, /*#__PURE__*/React__default["default"].createElement("div", {
1087
- className: styles$9.screen
1088
- }, screen === null ? /*#__PURE__*/React__default["default"].createElement("svg", {
1089
- className: styles$9.loading,
1090
- xmlns: "http://www.w3.org/2000/svg",
1091
- width: "10",
1092
- height: "16",
1093
- viewBox: "0 0 10 16",
1127
+ className: styles$9.inner
1128
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
1129
+ className: classNames__default["default"]([styles$9.frame, _defineProperty__default["default"]({}, styles$9.isLoading, !screenMounted)]),
1094
1130
  style: {
1095
- animationDelay: "".concat(index * -50, "ms")
1131
+ paddingBottom: "".concat(screenHeight / screenWidth * 100, "%")
1096
1132
  }
1097
- }, /*#__PURE__*/React__default["default"].createElement("rect", {
1098
- width: "10",
1099
- height: "16"
1100
- })) : /*#__PURE__*/React__default["default"].createElement(ViewerMenuScreen, {
1133
+ }, screenMounted ? /*#__PURE__*/React__default["default"].createElement(ViewerMenuScreen, {
1134
+ className: styles$9.screen,
1101
1135
  item: item,
1102
1136
  index: index,
1103
1137
  screenSize: screenSize,
1104
1138
  onClick: onClickScreen,
1105
1139
  focusable: focusable
1106
- })));
1140
+ }) : null)));
1107
1141
  }))))));
1108
1142
  };
1109
1143
 
@@ -1163,7 +1197,6 @@ var propTypes$a = {
1163
1197
  description: PropTypes__default["default"].string,
1164
1198
  items: core.PropTypes.menuItems,
1165
1199
  focusable: PropTypes__default["default"].bool,
1166
- // shouldLoad: PropTypes.bool, // @todo still needed? to re-implement?
1167
1200
  paddingTop: PropTypes__default["default"].number,
1168
1201
  currentScreenIndex: PropTypes__default["default"].number,
1169
1202
  shareUrl: PropTypes__default["default"].string,
@@ -1253,7 +1286,7 @@ var ViewerMenuShare = function ViewerMenuShare(_ref) {
1253
1286
  setFinalShareUrl = _useState4[1];
1254
1287
 
1255
1288
  React.useEffect(function () {
1256
- setFinalShareUrl(shareCurrentScreen && currentScreenIndex !== 0 ? "".concat(shareUrl, "/").concat(currentScreenIndex) : shareUrl);
1289
+ setFinalShareUrl(shareCurrentScreen && currentScreenIndex !== 0 ? "".concat(shareUrl, "/").concat(currentScreenIndex + 1) : shareUrl);
1257
1290
  }, [shareCurrentScreen, currentScreenIndex, setFinalShareUrl]);
1258
1291
  return /*#__PURE__*/React__default["default"].createElement("div", {
1259
1292
  className: classNames__default["default"]([styles$7.container, _defineProperty__default["default"]({}, className, className !== null)]),
@@ -1308,7 +1341,7 @@ var ViewerMenuShare = function ViewerMenuShare(_ref) {
1308
1341
  ViewerMenuShare.propTypes = propTypes$a;
1309
1342
  ViewerMenuShare.defaultProps = defaultProps$a;
1310
1343
 
1311
- 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"};
1344
+ 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"};
1312
1345
 
1313
1346
  var propTypes$9 = {
1314
1347
  story: core.PropTypes.story.isRequired,
@@ -1413,6 +1446,11 @@ var ViewerMenu = function ViewerMenu(_ref) {
1413
1446
  shareOpened = _useState4[0],
1414
1447
  setShareOpened = _useState4[1];
1415
1448
 
1449
+ var _useState5 = React.useState(false),
1450
+ _useState6 = _slicedToArray__default["default"](_useState5, 2),
1451
+ menuMounted = _useState6[0],
1452
+ setMenuMounted = _useState6[1];
1453
+
1416
1454
  var _useDimensionObserver = hooks.useDimensionObserver(),
1417
1455
  navContainerRef = _useDimensionObserver.ref,
1418
1456
  _useDimensionObserver2 = _useDimensionObserver.height,
@@ -1461,8 +1499,7 @@ var ViewerMenu = function ViewerMenu(_ref) {
1461
1499
  var base = typeof window !== 'undefined' ? window.location.host : '';
1462
1500
  var path = shareBasePath !== null ? "".concat(base).concat(shareBasePath) : base;
1463
1501
  return path;
1464
- }, [shareBasePath]); // @note possible to extract some of that logic
1465
-
1502
+ }, [shareBasePath]);
1466
1503
  var onOpenMenu = React.useCallback(function () {
1467
1504
  setMenuOpened(true);
1468
1505
  setShareOpened(false);
@@ -1553,6 +1590,7 @@ var ViewerMenu = function ViewerMenu(_ref) {
1553
1590
  springParams: springParams
1554
1591
  }),
1555
1592
  bindShareDrag = _useDragProgress.bind,
1593
+ draggingShare = _useDragProgress.dragging,
1556
1594
  shareOpenedProgress = _useDragProgress.progress;
1557
1595
 
1558
1596
  var computeMenuProgress = React.useCallback(function (_ref9) {
@@ -1600,6 +1638,7 @@ var ViewerMenu = function ViewerMenu(_ref) {
1600
1638
  springParams: springParams
1601
1639
  }),
1602
1640
  bindMenuDrag = _useDragProgress2.bind,
1641
+ draggingMenu = _useDragProgress2.dragging,
1603
1642
  menuOpenedProgress = _useDragProgress2.progress;
1604
1643
 
1605
1644
  var keyboardShortcuts = React.useMemo(function () {
@@ -1615,6 +1654,13 @@ var ViewerMenu = function ViewerMenu(_ref) {
1615
1654
  useKeyboardShortcuts(keyboardShortcuts); // should be zero if either screens menu or share menu is opened
1616
1655
 
1617
1656
  var dotsOpacity = Math.min(1, Math.max(0, 1 - (menuOpenedProgress + shareOpenedProgress)));
1657
+ React.useEffect(function () {
1658
+ if ((menuOpened || draggingMenu) && !menuMounted) {
1659
+ setMenuMounted(true);
1660
+ } else if (!menuOpened && !draggingMenu && menuMounted) {
1661
+ setMenuMounted(false);
1662
+ }
1663
+ }, [menuOpened, draggingMenu, menuMounted, setMenuMounted]);
1618
1664
  return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement("div", {
1619
1665
  className: classNames__default["default"]([styles$6.menuNavContainer, (_ref11 = {}, _defineProperty__default["default"](_ref11, styles$6.withShadow, withShadow), _defineProperty__default["default"](_ref11, styles$6.isOpened, menuOpened || shareOpened), _ref11)]),
1620
1666
  ref: refDots,
@@ -1625,38 +1671,42 @@ var ViewerMenu = function ViewerMenu(_ref) {
1625
1671
  className: styles$6.menuTopContainer,
1626
1672
  ref: navContainerRef
1627
1673
  }, !withoutShareMenu ? /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
1628
- className: classNames__default["default"]([styles$6.menuItem, styles$6.menuShare])
1674
+ className: styles$6.menuItem
1629
1675
  }, bindShareDrag()), /*#__PURE__*/React__default["default"].createElement(ToggleButton, {
1630
1676
  className: styles$6.slidingButton,
1631
1677
  button: /*#__PURE__*/React__default["default"].createElement(ShareButton, {
1632
1678
  className: styles$6.menuButton,
1633
1679
  onClick: onOpenShare,
1634
1680
  theme: menuTheme,
1635
- iconPosition: "left"
1681
+ iconPosition: "left",
1682
+ focusable: !shareOpened
1636
1683
  }),
1637
1684
  toggledButton: /*#__PURE__*/React__default["default"].createElement(CloseButton, {
1638
1685
  className: styles$6.menuButton,
1639
1686
  onClick: onCloseShare,
1640
1687
  theme: menuTheme,
1641
- iconPosition: "left"
1688
+ iconPosition: "left",
1689
+ focusable: shareOpened
1642
1690
  }),
1643
- toggled: shareOpenedProgress
1691
+ progressSpring: shareOpenedProgress
1644
1692
  })) : null, !withoutScreensMenu ? /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
1645
- className: classNames__default["default"]([styles$6.menuItem, styles$6.menuItemScreens])
1693
+ className: styles$6.menuItem
1646
1694
  }, bindMenuDrag()), /*#__PURE__*/React__default["default"].createElement(ToggleButton, {
1647
1695
  className: styles$6.slidingButton,
1648
1696
  button: /*#__PURE__*/React__default["default"].createElement(MenuButton, {
1649
1697
  className: styles$6.menuButton,
1650
1698
  onClick: onOpenMenu,
1651
- theme: menuTheme
1699
+ theme: menuTheme,
1700
+ focusable: !menuOpened
1652
1701
  }),
1653
1702
  toggledButton: /*#__PURE__*/React__default["default"].createElement(CloseButton, {
1654
1703
  className: styles$6.menuButton,
1655
1704
  onClick: onCloseMenu,
1656
1705
  theme: menuTheme,
1657
- iconPosition: "right"
1706
+ iconPosition: "right",
1707
+ focusable: menuOpened
1658
1708
  }),
1659
- toggled: menuOpenedProgress,
1709
+ progressSpring: menuOpenedProgress,
1660
1710
  toggledButtonClassName: styles$6.screensMenuButtonToggled
1661
1711
  })) : null), /*#__PURE__*/React__default["default"].createElement(ViewerMenuDots, Object.assign({}, menuTheme, {
1662
1712
  direction: "horizontal",
@@ -1670,15 +1720,14 @@ var ViewerMenu = function ViewerMenu(_ref) {
1670
1720
  onClose: onClickCloseViewer,
1671
1721
  className: styles$6.dots,
1672
1722
  style: {
1673
- opacity: Math.pow(dotsOpacity, 5),
1674
- // @note this is like a "quint" easing, meaning it'll go towards 1 slowly first and then fast as it approaches 1
1675
- pointerEvents: dotsOpacity < 1 ? 'none' : 'auto'
1723
+ 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
1724
+
1676
1725
  }
1677
1726
  }))), /*#__PURE__*/React__default["default"].createElement(ViewerMenuContainer, {
1678
1727
  className: styles$6.menuContainer,
1679
- transitionProgress: shareOpenedProgress,
1728
+ progressSpring: shareOpenedProgress,
1680
1729
  theme: viewerTheme
1681
- }, shareOpenedProgress > 0 ? /*#__PURE__*/React__default["default"].createElement(ViewerMenuShare, {
1730
+ }, draggingShare || shareOpened ? /*#__PURE__*/React__default["default"].createElement(ViewerMenuShare, {
1682
1731
  viewerTheme: viewerTheme,
1683
1732
  className: styles$6.menuShare,
1684
1733
  title: title,
@@ -1693,9 +1742,9 @@ var ViewerMenu = function ViewerMenu(_ref) {
1693
1742
  onClose: onCloseShare
1694
1743
  }) : null), /*#__PURE__*/React__default["default"].createElement(ViewerMenuContainer, {
1695
1744
  className: styles$6.menuContainer,
1696
- transitionProgress: menuOpenedProgress,
1745
+ progressSpring: menuOpenedProgress,
1697
1746
  theme: viewerTheme
1698
- }, menuOpenedProgress > 0 ? /*#__PURE__*/React__default["default"].createElement(ViewerMenuPreview, {
1747
+ }, menuMounted ? /*#__PURE__*/React__default["default"].createElement(ViewerMenuPreview, {
1699
1748
  viewerTheme: viewerTheme,
1700
1749
  className: styles$6.menuPreview,
1701
1750
  screenSize: screenSize,
@@ -1707,6 +1756,7 @@ var ViewerMenu = function ViewerMenu(_ref) {
1707
1756
  onShare: onShare,
1708
1757
  onClickScreen: onClickScreen,
1709
1758
  onClose: onCloseMenu,
1759
+ scrollDisabled: draggingMenu,
1710
1760
  toggleFullscreen: toggleFullscreen,
1711
1761
  fullscreenActive: fullscreenActive,
1712
1762
  fullscreenEnabled: fullscreenEnabled
@@ -1715,8 +1765,9 @@ var ViewerMenu = function ViewerMenu(_ref) {
1715
1765
 
1716
1766
  ViewerMenu.propTypes = propTypes$9;
1717
1767
  ViewerMenu.defaultProps = defaultProps$9;
1768
+ var ViewerMenu$1 = /*#__PURE__*/React__default["default"].memo(ViewerMenu);
1718
1769
 
1719
- var styles$5 = {"container":"micromag-viewer-screen-container","navigationHint":"micromag-viewer-screen-navigationHint"};
1770
+ var styles$5 = {"container":"micromag-viewer-screen-container","inner":"micromag-viewer-screen-inner","navigationHint":"micromag-viewer-screen-navigationHint"};
1720
1771
 
1721
1772
  var propTypes$8 = {
1722
1773
  screen: core.PropTypes.screenComponent,
@@ -1726,6 +1777,7 @@ var propTypes$8 = {
1726
1777
  active: PropTypes__default["default"].bool,
1727
1778
  mediaRef: PropTypes__default["default"].func,
1728
1779
  width: PropTypes__default["default"].number,
1780
+ index: PropTypes__default["default"].number,
1729
1781
  height: PropTypes__default["default"].number,
1730
1782
  scale: PropTypes__default["default"].number,
1731
1783
  // withNavigationHint: PropTypes.bool, // @todo
@@ -1737,6 +1789,7 @@ var defaultProps$8 = {
1737
1789
  screenState: null,
1738
1790
  current: false,
1739
1791
  active: true,
1792
+ index: null,
1740
1793
  mediaRef: null,
1741
1794
  width: null,
1742
1795
  height: null,
@@ -1748,6 +1801,7 @@ var defaultProps$8 = {
1748
1801
  function ViewerScreen(_ref) {
1749
1802
  var screen = _ref.screen,
1750
1803
  renderContext = _ref.renderContext,
1804
+ index = _ref.index,
1751
1805
  screenState = _ref.screenState,
1752
1806
  active = _ref.active,
1753
1807
  current = _ref.current,
@@ -1756,23 +1810,47 @@ function ViewerScreen(_ref) {
1756
1810
  height = _ref.height,
1757
1811
  scale = _ref.scale,
1758
1812
  className = _ref.className;
1813
+
1814
+ var _useState = React.useState(active || current),
1815
+ _useState2 = _slicedToArray__default["default"](_useState, 2),
1816
+ mounted = _useState2[0],
1817
+ setMounted = _useState2[1];
1818
+
1819
+ React.useEffect(function () {
1820
+ var timeout = null;
1821
+
1822
+ if (active !== mounted) {
1823
+ timeout = setTimeout(function () {
1824
+ setMounted(active);
1825
+ }, 200);
1826
+ }
1827
+
1828
+ return function () {
1829
+ if (timeout !== null) {
1830
+ clearTimeout(timeout);
1831
+ }
1832
+ };
1833
+ }, [active, mounted, setMounted, index]);
1759
1834
  return /*#__PURE__*/React__default["default"].createElement("div", {
1760
1835
  className: classNames__default["default"]([styles$5.container, _defineProperty__default["default"]({}, className, className !== null)])
1761
1836
  }, /*#__PURE__*/React__default["default"].createElement("div", {
1837
+ className: styles$5.inner,
1762
1838
  style: {
1763
1839
  width: width,
1764
1840
  height: height,
1765
1841
  transform: scale !== null ? "scale(".concat(scale, ")") : null,
1766
- transformOrigin: scale !== null ? '0 0' : null
1842
+ transformOrigin: scale !== null ? '0 0' : null,
1843
+ opacity: mounted ? 1 : null
1767
1844
  }
1768
- }, /*#__PURE__*/React__default["default"].createElement(components.Screen, {
1845
+ }, mounted ? /*#__PURE__*/React__default["default"].createElement(components.Screen, {
1769
1846
  screen: screen,
1770
1847
  renderContext: renderContext,
1771
1848
  screenState: screenState,
1849
+ index: index,
1772
1850
  active: active,
1773
1851
  current: current,
1774
1852
  mediaRef: mediaRef
1775
- })));
1853
+ }) : null));
1776
1854
  }
1777
1855
 
1778
1856
  ViewerScreen.propTypes = propTypes$8;
@@ -1885,9 +1963,10 @@ var stopDragEventsPropagation = {
1885
1963
 
1886
1964
  function getFormattedTimestamp(s) {
1887
1965
  var withMilliseconds = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
1888
- var sparts = withMilliseconds ? "".concat(s).split('.') : [];
1889
- var ms = sparts.length > 1 ? ":".concat(sparts[1].substring(0, 3)) : '';
1890
- return (s - (s %= 60)) / 60 + (9 < s ? ':' : ':0') + ~~s + ms; // eslint-disable-line
1966
+ var parts = "".concat(s).split('.');
1967
+ var seconds = parts[0];
1968
+ var ms = withMilliseconds && parts.length > 1 ? ":".concat(parts[1].substring(0, 3)) : '';
1969
+ return (s - (s %= 60)) / 60 + (9 < seconds ? ':' : ':0') + ~~s + ms; // eslint-disable-line
1891
1970
  }
1892
1971
 
1893
1972
  var SHOW_MILLISECONDS_THRESHOLD = 5; // show milliseconds when scrubbing if length of video is shorter than 5 seconds
@@ -2381,7 +2460,6 @@ var propTypes$2 = {
2381
2460
  screenState: PropTypes__default["default"].string,
2382
2461
  deviceScreens: core.PropTypes.deviceScreens,
2383
2462
  renderContext: core.PropTypes.renderContext,
2384
- visitor: core.PropTypes.visitor,
2385
2463
  onScreenChange: PropTypes__default["default"].func,
2386
2464
  tapNextScreenWidthPercent: PropTypes__default["default"].number,
2387
2465
  storyIsParsed: PropTypes__default["default"].bool,
@@ -2425,11 +2503,10 @@ var defaultProps$2 = {
2425
2503
  screenState: null,
2426
2504
  deviceScreens: utils.getDeviceScreens(),
2427
2505
  renderContext: 'view',
2428
- visitor: null,
2429
2506
  onScreenChange: null,
2430
2507
  tapNextScreenWidthPercent: 0.8,
2431
2508
  storyIsParsed: false,
2432
- neighborScreensActive: 2,
2509
+ neighborScreensActive: 1,
2433
2510
  neighborScreenOffset: 105,
2434
2511
  neighborScreenScale: 0.8,
2435
2512
  withMetadata: false,
@@ -2468,7 +2545,6 @@ var Viewer = function Viewer(_ref) {
2468
2545
  screenState = _ref.screenState,
2469
2546
  deviceScreens = _ref.deviceScreens,
2470
2547
  renderContext = _ref.renderContext,
2471
- visitor = _ref.visitor,
2472
2548
  tapNextScreenWidthPercent = _ref.tapNextScreenWidthPercent,
2473
2549
  storyIsParsed = _ref.storyIsParsed,
2474
2550
  neighborScreensActive = _ref.neighborScreensActive,
@@ -2789,34 +2865,48 @@ var Viewer = function Viewer(_ref) {
2789
2865
  springParams: springParams
2790
2866
  }),
2791
2867
  isDragging = _useDragProgress.dragging,
2792
- screenIndexProgress = _useDragProgress.progress,
2868
+ progressSpring = _useDragProgress.progress,
2793
2869
  dragContentBind = _useDragProgress.bind;
2794
2870
 
2795
- var getScreenStylesByIndex = function getScreenStylesByIndex(index, progress) {
2871
+ var getScreenStylesByIndex = function getScreenStylesByIndex(index, spring) {
2796
2872
  if (transitionType === 'stack') {
2797
- var _t = index - progress;
2798
-
2799
- var _clamped = Math.min(1, Math.max(0, _t));
2800
-
2801
- var invert = Math.min(1, Math.max(0, -_t));
2802
- var opacity = Math.max(0, 1 - 0.75 * invert + (_t + 1)); // just hide other screens
2803
-
2804
- if (Math.abs(_t) > neighborScreensActive) return {
2805
- opacity: 0
2806
- };
2807
2873
  return {
2808
- opacity: opacity,
2809
- transform: "translateX(".concat(_clamped * 100, "%) scale(").concat(1 - 0.2 * invert, ")"),
2810
- boxShadow: "0 0 ".concat(4 * (1 - _clamped), "rem ").concat(-0.5 * (1 - _clamped), "rem black"),
2811
- zIndex: index
2874
+ zIndex: index,
2875
+ opacity: spring.to(function (progress) {
2876
+ var t = index - progress;
2877
+ var invert = Math.min(1, Math.max(0, -t));
2878
+ if (Math.abs(t) > neighborScreensActive) return 0;
2879
+ return Math.max(0, 1 - 0.75 * invert + (t + 1));
2880
+ }),
2881
+ transform: spring.to(function (progress) {
2882
+ var t = index - progress;
2883
+ var clamped = Math.min(1, Math.max(0, t));
2884
+ var invert = Math.min(1, Math.max(0, -t));
2885
+ if (Math.abs(t) > neighborScreensActive) return 'translateX(100%)';
2886
+ return "translateX(".concat(clamped * 100, "%) scale(").concat(1 - 0.2 * invert, ")");
2887
+ }),
2888
+ boxShadow: spring.to(function (progress) {
2889
+ var t = index - progress;
2890
+ if (Math.abs(t) > neighborScreensActive) return null;
2891
+ var clamped = Math.min(1, Math.max(0, t));
2892
+ return "0 0 ".concat(4 * (1 - clamped), "rem ").concat(-0.5 * (1 - clamped), "rem black");
2893
+ })
2812
2894
  };
2813
2895
  }
2814
2896
 
2815
- var t = index - progress;
2816
- var clamped = Math.min(1, Math.max(0, Math.abs(t)));
2817
2897
  return {
2818
- opacity: 1 - 0.75 * clamped,
2819
- transform: "translateX(".concat(t * neighborScreenOffset, "%) scale(").concat(1 - (1 - neighborScreenScale) * clamped, ")"),
2898
+ opacity: spring.to(function (progress) {
2899
+ var t = index - progress;
2900
+ if (Math.abs(t) > neighborScreensActive) return 0;
2901
+ var clamped = Math.min(1, Math.max(0, Math.abs(t)));
2902
+ return 1 - 0.75 * clamped;
2903
+ }),
2904
+ transform: spring.to(function (progress) {
2905
+ var t = index - progress;
2906
+ if (Math.abs(t) > neighborScreensActive) return "translate(100%)";
2907
+ var clamped = Math.min(1, Math.max(0, Math.abs(t)));
2908
+ return "translateX(".concat(t * neighborScreenOffset, "%) scale(").concat(1 - (1 - neighborScreenScale) * clamped, ")");
2909
+ }),
2820
2910
  zIndex: screensCount - index
2821
2911
  };
2822
2912
  };
@@ -2873,8 +2963,8 @@ var Viewer = function Viewer(_ref) {
2873
2963
  useKeyboardShortcuts(keyboardShortcuts, {
2874
2964
  disabled: renderContext !== 'view'
2875
2965
  });
2876
- return /*#__PURE__*/React__default["default"].createElement(contexts.VisitorProvider, {
2877
- visitor: visitor
2966
+ return /*#__PURE__*/React__default["default"].createElement(contexts.StoryProvider, {
2967
+ story: parsedStory
2878
2968
  }, /*#__PURE__*/React__default["default"].createElement(contexts.ScreenSizeProvider, {
2879
2969
  size: screenSize
2880
2970
  }, /*#__PURE__*/React__default["default"].createElement(contexts.ViewerProvider, {
@@ -2902,7 +2992,7 @@ var Viewer = function Viewer(_ref) {
2902
2992
  }), (_ref15 = {}, _defineProperty__default["default"](_ref15, styles$6.landscape, landscape), _defineProperty__default["default"](_ref15, styles$6.withoutGestures, withoutGestures), _defineProperty__default["default"](_ref15, styles$6.hideMenu, !menuVisible), _defineProperty__default["default"](_ref15, styles$6.fadeMenu, playing && playbackControls && !playbackcontrolsVisible), _defineProperty__default["default"](_ref15, styles$6.ready, ready || withoutScreensTransforms), _defineProperty__default["default"](_ref15, styles$6.hasInteracted, hasInteracted), _defineProperty__default["default"](_ref15, styles$6.isDragging, isDragging), _defineProperty__default["default"](_ref15, className, className), _ref15)]),
2903
2993
  ref: containerRef,
2904
2994
  onContextMenu: onContextMenu
2905
- }, !withoutMenu ? /*#__PURE__*/React__default["default"].createElement(ViewerMenu, {
2995
+ }, !withoutMenu ? /*#__PURE__*/React__default["default"].createElement(ViewerMenu$1, {
2906
2996
  story: parsedStory,
2907
2997
  currentScreenIndex: screenIndex,
2908
2998
  withShadow: menuOverScreen && !withoutMenuShadow,
@@ -2937,12 +3027,12 @@ var Viewer = function Viewer(_ref) {
2937
3027
  }, screens.map(function (screen, i) {
2938
3028
  var current = screenIndex === i;
2939
3029
  var active = i >= screenIndex - neighborScreensActive && i <= screenIndex + neighborScreensActive;
2940
- var screenStyles = getScreenStylesByIndex(i, screenIndexProgress);
2941
- return /*#__PURE__*/React__default["default"].createElement("div", {
3030
+ var screenStyles = getScreenStylesByIndex(i, progressSpring);
3031
+ return /*#__PURE__*/React__default["default"].createElement(web.animated.div, {
2942
3032
  key: "screen-viewer-".concat(screen.id || '', "-").concat(i + 1),
2943
3033
  style: screenStyles,
2944
3034
  className: classNames__default["default"]([styles$6.screenContainer, _defineProperty__default["default"]({}, styles$6.current, current)])
2945
- }, screen !== null && active ? /*#__PURE__*/React__default["default"].createElement(ViewerScreen, {
3035
+ }, screen !== null ? /*#__PURE__*/React__default["default"].createElement(ViewerScreen, {
2946
3036
  className: styles$6.screen,
2947
3037
  screen: screen,
2948
3038
  screenState: current ? screenState : null,
@@ -3056,7 +3146,7 @@ var defaultRoutes = {
3056
3146
  screen: screen
3057
3147
  };
3058
3148
 
3059
- var _excluded = ["story", "screenComponents", "memoryRouter", "basePath", "routes", "withoutRouter", "googleApiKey", "trackingVariables", "locale", "locales", "translations", "pathWithIndex"];
3149
+ var _excluded = ["story", "screenComponents", "memoryRouter", "basePath", "routes", "withoutRouter", "googleApiKey", "visitor", "trackingVariables", "locale", "locales", "translations", "pathWithIndex"];
3060
3150
  var propTypes = {
3061
3151
  story: core.PropTypes.story,
3062
3152
  screen: PropTypes__default["default"].string,
@@ -3066,6 +3156,7 @@ var propTypes = {
3066
3156
  routes: routes,
3067
3157
  withoutRouter: PropTypes__default["default"].bool,
3068
3158
  googleApiKey: PropTypes__default["default"].string,
3159
+ visitor: core.PropTypes.visitor,
3069
3160
  trackingVariables: core.PropTypes.trackingVariables,
3070
3161
  locale: PropTypes__default["default"].string,
3071
3162
  locales: PropTypes__default["default"].arrayOf(PropTypes__default["default"].string),
@@ -3082,6 +3173,7 @@ var defaultProps = {
3082
3173
  routes: defaultRoutes,
3083
3174
  withoutRouter: false,
3084
3175
  googleApiKey: null,
3176
+ visitor: null,
3085
3177
  trackingVariables: null,
3086
3178
  locale: 'en',
3087
3179
  locales: ['fr', 'en'],
@@ -3098,6 +3190,7 @@ var ViewerContainer = function ViewerContainer(_ref) {
3098
3190
  routes = _ref.routes,
3099
3191
  withoutRouter = _ref.withoutRouter,
3100
3192
  googleApiKey = _ref.googleApiKey,
3193
+ visitor = _ref.visitor,
3101
3194
  trackingVariables = _ref.trackingVariables,
3102
3195
  locale = _ref.locale,
3103
3196
  locales = _ref.locales,
@@ -3147,7 +3240,9 @@ var ViewerContainer = function ViewerContainer(_ref) {
3147
3240
  }, /*#__PURE__*/React__default["default"].createElement(screens.ScreensProvider, null, /*#__PURE__*/React__default["default"].createElement(contexts.ComponentsProvider, {
3148
3241
  namespace: contexts.SCREENS_NAMESPACE,
3149
3242
  components: screenComponents || {}
3150
- }, /*#__PURE__*/React__default["default"].createElement(contexts.UserInteractionProvider, null, /*#__PURE__*/React__default["default"].createElement(contexts.PlaybackProvider, null, /*#__PURE__*/React__default["default"].createElement(contexts.TrackingProvider, {
3243
+ }, /*#__PURE__*/React__default["default"].createElement(contexts.VisitorProvider, {
3244
+ visitor: visitor
3245
+ }, /*#__PURE__*/React__default["default"].createElement(contexts.PlaybackProvider, null, /*#__PURE__*/React__default["default"].createElement(contexts.TrackingProvider, {
3151
3246
  variables: finalTrackingVariables
3152
3247
  }, withoutRouter ? /*#__PURE__*/React__default["default"].createElement(Viewer, Object.assign({
3153
3248
  story: story,