@atlaskit/spotlight 0.9.2 → 0.9.4

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/CHANGELOG.md CHANGED
@@ -1,5 +1,31 @@
1
1
  # @atlaskit/spotlight
2
2
 
3
+ ## 0.9.4
4
+
5
+ ### Patch Changes
6
+
7
+ - [`063f646d9daec`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/063f646d9daec) -
8
+ Added `usePreloadMedia` hook to preload video and image assets before they are rendered in the
9
+ DOM.
10
+
11
+ This hook is useful in the context of `@atlaskit/spotlight` where by default media will only load
12
+ when `PopoverContent.isVisible` is set to true. `usePreloadMedia` preloads the assets for better
13
+ performance and user experience. The hook accepts a source URL and a MIME type, creates a
14
+ temporary media element to trigger browser caching, and the cached asset will be used when the
15
+ actual media element is rendered.
16
+
17
+ Supported MIME types:
18
+ - Videos: `video/mp4`, `video/webm`, `video/ogg`, `video/mpeg`, `video/x-matroska`
19
+ - Images: `image/jpeg`, `image/png`, `image/gif`, `image/webp`, `image/svg+xml`
20
+
21
+ Example usage: usePreloadMedia(videoSrc, { mimetype: 'video/mp4' });
22
+
23
+ ## 0.9.3
24
+
25
+ ### Patch Changes
26
+
27
+ - Updated dependencies
28
+
3
29
  ## 0.9.2
4
30
 
5
31
  ### Patch Changes
@@ -19,6 +19,8 @@ Spotlights are most effective for onboarding new users, driving feature discover
19
19
  important changes. Use them sparingly. If your UI needs frequent spotlights, consider simplifying
20
20
  the core experience instead.
21
21
 
22
+ [Track and reduce message fatigue with Post Office (Atlassians only)](https://go.atlassian.com/use-post-office)
23
+
22
24
  ### Single-step spotlight
23
25
 
24
26
  The ideal spotlight experience is lightweight and a single-step. Always try to limit your experience
package/dist/cjs/index.js CHANGED
@@ -105,6 +105,12 @@ Object.defineProperty(exports, "UNSAFE_UpdateOnChange", {
105
105
  return _UNSAFE_updateOnChange.UNSAFE_UpdateOnChange;
106
106
  }
107
107
  });
108
+ Object.defineProperty(exports, "usePreloadMedia", {
109
+ enumerable: true,
110
+ get: function get() {
111
+ return _usePreloadMedia.usePreloadMedia;
112
+ }
113
+ });
108
114
  var _card = require("./ui/card");
109
115
  var _body = require("./ui/body");
110
116
  var _header = require("./ui/header");
@@ -121,4 +127,5 @@ var _media = require("./ui/media");
121
127
  var _popoverProvider = require("./ui/popover-provider");
122
128
  var _popoverContent = require("./ui/popover-content");
123
129
  var _popoverTarget = require("./ui/popover-target");
124
- var _UNSAFE_updateOnChange = require("./ui/UNSAFE_update-on-change");
130
+ var _UNSAFE_updateOnChange = require("./ui/UNSAFE_update-on-change");
131
+ var _usePreloadMedia = require("./utils/use-preload-media");
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.usePreloadMedia = void 0;
8
+ var _react = require("react");
9
+ var _browserApis = require("@atlaskit/browser-apis");
10
+ var _noop = _interopRequireDefault(require("@atlaskit/ds-lib/noop"));
11
+ // eslint-disable-next-line @repo/internal/react/consistent-types-definitions
12
+
13
+ /**
14
+ * Preloads media (video/image) files to be cached by the browser.
15
+ * Once loaded, the browser cache will be used when rendering the actual media element.
16
+ *
17
+ * @param src - The media source URL to preload
18
+ * @param options - Configuration options including the MIME type
19
+ */
20
+ var usePreloadMedia = exports.usePreloadMedia = function usePreloadMedia(src, options) {
21
+ (0, _react.useEffect)(function () {
22
+ var handler = mimeTypeHandlers[options.mimetype];
23
+ return handler(src);
24
+ }, [src, options.mimetype]);
25
+ };
26
+ var preloadVideo = function preloadVideo(src) {
27
+ var doc = (0, _browserApis.getDocument)();
28
+ if (!doc) {
29
+ return _noop.default;
30
+ }
31
+ var video = doc.createElement('video');
32
+ video.src = src;
33
+ video.preload = 'auto';
34
+ video.load();
35
+ return function () {
36
+ video.src = '';
37
+ video.load();
38
+ };
39
+ };
40
+ var preloadImage = function preloadImage(src) {
41
+ var doc = (0, _browserApis.getDocument)();
42
+ if (!doc) {
43
+ return _noop.default;
44
+ }
45
+ var img = new Image();
46
+ img.src = src;
47
+ return function () {
48
+ img.src = '';
49
+ };
50
+ };
51
+ var mimeTypeHandlers = {
52
+ 'video/mp4': preloadVideo,
53
+ 'video/webm': preloadVideo,
54
+ 'video/ogg': preloadVideo,
55
+ 'video/mpeg': preloadVideo,
56
+ 'video/x-matroska': preloadVideo,
57
+ 'image/jpeg': preloadImage,
58
+ 'image/png': preloadImage,
59
+ 'image/gif': preloadImage,
60
+ 'image/webp': preloadImage,
61
+ 'image/svg+xml': preloadImage
62
+ };
@@ -14,4 +14,5 @@ export { SpotlightMedia } from './ui/media';
14
14
  export { PopoverProvider } from './ui/popover-provider';
