@micromag/viewer 0.3.179 → 0.3.183

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 +17 -13
  2. package/es/index.js +1571 -1163
  3. package/lib/index.js +1585 -1177
  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,393 @@ 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 styles$g = {"container":"micromag-viewer-buttons-button-container","asLink":"micromag-viewer-buttons-button-asLink","icon":"micromag-viewer-buttons-button-icon","label":"micromag-viewer-buttons-button-label","withIcon":"micromag-viewer-buttons-button-withIcon","right":"micromag-viewer-buttons-button-right","icon-right":"micromag-viewer-buttons-button-icon-right","withIconColumns":"micromag-viewer-buttons-button-withIconColumns","linkDisabled":"micromag-viewer-buttons-button-linkDisabled"};
238
+
239
+ var _excluded$8 = ["type", "theme", "size", "href", "external", "direct", "target", "label", "children", "focusable", "active", "icon", "iconPosition", "disabled", "loading", "disableOnLoading", "withoutTheme", "asLink", "onClick", "className", "iconClassName", "labelClassName", "refButton"];
240
+ var propTypes$n = {
241
+ type: PropTypes__default["default"].string,
242
+ theme: core.PropTypes.buttonTheme,
243
+ size: core.PropTypes.buttonSize,
244
+ href: PropTypes__default["default"].string,
245
+ external: PropTypes__default["default"].bool,
246
+ direct: PropTypes__default["default"].bool,
247
+ target: PropTypes__default["default"].string,
248
+ label: core.PropTypes.label,
249
+ children: core.PropTypes.label,
250
+ focusable: PropTypes__default["default"].bool,
251
+ active: PropTypes__default["default"].bool,
252
+ icon: PropTypes__default["default"].node,
253
+ iconPosition: PropTypes__default["default"].oneOf(['left', 'right', 'inline']),
254
+ disabled: PropTypes__default["default"].bool,
255
+ loading: PropTypes__default["default"].bool,
256
+ disableOnLoading: PropTypes__default["default"].bool,
257
+ withoutTheme: PropTypes__default["default"].bool,
258
+ asLink: PropTypes__default["default"].bool,
251
259
  className: PropTypes__default["default"].string,
252
- onShare: PropTypes__default["default"].func,
253
- onCancel: PropTypes__default["default"].func
260
+ iconClassName: PropTypes__default["default"].string,
261
+ labelClassName: PropTypes__default["default"].string,
262
+ onClick: PropTypes__default["default"].func,
263
+ refButton: PropTypes__default["default"].oneOfType([PropTypes__default["default"].func, PropTypes__default["default"].shape({
264
+ current: PropTypes__default["default"].any // eslint-disable-line
265
+
266
+ })])
254
267
  };
255
- var defaultProps$h = {
256
- url: null,
257
- title: null,
258
- opened: false,
268
+ var defaultProps$n = {
269
+ type: 'button',
270
+ theme: null,
271
+ size: null,
272
+ href: null,
273
+ external: false,
274
+ direct: false,
275
+ target: '_blank',
276
+ label: null,
277
+ children: null,
278
+ focusable: true,
279
+ active: false,
280
+ icon: null,
281
+ iconPosition: 'inline',
282
+ disabled: false,
283
+ loading: false,
284
+ disableOnLoading: true,
285
+ withoutTheme: false,
286
+ asLink: false,
259
287
  className: null,
260
- onShare: null,
261
- onCancel: null
288
+ iconClassName: null,
289
+ labelClassName: null,
290
+ onClick: null,
291
+ refButton: null
262
292
  };
263
293
 
264
- var ShareModal = function ShareModal(_ref) {
265
- var _ref3;
294
+ var Button = function Button(_ref) {
295
+ var _ref2;
266
296
 
267
- var url = _ref.url,
268
- title = _ref.title,
269
- opened = _ref.opened,
297
+ var type = _ref.type,
298
+ theme = _ref.theme;
299
+ _ref.size;
300
+ var href = _ref.href,
301
+ external = _ref.external,
302
+ direct = _ref.direct,
303
+ target = _ref.target,
304
+ label = _ref.label,
305
+ children = _ref.children,
306
+ focusable = _ref.focusable;
307
+ _ref.active;
308
+ var icon = _ref.icon,
309
+ iconPosition = _ref.iconPosition,
310
+ disabled = _ref.disabled,
311
+ loading = _ref.loading,
312
+ disableOnLoading = _ref.disableOnLoading;
313
+ _ref.withoutTheme;
314
+ var asLink = _ref.asLink,
315
+ onClick = _ref.onClick,
270
316
  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;
317
+ iconClassName = _ref.iconClassName,
318
+ labelClassName = _ref.labelClassName,
319
+ refButton = _ref.refButton,
320
+ props = _objectWithoutProperties__default["default"](_ref, _excluded$8);
321
+
322
+ var finalLabel = label || children;
323
+ var text = finalLabel !== null ? /*#__PURE__*/React__default["default"].createElement(components.Label, null, finalLabel) : null;
324
+ var hasChildren = label !== null && children !== null;
325
+ var hasIcon = icon !== null;
326
+ var hasInlineIcon = hasIcon && (iconPosition === 'inline' || text === null);
327
+ var hasIconColumns = hasIcon && !hasInlineIcon;
328
+ var buttonClassNames = classNames__default["default"]([styles$g.container, styles$g["icon-".concat(iconPosition)], (_ref2 = {}, _defineProperty__default["default"](_ref2, styles$g.withIcon, hasIcon), _defineProperty__default["default"](_ref2, styles$g.withIconColumns, hasIconColumns), _defineProperty__default["default"](_ref2, styles$g.withText, text !== null), _defineProperty__default["default"](_ref2, styles$g.isLink, href !== null), _defineProperty__default["default"](_ref2, styles$g.asLink, asLink), _defineProperty__default["default"](_ref2, styles$g.isDisabled, disabled), _defineProperty__default["default"](_ref2, styles$g.isLoading, loading), _defineProperty__default["default"](_ref2, className, className !== null), _ref2)]);
329
+
330
+ var _ref3 = theme || {},
331
+ _ref3$colors = _ref3.colors,
332
+ colors = _ref3$colors === void 0 ? null : _ref3$colors;
333
+
334
+ var _ref4 = colors || {},
335
+ _ref4$primary = _ref4.primary,
336
+ brandPrimaryColor = _ref4$primary === void 0 ? null : _ref4$primary;
337
+
338
+ var primaryColor = utils.getStyleFromColor(brandPrimaryColor, 'color');
339
+
340
+ var buttonStyles = _objectSpread__default["default"]({}, primaryColor);
341
+
342
+ var content = /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, hasInlineIcon ? /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement("span", {
343
+ className: classNames__default["default"]([styles$g.icon, _defineProperty__default["default"]({}, iconClassName, iconClassName !== null)])
344
+ }, icon), text !== null ? /*#__PURE__*/React__default["default"].createElement("span", {
345
+ className: classNames__default["default"]([styles$g.label, _defineProperty__default["default"]({}, labelClassName, labelClassName !== null)])
346
+ }, text) : null) : null, hasIconColumns ? /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, iconPosition === 'left' ? /*#__PURE__*/React__default["default"].createElement("span", {
347
+ className: classNames__default["default"]([styles$g.icon, styles$g.left, _defineProperty__default["default"]({}, iconClassName, iconClassName !== null && iconPosition === 'left')])
348
+ }, icon) : null, /*#__PURE__*/React__default["default"].createElement("span", {
349
+ className: classNames__default["default"]([styles$g.center, styles$g.label, _defineProperty__default["default"]({}, labelClassName, labelClassName !== null)])
350
+ }, text), iconPosition === 'right' ? /*#__PURE__*/React__default["default"].createElement("span", {
351
+ className: classNames__default["default"]([styles$g.icon, styles$g.right, _defineProperty__default["default"]({}, iconClassName, iconClassName !== null && iconPosition === 'right')])
352
+ }, icon) : null, hasChildren ? children : null) : null, !hasIcon ? text : null, hasChildren ? children : null);
353
+
354
+ if (href !== null) {
355
+ var linkClassNames = classNames__default["default"]([buttonClassNames, _defineProperty__default["default"]({
356
+ disabled: disabled
357
+ }, styles$g.linkDisabled, disabled)]);
358
+ return external || direct ? /*#__PURE__*/React__default["default"].createElement("a", Object.assign({}, props, {
359
+ href: disabled ? null : href,
360
+ className: linkClassNames,
361
+ style: buttonStyles,
362
+ onClick: onClick,
363
+ target: external ? target : null,
364
+ ref: refButton,
365
+ tabIndex: focusable ? '' : '-1'
366
+ }), content) : /*#__PURE__*/React__default["default"].createElement(reactRouterDom.Link, Object.assign({}, props, {
367
+ to: href,
368
+ className: linkClassNames,
369
+ style: buttonStyles,
370
+ onClick: onClick,
371
+ ref: refButton,
372
+ tabIndex: focusable ? '' : '-1'
373
+ }), content);
374
+ }
277
375
 
278
- if (!modalRef.current || modalRef.current.contains(target)) {
279
- return;
280
- }
376
+ return /*#__PURE__*/React__default["default"].createElement("button", Object.assign({}, props, {
377
+ type: type,
378
+ className: buttonClassNames,
379
+ style: buttonStyles,
380
+ onClick: onClick,
381
+ disabled: disabled || disableOnLoading && loading,
382
+ ref: refButton,
383
+ tabIndex: focusable ? '0' : '-1'
384
+ }), content);
385
+ };
281
386
 
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
- }))));
387
+ Button.propTypes = propTypes$n;
388
+ Button.defaultProps = defaultProps$n;
389
+
390
+ var styles$f = {"container":"micromag-viewer-buttons-icon-button-container","icon":"micromag-viewer-buttons-icon-button-icon","label":"micromag-viewer-buttons-icon-button-label"};
391
+
392
+ var _excluded$7 = ["className"];
393
+ var propTypes$m = {
394
+ className: PropTypes__default["default"].string
395
+ };
396
+ var defaultProps$m = {
397
+ className: null
318
398
  };
319
399
 
320
- ShareModal.propTypes = propTypes$h;
321
- ShareModal.defaultProps = defaultProps$h;
400
+ var IconButton = function IconButton(_ref) {
401
+ var className = _ref.className,
402
+ props = _objectWithoutProperties__default["default"](_ref, _excluded$7);
322
403
 
323
- var styles$b = {"container":"micromag-viewer-partials-share-button-container"};
404
+ return /*#__PURE__*/React__default["default"].createElement(Button, Object.assign({
405
+ className: classNames__default["default"]([styles$f.container, _defineProperty__default["default"]({}, className, className !== null)]),
406
+ labelClassName: styles$f.label,
407
+ iconClassName: styles$f.icon
408
+ }, props));
409
+ };
324
410
 
325
- var propTypes$g = {
326
- title: PropTypes__default["default"].string,
327
- url: PropTypes__default["default"].string,
328
- 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
411
+ IconButton.propTypes = propTypes$m;
412
+ IconButton.defaultProps = defaultProps$m;
413
+
414
+ var _excluded$6 = ["className"];
415
+ var propTypes$l = {
416
+ className: PropTypes__default["default"].string
333
417
  };
334
- var defaultProps$g = {
335
- title: null,
336
- url: null,
337
- className: null,
338
- buttonClassName: null,
339
- onShare: null,
340
- children: null,
341
- focusable: false
418
+ var defaultProps$l = {
419
+ className: null
342
420
  };
343
421
 
344
- 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;
422
+ var CloseButton = function CloseButton(_ref) {
423
+ var className = _ref.className,
424
+ props = _objectWithoutProperties__default["default"](_ref, _excluded$6);
425
+
352
426
  var intl = reactIntl.useIntl();
427
+ return /*#__PURE__*/React__default["default"].createElement(IconButton, Object.assign({
428
+ className: classNames__default["default"]([_defineProperty__default["default"]({}, className, className !== null)]),
429
+ label: intl.formatMessage({
430
+ id: "dj/p/q",
431
+ defaultMessage: [{
432
+ "type": 0,
433
+ "value": "Close"
434
+ }]
435
+ }),
436
+ icon: /*#__PURE__*/React__default["default"].createElement("svg", {
437
+ xmlns: "http://www.w3.org/2000/svg",
438
+ width: "10",
439
+ height: "16",
440
+ viewBox: "0 0 10 16",
441
+ fill: "currentColor"
442
+ }, /*#__PURE__*/React__default["default"].createElement("polygon", {
443
+ points: "9.95 4.11 8.89 3.05 5 6.94 1.11 3.05 0.05 4.11 3.94 8 0.05 11.89 1.11 12.95 5 9.06 8.89 12.95 9.95 11.89 6.06 8 9.95 4.11"
444
+ }))
445
+ }, props));
446
+ };
353
447
 
354
- var _useState = React.useState(false),
355
- _useState2 = _slicedToArray__default["default"](_useState, 2),
356
- storyShareModalOpened = _useState2[0],
357
- setStoryShareModalOpened = _useState2[1];
448
+ CloseButton.propTypes = propTypes$l;
449
+ CloseButton.defaultProps = defaultProps$l;
358
450
 
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);
451
+ var _excluded$5 = ["className"];
452
+ var propTypes$k = {
453
+ className: PropTypes__default["default"].string
454
+ };
455
+ var defaultProps$k = {
456
+ className: null
457
+ };
366
458
 
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",
459
+ var MenuButton = function MenuButton(_ref) {
460
+ var className = _ref.className,
461
+ props = _objectWithoutProperties__default["default"](_ref, _excluded$5);
462
+
463
+ var intl = reactIntl.useIntl();
464
+ return /*#__PURE__*/React__default["default"].createElement(IconButton, Object.assign({
465
+ className: classNames__default["default"]([_defineProperty__default["default"]({}, className, className !== null)]),
466
+ label: intl.formatMessage({
467
+ id: "F/gl4b",
381
468
  defaultMessage: [{
382
469
  "type": 0,
383
- "value": "Share"
470
+ "value": "Menu"
384
471
  }]
385
472
  }),
386
- "aria-label": intl.formatMessage({
473
+ iconPosition: "right",
474
+ icon: /*#__PURE__*/React__default["default"].createElement("svg", {
475
+ xmlns: "http://www.w3.org/2000/svg",
476
+ width: "10",
477
+ height: "16",
478
+ viewBox: "0 0 10 16",
479
+ fill: "currentColor"
480
+ }, /*#__PURE__*/React__default["default"].createElement("rect", {
481
+ width: "10",
482
+ height: "16"
483
+ }))
484
+ }, props));
485
+ };
486
+
487
+ MenuButton.propTypes = propTypes$k;
488
+ MenuButton.defaultProps = defaultProps$k;
489
+
490
+ var _excluded$4 = ["className"];
491
+ var propTypes$j = {
492
+ className: PropTypes__default["default"].string
493
+ };
494
+ var defaultProps$j = {
495
+ className: null
496
+ };
497
+
498
+ var ShareButton = function ShareButton(_ref) {
499
+ var className = _ref.className,
500
+ props = _objectWithoutProperties__default["default"](_ref, _excluded$4);
501
+
502
+ var intl = reactIntl.useIntl();
503
+ return /*#__PURE__*/React__default["default"].createElement(IconButton, Object.assign({
504
+ className: classNames__default["default"]([_defineProperty__default["default"]({}, className, className !== null)]),
505
+ label: intl.formatMessage({
387
506
  id: "7tw6U2",
388
507
  defaultMessage: [{
389
508
  "type": 0,
390
509
  "value": "Share"
391
510
  }]
392
511
  }),
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
512
+ iconPosition: "left",
513
+ icon: /*#__PURE__*/React__default["default"].createElement("svg", {
514
+ xmlns: "http://www.w3.org/2000/svg",
515
+ width: "10",
516
+ height: "16",
517
+ viewBox: "0 0 10 16",
518
+ fill: "currentColor"
519
+ }, /*#__PURE__*/React__default["default"].createElement("polygon", {
520
+ 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"
521
+ }), /*#__PURE__*/React__default["default"].createElement("polygon", {
522
+ 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"
523
+ }))
524
+ }, props));
525
+ };
526
+
527
+ ShareButton.propTypes = propTypes$j;
528
+ ShareButton.defaultProps = defaultProps$j;
529
+
530
+ var styles$e = {"container":"micromag-viewer-buttons-toggle-button-container","normal":"micromag-viewer-buttons-toggle-button-normal","toggled":"micromag-viewer-buttons-toggle-button-toggled"};
531
+
532
+ var propTypes$i = {
533
+ className: PropTypes__default["default"].string,
534
+ toggled: PropTypes__default["default"].number,
535
+ button: PropTypes__default["default"].node,
536
+ toggledButton: PropTypes__default["default"].node,
537
+ toggledButtonClassName: PropTypes__default["default"].string
538
+ };
539
+ var defaultProps$i = {
540
+ className: null,
541
+ toggled: 0,
542
+ button: null,
543
+ toggledButton: null,
544
+ toggledButtonClassName: null
545
+ };
546
+
547
+ var ToggleButton = function ToggleButton(_ref) {
548
+ var className = _ref.className,
549
+ toggled = _ref.toggled,
550
+ button = _ref.button,
551
+ toggledButton = _ref.toggledButton,
552
+ toggledButtonClassName = _ref.toggledButtonClassName;
553
+ if (button === null) return false;
554
+
555
+ var getToggleButtonStyles = function getToggleButtonStyles(t) {
556
+ return {
557
+ transform: "translateY(".concat(t * -100, "%)")
558
+ };
559
+ };
560
+
561
+ return /*#__PURE__*/React__default["default"].createElement("div", {
562
+ className: classNames__default["default"]([styles$e.container, _defineProperty__default["default"]({}, className, className !== null)])
563
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
564
+ className: styles$e.normal,
565
+ style: getToggleButtonStyles(toggled)
566
+ }, button), /*#__PURE__*/React__default["default"].createElement("div", {
567
+ className: classNames__default["default"]([styles$e.toggled, _defineProperty__default["default"]({}, toggledButtonClassName, toggledButtonClassName !== null)]),
568
+ style: getToggleButtonStyles(toggled - 1)
569
+ }, toggledButton));
570
+ };
571
+
572
+ ToggleButton.propTypes = propTypes$i;
573
+ ToggleButton.defaultProps = defaultProps$i;
574
+
575
+ var styles$d = {"backdrop":"micromag-viewer-menus-menu-container-backdrop","container":"micromag-viewer-menus-menu-container-container","heightContainer":"micromag-viewer-menus-menu-container-heightContainer","inner":"micromag-viewer-menus-menu-container-inner"};
576
+
577
+ var propTypes$h = {
578
+ className: PropTypes__default["default"].string,
579
+ transitionProgress: PropTypes__default["default"].number,
580
+ children: PropTypes__default["default"].node
581
+ };
582
+ var defaultProps$h = {
583
+ className: null,
584
+ transitionProgress: 0,
585
+ children: null
586
+ };
587
+
588
+ var ViewerMenuContainer = function ViewerMenuContainer(_ref) {
589
+ var className = _ref.className,
590
+ transitionProgress = _ref.transitionProgress,
591
+ children = _ref.children;
592
+ return /*#__PURE__*/React__default["default"].createElement("div", {
593
+ className: classNames__default["default"]([styles$d.container, _defineProperty__default["default"]({}, className, className !== null)]),
594
+ style: {
595
+ pointerEvents: 'none'
596
+ }
597
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
598
+ className: styles$d.heightContainer,
599
+ style: {
600
+ height: "".concat(transitionProgress * 100, "%"),
601
+ pointerEvents: transitionProgress < 0.25 ? 'none' : 'auto',
602
+ zIndex: Math.round(1 + transitionProgress)
603
+ }
604
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
605
+ className: styles$d.inner,
606
+ style: {
607
+ paddingTop: "".concat(3 * transitionProgress, "rem"),
608
+ paddingBottom: "".concat(0.5 * transitionProgress, "rem")
609
+ }
610
+ }, children)), /*#__PURE__*/React__default["default"].createElement("div", {
611
+ className: styles$d.backdrop,
612
+ style: {
613
+ opacity: utils.easings.easeOutQuint(transitionProgress)
614
+ }
401
615
  }));
402
616
  };
