@micromag/viewer 0.3.179 → 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 +1236 -1093
  3. package/lib/index.js +1254 -1111
  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');
29
- var faShare = require('@fortawesome/free-solid-svg-icons/faShare');
25
+ var reactIntl = require('react-intl');
30
26
  var faTimes = require('@fortawesome/free-solid-svg-icons/faTimes');
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,171 +234,139 @@ function useScreenInteraction() {
242
234
  };
243
235
  }
244
236
 
245
- var styles$c = {"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"};
246
-
247
- var propTypes$h = {
248
- url: PropTypes__default["default"].string,
249
- title: PropTypes__default["default"].string,
250
- opened: PropTypes__default["default"].bool,
237
+ var _excluded$5 = ["className", "onClick", "theme"];
238
+ var propTypes$k = {
251
239
  className: PropTypes__default["default"].string,
252
- onShare: PropTypes__default["default"].func,
253
- onCancel: PropTypes__default["default"].func
240
+ onClick: PropTypes__default["default"].func,
241
+ theme: core.PropTypes.viewerTheme
254
242
  };
255
- var defaultProps$h = {
256
- url: null,
257
- title: null,
258
- opened: false,
243
+ var defaultProps$k = {
259
244
  className: null,
260
- onShare: null,
261
- onCancel: null
245
+ onClick: null,
246
+ theme: null
262
247
  };
263
248
 
264
- var ShareModal = function ShareModal(_ref) {
265
- var _ref3;
266
-
267
- var url = _ref.url,
268
- title = _ref.title,
269
- opened = _ref.opened,
270
- className = _ref.className,
271
- onShare = _ref.onShare,
272
- onCancel = _ref.onCancel;
273
- var modalRef = React.useRef();
274
- var onDocumentClick = React.useCallback(function (e) {
275
- var _ref2 = e || {},
276
- target = _ref2.target;
277
-
278
- if (!modalRef.current || modalRef.current.contains(target)) {
279
- return;
280
- }
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);
281
254
 
282
- onCancel();
283
- }, [opened, onCancel]);
284
- hooks.useDocumentEvent('click', onDocumentClick, opened);
285
- return /*#__PURE__*/React__default["default"].createElement("div", {
286
- className: classNames__default["default"]([styles$c.container, (_ref3 = {}, _defineProperty__default["default"](_ref3, className, className), _defineProperty__default["default"](_ref3, styles$c.opened, opened), _ref3)]),
287
- "aria-hidden": opened ? null : '-1'
288
- }, /*#__PURE__*/React__default["default"].createElement("div", {
289
- className: styles$c.modal,
290
- ref: modalRef
291
- }, /*#__PURE__*/React__default["default"].createElement("div", {
292
- className: styles$c.header
293
- }, /*#__PURE__*/React__default["default"].createElement("h2", {
294
- className: styles$c.heading
295
- }, /*#__PURE__*/React__default["default"].createElement(reactIntl.FormattedMessage, {
296
- id: "oL4ueH",
297
- defaultMessage: [{
298
- "type": 0,
299
- "value": "Share"
300
- }]
301
- })), /*#__PURE__*/React__default["default"].createElement(components.Button, {
302
- className: styles$c.close,
303
- onClick: onCancel,
304
- focusable: opened
305
- }, /*#__PURE__*/React__default["default"].createElement(components.Close, {
306
- className: styles$c.closeIcon,
307
- border: "none"
308
- }))), /*#__PURE__*/React__default["default"].createElement("div", {
309
- className: styles$c.content
310
- }, /*#__PURE__*/React__default["default"].createElement(ShareOptions__default["default"], {
311
- className: styles$c.shareOptions,
312
- title: title,
313
- url: url,
314
- focusable: opened,
315
- onShare: onShare,
316
- onClose: onCancel
317
- }))));
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));
318
278
  };
319
279
 
320
- ShareModal.propTypes = propTypes$h;
321
- ShareModal.defaultProps = defaultProps$h;
280
+ MenuButton.propTypes = propTypes$k;
281
+ MenuButton.defaultProps = defaultProps$k;
322
282
 
