@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.
Files changed (58) hide show
  1. package/components/CameraStream/defaults/DefaultPhaseStreaming.d.ts +2 -2
  2. package/components/CameraStream/defaults/DefaultPhaseStreaming.d.ts.map +1 -1
  3. package/components/CameraStream/defaults/DefaultPhaseStreaming.js +23 -21
  4. package/components/CameraStream/types.d.ts +9 -0
  5. package/components/CameraStream/types.d.ts.map +1 -1
  6. package/components/VideoPlayer/VideoPlayer.d.ts +4 -1
  7. package/components/VideoPlayer/VideoPlayer.d.ts.map +1 -1
  8. package/components/VideoPlayer/VideoPlayer.js +28 -25
  9. package/components/VideoPlayer/VideoPlayer.styles.d.ts +7 -1
  10. package/components/VideoPlayer/VideoPlayer.styles.d.ts.map +1 -1
  11. package/components/VideoPlayer/VideoPlayer.styles.js +72 -10
  12. package/components/VideoPlayer/VideojsDefaultSkin.styles.d.ts +8 -0
  13. package/components/VideoPlayer/VideojsDefaultSkin.styles.d.ts.map +1 -0
  14. package/components/VideoPlayer/{VideojsSkin.styles.js → VideojsDefaultSkin.styles.js} +478 -248
  15. package/components/VideoPlayer/VideojsMinimalSkin.styles.d.ts +8 -0
  16. package/components/VideoPlayer/VideojsMinimalSkin.styles.d.ts.map +1 -0
  17. package/components/VideoPlayer/VideojsMinimalSkin.styles.js +1561 -0
  18. package/components/VideoPlayer/constants.d.ts +33 -0
  19. package/components/VideoPlayer/constants.d.ts.map +1 -1
  20. package/components/VideoPlayer/constants.js +20 -4
  21. package/components/VideoPlayer/hlsConfig.d.ts +21 -11
  22. package/components/VideoPlayer/hlsConfig.d.ts.map +1 -1
  23. package/components/VideoPlayer/hlsConfig.js +28 -21
  24. package/components/VideoPlayer/index.d.ts +2 -2
  25. package/components/VideoPlayer/index.d.ts.map +1 -1
  26. package/components/VideoPlayer/player.factory.d.ts +3 -3
  27. package/components/VideoPlayer/player.factory.d.ts.map +1 -1
  28. package/components/VideoPlayer/slots/VideoPlayerSlots.d.ts +1 -1
  29. package/components/VideoPlayer/subcomponents/GclickVideoSkin.d.ts +5 -2
  30. package/components/VideoPlayer/subcomponents/GclickVideoSkin.d.ts.map +1 -1
  31. package/components/VideoPlayer/subcomponents/GclickVideoSkin.js +34 -178
  32. package/components/VideoPlayer/subcomponents/VideoPlayerStage.d.ts +4 -3
  33. package/components/VideoPlayer/subcomponents/VideoPlayerStage.d.ts.map +1 -1
  34. package/components/VideoPlayer/subcomponents/VideoPlayerStage.js +43 -42
  35. package/components/VideoPlayer/subcomponents/skin/VideoControlBar.d.ts +6 -0
  36. package/components/VideoPlayer/subcomponents/skin/VideoControlBar.d.ts.map +1 -0
  37. package/components/VideoPlayer/subcomponents/skin/VideoControlBar.js +87 -0
  38. package/components/VideoPlayer/subcomponents/skin/VideoErrorDialog.d.ts +9 -0
  39. package/components/VideoPlayer/subcomponents/skin/VideoErrorDialog.d.ts.map +1 -0
  40. package/components/VideoPlayer/subcomponents/skin/VideoErrorDialog.js +17 -0
  41. package/components/VideoPlayer/subcomponents/skin/VideoInputBindings.d.ts +11 -0
  42. package/components/VideoPlayer/subcomponents/skin/VideoInputBindings.d.ts.map +1 -0
  43. package/components/VideoPlayer/subcomponents/skin/VideoInputBindings.js +19 -0
  44. package/components/VideoPlayer/subcomponents/skin/VideoSettingsMenu.d.ts +9 -0
  45. package/components/VideoPlayer/subcomponents/skin/VideoSettingsMenu.d.ts.map +1 -0
  46. package/components/VideoPlayer/subcomponents/skin/VideoSettingsMenu.js +48 -0
  47. package/components/VideoPlayer/subcomponents/skin/primitives.d.ts +81 -0
  48. package/components/VideoPlayer/subcomponents/skin/primitives.d.ts.map +1 -0
  49. package/components/VideoPlayer/subcomponents/skin/primitives.js +142 -0
  50. package/components/VideoPlayer/subcomponents/skin/skinVariant.d.ts +19 -0
  51. package/components/VideoPlayer/subcomponents/skin/skinVariant.d.ts.map +1 -0
  52. package/components/VideoPlayer/subcomponents/skin/skinVariant.js +23 -0
  53. package/components/VideoPlayer/types.d.ts +25 -6
  54. package/components/VideoPlayer/types.d.ts.map +1 -1
  55. package/index.js +123 -122
  56. package/package.json +4 -4
  57. package/components/VideoPlayer/VideojsSkin.styles.d.ts +0 -9
  58. 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 _ = "M4LVideoPlayer", e = "use-credentials", E = "mse";
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
- _ as COMPONENT_VIDEO_PLAYER_KEY_COMPONENT,
4
- e as HLS_CROSS_ORIGIN,
5
- E as HLS_PREFER_PLAYBACK
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
- * hls.js configuration so every HLS request (manifest + each segment) carries
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: the `config` object
6
- * passed to `<HlsVideo>` is spread directly into the hls.js constructor
7
- * (`new Hls({ ...defaultHlsConfig, ...config })`). We therefore hook BOTH the
8
- * default XHR loader (`xhrSetup`) and the Fetch loader (`fetchSetup`) so the
9
- * cookies travel regardless of which loader hls.js selects, and we force
10
- * `autoStartLoad` because v10 defaults it to `false` — without it a muted
11
- * autoplay tile would mount but never begin fetching.
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 `<HlsVideo>` (see {@link HLS_CROSS_ORIGIN}) covers that path.
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(): Record<string, unknown>;
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":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAyBpE"}
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
- // v10 default is `false` (lazy load); force eager load so muted autoplay
4
- // starts fetching as soon as the tile mounts.
5
- autoStartLoad: !0,
6
- // Start from the beginning, NOT the live edge. hls.js defaults to the live
7
- // edge for live streams, which anchors the MSE timeline mid-stream — once a
8
- // finished live stream flips to VOD, the segments before the join point can
9
- // no longer be buffered, so the seek bar cannot reach 0:00 (it loops
10
- // re-fetching the first segment). Anchoring at 0 buffers the whole stream
11
- // from the start, so the recording is fully seekable once it ends.
12
- startPosition: 0,
13
- /** Default XHR loader hook — sends cookies on every manifest + segment XHR. */
14
- xhrSetup: (e) => {
15
- e.withCredentials = !0;
16
- },
17
- /**
18
- * Fetch loader hook — `xhrSetup` only fires when hls.js uses the XHR
19
- * loader, so we also set `credentials: 'include'` for the Fetch path.
20
- */
21
- fetchSetup: (e, t) => (t.credentials = "include", new Request(e.url, t))
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
- r as buildCredentialedHlsConfig
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,GACjB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,oCAAoC,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC"}
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/store').Slice<import('@videojs/react').PlayerTarget, MediaStreamTypeState>, import('@videojs/store').Slice<import('@videojs/react').PlayerTarget, MediaLiveState>]>>;
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,ikCAGvB,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,CAAC;AAEnB;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG,SAAS,CAAC,OAAO,EAAE,iBAAiB,CAAC,GAAG,iBAAiB,CAAC"}
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 (`VideojsSkin.styles.ts`, spread in
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 in `VideojsSkin.styles.ts`, scoped at the root slot;
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,EAAc,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAmInD,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;CACjB;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,oBAAoB,GAAG,SAAS,CAiJxG"}
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 { jsxs as a, jsx as e, Fragment as y } from "@emotion/react/jsx-runtime";
2
- import { forwardRef as P } from "react";
3
- import { Container as I, Poster as R, BufferingIndicator as T, ErrorDialog as g, AlertDialog as m, Controls as B, Tooltip as i, PlayButton as S, LiveButton as V, SeekButton as f, Time as b, TimeSlider as w, Slider as s, PlaybackRateMenu as u, PiPButton as x, FullscreenButton as E, Hotkey as l, Gesture as p, usePlaybackRateMenu as F, Menu as N, Popover as h, VolumeSlider as M, MuteButton as C } from "@videojs/react";
4
- import { SpinnerIcon as D, RestartIcon as A, PlayIcon as j, PauseIcon as G, SeekIcon as _, PipEnterIcon as H, PipExitIcon as O, FullscreenEnterIcon as K, FullscreenExitIcon as U, CheckIcon as q, VolumeOffIcon as z, VolumeLowIcon as J, VolumeHighIcon as L } from "@videojs/react/icons";
5
- const d = 10;
6
- function v(...n) {
7
- return n.filter(Boolean).join(" ");
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
- const c = P(
10
- function({ className: t, ...r }, o) {
11
- return /* @__PURE__ */ e(
12
- "button",
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
- ref: o,
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__ */ e(g.Root, { children: /* @__PURE__ */ e(m.Popup, { className: "media-error", children: /* @__PURE__ */ a("div", { className: "media-error__dialog media-surface", children: [
80
- /* @__PURE__ */ a("div", { className: "media-error__content", children: [
81
- /* @__PURE__ */ e(m.Title, { className: "media-error__title", children: "Something went wrong." }),
82
- /* @__PURE__ */ e(g.Description, { className: "media-error__description" })
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
- ee as GclickVideoSkin
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 `<HlsVideo>`. The skin owns
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;AAErE,gFAAgF;AAChF,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,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,SAAS,EACT,UAAU,EACV,OAAO,EACP,MAAM,EACN,OAAO,EACP,OAAO,EACP,SAAS,EACT,OAAO,EACP,gBAAgB,GACjB,EAAE,qBAAqB,oDA6CvB"}
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"}