@micromag/viewer 0.3.206 → 0.3.211

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
@@ -14,6 +14,7 @@ import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
14
14
  import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
15
15
  import classNames from 'classnames';
16
16
  import { Helmet } from 'react-helmet';
17
+ import { animated } from '@react-spring/web';
17
18
  import EventEmitter from 'wolfy87-eventemitter';
18
19
  import { Label, ScreenPreview, Screen, Button as Button$1, Meta, FontFaces } from '@micromag/core/components';
19
20
  import { useDimensionObserver, useTrackEvent, useDragProgress, useMediaProgress, useParsedStory, useLoadedFonts, useTrackScreenView, useScreenSizeFromElement, useFullscreen } from '@micromag/core/hooks';
@@ -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';
@@ -511,14 +511,14 @@ var styles$e = {"container":"micromag-viewer-buttons-toggle-button-container","n
511
511
 
512
512
  var propTypes$i = {
513
513
  className: PropTypes.string,
514
- toggled: PropTypes.number,
514
+ progressSpring: PropTypes.number,
515
515
  button: PropTypes.node,
516
516
  toggledButton: PropTypes.node,
517
517
  toggledButtonClassName: PropTypes.string
518
518
  };
519
519
  var defaultProps$i = {
520
520
  className: null,
521
- toggled: 0,
521
+ progressSpring: 0,
522
522
  button: null,
523
523
  toggledButton: null,
524
524
  toggledButtonClassName: null
@@ -526,26 +526,27 @@ var defaultProps$i = {
526
526
 
527
527
  var ToggleButton = function ToggleButton(_ref) {
528
528
  var className = _ref.className,
529
- toggled = _ref.toggled,
529
+ progressSpring = _ref.progressSpring,
530
530
  button = _ref.button,
531
531
  toggledButton = _ref.toggledButton,
532
532
  toggledButtonClassName = _ref.toggledButtonClassName;
533
533
  if (button === null) return false;
534
-
535
- var getToggleButtonStyles = function getToggleButtonStyles(t) {
536
- return {
537
- transform: "translateY(".concat(t * -100, "%)")
538
- };
539
- };
540
-
541
534
  return /*#__PURE__*/React.createElement("div", {
542
535
  className: classNames([styles$e.container, _defineProperty({}, className, className !== null)])
543
- }, /*#__PURE__*/React.createElement("div", {
536
+ }, /*#__PURE__*/React.createElement(animated.div, {
544
537
  className: styles$e.normal,
545
- style: getToggleButtonStyles(toggled)
546
- }, button), /*#__PURE__*/React.createElement("div", {
538
+ style: {
539
+ transform: progressSpring.to(function (p) {
540
+ return "translateY(".concat(p * -100, "%)");
541
+ })
542
+ }
543
+ }, button), /*#__PURE__*/React.createElement(animated.div, {
547
544
  className: classNames([styles$e.toggled, _defineProperty({}, toggledButtonClassName, toggledButtonClassName !== null)]),
548
- style: getToggleButtonStyles(toggled - 1)
545
+ style: {
546
+ transform: progressSpring.to(function (p) {
547
+ return "translateY(".concat((p - 1) * -100, "%)");
548
+ })
549
+ }
549
550
  }, toggledButton));
550
551
  };
551
552
 
@@ -556,20 +557,20 @@ var styles$d = {"backdrop":"micromag-viewer-menus-menu-container-backdrop","heig
556
557
 
557
558
  var propTypes$h = {
558
559
  className: PropTypes.string,
559
- transitionProgress: PropTypes.number,
560
+ progressSpring: PropTypes.number,
560
561
  theme: PropTypes$1.viewerTheme,
561
562
  children: PropTypes.node
562
563
  };
563
564
  var defaultProps$h = {
564
565
  className: null,
565
- transitionProgress: 0,
566
+ progressSpring: 0,
566
567
  theme: null,
567
568
  children: null
568
569
  };
569
570
 
570
571
  var ViewerMenuContainer = function ViewerMenuContainer(_ref) {
571
572
  var className = _ref.className,
572
- transitionProgress = _ref.transitionProgress,
573
+ progressSpring = _ref.progressSpring,
573
574
  viewerTheme = _ref.theme,
574
575
  children = _ref.children;
575
576
 
@@ -587,17 +588,25 @@ var ViewerMenuContainer = function ViewerMenuContainer(_ref) {
587
588
  style: {
588
589
  pointerEvents: 'none'
589
590
  }
590
- }, /*#__PURE__*/React.createElement("div", {
591
+ }, /*#__PURE__*/React.createElement(animated.div, {
591
592
  className: styles$d.heightContainer,
592
593
  style: _objectSpread({
593
- height: "".concat(transitionProgress * 100, "%"),
594
- pointerEvents: transitionProgress < 0.25 ? 'none' : 'auto',
595
- zIndex: Math.round(2 + transitionProgress)
594
+ opacity: progressSpring,
595
+ // transform: progressSpring.to((p) => `translateY(${(1 - p) * -100}%)`),
596
+ // height: progressSpring.to((p) => `${p * 100}%`),
597
+ pointerEvents: progressSpring.to(function (p) {
598
+ return p < 0.25 ? 'none' : 'auto';
599
+ }),
600
+ zIndex: progressSpring.to(function (p) {
601
+ return Math.round(2 + p);
602
+ })
596
603
  }, backgroundColorStyle)
597
- }, children), /*#__PURE__*/React.createElement("div", {
604
+ }, children), /*#__PURE__*/React.createElement(animated.div, {
598
605
  className: styles$d.backdrop,
599
606
  style: {
600
- opacity: easings.easeOutQuint(transitionProgress)
607
+ opacity: progressSpring.to(function (p) {
608
+ return easings.easeOutQuint(p);
609
+ })
601
610
  }
602
611
  }));
603
612
  };
@@ -968,6 +977,7 @@ var propTypes$c = {
968
977
  onClickScreen: PropTypes.func,
969
978
  maxThumbsWidth: PropTypes.number,
970
979
  paddingTop: PropTypes.number,
980
+ scrollDisabled: PropTypes.bool,
971
981
  // @todo to reimplement:
972
982
  // shouldLoad: PropTypes.bool,
973
983
  // toggleFullscreen: PropTypes.func,
@@ -985,6 +995,7 @@ var defaultProps$c = {
985
995
  onClickScreen: null,
986
996
  maxThumbsWidth: 140,
987
997
  paddingTop: null,
998
+ scrollDisabled: false,
988
999
  // toggleFullscreen: null,
989
1000
  // fullscreenActive: false,
990
1001
  // fullscreenEnabled: false,
@@ -1000,6 +1011,7 @@ var ViewerMenuPreview = function ViewerMenuPreview(_ref) {
1000
1011
  onClickScreen = _ref.onClickScreen,
1001
1012
  maxThumbsWidth = _ref.maxThumbsWidth,
1002
1013
  paddingTop = _ref.paddingTop,
1014
+ scrollDisabled = _ref.scrollDisabled,
1003
1015
  className = _ref.className;
1004
1016
 
1005
1017
  var _useDimensionObserver = useDimensionObserver(),
@@ -1042,7 +1054,8 @@ var ViewerMenuPreview = function ViewerMenuPreview(_ref) {
1042
1054
  className: styles$9.content,
1043
1055
  ref: containerRef
1044
1056
  }, /*#__PURE__*/React.createElement(Scroll, {
1045
- className: styles$9.scroll
1057
+ className: styles$9.scroll,
1058
+ disabled: scrollDisabled
1046
1059
  }, /*#__PURE__*/React.createElement("nav", {
1047
1060
  className: styles$9.nav,
1048
1061
  style: {
@@ -1533,6 +1546,7 @@ var ViewerMenu = function ViewerMenu(_ref) {
1533
1546
  springParams: springParams
1534
1547
  }),
1535
1548
  bindShareDrag = _useDragProgress.bind,
1549
+ draggingShare = _useDragProgress.dragging,
1536
1550
  shareOpenedProgress = _useDragProgress.progress;
1537
1551
 
1538
1552
  var computeMenuProgress = useCallback(function (_ref9) {
@@ -1580,6 +1594,7 @@ var ViewerMenu = function ViewerMenu(_ref) {
1580
1594
  springParams: springParams
1581
1595
  }),
1582
1596
  bindMenuDrag = _useDragProgress2.bind,
1597
+ draggingMenu = _useDragProgress2.dragging,
1583
1598
  menuOpenedProgress = _useDragProgress2.progress;
1584
1599
 
1585
1600
  var keyboardShortcuts = useMemo(function () {
@@ -1620,7 +1635,7 @@ var ViewerMenu = function ViewerMenu(_ref) {
1620
1635
  theme: menuTheme,
1621
1636
  iconPosition: "left"
1622
1637
  }),
1623
- toggled: shareOpenedProgress
1638
+ progressSpring: shareOpenedProgress
1624
1639
  })) : null, !withoutScreensMenu ? /*#__PURE__*/React.createElement("div", Object.assign({
1625
1640
  className: classNames([styles$6.menuItem, styles$6.menuItemScreens])
1626
1641
  }, bindMenuDrag()), /*#__PURE__*/React.createElement(ToggleButton, {
@@ -1636,7 +1651,7 @@ var ViewerMenu = function ViewerMenu(_ref) {
1636
1651
  theme: menuTheme,
1637
1652
  iconPosition: "right"
1638
1653
  }),
1639
- toggled: menuOpenedProgress,
1654
+ progressSpring: menuOpenedProgress,
1640
1655
  toggledButtonClassName: styles$6.screensMenuButtonToggled
1641
1656
  })) : null), /*#__PURE__*/React.createElement(ViewerMenuDots, Object.assign({}, menuTheme, {
1642
1657
  direction: "horizontal",
@@ -1656,9 +1671,9 @@ var ViewerMenu = function ViewerMenu(_ref) {
1656
1671
  }
1657
1672
  }))), /*#__PURE__*/React.createElement(ViewerMenuContainer, {
1658
1673
  className: styles$6.menuContainer,
1659
- transitionProgress: shareOpenedProgress,
1674
+ progressSpring: shareOpenedProgress,
1660
1675
  theme: viewerTheme
1661
- }, shareOpenedProgress > 0 ? /*#__PURE__*/React.createElement(ViewerMenuShare, {
1676
+ }, draggingShare || shareOpened ? /*#__PURE__*/React.createElement(ViewerMenuShare, {
1662
1677
  viewerTheme: viewerTheme,
1663
1678
  className: styles$6.menuShare,
1664
1679
  title: title,
@@ -1673,9 +1688,9 @@ var ViewerMenu = function ViewerMenu(_ref) {
1673
1688
  onClose: onCloseShare
1674
1689
  }) : null), /*#__PURE__*/React.createElement(ViewerMenuContainer, {
1675
1690
  className: styles$6.menuContainer,
1676
- transitionProgress: menuOpenedProgress,
1691
+ progressSpring: menuOpenedProgress,
1677
1692
  theme: viewerTheme
1678
- }, menuOpenedProgress > 0 ? /*#__PURE__*/React.createElement(ViewerMenuPreview, {
1693
+ }, draggingMenu || menuOpened ? /*#__PURE__*/React.createElement(ViewerMenuPreview, {
1679
1694
  viewerTheme: viewerTheme,
1680
1695
  className: styles$6.menuPreview,
1681
1696
  screenSize: screenSize,
@@ -1687,6 +1702,7 @@ var ViewerMenu = function ViewerMenu(_ref) {
1687
1702
  onShare: onShare,
1688
1703
  onClickScreen: onClickScreen,
1689
1704
  onClose: onCloseMenu,
1705
+ scrollDisabled: draggingMenu,
1690
1706
  toggleFullscreen: toggleFullscreen,
1691
1707
  fullscreenActive: fullscreenActive,
1692
1708
  fullscreenEnabled: fullscreenEnabled
@@ -1695,6 +1711,7 @@ var ViewerMenu = function ViewerMenu(_ref) {
1695
1711
 
1696
1712
  ViewerMenu.propTypes = propTypes$9;
1697
1713
  ViewerMenu.defaultProps = defaultProps$9;
1714
+ var ViewerMenu$1 = /*#__PURE__*/React.memo(ViewerMenu);
1698
1715
 
1699
1716
  var styles$5 = {"container":"micromag-viewer-screen-container","navigationHint":"micromag-viewer-screen-navigationHint"};
1700
1717
 
@@ -2769,34 +2786,48 @@ var Viewer = function Viewer(_ref) {
2769
2786
  springParams: springParams
2770
2787
  }),
2771
2788
  isDragging = _useDragProgress.dragging,
2772
- screenIndexProgress = _useDragProgress.progress,
2789
+ progressSpring = _useDragProgress.progress,
2773
2790
  dragContentBind = _useDragProgress.bind;
2774
2791
 
2775
- var getScreenStylesByIndex = function getScreenStylesByIndex(index, progress) {
2792
+ var getScreenStylesByIndex = function getScreenStylesByIndex(index, spring) {
2776
2793
  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
2794
  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
2795
+ zIndex: index,
2796
+ opacity: spring.to(function (progress) {
2797
+ var t = index - progress;
2798
+ var invert = Math.min(1, Math.max(0, -t));
2799
+ if (Math.abs(t) > neighborScreensActive) return 0;
2800
+ return Math.max(0, 1 - 0.75 * invert + (t + 1));
2801
+ }),
2802
+ transform: spring.to(function (progress) {
2803
+ var t = index - progress;
2804
+ var clamped = Math.min(1, Math.max(0, t));
2805
+ var invert = Math.min(1, Math.max(0, -t));
2806
+ if (Math.abs(t) > neighborScreensActive) return 'translateX(100%)';
2807
+ return "translateX(".concat(clamped * 100, "%) scale(").concat(1 - 0.2 * invert, ")");
2808
+ }),
2809
+ boxShadow: spring.to(function (progress) {
2810
+ var t = index - progress;
2811
+ if (Math.abs(t) > neighborScreensActive) return null;
2812
+ var clamped = Math.min(1, Math.max(0, t));
2813
+ return "0 0 ".concat(4 * (1 - clamped), "rem ").concat(-0.5 * (1 - clamped), "rem black");
2814
+ })
2792
2815
  };
2793
2816
  }
2794
2817
 
2795
- var t = index - progress;
2796
- var clamped = Math.min(1, Math.max(0, Math.abs(t)));
2797
2818
  return {
2798
- opacity: 1 - 0.75 * clamped,
2799
- transform: "translateX(".concat(t * neighborScreenOffset, "%) scale(").concat(1 - (1 - neighborScreenScale) * clamped, ")"),
2819
+ opacity: spring.to(function (progress) {
2820
+ var t = index - progress;
2821
+ if (Math.abs(t) > neighborScreensActive) return 0;
2822
+ var clamped = Math.min(1, Math.max(0, Math.abs(t)));
2823
+ return 1 - 0.75 * clamped;
2824
+ }),
2825
+ transform: spring.to(function (progress) {
2826
+ var t = index - progress;
2827
+ if (Math.abs(t) > neighborScreensActive) return "translate(100%)";
2828
+ var clamped = Math.min(1, Math.max(0, Math.abs(t)));
2829
+ return "translateX(".concat(t * neighborScreenOffset, "%) scale(").concat(1 - (1 - neighborScreenScale) * clamped, ")");
2830
+ }),
2800
2831
  zIndex: screensCount - index
2801
2832
  };
2802
2833
  };
@@ -2882,7 +2913,7 @@ var Viewer = function Viewer(_ref) {
2882
2913
  }), (_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
2914
  ref: containerRef,
2884
2915
  onContextMenu: onContextMenu
2885
- }, !withoutMenu ? /*#__PURE__*/React.createElement(ViewerMenu, {
2916
+ }, !withoutMenu ? /*#__PURE__*/React.createElement(ViewerMenu$1, {
2886
2917
  story: parsedStory,
2887
2918
  currentScreenIndex: screenIndex,
2888
2919
  withShadow: menuOverScreen && !withoutMenuShadow,
@@ -2917,8 +2948,8 @@ var Viewer = function Viewer(_ref) {
2917
2948
  }, screens.map(function (screen, i) {
2918
2949
  var current = screenIndex === i;
2919
2950
  var active = i >= screenIndex - neighborScreensActive && i <= screenIndex + neighborScreensActive;
2920
- var screenStyles = getScreenStylesByIndex(i, screenIndexProgress);
2921
- return /*#__PURE__*/React.createElement("div", {
2951
+ var screenStyles = getScreenStylesByIndex(i, progressSpring);
2952
+ return /*#__PURE__*/React.createElement(animated.div, {
2922
2953
  key: "screen-viewer-".concat(screen.id || '', "-").concat(i + 1),
2923
2954
  style: screenStyles,
2924
2955
  className: classNames([styles$6.screenContainer, _defineProperty({}, styles$6.current, current)])
package/lib/index.js CHANGED
@@ -18,6 +18,7 @@ var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
18
18
  var _toConsumableArray = require('@babel/runtime/helpers/toConsumableArray');
19
19
  var classNames = require('classnames');
20
20
  var reactHelmet = require('react-helmet');
21
+ var web = require('@react-spring/web');
21
22
  var EventEmitter = require('wolfy87-eventemitter');
22
23
  var components = require('@micromag/core/components');
23
24
  var hooks = require('@micromag/core/hooks');
@@ -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');
@@ -531,14 +531,14 @@ var styles$e = {"container":"micromag-viewer-buttons-toggle-button-container","n
531
531
 
532
532
  var propTypes$i = {
533
533
  className: PropTypes__default["default"].string,
534
- toggled: PropTypes__default["default"].number,
534
+ progressSpring: PropTypes__default["default"].number,
535
535
  button: PropTypes__default["default"].node,
536
536
  toggledButton: PropTypes__default["default"].node,
537
537
  toggledButtonClassName: PropTypes__default["default"].string
538
538
  };
539
539
  var defaultProps$i = {
540
540
  className: null,
541
- toggled: 0,
541
+ progressSpring: 0,
542
542
  button: null,
543
543
  toggledButton: null,
544
544
  toggledButtonClassName: null
@@ -546,26 +546,27 @@ var defaultProps$i = {
546
546
 
547
547
  var ToggleButton = function ToggleButton(_ref) {
548
548
  var className = _ref.className,
549
- toggled = _ref.toggled,
549
+ progressSpring = _ref.progressSpring,
550
550
  button = _ref.button,
551
551
  toggledButton = _ref.toggledButton,
552
552
  toggledButtonClassName = _ref.toggledButtonClassName;
553
553
  if (button === null) return false;
554
-
555
- var getToggleButtonStyles = function getToggleButtonStyles(t) {
556
- return {
557
- transform: "translateY(".concat(t * -100, "%)")
558
- };
559
- };
560
-
561
554
  return /*#__PURE__*/React__default["default"].createElement("div", {
562
555
  className: classNames__default["default"]([styles$e.container, _defineProperty__default["default"]({}, className, className !== null)])
563
- }, /*#__PURE__*/React__default["default"].createElement("div", {
556
+ }, /*#__PURE__*/React__default["default"].createElement(web.animated.div, {
564
557
  className: styles$e.normal,
565
- style: getToggleButtonStyles(toggled)
566
- }, button), /*#__PURE__*/React__default["default"].createElement("div", {
558
+ style: {
559
+ transform: progressSpring.to(function (p) {
560
+ return "translateY(".concat(p * -100, "%)");
561
+ })
562
+ }
563
+ }, button), /*#__PURE__*/React__default["default"].createElement(web.animated.div, {
567
564
  className: classNames__default["default"]([styles$e.toggled, _defineProperty__default["default"]({}, toggledButtonClassName, toggledButtonClassName !== null)]),
568
- style: getToggleButtonStyles(toggled - 1)
565
+ style: {
566
+ transform: progressSpring.to(function (p) {
567
+ return "translateY(".concat((p - 1) * -100, "%)");
568
+ })
569
+ }
569
570
  }, toggledButton));
570
571
  };
571
572
 
@@ -576,20 +577,20 @@ var styles$d = {"backdrop":"micromag-viewer-menus-menu-container-backdrop","heig
576
577
 
577
578
  var propTypes$h = {
578
579
  className: PropTypes__default["default"].string,
579
- transitionProgress: PropTypes__default["default"].number,
580
+ progressSpring: PropTypes__default["default"].number,
580
581
  theme: core.PropTypes.viewerTheme,
581
582
  children: PropTypes__default["default"].node
582
583
  };
583
584
  var defaultProps$h = {
584
585
  className: null,
585
- transitionProgress: 0,
586
+ progressSpring: 0,
586
587
  theme: null,
587
588
  children: null
588
589
  };
589
590
 
590
591
  var ViewerMenuContainer = function ViewerMenuContainer(_ref) {
591
592
  var className = _ref.className,
592
- transitionProgress = _ref.transitionProgress,
593
+ progressSpring = _ref.progressSpring,
593
594
  viewerTheme = _ref.theme,
594
595
  children = _ref.children;
595
596
 
@@ -607,17 +608,25 @@ var ViewerMenuContainer = function ViewerMenuContainer(_ref) {
607
608
  style: {
608
609
  pointerEvents: 'none'
609
610
  }
610
- }, /*#__PURE__*/React__default["default"].createElement("div", {
611
+ }, /*#__PURE__*/React__default["default"].createElement(web.animated.div, {
611
612
  className: styles$d.heightContainer,
612
613
  style: _objectSpread__default["default"]({
613
- height: "".concat(transitionProgress * 100, "%"),
614
- pointerEvents: transitionProgress < 0.25 ? 'none' : 'auto',
615
- zIndex: Math.round(2 + transitionProgress)
614
+ opacity: progressSpring,
615
+ // transform: progressSpring.to((p) => `translateY(${(1 - p) * -100}%)`),
616
+ // height: progressSpring.to((p) => `${p * 100}%`),
617
+ pointerEvents: progressSpring.to(function (p) {
618
+ return p < 0.25 ? 'none' : 'auto';
619
+ }),
620
+ zIndex: progressSpring.to(function (p) {
621
+ return Math.round(2 + p);
622
+ })
616
623
  }, backgroundColorStyle)
617
- }, children), /*#__PURE__*/React__default["default"].createElement("div", {
624
+ }, children), /*#__PURE__*/React__default["default"].createElement(web.animated.div, {
618
625
  className: styles$d.backdrop,
619
626
  style: {
620
- opacity: utils.easings.easeOutQuint(transitionProgress)
627
+ opacity: progressSpring.to(function (p) {
628
+ return utils.easings.easeOutQuint(p);
629
+ })
621
630
  }
622
631
  }));
623
632
  };
@@ -988,6 +997,7 @@ var propTypes$c = {
988
997
  onClickScreen: PropTypes__default["default"].func,
989
998
  maxThumbsWidth: PropTypes__default["default"].number,
990
999
  paddingTop: PropTypes__default["default"].number,
1000
+ scrollDisabled: PropTypes__default["default"].bool,
991
1001
  // @todo to reimplement:
992
1002
  // shouldLoad: PropTypes.bool,
993
1003
  // toggleFullscreen: PropTypes.func,
@@ -1005,6 +1015,7 @@ var defaultProps$c = {
1005
1015
  onClickScreen: null,
1006
1016
  maxThumbsWidth: 140,
1007
1017
  paddingTop: null,
1018
+ scrollDisabled: false,
1008
1019
  // toggleFullscreen: null,
1009
1020
  // fullscreenActive: false,
1010
1021
  // fullscreenEnabled: false,
@@ -1020,6 +1031,7 @@ var ViewerMenuPreview = function ViewerMenuPreview(_ref) {
1020
1031
  onClickScreen = _ref.onClickScreen,
1021
1032
  maxThumbsWidth = _ref.maxThumbsWidth,
1022
1033
  paddingTop = _ref.paddingTop,
1034
+ scrollDisabled = _ref.scrollDisabled,
1023
1035
  className = _ref.className;
1024
1036
 
1025
1037
  var _useDimensionObserver = hooks.useDimensionObserver(),
@@ -1062,7 +1074,8 @@ var ViewerMenuPreview = function ViewerMenuPreview(_ref) {
1062
1074
  className: styles$9.content,
1063
1075
  ref: containerRef
1064
1076
  }, /*#__PURE__*/React__default["default"].createElement(Scroll__default["default"], {
1065
- className: styles$9.scroll
1077
+ className: styles$9.scroll,
1078
+ disabled: scrollDisabled
1066
1079
  }, /*#__PURE__*/React__default["default"].createElement("nav", {
1067
1080
  className: styles$9.nav,
1068
1081
  style: {
@@ -1553,6 +1566,7 @@ var ViewerMenu = function ViewerMenu(_ref) {
1553
1566
  springParams: springParams
1554
1567
  }),
1555
1568
  bindShareDrag = _useDragProgress.bind,
1569
+ draggingShare = _useDragProgress.dragging,
1556
1570
  shareOpenedProgress = _useDragProgress.progress;
1557
1571
 
1558
1572
  var computeMenuProgress = React.useCallback(function (_ref9) {
@@ -1600,6 +1614,7 @@ var ViewerMenu = function ViewerMenu(_ref) {
1600
1614
  springParams: springParams
1601
1615
  }),
1602
1616
  bindMenuDrag = _useDragProgress2.bind,
1617
+ draggingMenu = _useDragProgress2.dragging,
1603
1618
  menuOpenedProgress = _useDragProgress2.progress;
1604
1619
 
1605
1620
  var keyboardShortcuts = React.useMemo(function () {
@@ -1640,7 +1655,7 @@ var ViewerMenu = function ViewerMenu(_ref) {
1640
1655
  theme: menuTheme,
1641
1656
  iconPosition: "left"
1642
1657
  }),
1643
- toggled: shareOpenedProgress
1658
+ progressSpring: shareOpenedProgress
1644
1659
  })) : null, !withoutScreensMenu ? /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
1645
1660
  className: classNames__default["default"]([styles$6.menuItem, styles$6.menuItemScreens])
1646
1661
  }, bindMenuDrag()), /*#__PURE__*/React__default["default"].createElement(ToggleButton, {
@@ -1656,7 +1671,7 @@ var ViewerMenu = function ViewerMenu(_ref) {
1656
1671
  theme: menuTheme,
1657
1672
  iconPosition: "right"
1658
1673
  }),
1659
- toggled: menuOpenedProgress,
1674
+ progressSpring: menuOpenedProgress,
1660
1675
  toggledButtonClassName: styles$6.screensMenuButtonToggled
1661
1676
  })) : null), /*#__PURE__*/React__default["default"].createElement(ViewerMenuDots, Object.assign({}, menuTheme, {
1662
1677
  direction: "horizontal",
@@ -1676,9 +1691,9 @@ var ViewerMenu = function ViewerMenu(_ref) {
1676
1691
  }
1677
1692
  }))), /*#__PURE__*/React__default["default"].createElement(ViewerMenuContainer, {
1678
1693
  className: styles$6.menuContainer,
1679
- transitionProgress: shareOpenedProgress,
1694
+ progressSpring: shareOpenedProgress,
1680
1695
  theme: viewerTheme
1681
- }, shareOpenedProgress > 0 ? /*#__PURE__*/React__default["default"].createElement(ViewerMenuShare, {
1696
+ }, draggingShare || shareOpened ? /*#__PURE__*/React__default["default"].createElement(ViewerMenuShare, {
1682
1697
  viewerTheme: viewerTheme,
1683
1698
  className: styles$6.menuShare,
1684
1699
  title: title,
@@ -1693,9 +1708,9 @@ var ViewerMenu = function ViewerMenu(_ref) {
1693
1708
  onClose: onCloseShare
1694
1709
  }) : null), /*#__PURE__*/React__default["default"].createElement(ViewerMenuContainer, {
1695
1710
  className: styles$6.menuContainer,
1696
- transitionProgress: menuOpenedProgress,
1711
+ progressSpring: menuOpenedProgress,
1697
1712
  theme: viewerTheme
1698
- }, menuOpenedProgress > 0 ? /*#__PURE__*/React__default["default"].createElement(ViewerMenuPreview, {
1713
+ }, draggingMenu || menuOpened ? /*#__PURE__*/React__default["default"].createElement(ViewerMenuPreview, {
1699
1714
  viewerTheme: viewerTheme,
1700
1715
  className: styles$6.menuPreview,
1701
1716
  screenSize: screenSize,
@@ -1707,6 +1722,7 @@ var ViewerMenu = function ViewerMenu(_ref) {
1707
1722
  onShare: onShare,
1708
1723
  onClickScreen: onClickScreen,
1709
1724
  onClose: onCloseMenu,
1725
+ scrollDisabled: draggingMenu,
1710
1726
  toggleFullscreen: toggleFullscreen,
1711
1727
  fullscreenActive: fullscreenActive,
1712
1728
  fullscreenEnabled: fullscreenEnabled
@@ -1715,6 +1731,7 @@ var ViewerMenu = function ViewerMenu(_ref) {
1715
1731
 
1716
1732
  ViewerMenu.propTypes = propTypes$9;
1717
1733
  ViewerMenu.defaultProps = defaultProps$9;
1734
+ var ViewerMenu$1 = /*#__PURE__*/React__default["default"].memo(ViewerMenu);
1718
1735
 
1719
1736
  var styles$5 = {"container":"micromag-viewer-screen-container","navigationHint":"micromag-viewer-screen-navigationHint"};
1720
1737
 
@@ -2789,34 +2806,48 @@ var Viewer = function Viewer(_ref) {
2789
2806
  springParams: springParams
2790
2807
  }),
2791
2808
  isDragging = _useDragProgress.dragging,
2792
- screenIndexProgress = _useDragProgress.progress,
2809
+ progressSpring = _useDragProgress.progress,
2793
2810
  dragContentBind = _useDragProgress.bind;
2794
2811
 
2795
- var getScreenStylesByIndex = function getScreenStylesByIndex(index, progress) {
2812
+ var getScreenStylesByIndex = function getScreenStylesByIndex(index, spring) {
2796
2813
  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
2814
  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
2815
+ zIndex: index,
2816
+ opacity: spring.to(function (progress) {
2817
+ var t = index - progress;
2818
+ var invert = Math.min(1, Math.max(0, -t));
2819
+ if (Math.abs(t) > neighborScreensActive) return 0;
2820
+ return Math.max(0, 1 - 0.75 * invert + (t + 1));
2821
+ }),
2822
+ transform: spring.to(function (progress) {
2823
+ var t = index - progress;
2824
+ var clamped = Math.min(1, Math.max(0, t));
2825
+ var invert = Math.min(1, Math.max(0, -t));
2826
+ if (Math.abs(t) > neighborScreensActive) return 'translateX(100%)';
2827
+ return "translateX(".concat(clamped * 100, "%) scale(").concat(1 - 0.2 * invert, ")");
2828
+ }),
2829
+ boxShadow: spring.to(function (progress) {
2830
+ var t = index - progress;
2831
+ if (Math.abs(t) > neighborScreensActive) return null;
2832
+ var clamped = Math.min(1, Math.max(0, t));
2833
+ return "0 0 ".concat(4 * (1 - clamped), "rem ").concat(-0.5 * (1 - clamped), "rem black");
2834
+ })
2812
2835
  };
2813
2836
  }
2814
2837
 
2815
- var t = index - progress;
2816
- var clamped = Math.min(1, Math.max(0, Math.abs(t)));
2817
2838
  return {
2818
- opacity: 1 - 0.75 * clamped,
2819
- transform: "translateX(".concat(t * neighborScreenOffset, "%) scale(").concat(1 - (1 - neighborScreenScale) * clamped, ")"),
2839
+ opacity: spring.to(function (progress) {
2840
+ var t = index - progress;
2841
+ if (Math.abs(t) > neighborScreensActive) return 0;
2842
+ var clamped = Math.min(1, Math.max(0, Math.abs(t)));
2843
+ return 1 - 0.75 * clamped;
2844
+ }),
2845
+ transform: spring.to(function (progress) {
2846
+ var t = index - progress;
2847
+ if (Math.abs(t) > neighborScreensActive) return "translate(100%)";
2848
+ var clamped = Math.min(1, Math.max(0, Math.abs(t)));
2849
+ return "translateX(".concat(t * neighborScreenOffset, "%) scale(").concat(1 - (1 - neighborScreenScale) * clamped, ")");
2850
+ }),
2820
2851
  zIndex: screensCount - index
2821
2852
  };
2822
2853
  };
@@ -2902,7 +2933,7 @@ var Viewer = function Viewer(_ref) {
2902
2933
  }), (_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
2934
  ref: containerRef,
2904
2935
  onContextMenu: onContextMenu
2905
- }, !withoutMenu ? /*#__PURE__*/React__default["default"].createElement(ViewerMenu, {
2936
+ }, !withoutMenu ? /*#__PURE__*/React__default["default"].createElement(ViewerMenu$1, {
2906
2937
  story: parsedStory,
2907
2938
  currentScreenIndex: screenIndex,
2908
2939
  withShadow: menuOverScreen && !withoutMenuShadow,
@@ -2937,8 +2968,8 @@ var Viewer = function Viewer(_ref) {
2937
2968
  }, screens.map(function (screen, i) {
2938
2969
  var current = screenIndex === i;
2939
2970
  var active = i >= screenIndex - neighborScreensActive && i <= screenIndex + neighborScreensActive;
2940
- var screenStyles = getScreenStylesByIndex(i, screenIndexProgress);
2941
- return /*#__PURE__*/React__default["default"].createElement("div", {
2971
+ var screenStyles = getScreenStylesByIndex(i, progressSpring);
2972
+ return /*#__PURE__*/React__default["default"].createElement(web.animated.div, {
2942
2973
  key: "screen-viewer-".concat(screen.id || '', "-").concat(i + 1),
2943
2974
  style: screenStyles,
2944
2975
  className: classNames__default["default"]([styles$6.screenContainer, _defineProperty__default["default"]({}, styles$6.current, current)])