323
- var styles$b = {"container":"micromag-viewer-partials-share-button-container"};
324
-
325
- var propTypes$g = {
326
- title: PropTypes__default["default"].string,
327
- url: PropTypes__default["default"].string,
283
+ var _excluded$4 = ["className", "onClick", "theme"];
284
+ var propTypes$j = {
328
285
  className: PropTypes__default["default"].string,
329
- buttonClassName: PropTypes__default["default"].string,
330
- onShare: PropTypes__default["default"].func,
331
- children: PropTypes__default["default"].node,
332
- focusable: PropTypes__default["default"].bool
286
+ onClick: PropTypes__default["default"].func,
287
+ theme: core.PropTypes.viewerTheme
333
288
  };
334
- var defaultProps$g = {
335
- title: null,
336
- url: null,
289
+ var defaultProps$j = {
337
290
  className: null,
338
- buttonClassName: null,
339
- onShare: null,
340
- children: null,
341
- focusable: false
291
+ onClick: null,
292
+ theme: null
342
293
  };
343
294
 
344
295
  var ShareButton = function ShareButton(_ref) {
345
- var title = _ref.title,
346
- url = _ref.url,
347
- className = _ref.className,
348
- buttonClassName = _ref.buttonClassName,
349
- onShare = _ref.onShare,
350
- children = _ref.children,
351
- focusable = _ref.focusable;
352
- var intl = reactIntl.useIntl();
353
-
354
- var _useState = React.useState(false),
355
- _useState2 = _slicedToArray__default["default"](_useState, 2),
356
- storyShareModalOpened = _useState2[0],
357
- setStoryShareModalOpened = _useState2[1];
358
-
359
- var onShareIconClick = React.useCallback(function () {
360
- setStoryShareModalOpened(function (opened) {
361
- return !opened;
362
- });
363
- }, [setStoryShareModalOpened, storyShareModalOpened]);
364
- var onStoryShared = React.useCallback(function (type) {
365
- setStoryShareModalOpened(false);
296
+ var className = _ref.className,
297
+ onClick = _ref.onClick,
298
+ theme = _ref.theme,
299
+ props = _objectWithoutProperties__default["default"](_ref, _excluded$4);
366
300
 
367
- if (onShare !== null) {
368
- onShare(type);
369
- }
370
- }, [setStoryShareModalOpened, onShare]);
371
- var onStoryShareCanceled = React.useCallback(function () {
372
- setStoryShareModalOpened(false);
373
- }, [setStoryShareModalOpened]);
374
- return /*#__PURE__*/React__default["default"].createElement("div", {
375
- className: classNames__default["default"]([styles$b.container, _defineProperty__default["default"]({}, className, className !== null)])
376
- }, /*#__PURE__*/React__default["default"].createElement(components.Button, {
377
- className: classNames__default["default"]([_defineProperty__default["default"]({}, buttonClassName, buttonClassName !== null)]),
378
- onClick: onShareIconClick,
379
- title: intl.formatMessage({
380
- id: "7tw6U2",
381
- defaultMessage: [{
382
- "type": 0,
383
- "value": "Share"
384
- }]
385
- }),
386
- "aria-label": intl.formatMessage({
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({
387
305
  id: "7tw6U2",
388
306
  defaultMessage: [{
389
307
  "type": 0,
390
308
  "value": "Share"
391
309
  }]
392
310
  }),
393
- focusable: focusable
394
- }, children), /*#__PURE__*/React__default["default"].createElement(ShareModal, {
395
- className: styles$b.shareModal,
396
- opened: storyShareModalOpened,
397
- title: title,
398
- url: url,
399
- onShare: onStoryShared,
400
- onCancel: onStoryShareCanceled
401
- }));
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));
402
325
  };
403
326
 
404
- ShareButton.propTypes = propTypes$g;
405
- ShareButton.defaultProps = defaultProps$g;
327
+ ShareButton.propTypes = propTypes$j;
328
+ ShareButton.defaultProps = defaultProps$j;
406
329
 
407
- var styles$a = {"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"};
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"};
408
331
 
409
- var propTypes$f = {
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;
366
+
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"};
368
+
369
+ var propTypes$h = {
410
370
  current: PropTypes__default["default"].bool,
411
371
  active: PropTypes__default["default"].bool,
412
372
  colors: PropTypes__default["default"].shape({
@@ -419,7 +379,7 @@ var propTypes$f = {
419
379
  onClick: PropTypes__default["default"].func,
420
380
  className: PropTypes__default["default"].string
421
381
  };
422
- var defaultProps$f = {
382
+ var defaultProps$h = {
423
383
  current: false,
424
384
  active: false,
425
385
  colors: null,
@@ -441,130 +401,67 @@ var ViewerMenuDot = function ViewerMenuDot(_ref) {
441
401
  vertical = _ref.vertical,
442
402
  onClick = _ref.onClick,
443
403
  className = _ref.className;
444
- var currentTime = 0;
445
- var duration = 1;
446
- var playing = true;
447
404
 
448
405
  var _ref2 = colors || {},
449
406
  _ref2$primary = _ref2.primary,
450
407
  primary = _ref2$primary === void 0 ? 'rgba(255, 255, 255, 1)' : _ref2$primary,
451
408
  _ref2$secondary = _ref2.secondary,
452
- 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;
453
410
 
454
-
455
- var _useSpring = core.useSpring(function () {
411
+ var _useSpring = core$1.useSpring(function () {
456
412
  return {
457
- x: 0,
413
+ scaleX: 0,
458
414
  config: {
459
- duration: 0
415
+ tension: 200,
416
+ friction: 30
460
417
  }
461
418
  };
462
419
  }),
463
- _useSpring2 = _slicedToArray__default["default"](_useSpring, 2);
464
- _useSpring2[0];
465
- var setSpringProps = _useSpring2[1];
420
+ _useSpring2 = _slicedToArray__default["default"](_useSpring, 2),
421
+ dotSpringStyles = _useSpring2[0],
422
+ setDotSpringProps = _useSpring2[1];
466
423
 
467
424
  React.useEffect(function () {
468
-
469
- var progress = currentTime / duration;
470
- setSpringProps.start({
471
- reset: true,
472
- immediate: !playing,
473
- from: {
474
- x: progress
475
- },
476
- to: {
477
- x: 1
478
- },
479
- config: {
480
- duration: (duration - currentTime) * 1000
481
- }
482
- });
483
- }, [playing, duration, currentTime, setSpringProps]);
484
- var inner = current && count > 1 ? /*#__PURE__*/React__default["default"].createElement("span", {
485
- className: styles$a.dots
486
- }, _toConsumableArray__default["default"](Array(count).keys()).map(function (i) {
487
- return /*#__PURE__*/React__default["default"].createElement("span", {
488
- className: classNames__default["default"]([styles$a.dot, styles$a.subDot]),
489
- style: {
490
- width: "".concat(parseFloat(1 / count * 100).toFixed(2), "%"),
491
- backgroundColor: active && i <= subIndex ? primary : secondary
492
- }
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
493
431
  });
494
- })) : /*#__PURE__*/React__default["default"].createElement("span", {
495
- className: styles$a.dot,
496
- style: {
497
- backgroundColor: active ? primary : secondary
498
- }
499
- });
432
+ }, [active, current, subIndex, count, setDotSpringProps]);
500
433
  return /*#__PURE__*/React__default["default"].createElement("li", {
501
- className: classNames__default["default"]([styles$a.container, (_ref3 = {}, _defineProperty__default["default"](_ref3, styles$a.active, current), _defineProperty__default["default"](_ref3, styles$a.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)]),
502
435
  "aria-hidden": "true"
503
436
  }, /*#__PURE__*/React__default["default"].createElement("button", {
504
437
  type: "button",
505
- className: styles$a.button,
438
+ className: styles$c.button,
506
439
  onClick: onClick,
507
440
  tabIndex: "-1"
508
- }, inner));
509
- };
510
-
511
- ViewerMenuDot.propTypes = propTypes$f;
512
- ViewerMenuDot.defaultProps = defaultProps$f;
513
-
514
- var styles$9 = {};
515
-
516
- var propTypes$e = {
517
- size: PropTypes__default["default"].number,
518
- spacing: PropTypes__default["default"].number,
519
- color: PropTypes__default["default"].string,
520
- className: PropTypes__default["default"].string
521
- };
522
- var defaultProps$e = {
523
- size: 100,
524
- spacing: 8,
525
- color: 'white',
526
- className: null
527
- };
528
-
529
- var MenuIcon = function MenuIcon(_ref) {
530
- var size = _ref.size,
531
- spacing = _ref.spacing,
532
- color = _ref.color,
533
- className = _ref.className;
534
- var squareSize = (size - 2 * spacing) / 3;
535
- return /*#__PURE__*/React__default["default"].createElement("svg", {
536
- className: classNames__default["default"]([styles$9.container, _defineProperty__default["default"]({}, className, className !== null)]),
537
- xmlns: "http://www.w3.org/2000/svg",
538
- viewBox: "0 0 ".concat(size, " ").concat(size),
539
- "aria-hidden": "true"
540
- }, _toConsumableArray__default["default"](new Array(9)).map(function (square, squareI) {
541
- var x = squareI % 3 * (squareSize + spacing);
542
- var y = Math.floor(squareI / 3) * (squareSize + spacing);
543
- return /*#__PURE__*/React__default["default"].createElement("rect", {
544
- key: "square-".concat(squareI),
545
- fill: color,
546
- x: x,
547
- y: y,
548
- width: squareSize,
549
- height: squareSize
550
- });
551
- }));
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
+ }))));
552
452
  };
553
453
 
554
- MenuIcon.propTypes = propTypes$e;
555
- MenuIcon.defaultProps = defaultProps$e;
454
+ ViewerMenuDot.propTypes = propTypes$h;
455
+ ViewerMenuDot.defaultProps = defaultProps$h;
556
456
 
557
- var styles$8 = {"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"};
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"};
558
458
 
559
- var propTypes$d = {
459
+ var _excluded$3 = ["direction", "items", "onClickDot", "onClickScreensMenu", "colors", "closeable", "withItemClick", "withoutScreensMenu", "onClose", "className"];
460
+ var propTypes$g = {
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
@@ -572,46 +469,36 @@ var propTypes$d = {
572
469
  closeable: PropTypes__default["default"].bool,
573
470
  withItemClick: PropTypes__default["default"].bool,
574
471
  withoutScreensMenu: PropTypes__default["default"].bool,
575
- withoutShareMenu: PropTypes__default["default"].bool,
576
472
  onClose: PropTypes__default["default"].func,
577
473
  className: PropTypes__default["default"].string
578
474
  };
579
- var defaultProps$d = {
475
+ var defaultProps$g = {
580
476
  direction: 'horizontal',
581
- withShadow: false,
582
- title: null,
583
477
  items: [],
584
- shareUrl: null,
585
- onShare: null,
586
- onClickItem: null,
587
- onClickMenu: null,
478
+ onClickDot: null,
479
+ onClickScreensMenu: null,
588
480
  colors: null,
589
481
  closeable: false,
590
482
  withItemClick: false,
591
483
  withoutScreensMenu: false,
592
- withoutShareMenu: false,
593
484
  onClose: null,
594
485
  className: null
595
486
  };
596
487
 
597
488
  var ViewerMenuDots = function ViewerMenuDots(_ref) {
598
- var _ref4;
489
+ var _ref5;
599
490
 
600
491
  var direction = _ref.direction,
601
- withShadow = _ref.withShadow,
602
- title = _ref.title,
603
492
  items = _ref.items,
604
- shareUrl = _ref.shareUrl,
605
- onShare = _ref.onShare,
606
- onClickItem = _ref.onClickItem,
607
- onClickMenu = _ref.onClickMenu,
493
+ onClickDot = _ref.onClickDot,
494
+ onClickScreensMenu = _ref.onClickScreensMenu,
608
495
  colors = _ref.colors,
609
496
  closeable = _ref.closeable,
610
497
  withItemClick = _ref.withItemClick,
611
498
  withoutScreensMenu = _ref.withoutScreensMenu,
612
- withoutShareMenu = _ref.withoutShareMenu,
613
499
  onClose = _ref.onClose,
614
- className = _ref.className;
500
+ className = _ref.className,
501
+ props = _objectWithoutProperties__default["default"](_ref, _excluded$3);
615
502
 
616
503
  var _ref2 = colors || {},
617
504
  _ref2$primary = _ref2.primary,
@@ -623,8 +510,12 @@ var ViewerMenuDots = function ViewerMenuDots(_ref) {
623
510
  current = _ref3$current === void 0 ? false : _ref3$current;
624
511
  return current;
625
512
  });
513
+
514
+ var _ref4 = props || {},
515
+ style = _ref4.style;
516
+
626
517
  return /*#__PURE__*/React__default["default"].createElement("nav", {
627
- className: classNames__default["default"]([styles$8.container, (_ref4 = {}, _defineProperty__default["default"](_ref4, className, className !== null), _defineProperty__default["default"](_ref4, styles$8.vertical, direction === 'vertical'), _defineProperty__default["default"](_ref4, styles$8.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)]),
628
519
  "aria-label": intl.formatMessage({
629
520
  id: "bLYuuN",
630
521
  defaultMessage: [{
@@ -646,17 +537,18 @@ var ViewerMenuDots = function ViewerMenuDots(_ref) {
646
537
  }, {
647
538
  current: currentIndex + 1,
648
539
  total: items.length
649
- })
540
+ }),
541
+ style: style
650
542
  }, /*#__PURE__*/React__default["default"].createElement("ul", {
651
- className: styles$8.items
543
+ className: styles$b.items
652
544
  }, items.map(function (item, index) {
653
- var _ref5 = item || {},
654
- _ref5$current = _ref5.current,
655
- current = _ref5$current === void 0 ? false : _ref5$current,
656
- _ref5$count = _ref5.count,
657
- count = _ref5$count === void 0 ? 1 : _ref5$count,
658
- _ref5$subIndex = _ref5.subIndex,
659
- 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;
660
552
 
661
553
  return /*#__PURE__*/React__default["default"].createElement(ViewerMenuDot, {
662
554
  key: "item-".concat(index + 1),
@@ -666,56 +558,22 @@ var ViewerMenuDots = function ViewerMenuDots(_ref) {
666
558
  count: count,
667
559
  subIndex: subIndex,
668
560
  onClick: function onClick() {
669
- if ((withItemClick || withoutScreensMenu) && onClickItem !== null) {
670
- onClickItem(item);
671
- } else if (!withItemClick && onClickMenu !== null) {
672
- onClickMenu();
561
+ if ((withItemClick || withoutScreensMenu) && onClickDot !== null) {
562
+ onClickDot(item);
563
+ } else if (!withItemClick && onClickScreensMenu !== null) {
564
+ onClickScreensMenu();
673
565
  }
674
566
  },
675
567
  vertical: direction === 'vertical'
676
568
  });
677
- }), !withoutShareMenu ? /*#__PURE__*/React__default["default"].createElement("li", {
678
- className: styles$8.menu
679
- }, /*#__PURE__*/React__default["default"].createElement(ShareButton, {
680
- className: styles$8.shareButton,
681
- buttonClassName: styles$8.menuButton,
682
- onShare: onShare,
683
- url: shareUrl,
684
- title: title
685
- }, /*#__PURE__*/React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, {
686
- className: styles$8.icon,
687
- icon: faShare.faShare
688
- }))) : null, !withoutScreensMenu ? /*#__PURE__*/React__default["default"].createElement("li", {
689
- className: styles$8.menu
690
- }, /*#__PURE__*/React__default["default"].createElement(MenuIcon, {
691
- className: styles$8.menuIcon,
692
- color: primary
693
- }), /*#__PURE__*/React__default["default"].createElement("button", {
694
- type: "button",
695
- title: intl.formatMessage({
696
- id: "F/gl4b",
697
- defaultMessage: [{
698
- "type": 0,
699
- "value": "Menu"
700
- }]
701
- }),
702
- "aria-label": intl.formatMessage({
703
- id: "F/gl4b",
704
- defaultMessage: [{
705
- "type": 0,
706
- "value": "Menu"
707
- }]
708
- }),
709
- className: styles$8.menuButton,
710
- onClick: onClickMenu
711
- })) : null, closeable ? /*#__PURE__*/React__default["default"].createElement("li", {
712
- className: styles$8.closeButton,
569
+ }), closeable ? /*#__PURE__*/React__default["default"].createElement("li", {
570
+ className: styles$b.closeButton,
713
571
  style: {
714
572
  color: primary
715
573
  }
716
574
  }, /*#__PURE__*/React__default["default"].createElement("button", {
717
575
  type: "button",
718
- className: styles$8.closeButton,
576
+ className: styles$b.closeButton,
719
577
  onClick: onClose,
720
578
  title: intl.formatMessage({
721
579
  id: "dj/p/q",
@@ -736,64 +594,159 @@ var ViewerMenuDots = function ViewerMenuDots(_ref) {
736
594
  }))) : null));
737
595
  };
738
596
 
739
- ViewerMenuDots.propTypes = propTypes$d;
740
- ViewerMenuDots.defaultProps = defaultProps$d;
597
+ ViewerMenuDots.propTypes = propTypes$g;
598
+ ViewerMenuDots.defaultProps = defaultProps$g;
741
599
 
742
- var propTypes$c = {
600
+ var propTypes$f = {
743
601
  className: PropTypes__default["default"].string
744
602
  };
745
- var defaultProps$c = {
603
+ var defaultProps$f = {
746
604
  className: null
747
605
  };
748
606
 
749
607
  var StackIcon = function StackIcon(_ref) {
750
608
  var className = _ref.className;
751
609
  return /*#__PURE__*/React__default["default"].createElement("svg", {
752
- xmlns: "http://www.w3.org/2000/svg",
753
- width: "32",
754
- height: "32",
755
- 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",
756
617
  className: classNames__default["default"]([_defineProperty__default["default"]({}, className, className !== null)])
757
- }, /*#__PURE__*/React__default["default"].createElement("path", {
758
- 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"
759
623
  }));
760
624
  };
761
625
 
762
- StackIcon.propTypes = propTypes$c;
763
- StackIcon.defaultProps = defaultProps$c;
626
+ StackIcon.propTypes = propTypes$f;
627
+ StackIcon.defaultProps = defaultProps$f;
764
628
 
765
- 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"};
766
630
 
767
- var propTypes$b = {
768
- viewerTheme: core$1.PropTypes.viewerTheme,
769
- screenSize: core$1.PropTypes.screenSize,
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
638
+ };
639
+ var defaultProps$e = {
640
+ className: null,
641
+ item: core.PropTypes.menuItem,
642
+ index: 0,
643
+ onClick: null,
644
+ screenSize: 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,
770
727
  menuWidth: PropTypes__default["default"].number,
771
- title: PropTypes__default["default"].string,
772
- items: core$1.PropTypes.menuItems,
728
+ items: core.PropTypes.menuItems,
773
729
  focusable: PropTypes__default["default"].bool,
774
- shouldLoad: PropTypes__default["default"].bool,
775
- onClickItem: PropTypes__default["default"].func,
776
- onClose: PropTypes__default["default"].func,
730
+ onClickScreen: PropTypes__default["default"].func,
777
731
  maxThumbsWidth: PropTypes__default["default"].number,
778
- toggleFullscreen: PropTypes__default["default"].func,
779
- fullscreenActive: PropTypes__default["default"].bool,
780
- fullscreenEnabled: PropTypes__default["default"].bool,
732
+ // shouldLoad: PropTypes.bool, // @todo still needed? to re-implement?
733
+ // toggleFullscreen: PropTypes.func,
734
+ // fullscreenActive: PropTypes.bool,
735
+ // fullscreenEnabled: PropTypes.bool,
781
736
  className: PropTypes__default["default"].string
782
737
  };
783
- var defaultProps$b = {
738
+ var defaultProps$d = {
784
739
  viewerTheme: null,
785
740
  screenSize: null,
786
741
  menuWidth: null,
787
- title: null,
788
742
  items: [],
789
743
  focusable: true,
790
- shouldLoad: true,
791
- onClickItem: null,
792
- onClose: null,
744
+ // shouldLoad: true,
745
+ onClickScreen: null,
793
746
  maxThumbsWidth: 140,
794
- toggleFullscreen: null,
795
- fullscreenActive: false,
796
- fullscreenEnabled: false,
747
+ // toggleFullscreen: null,
748
+ // fullscreenActive: false,
749
+ // fullscreenEnabled: false,
797
750
  className: null
798
751
  };
799
752
 
@@ -801,259 +754,313 @@ var ViewerMenuPreview = function ViewerMenuPreview(_ref) {
801
754
  var viewerTheme = _ref.viewerTheme,
802
755
  screenSize = _ref.screenSize,
803
756
  menuWidth = _ref.menuWidth,
804
- title = _ref.title,
805
757
  items = _ref.items,
806
758
  focusable = _ref.focusable,
807
- onClickItem = _ref.onClickItem,
808
- onClose = _ref.onClose,
759
+ onClickScreen = _ref.onClickScreen,
809
760
  maxThumbsWidth = _ref.maxThumbsWidth,
810
- toggleFullscreen = _ref.toggleFullscreen,
811
- fullscreenActive = _ref.fullscreenActive,
812
- fullscreenEnabled = _ref.fullscreenEnabled,
813
761
  className = _ref.className;
814
- var intl = reactIntl.useIntl();
815
-
816
- var _ref2 = screenSize || {},
817
- screenWidth = _ref2.width,
818
- screenHeight = _ref2.height;
819
762
 
820
763
  var _useDimensionObserver = hooks.useDimensionObserver(),
821
- firstScreenContainerRef = _useDimensionObserver.ref,
764
+ containerRef = _useDimensionObserver.ref,
822
765
  _useDimensionObserver2 = _useDimensionObserver.width,
823
- thumbWidth = _useDimensionObserver2 === void 0 ? 0 : _useDimensionObserver2;
824
-
825
- var _useDimensionObserver3 = hooks.useDimensionObserver(),
826
- containerRef = _useDimensionObserver3.ref,
827
- _useDimensionObserver4 = _useDimensionObserver3.width,
828
- contentWidth = _useDimensionObserver4 === void 0 ? 0 : _useDimensionObserver4;
766
+ contentWidth = _useDimensionObserver2 === void 0 ? 0 : _useDimensionObserver2;
829
767
 
830
768
  var thumbsPerLine = Math.max(Math.floor(contentWidth / maxThumbsWidth), 3); // Viewer theme
769
+ // @todo room for improvement here probably
770
+ // @todo also re-implement!!
831
771
 
832
- var _ref3 = viewerTheme || {},
833
- _ref3$colors = _ref3.colors,
834
- colors = _ref3$colors === void 0 ? null : _ref3$colors,
835
- _ref3$background = _ref3.background,
836
- background = _ref3$background === void 0 ? null : _ref3$background,
837
- _ref3$textStyles = _ref3.textStyles,
838
- textStyles = _ref3$textStyles === void 0 ? null : _ref3$textStyles,
839
- _ref3$logo = _ref3.logo,
840
- brandLogo = _ref3$logo === void 0 ? null : _ref3$logo;
841
-
842
- var _ref4 = textStyles || {},
843
- _ref4$title = _ref4.title,
844
- 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;
845
778
 
846
- var _ref5 = colors || {},
847
- _ref5$primary = _ref5.primary,
848
- brandPrimaryColor = _ref5$primary === void 0 ? null : _ref5$primary,
849
- _ref5$secondary = _ref5.secondary,
850
- brandSecondaryColor = _ref5$secondary === void 0 ? null : _ref5$secondary;
779
+ var _ref3 = colors || {};
780
+ _ref3.primary;
781
+ _ref3.secondary;
851
782
 
852
- var _ref6 = background || {},
853
- _ref6$color = _ref6.color,
854
- brandBackgroundColor = _ref6$color === void 0 ? null : _ref6$color,
855
- _ref6$image = _ref6.image,
856
- 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;
857
788
 
858
- var _ref7 = image || {},
859
- _ref7$url = _ref7.url,
860
- 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');
861
793
 
862
- var borderPrimaryColorStyle = utils.getStyleFromColor(brandPrimaryColor, 'borderColor');
863
- var colorSecondaryColorStyle = utils.getStyleFromColor(brandSecondaryColor, 'color');
864
- var backgroundColorStyle = utils.getStyleFromColor(brandBackgroundColor, 'backgroundColor');
865
794
 
866
- var _ref8 = brandLogo || {},
867
- _ref8$url = _ref8.url,
868
- brandLogoUrl = _ref8$url === void 0 ? null : _ref8$url;
795
+ var backgroundColorStyle = utils.getStyleFromColor(brandBackgroundColor, 'backgroundColor'); // const { url: brandLogoUrl = null } = brandLogo || {};
869
796
 
870
797
  var brandImageStyle = brandImageUrl !== null ? {
871
798
  backgroundImage: "url(".concat(brandImageUrl, ")")
872
- } : null;
873
- var titleStyle = brandTextStyle !== null ? utils.getStyleFromText(brandTextStyle) : null;
874
-
875
- var _useState = React.useState(false),
876
- _useState2 = _slicedToArray__default["default"](_useState, 2),
877
- scrolledBottom = _useState2[0],
878
- setScrolledBottom = _useState2[1];
879
-
880
- var dragBind = react.useDrag(function (_ref9) {
881
- var _ref9$direction = _slicedToArray__default["default"](_ref9.direction, 2),
882
- dy = _ref9$direction[1],
883
- last = _ref9.last,
884
- tap = _ref9.tap;
799
+ } : null; // @todo could probably use some work to avoid the visual jump from 3 screens to all of them
885
800
 
886
- if (!tap && last && scrolledBottom && dy < 0 && onClose !== null) {
887
- onClose();
888
- }
889
- }, {
890
- filterTaps: true,
891
- eventOptions: {
892
- capture: true
893
- }
894
- });
895
- var onScrolledBottom = React.useCallback(function () {
896
- setScrolledBottom(true);
897
- }, [setScrolledBottom]);
898
- var onScrolledNotBottom = React.useCallback(function () {
899
- setScrolledBottom(false);
900
- }, [setScrolledBottom]);
901
801
  var finalItems = React.useMemo(function () {
902
- return !focusable ? items.slice(0, 3) : items;
903
- }, [items, focusable]);
904
- return /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
905
- 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)]),
906
816
  style: _objectSpread__default["default"](_objectSpread__default["default"](_objectSpread__default["default"]({}, backgroundColorStyle), brandImageStyle), {}, {
907
817
  width: menuWidth
908
818
  }),
909
819
  "aria-hidden": focusable ? null : 'true'
910
- }, dragBind()), /*#__PURE__*/React__default["default"].createElement("div", {
911
- className: styles$7.header
912
- }, brandLogoUrl !== null ? /*#__PURE__*/React__default["default"].createElement("div", {
913
- className: styles$7.organisation,
914
- style: {
915
- backgroundImage: "url(".concat(brandLogoUrl, ")")
916
- }
917
- }) : null, /*#__PURE__*/React__default["default"].createElement("div", {
918
- className: styles$7.title,
919
- style: titleStyle
920
- }, title), /*#__PURE__*/React__default["default"].createElement("div", {
921
- className: styles$7.buttons,
922
- style: colorSecondaryColorStyle
923
- }, fullscreenEnabled ? /*#__PURE__*/React__default["default"].createElement(components.Button, {
924
- className: styles$7.button,
925
- onClick: toggleFullscreen,
926
- title: intl.formatMessage({
927
- id: "AuxqcG",
928
- defaultMessage: [{
929
- "type": 0,
930
- "value": "Fullscreen"
931
- }]
932
- }),
933
- "aria-label": intl.formatMessage({
934
- id: "AuxqcG",
935
- defaultMessage: [{
936
- "type": 0,
937
- "value": "Fullscreen"
938
- }]
939
- }),
940
- focusable: focusable
941
- }, /*#__PURE__*/React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, {
942
- className: styles$7.icon,
943
- icon: fullscreenActive ? faCompress.faCompress : faExpand.faExpand
944
- })) : null, /*#__PURE__*/React__default["default"].createElement(components.Button, {
945
- className: styles$7.button,
946
- onClick: onClose,
947
- title: intl.formatMessage({
948
- id: "dj/p/q",
949
- defaultMessage: [{
950
- "type": 0,
951
- "value": "Close"
952
- }]
953
- }),
954
- "aria-label": intl.formatMessage({
955
- id: "dj/p/q",
956
- defaultMessage: [{
957
- "type": 0,
958
- "value": "Close"
959
- }]
960
- }),
961
- focusable: focusable
962
- }, /*#__PURE__*/React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, {
963
- className: styles$7.icon,
964
- icon: faTimes.faTimes
965
- })))), /*#__PURE__*/React__default["default"].createElement("div", {
966
- className: styles$7.content,
820
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
821
+ className: styles$9.content,
967
822
  ref: containerRef
968
823
  }, /*#__PURE__*/React__default["default"].createElement(Scroll__default["default"], {
969
- className: styles$7.scroll,
970
- onScrolledBottom: onScrolledBottom,
971
- onScrolledNotBottom: onScrolledNotBottom
824
+ className: styles$9.scroll
972
825
  }, /*#__PURE__*/React__default["default"].createElement("nav", {
973
- className: styles$7.nav
826
+ className: styles$9.nav
974
827
  }, /*#__PURE__*/React__default["default"].createElement("ul", {
975
- className: styles$7.items
828
+ className: styles$9.items
976
829
  }, finalItems.map(function (item, index) {
977
- var screenId = item.screenId,
978
- _item$current = item.current,
979
- current = _item$current === void 0 ? false : _item$current,
980
- screen = item.screen,
981
- _item$count = item.count,
982
- count = _item$count === void 0 ? 1 : _item$count;
983
- var screenAriaLabel = "".concat(intl.formatMessage({
984
- id: "LkVfwW",
985
- defaultMessage: [{
986
- "type": 0,
987
- "value": "Screen "
988
- }, {
989
- "type": 1,
990
- "value": "index"
991
- }]
992
- }, {
993
- index: index + 1
994
- })).concat(current ? " ".concat(intl.formatMessage({
995
- id: "vmrJ8U",
996
- defaultMessage: [{
997
- "type": 0,
998
- "value": "(current screen)"
999
- }]
1000
- })) : '');
830
+ var _ref7 = item || {},
831
+ screenId = _ref7.screenId;
832
+
833
+ var itemStyles = {
834
+ width: "".concat(100 / thumbsPerLine, "%")
835
+ };
1001
836
  return /*#__PURE__*/React__default["default"].createElement("li", {
1002
- className: classNames__default["default"]([styles$7.item, _defineProperty__default["default"]({}, styles$7.active, current)]),
1003
837
  key: "item-".concat(screenId),
1004
- style: {
1005
- width: "".concat(100 / thumbsPerLine, "%")
1006
- }
1007
- }, /*#__PURE__*/React__default["default"].createElement("div", {
1008
- className: styles$7.itemContent
1009
- }, /*#__PURE__*/React__default["default"].createElement("div", {
1010
- className: styles$7.screenContainer,
1011
- ref: index === 0 ? firstScreenContainerRef : null
1012
- }, count > 1 ? /*#__PURE__*/React__default["default"].createElement("div", {
1013
- className: styles$7.subScreenBadge
1014
- }, /*#__PURE__*/React__default["default"].createElement("span", {
1015
- className: styles$7.subScreenCount
1016
- }, count), /*#__PURE__*/React__default["default"].createElement(StackIcon, {
1017
- className: styles$7.subScreenIcon
1018
- })) : null, screenWidth > 0 && screenHeight > 0 ? /*#__PURE__*/React__default["default"].createElement(components.ScreenPreview, {
1019
- screenWidth: screenWidth,
1020
- screenHeight: screenHeight,
1021
- width: thumbWidth,
1022
- screen: screen,
1023
- focusable: focusable,
1024
- active: focusable,
1025
- withSize: true
1026
- }) : null, current ? /*#__PURE__*/React__default["default"].createElement("div", {
1027
- className: styles$7.activeScreenBorder,
1028
- style: borderPrimaryColorStyle
1029
- }) : null)), /*#__PURE__*/React__default["default"].createElement("button", {
1030
- type: "button",
1031
- className: styles$7.screenButton,
1032
- onClick: function onClick() {
1033
- if (onClickItem !== null) {
1034
- onClickItem(item);
1035
- }
1036
- },
1037
- "aria-label": screenAriaLabel,
1038
- onKeyUp: function onKeyUp(e) {
1039
- if (e.key === 'Enter' && onClickItem !== null) {
1040
- onClickItem(item);
1041
- }
1042
- },
1043
- 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
1044
847
  }));
1045
848
  }))))));
1046
849
  };
1047
850
 
1048
- ViewerMenuPreview.propTypes = propTypes$b;
1049
- ViewerMenuPreview.defaultProps = defaultProps$b;
851
+ ViewerMenuPreview.propTypes = propTypes$d;
852
+ ViewerMenuPreview.defaultProps = defaultProps$d;
1050
853
 
1051
- 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"};
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
+ };
894
+
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"};
1052
1060
 
1053
1061
  var propTypes$a = {
1054
- story: core$1.PropTypes.story.isRequired,
1062
+ story: core.PropTypes.story.isRequired,
1055
1063
  currentScreenIndex: PropTypes__default["default"].number,
1056
- opened: PropTypes__default["default"].bool,
1057
1064
  toggleFullscreen: PropTypes__default["default"].func,
1058
1065
  fullscreenActive: PropTypes__default["default"].bool,
1059
1066
  fullscreenEnabled: PropTypes__default["default"].bool,
@@ -1061,15 +1068,13 @@ var propTypes$a = {
1061
1068
  withShadow: PropTypes__default["default"].bool,
1062
1069
  trackingEnabled: PropTypes__default["default"].bool,
1063
1070
  shareBasePath: PropTypes__default["default"].string,
1064
- theme: core$1.PropTypes.viewerTheme,
1065
- screenSize: core$1.PropTypes.screenSize,
1071
+ theme: core.PropTypes.viewerTheme,
1072
+ screenSize: core.PropTypes.screenSize,
1066
1073
  menuWidth: PropTypes__default["default"].number,
1067
1074
  withDotItemClick: PropTypes__default["default"].bool,
1068
1075
  withoutScreensMenu: PropTypes__default["default"].bool,
1069
1076
  withoutShareMenu: PropTypes__default["default"].bool,
1070
- onRequestOpen: PropTypes__default["default"].func,
1071
- onRequestClose: PropTypes__default["default"].func,
1072
- onClickItem: PropTypes__default["default"].func,
1077
+ onClickScreen: PropTypes__default["default"].func,
1073
1078
  onClickMenu: PropTypes__default["default"].func,
1074
1079
  onClickCloseViewer: PropTypes__default["default"].func,
1075
1080
  refDots: PropTypes__default["default"].shape({
@@ -1079,7 +1084,6 @@ var propTypes$a = {
1079
1084
  };
1080
1085
  var defaultProps$a = {
1081
1086
  currentScreenIndex: 0,
1082
- opened: false,
1083
1087
  toggleFullscreen: null,
1084
1088
  fullscreenActive: false,
1085
1089
  fullscreenEnabled: false,
@@ -1093,18 +1097,17 @@ var defaultProps$a = {
1093
1097
  withDotItemClick: false,
1094
1098
  withoutScreensMenu: false,
1095
1099
  withoutShareMenu: false,
1096
- onRequestOpen: null,
1097
- onRequestClose: null,
1098
- onClickItem: null,
1100
+ onClickScreen: null,
1099
1101
  onClickMenu: null,
1100
1102
  onClickCloseViewer: null,
1101
1103
  refDots: null
1102
1104
  };
1103
1105
 
1104
1106
  var ViewerMenu = function ViewerMenu(_ref) {
1107
+ var _ref9;
1108
+
1105
1109
  var story = _ref.story,
1106
1110
  currentScreenIndex = _ref.currentScreenIndex,
1107
- opened = _ref.opened,
1108
1111
  toggleFullscreen = _ref.toggleFullscreen,
1109
1112
  fullscreenActive = _ref.fullscreenActive,
1110
1113
  fullscreenEnabled = _ref.fullscreenEnabled,
@@ -1118,23 +1121,42 @@ var ViewerMenu = function ViewerMenu(_ref) {
1118
1121
  withDotItemClick = _ref.withDotItemClick,
1119
1122
  withoutScreensMenu = _ref.withoutScreensMenu,
1120
1123
  withoutShareMenu = _ref.withoutShareMenu,
1121
- onRequestOpen = _ref.onRequestOpen,
1122
- onRequestClose = _ref.onRequestClose,
1123
- customOnClickItem = _ref.onClickItem,
1124
- customOnClickMenu = _ref.onClickMenu,
1125
- onClickCloseViewer = _ref.onClickCloseViewer,
1124
+ customOnClickScreen = _ref.onClickScreen;
1125
+ _ref.onClickMenu;
1126
+ var onClickCloseViewer = _ref.onClickCloseViewer,
1126
1127
  refDots = _ref.refDots;
1127
1128
  var _story$components = story.components,
1128
1129
  screens = _story$components === void 0 ? [] : _story$components,
1129
1130
  _story$title = story.title,
1130
- 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
+
1131
1139
  var currentScreen = screens !== null ? screens[currentScreenIndex] || null : null;
1132
1140
 
1133
- var _ref2 = currentScreen || {},
1134
- _ref2$id = _ref2.id,
1135
- screenId = _ref2$id === void 0 ? null : _ref2$id,
1136
- _ref2$type = _ref2.type,
1137
- 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];
1138
1160
 
1139
1161
  var items = React.useMemo(function () {
1140
1162
  return screens.map(function (it) {
@@ -1155,9 +1177,9 @@ var ViewerMenu = function ViewerMenu(_ref) {
1155
1177
  count: children.length + 1 || 1,
1156
1178
  subIndex: subIndex || 0
1157
1179
  };
1158
- }).filter(function (_ref3) {
1159
- var _ref3$visible = _ref3.visible,
1160
- 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;
1161
1183
  return visible;
1162
1184
  });
1163
1185
  }, [screens, screenId]);
@@ -1172,161 +1194,223 @@ var ViewerMenu = function ViewerMenu(_ref) {
1172
1194
  }
1173
1195
  }, [trackEvent, screenId, currentScreenIndex, screenType]);
1174
1196
  var shareUrl = React.useMemo(function () {
1175
- var origin = typeof window !== 'undefined' ? window.location.origin.replace(/\/+$/, '') : '';
1176
- 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;
1177
1203
  return path;
1178
- }, [shareBasePath]);
1179
-
1180
- var _useSpring = core.useSpring(function () {
1181
- return {
1182
- y: 0,
1183
- config: _objectSpread__default["default"](_objectSpread__default["default"]({}, core.config.stiff), {}, {
1184
- clamp: true
1185
- })
1186
- };
1187
- }),
1188
- _useSpring2 = _slicedToArray__default["default"](_useSpring, 2),
1189
- menuY = _useSpring2[0].y,
1190
- setMenuSpring = _useSpring2[1];
1191
-
1192
- var refOpened = React.useRef(opened);
1193
-
1194
- if (refOpened.current !== opened) {
1195
- refOpened.current = opened;
1196
- }
1197
-
1198
- React.useEffect(function () {
1199
- setMenuSpring.start({
1200
- y: opened ? 1 : 0
1201
- });
1202
- }, [opened]);
1204
+ }, [shareBasePath]); // @todo sorta not super good here
1203
1205
 
1204
- var _useDimensionObserver = hooks.useDimensionObserver(),
1205
- menuPreviewContainerRef = _useDimensionObserver.ref,
1206
- _useDimensionObserver2 = _useDimensionObserver.height,
1207
- menuPreviewContainerHeight = _useDimensionObserver2 === void 0 ? 0 : _useDimensionObserver2;
1208
-
1209
- var menuPreviewStyle = {
1210
- transform: menuY.to(function (y) {
1211
- return "translateY(".concat(y * menuPreviewContainerHeight, "px)");
1212
- })
1213
- };
1214
- var menuDragBind = react.useDrag(function (_ref4) {
1215
- var _ref4$movement = _slicedToArray__default["default"](_ref4.movement, 2),
1216
- my = _ref4$movement[1],
1217
- first = _ref4.first,
1218
- last = _ref4.last,
1219
- _ref4$direction = _slicedToArray__default["default"](_ref4.direction, 2),
1220
- dy = _ref4$direction[1],
1221
- cancel = _ref4.cancel,
1222
- canceled = _ref4.canceled,
1223
- tap = _ref4.tap;
1224
-
1225
- if (canceled || tap) {
1226
- 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);
1227
1231
  }
1228
1232
 
1229
- var isMenuOpened = refOpened.current;
1230
-
1231
- if (first) {
1232
- if (isMenuOpened) {
1233
- cancel();
1234
- return;
1235
- }
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;
1236
1258
  }
1237
1259
 
1238
- var yProgress = Math.max(0, Math.min(1, my / menuPreviewContainerHeight + (isMenuOpened ? 1 : 0)));
1239
-
1240
- if (last) {
1241
- var menuNowOpened = dy > 0 && yProgress > 0.1;
1242
- refOpened.current = menuNowOpened;
1243
- setMenuSpring.start({
1244
- y: menuNowOpened ? 1 : 0
1245
- });
1260
+ return progress;
1261
+ }, [menuOpened, onOpenShare]);
1246
1262
 
1247
- if (menuNowOpened && onRequestOpen !== null) {
1248
- onRequestOpen();
1249
- } else if (!menuNowOpened && onRequestClose !== null) {
1250
- onRequestClose();
1263
+ var _useDragProgress = hooks.useDragProgress({
1264
+ progress: shareOpened ? 1 : 0,
1265
+ computeProgress: computeShareProgress,
1266
+ springParams: {
1267
+ config: {
1268
+ tension: 300,
1269
+ friction: 30
1251
1270
  }
1252
- } else {
1253
- setMenuSpring.start({
1254
- y: yProgress
1255
- });
1256
1271
  }
1257
- }, {
1258
- axis: 'y',
1259
- filterTaps: true
1260
- }); // handle preview menu item click
1261
-
1262
- var onClickMenu = React.useCallback(function (index) {
1263
- if (customOnClickMenu !== null) {
1264
- 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;
1265
1292
  }
1266
1293
 
1267
- trackScreenEvent('viewer_menu', 'click_open', 'Menu icon');
1268
- }, [customOnClickMenu, trackScreenEvent]);
1269
- var onClickItem = React.useCallback(function (item) {
1270
- if (customOnClickItem !== null) {
1271
- customOnClickItem(item);
1272
- }
1294
+ return progress;
1295
+ }, [menuOpened, onOpenMenu]);
1273
1296
 
1274
- var index = items.findIndex(function (_ref5) {
1275
- var id = _ref5.id;
1276
- return id === screenId;
1277
- });
1278
- trackScreenEvent('viewer_menu', 'click_screen_change', "Screen ".concat(index + 1));
1279
- }, [customOnClickItem, items, screenId, trackScreenEvent]);
1280
- var onClickClose = React.useCallback(function () {
1281
- if (onRequestClose !== null) {
1282
- 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
+ }
1283
1305
  }
1306
+ }),
1307
+ bindMenuDrag = _useDragProgress2.bind,
1308
+ isDraggingMenu = _useDragProgress2.dragging,
1309
+ menuOpenedProgress = _useDragProgress2.progress;
1284
1310
 
1285
- trackScreenEvent('viewer_menu', 'click_close', 'Close icon');
1286
- }, [onRequestClose, trackScreenEvent]); // Handle preview menu share click
1287
-
1288
- var onClickShare = React.useCallback(function (type) {
1289
- return trackScreenEvent('viewer_menu', 'click_share', type);
1290
- }, [trackScreenEvent]);
1291
-
1292
- var _ref6 = viewerTheme || {},
1293
- _ref6$menuTheme = _ref6.menuTheme,
1294
- 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
1295
1322
 
1296
- return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
1297
- 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)]),
1298
1326
  ref: refDots,