403
617
 
404
- ShareButton.propTypes = propTypes$g;
405
- ShareButton.defaultProps = defaultProps$g;
618
+ ViewerMenuContainer.propTypes = propTypes$h;
619
+ ViewerMenuContainer.defaultProps = defaultProps$h;
406
620
 
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"};
621
+ var styles$c = {"button":"micromag-viewer-menus-menu-dot-button","progress":"micromag-viewer-menus-menu-dot-progress","container":"micromag-viewer-menus-menu-dot-container","vertical":"micromag-viewer-menus-menu-dot-vertical","dot":"micromag-viewer-menus-menu-dot-dot","subDot":"micromag-viewer-menus-menu-dot-subDot","dots":"micromag-viewer-menus-menu-dot-dots","outlineBounce":"micromag-viewer-menus-menu-dot-outlineBounce"};
408
622
 
409
- var propTypes$f = {
623
+ var propTypes$g = {
410
624
  current: PropTypes__default["default"].bool,
411
625
  active: PropTypes__default["default"].bool,
412
626
  colors: PropTypes__default["default"].shape({
@@ -419,7 +633,7 @@ var propTypes$f = {
419
633
  onClick: PropTypes__default["default"].func,
420
634
  className: PropTypes__default["default"].string
421
635
  };
422
- var defaultProps$f = {
636
+ var defaultProps$g = {
423
637
  current: false,
424
638
  active: false,
425
639
  colors: null,
@@ -441,130 +655,67 @@ var ViewerMenuDot = function ViewerMenuDot(_ref) {
441
655
  vertical = _ref.vertical,
442
656
  onClick = _ref.onClick,
443
657
  className = _ref.className;
444
- var currentTime = 0;
445
- var duration = 1;
446
- var playing = true;
447
658
 
448
659
  var _ref2 = colors || {},
449
660
  _ref2$primary = _ref2.primary,
450
661
  primary = _ref2$primary === void 0 ? 'rgba(255, 255, 255, 1)' : _ref2$primary,
451
662
  _ref2$secondary = _ref2.secondary,
452
- secondary = _ref2$secondary === void 0 ? 'rgba(200, 200, 200, 0.5)' : _ref2$secondary; // TODO: if approved animate progress
663
+ secondary = _ref2$secondary === void 0 ? 'rgba(255, 255, 255, 0.25)' : _ref2$secondary;
453
664
 
454
-
455
- var _useSpring = core.useSpring(function () {
665
+ var _useSpring = core$1.useSpring(function () {
456
666
  return {
457
- x: 0,
667
+ scaleX: 0,
458
668
  config: {
459
- duration: 0
669
+ tension: 200,
670
+ friction: 30
460
671
  }
461
672
  };
462
673
  }),
463
- _useSpring2 = _slicedToArray__default["default"](_useSpring, 2);
464
- _useSpring2[0];
465
- var setSpringProps = _useSpring2[1];
674
+ _useSpring2 = _slicedToArray__default["default"](_useSpring, 2),
675
+ dotSpringStyles = _useSpring2[0],
676
+ setDotSpringProps = _useSpring2[1];
466
677
 
467
678
  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
- }
679
+ var activeRatio = active ? 1 : 0;
680
+ var ratio = count > 1 && current ? (subIndex + 1) / count : activeRatio;
681
+ var scaleX = ratio;
682
+ setDotSpringProps.start({
683
+ scaleX: scaleX,
684
+ immediate: !current
493
685
  });
494
- })) : /*#__PURE__*/React__default["default"].createElement("span", {
495
- className: styles$a.dot,
496
- style: {
497
- backgroundColor: active ? primary : secondary
498
- }
499
- });
686
+ }, [active, current, subIndex, count, setDotSpringProps]);
500
687
  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)]),
688
+ 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
689
  "aria-hidden": "true"
503
690
  }, /*#__PURE__*/React__default["default"].createElement("button", {
504
691
  type: "button",
505
- className: styles$a.button,
692
+ className: styles$c.button,
506
693
  onClick: onClick,
507
694
  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
- }));
695
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
696
+ className: styles$c.dot,
697
+ style: {
698
+ backgroundColor: secondary
699
+ }
700
+ }, /*#__PURE__*/React__default["default"].createElement(web.animated.div, {
701
+ className: styles$c.progress,
702
+ style: _objectSpread__default["default"](_objectSpread__default["default"]({}, dotSpringStyles), {}, {
703
+ backgroundColor: primary
704
+ })
705
+ }))));
552
706
  };
553
707
 
554
- MenuIcon.propTypes = propTypes$e;
555
- MenuIcon.defaultProps = defaultProps$e;
708
+ ViewerMenuDot.propTypes = propTypes$g;
709
+ ViewerMenuDot.defaultProps = defaultProps$g;
556
710
 
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"};
711
+ 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
712
 
