@micromag/screen-image-360 0.3.77 → 0.3.78

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.
@@ -0,0 +1 @@
1
+ .micromag-screen-image-360-container .micromag-screen-image-360-canvasButton{display:inline-block;position:relative;padding:0;border:0;background:rgba(0,0,0,0);color:inherit;font-family:inherit;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none}.micromag-screen-image-360-container .micromag-screen-image-360-canvas,.micromag-screen-image-360-container .micromag-screen-image-360-canvasButton,.micromag-screen-image-360-container .micromag-screen-image-360-content,.micromag-screen-image-360-container .micromag-screen-image-360-placeholder,.micromag-screen-image-360-container .micromag-screen-image-360-video{position:absolute;top:0;left:0;width:100%;height:100%}.micromag-screen-image-360-container{position:relative;width:100%;height:100%;overflow:hidden}.micromag-screen-image-360-disabled.micromag-screen-image-360-container{overflow:hidden;pointer-events:none}.micromag-screen-image-360-hidden.micromag-screen-image-360-container{display:none;visibility:hidden}.micromag-screen-image-360-placeholder.micromag-screen-image-360-container .micromag-screen-image-360-content{position:relative;padding:6px}.micromag-screen-image-360-container .micromag-screen-image-360-empty{margin:5px auto;border:2px dashed #343434;color:#343434;height:100%;margin:0}.micromag-screen-image-360-container .micromag-screen-image-360-canvasButton{-ms-touch-action:none;touch-action:none}.micromag-screen-image-360-container .micromag-screen-image-360-videoContainer{position:absolute}.micromag-screen-image-360-container .micromag-screen-image-360-video{visibility:hidden}.micromag-screen-image-360-container .micromag-screen-image-360-video video{height:100%}.micromag-screen-image-360-container .micromag-screen-image-360-mediaControls{padding:10px 20px 20px}.micromag-screen-image-360-container .micromag-screen-image-360-placeholder{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;height:100%}.micromag-screen-image-360-container .micromag-screen-image-360-bottomContent{position:absolute;bottom:0;width:100%}.micromag-screen-image-360-container.micromag-screen-image-360-showVideo .micromag-screen-image-360-video{visibility:visible}
package/es/index.js ADDED
@@ -0,0 +1,568 @@
1
+ import { FormattedMessage, defineMessage } from 'react-intl';
2
+ import _defineProperty from '@babel/runtime/helpers/defineProperty';
3
+ import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
4
+ import { getSizeWithinBounds } from '@folklore/size';
5
+ import classNames from 'classnames';
6
+ import PropTypes from 'prop-types';
7
+ import React, { useState, useEffect, useRef, useCallback } from 'react';
8
+ import 'whatwg-fetch';
9
+ import { PropTypes as PropTypes$1 } from '@micromag/core';
10
+ import { ScreenElement, PlaceholderVideo360, Transitions } from '@micromag/core/components';
11
+ import { useScreenSize, useScreenRenderContext } from '@micromag/core/contexts';
12
+ import { useTrackScreenEvent, useAnimationFrame } from '@micromag/core/hooks';
13
+ import Background from '@micromag/element-background';
14
+ import CallToAction from '@micromag/element-call-to-action';
15
+ import Container from '@micromag/element-container';
16
+ import Image from '@micromag/element-image';
17
+ import _objectSpread from '@babel/runtime/helpers/objectSpread2';
18
+ import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
19
+ import { Video, Container as Container$1 } from '@micromag/transforms/apple-news';
20
+
21
+ var styles = {"container":"micromag-screen-image-360-container","canvasButton":"micromag-screen-image-360-canvasButton","canvas":"micromag-screen-image-360-canvas","content":"micromag-screen-image-360-content","placeholder":"micromag-screen-image-360-placeholder","video":"micromag-screen-image-360-video","disabled":"micromag-screen-image-360-disabled","hidden":"micromag-screen-image-360-hidden","empty":"micromag-screen-image-360-empty","videoContainer":"micromag-screen-image-360-videoContainer","mediaControls":"micromag-screen-image-360-mediaControls","bottomContent":"micromag-screen-image-360-bottomContent","showVideo":"micromag-screen-image-360-showVideo"};
22
+
23
+ /**
24
+ * Locale loader
25
+ */
26
+
27
+ var packageCache = null;
28
+
29
+ var useThree = function useThree() {
30
+ // transport
31
+ var _useState = useState({
32
+ "package": packageCache
33
+ }),
34
+ _useState2 = _slicedToArray(_useState, 2),
35
+ loadedPackage = _useState2[0]["package"],
36
+ setLoadedPackage = _useState2[1];
37
+
38
+ useEffect(function () {
39
+ var canceled = false;
40
+
41
+ if (loadedPackage !== null) {
42
+ return function () {
43
+ canceled = true;
44
+ };
45
+ }
46
+
47
+ import('three').then(function (_ref) {
48
+ var Scene = _ref.Scene,
49
+ PerspectiveCamera = _ref.PerspectiveCamera,
50
+ SphereBufferGeometry = _ref.SphereBufferGeometry,
51
+ VideoTexture = _ref.VideoTexture,
52
+ TextureLoader = _ref.TextureLoader,
53
+ MeshBasicMaterial = _ref.MeshBasicMaterial,
54
+ Mesh = _ref.Mesh,
55
+ WebGLRenderer = _ref.WebGLRenderer,
56
+ MathUtils = _ref.MathUtils;
57
+ packageCache = {
58
+ Scene: Scene,
59
+ PerspectiveCamera: PerspectiveCamera,
60
+ SphereBufferGeometry: SphereBufferGeometry,
61
+ VideoTexture: VideoTexture,
62
+ TextureLoader: TextureLoader,
63
+ MeshBasicMaterial: MeshBasicMaterial,
64
+ Mesh: Mesh,
65
+ WebGLRenderer: WebGLRenderer,
66
+ MathUtils: MathUtils
67
+ };
68
+
69
+ if (!canceled) {
70
+ setLoadedPackage({
71
+ "package": packageCache
72
+ });
73
+ }
74
+ });
75
+ return function () {
76
+ canceled = true;
77
+ };
78
+ }, [loadedPackage, setLoadedPackage]);
79
+ return loadedPackage;
80
+ };
81
+
82
+ var propTypes = {
83
+ layout: PropTypes.oneOf(['full']),
84
+ image: PropTypes$1.imageMedia,
85
+ background: PropTypes$1.backgroundElement,
86
+ callToAction: PropTypes$1.callToAction,
87
+ current: PropTypes.bool,
88
+ active: PropTypes.bool,
89
+ transitions: PropTypes$1.transitions,
90
+ onPrevious: PropTypes.func,
91
+ onNext: PropTypes.func,
92
+ type: PropTypes.string,
93
+ spacing: PropTypes.number,
94
+ className: PropTypes.string
95
+ };
96
+ var defaultProps = {
97
+ layout: 'full',
98
+ image: null,
99
+ background: null,
100
+ callToAction: null,
101
+ current: true,
102
+ active: true,
103
+ transitions: null,
104
+ onPrevious: null,
105
+ onNext: null,
106
+ type: null,
107
+ spacing: 20,
108
+ className: null
109
+ };
110
+
111
+ var Image360Screen = function Image360Screen(_ref) {
112
+ var _ref6;
113
+
114
+ _ref.layout;
115
+ var image = _ref.image,
116
+ background = _ref.background,
117
+ callToAction = _ref.callToAction,
118
+ current = _ref.current,
119
+ active = _ref.active,
120
+ transitions = _ref.transitions,
121
+ onPrevious = _ref.onPrevious,
122
+ onNext = _ref.onNext,
123
+ type = _ref.type,
124
+ spacing = _ref.spacing,
125
+ className = _ref.className;
126
+ var THREE = useThree();
127
+ var trackScreenEvent = useTrackScreenEvent(type);
128
+
129
+ var _useScreenSize = useScreenSize(),
130
+ width = _useScreenSize.width,
131
+ height = _useScreenSize.height,
132
+ landscape = _useScreenSize.landscape,
133
+ resolution = _useScreenSize.resolution;
134
+
135
+ var _useScreenRenderConte = useScreenRenderContext(),
136
+ isView = _useScreenRenderConte.isView,
137
+ isPreview = _useScreenRenderConte.isPreview,
138
+ isPlaceholder = _useScreenRenderConte.isPlaceholder,
139
+ isEdit = _useScreenRenderConte.isEdit,
140
+ isStatic = _useScreenRenderConte.isStatic,
141
+ isCapture = _useScreenRenderConte.isCapture;
142
+
143
+ var backgroundPlaying = current && (isView || isEdit);
144
+ var backgroundShouldLoad = current || active || !isView;
145
+ var canvasContainerRef = useRef(); // ------------------------------------
146
+
147
+ var hasMedia = image !== null;
148
+
149
+ var _useState = useState(!hasMedia),
150
+ _useState2 = _slicedToArray(_useState, 2),
151
+ ready = _useState2[0],
152
+ setReady = _useState2[1];
153
+
154
+ var transitionPlaying = current && ready;
155
+ var transitionDisabled = isStatic || isCapture || isPlaceholder || isPreview || isEdit;
156
+
157
+ var _ref2 = image || {},
158
+ _ref2$metadata = _ref2.metadata,
159
+ imageMetadata = _ref2$metadata === void 0 ? null : _ref2$metadata,
160
+ _ref2$url = _ref2.url,
161
+ imageUrl = _ref2$url === void 0 ? null : _ref2$url,
162
+ _ref2$thumbnail_url = _ref2.thumbnail_url,
163
+ thumbnailUrl = _ref2$thumbnail_url === void 0 ? null : _ref2$thumbnail_url;
164
+
165
+ var hasMediaUrl = imageUrl !== null;
166
+
167
+ var _ref3 = imageMetadata || {},
168
+ _ref3$width = _ref3.width,
169
+ imageWidth = _ref3$width === void 0 ? 0 : _ref3$width,
170
+ _ref3$height = _ref3.height,
171
+ imageHeight = _ref3$height === void 0 ? 0 : _ref3$height;
172
+
173
+ var hasThumbnail = thumbnailUrl !== null;
174
+
175
+ var _useState3 = useState(!hasThumbnail),
176
+ _useState4 = _slicedToArray(_useState3, 2),
177
+ posterReady = _useState4[0],
178
+ setPosterReady = _useState4[1];
179
+
180
+ var withSphere = hasMediaUrl && (isView || isEdit) && !isCapture && !isStatic;
181
+
182
+ var _getSizeWithinBounds = getSizeWithinBounds(imageWidth, imageHeight, width, height, {
183
+ cover: true
184
+ }),
185
+ resizedImageWidth = _getSizeWithinBounds.width,
186
+ resizedImageHeight = _getSizeWithinBounds.height;
187
+
188
+ var resizedImageLeft = -(resizedImageWidth - width) / 2;
189
+ var resizedImageTop = -(resizedImageHeight - height) / 2;
190
+ useEffect(function () {
191
+ setReady(!hasMediaUrl);
192
+ }, [imageUrl, hasMediaUrl, setReady]);
193
+ useEffect(function () {
194
+ setPosterReady(!hasThumbnail);
195
+ }, [thumbnailUrl, hasThumbnail, setPosterReady]); // 3D layer --------------------------
196
+
197
+ var canvasRef = useRef(null);
198
+ var camera = useRef(null);
199
+ var scene = useRef(null);
200
+ var renderer = useRef(null);
201
+ var lon = useRef(0);
202
+ var lat = useRef(0);
203
+ var phi = useRef(0);
204
+ var theta = useRef(0);
205
+ useRef(50);
206
+ var pointerDown = useRef(false);
207
+ var pointerDownX = useRef(0);
208
+ var pointerDownY = useRef(0);
209
+ var pointerLon = useRef(0);
210
+ var pointerLat = useRef(0); // render 3D frame
211
+
212
+ var render3D = useCallback(function () {
213
+ if (THREE === null) {
214
+ return;
215
+ }
216
+
217
+ THREE.MathUtils; // lat.current = Math.max(-85, Math.min(85, lat.current));
218
+ // phi.current = MathUtils.degToRad(90 - lat.current);
219
+ // theta.current = MathUtils.degToRad(lon.current);
220
+ // camera.current.position.x =
221
+ // distance.current * Math.sin(phi.current) * Math.cos(theta.current);
222
+ // camera.current.position.y = distance.current * Math.cos(phi.current);
223
+ // camera.current.position.z =
224
+ // distance.current * Math.sin(phi.current) * Math.sin(theta.current);
225
+ // camera.current.lookAt(0, 0, 0);
226
+
227
+ lat.current = Math.max(-85, Math.min(85, lat.current));
228
+ phi.current = THREE.MathUtils.degToRad(90 - lat.current);
229
+ theta.current = THREE.MathUtils.degToRad(lon.current);
230
+ var x = 500 * Math.sin(phi.current) * Math.cos(theta.current);
231
+ var y = 500 * Math.cos(phi.current);
232
+ var z = 500 * Math.sin(phi.current) * Math.sin(theta.current);
233
+ camera.current.lookAt(x, y, z);
234
+ renderer.current.render(scene.current, camera.current);
235
+ }, [THREE]); // Init 3D layer
236
+
237
+ useEffect(function () {
238
+ if (THREE !== null && hasMediaUrl && withSphere) {
239
+ var Scene = THREE.Scene,
240
+ PerspectiveCamera = THREE.PerspectiveCamera,
241
+ SphereBufferGeometry = THREE.SphereBufferGeometry,
242
+ MeshBasicMaterial = THREE.MeshBasicMaterial,
243
+ Mesh = THREE.Mesh,
244
+ WebGLRenderer = THREE.WebGLRenderer,
245
+ TextureLoader = THREE.TextureLoader;
246
+ var _canvasRef$current = canvasRef.current,
247
+ canvasWidth = _canvasRef$current.offsetWidth,
248
+ canvasHeight = _canvasRef$current.offsetHeight;
249
+ camera.current = new PerspectiveCamera(50, canvasWidth / canvasHeight, 1, 1100);
250
+ scene.current = new Scene();
251
+ var geometry = new SphereBufferGeometry(500, 60, 40, 0, Math.PI * 2, Math.PI / 3, Math.PI / 3);
252
+ geometry.scale(-1, 1, 1);
253
+ var texture = new TextureLoader().load(imageUrl);
254
+ var material = new MeshBasicMaterial({
255
+ map: texture
256
+ });
257
+ var mesh = new Mesh(geometry, material);
258
+ scene.current.add(mesh);
259
+ renderer.current = new WebGLRenderer({
260
+ canvas: canvasRef.current
261
+ });
262
+ renderer.current.setPixelRatio(typeof window !== 'undefined' ? window.devicePixelRatio : 1);
263
+ renderer.current.setSize(canvasWidth, canvasHeight);
264
+ render3D();
265
+ }
266
+
267
+ return function () {
268
+ if (withSphere) {
269
+ camera.current = null;
270
+ scene.current = null;
271
+ renderer.current = null;
272
+ }
273
+ };
274
+ }, [hasMediaUrl, withSphere, render3D, THREE]);
275
+ useAnimationFrame(render3D, {
276
+ disabled: !withSphere || THREE === null
277
+ }); // Resize 3D layer
278
+
279
+ useEffect(function () {
280
+ if (camera.current !== null && renderer.current !== null) {
281
+ camera.current.aspect = width / height;
282
+ camera.current.updateProjectionMatrix();
283
+ renderer.current.setSize(width, height);
284
+ }
285
+ }, [width, height]); // Pointer interaction
286
+
287
+ var togglePlayTimeout = useRef(null);
288
+ var onPointerDown = useCallback(function (e) {
289
+ pointerDown.current = true;
290
+ pointerDownX.current = e.clientX;
291
+ pointerDownY.current = e.clientY;
292
+ pointerLon.current = lon.current;
293
+ pointerLat.current = lat.current;
294
+ }, []);
295
+ var pixelsMoved = useRef(0);
296
+ var lastPointerClient = useRef(null);
297
+ var pixelsMovedTracked = useRef(false);
298
+ var onPointerMove = useCallback(function (e) {
299
+ if (pointerDown.current) {
300
+ var _ref4 = e || {},
301
+ _ref4$clientX = _ref4.clientX,
302
+ clientX = _ref4$clientX === void 0 ? null : _ref4$clientX,
303
+ _ref4$clientY = _ref4.clientY,
304
+ clientY = _ref4$clientY === void 0 ? null : _ref4$clientY;
305
+
306
+ var downDeltaX = pointerDownX.current - clientX;
307
+ var downDeltaY = pointerDownY.current - clientY;
308
+ lon.current = downDeltaX * 0.2 + pointerLon.current;
309
+ lat.current = downDeltaY * 0.2 + pointerLat.current;
310
+
311
+ var _ref5 = lastPointerClient.current || {},
312
+ _ref5$x = _ref5.x,
313
+ lastX = _ref5$x === void 0 ? clientX : _ref5$x,
314
+ _ref5$y = _ref5.y,
315
+ lastY = _ref5$y === void 0 ? clientY : _ref5$y;
316
+
317
+ var deltaX = Math.abs(lastX - clientX) || 0;
318
+ var deltaY = Math.abs(lastY - clientY) || 0;
319
+ pixelsMoved.current += deltaX + deltaY;
320
+
321
+ if (!pixelsMovedTracked.current && pixelsMoved.current > Math.min(width, height)) {
322
+ trackScreenEvent('drag_sphere');
323
+ pixelsMovedTracked.current = true;
324
+ }
325
+
326
+ lastPointerClient.current = {
327
+ x: clientX,
328
+ y: clientY
329
+ };
330
+
331
+ if (Math.abs(downDeltaX) > 3 || Math.abs(downDeltaY) > 3) {
332
+ if (togglePlayTimeout.current !== null) {
333
+ clearTimeout(togglePlayTimeout.current);
334
+ togglePlayTimeout.current = null;
335
+ }
336
+ }
337
+ }
338
+ }, [width, height, trackScreenEvent]);
339
+ var onPointerUp = useCallback(function (e) {
340
+ var canvasContainer = canvasContainerRef.current;
341
+
342
+ if (pointerDown.current && canvasContainer !== null) {
343
+ var distX = Math.abs(pointerDownX.current - e.clientX);
344
+ var distY = Math.abs(pointerDownY.current - e.clientY);
345
+ var pixelsMovedTolerance = 3;
346
+ var tapNextScreenWidthPercent = 0.5;
347
+ var canTapToNavigate = !landscape && togglePlayTimeout.current !== null;
348
+ var validNavigateTap = canTapToNavigate && distX < pixelsMovedTolerance && distY < pixelsMovedTolerance;
349
+
350
+ if (validNavigateTap) {
351
+ var _canvasContainer$getB = canvasContainer.getBoundingClientRect(),
352
+ _canvasContainer$getB2 = _canvasContainer$getB.left,
353
+ containerX = _canvasContainer$getB2 === void 0 ? 0 : _canvasContainer$getB2,
354
+ containerWidth = _canvasContainer$getB.width;
355
+
356
+ var hasTappedLeft = e.clientX - containerX < containerWidth * (1 - tapNextScreenWidthPercent);
357
+
358
+ if (hasTappedLeft) {
359
+ if (onPrevious !== null) {
360
+ onPrevious();
361
+ }
362
+ } else if (onNext !== null) {
363
+ onNext();
364
+ }
365
+ }
366
+
367
+ if (togglePlayTimeout.current !== null) {
368
+ clearTimeout(togglePlayTimeout.current);
369
+ togglePlayTimeout.current = null;
370
+ }
371
+ }
372
+
373
+ pointerDown.current = false;
374
+ }, [onPrevious, onNext, landscape]);
375
+ var hasCallToAction = callToAction !== null && callToAction.active === true; // Building elements ------------------
376
+
377
+ var items = [/*#__PURE__*/React.createElement(ScreenElement, {
378
+ key: "video",
379
+ placeholder: /*#__PURE__*/React.createElement(PlaceholderVideo360, {
380
+ className: styles.placeholder,
381
+ width: "100%",
382
+ height: "100%"
383
+ }),
384
+ emptyClassName: styles.empty,
385
+ emptyLabel: /*#__PURE__*/React.createElement(FormattedMessage, {
386
+ id: "/YQ+xP",
387
+ defaultMessage: [{
388
+ "type": 0,
389
+ "value": "Image 360"
390
+ }]
391
+ }),
392
+ isEmpty: !withSphere
393
+ }, /*#__PURE__*/React.createElement(Transitions, {
394
+ playing: transitionPlaying,
395
+ transitions: transitions,
396
+ disabled: transitionDisabled,
397
+ fullscreen: true
398
+ }, withSphere ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("canvas", {
399
+ ref: canvasRef,
400
+ className: styles.canvas
401
+ }), /*#__PURE__*/React.createElement("button", {
402
+ className: styles.canvasButton,
403
+ type: "button",
404
+ "aria-label": "canvas-interaction",
405
+ onPointerDown: onPointerDown,
406
+ onPointerMove: onPointerMove,
407
+ onPointerUp: onPointerUp,
408
+ tabIndex: current && isView ? null : '-1'
409
+ })) : /*#__PURE__*/React.createElement("div", {
410
+ className: styles.videoContainer,
411
+ style: {
412
+ width: resizedImageWidth,
413
+ height: resizedImageHeight,
414
+ left: resizedImageLeft,
415
+ top: resizedImageTop
416
+ }
417
+ }, /*#__PURE__*/React.createElement(Image, {
418
+ className: styles.video,
419
+ media: {
420
+ url: thumbnailUrl,
421
+ metadata: {
422
+ width: imageWidth,
423
+ height: imageHeight
424
+ }
425
+ },
426
+ width: resizedImageWidth,
427
+ height: resizedImageHeight,
428
+ resolution: resolution
429
+ })))), !isPlaceholder ? /*#__PURE__*/React.createElement("div", {
430
+ key: "bottom-content",
431
+ className: styles.bottomContent
432
+ }, /*#__PURE__*/React.createElement(Transitions, {
433
+ playing: transitionPlaying,
434
+ transitions: transitions,
435
+ disabled: transitionDisabled
436
+ }, hasCallToAction ? /*#__PURE__*/React.createElement("div", {
437
+ style: {
438
+ marginTop: -spacing / 2
439
+ }
440
+ }, /*#__PURE__*/React.createElement(CallToAction, {
441
+ callToAction: callToAction,
442
+ animationDisabled: isPreview,
443
+ focusable: current && isView,
444
+ screenSize: {
445
+ width: width,
446
+ height: height
447
+ }
448
+ })) : null)) : null];
449
+ return /*#__PURE__*/React.createElement("div", {
450
+ className: classNames([styles.container, (_ref6 = {}, _defineProperty(_ref6, className, className !== null), _defineProperty(_ref6, styles.showVideo, isPreview || isStatic || isCapture), _ref6)]),
451
+ "data-screen-ready": (isStatic || isCapture) && posterReady || ready
452
+ }, !isPlaceholder ? /*#__PURE__*/React.createElement(Background, {
453
+ background: background,
454
+ width: width,
455
+ height: height,
456
+ resolution: resolution,
457
+ playing: backgroundPlaying,
458
+ shouldLoad: backgroundShouldLoad
459
+ }) : null, /*#__PURE__*/React.createElement(Container, {
460
+ width: width,
461
+ height: height
462
+ }, /*#__PURE__*/React.createElement("div", {
463
+ ref: canvasContainerRef,
464
+ className: styles.videoContainer,
465
+ style: {
466
+ width: resizedImageWidth,
467
+ height: resizedImageHeight,
468
+ left: resizedImageLeft,
469
+ top: resizedImageTop
470
+ }
471
+ }), /*#__PURE__*/React.createElement("div", {
472
+ className: styles.content
473
+ }, items)));
474
+ };
475
+
476
+ Image360Screen.propTypes = propTypes;
477
+ Image360Screen.defaultProps = defaultProps;
478
+ var Image360Screen$1 = /*#__PURE__*/React.memo(Image360Screen);
479
+
480
+ var transform = function transform(newStory, _ref) {
481
+ var video = _ref.video;
482
+
483
+ var _ref2 = video || {},
484
+ _ref2$media = _ref2.media,
485
+ media = _ref2$media === void 0 ? null : _ref2$media;
486
+
487
+ var _Video = Video(newStory, media),
488
+ titleStory = _Video.story,
489
+ titleComponent = _Video.component;
490
+
491
+ var _Container = Container$1(titleStory, _toConsumableArray(titleComponent ? [titleComponent] : [])),
492
+ containerStory = _Container.story,
493
+ containerComponent = _Container.component;
494
+
495
+ return _objectSpread(_objectSpread({}, containerStory), {}, {
496
+ components: [].concat(_toConsumableArray(newStory.components || []), _toConsumableArray(containerComponent ? [containerComponent] : []))
497
+ });
498
+ };
499
+
500
+ // eslint-disable-next-line
501
+
502
+ var transforms = /*#__PURE__*/Object.freeze({
503
+ __proto__: null,
504
+ appleNews: transform
505
+ });
506
+
507
+ var definition = {
508
+ id: 'video-360',
509
+ type: 'screen',
510
+ group: {
511
+ label: defineMessage({
512
+ id: "+9akmg",
513
+ defaultMessage: [{
514
+ "type": 0,
515
+ "value": "Audio and Video"
516
+ }]
517
+ }),
518
+ order: 5
519
+ },
520
+ title: defineMessage({
521
+ id: "GRVidW",
522
+ defaultMessage: [{
523
+ "type": 0,
524
+ "value": "360 Video"
525
+ }]
526
+ }),
527
+ component: Image360Screen$1,
528
+ layouts: ['full'],
529
+ transforms: transforms,
530
+ fields: [{
531
+ name: 'video',
532
+ type: 'video-element',
533
+ theme: {
534
+ color: 'primary'
535
+ },
536
+ defaultValue: {
537
+ autoPlay: true
538
+ },
539
+ label: defineMessage({
540
+ id: "tvl2Zc",
541
+ defaultMessage: [{
542
+ "type": 0,
543
+ "value": "Video"
544
+ }]
545
+ })
546
+ }, {
547
+ name: 'background',
548
+ type: 'background',
549
+ label: defineMessage({
550
+ id: "+MPZRu",
551
+ defaultMessage: [{
552
+ "type": 0,
553
+ "value": "Background"
554
+ }]
555
+ })
556
+ }, {
557
+ name: 'callToAction',
558
+ type: 'call-to-action',
559
+ theme: {
560
+ boxStyle: 'cta',
561
+ label: {
562
+ textStyle: 'cta'
563
+ }
564
+ }
565
+ }]
566
+ };
567
+
568
+ export { Image360Screen$1 as Image360Screen, definition as default };
package/lib/index.js ADDED
@@ -0,0 +1,605 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var reactIntl = require('react-intl');
6
+ var _defineProperty = require('@babel/runtime/helpers/defineProperty');
7
+ var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
8
+ var size = require('@folklore/size');
9
+ var classNames = require('classnames');
10
+ var PropTypes = require('prop-types');
11
+ var React = require('react');
12
+ require('whatwg-fetch');
13
+ var core = require('@micromag/core');
14
+ var components = require('@micromag/core/components');
15
+ var contexts = require('@micromag/core/contexts');
16
+ var hooks = require('@micromag/core/hooks');
17
+ var Background = require('@micromag/element-background');
18
+ var CallToAction = require('@micromag/element-call-to-action');
19
+ var Container = require('@micromag/element-container');
20
+ var Image = require('@micromag/element-image');
21
+ var _objectSpread = require('@babel/runtime/helpers/objectSpread2');
22
+ var _toConsumableArray = require('@babel/runtime/helpers/toConsumableArray');
23
+ var appleNews = require('@micromag/transforms/apple-news');
24
+
25
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
26
+
27
+ function _interopNamespace(e) {
28
+ if (e && e.__esModule) return e;
29
+ var n = Object.create(null);
30
+ if (e) {
31
+ Object.keys(e).forEach(function (k) {
32
+ if (k !== 'default') {
33
+ var d = Object.getOwnPropertyDescriptor(e, k);
34
+ Object.defineProperty(n, k, d.get ? d : {
35
+ enumerable: true,
36
+ get: function () { return e[k]; }
37
+ });
38
+ }
39
+ });
40
+ }
41
+ n["default"] = e;
42
+ return Object.freeze(n);
43
+ }
44
+
45
+ var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty);
46
+ var _slicedToArray__default = /*#__PURE__*/_interopDefaultLegacy(_slicedToArray);
47
+ var classNames__default = /*#__PURE__*/_interopDefaultLegacy(classNames);
48
+ var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes);
49
+ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
50
+ var Background__default = /*#__PURE__*/_interopDefaultLegacy(Background);
51
+ var CallToAction__default = /*#__PURE__*/_interopDefaultLegacy(CallToAction);
52
+ var Container__default = /*#__PURE__*/_interopDefaultLegacy(Container);
53
+ var Image__default = /*#__PURE__*/_interopDefaultLegacy(Image);
54
+ var _objectSpread__default = /*#__PURE__*/_interopDefaultLegacy(_objectSpread);
55
+ var _toConsumableArray__default = /*#__PURE__*/_interopDefaultLegacy(_toConsumableArray);
56
+
57
+ var styles = {"container":"micromag-screen-image-360-container","canvasButton":"micromag-screen-image-360-canvasButton","canvas":"micromag-screen-image-360-canvas","content":"micromag-screen-image-360-content","placeholder":"micromag-screen-image-360-placeholder","video":"micromag-screen-image-360-video","disabled":"micromag-screen-image-360-disabled","hidden":"micromag-screen-image-360-hidden","empty":"micromag-screen-image-360-empty","videoContainer":"micromag-screen-image-360-videoContainer","mediaControls":"micromag-screen-image-360-mediaControls","bottomContent":"micromag-screen-image-360-bottomContent","showVideo":"micromag-screen-image-360-showVideo"};
58
+
59
+ /**
60
+ * Locale loader
61
+ */
62
+
63
+ var packageCache = null;
64
+
65
+ var useThree = function useThree() {
66
+ // transport
67
+ var _useState = React.useState({
68
+ "package": packageCache
69
+ }),
70
+ _useState2 = _slicedToArray__default["default"](_useState, 2),
71
+ loadedPackage = _useState2[0]["package"],
72
+ setLoadedPackage = _useState2[1];
73
+
74
+ React.useEffect(function () {
75
+ var canceled = false;
76
+
77
+ if (loadedPackage !== null) {
78
+ return function () {
79
+ canceled = true;
80
+ };
81
+ }
82
+
83
+ Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require('three')); }).then(function (_ref) {
84
+ var Scene = _ref.Scene,
85
+ PerspectiveCamera = _ref.PerspectiveCamera,
86
+ SphereBufferGeometry = _ref.SphereBufferGeometry,
87
+ VideoTexture = _ref.VideoTexture,
88
+ TextureLoader = _ref.TextureLoader,
89
+ MeshBasicMaterial = _ref.MeshBasicMaterial,
90
+ Mesh = _ref.Mesh,
91
+ WebGLRenderer = _ref.WebGLRenderer,
92
+ MathUtils = _ref.MathUtils;
93
+ packageCache = {
94
+ Scene: Scene,
95
+ PerspectiveCamera: PerspectiveCamera,
96
+ SphereBufferGeometry: SphereBufferGeometry,
97
+ VideoTexture: VideoTexture,
98
+ TextureLoader: TextureLoader,
99
+ MeshBasicMaterial: MeshBasicMaterial,
100
+ Mesh: Mesh,
101
+ WebGLRenderer: WebGLRenderer,
102
+ MathUtils: MathUtils
103
+ };
104
+
105
+ if (!canceled) {
106
+ setLoadedPackage({
107
+ "package": packageCache
108
+ });
109
+ }
110
+ });
111
+ return function () {
112
+ canceled = true;
113
+ };
114
+ }, [loadedPackage, setLoadedPackage]);
115
+ return loadedPackage;
116
+ };
117
+
118
+ var propTypes = {
119
+ layout: PropTypes__default["default"].oneOf(['full']),
120
+ image: core.PropTypes.imageMedia,
121
+ background: core.PropTypes.backgroundElement,
122
+ callToAction: core.PropTypes.callToAction,
123
+ current: PropTypes__default["default"].bool,
124
+ active: PropTypes__default["default"].bool,
125
+ transitions: core.PropTypes.transitions,
126
+ onPrevious: PropTypes__default["default"].func,
127
+ onNext: PropTypes__default["default"].func,
128
+ type: PropTypes__default["default"].string,
129
+ spacing: PropTypes__default["default"].number,
130
+ className: PropTypes__default["default"].string
131
+ };
132
+ var defaultProps = {
133
+ layout: 'full',
134
+ image: null,
135
+ background: null,
136
+ callToAction: null,
137
+ current: true,
138
+ active: true,
139
+ transitions: null,
140
+ onPrevious: null,
141
+ onNext: null,
142
+ type: null,
143
+ spacing: 20,
144
+ className: null
145
+ };
146
+
147
+ var Image360Screen = function Image360Screen(_ref) {
148
+ var _ref6;
149
+
150
+ _ref.layout;
151
+ var image = _ref.image,
152
+ background = _ref.background,
153
+ callToAction = _ref.callToAction,
154
+ current = _ref.current,
155
+ active = _ref.active,
156
+ transitions = _ref.transitions,
157
+ onPrevious = _ref.onPrevious,
158
+ onNext = _ref.onNext,
159
+ type = _ref.type,
160
+ spacing = _ref.spacing,
161
+ className = _ref.className;
162
+ var THREE = useThree();
163
+ var trackScreenEvent = hooks.useTrackScreenEvent(type);
164
+
165
+ var _useScreenSize = contexts.useScreenSize(),
166
+ width = _useScreenSize.width,
167
+ height = _useScreenSize.height,
168
+ landscape = _useScreenSize.landscape,
169
+ resolution = _useScreenSize.resolution;
170
+
171
+ var _useScreenRenderConte = contexts.useScreenRenderContext(),
172
+ isView = _useScreenRenderConte.isView,
173
+ isPreview = _useScreenRenderConte.isPreview,
174
+ isPlaceholder = _useScreenRenderConte.isPlaceholder,
175
+ isEdit = _useScreenRenderConte.isEdit,
176
+ isStatic = _useScreenRenderConte.isStatic,
177
+ isCapture = _useScreenRenderConte.isCapture;
178
+
179
+ var backgroundPlaying = current && (isView || isEdit);
180
+ var backgroundShouldLoad = current || active || !isView;
181
+ var canvasContainerRef = React.useRef(); // ------------------------------------
182
+
183
+ var hasMedia = image !== null;
184
+
185
+ var _useState = React.useState(!hasMedia),
186
+ _useState2 = _slicedToArray__default["default"](_useState, 2),
187
+ ready = _useState2[0],
188
+ setReady = _useState2[1];
189
+
190
+ var transitionPlaying = current && ready;
191
+ var transitionDisabled = isStatic || isCapture || isPlaceholder || isPreview || isEdit;
192
+
193
+ var _ref2 = image || {},
194
+ _ref2$metadata = _ref2.metadata,
195
+ imageMetadata = _ref2$metadata === void 0 ? null : _ref2$metadata,
196
+ _ref2$url = _ref2.url,
197
+ imageUrl = _ref2$url === void 0 ? null : _ref2$url,
198
+ _ref2$thumbnail_url = _ref2.thumbnail_url,
199
+ thumbnailUrl = _ref2$thumbnail_url === void 0 ? null : _ref2$thumbnail_url;
200
+
201
+ var hasMediaUrl = imageUrl !== null;
202
+
203
+ var _ref3 = imageMetadata || {},
204
+ _ref3$width = _ref3.width,
205
+ imageWidth = _ref3$width === void 0 ? 0 : _ref3$width,
206
+ _ref3$height = _ref3.height,
207
+ imageHeight = _ref3$height === void 0 ? 0 : _ref3$height;
208
+
209
+ var hasThumbnail = thumbnailUrl !== null;
210
+
211
+ var _useState3 = React.useState(!hasThumbnail),
212
+ _useState4 = _slicedToArray__default["default"](_useState3, 2),
213
+ posterReady = _useState4[0],
214
+ setPosterReady = _useState4[1];
215
+
216
+ var withSphere = hasMediaUrl && (isView || isEdit) && !isCapture && !isStatic;
217
+
218
+ var _getSizeWithinBounds = size.getSizeWithinBounds(imageWidth, imageHeight, width, height, {
219
+ cover: true
220
+ }),
221
+ resizedImageWidth = _getSizeWithinBounds.width,
222
+ resizedImageHeight = _getSizeWithinBounds.height;
223
+
224
+ var resizedImageLeft = -(resizedImageWidth - width) / 2;
225
+ var resizedImageTop = -(resizedImageHeight - height) / 2;
226
+ React.useEffect(function () {
227
+ setReady(!hasMediaUrl);
228
+ }, [imageUrl, hasMediaUrl, setReady]);
229
+ React.useEffect(function () {
230
+ setPosterReady(!hasThumbnail);
231
+ }, [thumbnailUrl, hasThumbnail, setPosterReady]); // 3D layer --------------------------
232
+
233
+ var canvasRef = React.useRef(null);
234
+ var camera = React.useRef(null);
235
+ var scene = React.useRef(null);
236
+ var renderer = React.useRef(null);
237
+ var lon = React.useRef(0);
238
+ var lat = React.useRef(0);
239
+ var phi = React.useRef(0);
240
+ var theta = React.useRef(0);
241
+ React.useRef(50);
242
+ var pointerDown = React.useRef(false);
243
+ var pointerDownX = React.useRef(0);
244
+ var pointerDownY = React.useRef(0);
245
+ var pointerLon = React.useRef(0);
246
+ var pointerLat = React.useRef(0); // render 3D frame
247
+
248
+ var render3D = React.useCallback(function () {
249
+ if (THREE === null) {
250
+ return;
251
+ }
252
+
253
+ THREE.MathUtils; // lat.current = Math.max(-85, Math.min(85, lat.current));
254
+ // phi.current = MathUtils.degToRad(90 - lat.current);
255
+ // theta.current = MathUtils.degToRad(lon.current);
256
+ // camera.current.position.x =
257
+ // distance.current * Math.sin(phi.current) * Math.cos(theta.current);
258
+ // camera.current.position.y = distance.current * Math.cos(phi.current);
259
+ // camera.current.position.z =
260
+ // distance.current * Math.sin(phi.current) * Math.sin(theta.current);
261
+ // camera.current.lookAt(0, 0, 0);
262
+
263
+ lat.current = Math.max(-85, Math.min(85, lat.current));
264
+ phi.current = THREE.MathUtils.degToRad(90 - lat.current);
265
+ theta.current = THREE.MathUtils.degToRad(lon.current);
266
+ var x = 500 * Math.sin(phi.current) * Math.cos(theta.current);
267
+ var y = 500 * Math.cos(phi.current);
268
+ var z = 500 * Math.sin(phi.current) * Math.sin(theta.current);
269
+ camera.current.lookAt(x, y, z);
270
+ renderer.current.render(scene.current, camera.current);
271
+ }, [THREE]); // Init 3D layer
272
+
273
+ React.useEffect(function () {
274
+ if (THREE !== null && hasMediaUrl && withSphere) {
275
+ var Scene = THREE.Scene,
276
+ PerspectiveCamera = THREE.PerspectiveCamera,
277
+ SphereBufferGeometry = THREE.SphereBufferGeometry,
278
+ MeshBasicMaterial = THREE.MeshBasicMaterial,
279
+ Mesh = THREE.Mesh,
280
+ WebGLRenderer = THREE.WebGLRenderer,
281
+ TextureLoader = THREE.TextureLoader;
282
+ var _canvasRef$current = canvasRef.current,
283
+ canvasWidth = _canvasRef$current.offsetWidth,
284
+ canvasHeight = _canvasRef$current.offsetHeight;
285
+ camera.current = new PerspectiveCamera(50, canvasWidth / canvasHeight, 1, 1100);
286
+ scene.current = new Scene();
287
+ var geometry = new SphereBufferGeometry(500, 60, 40, 0, Math.PI * 2, Math.PI / 3, Math.PI / 3);
288
+ geometry.scale(-1, 1, 1);
289
+ var texture = new TextureLoader().load(imageUrl);
290
+ var material = new MeshBasicMaterial({
291
+ map: texture
292
+ });
293
+ var mesh = new Mesh(geometry, material);
294
+ scene.current.add(mesh);
295
+ renderer.current = new WebGLRenderer({
296
+ canvas: canvasRef.current
297
+ });
298
+ renderer.current.setPixelRatio(typeof window !== 'undefined' ? window.devicePixelRatio : 1);
299
+ renderer.current.setSize(canvasWidth, canvasHeight);
300
+ render3D();
301
+ }
302
+
303
+ return function () {
304
+ if (withSphere) {
305
+ camera.current = null;
306
+ scene.current = null;
307
+ renderer.current = null;
308
+ }
309
+ };
310
+ }, [hasMediaUrl, withSphere, render3D, THREE]);
311
+ hooks.useAnimationFrame(render3D, {
312
+ disabled: !withSphere || THREE === null
313
+ }); // Resize 3D layer
314
+
315
+ React.useEffect(function () {
316
+ if (camera.current !== null && renderer.current !== null) {
317
+ camera.current.aspect = width / height;
318
+ camera.current.updateProjectionMatrix();
319
+ renderer.current.setSize(width, height);
320
+ }
321
+ }, [width, height]); // Pointer interaction
322
+
323
+ var togglePlayTimeout = React.useRef(null);
324
+ var onPointerDown = React.useCallback(function (e) {
325
+ pointerDown.current = true;
326
+ pointerDownX.current = e.clientX;
327
+ pointerDownY.current = e.clientY;
328
+ pointerLon.current = lon.current;
329
+ pointerLat.current = lat.current;
330
+ }, []);
331
+ var pixelsMoved = React.useRef(0);
332
+ var lastPointerClient = React.useRef(null);
333
+ var pixelsMovedTracked = React.useRef(false);
334
+ var onPointerMove = React.useCallback(function (e) {
335
+ if (pointerDown.current) {
336
+ var _ref4 = e || {},
337
+ _ref4$clientX = _ref4.clientX,
338
+ clientX = _ref4$clientX === void 0 ? null : _ref4$clientX,
339
+ _ref4$clientY = _ref4.clientY,
340
+ clientY = _ref4$clientY === void 0 ? null : _ref4$clientY;
341
+
342
+ var downDeltaX = pointerDownX.current - clientX;
343
+ var downDeltaY = pointerDownY.current - clientY;
344
+ lon.current = downDeltaX * 0.2 + pointerLon.current;
345
+ lat.current = downDeltaY * 0.2 + pointerLat.current;
346
+
347
+ var _ref5 = lastPointerClient.current || {},
348
+ _ref5$x = _ref5.x,
349
+ lastX = _ref5$x === void 0 ? clientX : _ref5$x,
350
+ _ref5$y = _ref5.y,
351
+ lastY = _ref5$y === void 0 ? clientY : _ref5$y;
352
+
353
+ var deltaX = Math.abs(lastX - clientX) || 0;
354
+ var deltaY = Math.abs(lastY - clientY) || 0;
355
+ pixelsMoved.current += deltaX + deltaY;
356
+
357
+ if (!pixelsMovedTracked.current && pixelsMoved.current > Math.min(width, height)) {
358
+ trackScreenEvent('drag_sphere');
359
+ pixelsMovedTracked.current = true;
360
+ }
361
+
362
+ lastPointerClient.current = {
363
+ x: clientX,
364
+ y: clientY
365
+ };
366
+
367
+ if (Math.abs(downDeltaX) > 3 || Math.abs(downDeltaY) > 3) {
368
+ if (togglePlayTimeout.current !== null) {
369
+ clearTimeout(togglePlayTimeout.current);
370
+ togglePlayTimeout.current = null;
371
+ }
372
+ }
373
+ }
374
+ }, [width, height, trackScreenEvent]);
375
+ var onPointerUp = React.useCallback(function (e) {
376
+ var canvasContainer = canvasContainerRef.current;
377
+
378
+ if (pointerDown.current && canvasContainer !== null) {
379
+ var distX = Math.abs(pointerDownX.current - e.clientX);
380
+ var distY = Math.abs(pointerDownY.current - e.clientY);
381
+ var pixelsMovedTolerance = 3;
382
+ var tapNextScreenWidthPercent = 0.5;
383
+ var canTapToNavigate = !landscape && togglePlayTimeout.current !== null;
384
+ var validNavigateTap = canTapToNavigate && distX < pixelsMovedTolerance && distY < pixelsMovedTolerance;
385
+
386
+ if (validNavigateTap) {
387
+ var _canvasContainer$getB = canvasContainer.getBoundingClientRect(),
388
+ _canvasContainer$getB2 = _canvasContainer$getB.left,
389
+ containerX = _canvasContainer$getB2 === void 0 ? 0 : _canvasContainer$getB2,
390
+ containerWidth = _canvasContainer$getB.width;
391
+
392
+ var hasTappedLeft = e.clientX - containerX < containerWidth * (1 - tapNextScreenWidthPercent);
393
+
394
+ if (hasTappedLeft) {
395
+ if (onPrevious !== null) {
396
+ onPrevious();
397
+ }
398
+ } else if (onNext !== null) {
399
+ onNext();
400
+ }
401
+ }
402
+
403
+ if (togglePlayTimeout.current !== null) {
404
+ clearTimeout(togglePlayTimeout.current);
405
+ togglePlayTimeout.current = null;
406
+ }
407
+ }
408
+
409
+ pointerDown.current = false;
410
+ }, [onPrevious, onNext, landscape]);
411
+ var hasCallToAction = callToAction !== null && callToAction.active === true; // Building elements ------------------
412
+
413
+ var items = [/*#__PURE__*/React__default["default"].createElement(components.ScreenElement, {
414
+ key: "video",
415
+ placeholder: /*#__PURE__*/React__default["default"].createElement(components.PlaceholderVideo360, {
416
+ className: styles.placeholder,
417
+ width: "100%",
418
+ height: "100%"
419
+ }),
420
+ emptyClassName: styles.empty,
421
+ emptyLabel: /*#__PURE__*/React__default["default"].createElement(reactIntl.FormattedMessage, {
422
+ id: "/YQ+xP",
423
+ defaultMessage: [{
424
+ "type": 0,
425
+ "value": "Image 360"
426
+ }]
427
+ }),
428
+ isEmpty: !withSphere
429
+ }, /*#__PURE__*/React__default["default"].createElement(components.Transitions, {
430
+ playing: transitionPlaying,
431
+ transitions: transitions,
432
+ disabled: transitionDisabled,
433
+ fullscreen: true
434
+ }, withSphere ? /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement("canvas", {
435
+ ref: canvasRef,
436
+ className: styles.canvas
437
+ }), /*#__PURE__*/React__default["default"].createElement("button", {
438
+ className: styles.canvasButton,
439
+ type: "button",
440
+ "aria-label": "canvas-interaction",
441
+ onPointerDown: onPointerDown,
442
+ onPointerMove: onPointerMove,
443
+ onPointerUp: onPointerUp,
444
+ tabIndex: current && isView ? null : '-1'
445
+ })) : /*#__PURE__*/React__default["default"].createElement("div", {
446
+ className: styles.videoContainer,
447
+ style: {
448
+ width: resizedImageWidth,
449
+ height: resizedImageHeight,
450
+ left: resizedImageLeft,
451
+ top: resizedImageTop
452
+ }
453
+ }, /*#__PURE__*/React__default["default"].createElement(Image__default["default"], {
454
+ className: styles.video,
455
+ media: {
456
+ url: thumbnailUrl,
457
+ metadata: {
458
+ width: imageWidth,
459
+ height: imageHeight
460
+ }
461
+ },
462
+ width: resizedImageWidth,
463
+ height: resizedImageHeight,
464
+ resolution: resolution
465
+ })))), !isPlaceholder ? /*#__PURE__*/React__default["default"].createElement("div", {
466
+ key: "bottom-content",
467
+ className: styles.bottomContent
468
+ }, /*#__PURE__*/React__default["default"].createElement(components.Transitions, {
469
+ playing: transitionPlaying,
470
+ transitions: transitions,
471
+ disabled: transitionDisabled
472
+ }, hasCallToAction ? /*#__PURE__*/React__default["default"].createElement("div", {
473
+ style: {
474
+ marginTop: -spacing / 2
475
+ }
476
+ }, /*#__PURE__*/React__default["default"].createElement(CallToAction__default["default"], {
477
+ callToAction: callToAction,
478
+ animationDisabled: isPreview,
479
+ focusable: current && isView,
480
+ screenSize: {
481
+ width: width,
482
+ height: height
483
+ }
484
+ })) : null)) : null];
485
+ return /*#__PURE__*/React__default["default"].createElement("div", {
486
+ className: classNames__default["default"]([styles.container, (_ref6 = {}, _defineProperty__default["default"](_ref6, className, className !== null), _defineProperty__default["default"](_ref6, styles.showVideo, isPreview || isStatic || isCapture), _ref6)]),
487
+ "data-screen-ready": (isStatic || isCapture) && posterReady || ready
488
+ }, !isPlaceholder ? /*#__PURE__*/React__default["default"].createElement(Background__default["default"], {
489
+ background: background,
490
+ width: width,
491
+ height: height,
492
+ resolution: resolution,
493
+ playing: backgroundPlaying,
494
+ shouldLoad: backgroundShouldLoad
495
+ }) : null, /*#__PURE__*/React__default["default"].createElement(Container__default["default"], {
496
+ width: width,
497
+ height: height
498
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
499
+ ref: canvasContainerRef,
500
+ className: styles.videoContainer,
501
+ style: {
502
+ width: resizedImageWidth,
503
+ height: resizedImageHeight,
504
+ left: resizedImageLeft,
505
+ top: resizedImageTop
506
+ }
507
+ }), /*#__PURE__*/React__default["default"].createElement("div", {
508
+ className: styles.content
509
+ }, items)));
510
+ };
511
+
512
+ Image360Screen.propTypes = propTypes;
513
+ Image360Screen.defaultProps = defaultProps;
514
+ var Image360Screen$1 = /*#__PURE__*/React__default["default"].memo(Image360Screen);
515
+
516
+ var transform = function transform(newStory, _ref) {
517
+ var video = _ref.video;
518
+
519
+ var _ref2 = video || {},
520
+ _ref2$media = _ref2.media,
521
+ media = _ref2$media === void 0 ? null : _ref2$media;
522
+
523
+ var _Video = appleNews.Video(newStory, media),
524
+ titleStory = _Video.story,
525
+ titleComponent = _Video.component;
526
+
527
+ var _Container = appleNews.Container(titleStory, _toConsumableArray__default["default"](titleComponent ? [titleComponent] : [])),
528
+ containerStory = _Container.story,
529
+ containerComponent = _Container.component;
530
+
531
+ return _objectSpread__default["default"](_objectSpread__default["default"]({}, containerStory), {}, {
532
+ components: [].concat(_toConsumableArray__default["default"](newStory.components || []), _toConsumableArray__default["default"](containerComponent ? [containerComponent] : []))
533
+ });
534
+ };
535
+
536
+ // eslint-disable-next-line
537
+
538
+ var transforms = /*#__PURE__*/Object.freeze({
539
+ __proto__: null,
540
+ appleNews: transform
541
+ });
542
+
543
+ var definition = {
544
+ id: 'video-360',
545
+ type: 'screen',
546
+ group: {
547
+ label: reactIntl.defineMessage({
548
+ id: "+9akmg",
549
+ defaultMessage: [{
550
+ "type": 0,
551
+ "value": "Audio and Video"
552
+ }]
553
+ }),
554
+ order: 5
555
+ },
556
+ title: reactIntl.defineMessage({
557
+ id: "GRVidW",
558
+ defaultMessage: [{
559
+ "type": 0,
560
+ "value": "360 Video"
561
+ }]
562
+ }),
563
+ component: Image360Screen$1,
564
+ layouts: ['full'],
565
+ transforms: transforms,
566
+ fields: [{
567
+ name: 'video',
568
+ type: 'video-element',
569
+ theme: {
570
+ color: 'primary'
571
+ },
572
+ defaultValue: {
573
+ autoPlay: true
574
+ },
575
+ label: reactIntl.defineMessage({
576
+ id: "tvl2Zc",
577
+ defaultMessage: [{
578
+ "type": 0,
579
+ "value": "Video"
580
+ }]
581
+ })
582
+ }, {
583
+ name: 'background',
584
+ type: 'background',
585
+ label: reactIntl.defineMessage({
586
+ id: "+MPZRu",
587
+ defaultMessage: [{
588
+ "type": 0,
589
+ "value": "Background"
590
+ }]
591
+ })
592
+ }, {
593
+ name: 'callToAction',
594
+ type: 'call-to-action',
595
+ theme: {
596
+ boxStyle: 'cta',
597
+ label: {
598
+ textStyle: 'cta'
599
+ }
600
+ }
601
+ }]
602
+ };
603
+
604
+ exports.Image360Screen = Image360Screen$1;
605
+ exports["default"] = definition;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@micromag/screen-image-360",
3
- "version": "0.3.77",
3
+ "version": "0.3.78",
4
4
  "description": "",
