@micromag/viewer 0.3.176 → 0.3.181

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.
Files changed (4) hide show
  1. package/assets/css/styles.css +12 -11
  2. package/es/index.js +1269 -1098
  3. package/lib/index.js +1283 -1112
  4. package/package.json +10 -10
package/lib/index.js CHANGED
@@ -8,7 +8,7 @@ var PropTypes = require('prop-types');
8
8
  var React = require('react');
9
9
  var reactRouter = require('react-router');
10
10
  var reactRouterDom = require('react-router-dom');
11
- var core$1 = require('@micromag/core');
11
+ var core = require('@micromag/core');
12
12
  var contexts = require('@micromag/core/contexts');
13
13
  var fieldsManager = require('@micromag/fields/manager');
14
14
  var intl = require('@micromag/intl');
@@ -16,28 +16,20 @@ 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 react = require('@use-gesture/react');
20
19
  var classNames = require('classnames');
21
20
  var reactHelmet = require('react-helmet');
22
- var reactIntl = require('react-intl');
23
21
  var EventEmitter = require('wolfy87-eventemitter');
24
22
  var components = require('@micromag/core/components');
25
23
  var hooks = require('@micromag/core/hooks');
26
24
  var utils = require('@micromag/core/utils');
27
- var core = require('@react-spring/core');
28
- var web = require('@react-spring/web');
25
+ var reactIntl = require('react-intl');
29
26
  var faTimes = require('@fortawesome/free-solid-svg-icons/faTimes');
30
- var faShare = require('@fortawesome/free-solid-svg-icons/faShare');
31
27
  var reactFontawesome = require('@fortawesome/react-fontawesome');
32
- var ShareOptions = require('@micromag/element-share-options');
33
- var faCompress = require('@fortawesome/free-solid-svg-icons/faCompress');
34
- var faExpand = require('@fortawesome/free-solid-svg-icons/faExpand');
28
+ var core$1 = require('@react-spring/core');
29
+ var web = require('@react-spring/web');
35
30
  var Scroll = require('@micromag/element-scroll');
36
- var faArrowLeft = require('@fortawesome/free-solid-svg-icons/faArrowLeft');
37
- var faArrowRight = require('@fortawesome/free-solid-svg-icons/faArrowRight');
38
- var faPause = require('@fortawesome/free-solid-svg-icons/faPause');
39
- var faPlay = require('@fortawesome/free-solid-svg-icons/faPlay');
40
- var faVolumeUp = require('@fortawesome/free-solid-svg-icons/faVolumeUp');
31
+ var ShareOptions = require('@micromag/element-share-options');
32
+ var react = require('@use-gesture/react');
41
33
  var WebView = require('@micromag/element-webview');
42
34
 
43
35
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
@@ -52,8 +44,8 @@ var _slicedToArray__default = /*#__PURE__*/_interopDefaultLegacy(_slicedToArray)
52
44
  var _toConsumableArray__default = /*#__PURE__*/_interopDefaultLegacy(_toConsumableArray);
53
45
  var classNames__default = /*#__PURE__*/_interopDefaultLegacy(classNames);
54
46
  var EventEmitter__default = /*#__PURE__*/_interopDefaultLegacy(EventEmitter);
55
- var ShareOptions__default = /*#__PURE__*/_interopDefaultLegacy(ShareOptions);
56
47
  var Scroll__default = /*#__PURE__*/_interopDefaultLegacy(Scroll);
48
+ var ShareOptions__default = /*#__PURE__*/_interopDefaultLegacy(ShareOptions);
57
49
  var WebView__default = /*#__PURE__*/_interopDefaultLegacy(WebView);
58
50
 
59
51
  var routes = PropTypes__default["default"].shape({
@@ -217,7 +209,7 @@ function useScreenInteraction() {
217
209
  var relativeX = x - left;
218
210
  var direction = relativeX < width * (1 - nextScreenWidthPercent) ? 'previous' : 'next';
219
211
  var lastIndex = screensCount - 1;
220
- var nextIndex = index;
212
+ var nextIndex = index; // @todo investigate what clickOnSiblings is doing
221
213
 
222
214
  if (direction === 'previous' && !clickOnSiblings) {
223
215
  nextIndex = Math.max(0, screenIndex - 1);
@@ -233,7 +225,7 @@ function useScreenInteraction() {
233
225
  end: index === nextIndex && nextIndex === lastIndex
234
226
  });
235
227
  }
236
- }, [screens, screenIndex, screenIndex, screensInteractionEnabled, currentScreenInteractionEnabled, nextScreenWidthPercent, disableCurrentScreenNavigation, clickOnSiblings, onInteract, onNavigate]);
228
+ }, [screens, screenIndex, screensInteractionEnabled, currentScreenInteractionEnabled, nextScreenWidthPercent, disableCurrentScreenNavigation, clickOnSiblings, onInteract, onNavigate]);
237
229
  return {
238
230
  interact: interact,
239
231
  currentScreenInteractionEnabled: currentScreenInteractionEnabled,
@@ -242,9 +234,137 @@ function useScreenInteraction() {
242
234
  };
243
235
  }
244
236
 
245
- var styles$c = {"container":"micromag-viewer-menus-menu-dots-container","closeButton":"micromag-viewer-menus-menu-dots-closeButton","menuButton":"micromag-viewer-menus-menu-dots-menuButton","item":"micromag-viewer-menus-menu-dots-item","items":"micromag-viewer-menus-menu-dots-items","menu":"micromag-viewer-menus-menu-dots-menu","menuIcon":"micromag-viewer-menus-menu-dots-menuIcon","vertical":"micromag-viewer-menus-menu-dots-vertical","withShadow":"micromag-viewer-menus-menu-dots-withShadow"};
237
+ var _excluded$5 = ["className", "onClick", "theme"];
238
+ var propTypes$k = {
239
+ className: PropTypes__default["default"].string,
240
+ onClick: PropTypes__default["default"].func,
241
+ theme: core.PropTypes.viewerTheme
242
+ };
243
+ var defaultProps$k = {
244
+ className: null,
245
+ onClick: null,
246
+ theme: null
247
+ };
248
+
249
+ var MenuButton = function MenuButton(_ref) {
250
+ var className = _ref.className,
251
+ onClick = _ref.onClick,
252
+ theme = _ref.theme,
253
+ props = _objectWithoutProperties__default["default"](_ref, _excluded$5);
254
+
255
+ var intl = reactIntl.useIntl();
256
+ return /*#__PURE__*/React__default["default"].createElement(components.IconButton, Object.assign({
257
+ className: classNames__default["default"]([_defineProperty__default["default"]({}, className, className !== null)]),
258
+ label: intl.formatMessage({
259
+ id: "F/gl4b",
260
+ defaultMessage: [{
261
+ "type": 0,
262
+ "value": "Menu"
263
+ }]
264
+ }),
265
+ iconPosition: "right",
266
+ icon: /*#__PURE__*/React__default["default"].createElement("svg", Object.assign({
267
+ xmlns: "http://www.w3.org/2000/svg",
268
+ width: "10",
269
+ height: "16",
270
+ viewBox: "0 0 10 16",
271
+ fill: "currentColor"
272
+ }, theme), /*#__PURE__*/React__default["default"].createElement("rect", {
273
+ width: "10",
274
+ height: "16"
275
+ })),
276
+ onClick: onClick
277
+ }, props));
278
+ };
279
+
280
+ MenuButton.propTypes = propTypes$k;
281
+ MenuButton.defaultProps = defaultProps$k;
282
+
283
+ var _excluded$4 = ["className", "onClick", "theme"];
284
+ var propTypes$j = {
285
+ className: PropTypes__default["default"].string,
286
+ onClick: PropTypes__default["default"].func,
287
+ theme: core.PropTypes.viewerTheme
288
+ };
289
+ var defaultProps$j = {
290
+ className: null,
291
+ onClick: null,
292
+ theme: null
293
+ };
294
+
295
+ var ShareButton = function ShareButton(_ref) {
296
+ var className = _ref.className,
297
+ onClick = _ref.onClick,
298
+ theme = _ref.theme,
299
+ props = _objectWithoutProperties__default["default"](_ref, _excluded$4);
300
+
301
+ var intl = reactIntl.useIntl();
302
+ return /*#__PURE__*/React__default["default"].createElement(components.IconButton, Object.assign({
303
+ className: classNames__default["default"]([_defineProperty__default["default"]({}, className, className !== null)]),
304
+ label: intl.formatMessage({
305
+ id: "7tw6U2",
306
+ defaultMessage: [{
307
+ "type": 0,
308
+ "value": "Share"
309
+ }]
310
+ }),
311
+ iconPosition: "left",
312
+ icon: /*#__PURE__*/React__default["default"].createElement("svg", Object.assign({
313
+ xmlns: "http://www.w3.org/2000/svg",
314
+ width: "10",
315
+ height: "16",
316
+ viewBox: "0 0 10 16",
317
+ fill: "currentColor"
318
+ }, theme), /*#__PURE__*/React__default["default"].createElement("polygon", {
319
+ points: "8.5 14.5 1.5 14.5 1.5 8 0 8 0 16 10 16 10 8 8.5 8 8.5 14.5"
320
+ }), /*#__PURE__*/React__default["default"].createElement("polygon", {
321
+ points: "9.62 4.62 5 0 0.38 4.62 1.44 5.68 4.25 2.87 4.25 11.26 5.75 11.26 5.75 2.87 8.56 5.68 9.62 4.62"
322
+ })),
323
+ onClick: onClick
324
+ }, props));
325
+ };
326
+
327
+ ShareButton.propTypes = propTypes$j;
328
+ ShareButton.defaultProps = defaultProps$j;
329
+
330
+ var styles$d = {"container":"micromag-viewer-menus-menu-container-container","heightContainer":"micromag-viewer-menus-menu-container-heightContainer","inner":"micromag-viewer-menus-menu-container-inner"};
331
+
332
+ var propTypes$i = {
333
+ className: PropTypes__default["default"].string,
334
+ transitionProgress: PropTypes__default["default"].number,
335
+ children: PropTypes__default["default"].node
336
+ };
337
+ var defaultProps$i = {
338
+ className: null,
339
+ transitionProgress: 0,
340
+ children: null
341
+ };
342
+
343
+ var ViewerMenuContainer = function ViewerMenuContainer(_ref) {
344
+ var className = _ref.className,
345
+ transitionProgress = _ref.transitionProgress,
346
+ children = _ref.children;
347
+ return /*#__PURE__*/React__default["default"].createElement("div", {
348
+ className: classNames__default["default"]([styles$d.container, _defineProperty__default["default"]({}, className, className !== null)]),
349
+ style: {
350
+ pointerEvents: 'none'
351
+ }
352
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
353
+ className: styles$d.heightContainer,
354
+ style: {
355
+ height: "".concat(transitionProgress * 100, "%"),
356
+ pointerEvents: transitionProgress < 0.25 ? 'none' : 'auto',
357
+ zIndex: Math.round(2 - transitionProgress)
358
+ }
359
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
360
+ className: styles$d.inner
361
+ }, children)));
362
+ };
363
+
364
+ ViewerMenuContainer.propTypes = propTypes$i;
365
+ ViewerMenuContainer.defaultProps = defaultProps$i;
246
366
 
247
- var styles$b = {"container":"micromag-viewer-menus-menu-dot-container","button":"micromag-viewer-menus-menu-dot-button","dot":"micromag-viewer-menus-menu-dot-dot","subDot":"micromag-viewer-menus-menu-dot-subDot","dots":"micromag-viewer-menus-menu-dot-dots","vertical":"micromag-viewer-menus-menu-dot-vertical"};
367
+ var styles$c = {"button":"micromag-viewer-menus-menu-dot-button","progress":"micromag-viewer-menus-menu-dot-progress","dot":"micromag-viewer-menus-menu-dot-dot","container":"micromag-viewer-menus-menu-dot-container","vertical":"micromag-viewer-menus-menu-dot-vertical","subDot":"micromag-viewer-menus-menu-dot-subDot","dots":"micromag-viewer-menus-menu-dot-dots","outlineBounce":"micromag-viewer-menus-menu-dot-outlineBounce"};
248
368
 
249
369
  var propTypes$h = {
250
370
  current: PropTypes__default["default"].bool,
@@ -281,290 +401,67 @@ var ViewerMenuDot = function ViewerMenuDot(_ref) {
281
401
  vertical = _ref.vertical,
282
402
  onClick = _ref.onClick,
283
403
  className = _ref.className;
284
- var currentTime = 0;
285
- var duration = 1;
286
- var playing = true;
287
404
 
288
405
  var _ref2 = colors || {},
289
406
  _ref2$primary = _ref2.primary,
290
407
  primary = _ref2$primary === void 0 ? 'rgba(255, 255, 255, 1)' : _ref2$primary,
291
408
  _ref2$secondary = _ref2.secondary,
292
- secondary = _ref2$secondary === void 0 ? 'rgba(200, 200, 200, 0.5)' : _ref2$secondary; // TODO: if approved animate progress
409
+ secondary = _ref2$secondary === void 0 ? 'rgba(255, 255, 255, 0.25)' : _ref2$secondary;
293
410
 
294
-
295
- var _useSpring = core.useSpring(function () {
411
+ var _useSpring = core$1.useSpring(function () {
296
412
  return {
297
- x: 0,
413
+ scaleX: 0,
298
414
  config: {
299
- duration: 0
415
+ tension: 200,
416
+ friction: 30
300
417
  }
301
418
  };
302
419
  }),
303
- _useSpring2 = _slicedToArray__default["default"](_useSpring, 2);
304
- _useSpring2[0];
305
- var setSpringProps = _useSpring2[1];
420
+ _useSpring2 = _slicedToArray__default["default"](_useSpring, 2),
421
+ dotSpringStyles = _useSpring2[0],
422
+ setDotSpringProps = _useSpring2[1];
306
423
 
307
424
  React.useEffect(function () {
308
-
309
- var progress = currentTime / duration;
310
- setSpringProps.start({
311
- reset: true,
312
- immediate: !playing,
313
- from: {
314
- x: progress
315
- },
316
- to: {
317
- x: 1
318
- },
319
- config: {
320
- duration: (duration - currentTime) * 1000
321
- }
322
- });
323
- }, [playing, duration, currentTime, setSpringProps]);
324
- var inner = current && count > 1 ? /*#__PURE__*/React__default["default"].createElement("span", {
325
- className: styles$b.dots
326
- }, _toConsumableArray__default["default"](Array(count).keys()).map(function (i) {
327
- return /*#__PURE__*/React__default["default"].createElement("span", {
328
- className: classNames__default["default"]([styles$b.dot, styles$b.subDot]),
329
- style: {
330
- width: "".concat(parseFloat(1 / count * 100).toFixed(2), "%"),
331
- backgroundColor: active && i <= subIndex ? primary : secondary
332
- }
425
+ var activeRatio = active ? 1 : 0;
426
+ var ratio = count > 1 && current ? (subIndex + 1) / count : activeRatio;
427
+ var scaleX = ratio;
428
+ setDotSpringProps.start({
429
+ scaleX: scaleX,
430
+ immediate: !current
333
431
  });
334
- })) : /*#__PURE__*/React__default["default"].createElement("span", {
335
- className: styles$b.dot,
336
- style: {
337
- backgroundColor: active ? primary : secondary
338
- }
339
- });
432
+ }, [active, current, subIndex, count, setDotSpringProps]);
340
433
  return /*#__PURE__*/React__default["default"].createElement("li", {
341
- className: classNames__default["default"]([styles$b.container, (_ref3 = {}, _defineProperty__default["default"](_ref3, styles$b.active, current), _defineProperty__default["default"](_ref3, styles$b.vertical, vertical), _defineProperty__default["default"](_ref3, className, className !== null), _ref3)]),
434
+ className: classNames__default["default"]([styles$c.container, (_ref3 = {}, _defineProperty__default["default"](_ref3, styles$c.active, current), _defineProperty__default["default"](_ref3, styles$c.vertical, vertical), _defineProperty__default["default"](_ref3, className, className !== null), _ref3)]),
342
435
  "aria-hidden": "true"
343
436
  }, /*#__PURE__*/React__default["default"].createElement("button", {
344
437
  type: "button",
345
- className: styles$b.button,
438
+ className: styles$c.button,
346
439
  onClick: onClick,
347
440
  tabIndex: "-1"
348
- }, inner));
441
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
442
+ className: styles$c.dot,
443
+ style: {
444
+ backgroundColor: secondary
445
+ }
446
+ }, /*#__PURE__*/React__default["default"].createElement(web.animated.div, {
447
+ className: styles$c.progress,
448
+ style: _objectSpread__default["default"](_objectSpread__default["default"]({}, dotSpringStyles), {}, {
449
+ backgroundColor: primary
450
+ })
451
+ }))));
349
452
  };
350
453
 
351
454
  ViewerMenuDot.propTypes = propTypes$h;
352
455
  ViewerMenuDot.defaultProps = defaultProps$h;
353
456
 
354
- var styles$a = {};
457
+ var styles$b = {"container":"micromag-viewer-menus-menu-dots-container","closeButton":"micromag-viewer-menus-menu-dots-closeButton","item":"micromag-viewer-menus-menu-dots-item","items":"micromag-viewer-menus-menu-dots-items","vertical":"micromag-viewer-menus-menu-dots-vertical"};
355
458
 
