boss-web-player-sdk 1.0.2

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 GoBOSS
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,339 @@
1
+ # boss-web-player-sdk
2
+
3
+ A unified, high-performance OTT web video player SDK for adaptive streaming — HLS/DASH, token-based DRM, dynamic watermarking, captions, chapters, casting, and premium UI controls.
4
+
5
+ > **Heads up:** the high-level `<BossVideoPlayer>` component is **tenant-gated**. It validates a GoBOSS **player key** against the GoBOSS API before playback starts, and resolves its feature set (subtitles, DRM, chromecast, etc.) from your plan. You need a player key from the GoBOSS dashboard to use it. For a generic, ungated player use the [headless core entry](#headless-core-no-react).
6
+
7
+ ## Features
8
+
9
+ - **Adaptive streaming** — HLS (bundled `hls.js`) and DASH (bundled `dashjs`) with automatic quality switching
10
+ - **DRM** — token-based authorization, FairPlay / Widevine, dynamic watermarking
11
+ - **Rich controls** — quality, playback speed, subtitles, PiP, fullscreen, chapters/key-moments
12
+ - **Casting** — Chromecast and AirPlay
13
+ - **Server-side ads (SSAI)** — AWS MediaTailor ad-break tracking and skip-ad flow
14
+ - **Analytics** — `onAnalyticsEvent` callback + optional Firebase Analytics provider
15
+ - **Framework-agnostic** — React component, a vanilla `createPlayer()` mount, and a zero-React headless core
16
+
17
+ ## Installation
18
+
19
+ ```bash
20
+ npm install boss-web-player-sdk
21
+ ```
22
+
23
+ ### Peer dependencies
24
+
25
+ | Package | Required? | Notes |
26
+ |---|---|---|
27
+ | `react`, `react-dom` (`^18` or `^19`) | **Required** for the React component & `createPlayer` | Not needed if you only use the headless `/core` entry |
28
+ | `firebase` (`>=10`) | **Optional** | Only needed for **Firebase Analytics**. Install it only if you pass `firebaseConfig`; the SDK installs and runs fine without it. |
29
+
30
+ > **DASH works out of the box.** `dashjs` is bundled into the SDK (lazily, like `hls.js`) — you do **not** need to install it separately. The DASH engine is only fetched by the browser when a `.mpd` stream actually plays, so HLS-only apps never download it.
31
+
32
+ ```bash
33
+ # Only if you use Firebase analytics:
34
+ npm install firebase
35
+ ```
36
+
37
+ ### CSS — required, import once
38
+
39
+ > **The player stylesheet must be imported separately.** The SDK ships CSS as a standalone
40
+ > file so your bundler can handle it correctly (critical for SSR frameworks like Next.js).
41
+ > Forgetting this import will result in a broken, unstyled player.
42
+
43
+ ```ts
44
+ import 'boss-web-player-sdk/css';
45
+ ```
46
+
47
+ Import it once at your app entry point (e.g. `main.tsx`, `_app.tsx`, `layout.tsx`) and it
48
+ applies globally — you do not need to import it in every file that uses `<BossVideoPlayer>`.
49
+
50
+ ## Quick start (React)
51
+
52
+ ```tsx
53
+ import { BossVideoPlayer } from 'boss-web-player-sdk';
54
+ import 'boss-web-player-sdk/css';
55
+
56
+ export default function App() {
57
+ return (
58
+ <BossVideoPlayer
59
+ playerKey="bsp_your_player_key" // from the GoBOSS dashboard (required)
60
+ src="https://cdn.example.com/video.m3u8" // HLS (.m3u8) or DASH (.mpd)
61
+ title="My Video"
62
+ themeColor="#6366f1"
63
+ autoplay
64
+ muted
65
+ />
66
+ );
67
+ }
68
+ ```
69
+
70
+ The component shows a loading spinner while it validates the player key, then renders the
71
+ player. If the key is invalid or the API is unreachable, it renders an error state instead.
72
+
73
+ ## Next.js
74
+
75
+ The SDK works in Next.js (both Pages Router and App Router). The player is entirely
76
+ client-side — it uses browser APIs (`HTMLVideoElement`, `window`, `navigator`) that do not
77
+ exist on the server.
78
+
79
+ **App Router** — mark any file that imports the player as a Client Component:
80
+
81
+ ```tsx
82
+ // app/watch/page.tsx
83
+ 'use client';
84
+
85
+ import { BossVideoPlayer } from 'boss-web-player-sdk';
86
+
87
+ export default function WatchPage() {
88
+ return (
89
+ <BossVideoPlayer
90
+ playerKey="bsp_your_player_key"
91
+ src="https://cdn.example.com/video.m3u8"
92
+ autoplay
93
+ muted
94
+ />
95
+ );
96
+ }
97
+ ```
98
+
99
+ Import the CSS in your root layout so it loads once for the whole app:
100
+
101
+ ```tsx
102
+ // app/layout.tsx
103
+ import 'boss-web-player-sdk/css';
104
+
105
+ export default function RootLayout({ children }: { children: React.ReactNode }) {
106
+ return <html><body>{children}</body></html>;
107
+ }
108
+ ```
109
+
110
+ **Pages Router** — import the CSS in `_app.tsx` (or `_app.js`):
111
+
112
+ ```tsx
113
+ // pages/_app.tsx
114
+ import 'boss-web-player-sdk/css';
115
+ import type { AppProps } from 'next/app';
116
+
117
+ export default function App({ Component, pageProps }: AppProps) {
118
+ return <Component {...pageProps} />;
119
+ }
120
+ ```
121
+
122
+ No `'use client'` directive is needed in the Pages Router — all pages are client-rendered
123
+ by default.
124
+
125
+ ## `<BossVideoPlayer>` props
126
+
127
+ ```ts
128
+ interface BossVideoPlayerProps {
129
+ // ── Required ──────────────────────────────────────────────
130
+ playerKey: string; // GoBOSS player key — gates playback & features
131
+ src: string; // HLS (.m3u8) or DASH (.mpd) URL
132
+
133
+ // ── Identity / theming ────────────────────────────────────
134
+ title?: string; // Title shown in the player UI
135
+ watermark?: string; // Watermark text stamped on the video
136
+ themeColor?: string; // Accent color (hex). Default '#6366f1'
137
+ licenseKey?: string; // Required by DRM-enabled plans (presence-checked)
138
+
139
+ // ── Networking ────────────────────────────────────────────
140
+ apiBaseUrl?: string; // Override the GoBOSS API base URL (see note below)
141
+ proxyDomains?: string; // CORS proxy map, "host=/path,host2=/path2" (see CORS)
142
+
143
+ // ── Ads (AWS MediaTailor SSAI) ────────────────────────────
144
+ adTrackingUrl?: string; // Ad-break tracking URL
145
+ overlayAdUrl?: string; // Overlay ad tracking URL
146
+ enableSkipAd?: boolean;
147
+ skipAdAfterSeconds?: number;
148
+
149
+ // ── Behavior / UI ─────────────────────────────────────────
150
+ autoplay?: boolean; // Default false
151
+ muted?: boolean; // Default false (use with autoplay — browsers block unmuted autoplay)
152
+ autoFullscreen?: boolean;
153
+ enableControls?: boolean; // Default true
154
+ chaptersDisplayMode?: 'strip' | 'panel'; // Default 'strip'
155
+ volumeControlType?: 'slider' | 'button'; // Default 'slider'
156
+ subtitleStyle?: { size?: 'small'|'medium'|'large'; background?: 'none'|'dim'|'solid'; color?: string };
157
+
158
+ // ── Integrations ──────────────────────────────────────────
159
+ firebaseConfig?: FirebaseConfig; // Enables Firebase Analytics (lazy-loads `firebase`)
160
+ drmConfig?: DRMConfig; // DRM license / token configuration
161
+
162
+ // ── Callbacks ─────────────────────────────────────────────
163
+ onAnalyticsEvent?: (event: AnalyticsEvent) => void; // Every analytics event
164
+ onKeyMomentsLoaded?: (keyMoments: Chapter[]) => void; // When chapters parse from the stream
165
+ }
166
+ ```
167
+
168
+ > Feature availability (subtitles, chromecast, DRM, multiple resolutions, etc.) is **resolved from your
169
+ > plan** by the GoBOSS API at init — it is not toggled by individual props on this component.
170
+
171
+ ## Use without JSX — `createPlayer()`
172
+
173
+ For Vue, Angular, Svelte, or vanilla JS. Renders the same gated `<BossVideoPlayer>` into any element.
174
+
175
+ ```ts
176
+ import { createPlayer } from 'boss-web-player-sdk';
177
+ import 'boss-web-player-sdk/css';
178
+
179
+ const player = createPlayer(document.getElementById('player')!, {
180
+ playerKey: 'bsp_your_player_key',
181
+ src: 'https://cdn.example.com/video.m3u8',
182
+ autoplay: true,
183
+ muted: true,
184
+ });
185
+
186
+ player.update({ src: 'https://cdn.example.com/other.m3u8' }); // re-render with new props
187
+ player.destroy(); // unmount & release resources
188
+ ```
189
+
190
+ ## Headless core (no React)
191
+
192
+ Import from the `/core` subpath for a zero-React, zero-UI player and modules. This entry is **not**
193
+ player-key gated — you drive everything yourself.
194
+
195
+ ```ts
196
+ import { VideoPlayerSDK } from 'boss-web-player-sdk/core';
197
+
198
+ const player = new VideoPlayerSDK({
199
+ container: document.getElementById('player')!,
200
+ src: 'https://cdn.example.com/video.m3u8',
201
+ autoplay: false,
202
+ muted: false,
203
+ });
204
+
205
+ // Playback
206
+ player.play();
207
+ player.pause();
208
+ player.seek(30);
209
+ player.setVolume(0.8);
210
+ player.setMute(false);
211
+ player.setPlaybackRate(1.5);
212
+ player.setQuality(qualityId); // id from a `qualitylevels` event entry
213
+
214
+ // Events (EventEmitter-style)
215
+ player.on('play', () => {});
216
+ player.on('qualitychange', (q) => {});
217
+ player.on('subtitlesloaded', (tracks) => {});
218
+
219
+ player.destroy(); // clean up
220
+ ```
221
+
222
+ **Emitted events:** `play`, `pause`, `ended`, `timeupdate`, `seeking`, `buffering`, `volumechange`,
223
+ `ratechange`, `pipchange`, `error`, `qualitylevels`, `qualitychange`, `subtitlesloaded`,
224
+ `audiotracksloaded`, `audiotrackchange`, `keymomentsloaded`, `chaptersloaded`, `adbreaksloaded`,
225
+ `adbreakchange`.
226
+
227
+ The `/core` entry also exposes the individual modules: `AnalyticsModule`, `FirebaseAnalyticsProvider`,
228
+ `SubtitlesModule`, `ThumbnailsModule`, `KeyMomentsModule`, `ChaptersModule`, `CastingModule`,
229
+ `DRMModule`, and `BasePlayerPlugin`.
230
+
231
+ ## CORS & proxying
232
+
233
+ The player fetches the manifest and media segments **from the browser**, so those origins must send CORS
234
+ headers. Two tools help:
235
+
236
+ - **`apiBaseUrl`** — point the SDK's GoBOSS API calls at your own reverse proxy (useful to avoid CORS on
237
+ the API in development).
238
+ - **`proxyDomains`** — a comma-separated `"<host>=/<proxyPath>"` map. Any stream URL whose host matches is
239
+ rewritten to `<proxyPath><pathname><search>`, and applied to the manifest **and** every segment/key
240
+ request. Back each `<proxyPath>` with a same-origin dev proxy.
241
+
242
+ ```tsx
243
+ <BossVideoPlayer
244
+ playerKey="bsp_..."
245
+ src="https://master.example.com/index.m3u8"
246
+ apiBaseUrl="/boss-api"
247
+ proxyDomains="segments.example.com=/seg-proxy,master.example.com=/mt-proxy"
248
+ />
249
+ ```
250
+
251
+ > Proxying is a **development** convenience. For production, configure CORS on the content origin
252
+ > (S3 / CloudFront / MediaTailor) — you cannot proxy every viewer's traffic.
253
+
254
+ ## DRM
255
+
256
+ ```ts
257
+ const drmConfig = {
258
+ authToken: 'bearer-token', // sent with license/segment requests
259
+ watermarkText: 'Your Brand',
260
+ fairplayLicenseUrl: 'https://...', // Safari / Apple
261
+ widevineServiceUrl: 'https://...', // Chrome / Android
262
+ };
263
+ ```
264
+
265
+ `licenseKey` is a separate, plan-level gate: when your resolved plan has DRM enabled, a non-empty
266
+ `licenseKey` must be provided or the player shows a "Playback restricted" overlay.
267
+
268
+ ## Analytics
269
+
270
+ Every player event flows through `onAnalyticsEvent`:
271
+
272
+ ```tsx
273
+ <BossVideoPlayer
274
+ playerKey="bsp_..."
275
+ src="https://cdn.example.com/video.m3u8"
276
+ onAnalyticsEvent={(e) => console.log(e.eventType, e)}
277
+ />
278
+ ```
279
+
280
+ To also forward events to **Firebase Analytics (GA4)**, pass a `firebaseConfig` (and install `firebase`).
281
+ Firebase is loaded lazily — omit the config and the `firebase` package is never required.
282
+
283
+ ## Keyboard shortcuts
284
+
285
+ | Key | Action |
286
+ |---|---|
287
+ | `Space` / `K` | Play / Pause |
288
+ | `J` / `←` | Seek back 10s |
289
+ | `L` / `→` | Seek forward 10s |
290
+ | `↑` / `↓` | Volume ±10% |
291
+ | `M` | Mute toggle |
292
+ | `F` | Fullscreen toggle |
293
+ | `P` | Picture-in-Picture toggle |
294
+ | `C` | Subtitles toggle |
295
+
296
+ ## Exports
297
+
298
+ ```ts
299
+ // React component (gated, drop-in)
300
+ import { BossVideoPlayer, type BossVideoPlayerProps } from 'boss-web-player-sdk';
301
+
302
+ // Framework-agnostic mount
303
+ import { createPlayer, type PlayerProps, type PlayerInstance } from 'boss-web-player-sdk';
304
+
305
+ // Lower-level React UI / headless core
306
+ import { WebVideoPlayer, VideoPlayerSDK } from 'boss-web-player-sdk';
307
+
308
+ // Optional Firebase analytics
309
+ import { FirebaseAnalyticsProvider, type FirebaseConfig } from 'boss-web-player-sdk';
310
+
311
+ // Advanced: raw SDK API calls
312
+ import { initSdk, startSession, sendHeartbeat, endSession, sendEvent } from 'boss-web-player-sdk';
313
+
314
+ // Types
315
+ import type {
316
+ AnalyticsEvent, AnalyticsCallback, Chapter, KeyMoment, SubtitleTrack,
317
+ VideoQuality, ThumbnailConfig, DRMConfig, PlayerSDKOptions,
318
+ FeatureFlags, SubtitleStyle,
319
+ } from 'boss-web-player-sdk';
320
+ ```
321
+
322
+ ## Browser support
323
+
324
+ | Browser | Version |
325
+ |---|---|
326
+ | Chrome / Edge | 90+ |
327
+ | Firefox | 88+ |
328
+ | Safari (incl. iOS) | 14+ |
329
+ | Android Chrome | 90+ |
330
+
331
+ ## Module formats
332
+
333
+ Ships **ES Module** (`dist/index.js`) and **CommonJS** (`dist/index.cjs`) builds with bundled TypeScript
334
+ definitions and an extracted stylesheet (`boss-web-player-sdk/css`). `react`, `react-dom`, and
335
+ `firebase` are externalized (see peer dependencies); `hls.js` and `dashjs` are bundled (lazily).
336
+
337
+ ## License
338
+
339
+ MIT — see [LICENSE](./LICENSE).
@@ -0,0 +1,2 @@
1
+ .sdk-player-container{--sdk-theme-color:#6366f1;--sdk-theme-color-rgb:99, 102, 241;--sdk-ad-color:#ff9800;--sdk-ad-color-rgb:255, 152, 0;-webkit-user-select:none;user-select:none;aspect-ratio:16/9;cursor:none;background:#000;border-radius:12px;width:100%;height:100%;font-family:Outfit,Inter,system-ui,-apple-system,sans-serif;position:relative;overflow:hidden;box-shadow:0 25px 50px -12px #000000b3}.sdk-player-container.controls-active{cursor:default}.sdk-watermark-overlay{z-index:4!important;transition:left 4s ease-in-out,top 4s ease-in-out!important}.sdk-ad-countdown{z-index:90;white-space:nowrap;-webkit-backdrop-filter:blur(6px);pointer-events:none;-webkit-user-select:none;user-select:none;background:#0000008c;border:none;border-radius:22px;justify-content:center;align-items:center;gap:8px;padding:6px 14px 6px 6px;display:flex;position:absolute;top:16px;right:16px}.sdk-ad-countdown-border{pointer-events:none;position:absolute;inset:0;overflow:visible}.sdk-ad-countdown-border-track{fill:none;stroke:#ffffff2e}.sdk-ad-countdown-border-fill{fill:none;stroke:#ffe000;stroke-linecap:round;transition:stroke-dashoffset .25s linear}.sdk-ad-countdown-badge{color:#1a1a1a;letter-spacing:.02em;background:#ffe000;border-radius:14px;align-items:center;padding:3px 9px;font-size:12px;font-weight:700;display:inline-flex}.sdk-ad-countdown-count{color:#fff;font-size:13px;font-weight:500}.sdk-ad-countdown-sep{background:#ffffff40;width:1px;height:14px}.sdk-ad-countdown-time{font-variant-numeric:tabular-nums;color:#fff;font-size:13px;font-weight:600}.sdk-skip-ad-btn{z-index:90;text-align:center;color:#ffffff8c;letter-spacing:.03em;cursor:not-allowed;-webkit-user-select:none;user-select:none;pointer-events:all;background:#000000b3;border:1px solid #ffffff59;border-radius:20px;width:92px;padding:8px 0;font-size:13px;font-weight:500;transition:background .15s,border-color .15s,color .15s;position:absolute;bottom:84px;right:16px}.sdk-skip-ad-btn--ready{color:#fff;cursor:pointer;border-color:#fffc}.sdk-skip-ad-btn--ready:hover{background:#ffffff2e;border-color:#fff}.sdk-ad-cta{z-index:88;pointer-events:all;max-width:calc(100% - 32px);animation:.25s sdk-ad-cta-in;position:absolute;bottom:84px;left:16px}.sdk-ad-cta-btn{color:#1a1a1a;letter-spacing:.01em;white-space:nowrap;cursor:pointer;-webkit-user-select:none;user-select:none;background:#f8b319;border:none;border-radius:8px;align-items:center;gap:8px;padding:10px 18px;font-size:14px;font-weight:600;transition:background .15s,transform .15s;display:inline-flex}.sdk-ad-cta-btn:hover{background:#ffc23a}.sdk-ad-cta-btn:active{transform:scale(.97)}.sdk-ad-cta-btn:focus-visible{outline-offset:3px;outline:2px solid #fff}.sdk-ad-cta-card{background:#0009;border-radius:12px;align-items:center;gap:24px;max-width:480px;padding:12px 14px 12px 18px;display:flex}.sdk-ad-cta-info{flex-direction:column;gap:3px;min-width:0;display:flex}.sdk-ad-cta-title{color:#fff;text-overflow:ellipsis;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;font-size:15px;font-weight:600;line-height:1.3;display:-webkit-box;overflow:hidden}.sdk-ad-cta-desc{color:#ffffffb8;text-overflow:ellipsis;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;font-size:13px;font-weight:400;line-height:1.35;display:-webkit-box;overflow:hidden}@keyframes sdk-ad-cta-in{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}@media (width<=480px){.sdk-ad-cta-card{gap:14px;padding:10px 12px 10px 14px}.sdk-ad-cta-title{font-size:13px}.sdk-ad-cta-desc{font-size:11px}.sdk-ad-cta-btn{padding:8px 14px;font-size:13px}}.sdk-overlay-ad{z-index:85;pointer-events:all;background:#000000d1;border-radius:4px;max-width:calc(100% - 32px);position:absolute;bottom:72px;overflow:visible}.sdk-overlay-ad--bottom_center{animation:.25s sdk-overlay-ad-in-center;left:50%;transform:translate(-50%)}.sdk-overlay-ad--bottom_left{animation:.25s sdk-overlay-ad-in-side;left:16px}.sdk-overlay-ad--bottom_right{animation:.25s sdk-overlay-ad-in-side;right:16px}.sdk-overlay-ad--top_center{animation:.25s sdk-overlay-ad-in-center;top:16px;bottom:auto;left:50%;transform:translate(-50%)}.sdk-overlay-ad--top_left{animation:.25s sdk-overlay-ad-in-side;top:16px;bottom:auto;left:16px}.sdk-overlay-ad--top_right{animation:.25s sdk-overlay-ad-in-side;top:16px;bottom:auto;right:16px}.sdk-overlay-ad-topbar{justify-content:space-between;align-items:center;height:20px;display:flex;position:absolute;top:-20px;left:0;right:0}.sdk-overlay-ad-label{letter-spacing:.08em;text-transform:uppercase;color:#ffffffa6;-webkit-user-select:none;user-select:none;background:#000000b8;border-radius:3px 3px 0 0;padding:2px 7px;font-size:10px;font-weight:600;line-height:16px}.sdk-overlay-ad-close{color:#ffffffb3;cursor:pointer;background:#000000b8;border:none;border-radius:3px 3px 0 0;padding:2px 7px;font-size:11px;line-height:16px;transition:color .15s,background .15s}.sdk-overlay-ad-close:hover{color:#fff;background:#282828e6}.sdk-overlay-ad-img{cursor:pointer;border-radius:4px;max-width:100%;height:auto;transition:opacity .15s;display:block}.sdk-overlay-ad-img:hover{opacity:.88}@keyframes sdk-overlay-ad-in-center{0%{opacity:0;transform:translate(-50%)translateY(6px)}to{opacity:1;transform:translate(-50%)translateY(0)}}@keyframes sdk-overlay-ad-in-side{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}.sdk-spinner-overlay{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:101;pointer-events:none;opacity:0;background:#0f172a73;flex-direction:column;justify-content:center;align-items:center;transition:opacity .3s;display:flex;position:absolute;inset:0}.sdk-spinner-overlay.active{opacity:1}.sdk-spinner{border:4px solid rgba(var(--sdk-theme-color-rgb), .1);border-left-color:var(--sdk-theme-color);border-right-color:rgba(var(--sdk-theme-color-rgb), .2);width:60px;height:60px;filter:drop-shadow(0 0 10px rgba(var(--sdk-theme-color-rgb), .5));border-radius:50%;animation:1s linear infinite sdk-spin}@keyframes sdk-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.sdk-spinner-text{color:#fff;letter-spacing:2px;text-transform:uppercase;text-shadow:0 2px 4px #00000080;margin-top:16px;font-size:13px;font-weight:500;animation:1.5s ease-in-out infinite alternate sdk-pulse}@keyframes sdk-pulse{0%{opacity:.6}to{opacity:1;filter:drop-shadow(0 0 4px var(--sdk-theme-color))}}.sdk-pip-placeholder{z-index:1;color:#ffffffd9;background:#000;flex-direction:column;justify-content:center;align-items:center;gap:10px;display:flex;position:absolute;inset:0}.sdk-pip-placeholder span{letter-spacing:.02em;font-size:13px}.sdk-subtitles-overlay{z-index:7;text-align:center;pointer-events:none;justify-content:center;width:80%;display:flex;position:absolute;bottom:80px;left:50%;transform:translate(-50%)}.sdk-subtitles-text{text-shadow:0 1px 3px #000000e6;word-wrap:break-word;border-radius:8px;max-width:100%;padding:8px 16px;font-weight:500;line-height:1.5;transition:font-size .15s,background .15s,color .15s;box-shadow:0 10px 25px -5px #0006}.sdk-cast-bg{z-index:7;pointer-events:none;background:#0000008c;position:absolute;inset:0}.sdk-cast-indicator{color:#3b82f6;white-space:nowrap;letter-spacing:.02em;background:#3b82f626;border:1px solid #3b82f659;border-radius:20px;align-items:center;gap:5px;padding:3px 8px;font-size:11px;font-weight:600;display:inline-flex}.sdk-cast-screen{z-index:8;color:#fff;background:radial-gradient(at top,#1e1b4b 0%,#030712 70%);flex-direction:column;justify-content:center;align-items:center;gap:28px;padding:24px;display:flex;position:absolute;inset:0}.sdk-cast-icon-glow{color:#3b82f6;filter:drop-shadow(0 0 12px #3b82f699);flex-shrink:0;animation:2s infinite alternate sdk-pulse}.sdk-cast-header{flex-direction:row;align-items:center;gap:0;display:flex}.sdk-cast-title{margin-bottom:4px;font-size:18px;font-weight:600}.sdk-cast-desc{color:#9ca3af;font-size:13px}.sdk-cast-controls{flex-direction:column;align-items:center;gap:18px;width:100%;max-width:480px;display:flex}.sdk-cast-seekbar-row{align-items:center;gap:10px;width:100%;display:flex}.sdk-cast-time-label{color:#9ca3af;white-space:nowrap;text-align:center;min-width:38px;font-size:12px}.sdk-cast-seekbar{cursor:pointer;background:#fff3;border-radius:2px;flex:1;height:4px;transition:height .15s;position:relative}.sdk-cast-seekbar:hover{height:6px}.sdk-cast-seekbar-fill{pointer-events:none;background:#3b82f6;border-radius:2px;position:absolute;inset:0 auto 0 0}.sdk-cast-seekbar-thumb{pointer-events:none;opacity:0;background:#fff;border-radius:50%;width:12px;height:12px;transition:opacity .15s;position:absolute;top:50%;transform:translate(-50%,-50%);box-shadow:0 0 6px #3b82f699}.sdk-cast-seekbar:hover .sdk-cast-seekbar-thumb{opacity:1}.sdk-cast-playback-row{align-items:center;gap:28px;display:flex}.sdk-cast-ctrl-btn{color:#e2e8f0;cursor:pointer;background:0 0;border:none;border-radius:50%;justify-content:center;align-items:center;padding:6px;transition:color .15s,background .15s;display:flex;position:relative}.sdk-cast-ctrl-btn:hover{color:#fff;background:#ffffff1a}.sdk-cast-seek-label{pointer-events:none;font-size:9px;font-weight:700;line-height:1;position:absolute}.sdk-cast-play-pause-btn{color:#fff;cursor:pointer;background:#3b82f633;border:2px solid #3b82f680;border-radius:50%;justify-content:center;align-items:center;width:60px;height:60px;transition:background .18s,border-color .18s,transform .1s;display:flex}.sdk-cast-play-pause-btn:hover{background:#3b82f680;border-color:#3b82f6;transform:scale(1.06)}.sdk-cast-play-pause-btn:active{transform:scale(.96)}.sdk-cast-volume-row{align-items:center;gap:10px;width:220px;display:flex}.sdk-cast-vol-btn{color:#9ca3af;cursor:pointer;background:0 0;border:none;align-items:center;padding:4px;transition:color .15s;display:flex}.sdk-cast-vol-btn:hover{color:#fff}.sdk-cast-volume-slider{appearance:none;cursor:pointer;background:#fff3;border-radius:2px;outline:none;flex:1;height:4px}.sdk-cast-volume-slider::-webkit-slider-thumb{appearance:none;cursor:pointer;background:#fff;border-radius:50%;width:14px;height:14px;box-shadow:0 0 4px #0006}.sdk-cast-volume-slider::-moz-range-thumb{cursor:pointer;background:#fff;border:none;border-radius:50%;width:14px;height:14px}.sdk-cast-disconnect-btn{color:#ef4444;cursor:pointer;background:#ef444426;border:1px solid #ef444459;border-radius:6px;padding:8px 20px;font-size:13px;font-weight:500;transition:all .2s}.sdk-cast-disconnect-btn:hover{color:#fff;background:#ef4444;box-shadow:0 0 15px #ef444466}.sdk-controls-overlay{z-index:9;opacity:0;background:linear-gradient(#000000a6 0%,#0000 22%),linear-gradient(#0000 58%,#000c 100%);flex-direction:column;justify-content:flex-end;padding:0;transition:opacity .3s cubic-bezier(.4,0,.2,1);display:flex;position:absolute;inset:0}.sdk-player-container.controls-active .sdk-controls-overlay{opacity:1}.sdk-desktop-header{pointer-events:auto;justify-content:space-between;align-items:center;padding:18px 22px;display:flex;position:absolute;top:0;left:0;right:0}.sdk-desktop-header-left{flex:1;align-items:center;gap:10px;min-width:0;display:flex}.sdk-desktop-header-right{flex-shrink:0;align-items:center;gap:4px;display:flex}.sdk-desktop-back-btn{color:#fff;cursor:pointer;opacity:.9;background:0 0;border:none;flex-shrink:0;justify-content:center;align-items:center;padding:4px;transition:opacity .15s;display:flex}.sdk-desktop-back-btn:hover{opacity:1}.sdk-desktop-title{color:#fff;white-space:nowrap;text-overflow:ellipsis;letter-spacing:.01em;font-size:16px;font-weight:600;overflow:hidden}.sdk-desktop-hdr-btn{color:#ffffffd9;cursor:pointer;background:0 0;border:none;border-radius:6px;justify-content:center;align-items:center;padding:7px;transition:all .18s;display:flex}.sdk-desktop-hdr-btn:hover{color:#fff;background:#ffffff1a}.sdk-desktop-hdr-btn:disabled{opacity:.38;cursor:default}.sdk-desktop-center-controls{align-items:center;gap:36px;display:flex;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.sdk-desktop-seek-btn{color:#fff;cursor:pointer;opacity:.9;background:0 0;border:none;justify-content:center;align-items:center;padding:10px;transition:opacity .15s,transform .12s;display:flex;position:relative}.sdk-desktop-seek-btn:hover{opacity:1;transform:scale(1.12)}.sdk-desktop-seek-btn:active{transform:scale(.9)}.sdk-desktop-seek-btn:disabled{opacity:.35;cursor:default;transform:none!important}.sdk-desktop-seek-label{pointer-events:none;font-family:sans-serif;font-size:8px;font-weight:700;line-height:1;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.sdk-desktop-play-btn{color:#fff;cursor:pointer;opacity:.95;background:0 0;border:none;justify-content:center;align-items:center;padding:10px;transition:opacity .15s,transform .15s;display:flex}.sdk-desktop-play-btn:hover{opacity:1;transform:scale(1.1)}.sdk-desktop-play-btn:active{transform:scale(.9)}.sdk-desktop-bottom{pointer-events:auto;flex-direction:column;padding:0 22px;display:flex}.sdk-desktop-chapters-strip{scroll-snap-type:x mandatory;-webkit-overflow-scrolling:touch;scrollbar-width:none;gap:14px;padding:0 0 18px;animation:.22s sdkFadeIn;display:flex;overflow-x:auto}.sdk-desktop-chapters-strip::-webkit-scrollbar{display:none}.sdk-desktop-chapter-card{cursor:pointer;scroll-snap-align:start;flex-shrink:0;width:170px;transition:transform .12s}.sdk-desktop-chapter-card:hover{transform:scale(1.04)}.sdk-desktop-chapter-card:active{transform:scale(.97)}.sdk-desktop-chapter-thumb{background:#ffffff12;border:2px solid #0000;border-radius:8px;justify-content:center;align-items:center;width:100%;height:100px;transition:border-color .15s;display:flex;overflow:hidden}.sdk-desktop-chapter-card.active .sdk-desktop-chapter-thumb{border-color:#ffffff8c}.sdk-desktop-chapter-title{color:#fff;white-space:nowrap;text-overflow:ellipsis;text-align:center;margin-top:7px;font-size:12px;font-weight:500;line-height:1.3;overflow:hidden}.sdk-desktop-chapter-time{color:#fff;text-align:center;letter-spacing:.02em;margin-top:3px;font-size:11px;font-weight:600}.sdk-desktop-seekbar{background:#ffffff47;border-radius:0;height:3px;margin:0}.sdk-desktop-seekbar:hover{height:5px}.sdk-desktop-seekbar .sdk-seekbar-buffered{background:#ffffff59}.sdk-desktop-seekbar .sdk-seekbar-progress{box-shadow:none!important;background:#fff!important}.sdk-desktop-seekbar .sdk-seekbar-handle{background:#fff;width:14px;height:14px;right:-7px}.sdk-desktop-chapter-dot{z-index:3;width:2px;display:none;background:#5a5f69e6!important}.sdk-desktop-controls-row{justify-content:space-between;align-items:center;gap:16px;padding:10px 0 20px;display:flex}.sdk-desktop-left-controls{align-items:center;gap:6px;display:flex}.sdk-volume-control{align-items:center;gap:2px;display:flex}.sdk-volume-slider{appearance:none;cursor:pointer;background:#ffffff47;background-image:linear-gradient(to right, #fff calc(var(--vol-pct,100%) * 1%), #ffffff47 calc(var(--vol-pct,100%) * 1%));border-radius:3px;outline:none;width:80px;height:3px;transition:height .15s}.sdk-volume-slider:hover{height:5px}.sdk-volume-slider::-webkit-slider-thumb{appearance:none;cursor:pointer;background:#fff;border-radius:50%;width:12px;height:12px;transition:transform .12s;box-shadow:0 0 6px #00000080}.sdk-volume-slider:hover::-webkit-slider-thumb{transform:scale(1.2)}.sdk-volume-slider::-moz-range-thumb{cursor:pointer;background:#fff;border:none;border-radius:50%;width:12px;height:12px;box-shadow:0 0 6px #00000080}.sdk-desktop-right-icons{align-items:center;gap:2px;display:flex}.sdk-desktop-icon-btn{color:#ffffffd1;cursor:pointer;background:0 0;border:none;border-radius:6px;justify-content:center;align-items:center;padding:7px;transition:all .18s;display:flex}.sdk-desktop-icon-btn:hover{color:#fff;background:#ffffff1a}.sdk-desktop-icon-btn:disabled{opacity:.38;cursor:default;transform:none!important}.sdk-seekbar-container{cursor:pointer;background:#ffffff26;border-radius:3px;align-items:center;width:100%;height:6px;transition:height .15s;display:flex;position:relative}.sdk-seekbar-container:before{content:"";z-index:1;position:absolute;inset:-12px 0}.sdk-seekbar-container:hover{height:8px}.sdk-seekbar-buffered{pointer-events:none;background:#ffffff40;border-radius:3px;position:absolute;top:0;bottom:0;left:0}.sdk-seekbar-progress{background:var(--sdk-theme-color);pointer-events:none;box-shadow:0 0 8px rgba(var(--sdk-theme-color-rgb), .6);border-radius:3px;justify-content:flex-end;align-items:center;display:flex;position:absolute;top:0;bottom:0;left:0}.sdk-seekbar-container.sdk-ad-mode,.sdk-seekbar-container.sdk-ad-mode:hover,.sdk-seekbar-container.sdk-ad-mode:active{cursor:default;background:#ffffff26;height:3px!important}.sdk-ad-progress-fill{pointer-events:none;background:#ffe000;border-radius:3px;position:absolute;top:0;bottom:0;left:0}.sdk-seekbar-handle{opacity:0;background:#fff;border-radius:50%;width:12px;height:12px;transition:opacity .15s,transform .15s;position:absolute;right:-6px;transform:scale(.8);box-shadow:0 0 10px #00000080}.sdk-seekbar-container:hover .sdk-seekbar-handle{opacity:1;transform:scale(1)}.sdk-seekbar-adbreak{opacity:.7;pointer-events:none;z-index:3;background:#ffe000;border-radius:1px;width:3px;height:100%;transition:opacity .15s,height .15s,top .15s;position:absolute;top:0}.sdk-seekbar-container:hover .sdk-seekbar-adbreak{opacity:1;height:calc(100% + 4px);top:-2px}.sdk-seekbar-chapter-marker{pointer-events:none;z-index:2;background:#0f172acc;width:2px;position:absolute;top:0;bottom:0}[data-tooltip]{position:relative}[data-tooltip]:after{content:attr(data-tooltip);color:#fff;white-space:nowrap;pointer-events:none;opacity:0;visibility:hidden;z-index:30;letter-spacing:.01em;background:#171717eb;border-radius:4px;padding:5px 9px;font-size:12px;font-weight:500;line-height:1.4;transition:opacity .1s,transform .1s,visibility .1s;position:absolute;bottom:calc(100% + 2px);left:50%;transform:translate(-50%)translateY(4px);box-shadow:0 2px 8px #00000059}[data-tooltip]:hover:after,[data-tooltip]:focus-visible:after{opacity:1;visibility:visible;transition-delay:.4s;transform:translate(-50%)translateY(0)}[data-tooltip][aria-expanded=true]:after{display:none}.sdk-desktop-header-right [data-tooltip]:after,.sdk-mobile-header-actions [data-tooltip]:after{top:calc(100% + 2px);bottom:auto;transform:translate(-50%)translateY(-4px)}.sdk-desktop-header-right [data-tooltip]:hover:after,.sdk-desktop-header-right [data-tooltip]:focus-visible:after,.sdk-mobile-header-actions [data-tooltip]:hover:after,.sdk-mobile-header-actions [data-tooltip]:focus-visible:after{transform:translate(-50%)translateY(0)}.sdk-desktop-right-icons>[data-tooltip]:last-child:after{left:auto;right:0;transform:translateY(4px)}.sdk-desktop-right-icons>[data-tooltip]:last-child:hover:after,.sdk-desktop-right-icons>[data-tooltip]:last-child:focus-visible:after{transform:translateY(0)}.sdk-thumbnail-tooltip{z-index:10;pointer-events:none;filter:drop-shadow(0 8px 20px #000000a6);flex-direction:column;align-items:center;display:flex;position:absolute;bottom:22px;transform:translate(-50%)}.sdk-thumbnail-preview{background-color:#0c0a09;border:1.5px solid #ffffff2e;border-radius:8px;justify-content:center;align-items:center;width:192px;height:108px;display:flex;overflow:hidden}.sdk-thumbnail-chapter-name{color:#fff;white-space:nowrap;text-align:center;letter-spacing:.01em;margin-top:7px;font-size:12px;font-weight:500}.sdk-thumbnail-time-label{color:#fff;text-align:center;letter-spacing:.02em;margin-top:3px;font-size:11px;font-weight:600}.sdk-control-btn{color:#fff;opacity:.85;cursor:pointer;background:0 0;border:none;border-radius:6px;justify-content:center;align-items:center;padding:6px;transition:all .2s;display:flex}.sdk-control-btn[disabled],.sdk-control-btn.disabled{opacity:.45;cursor:default;transform:none!important}.sdk-control-btn:hover{opacity:1;background:#ffffff14}.sdk-control-btn:active{transform:scale(.95)}.sdk-time-display{color:#fff;font-variant-numeric:tabular-nums;opacity:.9;letter-spacing:.01em;font-size:13px;font-weight:500}.sdk-chapter-badge{color:var(--sdk-theme-color);background:rgba(var(--sdk-theme-color-rgb), .12);border:1px solid rgba(var(--sdk-theme-color-rgb), .25);white-space:nowrap;text-overflow:ellipsis;max-width:180px;box-shadow:0 0 10px rgba(var(--sdk-theme-color-rgb), .15);border-radius:20px;padding:2px 8px;font-size:11px;font-weight:600;overflow:hidden}.sdk-menu-container{position:relative}.sdk-dropup-menu{-webkit-backdrop-filter:blur(32px)saturate(200%);backdrop-filter:blur(32px)saturate(200%);z-index:12;background:#14141c73;border:1px solid #ffffff14;border-radius:12px;flex-direction:column;min-width:172px;padding:0;animation:.18s cubic-bezier(.16,1,.3,1) sdk-menu-slideup;display:flex;position:absolute;bottom:calc(100% + 24px);left:50%;right:auto;overflow:hidden;transform:translate(-50%);box-shadow:0 20px 40px #000000bf}.sdk-dropup-menu.large{scrollbar-width:thin;scrollbar-color:#ffffff1f transparent;min-width:200px;max-height:240px;overflow-y:auto}.sdk-dropup-menu.large::-webkit-scrollbar{width:4px}.sdk-dropup-menu.large::-webkit-scrollbar-track{background:0 0}.sdk-dropup-menu.large::-webkit-scrollbar-thumb{background:#ffffff1f;border-radius:4px}@keyframes sdk-menu-slideup{0%{opacity:0;transform:translate(-50%)translateY(8px)}to{opacity:1;transform:translate(-50%)translateY(0)}}.sdk-dropup-header{color:#fff;letter-spacing:0;border-bottom:1px solid #ffffff1f;padding:14px 16px 12px;font-size:14px;font-weight:700}.sdk-dropup-item{color:#ffffffc7;cursor:pointer;justify-content:space-between;align-items:center;gap:10px;padding:11px 16px;font-size:13px;font-weight:400;transition:background .12s;display:flex}.sdk-dropup-item:hover{color:#fff;background:#ffffff0f}.sdk-dropup-item.active{color:#fff;background:0 0;font-weight:700}.sdk-cast-modal-backdrop{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);z-index:15;background:#030712cc;justify-content:center;align-items:center;animation:.25s sdk-fadein;display:flex;position:absolute;inset:0}@keyframes sdk-fadein{0%{opacity:0}to{opacity:1}}.sdk-cast-modal{background:#0f172a;border:1px solid #ffffff14;border-radius:12px;flex-direction:column;gap:12px;width:280px;padding:16px;display:flex;box-shadow:0 25px 50px -12px #000c}.sdk-cast-modal-header{border-bottom:1px solid #ffffff0f;justify-content:space-between;align-items:center;padding-bottom:8px;display:flex}.sdk-cast-modal-title{color:#fff;font-size:14px;font-weight:600}.sdk-cast-device-list{flex-direction:column;gap:6px;display:flex}.sdk-cast-device-item{color:#e5e7eb;cursor:pointer;background:#ffffff05;border:1px solid #ffffff0a;border-radius:6px;align-items:center;gap:10px;padding:10px;font-size:13px;transition:all .15s;display:flex}.sdk-cast-device-item:hover{background:rgba(var(--sdk-theme-color-rgb), .1);border-color:rgba(var(--sdk-theme-color-rgb), .3);color:#fff}.sdk-mobile-only{display:none!important}.sdk-dropup-divider{background:#ffffff1f;height:1px;margin:2px 0}.sdk-mobile-settings-menu{scrollbar-width:thin;scrollbar-color:#ffffff1f transparent;min-width:190px;max-height:320px;overflow-y:auto}.sdk-mobile-settings-menu::-webkit-scrollbar{width:4px}.sdk-mobile-settings-menu::-webkit-scrollbar-track{background:0 0}.sdk-mobile-settings-menu::-webkit-scrollbar-thumb{background:#ffffff1f;border-radius:4px}.sdk-chapters-panel{-webkit-backdrop-filter:blur(28px)saturate(160%);backdrop-filter:blur(28px)saturate(160%);z-index:10;pointer-events:auto;background:#0c0c10c7;border:1px solid #ffffff1a;border-radius:14px;flex-direction:column;width:380px;animation:.2s sdkFadeIn;display:flex;position:absolute;top:60px;bottom:80px;right:20px;overflow:hidden}.sdk-chapters-panel-header{border-bottom:1px solid #ffffff1f;flex-shrink:0;padding:16px 18px 14px}.sdk-chapters-panel-title{color:#fff;letter-spacing:.01em;font-size:16px;font-weight:700}.sdk-chapters-panel-list{scrollbar-width:thin;scrollbar-color:#ffffff1f transparent;flex:1;padding:6px 0;overflow-y:auto}.sdk-chapters-panel-list::-webkit-scrollbar{width:4px}.sdk-chapters-panel-list::-webkit-scrollbar-track{background:0 0}.sdk-chapters-panel-list::-webkit-scrollbar-thumb{background:#ffffff1f;border-radius:4px}.sdk-chapters-panel-item{cursor:pointer;border-bottom:1px solid #ffffff0d;align-items:flex-start;gap:14px;padding:12px 16px;transition:background .15s;display:flex}.sdk-chapters-panel-item:last-child{border-bottom:none}.sdk-chapters-panel-item:hover{background:#ffffff0f}.sdk-chapters-panel-item.active{background:#ffffff17}.sdk-chapters-panel-thumb{color:#ffffff4d;background:#ffffff0f;border-radius:8px;flex-shrink:0;justify-content:center;align-items:center;width:128px;height:76px;display:flex;overflow:hidden}.sdk-chapters-panel-info{flex-direction:column;flex:1;gap:4px;min-width:0;padding-top:2px;display:flex}.sdk-chapters-panel-item-title{color:#fff;font-size:14px;font-weight:600;line-height:1.3}.sdk-chapters-panel-item-desc{color:#ffffff7a;-webkit-line-clamp:3;line-clamp:3;-webkit-box-orient:vertical;font-size:12px;line-height:1.45;display:-webkit-box;overflow:hidden}.sdk-chapters-panel-item-time{color:#fff;opacity:.75;margin-top:2px;font-size:12px;font-weight:500}@media (width<=768px){.sdk-desktop-header{padding:14px 16px}.sdk-desktop-controls-row{padding:8px 16px 16px}.sdk-desktop-chapters-strip{padding:0 16px 14px}}@media (width<=480px){.sdk-subtitles-overlay{width:90%;bottom:72px}.sdk-subtitles-text{padding:4px 10px;line-height:1.4;font-size:12px!important}.sdk-seekbar-container:before{top:-16px;bottom:-16px}.sdk-seekbar-handle{opacity:1;width:14px;height:14px;right:-7px;transform:scale(1)}.sdk-dropup-menu{min-width:140px}.sdk-dropup-menu.large{min-width:160px}}@media (width<=360px){.sdk-control-btn{min-width:26px;padding:4px 3px}.sdk-time-display{font-size:9px}}.sdk-mobile-overlay{z-index:9;opacity:0;pointer-events:none;background:linear-gradient(#0000008c 0%,#0000 25% 65%,#000000a6 100%);flex-direction:column;justify-content:space-between;transition:opacity .25s;display:flex;position:absolute;inset:0}.sdk-mobile-overlay.active{opacity:1;pointer-events:auto}.sdk-mobile-header{justify-content:space-between;align-items:center;gap:8px;padding:10px 14px;display:flex}.sdk-mobile-header-left{flex:1;align-items:center;gap:8px;min-width:0;display:flex}.sdk-mobile-back-btn{color:#fff;cursor:pointer;opacity:.9;background:0 0;border:none;flex-shrink:0;align-items:center;padding:4px;display:flex}.sdk-mobile-title{color:#fff;white-space:nowrap;text-overflow:ellipsis;font-size:14px;font-weight:600;overflow:hidden}@media (orientation:portrait){.sdk-mobile-title{display:none}}.sdk-mobile-header-actions{flex-shrink:0;align-items:center;gap:2px;display:flex}.sdk-mobile-hdr-btn{color:#fff;opacity:.9;cursor:pointer;background:0 0;border:none;border-radius:50%;justify-content:center;align-items:center;min-width:44px;min-height:44px;transition:background .15s,opacity .15s;display:flex}.sdk-mobile-hdr-btn:hover,.sdk-mobile-hdr-btn:focus{opacity:1;background:#ffffff1f}.sdk-mobile-hdr-btn:disabled{opacity:.35;cursor:default}.sdk-dropdown-menu{inset:calc(100% + 8px) 0 auto auto}.sdk-mobile-center-controls{justify-content:center;align-items:center;gap:36px;display:flex}.sdk-mobile-seek-btn{color:#fff;cursor:pointer;opacity:.9;background:0 0;border:none;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:50px;height:50px;transition:transform .1s,opacity .12s;display:flex;position:relative}.sdk-mobile-seek-btn:hover{opacity:1}.sdk-mobile-seek-btn:active{transform:scale(.9)}.sdk-mobile-seek-btn:disabled{opacity:.35;cursor:default}.sdk-mobile-seek-label{pointer-events:none;font-family:sans-serif;font-size:8px;font-weight:700;line-height:1;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.sdk-mobile-play-btn{color:#fff;cursor:pointer;background:0 0;border:none;flex-shrink:0;justify-content:center;align-items:center;padding:6px;transition:transform .12s;display:flex}.sdk-mobile-play-btn:active{transform:scale(.9)}@keyframes sdk-doubletap-fade{0%{opacity:1}60%{opacity:1}to{opacity:0}}.sdk-mobile-doubletap{pointer-events:none;z-index:20;justify-content:center;align-items:center;width:40%;animation:.7s forwards sdk-doubletap-fade;display:flex;position:absolute;top:0;bottom:0}.sdk-mobile-doubletap.left{background:#ffffff1f;border-radius:0 100% 100% 0/0 50% 50% 0;left:0}.sdk-mobile-doubletap.right{background:#ffffff1f;border-radius:100% 0 0 100%/50% 0 0 50%;right:0}.sdk-mobile-doubletap-icon{color:#fff;filter:drop-shadow(0 1px 4px #00000080);flex-direction:column;align-items:center;gap:4px;display:flex}.sdk-mobile-doubletap-label{letter-spacing:.02em;color:#fff;font-size:11px;font-weight:600;line-height:1}.sdk-mobile-bottom-bar{flex-direction:column;gap:0;padding:0 14px;display:flex}.sdk-mobile-seekbar{background:#ffffff47;border-radius:0;width:100%;height:3px}.sdk-mobile-seekbar:hover,.sdk-mobile-seekbar:active{height:4px}.sdk-mobile-seekbar .sdk-seekbar-progress{box-shadow:none!important;background:#fff!important}.sdk-mobile-seekbar .sdk-seekbar-handle{background:#fff;width:14px;height:14px;right:-7px;opacity:1!important;transform:scale(1)!important}.sdk-mobile-controls-row{justify-content:space-between;align-items:center;gap:8px;padding:8px 0 12px;display:flex}.sdk-mobile-bottom-icons .sdk-dropup-menu{border-radius:8px;min-width:130px}.sdk-mobile-bottom-icons .sdk-dropup-header{padding:10px 12px 8px;font-size:12px}.sdk-mobile-bottom-icons .sdk-dropup-item{padding:8px 12px;font-size:12px}.sdk-mobile-bottom-icons{align-items:center;gap:2px;display:flex}.sdk-mobile-icon-btn{color:#ffffffd1;cursor:pointer;background:0 0;border:none;border-radius:5px;justify-content:center;align-items:center;min-width:30px;min-height:30px;padding:6px;transition:color .15s,background .15s;display:flex}.sdk-mobile-icon-btn:hover{color:#fff;background:#ffffff14}.sdk-mobile-icon-btn:disabled{opacity:.35;cursor:default}.sdk-mobile-key-moments-bar{color:#ffffffe6;letter-spacing:.3px;cursor:pointer;justify-content:center;align-items:center;gap:6px;padding:4px 0 2px;font-size:13px;font-weight:600;transition:opacity .15s;display:flex}.sdk-mobile-key-moments-bar:hover{opacity:.8}.sdk-mobile-km-star{opacity:.85;font-size:12px}.sdk-mobile-chapters-scroll{scroll-snap-type:x mandatory;-webkit-overflow-scrolling:touch;scrollbar-width:none;gap:10px;padding:4px 0 2px;animation:.2s sdkFadeIn;display:flex;overflow-x:auto}.sdk-mobile-chapters-scroll::-webkit-scrollbar{display:none}@keyframes sdkFadeIn{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}.sdk-mobile-chapter-card{cursor:pointer;scroll-snap-align:start;border:2px solid #0000;border-radius:8px;flex-shrink:0;width:108px;transition:border-color .15s,transform .1s}.sdk-mobile-chapter-card:active{transform:scale(.96)}.sdk-mobile-chapter-card.active{border-color:var(--sdk-theme-color)}.sdk-mobile-chapter-thumb{background:#ffffff0f;border-radius:6px;justify-content:center;align-items:center;width:100%;height:64px;display:flex;position:relative;overflow:hidden}.sdk-mobile-chapter-time-badge{color:#fff;letter-spacing:.3px;background:#000000bf;border-radius:3px;padding:1px 4px;font-size:8px;font-weight:600;position:absolute;bottom:3px;right:4px}.sdk-mobile-chapter-title{color:#fffc;white-space:nowrap;text-overflow:ellipsis;text-align:center;margin-top:5px;padding:0 2px;font-size:10px;font-weight:500;line-height:1.3;overflow:hidden}@media (orientation:landscape) and (height<=500px){.sdk-mobile-header{padding:4px 12px}.sdk-mobile-center-controls{gap:18px}.sdk-mobile-play-circle{width:46px;height:46px}.sdk-mobile-seek-circle{width:38px;height:38px}.sdk-mobile-bottom-bar{gap:4px;padding:0 12px 6px}.sdk-mobile-time{font-size:11px}.sdk-mobile-chapter-thumb{height:48px}.sdk-mobile-chapter-card{width:88px}.sdk-mobile-key-moments-bar{padding:2px 0 0;font-size:12px}.sdk-spinner{width:40px;height:40px}.sdk-subtitles-overlay{bottom:56px}}:-webkit-any(.sdk-player-container.sdk-fs-simulated .sdk-mobile-header,.sdk-player-container:fullscreen .sdk-mobile-header,.sdk-player-container:-webkit-full-screen .sdk-mobile-header){padding-left:max(14px, env(safe-area-inset-left));padding-right:max(14px, env(safe-area-inset-right))}:is(.sdk-player-container.sdk-fs-simulated .sdk-mobile-header,.sdk-player-container:fullscreen .sdk-mobile-header,.sdk-player-container:fullscreen .sdk-mobile-header){padding-left:max(14px, env(safe-area-inset-left));padding-right:max(14px, env(safe-area-inset-right))}:-webkit-any(.sdk-player-container.sdk-fs-simulated .sdk-mobile-bottom-bar,.sdk-player-container:fullscreen .sdk-mobile-bottom-bar,.sdk-player-container:-webkit-full-screen .sdk-mobile-bottom-bar){padding-left:max(14px, env(safe-area-inset-left));padding-right:max(14px, env(safe-area-inset-right));padding-bottom:max(10px, env(safe-area-inset-bottom))}:is(.sdk-player-container.sdk-fs-simulated .sdk-mobile-bottom-bar,.sdk-player-container:fullscreen .sdk-mobile-bottom-bar,.sdk-player-container:fullscreen .sdk-mobile-bottom-bar){padding-left:max(14px, env(safe-area-inset-left));padding-right:max(14px, env(safe-area-inset-right));padding-bottom:max(10px, env(safe-area-inset-bottom))}:-webkit-any(.sdk-player-container.sdk-fs-simulated .sdk-desktop-bottom,.sdk-player-container:fullscreen .sdk-desktop-bottom,.sdk-player-container:-webkit-full-screen .sdk-desktop-bottom){padding-left:max(22px, env(safe-area-inset-left));padding-right:max(22px, env(safe-area-inset-right));padding-bottom:env(safe-area-inset-bottom)}:is(.sdk-player-container.sdk-fs-simulated .sdk-desktop-bottom,.sdk-player-container:fullscreen .sdk-desktop-bottom,.sdk-player-container:fullscreen .sdk-desktop-bottom){padding-left:max(22px, env(safe-area-inset-left));padding-right:max(22px, env(safe-area-inset-right));padding-bottom:env(safe-area-inset-bottom)}.sdk-player-container:fullscreen{width:100%!important;height:100%!important;aspect-ratio:unset!important;border-radius:0!important;max-width:none!important;max-height:none!important}.sdk-player-container:fullscreen{width:100%!important;height:100%!important;aspect-ratio:unset!important;border-radius:0!important;max-width:none!important;max-height:none!important}.sdk-player-container.sdk-fs-simulated{width:100vw!important;height:100vh!important;height:100dvh!important;aspect-ratio:unset!important;z-index:9999!important;border-radius:0!important;position:fixed!important;top:0!important;left:0!important;overflow:hidden!important}.sdk-sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.sdk-player-container :focus:not(:focus-visible){outline:none}.sdk-desktop-icon-btn:focus-visible,.sdk-desktop-play-btn:focus-visible,.sdk-desktop-seek-btn:focus-visible,.sdk-desktop-back-btn:focus-visible,.sdk-desktop-hdr-btn:focus-visible,.sdk-mobile-icon-btn:focus-visible,.sdk-mobile-play-btn:focus-visible,.sdk-mobile-seek-btn:focus-visible,.sdk-mobile-back-btn:focus-visible,.sdk-mobile-hdr-btn:focus-visible{outline-offset:2px;background:#ffffff1f;border-radius:6px;outline:2px solid #fff}.sdk-skip-ad-btn:focus-visible{outline-offset:3px;outline:2px solid #fff}.sdk-seekbar-container:focus-visible,.sdk-volume-slider:focus-visible{outline-offset:4px;border-radius:4px;outline:2px solid #fff}.sdk-dropup-item:focus-visible{outline-offset:-2px;background:#ffffff24;border-radius:4px;outline:2px solid #fff9}.sdk-desktop-chapter-card:focus-visible,.sdk-chapters-panel-item:focus-visible,.sdk-mobile-chapter-card:focus-visible{outline-offset:2px;border-radius:4px;outline:2px solid #fff}.sdk-desktop-icon-btn,.sdk-mobile-icon-btn,.sdk-desktop-hdr-btn{min-width:32px;min-height:32px}
2
+ /*$vite$:1*/
package/dist/core.cjs ADDED
@@ -0,0 +1,2 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./src-BXp0h90r.cjs");var t=class{player;install(e){this.player=e,this.onInstall()}destroy(){this.onDestroy()}onDestroy(){}};exports.AnalyticsModule=e.l,exports.BasePlayerPlugin=t,exports.CastingModule=e.r,exports.ChaptersModule=e.o,exports.DRMModule=e.i,exports.FirebaseAnalyticsProvider=e.c,exports.KeyMomentsModule=e.s,exports.SubtitlesModule=e.a,exports.ThumbnailsModule=e.n,exports.VideoPlayerSDK=e.t;
2
+ //# sourceMappingURL=core.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.cjs","names":[],"sources":["../../plugins/src/plugins.ts"],"sourcesContent":["export interface PlayerPlugin {\r\n id: string;\r\n name: string;\r\n install(player: any): void;\r\n destroy?(): void;\r\n}\r\n\r\nexport abstract class BasePlayerPlugin implements PlayerPlugin {\r\n public abstract id: string;\r\n public abstract name: string;\r\n protected player: any;\r\n\r\n public install(player: any): void {\r\n this.player = player;\r\n this.onInstall();\r\n }\r\n\r\n protected abstract onInstall(): void;\r\n\r\n public destroy(): void {\r\n this.onDestroy();\r\n }\r\n\r\n protected onDestroy(): void {}\r\n}\r\n"],"mappings":"yGAOA,IAAsB,EAAtB,KAA+D,CAG7D,OAEA,QAAe,EAAmB,CAChC,KAAK,OAAS,EACd,KAAK,UAAU,CACjB,CAIA,SAAuB,CACrB,KAAK,UAAU,CACjB,CAEA,WAA4B,CAAC,CAC/B"}