559
- var propTypes$d = {
713
+ var _excluded$3 = ["direction", "items", "onClickDot", "onClickScreensMenu", "colors", "closeable", "withItemClick", "withoutScreensMenu", "onClose", "className"];
714
+ var propTypes$f = {
560
715
  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,
716
+ items: core.PropTypes.menuItems,
717
+ onClickDot: PropTypes__default["default"].func,
718
+ onClickScreensMenu: PropTypes__default["default"].func,
568
719
  colors: PropTypes__default["default"].shape({
569
720
  primary: PropTypes__default["default"].string,
570
721
  secondary: PropTypes__default["default"].string
@@ -572,46 +723,36 @@ var propTypes$d = {
572
723
  closeable: PropTypes__default["default"].bool,
573
724
  withItemClick: PropTypes__default["default"].bool,
574
725
  withoutScreensMenu: PropTypes__default["default"].bool,
575
- withoutShareMenu: PropTypes__default["default"].bool,
576
726
  onClose: PropTypes__default["default"].func,
577
727
  className: PropTypes__default["default"].string
578
728
  };
579
- var defaultProps$d = {
729
+ var defaultProps$f = {
580
730
  direction: 'horizontal',
581
- withShadow: false,
582
- title: null,
583
731
  items: [],
584
- shareUrl: null,
585
- onShare: null,
586
- onClickItem: null,
587
- onClickMenu: null,
732
+ onClickDot: null,
733
+ onClickScreensMenu: null,
588
734
  colors: null,
589
735
  closeable: false,
590
736
  withItemClick: false,
591
737
  withoutScreensMenu: false,
592
- withoutShareMenu: false,
593
738
  onClose: null,
594
739
  className: null
595
740
  };
596
741
 
597
742
  var ViewerMenuDots = function ViewerMenuDots(_ref) {
598
- var _ref4;
743
+ var _ref5;
599
744
 
600
745
  var direction = _ref.direction,
601
- withShadow = _ref.withShadow,
602
- title = _ref.title,
603
746
  items = _ref.items,
604
- shareUrl = _ref.shareUrl,
605
- onShare = _ref.onShare,
606
- onClickItem = _ref.onClickItem,
607
- onClickMenu = _ref.onClickMenu,
747
+ onClickDot = _ref.onClickDot,
748
+ onClickScreensMenu = _ref.onClickScreensMenu,
608
749
  colors = _ref.colors,
609
750
  closeable = _ref.closeable,
610
751
  withItemClick = _ref.withItemClick,
611
752
  withoutScreensMenu = _ref.withoutScreensMenu,
612
- withoutShareMenu = _ref.withoutShareMenu,
613
753
  onClose = _ref.onClose,
614
- className = _ref.className;
754
+ className = _ref.className,
755
+ props = _objectWithoutProperties__default["default"](_ref, _excluded$3);
615
756
 
616
757
  var _ref2 = colors || {},
617
758
  _ref2$primary = _ref2.primary,
@@ -623,8 +764,12 @@ var ViewerMenuDots = function ViewerMenuDots(_ref) {
623
764
  current = _ref3$current === void 0 ? false : _ref3$current;
624
765
  return current;
625
766
  });
767
+
768
+ var _ref4 = props || {},
769
+ style = _ref4.style;
770
+
626
771
  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)]),
772
+ 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
773
  "aria-label": intl.formatMessage({
629
774
  id: "bLYuuN",
630
775
  defaultMessage: [{
@@ -646,17 +791,18 @@ var ViewerMenuDots = function ViewerMenuDots(_ref) {
646
791
  }, {
647
792
  current: currentIndex + 1,
648
793
  total: items.length
649
- })
794
+ }),
795
+ style: style
650
796
  }, /*#__PURE__*/React__default["default"].createElement("ul", {
651
- className: styles$8.items
797
+ className: styles$b.items
652
798
  }, 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;
799
+ var _ref6 = item || {},
800
+ _ref6$current = _ref6.current,
801
+ current = _ref6$current === void 0 ? false : _ref6$current,
802
+ _ref6$count = _ref6.count,
803
+ count = _ref6$count === void 0 ? 1 : _ref6$count,
804
+ _ref6$subIndex = _ref6.subIndex,
805
+ subIndex = _ref6$subIndex === void 0 ? 0 : _ref6$subIndex;
660
806
 
661
807
  return /*#__PURE__*/React__default["default"].createElement(ViewerMenuDot, {
662
808
  key: "item-".concat(index + 1),
@@ -666,56 +812,22 @@ var ViewerMenuDots = function ViewerMenuDots(_ref) {
666
812
  count: count,
667
813
  subIndex: subIndex,
668
814
  onClick: function onClick() {
669
- if ((withItemClick || withoutScreensMenu) && onClickItem !== null) {
670
- onClickItem(item);
671
- } else if (!withItemClick && onClickMenu !== null) {
672
- onClickMenu();
815
+ if ((withItemClick || withoutScreensMenu) && onClickDot !== null) {
816
+ onClickDot(item);
817
+ } else if (!withItemClick && onClickScreensMenu !== null) {
818
+ onClickScreensMenu();
673
819
  }
674
820
  },
675
821
  vertical: direction === 'vertical'
676
822
  });
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,
823
+ }), closeable ? /*#__PURE__*/React__default["default"].createElement("li", {
824
+ className: styles$b.closeButton,
713
825
  style: {
714
826
  color: primary
715
827
  }
716
828
  }, /*#__PURE__*/React__default["default"].createElement("button", {
717
829
  type: "button",
718
- className: styles$8.closeButton,
830
+ className: styles$b.closeButton,
719
831
  onClick: onClose,
720
832
  title: intl.formatMessage({
721
833
  id: "dj/p/q",
@@ -736,13 +848,13 @@ var ViewerMenuDots = function ViewerMenuDots(_ref) {
736
848
  }))) : null));
737
849
  };
738
850
 
739
- ViewerMenuDots.propTypes = propTypes$d;
740
- ViewerMenuDots.defaultProps = defaultProps$d;
851
+ ViewerMenuDots.propTypes = propTypes$f;
852
+ ViewerMenuDots.defaultProps = defaultProps$f;
741
853
 
742
- var propTypes$c = {
854
+ var propTypes$e = {
743
855
  className: PropTypes__default["default"].string
744
856
  };
745
- var defaultProps$c = {
857
+ var defaultProps$e = {
746
858
  className: null
747
859
  };
748
860
 
@@ -750,50 +862,143 @@ var StackIcon = function StackIcon(_ref) {
750
862
  var className = _ref.className;
751
863
  return /*#__PURE__*/React__default["default"].createElement("svg", {
752
864
  xmlns: "http://www.w3.org/2000/svg",
753
- width: "32",
754
- height: "32",
755
- viewBox: "0 0 32 32",
865
+ width: "11.5",
866
+ height: "17.5",
867
+ viewBox: "0 0 11.5 17.5",
756
868
  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"
869
+ }, /*#__PURE__*/React__default["default"].createElement("rect", {
870
+ width: "10",
871
+ height: "16"
872
+ }), /*#__PURE__*/React__default["default"].createElement("polygon", {
873
+ 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
874
  }));
760
875
  };
761
876
 
762
- StackIcon.propTypes = propTypes$c;
763
- StackIcon.defaultProps = defaultProps$c;
877
+ StackIcon.propTypes = propTypes$e;
878
+ StackIcon.defaultProps = defaultProps$e;
764
879
 
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"};
880
+ 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
881
 
767
- var propTypes$b = {
768
- viewerTheme: core$1.PropTypes.viewerTheme,
769
- screenSize: core$1.PropTypes.screenSize,
770
- menuWidth: PropTypes__default["default"].number,
771
- title: PropTypes__default["default"].string,
772
- items: core$1.PropTypes.menuItems,
882
+ var propTypes$d = {
883
+ className: PropTypes__default["default"].string,
884
+ item: core.PropTypes.menuItem,
885
+ index: PropTypes__default["default"].number,
886
+ onClick: PropTypes__default["default"].func,
887
+ screenSize: core.PropTypes.screenSize,
888
+ focusable: PropTypes__default["default"].bool
889
+ };
890
+ var defaultProps$d = {
891
+ className: null,
892
+ item: core.PropTypes.menuItem,
893
+ index: 0,
894
+ onClick: null,
895
+ screenSize: null,
896
+ focusable: true
897
+ };
898
+
899
+ var ViewerMenuScreen = function ViewerMenuScreen(_ref) {
900
+ var _ref4;
901
+
902
+ var className = _ref.className,
903
+ item = _ref.item,
904
+ index = _ref.index,
905
+ _onClick = _ref.onClick,
906
+ screenSize = _ref.screenSize,
907
+ focusable = _ref.focusable;
908
+ var intl = reactIntl.useIntl();
909
+
910
+ var _ref2 = item || {},
911
+ _ref2$current = _ref2.current,
912
+ current = _ref2$current === void 0 ? false : _ref2$current,
913
+ screen = _ref2.screen,
914
+ _ref2$count = _ref2.count,
915
+ count = _ref2$count === void 0 ? 1 : _ref2$count;
916
+
917
+ var _ref3 = screenSize || {},
918
+ screenWidth = _ref3.width,
919
+ screenHeight = _ref3.height;
920
+
921
+ var screenAriaLabel = "".concat(intl.formatMessage({
922
+ id: "LkVfwW",
923
+ defaultMessage: [{
924
+ "type": 0,
925
+ "value": "Screen "
926
+ }, {
927
+ "type": 1,
928
+ "value": "index"
929
+ }]
930
+ }, {
931
+ index: index + 1
932
+ })).concat(current ? " ".concat(intl.formatMessage({
933
+ id: "vmrJ8U",
934
+ defaultMessage: [{
935
+ "type": 0,
936
+ "value": "(current screen)"
937
+ }]
938
+ })) : '');
939
+ return /*#__PURE__*/React__default["default"].createElement("div", {
940
+ className: classNames__default["default"]([styles$a.container, (_ref4 = {}, _defineProperty__default["default"](_ref4, className, className !== null), _defineProperty__default["default"](_ref4, styles$a.isCurrent, current), _ref4)])
941
+ }, /*#__PURE__*/React__default["default"].createElement("button", {
942
+ type: "button",
943
+ className: styles$a.button,
944
+ onClick: function onClick() {
945
+ if (_onClick !== null) {
946
+ _onClick(item);
947
+ }
948
+ },
949
+ "aria-label": screenAriaLabel,
950
+ tabIndex: focusable ? '0' : '-1'
951
+ }), /*#__PURE__*/React__default["default"].createElement("div", {
952
+ className: styles$a.inner
953
+ }, count > 1 ? /*#__PURE__*/React__default["default"].createElement("div", {
954
+ className: styles$a.subScreenBadge
955
+ }, /*#__PURE__*/React__default["default"].createElement("span", {
956
+ className: styles$a.subScreenCount
957
+ }, count), /*#__PURE__*/React__default["default"].createElement(StackIcon, {
958
+ className: styles$a.subScreenIcon
959
+ })) : null, screenWidth > 0 && screenHeight > 0 ? /*#__PURE__*/React__default["default"].createElement(components.ScreenPreview, {
960
+ className: styles$a.screen,
961
+ screenWidth: screenWidth,
962
+ screenHeight: screenHeight,
963
+ screen: screen,
964
+ focusable: focusable,
965
+ active: focusable,
966
+ withSize: true
967
+ }) : null));
968
+ };
969
+
970
+ ViewerMenuScreen.propTypes = propTypes$d;
971
+ ViewerMenuScreen.defaultProps = defaultProps$d;
972
+
973
+ 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","screen":"micromag-viewer-menus-menu-preview-screen","loading":"micromag-viewer-menus-menu-preview-loading","fillPulse":"micromag-viewer-menus-menu-preview-fillPulse"};
974
+
975
+ var propTypes$c = {
976
+ viewerTheme: core.PropTypes.viewerTheme,
977
+ screenSize: core.PropTypes.screenSize,
978
+ menuWidth: PropTypes__default["default"].number,
979
+ items: core.PropTypes.menuItems,
773
980
  focusable: PropTypes__default["default"].bool,
774
- shouldLoad: PropTypes__default["default"].bool,
775
- onClickItem: PropTypes__default["default"].func,
776
- onClose: PropTypes__default["default"].func,
981
+ onClickScreen: PropTypes__default["default"].func,
777
982
  maxThumbsWidth: PropTypes__default["default"].number,
778
- toggleFullscreen: PropTypes__default["default"].func,
779
- fullscreenActive: PropTypes__default["default"].bool,
780
- fullscreenEnabled: PropTypes__default["default"].bool,
983
+ // @todo to reimplement:
984
+ // shouldLoad: PropTypes.bool,
985
+ // toggleFullscreen: PropTypes.func,
986
+ // fullscreenActive: PropTypes.bool,
987
+ // fullscreenEnabled: PropTypes.bool,
781
988
  className: PropTypes__default["default"].string
782
989
  };
783
- var defaultProps$b = {
990
+ var defaultProps$c = {
784
991
  viewerTheme: null,
785
992
  screenSize: null,
786
993
  menuWidth: null,
787
- title: null,
788
994
  items: [],
789
995
  focusable: true,
790
- shouldLoad: true,
791
- onClickItem: null,
792
- onClose: null,
996
+ // shouldLoad: true,
997
+ onClickScreen: null,
793
998
  maxThumbsWidth: 140,
794
- toggleFullscreen: null,
795
- fullscreenActive: false,
796
- fullscreenEnabled: false,
999
+ // toggleFullscreen: null,
1000
+ // fullscreenActive: false,
1001
+ // fullscreenEnabled: false,
797
1002
  className: null
798
1003
  };
799
1004
 
@@ -801,259 +1006,298 @@ var ViewerMenuPreview = function ViewerMenuPreview(_ref) {
801
1006
  var viewerTheme = _ref.viewerTheme,
802
1007
  screenSize = _ref.screenSize,
803
1008
  menuWidth = _ref.menuWidth,
804
- title = _ref.title,
805
1009
  items = _ref.items,
806
1010
  focusable = _ref.focusable,
807
- onClickItem = _ref.onClickItem,
808
- onClose = _ref.onClose,
1011
+ onClickScreen = _ref.onClickScreen,
809
1012
  maxThumbsWidth = _ref.maxThumbsWidth,
810
- toggleFullscreen = _ref.toggleFullscreen,
811
- fullscreenActive = _ref.fullscreenActive,
812
- fullscreenEnabled = _ref.fullscreenEnabled,
813
1013
  className = _ref.className;
814
- var intl = reactIntl.useIntl();
815
-
816
- var _ref2 = screenSize || {},
817
- screenWidth = _ref2.width,
818
- screenHeight = _ref2.height;
819
1014
 
820
1015
  var _useDimensionObserver = hooks.useDimensionObserver(),
821
- firstScreenContainerRef = _useDimensionObserver.ref,
1016
+ containerRef = _useDimensionObserver.ref,
822
1017
  _useDimensionObserver2 = _useDimensionObserver.width,
823
- thumbWidth = _useDimensionObserver2 === void 0 ? 0 : _useDimensionObserver2;
1018
+ contentWidth = _useDimensionObserver2 === void 0 ? 0 : _useDimensionObserver2;
824
1019
 
825
- var _useDimensionObserver3 = hooks.useDimensionObserver(),
826
- containerRef = _useDimensionObserver3.ref,
827
- _useDimensionObserver4 = _useDimensionObserver3.width,
828
- contentWidth = _useDimensionObserver4 === void 0 ? 0 : _useDimensionObserver4;
1020
+ var thumbsPerLine = Math.max(Math.floor(contentWidth / maxThumbsWidth), 3); // @note cool, should be in recipes
829
1021
 
830
- var thumbsPerLine = Math.max(Math.floor(contentWidth / maxThumbsWidth), 3); // Viewer theme
1022
+ var _ref2 = viewerTheme || {},
1023
+ _ref2$background = _ref2.background,
1024
+ background = _ref2$background === void 0 ? null : _ref2$background;
1025
+ _ref2.logo;
831
1026
 
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;
845
-
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;
851
-
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;
857
-
858
- var _ref7 = image || {},
859
- _ref7$url = _ref7.url,
860
- brandImageUrl = _ref7$url === void 0 ? null : _ref7$url;
861
-
862
- var borderPrimaryColorStyle = utils.getStyleFromColor(brandPrimaryColor, 'borderColor');
863
- var colorSecondaryColorStyle = utils.getStyleFromColor(brandSecondaryColor, 'color');
864
- var backgroundColorStyle = utils.getStyleFromColor(brandBackgroundColor, 'backgroundColor');
1027
+ var _ref3 = background || {},
1028
+ _ref3$color = _ref3.color,
1029
+ brandBackgroundColor = _ref3$color === void 0 ? null : _ref3$color,
1030
+ _ref3$image = _ref3.image,
1031
+ image = _ref3$image === void 0 ? null : _ref3$image;
865
1032
 
866
- var _ref8 = brandLogo || {},
867
- _ref8$url = _ref8.url,
868
- brandLogoUrl = _ref8$url === void 0 ? null : _ref8$url;
1033
+ var _ref4 = image || {},
1034
+ _ref4$url = _ref4.url,
1035
+ brandImageUrl = _ref4$url === void 0 ? null : _ref4$url;
869
1036
 
1037
+ var backgroundColorStyle = utils.getStyleFromColor(brandBackgroundColor, 'backgroundColor');
870
1038
  var brandImageStyle = brandImageUrl !== null ? {
871
1039
  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];
1040
+ } : null; // @todo reimplement the brand logo
1041
+ // const { url: brandLogoUrl = null } = brandLogo || {};
1042
+ // @todo optimize all of this the proper way
1043
+ // const finalItems = useMemo(
1044
+ // () => (!focusable ? items.map((s, i) => (i > 6 ? { screenId: s.screenId } : s)) : items),
1045
+ // [items, focusable],
1046
+ // );
879
1047
 
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;
885
-
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
- 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)]),
1048
+ return /*#__PURE__*/React__default["default"].createElement("div", {
1049
+ className: classNames__default["default"]([styles$9.container, _defineProperty__default["default"]({}, className, className !== null)]),
906
1050
  style: _objectSpread__default["default"](_objectSpread__default["default"](_objectSpread__default["default"]({}, backgroundColorStyle), brandImageStyle), {}, {
907
1051
  width: menuWidth
908
1052
  }),
909
1053
  "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,
1054
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
1055
+ className: styles$9.content,
967
1056
  ref: containerRef
968
1057
  }, /*#__PURE__*/React__default["default"].createElement(Scroll__default["default"], {
969
- className: styles$7.scroll,
970
- onScrolledBottom: onScrolledBottom,
971
- onScrolledNotBottom: onScrolledNotBottom
1058
+ className: styles$9.scroll
972
1059
  }, /*#__PURE__*/React__default["default"].createElement("nav", {
973
- className: styles$7.nav
1060
+ className: styles$9.nav
974
1061
  }, /*#__PURE__*/React__default["default"].createElement("ul", {
975
- className: styles$7.items
976
- }, 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
- })) : '');
1062
+ className: styles$9.items
1063
+ }, items.map(function (item, index) {
1064
+ var _ref6 = item || {},
1065
+ screenId = _ref6.screenId,
1066
+ _ref6$screen = _ref6.screen,
1067
+ screen = _ref6$screen === void 0 ? null : _ref6$screen;
1068
+
1069
+ var itemStyles = {
1070
+ width: "".concat(100 / thumbsPerLine, "%")
1071
+ };
1001
1072
  return /*#__PURE__*/React__default["default"].createElement("li", {
1002
- className: classNames__default["default"]([styles$7.item, _defineProperty__default["default"]({}, styles$7.active, current)]),
1003
1073
  key: "item-".concat(screenId),
1074
+ className: styles$9.item,
1075
+ style: itemStyles
1076
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
1077
+ className: styles$9.screen
1078
+ }, screen === null ? /*#__PURE__*/React__default["default"].createElement("svg", {
1079
+ className: styles$9.loading,
1080
+ xmlns: "http://www.w3.org/2000/svg",
1081
+ width: "10",
1082
+ height: "16",
1083
+ viewBox: "0 0 10 16",
1004
1084
  style: {
1005
- width: "".concat(100 / thumbsPerLine, "%")
1085
+ animationDelay: "".concat(index * -50, "ms")
1006
1086
  }
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'
1044
- }));
1087
+ }, /*#__PURE__*/React__default["default"].createElement("rect", {
1088
+ width: "10",
1089
+ height: "16"
1090
+ })) : /*#__PURE__*/React__default["default"].createElement(ViewerMenuScreen, {
1091
+ item: item,
1092
+ index: index,
1093
+ screenSize: screenSize,
1094
+ onClick: onClickScreen,
1095
+ focusable: focusable
1096
+ })));
1045
1097
  }))))));
1046
1098
  };
1047
1099
 
1048
- ViewerMenuPreview.propTypes = propTypes$b;
1049
- ViewerMenuPreview.defaultProps = defaultProps$b;
1100
+ ViewerMenuPreview.propTypes = propTypes$c;
1101
+ ViewerMenuPreview.defaultProps = defaultProps$c;
1050
1102
 
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"};
1103
+ 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"};
1104
+
1105
+ var propTypes$b = {
1106
+ screen: core.PropTypes.item,
1107
+ title: PropTypes__default["default"].string,
1108
+ url: PropTypes__default["default"].string,
1109
+ description: PropTypes__default["default"].string,
1110
+ className: PropTypes__default["default"].string
1111
+ };
1112
+ var defaultProps$b = {
1113
+ screen: null,
1114
+ title: null,
1115
+ url: null,
1116
+ description: null,
1117
+ className: null
1118
+ };
1119
+
1120
+ var MicromagPreview = function MicromagPreview(_ref) {
1121
+ var screen = _ref.screen,
1122
+ title = _ref.title,
1123
+ url = _ref.url,
1124
+ description = _ref.description,
1125
+ className = _ref.className;
1126
+ return /*#__PURE__*/React__default["default"].createElement("div", {
1127
+ className: classNames__default["default"]([styles$8.container, _defineProperty__default["default"]({}, className, className)])
1128
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
1129
+ className: styles$8.cover
1130
+ }, /*#__PURE__*/React__default["default"].createElement(components.ScreenPreview, {
1131
+ screen: screen,
1132
+ width: 100,
1133
+ height: 150,
1134
+ withSize: true
1135
+ })), /*#__PURE__*/React__default["default"].createElement("div", {
1136
+ className: styles$8.info
1137
+ }, /*#__PURE__*/React__default["default"].createElement("h3", {
1138
+ className: styles$8.title
1139
+ }, title), url ? /*#__PURE__*/React__default["default"].createElement("div", {
1140
+ className: styles$8.url
1141
+ }, url) : null, /*#__PURE__*/React__default["default"].createElement("p", null, description)));
1142
+ };
1143
+
1144
+ MicromagPreview.propTypes = propTypes$b;
1145
+ MicromagPreview.defaultProps = defaultProps$b;
1146
+
1147
+ var styles$7 = {"scroll":"micromag-viewer-menus-menu-share-scroll","container":"micromag-viewer-menus-menu-share-container","disabled":"micromag-viewer-menus-menu-share-disabled","button":"micromag-viewer-menus-menu-share-button","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","content":"micromag-viewer-menus-menu-share-content"};
1052
1148
 
