@micromag/viewer 0.2.409 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.js CHANGED
@@ -4,63 +4,329 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var _objectSpread = require('@babel/runtime/helpers/objectSpread2');
6
6
  var _objectWithoutProperties = require('@babel/runtime/helpers/objectWithoutProperties');
7
- var React = require('react');
8
7
  var PropTypes = require('prop-types');
8
+ var React = require('react');
9
9
  var reactRouter = require('react-router');
10
10
  var reactRouterDom = require('react-router-dom');
11
- var screens = require('@micromag/screens');
12
- var intl = require('@micromag/intl');
13
- var fieldsManager = require('@micromag/fields/manager');
14
- var core = require('@micromag/core');
11
+ var core$1 = require('@micromag/core');
15
12
  var contexts = require('@micromag/core/contexts');
13
+ var fieldsManager = require('@micromag/fields/manager');
14
+ var intl = require('@micromag/intl');
15
+ 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 classNames = require('classnames');
20
+ var reactHelmet = require('react-helmet');
21
+ var reactIntl = require('react-intl');
19
22
  var components = require('@micromag/core/components');
20
23
  var hooks = require('@micromag/core/hooks');
21
24
  var utils = require('@micromag/core/utils');
22
- var core$1 = require('@react-spring/core');
25
+ var core = require('@react-spring/core');
23
26
  var web = require('@react-spring/web');
24
27
  var react = require('@use-gesture/react');
25
- var classNames = require('classnames');
26
- var reactHelmet = require('react-helmet');
27
- var reactIntl = require('react-intl');
28
28
  var freeSolidSvgIcons = require('@fortawesome/free-solid-svg-icons');
29
29
  var reactFontawesome = require('@fortawesome/react-fontawesome');
30
30
  var Scroll = require('@micromag/element-scroll');
31
31
  var reactShare = require('react-share');
32
+ var EventEmitter = require('wolfy87-eventemitter');
32
33
 
33
34
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
34
35
 
35
36
  var _objectSpread__default = /*#__PURE__*/_interopDefaultLegacy(_objectSpread);
36
37
  var _objectWithoutProperties__default = /*#__PURE__*/_interopDefaultLegacy(_objectWithoutProperties);
37
- var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
38
38
  var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes);
39
+ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
39
40
  var fieldsManager__default = /*#__PURE__*/_interopDefaultLegacy(fieldsManager);
40
41
  var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty);
41
42
  var _slicedToArray__default = /*#__PURE__*/_interopDefaultLegacy(_slicedToArray);
42
43
  var _toConsumableArray__default = /*#__PURE__*/_interopDefaultLegacy(_toConsumableArray);
43
44
  var classNames__default = /*#__PURE__*/_interopDefaultLegacy(classNames);
44
45
  var Scroll__default = /*#__PURE__*/_interopDefaultLegacy(Scroll);
46
+ var EventEmitter__default = /*#__PURE__*/_interopDefaultLegacy(EventEmitter);
47
+
48
+ var home = "/";
49
+ var screen = "/:screen";
50
+ var defaultRoutes = {
51
+ home: home,
52
+ screen: screen
53
+ };
45
54
 
46
55
  var routes = PropTypes__default["default"].shape({
47
56
  home: PropTypes__default["default"].string.isRequired,
48
57
  screen: PropTypes__default["default"].string.isRequired
49
58
  });
50
59
 
51
- var styles$6 = {"container":"micromag-viewer-container","menuPreview":"micromag-viewer-menuPreview","menuPreviewContainer":"micromag-viewer-menuPreviewContainer","screen":"micromag-viewer-screen","screenInner":"micromag-viewer-screenInner","content":"micromag-viewer-content","menuDotsContainer":"micromag-viewer-menuDotsContainer","menuDots":"micromag-viewer-menuDots","current":"micromag-viewer-current","landscape":"micromag-viewer-landscape","hideMenu":"micromag-viewer-hideMenu","ready":"micromag-viewer-ready"};
60
+ function useKeyboardShortcuts() {
61
+ var shortcuts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
62
+
63
+ var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
64
+ _ref$disabled = _ref.disabled,
65
+ disabled = _ref$disabled === void 0 ? false : _ref$disabled;
66
+
67
+ React.useEffect(function () {
68
+ var onKey = function onKey(e) {
69
+ if (['input', 'textarea'].reduce(function (foundMatch, match) {
70
+ return foundMatch || e.target.matches(match);
71
+ }, false)) {
72
+ return;
73
+ }
74
+
75
+ var key = e.key;
76
+ var lowercaseKey = key.toLowerCase();
77
+
78
+ if (typeof shortcuts[lowercaseKey] !== 'undefined') {
79
+ shortcuts[lowercaseKey]();
80
+ }
81
+ };
82
+
83
+ if (!disabled) {
84
+ window.addEventListener('keydown', onKey);
85
+ }
86
+
87
+ return function () {
88
+ if (!disabled) {
89
+ window.removeEventListener('keydown', onKey);
90
+ }
91
+ };
92
+ }, [disabled]);
93
+ }
94
+
95
+ function checkClickable(el) {
96
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
97
+ var distance = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
98
+
99
+ var _ref = options || {},
100
+ _ref$maxDistance = _ref.maxDistance,
101
+ maxDistance = _ref$maxDistance === void 0 ? 5 : _ref$maxDistance,
102
+ _ref$tags = _ref.tags,
103
+ tags = _ref$tags === void 0 ? ['BUTTON', 'A', 'INPUT', 'TEXTAREA'] : _ref$tags;
104
+
105
+ var _ref2 = el || {},
106
+ _ref2$tagName = _ref2.tagName,
107
+ tagName = _ref2$tagName === void 0 ? null : _ref2$tagName,
108
+ _ref2$parentNode = _ref2.parentNode,
109
+ parentNode = _ref2$parentNode === void 0 ? null : _ref2$parentNode;
110
+
111
+ if (tagName === 'BODY') {
112
+ return false;
113
+ }
114
+
115
+ if (tags.map(function (it) {
116
+ return it.toLowerCase();
117
+ }).indexOf(tagName.toLowerCase()) > -1) {
118
+ return true;
119
+ }
120
+
121
+ if (distance < maxDistance) {
122
+ return checkClickable(parentNode, options, distance + 1);
123
+ }
124
+
125
+ return false;
126
+ }
127
+
128
+ function useScreenInteraction() {
129
+ var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
130
+ screens = _ref.screens,
131
+ screenId = _ref.screenId,
132
+ screenWidth = _ref.screenWidth,
133
+ _ref$isView = _ref.isView,
134
+ isView = _ref$isView === void 0 ? false : _ref$isView,
135
+ _ref$clickOnSiblings = _ref.clickOnSiblings,
136
+ clickOnSiblings = _ref$clickOnSiblings === void 0 ? false : _ref$clickOnSiblings,
137
+ _ref$nextScreenWidthP = _ref.nextScreenWidthPercent,
138
+ nextScreenWidthPercent = _ref$nextScreenWidthP === void 0 ? 0.5 : _ref$nextScreenWidthP,
139
+ _ref$eventsManager = _ref.eventsManager,
140
+ eventsManager = _ref$eventsManager === void 0 ? null : _ref$eventsManager,
141
+ _ref$onClick = _ref.onClick,
142
+ onClick = _ref$onClick === void 0 ? null : _ref$onClick,
143
+ _ref$onEnd = _ref.onEnd,
144
+ onEnd = _ref$onEnd === void 0 ? null : _ref$onEnd,
145
+ _ref$onChangeScreen = _ref.onChangeScreen,
146
+ onChangeScreen = _ref$onChangeScreen === void 0 ? null : _ref$onChangeScreen;
147
+
148
+ var _useState = React.useState(screens.reduce(function (map, _ref2) {
149
+ var id = _ref2.id;
150
+ return _objectSpread__default["default"](_objectSpread__default["default"]({}, map), {}, _defineProperty__default["default"]({}, id, true));
151
+ }, {})),
152
+ _useState2 = _slicedToArray__default["default"](_useState, 2),
153
+ screensInteractionEnabled = _useState2[0],
154
+ setScreensInteractionEnabled = _useState2[1];
155
+
156
+ var screenIndex = screens.findIndex(function (_ref3) {
157
+ var id = _ref3.id;
158
+ return id === screenId;
159
+ });
160
+ var _screensInteractionEn = screensInteractionEnabled[screenId],
161
+ currentScreenInteractionEnabled = _screensInteractionEn === void 0 ? true : _screensInteractionEn;
162
+ var updateInteraction = React.useCallback(function (newValue) {
163
+ var _screensInteractionEn2 = screensInteractionEnabled[screenId],
164
+ currentValue = _screensInteractionEn2 === void 0 ? true : _screensInteractionEn2;
165
+
166
+ if (currentValue !== newValue) {
167
+ setScreensInteractionEnabled(screens.reduce(function (map, _ref4) {
168
+ var id = _ref4.id;
169
+ return screenId === id ? _objectSpread__default["default"](_objectSpread__default["default"]({}, map), {}, _defineProperty__default["default"]({}, id, newValue)) : _objectSpread__default["default"](_objectSpread__default["default"]({}, map), {}, _defineProperty__default["default"]({}, id, typeof screensInteractionEnabled[id] === 'undefined' || screensInteractionEnabled[id] === true));
170
+ }, {}));
171
+ }
172
+ }, [screens, screenId, screensInteractionEnabled, setScreensInteractionEnabled]);
173
+ var enableInteraction = React.useCallback(function () {
174
+ return updateInteraction(true);
175
+ }, [updateInteraction]);
176
+ var disableInteraction = React.useCallback(function () {
177
+ return updateInteraction(false);
178
+ }, [updateInteraction]);
179
+ var onScreenClick = React.useCallback(function (e, index) {
180
+ if (onClick !== null) {
181
+ onClick(e, index);
182
+ }
183
+
184
+ var screensCount = screens.length;
185
+ var tappedCurrent = screenIndex === index;
186
+ eventsManager.emit('tap', e, index);
187
+
188
+ if (!isView && tappedCurrent || checkClickable(e.target) || tappedCurrent && !currentScreenInteractionEnabled) {
189
+ return;
190
+ }
191
+
192
+ var nextIndex = screenIndex;
193
+
194
+ var _e$currentTarget$getB = e.currentTarget.getBoundingClientRect(),
195
+ _e$currentTarget$getB2 = _e$currentTarget$getB.left,
196
+ contentX = _e$currentTarget$getB2 === void 0 ? 0 : _e$currentTarget$getB2;
197
+
198
+ var tapX = e.clientX;
199
+ var hasTappedLeft = tappedCurrent ? tapX - contentX < screenWidth * (1 - nextScreenWidthPercent) : screenIndex > index;
200
+
201
+ if (hasTappedLeft) {
202
+ nextIndex = clickOnSiblings ? index : Math.max(0, screenIndex - 1);
203
+ eventsManager.emit('tap_previous', nextIndex);
204
+ } else {
205
+ nextIndex = clickOnSiblings ? index : Math.min(screensCount - 1, screenIndex + 1);
206
+ var isLastScreen = screenIndex === screensCount - 1;
207
+
208
+ if (isLastScreen && onEnd !== null) {
209
+ eventsManager.emit('tap_end');
210
+ onEnd();
211
+ } else {
212
+ eventsManager.emit('tap_next', nextIndex);
213
+ }
214
+ }
215
+
216
+ eventsManager.emit('change_screen', nextIndex);
217
+ onChangeScreen(nextIndex);
218
+ }, [screenWidth, screens, screenIndex, eventsManager, onClick, onEnd, onChangeScreen, screenIndex, screensInteractionEnabled, currentScreenInteractionEnabled, nextScreenWidthPercent, isView, clickOnSiblings]);
219
+ return {
220
+ onClick: onScreenClick,
221
+ currentScreenInteractionEnabled: currentScreenInteractionEnabled,
222
+ enableInteraction: enableInteraction,
223
+ disableInteraction: disableInteraction
224
+ };
225
+ }
226
+
227
+ var styles$7 = {"container":"micromag-viewer-container","menuPreview":"micromag-viewer-menuPreview","menuPreviewContainer":"micromag-viewer-menuPreviewContainer","screen":"micromag-viewer-screen","screenInner":"micromag-viewer-screenInner","content":"micromag-viewer-content","menuDotsContainer":"micromag-viewer-menuDotsContainer","menuDots":"micromag-viewer-menuDots","current":"micromag-viewer-current","landscape":"micromag-viewer-landscape","visible":"micromag-viewer-visible","withSibblings":"micromag-viewer-withSibblings","hideMenu":"micromag-viewer-hideMenu","ready":"micromag-viewer-ready"};
228
+
229
+ var styles$6 = {"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"};
230
+
231
+ var styles$5 = {"container":"micromag-viewer-menus-menu-dot-container","button":"micromag-viewer-menus-menu-dot-button","dot":"micromag-viewer-menus-menu-dot-dot","vertical":"micromag-viewer-menus-menu-dot-vertical"};
232
+
233
+ var propTypes$a = {
234
+ current: PropTypes__default["default"].bool,
235
+ active: PropTypes__default["default"].bool,
236
+ colors: PropTypes__default["default"].shape({
237
+ primary: PropTypes__default["default"].string,
238
+ secondary: PropTypes__default["default"].string
239
+ }),
240
+ vertical: PropTypes__default["default"].bool,
241
+ onClick: PropTypes__default["default"].func,
242
+ className: PropTypes__default["default"].string
243
+ };
244
+ var defaultProps$a = {
245
+ current: false,
246
+ active: false,
247
+ colors: null,
248
+ vertical: false,
249
+ onClick: null,
250
+ className: null
251
+ };
252
+
253
+ var ViewerMenuDot = function ViewerMenuDot(_ref) {
254
+ var _ref3;
255
+
256
+ var current = _ref.current,
257
+ active = _ref.active,
258
+ colors = _ref.colors,
259
+ vertical = _ref.vertical,
260
+ onClick = _ref.onClick,
261
+ className = _ref.className;
262
+ var currentTime = 0;
263
+ var duration = 1;
264
+ var playing = true;
265
+
266
+ var _ref2 = colors || {},
267
+ _ref2$primary = _ref2.primary,
268
+ primary = _ref2$primary === void 0 ? 'rgba(255, 255, 255, 1)' : _ref2$primary,
269
+ _ref2$secondary = _ref2.secondary,
270
+ secondary = _ref2$secondary === void 0 ? 'rgba(200, 200, 200, 0.5)' : _ref2$secondary; // TODO: if approved animate progress
271
+
272
+
273
+ var _useSpring = core.useSpring(function () {
274
+ return {
275
+ x: 0,
276
+ config: {
277
+ duration: 0
278
+ }
279
+ };
280
+ }),
281
+ _useSpring2 = _slicedToArray__default["default"](_useSpring, 2);
282
+ _useSpring2[0];
283
+ var setSpringProps = _useSpring2[1];
284
+
285
+ React.useEffect(function () {
286
+
287
+ var progress = currentTime / duration;
288
+ setSpringProps.start({
289
+ reset: true,
290
+ immediate: !playing,
291
+ from: {
292
+ x: progress
293
+ },
294
+ to: {
295
+ x: 1
296
+ },
297
+ config: {
298
+ duration: (duration - currentTime) * 1000
299
+ }
300
+ });
301
+ }, [playing, duration, currentTime, setSpringProps]);
302
+ return /*#__PURE__*/React__default["default"].createElement("li", {
303
+ className: classNames__default["default"]([styles$5.container, (_ref3 = {}, _defineProperty__default["default"](_ref3, styles$5.active, current), _defineProperty__default["default"](_ref3, styles$5.vertical, vertical), _defineProperty__default["default"](_ref3, className, className !== null), _ref3)]),
304
+ "aria-hidden": "true"
305
+ }, /*#__PURE__*/React__default["default"].createElement("button", {
306
+ type: "button",
307
+ className: styles$5.button,
308
+ onClick: onClick,
309
+ tabIndex: "-1"
310
+ }, /*#__PURE__*/React__default["default"].createElement("span", {
311
+ className: styles$5.dot,
312
+ style: {
313
+ backgroundColor: active ? primary : secondary
314
+ }
315
+ })));
316
+ };
52
317
 
