@m4l/gclick 0.16.0 → 0.17.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/components/CameraStream/defaults/DefaultPhaseStreaming.d.ts +2 -2
- package/components/CameraStream/defaults/DefaultPhaseStreaming.d.ts.map +1 -1
- package/components/CameraStream/defaults/DefaultPhaseStreaming.js +23 -21
- package/components/CameraStream/types.d.ts +9 -0
- package/components/CameraStream/types.d.ts.map +1 -1
- package/components/VideoPlayer/VideoPlayer.d.ts +4 -1
- package/components/VideoPlayer/VideoPlayer.d.ts.map +1 -1
- package/components/VideoPlayer/VideoPlayer.js +28 -25
- package/components/VideoPlayer/VideoPlayer.styles.d.ts +7 -1
- package/components/VideoPlayer/VideoPlayer.styles.d.ts.map +1 -1
- package/components/VideoPlayer/VideoPlayer.styles.js +72 -10
- package/components/VideoPlayer/VideojsDefaultSkin.styles.d.ts +8 -0
- package/components/VideoPlayer/VideojsDefaultSkin.styles.d.ts.map +1 -0
- package/components/VideoPlayer/{VideojsSkin.styles.js → VideojsDefaultSkin.styles.js} +478 -248
- package/components/VideoPlayer/VideojsMinimalSkin.styles.d.ts +8 -0
- package/components/VideoPlayer/VideojsMinimalSkin.styles.d.ts.map +1 -0
- package/components/VideoPlayer/VideojsMinimalSkin.styles.js +1561 -0
- package/components/VideoPlayer/constants.d.ts +33 -0
- package/components/VideoPlayer/constants.d.ts.map +1 -1
- package/components/VideoPlayer/constants.js +20 -4
- package/components/VideoPlayer/hlsConfig.d.ts +21 -11
- package/components/VideoPlayer/hlsConfig.d.ts.map +1 -1
- package/components/VideoPlayer/hlsConfig.js +28 -21
- package/components/VideoPlayer/index.d.ts +2 -2
- package/components/VideoPlayer/index.d.ts.map +1 -1
- package/components/VideoPlayer/player.factory.d.ts +3 -3
- package/components/VideoPlayer/player.factory.d.ts.map +1 -1
- package/components/VideoPlayer/slots/VideoPlayerSlots.d.ts +1 -1
- package/components/VideoPlayer/subcomponents/GclickVideoSkin.d.ts +5 -2
- package/components/VideoPlayer/subcomponents/GclickVideoSkin.d.ts.map +1 -1
- package/components/VideoPlayer/subcomponents/GclickVideoSkin.js +34 -178
- package/components/VideoPlayer/subcomponents/VideoPlayerStage.d.ts +4 -3
- package/components/VideoPlayer/subcomponents/VideoPlayerStage.d.ts.map +1 -1
- package/components/VideoPlayer/subcomponents/VideoPlayerStage.js +43 -42
- package/components/VideoPlayer/subcomponents/skin/VideoControlBar.d.ts +6 -0
- package/components/VideoPlayer/subcomponents/skin/VideoControlBar.d.ts.map +1 -0
- package/components/VideoPlayer/subcomponents/skin/VideoControlBar.js +87 -0
- package/components/VideoPlayer/subcomponents/skin/VideoErrorDialog.d.ts +9 -0
- package/components/VideoPlayer/subcomponents/skin/VideoErrorDialog.d.ts.map +1 -0
- package/components/VideoPlayer/subcomponents/skin/VideoErrorDialog.js +17 -0
- package/components/VideoPlayer/subcomponents/skin/VideoInputBindings.d.ts +11 -0
- package/components/VideoPlayer/subcomponents/skin/VideoInputBindings.d.ts.map +1 -0
- package/components/VideoPlayer/subcomponents/skin/VideoInputBindings.js +19 -0
- package/components/VideoPlayer/subcomponents/skin/VideoSettingsMenu.d.ts +9 -0
- package/components/VideoPlayer/subcomponents/skin/VideoSettingsMenu.d.ts.map +1 -0
- package/components/VideoPlayer/subcomponents/skin/VideoSettingsMenu.js +48 -0
- package/components/VideoPlayer/subcomponents/skin/primitives.d.ts +81 -0
- package/components/VideoPlayer/subcomponents/skin/primitives.d.ts.map +1 -0
- package/components/VideoPlayer/subcomponents/skin/primitives.js +142 -0
- package/components/VideoPlayer/subcomponents/skin/skinVariant.d.ts +19 -0
- package/components/VideoPlayer/subcomponents/skin/skinVariant.d.ts.map +1 -0
- package/components/VideoPlayer/subcomponents/skin/skinVariant.js +23 -0
- package/components/VideoPlayer/types.d.ts +25 -6
- package/components/VideoPlayer/types.d.ts.map +1 -1
- package/index.js +123 -122
- package/package.json +4 -4
- package/components/VideoPlayer/VideojsSkin.styles.d.ts +0 -9
- package/components/VideoPlayer/VideojsSkin.styles.d.ts.map +0 -1
|
@@ -1,6 +1,39 @@
|
|
|
1
1
|
/** M4L theme key + test id for the slot-themed `VideoPlayer`. */
|
|
2
2
|
export declare const COMPONENT_VIDEO_PLAYER_KEY_COMPONENT = "M4LVideoPlayer";
|
|
3
3
|
export declare const COMPONENT_VIDEO_PLAYER_TEST_ID = "M4LVideoPlayer";
|
|
4
|
+
/**
|
|
5
|
+
* The vendor skins the player can wear. Values mirror `@videojs/react`'s own
|
|
6
|
+
* naming (`video/skin.css` and `video/minimal-skin.css`).
|
|
7
|
+
*/
|
|
8
|
+
export declare const VIDEO_PLAYER_VARIANTS: {
|
|
9
|
+
readonly default: "default";
|
|
10
|
+
readonly minimal: "minimal";
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Per-variant class names the composed skin hands to the vendor's building
|
|
14
|
+
* blocks.
|
|
15
|
+
*
|
|
16
|
+
* The two vendor sheets are independent stylesheets keyed off different root
|
|
17
|
+
* classes, and they differ in only two visible ways: the minimal skin drops the
|
|
18
|
+
* frosted `media-surface` from every chrome panel, and it groups the current /
|
|
19
|
+
* duration times behind a separator instead of showing them apart. Everything
|
|
20
|
+
* else is identical, so the composition reads these instead of branching.
|
|
21
|
+
*
|
|
22
|
+
* `surface` is intentionally empty for `minimal` — `cx()` filters falsy parts,
|
|
23
|
+
* so the same call site works for both without a conditional.
|
|
24
|
+
*/
|
|
25
|
+
export declare const VIDEO_PLAYER_SKIN_CLASSES: {
|
|
26
|
+
readonly default: {
|
|
27
|
+
readonly root: "media-default-skin media-default-skin--video";
|
|
28
|
+
readonly surface: "media-surface";
|
|
29
|
+
readonly groupedTime: false;
|
|
30
|
+
};
|
|
31
|
+
readonly minimal: {
|
|
32
|
+
readonly root: "media-minimal-skin media-minimal-skin--video";
|
|
33
|
+
readonly surface: "";
|
|
34
|
+
readonly groupedTime: true;
|
|
35
|
+
};
|
|
36
|
+
};
|
|
4
37
|
/**
|
|
5
38
|
* `crossOrigin` value applied to the `<video>` element. `use-credentials` is
|
|
6
39
|
* required for the native/Safari HLS path to send the CloudFront signed
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../../../packages/gclick/src/components/VideoPlayer/constants.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,eAAO,MAAM,oCAAoC,mBAAmB,CAAC;AACrE,eAAO,MAAM,8BAA8B,mBAAmB,CAAC;AAE/D;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAG,iBAA0B,CAAC;AAE3D;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAG,KAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../../../packages/gclick/src/components/VideoPlayer/constants.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,eAAO,MAAM,oCAAoC,mBAAmB,CAAC;AACrE,eAAO,MAAM,8BAA8B,mBAAmB,CAAC;AAE/D;;;GAGG;AACH,eAAO,MAAM,qBAAqB;;;CAGxB,CAAC;AAEX;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;CAW5B,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAG,iBAA0B,CAAC;AAE3D;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAG,KAAc,CAAC"}
|
|
@@ -1,6 +1,22 @@
|
|
|
1
|
-
const
|
|
1
|
+
const e = "M4LVideoPlayer", i = {
|
|
2
|
+
default: "default",
|
|
3
|
+
minimal: "minimal"
|
|
4
|
+
}, a = {
|
|
5
|
+
default: {
|
|
6
|
+
root: "media-default-skin media-default-skin--video",
|
|
7
|
+
surface: "media-surface",
|
|
8
|
+
groupedTime: !1
|
|
9
|
+
},
|
|
10
|
+
minimal: {
|
|
11
|
+
root: "media-minimal-skin media-minimal-skin--video",
|
|
12
|
+
surface: "",
|
|
13
|
+
groupedTime: !0
|
|
14
|
+
}
|
|
15
|
+
}, m = "use-credentials", d = "mse";
|
|
2
16
|
export {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
17
|
+
e as COMPONENT_VIDEO_PLAYER_KEY_COMPONENT,
|
|
18
|
+
m as HLS_CROSS_ORIGIN,
|
|
19
|
+
d as HLS_PREFER_PLAYBACK,
|
|
20
|
+
a as VIDEO_PLAYER_SKIN_CLASSES,
|
|
21
|
+
i as VIDEO_PLAYER_VARIANTS
|
|
6
22
|
};
|
|
@@ -1,20 +1,30 @@
|
|
|
1
|
+
import { HlsMediaProps } from '@videojs/core/dom/media/hls-js';
|
|
2
|
+
/** The `config` prop accepted by `<HlsJsVideo>` — playback path + hls.js options. */
|
|
3
|
+
type HlsMediaConfig = NonNullable<HlsMediaProps['config']>;
|
|
1
4
|
/**
|
|
2
|
-
*
|
|
3
|
-
* the CloudFront signed cookies.
|
|
5
|
+
* `<HlsJsVideo>` configuration so every HLS request (manifest + each segment)
|
|
6
|
+
* carries the CloudFront signed cookies.
|
|
4
7
|
*
|
|
5
|
-
* video.js v10 has no first-class `withCredentials` prop
|
|
6
|
-
*
|
|
7
|
-
* (`
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* `
|
|
11
|
-
*
|
|
8
|
+
* video.js v10 has no first-class `withCredentials` prop. Since beta.25 the
|
|
9
|
+
* element takes a SINGLE `config` object that nests the playback path
|
|
10
|
+
* (`preferPlayback`) alongside the options forwarded to hls.js (`config.hlsJs`,
|
|
11
|
+
* spread into the constructor as `new HlsJsOnlyMedia({ config: { ...hlsJs } })`).
|
|
12
|
+
* Up to beta.24 the shape was flat — `preferPlayback` was a top-level prop and
|
|
13
|
+
* `config` WAS the hls.js option bag. Getting this wrong fails silently: the
|
|
14
|
+
* loader hooks below never reach hls.js, no cookie travels, and every segment
|
|
15
|
+
* comes back 403 with no error surfaced by the player. Keep the nesting.
|
|
16
|
+
*
|
|
17
|
+
* We hook BOTH the default XHR loader (`xhrSetup`) and the Fetch loader
|
|
18
|
+
* (`fetchSetup`) so the cookies travel regardless of which loader hls.js
|
|
19
|
+
* selects, and we force `autoStartLoad` because v10 defaults it to `false` —
|
|
20
|
+
* without it a muted autoplay tile would mount but never begin fetching.
|
|
12
21
|
*
|
|
13
22
|
* The native/Safari HLS path bypasses hls.js entirely; the `crossOrigin`
|
|
14
|
-
* attribute on `<
|
|
23
|
+
* attribute on `<HlsJsVideo>` (see {@link HLS_CROSS_ORIGIN}) covers that path.
|
|
15
24
|
* Credentialed CORS forbids `Access-Control-Allow-Origin: *`, so CloudFront
|
|
16
25
|
* must echo the exact request origin and send
|
|
17
26
|
* `Access-Control-Allow-Credentials: true` for the segments to authenticate.
|
|
18
27
|
*/
|
|
19
|
-
export declare function buildCredentialedHlsConfig():
|
|
28
|
+
export declare function buildCredentialedHlsConfig(preferPlayback: HlsMediaConfig['preferPlayback']): HlsMediaConfig;
|
|
29
|
+
export {};
|
|
20
30
|
//# sourceMappingURL=hlsConfig.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hlsConfig.d.ts","sourceRoot":"","sources":["../../../../../../packages/gclick/src/components/VideoPlayer/hlsConfig.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"hlsConfig.d.ts","sourceRoot":"","sources":["../../../../../../packages/gclick/src/components/VideoPlayer/hlsConfig.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAEpE,qFAAqF;AACrF,KAAK,cAAc,GAAG,WAAW,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;AAE3D;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,0BAA0B,CACxC,cAAc,EAAE,cAAc,CAAC,gBAAgB,CAAC,GAC/C,cAAc,CAgChB"}
|
|
@@ -1,26 +1,33 @@
|
|
|
1
|
-
function r
|
|
1
|
+
function u(r) {
|
|
2
2
|
return {
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
//
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
3
|
+
// Playback path selection moved INSIDE `config` in beta.25 (it used to be a
|
|
4
|
+
// top-level prop). Left outside, it would land on the `<video>` element as
|
|
5
|
+
// an unknown DOM attribute and be ignored.
|
|
6
|
+
preferPlayback: r,
|
|
7
|
+
// Everything below is forwarded verbatim to the hls.js constructor.
|
|
8
|
+
hlsJs: {
|
|
9
|
+
// v10 default is `false` (lazy load); force eager load so muted autoplay
|
|
10
|
+
// starts fetching as soon as the tile mounts.
|
|
11
|
+
autoStartLoad: !0,
|
|
12
|
+
// Start from the beginning, NOT the live edge. hls.js defaults to the live
|
|
13
|
+
// edge for live streams, which anchors the MSE timeline mid-stream — once a
|
|
14
|
+
// finished live stream flips to VOD, the segments before the join point can
|
|
15
|
+
// no longer be buffered, so the seek bar cannot reach 0:00 (it loops
|
|
16
|
+
// re-fetching the first segment). Anchoring at 0 buffers the whole stream
|
|
17
|
+
// from the start, so the recording is fully seekable once it ends.
|
|
18
|
+
startPosition: 0,
|
|
19
|
+
/** Default XHR loader hook — sends cookies on every manifest + segment XHR. */
|
|
20
|
+
xhrSetup: (e) => {
|
|
21
|
+
e.withCredentials = !0;
|
|
22
|
+
},
|
|
23
|
+
/**
|
|
24
|
+
* Fetch loader hook — `xhrSetup` only fires when hls.js uses the XHR
|
|
25
|
+
* loader, so we also set `credentials: 'include'` for the Fetch path.
|
|
26
|
+
*/
|
|
27
|
+
fetchSetup: (e, t) => (t.credentials = "include", new Request(e.url, t))
|
|
28
|
+
}
|
|
22
29
|
};
|
|
23
30
|
}
|
|
24
31
|
export {
|
|
25
|
-
|
|
32
|
+
u as buildCredentialedHlsConfig
|
|
26
33
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export * from './VideoPlayer';
|
|
2
|
-
export type { VideoPlayerControl, VideoPlayerError, VideoPlayerOwnerState, VideoPlayerProps, } from './types';
|
|
3
|
-
export { COMPONENT_VIDEO_PLAYER_KEY_COMPONENT } from './constants';
|
|
2
|
+
export type { VideoPlayerControl, VideoPlayerError, VideoPlayerOwnerState, VideoPlayerProps, VideoPlayerVariant, } from './types';
|
|
3
|
+
export { COMPONENT_VIDEO_PLAYER_KEY_COMPONENT, VIDEO_PLAYER_VARIANTS } from './constants';
|
|
4
4
|
export { isHlsLiveDuration, resolveIsLive } from './utils';
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../packages/gclick/src/components/VideoPlayer/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../packages/gclick/src/components/VideoPlayer/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,oCAAoC,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAC1F,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { MediaErrorState, MediaFullscreenState, MediaLiveState, MediaPictureInPictureState, MediaPlaybackRateState, MediaPlaybackState, MediaSourceState, MediaStreamTypeState, MediaTimeState, MediaVolumeState } from '@videojs/core';
|
|
1
|
+
import { MediaAudioTrackState, MediaErrorState, MediaFullscreenState, MediaLiveState, MediaPictureInPictureState, MediaPlaybackRateState, MediaPlaybackState, MediaQualityState, MediaSourceState, MediaStreamTypeState, MediaTimeState, MediaVolumeState } from '@videojs/core';
|
|
2
2
|
import { BaseStore } from '@videojs/store';
|
|
3
3
|
/**
|
|
4
4
|
* Module-scope player factory for the Gclick HLS player. video.js v10 expects
|
|
@@ -13,7 +13,7 @@ import { BaseStore } from '@videojs/store';
|
|
|
13
13
|
* (it assumes the stream stays live forever), which is the opposite of our
|
|
14
14
|
* cameras → recording transition, so we compose our own feature set instead.
|
|
15
15
|
*/
|
|
16
|
-
export declare const StreamPlayer: import('@videojs/react').CreatePlayerResult<import('@videojs/react').PlayerStore<[import('@videojs/react').PlayerFeature<MediaPlaybackState>, import('@videojs/react').PlayerFeature<MediaPlaybackRateState>, import('@videojs/react').PlayerFeature<MediaVolumeState>, import('@videojs/react').PlayerFeature<MediaTimeState>, import('@videojs/react').PlayerFeature<MediaSourceState>, import('@videojs/react').PlayerFeature<import('@videojs/core').MediaBufferState>, import('@videojs/react').PlayerFeature<MediaFullscreenState>, import('@videojs/react').PlayerFeature<MediaPictureInPictureState>, import('@videojs/react').PlayerFeature<import('@videojs/core').MediaRemotePlaybackState>, import('@videojs/react').PlayerFeature<import('@videojs/core').MediaControlsState>, import('@videojs/react').PlayerFeature<import('@videojs/core').MediaTextTrackState>, import('@videojs/react').PlayerFeature<MediaErrorState>, import('@videojs/
|
|
16
|
+
export declare const StreamPlayer: import('@videojs/react').CreatePlayerResult<import('@videojs/react').PlayerStore<[import('@videojs/react').PlayerFeature<MediaPlaybackState>, import('@videojs/react').PlayerFeature<MediaPlaybackRateState>, import('@videojs/react').PlayerFeature<MediaQualityState>, import('@videojs/react').PlayerFeature<MediaAudioTrackState>, import('@videojs/react').PlayerFeature<MediaVolumeState>, import('@videojs/react').PlayerFeature<MediaTimeState>, import('@videojs/react').PlayerFeature<MediaSourceState>, import('@videojs/react').PlayerFeature<import('@videojs/core').MediaBufferState>, import('@videojs/react').PlayerFeature<MediaFullscreenState>, import('@videojs/react').PlayerFeature<MediaPictureInPictureState>, import('@videojs/react').PlayerFeature<import('@videojs/core').MediaRemotePlaybackState>, import('@videojs/react').PlayerFeature<import('@videojs/core').MediaControlsState>, import('@videojs/react').PlayerFeature<import('@videojs/core').MediaTextTrackState>, import('@videojs/react').PlayerFeature<MediaErrorState>, import('@videojs/react').PlayerFeature<MediaStreamTypeState>, import('@videojs/react').PlayerFeature<MediaLiveState>]>>;
|
|
17
17
|
/**
|
|
18
18
|
* Merged state of {@link StreamPlayer}'s store — the intersection of the
|
|
19
19
|
* feature states we enable. v10's generics widen a spread feature array to
|
|
@@ -21,7 +21,7 @@ export declare const StreamPlayer: import('@videojs/react').CreatePlayerResult<i
|
|
|
21
21
|
* contracts (which the selectors are typed against) instead of relying on
|
|
22
22
|
* inference.
|
|
23
23
|
*/
|
|
24
|
-
export type StreamPlayerState = MediaPlaybackState & MediaVolumeState & MediaTimeState & MediaSourceState & MediaPlaybackRateState & MediaFullscreenState & MediaPictureInPictureState & MediaErrorState & MediaStreamTypeState & MediaLiveState;
|
|
24
|
+
export type StreamPlayerState = MediaPlaybackState & MediaVolumeState & MediaTimeState & MediaSourceState & MediaPlaybackRateState & MediaFullscreenState & MediaPictureInPictureState & MediaErrorState & MediaStreamTypeState & MediaLiveState & MediaQualityState & MediaAudioTrackState;
|
|
25
25
|
/**
|
|
26
26
|
* The store handle returned by `StreamPlayer.usePlayer()` (no selector): a
|
|
27
27
|
* `BaseStore` intersected with the merged feature state, so actions and state
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"player.factory.d.ts","sourceRoot":"","sources":["../../../../../../packages/gclick/src/components/VideoPlayer/player.factory.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EACf,oBAAoB,EACpB,cAAc,EACd,0BAA0B,EAC1B,sBAAsB,EACtB,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EACjB,MAAM,eAAe,CAAC;AAEvB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,YAAY,
|
|
1
|
+
{"version":3,"file":"player.factory.d.ts","sourceRoot":"","sources":["../../../../../../packages/gclick/src/components/VideoPlayer/player.factory.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,oBAAoB,EACpB,eAAe,EACf,oBAAoB,EACpB,cAAc,EACd,0BAA0B,EAC1B,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EACjB,MAAM,eAAe,CAAC;AAEvB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,YAAY,4nCAGvB,CAAC;AAEH;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GAAG,kBAAkB,GAC9C,gBAAgB,GAChB,cAAc,GACd,gBAAgB,GAChB,sBAAsB,GACtB,oBAAoB,GACpB,0BAA0B,GAC1B,eAAe,GACf,oBAAoB,GACpB,cAAc,GAMd,iBAAiB,GACjB,oBAAoB,CAAC;AAEzB;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG,SAAS,CAAC,OAAO,EAAE,iBAAiB,CAAC,GAAG,iBAAiB,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Wrapper around the official v10 skin. It carries the WHOLE vendor skin
|
|
3
|
-
* stylesheet translated to Emotion (`
|
|
3
|
+
* stylesheet translated to Emotion (`Videojs*Skin.styles.ts`, spread in
|
|
4
4
|
* `VideoPlayer.styles.ts`): every skin selector is scoped under this slot's
|
|
5
5
|
* class, so the skin `Container` must stay a descendant of this element. It
|
|
6
6
|
* also sizes the skin to fill the parent and flattens the frame
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ReactNode } from 'react';
|
|
2
|
+
import { VideoPlayerVariant } from '../types';
|
|
2
3
|
/** Public props of the composed skin — the official skin contract plus `isLive`. */
|
|
3
4
|
export interface GclickVideoSkinProps {
|
|
4
5
|
children?: ReactNode;
|
|
@@ -6,16 +7,18 @@ export interface GclickVideoSkinProps {
|
|
|
6
7
|
poster?: string;
|
|
7
8
|
/** While live: show the native `<LiveButton>` and hide the seek region. */
|
|
8
9
|
isLive: boolean;
|
|
10
|
+
/** Which vendor skin to wear. Decides the class names, not the stylesheet. */
|
|
11
|
+
variant: VideoPlayerVariant;
|
|
9
12
|
}
|
|
10
13
|
/**
|
|
11
14
|
* Single official-v10 skin for both live and VOD, composed from the dependency's
|
|
12
15
|
* building blocks + official `media-*` classes (styled by the vendor stylesheet
|
|
13
|
-
* translated to Emotion
|
|
16
|
+
* translated to Emotion, scoped at the root slot;
|
|
14
17
|
* no custom per-control CSS). It unifies the VOD and live presets: while `isLive`
|
|
15
18
|
* the control bar shows the native `<LiveButton>` and drops the seek region; once
|
|
16
19
|
* the stream ends (`isLive` flips false) it shows the skip controls + the time
|
|
17
20
|
* slider. Because it is one component (no skin swap), the `<video>` is never
|
|
18
21
|
* remounted on the live → VOD transition.
|
|
19
22
|
*/
|
|
20
|
-
export declare function GclickVideoSkin({ children, className, poster, isLive }: GclickVideoSkinProps): ReactNode;
|
|
23
|
+
export declare function GclickVideoSkin({ children, className, poster, isLive, variant, }: GclickVideoSkinProps): ReactNode;
|
|
21
24
|
//# sourceMappingURL=GclickVideoSkin.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GclickVideoSkin.d.ts","sourceRoot":"","sources":["../../../../../../../packages/gclick/src/components/VideoPlayer/subcomponents/GclickVideoSkin.tsx"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"GclickVideoSkin.d.ts","sourceRoot":"","sources":["../../../../../../../packages/gclick/src/components/VideoPlayer/subcomponents/GclickVideoSkin.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAqCvC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAQnD,oFAAoF;AACpF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,MAAM,EAAE,OAAO,CAAC;IAChB,8EAA8E;IAC9E,OAAO,EAAE,kBAAkB,CAAC;CAC7B;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,SAAS,EACT,MAAM,EACN,MAAM,EACN,OAAO,GACR,EAAE,oBAAoB,GAAG,SAAS,CAQlC"}
|
|
@@ -1,186 +1,42 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
import { jsx as r, jsxs as s } from "@emotion/react/jsx-runtime";
|
|
2
|
+
import { Container as t, Poster as d, BufferingIndicator as l } from "@videojs/react";
|
|
3
|
+
import { SpinnerIcon as f } from "@videojs/react/icons";
|
|
4
|
+
import { cx as p } from "./skin/primitives.js";
|
|
5
|
+
import { SkinVariantProvider as u, useSkinClasses as k } from "./skin/skinVariant.js";
|
|
6
|
+
import { VideoControlBar as v } from "./skin/VideoControlBar.js";
|
|
7
|
+
import { VideoErrorDialog as N } from "./skin/VideoErrorDialog.js";
|
|
8
|
+
import { VideoInputBindings as S } from "./skin/VideoInputBindings.js";
|
|
9
|
+
function b({
|
|
10
|
+
children: o,
|
|
11
|
+
className: e,
|
|
12
|
+
poster: i,
|
|
13
|
+
isLive: n,
|
|
14
|
+
variant: m
|
|
15
|
+
}) {
|
|
16
|
+
return /* @__PURE__ */ r(u, { variant: m, children: /* @__PURE__ */ r(V, { className: e, poster: i, isLive: n, children: o }) });
|
|
8
17
|
}
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
18
|
+
function V({
|
|
19
|
+
children: o,
|
|
20
|
+
className: e,
|
|
21
|
+
poster: i,
|
|
22
|
+
isLive: n
|
|
23
|
+
}) {
|
|
24
|
+
const { root: m, surface: a } = k();
|
|
25
|
+
return /* @__PURE__ */ s(t, { className: p(m, e), children: [
|
|
26
|
+
o,
|
|
27
|
+
i ? /* @__PURE__ */ r(d, { src: i }) : null,
|
|
28
|
+
/* @__PURE__ */ r(
|
|
29
|
+
l,
|
|
13
30
|
{
|
|
14
|
-
|
|
15
|
-
type: "button",
|
|
16
|
-
className: v("media-button media-button--subtle media-button--icon", t),
|
|
17
|
-
...r
|
|
18
|
-
}
|
|
19
|
-
);
|
|
20
|
-
}
|
|
21
|
-
);
|
|
22
|
-
function Q() {
|
|
23
|
-
const n = /* @__PURE__ */ a(C, { className: "media-button--mute", render: /* @__PURE__ */ e(c, {}), children: [
|
|
24
|
-
/* @__PURE__ */ e(z, { className: "media-icon media-icon--volume-off" }),
|
|
25
|
-
/* @__PURE__ */ e(J, { className: "media-icon media-icon--volume-low" }),
|
|
26
|
-
/* @__PURE__ */ e(L, { className: "media-icon media-icon--volume-high" })
|
|
27
|
-
] });
|
|
28
|
-
return /* @__PURE__ */ a(h.Root, { openOnHover: !0, delay: 200, closeDelay: 100, side: "top", children: [
|
|
29
|
-
/* @__PURE__ */ e(h.Trigger, { render: n }),
|
|
30
|
-
/* @__PURE__ */ e(h.Popup, { className: "media-surface media-popover media-popover--volume", children: /* @__PURE__ */ a(M.Root, { className: "media-slider", orientation: "vertical", thumbAlignment: "edge", children: [
|
|
31
|
-
/* @__PURE__ */ e(s.Track, { className: "media-slider__track", children: /* @__PURE__ */ e(s.Fill, { className: "media-slider__fill" }) }),
|
|
32
|
-
/* @__PURE__ */ e(s.Thumb, { className: "media-slider__thumb media-slider__thumb--persistent" })
|
|
33
|
-
] }) })
|
|
34
|
-
] });
|
|
35
|
-
}
|
|
36
|
-
function W() {
|
|
37
|
-
const { options: n, setValue: t, value: r } = F();
|
|
38
|
-
return /* @__PURE__ */ e(
|
|
39
|
-
N.RadioGroup,
|
|
40
|
-
{
|
|
41
|
-
className: "media-menu__group",
|
|
42
|
-
value: r,
|
|
43
|
-
onValueChange: t,
|
|
44
|
-
label: "Playback rate",
|
|
45
|
-
children: n.map((o) => /* @__PURE__ */ a(
|
|
46
|
-
N.RadioItem,
|
|
47
|
-
{
|
|
48
|
-
className: "media-menu__item",
|
|
49
|
-
value: o.value,
|
|
50
|
-
disabled: o.disabled,
|
|
51
|
-
children: [
|
|
52
|
-
/* @__PURE__ */ e("span", { children: o.label }),
|
|
53
|
-
/* @__PURE__ */ e(
|
|
54
|
-
N.ItemIndicator,
|
|
55
|
-
{
|
|
56
|
-
checked: o.value === r,
|
|
57
|
-
forceMount: !0,
|
|
58
|
-
className: "media-menu__indicator",
|
|
59
|
-
children: /* @__PURE__ */ e(q, { className: "media-icon" })
|
|
60
|
-
}
|
|
61
|
-
)
|
|
62
|
-
]
|
|
63
|
-
},
|
|
64
|
-
o.value
|
|
65
|
-
))
|
|
66
|
-
}
|
|
67
|
-
);
|
|
68
|
-
}
|
|
69
|
-
function ee({ children: n, className: t, poster: r, isLive: o }) {
|
|
70
|
-
return /* @__PURE__ */ a(I, { className: v("media-default-skin media-default-skin--video", t), children: [
|
|
71
|
-
n,
|
|
72
|
-
r ? /* @__PURE__ */ e(R, { src: r }) : null,
|
|
73
|
-
/* @__PURE__ */ e(
|
|
74
|
-
T,
|
|
75
|
-
{
|
|
76
|
-
render: (k) => /* @__PURE__ */ e("div", { ...k, className: "media-buffering-indicator", children: /* @__PURE__ */ e("div", { className: "media-surface", children: /* @__PURE__ */ e(D, { className: "media-icon" }) }) })
|
|
31
|
+
render: (c) => /* @__PURE__ */ r("div", { ...c, className: "media-buffering-indicator", children: /* @__PURE__ */ r("div", { className: a, children: /* @__PURE__ */ r(f, { className: "media-icon" }) }) })
|
|
77
32
|
}
|
|
78
33
|
),
|
|
79
|
-
/* @__PURE__ */
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
] }),
|
|
84
|
-
/* @__PURE__ */ e("div", { className: "media-error__actions", children: /* @__PURE__ */ e(m.Close, { className: "media-button media-button--primary", children: "OK" }) })
|
|
85
|
-
] }) }) }),
|
|
86
|
-
/* @__PURE__ */ e(B.Root, { className: "media-surface media-controls", children: /* @__PURE__ */ a(i.Provider, { children: [
|
|
87
|
-
/* @__PURE__ */ a("div", { className: "media-button-group", children: [
|
|
88
|
-
/* @__PURE__ */ a(i.Root, { side: "top", children: [
|
|
89
|
-
/* @__PURE__ */ e(
|
|
90
|
-
i.Trigger,
|
|
91
|
-
{
|
|
92
|
-
render: /* @__PURE__ */ a(S, { className: "media-button--play", render: /* @__PURE__ */ e(c, {}), children: [
|
|
93
|
-
/* @__PURE__ */ e(A, { className: "media-icon media-icon--restart" }),
|
|
94
|
-
/* @__PURE__ */ e(j, { className: "media-icon media-icon--play" }),
|
|
95
|
-
/* @__PURE__ */ e(G, { className: "media-icon media-icon--pause" })
|
|
96
|
-
] })
|
|
97
|
-
}
|
|
98
|
-
),
|
|
99
|
-
/* @__PURE__ */ e(i.Popup, { className: "media-surface media-tooltip" })
|
|
100
|
-
] }),
|
|
101
|
-
o ? /* @__PURE__ */ e(V, { className: "media-button media-button--subtle media-button--live" }) : /* @__PURE__ */ a(y, { children: [
|
|
102
|
-
/* @__PURE__ */ a(i.Root, { side: "top", children: [
|
|
103
|
-
/* @__PURE__ */ e(
|
|
104
|
-
i.Trigger,
|
|
105
|
-
{
|
|
106
|
-
render: /* @__PURE__ */ e(f, { seconds: -d, className: "media-button--seek", render: /* @__PURE__ */ e(c, {}), children: /* @__PURE__ */ a("span", { className: "media-icon__container", children: [
|
|
107
|
-
/* @__PURE__ */ e(_, { className: "media-icon media-icon--seek media-icon--flipped" }),
|
|
108
|
-
/* @__PURE__ */ e("span", { className: "media-icon__label", children: d })
|
|
109
|
-
] }) })
|
|
110
|
-
}
|
|
111
|
-
),
|
|
112
|
-
/* @__PURE__ */ e(i.Popup, { className: "media-surface media-tooltip" })
|
|
113
|
-
] }),
|
|
114
|
-
/* @__PURE__ */ a(i.Root, { side: "top", children: [
|
|
115
|
-
/* @__PURE__ */ e(
|
|
116
|
-
i.Trigger,
|
|
117
|
-
{
|
|
118
|
-
render: /* @__PURE__ */ e(f, { seconds: d, className: "media-button--seek", render: /* @__PURE__ */ e(c, {}), children: /* @__PURE__ */ a("span", { className: "media-icon__container", children: [
|
|
119
|
-
/* @__PURE__ */ e(_, { className: "media-icon media-icon--seek" }),
|
|
120
|
-
/* @__PURE__ */ e("span", { className: "media-icon__label", children: d })
|
|
121
|
-
] }) })
|
|
122
|
-
}
|
|
123
|
-
),
|
|
124
|
-
/* @__PURE__ */ e(i.Popup, { className: "media-surface media-tooltip" })
|
|
125
|
-
] })
|
|
126
|
-
] })
|
|
127
|
-
] }),
|
|
128
|
-
o ? /* @__PURE__ */ e("div", { className: "media-time-controls", "aria-hidden": "true" }) : /* @__PURE__ */ a("div", { className: "media-time-controls", children: [
|
|
129
|
-
/* @__PURE__ */ e(b.Value, { type: "current", className: "media-time" }),
|
|
130
|
-
/* @__PURE__ */ a(w.Root, { className: "media-slider", children: [
|
|
131
|
-
/* @__PURE__ */ a(s.Track, { className: "media-slider__track", children: [
|
|
132
|
-
/* @__PURE__ */ e(s.Fill, { className: "media-slider__fill" }),
|
|
133
|
-
/* @__PURE__ */ e(s.Buffer, { className: "media-slider__buffer" })
|
|
134
|
-
] }),
|
|
135
|
-
/* @__PURE__ */ e(s.Thumb, { className: "media-slider__thumb" })
|
|
136
|
-
] }),
|
|
137
|
-
/* @__PURE__ */ e(b.Value, { type: "duration", className: "media-time" })
|
|
138
|
-
] }),
|
|
139
|
-
/* @__PURE__ */ a("div", { className: "media-button-group", children: [
|
|
140
|
-
o ? null : /* @__PURE__ */ a(u.Root, { side: "top", align: "center", children: [
|
|
141
|
-
/* @__PURE__ */ e(u.Trigger, { className: "media-button--playback-rate", render: /* @__PURE__ */ e(c, {}) }),
|
|
142
|
-
/* @__PURE__ */ e(u.Content, { className: "media-surface media-popover media-menu media-menu--playback-rate", children: /* @__PURE__ */ e(W, {}) })
|
|
143
|
-
] }),
|
|
144
|
-
/* @__PURE__ */ e(Q, {}),
|
|
145
|
-
/* @__PURE__ */ a(i.Root, { side: "top", children: [
|
|
146
|
-
/* @__PURE__ */ e(
|
|
147
|
-
i.Trigger,
|
|
148
|
-
{
|
|
149
|
-
render: /* @__PURE__ */ a(x, { className: "media-button--pip", render: /* @__PURE__ */ e(c, {}), children: [
|
|
150
|
-
/* @__PURE__ */ e(H, { className: "media-icon media-icon--pip-enter" }),
|
|
151
|
-
/* @__PURE__ */ e(O, { className: "media-icon media-icon--pip-exit" })
|
|
152
|
-
] })
|
|
153
|
-
}
|
|
154
|
-
),
|
|
155
|
-
/* @__PURE__ */ e(i.Popup, { className: "media-surface media-tooltip" })
|
|
156
|
-
] }),
|
|
157
|
-
/* @__PURE__ */ a(i.Root, { side: "top", children: [
|
|
158
|
-
/* @__PURE__ */ e(
|
|
159
|
-
i.Trigger,
|
|
160
|
-
{
|
|
161
|
-
render: /* @__PURE__ */ a(E, { className: "media-button--fullscreen", render: /* @__PURE__ */ e(c, {}), children: [
|
|
162
|
-
/* @__PURE__ */ e(K, { className: "media-icon media-icon--fullscreen-enter" }),
|
|
163
|
-
/* @__PURE__ */ e(U, { className: "media-icon media-icon--fullscreen-exit" })
|
|
164
|
-
] })
|
|
165
|
-
}
|
|
166
|
-
),
|
|
167
|
-
/* @__PURE__ */ e(i.Popup, { className: "media-surface media-tooltip" })
|
|
168
|
-
] })
|
|
169
|
-
] })
|
|
170
|
-
] }) }),
|
|
171
|
-
/* @__PURE__ */ e("div", { className: "media-overlay" }),
|
|
172
|
-
/* @__PURE__ */ e(l, { keys: "Space", action: "togglePaused" }),
|
|
173
|
-
/* @__PURE__ */ e(l, { keys: "k", action: "togglePaused" }),
|
|
174
|
-
/* @__PURE__ */ e(l, { keys: "m", action: "toggleMuted" }),
|
|
175
|
-
/* @__PURE__ */ e(l, { keys: "f", action: "toggleFullscreen" }),
|
|
176
|
-
/* @__PURE__ */ e(l, { keys: "i", action: "togglePictureInPicture" }),
|
|
177
|
-
/* @__PURE__ */ e(l, { keys: "ArrowUp", action: "volumeStep", value: 0.05 }),
|
|
178
|
-
/* @__PURE__ */ e(l, { keys: "ArrowDown", action: "volumeStep", value: -0.05 }),
|
|
179
|
-
/* @__PURE__ */ e(p, { type: "tap", action: "togglePaused", pointer: "mouse", region: "center" }),
|
|
180
|
-
/* @__PURE__ */ e(p, { type: "tap", action: "toggleControls", pointer: "touch" }),
|
|
181
|
-
/* @__PURE__ */ e(p, { type: "doubletap", action: "toggleFullscreen", region: "center" })
|
|
34
|
+
/* @__PURE__ */ r(N, {}),
|
|
35
|
+
/* @__PURE__ */ r(v, { isLive: n }),
|
|
36
|
+
/* @__PURE__ */ r("div", { className: "media-overlay" }),
|
|
37
|
+
/* @__PURE__ */ r(S, {})
|
|
182
38
|
] });
|
|
183
39
|
}
|
|
184
40
|
export {
|
|
185
|
-
|
|
41
|
+
b as GclickVideoSkin
|
|
186
42
|
};
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { Ref } from 'react';
|
|
2
|
-
import { VideoPlayerControl, VideoPlayerError } from '../types';
|
|
2
|
+
import { VideoPlayerControl, VideoPlayerError, VideoPlayerVariant } from '../types';
|
|
3
3
|
/** Props of the inner stage — the public props resolved + the forwarded ref. */
|
|
4
4
|
export interface VideoPlayerStageProps {
|
|
5
5
|
src: string;
|
|
6
6
|
poster?: string;
|
|
7
|
+
variant: VideoPlayerVariant;
|
|
7
8
|
className?: string;
|
|
8
9
|
controlRef?: Ref<VideoPlayerControl>;
|
|
9
10
|
onReady?: () => void;
|
|
@@ -17,10 +18,10 @@ export interface VideoPlayerStageProps {
|
|
|
17
18
|
/**
|
|
18
19
|
* Inner stage rendered inside `StreamPlayer.Provider`. It bridges the imperative
|
|
19
20
|
* handle + event callbacks (via `usePlayer`), then renders the composed v10 skin
|
|
20
|
-
* ({@link GclickVideoSkin}) wrapping the credentialed `<
|
|
21
|
+
* ({@link GclickVideoSkin}) wrapping the credentialed `<HlsJsVideo>`. The skin owns
|
|
21
22
|
* the chrome — controls, layout, poster and the fullscreen target — and swaps the
|
|
22
23
|
* seek bar ↔ native live button by `isLive`; we only wrap it to size and flatten
|
|
23
24
|
* the frame.
|
|
24
25
|
*/
|
|
25
|
-
export declare function VideoPlayerStage({ src, poster, className, controlRef, onReady, onPlay, onPause, onEnded, onWaiting, onError, onDurationChange, }: VideoPlayerStageProps): import("@emotion/react/jsx-runtime").JSX.Element;
|
|
26
|
+
export declare function VideoPlayerStage({ src, poster, variant, className, controlRef, onReady, onPlay, onPause, onEnded, onWaiting, onError, onDurationChange, }: VideoPlayerStageProps): import("@emotion/react/jsx-runtime").JSX.Element;
|
|
26
27
|
//# sourceMappingURL=VideoPlayerStage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VideoPlayerStage.d.ts","sourceRoot":"","sources":["../../../../../../../packages/gclick/src/components/VideoPlayer/subcomponents/VideoPlayerStage.tsx"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AAiBlD,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"VideoPlayerStage.d.ts","sourceRoot":"","sources":["../../../../../../../packages/gclick/src/components/VideoPlayer/subcomponents/VideoPlayerStage.tsx"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AAiBlD,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAEzF,gFAAgF;AAChF,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,kBAAkB,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,KAAK,IAAI,CAAC;IACnD,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CAChE;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,GAAG,EACH,MAAM,EACN,OAAO,EACP,SAAS,EACT,UAAU,EACV,OAAO,EACP,MAAM,EACN,OAAO,EACP,OAAO,EACP,SAAS,EACT,OAAO,EACP,gBAAgB,GACjB,EAAE,qBAAqB,oDA+CvB"}
|