5
5
  "keywords": [
6
6
  "javascript"
@@ -50,15 +50,15 @@
50
50
  "dependencies": {
51
51
  "@babel/runtime": "^7.13.10",
52
52
  "@folklore/size": "^0.1.20",
53
- "@micromag/core": "^0.3.77",
54
- "@micromag/element-background": "^0.3.77",
55
- "@micromag/element-call-to-action": "^0.3.77",
56
- "@micromag/element-closed-captions": "^0.3.77",
57
- "@micromag/element-container": "^0.3.77",
58
- "@micromag/element-image": "^0.3.77",
59
- "@micromag/element-media-controls": "^0.3.77",
60
- "@micromag/element-video": "^0.3.77",
61
- "@micromag/transforms": "^0.3.77",
53
+ "@micromag/core": "^0.3.78",
54
+ "@micromag/element-background": "^0.3.78",
55
+ "@micromag/element-call-to-action": "^0.3.78",
56
+ "@micromag/element-closed-captions": "^0.3.78",
57
+ "@micromag/element-container": "^0.3.78",
58
+ "@micromag/element-image": "^0.3.78",
59
+ "@micromag/element-media-controls": "^0.3.78",
60
+ "@micromag/element-video": "^0.3.78",
61
+ "@micromag/transforms": "^0.3.78",
62
62
  "classnames": "^2.2.6",
63
63
  "lodash": "^4.17.21",
64
64
  "prop-types": "^15.7.2",
@@ -70,5 +70,5 @@
70
70
  "publishConfig": {
71
71
  "access": "public"
72
72
  },
73
- "gitHead": "12effe09a1b53e8ff487695a17d1d4fff412482e"
73
+ "gitHead": "68be4e95203a5c15cefe58e423fe43eb374f3a7f"
74
74
  }