53
- var styles$5 = {"container":"micromag-viewer-menus-menu-dots-container","closeButton":"micromag-viewer-menus-menu-dots-closeButton","item":"micromag-viewer-menus-menu-dots-item","button":"micromag-viewer-menus-menu-dots-button","menuButton":"micromag-viewer-menus-menu-dots-menuButton","items":"micromag-viewer-menus-menu-dots-items","dot":"micromag-viewer-menus-menu-dots-dot","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"};
318
+ ViewerMenuDot.propTypes = propTypes$a;
319
+ ViewerMenuDot.defaultProps = defaultProps$a;
54
320
 
55
321
  var styles$4 = {};
56
322
 
57
- var propTypes$8 = {
323
+ var propTypes$9 = {
58
324
  size: PropTypes__default["default"].number,
59
325
  spacing: PropTypes__default["default"].number,
60
326
  color: PropTypes__default["default"].string,
61
327
  className: PropTypes__default["default"].string
62
328
  };
63
- var defaultProps$8 = {
329
+ var defaultProps$9 = {
64
330
  size: 100,
65
331
  spacing: 8,
66
332
  color: 'white',
@@ -92,57 +358,66 @@ var MenuIcon = function MenuIcon(_ref) {
92
358
  }));
93
359
  };
94
360
 
95
- MenuIcon.propTypes = propTypes$8;
96
- MenuIcon.defaultProps = defaultProps$8;
361
+ MenuIcon.propTypes = propTypes$9;
362
+ MenuIcon.defaultProps = defaultProps$9;
97
363
 
98
- var propTypes$7 = {
364
+ var propTypes$8 = {
99
365
  direction: PropTypes__default["default"].oneOf(['horizontal', 'vertical']),
100
366
  withShadow: PropTypes__default["default"].bool,
101
- items: core.PropTypes.menuItems,
102
- current: PropTypes__default["default"].number,
367
+ items: core$1.PropTypes.menuItems,
103
368
  onClickItem: PropTypes__default["default"].func,
369
+ onClickMenu: PropTypes__default["default"].func,
104
370
  colors: PropTypes__default["default"].shape({
105
371
  primary: PropTypes__default["default"].string,
106
372
  secondary: PropTypes__default["default"].string
107
373
  }),
108
374
  closeable: PropTypes__default["default"].bool,
375
+ withItemClick: PropTypes__default["default"].bool,
376
+ withoutScreensMenu: PropTypes__default["default"].bool,
109
377
  onClose: PropTypes__default["default"].func,
110
378
  className: PropTypes__default["default"].string
111
379
  };
112
- var defaultProps$7 = {
380
+ var defaultProps$8 = {
113
381
  direction: 'horizontal',
114
382
  withShadow: false,
115
383
  items: [],
116
- current: 0,
117
384
  onClickItem: null,
385
+ onClickMenu: null,
118
386
  colors: null,
119
387
  closeable: false,
388
+ withItemClick: false,
389
+ withoutScreensMenu: false,
120
390
  onClose: null,
121
391
  className: null
122
392
  };
123
393
 
124
394
  var ViewerMenuDots = function ViewerMenuDots(_ref) {
125
- var _ref3;
395
+ var _ref4;
126
396
 
127
397
  var direction = _ref.direction,
128
398
  withShadow = _ref.withShadow,
129
399
  items = _ref.items,
130
- current = _ref.current,
131
400
  onClickItem = _ref.onClickItem,
401
+ onClickMenu = _ref.onClickMenu,
132
402
  colors = _ref.colors,
133
403
  closeable = _ref.closeable,
404
+ withItemClick = _ref.withItemClick,
405
+ withoutScreensMenu = _ref.withoutScreensMenu,
134
406
  onClose = _ref.onClose,
135
407
  className = _ref.className;
136
408
 
137
409
  var _ref2 = colors || {},
138
410
  _ref2$primary = _ref2.primary,
139
- primary = _ref2$primary === void 0 ? 'rgba(255, 255, 255, 1)' : _ref2$primary,
140
- _ref2$secondary = _ref2.secondary,
141
- secondary = _ref2$secondary === void 0 ? 'rgba(200, 200, 200, 0.5)' : _ref2$secondary;
411
+ primary = _ref2$primary === void 0 ? 'rgba(255, 255, 255, 1)' : _ref2$primary;
142
412
 
143
413
  var intl = reactIntl.useIntl();
414
+ var currentIndex = items.findIndex(function (_ref3) {
415
+ var _ref3$current = _ref3.current,
416
+ current = _ref3$current === void 0 ? false : _ref3$current;
417
+ return current;
418
+ });
144
419
  return /*#__PURE__*/React__default["default"].createElement("nav", {
145
- className: classNames__default["default"]([styles$5.container, (_ref3 = {}, _defineProperty__default["default"](_ref3, className, className !== null), _defineProperty__default["default"](_ref3, styles$5.vertical, direction === 'vertical'), _defineProperty__default["default"](_ref3, styles$5.withShadow, withShadow), _ref3)]),
420
+ className: classNames__default["default"]([styles$6.container, (_ref4 = {}, _defineProperty__default["default"](_ref4, className, className !== null), _defineProperty__default["default"](_ref4, styles$6.vertical, direction === 'vertical'), _defineProperty__default["default"](_ref4, styles$6.withShadow, withShadow), _ref4)]),
146
421
  "aria-label": intl.formatMessage({
147
422
  id: "bLYuuN",
148
423
  defaultMessage: [{
@@ -162,35 +437,32 @@ var ViewerMenuDots = function ViewerMenuDots(_ref) {
162
437
  "value": "."
163
438
  }]
164
439
  }, {
165
- current: current + 1,
440
+ current: currentIndex + 1,
166
441
  total: items.length
167
442
  })
168
443
  }, /*#__PURE__*/React__default["default"].createElement("ul", {
169
- className: styles$5.items
444
+ className: styles$6.items
170
445
  }, items.map(function (item, index) {
171
- return /*#__PURE__*/React__default["default"].createElement("li", {
172
- className: classNames__default["default"]([styles$5.item, _defineProperty__default["default"]({}, styles$5.active, current === index)]),
173
- key: "item-".concat(index),
174
- "aria-hidden": "true"
175
- }, /*#__PURE__*/React__default["default"].createElement("button", {
176
- type: "button",
177
- className: styles$5.button,
446
+ var _item$current = item.current,
447
+ current = _item$current === void 0 ? false : _item$current;
448
+ return /*#__PURE__*/React__default["default"].createElement(ViewerMenuDot, {
449
+ key: "item-".concat(index + 1),
450
+ current: current,
451
+ active: index <= currentIndex,
452
+ colors: colors,
178
453
  onClick: function onClick() {
179
- if (onClickItem !== null) {
180
- onClickItem(index);
454
+ if ((withItemClick || withoutScreensMenu) && onClickItem !== null) {
455
+ onClickItem(item);
456
+ } else if (!withItemClick && onClickMenu !== null) {
457
+ onClickMenu();
181
458
  }
182
459
  },
183
- tabIndex: "-1"
184
- }, /*#__PURE__*/React__default["default"].createElement("span", {
185
- className: styles$5.dot,
186
- style: {
187
- backgroundColor: index <= current ? primary : secondary
188
- }
189
- })));
190
- }), /*#__PURE__*/React__default["default"].createElement("li", {
191
- className: styles$5.menu
460
+ vertical: direction === 'vertical'
461
+ });
462
+ }), !withoutScreensMenu ? /*#__PURE__*/React__default["default"].createElement("li", {
463
+ className: styles$6.menu
192
464
  }, /*#__PURE__*/React__default["default"].createElement(MenuIcon, {
193
- className: styles$5.menuIcon,
465
+ className: styles$6.menuIcon,
194
466
  color: primary
195
467
  }), /*#__PURE__*/React__default["default"].createElement("button", {
196
468
  type: "button",
@@ -208,20 +480,16 @@ var ViewerMenuDots = function ViewerMenuDots(_ref) {
208
480
  "value": "Menu"
209
481
  }]
210
482
  }),
211
- className: styles$5.menuButton,
212
- onClick: function onClick() {
213
- if (onClickItem !== null) {
214
- onClickItem(null);
215
- }
216
- }
217
- })), closeable ? /*#__PURE__*/React__default["default"].createElement("li", {
218
- className: styles$5.closeButton,
483
+ className: styles$6.menuButton,
484
+ onClick: onClickMenu
485
+ })) : null, closeable ? /*#__PURE__*/React__default["default"].createElement("li", {
486
+ className: styles$6.closeButton,
219
487
  style: {
220
488
  color: primary
221
489
  }
222
490
  }, /*#__PURE__*/React__default["default"].createElement("button", {
223
491
  type: "button",
224
- className: styles$5.closeButton,
492
+ className: styles$6.closeButton,
225
493
  onClick: onClose,
226
494
  title: intl.formatMessage({
227
495
  id: "dj/p/q",
@@ -242,14 +510,14 @@ var ViewerMenuDots = function ViewerMenuDots(_ref) {
242
510
  }))) : null));
243
511
  };
244
512
 
245
- ViewerMenuDots.propTypes = propTypes$7;
246
- ViewerMenuDots.defaultProps = defaultProps$7;
513
+ ViewerMenuDots.propTypes = propTypes$8;
514
+ ViewerMenuDots.defaultProps = defaultProps$8;
247
515
 
248
- var styles$3 = {"container":"micromag-viewer-menus-menu-preview-container","screenButton":"micromag-viewer-menus-menu-preview-screenButton","activeScreenBorder":"micromag-viewer-menus-menu-preview-activeScreenBorder","itemContent":"micromag-viewer-menus-menu-preview-itemContent","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","screenContainer":"micromag-viewer-menus-menu-preview-screenContainer","screenContent":"micromag-viewer-menus-menu-preview-screenContent"};
516
+ var styles$3 = {"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","screenContent":"micromag-viewer-menus-menu-preview-screenContent"};
249
517
 
250
518
  var styles$2 = {"container":"micromag-viewer-partials-share-modal-container","content":"micromag-viewer-partials-share-modal-content","opened":"micromag-viewer-partials-share-modal-opened"};
251
519
 
252
- var propTypes$6 = {
520
+ var propTypes$7 = {
253
521
  url: PropTypes__default["default"].string,
254
522
  title: PropTypes__default["default"].string,
255
523
  opened: PropTypes__default["default"].bool,
@@ -257,7 +525,7 @@ var propTypes$6 = {
257
525
  onShare: PropTypes__default["default"].func,
258
526
  onCancel: PropTypes__default["default"].func
259
527
  };
260
- var defaultProps$6 = {
528
+ var defaultProps$7 = {
261
529
  url: null,
262
530
  title: null,
263
531
  opened: false,
@@ -341,12 +609,12 @@ var ShareModal = function ShareModal(_ref) {
341
609
  }), /*#__PURE__*/React__default["default"].createElement(reactShare.EmailIcon, shareIconProps)))));
342
610
  };
