@micromag/viewer 0.2.412 → 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,119 +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 core$1 = require('@react-spring/core');
20
- var web = require('@react-spring/web');
21
- var react = require('@use-gesture/react');
22
19
  var classNames = require('classnames');
23
20
  var reactHelmet = require('react-helmet');
24
21
  var reactIntl = require('react-intl');
25
22
  var components = require('@micromag/core/components');
26
23
  var hooks = require('@micromag/core/hooks');
27
24
  var utils = require('@micromag/core/utils');
25
+ var core = require('@react-spring/core');
26
+ var web = require('@react-spring/web');
27
+ var react = require('@use-gesture/react');
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] : {};
52
62
 
53
- var styles$5 = {"container":"micromag-viewer-screen-container","current":"micromag-viewer-screen-current"};
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;
54
66
 
55
- var propTypes$8 = {
56
- screen: core.PropTypes.screenComponent,
57
- renderContext: core.PropTypes.renderContext,
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 = {
58
234
  current: PropTypes__default["default"].bool,
59
235
  active: PropTypes__default["default"].bool,
60
- onPrevious: PropTypes__default["default"].func,
61
- onNext: PropTypes__default["default"].func,
62
- onEnableInteraction: PropTypes__default["default"].func,
63
- onDisableInteraction: PropTypes__default["default"].func,
64
- getMediaRef: PropTypes__default["default"].func
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
65
243
  };
66
- var defaultProps$8 = {
67
- screen: null,
68
- renderContext: null,
244
+ var defaultProps$a = {
69
245
  current: false,
70
- active: true,
71
- onPrevious: null,
72
- onNext: null,
73
- onEnableInteraction: null,
74
- onDisableInteraction: null,
75
- getMediaRef: null
246
+ active: false,
247
+ colors: null,
248
+ vertical: false,
249
+ onClick: null,
250
+ className: null
76
251
  };
77
252
 
78
- var ViewerScreen = function ViewerScreen(_ref) {
79
- var _ref2;
253
+ var ViewerMenuDot = function ViewerMenuDot(_ref) {
254
+ var _ref3;
80
255
 
81
- var screen = _ref.screen,
82
- renderContext = _ref.renderContext,
256
+ var current = _ref.current,
83
257
  active = _ref.active,
84
- current = _ref.current,
85
- onPrevious = _ref.onPrevious,
86
- onNext = _ref.onNext,
87
- onEnableInteraction = _ref.onEnableInteraction,
88
- onDisableInteraction = _ref.onDisableInteraction,
89
- getMediaRef = _ref.getMediaRef;
90
- return screen !== null ? /*#__PURE__*/React__default["default"].createElement("div", {
91
- className: classNames__default["default"]([styles$5.container, (_ref2 = {}, _defineProperty__default["default"](_ref2, styles$5.active, active), _defineProperty__default["default"](_ref2, styles$5.current, current), _ref2)]),
92
- "aria-hidden": current ? null : 'true'
93
- }, /*#__PURE__*/React__default["default"].createElement(components.Screen, {
94
- screen: screen,
95
- renderContext: renderContext,
96
- active: active,
97
- current: current,
98
- onPrevious: onPrevious,
99
- onNext: onNext,
100
- onEnableInteraction: onEnableInteraction,
101
- onDisableInteraction: onDisableInteraction,
102
- getMediaRef: getMediaRef
103
- })) : null;
104
- };
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;
105
265
 
106
- ViewerScreen.propTypes = propTypes$8;
107
- ViewerScreen.defaultProps = defaultProps$8;
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
108
271
 
109
- var styles$4 = {"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"};
110
272
 
111
- var styles$3 = {};
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];
112
284
 
113
- var propTypes$7 = {
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
+ };
317
+
318
+ ViewerMenuDot.propTypes = propTypes$a;
319
+ ViewerMenuDot.defaultProps = defaultProps$a;
320
+
321
+ var styles$4 = {};
322
+
323
+ var propTypes$9 = {
114
324
  size: PropTypes__default["default"].number,
115
325
  spacing: PropTypes__default["default"].number,
116
326
  color: PropTypes__default["default"].string,
117
327
  className: PropTypes__default["default"].string
118
328
  };
119
- var defaultProps$7 = {
329
+ var defaultProps$9 = {
120
330
  size: 100,
121
331
  spacing: 8,
122
332
  color: 'white',
@@ -130,7 +340,7 @@ var MenuIcon = function MenuIcon(_ref) {
130
340
  className = _ref.className;
131
341
  var squareSize = (size - 2 * spacing) / 3;
132
342
  return /*#__PURE__*/React__default["default"].createElement("svg", {
133
- className: classNames__default["default"]([styles$3.container, _defineProperty__default["default"]({}, className, className !== null)]),
343
+ className: classNames__default["default"]([styles$4.container, _defineProperty__default["default"]({}, className, className !== null)]),
134
344
  xmlns: "http://www.w3.org/2000/svg",
135
345
  viewBox: "0 0 ".concat(size, " ").concat(size),
136
346
  "aria-hidden": "true"
@@ -148,57 +358,66 @@ var MenuIcon = function MenuIcon(_ref) {
148
358
  }));
149
359
  };
150
360
 
151
- MenuIcon.propTypes = propTypes$7;
152
- MenuIcon.defaultProps = defaultProps$7;
361
+ MenuIcon.propTypes = propTypes$9;
362
+ MenuIcon.defaultProps = defaultProps$9;
153
363
 
154
- var propTypes$6 = {
364
+ var propTypes$8 = {
155
365
  direction: PropTypes__default["default"].oneOf(['horizontal', 'vertical']),
156
366
  withShadow: PropTypes__default["default"].bool,
157
- items: core.PropTypes.menuItems,
158
- current: PropTypes__default["default"].number,
367
+ items: core$1.PropTypes.menuItems,
159
368
  onClickItem: PropTypes__default["default"].func,
369
+ onClickMenu: PropTypes__default["default"].func,
160
370
  colors: PropTypes__default["default"].shape({
161
371
  primary: PropTypes__default["default"].string,
162
372
  secondary: PropTypes__default["default"].string
163
373
  }),
164
374
  closeable: PropTypes__default["default"].bool,
375
+ withItemClick: PropTypes__default["default"].bool,
376
+ withoutScreensMenu: PropTypes__default["default"].bool,
165
377
  onClose: PropTypes__default["default"].func,
166
378
  className: PropTypes__default["default"].string
167
379
  };
168
- var defaultProps$6 = {
380
+ var defaultProps$8 = {
169
381
  direction: 'horizontal',
170
382
  withShadow: false,
171
383
  items: [],
172
- current: 0,
173
384
  onClickItem: null,
385
+ onClickMenu: null,
174
386
  colors: null,
175
387
  closeable: false,
388
+ withItemClick: false,
389
+ withoutScreensMenu: false,
176
390
  onClose: null,
177
391
  className: null
178
392
  };
179
393
 
180
394
  var ViewerMenuDots = function ViewerMenuDots(_ref) {
181
- var _ref3;
395
+ var _ref4;
182
396
 
183
397
  var direction = _ref.direction,
184
398
  withShadow = _ref.withShadow,
185
399
  items = _ref.items,
186
- current = _ref.current,
187
400
  onClickItem = _ref.onClickItem,
401
+ onClickMenu = _ref.onClickMenu,
188
402
  colors = _ref.colors,
189
403
  closeable = _ref.closeable,
404
+ withItemClick = _ref.withItemClick,
405
+ withoutScreensMenu = _ref.withoutScreensMenu,
190
406
  onClose = _ref.onClose,
191
407
  className = _ref.className;
192
408
 
193
409
  var _ref2 = colors || {},
194
410
  _ref2$primary = _ref2.primary,
195
- primary = _ref2$primary === void 0 ? 'rgba(255, 255, 255, 1)' : _ref2$primary,
196
- _ref2$secondary = _ref2.secondary,
197
- 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;
198
412
 
199
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
+ });
200
419
  return /*#__PURE__*/React__default["default"].createElement("nav", {
201
- className: classNames__default["default"]([styles$4.container, (_ref3 = {}, _defineProperty__default["default"](_ref3, className, className !== null), _defineProperty__default["default"](_ref3, styles$4.vertical, direction === 'vertical'), _defineProperty__default["default"](_ref3, styles$4.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)]),
202
421
  "aria-label": intl.formatMessage({
203
422
  id: "bLYuuN",
204
423
  defaultMessage: [{
@@ -218,35 +437,32 @@ var ViewerMenuDots = function ViewerMenuDots(_ref) {
218
437
  "value": "."
219
438
  }]
220
439
  }, {
221
- current: current + 1,
440
+ current: currentIndex + 1,
222
441
  total: items.length
223
442
  })
224
443
  }, /*#__PURE__*/React__default["default"].createElement("ul", {
225
- className: styles$4.items
444
+ className: styles$6.items
226
445
  }, items.map(function (item, index) {
227
- return (item === null || item === void 0 ? void 0 : item.parentId) === null ? /*#__PURE__*/React__default["default"].createElement("li", {
228
- className: classNames__default["default"]([styles$4.item, _defineProperty__default["default"]({}, styles$4.active, current === index)]),
229
- key: "item-".concat(index),
230
- "aria-hidden": "true"
231
- }, /*#__PURE__*/React__default["default"].createElement("button", {
232
- type: "button",
233
- className: styles$4.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,
234
453
  onClick: function onClick() {
235
- if (onClickItem !== null) {
236
- onClickItem(index);
454
+ if ((withItemClick || withoutScreensMenu) && onClickItem !== null) {
455
+ onClickItem(item);
456
+ } else if (!withItemClick && onClickMenu !== null) {
457
+ onClickMenu();
237
458
  }
238
459
  },
239
- tabIndex: "-1"
240
- }, /*#__PURE__*/React__default["default"].createElement("span", {
241
- className: styles$4.dot,
242
- style: {
243
- backgroundColor: index <= current ? primary : secondary
244
- }
245
- }))) : null;
246
- }), /*#__PURE__*/React__default["default"].createElement("li", {
247
- className: styles$4.menu
460
+ vertical: direction === 'vertical'
461
+ });
462
+ }), !withoutScreensMenu ? /*#__PURE__*/React__default["default"].createElement("li", {
463
+ className: styles$6.menu
248
464
  }, /*#__PURE__*/React__default["default"].createElement(MenuIcon, {
249
- className: styles$4.menuIcon,
465
+ className: styles$6.menuIcon,
250
466
  color: primary
251
467
  }), /*#__PURE__*/React__default["default"].createElement("button", {
252
468
  type: "button",
@@ -264,20 +480,16 @@ var ViewerMenuDots = function ViewerMenuDots(_ref) {
264
480
  "value": "Menu"
265
481
  }]
266
482
  }),
267
- className: styles$4.menuButton,
268
- onClick: function onClick() {
269
- if (onClickItem !== null) {
270
- onClickItem(null);
271
- }
272
- }
273
- })), closeable ? /*#__PURE__*/React__default["default"].createElement("li", {
274
- className: styles$4.closeButton,
483
+ className: styles$6.menuButton,
484
+ onClick: onClickMenu
485
+ })) : null, closeable ? /*#__PURE__*/React__default["default"].createElement("li", {
486
+ className: styles$6.closeButton,
275
487
  style: {
276
488
  color: primary
277
489
  }
278
490
  }, /*#__PURE__*/React__default["default"].createElement("button", {
279
491
  type: "button",
280
- className: styles$4.closeButton,
492
+ className: styles$6.closeButton,
281
493
  onClick: onClose,
282
494
  title: intl.formatMessage({
283
495
  id: "dj/p/q",
@@ -298,14 +510,14 @@ var ViewerMenuDots = function ViewerMenuDots(_ref) {
298
510
  }))) : null));
299
511
  };
300
512
 
301
- ViewerMenuDots.propTypes = propTypes$6;
302
- ViewerMenuDots.defaultProps = defaultProps$6;
513
+ ViewerMenuDots.propTypes = propTypes$8;
514
+ ViewerMenuDots.defaultProps = defaultProps$8;
303
515
 
304
- var styles$2 = {"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"};
305
517
 
306
- var styles$1 = {"container":"micromag-viewer-partials-share-modal-container","content":"micromag-viewer-partials-share-modal-content","opened":"micromag-viewer-partials-share-modal-opened"};
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"};
307
519
 
308
- var propTypes$5 = {
520
+ var propTypes$7 = {
309
521
  url: PropTypes__default["default"].string,
310
522
  title: PropTypes__default["default"].string,
311
523
  opened: PropTypes__default["default"].bool,
@@ -313,7 +525,7 @@ var propTypes$5 = {
313
525
  onShare: PropTypes__default["default"].func,
314
526
  onCancel: PropTypes__default["default"].func
315
527
  };
316
- var defaultProps$5 = {
528
+ var defaultProps$7 = {
317
529
  url: null,
318
530
  title: null,
319
531
  opened: false,
@@ -366,13 +578,13 @@ var ShareModal = function ShareModal(_ref) {
366
578
  }, [opened, onCancel]);
367
579
  hooks.useDocumentEvent('click', onDocumentClick, opened);
368
580
  return /*#__PURE__*/React__default["default"].createElement("div", {
369
- className: classNames__default["default"]([styles$1.container, (_ref2 = {}, _defineProperty__default["default"](_ref2, className, className), _defineProperty__default["default"](_ref2, styles$1.opened, opened), _ref2)]),
581
+ className: classNames__default["default"]([styles$2.container, (_ref2 = {}, _defineProperty__default["default"](_ref2, className, className), _defineProperty__default["default"](_ref2, styles$2.opened, opened), _ref2)]),
370
582
  ref: containerRef,
371
583
  "aria-hidden": opened ? null : '-1'
372
584
  }, /*#__PURE__*/React__default["default"].createElement("div", {
373
- className: styles$1.content
585
+ className: styles$2.content
374
586
  }, /*#__PURE__*/React__default["default"].createElement("div", {
375
- className: styles$1.buttons
587
+ className: styles$2.buttons
376
588
  }, /*#__PURE__*/React__default["default"].createElement(reactShare.FacebookShareButton, Object.assign({}, shareButtonProps, {
377
589
  quote: title,
378
590
  beforeOnClick: function beforeOnClick() {
@@ -397,12 +609,12 @@ var ShareModal = function ShareModal(_ref) {
397
609
  }), /*#__PURE__*/React__default["default"].createElement(reactShare.EmailIcon, shareIconProps)))));
398
610
  };
399
611
 
400
- ShareModal.propTypes = propTypes$5;
401
- ShareModal.defaultProps = defaultProps$5;
612
+ ShareModal.propTypes = propTypes$7;
613
+ ShareModal.defaultProps = defaultProps$7;
402
614
 
403
- var styles = {"container":"micromag-viewer-partials-share-button-container","shareModal":"micromag-viewer-partials-share-button-shareModal"};
615
+ var styles$1 = {"container":"micromag-viewer-partials-share-button-container","shareModal":"micromag-viewer-partials-share-button-shareModal"};
404
616
 
405
- var propTypes$4 = {
617
+ var propTypes$6 = {
406
618
  title: PropTypes__default["default"].string,
407
619
  url: PropTypes__default["default"].string,
408
620
  className: PropTypes__default["default"].string,
@@ -411,7 +623,7 @@ var propTypes$4 = {
411
623
  children: PropTypes__default["default"].node,
412
624
  focusable: PropTypes__default["default"].bool
413
625
  };
414
- var defaultProps$4 = {
626
+ var defaultProps$6 = {
415
627
  title: null,
416
628
  url: null,
417
629
  className: null,
@@ -452,7 +664,7 @@ var ShareButton = function ShareButton(_ref) {
452
664
  setStoryShareModalOpened(false);
453
665
  }, [setStoryShareModalOpened]);
454
666
  return /*#__PURE__*/React__default["default"].createElement("div", {
455
- className: classNames__default["default"]([styles.container, _defineProperty__default["default"]({}, className, className !== null)])
667
+ className: classNames__default["default"]([styles$1.container, _defineProperty__default["default"]({}, className, className !== null)])
456
668
  }, /*#__PURE__*/React__default["default"].createElement(components.Button, {
457
669
  className: classNames__default["default"]([_defineProperty__default["default"]({}, buttonClassName, buttonClassName !== null)]),
458
670
  onClick: onShareIconClick,
@@ -472,7 +684,7 @@ var ShareButton = function ShareButton(_ref) {
472
684
  }),
473
685
  focusable: focusable
474
686
  }, children), /*#__PURE__*/React__default["default"].createElement(ShareModal, {
475
- className: styles.shareModal,
687
+ className: styles$1.shareModal,
476
688
  opened: storyShareModalOpened,
477
689
  title: title,
478
690
  url: url,
@@ -481,16 +693,16 @@ var ShareButton = function ShareButton(_ref) {
481
693
  }));
482
694
  };
483
695
 
484
- ShareButton.propTypes = propTypes$4;
485
- ShareButton.defaultProps = defaultProps$4;
696
+ ShareButton.propTypes = propTypes$6;
697
+ ShareButton.defaultProps = defaultProps$6;
486
698
 
487
- var propTypes$3 = {
488
- viewerTheme: core.PropTypes.viewerTheme,
489
- 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,
490
703
  title: PropTypes__default["default"].string,
491
704
  shareUrl: PropTypes__default["default"].string,
492
- items: core.PropTypes.menuItems,
493
- current: PropTypes__default["default"].number,
705
+ items: core$1.PropTypes.menuItems,
494
706
  focusable: PropTypes__default["default"].bool,
495
707
  onClickItem: PropTypes__default["default"].func,
496
708
  onClose: PropTypes__default["default"].func,
@@ -501,13 +713,13 @@ var propTypes$3 = {
501
713
  fullscreenEnabled: PropTypes__default["default"].bool,
502
714
  className: PropTypes__default["default"].string
503
715
  };
504
- var defaultProps$3 = {
716
+ var defaultProps$5 = {
505
717
  viewerTheme: null,
506
- screenWidth: null,
718
+ screenSize: null,
719
+ menuWidth: null,
507
720
  title: null,
508
721
  shareUrl: null,
509
722
  items: [],
510
- current: 0,
511
723
  focusable: true,
512
724
  onClickItem: null,
513
725
  onClose: null,
@@ -521,11 +733,11 @@ var defaultProps$3 = {
521
733
 
522
734
  var ViewerMenuPreview = function ViewerMenuPreview(_ref) {
523
735
  var viewerTheme = _ref.viewerTheme,
524
- screenWidth = _ref.screenWidth,
736
+ screenSize = _ref.screenSize,
737
+ menuWidth = _ref.menuWidth,
525
738
  title = _ref.title,
526
739
  shareUrl = _ref.shareUrl,
527
740
  items = _ref.items,
528
- current = _ref.current,
529
741
  focusable = _ref.focusable,
530
742
  onClickItem = _ref.onClickItem,
531
743
  onClose = _ref.onClose,
@@ -536,82 +748,74 @@ var ViewerMenuPreview = function ViewerMenuPreview(_ref) {
536
748
  fullscreenEnabled = _ref.fullscreenEnabled,
537
749
  className = _ref.className;
538
750
  var intl = reactIntl.useIntl();
539
- var screenSizeRatio = "".concat(3 / 2 / thumbsPerLine * 100, "%");
540
- var screenRatioHeight = screenWidth * 3 / 2;
541
- var hasSize = screenWidth > 0;
542
- var hasItems = items !== null && items.length > 0;
543
-
544
- var _useState = React.useState(null),
545
- _useState2 = _slicedToArray__default["default"](_useState, 2),
546
- thumbSize = _useState2[0],
547
- setThumbSize = _useState2[1];
548
-
549
- var firstScreenContainerRef = React.useRef(null);
550
- React.useEffect(function () {
551
- if (hasItems && hasSize && firstScreenContainerRef.current !== null) {
552
- var _firstScreenContainer = firstScreenContainerRef.current,
553
- offsetWidth = _firstScreenContainer.offsetWidth,
554
- offsetHeight = _firstScreenContainer.offsetHeight;
555
- setThumbSize({
556
- width: offsetWidth,
557
- height: offsetHeight
558
- });
559
- }
560
- }, [screenWidth, hasItems, hasSize]); // Viewer theme
561
-
562
- var _ref2 = viewerTheme || {},
563
- _ref2$colors = _ref2.colors,
564
- colors = _ref2$colors === void 0 ? null : _ref2$colors,
565
- _ref2$background = _ref2.background,
566
- background = _ref2$background === void 0 ? null : _ref2$background,
567
- _ref2$textStyles = _ref2.textStyles,
568
- textStyles = _ref2$textStyles === void 0 ? null : _ref2$textStyles,
569
- _ref2$logo = _ref2.logo,
570
- brandLogo = _ref2$logo === void 0 ? null : _ref2$logo;
571
-
572
- var _ref3 = textStyles || {},
573
- _ref3$title = _ref3.title,
574
- brandTextStyle = _ref3$title === void 0 ? null : _ref3$title;
575
751
 
576
- var _ref4 = colors || {},
577
- _ref4$primary = _ref4.primary,
578
- brandPrimaryColor = _ref4$primary === void 0 ? null : _ref4$primary,
579
- _ref4$secondary = _ref4.secondary,
580
- brandSecondaryColor = _ref4$secondary === void 0 ? null : _ref4$secondary;
752
+ var _ref2 = screenSize || {},
753
+ screenWidth = _ref2.width,
754
+ screenHeight = _ref2.height;
581
755
 
582
- var _ref5 = background || {},
583
- _ref5$color = _ref5.color,
584
- brandBackgroundColor = _ref5$color === void 0 ? null : _ref5$color,
585
- _ref5$image = _ref5.image,
586
- image = _ref5$image === void 0 ? null : _ref5$image;
587
-
588
- var _ref6 = image || {},
589
- _ref6$url = _ref6.url,
590
- 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;
591
795
 
592
796
  var borderPrimaryColorStyle = utils.getStyleFromColor(brandPrimaryColor, 'borderColor');
593
797
  var colorSecondaryColorStyle = utils.getStyleFromColor(brandSecondaryColor, 'color');
594
798
  var backgroundColorStyle = utils.getStyleFromColor(brandBackgroundColor, 'backgroundColor');
595
799
 
596
- var _ref7 = brandLogo || {},
597
- _ref7$url = _ref7.url,
598
- 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;
599
803
 
600
804
  var brandImageStyle = brandImageUrl !== null ? {
601
805
  backgroundImage: "url(".concat(brandImageUrl, ")")
602
806
  } : null;
603
807
  var titleStyle = brandTextStyle !== null ? utils.getStyleFromText(brandTextStyle) : null;
604
808
 
605
- var _useState3 = React.useState(false),
606
- _useState4 = _slicedToArray__default["default"](_useState3, 2),
607
- scrolledBottom = _useState4[0],
608
- setScrolledBottom = _useState4[1];
809
+ var _useState = React.useState(false),
810
+ _useState2 = _slicedToArray__default["default"](_useState, 2),
811
+ scrolledBottom = _useState2[0],
812
+ setScrolledBottom = _useState2[1];
609
813
 
610
- var dragBind = react.useDrag(function (_ref8) {
611
- var _ref8$direction = _slicedToArray__default["default"](_ref8.direction, 2),
612
- dy = _ref8$direction[1],
613
- last = _ref8.last,
614
- 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;
615
819
 
616
820
  if (!tap && last && scrolledBottom && dy < 0 && onClose !== null) {
617
821
  onClose();
@@ -628,37 +832,37 @@ var ViewerMenuPreview = function ViewerMenuPreview(_ref) {
628
832
  var onScrolledNotBottom = React.useCallback(function () {
629
833
  setScrolledBottom(false);
630
834
  }, [setScrolledBottom]);
631
- return hasSize ? /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
632
- className: classNames__default["default"]([styles$2.container, _defineProperty__default["default"]({}, className, className !== null)]),
835
+ return /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
836
+ className: classNames__default["default"]([styles$3.container, _defineProperty__default["default"]({}, className, className !== null)]),
633
837
  style: _objectSpread__default["default"](_objectSpread__default["default"](_objectSpread__default["default"]({}, backgroundColorStyle), brandImageStyle), {}, {
634
- width: screenWidth
838
+ width: menuWidth
635
839
  }),
636
840
  "aria-hidden": focusable ? null : 'true'
637
841
  }, dragBind()), /*#__PURE__*/React__default["default"].createElement("div", {
638
- className: styles$2.header
842
+ className: styles$3.header
639
843
  }, brandLogoUrl !== null ? /*#__PURE__*/React__default["default"].createElement("div", {
640
- className: styles$2.organisation,
844
+ className: styles$3.organisation,
641
845
  style: {
642
846
  backgroundImage: "url(".concat(brandLogoUrl, ")")
643
847
  }
644
848
  }) : null, /*#__PURE__*/React__default["default"].createElement("div", {
645
- className: styles$2.title,
849
+ className: styles$3.title,
646
850
  style: titleStyle
647
851
  }, title), /*#__PURE__*/React__default["default"].createElement("div", {
648
- className: styles$2.buttons,
852
+ className: styles$3.buttons,
649
853
  style: colorSecondaryColorStyle
650
854
  }, /*#__PURE__*/React__default["default"].createElement(ShareButton, {
651
- className: styles$2.shareButton,
652
- buttonClassName: styles$2.button,
855
+ className: styles$3.shareButton,
856
+ buttonClassName: styles$3.button,
653
857
  onShare: onShare,
654
858
  url: shareUrl,
655
859
  title: title,
656
860
  focusable: focusable
657
861
  }, /*#__PURE__*/React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, {
658
- className: styles$2.icon,
862
+ className: styles$3.icon,
659
863
  icon: freeSolidSvgIcons.faShare
660
864
  })), fullscreenEnabled ? /*#__PURE__*/React__default["default"].createElement(components.Button, {
661
- className: styles$2.button,
865
+ className: styles$3.button,
662
866
  onClick: toggleFullscreen,
663
867
  title: intl.formatMessage({
664
868
  id: "AuxqcG",
@@ -676,10 +880,10 @@ var ViewerMenuPreview = function ViewerMenuPreview(_ref) {
676
880
  }),
677
881
  focusable: focusable
678
882
  }, /*#__PURE__*/React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, {
679
- className: styles$2.icon,
883
+ className: styles$3.icon,
680
884
  icon: fullscreenActive ? freeSolidSvgIcons.faCompress : freeSolidSvgIcons.faExpand
681
885
  })) : null, /*#__PURE__*/React__default["default"].createElement(components.Button, {
682
- className: styles$2.button,
886
+ className: styles$3.button,
683
887
  onClick: onClose,
684
888
  title: intl.formatMessage({
685
889
  id: "dj/p/q",
@@ -697,20 +901,23 @@ var ViewerMenuPreview = function ViewerMenuPreview(_ref) {
697
901
  }),
698
902
  focusable: focusable
699
903
  }, /*#__PURE__*/React__default["default"].createElement(reactFontawesome.FontAwesomeIcon, {
700
- className: styles$2.icon,
904
+ className: styles$3.icon,
701
905
  icon: freeSolidSvgIcons.faTimes
702
906
  })))), /*#__PURE__*/React__default["default"].createElement("div", {
703
- className: styles$2.content
907
+ className: styles$3.content
704
908
  }, /*#__PURE__*/React__default["default"].createElement(Scroll__default["default"], {
705
- className: styles$2.scroll,
909
+ className: styles$3.scroll,
706
910
  onScrolledBottom: onScrolledBottom,
707
911
  onScrolledNotBottom: onScrolledNotBottom
708
912
  }, /*#__PURE__*/React__default["default"].createElement("nav", {
709
- className: styles$2.nav
913
+ className: styles$3.nav
710
914
  }, /*#__PURE__*/React__default["default"].createElement("ul", {
711
- className: styles$2.items
915
+ className: styles$3.items
712
916
  }, items.map(function (item, index) {
713
- 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({
714
921
  id: "LkVfwW",
715
922
  defaultMessage: [{
716
923
  "type": 0,
@@ -721,112 +928,453 @@ var ViewerMenuPreview = function ViewerMenuPreview(_ref) {
721
928
  }]
722
929
  }, {
723
930
  index: index + 1
724
- });
725
- var isCurrentScreenLabel = current === index ? " ".concat(intl.formatMessage({
931
+ })).concat(current ? " ".concat(intl.formatMessage({
726
932
  id: "vmrJ8U",
727
933
  defaultMessage: [{
728
934
  "type": 0,
729
935
  "value": "(current screen)"
730
936
  }]
731
- })) : '';
732
- var screenAriaLabel = screenIndexLabel + isCurrentScreenLabel;
733
- return item.parentId === null ? /*#__PURE__*/React__default["default"].createElement("li", {
734
- className: classNames__default["default"]([styles$2.item, _defineProperty__default["default"]({}, styles$2.active, current === index)]),
937
+ })) : '');
938
+ return /*#__PURE__*/React__default["default"].createElement("li", {
939
+ className: classNames__default["default"]([styles$3.item, _defineProperty__default["default"]({}, styles$3.active, current)]),
735
940
  key: "item-".concat(index),
736
941
  style: {
737
- paddingBottom: screenSizeRatio,
738
942
  width: "".concat(100 / thumbsPerLine, "%")
739
943
  }
740
944
  }, /*#__PURE__*/React__default["default"].createElement("div", {
741
- className: styles$2.itemContent
945
+ className: styles$3.itemContent
742
946
  }, /*#__PURE__*/React__default["default"].createElement("div", {
743
- className: styles$2.screenContainer,
744
- ref: index === 0 ? firstScreenContainerRef : null
745
- }, /*#__PURE__*/React__default["default"].createElement("div", {
746
- className: styles$2.screenContent,
747
- style: thumbSize !== null ? {
947
+ className: styles$3.screenContainer,
948
+ ref: index === 0 ? firstScreenContainerRef : null,
949
+ style: {
950
+ height: screenHeight * screenScale
951
+ }
952
+ }, screenWidth > 0 && screenHeight > 0 ? /*#__PURE__*/React__default["default"].createElement("div", {
953
+ className: styles$3.screenContent,
954
+ style: {
748
955
  width: screenWidth,
749
- height: screenRatioHeight,
750
- transform: "scale(".concat(thumbSize.width / screenWidth)
751
- } : null,
956
+ height: screenHeight,
957
+ transform: "scale(".concat(screenScale)
958
+ },
752
959
  "aria-hidden": "true"
753
960
  }, /*#__PURE__*/React__default["default"].createElement(components.ScreenPreview, {
754
961
  width: screenWidth,
755
- height: screenRatioHeight,
756
- screen: item,
962
+ height: screenHeight,
963
+ screen: screen,
757
964
  focusable: false
758
- })), current === index ? /*#__PURE__*/React__default["default"].createElement("div", {
759
- className: styles$2.activeScreenBorder,
965
+ })) : null, current ? /*#__PURE__*/React__default["default"].createElement("div", {
966
+ className: styles$3.activeScreenBorder,
760
967
  style: borderPrimaryColorStyle
761
968
  }) : null)), /*#__PURE__*/React__default["default"].createElement("button", {
762
969
  type: "button",
763
- className: styles$2.screenButton,
970
+ className: styles$3.screenButton,
764
971
  onClick: function onClick() {
765
- onClickItem(index);
972
+ if (onClickItem !== null) {
973
+ onClickItem(item);
974
+ }
766
975
  },
767
976
  "aria-label": screenAriaLabel,
768
977
  onKeyUp: function onKeyUp(e) {
769
- if (e.key === 'Enter') {
770
- onClickItem(index);
978
+ if (e.key === 'Enter' && onClickItem !== null) {
979
+ onClickItem(item);
771
980
  }
772
981
  },
773
982
  tabIndex: focusable ? '0' : '-1'
774
- })) : null;
775
- })))))) : null;
983
+ }));
984
+ }))))));
776
985
  };
777
986
 
778
- ViewerMenuPreview.propTypes = propTypes$3;
779
- ViewerMenuPreview.defaultProps = defaultProps$3;
987
+ ViewerMenuPreview.propTypes = propTypes$5;
988
+ ViewerMenuPreview.defaultProps = defaultProps$5;
780
989
 
781
- var propTypes$2 = {
782
- story: core.PropTypes.story,
783
- // .isRequired,
784
- basePath: PropTypes__default["default"].string,
785
- theme: core.PropTypes.viewerTheme,
786
- width: PropTypes__default["default"].number,
787
- height: PropTypes__default["default"].number,
788
- screen: PropTypes__default["default"].string,
789
- deviceScreens: core.PropTypes.deviceScreens,
790
- renderContext: core.PropTypes.renderContext,
791
- onScreenChange: PropTypes__default["default"].func,
792
- tapNextScreenWidthPercent: PropTypes__default["default"].number,
793
- neighborScreensActive: PropTypes__default["default"].number,
794
- storyIsParsed: PropTypes__default["default"].bool,
795
- landscapeScreenMargin: PropTypes__default["default"].number,
796
- withMetadata: PropTypes__default["default"].bool,
797
- withoutMenu: PropTypes__default["default"].bool,
798
- withoutFullscreen: PropTypes__default["default"].bool,
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,
799
997
  closeable: PropTypes__default["default"].bool,
800
- onClose: PropTypes__default["default"].func,
801
- onInteraction: PropTypes__default["default"].func,
802
- onEnd: PropTypes__default["default"].func,
803
- onViewModeChange: PropTypes__default["default"].func,
804
- currentScreenMedia: core.PropTypes.ref,
805
- screensMedias: core.PropTypes.ref,
806
- screenSizeOptions: PropTypes__default["default"].shape({
807
- withoutMaxSize: PropTypes__default["default"].bool,
808
- desktopHeightRatio: PropTypes__default["default"].number,
809
- screenRatio: PropTypes__default["default"].number
810
- }),
811
- className: PropTypes__default["default"].string
812
- };
813
- var defaultProps$2 = {
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
1013
+
1014
+ })
1015
+ };
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
1037
+ };
1038
+
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, {
1307
+ screen: screen,
1308
+ renderContext: renderContext,
1309
+ screenState: screenState,
1310
+ active: active,
1311
+ current: current,
1312
+ onPrevious: onPrevious,
1313
+ onNext: onNext,
1314
+ onEnableInteraction: onEnableInteraction,
1315
+ onDisableInteraction: onDisableInteraction,
1316
+ getMediaRef: getMediaRef
1317
+ })) : null;
1318
+ };
1319
+
1320
+ ViewerScreen.propTypes = propTypes$3;
1321
+ ViewerScreen.defaultProps = defaultProps$3;
1322
+
1323
+ var propTypes$2 = {
1324
+ story: core$1.PropTypes.story,
1325
+ // .isRequired,
1326
+ basePath: PropTypes__default["default"].string,
1327
+ theme: core$1.PropTypes.viewerTheme,
1328
+ width: PropTypes__default["default"].number,
1329
+ height: PropTypes__default["default"].number,
1330
+ screen: PropTypes__default["default"].string,
1331
+ screenState: PropTypes__default["default"].string,
1332
+ deviceScreens: core$1.PropTypes.deviceScreens,
1333
+ renderContext: core$1.PropTypes.renderContext,
1334
+ onScreenChange: PropTypes__default["default"].func,
1335
+ tapNextScreenWidthPercent: PropTypes__default["default"].number,
1336
+ neighborScreensActive: PropTypes__default["default"].number,
1337
+ storyIsParsed: PropTypes__default["default"].bool,
1338
+ landscapeScreenMargin: PropTypes__default["default"].number,
1339
+ withMetadata: PropTypes__default["default"].bool,
1340
+ withoutMenu: PropTypes__default["default"].bool,
1341
+ withoutScreensMenu: PropTypes__default["default"].bool,
1342
+ withoutFullscreen: PropTypes__default["default"].bool,
1343
+ withLandscapeSiblingsScreens: PropTypes__default["default"].bool,
1344
+ closeable: PropTypes__default["default"].bool,
1345
+ onClose: PropTypes__default["default"].func,
1346
+ onInteraction: PropTypes__default["default"].func,
1347
+ onEnd: PropTypes__default["default"].func,
1348
+ onViewModeChange: PropTypes__default["default"].func,
1349
+ currentScreenMedia: core$1.PropTypes.ref,
1350
+ screensMedias: core$1.PropTypes.ref,
1351
+ screenSizeOptions: PropTypes__default["default"].shape({
1352
+ withoutMaxSize: PropTypes__default["default"].bool,
1353
+ desktopHeightRatio: PropTypes__default["default"].number,
1354
+ screenRatio: PropTypes__default["default"].number
1355
+ }),
1356
+ className: PropTypes__default["default"].string
1357
+ };
1358
+ var defaultProps$2 = {
814
1359
  story: null,
815
1360
  theme: null,
816
1361
  basePath: null,
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,
@@ -839,7 +1387,7 @@ var defaultProps$2 = {
839
1387
  };
840
1388
 
841
1389
  var Viewer = function Viewer(_ref) {
842
- var _ref15;
1390
+ var _ref12;
843
1391
 
844
1392
  var story = _ref.story,
845
1393
  basePath = _ref.basePath,
@@ -847,6 +1395,7 @@ var Viewer = 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 @@ var Viewer = 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 @@ var Viewer = 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 @@ var Viewer = 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 @@ var Viewer = 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 @@ var Viewer = 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);
@@ -1014,247 +1538,60 @@ var Viewer = function Viewer(_ref) {
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
1546
 
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
-
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];
1138
-
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
-
1159
- var isMenuOpened = menuOpened.current;
1160
-
1161
- if (first) {
1162
- if (isMenuOpened) {
1163
- cancel();
1164
- return;
1165
- }
1166
- }
1559
+ onScreenClick = _useScreenInteraction.onClick,
1560
+ currentScreenInteractionEnabled = _useScreenInteraction.currentScreenInteractionEnabled,
1561
+ enableInteraction = _useScreenInteraction.enableInteraction,
1562
+ disableInteraction = _useScreenInteraction.disableInteraction; // swipe menu open
1167
1563
 
1168
- var yProgress = Math.max(0, Math.min(1, my / menuPreviewContainerHeight + (isMenuOpened ? 1 : 0)));
1169
1564
 
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
1590
 
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
-
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 @@ var Viewer = 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
- gotoPreviousScreen();
1302
- break;
1303
-
1304
- case 'arrowright':
1305
- case ' ':
1306
- // spacebar
1307
- gotoNextScreen();
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, gotoPreviousScreen, gotoNextScreen]);
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,84 +1655,88 @@ var Viewer = 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
1671
  menuSize: menuDotsContainerHeight,