1299
1327
  style: {
1300
1328
  width: menuWidth
1301
1329
  }
1302
- }, 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, {
1303
1371
  direction: "horizontal",
1304
- withShadow: withShadow,
1305
1372
  items: items,
1306
- title: title,
1373
+ onClickDot: onClickScreen,
1374
+ onClickMenu: onOpenMenu,
1375
+ closeable: closeable,
1376
+ withItemClick: withDotItemClick,
1377
+ withoutScreensMenu: withoutScreensMenu,
1378
+ withoutShareMenu: withoutShareMenu,
1379
+ onClose: onClickCloseViewer,
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,
1307
1396
  shareUrl: shareUrl,
1308
- onShare: onClickShare,
1309
- onClickItem: onClickItem,
1310
- onClickMenu: onClickMenu,
1311
- closeable: closeable,
1312
- withItemClick: withDotItemClick,
1313
- withoutScreensMenu: withoutScreensMenu,
1314
- withoutShareMenu: withoutShareMenu,
1315
- onClose: onClickCloseViewer,
1316
- className: styles$6.menuDots
1317
- }))), /*#__PURE__*/React__default["default"].createElement(web.animated.div, {
1318
- className: styles$6.menuPreviewContainer,
1319
- style: menuPreviewStyle,
1320
- ref: menuPreviewContainerRef
1397
+ onShare: onShare,
1398
+ onClose: onCloseShare
1399
+ })), /*#__PURE__*/React__default["default"].createElement(ViewerMenuContainer, {
1400
+ className: styles$6.menuContainerScreens,
1401
+ transitionProgress: menuOpenedProgress
1321
1402
  }, /*#__PURE__*/React__default["default"].createElement(ViewerMenuPreview, {
1322
1403
  viewerTheme: viewerTheme,
1323
1404
  className: styles$6.menuPreview,
1324
1405
  screenSize: screenSize,
1325
1406
  menuWidth: menuWidth,
1326
- focusable: opened,
1407
+ focusable: menuOpened,
1327
1408
  items: items,
1328
- onClickItem: onClickItem,
1329
- onClose: onClickClose,
1409
+ currentScreenIndex: currentScreenIndex,
1410
+ shareUrl: shareUrl,
1411
+ onShare: onShare,
1412
+ onClickScreen: onClickScreen,
1413
+ onClose: onCloseMenu,
1330
1414
  toggleFullscreen: toggleFullscreen,
1331
1415
  fullscreenActive: fullscreenActive,
1332
1416
  fullscreenEnabled: fullscreenEnabled
@@ -1391,8 +1475,8 @@ HandTap.defaultProps = defaultProps$8;
1391
1475
  var styles$4 = {"container":"micromag-viewer-screen-container","handTap":"micromag-viewer-screen-handTap"};
1392
1476
 
1393
1477
  var propTypes$7 = {
1394
- screen: core$1.PropTypes.screenComponent,
1395
- renderContext: core$1.PropTypes.renderContext,
1478
+ screen: core.PropTypes.screenComponent,
1479
+ renderContext: core.PropTypes.renderContext,
1396
1480
  screenState: PropTypes__default["default"].string,
1397
1481
  current: PropTypes__default["default"].bool,
1398
1482
  active: PropTypes__default["default"].bool,
@@ -1400,7 +1484,7 @@ var propTypes$7 = {
1400
1484
  width: PropTypes__default["default"].number,
1401
1485
  height: PropTypes__default["default"].number,
1402
1486
  scale: PropTypes__default["default"].number,
1403
- withNavigationHint: PropTypes__default["default"].func,
1487
+ withNavigationHint: PropTypes__default["default"].bool,
1404
1488
  className: PropTypes__default["default"].string
1405
1489
  };
1406
1490
  var defaultProps$7 = {
@@ -1453,11 +1537,11 @@ function ViewerScreen(_ref) {
1453
1537
  ViewerScreen.propTypes = propTypes$7;
1454
1538
  ViewerScreen.defaultProps = defaultProps$7;
1455
1539
 
1456
- 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"};
1457
1541
 
1458
1542
  var propTypes$6 = {
1459
1543
  direction: PropTypes__default["default"].oneOf(['previous', 'next']),
1460
- onClick: null,
1544
+ onClick: PropTypes__default["default"].func,
1461
1545
  className: PropTypes__default["default"].string
1462
1546
  };
1463
1547
  var defaultProps$6 = {
@@ -1470,37 +1554,57 @@ var NavigationButton = function NavigationButton(_ref) {
1470
1554
  var direction = _ref.direction,
1471
1555
  onClick = _ref.onClick,
1472
1556
  className = _ref.className;
1473
- return /*#__PURE__*/React__default["default"].createElement("button", {
1474
- type: "button",
1475
- className: classNames__default["default"]([styles$3.container, _defineProperty__default["default"]({}, className, className !== null)]),
1476
- onClick: onClick
1477
- }, /*#__PURE__*/React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, {
1478
- className: styles$3.arrow,
1479
- icon: direction === 'previous' ? faArrowLeft.faArrowLeft : faArrowRight.faArrowRight
1480
- }), /*#__PURE__*/React__default["default"].createElement("span", {
1481
- className: "sr-only"
1482
- }, direction === 'previous' ? /*#__PURE__*/React__default["default"].createElement(reactIntl.FormattedMessage, {
1483
- id: "zYH/31",
1484
- defaultMessage: [{
1485
- "type": 0,
1486
- "value": "Go to previous screen"
1487
- }]
1488
- }) : /*#__PURE__*/React__default["default"].createElement(reactIntl.FormattedMessage, {
1489
- id: "v9bqYj",
1490
- defaultMessage: [{
1491
- "type": 0,
1492
- "value": "Go to next screen"
1493
- }]
1494
- })));
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
+ });
1495
1587
  };
1496
1588
 
1497
1589
  NavigationButton.propTypes = propTypes$6;
1498
1590
  NavigationButton.defaultProps = defaultProps$6;
1499
1591
 
1500
- 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
1501
1602
 
1502
1603
  var propTypes$5 = {
1503
- 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
+ ]),
1504
1608
  playing: PropTypes__default["default"].bool,
1505
1609
  backgroundColor: PropTypes__default["default"].string,
1506
1610
  progressColor: PropTypes__default["default"].string,
@@ -1525,7 +1629,7 @@ var defaultProps$5 = {
1525
1629
  };
1526
1630
 
1527
1631
  var SeekBar = function SeekBar(_ref) {
1528
- var _ref3;
1632
+ var _ref4;
1529
1633
 
1530
1634
  var media = _ref.media,
1531
1635
  playing = _ref.playing,
@@ -1541,13 +1645,28 @@ var SeekBar = function SeekBar(_ref) {
1541
1645
  var progress = hooks.useMediaProgress(media, {
1542
1646
  disabled: !playing
1543
1647
  });
1544
- var onDrag = React.useCallback(function (_ref2) {
1545
- var _ref2$xy = _slicedToArray__default["default"](_ref2.xy, 1),
1546
- x = _ref2$xy[0],
1547
- elapsedTime = _ref2.elapsedTime,
1548
- active = _ref2.active,
1549
- tap = _ref2.tap,
1550
- 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();
1551
1670
 
1552
1671
  if (!active && elapsedTime > 300) {
1553
1672
  return;
@@ -1563,16 +1682,21 @@ var SeekBar = function SeekBar(_ref) {
1563
1682
  onSeek(newProgress, tap);
1564
1683
  }
1565
1684
  }, [onSeek]);
1566
- var onDragStart = React.useCallback(function () {
1685
+ var onDragStart = React.useCallback(function (event) {
1686
+ setShowTimestamp(true);
1687
+
1567
1688
  if (onSeekStart !== null) {
1568
1689
  onSeekStart();
1569
1690
  }
1570
- }, [onSeekStart]);
1691
+
1692
+ event.stopPropagation();
1693
+ }, [onSeekStart, setShowTimestamp]);
1571
1694
  var onDragEnd = React.useCallback(function () {
1572
1695
  if (onSeekEnd !== null) {
1696
+ setShowTimestamp(false);
1573
1697
  onSeekEnd();
1574
1698
  }
1575
- }, [onSeekEnd]);
1699
+ }, [onSeekEnd, setShowTimestamp]);
1576
1700
  var bind = react.useGesture({
1577
1701
  onDrag: onDrag,
1578
1702
  onDragStart: onDragStart,
@@ -1584,7 +1708,7 @@ var SeekBar = function SeekBar(_ref) {
1584
1708
  }
1585
1709
  });
1586
1710
  return /*#__PURE__*/React__default["default"].createElement("div", {
1587
- 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)])
1588
1712
  }, /*#__PURE__*/React__default["default"].createElement("div", {
1589
1713
  className: styles$2.inner
1590
1714
  }, /*#__PURE__*/React__default["default"].createElement("div", {
@@ -1598,7 +1722,12 @@ var SeekBar = function SeekBar(_ref) {
1598
1722
  left: "".concat(progress * 100, "%"),
1599
1723
  backgroundColor: progressColor
1600
1724
  }
1601
- }), /*#__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", {
1602
1731
  className: styles$2.progress,
1603
1732
  style: {
1604
1733
  transform: "scaleX(".concat(progress, ")"),
@@ -1628,7 +1757,7 @@ var SeekBar = function SeekBar(_ref) {
1628
1757
  SeekBar.propTypes = propTypes$5;
1629
1758
  SeekBar.defaultProps = defaultProps$5;
1630
1759
 
1631
- 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"};
1632
1761
 
1633
1762
  var propTypes$4 = {
1634
1763
  className: PropTypes__default["default"].string,
@@ -1733,7 +1862,8 @@ function PlaybackControls(_ref) {
1733
1862
  setPlaying(true);
1734
1863
  }
1735
1864
  }, [setPlaying, wasPlaying]);
1736
- var mediaHasAudio = mediaElement !== null && (hasAudio === null || hasAudio === true);
1865
+ var hasMedia = mediaElement !== null;
1866
+ var mediaHasAudio = hasMedia && (hasAudio === null || hasAudio === true);
1737
1867
 
1738
1868
  var _ref3 = customControlsTheme || {},
1739
1869
  color = _ref3.color,
@@ -1742,33 +1872,55 @@ function PlaybackControls(_ref) {
1742
1872
 
1743
1873
  var isCollapsed = controls && !controlsVisible && playing || !controls && mediaHasAudio;
1744
1874
  return /*#__PURE__*/React__default["default"].createElement("div", {
1745
- 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)])
1746
- }, /*#__PURE__*/React__default["default"].createElement("button", {
1747
- 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, {
1748
1877
  className: styles$1.playPauseButton,
1749
1878
  style: {
1750
1879
  color: color
1751
1880
  },
1752
1881
  onClick: playing ? onPause : onPlay,
1753
- title: intl.formatMessage({
1754
- 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",
1755
1912
  defaultMessage: [{
1756
1913
  "type": 0,
1757
- "value": "Play"
1914
+ "value": "Pause"
1758
1915
  }]
1759
- }),
1760
- "aria-label": intl.formatMessage({
1916
+ }) : intl.formatMessage({
1761
1917
  id: "ahSpiH",
1762
1918
  defaultMessage: [{
1763
1919
  "type": 0,
1764
1920
  "value": "Play"
1765
1921
  }]
1766
- }),
1767
- tabIndex: controlsVisible ? '0' : '-1'
1768
- }, /*#__PURE__*/React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, {
1769
- className: styles$1.icon,
1770
- icon: playing ? faPause.faPause : faPlay.faPlay
1771
- })), /*#__PURE__*/React__default["default"].createElement(SeekBar, {
1922
+ })
1923
+ }), /*#__PURE__*/React__default["default"].createElement(SeekBar, {
1772
1924
  className: styles$1.seekBar,
1773
1925
  media: mediaElement,
1774
1926
  playing: playing,
@@ -1779,32 +1931,54 @@ function PlaybackControls(_ref) {
1779
1931
  withSeekHead: !isCollapsed && !seekBarOnly,
1780
1932
  backgroundColor: color,
1781
1933
  progressColor: progressColor
1782
- }), /*#__PURE__*/React__default["default"].createElement("button", {
1783
- type: "button",
1784
- 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,
1785
1936
  style: {
1786
1937
  color: color
1787
1938
  },
1788
1939
  onClick: muted ? onUnmute : onMute,
1789
- title: intl.formatMessage({
1790
- 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",
1791
1970
  defaultMessage: [{
1792
1971
  "type": 0,
1793
- "value": "Mute"
1972
+ "value": "Unmute"
1794
1973
  }]
1795
- }),
1796
- "aria-label": intl.formatMessage({
1974
+ }) : intl.formatMessage({
1797
1975
  id: "vzg8Es",
1798
1976
  defaultMessage: [{
1799
1977
  "type": 0,
1800
1978
  "value": "Mute"
1801
1979
  }]
1802
- }),
1803
- tabIndex: controlsVisible || mediaHasAudio ? '0' : '-1'
1804
- }, /*#__PURE__*/React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, {
1805
- className: styles$1.icon,
1806
- icon: faVolumeUp.faVolumeUp
1807
- })));
1980
+ })
1981
+ }));
1808
1982
  }