1053
1149
  var propTypes$a = {
1054
- story: core$1.PropTypes.story.isRequired,
1150
+ viewerTheme: core.PropTypes.viewerTheme,
1151
+ menuWidth: PropTypes__default["default"].number,
1152
+ title: PropTypes__default["default"].string,
1153
+ description: PropTypes__default["default"].string,
1154
+ items: core.PropTypes.menuItems,
1155
+ focusable: PropTypes__default["default"].bool,
1156
+ // shouldLoad: PropTypes.bool, // @todo still needed? to re-implement?
1157
+ currentScreenIndex: PropTypes__default["default"].number,
1158
+ shareUrl: PropTypes__default["default"].string,
1159
+ onShare: PropTypes__default["default"].func,
1160
+ className: PropTypes__default["default"].string
1161
+ };
1162
+ var defaultProps$a = {
1163
+ viewerTheme: null,
1164
+ menuWidth: null,
1165
+ title: null,
1166
+ description: null,
1167
+ items: [],
1168
+ focusable: true,
1169
+ currentScreenIndex: 0,
1170
+ shareUrl: null,
1171
+ onShare: null,
1172
+ className: null
1173
+ };
1174
+
1175
+ var ViewerMenuShare = function ViewerMenuShare(_ref) {
1176
+ var viewerTheme = _ref.viewerTheme,
1177
+ menuWidth = _ref.menuWidth,
1178
+ title = _ref.title,
1179
+ description = _ref.description,
1180
+ items = _ref.items,
1181
+ focusable = _ref.focusable,
1182
+ currentScreenIndex = _ref.currentScreenIndex,
1183
+ shareUrl = _ref.shareUrl,
1184
+ onShare = _ref.onShare,
1185
+ className = _ref.className;
1186
+
1187
+ // Viewer theme
1188
+ var _ref2 = viewerTheme || {},
1189
+ _ref2$background = _ref2.background,
1190
+ background = _ref2$background === void 0 ? null : _ref2$background;
1191
+
1192
+ var _ref3 = background || {},
1193
+ _ref3$color = _ref3.color,
1194
+ brandBackgroundColor = _ref3$color === void 0 ? null : _ref3$color,
1195
+ _ref3$image = _ref3.image,
1196
+ image = _ref3$image === void 0 ? null : _ref3$image;
1197
+
1198
+ var _ref4 = image || {},
1199
+ _ref4$url = _ref4.url,
1200
+ brandImageUrl = _ref4$url === void 0 ? null : _ref4$url;
1201
+
1202
+ var backgroundColorStyle = utils.getStyleFromColor(brandBackgroundColor, 'backgroundColor');
1203
+ var brandImageStyle = brandImageUrl !== null ? {
1204
+ backgroundImage: "url(".concat(brandImageUrl, ")")
1205
+ } : null;
1206
+ var coverScreen = React.useMemo(function () {
1207
+ var _ref5 = items[0] || {},
1208
+ _ref5$screen = _ref5.screen,
1209
+ screen = _ref5$screen === void 0 ? null : _ref5$screen;
1210
+
1211
+ return screen;
1212
+ }, [items]);
1213
+ var currentScreen = React.useMemo(function () {
1214
+ var found = items.find(function (item) {
1215
+ var _ref6 = item || {},
1216
+ _ref6$current = _ref6.current,
1217
+ current = _ref6$current === void 0 ? false : _ref6$current;
1218
+
1219
+ return current;
1220
+ });
1221
+
1222
+ var _ref7 = found || {},
1223
+ _ref7$screen = _ref7.screen,
1224
+ screen = _ref7$screen === void 0 ? null : _ref7$screen;
1225
+
1226
+ return screen;
1227
+ }, [items, currentScreenIndex, focusable]);
1228
+
1229
+ var _useState = React.useState(false),
1230
+ _useState2 = _slicedToArray__default["default"](_useState, 2),
1231
+ shareCurrentScreen = _useState2[0],
1232
+ setShareCurrentScreen = _useState2[1];
1233
+
1234
+ var onShareModeChange = React.useCallback(function () {
1235
+ setShareCurrentScreen(function (value) {
1236
+ return !value;
1237
+ });
1238
+ }, [setShareCurrentScreen]);
1239
+
1240
+ var _useState3 = React.useState(shareUrl),
1241
+ _useState4 = _slicedToArray__default["default"](_useState3, 2),
1242
+ finalShareUrl = _useState4[0],
1243
+ setFinalShareUrl = _useState4[1];
1244
+
1245
+ React.useEffect(function () {
1246
+ setFinalShareUrl(shareCurrentScreen && currentScreenIndex !== 0 ? "".concat(shareUrl, "/").concat(currentScreenIndex) : shareUrl);
1247
+ }, [shareCurrentScreen, currentScreenIndex, setFinalShareUrl]);
1248
+ return /*#__PURE__*/React__default["default"].createElement("div", {
1249
+ className: classNames__default["default"]([styles$7.container, _defineProperty__default["default"]({}, className, className !== null)]),
1250
+ style: _objectSpread__default["default"](_objectSpread__default["default"](_objectSpread__default["default"]({}, backgroundColorStyle), brandImageStyle), {}, {
1251
+ width: menuWidth
1252
+ }),
1253
+ "aria-hidden": focusable ? null : 'true'
1254
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
1255
+ className: styles$7.content
1256
+ }, /*#__PURE__*/React__default["default"].createElement(Scroll__default["default"], {
1257
+ className: styles$7.scroll
1258
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
1259
+ className: styles$7.header
1260
+ }, /*#__PURE__*/React__default["default"].createElement(MicromagPreview, {
1261
+ className: styles$7.preview,
1262
+ screen: shareCurrentScreen ? currentScreen : coverScreen,
1263
+ title: title,
1264
+ url: finalShareUrl,
1265
+ description: description
1266
+ }), currentScreenIndex !== 0 ? /*#__PURE__*/React__default["default"].createElement("div", {
1267
+ className: styles$7.mode
1268
+ }, /*#__PURE__*/React__default["default"].createElement("label", null, /*#__PURE__*/React__default["default"].createElement("input", {
1269
+ type: "checkbox",
1270
+ name: "currentScreen",
1271
+ value: "currentScreen",
1272
+ onChange: onShareModeChange,
1273
+ checked: shareCurrentScreen
1274
+ }), /*#__PURE__*/React__default["default"].createElement(reactIntl.FormattedMessage, {
1275
+ id: "xuPbeq",
1276
+ defaultMessage: [{
1277
+ "type": 0,
1278
+ "value": "Start from the current screen"
1279
+ }]
1280
+ }))) : null), /*#__PURE__*/React__default["default"].createElement(ShareOptions__default["default"], {
1281
+ className: styles$7.options,
1282
+ itemClassName: styles$7.optionItem,
1283
+ buttonClassName: styles$7.optionButton,
1284
+ title: title,
1285
+ url: finalShareUrl,
1286
+ focusable: focusable,
1287
+ onShare: onShare,
1288
+ theme: viewerTheme,
1289
+ shareCurrentScreen: shareCurrentScreen
1290
+ }))));
1291
+ };
1292
+
1293
+ ViewerMenuShare.propTypes = propTypes$a;
1294
+ ViewerMenuShare.defaultProps = defaultProps$a;
1295
+
1296
+ 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","withoutGestures":"micromag-viewer-withoutGestures","fadeMenu":"micromag-viewer-fadeMenu","withShadow":"micromag-viewer-withShadow","isOpened":"micromag-viewer-isOpened","menuItem":"micromag-viewer-menuItem","menuItemScreens":"micromag-viewer-menuItemScreens","menuButton":"micromag-viewer-menuButton","slidingButton":"micromag-viewer-slidingButton","screensMenuButtonToggled":"micromag-viewer-screensMenuButtonToggled","isHidden":"micromag-viewer-isHidden","navButton":"micromag-viewer-navButton","previous":"micromag-viewer-previous","next":"micromag-viewer-next","screen":"micromag-viewer-screen","current":"micromag-viewer-current","playbackControls":"micromag-viewer-playbackControls","arrowHint":"micromag-viewer-arrowHint","webView":"micromag-viewer-webView"};
1297
+
1298
+ var propTypes$9 = {
1299
+ story: core.PropTypes.story.isRequired,
1055
1300
  currentScreenIndex: PropTypes__default["default"].number,
1056
- opened: PropTypes__default["default"].bool,
1057
1301
  toggleFullscreen: PropTypes__default["default"].func,
1058
1302
  fullscreenActive: PropTypes__default["default"].bool,
1059
1303
  fullscreenEnabled: PropTypes__default["default"].bool,
@@ -1061,15 +1305,13 @@ var propTypes$a = {
1061
1305
  withShadow: PropTypes__default["default"].bool,
1062
1306
  trackingEnabled: PropTypes__default["default"].bool,
1063
1307
  shareBasePath: PropTypes__default["default"].string,
1064
- theme: core$1.PropTypes.viewerTheme,
1065
- screenSize: core$1.PropTypes.screenSize,
1308
+ theme: core.PropTypes.viewerTheme,
1309
+ screenSize: core.PropTypes.screenSize,
1066
1310
  menuWidth: PropTypes__default["default"].number,
1067
1311
  withDotItemClick: PropTypes__default["default"].bool,
1068
1312
  withoutScreensMenu: PropTypes__default["default"].bool,
1069
1313
  withoutShareMenu: PropTypes__default["default"].bool,
1070
- onRequestOpen: PropTypes__default["default"].func,
1071
- onRequestClose: PropTypes__default["default"].func,
1072
- onClickItem: PropTypes__default["default"].func,
1314
+ onClickScreen: PropTypes__default["default"].func,
1073
1315
  onClickMenu: PropTypes__default["default"].func,
1074
1316
  onClickCloseViewer: PropTypes__default["default"].func,
1075
1317
  refDots: PropTypes__default["default"].shape({
@@ -1077,9 +1319,8 @@ var propTypes$a = {
1077
1319
 
1078
1320
  })
1079
1321
  };
1080
- var defaultProps$a = {
1322
+ var defaultProps$9 = {
1081
1323
  currentScreenIndex: 0,
1082
- opened: false,
1083
1324
  toggleFullscreen: null,
1084
1325
  fullscreenActive: false,
1085
1326
  fullscreenEnabled: false,
@@ -1093,18 +1334,17 @@ var defaultProps$a = {
1093
1334
  withDotItemClick: false,
1094
1335
  withoutScreensMenu: false,
1095
1336
  withoutShareMenu: false,
1096
- onRequestOpen: null,
1097
- onRequestClose: null,
1098
- onClickItem: null,
1337
+ onClickScreen: null,
1099
1338
  onClickMenu: null,
1100
1339
  onClickCloseViewer: null,
1101
1340
  refDots: null
1102
1341
  };
1103
1342
 
1104
1343
  var ViewerMenu = function ViewerMenu(_ref) {
1344
+ var _ref11;
1345
+
1105
1346
  var story = _ref.story,
1106
1347
  currentScreenIndex = _ref.currentScreenIndex,
1107
- opened = _ref.opened,
1108
1348
  toggleFullscreen = _ref.toggleFullscreen,
1109
1349
  fullscreenActive = _ref.fullscreenActive,
1110
1350
  fullscreenEnabled = _ref.fullscreenEnabled,
@@ -1118,23 +1358,42 @@ var ViewerMenu = function ViewerMenu(_ref) {
1118
1358
  withDotItemClick = _ref.withDotItemClick,
1119
1359
  withoutScreensMenu = _ref.withoutScreensMenu,
1120
1360
  withoutShareMenu = _ref.withoutShareMenu,
1121
- onRequestOpen = _ref.onRequestOpen,
1122
- onRequestClose = _ref.onRequestClose,
1123
- customOnClickItem = _ref.onClickItem,
1124
- customOnClickMenu = _ref.onClickMenu,
1125
- onClickCloseViewer = _ref.onClickCloseViewer,
1361
+ customOnClickScreen = _ref.onClickScreen;
1362
+ _ref.onClickMenu;
1363
+ var onClickCloseViewer = _ref.onClickCloseViewer,
1126
1364
  refDots = _ref.refDots;
1127
1365
  var _story$components = story.components,
1128
1366
  screens = _story$components === void 0 ? [] : _story$components,
1129
1367
  _story$title = story.title,
1130
- title = _story$title === void 0 ? null : _story$title;
1368
+ title = _story$title === void 0 ? null : _story$title,
1369
+ _story$metadata = story.metadata,
1370
+ metadata = _story$metadata === void 0 ? null : _story$metadata;
1371
+
1372
+ var _ref2 = metadata || {},
1373
+ _ref2$description = _ref2.description,
1374
+ description = _ref2$description === void 0 ? null : _ref2$description;
1375
+
1131
1376
  var currentScreen = screens !== null ? screens[currentScreenIndex] || null : null;
1132
1377
 
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;
1378
+ var _ref3 = currentScreen || {},
1379
+ _ref3$id = _ref3.id,
1380
+ screenId = _ref3$id === void 0 ? null : _ref3$id,
1381
+ _ref3$type = _ref3.type,
1382
+ screenType = _ref3$type === void 0 ? null : _ref3$type;
1383
+
1384
+ var _ref4 = viewerTheme || {},
1385
+ _ref4$menuTheme = _ref4.menuTheme,
1386
+ menuTheme = _ref4$menuTheme === void 0 ? null : _ref4$menuTheme;
1387
+
1388
+ var _useState = React.useState(false),
1389
+ _useState2 = _slicedToArray__default["default"](_useState, 2),
1390
+ menuOpened = _useState2[0],
1391
+ setMenuOpened = _useState2[1];
1392
+
1393
+ var _useState3 = React.useState(false),
1394
+ _useState4 = _slicedToArray__default["default"](_useState3, 2),
1395
+ shareOpened = _useState4[0],
1396
+ setShareOpened = _useState4[1];
1138
1397
 
1139
1398
  var items = React.useMemo(function () {
1140
1399
  return screens.map(function (it) {
@@ -1155,9 +1414,9 @@ var ViewerMenu = function ViewerMenu(_ref) {
1155
1414
  count: children.length + 1 || 1,
1156
1415
  subIndex: subIndex || 0
1157
1416
  };
1158
- }).filter(function (_ref3) {
1159
- var _ref3$visible = _ref3.visible,
1160
- visible = _ref3$visible === void 0 ? true : _ref3$visible;
1417
+ }).filter(function (_ref5) {
1418
+ var _ref5$visible = _ref5.visible,
1419
+ visible = _ref5$visible === void 0 ? true : _ref5$visible;
1161
1420
  return visible;
1162
1421
  });
1163
1422
  }, [screens, screenId]);
@@ -1172,227 +1431,270 @@ var ViewerMenu = function ViewerMenu(_ref) {
1172
1431
  }
1173
1432
  }, [trackEvent, screenId, currentScreenIndex, screenType]);
1174
1433
  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;
1434
+ // @todo validate this
1435
+ // const base =
1436
+ // typeof window !== 'undefined' ? window.location.origin.replace(/\/+$/, '') : '';
1437
+ // const path = shareBasePath !== null ? `${base}${shareBasePath}` : base;
1438
+ var base = typeof window !== 'undefined' ? window.location.host : '';
1439
+ var path = shareBasePath !== null ? "".concat(base).concat(shareBasePath) : base;
1177
1440
  return path;
1178
- }, [shareBasePath]);
1441
+ }, [shareBasePath]); // @note possible to extract some of that logic
1179
1442
 
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
- }
1443
+ var onOpenMenu = React.useCallback(function () {
1444
+ setMenuOpened(true);
1445
+ setShareOpened(false);
1446
+ trackScreenEvent('viewer_menu', 'open_screens_menu');
1447
+ }, [setMenuOpened, setShareOpened, trackScreenEvent]);
1448
+ var onCloseMenu = React.useCallback(function () {
1449
+ setMenuOpened(false);
1450
+ setShareOpened(false);
1451
+ trackScreenEvent('viewer_menu', 'close_screens_menu');
1452
+ }, [setMenuOpened, setShareOpened, trackScreenEvent]);
1453
+ var onOpenShare = React.useCallback(function () {
1454
+ setShareOpened(true);
1455
+ setMenuOpened(false);
1456
+ trackScreenEvent('viewer_menu', 'open_share_menu');
1457
+ }, [setShareOpened, setMenuOpened, trackScreenEvent]);
1458
+ var onCloseShare = React.useCallback(function () {
1459
+ setShareOpened(false);
1460
+ setMenuOpened(false);
1461
+ trackScreenEvent('viewer_menu', 'close_share_menu');
1462
+ }, [setShareOpened, setMenuOpened, trackScreenEvent]);
1463
+ var onClickScreen = React.useCallback(function (screen) {
1464
+ setMenuOpened(false);
1465
+
1466
+ if (customOnClickScreen !== null) {
1467
+ customOnClickScreen(screen);
1468
+ }
1197
1469
 
1198
- React.useEffect(function () {
1199
- setMenuSpring.start({
1200
- y: opened ? 1 : 0
1470
+ var index = items.findIndex(function (_ref6) {
1471
+ var id = _ref6.id;
1472
+ return id === screenId;
1201
1473
  });
1202
- }, [opened]);
1203
-
1204
- var _useDimensionObserver = hooks.useDimensionObserver(),
1205
- menuPreviewContainerRef = _useDimensionObserver.ref,
1206
- _useDimensionObserver2 = _useDimensionObserver.height,
1207
- menuPreviewContainerHeight = _useDimensionObserver2 === void 0 ? 0 : _useDimensionObserver2;
1474
+ trackScreenEvent('viewer_menu', 'click_screen_change', "Screen ".concat(index + 1));
1475
+ }, [customOnClickScreen, setMenuOpened, items, screenId, trackScreenEvent]);
1476
+ var onShare = React.useCallback(function (type) {
1477
+ // @todo display something to say thanks for sharing?
1478
+ trackScreenEvent('viewer_menu', 'shared_story', type);
1479
+ }, [trackScreenEvent]);
1480
+ var computeShareProgress = React.useCallback(function (_ref7) {
1481
+ var active = _ref7.active,
1482
+ _ref7$direction = _slicedToArray__default["default"](_ref7.direction, 2),
1483
+ dy = _ref7$direction[1],
1484
+ _ref7$movement = _slicedToArray__default["default"](_ref7.movement, 2),
1485
+ my = _ref7$movement[1],
1486
+ _ref7$velocity = _slicedToArray__default["default"](_ref7.velocity, 2),
1487
+ vy = _ref7$velocity[1];
1488
+
1489
+ var progress = Math.max(0, my) / (window.innerHeight * 0.8);
1490
+ var reachedThreshold = (vy > 0.3 || Math.abs(progress) > 0.3) && dy !== -1;
1491
+
1492
+ if (!active) {
1493
+ if (reachedThreshold) onOpenShare();
1494
+ return reachedThreshold ? 1 : 0;
1495
+ }
1208
1496
 
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;
1497
+ return progress;
1498
+ }, [onOpenShare]);
1499
+ var computeShareProgressClose = React.useCallback(function (_ref8) {
1500
+ var active = _ref8.active,
1501
+ _ref8$direction = _slicedToArray__default["default"](_ref8.direction, 2),
1502
+ dy = _ref8$direction[1],
1503
+ _ref8$movement = _slicedToArray__default["default"](_ref8.movement, 2),
1504
+ my = _ref8$movement[1],
1505
+ _ref8$velocity = _slicedToArray__default["default"](_ref8.velocity, 2),
1506
+ vy = _ref8$velocity[1];
1507
+
1508
+ var progress = Math.max(0, my) / (window.innerHeight * 0.8);
1509
+ var reachedThreshold = (vy > 0.3 || Math.abs(progress) > 0.3) && dy !== -1;
1510
+
1511
+ if (!active) {
1512
+ if (reachedThreshold) onCloseShare();
1513
+ return reachedThreshold ? 0 : 1;
1227
1514
  }
1228
1515
 
1229
- var isMenuOpened = refOpened.current;
1516
+ return 1 - progress;
1517
+ }, [onCloseShare]);
1230
1518
 
1231
- if (first) {
1232
- if (isMenuOpened) {
1233
- cancel();
1234
- return;
1519
+ var _useDragProgress = hooks.useDragProgress({
1520
+ progress: shareOpened ? 1 : 0,
1521
+ computeProgress: shareOpened ? computeShareProgressClose : computeShareProgress,
1522
+ springParams: {
1523
+ config: {
1524
+ tension: 300,
1525
+ friction: 30
1235
1526
  }
1236
1527
  }
1528
+ }),
1529
+ bindShareDrag = _useDragProgress.bind,
1530
+ shareOpenedProgress = _useDragProgress.progress;
1237
1531
 
1238
- var yProgress = Math.max(0, Math.min(1, my / menuPreviewContainerHeight + (isMenuOpened ? 1 : 0)));
1532
+ var computeMenuProgress = React.useCallback(function (_ref9) {
1533
+ var active = _ref9.active,
1534
+ _ref9$direction = _slicedToArray__default["default"](_ref9.direction, 2),
1535
+ dy = _ref9$direction[1],
1536
+ _ref9$movement = _slicedToArray__default["default"](_ref9.movement, 2),
1537
+ my = _ref9$movement[1],
1538
+ _ref9$velocity = _slicedToArray__default["default"](_ref9.velocity, 2),
1539
+ vy = _ref9$velocity[1];
1239
1540
 
1240
- if (last) {
1241
- var menuNowOpened = dy > 0 && yProgress > 0.1;
1242
- refOpened.current = menuNowOpened;
1243
- setMenuSpring.start({
1244
- y: menuNowOpened ? 1 : 0
1245
- });
1541
+ var progress = Math.max(0, my) / (window.innerHeight * 0.8);
1542
+ var reachedThreshold = (vy > 0.3 || Math.abs(progress) > 0.3) && dy !== -1;
1246
1543
 
1247
- if (menuNowOpened && onRequestOpen !== null) {
1248
- onRequestOpen();
1249
- } else if (!menuNowOpened && onRequestClose !== null) {
1250
- onRequestClose();
1251
- }
1252
- } else {
1253
- setMenuSpring.start({
1254
- y: yProgress
1255
- });
1544
+ if (!active) {
1545
+ if (reachedThreshold) onOpenMenu();
1546
+ return reachedThreshold ? 1 : 0;
1256
1547
  }
1257
- }, {
1258
- axis: 'y',
1259
- filterTaps: true
1260
- }); // handle preview menu item click
1261
1548
 
1262
- var onClickMenu = React.useCallback(function (index) {
1263
- if (customOnClickMenu !== null) {
1264
- customOnClickMenu(index);
1549
+ return progress;
1550
+ }, [onOpenMenu]);
1551
+ var computeMenuProgressClose = React.useCallback(function (_ref10) {
1552
+ var active = _ref10.active,
1553
+ _ref10$direction = _slicedToArray__default["default"](_ref10.direction, 2),
1554
+ dy = _ref10$direction[1],
1555
+ _ref10$movement = _slicedToArray__default["default"](_ref10.movement, 2),
1556
+ my = _ref10$movement[1],
1557
+ _ref10$velocity = _slicedToArray__default["default"](_ref10.velocity, 2),
1558
+ vy = _ref10$velocity[1];
1559
+
1560
+ var progress = Math.max(0, my) / (window.innerHeight * 0.8);
1561
+ var reachedThreshold = (vy > 0.3 || Math.abs(progress) > 0.3) && dy !== -1;
1562
+
1563
+ if (!active) {
1564
+ if (reachedThreshold) onCloseMenu();
1565
+ return reachedThreshold ? 0 : 1;
1265
1566
  }
1266
1567
 
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
- }
1568
+ return 1 - progress;
1569
+ }, [onCloseMenu]);
1273
1570
 
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();
1571
+ var _useDragProgress2 = hooks.useDragProgress({
1572
+ progress: menuOpened ? 1 : 0,
1573
+ computeProgress: menuOpened ? computeMenuProgressClose : computeMenuProgress,
1574
+ springParams: {
1575
+ config: {
1576
+ tension: 300,
1577
+ friction: 30
1578
+ }
1283
1579
  }
1580
+ }),
1581
+ bindMenuDrag = _useDragProgress2.bind,
1582
+ menuOpenedProgress = _useDragProgress2.progress;
1284
1583
 
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;
1584
+ var keyboardShortcuts = React.useMemo(function () {
1585
+ return {
1586
+ m: function m() {
1587
+ return !menuOpened ? onOpenMenu() : onCloseMenu();
1588
+ },
1589
+ escape: function escape() {
1590
+ return onCloseMenu();
1591
+ }
1592
+ };
1593
+ }, [menuOpened, onOpenMenu, onCloseMenu]);
1594
+ useKeyboardShortcuts(keyboardShortcuts); // should be zero if either screens menu or share menu is opened
1295
1595
 
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,
1596
+ var dotsOpacity = Math.min(1, Math.max(0, 1 - (menuOpenedProgress + shareOpenedProgress)));
1597
+ return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement("div", {
1598
+ className: classNames__default["default"]([styles$6.menuNavContainer, (_ref11 = {}, _defineProperty__default["default"](_ref11, styles$6.withShadow, withShadow), _defineProperty__default["default"](_ref11, styles$6.isOpened, menuOpened || shareOpened), _ref11)]),
1298
1599
  ref: refDots,
1299
1600
  style: {
1300
1601
  width: menuWidth
1301
1602
  }
1302
- }, menuDragBind()), /*#__PURE__*/React__default["default"].createElement(ViewerMenuDots, Object.assign({}, menuTheme, {
1603
+ }, /*#__PURE__*/React__default["default"].createElement("nav", {
1604
+ className: styles$6.menuTopContainer
1605
+ }, !withoutShareMenu ? /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
1606
+ className: classNames__default["default"]([styles$6.menuItem, styles$6.menuShare])
1607
+ }, bindShareDrag()), /*#__PURE__*/React__default["default"].createElement(ToggleButton, {
1608
+ className: styles$6.slidingButton,
1609
+ button: /*#__PURE__*/React__default["default"].createElement(ShareButton, {
1610
+ className: styles$6.menuButton,
1611
+ onClick: onOpenShare,
1612
+ theme: menuTheme,
1613
+ iconPosition: "left"
1614
+ }),
1615
+ toggledButton: /*#__PURE__*/React__default["default"].createElement(CloseButton, {
1616
+ className: styles$6.menuButton,
1617
+ onClick: onCloseShare,
1618
+ theme: menuTheme,
1619
+ iconPosition: "left"
1620
+ }),
1621
+ toggled: shareOpenedProgress
1622
+ })) : null, !withoutScreensMenu ? /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
1623
+ className: classNames__default["default"]([styles$6.menuItem, styles$6.menuItemScreens])
1624
+ }, bindMenuDrag()), /*#__PURE__*/React__default["default"].createElement(ToggleButton, {
1625
+ className: styles$6.slidingButton,
1626
+ button: /*#__PURE__*/React__default["default"].createElement(MenuButton, {
1627
+ className: styles$6.menuButton,
1628
+ onClick: onOpenMenu,
1629
+ theme: menuTheme
1630
+ }),
1631
+ toggledButton: /*#__PURE__*/React__default["default"].createElement(CloseButton, {
1632
+ className: styles$6.menuButton,
1633
+ onClick: onCloseMenu,
1634
+ theme: menuTheme,
1635
+ iconPosition: "right"
1636
+ }),
1637
+ toggled: menuOpenedProgress,
1638
+ toggledButtonClassName: styles$6.screensMenuButtonToggled
1639
+ })) : null), /*#__PURE__*/React__default["default"].createElement(ViewerMenuDots, Object.assign({}, menuTheme, {
1303
1640
  direction: "horizontal",
1304
- withShadow: withShadow,
1305
1641
  items: items,
1306
- title: title,
1307
- shareUrl: shareUrl,
1308
- onShare: onClickShare,
1309
- onClickItem: onClickItem,
1310
- onClickMenu: onClickMenu,
1642
+ onClickDot: onClickScreen,
1643
+ onClickScreensMenu: onOpenMenu,
1311
1644
  closeable: closeable,
1312
1645
  withItemClick: withDotItemClick,
1313
1646
  withoutScreensMenu: withoutScreensMenu,
1314
1647
  withoutShareMenu: withoutShareMenu,
1315
1648
  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
1321
- }, /*#__PURE__*/React__default["default"].createElement(ViewerMenuPreview, {
1649
+ className: styles$6.dots,
1650
+ style: {
1651
+ opacity: Math.pow(dotsOpacity, 5),
1652
+ // @note this is like a "quint" easing, meaning it'll go towards 1 slowly first and then fast as it approaches 1
1653
+ pointerEvents: dotsOpacity < 1 ? 'none' : 'auto'
1654
+ }
1655
+ }))), /*#__PURE__*/React__default["default"].createElement(ViewerMenuContainer, {
1656
+ className: styles$6.menuContainerShare,
1657
+ transitionProgress: shareOpenedProgress
1658
+ }, shareOpenedProgress > 0 ? /*#__PURE__*/React__default["default"].createElement(ViewerMenuShare, {
1659
+ viewerTheme: viewerTheme,
1660
+ className: styles$6.menuShare,
1661
+ title: title,
1662
+ description: description,
1663
+ menuWidth: menuWidth,
1664
+ focusable: shareOpened,
1665
+ items: items,
1666
+ currentScreenIndex: currentScreenIndex,
1667
+ shareUrl: shareUrl,
1668
+ onShare: onShare,
1669
+ onClose: onCloseShare
1670
+ }) : null), /*#__PURE__*/React__default["default"].createElement(ViewerMenuContainer, {
1671
+ className: styles$6.menuContainerScreens,
1672
+ transitionProgress: menuOpenedProgress
1673
+ }, menuOpenedProgress > 0 ? /*#__PURE__*/React__default["default"].createElement(ViewerMenuPreview, {
1322
1674
  viewerTheme: viewerTheme,
1323
1675
  className: styles$6.menuPreview,
1324
1676
  screenSize: screenSize,
1325
1677
  menuWidth: menuWidth,
1326
- focusable: opened,
1327
1678
  items: items,
1328
- onClickItem: onClickItem,
1329
- onClose: onClickClose,
1679
+ currentScreenIndex: currentScreenIndex,
1680
+ shareUrl: shareUrl,
1681
+ onShare: onShare,
1682
+ onClickScreen: onClickScreen,
1683
+ onClose: onCloseMenu,
1330
1684
  toggleFullscreen: toggleFullscreen,
1331
1685
  fullscreenActive: fullscreenActive,
1332
1686
  fullscreenEnabled: fullscreenEnabled
1333
- })));
1687
+ }) : null));
1334
1688
  };
