@frameset/plex-player 1.0.6 → 2.0.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/LICENSE +1 -1
- package/README.md +310 -505
- package/dist/index.d.ts +438 -0
- package/dist/index.esm.js +2 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/styles.css +1 -0
- package/package.json +66 -104
- package/dist/plex-player.cjs.js +0 -1027
- package/dist/plex-player.cjs.js.map +0 -1
- package/dist/plex-player.css +0 -1651
- package/dist/plex-player.css.map +0 -1
- package/dist/plex-player.d.ts +0 -457
- package/dist/plex-player.esm.js +0 -1021
- package/dist/plex-player.esm.js.map +0 -1
- package/dist/plex-player.js +0 -1033
- package/dist/plex-player.js.map +0 -1
- package/dist/plex-player.min.js +0 -9
- package/dist/plex-player.min.js.map +0 -1
- package/dist/react/index.esm.js +0 -257
- package/dist/react/index.esm.js.map +0 -1
- package/dist/react/index.js +0 -265
- package/dist/react/index.js.map +0 -1
- package/dist/styles.tmp.js +0 -1
- package/dist/vue/index.esm.js +0 -283
- package/dist/vue/index.esm.js.map +0 -1
- package/dist/vue/index.js +0 -291
- package/dist/vue/index.js.map +0 -1
- package/src/core/index.js +0 -1082
- package/src/core/player-core.js +0 -225
- package/src/react/index.jsx +0 -277
- package/src/styles.js +0 -8
- package/src/types/index.d.ts +0 -457
- package/src/vue/index.js +0 -304
package/dist/plex-player.css.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["main.css","controls.css","playlist.css","settings.css"],"names":[],"mappings":"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","file":"plex-player.css","sourcesContent":["/* =====================================================\r\n PLEX Video Player - Main Styles\r\n ===================================================== */\r\n\r\n/* CSS Variables - scoped to player */\r\n.plex-player,\r\n.plex-player-container {\r\n --plex-primary: #e5a00d;\r\n --plex-primary-hover: #f5b82e;\r\n --plex-bg-dark: #1a1a1a;\r\n --plex-bg-darker: #0d0d0d;\r\n --plex-bg-overlay: rgba(0, 0, 0, 0.85);\r\n --plex-text-primary: #ffffff;\r\n --plex-text-secondary: #a0a0a0;\r\n --plex-border: rgba(255, 255, 255, 0.1);\r\n --plex-gradient: linear-gradient(to top, rgba(0, 0, 0, 0.9) 0%, transparent 100%);\r\n --plex-gradient-top: linear-gradient(to bottom, rgba(0, 0, 0, 0.7) 0%, transparent 100%);\r\n --plex-transition-fast: 0.15s ease;\r\n --plex-transition-normal: 0.25s ease;\r\n --plex-transition-slow: 0.4s ease;\r\n --plex-radius-sm: 4px;\r\n --plex-radius-md: 8px;\r\n --plex-radius-lg: 12px;\r\n --plex-shadow: 0 4px 20px rgba(0, 0, 0, 0.5);\r\n --plex-z-video: 1;\r\n --plex-z-overlay: 10;\r\n --plex-z-controls: 20;\r\n --plex-z-panel: 30;\r\n --plex-z-modal: 40;\r\n --plex-z-toast: 50;\r\n}\r\n\r\n/* Scoped Reset - only inside player */\r\n.plex-player *,\r\n.plex-player *::before,\r\n.plex-player *::after {\r\n box-sizing: border-box;\r\n margin: 0;\r\n padding: 0;\r\n}\r\n\r\n/* Player Container Wrapper */\r\n.plex-player-container {\r\n position: relative;\r\n width: 100%;\r\n aspect-ratio: 16 / 9;\r\n background: var(--plex-bg-darker);\r\n border-radius: var(--plex-radius-md);\r\n overflow: hidden;\r\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\r\n -webkit-font-smoothing: antialiased;\r\n -moz-osx-font-smoothing: grayscale;\r\n}\r\n\r\n/* Player Container */\r\n.plex-player {\r\n position: relative;\r\n width: 100%;\r\n height: 100%;\r\n background: var(--plex-bg-darker);\r\n overflow: hidden;\r\n user-select: none;\r\n -webkit-user-select: none;\r\n -webkit-tap-highlight-color: transparent;\r\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\r\n color: var(--plex-text-primary);\r\n}\r\n\r\n.plex-player.plex-fullscreen {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100vw;\r\n height: 100vh;\r\n z-index: 9999;\r\n border-radius: 0;\r\n}\r\n\r\n/* Video Container */\r\n.video-container {\r\n position: relative;\r\n width: 100%;\r\n height: 100%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n background: #000;\r\n z-index: var(--plex-z-video);\r\n}\r\n\r\n.video-container video {\r\n width: 100%;\r\n height: 100%;\r\n max-width: 100%;\r\n max-height: 100%;\r\n object-fit: contain;\r\n background: #000;\r\n}\r\n\r\n/* Controls Visibility */\r\n.plex-player.controls-visible .top-controls,\r\n.plex-player.controls-visible .bottom-controls {\r\n opacity: 1;\r\n visibility: visible;\r\n transform: translateY(0);\r\n}\r\n\r\n.plex-player:not(.controls-visible) .top-controls,\r\n.plex-player:not(.controls-visible) .bottom-controls {\r\n opacity: 0;\r\n visibility: hidden;\r\n}\r\n\r\n.plex-player:not(.controls-visible) .top-controls {\r\n transform: translateY(-100%);\r\n}\r\n\r\n.plex-player:not(.controls-visible) .bottom-controls {\r\n transform: translateY(100%);\r\n}\r\n\r\n/* Cursor hiding */\r\n.plex-player.hide-cursor {\r\n cursor: none;\r\n}\r\n\r\n.plex-player.hide-cursor video {\r\n cursor: none;\r\n}\r\n\r\n/* Loading Spinner */\r\n.loading-spinner {\r\n position: absolute;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\r\n z-index: var(--plex-z-overlay);\r\n}\r\n\r\n.loading-spinner .spinner {\r\n width: 60px;\r\n height: 60px;\r\n border: 4px solid rgba(255, 255, 255, 0.2);\r\n border-top-color: var(--plex-primary);\r\n border-radius: 50%;\r\n animation: spin 1s linear infinite;\r\n}\r\n\r\n@keyframes spin {\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n}\r\n\r\n/* Big Play Button */\r\n.big-play-btn {\r\n position: absolute;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%) scale(1);\r\n width: 80px;\r\n height: 80px;\r\n background: var(--plex-primary);\r\n border-radius: 50%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n cursor: pointer;\r\n z-index: var(--plex-z-overlay);\r\n transition: all var(--plex-transition-normal);\r\n box-shadow: 0 4px 30px rgba(229, 160, 13, 0.4);\r\n}\r\n\r\n.big-play-btn:hover {\r\n transform: translate(-50%, -50%) scale(1.1);\r\n background: var(--plex-primary-hover);\r\n}\r\n\r\n.big-play-btn .material-icons {\r\n font-size: 48px;\r\n color: #000;\r\n margin-left: 4px;\r\n}\r\n\r\n.big-play-btn.hidden {\r\n opacity: 0;\r\n visibility: hidden;\r\n transform: translate(-50%, -50%) scale(0.8);\r\n}\r\n\r\n/* Gesture Overlay */\r\n.gesture-overlay {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n display: flex;\r\n z-index: var(--plex-z-overlay);\r\n pointer-events: none;\r\n}\r\n\r\n.gesture-left,\r\n.gesture-right {\r\n flex: 1;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.gesture-center {\r\n flex: 1;\r\n}\r\n\r\n.gesture-indicator {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 20px;\r\n background: rgba(0, 0, 0, 0.7);\r\n border-radius: var(--plex-radius-lg);\r\n opacity: 0;\r\n transform: scale(0.8);\r\n transition: all var(--plex-transition-fast);\r\n}\r\n\r\n.gesture-indicator.active {\r\n opacity: 1;\r\n transform: scale(1);\r\n}\r\n\r\n.gesture-indicator .material-icons {\r\n font-size: 48px;\r\n color: var(--plex-text-primary);\r\n}\r\n\r\n.gesture-indicator .gesture-text {\r\n font-size: 14px;\r\n font-weight: 600;\r\n color: var(--plex-text-primary);\r\n}\r\n\r\n/* Volume/Brightness Indicators */\r\n.volume-indicator,\r\n.brightness-indicator {\r\n position: absolute;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n gap: 12px;\r\n padding: 24px;\r\n background: rgba(0, 0, 0, 0.8);\r\n border-radius: var(--plex-radius-lg);\r\n z-index: var(--plex-z-overlay);\r\n transition: opacity var(--plex-transition-fast);\r\n}\r\n\r\n.volume-indicator .material-icons,\r\n.brightness-indicator .material-icons {\r\n font-size: 36px;\r\n color: var(--plex-text-primary);\r\n}\r\n\r\n.volume-indicator-bar,\r\n.brightness-indicator-bar {\r\n width: 120px;\r\n height: 4px;\r\n background: rgba(255, 255, 255, 0.2);\r\n border-radius: 2px;\r\n overflow: hidden;\r\n}\r\n\r\n.volume-indicator-fill,\r\n.brightness-indicator-fill {\r\n height: 100%;\r\n background: var(--plex-primary);\r\n border-radius: 2px;\r\n transition: width var(--plex-transition-fast);\r\n}\r\n\r\n/* Subtitles Container */\r\n.subtitles-container {\r\n position: absolute;\r\n bottom: 80px;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n width: 80%;\r\n max-width: 800px;\r\n text-align: center;\r\n z-index: var(--plex-z-overlay);\r\n pointer-events: none;\r\n}\r\n\r\n.subtitle-line {\r\n display: inline-block;\r\n padding: 8px 16px;\r\n margin: 4px 0;\r\n background: rgba(0, 0, 0, 0.75);\r\n border-radius: var(--plex-radius-sm);\r\n font-size: 24px;\r\n line-height: 1.4;\r\n color: #fff;\r\n text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.8);\r\n}\r\n\r\n/* Cast Overlay */\r\n.cast-overlay {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n background: var(--plex-bg-darker);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n z-index: var(--plex-z-overlay);\r\n}\r\n\r\n.cast-overlay.hidden {\r\n display: none;\r\n}\r\n\r\n.cast-overlay-content {\r\n text-align: center;\r\n animation: castPulse 2s ease-in-out infinite;\r\n}\r\n\r\n.cast-overlay .cast-icon {\r\n font-size: 80px;\r\n color: var(--plex-primary);\r\n margin-bottom: 24px;\r\n}\r\n\r\n.cast-overlay .cast-title {\r\n font-size: 18px;\r\n color: var(--plex-text-secondary);\r\n margin-bottom: 8px;\r\n}\r\n\r\n.cast-overlay .cast-device {\r\n font-size: 28px;\r\n font-weight: 600;\r\n color: var(--plex-text-primary);\r\n margin-bottom: 16px;\r\n}\r\n\r\n.cast-overlay .cast-video {\r\n font-size: 16px;\r\n color: var(--plex-text-secondary);\r\n max-width: 300px;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n}\r\n\r\n@keyframes castPulse {\r\n 0%, 100% { opacity: 1; }\r\n 50% { opacity: 0.7; }\r\n}\r\n\r\n/* Utility Classes */\r\n.hidden {\r\n display: none !important;\r\n}\r\n\r\n.visually-hidden {\r\n opacity: 0;\r\n visibility: hidden;\r\n}\r\n\r\n/* Toast Notification */\r\n.toast {\r\n position: absolute;\r\n bottom: 100px;\r\n left: 50%;\r\n transform: translateX(-50%) translateY(20px);\r\n background: var(--plex-bg-overlay);\r\n padding: 12px 24px;\r\n border-radius: var(--plex-radius-md);\r\n z-index: var(--plex-z-toast);\r\n opacity: 0;\r\n visibility: hidden;\r\n transition: all var(--plex-transition-normal);\r\n}\r\n\r\n.toast.show {\r\n opacity: 1;\r\n visibility: visible;\r\n transform: translateX(-50%) translateY(0);\r\n}\r\n\r\n.toast-message {\r\n font-size: 14px;\r\n font-weight: 500;\r\n color: var(--plex-text-primary);\r\n}\r\n\r\n/* Context Menu */\r\n.context-menu {\r\n position: fixed;\r\n min-width: 200px;\r\n background: var(--plex-bg-dark);\r\n border: 1px solid var(--plex-border);\r\n border-radius: var(--plex-radius-md);\r\n box-shadow: var(--plex-shadow);\r\n z-index: var(--plex-z-modal);\r\n overflow: hidden;\r\n}\r\n\r\n.context-menu-item {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n padding: 12px 16px;\r\n cursor: pointer;\r\n transition: background var(--plex-transition-fast);\r\n}\r\n\r\n.context-menu-item:hover {\r\n background: rgba(255, 255, 255, 0.1);\r\n}\r\n\r\n.context-menu-item .material-icons {\r\n font-size: 20px;\r\n color: var(--plex-text-secondary);\r\n}\r\n\r\n.context-menu-item span:last-child {\r\n font-size: 14px;\r\n color: var(--plex-text-primary);\r\n}\r\n\r\n.context-menu-divider {\r\n height: 1px;\r\n background: var(--plex-border);\r\n margin: 4px 0;\r\n}\r\n\r\n/* Stats Overlay */\r\n.stats-overlay {\r\n position: absolute;\r\n top: 80px;\r\n left: 20px;\r\n width: 280px;\r\n background: var(--plex-bg-overlay);\r\n border-radius: var(--plex-radius-md);\r\n z-index: var(--plex-z-panel);\r\n overflow: hidden;\r\n}\r\n\r\n.stats-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 12px 16px;\r\n background: rgba(255, 255, 255, 0.05);\r\n border-bottom: 1px solid var(--plex-border);\r\n font-size: 14px;\r\n font-weight: 600;\r\n}\r\n\r\n.stats-content {\r\n padding: 12px 16px;\r\n}\r\n\r\n.stat-item {\r\n display: flex;\r\n justify-content: space-between;\r\n padding: 8px 0;\r\n font-size: 13px;\r\n border-bottom: 1px solid var(--plex-border);\r\n}\r\n\r\n.stat-item:last-child {\r\n border-bottom: none;\r\n}\r\n\r\n.stat-label {\r\n color: var(--plex-text-secondary);\r\n}\r\n\r\n.stat-value {\r\n color: var(--plex-text-primary);\r\n font-weight: 500;\r\n}\r\n\r\n/* Responsive */\r\n@media (max-width: 768px) {\r\n .big-play-btn {\r\n width: 64px;\r\n height: 64px;\r\n }\r\n \r\n .big-play-btn .material-icons {\r\n font-size: 36px;\r\n }\r\n \r\n .subtitle-line {\r\n font-size: 18px;\r\n padding: 6px 12px;\r\n }\r\n \r\n .subtitles-container {\r\n width: 90%;\r\n bottom: 70px;\r\n }\r\n \r\n .gesture-indicator .material-icons {\r\n font-size: 36px;\r\n }\r\n \r\n .stats-overlay {\r\n top: 60px;\r\n left: 10px;\r\n width: 240px;\r\n }\r\n}\r\n\r\n@media (max-width: 480px) {\r\n .big-play-btn {\r\n width: 56px;\r\n height: 56px;\r\n }\r\n \r\n .big-play-btn .material-icons {\r\n font-size: 32px;\r\n }\r\n \r\n .subtitle-line {\r\n font-size: 16px;\r\n }\r\n}\r\n\r\n/* Touch Device Optimizations */\r\n@media (hover: none) and (pointer: coarse) {\r\n .control-btn {\r\n min-width: 44px;\r\n min-height: 44px;\r\n }\r\n \r\n .volume-slider-container {\r\n display: none;\r\n }\r\n}\r\n\r\n/* Animations */\r\n@keyframes fadeIn {\r\n from {\r\n opacity: 0;\r\n }\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n@keyframes slideUp {\r\n from {\r\n opacity: 0;\r\n transform: translateY(20px);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateY(0);\r\n }\r\n}\r\n\r\n@keyframes pulse {\r\n 0%, 100% {\r\n transform: translate(-50%, -50%) scale(1);\r\n }\r\n 50% {\r\n transform: translate(-50%, -50%) scale(1.05);\r\n }\r\n}\r\n","/* =====================================================\r\n PLEX Video Player - Controls Styles (NPM Package)\r\n ===================================================== */\r\n\r\n/* Video Element */\r\n.plex-video {\r\n width: 100%;\r\n height: 100%;\r\n object-fit: contain;\r\n background: #000;\r\n}\r\n\r\n/* Controls Container */\r\n.plex-controls {\r\n position: absolute;\r\n bottom: 0;\r\n left: 0;\r\n right: 0;\r\n padding: 0 16px 16px;\r\n background: var(--plex-gradient);\r\n z-index: var(--plex-z-controls);\r\n transition: opacity var(--plex-transition-normal), visibility var(--plex-transition-normal);\r\n opacity: 1;\r\n visibility: visible;\r\n}\r\n\r\n.plex-player:not(.plex-controls-visible) .plex-controls {\r\n opacity: 0;\r\n visibility: hidden;\r\n}\r\n\r\n/* Progress Container */\r\n.plex-progress-container {\r\n position: relative;\r\n width: 100%;\r\n height: 24px;\r\n display: flex;\r\n align-items: center;\r\n cursor: pointer;\r\n padding: 8px 0;\r\n}\r\n\r\n.plex-progress-bar {\r\n position: relative;\r\n width: 100%;\r\n height: 4px;\r\n background: rgba(255, 255, 255, 0.2);\r\n border-radius: 2px;\r\n overflow: visible;\r\n transition: height var(--plex-transition-fast);\r\n}\r\n\r\n.plex-progress-container:hover .plex-progress-bar {\r\n height: 6px;\r\n}\r\n\r\n.plex-progress-buffered {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n height: 100%;\r\n background: rgba(255, 255, 255, 0.35);\r\n border-radius: 2px;\r\n pointer-events: none;\r\n width: 0;\r\n}\r\n\r\n.plex-progress-played {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n height: 100%;\r\n background: var(--plex-primary);\r\n border-radius: 2px;\r\n pointer-events: none;\r\n width: 0;\r\n}\r\n\r\n.plex-progress-handle {\r\n position: absolute;\r\n top: 50%;\r\n left: 0;\r\n width: 14px;\r\n height: 14px;\r\n background: var(--plex-primary);\r\n border-radius: 50%;\r\n transform: translate(-50%, -50%) scale(0);\r\n transition: transform var(--plex-transition-fast);\r\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.4);\r\n pointer-events: none;\r\n}\r\n\r\n.plex-progress-container:hover .plex-progress-handle {\r\n transform: translate(-50%, -50%) scale(1);\r\n}\r\n\r\n/* Progress Preview */\r\n.plex-progress-preview {\r\n position: absolute;\r\n bottom: 100%;\r\n left: 0;\r\n margin-bottom: 8px;\r\n padding: 6px 10px;\r\n background: var(--plex-bg-dark);\r\n border-radius: var(--plex-radius-sm);\r\n opacity: 0;\r\n visibility: hidden;\r\n transform: translateX(-50%);\r\n transition: opacity var(--plex-transition-fast);\r\n pointer-events: none;\r\n z-index: 50;\r\n}\r\n\r\n.plex-progress-container:hover .plex-progress-preview {\r\n opacity: 1;\r\n visibility: visible;\r\n}\r\n\r\n.plex-preview-time {\r\n font-size: 13px;\r\n font-weight: 600;\r\n color: var(--plex-text-primary);\r\n white-space: nowrap;\r\n}\r\n\r\n/* Controls Bar */\r\n.plex-controls-bar {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n margin-top: 8px;\r\n}\r\n\r\n.plex-controls-left,\r\n.plex-controls-right {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n}\r\n\r\n/* Control Button */\r\n.plex-btn {\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 40px;\r\n height: 40px;\r\n padding: 0;\r\n background: transparent;\r\n border: none;\r\n border-radius: var(--plex-radius-sm);\r\n cursor: pointer;\r\n transition: all var(--plex-transition-fast);\r\n color: var(--plex-text-primary);\r\n}\r\n\r\n.plex-btn:hover {\r\n background: rgba(255, 255, 255, 0.1);\r\n}\r\n\r\n.plex-btn:active {\r\n transform: scale(0.95);\r\n}\r\n\r\n.plex-btn svg {\r\n width: 24px;\r\n height: 24px;\r\n fill: currentColor;\r\n}\r\n\r\n.plex-btn:focus-visible {\r\n outline: 2px solid var(--plex-primary);\r\n outline-offset: 2px;\r\n}\r\n\r\n/* Play Button States */\r\n.plex-player.plex-playing .plex-play-btn .plex-icon-play {\r\n display: none;\r\n}\r\n\r\n.plex-player.plex-playing .plex-play-btn .plex-icon-pause {\r\n display: block;\r\n}\r\n\r\n.plex-player:not(.plex-playing) .plex-play-btn .plex-icon-play {\r\n display: block;\r\n}\r\n\r\n.plex-player:not(.plex-playing) .plex-play-btn .plex-icon-pause {\r\n display: none;\r\n}\r\n\r\n/* Volume Container */\r\n.plex-volume-container {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n}\r\n\r\n.plex-volume-slider {\r\n position: relative;\r\n width: 0;\r\n overflow: hidden;\r\n transition: width var(--plex-transition-normal);\r\n}\r\n\r\n.plex-volume-container:hover .plex-volume-slider {\r\n width: 80px;\r\n}\r\n\r\n.plex-volume-track {\r\n position: relative;\r\n width: 80px;\r\n height: 4px;\r\n background: rgba(255, 255, 255, 0.2);\r\n border-radius: 2px;\r\n cursor: pointer;\r\n}\r\n\r\n.plex-volume-level {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n height: 100%;\r\n background: var(--plex-primary);\r\n border-radius: 2px;\r\n pointer-events: none;\r\n width: 100%;\r\n}\r\n\r\n.plex-volume-handle {\r\n position: absolute;\r\n top: 50%;\r\n right: 0;\r\n width: 12px;\r\n height: 12px;\r\n background: var(--plex-primary);\r\n border-radius: 50%;\r\n transform: translateY(-50%);\r\n cursor: pointer;\r\n opacity: 0;\r\n transition: opacity var(--plex-transition-fast);\r\n}\r\n\r\n.plex-volume-container:hover .plex-volume-handle {\r\n opacity: 1;\r\n}\r\n\r\n/* Volume Button States */\r\n.plex-player.plex-muted .plex-icon-volume-high,\r\n.plex-player.plex-muted .plex-icon-volume-low {\r\n display: none;\r\n}\r\n\r\n.plex-player.plex-muted .plex-icon-volume-mute {\r\n display: block;\r\n}\r\n\r\n.plex-player:not(.plex-muted) .plex-icon-volume-mute {\r\n display: none;\r\n}\r\n\r\n.plex-player:not(.plex-muted) .plex-icon-volume-high {\r\n display: block;\r\n}\r\n\r\n.plex-player:not(.plex-muted) .plex-icon-volume-low {\r\n display: none;\r\n}\r\n\r\n/* Time Display */\r\n.plex-time {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n margin-left: 8px;\r\n font-size: 13px;\r\n font-weight: 500;\r\n color: var(--plex-text-primary);\r\n}\r\n\r\n.plex-time-current,\r\n.plex-time-duration {\r\n font-variant-numeric: tabular-nums;\r\n}\r\n\r\n.plex-time-separator {\r\n color: var(--plex-text-secondary);\r\n}\r\n\r\n/* Fullscreen Button States */\r\n.plex-player.plex-fullscreen .plex-icon-fullscreen {\r\n display: none;\r\n}\r\n\r\n.plex-player.plex-fullscreen .plex-icon-fullscreen-exit {\r\n display: block;\r\n}\r\n\r\n.plex-player:not(.plex-fullscreen) .plex-icon-fullscreen {\r\n display: block;\r\n}\r\n\r\n.plex-player:not(.plex-fullscreen) .plex-icon-fullscreen-exit {\r\n display: none;\r\n}\r\n\r\n/* Big Play Button */\r\n.plex-big-play {\r\n position: absolute;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%) scale(1);\r\n width: 72px;\r\n height: 72px;\r\n background: var(--plex-primary);\r\n border-radius: 50%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n cursor: pointer;\r\n z-index: var(--plex-z-overlay);\r\n transition: all var(--plex-transition-normal);\r\n box-shadow: 0 4px 30px rgba(229, 160, 13, 0.4);\r\n}\r\n\r\n.plex-big-play:hover {\r\n transform: translate(-50%, -50%) scale(1.1);\r\n background: var(--plex-primary-hover);\r\n}\r\n\r\n.plex-big-play svg {\r\n width: 40px;\r\n height: 40px;\r\n fill: #000;\r\n margin-left: 4px;\r\n}\r\n\r\n.plex-player.plex-playing .plex-big-play {\r\n opacity: 0;\r\n visibility: hidden;\r\n transform: translate(-50%, -50%) scale(0.8);\r\n}\r\n\r\n/* Loader */\r\n.plex-loader {\r\n position: absolute;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\r\n z-index: var(--plex-z-overlay);\r\n display: none;\r\n}\r\n\r\n.plex-player.plex-loading .plex-loader {\r\n display: block;\r\n}\r\n\r\n.plex-player.plex-loading .plex-big-play {\r\n display: none;\r\n}\r\n\r\n.plex-spinner {\r\n width: 48px;\r\n height: 48px;\r\n border: 4px solid rgba(255, 255, 255, 0.2);\r\n border-top-color: var(--plex-primary);\r\n border-radius: 50%;\r\n animation: plex-spin 1s linear infinite;\r\n}\r\n\r\n@keyframes plex-spin {\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n}\r\n\r\n/* Responsive */\r\n@media (max-width: 768px) {\r\n .plex-controls {\r\n padding: 0 12px 12px;\r\n }\r\n \r\n .plex-btn {\r\n width: 36px;\r\n height: 36px;\r\n }\r\n \r\n .plex-btn svg {\r\n width: 22px;\r\n height: 22px;\r\n }\r\n \r\n .plex-time {\r\n font-size: 12px;\r\n }\r\n \r\n .plex-big-play {\r\n width: 60px;\r\n height: 60px;\r\n }\r\n \r\n .plex-big-play svg {\r\n width: 32px;\r\n height: 32px;\r\n }\r\n}\r\n\r\n@media (max-width: 480px) {\r\n .plex-controls-left,\r\n .plex-controls-right {\r\n gap: 0;\r\n }\r\n \r\n .plex-btn {\r\n width: 32px;\r\n height: 32px;\r\n }\r\n \r\n .plex-btn svg {\r\n width: 20px;\r\n height: 20px;\r\n }\r\n \r\n .plex-prev-btn,\r\n .plex-next-btn,\r\n .plex-cast-btn {\r\n display: none;\r\n }\r\n \r\n .plex-big-play {\r\n width: 56px;\r\n height: 56px;\r\n }\r\n \r\n .plex-big-play svg {\r\n width: 28px;\r\n height: 28px;\r\n }\r\n}\r\n\r\n/* Controls Visibility */\r\n.plex-player.plex-controls-visible .plex-controls {\r\n opacity: 1;\r\n visibility: visible;\r\n}\r\n\r\n/* Cursor hiding when controls hidden */\r\n.plex-player:not(.plex-controls-visible) {\r\n cursor: none;\r\n}\r\n\r\n.plex-player:not(.plex-controls-visible) .plex-video {\r\n cursor: none;\r\n}\r\n","/* =====================================================\r\n PLEX Video Player - Playlist Styles\r\n ===================================================== */\r\n\r\n/* Playlist Panel */\r\n.playlist-panel {\r\n position: absolute;\r\n top: 0;\r\n right: 0;\r\n width: 360px;\r\n height: 100%;\r\n background: var(--plex-bg-dark);\r\n border-left: 1px solid var(--plex-border);\r\n z-index: var(--plex-z-panel);\r\n display: flex;\r\n flex-direction: column;\r\n transform: translateX(100%);\r\n transition: transform var(--plex-transition-normal);\r\n}\r\n\r\n.playlist-panel.visible {\r\n transform: translateX(0);\r\n}\r\n\r\n/* Playlist Header */\r\n.playlist-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 16px 20px;\r\n background: rgba(255, 255, 255, 0.03);\r\n border-bottom: 1px solid var(--plex-border);\r\n flex-shrink: 0;\r\n}\r\n\r\n.playlist-title {\r\n font-size: 16px;\r\n font-weight: 600;\r\n color: var(--plex-text-primary);\r\n}\r\n\r\n.playlist-header-actions {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n}\r\n\r\n/* Playlist Content */\r\n.playlist-content {\r\n flex: 1;\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n padding: 12px;\r\n}\r\n\r\n.playlist-content::-webkit-scrollbar {\r\n width: 6px;\r\n}\r\n\r\n.playlist-content::-webkit-scrollbar-track {\r\n background: transparent;\r\n}\r\n\r\n.playlist-content::-webkit-scrollbar-thumb {\r\n background: rgba(255, 255, 255, 0.2);\r\n border-radius: 3px;\r\n}\r\n\r\n.playlist-content::-webkit-scrollbar-thumb:hover {\r\n background: rgba(255, 255, 255, 0.3);\r\n}\r\n\r\n/* Playlist Empty State */\r\n.playlist-empty {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n height: 100%;\r\n padding: 40px;\r\n text-align: center;\r\n}\r\n\r\n.playlist-empty .material-icons {\r\n font-size: 64px;\r\n color: var(--plex-text-secondary);\r\n margin-bottom: 16px;\r\n opacity: 0.5;\r\n}\r\n\r\n.playlist-empty-title {\r\n font-size: 18px;\r\n font-weight: 600;\r\n color: var(--plex-text-primary);\r\n margin-bottom: 8px;\r\n}\r\n\r\n.playlist-empty-text {\r\n font-size: 14px;\r\n color: var(--plex-text-secondary);\r\n line-height: 1.5;\r\n}\r\n\r\n/* Playlist Item */\r\n.playlist-item {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n padding: 10px 12px;\r\n background: rgba(255, 255, 255, 0.02);\r\n border-radius: var(--plex-radius-md);\r\n cursor: pointer;\r\n transition: all var(--plex-transition-fast);\r\n margin-bottom: 8px;\r\n position: relative;\r\n}\r\n\r\n.playlist-item:hover {\r\n background: rgba(255, 255, 255, 0.08);\r\n}\r\n\r\n.playlist-item.active {\r\n background: rgba(229, 160, 13, 0.15);\r\n border: 1px solid rgba(229, 160, 13, 0.3);\r\n}\r\n\r\n.playlist-item.playing {\r\n background: rgba(229, 160, 13, 0.2);\r\n}\r\n\r\n.playlist-item.dragging {\r\n opacity: 0.5;\r\n transform: scale(0.98);\r\n}\r\n\r\n/* Playlist Item Thumbnail */\r\n.playlist-item-thumbnail {\r\n position: relative;\r\n width: 100px;\r\n height: 56px;\r\n background: var(--plex-bg-darker);\r\n border-radius: var(--plex-radius-sm);\r\n overflow: hidden;\r\n flex-shrink: 0;\r\n}\r\n\r\n.playlist-item-thumbnail img {\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n}\r\n\r\n.playlist-item-thumbnail .placeholder-icon {\r\n position: absolute;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\r\n font-size: 32px;\r\n color: var(--plex-text-secondary);\r\n opacity: 0.5;\r\n}\r\n\r\n.playlist-item-duration {\r\n position: absolute;\r\n bottom: 4px;\r\n right: 4px;\r\n padding: 2px 6px;\r\n background: rgba(0, 0, 0, 0.8);\r\n border-radius: 3px;\r\n font-size: 11px;\r\n font-weight: 600;\r\n color: var(--plex-text-primary);\r\n}\r\n\r\n/* Playing Indicator */\r\n.playlist-item-playing-indicator {\r\n position: absolute;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\r\n display: none;\r\n align-items: flex-end;\r\n justify-content: center;\r\n gap: 2px;\r\n width: 24px;\r\n height: 20px;\r\n}\r\n\r\n.playlist-item.playing .playlist-item-playing-indicator {\r\n display: flex;\r\n}\r\n\r\n.playlist-item-playing-indicator span {\r\n width: 4px;\r\n background: var(--plex-primary);\r\n border-radius: 1px;\r\n animation: equalizer 0.5s ease-in-out infinite alternate;\r\n}\r\n\r\n.playlist-item-playing-indicator span:nth-child(1) {\r\n height: 60%;\r\n animation-delay: 0s;\r\n}\r\n\r\n.playlist-item-playing-indicator span:nth-child(2) {\r\n height: 100%;\r\n animation-delay: 0.15s;\r\n}\r\n\r\n.playlist-item-playing-indicator span:nth-child(3) {\r\n height: 40%;\r\n animation-delay: 0.3s;\r\n}\r\n\r\n@keyframes equalizer {\r\n from {\r\n transform: scaleY(0.5);\r\n }\r\n to {\r\n transform: scaleY(1);\r\n }\r\n}\r\n\r\n/* Playlist Item Info */\r\n.playlist-item-info {\r\n flex: 1;\r\n min-width: 0;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n}\r\n\r\n.playlist-item-title {\r\n font-size: 14px;\r\n font-weight: 500;\r\n color: var(--plex-text-primary);\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n}\r\n\r\n.playlist-item-meta {\r\n font-size: 12px;\r\n color: var(--plex-text-secondary);\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n}\r\n\r\n/* Playlist Item Actions */\r\n.playlist-item-actions {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n opacity: 0;\r\n transition: opacity var(--plex-transition-fast);\r\n}\r\n\r\n.playlist-item:hover .playlist-item-actions {\r\n opacity: 1;\r\n}\r\n\r\n.playlist-item-action {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 28px;\r\n height: 28px;\r\n background: transparent;\r\n border: none;\r\n border-radius: var(--plex-radius-sm);\r\n cursor: pointer;\r\n color: var(--plex-text-secondary);\r\n transition: all var(--plex-transition-fast);\r\n}\r\n\r\n.playlist-item-action:hover {\r\n background: rgba(255, 255, 255, 0.1);\r\n color: var(--plex-text-primary);\r\n}\r\n\r\n.playlist-item-action .material-icons {\r\n font-size: 18px;\r\n}\r\n\r\n/* Drag Handle */\r\n.playlist-item-drag-handle {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 20px;\r\n cursor: grab;\r\n color: var(--plex-text-secondary);\r\n opacity: 0;\r\n transition: opacity var(--plex-transition-fast);\r\n}\r\n\r\n.playlist-item:hover .playlist-item-drag-handle {\r\n opacity: 1;\r\n}\r\n\r\n.playlist-item-drag-handle:active {\r\n cursor: grabbing;\r\n}\r\n\r\n.playlist-item-drag-handle .material-icons {\r\n font-size: 18px;\r\n}\r\n\r\n/* Playlist Footer */\r\n.playlist-footer {\r\n padding: 16px;\r\n border-top: 1px solid var(--plex-border);\r\n flex-shrink: 0;\r\n}\r\n\r\n.playlist-add-btn {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 8px;\r\n width: 100%;\r\n padding: 12px;\r\n background: rgba(255, 255, 255, 0.05);\r\n border: 2px dashed var(--plex-border);\r\n border-radius: var(--plex-radius-md);\r\n color: var(--plex-text-secondary);\r\n font-size: 14px;\r\n font-weight: 500;\r\n cursor: pointer;\r\n transition: all var(--plex-transition-fast);\r\n}\r\n\r\n.playlist-add-btn:hover {\r\n background: rgba(255, 255, 255, 0.08);\r\n border-color: var(--plex-primary);\r\n color: var(--plex-primary);\r\n}\r\n\r\n.playlist-add-btn .material-icons {\r\n font-size: 20px;\r\n}\r\n\r\n/* Playlist Stats */\r\n.playlist-stats {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 12px 16px;\r\n background: rgba(0, 0, 0, 0.3);\r\n border-top: 1px solid var(--plex-border);\r\n font-size: 12px;\r\n color: var(--plex-text-secondary);\r\n}\r\n\r\n/* Queue Next Indicator */\r\n.playlist-item-queue-next {\r\n position: absolute;\r\n top: 4px;\r\n left: 4px;\r\n padding: 2px 6px;\r\n background: var(--plex-primary);\r\n border-radius: 3px;\r\n font-size: 9px;\r\n font-weight: 700;\r\n color: #000;\r\n text-transform: uppercase;\r\n}\r\n\r\n/* Responsive Playlist */\r\n@media (max-width: 768px) {\r\n .playlist-panel {\r\n width: 100%;\r\n max-width: 100%;\r\n }\r\n \r\n .playlist-item-thumbnail {\r\n width: 80px;\r\n height: 45px;\r\n }\r\n \r\n .playlist-item-title {\r\n font-size: 13px;\r\n }\r\n \r\n .playlist-item-actions {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n@media (max-width: 480px) {\r\n .playlist-header {\r\n padding: 12px 16px;\r\n }\r\n \r\n .playlist-content {\r\n padding: 8px;\r\n }\r\n \r\n .playlist-item {\r\n padding: 8px;\r\n gap: 10px;\r\n }\r\n \r\n .playlist-item-thumbnail {\r\n width: 70px;\r\n height: 40px;\r\n }\r\n \r\n .playlist-item-drag-handle {\r\n display: none;\r\n }\r\n}\r\n\r\n/* Drag and Drop States */\r\n.playlist-content.drag-over {\r\n background: rgba(229, 160, 13, 0.05);\r\n}\r\n\r\n.playlist-item.drop-target-above::before {\r\n content: '';\r\n position: absolute;\r\n top: -4px;\r\n left: 0;\r\n right: 0;\r\n height: 2px;\r\n background: var(--plex-primary);\r\n border-radius: 1px;\r\n}\r\n\r\n.playlist-item.drop-target-below::after {\r\n content: '';\r\n position: absolute;\r\n bottom: -4px;\r\n left: 0;\r\n right: 0;\r\n height: 2px;\r\n background: var(--plex-primary);\r\n border-radius: 1px;\r\n}\r\n","/* =====================================================\r\n PLEX Video Player - Settings Styles (NPM Package)\r\n ===================================================== */\r\n\r\n/* Settings Panel */\r\n.plex-settings-panel {\r\n position: absolute;\r\n bottom: 80px;\r\n right: 16px;\r\n width: 280px;\r\n max-height: 400px;\r\n background: var(--plex-bg-dark);\r\n border: 1px solid var(--plex-border);\r\n border-radius: var(--plex-radius-lg);\r\n box-shadow: var(--plex-shadow);\r\n z-index: var(--plex-z-panel);\r\n overflow: hidden;\r\n opacity: 0;\r\n visibility: hidden;\r\n transform: scale(0.95) translateY(10px);\r\n transform-origin: bottom right;\r\n transition: all var(--plex-transition-fast);\r\n}\r\n\r\n.plex-settings-panel.plex-settings-open {\r\n opacity: 1;\r\n visibility: visible;\r\n transform: scale(1) translateY(0);\r\n}\r\n\r\n/* Settings Header */\r\n.plex-settings-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 12px 16px;\r\n background: rgba(255, 255, 255, 0.03);\r\n border-bottom: 1px solid var(--plex-border);\r\n}\r\n\r\n.plex-settings-title {\r\n font-size: 15px;\r\n font-weight: 600;\r\n color: var(--plex-text-primary);\r\n}\r\n\r\n.plex-settings-close {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 28px;\r\n height: 28px;\r\n padding: 0;\r\n background: transparent;\r\n border: none;\r\n border-radius: var(--plex-radius-sm);\r\n cursor: pointer;\r\n color: var(--plex-text-secondary);\r\n transition: all var(--plex-transition-fast);\r\n}\r\n\r\n.plex-settings-close:hover {\r\n background: rgba(255, 255, 255, 0.1);\r\n color: var(--plex-text-primary);\r\n}\r\n\r\n.plex-settings-close svg {\r\n width: 18px;\r\n height: 18px;\r\n fill: currentColor;\r\n}\r\n\r\n/* Settings Content */\r\n.plex-settings-content {\r\n padding: 8px 0;\r\n}\r\n\r\n/* Settings Item */\r\n.plex-settings-item {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 12px 16px;\r\n cursor: pointer;\r\n transition: background var(--plex-transition-fast);\r\n}\r\n\r\n.plex-settings-item:hover {\r\n background: rgba(255, 255, 255, 0.05);\r\n}\r\n\r\n.plex-settings-label {\r\n font-size: 14px;\r\n color: var(--plex-text-primary);\r\n}\r\n\r\n.plex-settings-value {\r\n font-size: 13px;\r\n color: var(--plex-text-secondary);\r\n}\r\n\r\n/* Settings Submenu */\r\n.plex-settings-submenu {\r\n padding: 8px 0;\r\n}\r\n\r\n.plex-settings-back {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 12px 16px;\r\n font-size: 14px;\r\n font-weight: 600;\r\n color: var(--plex-text-primary);\r\n cursor: pointer;\r\n border-bottom: 1px solid var(--plex-border);\r\n transition: background var(--plex-transition-fast);\r\n}\r\n\r\n.plex-settings-back:hover {\r\n background: rgba(255, 255, 255, 0.05);\r\n}\r\n\r\n.plex-settings-back svg {\r\n width: 18px;\r\n height: 18px;\r\n fill: currentColor;\r\n}\r\n\r\n/* Speed Options */\r\n.plex-speed-options {\r\n display: flex;\r\n flex-direction: column;\r\n padding: 8px 0;\r\n}\r\n\r\n.plex-speed-option {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 10px 16px;\r\n background: transparent;\r\n border: none;\r\n font-size: 14px;\r\n color: var(--plex-text-primary);\r\n cursor: pointer;\r\n transition: all var(--plex-transition-fast);\r\n}\r\n\r\n.plex-speed-option:hover {\r\n background: rgba(255, 255, 255, 0.05);\r\n}\r\n\r\n.plex-speed-option.active {\r\n color: var(--plex-primary);\r\n font-weight: 600;\r\n}\r\n\r\n.plex-speed-option.active::before {\r\n content: '✓';\r\n margin-right: 8px;\r\n}\r\n\r\n/* Responsive */\r\n@media (max-width: 480px) {\r\n .plex-settings-panel {\r\n width: calc(100% - 32px);\r\n left: 16px;\r\n right: 16px;\r\n }\r\n}\r\n"]}
|
package/dist/plex-player.d.ts
DELETED
|
@@ -1,457 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @frameset/plex-player - TypeScript Definitions
|
|
3
|
-
* Professional Video Player by FRAMESET Studio
|
|
4
|
-
* https://frameset.dev
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
declare module '@frameset/plex-player' {
|
|
8
|
-
export interface PlexPlayerOptions {
|
|
9
|
-
/** Container element or selector */
|
|
10
|
-
container: HTMLElement | string;
|
|
11
|
-
/** Auto-play video on load */
|
|
12
|
-
autoplay?: boolean;
|
|
13
|
-
/** Mute video on load */
|
|
14
|
-
muted?: boolean;
|
|
15
|
-
/** Loop video playback */
|
|
16
|
-
loop?: boolean;
|
|
17
|
-
/** Initial volume (0-1) */
|
|
18
|
-
volume?: number;
|
|
19
|
-
/** Playback rate (0.25-2) */
|
|
20
|
-
playbackRate?: number;
|
|
21
|
-
/** Poster image URL */
|
|
22
|
-
poster?: string;
|
|
23
|
-
/** Preload strategy */
|
|
24
|
-
preload?: 'none' | 'metadata' | 'auto';
|
|
25
|
-
/** Enable keyboard controls */
|
|
26
|
-
keyboard?: boolean;
|
|
27
|
-
/** Enable touch gestures */
|
|
28
|
-
touch?: boolean;
|
|
29
|
-
/** Enable Picture-in-Picture */
|
|
30
|
-
pip?: boolean;
|
|
31
|
-
/** Enable Chromecast */
|
|
32
|
-
cast?: boolean;
|
|
33
|
-
/** Enable fullscreen */
|
|
34
|
-
fullscreen?: boolean;
|
|
35
|
-
/** Controls auto-hide delay (ms) */
|
|
36
|
-
controlsHideDelay?: number;
|
|
37
|
-
/** Custom theme colors */
|
|
38
|
-
theme?: PlexTheme;
|
|
39
|
-
/** Subtitle options */
|
|
40
|
-
subtitles?: SubtitleOptions;
|
|
41
|
-
/** Ads configuration */
|
|
42
|
-
ads?: AdsOptions;
|
|
43
|
-
/** Playlist configuration */
|
|
44
|
-
playlist?: PlaylistOptions;
|
|
45
|
-
/** Localization */
|
|
46
|
-
i18n?: I18nOptions;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export interface PlexTheme {
|
|
50
|
-
/** Primary accent color */
|
|
51
|
-
primary?: string;
|
|
52
|
-
/** Primary hover color */
|
|
53
|
-
primaryHover?: string;
|
|
54
|
-
/** Background color */
|
|
55
|
-
background?: string;
|
|
56
|
-
/** Text primary color */
|
|
57
|
-
textPrimary?: string;
|
|
58
|
-
/** Text secondary color */
|
|
59
|
-
textSecondary?: string;
|
|
60
|
-
/** Border radius */
|
|
61
|
-
borderRadius?: string;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
export interface SubtitleOptions {
|
|
65
|
-
/** Default font size (px) */
|
|
66
|
-
fontSize?: number;
|
|
67
|
-
/** Default font family */
|
|
68
|
-
fontFamily?: string;
|
|
69
|
-
/** Default text color */
|
|
70
|
-
color?: string;
|
|
71
|
-
/** Default background color */
|
|
72
|
-
background?: string;
|
|
73
|
-
/** Default position ('bottom' | 'top') */
|
|
74
|
-
position?: 'bottom' | 'top';
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
export interface AdsOptions {
|
|
78
|
-
/** Enable ads */
|
|
79
|
-
enabled?: boolean;
|
|
80
|
-
/** Skip delay (seconds) */
|
|
81
|
-
skipDelay?: number;
|
|
82
|
-
/** Show skip button */
|
|
83
|
-
showSkip?: boolean;
|
|
84
|
-
/** VAST timeout (ms) */
|
|
85
|
-
vastTimeout?: number;
|
|
86
|
-
/** Max VAST wrapper depth */
|
|
87
|
-
maxWrapperDepth?: number;
|
|
88
|
-
/** Preroll VAST URL */
|
|
89
|
-
preroll?: string;
|
|
90
|
-
/** Postroll VAST URL */
|
|
91
|
-
postroll?: string;
|
|
92
|
-
/** Midroll configuration */
|
|
93
|
-
midrolls?: MidrollConfig[];
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
export interface MidrollConfig {
|
|
97
|
-
/** Time in seconds */
|
|
98
|
-
time: number;
|
|
99
|
-
/** VAST URL */
|
|
100
|
-
vastUrl: string;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
export interface PlaylistOptions {
|
|
104
|
-
/** Enable autoplay next */
|
|
105
|
-
autoplayNext?: boolean;
|
|
106
|
-
/** Shuffle by default */
|
|
107
|
-
shuffle?: boolean;
|
|
108
|
-
/** Repeat mode */
|
|
109
|
-
repeat?: 'none' | 'one' | 'all';
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
export interface I18nOptions {
|
|
113
|
-
play?: string;
|
|
114
|
-
pause?: string;
|
|
115
|
-
mute?: string;
|
|
116
|
-
unmute?: string;
|
|
117
|
-
fullscreen?: string;
|
|
118
|
-
exitFullscreen?: string;
|
|
119
|
-
pip?: string;
|
|
120
|
-
settings?: string;
|
|
121
|
-
subtitles?: string;
|
|
122
|
-
speed?: string;
|
|
123
|
-
quality?: string;
|
|
124
|
-
playlist?: string;
|
|
125
|
-
advertisement?: string;
|
|
126
|
-
skipAd?: string;
|
|
127
|
-
learnMore?: string;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
export interface VideoSource {
|
|
131
|
-
/** Video URL */
|
|
132
|
-
src: string;
|
|
133
|
-
/** MIME type */
|
|
134
|
-
type?: string;
|
|
135
|
-
/** Quality label */
|
|
136
|
-
label?: string;
|
|
137
|
-
/** Resolution */
|
|
138
|
-
resolution?: number;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
export interface PlaylistItem {
|
|
142
|
-
/** Unique ID */
|
|
143
|
-
id?: string;
|
|
144
|
-
/** Video URL or sources */
|
|
145
|
-
src: string | VideoSource[];
|
|
146
|
-
/** Video title */
|
|
147
|
-
title?: string;
|
|
148
|
-
/** Video poster/thumbnail */
|
|
149
|
-
poster?: string;
|
|
150
|
-
/** Video duration (seconds) */
|
|
151
|
-
duration?: number;
|
|
152
|
-
/** Subtitles */
|
|
153
|
-
subtitles?: SubtitleTrack[];
|
|
154
|
-
/** Custom metadata */
|
|
155
|
-
metadata?: Record<string, unknown>;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
export interface SubtitleTrack {
|
|
159
|
-
/** Subtitle URL */
|
|
160
|
-
src: string;
|
|
161
|
-
/** Language code */
|
|
162
|
-
lang: string;
|
|
163
|
-
/** Display label */
|
|
164
|
-
label: string;
|
|
165
|
-
/** Is default */
|
|
166
|
-
default?: boolean;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
export interface PlayerState {
|
|
170
|
-
/** Is playing */
|
|
171
|
-
playing: boolean;
|
|
172
|
-
/** Is paused */
|
|
173
|
-
paused: boolean;
|
|
174
|
-
/** Is ended */
|
|
175
|
-
ended: boolean;
|
|
176
|
-
/** Is seeking */
|
|
177
|
-
seeking: boolean;
|
|
178
|
-
/** Is buffering/waiting */
|
|
179
|
-
waiting: boolean;
|
|
180
|
-
/** Is muted */
|
|
181
|
-
muted: boolean;
|
|
182
|
-
/** Current volume (0-1) */
|
|
183
|
-
volume: number;
|
|
184
|
-
/** Current time (seconds) */
|
|
185
|
-
currentTime: number;
|
|
186
|
-
/** Duration (seconds) */
|
|
187
|
-
duration: number;
|
|
188
|
-
/** Buffered percentage (0-100) */
|
|
189
|
-
buffered: number;
|
|
190
|
-
/** Progress percentage (0-100) */
|
|
191
|
-
progress: number;
|
|
192
|
-
/** Playback rate */
|
|
193
|
-
playbackRate: number;
|
|
194
|
-
/** Is fullscreen */
|
|
195
|
-
fullscreen: boolean;
|
|
196
|
-
/** Is in PiP mode */
|
|
197
|
-
pip: boolean;
|
|
198
|
-
/** Is casting */
|
|
199
|
-
casting: boolean;
|
|
200
|
-
/** Current quality */
|
|
201
|
-
quality: string | null;
|
|
202
|
-
/** Current subtitle */
|
|
203
|
-
subtitle: string | null;
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
export type PlayerEvent =
|
|
207
|
-
| 'play'
|
|
208
|
-
| 'pause'
|
|
209
|
-
| 'ended'
|
|
210
|
-
| 'timeupdate'
|
|
211
|
-
| 'progress'
|
|
212
|
-
| 'seeking'
|
|
213
|
-
| 'seeked'
|
|
214
|
-
| 'volumechange'
|
|
215
|
-
| 'ratechange'
|
|
216
|
-
| 'loadstart'
|
|
217
|
-
| 'loadedmetadata'
|
|
218
|
-
| 'loadeddata'
|
|
219
|
-
| 'canplay'
|
|
220
|
-
| 'canplaythrough'
|
|
221
|
-
| 'waiting'
|
|
222
|
-
| 'playing'
|
|
223
|
-
| 'error'
|
|
224
|
-
| 'fullscreenchange'
|
|
225
|
-
| 'pipchange'
|
|
226
|
-
| 'castchange'
|
|
227
|
-
| 'qualitychange'
|
|
228
|
-
| 'subtitlechange'
|
|
229
|
-
| 'playlistchange'
|
|
230
|
-
| 'adstart'
|
|
231
|
-
| 'adend'
|
|
232
|
-
| 'adskip'
|
|
233
|
-
| 'aderror'
|
|
234
|
-
| 'destroy';
|
|
235
|
-
|
|
236
|
-
export type PlayerEventCallback<T = unknown> = (data: T) => void;
|
|
237
|
-
|
|
238
|
-
export class PlexPlayer {
|
|
239
|
-
/** Player version */
|
|
240
|
-
static readonly version: string;
|
|
241
|
-
|
|
242
|
-
/** Create player instance */
|
|
243
|
-
constructor(options: PlexPlayerOptions);
|
|
244
|
-
|
|
245
|
-
/** Load video source */
|
|
246
|
-
load(source: string | VideoSource | VideoSource[]): Promise<void>;
|
|
247
|
-
|
|
248
|
-
/** Load playlist */
|
|
249
|
-
loadPlaylist(items: PlaylistItem[]): void;
|
|
250
|
-
|
|
251
|
-
/** Play video */
|
|
252
|
-
play(): Promise<void>;
|
|
253
|
-
|
|
254
|
-
/** Pause video */
|
|
255
|
-
pause(): void;
|
|
256
|
-
|
|
257
|
-
/** Toggle play/pause */
|
|
258
|
-
togglePlay(): void;
|
|
259
|
-
|
|
260
|
-
/** Stop playback */
|
|
261
|
-
stop(): void;
|
|
262
|
-
|
|
263
|
-
/** Seek to time (seconds) */
|
|
264
|
-
seek(time: number): void;
|
|
265
|
-
|
|
266
|
-
/** Seek to percentage (0-100) */
|
|
267
|
-
seekPercent(percent: number): void;
|
|
268
|
-
|
|
269
|
-
/** Set volume (0-1) */
|
|
270
|
-
setVolume(volume: number): void;
|
|
271
|
-
|
|
272
|
-
/** Get current volume */
|
|
273
|
-
getVolume(): number;
|
|
274
|
-
|
|
275
|
-
/** Mute */
|
|
276
|
-
mute(): void;
|
|
277
|
-
|
|
278
|
-
/** Unmute */
|
|
279
|
-
unmute(): void;
|
|
280
|
-
|
|
281
|
-
/** Toggle mute */
|
|
282
|
-
toggleMute(): void;
|
|
283
|
-
|
|
284
|
-
/** Is muted */
|
|
285
|
-
isMuted(): boolean;
|
|
286
|
-
|
|
287
|
-
/** Set playback rate */
|
|
288
|
-
setPlaybackRate(rate: number): void;
|
|
289
|
-
|
|
290
|
-
/** Get playback rate */
|
|
291
|
-
getPlaybackRate(): number;
|
|
292
|
-
|
|
293
|
-
/** Enter fullscreen */
|
|
294
|
-
enterFullscreen(): Promise<void>;
|
|
295
|
-
|
|
296
|
-
/** Exit fullscreen */
|
|
297
|
-
exitFullscreen(): Promise<void>;
|
|
298
|
-
|
|
299
|
-
/** Toggle fullscreen */
|
|
300
|
-
toggleFullscreen(): void;
|
|
301
|
-
|
|
302
|
-
/** Is fullscreen */
|
|
303
|
-
isFullscreen(): boolean;
|
|
304
|
-
|
|
305
|
-
/** Enter Picture-in-Picture */
|
|
306
|
-
enterPiP(): Promise<void>;
|
|
307
|
-
|
|
308
|
-
/** Exit Picture-in-Picture */
|
|
309
|
-
exitPiP(): Promise<void>;
|
|
310
|
-
|
|
311
|
-
/** Toggle Picture-in-Picture */
|
|
312
|
-
togglePiP(): void;
|
|
313
|
-
|
|
314
|
-
/** Is in PiP mode */
|
|
315
|
-
isPiP(): boolean;
|
|
316
|
-
|
|
317
|
-
/** Start casting */
|
|
318
|
-
cast(): Promise<void>;
|
|
319
|
-
|
|
320
|
-
/** Stop casting */
|
|
321
|
-
stopCast(): void;
|
|
322
|
-
|
|
323
|
-
/** Is casting */
|
|
324
|
-
isCasting(): boolean;
|
|
325
|
-
|
|
326
|
-
/** Get cast device name */
|
|
327
|
-
getCastDeviceName(): string | null;
|
|
328
|
-
|
|
329
|
-
/** Add subtitle track */
|
|
330
|
-
addSubtitle(track: SubtitleTrack): void;
|
|
331
|
-
|
|
332
|
-
/** Set active subtitle */
|
|
333
|
-
setSubtitle(index: number | null): void;
|
|
334
|
-
|
|
335
|
-
/** Get subtitles list */
|
|
336
|
-
getSubtitles(): SubtitleTrack[];
|
|
337
|
-
|
|
338
|
-
/** Set quality */
|
|
339
|
-
setQuality(index: number): void;
|
|
340
|
-
|
|
341
|
-
/** Get qualities list */
|
|
342
|
-
getQualities(): VideoSource[];
|
|
343
|
-
|
|
344
|
-
/** Play VAST ad */
|
|
345
|
-
playAd(vastUrl: string): Promise<void>;
|
|
346
|
-
|
|
347
|
-
/** Schedule preroll ad */
|
|
348
|
-
schedulePreroll(vastUrl: string): void;
|
|
349
|
-
|
|
350
|
-
/** Schedule midroll ad */
|
|
351
|
-
scheduleMidroll(time: number, vastUrl: string): void;
|
|
352
|
-
|
|
353
|
-
/** Schedule postroll ad */
|
|
354
|
-
schedulePostroll(vastUrl: string): void;
|
|
355
|
-
|
|
356
|
-
/** Skip current ad */
|
|
357
|
-
skipAd(): void;
|
|
358
|
-
|
|
359
|
-
/** Is ad playing */
|
|
360
|
-
isAdPlaying(): boolean;
|
|
361
|
-
|
|
362
|
-
/** Playlist: play next */
|
|
363
|
-
next(): void;
|
|
364
|
-
|
|
365
|
-
/** Playlist: play previous */
|
|
366
|
-
previous(): void;
|
|
367
|
-
|
|
368
|
-
/** Playlist: play by index */
|
|
369
|
-
playAt(index: number): void;
|
|
370
|
-
|
|
371
|
-
/** Playlist: toggle shuffle */
|
|
372
|
-
toggleShuffle(): void;
|
|
373
|
-
|
|
374
|
-
/** Playlist: set repeat mode */
|
|
375
|
-
setRepeat(mode: 'none' | 'one' | 'all'): void;
|
|
376
|
-
|
|
377
|
-
/** Playlist: get current index */
|
|
378
|
-
getCurrentIndex(): number;
|
|
379
|
-
|
|
380
|
-
/** Playlist: get items */
|
|
381
|
-
getPlaylist(): PlaylistItem[];
|
|
382
|
-
|
|
383
|
-
/** Get current player state */
|
|
384
|
-
getState(): PlayerState;
|
|
385
|
-
|
|
386
|
-
/** Get video element */
|
|
387
|
-
getVideoElement(): HTMLVideoElement;
|
|
388
|
-
|
|
389
|
-
/** Get container element */
|
|
390
|
-
getContainer(): HTMLElement;
|
|
391
|
-
|
|
392
|
-
/** Add event listener */
|
|
393
|
-
on<T = unknown>(event: PlayerEvent, callback: PlayerEventCallback<T>): void;
|
|
394
|
-
|
|
395
|
-
/** Remove event listener */
|
|
396
|
-
off<T = unknown>(event: PlayerEvent, callback: PlayerEventCallback<T>): void;
|
|
397
|
-
|
|
398
|
-
/** Add one-time event listener */
|
|
399
|
-
once<T = unknown>(event: PlayerEvent, callback: PlayerEventCallback<T>): void;
|
|
400
|
-
|
|
401
|
-
/** Destroy player instance */
|
|
402
|
-
destroy(): void;
|
|
403
|
-
}
|
|
404
|
-
|
|
405
|
-
export default PlexPlayer;
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
declare module '@frameset/plex-player/react' {
|
|
409
|
-
import { FC, RefObject } from 'react';
|
|
410
|
-
import { PlexPlayer, PlexPlayerOptions, PlaylistItem, PlayerEvent, PlayerEventCallback } from '@frameset/plex-player';
|
|
411
|
-
|
|
412
|
-
export interface PlexPlayerProps extends Omit<PlexPlayerOptions, 'container'> {
|
|
413
|
-
/** Video source URL */
|
|
414
|
-
src?: string;
|
|
415
|
-
/** Playlist items */
|
|
416
|
-
playlist?: PlaylistItem[];
|
|
417
|
-
/** CSS class name */
|
|
418
|
-
className?: string;
|
|
419
|
-
/** Inline styles */
|
|
420
|
-
style?: React.CSSProperties;
|
|
421
|
-
/** Player ref */
|
|
422
|
-
playerRef?: RefObject<PlexPlayer | null>;
|
|
423
|
-
/** Event callbacks */
|
|
424
|
-
onPlay?: () => void;
|
|
425
|
-
onPause?: () => void;
|
|
426
|
-
onEnded?: () => void;
|
|
427
|
-
onTimeUpdate?: (time: number) => void;
|
|
428
|
-
onProgress?: (buffered: number) => void;
|
|
429
|
-
onVolumeChange?: (volume: number, muted: boolean) => void;
|
|
430
|
-
onFullscreenChange?: (isFullscreen: boolean) => void;
|
|
431
|
-
onError?: (error: Error) => void;
|
|
432
|
-
onReady?: (player: PlexPlayer) => void;
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
export const PlexPlayerReact: FC<PlexPlayerProps>;
|
|
436
|
-
export const usePlexPlayer: () => PlexPlayer | null;
|
|
437
|
-
export default PlexPlayerReact;
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
declare module '@frameset/plex-player/vue' {
|
|
441
|
-
import { DefineComponent, Ref } from 'vue';
|
|
442
|
-
import { PlexPlayer, PlexPlayerOptions, PlaylistItem } from '@frameset/plex-player';
|
|
443
|
-
|
|
444
|
-
export interface PlexPlayerVueProps extends Omit<PlexPlayerOptions, 'container'> {
|
|
445
|
-
src?: string;
|
|
446
|
-
playlist?: PlaylistItem[];
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
export const PlexPlayerVue: DefineComponent<PlexPlayerVueProps>;
|
|
450
|
-
export const usePlexPlayer: () => Ref<PlexPlayer | null>;
|
|
451
|
-
export default PlexPlayerVue;
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
declare module '@frameset/plex-player/css' {
|
|
455
|
-
const css: string;
|
|
456
|
-
export default css;
|
|
457
|
-
}
|