1809
1983
 
1810
1984
  PlaybackControls.propTypes = propTypes$4;
@@ -1897,32 +2071,43 @@ function WebViewContainer(_ref) {
1897
2071
  WebViewContainer.propTypes = propTypes$3;
1898
2072
  WebViewContainer.defaultProps = defaultProps$3;
1899
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';
1900
2083
  var propTypes$2 = {
1901
- story: core$1.PropTypes.story,
2084
+ story: core.PropTypes.story,
1902
2085
  // .isRequired,
1903
2086
  basePath: PropTypes__default["default"].string,
1904
- theme: core$1.PropTypes.viewerTheme,
2087
+ theme: core.PropTypes.viewerTheme,
1905
2088
  width: PropTypes__default["default"].number,
1906
2089
  height: PropTypes__default["default"].number,
1907
2090
  screen: PropTypes__default["default"].string,
1908
2091
  screenState: PropTypes__default["default"].string,
1909
- deviceScreens: core$1.PropTypes.deviceScreens,
1910
- renderContext: core$1.PropTypes.renderContext,
1911
- visitor: core$1.PropTypes.visitor,
2092
+ deviceScreens: core.PropTypes.deviceScreens,
2093
+ renderContext: core.PropTypes.renderContext,
2094
+ visitor: core.PropTypes.visitor,
1912
2095
  onScreenChange: PropTypes__default["default"].func,
1913
2096
  tapNextScreenWidthPercent: PropTypes__default["default"].number,
1914
2097
  neighborScreensActive: PropTypes__default["default"].number,
1915
- neighborScreensMounted: PropTypes__default["default"].number,
1916
2098
  storyIsParsed: PropTypes__default["default"].bool,
1917
- landscapeScreenMargin: PropTypes__default["default"].number,
1918
- landscapeSmallScreenScale: PropTypes__default["default"].number,
2099
+ // landscapeScreenMargin: PropTypes.number,
2100
+ // landscapeSmallScreenScale: PropTypes.number,
1919
2101
  withMetadata: PropTypes__default["default"].bool,
2102
+ withoutGestures: PropTypes__default["default"].bool,
1920
2103
  withoutMenu: PropTypes__default["default"].bool,
1921
2104
  withoutScreensMenu: PropTypes__default["default"].bool,
1922
2105
  withoutShareMenu: PropTypes__default["default"].bool,
1923
2106
  withoutMenuShadow: PropTypes__default["default"].bool,
1924
2107
  withoutFullscreen: PropTypes__default["default"].bool,
1925
- withLandscapeSiblingsScreens: PropTypes__default["default"].bool,
2108
+ withoutNavigationArrow: PropTypes__default["default"].bool,
2109
+ withoutTransitions: PropTypes__default["default"].bool,
2110
+ withNeighborScreens: PropTypes__default["default"].bool,
1926
2111
  withNavigationHint: PropTypes__default["default"].bool,
1927
2112
  withoutPlaybackControls: PropTypes__default["default"].bool,
1928
2113
  closeable: PropTypes__default["default"].bool,
@@ -1930,9 +2115,9 @@ var propTypes$2 = {
1930
2115
  onInteraction: PropTypes__default["default"].func,
1931
2116
  onEnd: PropTypes__default["default"].func,
1932
2117
  onViewModeChange: PropTypes__default["default"].func,
1933
- currentScreenMedia: core$1.PropTypes.ref,
2118
+ currentScreenMedia: core.PropTypes.ref,
1934
2119
  menuIsScreenWidth: PropTypes__default["default"].bool,
1935
- screensMedias: core$1.PropTypes.ref,
2120
+ screensMedias: core.PropTypes.ref,
1936
2121
  screenSizeOptions: PropTypes__default["default"].shape({
1937
2122
  withoutMaxSize: PropTypes__default["default"].bool,
1938
2123
  desktopHeightRatio: PropTypes__default["default"].number,
@@ -1954,18 +2139,20 @@ var defaultProps$2 = {
1954
2139
  onScreenChange: null,
1955
2140
  tapNextScreenWidthPercent: 0.8,
1956
2141
  neighborScreensActive: 1,
1957
- neighborScreensMounted: 1,
1958
2142
  storyIsParsed: false,
1959
- landscapeScreenMargin: 20,
1960
- landscapeSmallScreenScale: 0.9,
2143
+ // landscapeScreenMargin: 20,
2144
+ // landscapeSmallScreenScale: 0.9,
1961
2145
  withMetadata: false,
2146
+ withNeighborScreens: false,
2147
+ withNavigationHint: false,
2148
+ withoutGestures: false,
1962
2149
  withoutMenu: false,
1963
2150
  withoutScreensMenu: false,
1964
2151
  withoutShareMenu: false,
1965
2152
  withoutMenuShadow: false,
1966
2153
  withoutFullscreen: false,
1967
- withLandscapeSiblingsScreens: false,
1968
- withNavigationHint: false,
2154
+ withoutTransitions: false,
2155
+ withoutNavigationArrow: false,
1969
2156
  withoutPlaybackControls: false,
1970
2157
  menuIsScreenWidth: false,
1971
2158
  closeable: false,
@@ -1994,17 +2181,17 @@ var Viewer = function Viewer(_ref) {
1994
2181
  visitor = _ref.visitor,
1995
2182
  tapNextScreenWidthPercent = _ref.tapNextScreenWidthPercent,
1996
2183
  neighborScreensActive = _ref.neighborScreensActive,
1997
- neighborScreensMounted = _ref.neighborScreensMounted,
1998
2184
  storyIsParsed = _ref.storyIsParsed,
1999
- landscapeScreenMargin = _ref.landscapeScreenMargin,
2000
- landscapeSmallScreenScale = _ref.landscapeSmallScreenScale,
2001
2185
  withMetadata = _ref.withMetadata,
2186
+ withoutGestures = _ref.withoutGestures,
2002
2187
  withoutMenu = _ref.withoutMenu,
2003
2188
  withoutScreensMenu = _ref.withoutScreensMenu,
2004
2189
  withoutShareMenu = _ref.withoutShareMenu,
2005
2190
  withoutMenuShadow = _ref.withoutMenuShadow;
2006
2191
  _ref.withoutFullscreen;
2007
- var withLandscapeSiblingsScreens = _ref.withLandscapeSiblingsScreens,
2192
+ var withoutNavigationArrow = _ref.withoutNavigationArrow;
2193
+ _ref.withoutTransitions;
2194
+ var withNeighborScreens = _ref.withNeighborScreens,
2008
2195
  withNavigationHint = _ref.withNavigationHint,
2009
2196
  withoutPlaybackControls = _ref.withoutPlaybackControls,
2010
2197
  menuIsScreenWidth = _ref.menuIsScreenWidth,
@@ -2018,7 +2205,10 @@ var Viewer = function Viewer(_ref) {
2018
2205
  screensMedias = _ref.screensMedias,
2019
2206
  screenSizeOptions = _ref.screenSizeOptions,
2020
2207
  className = _ref.className;
2021
- var intl = reactIntl.useIntl();
2208
+
2209
+ /**
2210
+ * Screen Data + Processing
2211
+ */
2022
2212
  var parsedStory = hooks.useParsedStory(story, {
2023
2213
  disabled: storyIsParsed
2024
2214
  }) || {};
@@ -2030,20 +2220,59 @@ var Viewer = function Viewer(_ref) {
2030
2220
  metadata = _parsedStory$metadata === void 0 ? null : _parsedStory$metadata,
2031
2221
  _parsedStory$fonts = parsedStory.fonts,
2032
2222
  fonts = _parsedStory$fonts === void 0 ? null : _parsedStory$fonts;
2223
+ var screensCount = screens.length;
2033
2224
  var eventsManager = React.useMemo(function () {
2034
2225
  return new EventEmitter__default["default"]();
2035
- }, [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;
2036
2233
 
2037
- var _ref2 = viewerTheme || {},
2038
- textStyles = _ref2.textStyles;
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
+ */
2039
2264
 
2040
- var _ref3 = textStyles || {},
2041
- _ref3$title = _ref3.title,
2042
- themeTextStyle = _ref3$title === void 0 ? null : _ref3$title;
2043
2265
 
2044
- var _ref4 = themeTextStyle || {},
2045
- _ref4$fontFamily = _ref4.fontFamily,
2046
- themeFont = _ref4$fontFamily === void 0 ? null : _ref4$fontFamily; // Fonts
2266
+ var _ref5 = viewerTheme || {},
2267
+ textStyles = _ref5.textStyles;
2268
+
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
2047
2276
 
2048
2277
 
2049
2278
  var finalFonts = React.useMemo(function () {
@@ -2070,8 +2299,12 @@ var Viewer = function Viewer(_ref) {
2070
2299
  _usePlaybackContext$m = _usePlaybackContext.media,
2071
2300
  playbackMedia = _usePlaybackContext$m === void 0 ? null : _usePlaybackContext$m;
2072
2301
 
2073
- var trackScreenView = hooks.useTrackScreenView();
2074
- 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
2075
2308
 
2076
2309
  var _useScreenSizeFromEle = hooks.useScreenSizeFromElement(_objectSpread__default["default"]({
2077
2310
  width: width,
@@ -2082,21 +2315,26 @@ var Viewer = function Viewer(_ref) {
2082
2315
  screenSize = _useScreenSizeFromEle.screenSize,
2083
2316
  screenScale = _useScreenSizeFromEle.scale;
2084
2317
 
2085
- var _ref5 = screenSize || {},
2086
- _ref5$width = _ref5.width,
2087
- screenWidth = _ref5$width === void 0 ? null : _ref5$width,
2088
- _ref5$height = _ref5.height,
2089
- screenHeight = _ref5$height === void 0 ? null : _ref5$height,
2090
- _ref5$landscape = _ref5.landscape,
2091
- landscape = _ref5$landscape === void 0 ? false : _ref5$landscape,
2092
- _ref5$menuOverScreen = _ref5.menuOverScreen,
2093
- 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;
2094
2327
 
2095
2328
  var screenContainerWidth = screenScale !== null ? screenWidth * screenScale : screenWidth;
2096
2329
  var screenContainerHeight = screenScale !== null ? screenHeight * screenScale : screenHeight;
2097
2330
  var hasSize = screenWidth > 0 && screenHeight > 0;
2098
- var ready = hasSize; // && fontsLoaded;
2099
-
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]);
2100
2338
  React.useEffect(function () {
2101
2339
  if (ready && onViewModeChange !== null) {
2102
2340
  onViewModeChange({
@@ -2105,21 +2343,14 @@ var Viewer = function Viewer(_ref) {
2105
2343
  });
2106
2344
  }
2107
2345
  }, [ready, landscape, menuOverScreen, onViewModeChange]);
2108
- var screensMediasRef = React.useRef([]); // Screen index
2109
-
2110
- var screenIndex = React.useMemo(function () {
2111
- return Math.max(0, screens.findIndex(function (it) {
2112
- return "".concat(it.id) === "".concat(screenId);
2113
- }));
2114
- }, [screenId, screens]);
2115
-
2116
- if (currentScreenMedia !== null) {
2117
- currentScreenMedia.current = screensMediasRef.current[screenIndex] || null;
2118
- }
2346
+ /**
2347
+ * Screen Transitions
2348
+ */
2119
2349
 
2120
- if (screensMedias !== null) {
2121
- screensMedias.current = screensMediasRef.current;
2122
- }
2350
+ var transitionType = landscape && withNeighborScreens ? DEFAULT_TRANSITION_TYPE_LANDSCAPE : DEFAULT_TRANSITION_TYPE_PORTRAIT;
2351
+ /**
2352
+ * Screen Navigation
2353
+ */
2123
2354
 
2124
2355
  var changeIndex = React.useCallback(function (index) {
2125
2356
  if (index === screenIndex) {
@@ -2133,23 +2364,37 @@ var Viewer = function Viewer(_ref) {
2133
2364
  if (onScreenChange !== null) {
2134
2365
  onScreenChange(screens[index], index);
2135
2366
  }
2136
- }, [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;
2137
2373
 
2138
- var trackingEnabled = isView;
2139
- var currentScreen = screens[screenIndex] || null;
2140
- React.useEffect(function () {
2141
- if (trackingEnabled && currentScreen !== null) {
2142
- trackScreenView(currentScreen, screenIndex);
2374
+ if (end && onEnd !== null) {
2375
+ onEnd();
2143
2376
  }
2144
- }, [currentScreen, trackScreenView, trackingEnabled]); // Handle interaction enable
2145
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]);
2146
2392
  var gotoPreviousScreen = React.useCallback(function () {
2147
2393
  changeIndex(Math.max(0, screenIndex - 1));
2148
- }, [changeIndex]);
2394
+ }, [changeIndex, screenIndex]);
2149
2395
  var gotoNextScreen = React.useCallback(function () {
2150
2396
  changeIndex(Math.min(screens.length - 1, screenIndex + 1));
2151
- }, [changeIndex]);
2152
- var screensCount = screens.length;
2397
+ }, [changeIndex, screenIndex]);
2153
2398
 
2154
2399
  var _useState = React.useState(false),
2155
2400
  _useState2 = _slicedToArray__default["default"](_useState, 2),
@@ -2165,37 +2410,12 @@ var Viewer = function Viewer(_ref) {
2165
2410
  setHasInteracted(true);
2166
2411
  }
2167
2412
  }, [onInteraction, hasInteracted, setHasInteracted]);
2168
- var onScreenNavigate = React.useCallback(function (_ref6) {
2169
- var index = _ref6.index,
2170
- newIndex = _ref6.newIndex,
2171
- end = _ref6.end,
2172
- direction = _ref6.direction;
2173
-
2174
- if (end && onEnd !== null) {
2175
- onEnd();
2176
- }
2177
-
2178
- changeIndex(newIndex);
2179
- eventsManager.emit('navigate', {
2180
- newIndex: newIndex,
2181
- index: index,
2182
- direction: direction,
2183
- end: end
2184
- });
2185
-
2186
- if (end) {
2187
- eventsManager.emit('navigate_end');
2188
- } else {
2189
- eventsManager.emit("navigate_".concat(direction), newIndex);
2190
- }
2191
- }, [onEnd, changeIndex]);
2192
2413
 
2193
2414
  var _useScreenInteraction = useScreenInteraction({
2194
2415
  screens: screens,
2195
2416
  screenIndex: screenIndex,
2196
2417
  screenWidth: screenContainerWidth,
2197
2418
  disableCurrentScreenNavigation: !isView,
2198
- clickOnSiblings: landscape && withLandscapeSiblingsScreens,
2199
2419
  nextScreenWidthPercent: tapNextScreenWidthPercent,
2200
2420
  onInteract: onInteractionPrivate,
2201
2421
  onNavigate: onScreenNavigate
@@ -2203,102 +2423,127 @@ var Viewer = function Viewer(_ref) {
2203
2423
  interactWithScreen = _useScreenInteraction.interact,
2204
2424
  currentScreenInteractionEnabled = _useScreenInteraction.currentScreenInteractionEnabled,
2205
2425
  enableInteraction = _useScreenInteraction.enableInteraction,
2206
- disableInteraction = _useScreenInteraction.disableInteraction; // Handle tap on screens
2207
-
2208
-
2209
- var onDragScreen = React.useCallback(function (_ref7) {
2210
- var _ref7$args = _slicedToArray__default["default"](_ref7.args, 1),
2211
- tapScreenIndex = _ref7$args[0],
2212
- event = _ref7.event,
2213
- target = _ref7.target,
2214
- currentTarget = _ref7.currentTarget,
2215
- tap = _ref7.tap,
2216
- _ref7$xy = _slicedToArray__default["default"](_ref7.xy, 2),
2217
- x = _ref7$xy[0],
2218
- y = _ref7$xy[1];
2219
-
2220
- if (tap) {
2221
- interactWithScreen({
2222
- event: event,
2223
- target: target,
2224
- currentTarget: currentTarget,
2225
- index: tapScreenIndex,
2226
- x: x,
2227
- y: y
2228
- });
2229
- }
2230
- }, [interactWithScreen]);
2231
- var dragScreenBind = react.useDrag(onDragScreen, {
2232
- filterTaps: true
2233
- }); // Handles tap when landscape (space around current screen)
2234
-
2235
- var onDragContent = React.useCallback(function (_ref8) {
2236
- var tap = _ref8.tap,
2237
- target = _ref8.target,
2238
- currentTarget = _ref8.currentTarget,
2239
- _ref8$xy = _slicedToArray__default["default"](_ref8.xy, 1),
2240
- x = _ref8$xy[0];
2241
-
2242
- if (!landscape || withLandscapeSiblingsScreens || target !== contentRef.current) {
2243
- 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;
2244
2466
  }
2245
2467
 
2246
- if (tap) {
2247
- var _currentTarget$getBou = currentTarget.getBoundingClientRect(),
2248
- _currentTarget$getBou2 = _currentTarget$getBou.left,
2249
- contentX = _currentTarget$getBou2 === void 0 ? 0 : _currentTarget$getBou2,
2250
- _currentTarget$getBou3 = _currentTarget$getBou.width,
2251
- 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?
2252
2474
 
2253
- var hasTappedLeft = x - contentX < contentWidth * 0.5;
2254
- var nextIndex = hasTappedLeft ? Math.max(0, screenIndex - 1) : Math.min(screensCount - 1, screenIndex + 1);
2475
+ if (!active && delta === 1 && !reachedBounds) {
2255
2476
  onScreenNavigate({
2256
2477
  index: screenIndex,
2257
- newIndex: nextIndex
2478
+ newIndex: progress
2258
2479
  });
2259
2480
  }
2260
- }, [screenIndex, screensCount, landscape, withLandscapeSiblingsScreens]);
2261
- var dragContentBind = react.useDrag(onDragContent, {
2262
- filterTaps: true
2263
- });
2264
- var onScreenKeyUp = React.useCallback(function (_ref9, i) {
2265
- 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;
2266
2504
 
2267
- if (key === 'Enter' && withLandscapeSiblingsScreens && landscape && i !== screenIndex) {
2268
- changeIndex(i);
2505
+ var _clamped = Math.min(1, Math.max(0, _t));
2506
+
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
+ };
2269
2515
  }
2270
- }, [withLandscapeSiblingsScreens, changeIndex, landscape, screenIndex]); // swipe menu open
2271
2516
 
2272
- 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
+ };
2525
+
2526
+ var _useFullscreen = hooks.useFullscreen(containerRef.current || null),
2527
+ toggleFullscreen = _useFullscreen.toggle,
2528
+ fullscreenActive = _useFullscreen.active,
2529
+ fullscreenEnabled = _useFullscreen.enabled;
2273
2530
 
2274
- var _useState3 = React.useState(false),
2275
- _useState4 = _slicedToArray__default["default"](_useState3, 2),
2276
- menuOpened = _useState4[0],
2277
- setMenuOpened = _useState4[1];
2278
-
2279
- var onMenuRequestOpen = React.useCallback(function () {
2280
- return setMenuOpened(true);
2281
- }, [setMenuOpened]);
2282
- var onMenuRequestClose = React.useCallback(function () {
2283
- return setMenuOpened(false);
2284
- }, [setMenuOpened]);
2285
- var onClickMenu = React.useCallback(function () {
2286
- onInteractionPrivate();
2287
- setMenuOpened(true);
2288
- }, [changeIndex, onInteractionPrivate, setMenuOpened]);
2289
- var onClickMenuItem = React.useCallback(function (_ref10) {
2290
- var itemScreenId = _ref10.screenId;
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;
2291
2540
  onInteractionPrivate();
2292
- var index = screens.findIndex(function (_ref11) {
2293
- var id = _ref11.id;
2541
+ var index = screens.findIndex(function (_ref14) {
2542
+ var id = _ref14.id;
2294
2543
  return id === itemScreenId;
2295
2544
  });
2296
2545
  changeIndex(index);
2297
-
2298
- if (menuOpened) {
2299
- setMenuOpened(false);
2300
- }
2301
- }, [onInteractionPrivate, changeIndex, menuOpened, setMenuOpened]);
2546
+ }, [onInteractionPrivate, changeIndex]);
2302
2547
  var onContextMenu = React.useCallback(function (e) {
2303
2548
  if (!landscape) {
2304
2549
  e.preventDefault();
@@ -2306,28 +2551,16 @@ var Viewer = function Viewer(_ref) {
2306
2551
  }
2307
2552
 
2308
2553
  return true;
2309
- }, [landscape]);
2554
+ }, [landscape]); // hmm?
2555
+
2310
2556
  var overscrollStyle = /*#__PURE__*/React__default["default"].createElement("style", {
2311
2557
  type: "text/css"
2312
- }, "body { overscroll-behavior: contain; }"); // Fullscreen
2313
-
2314
- var _useFullscreen = hooks.useFullscreen(containerRef.current || null),
2315
- toggleFullscreen = _useFullscreen.toggle,
2316
- fullscreenActive = _useFullscreen.active,
2317
- fullscreenEnabled = _useFullscreen.enabled; // Keyboard Events
2318
-
2319
-
2558
+ }, "body { overscroll-behavior: contain; }");
2320
2559
  var keyboardShortcuts = React.useMemo(function () {
2321
2560
  return {
2322
2561
  f: function f() {
2323
2562
  return toggleFullscreen();
2324
2563
  },
2325
- m: function m() {
2326
- return setMenuOpened(!menuOpened);
2327
- },
2328
- escape: function escape() {
2329
- return setMenuOpened(false);
2330
- },
2331
2564
  arrowleft: function arrowleft() {
2332
2565
  return gotoPreviousScreen();
2333
2566
  },
@@ -2338,55 +2571,10 @@ var Viewer = function Viewer(_ref) {
2338
2571
  return gotoNextScreen();
2339
2572
  }
2340
2573
  };
2341
- }, [menuOpened, setMenuOpened, gotoPreviousScreen, gotoNextScreen]);
2574
+ }, [gotoPreviousScreen, gotoNextScreen]);
2342
2575
  useKeyboardShortcuts(keyboardShortcuts, {
2343
2576
  disabled: renderContext !== 'view'
2344
2577
  });
2345
-
2346
- var _ref12 = currentScreen || {},
2347
- screenParameters = _ref12.parameters;
2348
-
2349
- var _ref13 = screenParameters || {},
2350
- screenMetadata = _ref13.metadata;
2351
-
2352
- var _ref14 = screenMetadata || {},
2353
- _ref14$title = _ref14.title,
2354
- screenTitle = _ref14$title === void 0 ? null : _ref14$title,
2355
- _ref14$description = _ref14.description,
2356
- screenDescription = _ref14$description === void 0 ? null : _ref14$description;
2357
-
2358
- var finalTitle = screenTitle !== null ? screenTitle : title;
2359
- var finalMetadata = React.useMemo(function () {
2360
- return screenDescription !== null ? _objectSpread__default["default"](_objectSpread__default["default"]({}, metadata), {}, {
2361
- description: screenDescription
2362
- }) : metadata;
2363
- }, [metadata, screenDescription]); // Get element height
2364
-
2365
- var _useDimensionObserver = hooks.useDimensionObserver(),
2366
- menuDotsContainerRef = _useDimensionObserver.ref,
2367
- _useDimensionObserver2 = _useDimensionObserver.height,
2368
- menuDotsContainerHeight = _useDimensionObserver2 === void 0 ? 0 : _useDimensionObserver2;
2369
-
2370
- var _useDimensionObserver3 = hooks.useDimensionObserver(),
2371
- playbackControlsContainerRef = _useDimensionObserver3.ref,
2372
- _useDimensionObserver4 = _useDimensionObserver3.height,
2373
- playbackControlsContainerHeight = _useDimensionObserver4 === void 0 ? 0 : _useDimensionObserver4;
2374
-
2375
- var _useMemo = React.useMemo(function () {
2376
- return neighborScreensMounted !== null ? {
2377
- startIndex: Math.max(screenIndex - (neighborScreensActive + neighborScreensMounted), 0),
2378
- endIndex: Math.min(screenIndex + (neighborScreensActive + neighborScreensMounted), screensCount)
2379
- } : {
2380
- startIndex: 0,
2381
- endIndex: screensCount - 1
2382
- };
2383
- }, [screenIndex, neighborScreensActive, neighborScreensMounted, screensCount]),
2384
- mountedScreenStartIndex = _useMemo.startIndex,
2385
- mountedScreenEndIndex = _useMemo.endIndex;
2386
-
2387
- var mountedScreens = React.useMemo(function () {
2388
- return neighborScreensMounted != null ? screens.slice(mountedScreenStartIndex, mountedScreenEndIndex) : screens;
2389
- }, [screens, mountedScreenStartIndex, mountedScreenEndIndex, neighborScreensActive, neighborScreensMounted]);
2390
2578
  return /*#__PURE__*/React__default["default"].createElement(contexts.VisitorProvider, {
2391
2579
  visitor: visitor
2392
2580
  }, /*#__PURE__*/React__default["default"].createElement(contexts.ScreenSizeProvider, {
@@ -2411,13 +2599,12 @@ var Viewer = function Viewer(_ref) {
2411
2599
  }), /*#__PURE__*/React__default["default"].createElement("div", {
2412
2600
  className: classNames__default["default"]([styles$6.container, screenSize.screens.map(function (screenName) {
2413
2601
  return "story-screen-".concat(screenName);
2414
- }), (_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)]),
2415
2603
  ref: containerRef,
2416
2604
  onContextMenu: onContextMenu
2417
2605
  }, !withoutMenu ? /*#__PURE__*/React__default["default"].createElement(ViewerMenu, {
2418
2606
  story: parsedStory,
2419
2607
  currentScreenIndex: screenIndex,
2420
- opened: menuOpened,
2421
2608
  withShadow: menuOverScreen && !withoutMenuShadow,
2422
2609
  toggleFullscreen: toggleFullscreen,
2423
2610
  fullscreenActive: fullscreenActive,
@@ -2427,108 +2614,64 @@ var Viewer = function Viewer(_ref) {
2427
2614
  screenSize: screenSize,
2428
2615
  menuWidth: menuIsScreenWidth ? screenContainerWidth : null,
2429
2616
  trackingEnabled: trackingEnabled,
2430
- onClickItem: onClickMenuItem,
2431
- onClickMenu: onClickMenu,
2617
+ onClickScreen: onClickScreen,
2432
2618
  onClickCloseViewer: onCloseViewer,
2433
- onRequestOpen: onMenuRequestOpen,
2434
- onRequestClose: onMenuRequestClose,
2435
2619
  withDotItemClick: screenContainerWidth > 400,
2436
2620
  withoutScreensMenu: withoutScreensMenu,
2437
2621
  withoutShareMenu: withoutShareMenu,
2438
2622
  refDots: menuDotsContainerRef
2439
2623
  }) : null, ready || withoutScreensTransforms ? /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
2440
- ref: contentRef,
2441
2624
  className: styles$6.content
2442
- }, dragContentBind()), mountedScreens.map(function (mountedScreen, mountedIndex) {
2443
- var _ref16;
2444
-
2445
- var i = mountedScreenStartIndex + mountedIndex;
2446
- var current = i === parseInt(screenIndex, 10);
2447
- var active = i >= screenIndex - neighborScreensActive && i <= screenIndex + neighborScreensActive;
2448
- var screenTransform = null;
2449
-
2450
- if (landscape) {
2451
- var max = i - screenIndex;
2452
- var distance = (screenContainerWidth + landscapeScreenMargin) * max; // Compensates for scaling
2453
-
2454
- if (max !== 0) {
2455
- var halfMargin = screenContainerWidth * (1 - landscapeSmallScreenScale) / 2;
2456
- distance -= halfMargin * max;
2457
-
2458
- if (max < -1) {
2459
- distance -= halfMargin * (max + 1);
2460
- } else if (max > 1) {
2461
- distance -= halfMargin * (max - 1);
2462
- }
2463
- }
2464
-
2465
- screenTransform = withLandscapeSiblingsScreens ? "translateX(calc(".concat(distance, "px - 50%)) scale(").concat(current ? 1 : landscapeSmallScreenScale, ")") : null;
2466
- } else {
2467
- 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
2468
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
2469
2639
 
2470
- return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, {
2471
- key: "screen-viewer-".concat(mountedScreen.id || '', "-").concat(i + 1)
2472
- }, /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
2473
- style: {
2474
- width: screenContainerWidth,
2475
- height: screenContainerHeight,
2476
- transform: !withoutScreensTransforms ? screenTransform : null
2477
- },
2478
- 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
2479
- ,
2480
- tabIndex: !active ? -1 : null,
2481
- "aria-hidden": !current,
2482
- "aria-label": intl.formatMessage({
2483
- id: "LkVfwW",
2484
- defaultMessage: [{
2485
- "type": 0,
2486
- "value": "Screen "
2487
- }, {
2488
- "type": 1,
2489
- "value": "index"
2490
- }]
2491
- }, {
2492
- index: i + 1
2493
- }),
2494
- onKeyUp: function onKeyUp(e) {
2495
- return onScreenKeyUp(e, i);
2496
- }
2497
- }, dragScreenBind(i)), current && screenIndex > 0 ? /*#__PURE__*/React__default["default"].createElement(NavigationButton, {
2498
- direction: "previous",
2499
- className: classNames__default["default"]([styles$6.navButton, styles$6.previous]),
2500
- onClick: gotoPreviousScreen
2501
- }) : 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, {
2502
2650
  className: styles$6.screen,
2503
- screen: mountedScreen,
2651
+ screen: screen,
2504
2652
  screenState: current ? screenState : null,
2505
- renderContext: renderContext,
2506
2653
  index: i,
2507
2654
  current: current,
2508
2655
  active: active,
2509
2656
  mediaRef: function mediaRef(ref) {
2510
2657
  screensMediasRef.current[i] = ref;
2511
2658
  },
2659
+ renderContext: renderContext,
2512
2660
  width: screenWidth,
2513
2661
  height: screenHeight,
2514
2662
  scale: screenScale,
2515
- withNavigationHint: withNavigationHint && !withLandscapeSiblingsScreens && current && screenIndex === 0 && !hasInteracted
2516
- }) : null, current && screenIndex < screens.length - 1 ? /*#__PURE__*/React__default["default"].createElement(NavigationButton, {
2517
- direction: "next",
2518
- className: classNames__default["default"]([styles$6.navButton, styles$6.next]),
2519
- onClick: gotoNextScreen
2520
- }) : null));
2521
- }), !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", {
2522
2670
  className: styles$6.playbackControls,
2523
2671
  ref: playbackControlsContainerRef
2524
- }, /*#__PURE__*/React__default["default"].createElement("div", {
2525
- className: styles$6.playbackControlsContainer,
2526
- style: {
2527
- width: screenContainerWidth
2528
- }
2529
2672
  }, /*#__PURE__*/React__default["default"].createElement(PlaybackControls, {
2530
2673
  className: styles$6.controls
2531
- }))) : null) : null, /*#__PURE__*/React__default["default"].createElement(WebViewContainer, {
2674
+ })) : null) : null, /*#__PURE__*/React__default["default"].createElement(WebViewContainer, {
2532
2675
  className: styles$6.webView,
2533
2676
  style: {
2534
2677
  maxWidth: Math.max(screenContainerWidth, 600)
@@ -2541,7 +2684,7 @@ Viewer.defaultProps = defaultProps$2;
2541
2684
 
2542
2685
  var _excluded$1 = ["story", "pathWithIndex", "children", "onScreenChange"];
2543
2686
  var propTypes$1 = {
2544
- story: core$1.PropTypes.story,
2687
+ story: core.PropTypes.story,
2545
2688
  // .isRequired,
2546
2689
  pathWithIndex: PropTypes__default["default"].bool,
2547
2690
  children: PropTypes__default["default"].func,
@@ -2618,7 +2761,7 @@ var defaultRoutes = {
2618
2761
 
2619
2762
  var _excluded = ["story", "screenComponents", "memoryRouter", "basePath", "routes", "withoutRouter", "googleApiKey", "trackingVariables", "locale", "locales", "translations", "pathWithIndex"];
2620
2763
  var propTypes = {
2621
- story: core$1.PropTypes.story,
2764
+ story: core.PropTypes.story,
2622
2765
  screen: PropTypes__default["default"].string,
2623
2766
  screenComponents: PropTypes__default["default"].objectOf(PropTypes__default["default"].elementType),
2624
2767
  memoryRouter: PropTypes__default["default"].bool,
@@ -2626,7 +2769,7 @@ var propTypes = {
2626
2769
  routes: routes,
2627
2770
  withoutRouter: PropTypes__default["default"].bool,
2628
2771
  googleApiKey: PropTypes__default["default"].string,
2629
- trackingVariables: core$1.PropTypes.trackingVariables,
2772
+ trackingVariables: core.PropTypes.trackingVariables,
2630
2773
  locale: PropTypes__default["default"].string,
2631
2774
  locales: PropTypes__default["default"].arrayOf(PropTypes__default["default"].string),
2632
2775
  translations: PropTypes__default["default"].objectOf(PropTypes__default["default"].string),