343
611
 
344
- ShareModal.propTypes = propTypes$6;
345
- ShareModal.defaultProps = defaultProps$6;
612
+ ShareModal.propTypes = propTypes$7;
613
+ ShareModal.defaultProps = defaultProps$7;
346
614
 
347
615
  var styles$1 = {"container":"micromag-viewer-partials-share-button-container","shareModal":"micromag-viewer-partials-share-button-shareModal"};
348
616
 
349
- var propTypes$5 = {
617
+ var propTypes$6 = {
350
618
  title: PropTypes__default["default"].string,
351
619
  url: PropTypes__default["default"].string,
352
620
  className: PropTypes__default["default"].string,
@@ -355,7 +623,7 @@ var propTypes$5 = {
355
623
  children: PropTypes__default["default"].node,
356
624
  focusable: PropTypes__default["default"].bool
357
625
  };
358
- var defaultProps$5 = {
626
+ var defaultProps$6 = {
359
627
  title: null,
360
628
  url: null,
361
629
  className: null,
@@ -425,16 +693,16 @@ var ShareButton = function ShareButton(_ref) {
425
693
  }));
426
694
  };
427
695
 
428
- ShareButton.propTypes = propTypes$5;
429
- ShareButton.defaultProps = defaultProps$5;
696
+ ShareButton.propTypes = propTypes$6;
697
+ ShareButton.defaultProps = defaultProps$6;
430
698
 
431
- var propTypes$4 = {
432
- viewerTheme: core.PropTypes.viewerTheme,
433
- screenWidth: PropTypes__default["default"].number,
699
+ var propTypes$5 = {
700
+ viewerTheme: core$1.PropTypes.viewerTheme,
701
+ screenSize: core$1.PropTypes.screenSize,
702
+ menuWidth: PropTypes__default["default"].number,
434
703
  title: PropTypes__default["default"].string,
435
704
  shareUrl: PropTypes__default["default"].string,
436
- items: core.PropTypes.menuItems,
437
- current: PropTypes__default["default"].number,
705
+ items: core$1.PropTypes.menuItems,
438
706
  focusable: PropTypes__default["default"].bool,
439
707
  onClickItem: PropTypes__default["default"].func,
440
708
  onClose: PropTypes__default["default"].func,
@@ -445,13 +713,13 @@ var propTypes$4 = {
445
713
  fullscreenEnabled: PropTypes__default["default"].bool,
446
714
  className: PropTypes__default["default"].string
447
715
  };
448
- var defaultProps$4 = {
716
+ var defaultProps$5 = {
449
717
  viewerTheme: null,
450
- screenWidth: null,
718
+ screenSize: null,
719
+ menuWidth: null,
451
720
  title: null,
452
721
  shareUrl: null,
453
722
  items: [],
454
- current: 0,
455
723
  focusable: true,
456
724
  onClickItem: null,
457
725
  onClose: null,
@@ -463,13 +731,13 @@ var defaultProps$4 = {
463
731
  className: null
464
732
  };
465
733
 
466
- function ViewerMenuPreview(_ref) {
734
+ var ViewerMenuPreview = function ViewerMenuPreview(_ref) {
467
735
  var viewerTheme = _ref.viewerTheme,
468
- screenWidth = _ref.screenWidth,
736
+ screenSize = _ref.screenSize,
737
+ menuWidth = _ref.menuWidth,
469
738
  title = _ref.title,
470
739
  shareUrl = _ref.shareUrl,
471
740
  items = _ref.items,
472
- current = _ref.current,
473
741
  focusable = _ref.focusable,
474
742
  onClickItem = _ref.onClickItem,
475
743
  onClose = _ref.onClose,
@@ -480,82 +748,74 @@ function ViewerMenuPreview(_ref) {
480
748
  fullscreenEnabled = _ref.fullscreenEnabled,
481
749
  className = _ref.className;
482
750
  var intl = reactIntl.useIntl();
483
- var screenSizeRatio = "".concat(3 / 2 / thumbsPerLine * 100, "%");
484
- var screenRatioHeight = screenWidth * 3 / 2;
485
- var hasSize = screenWidth > 0;
486
- var hasItems = items !== null && items.length > 0;
487
-
488
- var _useState = React.useState(null),
489
- _useState2 = _slicedToArray__default["default"](_useState, 2),
490
- thumbSize = _useState2[0],
491
- setThumbSize = _useState2[1];
492
-
493
- var firstScreenContainerRef = React.useRef(null);
494
- React.useEffect(function () {
495
- if (hasItems && hasSize && firstScreenContainerRef.current !== null) {
496
- var _firstScreenContainer = firstScreenContainerRef.current,
497
- offsetWidth = _firstScreenContainer.offsetWidth,
498
- offsetHeight = _firstScreenContainer.offsetHeight;
499
- setThumbSize({
500
- width: offsetWidth,
501
- height: offsetHeight
502
- });
503
- }
504
- }, [screenWidth, hasItems, hasSize]); // Viewer theme
505
-
506
- var _ref2 = viewerTheme || {},
507
- _ref2$colors = _ref2.colors,
508
- colors = _ref2$colors === void 0 ? null : _ref2$colors,
509
- _ref2$background = _ref2.background,
510
- background = _ref2$background === void 0 ? null : _ref2$background,
511
- _ref2$textStyles = _ref2.textStyles,
512
- textStyles = _ref2$textStyles === void 0 ? null : _ref2$textStyles,
513
- _ref2$logo = _ref2.logo,
514
- brandLogo = _ref2$logo === void 0 ? null : _ref2$logo;
515
-
516
- var _ref3 = textStyles || {},
517
- _ref3$title = _ref3.title,
518
- brandTextStyle = _ref3$title === void 0 ? null : _ref3$title;
519
751
 
520
- var _ref4 = colors || {},
521
- _ref4$primary = _ref4.primary,
522
- brandPrimaryColor = _ref4$primary === void 0 ? null : _ref4$primary,
523
- _ref4$secondary = _ref4.secondary,
524
- brandSecondaryColor = _ref4$secondary === void 0 ? null : _ref4$secondary;
752
+ var _ref2 = screenSize || {},
753
+ screenWidth = _ref2.width,
754
+ screenHeight = _ref2.height;
525
755
 
526
- var _ref5 = background || {},
527
- _ref5$color = _ref5.color,
528
- brandBackgroundColor = _ref5$color === void 0 ? null : _ref5$color,
529
- _ref5$image = _ref5.image,
530
- image = _ref5$image === void 0 ? null : _ref5$image;
531
-
532
- var _ref6 = image || {},
533
- _ref6$url = _ref6.url,
534
- brandImageUrl = _ref6$url === void 0 ? null : _ref6$url;
756
+ var _useResizeObserver = hooks.useResizeObserver(),
757
+ firstScreenContainerRef = _useResizeObserver.ref,
758
+ firstScreenContentRect = _useResizeObserver.entry.contentRect;
759
+
760
+ var _ref3 = firstScreenContentRect || {},
761
+ _ref3$width = _ref3.width,
762
+ thumbWidth = _ref3$width === void 0 ? 0 : _ref3$width;
763
+
764
+ var screenScale = thumbWidth / screenWidth; // Viewer theme
765
+
766
+ var _ref4 = viewerTheme || {},
767
+ _ref4$colors = _ref4.colors,
768
+ colors = _ref4$colors === void 0 ? null : _ref4$colors,
769
+ _ref4$background = _ref4.background,
770
+ background = _ref4$background === void 0 ? null : _ref4$background,
771
+ _ref4$textStyles = _ref4.textStyles,
772
+ textStyles = _ref4$textStyles === void 0 ? null : _ref4$textStyles,
773
+ _ref4$logo = _ref4.logo,
774
+ brandLogo = _ref4$logo === void 0 ? null : _ref4$logo;
775
+
776
+ var _ref5 = textStyles || {},
777
+ _ref5$title = _ref5.title,
778
+ brandTextStyle = _ref5$title === void 0 ? null : _ref5$title;
779
+
780
+ var _ref6 = colors || {},
781
+ _ref6$primary = _ref6.primary,
782
+ brandPrimaryColor = _ref6$primary === void 0 ? null : _ref6$primary,
783
+ _ref6$secondary = _ref6.secondary,
784
+ brandSecondaryColor = _ref6$secondary === void 0 ? null : _ref6$secondary;
785
+
786
+ var _ref7 = background || {},
787
+ _ref7$color = _ref7.color,
788
+ brandBackgroundColor = _ref7$color === void 0 ? null : _ref7$color,
789
+ _ref7$image = _ref7.image,
790
+ image = _ref7$image === void 0 ? null : _ref7$image;
791
+
792
+ var _ref8 = image || {},
793
+ _ref8$url = _ref8.url,
794
+ brandImageUrl = _ref8$url === void 0 ? null : _ref8$url;
535
795
 
536
796
  var borderPrimaryColorStyle = utils.getStyleFromColor(brandPrimaryColor, 'borderColor');
537
797
  var colorSecondaryColorStyle = utils.getStyleFromColor(brandSecondaryColor, 'color');
538
798
  var backgroundColorStyle = utils.getStyleFromColor(brandBackgroundColor, 'backgroundColor');
539
799
 
540
- var _ref7 = brandLogo || {},
541
- _ref7$url = _ref7.url,
542
- brandLogoUrl = _ref7$url === void 0 ? null : _ref7$url;
800
+ var _ref9 = brandLogo || {},
801
+ _ref9$url = _ref9.url,
802
+ brandLogoUrl = _ref9$url === void 0 ? null : _ref9$url;
543
803
 
544
804
  var brandImageStyle = brandImageUrl !== null ? {
545
805
  backgroundImage: "url(".concat(brandImageUrl, ")")
546
806
  } : null;
547
807
  var titleStyle = brandTextStyle !== null ? utils.getStyleFromText(brandTextStyle) : null;
548
808
 
549
- var _useState3 = React.useState(false),
550
- _useState4 = _slicedToArray__default["default"](_useState3, 2),
551
- scrolledBottom = _useState4[0],
552
- setScrolledBottom = _useState4[1];
809
+ var _useState = React.useState(false),
810
+ _useState2 = _slicedToArray__default["default"](_useState, 2),
811
+ scrolledBottom = _useState2[0],
812
+ setScrolledBottom = _useState2[1];
553
813
 
554
- var dragBind = react.useDrag(function (_ref8) {
555
- var _ref8$direction = _slicedToArray__default["default"](_ref8.direction, 2),
556
- dy = _ref8$direction[1],
557
- last = _ref8.last,
558
- tap = _ref8.tap;
814
+ var dragBind = react.useDrag(function (_ref10) {
815
+ var _ref10$direction = _slicedToArray__default["default"](_ref10.direction, 2),
816
+ dy = _ref10$direction[1],
817
+ last = _ref10.last,
818
+ tap = _ref10.tap;
559
819
 
560
820
  if (!tap && last && scrolledBottom && dy < 0 && onClose !== null) {
561
821
  onClose();
@@ -572,10 +832,10 @@ function ViewerMenuPreview(_ref) {
572
832
  var onScrolledNotBottom = React.useCallback(function () {
573
833
  setScrolledBottom(false);
574
834
  }, [setScrolledBottom]);
575
- return hasSize ? /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
835
+ return /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
576
836
  className: classNames__default["default"]([styles$3.container, _defineProperty__default["default"]({}, className, className !== null)]),
577
837
  style: _objectSpread__default["default"](_objectSpread__default["default"](_objectSpread__default["default"]({}, backgroundColorStyle), brandImageStyle), {}, {
578
- width: screenWidth
838
+ width: menuWidth
579
839
  }),
580
840
  "aria-hidden": focusable ? null : 'true'
581
841
  }, dragBind()), /*#__PURE__*/React__default["default"].createElement("div", {
@@ -654,7 +914,10 @@ function ViewerMenuPreview(_ref) {
654
914
  }, /*#__PURE__*/React__default["default"].createElement("ul", {
655
915
  className: styles$3.items
656
916
  }, items.map(function (item, index) {
657
- var screenIndexLabel = intl.formatMessage({
917
+ var _item$current = item.current,
918
+ current = _item$current === void 0 ? false : _item$current,
919
+ screen = item.screen;
920
+ var screenAriaLabel = "".concat(intl.formatMessage({
658
921
  id: "LkVfwW",
659
922
  defaultMessage: [{
660
923
  "type": 0,
@@ -665,106 +928,385 @@ function ViewerMenuPreview(_ref) {
665
928
  }]
666
929
  }, {
667
930
  index: index + 1
668
- });
669
- var isCurrentScreenLabel = current === index ? " ".concat(intl.formatMessage({
931
+ })).concat(current ? " ".concat(intl.formatMessage({
670
932
  id: "vmrJ8U",
671
933
  defaultMessage: [{
672
934
  "type": 0,
673
935
  "value": "(current screen)"
674
936
  }]
675
- })) : '';
676
- var screenAriaLabel = screenIndexLabel + isCurrentScreenLabel;
937
+ })) : '');
677
938
  return /*#__PURE__*/React__default["default"].createElement("li", {
678
- className: classNames__default["default"]([styles$3.item, _defineProperty__default["default"]({}, styles$3.active, current === index)]),
939
+ className: classNames__default["default"]([styles$3.item, _defineProperty__default["default"]({}, styles$3.active, current)]),
679
940
  key: "item-".concat(index),
680
941
  style: {
681
- paddingBottom: screenSizeRatio,
682
942
  width: "".concat(100 / thumbsPerLine, "%")
683
943
  }
684
944
  }, /*#__PURE__*/React__default["default"].createElement("div", {
685
945
  className: styles$3.itemContent
686
946
  }, /*#__PURE__*/React__default["default"].createElement("div", {
687
947
  className: styles$3.screenContainer,
688
- ref: index === 0 ? firstScreenContainerRef : null
689
- }, /*#__PURE__*/React__default["default"].createElement("div", {
948
+ ref: index === 0 ? firstScreenContainerRef : null,
949
+ style: {
950
+ height: screenHeight * screenScale
951
+ }
952
+ }, screenWidth > 0 && screenHeight > 0 ? /*#__PURE__*/React__default["default"].createElement("div", {
690
953
  className: styles$3.screenContent,
691
- style: thumbSize !== null ? {
954
+ style: {
692
955
  width: screenWidth,
693
- height: screenRatioHeight,
694
- transform: "scale(".concat(thumbSize.width / screenWidth)
695
- } : null,
956
+ height: screenHeight,
957
+ transform: "scale(".concat(screenScale)
958
+ },
696
959
  "aria-hidden": "true"
697
960
  }, /*#__PURE__*/React__default["default"].createElement(components.ScreenPreview, {
698
961
  width: screenWidth,
699
- height: screenRatioHeight,
700
- screen: item,
962
+ height: screenHeight,
963
+ screen: screen,
701
964
  focusable: false
702
- })), current === index ? /*#__PURE__*/React__default["default"].createElement("div", {
965
+ })) : null, current ? /*#__PURE__*/React__default["default"].createElement("div", {
703
966
  className: styles$3.activeScreenBorder,
704
967
  style: borderPrimaryColorStyle
705
968
  }) : null)), /*#__PURE__*/React__default["default"].createElement("button", {
706
969
  type: "button",
707
970
  className: styles$3.screenButton,
708
971
  onClick: function onClick() {
709
- onClickItem(index);
972
+ if (onClickItem !== null) {
973
+ onClickItem(item);
974
+ }
710
975
  },
711
976
  "aria-label": screenAriaLabel,
712
977
  onKeyUp: function onKeyUp(e) {
713
- if (e.key === 'Enter') {
714
- onClickItem(index);
978
+ if (e.key === 'Enter' && onClickItem !== null) {
979
+ onClickItem(item);
715
980
  }
716
981
  },
717
982
  tabIndex: focusable ? '0' : '-1'
718
983
  }));
719
- })))))) : null;
720
- }
984
+ }))))));
985
+ };
721
986
 
722
- ViewerMenuPreview.propTypes = propTypes$4;
723
- ViewerMenuPreview.defaultProps = defaultProps$4;
987
+ ViewerMenuPreview.propTypes = propTypes$5;
988
+ ViewerMenuPreview.defaultProps = defaultProps$5;
724
989
 
725
- var styles = {"container":"micromag-viewer-screen-container","current":"micromag-viewer-screen-current"};
990
+ var propTypes$4 = {
991
+ story: core$1.PropTypes.story.isRequired,
992
+ currentScreenIndex: PropTypes__default["default"].number,
993
+ opened: PropTypes__default["default"].bool,
994
+ toggleFullscreen: PropTypes__default["default"].func,
995
+ fullscreenActive: PropTypes__default["default"].bool,
996
+ fullscreenEnabled: PropTypes__default["default"].bool,
997
+ closeable: PropTypes__default["default"].bool,
998
+ withShadow: PropTypes__default["default"].bool,
999
+ trackingEnabled: PropTypes__default["default"].bool,
1000
+ shareBasePath: PropTypes__default["default"].string,
1001
+ theme: core$1.PropTypes.viewerTheme,
1002
+ screenSize: core$1.PropTypes.screenSize,
1003
+ menuWidth: PropTypes__default["default"].number,
1004
+ withDotItemClick: PropTypes__default["default"].bool,
1005
+ withoutScreensMenu: PropTypes__default["default"].bool,
1006
+ onRequestOpen: PropTypes__default["default"].func,
1007
+ onRequestClose: PropTypes__default["default"].func,
1008
+ onClickItem: PropTypes__default["default"].func,
1009
+ onClickMenu: PropTypes__default["default"].func,
1010
+ onClickCloseViewer: PropTypes__default["default"].func,
1011
+ refDots: PropTypes__default["default"].shape({
1012
+ current: PropTypes__default["default"].any // eslint-disable-line
726
1013
 
727
- var propTypes$3 = {
728
- screen: core.PropTypes.screenComponent,
729
- renderContext: core.PropTypes.renderContext,
730
- current: PropTypes__default["default"].bool,
731
- active: PropTypes__default["default"].bool,
732
- onPrevious: PropTypes__default["default"].func,
733
- onNext: PropTypes__default["default"].func,
734
- onEnableInteraction: PropTypes__default["default"].func,
735
- onDisableInteraction: PropTypes__default["default"].func,
736
- getMediaRef: PropTypes__default["default"].func
1014
+ })
737
1015
  };
738
- var defaultProps$3 = {
739
- screen: null,
740
- renderContext: null,
741
- current: false,
742
- active: true,
743
- onPrevious: null,
744
- onNext: null,
745
- onEnableInteraction: null,
746
- onDisableInteraction: null,
747
- getMediaRef: null
1016
+ var defaultProps$4 = {
1017
+ currentScreenIndex: 0,
1018
+ opened: false,
1019
+ toggleFullscreen: null,
1020
+ fullscreenActive: false,
1021
+ fullscreenEnabled: false,
1022
+ closeable: false,
1023
+ withShadow: false,
1024
+ trackingEnabled: false,
1025
+ shareBasePath: null,
1026
+ theme: null,
1027
+ screenSize: null,
1028
+ menuWidth: null,
1029
+ withDotItemClick: false,
1030
+ withoutScreensMenu: false,
1031
+ onRequestOpen: null,
1032
+ onRequestClose: null,
1033
+ onClickItem: null,
1034
+ onClickMenu: null,
1035
+ onClickCloseViewer: null,
1036
+ refDots: null
748
1037
  };
749
1038
 
750
- var ViewerScreen = function ViewerScreen(_ref) {
751
- var _ref2;
752
-
753
- var screen = _ref.screen,
754
- renderContext = _ref.renderContext,
755
- active = _ref.active,
756
- current = _ref.current,
757
- onPrevious = _ref.onPrevious,
758
- onNext = _ref.onNext,
759
- onEnableInteraction = _ref.onEnableInteraction,
760
- onDisableInteraction = _ref.onDisableInteraction,
761
- getMediaRef = _ref.getMediaRef;
762
- return screen !== null ? /*#__PURE__*/React__default["default"].createElement("div", {
763
- className: classNames__default["default"]([styles.container, (_ref2 = {}, _defineProperty__default["default"](_ref2, styles.active, active), _defineProperty__default["default"](_ref2, styles.current, current), _ref2)]),
764
- "aria-hidden": current ? null : 'true'
765
- }, /*#__PURE__*/React__default["default"].createElement(components.Screen, {
1039
+ var ViewerMenu = function ViewerMenu(_ref) {
1040
+ var story = _ref.story,
1041
+ currentScreenIndex = _ref.currentScreenIndex,
1042
+ opened = _ref.opened,
1043
+ toggleFullscreen = _ref.toggleFullscreen,
1044
+ fullscreenActive = _ref.fullscreenActive,
1045
+ fullscreenEnabled = _ref.fullscreenEnabled,
1046
+ closeable = _ref.closeable,
1047
+ withShadow = _ref.withShadow,
1048
+ shareBasePath = _ref.shareBasePath,
1049
+ trackingEnabled = _ref.trackingEnabled,
1050
+ viewerTheme = _ref.theme,
1051
+ screenSize = _ref.screenSize,
1052
+ menuWidth = _ref.menuWidth,
1053
+ withDotItemClick = _ref.withDotItemClick,
1054
+ withoutScreensMenu = _ref.withoutScreensMenu,
1055
+ onRequestOpen = _ref.onRequestOpen,
1056
+ onRequestClose = _ref.onRequestClose,
1057
+ customOnClickItem = _ref.onClickItem,
1058
+ customOnClickMenu = _ref.onClickMenu,
1059
+ onClickCloseViewer = _ref.onClickCloseViewer,
1060
+ refDots = _ref.refDots;
1061
+ var _story$components = story.components,
1062
+ screens = _story$components === void 0 ? [] : _story$components,
1063
+ _story$title = story.title,
1064
+ title = _story$title === void 0 ? null : _story$title;
1065
+ var currentScreen = screens !== null ? screens[currentScreenIndex] || null : null;
1066
+
1067
+ var _ref2 = currentScreen || {},
1068
+ _ref2$id = _ref2.id,
1069
+ screenId = _ref2$id === void 0 ? null : _ref2$id,
1070
+ _ref2$type = _ref2.type,
1071
+ screenType = _ref2$type === void 0 ? null : _ref2$type;
1072
+
1073
+ var items = React.useMemo(function () {
1074
+ return screens.filter(function (_ref3) {
1075
+ var _ref3$parentId = _ref3.parentId,
1076
+ parentId = _ref3$parentId === void 0 ? null : _ref3$parentId;
1077
+ return parentId === null;
1078
+ }).map(function (it) {
1079
+ return {
1080
+ screen: it,
1081
+ screenId: it.id,
1082
+ current: screenId === it.id
1083
+ };
1084
+ });
1085
+ }, [screens, screenId]);
1086
+ var trackEvent = hooks.useTrackEvent();
1087
+ var trackScreenEvent = React.useCallback(function (cat, action, label) {
1088
+ if (trackingEnabled) {
1089
+ trackEvent(cat, action, label, {
1090
+ screenId: screenId,
1091
+ screenIndex: currentScreenIndex,
1092
+ screenType: screenType
1093
+ });
1094
+ }
1095
+ }, [trackEvent, screenId, currentScreenIndex, screenType]);
1096
+ var shareUrl = React.useMemo(function () {
1097
+ var origin = typeof window !== 'undefined' ? window.location.origin.replace(/\/+$/, '') : '';
1098
+ var path = shareBasePath !== null ? "".concat(origin).concat(shareBasePath) : origin;
1099
+ return path;
1100
+ }, [shareBasePath]);
1101
+
1102
+ var _useSpring = core.useSpring(function () {
1103
+ return {
1104
+ y: 0,
1105
+ config: _objectSpread__default["default"](_objectSpread__default["default"]({}, core.config.stiff), {}, {
1106
+ clamp: true
1107
+ })
1108
+ };
1109
+ }),
1110
+ _useSpring2 = _slicedToArray__default["default"](_useSpring, 2),
1111
+ menuY = _useSpring2[0].y,
1112
+ setMenuSpring = _useSpring2[1];
1113
+
1114
+ var refOpened = React.useRef(opened);
1115
+
1116
+ if (refOpened.current !== opened) {
1117
+ refOpened.current = opened;
1118
+ }
1119
+
1120
+ React.useEffect(function () {
1121
+ setMenuSpring.start({
1122
+ y: opened ? 1 : 0
1123
+ });
1124
+ }, [opened]);
1125
+
1126
+ var _useResizeObserver = hooks.useResizeObserver(),
1127
+ menuPreviewContainerRef = _useResizeObserver.ref,
1128
+ menuPreviewContainerRect = _useResizeObserver.entry.contentRect;
1129
+
1130
+ var _ref4 = menuPreviewContainerRect || {},
1131
+ _ref4$height = _ref4.height,
1132
+ menuPreviewContainerHeight = _ref4$height === void 0 ? 0 : _ref4$height;
1133
+
1134
+ var menuPreviewStyle = {
1135
+ transform: menuY.to(function (y) {
1136
+ return "translateY(".concat(y * menuPreviewContainerHeight, "px)");
1137
+ })
1138
+ };
1139
+ var menuDragBind = react.useDrag(function (_ref5) {
1140
+ var _ref5$movement = _slicedToArray__default["default"](_ref5.movement, 2),
1141
+ my = _ref5$movement[1],
1142
+ first = _ref5.first,
1143
+ last = _ref5.last,
1144
+ _ref5$direction = _slicedToArray__default["default"](_ref5.direction, 2),
1145
+ dy = _ref5$direction[1],
1146
+ cancel = _ref5.cancel,
1147
+ canceled = _ref5.canceled,
1148
+ tap = _ref5.tap;
1149
+
1150
+ if (canceled || tap) {
1151
+ return;
1152
+ }
1153
+
1154
+ var isMenuOpened = refOpened.current;
1155
+
1156
+ if (first) {
1157
+ if (isMenuOpened) {
1158
+ cancel();
1159
+ return;
1160
+ }
1161
+ }
1162
+
1163
+ var yProgress = Math.max(0, Math.min(1, my / menuPreviewContainerHeight + (isMenuOpened ? 1 : 0)));
1164
+
1165
+ if (last) {
1166
+ var menuNowOpened = dy > 0 && yProgress > 0.1;
1167
+ refOpened.current = menuNowOpened;
1168
+ setMenuSpring.start({
1169
+ y: menuNowOpened ? 1 : 0
1170
+ });
1171
+
1172
+ if (menuNowOpened && onRequestOpen !== null) {
1173
+ onRequestOpen();
1174
+ } else if (!menuNowOpened && onRequestClose !== null) {
1175
+ onRequestClose();
1176
+ }
1177
+ } else {
1178
+ setMenuSpring.start({
1179
+ y: yProgress
1180
+ });
1181
+ }
1182
+ }, {
1183
+ axis: 'y',
1184
+ filterTaps: true
1185
+ }); // handle preview menu item click
1186
+
1187
+ var onClickMenu = React.useCallback(function (index) {
1188
+ if (customOnClickMenu !== null) {
1189
+ customOnClickMenu(index);
1190
+ }
1191
+
1192
+ trackScreenEvent('viewer_menu', 'click_open', 'Menu icon');
1193
+ }, [customOnClickMenu, trackScreenEvent]);
1194
+ var onClickItem = React.useCallback(function (item) {
1195
+ if (customOnClickItem !== null) {
1196
+ customOnClickItem(item);
1197
+ }
1198
+
1199
+ var index = items.findIndex(function (_ref6) {
1200
+ var id = _ref6.id;
1201
+ return id === screenId;
1202
+ });
1203
+ trackScreenEvent('viewer_menu', 'click_screen_change', "Screen ".concat(index + 1));
1204
+ }, [customOnClickItem, items, screenId, trackScreenEvent]);
1205
+ var onClickClose = React.useCallback(function () {
1206
+ if (onRequestClose !== null) {
1207
+ onRequestClose();
1208
+ }
1209
+
1210
+ trackScreenEvent('viewer_menu', 'click_close', 'Close icon');
1211
+ }, [onRequestClose, trackScreenEvent]); // Handle preview menu share click
1212
+
1213
+ var onClickShare = React.useCallback(function (type) {
1214
+ return trackScreenEvent('viewer_menu', 'click_share', type);
1215
+ }, [trackScreenEvent]);
1216
+
1217
+ var _ref7 = viewerTheme || {},
1218
+ _ref7$menuTheme = _ref7.menuTheme,
1219
+ menuTheme = _ref7$menuTheme === void 0 ? null : _ref7$menuTheme;
1220
+
1221
+ return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
1222
+ className: styles$7.menuDotsContainer,
1223
+ ref: refDots,
1224
+ style: {
1225
+ width: menuWidth
1226
+ }
1227
+ }, menuDragBind()), /*#__PURE__*/React__default["default"].createElement(ViewerMenuDots, Object.assign({}, menuTheme, {
1228
+ direction: "horizontal",
1229
+ withShadow: withShadow,
1230
+ items: items,
1231
+ onClickItem: onClickItem,
1232
+ onClickMenu: onClickMenu,
1233
+ closeable: closeable,
1234
+ withItemClick: withDotItemClick,
1235
+ withoutScreensMenu: withoutScreensMenu,
1236
+ onClose: onClickCloseViewer,
1237
+ className: styles$7.menuDots
1238
+ }))), /*#__PURE__*/React__default["default"].createElement(web.animated.div, {
1239
+ className: styles$7.menuPreviewContainer,
1240
+ style: menuPreviewStyle,
1241
+ ref: menuPreviewContainerRef
1242
+ }, /*#__PURE__*/React__default["default"].createElement(ViewerMenuPreview, {
1243
+ viewerTheme: viewerTheme,
1244
+ title: title,
1245
+ shareUrl: shareUrl,
1246
+ className: styles$7.menuPreview,
1247
+ screenSize: screenSize,
1248
+ menuWidth: menuWidth,
1249
+ focusable: opened,
1250
+ items: items,
1251
+ onClickItem: onClickItem,
1252
+ onClose: onClickClose,
1253
+ onShare: onClickShare,
1254
+ toggleFullscreen: toggleFullscreen,
1255
+ fullscreenActive: fullscreenActive,
1256
+ fullscreenEnabled: fullscreenEnabled
1257
+ })));
1258
+ };
1259
+
1260
+ ViewerMenu.propTypes = propTypes$4;
1261
+ ViewerMenu.defaultProps = defaultProps$4;
1262
+
1263
+ var styles = {"container":"micromag-viewer-screen-container","current":"micromag-viewer-screen-current"};
1264
+
1265
+ var propTypes$3 = {
1266
+ screen: core$1.PropTypes.screenComponent,
1267
+ renderContext: core$1.PropTypes.renderContext,
1268
+ screenState: PropTypes__default["default"].string,
1269
+ current: PropTypes__default["default"].bool,
1270
+ active: PropTypes__default["default"].bool,
1271
+ onPrevious: PropTypes__default["default"].func,
1272
+ onNext: PropTypes__default["default"].func,
1273
+ onEnableInteraction: PropTypes__default["default"].func,
1274
+ onDisableInteraction: PropTypes__default["default"].func,
1275
+ getMediaRef: PropTypes__default["default"].func
1276
+ };
1277
+ var defaultProps$3 = {
1278
+ screen: null,
1279
+ renderContext: null,
1280
+ screenState: null,
1281
+ current: false,
1282
+ active: true,
1283
+ onPrevious: null,
1284
+ onNext: null,
1285
+ onEnableInteraction: null,
1286
+ onDisableInteraction: null,
1287
+ getMediaRef: null
1288
+ };
1289
+
1290
+ var ViewerScreen = function ViewerScreen(_ref) {
1291
+ var _ref2;
1292
+
1293
+ var screen = _ref.screen,
1294
+ renderContext = _ref.renderContext,
1295
+ screenState = _ref.screenState,
1296
+ active = _ref.active,
1297
+ current = _ref.current,
1298
+ onPrevious = _ref.onPrevious,
1299
+ onNext = _ref.onNext,
1300
+ onEnableInteraction = _ref.onEnableInteraction,
1301
+ onDisableInteraction = _ref.onDisableInteraction,
1302
+ getMediaRef = _ref.getMediaRef;
1303
+ return screen !== null ? /*#__PURE__*/React__default["default"].createElement("div", {
1304
+ className: classNames__default["default"]([styles.container, (_ref2 = {}, _defineProperty__default["default"](_ref2, styles.active, active), _defineProperty__default["default"](_ref2, styles.current, current), _ref2)]),
1305
+ "aria-hidden": current ? null : 'true'
1306
+ }, /*#__PURE__*/React__default["default"].createElement(components.Screen, {
766
1307
  screen: screen,
767
1308
  renderContext: renderContext,
1309
+ screenState: screenState,
768
1310
  active: active,
769
1311
  current: current,
770
1312
  onPrevious: onPrevious,
@@ -779,15 +1321,16 @@ ViewerScreen.propTypes = propTypes$3;
779
1321
  ViewerScreen.defaultProps = defaultProps$3;
780
1322
 
781
1323
  var propTypes$2 = {
782
- story: core.PropTypes.story,
1324
+ story: core$1.PropTypes.story,
783
1325
  // .isRequired,
784
1326
  basePath: PropTypes__default["default"].string,
785
- theme: core.PropTypes.viewerTheme,
1327
+ theme: core$1.PropTypes.viewerTheme,
786
1328
  width: PropTypes__default["default"].number,
787
1329
  height: PropTypes__default["default"].number,
788
1330
  screen: PropTypes__default["default"].string,
789
- deviceScreens: core.PropTypes.deviceScreens,
790
- renderContext: core.PropTypes.renderContext,
1331
+ screenState: PropTypes__default["default"].string,
1332
+ deviceScreens: core$1.PropTypes.deviceScreens,
1333
+ renderContext: core$1.PropTypes.renderContext,
791
1334
  onScreenChange: PropTypes__default["default"].func,
792
1335
  tapNextScreenWidthPercent: PropTypes__default["default"].number,
793
1336
  neighborScreensActive: PropTypes__default["default"].number,
@@ -795,14 +1338,16 @@ var propTypes$2 = {
795
1338
  landscapeScreenMargin: PropTypes__default["default"].number,
796
1339
  withMetadata: PropTypes__default["default"].bool,
797
1340
  withoutMenu: PropTypes__default["default"].bool,
1341
+ withoutScreensMenu: PropTypes__default["default"].bool,
798
1342
  withoutFullscreen: PropTypes__default["default"].bool,
1343
+ withLandscapeSiblingsScreens: PropTypes__default["default"].bool,
799
1344
  closeable: PropTypes__default["default"].bool,
800
1345
  onClose: PropTypes__default["default"].func,
801
1346
  onInteraction: PropTypes__default["default"].func,
802
1347
  onEnd: PropTypes__default["default"].func,
803
1348
  onViewModeChange: PropTypes__default["default"].func,
804
- currentScreenMedia: core.PropTypes.ref,
805
- screensMedias: core.PropTypes.ref,
1349
+ currentScreenMedia: core$1.PropTypes.ref,
1350
+ screensMedias: core$1.PropTypes.ref,
806
1351
  screenSizeOptions: PropTypes__default["default"].shape({
807
1352
  withoutMaxSize: PropTypes__default["default"].bool,
808
1353
  desktopHeightRatio: PropTypes__default["default"].number,
@@ -817,16 +1362,19 @@ var defaultProps$2 = {
817
1362
  width: null,
818
1363
  height: null,
819
1364
  screen: null,
1365
+ screenState: null,
820
1366
  deviceScreens: utils.getDeviceScreens(),
821
1367
  renderContext: 'view',
822
1368
  onScreenChange: null,
823
- tapNextScreenWidthPercent: 0.5,
1369
+ tapNextScreenWidthPercent: 0.8,
824
1370
  neighborScreensActive: 2,
825
1371
  storyIsParsed: false,
826
- landscapeScreenMargin: 50,
1372
+ landscapeScreenMargin: 20,
827
1373
  withMetadata: false,
828
1374
  withoutMenu: false,
1375
+ withoutScreensMenu: false,
829
1376
  withoutFullscreen: false,
1377
+ withLandscapeSiblingsScreens: false,
830
1378
  closeable: false,
831
1379
  onClose: null,
832
1380
  onInteraction: null,
@@ -838,8 +1386,8 @@ var defaultProps$2 = {
838
1386
  className: null
839
1387
  };
840
1388
 
841
- function Viewer(_ref) {
842
- var _ref15;
1389
+ var Viewer = function Viewer(_ref) {
1390
+ var _ref12;
843
1391
 
844
1392
  var story = _ref.story,
845
1393
  basePath = _ref.basePath,
@@ -847,6 +1395,7 @@ function Viewer(_ref) {
847
1395
  width = _ref.width,
848
1396
  height = _ref.height,
849
1397
  screenId = _ref.screen,
1398
+ screenState = _ref.screenState,
850
1399
  deviceScreens = _ref.deviceScreens,
851
1400
  renderContext = _ref.renderContext,
852
1401
  onScreenChange = _ref.onScreenChange,
@@ -855,10 +1404,12 @@ function Viewer(_ref) {
855
1404
  storyIsParsed = _ref.storyIsParsed,
856
1405
  landscapeScreenMargin = _ref.landscapeScreenMargin,
857
1406
  withMetadata = _ref.withMetadata,
858
- withoutMenu = _ref.withoutMenu;
1407
+ withoutMenu = _ref.withoutMenu,
1408
+ withoutScreensMenu = _ref.withoutScreensMenu;
859
1409
  _ref.withoutFullscreen;
860
- var closeable = _ref.closeable,
861
- onClose = _ref.onClose,
1410
+ var withLandscapeSiblingsScreens = _ref.withLandscapeSiblingsScreens,
1411
+ closeable = _ref.closeable,
1412
+ onCloseViewer = _ref.onClose,
862
1413
  onInteraction = _ref.onInteraction,
863
1414
  onEnd = _ref.onEnd,
864
1415
  onViewModeChange = _ref.onViewModeChange,
@@ -877,7 +1428,10 @@ function Viewer(_ref) {
877
1428
  _parsedStory$metadata = parsedStory.metadata,
878
1429
  metadata = _parsedStory$metadata === void 0 ? null : _parsedStory$metadata,
879
1430
  _parsedStory$fonts = parsedStory.fonts,
880
- fonts = _parsedStory$fonts === void 0 ? null : _parsedStory$fonts; // Viewer Theme
1431
+ fonts = _parsedStory$fonts === void 0 ? null : _parsedStory$fonts;
1432
+ var eventsManager = React.useMemo(function () {
1433
+ return new EventEmitter__default["default"]();
1434
+ }, [parsedStory]); // Viewer Theme
881
1435
 
882
1436
  var _ref2 = viewerTheme || {},
883
1437
  textStyles = _ref2.textStyles;
@@ -901,17 +1455,11 @@ function Viewer(_ref) {
901
1455
  _useLoadedFonts.loaded; // eslint-disable-line
902
1456
 
903
1457
 
904
- var shareUrl = React.useMemo(function () {
905
- var origin = typeof window !== 'undefined' ? window.location.origin.replace(/\/+$/, '') : '';
906
- var path = basePath !== null ? "".concat(origin).concat(basePath) : origin;
907
- return path;
908
- }, [basePath]);
909
1458
  var isView = renderContext === 'view';
910
1459
  var isStatic = renderContext === 'static';
911
1460
  var isCapture = renderContext === 'capture';
912
1461
  var withoutScreensTransforms = isStatic || isCapture;
913
1462
  var trackScreenView = hooks.useTrackScreenView();
914
- var trackEvent = hooks.useTrackEvent();
915
1463
  var contentRef = React.useRef(null); // Get screen size
916
1464
 
917
1465
  var _useScreenSizeFromEle = hooks.useScreenSizeFromElement(_objectSpread__default["default"]({
@@ -941,30 +1489,12 @@ function Viewer(_ref) {
941
1489
  landscape: landscape
942
1490
  });
943
1491
  }
944
- }, [ready, landscape, onViewModeChange]); // Get dots menu height
945
-
946
- var _useResizeObserver = hooks.useResizeObserver(),
947
- menuDotsContainerRef = _useResizeObserver.ref,
948
- menuDotsContainerRect = _useResizeObserver.entry.contentRect;
949
-
950
- var _ref6 = menuDotsContainerRect || {},
951
- _ref6$height = _ref6.height,
952
- menuDotsContainerHeight = _ref6$height === void 0 ? 0 : _ref6$height; // Get preview menu height
953
-
954
-
955
- var _useResizeObserver2 = hooks.useResizeObserver(),
956
- menuPreviewContainerRef = _useResizeObserver2.ref,
957
- menuPreviewContainerRect = _useResizeObserver2.entry.contentRect;
958
-
959
- var _ref7 = menuPreviewContainerRect || {},
960
- _ref7$height = _ref7.height,
961
- menuPreviewContainerHeight = _ref7$height === void 0 ? 0 : _ref7$height;
962
-
1492
+ }, [ready, landscape, onViewModeChange]);
963
1493
  var screensMediasRef = React.useRef([]); // Screen index
964
1494
 
965
1495
  var screenIndex = React.useMemo(function () {
966
1496
  return Math.max(0, screens.findIndex(function (it) {
967
- return String(it.id) === String(screenId);
1497
+ return "".concat(it.id) === "".concat(screenId);
968
1498
  }));
969
1499
  }, [screenId, screens]);
970
1500
 
@@ -991,13 +1521,7 @@ function Viewer(_ref) {
991
1521
  }, [screenIndex, screens, onScreenChange]); // Track screen view
992
1522
 
993
1523
  var trackingEnabled = isView;
994
- var validIndex = screens.length > 0 && screenIndex < screens.length;
995
- var currentScreen = validIndex ? screens[screenIndex] : null;
996
-
997
- var _ref8 = currentScreen || {},
998
- _ref8$type = _ref8.type,
999
- screenType = _ref8$type === void 0 ? null : _ref8$type;
1000
-
1524
+ var currentScreen = screens[screenIndex] || null;
1001
1525
  React.useEffect(function () {
1002
1526
  if (trackingEnabled && currentScreen !== null) {
1003
1527
  trackScreenView(currentScreen, screenIndex);
@@ -1005,256 +1529,69 @@ function Viewer(_ref) {
1005
1529
  }, [currentScreen, trackScreenView, trackingEnabled]); // Handle interaction enable
1006
1530
 
1007
1531
  var currentScreenRef = React.useRef(null);
1008
- var onScreenPrevious = React.useCallback(function () {
1532
+ var gotoPreviousScreen = React.useCallback(function () {
1009
1533
  changeIndex(Math.max(0, screenIndex - 1));
1010
1534
  currentScreenRef.current.focus();
1011
1535
  }, [changeIndex]);
1012
- var onScreenNext = React.useCallback(function () {
1536
+ var gotoNextScreen = React.useCallback(function () {
1013
1537
  changeIndex(Math.min(screens.length - 1, screenIndex + 1));
1014
1538
  currentScreenRef.current.focus();
1015
1539
  }, [changeIndex]);
1016
1540
  var screensCount = screens.length;
1017
-
1018
- var _useState = React.useState(screens.map(function () {
1019
- return true;
1020
- })),
1021
- _useState2 = _slicedToArray__default["default"](_useState, 2),
1022
- screensInteractionEnabled = _useState2[0],
1023
- setScreensInteractionEnabled = _useState2[1];
1024
-
1025
- var currentScreenInteractionEnabled = screensInteractionEnabled[screenIndex];
1026
- var menuVisible = screensCount === 0 || currentScreenInteractionEnabled;
1027
- React.useEffect(function () {
1028
- setScreensInteractionEnabled(_toConsumableArray__default["default"](Array(screensCount).keys()).map(function () {
1029
- return true;
1030
- }));
1031
- }, [screensCount]);
1032
- var onEnableInteraction = React.useCallback(function () {
1033
- if (!screensInteractionEnabled[screenIndex]) {
1034
- var newArray = _toConsumableArray__default["default"](screensInteractionEnabled);
1035
-
1036
- newArray[screenIndex] = true;
1037
- setScreensInteractionEnabled(newArray);
1038
- }
1039
- }, [screenIndex, screensInteractionEnabled, setScreensInteractionEnabled]);
1040
- var onDisableInteraction = React.useCallback(function () {
1041
- if (screensInteractionEnabled[screenIndex]) {
1042
- var newArray = _toConsumableArray__default["default"](screensInteractionEnabled);
1043
-
1044
- newArray[screenIndex] = false;
1045
- setScreensInteractionEnabled(newArray);
1046
- }
1047
- }, [screenIndex, screensInteractionEnabled, setScreensInteractionEnabled]); // handle screenClick
1048
-
1049
1541
  var onInteractionPrivate = React.useCallback(function () {
1050
1542
  if (onInteraction !== null) {
1051
1543
  onInteraction();
1052
1544
  }
1053
1545
  }, [onInteraction]);
1054
- var onScreenClick = React.useCallback(function (e, index) {
1055
- onInteractionPrivate();
1056
-
1057
- var checkClickable = function checkClickable(el) {
1058
- var maxDistance = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 5;
1059
- var distance = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
1060
-
1061
- var _ref9 = el || {},
1062
- _ref9$tagName = _ref9.tagName,
1063
- tagName = _ref9$tagName === void 0 ? null : _ref9$tagName,
1064
- _ref9$parentNode = _ref9.parentNode,
1065
- parentNode = _ref9$parentNode === void 0 ? null : _ref9$parentNode;
1066
-
1067
- if (tagName === 'BODY') {
1068
- return false;
1069
- }
1070
-
1071
- var tags = ['BUTTON', 'A', 'INPUT', 'TEXTAREA'];
1072
-
1073
- if (tags.indexOf(tagName) > -1) {
1074
- return true;
1075
- }
1076
-
1077
- if (distance < maxDistance) {
1078
- return checkClickable(parentNode, maxDistance, distance + 1);
1079
- }
1080
-
1081
- return false;
1082
- };
1083
-
1084
- var tappedCurrent = screenIndex === index;
1085
-
1086
- if (!isView && tappedCurrent || checkClickable(e.target)) {
1087
- return;
1088
- }
1089
-
1090
- var it = screens[screenIndex] || null;
1091
- var interactionEnabled = screensInteractionEnabled[screenIndex];
1092
-
1093
- if (it === null || tappedCurrent && !interactionEnabled) {
1094
- return;
1095
- }
1096
-
1097
- var nextIndex = screenIndex;
1098
-
1099
- var _e$currentTarget$getB = e.currentTarget.getBoundingClientRect(),
1100
- _e$currentTarget$getB2 = _e$currentTarget$getB.left,
1101
- contentX = _e$currentTarget$getB2 === void 0 ? 0 : _e$currentTarget$getB2;
1102
-
1103
- var tapX = e.clientX;
1104
- var hasTappedLeft = tappedCurrent ? tapX - contentX < screenWidth * (1 - tapNextScreenWidthPercent) : screenIndex > index;
1105
-
1106
- if (hasTappedLeft) {
1107
- nextIndex = landscape ? index : Math.max(0, screenIndex - 1);
1108
- } else {
1109
- nextIndex = landscape ? index : Math.min(screens.length - 1, screenIndex + 1);
1110
- var isLastScreen = screenIndex === screens.length - 1;
1111
-
1112
- if (isLastScreen && onEnd !== null) {
1113
- onEnd();
1114
- }
1115
- }
1116
-
1117
- changeIndex(nextIndex);
1118
- }, [onScreenChange, screenWidth, screens, changeIndex, screenIndex, screensInteractionEnabled, isView, onInteractionPrivate, onEnd]); // swipe menu open
1119
1546
 
1120
- var menuOpened = React.useRef(false);
1121
-
1122
- var _useState3 = React.useState(false),
1123
- _useState4 = _slicedToArray__default["default"](_useState3, 2),
1124
- previewMenuOpen = _useState4[0],
1125
- setPreviewMenuOpen = _useState4[1];
1126
-
1127
- var _useSpring = core$1.useSpring(function () {
1128
- return {
1129
- y: 0,
1130
- config: _objectSpread__default["default"](_objectSpread__default["default"]({}, core$1.config.stiff), {}, {
1131
- clamp: true
1132
- })
1133
- };
1547
+ var _useScreenInteraction = useScreenInteraction({
1548
+ screens: screens,
1549
+ screenId: screenId,
1550
+ screenWidth: screenWidth,
1551
+ isView: isView,
1552
+ clickOnSiblings: landscape && withLandscapeSiblingsScreens,
1553
+ nextScreenWidthPercent: tapNextScreenWidthPercent,
1554
+ events: eventsManager,
1555
+ onClick: onInteractionPrivate,
1556
+ onEnd: onEnd,
1557
+ onChangeScreen: changeIndex
1134
1558
  }),
1135
- _useSpring2 = _slicedToArray__default["default"](_useSpring, 2),
1136
- menuY = _useSpring2[0].y,
1137
- setMenuSpring = _useSpring2[1];
1559
+ onScreenClick = _useScreenInteraction.onClick,
1560
+ currentScreenInteractionEnabled = _useScreenInteraction.currentScreenInteractionEnabled,
1561
+ enableInteraction = _useScreenInteraction.enableInteraction,
1562
+ disableInteraction = _useScreenInteraction.disableInteraction; // swipe menu open
1138
1563
 
1139
- var menuPreviewStyle = {
1140
- transform: menuY.to(function (y) {
1141
- return "translateY(".concat(y * menuPreviewContainerHeight, "px)");
1142
- })
1143
- };
1144
- var menuDragBind = react.useDrag(function (_ref10) {
1145
- var _ref10$movement = _slicedToArray__default["default"](_ref10.movement, 2),
1146
- my = _ref10$movement[1],
1147
- first = _ref10.first,
1148
- last = _ref10.last,
1149
- _ref10$direction = _slicedToArray__default["default"](_ref10.direction, 2),
1150
- dy = _ref10$direction[1],
1151
- cancel = _ref10.cancel,
1152
- canceled = _ref10.canceled,
1153
- tap = _ref10.tap;
1154
-
1155
- if (canceled || tap) {
1156
- return;
1157
- }
1158
1564
 
1159
- var isMenuOpened = menuOpened.current;
1160
-
1161
- if (first) {
1162
- if (isMenuOpened) {
1163
- cancel();
1164
- return;
1165
- }
1166
- }
1167
-
1168
- var yProgress = Math.max(0, Math.min(1, my / menuPreviewContainerHeight + (isMenuOpened ? 1 : 0)));
1169
-
1170
- if (last) {
1171
- var menuNowOpened = dy > 0 && yProgress > 0.1;
1172
- menuOpened.current = menuNowOpened;
1173
- setMenuSpring.start({
1174
- y: menuNowOpened ? 1 : 0
1175
- });
1176
- setPreviewMenuOpen(menuNowOpened);
1177
- } else {
1178
- setMenuSpring.start({
1179
- y: yProgress
1180
- });
1181
- }
1182
- }, {
1183
- axis: 'y',
1184
- filterTaps: true
1185
- });
1186
-
1187
- var setPreviewMenu = function setPreviewMenu(opened) {
1188
- setMenuSpring.start({
1189
- y: opened ? 1 : 0
1190
- });
1191
- menuOpened.current = opened;
1192
- setPreviewMenuOpen(opened);
1193
- };
1194
-
1195
- var openPreviewMenu = React.useCallback(function () {
1196
- setPreviewMenu(true);
1197
- }, [setMenuSpring, setPreviewMenuOpen]);
1198
- var closePreviewMenu = React.useCallback(function () {
1199
- setPreviewMenu(false);
1200
- }, [setMenuSpring, setPreviewMenuOpen]); // Handle dot menu item click
1565
+ var menuVisible = screensCount === 0 || currentScreenInteractionEnabled;
1201
1566
 
1202
- var onClickDotsMenuItem = React.useCallback(function (index) {
1567
+ var _useState = React.useState(false),
1568
+ _useState2 = _slicedToArray__default["default"](_useState, 2),
1569
+ menuOpened = _useState2[0],
1570
+ setMenuOpened = _useState2[1];
1571
+
1572
+ var onMenuRequestOpen = React.useCallback(function () {
1573
+ return setMenuOpened(true);
1574
+ }, [setMenuOpened]);
1575
+ var onMenuRequestClose = React.useCallback(function () {
1576
+ return setMenuOpened(false);
1577
+ }, [setMenuOpened]);
1578
+ var onClickMenu = React.useCallback(function () {
1203
1579
  onInteractionPrivate();
1204
- var clickedOnDot = index !== null;
1205
- var goToScreen = landscape && clickedOnDot;
1206
-
1207
- if (goToScreen) {
1208
- changeIndex(index);
1209
- } else {
1210
- openPreviewMenu();
1211
- }
1212
-
1213
- if (trackingEnabled) {
1214
- var trackAction = goToScreen ? 'click_screen_change' : 'click_open';
1215
- var trackLabel = clickedOnDot ? "Screen ".concat(index + 1) : 'Menu icon';
1216
- trackEvent('viewer_menu', trackAction, trackLabel, {
1217
- screenId: screenId,
1218
- screenType: screenType,
1219
- screenIndex: index
1220
- });
1221
- }
1222
- }, [changeIndex, landscape, trackingEnabled, trackEvent, screenType, onInteractionPrivate]); // handle preview menu item click
1223
-
1224
- var onClickPreviewMenuItem = React.useCallback(function (index) {
1580
+ setMenuOpened(true);
1581
+ }, [changeIndex, onInteractionPrivate, setMenuOpened]);
1582
+ var onClickMenuItem = React.useCallback(function (_ref6) {
1583
+ var itemScreenId = _ref6.screenId;
1584
+ onInteractionPrivate();
1585
+ var index = screens.findIndex(function (_ref7) {
1586
+ var id = _ref7.id;
1587
+ return id === itemScreenId;
1588
+ });
1225
1589
  changeIndex(index);
1226
- closePreviewMenu();
1227
-
1228
- if (trackingEnabled) {
1229
- trackEvent('viewer_menu', 'click_screen_change', "Screen ".concat(index + 1), {
1230
- screenId: screenId,
1231
- screenType: screenType,
1232
- screenIndex: index
1233
- });
1234
- }
1235
- }, [changeIndex, trackingEnabled, trackEvent, screenId, screenType]); // Handle preview menu close click
1236
-
1237
- var onClickPreviewMenuClose = React.useCallback(function () {
1238
- closePreviewMenu();
1239
-
1240
- if (trackingEnabled) {
1241
- trackEvent('viewer_menu', 'click_close', 'Close icon', {
1242
- screenId: screenId,
1243
- screenIndex: screenIndex,
1244
- screenType: screenType
1245
- });
1246
- }
1247
- }, [closePreviewMenu, trackingEnabled, trackEvent, screenId, screenIndex, screenType]); // Handle preview menu share click
1248
1590
 
1249
- var onClickShare = React.useCallback(function (type) {
1250
- if (trackingEnabled) {
1251
- trackEvent('viewer_menu', 'click_share', type, {
1252
- screenId: screenId,
1253
- screenIndex: screenIndex,
1254
- screenType: screenType
1255
- });
1591
+ if (menuOpened) {
1592
+ setMenuOpened(false);
1256
1593
  }
1257
- }, [trackingEnabled, trackEvent, screenId, screenIndex, screenType]);
1594
+ }, [onInteractionPrivate, changeIndex, menuOpened, setMenuOpened]);
1258
1595
  var onContextMenu = React.useCallback(function (e) {
1259
1596
  if (!landscape) {
1260
1597
  e.preventDefault();
@@ -1273,62 +1610,43 @@ function Viewer(_ref) {
1273
1610
  fullscreenEnabled = _useFullscreen.enabled; // Keyboard Events
1274
1611
 
1275
1612
 
1276
- React.useEffect(function () {
1277
- var onKey = function onKey(e) {
1278
- if (['input', 'textarea'].reduce(function (foundMatch, match) {
1279
- return foundMatch || e.target.matches(match);
1280
- }, false)) {
1281
- return;
1282
- }
1283
-
1284
- var key = e.key;
1285
- var lowercaseKey = key.toLowerCase();
1286
-
1287
- switch (lowercaseKey) {
1288
- case 'f':
1289
- toggleFullscreen();
1290
- break;
1291
-
1292
- case 'm':
1293
- setPreviewMenu(!menuOpened.current);
1294
- break;
1295
-
1296
- case 'escape':
1297
- closePreviewMenu();
1298
- break;
1299
-
1300
- case 'arrowleft':
1301
- onScreenPrevious();
1302
- break;
1303
-
1304
- case 'arrowright':
1305
- case ' ':
1306
- // spacebar
1307
- onScreenNext();
1308
- break;
1613
+ var keyboardShortcuts = React.useMemo(function () {
1614
+ return {
1615
+ f: function f() {
1616
+ return toggleFullscreen();
1617
+ },
1618
+ m: function m() {
1619
+ return setMenuOpened(!menuOpened);
1620
+ },
1621
+ escape: function escape() {
1622
+ return setMenuOpened(false);
1623
+ },
1624
+ arrowleft: function arrowleft() {
1625
+ return gotoPreviousScreen();
1626
+ },
1627
+ arrowright: function arrowright() {
1628
+ return gotoNextScreen();
1629
+ },
1630
+ ' ': function _() {
1631
+ return gotoNextScreen();
1309
1632
  }
1310
1633
  };
1634
+ }, [menuOpened, setMenuOpened, gotoPreviousScreen, gotoNextScreen]);
1635
+ useKeyboardShortcuts(keyboardShortcuts, {
1636
+ disabled: renderContext !== 'view'
1637
+ });
1311
1638
 
1312
- if (renderContext === 'view') {
1313
- window.addEventListener('keydown', onKey);
1314
- }
1315
-
1316
- return function () {
1317
- window.removeEventListener('keydown', onKey);
1318
- };
1319
- }, [renderContext, closePreviewMenu, onScreenPrevious, onScreenNext]);
1320
-
1321
- var _ref11 = currentScreen || {},
1322
- screenParameters = _ref11.parameters;
1639
+ var _ref8 = currentScreen || {},
1640
+ screenParameters = _ref8.parameters;
1323
1641
 
1324
- var _ref12 = screenParameters || {},
1325
- screenMetadata = _ref12.metadata;
1642
+ var _ref9 = screenParameters || {},
1643
+ screenMetadata = _ref9.metadata;
1326
1644
 
1327
- var _ref13 = screenMetadata || {},
1328
- _ref13$title = _ref13.title,
1329
- screenTitle = _ref13$title === void 0 ? null : _ref13$title,
1330
- _ref13$description = _ref13.description,
1331
- screenDescription = _ref13$description === void 0 ? null : _ref13$description;
1645
+ var _ref10 = screenMetadata || {},
1646
+ _ref10$title = _ref10.title,
1647
+ screenTitle = _ref10$title === void 0 ? null : _ref10$title,
1648
+ _ref10$description = _ref10.description,
1649
+ screenDescription = _ref10$description === void 0 ? null : _ref10$description;
1332
1650
 
1333
1651
  var finalTitle = screenTitle !== null ? screenTitle : title;
1334
1652
  var finalMetadata = React.useMemo(function () {
@@ -1337,88 +1655,94 @@ function Viewer(_ref) {
1337
1655
  }) : metadata;
1338
1656
  }, [metadata]);
1339
1657
 
1340
- var _ref14 = viewerTheme || {},
1341
- _ref14$menuTheme = _ref14.menuTheme,
1342
- menuTheme = _ref14$menuTheme === void 0 ? null : _ref14$menuTheme;
1658
+ var _useResizeObserver = hooks.useResizeObserver(),
1659
+ menuDotsContainerRef = _useResizeObserver.ref,
1660
+ menuDotsContainerRect = _useResizeObserver.entry.contentRect;
1661
+
1662
+ var _ref11 = menuDotsContainerRect || {},
1663
+ _ref11$height = _ref11.height,
1664
+ menuDotsContainerHeight = _ref11$height === void 0 ? 0 : _ref11$height;
1343
1665
 
1344
1666
  return /*#__PURE__*/React__default["default"].createElement(contexts.ScreenSizeProvider, {
1345
1667
  size: screenSize
1346
1668
  }, /*#__PURE__*/React__default["default"].createElement(contexts.ViewerProvider, {
1669
+ events: eventsManager,
1347
1670
  menuVisible: menuVisible,
1348
- menuSize: menuDotsContainerHeight
1671
+ menuSize: menuDotsContainerHeight,
1672
+ gotoPreviousScreen: gotoPreviousScreen,
1673
+ gotoNextScreen: gotoNextScreen,
1674
+ disableInteraction: disableInteraction,
1675
+ enableInteraction: enableInteraction
1349
1676
  }, withMetadata ? /*#__PURE__*/React__default["default"].createElement(components.Meta, {
1350
1677
  title: finalTitle,
1351
1678
  metadata: finalMetadata
1352
1679
  }, overscrollStyle) : /*#__PURE__*/React__default["default"].createElement(reactHelmet.Helmet, null, overscrollStyle), /*#__PURE__*/React__default["default"].createElement(components.FontFaces, {
1353
1680
  fonts: finalFonts
1354
1681
  }), /*#__PURE__*/React__default["default"].createElement("div", {
1355
- className: classNames__default["default"]([styles$6.container, screenSize.screens.map(function (screenName) {
1682
+ className: classNames__default["default"]([styles$7.container, screenSize.screens.map(function (screenName) {
1356
1683
  return "story-screen-".concat(screenName);
1357
- }), (_ref15 = {}, _defineProperty__default["default"](_ref15, styles$6.landscape, landscape), _defineProperty__default["default"](_ref15, styles$6.hideMenu, !menuVisible), _defineProperty__default["default"](_ref15, styles$6.ready, ready || withoutScreensTransforms), _defineProperty__default["default"](_ref15, className, className), _ref15)]),
1684
+ }), (_ref12 = {}, _defineProperty__default["default"](_ref12, styles$7.landscape, landscape), _defineProperty__default["default"](_ref12, styles$7.withSibblings, withLandscapeSiblingsScreens), _defineProperty__default["default"](_ref12, styles$7.hideMenu, !menuVisible), _defineProperty__default["default"](_ref12, styles$7.ready, ready || withoutScreensTransforms), _defineProperty__default["default"](_ref12, className, className), _ref12)]),
1358
1685
  ref: containerRef,
1359
1686
  onContextMenu: onContextMenu
1360
- }, !withoutMenu ? /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
1361
- className: styles$6.menuDotsContainer,
1362
- ref: menuDotsContainerRef,
1363
- style: {
1364
- width: screenWidth
1365
- }
1366
- }, menuDragBind()), /*#__PURE__*/React__default["default"].createElement(ViewerMenuDots, Object.assign({}, menuTheme, {
1367
- direction: "horizontal",
1687
+ }, !withoutMenu ? /*#__PURE__*/React__default["default"].createElement(ViewerMenu, {
1688
+ story: parsedStory,
1689
+ currentScreenIndex: screenIndex,
1690
+ opened: menuOpened,
1368
1691
  withShadow: menuOverScreen,
1369
- items: screens,
1370
- current: screenIndex,
1371
- onClickItem: onClickDotsMenuItem,
1372
- closeable: closeable,
1373
- onClose: onClose,
1374
- className: styles$6.menuDots
1375
- }))), /*#__PURE__*/React__default["default"].createElement(web.animated.div, {
1376
- className: styles$6.menuPreviewContainer,
1377
- style: menuPreviewStyle,
1378
- ref: menuPreviewContainerRef
1379
- }, /*#__PURE__*/React__default["default"].createElement(ViewerMenuPreview, {
1380
- viewerTheme: viewerTheme,
1381
- title: title,
1382
- shareUrl: shareUrl,
1383
- className: styles$6.menuPreview,
1384
- screenWidth: screenWidth,
1385
- focusable: previewMenuOpen,
1386
- items: screens,
1387
- current: screenIndex,
1388
- onClickItem: onClickPreviewMenuItem,
1389
- onClose: onClickPreviewMenuClose,
1390
- onShare: onClickShare,
1391
1692
  toggleFullscreen: toggleFullscreen,
1392
1693
  fullscreenActive: fullscreenActive,
1393
- fullscreenEnabled: fullscreenEnabled
1394
- }))) : null, ready || withoutScreensTransforms ? /*#__PURE__*/React__default["default"].createElement("div", {
1694
+ fullscreenEnabled: fullscreenEnabled,
1695
+ closeable: closeable,
1696
+ shareBasePath: basePath,
1697
+ screenSize: screenSize,
1698
+ menuWidth: screenWidth,
1699
+ trackingEnabled: trackingEnabled,
1700
+ onClickItem: onClickMenuItem,
1701
+ onClickMenu: onClickMenu,
1702
+ onClickCloseViewer: onCloseViewer,
1703
+ onRequestOpen: onMenuRequestOpen,
1704
+ onRequestClose: onMenuRequestClose,
1705
+ withDotItemClick: screenWidth > 400,
1706
+ withoutScreensMenu: withoutScreensMenu,
1707
+ refDots: menuDotsContainerRef
1708
+ }) : null, ready || withoutScreensTransforms ? /*#__PURE__*/React__default["default"].createElement("div", {
1395
1709
  ref: contentRef,
1396
- className: styles$6.content
1710
+ className: styles$7.content
1397
1711
  }, screens.map(function (scr, i) {
1712
+ var _ref13;
1713
+
1398
1714
  var current = i === screenIndex;
1399
1715
  var active = i > screenIndex - neighborScreensActive && i < screenIndex + neighborScreensActive;
1400
1716
  var viewerScreen = /*#__PURE__*/React__default["default"].createElement(ViewerScreen, {
1401
1717
  screen: scr,
1718
+ screenState: current ? screenState : null,
1402
1719
  renderContext: renderContext,
1403
1720
  index: i,
1404
1721
  current: current,
1405
1722
  active: active,
1406
- onPrevious: onScreenPrevious,
1407
- onNext: onScreenNext,
1408
- onEnableInteraction: onEnableInteraction,
1409
- onDisableInteraction: onDisableInteraction,
1723
+ onPrevious: gotoPreviousScreen,
1724
+ onNext: gotoNextScreen,
1725
+ onEnableInteraction: enableInteraction,
1726
+ onDisableInteraction: disableInteraction,
1410
1727
  getMediaRef: function getMediaRef(mediaRef) {
1411
1728
  screensMediasRef.current[i] = mediaRef;
1412
1729
  }
1413
1730
  });
1414
1731
  var key = "screen-viewer-".concat(scr.id || '', "-").concat(i + 1);
1415
- var screenTransform = landscape ? "translateX(calc(".concat((screenWidth + landscapeScreenMargin) * (i - screenIndex), "px - 50%)) scale(").concat(current ? 1 : 0.9, ")") : "translateX(".concat(current ? 0 : '100%', ")");
1732
+ var screenTransform = null;
1733
+
1734
+ if (landscape) {
1735
+ screenTransform = withLandscapeSiblingsScreens ? "translateX(calc(".concat((screenWidth + landscapeScreenMargin) * (i - screenIndex), "px - 50%)) scale(").concat(current ? 1 : 0.9, ")") : null;
1736
+ } else {
1737
+ screenTransform = "translateX(".concat(current ? 0 : '100%', ")");
1738
+ }
1739
+
1416
1740
  return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, {
1417
1741
  key: key
1418
1742
  }, current && screenIndex > 0 ? /*#__PURE__*/React__default["default"].createElement("button", {
1419
1743
  type: "button",
1420
1744
  className: "sr-only",
1421
- onClick: onScreenPrevious,
1745
+ onClick: gotoPreviousScreen,
1422
1746
  tabIndex: "-1"
1423
1747
  }, /*#__PURE__*/React__default["default"].createElement(reactIntl.FormattedMessage, {
1424
1748
  id: "zYH/31",
@@ -1433,7 +1757,7 @@ function Viewer(_ref) {
1433
1757
  height: landscape ? screenHeight : null,
1434
1758
  transform: !withoutScreensTransforms ? screenTransform : null
1435
1759
  },
1436
- className: classNames__default["default"]([styles$6.screen, _defineProperty__default["default"]({}, styles$6.current, current)]),
1760
+ className: classNames__default["default"]([styles$7.screen, (_ref13 = {}, _defineProperty__default["default"](_ref13, styles$7.current, current), _defineProperty__default["default"](_ref13, styles$7.visible, current || withLandscapeSiblingsScreens), _ref13)]),
1437
1761
  tabIndex: active ? '0' : '-1'
1438
1762
  /* eslint-disable-line */
1439
1763
  ,
@@ -1456,12 +1780,12 @@ function Viewer(_ref) {
1456
1780
  }
1457
1781
  },
1458
1782
  onClick: function onClick(e) {
1459
- onScreenClick(e, i);
1783
+ return onScreenClick(e, i);
1460
1784
  }
1461
1785
  }, viewerScreen), current && screenIndex < screens.length ? /*#__PURE__*/React__default["default"].createElement("button", {
1462
1786
  type: "button",
1463
1787
  className: "sr-only",
1464
- onClick: onScreenNext,
1788
+ onClick: gotoNextScreen,
1465
1789
  tabIndex: "-1"
1466
1790
  }, /*#__PURE__*/React__default["default"].createElement(reactIntl.FormattedMessage, {
1467
1791
  id: "v9bqYj",
@@ -1471,7 +1795,7 @@ function Viewer(_ref) {
1471
1795
  }]
1472
1796
  })) : null);
1473
1797
  })) : null)));
1474
- }
1798
+ };
1475
1799
 
1476
1800
  Viewer.propTypes = propTypes$2;
1477
1801
  Viewer.defaultProps = defaultProps$2;
@@ -1525,23 +1849,17 @@ var ViewerRoutes = function ViewerRoutes(_ref) {
1525
1849
  ViewerRoutes.propTypes = propTypes$1;
1526
1850
  ViewerRoutes.defaultProps = defaultProps$1;
1527
1851
 
1528
- var home = "/";
1529
- var screen = "/:screen";
1530
- var defaultRoutes = {
1531
- home: home,
1532
- screen: screen
1533
- };
1534
-
1535
- var _excluded = ["story", "memoryRouter", "basePath", "routes", "withoutRouter", "googleApiKey", "trackingVariables", "locale", "locales", "translations"];
1852
+ var _excluded = ["story", "screenComponents", "memoryRouter", "basePath", "routes", "withoutRouter", "googleApiKey", "trackingVariables", "locale", "locales", "translations"];
1536
1853
  var propTypes = {
1537
- story: core.PropTypes.story,
1854
+ story: core$1.PropTypes.story,
1538
1855
  screen: PropTypes__default["default"].string,
1856
+ screenComponents: PropTypes__default["default"].objectOf(PropTypes__default["default"].elementType),
1539
1857
  memoryRouter: PropTypes__default["default"].bool,
1540
1858
  basePath: PropTypes__default["default"].string,
1541
1859
  routes: routes,
1542
1860
  withoutRouter: PropTypes__default["default"].bool,
1543
1861
  googleApiKey: PropTypes__default["default"].string,
1544
- trackingVariables: core.PropTypes.trackingVariables,
1862
+ trackingVariables: core$1.PropTypes.trackingVariables,
1545
1863
  locale: PropTypes__default["default"].string,
1546
1864
  locales: PropTypes__default["default"].arrayOf(PropTypes__default["default"].string),
1547
1865
  translations: PropTypes__default["default"].objectOf(PropTypes__default["default"].string),
@@ -1550,6 +1868,7 @@ var propTypes = {
1550
1868
  var defaultProps = {
1551
1869
  story: null,
1552
1870
  screen: null,
1871
+ screenComponents: null,
1553
1872
  memoryRouter: false,
1554
1873
  basePath: null,
1555
1874
  routes: defaultRoutes,
@@ -1564,6 +1883,7 @@ var defaultProps = {
1564
1883
 
1565
1884
  var ViewerContainer = function ViewerContainer(_ref) {
1566
1885
  var story = _ref.story,
1886
+ screenComponents = _ref.screenComponents,
1567
1887
  memoryRouter = _ref.memoryRouter,
1568
1888
  basePath = _ref.basePath,
1569
1889
  routes = _ref.routes,
@@ -1614,7 +1934,10 @@ var ViewerContainer = function ViewerContainer(_ref) {
1614
1934
  locale: finalLocale
1615
1935
  }, /*#__PURE__*/React__default["default"].createElement(contexts.FieldsProvider, {
1616
1936
  manager: fieldsManager__default["default"]
1617
- }, /*#__PURE__*/React__default["default"].createElement(screens.ScreensProvider, null, /*#__PURE__*/React__default["default"].createElement(contexts.UserInteractionProvider, null, /*#__PURE__*/React__default["default"].createElement(contexts.TrackingProvider, {
1937
+ }, /*#__PURE__*/React__default["default"].createElement(screens.ScreensProvider, null, /*#__PURE__*/React__default["default"].createElement(contexts.ComponentsProvider, {
1938
+ namespace: contexts.SCREENS_NAMESPACE,
1939
+ components: screenComponents || {}
1940
+ }, /*#__PURE__*/React__default["default"].createElement(contexts.UserInteractionProvider, null, /*#__PURE__*/React__default["default"].createElement(contexts.TrackingProvider, {
1618
1941
  variables: finalTrackingVariables
1619
1942
  }, withoutRouter ? /*#__PURE__*/React__default["default"].createElement(Viewer, Object.assign({
1620
1943
  story: story,
@@ -1622,7 +1945,7 @@ var ViewerContainer = function ViewerContainer(_ref) {
1622
1945
  }, otherProps)) : /*#__PURE__*/React__default["default"].createElement(ViewerRoutes, Object.assign({
1623
1946
  story: story,
1624
1947
  basePath: basePath
1625
- }, otherProps)))))))));
1948
+ }, otherProps))))))))));
1626
1949
  return withoutRouter ? content : /*#__PURE__*/React__default["default"].createElement(Router, {
1627
1950
  basename: !memoryRouter ? basePath : null
1628
1951
  }, /*#__PURE__*/React__default["default"].createElement(contexts.RoutesProvider, {