1335
1689
 
1336
- ViewerMenu.propTypes = propTypes$a;
1337
- ViewerMenu.defaultProps = defaultProps$a;
1690
+ ViewerMenu.propTypes = propTypes$9;
1691
+ ViewerMenu.defaultProps = defaultProps$9;
1338
1692
 
1339
- var styles$5 = {"container":"micromag-viewer-partials-hand-tap-container","circle":"micromag-viewer-partials-hand-tap-circle","pulse":"micromag-viewer-partials-hand-tap-pulse","hand":"micromag-viewer-partials-hand-tap-hand","panY":"micromag-viewer-partials-hand-tap-panY","inner":"micromag-viewer-partials-hand-tap-inner","shadowFade":"micromag-viewer-partials-hand-tap-shadowFade"};
1340
-
1341
- var propTypes$9 = {
1342
- color: PropTypes__default["default"].string,
1343
- className: PropTypes__default["default"].string
1344
- };
1345
- var defaultProps$9 = {
1346
- color: 'currentColor',
1347
- className: null
1348
- };
1349
-
1350
- var HandIcon = function HandIcon(_ref) {
1351
- var color = _ref.color,
1352
- className = _ref.className;
1353
- return /*#__PURE__*/React__default["default"].createElement("svg", {
1354
- className: className,
1355
- xmlns: "http://www.w3.org/2000/svg",
1356
- viewBox: "0 0 367.24 482.87"
1357
- }, /*#__PURE__*/React__default["default"].createElement("path", {
1358
- d: "M488.84,255.91a44.68,44.68,0,0,0-19.15,4.3A44.77,44.77,0,0,0,406,226.49a44.75,44.75,0,0,0-62.67-32.66V105.4a44.81,44.81,0,1,0-89.61,0V265.17l-1.15-2.7a44.78,44.78,0,1,0-82.84,34.06l64.87,157.76.34.73a156.29,156.29,0,0,0,141.42,88.44c86.7,0,157.24-70.53,157.24-157.26V300.7a44.82,44.82,0,0,0-44.78-44.79ZM507.46,386.2c0,72.3-58.78,131.1-131.07,131.1a130.29,130.29,0,0,1-117.73-73.36L193.93,286.61a18.64,18.64,0,1,1,34.53-14.07L279.91,394V105.4a18.64,18.64,0,1,1,37.28,0v196a13.08,13.08,0,0,0,26.16,0V234.56a18.64,18.64,0,0,1,37.27,0v89.95a13.07,13.07,0,1,0,26.13,0V266.86a18.64,18.64,0,1,1,37.28,0v80.71h0s0,.08,0,.11a13.08,13.08,0,0,0,26.15,0v-47a18.63,18.63,0,1,1,37.26,0v85.5Z",
1359
- transform: "translate(-166.38 -60.59)",
1360
- fill: color,
1361
- fillRule: "evenodd"
1362
- }));
1363
- };
1364
-
1365
- HandIcon.propTypes = propTypes$9;
1366
- HandIcon.defaultProps = defaultProps$9;
1693
+ var styles$5 = {"container":"micromag-viewer-screen-container","navigationHint":"micromag-viewer-screen-navigationHint"};
1367
1694
 
1368
1695
  var propTypes$8 = {
1369
- className: PropTypes__default["default"].string
1370
- };
1371
- var defaultProps$8 = {
1372
- className: null
1373
- };
1374
-
1375
- var HandTap = function HandTap(_ref) {
1376
- var className = _ref.className;
1377
- return /*#__PURE__*/React__default["default"].createElement("div", {
1378
- className: classNames__default["default"]([styles$5.container, _defineProperty__default["default"]({}, className, className !== null)])
1379
- }, /*#__PURE__*/React__default["default"].createElement("div", {
1380
- className: styles$5.inner
1381
- }, /*#__PURE__*/React__default["default"].createElement("div", {
1382
- className: styles$5.circle
1383
- }), /*#__PURE__*/React__default["default"].createElement(HandIcon, {
1384
- className: styles$5.hand
1385
- })));
1386
- };
1387
-
1388
- HandTap.propTypes = propTypes$8;
1389
- HandTap.defaultProps = defaultProps$8;
1390
-
1391
- var styles$4 = {"container":"micromag-viewer-screen-container","handTap":"micromag-viewer-screen-handTap"};
1392
-
1393
- var propTypes$7 = {
1394
- screen: core$1.PropTypes.screenComponent,
1395
- renderContext: core$1.PropTypes.renderContext,
1696
+ screen: core.PropTypes.screenComponent,
1697
+ renderContext: core.PropTypes.renderContext,
1396
1698
  screenState: PropTypes__default["default"].string,
1397
1699
  current: PropTypes__default["default"].bool,
1398
1700
  active: PropTypes__default["default"].bool,
@@ -1400,10 +1702,10 @@ var propTypes$7 = {
1400
1702
  width: PropTypes__default["default"].number,
1401
1703
  height: PropTypes__default["default"].number,
1402
1704
  scale: PropTypes__default["default"].number,
1403
- withNavigationHint: PropTypes__default["default"].func,
1705
+ // withNavigationHint: PropTypes.bool, // @todo
1404
1706
  className: PropTypes__default["default"].string
1405
1707
  };
1406
- var defaultProps$7 = {
1708
+ var defaultProps$8 = {
1407
1709
  screen: null,
1408
1710
  renderContext: null,
1409
1711
  screenState: null,
@@ -1413,7 +1715,7 @@ var defaultProps$7 = {
1413
1715
  width: null,
1414
1716
  height: null,
1415
1717
  scale: null,
1416
- withNavigationHint: false,
1718
+ // withNavigationHint: false,
1417
1719
  className: null
1418
1720
  };
1419
1721
 
@@ -1427,10 +1729,9 @@ function ViewerScreen(_ref) {
1427
1729
  width = _ref.width,
1428
1730
  height = _ref.height,
1429
1731
  scale = _ref.scale,
1430
- withNavigationHint = _ref.withNavigationHint,
1431
1732
  className = _ref.className;
1432
1733
  return /*#__PURE__*/React__default["default"].createElement("div", {
1433
- className: classNames__default["default"]([styles$4.container, _defineProperty__default["default"]({}, className, className !== null)])
1734
+ className: classNames__default["default"]([styles$5.container, _defineProperty__default["default"]({}, className, className !== null)])
1434
1735
  }, /*#__PURE__*/React__default["default"].createElement("div", {
1435
1736
  style: {
1436
1737
  width: width,
@@ -1445,62 +1746,131 @@ function ViewerScreen(_ref) {
1445
1746
  active: active,
1446
1747
  current: current,
1447
1748
  mediaRef: mediaRef
1448
- })), withNavigationHint ? /*#__PURE__*/React__default["default"].createElement(HandTap, {
1449
- className: styles$4.handTap
1450
- }) : null);
1749
+ })));
1451
1750
  }
1452
1751
 