1349
1672
  gotoPreviousScreen: gotoPreviousScreen,
1350
- gotoNextScreen: gotoNextScreen
1673
+ gotoNextScreen: gotoNextScreen,
1674
+ disableInteraction: disableInteraction,
1675
+ enableInteraction: enableInteraction
1351
1676
  }, withMetadata ? /*#__PURE__*/React__default["default"].createElement(components.Meta, {
1352
1677
  title: finalTitle,
1353
1678
  metadata: finalMetadata
1354
1679
  }, overscrollStyle) : /*#__PURE__*/React__default["default"].createElement(reactHelmet.Helmet, null, overscrollStyle), /*#__PURE__*/React__default["default"].createElement(components.FontFaces, {
1355
1680
  fonts: finalFonts
1356
1681
  }), /*#__PURE__*/React__default["default"].createElement("div", {
1357
- 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) {
1358
1683
  return "story-screen-".concat(screenName);
1359
- }), (_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)]),
1360
1685
  ref: containerRef,
1361
1686
  onContextMenu: onContextMenu
1362
- }, !withoutMenu ? /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
1363
- className: styles$6.menuDotsContainer,
1364
- ref: menuDotsContainerRef,
1365
- style: {
1366
- width: screenWidth
1367
- }
1368
- }, menuDragBind()), /*#__PURE__*/React__default["default"].createElement(ViewerMenuDots, Object.assign({}, menuTheme, {
1369
- direction: "horizontal",
1687
+ }, !withoutMenu ? /*#__PURE__*/React__default["default"].createElement(ViewerMenu, {
1688
+ story: parsedStory,
1689
+ currentScreenIndex: screenIndex,
1690
+ opened: menuOpened,
1370
1691
  withShadow: menuOverScreen,
1371
- items: screens,
1372
- current: screenIndex,
1373
- onClickItem: onClickDotsMenuItem,
1374
- closeable: closeable,
1375
- onClose: onClose,
1376
- className: styles$6.menuDots
1377
- }))), /*#__PURE__*/React__default["default"].createElement(web.animated.div, {
1378
- className: styles$6.menuPreviewContainer,
1379
- style: menuPreviewStyle,
1380
- ref: menuPreviewContainerRef
1381
- }, /*#__PURE__*/React__default["default"].createElement(ViewerMenuPreview, {
1382
- viewerTheme: viewerTheme,
1383
- title: title,
1384
- shareUrl: shareUrl,
1385
- className: styles$6.menuPreview,
1386
- screenWidth: screenWidth,
1387
- focusable: previewMenuOpen,
1388
- items: screens,
1389
- current: screenIndex,
1390
- onClickItem: onClickPreviewMenuItem,
1391
- onClose: onClickPreviewMenuClose,
1392
- onShare: onClickShare,
1393
1692
  toggleFullscreen: toggleFullscreen,
1394
1693
  fullscreenActive: fullscreenActive,
1395
- fullscreenEnabled: fullscreenEnabled
1396
- }))) : 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", {
1397
1709
  ref: contentRef,