15
15
  export { PopoverContent } from './ui/popover-content';
16
16
  export { PopoverTarget } from './ui/popover-target';
17
- export { UNSAFE_UpdateOnChange } from './ui/UNSAFE_update-on-change';
17
+ export { UNSAFE_UpdateOnChange } from './ui/UNSAFE_update-on-change';
18
+ export { usePreloadMedia } from './utils/use-preload-media';
@@ -0,0 +1,56 @@
1
+ import { useEffect } from 'react';
2
+ import { getDocument } from '@atlaskit/browser-apis';
3
+ import __noop from '@atlaskit/ds-lib/noop';
4
+
5
+ // eslint-disable-next-line @repo/internal/react/consistent-types-definitions
6
+
7
+ /**
8
+ * Preloads media (video/image) files to be cached by the browser.
9
+ * Once loaded, the browser cache will be used when rendering the actual media element.
10
+ *
11
+ * @param src - The media source URL to preload
12
+ * @param options - Configuration options including the MIME type
13
+ */
14
+ export const usePreloadMedia = (src, options) => {
15
+ useEffect(() => {
16
+ const handler = mimeTypeHandlers[options.mimetype];
17
+ return handler(src);
18
+ }, [src, options.mimetype]);
19
+ };
20
+ const preloadVideo = src => {
21
+ const doc = getDocument();
22
+ if (!doc) {
23
+ return __noop;
24
+ }
25
+ const video = doc.createElement('video');
26
+ video.src = src;
27
+ video.preload = 'auto';
28
+ video.load();
29
+ return () => {
30
+ video.src = '';
31
+ video.load();
32
+ };
33
+ };
34
+ const preloadImage = src => {
35
+ const doc = getDocument();
36
+ if (!doc) {
37
+ return __noop;
38
+ }
39
+ const img = new Image();
40
+ img.src = src;
41
+ return () => {
42
+ img.src = '';
43
+ };
44
+ };
45
+ const mimeTypeHandlers = {
46
+ 'video/mp4': preloadVideo,
47
+ 'video/webm': preloadVideo,
48
+ 'video/ogg': preloadVideo,
49
+ 'video/mpeg': preloadVideo,
50
+ 'video/x-matroska': preloadVideo,
51
+ 'image/jpeg': preloadImage,
52
+ 'image/png': preloadImage,
53
+ 'image/gif': preloadImage,
54
+ 'image/webp': preloadImage,
55
+ 'image/svg+xml': preloadImage
56
+ };
package/dist/esm/index.js CHANGED
@@ -14,4 +14,5 @@ export { SpotlightMedia } from './ui/media';
14
14
  export { PopoverProvider } from './ui/popover-provider';
15
15
  export { PopoverContent } from './ui/popover-content';
16
16
  export { PopoverTarget } from './ui/popover-target';