1453
- ViewerScreen.propTypes = propTypes$7;
1454
- ViewerScreen.defaultProps = defaultProps$7;
1752
+ ViewerScreen.propTypes = propTypes$8;
1753
+ ViewerScreen.defaultProps = defaultProps$8;
1754
+
1755
+ var styles$4 = {"arrow":"micromag-viewer-buttons-navigation-button-arrow","next":"micromag-viewer-buttons-navigation-button-next","previous":"micromag-viewer-buttons-navigation-button-previous"};
1756
+
1757
+ var propTypes$7 = {
1758
+ direction: PropTypes__default["default"].oneOf(['previous', 'next']),
1759
+ onClick: PropTypes__default["default"].func,
1760
+ className: PropTypes__default["default"].string
1761
+ };
1762
+ var defaultProps$7 = {
1763
+ direction: 'next',
1764
+ onClick: null,
1765
+ className: null
1766
+ };
1767
+
1768
+ var NavigationButton = function NavigationButton(_ref) {
1769
+ var direction = _ref.direction,
1770
+ onClick = _ref.onClick,
1771
+ className = _ref.className;
1772
+ return /*#__PURE__*/React__default["default"].createElement(IconButton, {
1773
+ className: classNames__default["default"]([styles$4.container, styles$4[direction], _defineProperty__default["default"]({}, className, className !== null)]),
1774
+ onClick: onClick,
1775
+ iconPosition: direction === 'next' ? 'right' : 'left',
1776
+ icon: /*#__PURE__*/React__default["default"].createElement("svg", {
1777
+ className: styles$4.arrow,
1778
+ xmlns: "http://www.w3.org/2000/svg",
1779
+ width: "10",
1780
+ height: "16",
1781
+ viewBox: "0 0 10 16",
1782
+ fill: "currentColor"
1783
+ }, /*#__PURE__*/React__default["default"].createElement("polygon", {
1784
+ 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"
1785
+ })),
1786
+ label: /*#__PURE__*/React__default["default"].createElement("span", {
1787
+ className: "sr-only"
1788
+ }, direction === 'previous' ? /*#__PURE__*/React__default["default"].createElement(reactIntl.FormattedMessage, {
1789
+ id: "zYH/31",
1790
+ defaultMessage: [{
1791
+ "type": 0,
1792
+ "value": "Go to previous screen"
1793
+ }]
1794
+ }) : /*#__PURE__*/React__default["default"].createElement(reactIntl.FormattedMessage, {
1795
+ id: "v9bqYj",
1796
+ defaultMessage: [{
1797
+ "type": 0,
1798
+ "value": "Go to next screen"
1799
+ }]
1800
+ }))
1801
+ });
1802
+ };
1803
+
1804
+ NavigationButton.propTypes = propTypes$7;
1805
+ NavigationButton.defaultProps = defaultProps$7;
1455
1806
 
1456
- var styles$3 = {"container":"micromag-viewer-partials-navigation-button-container"};
1807
+ var styles$3 = {"container":"micromag-viewer-partials-arrow-hint-container","inner":"micromag-viewer-partials-arrow-hint-inner","shadowFade":"micromag-viewer-partials-arrow-hint-shadowFade","arrow":"micromag-viewer-partials-arrow-hint-arrow","panX":"micromag-viewer-partials-arrow-hint-panX"};
1457
1808
 
1458
1809
  var propTypes$6 = {
1459
- direction: PropTypes__default["default"].oneOf(['previous', 'next']),
1460
- onClick: null,
1461
1810
  className: PropTypes__default["default"].string
1462
1811
  };
1463
1812
  var defaultProps$6 = {
1464
- direction: 'next',
1465
- onClick: null,
1466
1813
  className: null
1467
1814
  };
1468
1815
 
1469
- var NavigationButton = function NavigationButton(_ref) {
1470
- var direction = _ref.direction,
1471
- onClick = _ref.onClick,
1472
- 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, {
1816
+ var ArrowHint = function ArrowHint(_ref) {
1817
+ var className = _ref.className;
1818
+ return /*#__PURE__*/React__default["default"].createElement("div", {
1819
+ className: classNames__default["default"]([styles$3.container, _defineProperty__default["default"]({}, className, className !== null)])
1820
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
1821
+ className: styles$3.inner
1822
+ }, /*#__PURE__*/React__default["default"].createElement("svg", {
1478
1823
  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
- })));
1824
+ xmlns: "http://www.w3.org/2000/svg",
1825
+ width: "10",
1826
+ height: "16",
1827
+ viewBox: "0 0 10 16",
1828
+ fill: "currentColor"
1829
+ }, /*#__PURE__*/React__default["default"].createElement("polygon", {
1830
+ 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"
1831
+ }))));
1495
1832
  };
1496
1833
 
1497
- NavigationButton.propTypes = propTypes$6;
1498
- NavigationButton.defaultProps = defaultProps$6;
1834
+ ArrowHint.propTypes = propTypes$6;
1835
+ ArrowHint.defaultProps = defaultProps$6;
1836
+
1837
+ 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"};
1838
+
1839
+ var stopDragEventsPropagation = {
1840
+ onTouchMove: function onTouchMove(e) {
1841
+ return e.stopPropagation();
1842
+ },
1843
+ onTouchStart: function onTouchStart(e) {
1844
+ return e.stopPropagation();
1845
+ },
1846
+ onTouchEnd: function onTouchEnd(e) {
1847
+ return e.stopPropagation();
1848
+ },
1849
+ onPointerMove: function onPointerMove(e) {
1850
+ return e.stopPropagation();
1851
+ },
1852
+ onPointerUp: function onPointerUp(e) {
1853
+ return e.stopPropagation();
1854
+ },
1855
+ onPointerDown: function onPointerDown(e) {
1856
+ return e.stopPropagation();
1857
+ }
1858
+ };
1859
+
1860
+ function getFormattedTimestamp(s) {
1861
+ var withMilliseconds = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
1862
+ var sparts = withMilliseconds ? "".concat(s).split('.') : [];
1863
+ var ms = sparts.length > 1 ? ":".concat(sparts[1].substring(0, 3)) : '';
1864
+ return (s - (s %= 60)) / 60 + (9 < s ? ':' : ':0') + ~~s + ms; // eslint-disable-line
1865
+ }
1499
1866
 
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"};
1867
+ var SHOW_MILLISECONDS_THRESHOLD = 5; // show milliseconds when scrubbing if length of video is shorter than 5 seconds
1501
1868
 
1502
1869
  var propTypes$5 = {
1503
- media: PropTypes__default["default"].node,
1870
+ media: PropTypes__default["default"].oneOfType([PropTypes__default["default"].func, PropTypes__default["default"].shape({
1871
+ current: PropTypes__default["default"].any
1872
+ }) // eslint-disable-line
1873
+ ]),
1504
1874
  playing: PropTypes__default["default"].bool,
1505
1875
  backgroundColor: PropTypes__default["default"].string,
1506
1876
  progressColor: PropTypes__default["default"].string,
@@ -1525,7 +1895,7 @@ var defaultProps$5 = {
1525
1895
  };
1526
1896
 
1527
1897
  var SeekBar = function SeekBar(_ref) {
1528
- var _ref3;
1898
+ var _ref4;
1529
1899
 
1530
1900
  var media = _ref.media,
1531
1901
  playing = _ref.playing,
@@ -1541,13 +1911,26 @@ var SeekBar = function SeekBar(_ref) {
1541
1911
  var progress = hooks.useMediaProgress(media, {
1542
1912
  disabled: !playing
1543
1913
  });
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;
1914
+
1915
+ var _ref2 = media || {},
1916
+ _ref2$currentTime = _ref2.currentTime,
1917
+ currentTime = _ref2$currentTime === void 0 ? null : _ref2$currentTime,
1918
+ _ref2$duration = _ref2.duration,
1919
+ duration = _ref2$duration === void 0 ? null : _ref2$duration;
1920
+
1921
+ var _useState = React.useState(false),
1922
+ _useState2 = _slicedToArray__default["default"](_useState, 2),
1923
+ showTimestamp = _useState2[0],
1924
+ setShowTimestamp = _useState2[1];
1925
+
1926
+ var onDrag = React.useCallback(function (_ref3) {
1927
+ _ref3.event;
1928
+ var _ref3$xy = _slicedToArray__default["default"](_ref3.xy, 1),
1929
+ x = _ref3$xy[0],
1930
+ elapsedTime = _ref3.elapsedTime,
1931
+ active = _ref3.active,
1932
+ tap = _ref3.tap,
1933
+ currentTarget = _ref3.currentTarget;
1551
1934
 
1552
1935
  if (!active && elapsedTime > 300) {
1553
1936
  return;
@@ -1564,15 +1947,18 @@ var SeekBar = function SeekBar(_ref) {
1564
1947
  }
1565
1948
  }, [onSeek]);
1566
1949
  var onDragStart = React.useCallback(function () {
1950
+ setShowTimestamp(true);
1951
+
1567
1952
  if (onSeekStart !== null) {
1568
1953
  onSeekStart();
1569
1954
  }
1570
- }, [onSeekStart]);
1955
+ }, [onSeekStart, setShowTimestamp]);
1571
1956
  var onDragEnd = React.useCallback(function () {
1572
1957
  if (onSeekEnd !== null) {
1958
+ setShowTimestamp(false);
1573
1959
  onSeekEnd();
1574
1960
  }
1575
- }, [onSeekEnd]);
1961
+ }, [onSeekEnd, setShowTimestamp]);
1576
1962
  var bind = react.useGesture({
1577
1963
  onDrag: onDrag,
1578
1964
  onDragStart: onDragStart,
@@ -1583,9 +1969,9 @@ var SeekBar = function SeekBar(_ref) {
1583
1969
  filterTaps: true
1584
1970
  }
1585
1971
  });
1586
- 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)])
1588
- }, /*#__PURE__*/React__default["default"].createElement("div", {
1972
+ return /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
1973
+ 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)])
1974
+ }, stopDragEventsPropagation), /*#__PURE__*/React__default["default"].createElement("div", {
1589
1975
  className: styles$2.inner
1590
1976
  }, /*#__PURE__*/React__default["default"].createElement("div", {
1591
1977
  className: styles$2.progressBar,
@@ -1598,7 +1984,12 @@ var SeekBar = function SeekBar(_ref) {
1598
1984
  left: "".concat(progress * 100, "%"),
1599
1985
  backgroundColor: progressColor
1600
1986
  }
1601
- }), /*#__PURE__*/React__default["default"].createElement("div", {
1987
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
1988
+ className: styles$2.scrubbedTime,
1989
+ style: {
1990
+ borderColor: progressColor
1991
+ }
1992
+ }, getFormattedTimestamp(currentTime, duration < SHOW_MILLISECONDS_THRESHOLD))), /*#__PURE__*/React__default["default"].createElement("div", {
1602
1993
  className: styles$2.progress,
1603
1994
  style: {
1604
1995
  transform: "scaleX(".concat(progress, ")"),
@@ -1628,7 +2019,7 @@ var SeekBar = function SeekBar(_ref) {
1628
2019
  SeekBar.propTypes = propTypes$5;
1629
2020
  SeekBar.defaultProps = defaultProps$5;
1630
2021
 
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"};
2022
+ 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
2023
 
1633
2024
  var propTypes$4 = {
1634
2025
  className: PropTypes__default["default"].string,
@@ -1733,7 +2124,8 @@ function PlaybackControls(_ref) {
1733
2124
  setPlaying(true);
1734
2125
  }
1735
2126
  }, [setPlaying, wasPlaying]);
1736
- var mediaHasAudio = mediaElement !== null && (hasAudio === null || hasAudio === true);
2127
+ var hasMedia = mediaElement !== null;
2128
+ var mediaHasAudio = hasMedia && (hasAudio === null || hasAudio === true);
1737
2129
 
1738
2130
  var _ref3 = customControlsTheme || {},
1739
2131
  color = _ref3.color,
@@ -1742,33 +2134,55 @@ function PlaybackControls(_ref) {
1742
2134
 
1743
2135
  var isCollapsed = controls && !controlsVisible && playing || !controls && mediaHasAudio;
1744
2136
  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",
2137
+ 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)])
2138
+ }, /*#__PURE__*/React__default["default"].createElement(components.Button, {
1748
2139
  className: styles$1.playPauseButton,
1749
2140
  style: {
1750
2141
  color: color
1751
2142
  },
1752
2143
  onClick: playing ? onPause : onPlay,
1753
- title: intl.formatMessage({
1754
- id: "ahSpiH",
2144
+ focusable: controlsVisible,
2145
+ icon: playing ? /*#__PURE__*/React__default["default"].createElement("svg", {
2146
+ className: styles$1.icon,
2147
+ xmlns: "http://www.w3.org/2000/svg",
2148
+ width: "10",
2149
+ height: "16",
2150
+ viewBox: "0 0 10 16",
2151
+ fill: "currentColor"
2152
+ }, /*#__PURE__*/React__default["default"].createElement("rect", {
2153
+ x: "1",
2154
+ y: "3.27",
2155
+ width: "3",
2156
+ height: "9.69"
2157
+ }), /*#__PURE__*/React__default["default"].createElement("rect", {
2158
+ x: "6",
2159
+ y: "3.27",
2160
+ width: "3",
2161
+ height: "9.69"
2162
+ })) : /*#__PURE__*/React__default["default"].createElement("svg", {
2163
+ className: styles$1.icon,
2164
+ xmlns: "http://www.w3.org/2000/svg",
2165
+ width: "10",
2166
+ height: "16",
2167
+ viewBox: "0 0 10 16",
2168
+ fill: "currentColor"
2169
+ }, /*#__PURE__*/React__default["default"].createElement("path", {
2170
+ d: "M1,3.16V12.84l8-4.84L1,3.16"
2171
+ })),
2172
+ "aria-label": playing ? intl.formatMessage({
2173
+ id: "mTqcmA",
1755
2174
  defaultMessage: [{
1756
2175
  "type": 0,
1757
- "value": "Play"
2176
+ "value": "Pause"
1758
2177
  }]
1759
- }),
1760
- "aria-label": intl.formatMessage({
2178
+ }) : intl.formatMessage({
1761
2179
  id: "ahSpiH",
1762
2180
  defaultMessage: [{
1763
2181
  "type": 0,
1764
2182
  "value": "Play"
1765
2183
  }]
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, {
2184
+ })
2185
+ }), /*#__PURE__*/React__default["default"].createElement(SeekBar, {
1772
2186
  className: styles$1.seekBar,
1773
2187
  media: mediaElement,
1774
2188
  playing: playing,
@@ -1779,32 +2193,54 @@ function PlaybackControls(_ref) {
1779
2193
  withSeekHead: !isCollapsed && !seekBarOnly,
1780
2194
  backgroundColor: color,
1781
2195
  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)]),
2196
+ }), /*#__PURE__*/React__default["default"].createElement(components.Button, {
2197
+ className: styles$1.muteButton,
1785
2198
  style: {
1786
2199
  color: color
1787
2200
  },
1788
2201
  onClick: muted ? onUnmute : onMute,
1789
- title: intl.formatMessage({
1790
- id: "vzg8Es",
2202
+ focusable: controlsVisible || mediaHasAudio,
2203
+ icon: muted ? /*#__PURE__*/React__default["default"].createElement("svg", {
2204
+ xmlns: "http://www.w3.org/2000/svg",
2205
+ width: "10",
2206
+ height: "16",
2207
+ viewBox: "0 0 10 16",
2208
+ className: styles$1.icon,
2209
+ fill: "currentColor"
2210
+ }, /*#__PURE__*/React__default["default"].createElement("polygon", {
2211
+ 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"
2212
+ }), /*#__PURE__*/React__default["default"].createElement("polygon", {
2213
+ 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"
2214
+ })) : /*#__PURE__*/React__default["default"].createElement("svg", {
2215
+ xmlns: "http://www.w3.org/2000/svg",
2216
+ width: "10",
2217
+ height: "16",
2218
+ viewBox: "0 0 10 16",
2219
+ className: styles$1.icon,
2220
+ fill: "currentColor"
2221
+ }, /*#__PURE__*/React__default["default"].createElement("polygon", {
2222
+ 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"
2223
+ }), /*#__PURE__*/React__default["default"].createElement("circle", {
2224
+ cx: "6.14",
2225
+ cy: "8",
2226
+ r: ".99"
2227
+ }), /*#__PURE__*/React__default["default"].createElement("path", {
2228
+ 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"
2229
+ })),
2230
+ "aria-label": muted ? intl.formatMessage({
2231
+ id: "RK/QEY",
1791
2232
  defaultMessage: [{
1792
2233
  "type": 0,
1793
- "value": "Mute"
2234
+ "value": "Unmute"
1794
2235
  }]
1795
- }),
1796
- "aria-label": intl.formatMessage({
2236
+ }) : intl.formatMessage({
1797
2237
  id: "vzg8Es",
1798
2238
  defaultMessage: [{
1799
2239
  "type": 0,
1800
2240
  "value": "Mute"
1801
2241
  }]
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
- })));
2242
+ })
2243
+ }));
1808
2244
  }
1809
2245
 
1810
2246
  PlaybackControls.propTypes = propTypes$4;