459
+ var _excluded$3 = ["direction", "items", "onClickDot", "onClickScreensMenu", "colors", "closeable", "withItemClick", "withoutScreensMenu", "onClose", "className"];
356
460
  var propTypes$g = {
357
- size: PropTypes__default["default"].number,
358
- spacing: PropTypes__default["default"].number,
359
- color: PropTypes__default["default"].string,
360
- className: PropTypes__default["default"].string
361
- };
362
- var defaultProps$g = {
363
- size: 100,
364
- spacing: 8,
365
- color: 'white',
366
- className: null
367
- };
368
-
369
- var MenuIcon = function MenuIcon(_ref) {
370
- var size = _ref.size,
371
- spacing = _ref.spacing,
372
- color = _ref.color,
373
- className = _ref.className;
374
- var squareSize = (size - 2 * spacing) / 3;
375
- return /*#__PURE__*/React__default["default"].createElement("svg", {
376
- className: classNames__default["default"]([styles$a.container, _defineProperty__default["default"]({}, className, className !== null)]),
377
- xmlns: "http://www.w3.org/2000/svg",
378
- viewBox: "0 0 ".concat(size, " ").concat(size),
379
- "aria-hidden": "true"
380
- }, _toConsumableArray__default["default"](new Array(9)).map(function (square, squareI) {
381
- var x = squareI % 3 * (squareSize + spacing);
382
- var y = Math.floor(squareI / 3) * (squareSize + spacing);
383
- return /*#__PURE__*/React__default["default"].createElement("rect", {
384
- key: "square-".concat(squareI),
385
- fill: color,
386
- x: x,
387
- y: y,
388
- width: squareSize,
389
- height: squareSize
390
- });
391
- }));
392
- };
393
-
394
- MenuIcon.propTypes = propTypes$g;
395
- MenuIcon.defaultProps = defaultProps$g;
396
-
397
- var styles$9 = {"close":"micromag-viewer-partials-share-modal-close","container":"micromag-viewer-partials-share-modal-container","opened":"micromag-viewer-partials-share-modal-opened","modal":"micromag-viewer-partials-share-modal-modal","header":"micromag-viewer-partials-share-modal-header","heading":"micromag-viewer-partials-share-modal-heading","closeIcon":"micromag-viewer-partials-share-modal-closeIcon","shareOptions":"micromag-viewer-partials-share-modal-shareOptions"};
398
-
399
- var propTypes$f = {
400
- url: PropTypes__default["default"].string,
401
- title: PropTypes__default["default"].string,
402
- opened: PropTypes__default["default"].bool,
403
- className: PropTypes__default["default"].string,
404
- onShare: PropTypes__default["default"].func,
405
- onCancel: PropTypes__default["default"].func
406
- };
407
- var defaultProps$f = {
408
- url: null,
409
- title: null,
410
- opened: false,
411
- className: null,
412
- onShare: null,
413
- onCancel: null
414
- };
415
-
416
- var ShareModal = function ShareModal(_ref) {
417
- var _ref3;
418
-
419
- var url = _ref.url,
420
- title = _ref.title,
421
- opened = _ref.opened,
422
- className = _ref.className,
423
- onShare = _ref.onShare,
424
- onCancel = _ref.onCancel;
425
- var modalRef = React.useRef();
426
- var onDocumentClick = React.useCallback(function (e) {
427
- var _ref2 = e || {},
428
- target = _ref2.target;
429
-
430
- if (!modalRef.current || modalRef.current.contains(target)) {
431
- return;
432
- }
433
-
434
- onCancel();
435
- }, [opened, onCancel]);
436
- hooks.useDocumentEvent('click', onDocumentClick, opened);
437
- return /*#__PURE__*/React__default["default"].createElement("div", {
438
- className: classNames__default["default"]([styles$9.container, (_ref3 = {}, _defineProperty__default["default"](_ref3, className, className), _defineProperty__default["default"](_ref3, styles$9.opened, opened), _ref3)]),
439
- "aria-hidden": opened ? null : '-1'
440
- }, /*#__PURE__*/React__default["default"].createElement("div", {
441
- className: styles$9.modal,
442
- ref: modalRef
443
- }, /*#__PURE__*/React__default["default"].createElement("div", {
444
- className: styles$9.header
445
- }, /*#__PURE__*/React__default["default"].createElement("h2", {
446
- className: styles$9.heading
447
- }, /*#__PURE__*/React__default["default"].createElement(reactIntl.FormattedMessage, {
448
- id: "oL4ueH",
449
- defaultMessage: [{
450
- "type": 0,
451
- "value": "Share"
452
- }]
453
- })), /*#__PURE__*/React__default["default"].createElement(components.Button, {
454
- className: styles$9.close,
455
- onClick: onCancel,
456
- focusable: opened
457
- }, /*#__PURE__*/React__default["default"].createElement(components.Close, {
458
- className: styles$9.closeIcon,
459
- border: "none"
460
- }))), /*#__PURE__*/React__default["default"].createElement("div", {
461
- className: styles$9.content
462
- }, /*#__PURE__*/React__default["default"].createElement(ShareOptions__default["default"], {
463
- className: styles$9.shareOptions,
464
- title: title,
465
- url: url,
466
- focusable: opened,
467
- onShare: onShare,
468
- onClose: onCancel
469
- }))));
470
- };
471
-
472
- ShareModal.propTypes = propTypes$f;
473
- ShareModal.defaultProps = defaultProps$f;
474
-
475
- var styles$8 = {"container":"micromag-viewer-partials-share-button-container"};
476
-
477
- var propTypes$e = {
478
- title: PropTypes__default["default"].string,
479
- url: PropTypes__default["default"].string,
480
- className: PropTypes__default["default"].string,
481
- buttonClassName: PropTypes__default["default"].string,
482
- onShare: PropTypes__default["default"].func,
483
- children: PropTypes__default["default"].node,
484
- focusable: PropTypes__default["default"].bool
485
- };
486
- var defaultProps$e = {
487
- title: null,
488
- url: null,
489
- className: null,
490
- buttonClassName: null,
491
- onShare: null,
492
- children: null,
493
- focusable: false
494
- };
495
-
496
- var ShareButton = function ShareButton(_ref) {
497
- var title = _ref.title,
498
- url = _ref.url,
499
- className = _ref.className,
500
- buttonClassName = _ref.buttonClassName,
501
- onShare = _ref.onShare,
502
- children = _ref.children,
503
- focusable = _ref.focusable;
504
- var intl = reactIntl.useIntl();
505
-
506
- var _useState = React.useState(false),
507
- _useState2 = _slicedToArray__default["default"](_useState, 2),
508
- storyShareModalOpened = _useState2[0],
509
- setStoryShareModalOpened = _useState2[1];
510
-
511
- var onShareIconClick = React.useCallback(function () {
512
- setStoryShareModalOpened(function (opened) {
513
- return !opened;
514
- });
515
- }, [setStoryShareModalOpened, storyShareModalOpened]);
516
- var onStoryShared = React.useCallback(function (type) {
517
- setStoryShareModalOpened(false);
518
-
519
- if (onShare !== null) {
520
- onShare(type);
521
- }
522
- }, [setStoryShareModalOpened, onShare]);
523
- var onStoryShareCanceled = React.useCallback(function () {
524
- setStoryShareModalOpened(false);
525
- }, [setStoryShareModalOpened]);
526
- return /*#__PURE__*/React__default["default"].createElement("div", {
527
- className: classNames__default["default"]([styles$8.container, _defineProperty__default["default"]({}, className, className !== null)])
528
- }, /*#__PURE__*/React__default["default"].createElement(components.Button, {
529
- className: classNames__default["default"]([_defineProperty__default["default"]({}, buttonClassName, buttonClassName !== null)]),
530
- onClick: onShareIconClick,
531
- title: intl.formatMessage({
532
- id: "7tw6U2",
533
- defaultMessage: [{
534
- "type": 0,
535
- "value": "Share"
536
- }]
537
- }),
538
- "aria-label": intl.formatMessage({
539
- id: "7tw6U2",
540
- defaultMessage: [{
541
- "type": 0,
542
- "value": "Share"
543
- }]
544
- }),
545
- focusable: focusable
546
- }, children), /*#__PURE__*/React__default["default"].createElement(ShareModal, {
547
- className: styles$8.shareModal,
548
- opened: storyShareModalOpened,
549
- title: title,
550
- url: url,
551
- onShare: onStoryShared,
552
- onCancel: onStoryShareCanceled
553
- }));
554
- };
555
-
556
- ShareButton.propTypes = propTypes$e;
557
- ShareButton.defaultProps = defaultProps$e;
558
-
559
- var propTypes$d = {
560
461
  direction: PropTypes__default["default"].oneOf(['horizontal', 'vertical']),
561
- withShadow: PropTypes__default["default"].bool,
562
- title: PropTypes__default["default"].string,
563
- items: core$1.PropTypes.menuItems,
564
- shareUrl: PropTypes__default["default"].string,
565
- onShare: PropTypes__default["default"].func,
566
- onClickItem: PropTypes__default["default"].func,
567
- onClickMenu: PropTypes__default["default"].func,
462
+ items: core.PropTypes.menuItems,
463
+ onClickDot: PropTypes__default["default"].func,
464
+ onClickScreensMenu: PropTypes__default["default"].func,
568
465
  colors: PropTypes__default["default"].shape({
569
466
  primary: PropTypes__default["default"].string,
570
467
  secondary: PropTypes__default["default"].string
@@ -575,15 +472,11 @@ var propTypes$d = {
575
472
  onClose: PropTypes__default["default"].func,
576
473
  className: PropTypes__default["default"].string
577
474
  };
578
- var defaultProps$d = {
475
+ var defaultProps$g = {
579
476
  direction: 'horizontal',
580
- withShadow: false,
581
- title: null,
582
477
  items: [],
583
- shareUrl: null,
584
- onShare: null,
585
- onClickItem: null,
586
- onClickMenu: null,
478
+ onClickDot: null,
479
+ onClickScreensMenu: null,
587
480
  colors: null,
588
481
  closeable: false,
589
482
  withItemClick: false,
@@ -593,22 +486,19 @@ var defaultProps$d = {
593
486
  };
594
487
 
595
488
  var ViewerMenuDots = function ViewerMenuDots(_ref) {
596
- var _ref4;
489
+ var _ref5;
597
490
 
598
491
  var direction = _ref.direction,
599
- withShadow = _ref.withShadow,
600
- title = _ref.title,
601
492
  items = _ref.items,
602
- shareUrl = _ref.shareUrl,
603
- onShare = _ref.onShare,
604
- onClickItem = _ref.onClickItem,
605
- onClickMenu = _ref.onClickMenu,
493
+ onClickDot = _ref.onClickDot,
494
+ onClickScreensMenu = _ref.onClickScreensMenu,
606
495
  colors = _ref.colors,
607
496
  closeable = _ref.closeable,
608
497
  withItemClick = _ref.withItemClick,
609
498
  withoutScreensMenu = _ref.withoutScreensMenu,
610
499
  onClose = _ref.onClose,
611
- className = _ref.className;
500
+ className = _ref.className,
501
+ props = _objectWithoutProperties__default["default"](_ref, _excluded$3);
612
502
 
613
503
  var _ref2 = colors || {},
614
504
  _ref2$primary = _ref2.primary,
@@ -620,8 +510,12 @@ var ViewerMenuDots = function ViewerMenuDots(_ref) {
620
510
  current = _ref3$current === void 0 ? false : _ref3$current;
621
511
  return current;
622
512
  });
513
+
514
+ var _ref4 = props || {},
515
+ style = _ref4.style;
516
+
623
517
  return /*#__PURE__*/React__default["default"].createElement("nav", {
624
- className: classNames__default["default"]([styles$c.container, (_ref4 = {}, _defineProperty__default["default"](_ref4, className, className !== null), _defineProperty__default["default"](_ref4, styles$c.vertical, direction === 'vertical'), _defineProperty__default["default"](_ref4, styles$c.withShadow, withShadow), _ref4)]),
518
+ className: classNames__default["default"]([styles$b.container, (_ref5 = {}, _defineProperty__default["default"](_ref5, className, className !== null), _defineProperty__default["default"](_ref5, styles$b.vertical, direction === 'vertical'), _ref5)]),
625
519
  "aria-label": intl.formatMessage({
626
520
  id: "bLYuuN",
627
521
  defaultMessage: [{
@@ -643,17 +537,18 @@ var ViewerMenuDots = function ViewerMenuDots(_ref) {
643
537
  }, {
644
538
  current: currentIndex + 1,
645
539
  total: items.length
646
- })
540
+ }),
541
+ style: style
647
542
  }, /*#__PURE__*/React__default["default"].createElement("ul", {
648
- className: styles$c.items
543
+ className: styles$b.items
649
544
  }, items.map(function (item, index) {
650
- var _ref5 = item || {},
651
- _ref5$current = _ref5.current,
652
- current = _ref5$current === void 0 ? false : _ref5$current,
653
- _ref5$count = _ref5.count,
654
- count = _ref5$count === void 0 ? 1 : _ref5$count,
655
- _ref5$subIndex = _ref5.subIndex,
656
- subIndex = _ref5$subIndex === void 0 ? 0 : _ref5$subIndex;
545
+ var _ref6 = item || {},
546
+ _ref6$current = _ref6.current,
547
+ current = _ref6$current === void 0 ? false : _ref6$current,
548
+ _ref6$count = _ref6.count,
549
+ count = _ref6$count === void 0 ? 1 : _ref6$count,
550
+ _ref6$subIndex = _ref6.subIndex,
551
+ subIndex = _ref6$subIndex === void 0 ? 0 : _ref6$subIndex;
657
552
 
658
553
  return /*#__PURE__*/React__default["default"].createElement(ViewerMenuDot, {
659
554
  key: "item-".concat(index + 1),
@@ -663,56 +558,22 @@ var ViewerMenuDots = function ViewerMenuDots(_ref) {
663
558
  count: count,
664
559
  subIndex: subIndex,
665
560
  onClick: function onClick() {
666
- if ((withItemClick || withoutScreensMenu) && onClickItem !== null) {
667
- onClickItem(item);
668
- } else if (!withItemClick && onClickMenu !== null) {
669
- onClickMenu();
561
+ if ((withItemClick || withoutScreensMenu) && onClickDot !== null) {
562
+ onClickDot(item);
563
+ } else if (!withItemClick && onClickScreensMenu !== null) {
564
+ onClickScreensMenu();
670
565
  }
671
566
  },
672
567
  vertical: direction === 'vertical'
673
568
  });
674
- }), /*#__PURE__*/React__default["default"].createElement("li", {
675
- className: styles$c.menu
676
- }, /*#__PURE__*/React__default["default"].createElement(ShareButton, {
677
- className: styles$c.shareButton,
678
- buttonClassName: styles$c.menuButton,
679
- onShare: onShare,
680
- url: shareUrl,
681
- title: title
682
- }, /*#__PURE__*/React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, {
683
- className: styles$c.icon,
684
- icon: faShare.faShare
685
- }))), !withoutScreensMenu ? /*#__PURE__*/React__default["default"].createElement("li", {
686
- className: styles$c.menu
687
- }, /*#__PURE__*/React__default["default"].createElement(MenuIcon, {
688
- className: styles$c.menuIcon,
689
- color: primary
690
- }), /*#__PURE__*/React__default["default"].createElement("button", {
691
- type: "button",
692
- title: intl.formatMessage({
693
- id: "F/gl4b",
694
- defaultMessage: [{
695
- "type": 0,
696
- "value": "Menu"
697
- }]
698
- }),
699
- "aria-label": intl.formatMessage({
700
- id: "F/gl4b",
701
- defaultMessage: [{
702
- "type": 0,
703
- "value": "Menu"
704
- }]
705
- }),
706
- className: styles$c.menuButton,
707
- onClick: onClickMenu
708
- })) : null, closeable ? /*#__PURE__*/React__default["default"].createElement("li", {
709
- className: styles$c.closeButton,
569
+ }), closeable ? /*#__PURE__*/React__default["default"].createElement("li", {
570
+ className: styles$b.closeButton,
710
571
  style: {
711
572
  color: primary
712
573
  }
713
574
  }, /*#__PURE__*/React__default["default"].createElement("button", {
714
575
  type: "button",
715
- className: styles$c.closeButton,
576
+ className: styles$b.closeButton,
716
577
  onClick: onClose,
717
578
  title: intl.formatMessage({
718
579
  id: "dj/p/q",
@@ -733,64 +594,159 @@ var ViewerMenuDots = function ViewerMenuDots(_ref) {
733
594
  }))) : null));
734
595
  };
735
596
 
736
- ViewerMenuDots.propTypes = propTypes$d;
737
- ViewerMenuDots.defaultProps = defaultProps$d;
597
+ ViewerMenuDots.propTypes = propTypes$g;
598
+ ViewerMenuDots.defaultProps = defaultProps$g;
738
599
 
739
- var propTypes$c = {
600
+ var propTypes$f = {
740
601
  className: PropTypes__default["default"].string
741
602
  };
742
- var defaultProps$c = {
603
+ var defaultProps$f = {
743
604
  className: null
744
605
  };
745
606
 
746
607
  var StackIcon = function StackIcon(_ref) {
747
608
  var className = _ref.className;
748
609
  return /*#__PURE__*/React__default["default"].createElement("svg", {
749
- xmlns: "http://www.w3.org/2000/svg",
750
- width: "32",
751
- height: "32",
752
- viewBox: "0 0 32 32",
610
+ xmlns: "http://www.w3.org/2000/svg" // width="32"
611
+ // height="32"
612
+ // viewBox="0 0 32 32"
613
+ ,
614
+ width: "11.5",
615
+ height: "17.5",
616
+ viewBox: "0 0 11.5 17.5",
753
617
  className: classNames__default["default"]([_defineProperty__default["default"]({}, className, className !== null)])
754
- }, /*#__PURE__*/React__default["default"].createElement("path", {
755
- d: "M22.33.15H5A2.9,2.9,0,0,0,2.12,3V23.25H5V3H22.33Zm4.33,5.78H10.78A2.9,2.9,0,0,0,7.89,8.81V29a2.9,2.9,0,0,0,2.89,2.89H26.66A2.89,2.89,0,0,0,29.55,29V8.81A2.88,2.88,0,0,0,26.66,5.93Zm0,23.09Z"
618
+ }, /*#__PURE__*/React__default["default"].createElement("rect", {
619
+ width: "10",
620
+ height: "16"
621
+ }), /*#__PURE__*/React__default["default"].createElement("polygon", {
622
+ points: "10.5 1.5 10.5 16.5 1.5 16.5 1.5 17.5 11.5 17.5 11.5 1.5 10.5 1.5"
756
623
  }));
757
624
  };
758
625
 
759
- StackIcon.propTypes = propTypes$c;
760
- StackIcon.defaultProps = defaultProps$c;
626
+ StackIcon.propTypes = propTypes$f;
627
+ StackIcon.defaultProps = defaultProps$f;
761
628
 
762
- var styles$7 = {"container":"micromag-viewer-menus-menu-preview-container","screenButton":"micromag-viewer-menus-menu-preview-screenButton","activeScreenBorder":"micromag-viewer-menus-menu-preview-activeScreenBorder","scroll":"micromag-viewer-menus-menu-preview-scroll","header":"micromag-viewer-menus-menu-preview-header","button":"micromag-viewer-menus-menu-preview-button","shareButton":"micromag-viewer-menus-menu-preview-shareButton","disabled":"micromag-viewer-menus-menu-preview-disabled","icon":"micromag-viewer-menus-menu-preview-icon","buttons":"micromag-viewer-menus-menu-preview-buttons","organisation":"micromag-viewer-menus-menu-preview-organisation","title":"micromag-viewer-menus-menu-preview-title","content":"micromag-viewer-menus-menu-preview-content","nav":"micromag-viewer-menus-menu-preview-nav","item":"micromag-viewer-menus-menu-preview-item","items":"micromag-viewer-menus-menu-preview-items","active":"micromag-viewer-menus-menu-preview-active","itemContent":"micromag-viewer-menus-menu-preview-itemContent","screenContainer":"micromag-viewer-menus-menu-preview-screenContainer","subScreenBadge":"micromag-viewer-menus-menu-preview-subScreenBadge","subScreenCount":"micromag-viewer-menus-menu-preview-subScreenCount","subScreenIcon":"micromag-viewer-menus-menu-preview-subScreenIcon","screenContent":"micromag-viewer-menus-menu-preview-screenContent"};
629
+ var styles$a = {"button":"micromag-viewer-menus-menu-screen-button","container":"micromag-viewer-menus-menu-screen-container","isCurrent":"micromag-viewer-menus-menu-screen-isCurrent","pulse":"micromag-viewer-menus-menu-screen-pulse","inner":"micromag-viewer-menus-menu-screen-inner","subScreenBadge":"micromag-viewer-menus-menu-screen-subScreenBadge","subScreenCount":"micromag-viewer-menus-menu-screen-subScreenCount","subScreenIcon":"micromag-viewer-menus-menu-screen-subScreenIcon"};
763
630
 
764
- var propTypes$b = {
765
- viewerTheme: core$1.PropTypes.viewerTheme,
766
- screenSize: core$1.PropTypes.screenSize,
767
- menuWidth: PropTypes__default["default"].number,
768
- title: PropTypes__default["default"].string,
769
- items: core$1.PropTypes.menuItems,
770
- focusable: PropTypes__default["default"].bool,
771
- shouldLoad: PropTypes__default["default"].bool,
772
- onClickItem: PropTypes__default["default"].func,
773
- onClose: PropTypes__default["default"].func,
774
- maxThumbsWidth: PropTypes__default["default"].number,
775
- toggleFullscreen: PropTypes__default["default"].func,
776
- fullscreenActive: PropTypes__default["default"].bool,
777
- fullscreenEnabled: PropTypes__default["default"].bool,
778
- className: PropTypes__default["default"].string
631
+ var propTypes$e = {
632
+ className: PropTypes__default["default"].string,
633
+ item: core.PropTypes.menuItem,
634
+ index: PropTypes__default["default"].number,
635
+ onClick: PropTypes__default["default"].func,
636
+ screenSize: core.PropTypes.screenSize,
637
+ focusable: PropTypes__default["default"].bool
779
638
  };
780
- var defaultProps$b = {
781
- viewerTheme: null,
639
+ var defaultProps$e = {
640
+ className: null,
641
+ item: core.PropTypes.menuItem,
642
+ index: 0,
643
+ onClick: null,
782
644
  screenSize: null,
783
- menuWidth: null,
784
- title: null,
645
+ focusable: true
646
+ };
647
+
648
+ var ViewerMenuScreen = function ViewerMenuScreen(_ref) {
649
+ var _ref4;
650
+
651
+ var className = _ref.className,
652
+ item = _ref.item,
653
+ index = _ref.index,
654
+ _onClick = _ref.onClick,
655
+ screenSize = _ref.screenSize,
656
+ focusable = _ref.focusable;
657
+ var intl = reactIntl.useIntl();
658
+
659
+ var _ref2 = item || {},
660
+ _ref2$current = _ref2.current,
661
+ current = _ref2$current === void 0 ? false : _ref2$current,
662
+ screen = _ref2.screen,
663
+ _ref2$count = _ref2.count,
664
+ count = _ref2$count === void 0 ? 1 : _ref2$count;
665
+
666
+ var _ref3 = screenSize || {},
667
+ screenWidth = _ref3.width,
668
+ screenHeight = _ref3.height;
669
+
670
+ var screenAriaLabel = "".concat(intl.formatMessage({
671
+ id: "LkVfwW",
672
+ defaultMessage: [{
673
+ "type": 0,
674
+ "value": "Screen "
675
+ }, {
676
+ "type": 1,
677
+ "value": "index"
678
+ }]
679
+ }, {
680
+ index: index + 1
681
+ })).concat(current ? " ".concat(intl.formatMessage({
682
+ id: "vmrJ8U",
683
+ defaultMessage: [{
684
+ "type": 0,
685
+ "value": "(current screen)"
686
+ }]
687
+ })) : '');
688
+ return /*#__PURE__*/React__default["default"].createElement("div", {
689
+ className: classNames__default["default"]([styles$a.container, (_ref4 = {}, _defineProperty__default["default"](_ref4, className, className !== null), _defineProperty__default["default"](_ref4, styles$a.isCurrent, current), _ref4)])
690
+ }, /*#__PURE__*/React__default["default"].createElement("button", {
691
+ type: "button",
692
+ className: styles$a.button,
693
+ onClick: function onClick() {
694
+ if (_onClick !== null) {
695
+ _onClick(item);
696
+ }
697
+ },
698
+ "aria-label": screenAriaLabel,
699
+ tabIndex: focusable ? '0' : '-1'
700
+ }), /*#__PURE__*/React__default["default"].createElement("div", {
701
+ className: styles$a.inner
702
+ }, count > 1 ? /*#__PURE__*/React__default["default"].createElement("div", {
703
+ className: styles$a.subScreenBadge
704
+ }, /*#__PURE__*/React__default["default"].createElement("span", {
705
+ className: styles$a.subScreenCount
706
+ }, count), /*#__PURE__*/React__default["default"].createElement(StackIcon, {
707
+ className: styles$a.subScreenIcon
708
+ })) : null, screenWidth > 0 && screenHeight > 0 ? /*#__PURE__*/React__default["default"].createElement(components.ScreenPreview, {
709
+ className: styles$a.screen,
710
+ screenWidth: screenWidth,
711
+ screenHeight: screenHeight,
712
+ screen: screen,
713
+ focusable: focusable,
714
+ active: focusable,
715
+ withSize: true
716
+ }) : null));
717
+ };
718
+
719
+ ViewerMenuScreen.propTypes = propTypes$e;
720
+ ViewerMenuScreen.defaultProps = defaultProps$e;
721
+
722
+ 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","organisation":"micromag-viewer-menus-menu-preview-organisation","icon":"micromag-viewer-menus-menu-preview-icon","title":"micromag-viewer-menus-menu-preview-title","content":"micromag-viewer-menus-menu-preview-content","nav":"micromag-viewer-menus-menu-preview-nav","item":"micromag-viewer-menus-menu-preview-item","items":"micromag-viewer-menus-menu-preview-items"};
723
+
724
+ var propTypes$d = {
725
+ viewerTheme: core.PropTypes.viewerTheme,
726
+ screenSize: core.PropTypes.screenSize,
727
+ menuWidth: PropTypes__default["default"].number,
728
+ items: core.PropTypes.menuItems,
729
+ focusable: PropTypes__default["default"].bool,
730
+ onClickScreen: PropTypes__default["default"].func,
731
+ maxThumbsWidth: PropTypes__default["default"].number,
732
+ // shouldLoad: PropTypes.bool, // @todo still needed? to re-implement?
733
+ // toggleFullscreen: PropTypes.func,
734
+ // fullscreenActive: PropTypes.bool,
735
+ // fullscreenEnabled: PropTypes.bool,
736
+ className: PropTypes__default["default"].string
737
+ };
738
+ var defaultProps$d = {
739
+ viewerTheme: null,
740
+ screenSize: null,
741
+ menuWidth: null,
785
742
  items: [],
786
743
  focusable: true,
787
- shouldLoad: true,
788
- onClickItem: null,
789
- onClose: null,
744
+ // shouldLoad: true,
745
+ onClickScreen: null,
790
746
  maxThumbsWidth: 140,
791
- toggleFullscreen: null,
792
- fullscreenActive: false,
793
- fullscreenEnabled: false,
747
+ // toggleFullscreen: null,
748
+ // fullscreenActive: false,
749
+ // fullscreenEnabled: false,
794
750
  className: null
795
751
  };
796
752
 
@@ -798,259 +754,313 @@ var ViewerMenuPreview = function ViewerMenuPreview(_ref) {
798
754
  var viewerTheme = _ref.viewerTheme,
799
755
  screenSize = _ref.screenSize,
800
756
  menuWidth = _ref.menuWidth,
801
- title = _ref.title,
802
757
  items = _ref.items,
803
758
  focusable = _ref.focusable,
804
- onClickItem = _ref.onClickItem,
805
- onClose = _ref.onClose,
759
+ onClickScreen = _ref.onClickScreen,
806
760
  maxThumbsWidth = _ref.maxThumbsWidth,
807
- toggleFullscreen = _ref.toggleFullscreen,
808
- fullscreenActive = _ref.fullscreenActive,
809
- fullscreenEnabled = _ref.fullscreenEnabled,
810
761
  className = _ref.className;
811
- var intl = reactIntl.useIntl();
812
-
813
- var _ref2 = screenSize || {},
814
- screenWidth = _ref2.width,
815
- screenHeight = _ref2.height;
816
762
 
817
763
  var _useDimensionObserver = hooks.useDimensionObserver(),
818
- firstScreenContainerRef = _useDimensionObserver.ref,
764
+ containerRef = _useDimensionObserver.ref,
819
765
  _useDimensionObserver2 = _useDimensionObserver.width,
820
- thumbWidth = _useDimensionObserver2 === void 0 ? 0 : _useDimensionObserver2;
821
-
822
- var _useDimensionObserver3 = hooks.useDimensionObserver(),
823
- containerRef = _useDimensionObserver3.ref,
824
- _useDimensionObserver4 = _useDimensionObserver3.width,
825
- contentWidth = _useDimensionObserver4 === void 0 ? 0 : _useDimensionObserver4;
766
+ contentWidth = _useDimensionObserver2 === void 0 ? 0 : _useDimensionObserver2;
826
767
 
827
768
  var thumbsPerLine = Math.max(Math.floor(contentWidth / maxThumbsWidth), 3); // Viewer theme
769
+ // @todo room for improvement here probably
770
+ // @todo also re-implement!!
828
771
 
829
- var _ref3 = viewerTheme || {},
830
- _ref3$colors = _ref3.colors,
831
- colors = _ref3$colors === void 0 ? null : _ref3$colors,
832
- _ref3$background = _ref3.background,
833
- background = _ref3$background === void 0 ? null : _ref3$background,
834
- _ref3$textStyles = _ref3.textStyles,
835
- textStyles = _ref3$textStyles === void 0 ? null : _ref3$textStyles,
836
- _ref3$logo = _ref3.logo,
837
- brandLogo = _ref3$logo === void 0 ? null : _ref3$logo;
838
-
839
- var _ref4 = textStyles || {},
840
- _ref4$title = _ref4.title,
841
- brandTextStyle = _ref4$title === void 0 ? null : _ref4$title;
772
+ var _ref2 = viewerTheme || {},
773
+ _ref2$colors = _ref2.colors,
774
+ colors = _ref2$colors === void 0 ? null : _ref2$colors,
775
+ _ref2$background = _ref2.background,
776
+ background = _ref2$background === void 0 ? null : _ref2$background;
777
+ _ref2.logo;
842
778
 
843
- var _ref5 = colors || {},
844
- _ref5$primary = _ref5.primary,
845
- brandPrimaryColor = _ref5$primary === void 0 ? null : _ref5$primary,
846
- _ref5$secondary = _ref5.secondary,
847
- brandSecondaryColor = _ref5$secondary === void 0 ? null : _ref5$secondary;
779
+ var _ref3 = colors || {};
780
+ _ref3.primary;
781
+ _ref3.secondary;
848
782
 
849
- var _ref6 = background || {},
850
- _ref6$color = _ref6.color,
851
- brandBackgroundColor = _ref6$color === void 0 ? null : _ref6$color,
852
- _ref6$image = _ref6.image,
853
- image = _ref6$image === void 0 ? null : _ref6$image;
783
+ var _ref4 = background || {},
784
+ _ref4$color = _ref4.color,
785
+ brandBackgroundColor = _ref4$color === void 0 ? null : _ref4$color,
786
+ _ref4$image = _ref4.image,
787
+ image = _ref4$image === void 0 ? null : _ref4$image;
854
788
 
855
- var _ref7 = image || {},
856
- _ref7$url = _ref7.url,
857
- brandImageUrl = _ref7$url === void 0 ? null : _ref7$url;
789
+ var _ref5 = image || {},
790
+ _ref5$url = _ref5.url,
791
+ brandImageUrl = _ref5$url === void 0 ? null : _ref5$url; // const borderPrimaryColorStyle = getStyleFromColor(brandPrimaryColor, 'borderColor');
792
+ // const colorSecondaryColorStyle = getStyleFromColor(brandSecondaryColor, 'color');
858
793
 
859
- var borderPrimaryColorStyle = utils.getStyleFromColor(brandPrimaryColor, 'borderColor');
860
- var colorSecondaryColorStyle = utils.getStyleFromColor(brandSecondaryColor, 'color');
861
- var backgroundColorStyle = utils.getStyleFromColor(brandBackgroundColor, 'backgroundColor');
862
794
 
863
- var _ref8 = brandLogo || {},
864
- _ref8$url = _ref8.url,
865
- brandLogoUrl = _ref8$url === void 0 ? null : _ref8$url;
795
+ var backgroundColorStyle = utils.getStyleFromColor(brandBackgroundColor, 'backgroundColor'); // const { url: brandLogoUrl = null } = brandLogo || {};
866
796
 
867
797
  var brandImageStyle = brandImageUrl !== null ? {
868
798
  backgroundImage: "url(".concat(brandImageUrl, ")")
869
- } : null;
870
- var titleStyle = brandTextStyle !== null ? utils.getStyleFromText(brandTextStyle) : null;
799
+ } : null; // @todo could probably use some work to avoid the visual jump from 3 screens to all of them
871
800
 
872
- var _useState = React.useState(false),
873
- _useState2 = _slicedToArray__default["default"](_useState, 2),
874
- scrolledBottom = _useState2[0],
875
- setScrolledBottom = _useState2[1];
876
-
877
- var dragBind = react.useDrag(function (_ref9) {
878
- var _ref9$direction = _slicedToArray__default["default"](_ref9.direction, 2),
879
- dy = _ref9$direction[1],
880
- last = _ref9.last,
881
- tap = _ref9.tap;
882
-
883
- if (!tap && last && scrolledBottom && dy < 0 && onClose !== null) {
884
- onClose();
885
- }
886
- }, {
887
- filterTaps: true,
888
- eventOptions: {
889
- capture: true
890
- }
891
- });
892
- var onScrolledBottom = React.useCallback(function () {
893
- setScrolledBottom(true);
894
- }, [setScrolledBottom]);
895
- var onScrolledNotBottom = React.useCallback(function () {
896
- setScrolledBottom(false);
897
- }, [setScrolledBottom]);
898
801
  var finalItems = React.useMemo(function () {
899
- return !focusable ? items.slice(0, 3) : items;
900
- }, [items, focusable]);
901
- return /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
902
- className: classNames__default["default"]([styles$7.container, _defineProperty__default["default"]({}, className, className !== null)]),
802
+ return !focusable ? items.map(function (s, i) {
803
+ return i > 3 ? {
804
+ screenId: s.screenId
805
+ } : s;
806
+ }) : items;
807
+ }, [items, focusable]); // @todo bookmarks
808
+ // const bookmarks = finalItems.reduce((acc, it) => {
809
+ // const { screen = null } = it || {};
810
+ // const { bookmark = null } = screen || {};
811
+ // return bookmark !== null ? [...acc, bookmark] : acc; // merge with array or return original array
812
+ // }, []);
813
+
814
+ return /*#__PURE__*/React__default["default"].createElement("div", {
815
+ className: classNames__default["default"]([styles$9.container, _defineProperty__default["default"]({}, className, className !== null)]),
903
816
  style: _objectSpread__default["default"](_objectSpread__default["default"](_objectSpread__default["default"]({}, backgroundColorStyle), brandImageStyle), {}, {
904
817
  width: menuWidth
905
818
  }),
906
819
  "aria-hidden": focusable ? null : 'true'
907
- }, dragBind()), /*#__PURE__*/React__default["default"].createElement("div", {
908
- className: styles$7.header
909
- }, brandLogoUrl !== null ? /*#__PURE__*/React__default["default"].createElement("div", {
910
- className: styles$7.organisation,
911
- style: {
912
- backgroundImage: "url(".concat(brandLogoUrl, ")")
913
- }
914
- }) : null, /*#__PURE__*/React__default["default"].createElement("div", {
915
- className: styles$7.title,
916
- style: titleStyle
917
- }, title), /*#__PURE__*/React__default["default"].createElement("div", {
918
- className: styles$7.buttons,
919
- style: colorSecondaryColorStyle
920
- }, fullscreenEnabled ? /*#__PURE__*/React__default["default"].createElement(components.Button, {
921
- className: styles$7.button,
922
- onClick: toggleFullscreen,
923
- title: intl.formatMessage({
924
- id: "AuxqcG",
925
- defaultMessage: [{
926
- "type": 0,
927
- "value": "Fullscreen"
928
- }]
929
- }),
930
- "aria-label": intl.formatMessage({
931
- id: "AuxqcG",
932
- defaultMessage: [{
933
- "type": 0,
934
- "value": "Fullscreen"
935
- }]
936
- }),
937
- focusable: focusable
938
- }, /*#__PURE__*/React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, {
939
- className: styles$7.icon,
940
- icon: fullscreenActive ? faCompress.faCompress : faExpand.faExpand
941
- })) : null, /*#__PURE__*/React__default["default"].createElement(components.Button, {
942
- className: styles$7.button,
943
- onClick: onClose,
944
- title: intl.formatMessage({
945
- id: "dj/p/q",
946
- defaultMessage: [{
947
- "type": 0,
948
- "value": "Close"
949
- }]
950
- }),
951
- "aria-label": intl.formatMessage({
952
- id: "dj/p/q",
953
- defaultMessage: [{
954
- "type": 0,
955
- "value": "Close"
956
- }]
957
- }),
958
- focusable: focusable
959
- }, /*#__PURE__*/React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, {
960
- className: styles$7.icon,
961
- icon: faTimes.faTimes
962
- })))), /*#__PURE__*/React__default["default"].createElement("div", {
963
- className: styles$7.content,
820
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
821
+ className: styles$9.content,
964
822
  ref: containerRef
965
823
  }, /*#__PURE__*/React__default["default"].createElement(Scroll__default["default"], {
966
- className: styles$7.scroll,
967
- onScrolledBottom: onScrolledBottom,
968
- onScrolledNotBottom: onScrolledNotBottom
824
+ className: styles$9.scroll
969
825
  }, /*#__PURE__*/React__default["default"].createElement("nav", {
970
- className: styles$7.nav
826
+ className: styles$9.nav
971
827
  }, /*#__PURE__*/React__default["default"].createElement("ul", {
972
- className: styles$7.items
828
+ className: styles$9.items
973
829
  }, finalItems.map(function (item, index) {
974
- var screenId = item.screenId,
975
- _item$current = item.current,
976
- current = _item$current === void 0 ? false : _item$current,
977
- screen = item.screen,
978
- _item$count = item.count,
979
- count = _item$count === void 0 ? 1 : _item$count;
980
- var screenAriaLabel = "".concat(intl.formatMessage({
981
- id: "LkVfwW",
982
- defaultMessage: [{
983
- "type": 0,
984
- "value": "Screen "
985
- }, {
986
- "type": 1,
987
- "value": "index"
988
- }]
989
- }, {
990
- index: index + 1
991
- })).concat(current ? " ".concat(intl.formatMessage({
992
- id: "vmrJ8U",
993
- defaultMessage: [{
994
- "type": 0,
995
- "value": "(current screen)"
996
- }]
997
- })) : '');
830
+ var _ref7 = item || {},
831
+ screenId = _ref7.screenId;
832
+
833
+ var itemStyles = {
834
+ width: "".concat(100 / thumbsPerLine, "%")
835
+ };
998
836
  return /*#__PURE__*/React__default["default"].createElement("li", {
999
- className: classNames__default["default"]([styles$7.item, _defineProperty__default["default"]({}, styles$7.active, current)]),
1000
837
  key: "item-".concat(screenId),
1001
- style: {
1002
- width: "".concat(100 / thumbsPerLine, "%")
1003
- }
1004
- }, /*#__PURE__*/React__default["default"].createElement("div", {
1005
- className: styles$7.itemContent
1006
- }, /*#__PURE__*/React__default["default"].createElement("div", {
1007
- className: styles$7.screenContainer,
1008
- ref: index === 0 ? firstScreenContainerRef : null
1009
- }, count > 1 ? /*#__PURE__*/React__default["default"].createElement("div", {
1010
- className: styles$7.subScreenBadge
1011
- }, /*#__PURE__*/React__default["default"].createElement("span", {
1012
- className: styles$7.subScreenCount
1013
- }, count), /*#__PURE__*/React__default["default"].createElement(StackIcon, {
1014
- className: styles$7.subScreenIcon
1015
- })) : null, screenWidth > 0 && screenHeight > 0 ? /*#__PURE__*/React__default["default"].createElement(components.ScreenPreview, {
1016
- screenWidth: screenWidth,
1017
- screenHeight: screenHeight,
1018
- width: thumbWidth,
1019
- screen: screen,
1020
- focusable: focusable,
1021
- active: focusable,
1022
- withSize: true
1023
- }) : null, current ? /*#__PURE__*/React__default["default"].createElement("div", {
1024
- className: styles$7.activeScreenBorder,
1025
- style: borderPrimaryColorStyle
1026
- }) : null)), /*#__PURE__*/React__default["default"].createElement("button", {
1027
- type: "button",
1028
- className: styles$7.screenButton,
1029
- onClick: function onClick() {
1030
- if (onClickItem !== null) {
1031
- onClickItem(item);
1032
- }
1033
- },
1034
- "aria-label": screenAriaLabel,
1035
- onKeyUp: function onKeyUp(e) {
1036
- if (e.key === 'Enter' && onClickItem !== null) {
1037
- onClickItem(item);
1038
- }
1039
- },
1040
- tabIndex: focusable ? '0' : '-1'
838
+ className: styles$9.item,
839
+ style: itemStyles
840
+ }, item === null ? 'loading' : /*#__PURE__*/React__default["default"].createElement(ViewerMenuScreen, {
841
+ className: styles$9.screenPreview,
842
+ item: item,
843
+ index: index,
844
+ screenSize: screenSize,
845
+ onClick: onClickScreen,
846
+ focusable: focusable
1041
847
  }));
1042
848
  }))))));
1043
849
  };
1044
850
 
1045
- ViewerMenuPreview.propTypes = propTypes$b;
1046
- ViewerMenuPreview.defaultProps = defaultProps$b;
851
+ ViewerMenuPreview.propTypes = propTypes$d;
852
+ ViewerMenuPreview.defaultProps = defaultProps$d;
853
+
854
+ var styles$8 = {"container":"micromag-viewer-partials-micromag-preview-container","cover":"micromag-viewer-partials-micromag-preview-cover","info":"micromag-viewer-partials-micromag-preview-info","url":"micromag-viewer-partials-micromag-preview-url","title":"micromag-viewer-partials-micromag-preview-title"};
855
+
856
+ var propTypes$c = {
857
+ screen: core.PropTypes.item,
858
+ title: PropTypes__default["default"].string,
859
+ url: PropTypes__default["default"].string,
860
+ description: PropTypes__default["default"].string,
861
+ className: PropTypes__default["default"].string
862
+ };
863
+ var defaultProps$c = {
864
+ screen: null,
865
+ title: null,
866
+ url: null,
867
+ description: null,
868
+ className: null
869
+ };
870
+
871
+ var MicromagPreview = function MicromagPreview(_ref) {
872
+ var screen = _ref.screen,
873
+ title = _ref.title,
874
+ url = _ref.url,
875
+ description = _ref.description,
876
+ className = _ref.className;
877
+ return /*#__PURE__*/React__default["default"].createElement("div", {
878
+ className: classNames__default["default"]([styles$8.container, _defineProperty__default["default"]({}, className, className)])
879
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
880
+ className: styles$8.cover
881
+ }, /*#__PURE__*/React__default["default"].createElement(components.ScreenPreview, {
882
+ screen: screen,
883
+ width: 100,
884
+ height: 150,
885
+ withSize: true
886
+ })), /*#__PURE__*/React__default["default"].createElement("div", {
887
+ className: styles$8.info
888
+ }, /*#__PURE__*/React__default["default"].createElement("h3", {
889
+ className: styles$8.title
890
+ }, title), url ? /*#__PURE__*/React__default["default"].createElement("div", {
891
+ className: styles$8.url
892
+ }, url) : null, /*#__PURE__*/React__default["default"].createElement("p", null, description)));
893
+ };
1047
894
 
1048
- var styles$6 = {"container":"micromag-viewer-container","menuPreview":"micromag-viewer-menuPreview","menuPreviewContainer":"micromag-viewer-menuPreviewContainer","screenContainer":"micromag-viewer-screenContainer","screen":"micromag-viewer-screen","content":"micromag-viewer-content","menuDotsContainer":"micromag-viewer-menuDotsContainer","menuDots":"micromag-viewer-menuDots","navButton":"micromag-viewer-navButton","previous":"micromag-viewer-previous","next":"micromag-viewer-next","current":"micromag-viewer-current","landscape":"micromag-viewer-landscape","visible":"micromag-viewer-visible","withSiblings":"micromag-viewer-withSiblings","playbackControlsContainer":"micromag-viewer-playbackControlsContainer","playbackControls":"micromag-viewer-playbackControls","webView":"micromag-viewer-webView","hideMenu":"micromag-viewer-hideMenu","ready":"micromag-viewer-ready"};
895
+ MicromagPreview.propTypes = propTypes$c;
896
+ MicromagPreview.defaultProps = defaultProps$c;
897
+
898
+ var styles$7 = {"scroll":"micromag-viewer-menus-menu-share-scroll","container":"micromag-viewer-menus-menu-share-container","disabled":"micromag-viewer-menus-menu-share-disabled","screenButton":"micromag-viewer-menus-menu-share-screenButton","organisation":"micromag-viewer-menus-menu-share-organisation","icon":"micromag-viewer-menus-menu-share-icon","header":"micromag-viewer-menus-menu-share-header","mode":"micromag-viewer-menus-menu-share-mode","bump":"micromag-viewer-menus-menu-share-bump","options":"micromag-viewer-menus-menu-share-options","optionButton":"micromag-viewer-menus-menu-share-optionButton","content":"micromag-viewer-menus-menu-share-content"};
899
+
900
+ var propTypes$b = {
901
+ viewerTheme: core.PropTypes.viewerTheme,
902
+ menuWidth: PropTypes__default["default"].number,
903
+ title: PropTypes__default["default"].string,
904
+ description: PropTypes__default["default"].string,
905
+ items: core.PropTypes.menuItems,
906
+ focusable: PropTypes__default["default"].bool,
907
+ // shouldLoad: PropTypes.bool, // @todo still needed? to re-implement?
908
+ currentScreenIndex: PropTypes__default["default"].number,
909
+ shareUrl: PropTypes__default["default"].string,
910
+ onShare: PropTypes__default["default"].func,
911
+ className: PropTypes__default["default"].string
912
+ };
913
+ var defaultProps$b = {
914
+ viewerTheme: null,
915
+ menuWidth: null,
916
+ title: null,
917
+ description: null,
918
+ items: [],
919
+ focusable: true,
920
+ currentScreenIndex: 0,
921
+ shareUrl: null,
922
+ onShare: null,
923
+ className: null
924
+ };
925
+
926
+ var ViewerMenuShare = function ViewerMenuShare(_ref) {
927
+ var viewerTheme = _ref.viewerTheme,
928
+ menuWidth = _ref.menuWidth,
929
+ title = _ref.title,
930
+ description = _ref.description,
931
+ items = _ref.items,
932
+ focusable = _ref.focusable,
933
+ currentScreenIndex = _ref.currentScreenIndex,
934
+ shareUrl = _ref.shareUrl,
935
+ onShare = _ref.onShare,
936
+ className = _ref.className;
937
+
938
+ // Viewer theme
939
+ // @todo room for improvement here probably
940
+ var _ref2 = viewerTheme || {},
941
+ _ref2$colors = _ref2.colors,
942
+ colors = _ref2$colors === void 0 ? null : _ref2$colors,
943
+ _ref2$background = _ref2.background,
944
+ background = _ref2$background === void 0 ? null : _ref2$background;
945
+ _ref2.logo;
946
+ // @todo could get from theme provider? need to re-implement
947
+
948
+
949
+ var _ref3 = colors || {};
950
+ _ref3.primary;
951
+ _ref3.secondary;
952
+
953
+ var _ref4 = background || {},
954
+ _ref4$color = _ref4.color,
955
+ brandBackgroundColor = _ref4$color === void 0 ? null : _ref4$color,
956
+ _ref4$image = _ref4.image,
957
+ image = _ref4$image === void 0 ? null : _ref4$image;
958
+
959
+ var _ref5 = image || {},
960
+ _ref5$url = _ref5.url,
961
+ brandImageUrl = _ref5$url === void 0 ? null : _ref5$url; // const borderPrimaryColorStyle = getStyleFromColor(brandPrimaryColor, 'borderColor');
962
+ // const colorSecondaryColorStyle = getStyleFromColor(brandSecondaryColor, 'color');
963
+
964
+
965
+ var backgroundColorStyle = utils.getStyleFromColor(brandBackgroundColor, 'backgroundColor'); // const { url: brandLogoUrl = null } = brandLogo || {};
966
+
967
+ var brandImageStyle = brandImageUrl !== null ? {
968
+ backgroundImage: "url(".concat(brandImageUrl, ")")
969
+ } : null;
970
+ var coverScreen = React.useMemo(function () {
971
+ var _ref6 = items[0] || {},
972
+ _ref6$screen = _ref6.screen,
973
+ screen = _ref6$screen === void 0 ? null : _ref6$screen;
974
+
975
+ return screen;
976
+ }, [items]);
977
+ var currentScreen = React.useMemo(function () {
978
+ var found = items.find(function (item) {
979
+ var _ref7 = item || {},
980
+ _ref7$current = _ref7.current,
981
+ current = _ref7$current === void 0 ? false : _ref7$current;
982
+
983
+ return current;
984
+ });
985
+
986
+ var _ref8 = found || {},
987
+ _ref8$screen = _ref8.screen,
988
+ screen = _ref8$screen === void 0 ? null : _ref8$screen;
989
+
990
+ return screen;
991
+ }, [items, currentScreenIndex, focusable]);
992
+
993
+ var _useState = React.useState(false),
994
+ _useState2 = _slicedToArray__default["default"](_useState, 2),
995
+ shareCurrentScreen = _useState2[0],
996
+ setShareCurrentScreen = _useState2[1];
997
+
998
+ var onShareModeChange = React.useCallback(function () {
999
+ setShareCurrentScreen(function (value) {
1000
+ return !value;
1001
+ });
1002
+ }, [setShareCurrentScreen]);
1003
+
1004
+ var _useState3 = React.useState(shareUrl),
1005
+ _useState4 = _slicedToArray__default["default"](_useState3, 2),
1006
+ finalShareUrl = _useState4[0],
1007
+ setFinalShareUrl = _useState4[1];
1008
+
1009
+ React.useEffect(function () {
1010
+ setFinalShareUrl(shareCurrentScreen && currentScreenIndex !== 0 ? "".concat(shareUrl, "/").concat(currentScreenIndex) : shareUrl);
1011
+ }, [shareCurrentScreen, currentScreenIndex, setFinalShareUrl]);
1012
+ return /*#__PURE__*/React__default["default"].createElement("div", {
1013
+ className: classNames__default["default"]([styles$7.container, _defineProperty__default["default"]({}, className, className !== null)]),
1014
+ style: _objectSpread__default["default"](_objectSpread__default["default"](_objectSpread__default["default"]({}, backgroundColorStyle), brandImageStyle), {}, {
1015
+ width: menuWidth
1016
+ }),
1017
+ "aria-hidden": focusable ? null : 'true'
1018
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
1019
+ className: styles$7.content
1020
+ }, /*#__PURE__*/React__default["default"].createElement(Scroll__default["default"], {
1021
+ className: styles$7.scroll
1022
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
1023
+ className: styles$7.header
1024
+ }, /*#__PURE__*/React__default["default"].createElement(MicromagPreview, {
1025
+ className: styles$7.preview,
1026
+ screen: shareCurrentScreen ? currentScreen : coverScreen,
1027
+ title: title,
1028
+ url: finalShareUrl,
1029
+ description: description
1030
+ }), currentScreenIndex !== 0 ? /*#__PURE__*/React__default["default"].createElement("div", {
1031
+ className: styles$7.mode
1032
+ }, /*#__PURE__*/React__default["default"].createElement("label", null, /*#__PURE__*/React__default["default"].createElement("input", {
1033
+ type: "checkbox",
1034
+ name: "currentScreen",
1035
+ value: "currentScreen",
1036
+ onChange: onShareModeChange,
1037
+ checked: shareCurrentScreen
1038
+ }), /*#__PURE__*/React__default["default"].createElement(reactIntl.FormattedMessage, {
1039
+ id: "xuPbeq",
1040
+ defaultMessage: [{
1041
+ "type": 0,
1042
+ "value": "Start from the current screen"
1043
+ }]
1044
+ }))) : null), /*#__PURE__*/React__default["default"].createElement(ShareOptions__default["default"], {
1045
+ className: styles$7.options,
1046
+ itemClassName: styles$7.optionItem,
1047
+ buttonClassName: styles$7.optionButton,
1048
+ title: title,
1049
+ url: finalShareUrl,
1050
+ focusable: focusable,
1051
+ onShare: onShare,
1052
+ shareCurrentScreen: shareCurrentScreen
1053
+ }))));
1054
+ };
1055
+
1056
+ ViewerMenuShare.propTypes = propTypes$b;
1057
+ ViewerMenuShare.defaultProps = defaultProps$b;
1058
+
1059
+ var styles$6 = {"container":"micromag-viewer-container","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","fadeMenu":"micromag-viewer-fadeMenu","withShadow":"micromag-viewer-withShadow","isOpened":"micromag-viewer-isOpened","menuItem":"micromag-viewer-menuItem","menuScreens":"micromag-viewer-menuScreens","slidingButton":"micromag-viewer-slidingButton","menuButton":"micromag-viewer-menuButton","isHidden":"micromag-viewer-isHidden","navButton":"micromag-viewer-navButton","previous":"micromag-viewer-previous","next":"micromag-viewer-next","isDragging":"micromag-viewer-isDragging","withoutGestures":"micromag-viewer-withoutGestures","screen":"micromag-viewer-screen","current":"micromag-viewer-current","playbackControls":"micromag-viewer-playbackControls","webView":"micromag-viewer-webView"};
1049
1060
 
1050
1061
  var propTypes$a = {
1051
- story: core$1.PropTypes.story.isRequired,
1062
+ story: core.PropTypes.story.isRequired,
1052
1063
  currentScreenIndex: PropTypes__default["default"].number,
1053
- opened: PropTypes__default["default"].bool,
1054
1064
  toggleFullscreen: PropTypes__default["default"].func,
1055
1065
  fullscreenActive: PropTypes__default["default"].bool,
1056
1066
  fullscreenEnabled: PropTypes__default["default"].bool,
@@ -1058,14 +1068,13 @@ var propTypes$a = {
1058
1068
  withShadow: PropTypes__default["default"].bool,
1059
1069
  trackingEnabled: PropTypes__default["default"].bool,
1060
1070
  shareBasePath: PropTypes__default["default"].string,
1061
- theme: core$1.PropTypes.viewerTheme,
1062
- screenSize: core$1.PropTypes.screenSize,
1071
+ theme: core.PropTypes.viewerTheme,
1072
+ screenSize: core.PropTypes.screenSize,
1063
1073
  menuWidth: PropTypes__default["default"].number,
1064
1074
  withDotItemClick: PropTypes__default["default"].bool,
1065
1075
  withoutScreensMenu: PropTypes__default["default"].bool,
1066
- onRequestOpen: PropTypes__default["default"].func,
1067
- onRequestClose: PropTypes__default["default"].func,
1068
- onClickItem: PropTypes__default["default"].func,
1076
+ withoutShareMenu: PropTypes__default["default"].bool,
1077
+ onClickScreen: PropTypes__default["default"].func,
1069
1078
  onClickMenu: PropTypes__default["default"].func,
1070
1079
  onClickCloseViewer: PropTypes__default["default"].func,
1071
1080
  refDots: PropTypes__default["default"].shape({
@@ -1075,7 +1084,6 @@ var propTypes$a = {
1075
1084
  };
1076
1085
  var defaultProps$a = {
1077
1086
  currentScreenIndex: 0,
1078
- opened: false,
1079
1087
  toggleFullscreen: null,
1080
1088
  fullscreenActive: false,
1081
1089
  fullscreenEnabled: false,
@@ -1088,18 +1096,18 @@ var defaultProps$a = {
1088
1096
  menuWidth: null,
1089
1097
  withDotItemClick: false,
1090
1098
  withoutScreensMenu: false,
1091
- onRequestOpen: null,
1092
- onRequestClose: null,
1093
- onClickItem: null,
1099
+ withoutShareMenu: false,
1100
+ onClickScreen: null,
1094
1101
  onClickMenu: null,
1095
1102
  onClickCloseViewer: null,
1096
1103
  refDots: null
1097
1104
  };
1098
1105
 
1099
1106
  var ViewerMenu = function ViewerMenu(_ref) {
1107
+ var _ref9;
1108
+
1100
1109
  var story = _ref.story,
1101
1110
  currentScreenIndex = _ref.currentScreenIndex,
1102
- opened = _ref.opened,
1103
1111
  toggleFullscreen = _ref.toggleFullscreen,
1104
1112
  fullscreenActive = _ref.fullscreenActive,
1105
1113
  fullscreenEnabled = _ref.fullscreenEnabled,
@@ -1112,23 +1120,43 @@ var ViewerMenu = function ViewerMenu(_ref) {
1112
1120
  menuWidth = _ref.menuWidth,
1113
1121
  withDotItemClick = _ref.withDotItemClick,
1114
1122
  withoutScreensMenu = _ref.withoutScreensMenu,
1115
- onRequestOpen = _ref.onRequestOpen,
1116
- onRequestClose = _ref.onRequestClose,
1117
- customOnClickItem = _ref.onClickItem,
1118
- customOnClickMenu = _ref.onClickMenu,
1119
- onClickCloseViewer = _ref.onClickCloseViewer,
1123
+ withoutShareMenu = _ref.withoutShareMenu,
1124
+ customOnClickScreen = _ref.onClickScreen;
1125
+ _ref.onClickMenu;
1126
+ var onClickCloseViewer = _ref.onClickCloseViewer,
1120
1127
  refDots = _ref.refDots;
1121
1128
  var _story$components = story.components,
1122
1129
  screens = _story$components === void 0 ? [] : _story$components,
1123
1130
  _story$title = story.title,
1124
- title = _story$title === void 0 ? null : _story$title;
1131
+ title = _story$title === void 0 ? null : _story$title,
1132
+ _story$metadata = story.metadata,
1133
+ metadata = _story$metadata === void 0 ? null : _story$metadata;
1134
+
1135
+ var _ref2 = metadata || {},
1136
+ _ref2$description = _ref2.description,
1137
+ description = _ref2$description === void 0 ? null : _ref2$description;
1138
+
1125
1139
  var currentScreen = screens !== null ? screens[currentScreenIndex] || null : null;
1126
1140
 
1127
- var _ref2 = currentScreen || {},
1128
- _ref2$id = _ref2.id,
1129
- screenId = _ref2$id === void 0 ? null : _ref2$id,
1130
- _ref2$type = _ref2.type,
1131
- screenType = _ref2$type === void 0 ? null : _ref2$type;
1141
+ var _ref3 = currentScreen || {},
1142
+ _ref3$id = _ref3.id,
1143
+ screenId = _ref3$id === void 0 ? null : _ref3$id,
1144
+ _ref3$type = _ref3.type,
1145
+ screenType = _ref3$type === void 0 ? null : _ref3$type;
1146
+
1147
+ var _ref4 = viewerTheme || {},
1148
+ _ref4$menuTheme = _ref4.menuTheme,
1149
+ menuTheme = _ref4$menuTheme === void 0 ? null : _ref4$menuTheme;
1150
+
1151
+ var _useState = React.useState(false),
1152
+ _useState2 = _slicedToArray__default["default"](_useState, 2),
1153
+ menuOpened = _useState2[0],
1154
+ setMenuOpened = _useState2[1];
1155
+
1156
+ var _useState3 = React.useState(false),
1157
+ _useState4 = _slicedToArray__default["default"](_useState3, 2),
1158
+ shareOpened = _useState4[0],
1159
+ setShareOpened = _useState4[1];
1132
1160
 
1133
1161
  var items = React.useMemo(function () {
1134
1162
  return screens.map(function (it) {
@@ -1149,9 +1177,9 @@ var ViewerMenu = function ViewerMenu(_ref) {
1149
1177
  count: children.length + 1 || 1,
1150
1178
  subIndex: subIndex || 0
1151
1179
  };
1152
- }).filter(function (_ref3) {
1153
- var _ref3$visible = _ref3.visible,
1154
- visible = _ref3$visible === void 0 ? true : _ref3$visible;
1180
+ }).filter(function (_ref5) {
1181
+ var _ref5$visible = _ref5.visible,
1182
+ visible = _ref5$visible === void 0 ? true : _ref5$visible;
1155
1183
  return visible;
1156
1184
  });
1157
1185
  }, [screens, screenId]);
@@ -1166,160 +1194,223 @@ var ViewerMenu = function ViewerMenu(_ref) {
1166
1194
  }
1167
1195
  }, [trackEvent, screenId, currentScreenIndex, screenType]);
1168
1196
  var shareUrl = React.useMemo(function () {
1169
- var origin = typeof window !== 'undefined' ? window.location.origin.replace(/\/+$/, '') : '';
1170
- var path = shareBasePath !== null ? "".concat(origin).concat(shareBasePath) : origin;
1197
+ // @todo validate this
1198
+ // const base =
1199
+ // typeof window !== 'undefined' ? window.location.origin.replace(/\/+$/, '') : '';
1200
+ // const path = shareBasePath !== null ? `${base}${shareBasePath}` : base;
1201
+ var base = typeof window !== 'undefined' ? window.location.host : '';
1202
+ var path = shareBasePath !== null ? "".concat(base).concat(shareBasePath) : base;
1171
1203
  return path;
1172
- }, [shareBasePath]);
1173
-
1174
- var _useSpring = core.useSpring(function () {
1175
- return {
1176
- y: 0,
1177
- config: _objectSpread__default["default"](_objectSpread__default["default"]({}, core.config.stiff), {}, {
1178
- clamp: true
1179
- })
1180
- };
1181
- }),
1182
- _useSpring2 = _slicedToArray__default["default"](_useSpring, 2),
1183
- menuY = _useSpring2[0].y,
1184
- setMenuSpring = _useSpring2[1];
1185
-
1186
- var refOpened = React.useRef(opened);
1187
-
1188
- if (refOpened.current !== opened) {
1189
- refOpened.current = opened;
1190
- }
1191
-
1192
- React.useEffect(function () {
1193
- setMenuSpring.start({
1194
- y: opened ? 1 : 0
1195
- });
1196
- }, [opened]);
1197
-
1198
- var _useDimensionObserver = hooks.useDimensionObserver(),
1199
- menuPreviewContainerRef = _useDimensionObserver.ref,
1200
- _useDimensionObserver2 = _useDimensionObserver.height,
1201
- menuPreviewContainerHeight = _useDimensionObserver2 === void 0 ? 0 : _useDimensionObserver2;
1204
+ }, [shareBasePath]); // @todo sorta not super good here
1202
1205
 
1203
- var menuPreviewStyle = {
1204
- transform: menuY.to(function (y) {
1205
- return "translateY(".concat(y * menuPreviewContainerHeight, "px)");
1206
- })
1207
- };
1208
- var menuDragBind = react.useDrag(function (_ref4) {
1209
- var _ref4$movement = _slicedToArray__default["default"](_ref4.movement, 2),
1210
- my = _ref4$movement[1],
1211
- first = _ref4.first,
1212
- last = _ref4.last,
1213
- _ref4$direction = _slicedToArray__default["default"](_ref4.direction, 2),
1214
- dy = _ref4$direction[1],
1215
- cancel = _ref4.cancel,
1216
- canceled = _ref4.canceled,
1217
- tap = _ref4.tap;
1218
-
1219
- if (canceled || tap) {
1220
- return;
1206
+ var onOpenMenu = React.useCallback(function () {
1207
+ setMenuOpened(true);
1208
+ setShareOpened(false);
1209
+ trackScreenEvent('viewer_menu', 'open_screens_menu');
1210
+ }, [setMenuOpened, setShareOpened, trackScreenEvent]);
1211
+ var onCloseMenu = React.useCallback(function () {
1212
+ setMenuOpened(false);
1213
+ setShareOpened(false);
1214
+ trackScreenEvent('viewer_menu', 'close_screens_menu');
1215
+ }, [setMenuOpened, setShareOpened, trackScreenEvent]);
1216
+ var onOpenShare = React.useCallback(function () {
1217
+ setShareOpened(true);
1218
+ setMenuOpened(false);
1219
+ trackScreenEvent('viewer_menu', 'open_share_menu');
1220
+ }, [setShareOpened, setMenuOpened, trackScreenEvent]);
1221
+ var onCloseShare = React.useCallback(function () {
1222
+ setShareOpened(false);
1223
+ setMenuOpened(false);
1224
+ trackScreenEvent('viewer_menu', 'close_share_menu');
1225
+ }, [setShareOpened, setMenuOpened, trackScreenEvent]);
1226
+ var onClickScreen = React.useCallback(function (screen) {
1227
+ setMenuOpened(false);
1228
+
1229
+ if (customOnClickScreen !== null) {
1230
+ customOnClickScreen(screen);
1221
1231
  }
1222
1232
 
1223
- var isMenuOpened = refOpened.current;
1224
-
1225
- if (first) {
1226
- if (isMenuOpened) {
1227
- cancel();
1228
- return;
1229
- }
1233
+ var index = items.findIndex(function (_ref6) {
1234
+ var id = _ref6.id;
1235
+ return id === screenId;
1236
+ });
1237
+ trackScreenEvent('viewer_menu', 'click_screen_change', "Screen ".concat(index + 1));
1238
+ }, [customOnClickScreen, setMenuOpened, items, screenId, trackScreenEvent]);
1239
+ var onShare = React.useCallback(function (type) {
1240
+ // @todo display something to say thanks for sharing?
1241
+ trackScreenEvent('viewer_menu', 'shared_story', type);
1242
+ }, [trackScreenEvent]);
1243
+ var computeShareProgress = React.useCallback(function (_ref7) {
1244
+ var active = _ref7.active,
1245
+ _ref7$direction = _slicedToArray__default["default"](_ref7.direction, 2),
1246
+ dy = _ref7$direction[1],
1247
+ _ref7$movement = _slicedToArray__default["default"](_ref7.movement, 2),
1248
+ my = _ref7$movement[1],
1249
+ _ref7$velocity = _slicedToArray__default["default"](_ref7.velocity, 2),
1250
+ vy = _ref7$velocity[1];
1251
+
1252
+ var progress = Math.max(0, my) / (window.innerHeight * 0.8);
1253
+ var reachedThreshold = (vy > 0.3 || Math.abs(progress) > 0.3) && dy !== -1;
1254
+
1255
+ if (!active) {
1256
+ if (reachedThreshold) onOpenShare();
1257
+ return reachedThreshold ? 1 : 0;
1230
1258
  }
1231
1259
 
1232
- var yProgress = Math.max(0, Math.min(1, my / menuPreviewContainerHeight + (isMenuOpened ? 1 : 0)));
1233
-
1234
- if (last) {
1235
- var menuNowOpened = dy > 0 && yProgress > 0.1;
1236
- refOpened.current = menuNowOpened;
1237
- setMenuSpring.start({
1238
- y: menuNowOpened ? 1 : 0
1239
- });
1260
+ return progress;
1261
+ }, [menuOpened, onOpenShare]);
1240
1262
 
1241
- if (menuNowOpened && onRequestOpen !== null) {
1242
- onRequestOpen();
1243
- } else if (!menuNowOpened && onRequestClose !== null) {
1244
- onRequestClose();
1263
+ var _useDragProgress = hooks.useDragProgress({
1264
+ progress: shareOpened ? 1 : 0,
1265
+ computeProgress: computeShareProgress,
1266
+ springParams: {
1267
+ config: {
1268
+ tension: 300,
1269
+ friction: 30
1245
1270
  }
1246
- } else {
1247
- setMenuSpring.start({
1248
- y: yProgress
1249
- });
1250
1271
  }
1251
- }, {
1252
- axis: 'y',
1253
- filterTaps: true
1254
- }); // handle preview menu item click
1255
-
1256
- var onClickMenu = React.useCallback(function (index) {
1257
- if (customOnClickMenu !== null) {
1258
- customOnClickMenu(index);
1272
+ }),
1273
+ bindShareDrag = _useDragProgress.bind,
1274
+ isDraggingShare = _useDragProgress.dragging,
1275
+ shareOpenedProgress = _useDragProgress.progress;
1276
+
1277
+ var computeMenuProgress = React.useCallback(function (_ref8) {
1278
+ var active = _ref8.active,
1279
+ _ref8$direction = _slicedToArray__default["default"](_ref8.direction, 2),
1280
+ dy = _ref8$direction[1],
1281
+ _ref8$movement = _slicedToArray__default["default"](_ref8.movement, 2),
1282
+ my = _ref8$movement[1],
1283
+ _ref8$velocity = _slicedToArray__default["default"](_ref8.velocity, 2),
1284
+ vy = _ref8$velocity[1];
1285
+
1286
+ var progress = Math.max(0, my) / (window.innerHeight * 0.8);
1287
+ var reachedThreshold = (vy > 0.3 || Math.abs(progress) > 0.3) && dy !== -1;
1288
+
1289
+ if (!active) {
1290
+ if (reachedThreshold) onOpenMenu();
1291
+ return reachedThreshold ? 1 : 0;
1259
1292
  }
1260
1293
 
1261
- trackScreenEvent('viewer_menu', 'click_open', 'Menu icon');
1262
- }, [customOnClickMenu, trackScreenEvent]);
1263
- var onClickItem = React.useCallback(function (item) {
1264
- if (customOnClickItem !== null) {
1265
- customOnClickItem(item);
1266
- }
1294
+ return progress;
1295
+ }, [menuOpened, onOpenMenu]);
1267
1296
 
1268
- var index = items.findIndex(function (_ref5) {
1269
- var id = _ref5.id;
1270
- return id === screenId;
1271
- });
1272
- trackScreenEvent('viewer_menu', 'click_screen_change', "Screen ".concat(index + 1));
1273
- }, [customOnClickItem, items, screenId, trackScreenEvent]);
1274
- var onClickClose = React.useCallback(function () {
1275
- if (onRequestClose !== null) {
1276
- onRequestClose();
1297
+ var _useDragProgress2 = hooks.useDragProgress({
1298
+ progress: menuOpened ? 1 : 0,
1299
+ computeProgress: computeMenuProgress,
1300
+ springParams: {
1301
+ config: {
1302
+ tension: 300,
1303
+ friction: 30
1304
+ }
1277
1305
  }
1306
+ }),
1307
+ bindMenuDrag = _useDragProgress2.bind,
1308
+ isDraggingMenu = _useDragProgress2.dragging,
1309
+ menuOpenedProgress = _useDragProgress2.progress;
1278
1310
 
1279
- trackScreenEvent('viewer_menu', 'click_close', 'Close icon');
1280
- }, [onRequestClose, trackScreenEvent]); // Handle preview menu share click
1281
-
1282
- var onClickShare = React.useCallback(function (type) {
1283
- return trackScreenEvent('viewer_menu', 'click_share', type);
1284
- }, [trackScreenEvent]);
1285
-
1286
- var _ref6 = viewerTheme || {},
1287
- _ref6$menuTheme = _ref6.menuTheme,
1288
- menuTheme = _ref6$menuTheme === void 0 ? null : _ref6$menuTheme;
1311
+ var keyboardShortcuts = React.useMemo(function () {
1312
+ return {
1313
+ m: function m() {
1314
+ return !menuOpened ? onOpenMenu() : onCloseMenu();
1315
+ },
1316
+ escape: function escape() {
1317
+ return onCloseMenu();
1318
+ }
1319
+ };
1320
+ }, [menuOpened, onOpenMenu, onCloseMenu]);
1321
+ useKeyboardShortcuts(keyboardShortcuts); // should be zero if either screens menu or share menu is opened
1289
1322
 
1290
- return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
1291
- className: styles$6.menuDotsContainer,
1323
+ var dotsOpacity = Math.min(1, Math.max(0, 1 - (menuOpenedProgress + shareOpenedProgress)));
1324
+ return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement("div", {
1325
+ className: classNames__default["default"]([styles$6.menuNavContainer, (_ref9 = {}, _defineProperty__default["default"](_ref9, styles$6.withShadow, withShadow), _defineProperty__default["default"](_ref9, styles$6.isOpened, menuOpened || shareOpened), _ref9)]),
1292
1326
  ref: refDots,
1293
1327
  style: {
1294
1328
  width: menuWidth
1295
1329
  }
1296
- }, menuDragBind()), /*#__PURE__*/React__default["default"].createElement(ViewerMenuDots, Object.assign({}, menuTheme, {
1330
+ }, /*#__PURE__*/React__default["default"].createElement("nav", {
1331
+ className: styles$6.menuTopContainer
1332
+ }, !withoutShareMenu ? /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
1333
+ className: classNames__default["default"]([styles$6.menuItem, styles$6.menuShare])
1334
+ }, bindShareDrag()), /*#__PURE__*/React__default["default"].createElement(components.SlidingButtons, {
1335
+ className: styles$6.slidingButton,
1336
+ current: shareOpenedProgress,
1337
+ immediate: isDraggingShare,
1338
+ buttons: [ShareButton, components.CloseButton],
1339
+ buttonsProps: [{
1340
+ key: 'share',
1341
+ className: styles$6.menuButton,
1342
+ onClick: onOpenShare,
1343
+ theme: menuTheme
1344
+ }, {
1345
+ key: 'close-share',
1346
+ className: styles$6.menuButton,
1347
+ onClick: onCloseShare,
1348
+ theme: menuTheme,
1349
+ iconPosition: 'left'
1350
+ }]
1351
+ })) : null, !withoutScreensMenu ? /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
1352
+ className: classNames__default["default"]([styles$6.menuItem, styles$6.menuScreens])
1353
+ }, bindMenuDrag()), /*#__PURE__*/React__default["default"].createElement(components.SlidingButtons, {
1354
+ className: styles$6.slidingButton,
1355
+ current: menuOpenedProgress,
1356
+ immediate: isDraggingMenu,
1357
+ buttons: [MenuButton, components.CloseButton],
1358
+ buttonsProps: [{
1359
+ key: 'menu',
1360
+ className: styles$6.menuButton,
1361
+ onClick: onOpenMenu,
1362
+ theme: menuTheme
1363
+ }, {
1364
+ key: 'close-menu',
1365
+ className: styles$6.menuButton,
1366
+ onClick: onCloseMenu,
1367
+ theme: menuTheme,
1368
+ iconPosition: 'right'
1369
+ }]
1370
+ })) : null), /*#__PURE__*/React__default["default"].createElement(ViewerMenuDots, Object.assign({}, menuTheme, {
1297
1371
  direction: "horizontal",
1298
- withShadow: withShadow,
1299
1372
  items: items,
1300
- title: title,
1301
- shareUrl: shareUrl,
1302
- onShare: onClickShare,
1303
- onClickItem: onClickItem,
1304
- onClickMenu: onClickMenu,
1373
+ onClickDot: onClickScreen,
1374
+ onClickMenu: onOpenMenu,
1305
1375
  closeable: closeable,
1306
1376
  withItemClick: withDotItemClick,
1307
1377
  withoutScreensMenu: withoutScreensMenu,
1378
+ withoutShareMenu: withoutShareMenu,
1308
1379
  onClose: onClickCloseViewer,
1309
- className: styles$6.menuDots
1310
- }))), /*#__PURE__*/React__default["default"].createElement(web.animated.div, {
1311
- className: styles$6.menuPreviewContainer,
1312
- style: menuPreviewStyle,
1313
- ref: menuPreviewContainerRef
1380
+ className: styles$6.dots,
1381
+ style: {
1382
+ opacity: dotsOpacity
1383
+ }
1384
+ }))), /*#__PURE__*/React__default["default"].createElement(ViewerMenuContainer, {
1385
+ className: styles$6.menuContainerShare,
1386
+ transitionProgress: shareOpenedProgress
1387
+ }, /*#__PURE__*/React__default["default"].createElement(ViewerMenuShare, {
1388
+ viewerTheme: viewerTheme,
1389
+ className: styles$6.menuShare,
1390
+ title: title,
1391
+ description: description,
1392
+ menuWidth: menuWidth,
1393
+ focusable: shareOpened,
1394
+ items: items,
1395
+ currentScreenIndex: currentScreenIndex,
1396
+ shareUrl: shareUrl,
1397
+ onShare: onShare,
1398
+ onClose: onCloseShare
1399
+ })), /*#__PURE__*/React__default["default"].createElement(ViewerMenuContainer, {
1400
+ className: styles$6.menuContainerScreens,
1401
+ transitionProgress: menuOpenedProgress
1314
1402
  }, /*#__PURE__*/React__default["default"].createElement(ViewerMenuPreview, {
1315
1403
  viewerTheme: viewerTheme,
1316
1404
  className: styles$6.menuPreview,
1317
1405
  screenSize: screenSize,
1318
1406
  menuWidth: menuWidth,
1319
- focusable: opened,
1407
+ focusable: menuOpened,
1320
1408
  items: items,
1321
- onClickItem: onClickItem,
1322
- onClose: onClickClose,
1409
+ currentScreenIndex: currentScreenIndex,
1410
+ shareUrl: shareUrl,
1411
+ onShare: onShare,
1412
+ onClickScreen: onClickScreen,
1413
+ onClose: onCloseMenu,
1323
1414
  toggleFullscreen: toggleFullscreen,
1324
1415
  fullscreenActive: fullscreenActive,
1325
1416
  fullscreenEnabled: fullscreenEnabled
@@ -1384,8 +1475,8 @@ HandTap.defaultProps = defaultProps$8;
1384
1475
  var styles$4 = {"container":"micromag-viewer-screen-container","handTap":"micromag-viewer-screen-handTap"};
1385
1476
 
1386
1477
  var propTypes$7 = {
1387
- screen: core$1.PropTypes.screenComponent,
1388
- renderContext: core$1.PropTypes.renderContext,
1478
+ screen: core.PropTypes.screenComponent,
1479
+ renderContext: core.PropTypes.renderContext,
1389
1480
  screenState: PropTypes__default["default"].string,
1390
1481
  current: PropTypes__default["default"].bool,
1391
1482
  active: PropTypes__default["default"].bool,
@@ -1393,7 +1484,7 @@ var propTypes$7 = {
1393
1484
  width: PropTypes__default["default"].number,
1394
1485
  height: PropTypes__default["default"].number,
1395
1486
  scale: PropTypes__default["default"].number,
1396
- withNavigationHint: PropTypes__default["default"].func,
1487
+ withNavigationHint: PropTypes__default["default"].bool,
1397
1488
  className: PropTypes__default["default"].string
1398
1489
  };
1399
1490
  var defaultProps$7 = {
@@ -1446,11 +1537,11 @@ function ViewerScreen(_ref) {
1446
1537
  ViewerScreen.propTypes = propTypes$7;
1447
1538
  ViewerScreen.defaultProps = defaultProps$7;
1448
1539
 
1449
- var styles$3 = {"container":"micromag-viewer-partials-navigation-button-container"};
1540
+ var styles$3 = {"arrow":"micromag-viewer-buttons-navigation-button-arrow","next":"micromag-viewer-buttons-navigation-button-next","previous":"micromag-viewer-buttons-navigation-button-previous"};
1450
1541
 
1451
1542
  var propTypes$6 = {
1452
1543
  direction: PropTypes__default["default"].oneOf(['previous', 'next']),
1453
- onClick: null,
1544
+ onClick: PropTypes__default["default"].func,
1454
1545
  className: PropTypes__default["default"].string
1455
1546
  };
1456
1547
  var defaultProps$6 = {
@@ -1463,37 +1554,57 @@ var NavigationButton = function NavigationButton(_ref) {
1463
1554
  var direction = _ref.direction,
1464
1555
  onClick = _ref.onClick,
1465
1556
  className = _ref.className;
1466
- return /*#__PURE__*/React__default["default"].createElement("button", {
1467
- type: "button",
1468
- className: classNames__default["default"]([styles$3.container, _defineProperty__default["default"]({}, className, className !== null)]),
1469
- onClick: onClick
1470
- }, /*#__PURE__*/React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, {
1471
- className: styles$3.arrow,
1472
- icon: direction === 'previous' ? faArrowLeft.faArrowLeft : faArrowRight.faArrowRight
1473
- }), /*#__PURE__*/React__default["default"].createElement("span", {
1474
- className: "sr-only"
1475
- }, direction === 'previous' ? /*#__PURE__*/React__default["default"].createElement(reactIntl.FormattedMessage, {
1476
- id: "zYH/31",
1477
- defaultMessage: [{
1478
- "type": 0,
1479
- "value": "Go to previous screen"
1480
- }]
1481
- }) : /*#__PURE__*/React__default["default"].createElement(reactIntl.FormattedMessage, {
1482
- id: "v9bqYj",
1483
- defaultMessage: [{
1484
- "type": 0,
1485
- "value": "Go to next screen"
1486
- }]
1487
- })));
1557
+ return /*#__PURE__*/React__default["default"].createElement(components.Button, {
1558
+ className: classNames__default["default"]([styles$3.container, styles$3[direction], _defineProperty__default["default"]({}, className, className !== null)]),
1559
+ onClick: onClick,
1560
+ iconPosition: direction === 'next' ? 'right' : 'left',
1561
+ icon: /*#__PURE__*/React__default["default"].createElement("svg", {
1562
+ className: styles$3.arrow,
1563
+ xmlns: "http://www.w3.org/2000/svg",
1564
+ width: "10",
1565
+ height: "16",
1566
+ viewBox: "0 0 10 16",
1567
+ fill: "currentColor"
1568
+ }, /*#__PURE__*/React__default["default"].createElement("polygon", {
1569
+ points: "9.62 4.62 5 0 0.38 4.62 1.44 5.68 4.25 2.87 4.25 14.39 5.75 14.39 5.75 2.87 8.56 5.68 9.62 4.62"
1570
+ })),
1571
+ label: /*#__PURE__*/React__default["default"].createElement("span", {
1572
+ className: "sr-only"
1573
+ }, direction === 'previous' ? /*#__PURE__*/React__default["default"].createElement(reactIntl.FormattedMessage, {
1574
+ id: "zYH/31",
1575
+ defaultMessage: [{
1576
+ "type": 0,
1577
+ "value": "Go to previous screen"
1578
+ }]
1579
+ }) : /*#__PURE__*/React__default["default"].createElement(reactIntl.FormattedMessage, {
1580
+ id: "v9bqYj",
1581
+ defaultMessage: [{
1582
+ "type": 0,
1583
+ "value": "Go to next screen"
1584
+ }]
1585
+ }))
1586
+ });
1488
1587
  };
1489
1588
 
1490
1589
  NavigationButton.propTypes = propTypes$6;
1491
1590
  NavigationButton.defaultProps = defaultProps$6;
1492
1591
 
1493
- var styles$2 = {"track":"micromag-viewer-partials-seek-bar-track","progress":"micromag-viewer-partials-seek-bar-progress","inner":"micromag-viewer-partials-seek-bar-inner","progressBar":"micromag-viewer-partials-seek-bar-progressBar","playHead":"micromag-viewer-partials-seek-bar-playHead","withSeekHead":"micromag-viewer-partials-seek-bar-withSeekHead","time":"micromag-viewer-partials-seek-bar-time"};
1592
+ var styles$2 = {"track":"micromag-viewer-partials-seek-bar-track","progress":"micromag-viewer-partials-seek-bar-progress","inner":"micromag-viewer-partials-seek-bar-inner","progressBar":"micromag-viewer-partials-seek-bar-progressBar","playHead":"micromag-viewer-partials-seek-bar-playHead","withSeekHead":"micromag-viewer-partials-seek-bar-withSeekHead","scrubbedTime":"micromag-viewer-partials-seek-bar-scrubbedTime","showTimestamp":"micromag-viewer-partials-seek-bar-showTimestamp"};
1593
+
1594
+ function getFormattedTimestamp(s) {
1595
+ var withMilliseconds = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
1596
+ var sparts = withMilliseconds ? "".concat(s).split('.') : [];
1597
+ var ms = sparts.length > 1 ? ":".concat(sparts[1].substring(0, 3)) : '';
1598
+ return (s - (s %= 60)) / 60 + (9 < s ? ':' : ':0') + ~~s + ms; // eslint-disable-line
1599
+ }
1600
+
1601
+ var SHOW_MILLISECONDS_THRESHOLD = 5; // show milliseconds when scrubbing if length of video is shorter than 5 seconds
1494
1602
 
1495
1603
  var propTypes$5 = {
1496
- media: PropTypes__default["default"].node,
1604
+ media: PropTypes__default["default"].oneOfType([PropTypes__default["default"].func, PropTypes__default["default"].shape({
1605
+ current: PropTypes__default["default"].any
1606
+ }) // eslint-disable-line
1607
+ ]),
1497
1608
  playing: PropTypes__default["default"].bool,
1498
1609
  backgroundColor: PropTypes__default["default"].string,
1499
1610
  progressColor: PropTypes__default["default"].string,
@@ -1518,7 +1629,7 @@ var defaultProps$5 = {
1518
1629
  };
1519
1630
 
1520
1631
  var SeekBar = function SeekBar(_ref) {
1521
- var _ref3;
1632
+ var _ref4;
1522
1633
 
1523
1634
  var media = _ref.media,
1524
1635
  playing = _ref.playing,
@@ -1534,13 +1645,28 @@ var SeekBar = function SeekBar(_ref) {
1534
1645
  var progress = hooks.useMediaProgress(media, {
1535
1646
  disabled: !playing
1536
1647
  });
1537
- var onDrag = React.useCallback(function (_ref2) {
1538
- var _ref2$xy = _slicedToArray__default["default"](_ref2.xy, 1),
1539
- x = _ref2$xy[0],
1540
- elapsedTime = _ref2.elapsedTime,
1541
- active = _ref2.active,
1542
- tap = _ref2.tap,
1543
- currentTarget = _ref2.currentTarget;
1648
+
1649
+ var _ref2 = media || {},
1650
+ _ref2$currentTime = _ref2.currentTime,
1651
+ currentTime = _ref2$currentTime === void 0 ? null : _ref2$currentTime,
1652
+ _ref2$duration = _ref2.duration,
1653
+ duration = _ref2$duration === void 0 ? null : _ref2$duration;
1654
+
1655
+ var _useState = React.useState(false),
1656
+ _useState2 = _slicedToArray__default["default"](_useState, 2),
1657
+ showTimestamp = _useState2[0],
1658
+ setShowTimestamp = _useState2[1];
1659
+
1660
+ var onDrag = React.useCallback(function (_ref3) {
1661
+ var event = _ref3.event,
1662
+ _ref3$xy = _slicedToArray__default["default"](_ref3.xy, 1),
1663
+ x = _ref3$xy[0],
1664
+ elapsedTime = _ref3.elapsedTime,
1665
+ active = _ref3.active,
1666
+ tap = _ref3.tap,
1667
+ currentTarget = _ref3.currentTarget;
1668
+
1669
+ event.stopPropagation();
1544
1670
 
1545
1671
  if (!active && elapsedTime > 300) {
1546
1672
  return;
@@ -1556,16 +1682,21 @@ var SeekBar = function SeekBar(_ref) {
1556
1682
  onSeek(newProgress, tap);
1557
1683
  }
1558
1684
  }, [onSeek]);
1559
- var onDragStart = React.useCallback(function () {
1685
+ var onDragStart = React.useCallback(function (event) {
1686
+ setShowTimestamp(true);
1687
+
1560
1688
  if (onSeekStart !== null) {
1561
1689
  onSeekStart();
1562
1690
  }
1563
- }, [onSeekStart]);
1691
+
1692
+ event.stopPropagation();
1693
+ }, [onSeekStart, setShowTimestamp]);
1564
1694
  var onDragEnd = React.useCallback(function () {
1565
1695
  if (onSeekEnd !== null) {
1696
+ setShowTimestamp(false);
1566
1697
  onSeekEnd();
1567
1698
  }
1568
- }, [onSeekEnd]);
1699
+ }, [onSeekEnd, setShowTimestamp]);
1569
1700
  var bind = react.useGesture({
1570
1701
  onDrag: onDrag,
1571
1702
  onDragStart: onDragStart,
@@ -1577,7 +1708,7 @@ var SeekBar = function SeekBar(_ref) {
1577
1708
  }
1578
1709
  });
1579
1710
  return /*#__PURE__*/React__default["default"].createElement("div", {
1580
- className: classNames__default["default"]([styles$2.container, (_ref3 = {}, _defineProperty__default["default"](_ref3, className, className !== null), _defineProperty__default["default"](_ref3, styles$2.withSeekHead, withSeekHead), _ref3)])
1711
+ className: classNames__default["default"]([styles$2.container, (_ref4 = {}, _defineProperty__default["default"](_ref4, className, className !== null), _defineProperty__default["default"](_ref4, styles$2.withSeekHead, withSeekHead), _defineProperty__default["default"](_ref4, styles$2.showTimestamp, showTimestamp), _ref4)])
1581
1712
  }, /*#__PURE__*/React__default["default"].createElement("div", {
1582
1713
  className: styles$2.inner
1583
1714
  }, /*#__PURE__*/React__default["default"].createElement("div", {
@@ -1591,7 +1722,12 @@ var SeekBar = function SeekBar(_ref) {
1591
1722
  left: "".concat(progress * 100, "%"),
1592
1723
  backgroundColor: progressColor
1593
1724
  }
1594
- }), /*#__PURE__*/React__default["default"].createElement("div", {
1725
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
1726
+ className: styles$2.scrubbedTime,
1727
+ style: {
1728
+ borderColor: progressColor
1729
+ }
1730
+ }, getFormattedTimestamp(currentTime, duration < SHOW_MILLISECONDS_THRESHOLD))), /*#__PURE__*/React__default["default"].createElement("div", {
1595
1731
  className: styles$2.progress,
1596
1732
  style: {
1597
1733
  transform: "scaleX(".concat(progress, ")"),
@@ -1621,7 +1757,7 @@ var SeekBar = function SeekBar(_ref) {
1621
1757
  SeekBar.propTypes = propTypes$5;
1622
1758
  SeekBar.defaultProps = defaultProps$5;
1623
1759
 
1624
- var styles$1 = {"muteButton":"micromag-viewer-partials-playback-controls-muteButton","playPauseButton":"micromag-viewer-partials-playback-controls-playPauseButton","container":"micromag-viewer-partials-playback-controls-container","icon":"micromag-viewer-partials-playback-controls-icon","withPlayPause":"micromag-viewer-partials-playback-controls-withPlayPause","isCollapsed":"micromag-viewer-partials-playback-controls-isCollapsed","isMuted":"micromag-viewer-partials-playback-controls-isMuted","withMute":"micromag-viewer-partials-playback-controls-withMute","seekBar":"micromag-viewer-partials-playback-controls-seekBar","withSeekBarOnly":"micromag-viewer-partials-playback-controls-withSeekBarOnly","withSeekBar":"micromag-viewer-partials-playback-controls-withSeekBar"};
1760
+ var styles$1 = {"muteButton":"micromag-viewer-partials-playback-controls-muteButton","playPauseButton":"micromag-viewer-partials-playback-controls-playPauseButton","container":"micromag-viewer-partials-playback-controls-container","icon":"micromag-viewer-partials-playback-controls-icon","withPlayPause":"micromag-viewer-partials-playback-controls-withPlayPause","isCollapsed":"micromag-viewer-partials-playback-controls-isCollapsed","isMuted":"micromag-viewer-partials-playback-controls-isMuted","withMute":"micromag-viewer-partials-playback-controls-withMute","withSeekBar":"micromag-viewer-partials-playback-controls-withSeekBar","seekBar":"micromag-viewer-partials-playback-controls-seekBar","withSeekBarOnly":"micromag-viewer-partials-playback-controls-withSeekBarOnly"};
1625
1761
 
1626
1762
  var propTypes$4 = {
1627
1763
  className: PropTypes__default["default"].string,
@@ -1726,7 +1862,8 @@ function PlaybackControls(_ref) {
1726
1862
  setPlaying(true);
1727
1863
  }
1728
1864
  }, [setPlaying, wasPlaying]);
1729
- var mediaHasAudio = mediaElement !== null && (hasAudio === null || hasAudio === true);
1865
+ var hasMedia = mediaElement !== null;
1866
+ var mediaHasAudio = hasMedia && (hasAudio === null || hasAudio === true);
1730
1867
 
1731
1868
  var _ref3 = customControlsTheme || {},
1732
1869
  color = _ref3.color,
@@ -1735,33 +1872,55 @@ function PlaybackControls(_ref) {
1735
1872
 
1736
1873
  var isCollapsed = controls && !controlsVisible && playing || !controls && mediaHasAudio;
1737
1874
  return /*#__PURE__*/React__default["default"].createElement("div", {
1738
- className: classNames__default["default"]([styles$1.container, (_ref4 = {}, _defineProperty__default["default"](_ref4, className, className !== null), _defineProperty__default["default"](_ref4, styles$1.withPlayPause, controls && !seekBarOnly), _defineProperty__default["default"](_ref4, styles$1.withMute, mediaHasAudio || controls), _defineProperty__default["default"](_ref4, styles$1.withSeekBar, controls), _defineProperty__default["default"](_ref4, styles$1.withSeekBarOnly, seekBarOnly), _defineProperty__default["default"](_ref4, styles$1.isCollapsed, isCollapsed), _defineProperty__default["default"](_ref4, collapsedClassName, collapsedClassName !== null && isCollapsed), _ref4)])
1739
- }, /*#__PURE__*/React__default["default"].createElement("button", {
1740
- type: "button",
1875
+ className: classNames__default["default"]([styles$1.container, (_ref4 = {}, _defineProperty__default["default"](_ref4, className, className !== null), _defineProperty__default["default"](_ref4, styles$1.withPlayPause, controls && !seekBarOnly), _defineProperty__default["default"](_ref4, styles$1.withMute, hasMedia || controls), _defineProperty__default["default"](_ref4, styles$1.withSeekBar, controls), _defineProperty__default["default"](_ref4, styles$1.withSeekBarOnly, seekBarOnly), _defineProperty__default["default"](_ref4, styles$1.isCollapsed, isCollapsed), _defineProperty__default["default"](_ref4, styles$1.isMuted, muted), _defineProperty__default["default"](_ref4, collapsedClassName, collapsedClassName !== null && isCollapsed), _ref4)])
1876
+ }, /*#__PURE__*/React__default["default"].createElement(components.Button, {
1741
1877
  className: styles$1.playPauseButton,
1742
1878
  style: {
1743
1879
  color: color
1744
1880
  },
1745
1881
  onClick: playing ? onPause : onPlay,
1746
- title: intl.formatMessage({
1747
- id: "ahSpiH",
1882
+ focusable: controlsVisible,
1883
+ icon: playing ? /*#__PURE__*/React__default["default"].createElement("svg", {
1884
+ className: styles$1.icon,
1885
+ xmlns: "http://www.w3.org/2000/svg",
1886
+ width: "10",
1887
+ height: "16",
1888
+ viewBox: "0 0 10 16",
1889
+ fill: "currentColor"
1890
+ }, /*#__PURE__*/React__default["default"].createElement("rect", {
1891
+ x: "1",
1892
+ y: "3.27",
1893
+ width: "3",
1894
+ height: "9.69"
1895
+ }), /*#__PURE__*/React__default["default"].createElement("rect", {
1896
+ x: "6",
1897
+ y: "3.27",
1898
+ width: "3",
1899
+ height: "9.69"
1900
+ })) : /*#__PURE__*/React__default["default"].createElement("svg", {
1901
+ className: styles$1.icon,
1902
+ xmlns: "http://www.w3.org/2000/svg",
1903
+ width: "10",
1904
+ height: "16",
1905
+ viewBox: "0 0 10 16",
1906
+ fill: "currentColor"
1907
+ }, /*#__PURE__*/React__default["default"].createElement("path", {
1908
+ d: "M1,3.16V12.84l8-4.84L1,3.16"
1909
+ })),
1910
+ "aria-label": playing ? intl.formatMessage({
1911
+ id: "mTqcmA",
1748
1912
  defaultMessage: [{
1749
1913
  "type": 0,
1750
- "value": "Play"
1914
+ "value": "Pause"
1751
1915
  }]
1752
- }),
1753
- "aria-label": intl.formatMessage({
1916
+ }) : intl.formatMessage({
1754
1917
  id: "ahSpiH",
1755
1918
  defaultMessage: [{
1756
1919
  "type": 0,
1757
1920
  "value": "Play"
1758
1921
  }]
1759
- }),
1760
- tabIndex: controlsVisible ? '0' : '-1'
1761
- }, /*#__PURE__*/React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, {
1762
- className: styles$1.icon,
1763
- icon: playing ? faPause.faPause : faPlay.faPlay
1764
- })), /*#__PURE__*/React__default["default"].createElement(SeekBar, {
1922
+ })
1923
+ }), /*#__PURE__*/React__default["default"].createElement(SeekBar, {
1765
1924
  className: styles$1.seekBar,
1766
1925
  media: mediaElement,
1767
1926
  playing: playing,
@@ -1772,32 +1931,54 @@ function PlaybackControls(_ref) {
1772
1931
  withSeekHead: !isCollapsed && !seekBarOnly,
1773
1932
  backgroundColor: color,
1774
1933
  progressColor: progressColor
1775
- }), /*#__PURE__*/React__default["default"].createElement("button", {
1776
- type: "button",
1777
- className: classNames__default["default"]([styles$1.muteButton, _defineProperty__default["default"]({}, styles$1.isMuted, muted)]),
1934
+ }), /*#__PURE__*/React__default["default"].createElement(components.Button, {
1935
+ className: styles$1.muteButton,
1778
1936
  style: {
1779
1937
  color: color
1780
1938
  },
1781
1939
  onClick: muted ? onUnmute : onMute,
1782
- title: intl.formatMessage({
1783
- id: "vzg8Es",
1940
+ focusable: controlsVisible || mediaHasAudio,
1941
+ icon: muted ? /*#__PURE__*/React__default["default"].createElement("svg", {
1942
+ xmlns: "http://www.w3.org/2000/svg",
1943
+ width: "10",
1944
+ height: "16",
1945
+ viewBox: "0 0 10 16",
1946
+ className: styles$1.icon,
1947
+ fill: "currentColor"
1948
+ }, /*#__PURE__*/React__default["default"].createElement("polygon", {
1949
+ points: "2.75 4.63 1.24 6 0 6 0 10 1.24 10 4.54 13 4.54 3 2.75 4.63"
1950
+ }), /*#__PURE__*/React__default["default"].createElement("polygon", {
1951
+ points: "10 6.63 8.94 5.57 7.58 6.93 6.21 5.57 5.15 6.63 6.52 7.99 5.15 9.35 6.21 10.43 7.58 9.06 8.94 10.43 10 9.35 8.64 7.99 10 6.63"
1952
+ })) : /*#__PURE__*/React__default["default"].createElement("svg", {
1953
+ xmlns: "http://www.w3.org/2000/svg",
1954
+ width: "10",
1955
+ height: "16",
1956
+ viewBox: "0 0 10 16",
1957
+ className: styles$1.icon,
1958
+ fill: "currentColor"
1959
+ }, /*#__PURE__*/React__default["default"].createElement("polygon", {
1960
+ points: "2.75 4.63 1.24 6 0 6 0 10 1.24 10 4.54 13 4.54 3 2.75 4.63"
1961
+ }), /*#__PURE__*/React__default["default"].createElement("circle", {
1962
+ cx: "6.14",
1963
+ cy: "8",
1964
+ r: ".99"
1965
+ }), /*#__PURE__*/React__default["default"].createElement("path", {
1966
+ d: "M6.14,11.88v-1.5c1.31,0,2.38-1.07,2.38-2.38s-1.07-2.38-2.38-2.38v-1.5c2.14,0,3.88,1.74,3.88,3.88s-1.74,3.88-3.88,3.88Z"
1967
+ })),
1968
+ "aria-label": muted ? intl.formatMessage({
1969
+ id: "RK/QEY",
1784
1970
  defaultMessage: [{
1785
1971
  "type": 0,
1786
- "value": "Mute"
1972
+ "value": "Unmute"
1787
1973
  }]
1788
- }),
1789
- "aria-label": intl.formatMessage({
1974
+ }) : intl.formatMessage({
1790
1975
  id: "vzg8Es",
1791
1976
  defaultMessage: [{
1792
1977
  "type": 0,
1793
1978
  "value": "Mute"
1794
1979
  }]
1795
- }),
1796
- tabIndex: controlsVisible || mediaHasAudio ? '0' : '-1'
1797
- }, /*#__PURE__*/React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, {
1798
- className: styles$1.icon,
1799
- icon: faVolumeUp.faVolumeUp
1800
- })));
1980
+ })
1981
+ }));
1801
1982
  }
1802
1983
 
1803
1984
  PlaybackControls.propTypes = propTypes$4;
@@ -1890,30 +2071,43 @@ function WebViewContainer(_ref) {
1890
2071
  WebViewContainer.propTypes = propTypes$3;
1891
2072
  WebViewContainer.defaultProps = defaultProps$3;
1892
2073
 
2074
+ var SPRING_CONFIG_TIGHT = {
2075
+ tension: 300,
2076
+ friction: 35
2077
+ }; // tight
2078
+
2079
+ var DRAG_PROGRESS_ACTIVATION_THRESHOLD = 0.3;
2080
+ var DRAG_VELOCITY_ACTIVATION_THRESHOLD = 0.3;
2081
+ var DEFAULT_TRANSITION_TYPE_LANDSCAPE = 'carousel';
2082
+ var DEFAULT_TRANSITION_TYPE_PORTRAIT = 'stack';
1893
2083
  var propTypes$2 = {
1894
- story: core$1.PropTypes.story,
2084
+ story: core.PropTypes.story,
1895
2085
  // .isRequired,
1896
2086
  basePath: PropTypes__default["default"].string,
1897
- theme: core$1.PropTypes.viewerTheme,
2087
+ theme: core.PropTypes.viewerTheme,
1898
2088
  width: PropTypes__default["default"].number,
1899
2089
  height: PropTypes__default["default"].number,
1900
2090
  screen: PropTypes__default["default"].string,
1901
2091
  screenState: PropTypes__default["default"].string,
1902
- deviceScreens: core$1.PropTypes.deviceScreens,
1903
- renderContext: core$1.PropTypes.renderContext,
1904
- visitor: core$1.PropTypes.visitor,
2092
+ deviceScreens: core.PropTypes.deviceScreens,
2093
+ renderContext: core.PropTypes.renderContext,
2094
+ visitor: core.PropTypes.visitor,
1905
2095
  onScreenChange: PropTypes__default["default"].func,
1906
2096
  tapNextScreenWidthPercent: PropTypes__default["default"].number,
1907
2097
  neighborScreensActive: PropTypes__default["default"].number,
1908
- neighborScreensMounted: PropTypes__default["default"].number,
1909
2098
  storyIsParsed: PropTypes__default["default"].bool,
1910
- landscapeScreenMargin: PropTypes__default["default"].number,
2099
+ // landscapeScreenMargin: PropTypes.number,
2100
+ // landscapeSmallScreenScale: PropTypes.number,
1911
2101
  withMetadata: PropTypes__default["default"].bool,
2102
+ withoutGestures: PropTypes__default["default"].bool,
1912
2103
  withoutMenu: PropTypes__default["default"].bool,
1913
2104
  withoutScreensMenu: PropTypes__default["default"].bool,
2105
+ withoutShareMenu: PropTypes__default["default"].bool,
1914
2106
  withoutMenuShadow: PropTypes__default["default"].bool,
1915
2107
  withoutFullscreen: PropTypes__default["default"].bool,
1916
- withLandscapeSiblingsScreens: PropTypes__default["default"].bool,
2108
+ withoutNavigationArrow: PropTypes__default["default"].bool,
2109
+ withoutTransitions: PropTypes__default["default"].bool,
2110
+ withNeighborScreens: PropTypes__default["default"].bool,
1917
2111
  withNavigationHint: PropTypes__default["default"].bool,
1918
2112
  withoutPlaybackControls: PropTypes__default["default"].bool,
1919
2113
  closeable: PropTypes__default["default"].bool,
@@ -1921,9 +2115,9 @@ var propTypes$2 = {
1921
2115
  onInteraction: PropTypes__default["default"].func,
1922
2116
  onEnd: PropTypes__default["default"].func,
1923
2117
  onViewModeChange: PropTypes__default["default"].func,
1924
- currentScreenMedia: core$1.PropTypes.ref,
2118
+ currentScreenMedia: core.PropTypes.ref,
1925
2119
  menuIsScreenWidth: PropTypes__default["default"].bool,
1926
- screensMedias: core$1.PropTypes.ref,
2120
+ screensMedias: core.PropTypes.ref,
1927
2121
  screenSizeOptions: PropTypes__default["default"].shape({
1928
2122
  withoutMaxSize: PropTypes__default["default"].bool,
1929
2123
  desktopHeightRatio: PropTypes__default["default"].number,
@@ -1945,16 +2139,20 @@ var defaultProps$2 = {
1945
2139
  onScreenChange: null,
1946
2140
  tapNextScreenWidthPercent: 0.8,
1947
2141
  neighborScreensActive: 1,
1948
- neighborScreensMounted: 1,
1949
2142
  storyIsParsed: false,
1950
- landscapeScreenMargin: 20,
2143
+ // landscapeScreenMargin: 20,
2144
+ // landscapeSmallScreenScale: 0.9,
1951
2145
  withMetadata: false,
2146
+ withNeighborScreens: false,
2147
+ withNavigationHint: false,
2148
+ withoutGestures: false,
1952
2149
  withoutMenu: false,
1953
2150
  withoutScreensMenu: false,
2151
+ withoutShareMenu: false,
1954
2152
  withoutMenuShadow: false,
1955
2153
  withoutFullscreen: false,
1956
- withLandscapeSiblingsScreens: false,
1957
- withNavigationHint: false,
2154
+ withoutTransitions: false,
2155
+ withoutNavigationArrow: false,
1958
2156
  withoutPlaybackControls: false,
1959
2157
  menuIsScreenWidth: false,
1960
2158
  closeable: false,
@@ -1983,15 +2181,17 @@ var Viewer = function Viewer(_ref) {
1983
2181
  visitor = _ref.visitor,
1984
2182
  tapNextScreenWidthPercent = _ref.tapNextScreenWidthPercent,
1985
2183
  neighborScreensActive = _ref.neighborScreensActive,
1986
- neighborScreensMounted = _ref.neighborScreensMounted,
1987
2184
  storyIsParsed = _ref.storyIsParsed,
1988
- landscapeScreenMargin = _ref.landscapeScreenMargin,
1989
2185
  withMetadata = _ref.withMetadata,
2186
+ withoutGestures = _ref.withoutGestures,
1990
2187
  withoutMenu = _ref.withoutMenu,
1991
2188
  withoutScreensMenu = _ref.withoutScreensMenu,
2189
+ withoutShareMenu = _ref.withoutShareMenu,
1992
2190
  withoutMenuShadow = _ref.withoutMenuShadow;
1993
2191
  _ref.withoutFullscreen;
1994
- var withLandscapeSiblingsScreens = _ref.withLandscapeSiblingsScreens,
2192
+ var withoutNavigationArrow = _ref.withoutNavigationArrow;
2193
+ _ref.withoutTransitions;
2194
+ var withNeighborScreens = _ref.withNeighborScreens,
1995
2195
  withNavigationHint = _ref.withNavigationHint,
1996
2196
  withoutPlaybackControls = _ref.withoutPlaybackControls,
1997
2197
  menuIsScreenWidth = _ref.menuIsScreenWidth,
@@ -2005,7 +2205,10 @@ var Viewer = function Viewer(_ref) {
2005
2205
  screensMedias = _ref.screensMedias,
2006
2206
  screenSizeOptions = _ref.screenSizeOptions,
2007
2207
  className = _ref.className;
2008
- var intl = reactIntl.useIntl();
2208
+
2209
+ /**
2210
+ * Screen Data + Processing
2211
+ */
2009
2212
  var parsedStory = hooks.useParsedStory(story, {
2010
2213
  disabled: storyIsParsed
2011
2214
  }) || {};
@@ -2017,20 +2220,59 @@ var Viewer = function Viewer(_ref) {
2017
2220
  metadata = _parsedStory$metadata === void 0 ? null : _parsedStory$metadata,
2018
2221
  _parsedStory$fonts = parsedStory.fonts,
2019
2222
  fonts = _parsedStory$fonts === void 0 ? null : _parsedStory$fonts;
2223
+ var screensCount = screens.length;
2020
2224
  var eventsManager = React.useMemo(function () {
2021
2225
  return new EventEmitter__default["default"]();
2022
- }, [parsedStory]); // Viewer Theme
2226
+ }, [parsedStory]);
2227
+ var screenIndex = React.useMemo(function () {
2228
+ return Math.max(0, screens.findIndex(function (it) {
2229
+ return "".concat(it.id) === "".concat(screenId);
2230
+ }));
2231
+ }, [screenId, screens]);
2232
+ var currentScreen = screens[screenIndex] || null;
2233
+
2234
+ var _ref2 = currentScreen || {},
2235
+ screenParameters = _ref2.parameters;
2236
+
2237
+ var _ref3 = screenParameters || {},
2238
+ screenMetadata = _ref3.metadata;
2239
+
2240
+ var _ref4 = screenMetadata || {},
2241
+ _ref4$title = _ref4.title,
2242
+ screenTitle = _ref4$title === void 0 ? null : _ref4$title,
2243
+ _ref4$description = _ref4.description,
2244
+ screenDescription = _ref4$description === void 0 ? null : _ref4$description;
2245
+
2246
+ var finalTitle = screenTitle !== null ? screenTitle : title;
2247
+ var finalMetadata = React.useMemo(function () {
2248
+ return screenDescription !== null ? _objectSpread__default["default"](_objectSpread__default["default"]({}, metadata), {}, {
2249
+ description: screenDescription
2250
+ }) : metadata;
2251
+ }, [metadata, screenDescription]);
2252
+ var screensMediasRef = React.useRef([]);
2253
+
2254
+ if (currentScreenMedia !== null) {
2255
+ currentScreenMedia.current = screensMediasRef.current[screenIndex] || null;
2256
+ }
2257
+
2258
+ if (screensMedias !== null) {
2259
+ screensMedias.current = screensMediasRef.current;
2260
+ }
2261
+ /**
2262
+ * Screen Layout
2263
+ */
2023
2264
 
2024
- var _ref2 = viewerTheme || {},
2025
- textStyles = _ref2.textStyles;
2026
2265
 
2027
- var _ref3 = textStyles || {},
2028
- _ref3$title = _ref3.title,
2029
- themeTextStyle = _ref3$title === void 0 ? null : _ref3$title;
2266
+ var _ref5 = viewerTheme || {},
2267
+ textStyles = _ref5.textStyles;
2030
2268
 
2031
- var _ref4 = themeTextStyle || {},
2032
- _ref4$fontFamily = _ref4.fontFamily,
2033
- themeFont = _ref4$fontFamily === void 0 ? null : _ref4$fontFamily; // Fonts
2269
+ var _ref6 = textStyles || {},
2270
+ _ref6$title = _ref6.title,
2271
+ themeTextStyle = _ref6$title === void 0 ? null : _ref6$title;
2272
+
2273
+ var _ref7 = themeTextStyle || {},
2274
+ _ref7$fontFamily = _ref7.fontFamily,
2275
+ themeFont = _ref7$fontFamily === void 0 ? null : _ref7$fontFamily; // Fonts
2034
2276
 
2035
2277
 
2036
2278
  var finalFonts = React.useMemo(function () {
@@ -2057,8 +2299,12 @@ var Viewer = function Viewer(_ref) {
2057
2299
  _usePlaybackContext$m = _usePlaybackContext.media,
2058
2300
  playbackMedia = _usePlaybackContext$m === void 0 ? null : _usePlaybackContext$m;
2059
2301
 
2060
- var trackScreenView = hooks.useTrackScreenView();
2061
- var contentRef = React.useRef(null); // Get screen size
2302
+ var _useDimensionObserver = hooks.useDimensionObserver(),
2303
+ playbackControlsContainerRef = _useDimensionObserver.ref,
2304
+ _useDimensionObserver2 = _useDimensionObserver.height,
2305
+ playbackControlsContainerHeight = _useDimensionObserver2 === void 0 ? 0 : _useDimensionObserver2;
2306
+
2307
+ var trackScreenView = hooks.useTrackScreenView(); // Get screen size
2062
2308
 
2063
2309
  var _useScreenSizeFromEle = hooks.useScreenSizeFromElement(_objectSpread__default["default"]({
2064
2310
  width: width,
@@ -2069,21 +2315,26 @@ var Viewer = function Viewer(_ref) {
2069
2315
  screenSize = _useScreenSizeFromEle.screenSize,
2070
2316
  screenScale = _useScreenSizeFromEle.scale;
2071
2317
 
2072
- var _ref5 = screenSize || {},
2073
- _ref5$width = _ref5.width,
2074
- screenWidth = _ref5$width === void 0 ? null : _ref5$width,
2075
- _ref5$height = _ref5.height,
2076
- screenHeight = _ref5$height === void 0 ? null : _ref5$height,
2077
- _ref5$landscape = _ref5.landscape,
2078
- landscape = _ref5$landscape === void 0 ? false : _ref5$landscape,
2079
- _ref5$menuOverScreen = _ref5.menuOverScreen,
2080
- menuOverScreen = _ref5$menuOverScreen === void 0 ? false : _ref5$menuOverScreen;
2318
+ var _ref8 = screenSize || {},
2319
+ _ref8$width = _ref8.width,
2320
+ screenWidth = _ref8$width === void 0 ? null : _ref8$width,
2321
+ _ref8$height = _ref8.height,
2322
+ screenHeight = _ref8$height === void 0 ? null : _ref8$height,
2323
+ _ref8$landscape = _ref8.landscape,
2324
+ landscape = _ref8$landscape === void 0 ? false : _ref8$landscape,
2325
+ _ref8$menuOverScreen = _ref8.menuOverScreen,
2326
+ menuOverScreen = _ref8$menuOverScreen === void 0 ? false : _ref8$menuOverScreen;
2081
2327
 
2082
2328
  var screenContainerWidth = screenScale !== null ? screenWidth * screenScale : screenWidth;
2083
2329
  var screenContainerHeight = screenScale !== null ? screenHeight * screenScale : screenHeight;
2084
2330
  var hasSize = screenWidth > 0 && screenHeight > 0;
2085
- var ready = hasSize; // && fontsLoaded;
2086
-
2331
+ var ready = hasSize;
2332
+ var trackingEnabled = isView;
2333
+ React.useEffect(function () {
2334
+ if (trackingEnabled && currentScreen !== null) {
2335
+ trackScreenView(currentScreen, screenIndex);
2336
+ }
2337
+ }, [currentScreen, trackScreenView, trackingEnabled]);
2087
2338
  React.useEffect(function () {
2088
2339
  if (ready && onViewModeChange !== null) {
2089
2340
  onViewModeChange({
@@ -2092,21 +2343,14 @@ var Viewer = function Viewer(_ref) {
2092
2343
  });
2093
2344
  }
2094
2345
  }, [ready, landscape, menuOverScreen, onViewModeChange]);
2095
- var screensMediasRef = React.useRef([]); // Screen index
2096
-
2097
- var screenIndex = React.useMemo(function () {
2098
- return Math.max(0, screens.findIndex(function (it) {
2099
- return "".concat(it.id) === "".concat(screenId);
2100
- }));
2101
- }, [screenId, screens]);
2102
-
2103
- if (currentScreenMedia !== null) {
2104
- currentScreenMedia.current = screensMediasRef.current[screenIndex] || null;
2105
- }
2346
+ /**
2347
+ * Screen Transitions
2348
+ */
2106
2349
 
2107
- if (screensMedias !== null) {
2108
- screensMedias.current = screensMediasRef.current;
2109
- }
2350
+ var transitionType = landscape && withNeighborScreens ? DEFAULT_TRANSITION_TYPE_LANDSCAPE : DEFAULT_TRANSITION_TYPE_PORTRAIT;
2351
+ /**
2352
+ * Screen Navigation
2353
+ */
2110
2354
 
2111
2355
  var changeIndex = React.useCallback(function (index) {
2112
2356
  if (index === screenIndex) {
@@ -2120,23 +2364,37 @@ var Viewer = function Viewer(_ref) {
2120
2364
  if (onScreenChange !== null) {
2121
2365
  onScreenChange(screens[index], index);
2122
2366
  }
2123
- }, [screenIndex, screens, onScreenChange]); // Track screen view
2367
+ }, [screenIndex, screens, onScreenChange]);
2368
+ var onScreenNavigate = React.useCallback(function (_ref9) {
2369
+ var index = _ref9.index,
2370
+ newIndex = _ref9.newIndex,
2371
+ end = _ref9.end,
2372
+ direction = _ref9.direction;
2124
2373
 
2125
- var trackingEnabled = isView;
2126
- var currentScreen = screens[screenIndex] || null;
2127
- React.useEffect(function () {
2128
- if (trackingEnabled && currentScreen !== null) {
2129
- trackScreenView(currentScreen, screenIndex);
2374
+ if (end && onEnd !== null) {
2375
+ onEnd();
2130
2376
  }
2131
- }, [currentScreen, trackScreenView, trackingEnabled]); // Handle interaction enable
2132
2377
 
2378
+ changeIndex(newIndex);
2379
+ eventsManager.emit('navigate', {
2380
+ index: index,
2381
+ newIndex: newIndex,
2382
+ direction: direction,
2383
+ end: end
2384
+ });
2385
+
2386
+ if (end) {
2387
+ eventsManager.emit('navigate_end');
2388
+ } else {
2389
+ eventsManager.emit("navigate_".concat(direction), newIndex);
2390
+ }
2391
+ }, [onEnd, changeIndex]);
2133
2392
  var gotoPreviousScreen = React.useCallback(function () {
2134
2393
  changeIndex(Math.max(0, screenIndex - 1));
2135
- }, [changeIndex]);
2394
+ }, [changeIndex, screenIndex]);
2136
2395
  var gotoNextScreen = React.useCallback(function () {
2137
2396
  changeIndex(Math.min(screens.length - 1, screenIndex + 1));
2138
- }, [changeIndex]);
2139
- var screensCount = screens.length;
2397
+ }, [changeIndex, screenIndex]);
2140
2398
 
2141
2399
  var _useState = React.useState(false),
2142
2400
  _useState2 = _slicedToArray__default["default"](_useState, 2),
@@ -2152,37 +2410,12 @@ var Viewer = function Viewer(_ref) {
2152
2410
  setHasInteracted(true);
2153
2411
  }
2154
2412
  }, [onInteraction, hasInteracted, setHasInteracted]);
2155
- var onScreenNavigate = React.useCallback(function (_ref6) {
2156
- var index = _ref6.index,
2157
- newIndex = _ref6.newIndex,
2158
- end = _ref6.end,
2159
- direction = _ref6.direction;
2160
-
2161
- if (end && onEnd !== null) {
2162
- onEnd();
2163
- }
2164
-
2165
- changeIndex(newIndex);
2166
- eventsManager.emit('navigate', {
2167
- newIndex: newIndex,
2168
- index: index,
2169
- direction: direction,
2170
- end: end
2171
- });
2172
-
2173
- if (end) {
2174
- eventsManager.emit('navigate_end');
2175
- } else {
2176
- eventsManager.emit("navigate_".concat(direction), newIndex);
2177
- }
2178
- }, [onEnd, changeIndex]);
2179
2413
 
2180
2414
  var _useScreenInteraction = useScreenInteraction({
2181
2415
  screens: screens,
2182
2416
  screenIndex: screenIndex,
2183
2417
  screenWidth: screenContainerWidth,
2184
2418
  disableCurrentScreenNavigation: !isView,
2185
- clickOnSiblings: landscape && withLandscapeSiblingsScreens,
2186
2419
  nextScreenWidthPercent: tapNextScreenWidthPercent,
2187
2420
  onInteract: onInteractionPrivate,
2188
2421
  onNavigate: onScreenNavigate
@@ -2190,102 +2423,127 @@ var Viewer = function Viewer(_ref) {
2190
2423
  interactWithScreen = _useScreenInteraction.interact,
2191
2424
  currentScreenInteractionEnabled = _useScreenInteraction.currentScreenInteractionEnabled,
2192
2425
  enableInteraction = _useScreenInteraction.enableInteraction,
2193
- disableInteraction = _useScreenInteraction.disableInteraction; // Handle tap on screens
2194
-
2195
-
2196
- var onDragScreen = React.useCallback(function (_ref7) {
2197
- var _ref7$args = _slicedToArray__default["default"](_ref7.args, 1),
2198
- tapScreenIndex = _ref7$args[0],
2199
- event = _ref7.event,
2200
- target = _ref7.target,
2201
- currentTarget = _ref7.currentTarget,
2202
- tap = _ref7.tap,
2203
- _ref7$xy = _slicedToArray__default["default"](_ref7.xy, 2),
2204
- x = _ref7$xy[0],
2205
- y = _ref7$xy[1];
2206
-
2207
- if (tap) {
2208
- interactWithScreen({
2209
- event: event,
2210
- target: target,
2211
- currentTarget: currentTarget,
2212
- index: tapScreenIndex,
2213
- x: x,
2214
- y: y
2215
- });
2216
- }
2217
- }, [interactWithScreen]);
2218
- var dragScreenBind = react.useDrag(onDragScreen, {
2219
- filterTaps: true
2220
- }); // Handles tap when landscape (space around current screen)
2221
-
2222
- var onDragContent = React.useCallback(function (_ref8) {
2223
- var tap = _ref8.tap,
2224
- target = _ref8.target,
2225
- currentTarget = _ref8.currentTarget,
2226
- _ref8$xy = _slicedToArray__default["default"](_ref8.xy, 1),
2227
- x = _ref8$xy[0];
2228
-
2229
- if (!landscape || withLandscapeSiblingsScreens || target !== contentRef.current) {
2230
- return;
2426
+ disableInteraction = _useScreenInteraction.disableInteraction;
2427
+
2428
+ var onTap = React.useCallback(function (_ref10) {
2429
+ var currentTarget = _ref10.currentTarget,
2430
+ event = _ref10.event,
2431
+ target = _ref10.target,
2432
+ _ref10$xy = _slicedToArray__default["default"](_ref10.xy, 2),
2433
+ x = _ref10$xy[0],
2434
+ y = _ref10$xy[1];
2435
+
2436
+ interactWithScreen({
2437
+ event: event,
2438
+ target: target,
2439
+ currentTarget: currentTarget,
2440
+ index: screenIndex,
2441
+ x: x,
2442
+ y: y
2443
+ });
2444
+ }, [interactWithScreen, screenIndex]);
2445
+ var computeScreenProgress = React.useCallback(function (_ref11) {
2446
+ var active = _ref11.active,
2447
+ _ref11$movement = _slicedToArray__default["default"](_ref11.movement, 1),
2448
+ mx = _ref11$movement[0],
2449
+ _ref11$velocity = _slicedToArray__default["default"](_ref11.velocity, 1),
2450
+ vx = _ref11$velocity[0];
2451
+
2452
+ var p = mx / screenContainerWidth; // drag "ratio": how much of the screen width has been swiped?
2453
+
2454
+ var forwards = mx < 0; // true if swiping to left (to navigate forwards)
2455
+
2456
+ var newIndex = !forwards ? screenIndex - 1 : screenIndex + 1; // which item index are we moving towards?
2457
+
2458
+ var reachedThreshold = vx > DRAG_VELOCITY_ACTIVATION_THRESHOLD || Math.abs(p) > DRAG_PROGRESS_ACTIVATION_THRESHOLD;
2459
+ var reachedBounds = newIndex < 0 || newIndex >= screensCount; // have we reached the end of the stack?
2460
+
2461
+ var damper = reachedBounds ? 0.1 : 1;
2462
+ var progress = Math.max(-1, Math.min(1, p * damper));
2463
+
2464
+ if (!active) {
2465
+ return reachedThreshold && !reachedBounds ? newIndex : screenIndex;
2231
2466
  }
2232
2467
 
2233
- if (tap) {
2234
- var _currentTarget$getBou = currentTarget.getBoundingClientRect(),
2235
- _currentTarget$getBou2 = _currentTarget$getBou.left,
2236
- contentX = _currentTarget$getBou2 === void 0 ? 0 : _currentTarget$getBou2,
2237
- _currentTarget$getBou3 = _currentTarget$getBou.width,
2238
- contentWidth = _currentTarget$getBou3 === void 0 ? 0 : _currentTarget$getBou3;
2468
+ return screenIndex - progress;
2469
+ }, [screenContainerWidth, screenIndex]);
2470
+ var onScreenProgress = React.useCallback(function (progress, _ref12) {
2471
+ var active = _ref12.active;
2472
+ var delta = Math.abs(progress - screenIndex);
2473
+ var reachedBounds = progress < 0 || progress >= screensCount; // have we reached the end of the stack?
2239
2474
 
2240
- var hasTappedLeft = x - contentX < contentWidth * 0.5;
2241
- var nextIndex = hasTappedLeft ? Math.max(0, screenIndex - 1) : Math.min(screensCount - 1, screenIndex + 1);
2475
+ if (!active && delta === 1 && !reachedBounds) {
2242
2476
  onScreenNavigate({
2243
2477
  index: screenIndex,
2244
- newIndex: nextIndex
2478
+ newIndex: progress
2245
2479
  });
2246
2480
  }
2247
- }, [screenIndex, screensCount, landscape, withLandscapeSiblingsScreens]);
2248
- var dragContentBind = react.useDrag(onDragContent, {
2249
- filterTaps: true
2250
- });
2251
- var onScreenKeyUp = React.useCallback(function (_ref9, i) {
2252
- var key = _ref9.key;
2481
+ }, [onScreenNavigate, screenIndex]);
2482
+ var springParams = React.useMemo(function () {
2483
+ return {
2484
+ config: SPRING_CONFIG_TIGHT
2485
+ };
2486
+ }, []);
2487
+
2488
+ var _useDragProgress = hooks.useDragProgress({
2489
+ progress: screenIndex,
2490
+ disabled: !isView,
2491
+ dragDisabled: withoutGestures,
2492
+ computeProgress: computeScreenProgress,
2493
+ onProgress: onScreenProgress,
2494
+ onTap: onTap,
2495
+ springParams: springParams
2496
+ }),
2497
+ isDragging = _useDragProgress.dragging,
2498
+ screenIndexProgress = _useDragProgress.progress,
2499
+ dragContentBind = _useDragProgress.bind;
2500
+
2501
+ var getScreenStylesByIndex = function getScreenStylesByIndex(index, progress) {
2502
+ if (transitionType === 'stack') {
2503
+ var _t = index - progress;
2504
+
2505
+ var _clamped = Math.min(1, Math.max(0, _t));
2253
2506
 
2254
- if (key === 'Enter' && withLandscapeSiblingsScreens && landscape && i !== screenIndex) {
2255
- changeIndex(i);
2507
+ var invert = Math.min(1, Math.max(0, -_t));
2508
+ var opacity = Math.max(0, 1 - 0.75 * invert + (_t + 1));
2509
+ return {
2510
+ opacity: opacity,
2511
+ transform: "translateX(".concat(_clamped * 100, "%) scale(").concat(1 - 0.2 * invert, ")"),
2512
+ boxShadow: "0 0 ".concat(4 * (1 - _clamped), "rem ").concat(-0.5 * (1 - _clamped), "rem black"),
2513
+ zIndex: index
2514
+ };
2256
2515
  }
2257
- }, [withLandscapeSiblingsScreens, changeIndex, landscape, screenIndex]); // swipe menu open
2258
2516
 
2259
- var menuVisible = screensCount === 0 || currentScreenInteractionEnabled;
2517
+ var t = index - progress;
2518
+ var clamped = Math.min(1, Math.max(0, Math.abs(t)));
2519
+ return {
2520
+ opacity: 1 - 0.75 * clamped,
2521
+ transform: "translateX(".concat(t * 105, "%) scale(").concat(1 - 0.2 * clamped, ")"),
2522
+ zIndex: screensCount - index
2523
+ };
2524
+ };
2260
2525
 
2261
- var _useState3 = React.useState(false),
2262
- _useState4 = _slicedToArray__default["default"](_useState3, 2),
2263
- menuOpened = _useState4[0],
2264
- setMenuOpened = _useState4[1];
2265
-
2266
- var onMenuRequestOpen = React.useCallback(function () {
2267
- return setMenuOpened(true);
2268
- }, [setMenuOpened]);
2269
- var onMenuRequestClose = React.useCallback(function () {
2270
- return setMenuOpened(false);
2271
- }, [setMenuOpened]);
2272
- var onClickMenu = React.useCallback(function () {
2273
- onInteractionPrivate();
2274
- setMenuOpened(true);
2275
- }, [changeIndex, onInteractionPrivate, setMenuOpened]);
2276
- var onClickMenuItem = React.useCallback(function (_ref10) {
2277
- var itemScreenId = _ref10.screenId;
2526
+ var _useFullscreen = hooks.useFullscreen(containerRef.current || null),
2527
+ toggleFullscreen = _useFullscreen.toggle,
2528
+ fullscreenActive = _useFullscreen.active,
2529
+ fullscreenEnabled = _useFullscreen.enabled;
2530
+
2531
+ var menuVisible = screensCount === 0 || currentScreenInteractionEnabled; // Get element height
2532
+
2533
+ var _useDimensionObserver3 = hooks.useDimensionObserver(),
2534
+ menuDotsContainerRef = _useDimensionObserver3.ref,
2535
+ _useDimensionObserver4 = _useDimensionObserver3.height,
2536
+ menuDotsContainerHeight = _useDimensionObserver4 === void 0 ? 0 : _useDimensionObserver4;
2537
+
2538
+ var onClickScreen = React.useCallback(function (_ref13) {
2539
+ var itemScreenId = _ref13.screenId;
2278
2540
  onInteractionPrivate();
2279
- var index = screens.findIndex(function (_ref11) {
2280
- var id = _ref11.id;
2541
+ var index = screens.findIndex(function (_ref14) {
2542
+ var id = _ref14.id;
2281
2543
  return id === itemScreenId;
2282
2544
  });
2283
2545
  changeIndex(index);
2284
-
2285
- if (menuOpened) {
2286
- setMenuOpened(false);
2287
- }
2288
- }, [onInteractionPrivate, changeIndex, menuOpened, setMenuOpened]);
2546
+ }, [onInteractionPrivate, changeIndex]);
2289
2547
  var onContextMenu = React.useCallback(function (e) {
2290
2548
  if (!landscape) {
2291
2549
  e.preventDefault();
@@ -2293,28 +2551,16 @@ var Viewer = function Viewer(_ref) {
2293
2551
  }
2294
2552
 
2295
2553
  return true;
2296
- }, [landscape]);
2554
+ }, [landscape]); // hmm?
2555
+
2297
2556
  var overscrollStyle = /*#__PURE__*/React__default["default"].createElement("style", {
2298
2557
  type: "text/css"
2299
- }, "body { overscroll-behavior: contain; }"); // Fullscreen
2300
-
2301
- var _useFullscreen = hooks.useFullscreen(containerRef.current || null),
2302
- toggleFullscreen = _useFullscreen.toggle,
2303
- fullscreenActive = _useFullscreen.active,
2304
- fullscreenEnabled = _useFullscreen.enabled; // Keyboard Events
2305
-
2306
-
2558
+ }, "body { overscroll-behavior: contain; }");
2307
2559
  var keyboardShortcuts = React.useMemo(function () {
2308
2560
  return {
2309
2561
  f: function f() {
2310
2562
  return toggleFullscreen();
2311
2563
  },
2312
- m: function m() {
2313
- return setMenuOpened(!menuOpened);
2314
- },
2315
- escape: function escape() {
2316
- return setMenuOpened(false);
2317
- },
2318
2564
  arrowleft: function arrowleft() {
2319
2565
  return gotoPreviousScreen();
2320
2566
  },
@@ -2325,55 +2571,10 @@ var Viewer = function Viewer(_ref) {
2325
2571
  return gotoNextScreen();
2326
2572
  }
2327
2573
  };
2328
- }, [menuOpened, setMenuOpened, gotoPreviousScreen, gotoNextScreen]);
2574
+ }, [gotoPreviousScreen, gotoNextScreen]);
2329
2575
  useKeyboardShortcuts(keyboardShortcuts, {
2330
2576
  disabled: renderContext !== 'view'
2331
2577
  });
2332
-
2333
- var _ref12 = currentScreen || {},
2334
- screenParameters = _ref12.parameters;
2335
-
2336
- var _ref13 = screenParameters || {},
2337
- screenMetadata = _ref13.metadata;
2338
-
2339
- var _ref14 = screenMetadata || {},
2340
- _ref14$title = _ref14.title,
2341
- screenTitle = _ref14$title === void 0 ? null : _ref14$title,
2342
- _ref14$description = _ref14.description,
2343
- screenDescription = _ref14$description === void 0 ? null : _ref14$description;
2344
-
2345
- var finalTitle = screenTitle !== null ? screenTitle : title;
2346
- var finalMetadata = React.useMemo(function () {
2347
- return screenDescription !== null ? _objectSpread__default["default"](_objectSpread__default["default"]({}, metadata), {}, {
2348
- description: screenDescription
2349
- }) : metadata;
2350
- }, [metadata, screenDescription]); // Get element height
2351
-
2352
- var _useDimensionObserver = hooks.useDimensionObserver(),
2353
- menuDotsContainerRef = _useDimensionObserver.ref,
2354
- _useDimensionObserver2 = _useDimensionObserver.height,
2355
- menuDotsContainerHeight = _useDimensionObserver2 === void 0 ? 0 : _useDimensionObserver2;
2356
-
2357
- var _useDimensionObserver3 = hooks.useDimensionObserver(),
2358
- playbackControlsContainerRef = _useDimensionObserver3.ref,
2359
- _useDimensionObserver4 = _useDimensionObserver3.height,
2360
- playbackControlsContainerHeight = _useDimensionObserver4 === void 0 ? 0 : _useDimensionObserver4;
2361
-
2362
- var _useMemo = React.useMemo(function () {
2363
- return neighborScreensMounted !== null ? {
2364
- startIndex: Math.max(screenIndex - (neighborScreensActive + neighborScreensMounted), 0),
2365
- endIndex: Math.min(screenIndex + (neighborScreensActive + neighborScreensMounted), screensCount)
2366
- } : {
2367
- startIndex: 0,
2368
- endIndex: screensCount - 1
2369
- };
2370
- }, [screenIndex, neighborScreensActive, neighborScreensMounted, screensCount]),
2371
- mountedScreenStartIndex = _useMemo.startIndex,
2372
- mountedScreenEndIndex = _useMemo.endIndex;
2373
-
2374
- var mountedScreens = React.useMemo(function () {
2375
- return neighborScreensMounted != null ? screens.slice(mountedScreenStartIndex, mountedScreenEndIndex) : screens;
2376
- }, [screens, mountedScreenStartIndex, mountedScreenEndIndex, neighborScreensActive, neighborScreensMounted]);
2377
2578
  return /*#__PURE__*/React__default["default"].createElement(contexts.VisitorProvider, {
2378
2579
  visitor: visitor
2379
2580
  }, /*#__PURE__*/React__default["default"].createElement(contexts.ScreenSizeProvider, {
@@ -2398,13 +2599,12 @@ var Viewer = function Viewer(_ref) {
2398
2599
  }), /*#__PURE__*/React__default["default"].createElement("div", {
2399
2600
  className: classNames__default["default"]([styles$6.container, screenSize.screens.map(function (screenName) {
2400
2601
  return "story-screen-".concat(screenName);
2401
- }), (_ref15 = {}, _defineProperty__default["default"](_ref15, styles$6.landscape, landscape), _defineProperty__default["default"](_ref15, styles$6.withSiblings, withLandscapeSiblingsScreens), _defineProperty__default["default"](_ref15, styles$6.hideMenu, !menuVisible), _defineProperty__default["default"](_ref15, styles$6.ready, ready || withoutScreensTransforms), _defineProperty__default["default"](_ref15, styles$6.hasInteracted, hasInteracted), _defineProperty__default["default"](_ref15, className, className), _ref15)]),
2602
+ }), (_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)]),
2402
2603
  ref: containerRef,
2403
2604
  onContextMenu: onContextMenu
2404
2605
  }, !withoutMenu ? /*#__PURE__*/React__default["default"].createElement(ViewerMenu, {
2405
2606
  story: parsedStory,
2406
2607
  currentScreenIndex: screenIndex,
2407
- opened: menuOpened,
2408
2608
  withShadow: menuOverScreen && !withoutMenuShadow,
2409
2609
  toggleFullscreen: toggleFullscreen,
2410
2610
  fullscreenActive: fullscreenActive,
@@ -2414,93 +2614,64 @@ var Viewer = function Viewer(_ref) {
2414
2614
  screenSize: screenSize,
2415
2615
  menuWidth: menuIsScreenWidth ? screenContainerWidth : null,
2416
2616
  trackingEnabled: trackingEnabled,
2417
- onClickItem: onClickMenuItem,
2418
- onClickMenu: onClickMenu,
2617
+ onClickScreen: onClickScreen,
2419
2618
  onClickCloseViewer: onCloseViewer,
2420
- onRequestOpen: onMenuRequestOpen,
2421
- onRequestClose: onMenuRequestClose,
2422
2619
  withDotItemClick: screenContainerWidth > 400,
2423
2620
  withoutScreensMenu: withoutScreensMenu,
2621
+ withoutShareMenu: withoutShareMenu,
2424
2622
  refDots: menuDotsContainerRef
2425
2623
  }) : null, ready || withoutScreensTransforms ? /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
2426
- ref: contentRef,
2427
2624
  className: styles$6.content
2428
- }, dragContentBind()), mountedScreens.map(function (mountedScreen, mountedIndex) {
2429
- var _ref16;
2430
-
2431
- var i = mountedScreenStartIndex + mountedIndex;
2432
- var current = i === parseInt(screenIndex, 10);
2433
- var active = i >= screenIndex - neighborScreensActive && i <= screenIndex + neighborScreensActive;
2434
- var screenTransform = null;
2435
-
2436
- if (landscape) {
2437
- screenTransform = withLandscapeSiblingsScreens ? "translateX(calc(".concat((screenContainerWidth + landscapeScreenMargin) * (i - screenIndex), "px - 50%)) scale(").concat(current ? 1 : 0.9, ")") : null;
2438
- } else {
2439
- screenTransform = "translateX(".concat(current ? 0 : '100%', ")");
2625
+ }, dragContentBind()), !withoutNavigationArrow && !withNeighborScreens && screenIndex > 0 && screens.length > 1 ? /*#__PURE__*/React__default["default"].createElement(NavigationButton, {
2626
+ direction: "previous",
2627
+ className: classNames__default["default"]([styles$6.navButton, styles$6.previous]),
2628
+ onClick: gotoPreviousScreen
2629
+ }) : null, /*#__PURE__*/React__default["default"].createElement("div", {
2630
+ className: styles$6.screensFrame,
2631
+ style: {
2632
+ width: screenContainerWidth,
2633
+ height: screenContainerHeight,
2634
+ overflow: !withNeighborScreens ? 'hidden' : null
2440
2635
  }
2636
+ }, screens.map(function (screen, i) {
2637
+ // const current = i === parseInt(screenIndex, 10);
2638
+ var current = i === Math.round(screenIndexProgress); // base current on transition
2441
2639
 
2442
- return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, {
2443
- key: "screen-viewer-".concat(mountedScreen.id || '', "-").concat(i + 1)
2444
- }, /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
2445
- style: {
2446
- width: screenContainerWidth,
2447
- height: screenContainerHeight,
2448
- transform: !withoutScreensTransforms ? screenTransform : null
2449
- },
2450
- className: classNames__default["default"]([styles$6.screenContainer, (_ref16 = {}, _defineProperty__default["default"](_ref16, styles$6.current, current), _defineProperty__default["default"](_ref16, styles$6.visible, current || withLandscapeSiblingsScreens), _ref16)]) // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex
2451
- ,
2452
- tabIndex: !active ? -1 : null,
2453
- "aria-hidden": !current,
2454
- "aria-label": intl.formatMessage({
2455
- id: "LkVfwW",
2456
- defaultMessage: [{
2457
- "type": 0,
2458
- "value": "Screen "
2459
- }, {
2460
- "type": 1,
2461
- "value": "index"
2462
- }]
2463
- }, {
2464
- index: i + 1
2465
- }),
2466
- onKeyUp: function onKeyUp(e) {
2467
- return onScreenKeyUp(e, i);
2468
- }
2469
- }, dragScreenBind(i)), current && screenIndex > 0 ? /*#__PURE__*/React__default["default"].createElement(NavigationButton, {
2470
- direction: "previous",
2471
- className: classNames__default["default"]([styles$6.navButton, styles$6.previous]),
2472
- onClick: gotoPreviousScreen
2473
- }) : null, mountedScreen !== null ? /*#__PURE__*/React__default["default"].createElement(ViewerScreen, {
2640
+ var active = i >= screenIndex - neighborScreensActive && i <= screenIndex + neighborScreensActive;
2641
+ var defaultStyles = {
2642
+ opacity: current ? 1 : 0
2643
+ };
2644
+ var screenStyles = active ? getScreenStylesByIndex(i, screenIndexProgress) : defaultStyles;
2645
+ return /*#__PURE__*/React__default["default"].createElement("div", {
2646
+ key: "screen-viewer-".concat(screen.id || '', "-").concat(i + 1),
2647
+ style: screenStyles,
2648
+ className: classNames__default["default"]([styles$6.screenContainer, _defineProperty__default["default"]({}, styles$6.current, current)])
2649
+ }, screen !== null && active ? /*#__PURE__*/React__default["default"].createElement(ViewerScreen, {
2474
2650
  className: styles$6.screen,
2475
- screen: mountedScreen,
2651
+ screen: screen,
2476
2652
  screenState: current ? screenState : null,
2477
- renderContext: renderContext,
2478
2653
  index: i,
2479
2654
  current: current,
2480
2655
  active: active,
2481
2656
  mediaRef: function mediaRef(ref) {
2482
2657
  screensMediasRef.current[i] = ref;
2483
2658
  },
2659
+ renderContext: renderContext,
2484
2660
  width: screenWidth,
2485
2661
  height: screenHeight,
2486
2662
  scale: screenScale,
2487
- withNavigationHint: withNavigationHint && !withLandscapeSiblingsScreens && current && screenIndex === 0 && !hasInteracted
2488
- }) : null, current && screenIndex < screens.length - 1 ? /*#__PURE__*/React__default["default"].createElement(NavigationButton, {
2489
- direction: "next",
2490
- className: classNames__default["default"]([styles$6.navButton, styles$6.next]),
2491
- onClick: gotoNextScreen
2492
- }) : null));
2493
- }), !withoutPlaybackControls ? /*#__PURE__*/React__default["default"].createElement("div", {
2663
+ withNavigationHint: withNavigationHint && !withNeighborScreens && current && screenIndex === 0 && !hasInteracted
2664
+ }) : null);
2665
+ })), !withoutNavigationArrow && !withNeighborScreens && screenIndex < screens.length - 1 ? /*#__PURE__*/React__default["default"].createElement(NavigationButton, {
2666
+ direction: "next",
2667
+ className: classNames__default["default"]([styles$6.navButton, styles$6.next]),
2668
+ onClick: gotoNextScreen
2669
+ }) : null, !withoutPlaybackControls ? /*#__PURE__*/React__default["default"].createElement("div", {
2494
2670
  className: styles$6.playbackControls,
2495
2671
  ref: playbackControlsContainerRef
2496
- }, /*#__PURE__*/React__default["default"].createElement("div", {
2497
- className: styles$6.playbackControlsContainer,
2498
- style: {
2499
- width: screenContainerWidth
2500
- }
2501
2672
  }, /*#__PURE__*/React__default["default"].createElement(PlaybackControls, {
2502
2673
  className: styles$6.controls
2503
- }))) : null) : null, /*#__PURE__*/React__default["default"].createElement(WebViewContainer, {
2674
+ })) : null) : null, /*#__PURE__*/React__default["default"].createElement(WebViewContainer, {
2504
2675
  className: styles$6.webView,
2505
2676
  style: {
2506
2677
  maxWidth: Math.max(screenContainerWidth, 600)
@@ -2513,7 +2684,7 @@ Viewer.defaultProps = defaultProps$2;
2513
2684
 
2514
2685
  var _excluded$1 = ["story", "pathWithIndex", "children", "onScreenChange"];
2515
2686
  var propTypes$1 = {
2516
- story: core$1.PropTypes.story,
2687
+ story: core.PropTypes.story,
2517
2688
  // .isRequired,
2518
2689
  pathWithIndex: PropTypes__default["default"].bool,
2519
2690
  children: PropTypes__default["default"].func,
@@ -2590,7 +2761,7 @@ var defaultRoutes = {
2590
2761
 
2591
2762
  var _excluded = ["story", "screenComponents", "memoryRouter", "basePath", "routes", "withoutRouter", "googleApiKey", "trackingVariables", "locale", "locales", "translations", "pathWithIndex"];
2592
2763
  var propTypes = {
2593
- story: core$1.PropTypes.story,
2764
+ story: core.PropTypes.story,
2594
2765
  screen: PropTypes__default["default"].string,
2595
2766
  screenComponents: PropTypes__default["default"].objectOf(PropTypes__default["default"].elementType),
2596
2767
  memoryRouter: PropTypes__default["default"].bool,
@@ -2598,7 +2769,7 @@ var propTypes = {
2598
2769
  routes: routes,
2599
2770
  withoutRouter: PropTypes__default["default"].bool,
2600
2771
  googleApiKey: PropTypes__default["default"].string,
2601
- trackingVariables: core$1.PropTypes.trackingVariables,
2772
+ trackingVariables: core.PropTypes.trackingVariables,
2602
2773
  locale: PropTypes__default["default"].string,
2603
2774
  locales: PropTypes__default["default"].arrayOf(PropTypes__default["default"].string),
2604
2775
  translations: PropTypes__default["default"].objectOf(PropTypes__default["default"].string),