@micromag/viewer 0.3.250 → 0.3.251

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