17
- export { UNSAFE_UpdateOnChange } from './ui/UNSAFE_update-on-change';
17
+ export { UNSAFE_UpdateOnChange } from './ui/UNSAFE_update-on-change';
18
+ export { usePreloadMedia } from './utils/use-preload-media';
@@ -0,0 +1,56 @@
1
+ import { useEffect } from 'react';
2
+ import { getDocument } from '@atlaskit/browser-apis';
3
+ import __noop from '@atlaskit/ds-lib/noop';
4
+
5
+ // eslint-disable-next-line @repo/internal/react/consistent-types-definitions
6
+
7
+ /**
8
+ * Preloads media (video/image) files to be cached by the browser.
9
+ * Once loaded, the browser cache will be used when rendering the actual media element.
10
+ *
11
+ * @param src - The media source URL to preload
12
+ * @param options - Configuration options including the MIME type
13
+ */
14
+ export var usePreloadMedia = function usePreloadMedia(src, options) {
15
+ useEffect(function () {
16
+ var handler = mimeTypeHandlers[options.mimetype];
17
+ return handler(src);
18
+ }, [src, options.mimetype]);
19
+ };
20
+ var preloadVideo = function preloadVideo(src) {
21
+ var doc = getDocument();
22
+ if (!doc) {
23
+ return __noop;
24
+ }
25
+ var video = doc.createElement('video');
26
+ video.src = src;
27
+ video.preload = 'auto';
28
+ video.load();
29
+ return function () {
30
+ video.src = '';
31
+ video.load();
32
+ };
33
+ };
34
+ var preloadImage = function preloadImage(src) {
35
+ var doc = getDocument();
36
+ if (!doc) {
37
+ return __noop;
38
+ }
39
+ var img = new Image();
40
+ img.src = src;
41
+ return function () {
42
+ img.src = '';
43
+ };
44
+ };
45
+ var mimeTypeHandlers = {
46
+ 'video/mp4': preloadVideo,
47
+ 'video/webm': preloadVideo,
48
+ 'video/ogg': preloadVideo,
49
+ 'video/mpeg': preloadVideo,
50
+ 'video/x-matroska': preloadVideo,
51
+ 'image/jpeg': preloadImage,
52
+ 'image/png': preloadImage,
53
+ 'image/gif': preloadImage,
54
+ 'image/webp': preloadImage,
55
+ 'image/svg+xml': preloadImage
56
+ };
@@ -16,3 +16,4 @@ export { PopoverContent, type PopoverContentProps } from './ui/popover-content';
16
16
  export { PopoverTarget } from './ui/popover-target';
17
17
  export { type Placement, type DismissEvent } from './types';
18
18
  export { UNSAFE_UpdateOnChange } from './ui/UNSAFE_update-on-change';
19
+ export { usePreloadMedia } from './utils/use-preload-media';
@@ -0,0 +1,13 @@
1
+ type MimeType = 'video/mp4' | 'video/webm' | 'video/ogg' | 'video/mpeg' | 'video/x-matroska' | 'image/jpeg' | 'image/png' | 'image/gif' | 'image/webp' | 'image/svg+xml';
2
+ interface PreloadMediaOptions {
3
+ mimetype: MimeType;
4
+ }
5
+ /**
6
+ * Preloads media (video/image) files to be cached by the browser.
7
+ * Once loaded, the browser cache will be used when rendering the actual media element.
8
+ *
9
+ * @param src - The media source URL to preload
10
+ * @param options - Configuration options including the MIME type
11
+ */
12
+ export declare const usePreloadMedia: (src: string, options: PreloadMediaOptions) => void;
13
+ export {};
@@ -16,3 +16,4 @@ export { PopoverContent, type PopoverContentProps } from './ui/popover-content';
16
16
  export { PopoverTarget } from './ui/popover-target';
17
17
  export { type Placement, type DismissEvent } from './types';
18
18
  export { UNSAFE_UpdateOnChange } from './ui/UNSAFE_update-on-change';
19
+ export { usePreloadMedia } from './utils/use-preload-media';
@@ -0,0 +1,13 @@
1
+ type MimeType = 'video/mp4' | 'video/webm' | 'video/ogg' | 'video/mpeg' | 'video/x-matroska' | 'image/jpeg' | 'image/png' | 'image/gif' | 'image/webp' | 'image/svg+xml';
2
+ interface PreloadMediaOptions {
3
+ mimetype: MimeType;
4
+ }
5
+ /**
6
+ * Preloads media (video/image) files to be cached by the browser.
7
+ * Once loaded, the browser cache will be used when rendering the actual media element.
8
+ *
9
+ * @param src - The media source URL to preload
10
+ * @param options - Configuration options including the MIME type
11
+ */
12
+ export declare const usePreloadMedia: (src: string, options: PreloadMediaOptions) => void;
13
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/spotlight",
3
- "version": "0.9.2",
3
+ "version": "0.9.4",
4
4
  "description": "A spotlight introduces users to points of interest, from focused messages to multi-step tours.",
5
5
  "author": "Atlassian Pty Ltd",
6
6
  "license": "Apache-2.0",
@@ -37,7 +37,7 @@
37
37
  "@atlaskit/css": "^0.15.0",
38
38
  "@atlaskit/ds-lib": "^5.2.0",
39
39
  "@atlaskit/heading": "^5.2.0",
40
- "@atlaskit/icon": "^28.5.0",
40
+ "@atlaskit/icon": "^29.0.0",
41
41
  "@atlaskit/image": "^3.0.0",
42
42
  "@atlaskit/popper": "^7.1.0",
43
43
  "@atlaskit/primitives": "^16.1.0",