@@ -1897,32 +2333,43 @@ function WebViewContainer(_ref) {
1897
2333
  WebViewContainer.propTypes = propTypes$3;
1898
2334
  WebViewContainer.defaultProps = defaultProps$3;
1899
2335
 
2336
+ var SPRING_CONFIG_TIGHT = {
2337
+ tension: 300,
2338
+ friction: 35
2339
+ }; // tight
2340
+
2341
+ var DRAG_PROGRESS_ACTIVATION_THRESHOLD = 0.3;
2342
+ var DRAG_VELOCITY_ACTIVATION_THRESHOLD = 0.3;
2343
+ var DEFAULT_TRANSITION_TYPE_LANDSCAPE = 'carousel';
2344
+ var DEFAULT_TRANSITION_TYPE_PORTRAIT = 'stack';
1900
2345
  var propTypes$2 = {
1901
- story: core$1.PropTypes.story,
2346
+ story: core.PropTypes.story,
1902
2347
  // .isRequired,
1903
2348
  basePath: PropTypes__default["default"].string,
1904
- theme: core$1.PropTypes.viewerTheme,
2349
+ theme: core.PropTypes.viewerTheme,
1905
2350
  width: PropTypes__default["default"].number,
1906
2351
  height: PropTypes__default["default"].number,
1907
2352
  screen: PropTypes__default["default"].string,
1908
2353
  screenState: PropTypes__default["default"].string,
1909
- deviceScreens: core$1.PropTypes.deviceScreens,
1910
- renderContext: core$1.PropTypes.renderContext,
1911
- visitor: core$1.PropTypes.visitor,
2354
+ deviceScreens: core.PropTypes.deviceScreens,
2355
+ renderContext: core.PropTypes.renderContext,
2356
+ visitor: core.PropTypes.visitor,
1912
2357
  onScreenChange: PropTypes__default["default"].func,
1913
2358
  tapNextScreenWidthPercent: PropTypes__default["default"].number,
1914
- neighborScreensActive: PropTypes__default["default"].number,
1915
- neighborScreensMounted: PropTypes__default["default"].number,
1916
2359
  storyIsParsed: PropTypes__default["default"].bool,
1917
- landscapeScreenMargin: PropTypes__default["default"].number,
1918
- landscapeSmallScreenScale: PropTypes__default["default"].number,
2360
+ neighborScreensActive: PropTypes__default["default"].number,
2361
+ neighborScreenOffset: PropTypes__default["default"].number,
2362
+ neighborScreenScale: PropTypes__default["default"].number,
1919
2363
  withMetadata: PropTypes__default["default"].bool,
2364
+ withoutGestures: PropTypes__default["default"].bool,
1920
2365
  withoutMenu: PropTypes__default["default"].bool,
1921
2366
  withoutScreensMenu: PropTypes__default["default"].bool,
1922
2367
  withoutShareMenu: PropTypes__default["default"].bool,
1923
2368
  withoutMenuShadow: PropTypes__default["default"].bool,
1924
2369
  withoutFullscreen: PropTypes__default["default"].bool,
1925
- withLandscapeSiblingsScreens: PropTypes__default["default"].bool,
2370
+ withoutNavigationArrow: PropTypes__default["default"].bool,
2371
+ withoutTransitions: PropTypes__default["default"].bool,
2372
+ withNeighborScreens: PropTypes__default["default"].bool,
1926
2373
  withNavigationHint: PropTypes__default["default"].bool,
1927
2374
  withoutPlaybackControls: PropTypes__default["default"].bool,
1928
2375
  closeable: PropTypes__default["default"].bool,
@@ -1930,9 +2377,9 @@ var propTypes$2 = {
1930
2377
  onInteraction: PropTypes__default["default"].func,
1931
2378
  onEnd: PropTypes__default["default"].func,
1932
2379
  onViewModeChange: PropTypes__default["default"].func,
1933
- currentScreenMedia: core$1.PropTypes.ref,
2380
+ currentScreenMedia: core.PropTypes.ref,
1934
2381
  menuIsScreenWidth: PropTypes__default["default"].bool,
1935
- screensMedias: core$1.PropTypes.ref,
2382
+ screensMedias: core.PropTypes.ref,
1936
2383
  screenSizeOptions: PropTypes__default["default"].shape({
1937
2384
  withoutMaxSize: PropTypes__default["default"].bool,
1938
2385
  desktopHeightRatio: PropTypes__default["default"].number,
@@ -1953,19 +2400,21 @@ var defaultProps$2 = {
1953
2400
  visitor: null,
1954
2401
  onScreenChange: null,
1955
2402
  tapNextScreenWidthPercent: 0.8,
1956
- neighborScreensActive: 1,
1957
- neighborScreensMounted: 1,
1958
2403
  storyIsParsed: false,
1959
- landscapeScreenMargin: 20,
1960
- landscapeSmallScreenScale: 0.9,
2404
+ neighborScreensActive: 2,
2405
+ neighborScreenOffset: 105,
2406
+ neighborScreenScale: 0.8,
1961
2407
  withMetadata: false,
2408
+ withNeighborScreens: false,
2409
+ withNavigationHint: false,
2410
+ withoutGestures: false,
1962
2411
  withoutMenu: false,
1963
2412
  withoutScreensMenu: false,
1964
2413
  withoutShareMenu: false,
1965
2414
  withoutMenuShadow: false,
1966
2415
  withoutFullscreen: false,
1967
- withLandscapeSiblingsScreens: false,
1968
- withNavigationHint: false,
2416
+ withoutTransitions: false,
2417
+ withoutNavigationArrow: false,
1969
2418
  withoutPlaybackControls: false,
1970
2419
  menuIsScreenWidth: false,
1971
2420
  closeable: false,
@@ -1993,18 +2442,20 @@ var Viewer = function Viewer(_ref) {
1993
2442
  renderContext = _ref.renderContext,
1994
2443
  visitor = _ref.visitor,
1995
2444
  tapNextScreenWidthPercent = _ref.tapNextScreenWidthPercent,
1996
- neighborScreensActive = _ref.neighborScreensActive,
1997
- neighborScreensMounted = _ref.neighborScreensMounted,
1998
2445
  storyIsParsed = _ref.storyIsParsed,
1999
- landscapeScreenMargin = _ref.landscapeScreenMargin,
2000
- landscapeSmallScreenScale = _ref.landscapeSmallScreenScale,
2446
+ neighborScreensActive = _ref.neighborScreensActive,
2447
+ neighborScreenOffset = _ref.neighborScreenOffset,
2448
+ neighborScreenScale = _ref.neighborScreenScale,
2001
2449
  withMetadata = _ref.withMetadata,
2450
+ withoutGestures = _ref.withoutGestures,
2002
2451
  withoutMenu = _ref.withoutMenu,
2003
2452
  withoutScreensMenu = _ref.withoutScreensMenu,
2004
2453
  withoutShareMenu = _ref.withoutShareMenu,
2005
2454
  withoutMenuShadow = _ref.withoutMenuShadow;
2006
2455
  _ref.withoutFullscreen;
2007
- var withLandscapeSiblingsScreens = _ref.withLandscapeSiblingsScreens,
2456
+ var withoutNavigationArrow = _ref.withoutNavigationArrow,
2457
+ withoutTransitions = _ref.withoutTransitions,
2458
+ withNeighborScreens = _ref.withNeighborScreens,
2008
2459
  withNavigationHint = _ref.withNavigationHint,
2009
2460
  withoutPlaybackControls = _ref.withoutPlaybackControls,
2010
2461
  menuIsScreenWidth = _ref.menuIsScreenWidth,
@@ -2018,7 +2469,10 @@ var Viewer = function Viewer(_ref) {
2018
2469
  screensMedias = _ref.screensMedias,
2019
2470
  screenSizeOptions = _ref.screenSizeOptions,
2020
2471
  className = _ref.className;
2021
- var intl = reactIntl.useIntl();
2472
+
2473
+ /**
2474
+ * Screen Data + Processing
2475
+ */
2022
2476
  var parsedStory = hooks.useParsedStory(story, {
2023
2477
  disabled: storyIsParsed
2024
2478
  }) || {};
@@ -2030,20 +2484,59 @@ var Viewer = function Viewer(_ref) {
2030
2484
  metadata = _parsedStory$metadata === void 0 ? null : _parsedStory$metadata,
2031
2485
  _parsedStory$fonts = parsedStory.fonts,
2032
2486
  fonts = _parsedStory$fonts === void 0 ? null : _parsedStory$fonts;
2487
+ var screensCount = screens.length;
2033
2488
  var eventsManager = React.useMemo(function () {
2034
2489
  return new EventEmitter__default["default"]();
2035
- }, [parsedStory]); // Viewer Theme
2490
+ }, [parsedStory]);
2491
+ var screenIndex = React.useMemo(function () {
2492
+ return Math.max(0, screens.findIndex(function (it) {
2493
+ return "".concat(it.id) === "".concat(screenId);
2494
+ }));
2495
+ }, [screenId, screens]);
2496
+ var currentScreen = screens[screenIndex] || null;
2497
+
2498
+ var _ref2 = currentScreen || {},
2499
+ screenParameters = _ref2.parameters;
2500
+
2501
+ var _ref3 = screenParameters || {},
2502
+ screenMetadata = _ref3.metadata;
2503
+
2504
+ var _ref4 = screenMetadata || {},
2505
+ _ref4$title = _ref4.title,
2506
+ screenTitle = _ref4$title === void 0 ? null : _ref4$title,
2507
+ _ref4$description = _ref4.description,
2508
+ screenDescription = _ref4$description === void 0 ? null : _ref4$description;
2509
+
2510
+ var finalTitle = screenTitle !== null ? screenTitle : title;
2511
+ var finalMetadata = React.useMemo(function () {
2512
+ return screenDescription !== null ? _objectSpread__default["default"](_objectSpread__default["default"]({}, metadata), {}, {
2513
+ description: screenDescription
2514
+ }) : metadata;
2515
+ }, [metadata, screenDescription]);
2516
+ var screensMediasRef = React.useRef([]);
2517
+
2518
+ if (currentScreenMedia !== null) {
2519
+ currentScreenMedia.current = screensMediasRef.current[screenIndex] || null;
2520
+ }
2521
+
2522
+ if (screensMedias !== null) {
2523
+ screensMedias.current = screensMediasRef.current;
2524
+ }
2525
+ /**
2526
+ * Screen Layout
2527
+ */
2036
2528
 
2037
- var _ref2 = viewerTheme || {},
2038
- textStyles = _ref2.textStyles;
2039
2529
 
2040
- var _ref3 = textStyles || {},
2041
- _ref3$title = _ref3.title,
2042
- themeTextStyle = _ref3$title === void 0 ? null : _ref3$title;
2530
+ var _ref5 = viewerTheme || {},
2531
+ textStyles = _ref5.textStyles;
2043
2532
 
2044
- var _ref4 = themeTextStyle || {},
2045
- _ref4$fontFamily = _ref4.fontFamily,
2046
- themeFont = _ref4$fontFamily === void 0 ? null : _ref4$fontFamily; // Fonts
2533
+ var _ref6 = textStyles || {},
2534
+ _ref6$title = _ref6.title,
2535
+ themeTextStyle = _ref6$title === void 0 ? null : _ref6$title;
2536
+
2537
+ var _ref7 = themeTextStyle || {},
2538
+ _ref7$fontFamily = _ref7.fontFamily,
2539
+ themeFont = _ref7$fontFamily === void 0 ? null : _ref7$fontFamily; // Fonts
2047
2540
 
2048
2541
 
2049
2542
  var finalFonts = React.useMemo(function () {
@@ -2070,8 +2563,12 @@ var Viewer = function Viewer(_ref) {
2070
2563
  _usePlaybackContext$m = _usePlaybackContext.media,
2071
2564
  playbackMedia = _usePlaybackContext$m === void 0 ? null : _usePlaybackContext$m;
2072
2565
 
2073
- var trackScreenView = hooks.useTrackScreenView();
2074
- var contentRef = React.useRef(null); // Get screen size
2566
+ var _useDimensionObserver = hooks.useDimensionObserver(),
2567
+ playbackControlsContainerRef = _useDimensionObserver.ref,
2568
+ _useDimensionObserver2 = _useDimensionObserver.height,
2569
+ playbackControlsContainerHeight = _useDimensionObserver2 === void 0 ? 0 : _useDimensionObserver2;
2570
+
2571
+ var trackScreenView = hooks.useTrackScreenView(); // Get screen size
2075
2572
 
2076
2573
  var _useScreenSizeFromEle = hooks.useScreenSizeFromElement(_objectSpread__default["default"]({
2077
2574
  width: width,
@@ -2082,21 +2579,26 @@ var Viewer = function Viewer(_ref) {
2082
2579
  screenSize = _useScreenSizeFromEle.screenSize,
2083
2580
  screenScale = _useScreenSizeFromEle.scale;
2084
2581
 
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;
2582
+ var _ref8 = screenSize || {},
2583
+ _ref8$width = _ref8.width,
2584
+ screenWidth = _ref8$width === void 0 ? null : _ref8$width,
2585
+ _ref8$height = _ref8.height,
2586
+ screenHeight = _ref8$height === void 0 ? null : _ref8$height,
2587
+ _ref8$landscape = _ref8.landscape,
2588
+ landscape = _ref8$landscape === void 0 ? false : _ref8$landscape,
2589
+ _ref8$menuOverScreen = _ref8.menuOverScreen,
2590
+ menuOverScreen = _ref8$menuOverScreen === void 0 ? false : _ref8$menuOverScreen;
2094
2591
 
2095
2592
  var screenContainerWidth = screenScale !== null ? screenWidth * screenScale : screenWidth;
2096
2593
  var screenContainerHeight = screenScale !== null ? screenHeight * screenScale : screenHeight;
2097
2594
  var hasSize = screenWidth > 0 && screenHeight > 0;
2098
- var ready = hasSize; // && fontsLoaded;
2099
-
2595
+ var ready = hasSize;
2596
+ var trackingEnabled = isView;
2597
+ React.useEffect(function () {
2598
+ if (trackingEnabled && currentScreen !== null) {
2599
+ trackScreenView(currentScreen, screenIndex);
2600
+ }
2601
+ }, [currentScreen, trackScreenView, trackingEnabled]);
2100
2602
  React.useEffect(function () {
2101
2603
  if (ready && onViewModeChange !== null) {
2102
2604
  onViewModeChange({
@@ -2105,21 +2607,14 @@ var Viewer = function Viewer(_ref) {
2105
2607
  });
2106
2608
  }
2107
2609
  }, [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
- }
2610
+ /**
2611
+ * Screen Transitions
2612
+ */
2119
2613
 
2120
- if (screensMedias !== null) {
2121
- screensMedias.current = screensMediasRef.current;
2122
- }
2614
+ var transitionType = landscape && withNeighborScreens ? DEFAULT_TRANSITION_TYPE_LANDSCAPE : DEFAULT_TRANSITION_TYPE_PORTRAIT;
2615
+ /**
2616
+ * Screen Navigation
2617
+ */
2123
2618
 
2124
2619
  var changeIndex = React.useCallback(function (index) {
2125
2620
  if (index === screenIndex) {
@@ -2133,23 +2628,37 @@ var Viewer = function Viewer(_ref) {
2133
2628
  if (onScreenChange !== null) {
2134
2629
  onScreenChange(screens[index], index);
2135
2630
  }
2136
- }, [screenIndex, screens, onScreenChange]); // Track screen view
2631
+ }, [screenIndex, screens, onScreenChange]);
2632
+ var onScreenNavigate = React.useCallback(function (_ref9) {
2633
+ var index = _ref9.index,
2634
+ newIndex = _ref9.newIndex,
2635
+ end = _ref9.end,
2636
+ direction = _ref9.direction;
2137
2637
 
2138
- var trackingEnabled = isView;
2139
- var currentScreen = screens[screenIndex] || null;
2140
- React.useEffect(function () {
2141
- if (trackingEnabled && currentScreen !== null) {
2142
- trackScreenView(currentScreen, screenIndex);
2638
+ if (end && onEnd !== null) {
2639
+ onEnd();
2143
2640
  }
2144
- }, [currentScreen, trackScreenView, trackingEnabled]); // Handle interaction enable
2145
2641
 
2642
+ changeIndex(newIndex);
2643
+ eventsManager.emit('navigate', {
2644
+ index: index,
2645
+ newIndex: newIndex,
2646
+ direction: direction,
2647
+ end: end
2648
+ });
2649
+
2650
+ if (end) {
2651
+ eventsManager.emit('navigate_end');
2652
+ } else {
2653
+ eventsManager.emit("navigate_".concat(direction), newIndex);
2654
+ }
2655
+ }, [onEnd, changeIndex]);
2146
2656
  var gotoPreviousScreen = React.useCallback(function () {
2147
2657
  changeIndex(Math.max(0, screenIndex - 1));
2148
- }, [changeIndex]);
2658
+ }, [changeIndex, screenIndex]);
2149
2659
  var gotoNextScreen = React.useCallback(function () {
2150
2660
  changeIndex(Math.min(screens.length - 1, screenIndex + 1));
2151
- }, [changeIndex]);
2152
- var screensCount = screens.length;
2661
+ }, [changeIndex, screenIndex]);
2153
2662
 
2154
2663
  var _useState = React.useState(false),
2155
2664
  _useState2 = _slicedToArray__default["default"](_useState, 2),
@@ -2165,37 +2674,12 @@ var Viewer = function Viewer(_ref) {
2165
2674
  setHasInteracted(true);
2166
2675
  }
2167
2676
  }, [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
2677
 
2193
2678
  var _useScreenInteraction = useScreenInteraction({
2194
2679
  screens: screens,
2195
2680
  screenIndex: screenIndex,
2196
2681
  screenWidth: screenContainerWidth,
2197
2682
  disableCurrentScreenNavigation: !isView,
2198
- clickOnSiblings: landscape && withLandscapeSiblingsScreens,
2199
2683
  nextScreenWidthPercent: tapNextScreenWidthPercent,
2200
2684
  onInteract: onInteractionPrivate,
2201
2685
  onNavigate: onScreenNavigate
@@ -2203,102 +2687,127 @@ var Viewer = function Viewer(_ref) {
2203
2687
  interactWithScreen = _useScreenInteraction.interact,
2204
2688
  currentScreenInteractionEnabled = _useScreenInteraction.currentScreenInteractionEnabled,
2205
2689
  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;
2690
+ disableInteraction = _useScreenInteraction.disableInteraction;
2691
+
2692
+ var onTap = React.useCallback(function (_ref10) {
2693
+ var currentTarget = _ref10.currentTarget,
2694
+ event = _ref10.event,
2695
+ target = _ref10.target,
2696
+ _ref10$xy = _slicedToArray__default["default"](_ref10.xy, 2),
2697
+ x = _ref10$xy[0],
2698
+ y = _ref10$xy[1];
2699
+
2700
+ interactWithScreen({
2701
+ event: event,
2702
+ target: target,
2703
+ currentTarget: currentTarget,
2704
+ index: screenIndex,
2705
+ x: x,
2706
+ y: y
2707
+ });
2708
+ }, [interactWithScreen, screenIndex]);
2709
+ var computeScreenProgress = React.useCallback(function (_ref11) {
2710
+ var active = _ref11.active,
2711
+ _ref11$movement = _slicedToArray__default["default"](_ref11.movement, 1),
2712
+ mx = _ref11$movement[0],
2713
+ _ref11$velocity = _slicedToArray__default["default"](_ref11.velocity, 1),
2714
+ vx = _ref11$velocity[0];
2715
+
2716
+ var p = mx / screenContainerWidth; // drag "ratio": how much of the screen width has been swiped?
2717
+
2718
+ var forwards = mx < 0; // true if swiping to left (to navigate forwards)
2719
+
2720
+ var newIndex = !forwards ? screenIndex - 1 : screenIndex + 1; // which item index are we moving towards?
2721
+
2722
+ var reachedThreshold = vx > DRAG_VELOCITY_ACTIVATION_THRESHOLD || Math.abs(p) > DRAG_PROGRESS_ACTIVATION_THRESHOLD;
2723
+ var reachedBounds = newIndex < 0 || newIndex >= screensCount; // have we reached the end of the stack?
2724
+
2725
+ var damper = reachedBounds ? 0.1 : 1;
2726
+ var progress = Math.max(-1, Math.min(1, p * damper));
2727
+
2728
+ if (!active) {
2729
+ return reachedThreshold && !reachedBounds ? newIndex : screenIndex;
2244
2730
  }
2245
2731
 
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;
2732
+ return screenIndex - progress;
2733
+ }, [screenContainerWidth, screenIndex]);
2734
+ var onScreenProgress = React.useCallback(function (progress, _ref12) {
2735
+ var active = _ref12.active;
2736
+ var delta = Math.abs(progress - screenIndex);
2737
+ var reachedBounds = progress < 0 || progress >= screensCount; // have we reached the end of the stack?
2252
2738
 
2253
- var hasTappedLeft = x - contentX < contentWidth * 0.5;
2254
- var nextIndex = hasTappedLeft ? Math.max(0, screenIndex - 1) : Math.min(screensCount - 1, screenIndex + 1);
2739
+ if (!active && delta === 1 && !reachedBounds) {
2255
2740
  onScreenNavigate({
2256
2741
  index: screenIndex,
2257
- newIndex: nextIndex
2742
+ newIndex: progress
2258
2743
  });
2259
2744
  }
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;
2745
+ }, [onScreenNavigate, screenIndex]);
2746
+ var springParams = React.useMemo(function () {
2747
+ return {
2748
+ config: SPRING_CONFIG_TIGHT
2749
+ };
2750
+ }, []);
2751
+
2752
+ var _useDragProgress = hooks.useDragProgress({
2753
+ progress: screenIndex,
2754
+ disabled: !isView || withoutTransitions,
2755
+ dragDisabled: withoutGestures,
2756
+ computeProgress: computeScreenProgress,
2757
+ onProgress: onScreenProgress,
2758
+ onTap: onTap,
2759
+ springParams: springParams
2760
+ }),
2761
+ isDragging = _useDragProgress.dragging,
2762
+ screenIndexProgress = _useDragProgress.progress,
2763
+ dragContentBind = _useDragProgress.bind;
2266
2764
 
2267
- if (key === 'Enter' && withLandscapeSiblingsScreens && landscape && i !== screenIndex) {
2268
- changeIndex(i);
2765
+ var getScreenStylesByIndex = function getScreenStylesByIndex(index, progress) {
2766
+ if (transitionType === 'stack') {
2767
+ var _t = index - progress;
2768
+
2769
+ var _clamped = Math.min(1, Math.max(0, _t));
2770
+
2771
+ var invert = Math.min(1, Math.max(0, -_t));
2772
+ var opacity = Math.max(0, 1 - 0.75 * invert + (_t + 1));
2773
+ return {
2774
+ opacity: opacity,
2775
+ transform: "translateX(".concat(_clamped * 100, "%) scale(").concat(1 - 0.2 * invert, ")"),
2776
+ boxShadow: "0 0 ".concat(4 * (1 - _clamped), "rem ").concat(-0.5 * (1 - _clamped), "rem black"),
2777
+ zIndex: index
2778
+ };
2269
2779
  }
2270
- }, [withLandscapeSiblingsScreens, changeIndex, landscape, screenIndex]); // swipe menu open
2271
2780
 
2272
- var menuVisible = screensCount === 0 || currentScreenInteractionEnabled;
2781
+ var t = index - progress;
2782
+ var clamped = Math.min(1, Math.max(0, Math.abs(t)));
2783
+ return {
2784
+ opacity: 1 - 0.75 * clamped,
2785
+ transform: "translateX(".concat(t * neighborScreenOffset, "%) scale(").concat(1 - (1 - neighborScreenScale) * clamped, ")"),
2786
+ zIndex: screensCount - index
2787
+ };
2788
+ };
2273
2789
 
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;
2790
+ var _useFullscreen = hooks.useFullscreen(containerRef.current || null),
2791
+ toggleFullscreen = _useFullscreen.toggle,
2792
+ fullscreenActive = _useFullscreen.active,
2793
+ fullscreenEnabled = _useFullscreen.enabled;
2794
+
2795
+ var menuVisible = screensCount === 0 || currentScreenInteractionEnabled; // Get element height
2796
+
2797
+ var _useDimensionObserver3 = hooks.useDimensionObserver(),
2798
+ menuDotsContainerRef = _useDimensionObserver3.ref,
2799
+ _useDimensionObserver4 = _useDimensionObserver3.height,
2800
+ menuDotsContainerHeight = _useDimensionObserver4 === void 0 ? 0 : _useDimensionObserver4;
2801
+
2802
+ var onClickScreen = React.useCallback(function (_ref13) {
2803
+ var itemScreenId = _ref13.screenId;
2291
2804
  onInteractionPrivate();
2292
- var index = screens.findIndex(function (_ref11) {
2293
- var id = _ref11.id;
2805
+ var index = screens.findIndex(function (_ref14) {
2806
+ var id = _ref14.id;
2294
2807
  return id === itemScreenId;
2295
2808
  });
2296
2809
  changeIndex(index);
2297
-
2298
- if (menuOpened) {
2299
- setMenuOpened(false);
2300
- }
2301
- }, [onInteractionPrivate, changeIndex, menuOpened, setMenuOpened]);
2810
+ }, [onInteractionPrivate, changeIndex]);
2302
2811
  var onContextMenu = React.useCallback(function (e) {
2303
2812
  if (!landscape) {
2304
2813
  e.preventDefault();
@@ -2306,28 +2815,16 @@ var Viewer = function Viewer(_ref) {
2306
2815
  }
2307
2816
 
2308
2817
  return true;
2309
- }, [landscape]);
2818
+ }, [landscape]); // hmm?
2819
+
2310
2820
  var overscrollStyle = /*#__PURE__*/React__default["default"].createElement("style", {
2311
2821
  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
-
2822
+ }, "body { overscroll-behavior: contain; }");
2320
2823
  var keyboardShortcuts = React.useMemo(function () {
2321
2824
  return {
2322
2825
  f: function f() {
2323
2826
  return toggleFullscreen();
2324
2827
  },
2325
- m: function m() {
2326
- return setMenuOpened(!menuOpened);
2327
- },
2328
- escape: function escape() {
2329
- return setMenuOpened(false);
2330
- },
2331
2828
  arrowleft: function arrowleft() {
2332
2829
  return gotoPreviousScreen();
2333
2830
  },
@@ -2338,55 +2835,10 @@ var Viewer = function Viewer(_ref) {
2338
2835
  return gotoNextScreen();
2339
2836
  }
2340
2837
  };
2341
- }, [menuOpened, setMenuOpened, gotoPreviousScreen, gotoNextScreen]);
2838
+ }, [gotoPreviousScreen, gotoNextScreen]);
2342
2839
  useKeyboardShortcuts(keyboardShortcuts, {
2343
2840
  disabled: renderContext !== 'view'
2344
2841
  });
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
2842
  return /*#__PURE__*/React__default["default"].createElement(contexts.VisitorProvider, {
2391
2843
  visitor: visitor
2392
2844
  }, /*#__PURE__*/React__default["default"].createElement(contexts.ScreenSizeProvider, {
@@ -2411,13 +2863,12 @@ var Viewer = function Viewer(_ref) {
2411
2863
  }), /*#__PURE__*/React__default["default"].createElement("div", {
2412
2864
  className: classNames__default["default"]([styles$6.container, screenSize.screens.map(function (screenName) {
2413
2865
  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)]),
2866
+ }), (_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
2867
  ref: containerRef,
2416
2868
  onContextMenu: onContextMenu
2417
2869
  }, !withoutMenu ? /*#__PURE__*/React__default["default"].createElement(ViewerMenu, {
2418
2870
  story: parsedStory,
2419
2871
  currentScreenIndex: screenIndex,
2420
- opened: menuOpened,
2421
2872
  withShadow: menuOverScreen && !withoutMenuShadow,
2422
2873
  toggleFullscreen: toggleFullscreen,
2423
2874
  fullscreenActive: fullscreenActive,
@@ -2426,109 +2877,66 @@ var Viewer = function Viewer(_ref) {
2426
2877
  shareBasePath: basePath,
2427
2878
  screenSize: screenSize,
2428
2879
  menuWidth: menuIsScreenWidth ? screenContainerWidth : null,
2880
+ theme: viewerTheme,
2429
2881
  trackingEnabled: trackingEnabled,
2430
- onClickItem: onClickMenuItem,
2431
- onClickMenu: onClickMenu,
2882
+ onClickScreen: onClickScreen,
2432
2883
  onClickCloseViewer: onCloseViewer,
2433
- onRequestOpen: onMenuRequestOpen,
2434
- onRequestClose: onMenuRequestClose,
2435
2884
  withDotItemClick: screenContainerWidth > 400,
2436
2885
  withoutScreensMenu: withoutScreensMenu,
2437
2886
  withoutShareMenu: withoutShareMenu,
2438
2887
  refDots: menuDotsContainerRef
2439
2888
  }) : null, ready || withoutScreensTransforms ? /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
2440
- ref: contentRef,
2441
2889
  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%', ")");
2890
+ }, dragContentBind()), !withoutNavigationArrow && !withNeighborScreens && screenIndex > 0 && screens.length > 1 ? /*#__PURE__*/React__default["default"].createElement(NavigationButton, {
2891
+ direction: "previous",
2892
+ className: classNames__default["default"]([styles$6.navButton, styles$6.previous]),
2893
+ onClick: gotoPreviousScreen
2894
+ }) : null, /*#__PURE__*/React__default["default"].createElement("div", {
2895
+ className: styles$6.screensFrame,
2896
+ style: {
2897
+ width: screenContainerWidth,
2898
+ height: screenContainerHeight,
2899
+ overflow: !withNeighborScreens ? 'hidden' : null
2468
2900
  }
2901
+ }, screens.map(function (screen, i) {
2902
+ var current = i === Math.round(screenIndexProgress); // base current on transition
2469
2903
 
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, {
2904
+ var active = i >= screenIndex - neighborScreensActive && i <= screenIndex + neighborScreensActive;
2905
+ var defaultStyles = {
2906
+ opacity: current ? 1 : 0
2907
+ };
2908
+ var screenStyles = active ? getScreenStylesByIndex(i, screenIndexProgress) : defaultStyles;
2909
+ return /*#__PURE__*/React__default["default"].createElement("div", {
2910
+ key: "screen-viewer-".concat(screen.id || '', "-").concat(i + 1),
2911
+ style: screenStyles,
2912
+ className: classNames__default["default"]([styles$6.screenContainer, _defineProperty__default["default"]({}, styles$6.current, current)])
2913
+ }, screen !== null && active ? /*#__PURE__*/React__default["default"].createElement(ViewerScreen, {
2502
2914
  className: styles$6.screen,
2503
- screen: mountedScreen,
2915
+ screen: screen,
2504
2916
  screenState: current ? screenState : null,
2505
- renderContext: renderContext,
2506
2917
  index: i,
2507
2918
  current: current,
2508
2919
  active: active,
2509
2920
  mediaRef: function mediaRef(ref) {
2510
2921
  screensMediasRef.current[i] = ref;
2511
2922
  },
2923
+ renderContext: renderContext,
2512
2924
  width: screenWidth,
2513
2925
  height: screenHeight,
2514
- 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", {
2926
+ scale: screenScale
2927
+ }) : null);
2928
+ })), !withoutNavigationArrow && !withNeighborScreens && screenIndex < screens.length - 1 ? /*#__PURE__*/React__default["default"].createElement(NavigationButton, {
2929
+ direction: "next",
2930
+ className: classNames__default["default"]([styles$6.navButton, styles$6.next]),
2931
+ onClick: gotoNextScreen
2932
+ }) : null, !withoutPlaybackControls ? /*#__PURE__*/React__default["default"].createElement("div", {
2522
2933
  className: styles$6.playbackControls,
2523
2934
  ref: playbackControlsContainerRef
2524
- }, /*#__PURE__*/React__default["default"].createElement("div", {
2525
- className: styles$6.playbackControlsContainer,
2526
- style: {
2527
- width: screenContainerWidth
2528
- }
2529
2935
  }, /*#__PURE__*/React__default["default"].createElement(PlaybackControls, {
2530
2936
  className: styles$6.controls
2531
- }))) : null) : null, /*#__PURE__*/React__default["default"].createElement(WebViewContainer, {
2937
+ })) : null, withNavigationHint && !withNeighborScreens && screenIndex === 0 && !hasInteracted ? /*#__PURE__*/React__default["default"].createElement(ArrowHint, {
2938
+ className: styles$6.arrowHint
2939
+ }) : null) : null, /*#__PURE__*/React__default["default"].createElement(WebViewContainer, {
2532
2940
  className: styles$6.webView,
2533
2941
  style: {
2534
2942
  maxWidth: Math.max(screenContainerWidth, 600)
@@ -2541,7 +2949,7 @@ Viewer.defaultProps = defaultProps$2;
2541
2949
 
2542
2950
  var _excluded$1 = ["story", "pathWithIndex", "children", "onScreenChange"];
2543
2951
  var propTypes$1 = {
2544
- story: core$1.PropTypes.story,
2952
+ story: core.PropTypes.story,
2545
2953
  // .isRequired,
2546
2954
  pathWithIndex: PropTypes__default["default"].bool,
2547
2955
  children: PropTypes__default["default"].func,
@@ -2618,7 +3026,7 @@ var defaultRoutes = {
2618
3026
 
2619
3027
  var _excluded = ["story", "screenComponents", "memoryRouter", "basePath", "routes", "withoutRouter", "googleApiKey", "trackingVariables", "locale", "locales", "translations", "pathWithIndex"];
2620
3028
  var propTypes = {
2621
- story: core$1.PropTypes.story,
3029
+ story: core.PropTypes.story,
2622
3030
  screen: PropTypes__default["default"].string,
2623
3031
  screenComponents: PropTypes__default["default"].objectOf(PropTypes__default["default"].elementType),
2624
3032
  memoryRouter: PropTypes__default["default"].bool,
@@ -2626,7 +3034,7 @@ var propTypes = {
2626
3034
  routes: routes,
2627
3035
  withoutRouter: PropTypes__default["default"].bool,
2628
3036
  googleApiKey: PropTypes__default["default"].string,
2629
- trackingVariables: core$1.PropTypes.trackingVariables,
3037
+ trackingVariables: core.PropTypes.trackingVariables,
2630
3038
  locale: PropTypes__default["default"].string,
2631
3039
  locales: PropTypes__default["default"].arrayOf(PropTypes__default["default"].string),
2632
3040
  translations: PropTypes__default["default"].objectOf(PropTypes__default["default"].string),