1398
- className: styles$6.content
1710
+ className: styles$7.content
1399
1711
  }, screens.map(function (scr, i) {
1712
+ var _ref13;
1713
+
1400
1714
  var current = i === screenIndex;
1401
1715
  var active = i > screenIndex - neighborScreensActive && i < screenIndex + neighborScreensActive;
1402
1716
  var viewerScreen = /*#__PURE__*/React__default["default"].createElement(ViewerScreen, {
1403
1717
  screen: scr,
1718
+ screenState: current ? screenState : null,
1404
1719
  renderContext: renderContext,
1405
1720
  index: i,
1406
1721
  current: current,
1407
1722
  active: active,
1408
1723
  onPrevious: gotoPreviousScreen,
1409
1724
  onNext: gotoNextScreen,
1410
- onEnableInteraction: onEnableInteraction,
1411
- onDisableInteraction: onDisableInteraction,
1725
+ onEnableInteraction: enableInteraction,
1726
+ onDisableInteraction: disableInteraction,
1412
1727
  getMediaRef: function getMediaRef(mediaRef) {
1413
1728
  screensMediasRef.current[i] = mediaRef;
1414
1729
  }
1415
1730
  });
1416
1731
  var key = "screen-viewer-".concat(scr.id || '', "-").concat(i + 1);
1417
- 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
+
1418
1740
  return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, {
1419
1741
  key: key
1420
1742
  }, current && screenIndex > 0 ? /*#__PURE__*/React__default["default"].createElement("button", {
@@ -1435,7 +1757,7 @@ var Viewer = function Viewer(_ref) {
1435
1757
  height: landscape ? screenHeight : null,
1436
1758
  transform: !withoutScreensTransforms ? screenTransform : null
1437
1759
  },
1438
- 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)]),
1439
1761
  tabIndex: active ? '0' : '-1'
1440
1762
  /* eslint-disable-line */
1441
1763
  ,
@@ -1527,23 +1849,17 @@ var ViewerRoutes = function ViewerRoutes(_ref) {
1527
1849
  ViewerRoutes.propTypes = propTypes$1;
1528
1850
  ViewerRoutes.defaultProps = defaultProps$1;
1529
1851
 
1530
- var home = "/";
1531
- var screen = "/:screen";
1532
- var defaultRoutes = {
1533
- home: home,
1534
- screen: screen
1535
- };
1536
-
1537
- 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"];
1538
1853
  var propTypes = {
1539
- story: core.PropTypes.story,
1854
+ story: core$1.PropTypes.story,
1540
1855
  screen: PropTypes__default["default"].string,
1856
+ screenComponents: PropTypes__default["default"].objectOf(PropTypes__default["default"].elementType),
1541
1857
  memoryRouter: PropTypes__default["default"].bool,
1542
1858
  basePath: PropTypes__default["default"].string,
1543
1859
  routes: routes,
1544
1860
  withoutRouter: PropTypes__default["default"].bool,
1545
1861
  googleApiKey: PropTypes__default["default"].string,
1546
- trackingVariables: core.PropTypes.trackingVariables,
1862
+ trackingVariables: core$1.PropTypes.trackingVariables,
1547
1863
  locale: PropTypes__default["default"].string,
1548
1864
  locales: PropTypes__default["default"].arrayOf(PropTypes__default["default"].string),
1549
1865
  translations: PropTypes__default["default"].objectOf(PropTypes__default["default"].string),
@@ -1552,6 +1868,7 @@ var propTypes = {
1552
1868
  var defaultProps = {
1553
1869
  story: null,
1554
1870
  screen: null,
1871
+ screenComponents: null,
1555
1872
  memoryRouter: false,
1556
1873
  basePath: null,
1557
1874
  routes: defaultRoutes,
@@ -1566,6 +1883,7 @@ var defaultProps = {
1566
1883
 
1567
1884
  var ViewerContainer = function ViewerContainer(_ref) {
1568
1885
  var story = _ref.story,
1886
+ screenComponents = _ref.screenComponents,
1569
1887
  memoryRouter = _ref.memoryRouter,
1570
1888
  basePath = _ref.basePath,
1571
1889
  routes = _ref.routes,
@@ -1616,7 +1934,10 @@ var ViewerContainer = function ViewerContainer(_ref) {
1616
1934
  locale: finalLocale
1617
1935
  }, /*#__PURE__*/React__default["default"].createElement(contexts.FieldsProvider, {
1618
1936
  manager: fieldsManager__default["default"]
1619
- }, /*#__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, {
1620
1941
  variables: finalTrackingVariables
1621
1942
  }, withoutRouter ? /*#__PURE__*/React__default["default"].createElement(Viewer, Object.assign({
1622
1943
  story: story,
@@ -1624,7 +1945,7 @@ var ViewerContainer = function ViewerContainer(_ref) {
1624
1945
  }, otherProps)) : /*#__PURE__*/React__default["default"].createElement(ViewerRoutes, Object.assign({
1625
1946
  story: story,
1626
1947
  basePath: basePath
1627
- }, otherProps)))))))));
1948
+ }, otherProps))))))))));
1628
1949
  return withoutRouter ? content : /*#__PURE__*/React__default["default"].createElement(Router, {
1629
1950
  basename: !memoryRouter ? basePath : null
1630
1951
  }, /*#__PURE__*/React__default["default"].createElement(contexts.RoutesProvider, {