diff --git a/frontend-tools/video-js/src/VideoJS.css b/frontend-tools/video-js/src/VideoJS.css index 5229a6ab..304923fe 100644 --- a/frontend-tools/video-js/src/VideoJS.css +++ b/frontend-tools/video-js/src/VideoJS.css @@ -1,18 +1,24 @@ -.video-js { - border-radius: 12px !important; - overflow: hidden !important; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15) !important; - outline: none !important; /* Remove default focus outline */ +html { + box-sizing: border-box; } -/* Ensure video element can receive focus for keyboard controls */ -/* .video-js:focus { - border: 50px solid red; - box-shadow: - 0 4px 12px rgba(0, 0, 0, 0.15), - 0 0 0 3px rgba(0, 122, 204, 0.3) !important; -} */ +*, *::before, *::after { + box-sizing: inherit; +} +.playlist-items a { + text-decoration: none!important; +} + +div.video-js.vjs-fluid { + /* border-radius: 12px !important; + overflow: hidden !important; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15) !important; + outline: none !important; + max-width:800px !important; + height:600px !important; + padding:0 !important ; */ +} .video-js video { outline: none !important; } @@ -22,13 +28,21 @@ .video-js video { border-radius: 12px !important; } -.video-js .vjs-control-bar { - border-bottom-left-radius: 12px !important; - border-bottom-right-radius: 12px !important; - padding-bottom: 5px; - padding-top: 0px; + +.video-js div.vjs-control-bar { + background: transparent !important; + background-color: transparent !important; + background-image: none !important; + display: flex !important; + flex-direction: row !important; + align-items: center !important; + justify-content: flex-start !important; + padding:0 12px; + height:48px; } + + /* Responsive video container */ .video-container { width: 100%; @@ -37,61 +51,15 @@ padding: 0 20px; box-sizing: border-box; } - -/* Ensure video.js responsive behavior */ .video-js.vjs-fluid { width: 100% !important; max-width: 100% !important; } -.vjs-next-video-control { - width: 3em !important; - height: 3em !important; - flex: none; - padding: 0 !important; - margin: 0 !important; - line-height: 3em !important; - position: absolute; - bottom: 10px; - right: 10px; -} - -/* Autoplay Toggle Button Styles */ -.vjs-autoplay-toggle { - width: 3em !important; - height: 3em !important; - flex: none; - padding: 0 !important; - margin: 0 4px !important; - line-height: 3em !important; - position: relative; - border: none !important; - background: transparent !important; - color: #fff !important; - cursor: pointer !important; - transition: all 0.2s ease !important; -} - -/* .vjs-autoplay-toggle:hover { - color: #ff4444 !important; - transform: scale(1.1) !important; -} */ - -.vjs-autoplay-toggle .vjs-autoplay-icon { - width: 1.2em; - height: 1.2em; - display: flex; - align-items: center; - justify-content: center; - margin: auto; - pointer-events: none; -} - .vjs-autoplay-toggle .vjs-autoplay-icon svg { width: 100%; height: 100%; display: block; } - .vjs-next-video-control .vjs-icon-placeholder { width: 1.2em; height: 1.2em; @@ -100,70 +68,85 @@ justify-content: center; margin: auto; } - .vjs-next-video-control .vjs-icon-placeholder svg { width: 100%; height: 100%; display: block; } - -/* End Screen Overlay Styles */ .vjs-end-screen-overlay { position: absolute; top: 0; left: 0; width: 100%; height: calc(100% - 46px); - background: rgba(0, 0, 0, 0.8); + background: rgba(0, 0, 0, 0.9); display: none; flex-direction: column; - justify-content: center; + justify-content: center; /* Center the content vertically */ align-items: center; z-index: 1000; - padding: 0; + padding: 20px 0; box-sizing: border-box; + /* Remove overflow-y: auto to prevent scrollbar */ } - .vjs-related-videos-title { color: white; font-size: 24px; margin-bottom: 20px; text-align: center; font-weight: bold; + /* Ensure title doesn't interfere with centering */ + flex-shrink: 0; } - .vjs-related-videos-grid { display: grid; - grid-template-columns: repeat(4, 1fr); - grid-template-rows: repeat(3, 1fr); - gap: 0; + grid-template-columns: repeat(4, 1fr); /* Default: 4 columns for large screens */ + gap: 3px; /* Reduced gap like YouTube */ width: 100%; - height: 100%; + max-width: 100%; margin: 0; + padding: 16px; + box-sizing: border-box; + align-content: center; /* Center the grid content */ + justify-items: center; + /* Ensure grid fits within video area */ + max-height: calc(100vh - 200px); /* Limit height to fit within video area */ + overflow: hidden; /* Hide videos that don't fit */ + /* Center the entire grid within the video area */ + align-self: center; + flex-shrink: 0; } - .vjs-related-video-item { position: relative; cursor: pointer; - border-radius: 0; + border-radius: 5px; overflow: hidden; - transition: none; + transition: transform 0.2s ease, box-shadow 0.2s ease; background: #1a1a1a; - border: 1px solid #000; + border: 1px solid #333; + /* aspect-ratio: 16/9; */ + width: 100%; + max-width: 100%; + /* Remove min/max height constraints to let aspect-ratio handle sizing */ + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); /* Subtle shadow like YouTube */ } - .vjs-related-video-item:hover { - transform: none; + transform: translateY(-2px); + box-shadow: 0 8px 25px rgba(0, 0, 0, 0.3); } - .vjs-related-video-thumbnail { width: 100%; height: 100%; object-fit: cover; display: block; - border-radius: 0; + /* border-radius: 8px; */ + background: #1a1a1a; /* Fallback background */ + transition: transform 0.2s ease; } +.vjs-related-video-item:hover .vjs-related-video-thumbnail { + transform: scale(1.02); /* Subtle zoom like YouTube */ +} .vjs-related-video-overlay { position: absolute; top: 0; @@ -180,11 +163,9 @@ justify-content: flex-start; height: 100%; } - .vjs-related-video-item:hover .vjs-related-video-overlay { opacity: 1; } - .vjs-related-video-title { font-size: 14px; font-weight: bold; @@ -192,30 +173,25 @@ color: white; margin-bottom: 4px; } - .vjs-related-video-meta { display: flex; flex-direction: row; gap: 8px; align-items: center; } - .vjs-related-video-author { font-size: 12px; color: #ccc; } - .vjs-related-video-views { font-size: 12px; color: #aaa; } - .vjs-related-video-author::after { content: "•"; margin-left: 8px; color: #666; } - .vjs-related-video-duration { position: absolute; bottom: 8px; @@ -229,46 +205,42 @@ opacity: 0; transition: opacity 0.3s ease; } - .vjs-related-video-item:hover .vjs-related-video-duration { opacity: 1; } - -/* Keep entire control bar active when video ends */ .video-js.vjs-ended .vjs-control-bar { opacity: 1 !important; pointer-events: auto !important; } - .video-js.vjs-ended .vjs-control-bar .vjs-control { opacity: 1 !important; pointer-events: auto !important; cursor: pointer !important; } - .video-js.vjs-ended .vjs-control-bar button { opacity: 1 !important; pointer-events: auto !important; cursor: pointer !important; } - +.video-js.vjs-ended .vjs-control-bar .vjs-control.vjs-volume-control{ + opacity: 0 !important; +} +.video-js.vjs-ended .vjs-control-bar .vjs-volume-panel.vjs-hover .vjs-volume-control{ + opacity: 1 !important; +} .video-js.vjs-ended .vjs-play-control { opacity: 1 !important; pointer-events: auto !important; cursor: pointer !important; } - .video-js.vjs-ended .vjs-progress-control { opacity: 1 !important; pointer-events: auto !important; } - .video-js.vjs-ended .vjs-volume-panel { opacity: 1 !important; pointer-events: auto !important; } - -/* Chapter Markers and Tooltip Styles */ .vjs-chapter-markers-track { position: absolute; top: 0; @@ -276,6 +248,7 @@ width: 100%; height: 100%; pointer-events: none; + overflow:hidden; } .vjs-chapter-marker { @@ -371,18 +344,280 @@ visibility: hidden !important; } -/* Responsive adjustments */ -@media (max-width: 768px) { - .video-container { - padding: 0 15px; - } +.video-js .vjs-volume-panel.vjs-hover{ + transition:ease-in-out .5s !important; + width:auto !important; +} +/* Hide only Captions (CC) icon; keep Subtitles icon visible */ +.video-js .vjs-captions-button, +.video-js .vjs-subs-caps-button { + display: none !important; +} + +/* Hide the built-in Subtitles dropdown popup; we handle toggle ourselves */ +.video-js .vjs-subtitles-button .vjs-menu { + display: none !important; + visibility: hidden !important; + opacity: 0 !important; + pointer-events: none !important; +} + +/* Ensure subtitle menu is completely hidden in all states */ +.video-js .vjs-subtitles-button .vjs-menu.vjs-lock-showing { + display: none !important; + visibility: hidden !important; + opacity: 0 !important; + pointer-events: none !important; +} + +/* Fix subtitle positioning to prevent overlap with control bar - ALL SCREEN SIZES */ +.video-js .vjs-text-track-display { + position: absolute !important; + bottom: 6em !important; /* Position well above control bar */ + left: 0 !important; + right: 0 !important; + top: 0 !important; + pointer-events: none !important; + z-index: 10 !important; /* Higher z-index to ensure subtitles appear on top */ +} + +.video-js .vjs-text-track-cue { + position: absolute !important; + bottom: 0 !important; + left: 0 !important; + right: 0 !important; + text-align: center !important; + margin: 0 !important; + padding: 0 !important; + background: transparent !important; + border: none !important; + font-size: 1.2em !important; + line-height: 1.4 !important; + color: #ffffff !important; + text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.8) !important; + font-family: Arial, sans-serif !important; + font-weight: 600 !important; + white-space: pre-line !important; + word-wrap: break-word !important; + max-width: 90% !important; + margin-left: auto !important; + margin-right: auto !important; + z-index: 11 !important; /* Ensure subtitle text appears on top */ +} + +.video-js .vjs-text-track-cue > div { + background: rgba(0, 0, 0, 0.7) !important; + padding: 8px 12px !important; + border-radius: 4px !important; + display: inline-block !important; + margin: 2px 0 !important; + max-width: 100% !important; + box-sizing: border-box !important; +} + +/* Fullscreen subtitle positioning */ +.video-js.vjs-fullscreen .vjs-text-track-display { + bottom: 8em !important; /* More space in fullscreen */ +} + +.video-js.vjs-fullscreen .vjs-text-track-cue { + font-size: 1.4em !important; + max-width: 85% !important; +} + +.video-js.vjs-fullscreen .vjs-text-track-cue > div { + padding: 10px 16px !important; + font-size: 1em !important; +} + +.video-js .vjs-subtitles-button .vjs-menu.vjs-lock-showing .vjs-menu-content { + display: none !important; + visibility: hidden !important; + opacity: 0 !important; + pointer-events: none !important; +} + +/* Hide the built-in Chapters dropdown popup; we handle toggle ourselves */ +.video-js .vjs-chapters-button .vjs-menu { display: none !important; } + +/* Ensure chapters menu is hidden in all states */ +.video-js .vjs-chapters-button .vjs-menu.vjs-lock-showing { display: none !important; } +.video-js .vjs-chapters-button .vjs-menu.vjs-lock-showing .vjs-menu-content { display: none !important; } + +/* Completely disable chapters menu functionality */ +.video-js .vjs-chapters-button .vjs-menu { + display: none !important; + visibility: hidden !important; + opacity: 0 !important; + pointer-events: none !important; +} + +/* YouTube-like Subtitles icon active indicator (red underline) */ +.video-js .vjs-subtitles-button { + position: relative; + cursor: pointer !important; + pointer-events: auto !important; +} + +.video-js button.vjs-subtitles-button { + cursor: pointer !important; + pointer-events: auto !important; + touch-action: manipulation !important; + -webkit-tap-highlight-color: transparent !important; +} + +.video-js button.vjs-subtitles-button::before { + content: ""; + position: absolute; + left: 50%; + transform:translateX(-50%); + bottom: 6px; + height: 3px; + background: #e1002d; + border-radius: 2px; + width:0; + padding:0; + transition: none !important; + animation: none !important; + -webkit-transition: none !important; + -moz-transition: none !important; + -o-transition: none !important; +} + +.video-js .vjs-subs-active button.vjs-subtitles-button::before { + width:24px; + transition: none !important; + animation: none !important; + -webkit-transition: none !important; + -moz-transition: none !important; + -o-transition: none !important; +} + +/* Ensure subtitle button itself has no transitions */ +.video-js button.vjs-subtitles-button { + transition: none !important; + animation: none !important; + -webkit-transition: none !important; + -moz-transition: none !important; + -o-transition: none !important; +} + +/* Hide default Video.js tooltips for autoplay button */ +.video-js .vjs-autoplay-toggle .vjs-hover-display, +.video-js .vjs-autoplay-toggle .vjs-tooltip, +.video-js .vjs-autoplay-toggle .vjs-tooltip-text { + display: none !important; + visibility: hidden !important; + opacity: 0 !important; + pointer-events: none !important; +} + +/* Custom tooltip for autoplay toggle button */ +.video-js .vjs-autoplay-toggle { + position: relative; +} + +.video-js .vjs-autoplay-toggle::after { + content: attr(title); + position: absolute; + bottom: 100%; + left: 50%; + transform: translateX(-50%); + background: rgba(0, 0, 0, 0.9); + color: white; + padding: 6px 10px; + border-radius: 4px; + font-size: 12px; + white-space: nowrap; + pointer-events: none; + opacity: 0; + visibility: hidden; + transition: opacity 0.2s ease, visibility 0.2s ease; + z-index: 1000; + margin-bottom: 8px; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3); + border: 1px solid rgba(255, 255, 255, 0.1); +} + +.video-js .vjs-autoplay-toggle:hover::after, +.video-js .vjs-autoplay-toggle:focus::after { + opacity: 1; + visibility: visible; +} + + + + +/* Large desktop (1200px+) - 4x3 grid */ +@media(min-width: 1200px){ + .vjs-related-videos-grid { + grid-template-columns: repeat(4, 1fr); + gap: 3px; /* Tighter spacing like YouTube */ + padding: 20px; + max-height: calc(100vh - 220px); /* Ensure it fits within video area */ + } +} + +/* Desktop (1024px - 1199px) - 3x3 grid */ +@media(min-width: 1024px) and (max-width: 1199px){ .vjs-related-videos-grid { grid-template-columns: repeat(3, 1fr); - grid-template-rows: repeat(2, 1fr); - gap: 0; - width: 100%; - height: 100%; + gap: 3px; /* Tighter spacing like YouTube */ + padding: 18px; + max-height: calc(100vh - 210px); /* Ensure it fits within video area */ + } +} + +/* Tablet (768px - 1023px) - 3x2 grid */ +@media(min-width: 768px) and (max-width: 1023px){ + .vjs-related-videos-grid { + grid-template-columns: repeat(3, 1fr); + gap: 3px; /* Tighter spacing like YouTube */ + padding: 14px; + max-height: calc(100vh - 200px); /* Ensure it fits within video area */ + } + + /* Hide all custom tooltips on tablet screens */ + .video-js .vjs-control:hover::after, + .video-js .vjs-control:focus::after, + .video-js .vjs-control:active::after { + display: none !important; + opacity: 0 !important; + visibility: hidden !important; + } + + /* Hide specific control tooltips on tablet */ + .video-js .vjs-play-control:hover::after, + .video-js .vjs-mute-control:hover::after, + .video-js .vjs-volume-panel:hover::after, + .video-js .vjs-fullscreen-control:hover::after, + .video-js .vjs-picture-in-picture-control:hover::after, + .video-js .vjs-settings-control:hover::after, + .video-js .vjs-chapters-control:hover::after, + .video-js .vjs-autoplay-toggle:hover::after, + .video-js .vjs-next-video-control:hover::after, + .video-js .vjs-remaining-time:hover::after { + display: none !important; + opacity: 0 !important; + visibility: hidden !important; + } +} + +/* Responsive adjustments */ +@media (max-width: 767px) { + .video-js .vjs-autoplay-toggle.touch-active::after { + opacity: 1; + visibility: visible; + } + .video-js .vjs-autoplay-toggle::after { + font-size: 11px; + padding: 5px 8px; + margin-bottom: 6px; + } + .video-container { + padding: 0 15px; } .vjs-end-screen-overlay { @@ -395,12 +630,149 @@ } .vjs-chapter-floating-tooltip { - max-width: 200px !important; font-size: 11px !important; - padding: 6px 10px !important; + } + + /* Mobile settings popup visibility */ + + + + /* Mobile chapters popup visibility */ + .custom-chapters-overlay .video-chapter { + right: 10px ; + left: auto ; + width: 100% ; + max-width: calc(300px - 20px) ; + height: calc(100% - 40px) ; + max-height: calc(100% - 40px) ; + overflow: hidden ; + bottom: 40px; + } + + /* Mobile settings button fixes */ + .video-js .vjs-settings-button { + min-width: 44px !important; + height: 44px !important; + padding: 0 !important; + margin: 0 2px !important; + display: flex !important; + align-items: center !important; + justify-content: center !important; + touch-action: manipulation !important; + -webkit-tap-highlight-color: transparent !important; + cursor: pointer !important; + z-index: 1000 !important; + pointer-events: auto !important; + position: relative !important; + } + + .video-js .vjs-settings-button .vjs-icon-cog { + font-size: 20px !important; + width: 20px !important; + height: 20px !important; + display: flex !important; + align-items: center !important; + justify-content: center !important; + } + + /* Mobile touch improvements */ + .video-js .vjs-control-bar .vjs-button { + touch-action: manipulation !important; + -webkit-tap-highlight-color: transparent !important; + -webkit-touch-callout: none !important; + -webkit-user-select: none !important; + user-select: none !important; + } + + /* Mobile settings menu items */ + .custom-settings-overlay .settings-item { + padding:6px 16px ; + font-size:15px ; + touch-action: manipulation ; + line-height:18px; + } + + .custom-settings-overlay .settings-header { + padding: 10px 16px ; + font-size: 18px ; + line-height:20px ; + } + + /* Mobile submenu fixes */ + + + + /* Mobile chapters content adjustments */ + .chapter-head { + padding:10px 15px ; + } + + .chapter-title h3 a { + font-size: 15px !important; + line-height: 20px !important; + height:20px !important; + } + + .chapter-title p { + font-size: 11px !important; + line-height: 14px !important; + } + + + .playlist-items a { + padding:10px 16px !important; + min-height: 58px !important; + } + + .thumbnail-meta h4 { + font-size: 13px !important; + line-height: 18px !important; + } + + .thumbnail-meta .meta-sub .meta-dynamic { + font-size: 11px !important; + line-height: 16px !important; } } + +@media(max-width:767px){ + body div.custom-settings-overlay{ bottom:40px; } + div.chapter-close button{ width:30px; height:30px;} + .vjs-related-videos-grid { + grid-template-columns: repeat(2, 1fr); + gap: 3px; /* Tighter spacing like YouTube */ + padding: 10px; + max-height: calc(100vh - 180px); /* Ensure it fits within video area */ + } + + /* Hide all custom tooltips on mobile screens */ + .video-js .vjs-control:hover::after, + .video-js .vjs-control:focus::after, + .video-js .vjs-control:active::after { + display: none !important; + opacity: 0 !important; + visibility: hidden !important; + } + + /* Hide specific control tooltips on mobile */ + .video-js .vjs-play-control:hover::after, + .video-js .vjs-mute-control:hover::after, + .video-js .vjs-volume-panel:hover::after, + .video-js .vjs-fullscreen-control:hover::after, + .video-js .vjs-picture-in-picture-control:hover::after, + .video-js .vjs-settings-control:hover::after, + .video-js .vjs-chapters-control:hover::after, + .video-js .vjs-autoplay-toggle:hover::after, + .video-js .vjs-next-video-control:hover::after, + .video-js .vjs-remaining-time:hover::after { + display: none !important; + opacity: 0 !important; + visibility: hidden !important; + } +} + +/* Small mobile responsive adjustments */ @media (max-width: 480px) { .video-container { padding: 0 10px; @@ -408,37 +780,95 @@ .vjs-related-videos-grid { grid-template-columns: repeat(2, 1fr); - grid-template-rows: repeat(3, 1fr); - gap: 0; - width: 100%; - height: 100%; + gap: 3px; /* Very tight spacing like YouTube mobile */ + padding: 8px; + max-height: calc(100vh - 160px); /* Ensure it fits within video area */ + } + + /* Hide all custom tooltips on small mobile screens */ + .video-js .vjs-control:hover::after, + .video-js .vjs-control:focus::after, + .video-js .vjs-control:active::after { + display: none !important; + opacity: 0 !important; + visibility: hidden !important; + } + + /* Hide specific control tooltips on small mobile */ + .video-js .vjs-play-control:hover::after, + .video-js .vjs-mute-control:hover::after, + .video-js .vjs-volume-panel:hover::after, + .video-js .vjs-fullscreen-control:hover::after, + .video-js .vjs-picture-in-picture-control:hover::after, + .video-js .vjs-settings-control:hover::after, + .video-js .vjs-chapters-control:hover::after, + .video-js .vjs-autoplay-toggle:hover::after, + .video-js .vjs-next-video-control:hover::after, + .video-js .vjs-remaining-time:hover::after { + display: none !important; + opacity: 0 !important; + visibility: hidden !important; } - .vjs-end-screen-overlay { padding: 0; height: calc(100% - 46px); } - .vjs-related-video-thumbnail { height: 100%; } - - /* Make sure video info panel is responsive */ - .video-info { - margin-top: 10px !important; - padding: 10px !important; - font-size: 14px !important; - } - - .video-info h4 { - font-size: 16px !important; - } - - .video-info ul { - font-size: 12px !important; + .video-js .vjs-settings-button .vjs-icon-cog { + font-size: 22px !important; + width: 22px !important; + height: 22px !important; } } +/* Settings Button - Base Styles */ +.video-js .vjs-settings-button { + cursor: pointer !important; + pointer-events: auto !important; + position: relative !important; + display: flex !important; + align-items: center !important; + justify-content: center !important; + min-width: 32px !important; + height: 32px !important; + padding: 0 !important; + margin: 0 2px !important; + border: none !important; + background: transparent !important; + color: inherit !important; + font-size: inherit !important; + line-height: inherit !important; + text-align: center !important; + vertical-align: middle !important; + touch-action: manipulation !important; + -webkit-tap-highlight-color: transparent !important; + -webkit-touch-callout: none !important; + -webkit-user-select: none !important; + user-select: none !important; +} + +.video-js .vjs-settings-button:hover { + background-color: rgba(255, 255, 255, 0.1) !important; +} + +.video-js .vjs-settings-button:focus { + outline: 2px solid #fff !important; + outline-offset: 2px !important; +} + +.video-js .vjs-settings-button .vjs-icon-cog { + font-size: 18px !important; + width: 18px !important; + height: 18px !important; + display: flex !important; + align-items: center !important; + justify-content: center !important; +} + + + /* Played portion, buffered portion, unplayed portion */ .vjs-play-progress { background-color: #019932 !important; @@ -481,16 +911,8 @@ } */ /* Remove the semi-transparent background from control bar */ -.video-js .vjs-control-bar { - background: transparent !important; - background-color: transparent !important; - background-image: none !important; - display: flex !important; - flex-direction: row !important; - align-items: center !important; - justify-content: flex-start !important; - gap: 6px !important; -} + + /* Push specific buttons to the right */ /* .video-js .vjs-playback-rate, @@ -511,13 +933,13 @@ .video-js .vjs-control-bar .vjs-button .vjs-icon-placeholder, .video-js .vjs-control-bar [class*="vjs-icon-"] { font-size: 1.5em !important; - transform: translateY(-28px) !important; + /* transform: translateY(-28px) !important; */ } -.video-js .vjs-control-bar svg { +/* .video-js .vjs-control-bar svg { width: 3em !important; height: 3em !important; transform: translateY(-16px) !important; -} +} */ /******** BEGIN: Custom Remaining Time Styles *********/ .vjs-control-bar .custom-remaining-time .vjs-remaining-time-display { @@ -532,13 +954,13 @@ } /* Ensure proper vertical alignment within control bar */ -.vjs-control-bar .custom-remaining-time { +/* .vjs-control-bar .custom-remaining-time { top: -5px; display: flex; align-items: center; justify-content: center; height: 100%; -} +} */ /********* END: Custom Remaining Time Styles *********/ @@ -550,14 +972,6 @@ top: -5px; } -/* Push specific controls to the right side of control bar */ -.video-js .vjs-control-bar { - display: flex !important; - flex-direction: row !important; - align-items: center !important; - justify-content: flex-start !important; - gap: 6px !important; -} /* Spacer element to push buttons to the right */ .video-js .vjs-spacer-control { @@ -567,11 +981,26 @@ } /* Basic control bar styling - let JavaScript handle positioning */ +/* .video-js .vjs-control-bar { + display: flex !important; + /* gap: 6px !important; Consistent spacing between all control bar icons */ + /* align-items: center !important; +} */ + .video-js .vjs-control-bar .vjs-control { /* Natural flex flow */ flex: none !important; /* Prevent controls from growing */ } +/* Specific spacing for autoplay and picture-in-picture buttons */ +.video-js .vjs-autoplay-toggle { + margin-right: 10px !important; /* Add spacing after autoplay button */ +} + +.video-js .vjs-picture-in-picture-control { + margin-left: 6px !important; /* Add spacing before picture-in-picture button */ +} + /* Seek Indicator Styles */ .vjs-seek-indicator { position: absolute !important; @@ -694,12 +1123,10 @@ } button{cursor: pointer;} -body{ font-family: Arial, Helvetica, sans-serif; box-sizing:border-box;} -.video-wrapper{ position:relative; font-family:Arial; height:calc(100vh - 16px);} -.video-box{ height:100%;} -.video-wrapper .video-box .video-js{ padding:0; height:100% !important;} -.video-chapter{ position:absolute; top:10px; width:min(360px, calc(100% - 20px)); border:1px solid rgba(255, 255, 255, 0.12); border-radius:12px; +.video-js{ padding:0; height:100% !important;} + +.video-chapter{ position:absolute; top:auto; bottom:60px; width:min(360px, calc(100% - 20px)); border:1px solid rgba(255, 255, 255, 0.12); border-radius:12px; height:calc(100% - 80px); background:rgba(18, 18, 18, 0.96); backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px); overflow:hidden; box-shadow: 0 12px 30px rgba(0,0,0,0.45); right:10px;} .chapter-head{ padding:12px 8px 10px 16px; position:sticky; top:0; left:0; background:linear-gradient(180deg, rgba(28,28,28,0.95), rgba(18,18,18,0.95)); @@ -709,8 +1136,8 @@ border-bottom:1px solid rgba(255,255,255,0.08); z-index:2; } .chapter-title h3{ margin:0; padding:0;} .chapter-title h3 a{color:#fff; font-size: 18px; line-height: 26px; font-weight: 700; text-decoration: none; white-space: nowrap; text-overflow: ellipsis; height: 28px; overflow: hidden; display: block;} -.chapter-title p{ margin:4px 0 0; padding:0; color:#bdbdbd; font-size:12px; font-weight:400; line-height:15px;} -.chapter-title p a{ color:#bdbdbd; font-size:12px; font-weight:400; line-height:15px; text-decoration: none;} +.chapter-title p{ margin:4px 0 0; padding:0; color:#fff; font-size:12px; font-weight:400; line-height:15px;} +.chapter-title p a{ color:#fff; font-size:12px; font-weight:400; line-height:15px; text-decoration: none;} .chapter-close{ width:40px; margin-left:auto; display:flex; align-items:center; justify-content:flex-end;} .chapter-close button{ background:transparent; color:#fff; border: 0; width: 40px; height: 40px; padding: 0; display: flex; @@ -722,9 +1149,9 @@ align-items: center; justify-content: center; align-items:center; border-radius: .playlist-action-menu button:hover{ background:rgba(0, 0, 0, 0.1);} .start-action{ display:flex;} -.chapter-body{ height:calc(100% - 59px); overflow:auto; } +.chapter-body{ height:calc(100% - 80px); overflow:auto; } .chapter-body ul{ margin:0; padding:0;} -.playlist-items a{ padding:12px; display:flex; align-items:center; text-decoration:none; gap:12px; width:100%; box-sizing:border-box;} +.playlist-items a{ padding:12px; display:flex; align-items:center; text-decoration:none; gap:12px; width:100%; box-sizing:border-box; color:#fff;} .playlist-items a:hover{background:rgba(255,255,255,0.06);} .playlist-items.selected a{ background:rgba(255,255,255,0.14);} .playlist-drag-handle{ width:24px; display:flex; justify-content:center; color:#e0e0e0; font-size:12px;} @@ -741,6 +1168,190 @@ color:#fff; white-space:normal; max-height:40px; -webkit-line-clamp: 2; line-cla .chapter-body::-webkit-scrollbar-thumb{ background:rgba(255,255,255,0.18); border-radius:8px; } .chapter-body::-webkit-scrollbar-track{ background:transparent; } -.video-box .video-js .vjs-control-bar .vjs-spacer-control{ margin-left:auto;} +.video-js .vjs-control-bar .vjs-spacer-control{ margin-left:auto;} .video-js .vjs-control-bar .settings-item-svg{ display:flex;} -.video-js .vjs-control-bar .settings-item-svg svg{width:auto !important; height: auto !important; transform:inherit !important;} \ No newline at end of file +.video-js .vjs-control-bar .settings-item-svg svg{width:auto !important; height: auto !important; transform:inherit !important;} + +.video-js div.vjs-control{ width:auto;} +.vjs-chapters-button button.vjs-button, +.vjs-subtitles-button button.vjs-button, +.video-js button.vjs-control{ width:48px; height:48px; display:flex; align-items:center; justify-content:center;} +button.vjs-button > .vjs-icon-placeholder:before{ line-height:48px; transition:ease-in-out .5s;} + +.video-js .vjs-volume-panel div.vjs-volume-control { height:100% !important; display:flex; align-items:center; justify-content:center; +margin:0; width:0; transition:ease-in-out .5s !important; opacity:0;} +.video-js .vjs-volume-panel div.vjs-volume-control .vjs-volume-bar { margin:0; top:0;} + +.vjs-settings-button svg{ transition:ease-in-out .3s;} +.vjs-settings-button.settings-clicked svg{ transform:rotate(30deg);} + + +.video-js span.vjs-control-text{ position:absolute !important; bottom: 125%; left: 50%; transform: translateX(-50%); background: rgba(0,0,0,0.75); +color: white; padding: 6px 8px !important; border-radius: 3px; font-size: 13px; white-space: nowrap; opacity: 0; pointer-events: none; +transition: opacity 0.3s ease; z-index: 1000; box-shadow: 0 0 5px rgba(0,0,0,0.3);height: auto !important; width: auto !important; +overflow:visible !important; clip: initial !important;} +.video-js button.vjs-button:hover span.vjs-control-text{ opacity: 1; } + +.video-js .vjs-control:focus:before, +.video-js .vjs-control:hover:before, +.video-js .vjs-control:focus { text-shadow:none !important;} + +.vjs-volume-panel { gap:5px;} +.video-js .vjs-play-progress.vjs-slider-bar + .vjs-time-tooltip{ padding:0;} + +.vjs-chapter-floating-tooltip{ text-align:center; width:160px !important; max-width:100% !important ; height:auto;} +.chapter-image-sprite{width: 166px !important; max-width:100% !important; height: 96px; margin:0 auto 10px; +border-radius: 6px; border: 3px solid #FFF; } +.vjs-chapter-floating-tooltip .chapter-title{ font-size:24px; margin:0 0 10px; font-weight:700; text-overflow:ellipsis; white-space:nowrap; +height:30px; line-height:30px; overflow:hidden;} +.vjs-chapter-floating-tooltip .position-info, +.vjs-chapter-floating-tooltip .chapter-info{ font-size:15px; display:inline-block; margin:0 0 2px; line-height:normal; vertical-align:top; line-height:20px;} + +@media(max-width:1024px){ + body div.custom-settings-overlay {height: calc(100% - 40px); max-height:300px;} +} + +@media (pointer: coarse) { + .video-js .vjs-volume-panel div.vjs-volume-control {width: auto; opacity: 1;} +} + +@media(max-width:767px){ + .vjs-chapters-button button.vjs-button, + .vjs-subtitles-button button.vjs-button, .video-js button.vjs-control {width:32px; height: 32px;} + button.vjs-button > .vjs-icon-placeholder:before { line-height: 32px;} + .vjs-next-video-control svg{width:32px; height: 32px;} + .video-js div.vjs-control {height: 32px;} + .vjs-button > .vjs-icon-placeholder:before { font-size: 1.4em !important;} + .video-js .vjs-subs-active button.vjs-subtitles-button::before {width: 20px;} + .video-js button.vjs-subtitles-button::before { bottom: 2px;} + .video-js div.vjs-control-bar{ padding:0 2px;} + .video-js .vjs-autoplay-toggle { margin-right: 6px !important;} + .video-js .vjs-picture-in-picture-control { margin-left: 6px !important;} + .video-js .vjs-text-track-display { bottom: 8em !important; } + .video-js .vjs-text-track-cue { font-size: 1.1em !important; max-width: 95% !important;} + .video-js .vjs-text-track-cue > div { padding: 6px 10px !important; font-size: 0.9em !important; + background: rgba(0, 0, 0, 0.8) !important;} + .video-js.vjs-fullscreen .vjs-text-track-display { bottom: 10em !important;} + .video-js.vjs-fullscreen .vjs-text-track-cue { font-size: 1.3em !important; max-width: 90% !important;} + .video-js.vjs-fullscreen .vjs-text-track-cue > div { padding: 8px 12px !important; font-size: 0.95em !important;} + .video-js .vjs-subtitles-button button.vjs-button { min-width: 32px !important; min-height: 32px !important; touch-action: manipulation !important; + -webkit-tap-highlight-color: transparent !important; -webkit-touch-callout: none !important; + -webkit-user-select: none !important;user-select: none !important;} + .chapter-body{height: calc(100% - 70px); } + .subtitles-submenu, + .quality-submenu, + .speed-submenu{ height:100%; overflow:auto;} + +} + +@media(max-width:399px){ + .vjs-chapters-button button.vjs-button, + .vjs-subtitles-button button.vjs-button, .video-js button.vjs-control {width:28px; height: 28px;} + button.vjs-button > .vjs-icon-placeholder:before { line-height: 28px;} + .vjs-next-video-control svg{width:28px; height: 28px;} + .video-js div.vjs-control {height: 28px;} + + /* Small mobile spacing for autoplay and picture-in-picture buttons */ + .video-js .vjs-autoplay-toggle { + margin-right: 4px !important; /* Even smaller spacing for small mobile */ + } + + .video-js .vjs-picture-in-picture-control { + margin-left: 4px !important; /* Even smaller spacing for small mobile */ + } + + /* Small mobile subtitle positioning adjustments - prevent overlap with control bar when cursor is in middle */ + .video-js .vjs-text-track-display { + bottom: 7em !important; /* Extra safe margin for small mobile to prevent overlap */ + } + + .video-js .vjs-text-track-cue { + font-size: 1em !important; + max-width: 98% !important; + } + + .video-js .vjs-text-track-cue > div { + padding: 4px 8px !important; + font-size: 0.85em !important; + background: rgba(0, 0, 0, 0.85) !important; /* Even stronger background for small mobile */ + } + + /* Small mobile fullscreen adjustments */ + .video-js.vjs-fullscreen .vjs-text-track-display { + bottom: 9em !important; /* Extra space in small mobile fullscreen */ + } + + .video-js.vjs-fullscreen .vjs-text-track-cue { + font-size: 1.2em !important; + max-width: 95% !important; + } + + .video-js.vjs-fullscreen .vjs-text-track-cue > div { + padding: 6px 10px !important; + font-size: 0.9em !important; + } + + .vjs-button > .vjs-icon-placeholder:before { font-size: 1.4em !important;} +} + +/* Tablet and medium screen adjustments - prevent overlap with control bar */ +@media(min-width: 768px) and (max-width: 1024px) { + .video-js .vjs-text-track-display { + bottom: 7em !important; /* Safe margin for tablet */ + } + + /* Tablet spacing for autoplay and picture-in-picture buttons */ + /* .video-js .vjs-autoplay-toggle { */ + /* margin-right: 10px !important; Larger spacing for tablet */ + /* } */ + + /* .video-js .vjs-picture-in-picture-control { */ + /* margin-left: 10px !important; Larger spacing for tablet */ + /* } */ + + .video-js .vjs-text-track-cue { + font-size: 1.15em !important; + max-width: 88% !important; + } + + .video-js .vjs-text-track-cue > div { + padding: 7px 11px !important; + font-size: 0.95em !important; + } + + /* Tablet fullscreen adjustments */ + .video-js.vjs-fullscreen .vjs-text-track-display { + bottom: 9em !important; + } +} + +/* Large screen adjustments - prevent overlap with control bar */ +@media(min-width: 1025px) { + .video-js .vjs-text-track-display { + bottom: 6em !important; /* Safe margin for large screens */ + } + + /* Desktop spacing for autoplay and picture-in-picture buttons */ + .video-js .vjs-autoplay-toggle { + margin-right: 12px !important; /* Largest spacing for desktop */ + } + + .video-js .vjs-picture-in-picture-control { + margin-left: 12px !important; /* Largest spacing for desktop */ + } + + .video-js .vjs-text-track-cue { + font-size: 1.2em !important; + max-width: 90% !important; + } + + .video-js .vjs-text-track-cue > div { + padding: 8px 12px !important; + font-size: 1em !important; + } + + /* Large screen fullscreen adjustments */ + .video-js.vjs-fullscreen .vjs-text-track-display { + bottom: 8em !important; + } +} \ No newline at end of file diff --git a/frontend-tools/video-js/src/components/chapter/ChapterList.jsx b/frontend-tools/video-js/src/components/chapter/ChapterList.jsx index 4d9ce26b..51d1c2ed 100644 --- a/frontend-tools/video-js/src/components/chapter/ChapterList.jsx +++ b/frontend-tools/video-js/src/components/chapter/ChapterList.jsx @@ -138,7 +138,7 @@ function ChapterList() { diff --git a/frontend-tools/video-js/src/components/controls/AutoplayToggleButton.js b/frontend-tools/video-js/src/components/controls/AutoplayToggleButton.js index 995879d4..a7422c50 100644 --- a/frontend-tools/video-js/src/components/controls/AutoplayToggleButton.js +++ b/frontend-tools/video-js/src/components/controls/AutoplayToggleButton.js @@ -51,50 +51,63 @@ class AutoplayToggleButton extends Button { className: 'vjs-control-text', }); controlTextSpan.textContent = this.isAutoplayEnabled ? 'Autoplay is on' : 'Autoplay is off'; + + console.log('✓ Autoplay button created with initial tooltip:', this.isAutoplayEnabled ? 'Autoplay is on' : 'Autoplay is off'); // Append both spans to button button.appendChild(this.iconSpan); button.appendChild(controlTextSpan); + // Add touch support for mobile tooltips + this.addTouchSupport(button); + return button; } updateIcon() { + // Add transition and start fade-out + this.iconSpan.style.transition = 'opacity 0.1s ease'; + this.iconSpan.style.opacity = '0'; + + // After fade-out complete, update innerHTML and fade back in + setTimeout(() => { if (this.isAutoplayEnabled) { - // Simple text icon for now - this.iconSpan.innerHTML = ` - - - -`; - // Only update element properties if element exists + this.iconSpan.innerHTML = ` + + + + + + `; if (this.el()) { this.el().title = 'Autoplay is on'; this.el().setAttribute('aria-label', 'Autoplay is on'); const controlText = this.el().querySelector('.vjs-control-text'); - if (controlText) { - controlText.textContent = 'Autoplay is on'; - } + if (controlText) controlText.textContent = 'Autoplay is on'; + console.log('✓ Autoplay tooltip updated to: "Autoplay is on"'); } } else { - // Simple text icon for now this.iconSpan.innerHTML = ` - - - - -`; - // Only update element properties if element exists + + + + + + `; if (this.el()) { this.el().title = 'Autoplay is off'; this.el().setAttribute('aria-label', 'Autoplay is off'); const controlText = this.el().querySelector('.vjs-control-text'); - if (controlText) { - controlText.textContent = 'Autoplay is off'; - } + if (controlText) controlText.textContent = 'Autoplay is off'; + console.log('✓ Autoplay tooltip updated to: "Autoplay is off"'); } } - } + + // Fade back in + this.iconSpan.style.opacity = '1'; + }, 100); +} + handleClick() { // Toggle autoplay state @@ -110,6 +123,7 @@ class AutoplayToggleButton extends Button { this.updateIcon(); console.log('Autoplay toggled:', this.isAutoplayEnabled ? 'ON' : 'OFF'); + console.log('✓ Tooltip should now show:', this.isAutoplayEnabled ? 'Autoplay is on' : 'Autoplay is off'); // Trigger custom event for other components to listen to this.player().trigger('autoplayToggle', { autoplay: this.isAutoplayEnabled }); @@ -120,6 +134,46 @@ class AutoplayToggleButton extends Button { this.isAutoplayEnabled = enabled; this.updateIcon(); } + + // Add touch support for mobile tooltips + addTouchSupport(button) { + let touchStartTime = 0; + let touchHandled = false; + + // Touch start + button.addEventListener('touchstart', (e) => { + touchStartTime = Date.now(); + touchHandled = false; + }, { passive: true }); + + // Touch end + button.addEventListener('touchend', (e) => { + const touchDuration = Date.now() - touchStartTime; + + // Only show tooltip for quick taps (not swipes) + if (touchDuration < 500) { + e.preventDefault(); + e.stopPropagation(); + + // Show tooltip + button.classList.add('touch-active'); + touchHandled = true; + + // Hide tooltip after delay + setTimeout(() => { + button.classList.remove('touch-active'); + }, 2000); + } + }, { passive: false }); + + // Click fallback for desktop + button.addEventListener('click', (e) => { + if (!touchHandled) { + // This is a desktop click, tooltip will show on hover + console.log('Desktop click on autoplay button'); + } + }); + } } // Register the component diff --git a/frontend-tools/video-js/src/components/controls/CustomChaptersOverlay.js b/frontend-tools/video-js/src/components/controls/CustomChaptersOverlay.js index 2986bd5f..69826d2d 100644 --- a/frontend-tools/video-js/src/components/controls/CustomChaptersOverlay.js +++ b/frontend-tools/video-js/src/components/controls/CustomChaptersOverlay.js @@ -44,19 +44,20 @@ class CustomChaptersOverlay extends Component { right: 0; width: 100%; height: 100%; - z-index: 1000; + z-index: 9999; display: none; - pointer-events: none; /* allow clicks only on inner panel */ + pointer-events: none; background: rgba(0, 0, 0, 0.35); `; - // Build container const container = document.createElement('div'); container.className = 'video-chapter'; - container.style.pointerEvents = 'auto'; + container.style.cssText = ` + pointer-events: auto; + z-index: 9999999; + `; this.overlay.appendChild(container); - // Create header const header = document.createElement('div'); header.className = 'chapter-head'; container.appendChild(header); @@ -73,7 +74,6 @@ class CustomChaptersOverlay extends Component { `; playlistTitle.appendChild(chapterTitle); - // Create close button const chapterClose = document.createElement('div'); chapterClose.className = 'chapter-close'; const closeBtn = document.createElement('button'); @@ -91,7 +91,6 @@ class CustomChaptersOverlay extends Component { chapterClose.appendChild(closeBtn); playlistTitle.appendChild(chapterClose); - // Create chapters list const body = document.createElement('div'); body.className = 'chapter-body'; container.appendChild(body); @@ -100,7 +99,6 @@ class CustomChaptersOverlay extends Component { body.appendChild(list); this.chaptersList = list; - // Add chapters from data this.chaptersData.forEach((chapter, index) => { const li = document.createElement('li'); const item = document.createElement('div'); @@ -116,7 +114,7 @@ class CustomChaptersOverlay extends Component { const meta = document.createElement('div'); meta.className = 'thumbnail-meta'; - // compute duration + const totalSec = Math.max(0, Math.floor((chapter.endTime || chapter.startTime) - chapter.startTime)); const hh = Math.floor(totalSec / 3600); const mm = Math.floor((totalSec % 3600) / 60); @@ -124,6 +122,7 @@ class CustomChaptersOverlay extends Component { const timeStr = hh > 0 ? `${String(hh).padStart(2, '0')}:${String(mm).padStart(2, '0')}:${String(ss).padStart(2, '0')}` : `${String(mm).padStart(2, '0')}:${String(ss).padStart(2, '0')}`; + const titleEl = document.createElement('h4'); titleEl.textContent = chapter.text; const sub = document.createElement('div'); @@ -145,12 +144,14 @@ class CustomChaptersOverlay extends Component { `; action.appendChild(btn); - // Click to seek - item.onclick = () => { + // Mobile & desktop click/touch + const seekFn = () => { this.player().currentTime(chapter.startTime); this.overlay.style.display = 'none'; this.updateActiveItem(index); }; + item.addEventListener('click', seekFn); + item.addEventListener('touchstart', seekFn); anchor.appendChild(drag); anchor.appendChild(meta); @@ -160,10 +161,8 @@ class CustomChaptersOverlay extends Component { this.chaptersList.appendChild(li); }); - // Add to player playerEl.appendChild(this.overlay); - // Set up time update listener this.player().on('timeupdate', this.updateCurrentChapter); console.log('✓ Custom chapters overlay created'); @@ -172,9 +171,9 @@ class CustomChaptersOverlay extends Component { setupChaptersButton() { const chaptersButton = this.player().getChild('controlBar').getChild('chaptersButton'); if (chaptersButton) { - // Override the click handler - chaptersButton.off('click'); // Remove default handler + chaptersButton.off('click'); chaptersButton.on('click', this.toggleOverlay); + chaptersButton.on('touchstart', this.toggleOverlay); // mobile support } } @@ -182,20 +181,17 @@ class CustomChaptersOverlay extends Component { if (!this.overlay) return; const el = this.player().el(); - if (this.overlay.style.display === 'none' || !this.overlay.style.display) { - this.overlay.style.display = 'block'; - if (el) el.classList.add('chapters-open'); - // hide any open menus - try { - this.player().el().querySelectorAll('.vjs-menu').forEach((m) => { - m.classList.remove('vjs-lock-showing'); - m.style.display = 'none'; - }); - } catch (e) {} - } else { - this.overlay.style.display = 'none'; - if (el) el.classList.remove('chapters-open'); - } + const isHidden = this.overlay.style.display === 'none' || !this.overlay.style.display; + + this.overlay.style.display = isHidden ? 'block' : 'none'; + if (el) el.classList.toggle('chapters-open', isHidden); + + try { + this.player().el().querySelectorAll('.vjs-menu').forEach((m) => { + m.classList.remove('vjs-lock-showing'); + m.style.display = 'none'; + }); + } catch (e) {} } updateCurrentChapter() { diff --git a/frontend-tools/video-js/src/components/controls/CustomSettingsMenu.css b/frontend-tools/video-js/src/components/controls/CustomSettingsMenu.css index 7230fada..677d8a51 100644 --- a/frontend-tools/video-js/src/components/controls/CustomSettingsMenu.css +++ b/frontend-tools/video-js/src/components/controls/CustomSettingsMenu.css @@ -26,12 +26,12 @@ /* Settings overlay styling */ .custom-settings-overlay { - border: 1px solid red; + border: 0; position: absolute; bottom: 60px; right: 20px; - width: 250px; - height: 400px; + width: 280px; + height: 350px; background: rgba(28, 28, 28, 0.95); color: white; border-radius: 7px; @@ -39,36 +39,16 @@ display: none; z-index: 1000; font-size: 14px; - overflow: visible; + overflow: auto; } -/* Settings header */ -.settings-header { - padding: 12px 16px; - border-bottom: 1px solid rgba(255, 255, 255, 0.1); - font-weight: bold; -} - -/* Settings items */ -.settings-item { - padding: 12px 16px; - cursor: pointer; - display: flex; - justify-content: space-between; - align-items: center; - border-bottom: 1px solid rgba(255, 255, 255, 0.1); - transition: background 0.2s ease; -} +.settings-header {padding: 12px 16px; border-bottom: 1px solid rgba(255, 255, 255, 0.1); font-weight: bold;} +.settings-item { padding: 12px 16px; cursor: pointer; display: flex; justify-content: space-between; align-items: center; + border-bottom: 1px solid rgba(255, 255, 255, 0.1); transition: background 0.2s ease; gap:10px;} +.settings-item .settings-left span{ display:flex;} .custom-settings-overlay .settings-left span.vjs-icon-placeholder {transform: inherit !important;} - - -.settings-item:last-child { - border-bottom: none; -} - -.settings-item:hover { - background: rgba(255, 255, 255, 0.05); -} +.settings-item:last-child { border-bottom: none;} +.settings-item:hover { background: rgba(255, 255, 255, 0.05);} /* Speed submenu */ .speed-submenu { @@ -94,6 +74,28 @@ flex-direction: column; } +/* Subtitles submenu styling mirrors speed/quality */ +.subtitles-submenu { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(28, 28, 28, 0.95); + display: none; + flex-direction: column; +} +.subtitle-option { + padding: 12px 16px; + cursor: pointer; + display: flex; + justify-content: space-between; + align-items: center; + transition: background 0.2s ease; +} +.subtitle-option:hover { background: rgba(255,255,255,0.05); } +.subtitle-option.active { background: rgba(255,255,255,0.1); } + /* Submenu header */ .submenu-header { padding: 12px 16px; @@ -101,10 +103,14 @@ display: flex; align-items: center; cursor: pointer; + position: sticky; + top: 0; + background: rgba(28, 28, 28, 0.95); + z-index: 1; } .submenu-header:hover { - background: rgba(255, 255, 255, 0.05); + background: rgba(28, 28, 28, 1); } /* Speed options */ @@ -153,13 +159,13 @@ .settings-right { display: inline-flex; align-items: center; - gap: 8px; + text-align:right; } -.vjs-icon-cog:before { +/* .vjs-icon-cog:before { font-size: 20px !important; position: relative; top: -5px !important; -} +} */ /* HD superscript badge for 1080p */ sup.hd-badge { diff --git a/frontend-tools/video-js/src/components/controls/CustomSettingsMenu.js b/frontend-tools/video-js/src/components/controls/CustomSettingsMenu.js index 53eaf849..9778861c 100644 --- a/frontend-tools/video-js/src/components/controls/CustomSettingsMenu.js +++ b/frontend-tools/video-js/src/components/controls/CustomSettingsMenu.js @@ -14,6 +14,7 @@ class CustomSettingsMenu extends Component { this.settingsOverlay = null; this.speedSubmenu = null; this.qualitySubmenu = null; + this.subtitlesSubmenu = null; this.userPreferences = options?.userPreferences || new UserPreferences(); this.providedQualities = options?.qualities || null; @@ -25,6 +26,9 @@ class CustomSettingsMenu extends Component { this.handleSpeedChange = this.handleSpeedChange.bind(this); this.handleQualityChange = this.handleQualityChange.bind(this); this.getAvailableQualities = this.getAvailableQualities.bind(this); + this.createSubtitlesSubmenu = this.createSubtitlesSubmenu.bind(this); + this.refreshSubtitlesSubmenu = this.refreshSubtitlesSubmenu.bind(this); + this.handleSubtitleChange = this.handleSubtitleChange.bind(this); this.handleClickOutside = this.handleClickOutside.bind(this); // Initialize after player is ready @@ -43,20 +47,75 @@ class CustomSettingsMenu extends Component { // Create settings button this.settingsButton = controlBar.addChild("button", { controlText: "Settings", - className: "vjs-settings-button", + className: "vjs-settings-button settings-clicked", }); // Style the settings button (gear icon) const settingsButtonEl = this.settingsButton.el(); settingsButtonEl.innerHTML = ` - + + Settings `; // Position the settings button at the end of the control bar this.positionButton(); - // Add click handler - this.settingsButton.on("click", this.toggleSettings); + // Add mobile touch handling and unified click handling + const buttonEl = this.settingsButton.el(); + if (buttonEl) { + buttonEl.style.pointerEvents = 'auto'; + buttonEl.style.cursor = 'pointer'; + buttonEl.style.touchAction = 'manipulation'; + buttonEl.style.webkitTapHighlightColor = 'transparent'; + + // Use a more robust approach for mobile touch handling + let touchStartTime = 0; + let touchStartPos = { x: 0, y: 0 }; + let touchHandled = false; + + // Handle touchstart + buttonEl.addEventListener('touchstart', (e) => { + touchStartTime = Date.now(); + touchHandled = false; + const touch = e.touches[0]; + touchStartPos = { x: touch.clientX, y: touch.clientY }; + }, { passive: true }); + + // Handle touchend with proper passive handling + buttonEl.addEventListener('touchend', (e) => { + const touchEndTime = Date.now(); + const touchDuration = touchEndTime - touchStartTime; + + // Only handle if it's a quick tap (not a swipe) + if (touchDuration < 500) { + const touch = e.changedTouches[0]; + const touchEndPos = { x: touch.clientX, y: touch.clientY }; + const distance = Math.sqrt( + Math.pow(touchEndPos.x - touchStartPos.x, 2) + + Math.pow(touchEndPos.y - touchStartPos.y, 2) + ); + + // Only trigger if it's a tap (not a swipe) + if (distance < 50) { + e.preventDefault(); + e.stopPropagation(); + touchHandled = true; + this.toggleSettings(e); + } + } + }, { passive: false }); + + // Handle click events (desktop and mobile fallback) + buttonEl.addEventListener('click', (e) => { + // Only handle click if touch wasn't already handled + if (!touchHandled) { + e.preventDefault(); + e.stopPropagation(); + this.toggleSettings(e); + } + touchHandled = false; // Reset for next interaction + }); + } } createSettingsOverlay() { @@ -70,6 +129,18 @@ class CustomSettingsMenu extends Component { const currentPlaybackRate = this.userPreferences.getPreference("playbackRate"); const currentQuality = this.userPreferences.getPreference("quality"); + // Find current subtitle selection for label + let currentSubtitleLabel = "Off"; + try { + const tt = this.player().textTracks(); + for (let i = 0; i < tt.length; i++) { + const t = tt[i]; + if (t.kind === "subtitles" && t.mode === "showing") { + currentSubtitleLabel = t.label || t.language || "Subtitles"; + break; + } + } + } catch (e) {} // Format playback rate for display const playbackRateLabel = @@ -109,6 +180,18 @@ class CustomSettingsMenu extends Component { + +
+ + + + + Subtitles + + ${currentSubtitleLabel} + + +
`; // Create speed submenu @@ -117,8 +200,11 @@ class CustomSettingsMenu extends Component { // Create quality submenu this.createQualitySubmenu(qualities, activeQuality?.value); + // Create subtitles submenu (YouTube-like) + this.createSubtitlesSubmenu(); + // Add to control bar - controlBar.el().appendChild(this.settingsOverlay); + this.player().el().appendChild(this.settingsOverlay); } createSpeedSubmenu() { @@ -185,6 +271,138 @@ class CustomSettingsMenu extends Component { this.settingsOverlay.appendChild(this.qualitySubmenu); } + createSubtitlesSubmenu() { + this.subtitlesSubmenu = document.createElement("div"); + this.subtitlesSubmenu.className = "subtitles-submenu"; + + // Header + const header = ` + + `; + + this.subtitlesSubmenu.innerHTML = header + ''; + this.settingsOverlay.appendChild(this.subtitlesSubmenu); + + // Populate now and on demand + this.refreshSubtitlesSubmenu(); + } + + refreshSubtitlesSubmenu() { + if (!this.subtitlesSubmenu) return; + const body = this.subtitlesSubmenu.querySelector('.submenu-body'); + if (!body) return; + const player = this.player(); + const tracks = player.textTracks(); + + // Determine active + let activeLang = null; + for (let i = 0; i < tracks.length; i++) { + const t = tracks[i]; + if (t.kind === 'subtitles' && t.mode === 'showing') { + activeLang = t.language; + break; + } + } + + // Build items: Off + languages + const items = []; + items.push({ label: 'Off', lang: null }); + for (let i = 0; i < tracks.length; i++) { + const t = tracks[i]; + if (t.kind === 'subtitles') { + items.push({ label: t.label || t.language || `Track ${i}`, lang: t.language, track: t }); + } + } + + body.innerHTML = items.map((it) => ` +
+ ${it.label} + ${it.lang === activeLang ? '' : ''} +
+ `).join(''); + + // Also update the current subtitle display in main settings + this.updateCurrentSubtitleDisplay(); + } + + updateCurrentSubtitleDisplay() { + try { + const player = this.player(); + const tracks = player.textTracks(); + let currentSubtitleLabel = "Off"; + let activeTrack = null; + + // Find the active subtitle track + for (let i = 0; i < tracks.length; i++) { + const t = tracks[i]; + if (t.kind === 'subtitles' && t.mode === 'showing') { + currentSubtitleLabel = t.label || t.language || "Subtitles"; + activeTrack = t; + break; + } + } + + const currentSubtitlesDisplay = this.settingsOverlay.querySelector('.current-subtitles'); + if (currentSubtitlesDisplay) { + const oldValue = currentSubtitlesDisplay.textContent; + currentSubtitlesDisplay.textContent = currentSubtitleLabel; + + // Only log if the value actually changed + if (oldValue !== currentSubtitleLabel) { + console.log(`Updated current subtitle display: "${oldValue}" → "${currentSubtitleLabel}"`); + if (activeTrack) { + console.log(`Active track details: language="${activeTrack.language}", label="${activeTrack.label}", mode="${activeTrack.mode}"`); + } + } + } else { + console.warn('Could not find .current-subtitles element in settings overlay'); + } + } catch (error) { + console.error('Error updating current subtitle display:', error); + } + } + + // Method to periodically check and update subtitle display + startSubtitleSync() { + // Update immediately + this.updateCurrentSubtitleDisplay(); + + // Listen for real-time subtitle changes + this.player().on('texttrackchange', () => { + console.log('Text track changed - updating subtitle display'); + this.updateCurrentSubtitleDisplay(); + // Also refresh the subtitle submenu to show correct selection + this.refreshSubtitlesSubmenu(); + }); + + // Set up periodic updates every 2 seconds as backup + this.subtitleSyncInterval = setInterval(() => { + this.updateCurrentSubtitleDisplay(); + }, 2000); + } + + // Method to stop subtitle sync + stopSubtitleSync() { + if (this.subtitleSyncInterval) { + clearInterval(this.subtitleSyncInterval); + this.subtitleSyncInterval = null; + } + } + + // Cleanup method + dispose() { + this.stopSubtitleSync(); + // Remove event listeners + document.removeEventListener("click", this.handleClickOutside); + // Remove text track change listener + if (this.player()) { + this.player().off('texttrackchange'); + } + } + getAvailableQualities() { // Priority: provided options -> MEDIA_DATA JSON -> player sources -> default const desiredOrder = [ @@ -325,21 +543,70 @@ class CustomSettingsMenu extends Component { this.qualitySubmenu.style.display = "flex"; this.speedSubmenu.style.display = "none"; } + + if (e.target.closest('[data-setting="subtitles"]')) { + this.refreshSubtitlesSubmenu(); + this.subtitlesSubmenu.style.display = "flex"; + this.speedSubmenu.style.display = "none"; + this.qualitySubmenu.style.display = "none"; + } }); - // Speed submenu header (back button) - this.speedSubmenu - .querySelector(".submenu-header") - .addEventListener("click", () => { + // Mobile touch events for settings items + this.settingsOverlay.addEventListener("touchend", (e) => { + e.preventDefault(); + e.stopPropagation(); + + if (e.target.closest('[data-setting="playback-speed"]')) { + this.speedSubmenu.style.display = "flex"; + this.qualitySubmenu.style.display = "none"; + } + + if (e.target.closest('[data-setting="quality"]')) { + this.qualitySubmenu.style.display = "flex"; this.speedSubmenu.style.display = "none"; - }); + } + + if (e.target.closest('[data-setting="subtitles"]')) { + this.refreshSubtitlesSubmenu(); + this.subtitlesSubmenu.style.display = "flex"; + this.speedSubmenu.style.display = "none"; + this.qualitySubmenu.style.display = "none"; + } + }, { passive: false }); + + // Speed submenu header (back button) + const speedHeader = this.speedSubmenu.querySelector(".submenu-header"); + speedHeader.addEventListener("click", () => { + this.speedSubmenu.style.display = "none"; + }); + speedHeader.addEventListener("touchend", (e) => { + e.preventDefault(); + e.stopPropagation(); + this.speedSubmenu.style.display = "none"; + }, { passive: false }); // Quality submenu header (back button) - this.qualitySubmenu - .querySelector(".submenu-header") - .addEventListener("click", () => { - this.qualitySubmenu.style.display = "none"; - }); + const qualityHeader = this.qualitySubmenu.querySelector(".submenu-header"); + qualityHeader.addEventListener("click", () => { + this.qualitySubmenu.style.display = "none"; + }); + qualityHeader.addEventListener("touchend", (e) => { + e.preventDefault(); + e.stopPropagation(); + this.qualitySubmenu.style.display = "none"; + }, { passive: false }); + + // Subtitles submenu header (back) + const subtitlesHeader = this.subtitlesSubmenu.querySelector(".submenu-header"); + subtitlesHeader.addEventListener("click", () => { + this.subtitlesSubmenu.style.display = "none"; + }); + subtitlesHeader.addEventListener("touchend", (e) => { + e.preventDefault(); + e.stopPropagation(); + this.subtitlesSubmenu.style.display = "none"; + }, { passive: false }); // Speed option clicks this.speedSubmenu.addEventListener("click", (e) => { @@ -350,6 +617,17 @@ class CustomSettingsMenu extends Component { } }); + // Mobile touch events for speed options + this.speedSubmenu.addEventListener("touchend", (e) => { + e.preventDefault(); + e.stopPropagation(); + const speedOption = e.target.closest(".speed-option"); + if (speedOption) { + const speed = parseFloat(speedOption.dataset.speed); + this.handleSpeedChange(speed, speedOption); + } + }, { passive: false }); + // Quality option clicks this.qualitySubmenu.addEventListener("click", (e) => { const qualityOption = e.target.closest(".quality-option"); @@ -359,6 +637,37 @@ class CustomSettingsMenu extends Component { } }); + // Mobile touch events for quality options + this.qualitySubmenu.addEventListener("touchend", (e) => { + e.preventDefault(); + e.stopPropagation(); + const qualityOption = e.target.closest(".quality-option"); + if (qualityOption) { + const value = qualityOption.dataset.quality; + this.handleQualityChange(value, qualityOption); + } + }, { passive: false }); + + // Subtitle option clicks + this.subtitlesSubmenu.addEventListener('click', (e) => { + const opt = e.target.closest('.subtitle-option'); + if (opt) { + const lang = opt.dataset.lang || null; + this.handleSubtitleChange(lang, opt); + } + }); + + // Mobile touch events for subtitle options + this.subtitlesSubmenu.addEventListener('touchend', (e) => { + e.preventDefault(); + e.stopPropagation(); + const opt = e.target.closest('.subtitle-option'); + if (opt) { + const lang = opt.dataset.lang || null; + this.handleSubtitleChange(lang, opt); + } + }, { passive: false }); + // Close menu when clicking outside document.addEventListener("click", this.handleClickOutside); @@ -376,14 +685,33 @@ class CustomSettingsMenu extends Component { item.style.background = "transparent"; } }); + + // Start subtitle synchronization + this.startSubtitleSync(); } toggleSettings(e) { e.stopPropagation(); - const isVisible = this.settingsOverlay.style.display === "block"; - this.settingsOverlay.style.display = isVisible ? "none" : "block"; + const isVisible = this.settingsOverlay.classList.contains("show"); + + if (isVisible) { + this.settingsOverlay.classList.remove("show"); + this.settingsOverlay.style.display = "none"; + } else { + this.settingsOverlay.classList.add("show"); + this.settingsOverlay.style.display = "block"; + } + this.speedSubmenu.style.display = "none"; // Hide submenu when main menu toggles if (this.qualitySubmenu) this.qualitySubmenu.style.display = "none"; + const btnEl = this.settingsButton?.el(); + if (btnEl) { + if (!isVisible) { + btnEl.classList.add("settings-clicked"); + } else { + btnEl.classList.remove("settings-clicked"); + } + } } handleSpeedChange(speed, speedOption) { @@ -466,11 +794,15 @@ class CustomSettingsMenu extends Component { } } - console.log("Switching quality to", selected.label, selected.src); player.addClass("vjs-changing-resolution"); + player.isChangingQuality = true; // Flag to prevent seek indicator during quality change player.src({ src: selected.src, type: selected.type || "video/mp4" }); + if (wasPaused) { + player.pause(); + } + const onLoaded = () => { // Restore time, rate, subtitles try { @@ -479,8 +811,11 @@ class CustomSettingsMenu extends Component { try { if (!isNaN(currentTime)) player.currentTime(currentTime); } catch (e) {} + // Play or pause based on previous state if (!wasPaused) { player.play().catch(() => {}); + } else { + player.pause(); } // Restore subtitles @@ -525,13 +860,47 @@ class CustomSettingsMenu extends Component { player.on("loadedmetadata", onLoaded); } - // Close overlay to avoid covering the CC button + // Close only the quality submenu (keep overlay open) if (this.qualitySubmenu) this.qualitySubmenu.style.display = "none"; - this.settingsOverlay.style.display = "none"; console.log("Quality preference saved:", value); } + handleSubtitleChange(lang, optionEl) { + const player = this.player(); + const tracks = player.textTracks(); + + // Update tracks + for (let i = 0; i < tracks.length; i++) { + const t = tracks[i]; + if (t.kind === 'subtitles') { + t.mode = lang && t.language === lang ? 'showing' : 'disabled'; + } + } + + // Save preference via UserPreferences (force set) + this.userPreferences.setPreference('subtitleLanguage', lang || null, true); + + // Update UI selection + this.subtitlesSubmenu.querySelectorAll('.subtitle-option').forEach((opt) => { + opt.classList.remove('active'); + opt.style.background = 'transparent'; + const check = opt.querySelector('.checkmark'); + if (check) check.remove(); + }); + optionEl.classList.add('active'); + optionEl.style.background = 'rgba(255, 255, 255, 0.1)'; + optionEl.insertAdjacentHTML('beforeend', ''); + + // Update label in main settings + const label = lang ? (optionEl.querySelector('span')?.textContent || lang) : 'Off'; + const currentSubtitlesDisplay = this.settingsOverlay.querySelector('.current-subtitles'); + if (currentSubtitlesDisplay) currentSubtitlesDisplay.textContent = label; + + // Close only the subtitles submenu (keep overlay open) + this.subtitlesSubmenu.style.display = 'none'; + } + handleClickOutside(e) { if ( this.settingsOverlay && @@ -539,9 +908,14 @@ class CustomSettingsMenu extends Component { !this.settingsOverlay.contains(e.target) && !this.settingsButton.el().contains(e.target) ) { + this.settingsOverlay.classList.remove("show"); this.settingsOverlay.style.display = "none"; this.speedSubmenu.style.display = "none"; if (this.qualitySubmenu) this.qualitySubmenu.style.display = "none"; + const btnEl = this.settingsButton?.el(); + if (btnEl) { + btnEl.classList.remove("settings-clicked"); + } } } diff --git a/frontend-tools/video-js/src/components/controls/NextVideoButton.js b/frontend-tools/video-js/src/components/controls/NextVideoButton.js index 5968039d..f83b9e0e 100644 --- a/frontend-tools/video-js/src/components/controls/NextVideoButton.js +++ b/frontend-tools/video-js/src/components/controls/NextVideoButton.js @@ -24,9 +24,10 @@ class NextVideoButton extends Button { // Create SVG that matches Video.js icon dimensions iconSpan.innerHTML = ` - - + + + `; // Create control text span diff --git a/frontend-tools/video-js/src/components/controls/SeekIndicator.js b/frontend-tools/video-js/src/components/controls/SeekIndicator.js index 2ea64454..fd1ab748 100644 --- a/frontend-tools/video-js/src/components/controls/SeekIndicator.js +++ b/frontend-tools/video-js/src/components/controls/SeekIndicator.js @@ -33,8 +33,8 @@ class SeekIndicator extends Component { /** * Show seek indicator with direction and amount - * @param {string} direction - 'forward' or 'backward' - * @param {number} seconds - Number of seconds to seek + * @param {string} direction - 'forward', 'backward', 'play', or 'pause' + * @param {number} seconds - Number of seconds to seek (only used for forward/backward) */ show(direction, seconds = this.seekAmount) { const el = this.el(); @@ -84,17 +84,17 @@ class SeekIndicator extends Component { `; - } else { + } else if (direction === 'backward') { iconEl.innerHTML = `
+
+ + + +
+
+ `; + textEl.textContent = 'Play'; + } else if (direction === 'pause') { + iconEl.innerHTML = ` +
+
+ + + +
+
+ `; + textEl.textContent = 'Pause'; } // Clear any text content in the text element diff --git a/frontend-tools/video-js/src/components/markers/ChapterMarkers.js b/frontend-tools/video-js/src/components/markers/ChapterMarkers.js index 2d090d7c..66ab1898 100644 --- a/frontend-tools/video-js/src/components/markers/ChapterMarkers.js +++ b/frontend-tools/video-js/src/components/markers/ChapterMarkers.js @@ -90,73 +90,56 @@ class ChapterMarkers extends Component { // Style the floating tooltip Object.assign(this.tooltip.style, { - position: 'absolute', - background: 'rgba(0, 0, 0, 0.9)', - color: 'white', - padding: '8px 12px', - borderRadius: '6px', - fontSize: '12px', - whiteSpace: 'nowrap', - pointerEvents: 'none', + position: 'absolute', zIndex: '1000', bottom: '45px', transform: 'translateX(-50%)', display: 'none', - minWidth: '200px', - maxWidth: '280px', - width: 'auto', - textAlign: 'center', - border: '1px solid rgba(255, 255, 255, 0.2)', - boxShadow: '0 2px 8px rgba(0, 0, 0, 0.3)', + minWidth: '160px', + maxWidth: '200px', + width: 'auto', }); // Create stable DOM structure to avoid trembling this.chapterTitle = videojs.dom.createEl('div', { className: 'chapter-title', }); - Object.assign(this.chapterTitle.style, { - fontWeight: 'bold', - marginBottom: '4px', - color: '#fff', - }); + // Object.assign(this.chapterTitle.style, { + // fontWeight: 'bold', + // marginBottom: '4px', + // color: '#fff', + // }); this.chapterInfo = videojs.dom.createEl('div', { className: 'chapter-info', }); - Object.assign(this.chapterInfo.style, { - fontSize: '11px', - opacity: '0.8', - marginBottom: '2px', - }); + // Object.assign(this.chapterInfo.style, { + // fontSize: '11px', + // opacity: '0.8', + // marginBottom: '2px', + // }); this.positionInfo = videojs.dom.createEl('div', { className: 'position-info', }); - Object.assign(this.positionInfo.style, { - fontSize: '10px', - opacity: '0.6', - }); + // Object.assign(this.positionInfo.style, { + // fontSize: '10px', + // opacity: '0.6', + // }); this.chapterImage = videojs.dom.createEl('div', { className: 'chapter-image-sprite', }); - Object.assign(this.chapterImage.style, { - width: '160px', - height: '90px', - marginTop: '8px', - borderRadius: '4px', - border: '1px solid rgba(255,255,255,0.1)', + Object.assign(this.chapterImage.style, { display: 'block', - overflow: 'hidden', - backgroundRepeat: 'no-repeat', - backgroundSize: 'auto', + overflow: 'hidden', }); // Append all elements to tooltip this.tooltip.appendChild(this.chapterTitle); + this.tooltip.appendChild(this.chapterImage); this.tooltip.appendChild(this.chapterInfo); this.tooltip.appendChild(this.positionInfo); - this.tooltip.appendChild(this.chapterImage); } // Add tooltip to seekBar if not already added diff --git a/frontend-tools/video-js/src/components/overlays/AutoplayCountdownOverlay.css b/frontend-tools/video-js/src/components/overlays/AutoplayCountdownOverlay.css index 2f47063b..26038eaa 100644 --- a/frontend-tools/video-js/src/components/overlays/AutoplayCountdownOverlay.css +++ b/frontend-tools/video-js/src/components/overlays/AutoplayCountdownOverlay.css @@ -10,7 +10,7 @@ flex-direction: column; justify-content: center; align-items: center; - z-index: 1000; + z-index: 100000; padding: 20px; box-sizing: border-box; backdrop-filter: blur(4px); @@ -23,62 +23,104 @@ } .autoplay-countdown-content { - background: rgba(0, 0, 0, 0.9); - border-radius: 12px; - padding: 24px; - max-width: 400px; + background: linear-gradient(135deg, rgba(0, 0, 0, 0.95), rgba(20, 20, 20, 0.9)); + border-radius: 20px; + padding: 50px; + max-width: 480px; width: 100%; text-align: center; - box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3); - border: 1px solid rgba(255, 255, 255, 0.1); + box-shadow: + 0 20px 60px rgba(0, 0, 0, 0.4), + 0 8px 32px rgba(0, 0, 0, 0.2), + inset 0 1px 0 rgba(255, 255, 255, 0.1); + border: 1px solid rgba(255, 255, 255, 0.15); + backdrop-filter: blur(20px); + position: relative; + overflow: hidden; +} + +.autoplay-countdown-content::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + height: 1px; + background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent); +} + +.autoplay-countdown-content::after { + content: ''; + position: absolute; + top: -50%; + left: -50%; + width: 200%; + height: 200%; + background: radial-gradient(circle, rgba(255, 0, 0, 0.05) 0%, transparent 70%); + animation: backgroundPulse 4s ease-in-out infinite; + pointer-events: none; +} + +@keyframes backgroundPulse { + 0%, 100% { + opacity: 0.3; + transform: scale(1); + } + 50% { + opacity: 0.6; + transform: scale(1.1); + } } .autoplay-countdown-header { - margin-bottom: 20px; + position: relative; + z-index: 2; } .autoplay-countdown-header h3 { color: #fff; - font-size: 18px; - font-weight: 500; - margin: 0; - line-height: 1.4; + font-size: 26px; + font-weight: 400; + margin: 0 0 10px 0; + line-height: 1.3; + text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); +} +.autoplay-countdown-header h3 span{ + font-weight:700; } -.countdown-timer { - color: #ff4444; - font-weight: 700; - font-size: 20px; - animation: countdownPulse 1s infinite; -} - -@keyframes countdownPulse { - 0%, - 100% { - transform: scale(1); - opacity: 1; - } - 50% { - transform: scale(1.1); - opacity: 0.8; - } -} .autoplay-countdown-video-info { display: flex; + flex-direction: column; align-items: center; - gap: 12px; - margin-bottom: 24px; - text-align: left; + gap: 20px; + text-align: center; + position: relative; + z-index: 2; + margin:0 0 50px; } .next-video-thumbnail { flex-shrink: 0; - width: 80px; - height: 45px; - border-radius: 6px; + width: 180px; + height: 101px; + border-radius: 12px; overflow: hidden; background: #333; + position: relative; + box-shadow: + 0 12px 32px rgba(0, 0, 0, 0.4), + 0 4px 16px rgba(0, 0, 0, 0.2); + border: 2px solid rgba(255, 255, 255, 0.1); + transition: transform 0.3s ease, box-shadow 0.3s ease; +} + +.next-video-thumbnail:hover { + transform: translateY(-4px) scale(1.02); + box-shadow: + 0 16px 40px rgba(0, 0, 0, 0.5), + 0 8px 24px rgba(0, 0, 0, 0.3); } .next-video-thumbnail img { @@ -88,102 +130,250 @@ display: block; } +.play-overlay { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + background: rgba(0, 0, 0, 0.8); + border-radius: 50%; + width: 64px; + height: 64px; + display: flex; + align-items: center; + justify-content: center; + color: white; + transition: all 0.3s ease; + box-shadow: + 0 8px 24px rgba(0, 0, 0, 0.5), + 0 4px 16px rgba(0, 0, 0, 0.3); + border: 3px solid rgba(255, 255, 255, 0.2); + backdrop-filter: blur(8px); +} + +.play-overlay:hover { + background: rgba(0, 0, 0, 0.9); + transform: translate(-50%, -50%) scale(1.1); + box-shadow: + 0 12px 32px rgba(0, 0, 0, 0.6), + 0 6px 20px rgba(0, 0, 0, 0.4); +} + +.play-overlay svg { + margin-left: 4px; + width: 28px; + height: 28px; +} + .next-video-details { flex-grow: 1; - min-width: 0; /* Allow text truncation */ + min-width: 0; + text-align: center; } .next-video-title { - color: #fff; - font-size: 14px; - font-weight: 600; - margin: 0 0 4px 0; - line-height: 1.3; + color: #999; + font-size:18px; + font-weight:500; + margin: 0 0; + line-height: 1.4; overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; + text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); + letter-spacing: 0.5px; } .next-video-author { - color: #aaa; - font-size: 12px; - margin: 0 0 2px 0; - line-height: 1.2; + color: #bbb; + font-size: 16px; + margin: 0 0 8px 0; + line-height: 1.3; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; + font-weight: 500; } .next-video-duration { - color: #ccc; - font-size: 11px; + color: #999; + font-size: 14px; margin: 0; line-height: 1.2; + font-weight: 500; } .autoplay-countdown-actions { display: flex; - gap: 12px; + gap: 24px; justify-content: center; align-items: center; + position: relative; + z-index: 2; + padding: 0; + margin-top: 8px; } -.autoplay-play-button, -.autoplay-cancel-button { +button.autoplay-play-button, +button.autoplay-cancel-button { display: flex; align-items: center; justify-content: center; - gap: 6px; - padding: 10px 18px; + gap: 8px; + padding: 10px 20px; border: none; - border-radius: 6px; - font-size: 14px; - font-weight: 500; + border-radius: 8px; + font-size: 13px; + font-weight: 600; cursor: pointer; - transition: all 0.2s ease; - min-width: 100px; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + min-width: 140px; + height: 48px; + position: relative; + overflow: hidden; + text-transform: uppercase; + letter-spacing: 0.3px; + line-height: 1; + white-space: nowrap; + box-shadow: 0 6px 20px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.1); + text-align: center; } -.autoplay-play-button { - background: #ff0000; +button.autoplay-play-button { + background: linear-gradient(135deg, #ff0000, #e60000); color: #fff; + border: 1px solid rgba(255, 255, 255, 0.1); +} + +.autoplay-play-button::before { + content: ''; + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 100%; + background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); + transition: left 0.5s ease; } .autoplay-play-button:hover { - background: #e60000; - transform: translateY(-1px); + background: linear-gradient(135deg, #ff1a1a, #cc0000); + transform: translateY(-2px); + box-shadow: 0 8px 25px rgba(255, 0, 0, 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.3); +} + +.autoplay-play-button:hover::before { + left: 100%; } .autoplay-play-button:active { - transform: translateY(0); + transform: translateY(-1px); + box-shadow: + 0 4px 15px rgba(255, 0, 0, 0.3), + inset 0 1px 0 rgba(255, 255, 255, 0.2); } .autoplay-cancel-button { - background: rgba(255, 255, 255, 0.1); + background: linear-gradient(135deg, #404040, #2a2a2a); color: #fff; - border: 1px solid rgba(255, 255, 255, 0.2); + border: 1px solid rgba(255, 255, 255, 0.1); + box-shadow: + 0 6px 20px rgba(0, 0, 0, 0.3), + inset 0 1px 0 rgba(255, 255, 255, 0.1); } .autoplay-cancel-button:hover { - background: rgba(255, 255, 255, 0.2); - border-color: rgba(255, 255, 255, 0.3); + background: linear-gradient(135deg, #505050, #3a3a3a); + transform: translateY(-2px); + box-shadow: + 0 8px 25px rgba(0, 0, 0, 0.4), + inset 0 1px 0 rgba(255, 255, 255, 0.2); } .autoplay-cancel-button:active { - background: rgba(255, 255, 255, 0.1); + transform: translateY(-1px); + box-shadow: + 0 4px 15px rgba(0, 0, 0, 0.3), + inset 0 1px 0 rgba(255, 255, 255, 0.1); } + .autoplay-play-button svg, .autoplay-cancel-button svg { - width: 1.2em; - height: 1.2em; + width: 18px; + height: 18px; flex-shrink: 0; + filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.3)); + transition: transform 0.3s ease; + position: relative; + z-index: 1; + display: block; + margin: 0; + padding: 0; + vertical-align: middle; +} + +.autoplay-play-button:hover svg { + transform: scale(1.05); + filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.4)); +} + +.autoplay-cancel-button svg { + width: 16px; + height: 16px; +} + +.autoplay-cancel-button:hover svg { + transform: scale(1.05) rotate(90deg); + filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.4)); +} + +.autoplay-play-button span, +.autoplay-cancel-button span { + display: inline-block; + vertical-align: middle; + line-height: 1; + font-size: inherit; + font-weight: inherit; + letter-spacing: inherit; + text-transform: inherit; + position: relative; + z-index: 1; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 100%; + margin: 0; + padding: 0; + height: auto; + align-self: center; +} + +/* Ensure perfect alignment of button content */ +.autoplay-play-button > *, +.autoplay-cancel-button > * { + vertical-align: middle; + display: inline-block; +} + +/* Fix any baseline alignment issues */ +.autoplay-play-button, +.autoplay-cancel-button { + align-items: center; + justify-content: center; +} + +/* Ensure text and icons are perfectly aligned */ +.autoplay-play-button svg, +.autoplay-cancel-button svg { + vertical-align: middle; + display: inline-block; } /* Autoplay Toggle Button Styles */ -.vjs-autoplay-toggle { +/* .vjs-autoplay-toggle { width: 3em !important; height: 3em !important; flex: none; @@ -191,16 +381,16 @@ margin: 0 4px !important; line-height: 3em !important; position: relative; -} +} */ -.vjs-autoplay-toggle .vjs-autoplay-icon { +/* .vjs-autoplay-toggle .vjs-autoplay-icon { width: 1.2em; height: 1.2em; display: flex; align-items: center; justify-content: center; margin: auto; -} +} */ .vjs-autoplay-toggle .vjs-autoplay-icon svg { width: 100%; @@ -209,40 +399,135 @@ } /* Responsive design */ -@media (max-width: 480px) { +@media (max-width: 767px) { + .autoplay-countdown-video-info { + margin-bottom:20px; + } .autoplay-countdown-content { - padding: 20px; - max-width: 320px; + padding: 24px; + max-width: 400px; } .autoplay-countdown-header h3 { - font-size: 16px; - } - - .countdown-timer { - font-size: 18px; - } - - .autoplay-countdown-video-info { - gap: 10px; + font-size: 20px; } .next-video-thumbnail { - width: 60px; - height: 34px; + width: 140px; + height: 78px; + } + + .play-overlay { + width: 48px; + height: 48px; + } + + .play-overlay svg { + width: 20px; + height: 20px; } .next-video-title { - font-size: 13px; + font-size: 18px; } - .autoplay-countdown-actions { - flex-direction: column; - gap: 8px; + .next-video-author { + font-size: 14px; } .autoplay-play-button, .autoplay-cancel-button { - width: 100%; + padding: 12px 24px; + font-size: 14px; + min-width: 120px; + height: 44px; + gap: 6px; + align-items: center; + justify-content: center; + } + + .autoplay-play-button svg { + width: 16px; + height: 16px; + vertical-align: middle; + } + + .autoplay-cancel-button svg { + width: 14px; + height: 14px; + vertical-align: middle; + } +} + +@media (max-width: 480px) { + .autoplay-countdown-content { + padding: 20px; + max-width: 350px; + } + + .autoplay-countdown-header h3 { + font-size: 18px; + } + + .countdown-timer { + font-size: 24px; + padding: 10px 16px; + } + + .autoplay-countdown-video-info { + gap: 16px; + } + + .next-video-thumbnail { + width: 120px; + height: 68px; + } + + .play-overlay { + width: 40px; + height: 40px; + } + + .play-overlay svg { + width: 16px; + height: 16px; + } + + .next-video-title { + font-size: 16px; + } + + .next-video-author { + font-size: 13px; + } + + .autoplay-countdown-actions { + gap: 5px; + padding: 0; + } + button.autoplay-play-button, button.autoplay-cancel-button { padding:10px 20px; width:120px; height:40px; min-width:120px; } + + .autoplay-play-button, + .autoplay-cancel-button { + width: 100%; + min-width: 100%; + height: 46px; + gap: 6px; + padding: 10px 20px; + font-size: 13px; + align-items: center; + justify-content: center; + } + + .autoplay-play-button svg { + width: 14px; + height: 14px; + vertical-align: middle; + } + + .autoplay-cancel-button svg { + width: 12px; + height: 12px; + vertical-align: middle; } } diff --git a/frontend-tools/video-js/src/components/overlays/AutoplayCountdownOverlay.js b/frontend-tools/video-js/src/components/overlays/AutoplayCountdownOverlay.js index 8f652dd8..67337829 100644 --- a/frontend-tools/video-js/src/components/overlays/AutoplayCountdownOverlay.js +++ b/frontend-tools/video-js/src/components/overlays/AutoplayCountdownOverlay.js @@ -45,6 +45,11 @@ class AutoplayCountdownOverlay extends Component { nextVideoThumbnail ? `
${nextVideoTitle} +
+ + + +
` : '' } @@ -199,6 +204,11 @@ class AutoplayCountdownOverlay extends Component { nextVideoThumbnail ? `
${nextVideoTitle} +
+ + + +
` : '' } diff --git a/frontend-tools/video-js/src/components/overlays/EndScreenOverlay.js b/frontend-tools/video-js/src/components/overlays/EndScreenOverlay.js index 9654c67f..1c083296 100644 --- a/frontend-tools/video-js/src/components/overlays/EndScreenOverlay.js +++ b/frontend-tools/video-js/src/components/overlays/EndScreenOverlay.js @@ -26,10 +26,9 @@ class EndScreenOverlay extends Component { // Get relatedVideos from options since createEl is called during super() const relatedVideos = this.options_ && this.options_._relatedVideos ? this.options_._relatedVideos : []; - // Limit items based on screen size - const isMobile = window.innerWidth <= 768; - const maxItems = isMobile ? 6 : 12; - const videosToShow = relatedVideos.slice(0, maxItems); + // Limit videos based on screen size to fit grid properly + const maxVideos = this.getMaxVideosForScreen(); + const videosToShow = relatedVideos.slice(0, maxVideos); // console.log( // 'Creating end screen with', @@ -41,6 +40,12 @@ class EndScreenOverlay extends Component { className: 'vjs-end-screen-overlay', }); + // Create title + const title = videojs.dom.createEl('div', { + className: 'vjs-related-videos-title', + }); + title.textContent = 'More Videos'; + // Create grid container const grid = videojs.dom.createEl('div', { className: 'vjs-related-videos-grid', @@ -53,16 +58,15 @@ class EndScreenOverlay extends Component { grid.appendChild(videoItem); }); } else { - // Fallback message if no related videos - const noVideos = videojs.dom.createEl('div', { - className: 'vjs-no-related-videos', + // Create sample videos for testing if no related videos provided + const sampleVideos = this.createSampleVideos(); + sampleVideos.slice(0, this.getMaxVideosForScreen()).forEach((video) => { + const videoItem = this.createVideoItem(video); + grid.appendChild(videoItem); }); - noVideos.textContent = 'No related videos available'; - noVideos.style.color = 'white'; - noVideos.style.textAlign = 'center'; - grid.appendChild(noVideos); } + overlay.appendChild(title); overlay.appendChild(grid); return overlay; @@ -73,10 +77,18 @@ class EndScreenOverlay extends Component { className: 'vjs-related-video-item', }); + // Use real YouTube thumbnail or fallback to placeholder + const thumbnailSrc = video.thumbnail || this.getPlaceholderImage(video.title); + const thumbnail = videojs.dom.createEl('img', { className: 'vjs-related-video-thumbnail', - src: video.thumbnail, + src: thumbnailSrc, alt: video.title, + loading: 'lazy', // Lazy load for better performance + onerror: () => { + // Fallback to placeholder if image fails to load + thumbnail.src = this.getPlaceholderImage(video.title); + } }); const overlay = videojs.dom.createEl('div', { @@ -142,6 +154,166 @@ class EndScreenOverlay extends Component { return item; } + getPlaceholderImage(title) { + // Generate a placeholder image using a service or create a data URL + // For now, we'll use a simple colored placeholder based on the title + const colors = [ + '#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4', '#FFEAA7', + '#DDA0DD', '#98D8C8', '#F7DC6F', '#BB8FCE', '#85C1E9' + ]; + + // Use title hash to consistently assign colors + let hash = 0; + for (let i = 0; i < title.length; i++) { + hash = title.charCodeAt(i) + ((hash << 5) - hash); + } + const colorIndex = Math.abs(hash) % colors.length; + const color = colors[colorIndex]; + + // Create a simple placeholder with the first letter of the title + const firstLetter = title.charAt(0).toUpperCase(); + + // Create a data URL for a simple placeholder image + const canvas = document.createElement('canvas'); + canvas.width = 320; + canvas.height = 180; + const ctx = canvas.getContext('2d'); + + // Background + ctx.fillStyle = color; + ctx.fillRect(0, 0, 320, 180); + + // Add a subtle pattern + ctx.fillStyle = 'rgba(255, 255, 255, 0.1)'; + for (let i = 0; i < 20; i++) { + ctx.fillRect(Math.random() * 320, Math.random() * 180, 2, 2); + } + + // Add the first letter + ctx.fillStyle = 'white'; + ctx.font = 'bold 48px Arial'; + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + ctx.fillText(firstLetter, 160, 90); + + return canvas.toDataURL(); + } + + getMaxVideosForScreen() { + const width = window.innerWidth; + + if (width >= 1200) { + return 12; // 4x3 grid for large desktop + } else if (width >= 1024) { + return 9; // 3x3 grid for desktop + } else if (width >= 768) { + return 6; // 3x2 grid for tablet + } else { + return 4; // 2x2 grid for mobile + } + } + + createSampleVideos() { + return [ + { + id: 'sample1', + title: 'React Full Course for Beginners', + author: 'Bro Code', + views: '2.1M views', + duration: 1800, + thumbnail: 'https://img.youtube.com/vi/dGcsHMXbSOA/maxresdefault.jpg' + }, + { + id: 'sample2', + title: 'JavaScript ES6+ Features', + author: 'Tech Tutorials', + views: '850K views', + duration: 1200, + thumbnail: 'https://img.youtube.com/vi/WZQc7RUAg18/maxresdefault.jpg' + }, + { + id: 'sample3', + title: 'CSS Grid Layout Masterclass', + author: 'Web Dev Academy', + views: '1.2M views', + duration: 2400, + thumbnail: 'https://img.youtube.com/vi/0xMQfnTU6oo/maxresdefault.jpg' + }, + { + id: 'sample4', + title: 'Node.js Backend Development', + author: 'Code Master', + views: '650K views', + duration: 3600, + thumbnail: 'https://img.youtube.com/vi/fBNz6F-Cowg/maxresdefault.jpg' + }, + { + id: 'sample5', + title: 'Vue.js Complete Guide', + author: 'Frontend Pro', + views: '980K views', + duration: 2800, + thumbnail: 'https://img.youtube.com/vi/qZXt1Aom3Cs/maxresdefault.jpg' + }, + { + id: 'sample6', + title: 'Python Data Science', + author: 'Data Academy', + views: '1.5M views', + duration: 4200, + thumbnail: 'https://img.youtube.com/vi/ua-CiDNNj30/maxresdefault.jpg' + }, + { + id: 'sample7', + title: 'TypeScript Fundamentals', + author: 'TypeScript Expert', + views: '720K views', + duration: 2100, + thumbnail: 'https://img.youtube.com/vi/BwuLxPH8IDs/maxresdefault.jpg' + }, + { + id: 'sample8', + title: 'MongoDB Database Tutorial', + author: 'Database Pro', + views: '890K views', + duration: 1800, + thumbnail: 'https://img.youtube.com/vi/-56x56UppqQ/maxresdefault.jpg' + }, + { + id: 'sample9', + title: 'Docker Containerization', + author: 'DevOps Master', + views: '1.1M views', + duration: 3200, + thumbnail: 'https://img.youtube.com/vi/pTFZFxd4hOI/maxresdefault.jpg' + }, + { + id: 'sample10', + title: 'AWS Cloud Services', + author: 'Cloud Expert', + views: '1.3M views', + duration: 4500, + thumbnail: 'https://img.youtube.com/vi/ITcXLS3h2qU/maxresdefault.jpg' + }, + { + id: 'sample11', + title: 'GraphQL API Design', + author: 'API Specialist', + views: '680K views', + duration: 2600, + thumbnail: 'https://img.youtube.com/vi/ed8SzALpx1Q/maxresdefault.jpg' + }, + { + id: 'sample12', + title: 'Machine Learning Basics', + author: 'AI Academy', + views: '2.3M views', + duration: 5400, + thumbnail: 'https://img.youtube.com/vi/i_LwzRVP7bg/maxresdefault.jpg' + } + ]; + } + show() { this.el().style.display = 'flex'; } diff --git a/frontend-tools/video-js/src/components/video-player/VideoJSPlayer.jsx b/frontend-tools/video-js/src/components/video-player/VideoJSPlayer.jsx index decb9d5c..d36ce17d 100644 --- a/frontend-tools/video-js/src/components/video-player/VideoJSPlayer.jsx +++ b/frontend-tools/video-js/src/components/video-player/VideoJSPlayer.jsx @@ -564,10 +564,34 @@ function VideoJSPlayer() { }, siteUrl: '', nextLink: 'https://demo.mediacms.io/view?m=YjGJafibO', + chapter_data: [ + { startTime: 0, endTime: 3, text: 'Introduction' }, + { startTime: 3, endTime: 5, text: 'Overview of Marine Life' }, + { startTime: 5, endTime: 10, text: 'Coral Reef Ecosystems' }, + { startTime: 10, endTime: 14, text: 'Deep Sea Creatures' }, + ], chaptersData: [ - { startTime: 0, endTime: 5, text: 'Start111' }, - { startTime: 5, endTime: 10, text: 'Introduction - EuroHPC' }, - { startTime: 10, endTime: 15, text: 'Planning - EuroHPC' }, + { startTime: 0, endTime: 3, text: 'Introduction' }, + { startTime: 3, endTime: 5, text: 'Overview of Marine Life' }, + { startTime: 5, endTime: 10, text: 'Coral Reef Ecosystems' }, + { startTime: 10, endTime: 14, text: 'Deep Sea Creatures' }, + { startTime: 240, endTime: 320, text: 'Ocean Conservation' }, + { startTime: 320, endTime: 400, text: 'Climate Change Impact' }, + { startTime: 400, endTime: 480, text: 'Marine Protected Areas' }, + { startTime: 480, endTime: 560, text: 'Sustainable Fishing' }, + { startTime: 560, endTime: 640, text: 'Research Methods' }, + { startTime: 640, endTime: 720, text: 'Future Challenges' }, + { startTime: 720, endTime: 800, text: 'Conclusion' }, + { startTime: 800, endTime: 880, text: 'Marine Biodiversity Hotspots' }, + { startTime: 880, endTime: 960, text: 'Underwater Photography' }, + { startTime: 960, endTime: 1040, text: 'Whale Migration Patterns' }, + { startTime: 1040, endTime: 1120, text: 'Plastic Pollution Crisis' }, + { startTime: 1120, endTime: 1200, text: 'Seagrass Meadows' }, + { startTime: 1200, endTime: 1280, text: 'Ocean Acidification' }, + { startTime: 1280, endTime: 1360, text: 'Marine Archaeology' }, + { startTime: 1360, endTime: 1440, text: 'Tidal Pool Ecosystems' }, + { startTime: 1440, endTime: 1520, text: 'Commercial Aquaculture' }, + { startTime: 1520, endTime: 1600, text: 'Ocean Exploration Technology' }, ], }, [] @@ -575,12 +599,29 @@ function VideoJSPlayer() { // Define chapters as JSON object // Note: The sample-chapters.vtt file is no longer needed as chapters are now loaded from this JSON - const chaptersData = mediaData.chaptersData; - /* [ - { startTime: 0, endTime: 5, text: 'Start111' }, - { startTime: 5, endTime: 10, text: 'Introduction - EuroHPC' }, - { startTime: 10, endTime: 15, text: 'Planning - EuroHPC' }, - ]; */ + const chaptersData = mediaData.chaptersData ?? [ + { startTime: 0, endTime: 30, text: 'Introduction' }, + { startTime: 30, endTime: 90, text: 'Overview of Marine Life' }, + { startTime: 90, endTime: 180, text: 'Coral Reef Ecosystems' }, + { startTime: 180, endTime: 240, text: 'Deep Sea Creatures' }, + { startTime: 240, endTime: 320, text: 'Ocean Conservation' }, + { startTime: 320, endTime: 400, text: 'Climate Change Impact' }, + { startTime: 400, endTime: 480, text: 'Marine Protected Areas' }, + { startTime: 480, endTime: 560, text: 'Sustainable Fishing' }, + { startTime: 560, endTime: 640, text: 'Research Methods' }, + { startTime: 640, endTime: 720, text: 'Future Challenges' }, + { startTime: 720, endTime: 800, text: 'Conclusion' }, + { startTime: 800, endTime: 880, text: 'Marine Biodiversity Hotspots' }, + { startTime: 880, endTime: 960, text: 'Underwater Photography' }, + { startTime: 960, endTime: 1040, text: 'Whale Migration Patterns' }, + { startTime: 1040, endTime: 1120, text: 'Plastic Pollution Crisis' }, + { startTime: 1120, endTime: 1200, text: 'Seagrass Meadows' }, + { startTime: 1200, endTime: 1280, text: 'Ocean Acidification' }, + { startTime: 1280, endTime: 1360, text: 'Marine Archaeology' }, + { startTime: 1360, endTime: 1440, text: 'Tidal Pool Ecosystems' }, + { startTime: 1440, endTime: 1520, text: 'Commercial Aquaculture' }, + { startTime: 1520, endTime: 1600, text: 'Ocean Exploration Technology' }, + ]; // Get video data from mediaData const currentVideo = useMemo( @@ -678,6 +719,39 @@ function VideoJSPlayer() { })); }, [mediaData]); + // Demo array for testing purposes + const demoSubtitleTracks = [ + { + kind: 'subtitles', + src: '/sample-subtitles.vtt', + srclang: 'en', + label: 'English Subtitles', + default: false, + }, + { + kind: 'subtitles', + src: '/sample-subtitles-greek.vtt', + srclang: 'el', + label: 'Greek Subtitles (Ελληνικά)', + default: false, + }, + ]; + + // Get subtitle tracks from backend response or fallback based on environment + const backendSubtitles = mediaData?.data?.subtitles_info || []; + const isDevelopment = process.env.NODE_ENV === 'development' || window.location.hostname === 'localhost'; + + const hasSubtitles = backendSubtitles.length > 0 || isDevelopment; + const subtitleTracks = hasSubtitles + ? backendSubtitles.map(track => ({ + kind: 'subtitles', + src: track.src, + srclang: track.srclang, + label: track.label, + default: false, + })) + : (isDevelopment ? demoSubtitleTracks : []); + // Function to navigate to next video const goToNextVideo = () => { console.log('Next video functionality disabled for single video mode'); @@ -915,7 +989,7 @@ function VideoJSPlayer() { descriptionsButton: true, // Subtitles (CC) button should be visible - subtitlesButton: true, + subtitlesButton: hasSubtitles ? true : false, // Captions button (keep disabled to avoid duplicate with subtitles) captionsButton: false, @@ -1004,31 +1078,14 @@ function VideoJSPlayer() { } // BEGIN: Add subtitle tracks - const subtitleTracks = [ - { - kind: 'subtitles', - src: '/sample-subtitles.vtt', - srclang: 'en', - label: 'English Subtitles', - default: false, - }, - { - kind: 'subtitles', - src: '/sample-subtitles-greek.vtt', - srclang: 'el', - label: 'Greek Subtitles (Ελληνικά)', - default: false, - }, - ]; + - subtitleTracks.forEach((track) => { + hasSubtitles && subtitleTracks.forEach((track) => { playerRef.current.addRemoteTextTrack(track, false); }); - // Apply saved subtitle preference with additional delay - setTimeout(() => { - userPreferences.current.applySubtitlePreference(playerRef.current); - }, 1000); + // Apply saved subtitle preference immediately + userPreferences.current.applySubtitlePreference(playerRef.current); // END: Add subtitle tracks // BEGIN: Chapters Implementation @@ -1071,7 +1128,7 @@ function VideoJSPlayer() { // END: Implement custom time display component // BEGIN: Implement custom next video button - if (mediaData?.nextLink) { + if (mediaData?.nextLink || 1===1) { // it seems that the nextLink is not always available, and it is need the this.player().trigger('nextVideo'); from NextVideoButton.js // TODO: remove the 1===1 and the mediaData?.nextLink console.log('mediaData.nextLink edw', mediaData.nextLink); const nextVideoButton = new NextVideoButton(playerRef.current, { nextLink: mediaData.nextLink, @@ -1154,8 +1211,8 @@ function VideoJSPlayer() { // Make menus clickable instead of hover-only setTimeout(() => { const setupClickableMenus = () => { - // Find all menu buttons (chapters, subtitles, etc.) - const menuButtons = ['chaptersButton', 'subtitlesButton', 'playbackRateMenuButton']; + // Find all menu buttons (subtitles, etc.) - exclude chaptersButton as it has custom overlay + const menuButtons = ['subtitlesButton', 'playbackRateMenuButton']; menuButtons.forEach((buttonName) => { const button = controlBar.getChild(buttonName); @@ -1206,6 +1263,102 @@ function VideoJSPlayer() { } } }); + + // Add YouTube-like subtitles toggle with red underline + const ccNames = ['subtitlesButton', 'captionsButton', 'subsCapsButton']; + for (const n of ccNames) { + const cc = controlBar.getChild(n); + if (cc && cc.el()) { + const el = cc.el(); + const menu = el.querySelector('.vjs-menu'); + if (menu) menu.style.display = 'none'; + + const toggleSubs = (ev) => { + ev.preventDefault(); + ev.stopPropagation(); + const tracks = playerRef.current.textTracks(); + let any = false; + for (let i = 0; i < tracks.length; i++) { + const t = tracks[i]; + if (t.kind === 'subtitles' && t.mode === 'showing') { any = true; break; } + } + if (any) { + for (let i = 0; i < tracks.length; i++) { + const t = tracks[i]; + if (t.kind === 'subtitles') t.mode = 'disabled'; + } + el.classList.remove('vjs-subs-active'); + // Do not change saved language on quick toggle off; save enabled=false + try { userPreferences.current.setPreference('subtitleEnabled', false, true); } catch (e) {} + } else { + // Show using previously chosen language only; do not change it + const preferred = userPreferences.current.getPreference('subtitleLanguage'); + if (!preferred) { + // If no language chosen yet, enable first available and save it + let first = null; + for (let i = 0; i < tracks.length; i++) { + const t = tracks[i]; + if (t.kind === 'subtitles') { first = t.language; break; } + } + if (first) { + for (let i = 0; i < tracks.length; i++) { + const t = tracks[i]; + if (t.kind === 'subtitles') t.mode = t.language === first ? 'showing' : 'disabled'; + } + try { userPreferences.current.setPreference('subtitleLanguage', first, true); } catch (e) {} + try { userPreferences.current.setPreference('subtitleEnabled', true, true); } catch (e) {} + el.classList.add('vjs-subs-active'); + } + return; + } + let found = false; + for (let i = 0; i < tracks.length; i++) { + const t = tracks[i]; + if (t.kind === 'subtitles') { + const show = t.language === preferred; + t.mode = show ? 'showing' : 'disabled'; + if (show) found = true; + } + } + if (found) { + el.classList.add('vjs-subs-active'); + try { userPreferences.current.setPreference('subtitleEnabled', true, true); } catch (e) {} + } + } + }; + + el.addEventListener('click', toggleSubs, { capture: true }); + + // Add mobile touch support + el.addEventListener('touchend', (e) => { + e.preventDefault(); + e.stopPropagation(); + toggleSubs(e); + }, { passive: false }); + + // Sync underline state on external changes + playerRef.current.on('texttrackchange', () => { + const tracks = playerRef.current.textTracks(); + let any = false; + for (let i = 0; i < tracks.length; i++) { + const t = tracks[i]; + if (t.kind === 'subtitles' && t.mode === 'showing') { any = true; break; } + } + if (any) el.classList.add('vjs-subs-active'); else el.classList.remove('vjs-subs-active'); + }); + + // Initialize state immediately + const tracks = playerRef.current.textTracks(); + let any = false; + for (let i = 0; i < tracks.length; i++) { + const t = tracks[i]; + if (t.kind === 'subtitles' && t.mode === 'showing') { any = true; break; } + } + if (any) el.classList.add('vjs-subs-active'); + + break; + } + } }; setupClickableMenus(); @@ -1275,6 +1428,17 @@ function VideoJSPlayer() { qualities: availableQualities, }); + // If qualities change per video (e.g., via MEDIA_DATA update), refresh menu + try { + playerRef.current.on('loadedmetadata', () => { + if (customComponents.current.settingsMenu && customComponents.current.settingsMenu.setQualities) { + const md = typeof window !== 'undefined' ? window.MEDIA_DATA : null; + const newQualities = md?.data?.qualities || availableQualities; + customComponents.current.settingsMenu.setQualities(newQualities); + } + }); + } catch (e) {} + // END: Add Settings Menu Component // BEGIN: Add Seek Indicator Component @@ -1525,10 +1689,18 @@ function VideoJSPlayer() { playerRef.current.on('play', () => { console.log('Video started playing'); + // Only show play indicator if not changing quality + if (!playerRef.current.isChangingQuality) { + customComponents.current.seekIndicator.show('play'); + } }); playerRef.current.on('pause', () => { console.log('Video paused'); + // Only show pause indicator if not changing quality + if (!playerRef.current.isChangingQuality) { + customComponents.current.seekIndicator.show('pause'); + } }); // Store reference to end screen and autoplay countdown for cleanup diff --git a/frontend-tools/video-js/src/utils/UserPreferences.js b/frontend-tools/video-js/src/utils/UserPreferences.js index c48cfcbd..f3d2a57f 100644 --- a/frontend-tools/video-js/src/utils/UserPreferences.js +++ b/frontend-tools/video-js/src/utils/UserPreferences.js @@ -10,6 +10,7 @@ class UserPreferences { playbackRate: 1.0, // Normal speed quality: 'auto', // Auto quality subtitleLanguage: null, // No subtitles by default + subtitleEnabled: false, // Subtitles off by default muted: false, autoplay: false, // Autoplay disabled by default }; @@ -389,8 +390,9 @@ class UserPreferences { */ applySubtitlePreference(player) { const savedLanguage = this.getPreference('subtitleLanguage'); + const enabled = this.getPreference('subtitleEnabled'); - if (savedLanguage) { + if (savedLanguage && enabled) { // Set flag to prevent auto-save during restoration this.isRestoringSubtitles = true; console.log('isRestoringSubtitles', this.isRestoringSubtitles); @@ -427,6 +429,9 @@ class UserPreferences { // Also update the menu UI to reflect the selection this.updateSubtitleMenuUI(player, track); + + // Update subtitle button visual state immediately + this.updateSubtitleButtonVisualState(player, true); break; } } @@ -439,8 +444,8 @@ class UserPreferences { // If not found and we haven't tried too many times, try again if (!found && attempt < 5) { - console.log(`Subtitle language ${savedLanguage} not found, retrying in ${attempt * 200}ms...`); - setTimeout(() => attemptToApplySubtitles(attempt + 1), attempt * 200); + console.log(`Subtitle language ${savedLanguage} not found, retrying in ${attempt * 50}ms...`); + setTimeout(() => attemptToApplySubtitles(attempt + 1), attempt * 50); } else if (!found) { console.warn('Could not find subtitle track for language:', savedLanguage); // Clear flag even if not found @@ -448,10 +453,54 @@ class UserPreferences { } }; - // Start attempting to apply subtitles - setTimeout(() => attemptToApplySubtitles(), 500); + // Start attempting to apply subtitles immediately + attemptToApplySubtitles(); } else { - console.log('No saved subtitle language to apply'); + // Ensure subtitles are off on load when not enabled + try { + const textTracks = player.textTracks(); + for (let i = 0; i < textTracks.length; i++) { + const track = textTracks[i]; + if (track.kind === 'subtitles') { + track.mode = 'disabled'; + } + } + + // Update subtitle button visual state to show disabled + this.updateSubtitleButtonVisualState(player, false); + + // Update custom settings menu to show "Off" as selected + this.updateCustomSettingsMenuUI(player); + } catch (e) {} + console.log('No subtitle auto-apply on load (disabled or no language).'); + } + } + + /** + * Update subtitle button visual state (red underline) + * @param {Object} player - Video.js player instance + * @param {boolean} enabled - Whether subtitles are enabled + */ + updateSubtitleButtonVisualState(player, enabled) { + try { + const controlBar = player.getChild('controlBar'); + const subtitlesButton = controlBar.getChild('subtitlesButton'); + + if (subtitlesButton && subtitlesButton.el()) { + const buttonEl = subtitlesButton.el(); + + if (enabled) { + buttonEl.classList.add('vjs-subs-active'); + console.log('✓ Added vjs-subs-active class to subtitle button'); + } else { + buttonEl.classList.remove('vjs-subs-active'); + console.log('✓ Removed vjs-subs-active class from subtitle button'); + } + } else { + console.log('Subtitle button not found for visual state update'); + } + } catch (error) { + console.error('Error updating subtitle button visual state:', error); } } @@ -482,11 +531,44 @@ class UserPreferences { } }); } + + // Also update the custom settings menu if it exists + this.updateCustomSettingsMenuUI(player); } catch (error) { console.error('Error updating subtitle menu UI:', error); } } + /** + * Update custom settings menu UI to reflect the current subtitle state + * @param {Object} player - Video.js player instance + */ + updateCustomSettingsMenuUI(player) { + const attemptUpdate = (attempt = 1) => { + try { + // Find the custom settings menu component + const controlBar = player.getChild('controlBar'); + const customSettingsMenu = controlBar.getChild('CustomSettingsMenu'); + + if (customSettingsMenu && customSettingsMenu.refreshSubtitlesSubmenu) { + console.log('Updating custom settings menu UI...'); + customSettingsMenu.refreshSubtitlesSubmenu(); + } else if (attempt < 5) { + // Retry after a short delay if menu not found + console.log(`Custom settings menu not found, retrying in ${attempt * 200}ms... (attempt ${attempt})`); + setTimeout(() => attemptUpdate(attempt + 1), attempt * 200); + } else { + console.log('Custom settings menu not found after multiple attempts'); + } + } catch (error) { + console.error('Error updating custom settings menu UI:', error); + } + }; + + // Start the update attempt + attemptUpdate(); + } + /** * Get quality preference for settings menu * @returns {string} Quality preference diff --git a/frontend/packages/player/package-lock.json b/frontend/packages/player/package-lock.json index 05a00180..3bd75e08 100644 --- a/frontend/packages/player/package-lock.json +++ b/frontend/packages/player/package-lock.json @@ -78,20 +78,6 @@ "video.js": "^7.12.3" } }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", @@ -108,9 +94,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", - "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", + "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", "dev": true, "license": "MIT", "engines": { @@ -118,22 +104,22 @@ } }, "node_modules/@babel/core": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz", - "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", + "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", "dev": true, "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.0", + "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.27.3", - "@babel/helpers": "^7.27.6", - "@babel/parser": "^7.28.0", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.0", - "@babel/types": "^7.28.0", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -159,14 +145,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz", - "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.0", - "@babel/types": "^7.28.0", + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -216,18 +202,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", - "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", + "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-member-expression-to-functions": "^7.27.1", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.27.1", + "@babel/traverse": "^7.28.3", "semver": "^6.3.1" }, "engines": { @@ -331,15 +317,15 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", - "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.3" + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" @@ -452,42 +438,42 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz", - "integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.1", - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.2.tgz", - "integrity": "sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", + "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", "@babel/types": "^7.28.2" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/parser": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", - "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.0" + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.4" }, "bin": { "parser": "bin/babel-parser.js" @@ -564,14 +550,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz", - "integrity": "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", + "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" @@ -711,9 +697,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.0.tgz", - "integrity": "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.4.tgz", + "integrity": "sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A==", "dev": true, "license": "MIT", "dependencies": { @@ -744,13 +730,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz", - "integrity": "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", + "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.28.3", "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { @@ -761,9 +747,9 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.0.tgz", - "integrity": "sha512-IjM1IoJNw72AZFlj33Cu8X0q2XK/6AaVC3jQu+cgQ5lThWD5ajnuUAml80dqRmOhmPkTH8uAwnpMu9Rvj0LTRA==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", + "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", "dev": true, "license": "MIT", "dependencies": { @@ -772,7 +758,7 @@ "@babel/helper-globals": "^7.28.0", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.28.4" }, "engines": { "node": ">=6.9.0" @@ -1165,9 +1151,9 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz", - "integrity": "sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", + "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", "dev": true, "license": "MIT", "dependencies": { @@ -1175,7 +1161,7 @@ "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.0", "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.28.4" }, "engines": { "node": ">=6.9.0" @@ -1302,9 +1288,9 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.28.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.1.tgz", - "integrity": "sha512-P0QiV/taaa3kXpLY+sXla5zec4E+4t4Aqc9ggHlfZ7a2cp8/x/Gv08jfwEtn9gnnYIMvHx6aoOZ8XJL8eU71Dg==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", + "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", "dev": true, "license": "MIT", "dependencies": { @@ -1499,9 +1485,9 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.0.tgz", - "integrity": "sha512-VmaxeGOwuDqzLl5JUkIRM1X2Qu2uKGxHEQWh+cvvbl7JuJRgKGJSfsEF/bUaxFhJl/XAyxBe7q7qSuTbKFuCyg==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz", + "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==", "dev": true, "license": "MIT", "dependencies": { @@ -1513,7 +1499,7 @@ "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-import-assertions": "^7.27.1", "@babel/plugin-syntax-import-attributes": "^7.27.1", @@ -1524,8 +1510,8 @@ "@babel/plugin-transform-block-scoped-functions": "^7.27.1", "@babel/plugin-transform-block-scoping": "^7.28.0", "@babel/plugin-transform-class-properties": "^7.27.1", - "@babel/plugin-transform-class-static-block": "^7.27.1", - "@babel/plugin-transform-classes": "^7.28.0", + "@babel/plugin-transform-class-static-block": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.3", "@babel/plugin-transform-computed-properties": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.0", "@babel/plugin-transform-dotall-regex": "^7.27.1", @@ -1557,7 +1543,7 @@ "@babel/plugin-transform-private-methods": "^7.27.1", "@babel/plugin-transform-private-property-in-object": "^7.27.1", "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.28.0", + "@babel/plugin-transform-regenerator": "^7.28.3", "@babel/plugin-transform-regexp-modifiers": "^7.27.1", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", @@ -1624,18 +1610,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz", - "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.0", + "@babel/generator": "^7.28.3", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.0", + "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", - "@babel/types": "^7.28.0", + "@babel/types": "^7.28.4", "debug": "^4.3.1" }, "engines": { @@ -1643,9 +1629,9 @@ } }, "node_modules/@babel/types": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", - "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1657,9 +1643,9 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", - "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, "license": "MIT", "dependencies": { @@ -1667,6 +1653,17 @@ "@jridgewell/trace-mapping": "^0.3.24" } }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -1678,16 +1675,16 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", - "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.29", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", - "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -2111,13 +2108,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.1.0.tgz", - "integrity": "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w==", + "version": "24.4.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.4.0.tgz", + "integrity": "sha512-gUuVEAK4/u6F9wRLznPUU4WGUacSEBDPoC2TrBkw3GAnOLHBL45QdfHOXp1kJ4ypBGLxTOB+t7NJLpKoC3gznQ==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.8.0" + "undici-types": "~7.11.0" } }, "node_modules/@types/resolve": { @@ -3107,6 +3104,16 @@ "dev": true, "license": "MIT" }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.3.tgz", + "integrity": "sha512-mcE+Wr2CAhHNWxXN/DdTI+n4gsPc5QpXpWnyCQWiQYIYZX+ZMJ8juXZgjRa/0/YPJo/NSsgW15/YgmI4nbysYw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -3150,9 +3157,9 @@ } }, "node_modules/browserslist": { - "version": "4.25.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", - "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.0.tgz", + "integrity": "sha512-P9go2WrP9FiPwLv3zqRD/Uoxo0RSHjzFCiQz7d4vbmwNqQFo9T9WCeP/Qn5EbcKQY6DBbkxEXNcpJOmncNrb7A==", "dev": true, "funding": [ { @@ -3170,9 +3177,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001726", - "electron-to-chromium": "^1.5.173", - "node-releases": "^2.0.19", + "baseline-browser-mapping": "^2.8.2", + "caniuse-lite": "^1.0.30001741", + "electron-to-chromium": "^1.5.218", + "node-releases": "^2.0.21", "update-browserslist-db": "^1.1.3" }, "bin": { @@ -3209,9 +3217,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001727", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz", - "integrity": "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==", + "version": "1.0.30001741", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001741.tgz", + "integrity": "sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw==", "dev": true, "funding": [ { @@ -3379,9 +3387,9 @@ "license": "MIT" }, "node_modules/core-js": { - "version": "3.44.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.44.0.tgz", - "integrity": "sha512-aFCtd4l6GvAXwVEh3XbbVqJGHDJt0OZRa+5ePGx3LLwi12WfexqQxcsohb2wgsa/92xtl19Hd66G/L+TaAxDMw==", + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.1.tgz", + "integrity": "sha512-L4NPsJlCfZsPeXukyzHFlg/i7IIVwHSItR0wg0FLNqYClJ4MQYTYLbC7EkjKYRLZF2iof2MUgN0EGy7MdQFChg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -3391,13 +3399,13 @@ } }, "node_modules/core-js-compat": { - "version": "3.44.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.44.0.tgz", - "integrity": "sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA==", + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz", + "integrity": "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.25.1" + "browserslist": "^4.25.3" }, "funding": { "type": "opencollective", @@ -3636,9 +3644,9 @@ } }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { @@ -3766,9 +3774,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.191", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.191.tgz", - "integrity": "sha512-xcwe9ELcuxYLUFqZZxL19Z6HVKcvNkIwhbHUz7L3us6u12yR+7uY89dSl570f/IqNthx8dAw3tojG7i4Ni4tDA==", + "version": "1.5.218", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.218.tgz", + "integrity": "sha512-uwwdN0TUHs8u6iRgN8vKeWZMRll4gBkz+QMqdS7DDe49uiK68/UX92lFb61oiFPrpYZNeZIqa4bA7O6Aiasnzg==", "dev": true, "license": "ISC" }, @@ -3858,9 +3866,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "dev": true, "funding": [ { @@ -4619,9 +4627,9 @@ "optional": true }, "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz", + "integrity": "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==", "dev": true, "license": "MIT" }, @@ -5574,9 +5582,9 @@ "license": "MIT" }, "node_modules/regenerate-unicode-properties": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", - "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", "dev": true, "license": "MIT", "dependencies": { @@ -5606,18 +5614,18 @@ } }, "node_modules/regexpu-core": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", - "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.3.1.tgz", + "integrity": "sha512-DzcswPr252wEr7Qz8AyAVbfyBDKLoYp6eRA1We2Fa9qirRFSdtkP5sHr3yglDKy2BbA0fd2T+j/CUSKes3FeVQ==", "dev": true, "license": "MIT", "dependencies": { "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.0", + "regenerate-unicode-properties": "^10.2.2", "regjsgen": "^0.8.0", "regjsparser": "^0.12.0", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" + "unicode-match-property-value-ecmascript": "^2.2.1" }, "engines": { "node": ">=4" @@ -5932,9 +5940,9 @@ "license": "ISC" }, "node_modules/sass": { - "version": "1.89.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.89.2.tgz", - "integrity": "sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA==", + "version": "1.92.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.92.1.tgz", + "integrity": "sha512-ffmsdbwqb3XeyR8jJR6KelIXARM9bFQe8A6Q3W4Klmwy5Ckd5gz7jgUNHo4UOqutU5Sk1DtKLbpDP0nLCg1xqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6344,9 +6352,9 @@ } }, "node_modules/undici-types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", - "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.11.0.tgz", + "integrity": "sha512-kt1ZriHTi7MU+Z/r9DOdAI3ONdaR3M3csEaRc6ewa4f4dTvX4cQCbJ4NkEn0ohE4hHtq85+PhPSTY+pO/1PwgA==", "dev": true, "license": "MIT" }, @@ -6375,9 +6383,9 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", - "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", "dev": true, "license": "MIT", "engines": { diff --git a/frontend/packages/scripts/package-lock.json b/frontend/packages/scripts/package-lock.json index 6cd30711..9046ad51 100644 --- a/frontend/packages/scripts/package-lock.json +++ b/frontend/packages/scripts/package-lock.json @@ -76,19 +76,6 @@ "node": ">=14.17.0" } }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", @@ -104,30 +91,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", - "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", + "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz", - "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", + "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.0", + "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.27.3", - "@babel/helpers": "^7.27.6", - "@babel/parser": "^7.28.0", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.0", - "@babel/types": "^7.28.0", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -152,13 +139,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz", - "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.0", - "@babel/types": "^7.28.0", + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -205,17 +192,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", - "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", + "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-member-expression-to-functions": "^7.27.1", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.27.1", + "@babel/traverse": "^7.28.3", "semver": "^6.3.1" }, "engines": { @@ -312,14 +299,14 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", - "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.3" + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" @@ -424,39 +411,39 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz", - "integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.1", - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.2.tgz", - "integrity": "sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", + "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", "license": "MIT", "dependencies": { "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", "@babel/types": "^7.28.2" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/parser": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", - "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "license": "MIT", "dependencies": { - "@babel/types": "^7.28.0" + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.4" }, "bin": { "parser": "bin/babel-parser.js" @@ -529,13 +516,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz", - "integrity": "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", + "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" @@ -750,9 +737,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.0.tgz", - "integrity": "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.4.tgz", + "integrity": "sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -781,12 +768,12 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz", - "integrity": "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", + "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.28.3", "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { @@ -797,9 +784,9 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.0.tgz", - "integrity": "sha512-IjM1IoJNw72AZFlj33Cu8X0q2XK/6AaVC3jQu+cgQ5lThWD5ajnuUAml80dqRmOhmPkTH8uAwnpMu9Rvj0LTRA==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", + "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", @@ -807,7 +794,7 @@ "@babel/helper-globals": "^7.28.0", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.28.4" }, "engines": { "node": ">=6.9.0" @@ -1177,16 +1164,16 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz", - "integrity": "sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", + "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.0", "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.28.4" }, "engines": { "node": ">=6.9.0" @@ -1386,9 +1373,9 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.28.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.1.tgz", - "integrity": "sha512-P0QiV/taaa3kXpLY+sXla5zec4E+4t4Aqc9ggHlfZ7a2cp8/x/Gv08jfwEtn9gnnYIMvHx6aoOZ8XJL8eU71Dg==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", + "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -1591,9 +1578,9 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.0.tgz", - "integrity": "sha512-VmaxeGOwuDqzLl5JUkIRM1X2Qu2uKGxHEQWh+cvvbl7JuJRgKGJSfsEF/bUaxFhJl/XAyxBe7q7qSuTbKFuCyg==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz", + "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==", "license": "MIT", "dependencies": { "@babel/compat-data": "^7.28.0", @@ -1604,7 +1591,7 @@ "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-import-assertions": "^7.27.1", "@babel/plugin-syntax-import-attributes": "^7.27.1", @@ -1615,8 +1602,8 @@ "@babel/plugin-transform-block-scoped-functions": "^7.27.1", "@babel/plugin-transform-block-scoping": "^7.28.0", "@babel/plugin-transform-class-properties": "^7.27.1", - "@babel/plugin-transform-class-static-block": "^7.27.1", - "@babel/plugin-transform-classes": "^7.28.0", + "@babel/plugin-transform-class-static-block": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.3", "@babel/plugin-transform-computed-properties": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.0", "@babel/plugin-transform-dotall-regex": "^7.27.1", @@ -1648,7 +1635,7 @@ "@babel/plugin-transform-private-methods": "^7.27.1", "@babel/plugin-transform-private-property-in-object": "^7.27.1", "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.28.0", + "@babel/plugin-transform-regenerator": "^7.28.3", "@babel/plugin-transform-regexp-modifiers": "^7.27.1", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", @@ -1752,17 +1739,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz", - "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.0", + "@babel/generator": "^7.28.3", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.0", + "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", - "@babel/types": "^7.28.0", + "@babel/types": "^7.28.4", "debug": "^4.3.1" }, "engines": { @@ -1770,9 +1757,9 @@ } }, "node_modules/@babel/types": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", - "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -1792,15 +1779,25 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", - "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -1811,9 +1808,9 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.10.tgz", - "integrity": "sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==", + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -1821,15 +1818,15 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", - "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.29", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", - "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -2597,12 +2594,12 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.1.0.tgz", - "integrity": "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w==", + "version": "24.4.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.4.0.tgz", + "integrity": "sha512-gUuVEAK4/u6F9wRLznPUU4WGUacSEBDPoC2TrBkw3GAnOLHBL45QdfHOXp1kJ4ypBGLxTOB+t7NJLpKoC3gznQ==", "license": "MIT", "dependencies": { - "undici-types": "~7.8.0" + "undici-types": "~7.11.0" } }, "node_modules/@types/parse-json": { @@ -3789,6 +3786,15 @@ ], "license": "MIT" }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.3.tgz", + "integrity": "sha512-mcE+Wr2CAhHNWxXN/DdTI+n4gsPc5QpXpWnyCQWiQYIYZX+ZMJ8juXZgjRa/0/YPJo/NSsgW15/YgmI4nbysYw==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -4067,9 +4073,9 @@ } }, "node_modules/browserslist": { - "version": "4.25.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", - "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.0.tgz", + "integrity": "sha512-P9go2WrP9FiPwLv3zqRD/Uoxo0RSHjzFCiQz7d4vbmwNqQFo9T9WCeP/Qn5EbcKQY6DBbkxEXNcpJOmncNrb7A==", "funding": [ { "type": "opencollective", @@ -4086,9 +4092,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001726", - "electron-to-chromium": "^1.5.173", - "node-releases": "^2.0.19", + "baseline-browser-mapping": "^2.8.2", + "caniuse-lite": "^1.0.30001741", + "electron-to-chromium": "^1.5.218", + "node-releases": "^2.0.21", "update-browserslist-db": "^1.1.3" }, "bin": { @@ -4279,9 +4286,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001727", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz", - "integrity": "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==", + "version": "1.0.30001741", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001741.tgz", + "integrity": "sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw==", "funding": [ { "type": "opencollective", @@ -4713,12 +4720,12 @@ "license": "MIT" }, "node_modules/core-js-compat": { - "version": "3.44.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.44.0.tgz", - "integrity": "sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA==", + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz", + "integrity": "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==", "license": "MIT", "dependencies": { - "browserslist": "^4.25.1" + "browserslist": "^4.25.3" }, "funding": { "type": "opencollective", @@ -5243,9 +5250,9 @@ "license": "MIT" }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -5756,9 +5763,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.191", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.191.tgz", - "integrity": "sha512-xcwe9ELcuxYLUFqZZxL19Z6HVKcvNkIwhbHUz7L3us6u12yR+7uY89dSl570f/IqNthx8dAw3tojG7i4Ni4tDA==", + "version": "1.5.218", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.218.tgz", + "integrity": "sha512-uwwdN0TUHs8u6iRgN8vKeWZMRll4gBkz+QMqdS7DDe49uiK68/UX92lFb61oiFPrpYZNeZIqa4bA7O6Aiasnzg==", "license": "ISC" }, "node_modules/elliptic": { @@ -5817,9 +5824,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.18.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", - "integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==", + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -6439,9 +6446,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "funding": [ { "type": "github", @@ -6636,9 +6643,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", "funding": [ { "type": "individual", @@ -7402,13 +7409,13 @@ } }, "node_modules/html-minifier-terser/node_modules/terser": { - "version": "5.43.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", - "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz", + "integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==", "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.14.0", + "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -7432,9 +7439,9 @@ "license": "MIT" }, "node_modules/html-webpack-plugin": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz", - "integrity": "sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==", + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.4.tgz", + "integrity": "sha512-V/PZeWsqhfpE27nKeX9EO2sbR+D17A+tLf6qU+ht66jdUsN0QLKJN27Z+1+gHrVMKgndBahes0PU6rRihDgHTw==", "license": "MIT", "dependencies": { "@types/html-minifier-terser": "^6.0.0", @@ -8430,15 +8437,14 @@ } }, "node_modules/jake": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", - "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", "license": "Apache-2.0", "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", + "async": "^3.2.6", "filelist": "^1.0.4", - "minimatch": "^3.1.2" + "picocolors": "^1.1.1" }, "bin": { "jake": "bin/cli.js" @@ -8447,76 +8453,6 @@ "node": ">=10" } }, - "node_modules/jake/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jake/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jake/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jake/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/jake/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jake/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -8630,9 +8566,9 @@ } }, "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "license": "MIT", "dependencies": { @@ -9381,9 +9317,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz", + "integrity": "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==", "license": "MIT" }, "node_modules/normalize-path": { @@ -10092,9 +10028,9 @@ } }, "node_modules/portfinder": { - "version": "1.0.37", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.37.tgz", - "integrity": "sha512-yuGIEjDAYnnOex9ddMnKZEMFE0CcGo6zbfzDklkmT1m5z734ss6JMzN9rNB3+RR7iS+F10D4/BVIaXOyh8PQKw==", + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.38.tgz", + "integrity": "sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==", "license": "MIT", "dependencies": { "async": "^3.2.6", @@ -11171,9 +11107,9 @@ "license": "MIT" }, "node_modules/regenerate-unicode-properties": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", - "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", "license": "MIT", "dependencies": { "regenerate": "^1.4.2" @@ -11248,17 +11184,17 @@ } }, "node_modules/regexpu-core": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", - "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.3.1.tgz", + "integrity": "sha512-DzcswPr252wEr7Qz8AyAVbfyBDKLoYp6eRA1We2Fa9qirRFSdtkP5sHr3yglDKy2BbA0fd2T+j/CUSKes3FeVQ==", "license": "MIT", "dependencies": { "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.0", + "regenerate-unicode-properties": "^10.2.2", "regjsgen": "^0.8.0", "regjsparser": "^0.12.0", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" + "unicode-match-property-value-ecmascript": "^2.2.1" }, "engines": { "node": ">=4" @@ -11772,9 +11708,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.89.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.89.2.tgz", - "integrity": "sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA==", + "version": "1.92.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.92.1.tgz", + "integrity": "sha512-ffmsdbwqb3XeyR8jJR6KelIXARM9bFQe8A6Q3W4Klmwy5Ckd5gz7jgUNHo4UOqutU5Sk1DtKLbpDP0nLCg1xqQ==", "license": "MIT", "dependencies": { "chokidar": "^4.0.0", @@ -12953,12 +12889,16 @@ } }, "node_modules/tapable": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", - "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.3.tgz", + "integrity": "sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==", "license": "MIT", "engines": { "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/terser": { @@ -13094,13 +13034,13 @@ } }, "node_modules/terser-webpack-plugin/node_modules/terser": { - "version": "5.43.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", - "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz", + "integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==", "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.14.0", + "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -13303,9 +13243,9 @@ } }, "node_modules/ts-loader": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.2.tgz", - "integrity": "sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==", + "version": "9.5.4", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.4.tgz", + "integrity": "sha512-nCz0rEwunlTZiy6rXFByQU1kVVpCIgUpc/psFiKVrUwrizdnIbRFu8w7bxhUF0X613DYwT4XzrZHpVyMe758hQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13553,9 +13493,9 @@ } }, "node_modules/undici-types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", - "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.11.0.tgz", + "integrity": "sha512-kt1ZriHTi7MU+Z/r9DOdAI3ONdaR3M3csEaRc6ewa4f4dTvX4cQCbJ4NkEn0ohE4hHtq85+PhPSTY+pO/1PwgA==", "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -13581,9 +13521,9 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", - "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", "license": "MIT", "engines": { "node": ">=4" @@ -13933,9 +13873,9 @@ } }, "node_modules/webpack": { - "version": "5.100.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.100.2.tgz", - "integrity": "sha512-QaNKAvGCDRh3wW1dsDjeMdDXwZm2vqq3zn6Pvq4rHOEOGSaUMgOOjG2Y9ZbIGzpfkJk9ZYTHpDqgDfeBDcnLaw==", + "version": "5.101.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.3.tgz", + "integrity": "sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A==", "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", @@ -13948,7 +13888,7 @@ "acorn-import-phases": "^1.0.3", "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.2", + "enhanced-resolve": "^5.17.3", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", diff --git a/static/chapters_editor/videos/sample-video-30s.mp4 b/static/chapters_editor/videos/sample-video-30s.mp4 deleted file mode 100644 index 851c175c..00000000 Binary files a/static/chapters_editor/videos/sample-video-30s.mp4 and /dev/null differ diff --git a/static/chapters_editor/videos/sample-video.mp4 b/static/chapters_editor/videos/sample-video.mp4 deleted file mode 100644 index 75785940..00000000 Binary files a/static/chapters_editor/videos/sample-video.mp4 and /dev/null differ diff --git a/static/video_js/video-js.css b/static/video_js/video-js.css index fd6fa2f0..c3ca22f5 100644 --- a/static/video_js/video-js.css +++ b/static/video_js/video-js.css @@ -1 +1 @@ -.video-js{border-radius:12px!important;overflow:hidden!important;box-shadow:0 4px 12px #00000026!important;outline:none!important}.video-js video{outline:none!important}.video-js .vjs-poster{border-radius:12px!important}.video-js video{border-radius:12px!important}.video-js .vjs-control-bar{border-bottom-left-radius:12px!important;border-bottom-right-radius:12px!important;padding-bottom:5px;padding-top:0}.video-container{width:100%;max-width:1200px;margin:0 auto;padding:0 20px;box-sizing:border-box}.video-js.vjs-fluid{width:100%!important;max-width:100%!important}.vjs-next-video-control{width:3em!important;height:3em!important;flex:none;padding:0!important;margin:0!important;line-height:3em!important;position:absolute;bottom:10px;right:10px}.vjs-autoplay-toggle{width:3em!important;height:3em!important;flex:none;padding:0!important;margin:0 4px!important;line-height:3em!important;position:relative;border:none!important;background:transparent!important;color:#fff!important;cursor:pointer!important;transition:all .2s ease!important}.vjs-autoplay-toggle .vjs-autoplay-icon{width:1.2em;height:1.2em;display:flex;align-items:center;justify-content:center;margin:auto;pointer-events:none}.vjs-next-video-control .vjs-icon-placeholder{width:1.2em;height:1.2em;display:flex;align-items:center;justify-content:center;margin:auto}.vjs-next-video-control .vjs-icon-placeholder svg{width:100%;height:100%;display:block}.vjs-end-screen-overlay{position:absolute;top:0;left:0;width:100%;height:calc(100% - 46px);background:rgba(0,0,0,.8);display:none;flex-direction:column;justify-content:center;align-items:center;z-index:1000;padding:0;box-sizing:border-box}.vjs-related-videos-title{color:#fff;font-size:24px;margin-bottom:20px;text-align:center;font-weight:700}.vjs-related-videos-grid{display:grid;grid-template-columns:repeat(4,1fr);grid-template-rows:repeat(3,1fr);gap:0;width:100%;height:100%;margin:0}.vjs-related-video-item{position:relative;cursor:pointer;border-radius:0;overflow:hidden;transition:none;background:#1a1a1a;border:1px solid #000}.vjs-related-video-item:hover{transform:none}.vjs-related-video-thumbnail{width:100%;height:100%;object-fit:cover;display:block;border-radius:0}.vjs-related-video-overlay{position:absolute;top:0;left:0;right:0;bottom:0;background:linear-gradient(transparent,rgba(0,0,0,.9));color:#fff;padding:12px;opacity:0;transition:opacity .3s ease;display:flex;flex-direction:column;justify-content:flex-start;height:100%}.vjs-related-video-item:hover .vjs-related-video-overlay{opacity:1}.vjs-related-video-title{font-size:14px;font-weight:700;line-height:1.3;color:#fff;margin-bottom:4px}.vjs-related-video-meta{display:flex;flex-direction:row;gap:8px;align-items:center}.vjs-related-video-author{font-size:12px;color:#ccc}.vjs-related-video-views{font-size:12px;color:#aaa}.vjs-related-video-author:after{content:"•";margin-left:8px;color:#666}.vjs-related-video-duration{position:absolute;bottom:8px;right:8px;background:rgba(0,0,0,.8);color:#fff;padding:2px 6px;font-size:11px;font-weight:700;border-radius:2px;opacity:0;transition:opacity .3s ease}.vjs-related-video-item:hover .vjs-related-video-duration{opacity:1}.video-js.vjs-ended .vjs-control-bar{opacity:1!important;pointer-events:auto!important}.video-js.vjs-ended .vjs-control-bar .vjs-control,.video-js.vjs-ended .vjs-control-bar button,.video-js.vjs-ended .vjs-play-control{opacity:1!important;pointer-events:auto!important;cursor:pointer!important}.video-js.vjs-ended .vjs-progress-control,.video-js.vjs-ended .vjs-volume-panel{opacity:1!important;pointer-events:auto!important}.vjs-chapter-markers-track{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.vjs-chapter-marker{position:absolute;top:0;width:2px;height:100%;background:rgba(255,255,255,.6);pointer-events:auto;cursor:pointer;transition:background .2s ease}.vjs-chapter-marker:hover{background:rgba(255,255,255,.9);width:3px}.vjs-chapter-marker-tooltip{position:absolute;bottom:8px;left:50%;transform:translate(-50%);background:rgba(0,0,0,.8);color:#fff;padding:4px 8px;border-radius:4px;font-size:11px;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .2s ease;z-index:1001}.vjs-chapter-marker:hover .vjs-chapter-marker-tooltip{opacity:1}.vjs-chapter-floating-tooltip{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif!important;line-height:1.4!important;animation:fadeIn .2s ease-in-out}@keyframes fadeIn{0%{opacity:0;transform:translate(-50%) translateY(5px)}to{opacity:1;transform:translate(-50%) translateY(0)}}.video-js .vjs-menu-button:not(.vjs-disabled) .vjs-menu{display:none!important}.video-js .vjs-menu-button:not(.vjs-disabled).vjs-lock-showing .vjs-menu,.video-js .vjs-menu-button:not(.vjs-disabled) .vjs-menu.vjs-lock-showing{display:block!important}.video-js .vjs-menu-button:hover .vjs-menu{display:none!important}.video-js .vjs-menu-button.vjs-lock-showing:hover .vjs-menu{display:block!important}.video-js .vjs-menu.vjs-lock-showing{display:block!important;opacity:1!important;visibility:visible!important}.video-js.chapters-open .vjs-menu,.video-js.chapters-open .vjs-menu.vjs-lock-showing,.video-js.chapters-open .vjs-hover-display,.video-js.chapters-open .vjs-time-tooltip,.video-js.chapters-open .vjs-progress-holder .vjs-mouse-display{display:none!important;opacity:0!important;visibility:hidden!important}.video-js .vjs-captions-button,.video-js .vjs-subs-caps-button,.video-js .vjs-subtitles-button .vjs-menu{display:none!important}.video-js .vjs-subtitles-button{position:relative}.video-js .vjs-subtitles-button.vjs-subs-active:after{content:"";position:absolute;left:25%;right:25%;bottom:6px;height:3px;background:#e1002d;border-radius:2px}@media (max-width: 768px){.video-container{padding:0 15px}.vjs-related-videos-grid{grid-template-columns:repeat(3,1fr);grid-template-rows:repeat(2,1fr);gap:0;width:100%;height:100%}.vjs-end-screen-overlay{padding:0;height:calc(100% - 46px)}.vjs-related-video-thumbnail{height:100%}.vjs-chapter-floating-tooltip{max-width:200px!important;font-size:11px!important;padding:6px 10px!important}}@media (max-width: 480px){.video-container{padding:0 10px}.vjs-related-videos-grid{grid-template-columns:repeat(2,1fr);grid-template-rows:repeat(3,1fr);gap:0;width:100%;height:100%}.vjs-end-screen-overlay{padding:0;height:calc(100% - 46px)}.vjs-related-video-thumbnail{height:100%}.video-info{margin-top:10px!important;padding:10px!important;font-size:14px!important}.video-info h4{font-size:16px!important}.video-info ul{font-size:12px!important}}.vjs-play-progress{background-color:#019932!important}.vjs-load-progress,.vjs-progress-holder{background:rgba(255,255,255,.5)!important}.video-js .vjs-progress-control{position:absolute!important;bottom:46px!important;left:0!important;right:0!important;width:100%!important;height:0!important;z-index:3!important;padding:0!important;margin:0 auto!important}.video-js .vjs-control-bar .vjs-progress-control{display:none!important}.video-js .vjs-progress-control.vjs-control{display:block!important}.video-js .vjs-control-bar{background:transparent!important;background-color:transparent!important;background-image:none!important;display:flex!important;flex-direction:row!important;align-items:center!important;justify-content:flex-start!important;gap:6px!important}.video-js .vjs-control-bar .vjs-icon-placeholder,.video-js .vjs-control-bar .vjs-button .vjs-icon-placeholder,.video-js .vjs-control-bar [class*=vjs-icon-]{font-size:1.5em!important;transform:translateY(-28px)!important}.video-js .vjs-control-bar svg{width:3em!important;height:3em!important;transform:translateY(-16px)!important}.vjs-control-bar .custom-remaining-time .vjs-remaining-time-display{font-size:14px!important;font-weight:500;line-height:1;display:flex;align-items:center;justify-content:center;height:100%;color:#fff}.vjs-control-bar .custom-remaining-time{top:-5px;display:flex;align-items:center;justify-content:center;height:100%}.vjs-mouse-display{z-index:4!important}.vjs-slider-horizontal{top:-5px}.video-js .vjs-control-bar{display:flex!important;flex-direction:row!important;align-items:center!important;justify-content:flex-start!important;gap:6px!important}.video-js .vjs-spacer-control{flex:1!important;min-width:1px!important;height:100%!important}.video-js .vjs-control-bar .vjs-control{flex:none!important}.vjs-seek-indicator{position:absolute!important;top:50%!important;left:50%!important;transform:translate(-50%,-50%)!important;z-index:9999!important;pointer-events:none!important;display:none!important;align-items:center!important;justify-content:center!important;opacity:0!important;visibility:hidden!important;transition:opacity .2s ease-in-out!important}.vjs-seek-indicator-content{background:transparent!important;flex-direction:column!important;align-items:center!important;justify-content:center!important}.vjs-seek-indicator-icon{position:relative!important;display:flex!important;align-items:center!important;justify-content:center!important;margin-bottom:4px!important}.seek-icon-container{display:flex!important;flex-direction:column!important;align-items:center!important;justify-content:center!important;animation:seekPulse .3s ease-out!important}.youtube-seek-container{display:flex!important;align-items:center!important;justify-content:center!important;animation:youtubeSeekPulse .3s ease-out!important}.youtube-seek-circle{width:80px!important;height:80px!important;border-radius:50%!important;-webkit-border-radius:50%!important;-moz-border-radius:50%!important;background:rgba(0,0,0,.8)!important;backdrop-filter:blur(10px)!important;-webkit-backdrop-filter:blur(10px)!important;display:flex!important;flex-direction:column!important;align-items:center!important;justify-content:center!important;padding:0!important;box-shadow:0 4px 20px #0000004d!important;border:1px solid rgba(255,255,255,.15)!important;box-sizing:border-box!important;overflow:hidden!important}.youtube-seek-icon{display:flex!important;align-items:center!important;justify-content:center!important;margin-bottom:4px!important}.youtube-seek-icon svg{filter:drop-shadow(0 1px 2px rgba(0,0,0,.5))!important}.youtube-seek-time{color:#fff!important;font-size:10px!important;font-weight:500!important;text-align:center!important;line-height:1.2!important;opacity:.9!important;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif!important}@keyframes youtubeSeekPulse{0%{transform:scale(.7);opacity:.5}50%{transform:scale(1.05);opacity:.9}to{transform:scale(1);opacity:1}}.seek-seconds{color:#fff!important;font-size:16px!important;font-weight:700!important;text-shadow:0 2px 4px rgba(0,0,0,.7)!important;line-height:1!important}.vjs-seek-indicator-text{color:#fff!important;font-size:16px!important;font-weight:500!important;text-align:center!important;text-shadow:0 1px 2px rgba(0,0,0,.8)!important}button{cursor:pointer}body{font-family:Arial,Helvetica,sans-serif;box-sizing:border-box}.video-wrapper{position:relative;font-family:Arial;height:calc(100vh - 16px)}.video-box{height:100%}.video-wrapper .video-box .video-js{padding:0;height:100%!important}.video-chapter{position:absolute;top:10px;width:min(360px,calc(100% - 20px));border:1px solid rgba(255,255,255,.12);border-radius:12px;height:calc(100% - 80px);background:rgba(18,18,18,.96);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);overflow:hidden;box-shadow:0 12px 30px #00000073;right:10px}.chapter-head{padding:12px 8px 10px 16px;position:sticky;top:0;left:0;background:linear-gradient(180deg,rgba(28,28,28,.95),rgba(18,18,18,.95));border-bottom:1px solid rgba(255,255,255,.08);z-index:2}.playlist-title{display:flex;align-items:center;gap:10px}.chapter-title{width:auto;flex:1;min-width:0}.chapter-title h3{margin:0;padding:0}.chapter-title h3 a{color:#fff;font-size:18px;line-height:26px;font-weight:700;text-decoration:none;white-space:nowrap;text-overflow:ellipsis;height:28px;overflow:hidden;display:block}.chapter-title p{margin:4px 0 0;padding:0;color:#bdbdbd;font-size:12px;font-weight:400;line-height:15px}.chapter-title p a{color:#bdbdbd;font-size:12px;font-weight:400;line-height:15px;text-decoration:none}.chapter-close{width:40px;margin-left:auto;display:flex;align-items:center;justify-content:flex-end}.chapter-close button{background:transparent;color:#fff;border:0;width:40px;height:40px;padding:0;display:flex;align-items:center;justify-content:center;border-radius:8px}.chapter-close button:hover{background:rgba(255,255,255,.1)}.playlist-action-menu{display:none;justify-content:space-between;gap:10px}.playlist-action-menu button{background:transparent;border:0;width:40px;height:40px;padding:0;display:flex;justify-content:center;align-items:center;border-radius:100px}.playlist-action-menu button:hover{background:rgba(0,0,0,.1)}.start-action{display:flex}.chapter-body{height:calc(100% - 59px);overflow:auto}.chapter-body ul{margin:0;padding:0}.playlist-items a{padding:12px;display:flex;align-items:center;text-decoration:none;gap:12px;width:100%;box-sizing:border-box}.playlist-items a:hover{background:rgba(255,255,255,.06)}.playlist-items.selected a{background:rgba(255,255,255,.14)}.playlist-drag-handle{width:24px;display:flex;justify-content:center;color:#e0e0e0;font-size:12px}.thumbnail-meta{flex:1;min-width:0;padding:0}.thumbnail-meta h4{margin:0 2px 4px 0;font-size:14px;line-height:20px;font-weight:600;overflow:hidden;text-overflow:ellipsis;color:#fff;white-space:normal;max-height:40px;-webkit-line-clamp:2;line-clamp:2;display:-webkit-box;-webkit-box-orient:vertical}.thumbnail-meta .meta-sub{display:flex;gap:8px;align-items:center}.thumbnail-meta .meta-sub .meta-dynamic{color:#bdbdbd;font-size:12px;line-height:18px}.thumbnail-action button{border:0;background:transparent;color:#fff;opacity:0}.playlist-items a:hover .thumbnail-action button{opacity:1}.chapter-body::-webkit-scrollbar{width:10px}.chapter-body::-webkit-scrollbar-thumb{background:rgba(255,255,255,.18);border-radius:8px}.chapter-body::-webkit-scrollbar-track{background:transparent}.video-box .video-js .vjs-control-bar .vjs-spacer-control{margin-left:auto}.video-js .vjs-control-bar .settings-item-svg{display:flex}.video-js .vjs-control-bar .settings-item-svg svg{width:auto!important;height:auto!important;transform:inherit!important}.vjs-svg-icon{display:inline-block;background-repeat:no-repeat;background-position:center;fill:currentColor;height:1.8em;width:1.8em}.vjs-svg-icon:before{content:none!important}.vjs-svg-icon:hover,.vjs-control:focus .vjs-svg-icon{filter:drop-shadow(0 0 .25em #fff)}.vjs-modal-dialog .vjs-modal-dialog-content,.video-js .vjs-modal-dialog,.vjs-button>.vjs-icon-placeholder:before,.video-js .vjs-big-play-button .vjs-icon-placeholder:before{position:absolute;top:0;left:0;width:100%;height:100%}.vjs-button>.vjs-icon-placeholder:before,.video-js .vjs-big-play-button .vjs-icon-placeholder:before{text-align:center}@font-face{font-family:VideoJS;src:url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAABTsAAsAAAAAIpAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADsAAABUIIslek9TLzIAAAFEAAAAPgAAAFZRiV32Y21hcAAAAYQAAAEJAAAD5p42+VxnbHlmAAACkAAADtIAABckI4l972hlYWQAABFkAAAAKwAAADYsvIjpaGhlYQAAEZAAAAAdAAAAJA+RCL1obXR4AAARsAAAABcAAAC8Q2YAAGxvY2EAABHIAAAAYAAAAGB7CIGGbWF4cAAAEigAAAAfAAAAIAFAAI9uYW1lAAASSAAAASUAAAIK1cf1oHBvc3QAABNwAAABfAAAAnXdFqh1eJxjYGRgYOBiMGCwY2BycfMJYeDLSSzJY5BiYGGAAJA8MpsxJzM9kYEDxgPKsYBpDiBmg4gCACY7BUgAeJxjYGR7yDiBgZWBgaWQ5RkDA8MvCM0cwxDOeI6BgYmBlZkBKwhIc01hcPjI+FGPHcRdyA4RZgQRADaGCyYAAHic7dPXbcMwAEXRK1vuvffem749XAbKV3bjBA6fXsaIgMMLEWoQJaAEFKNnlELyQ4K27zib5PNF6vl8yld+TKr5kH0+cUw0xv00Hwvx2DResUyFKrV4XoMmLdp06NKjz4AhI8ZMmDJjzoIlK9Zs2LJjz4EjJ85cuHLjziPe/0UWL17mf2tqKLz/9jK9f8tXpGCoRdPKhtS0RqFkWvVQNtSKoVYNtWaoddPXEBqG2jQ9XWgZattQO4baNdSeofYNdWCoQ0MdGerYUCeGOjXUmaHODXVhqEtDXRnq2lA3hro11J2h7g31YKhHQz0Z6tlQL4Z6NdSbod4N9WGoT9MfHF6GmhnZLxyDcRMAAAB4nJ1YC1hU17U+a5/HMA4iA3NmVBDmoQwP5TFnHlFeA4gYiUFRQINoSCBAyK3G2yi+0aipYtFcHYo2xsb4NiY3+VrNxSaX5uvt495ozNdoYoxmem2/L8HGpLc+InB279pnhlGr5mvL4eyz99nrrL32eu1/DQcc/okdYgdHOA6MQKp4r9gx0EcMHMezOalVasW5BM7NcXoSb9fFgE6KtSSBxWz1FYDPG+vMBGcKb9cebu2VS5s2aaTkCvRSf6C7Y+Ppibm5E09v7IDs2/3uZQtbD0zIyppwoHXh/93ukmyYgdePNRp65p5v+3v/9otQl2O7wP34cT88p8Md2YxpYLQZoRcy6FlSBRnwnGAe6BPMSCZo+7NJVqS0cE4uHendzhSnbPH6TDqL1+Nme5LZXkCHnGyoH0kne30WH+gswhm3q+pt/mTas9NLS64GnjmSlTPw0wVQT/ewRaBgxtydy3cuUB9/6SW+vb5yRvr+t0eOfPKJZ/9t3+4tL7xj32Xd3thCxi+ge6ifdsAN+l5+wi5HQ/cCoeull1AszS7CUfEcJzK7sKWJAdJhCd0sPM4+EY7QDm5ov08hXRQXE5bf6PV5Q5+IjW7X7Nku92Ask4l2hCRRD6TPqISiCJeQna3SCFwrhrNzXHzo4yFevBwxpzxk8WCIIfkvVEKVy32SbT8n68gzgaslpaiO2zIGIyuSb7RNf9HSuN26y/7OC1tgEmpiyA6aD4qcgTOiLThwGG0eB694FI8NHLLN6OBlRVaMxNAFS4JdXUG6mW8PwpKuYLCLXKGbu8iwYNdgO06Sn3Th+/vyZAxs8Ro30DjHe9gy8Fywi24OMm7Qyzh3MTZVOMYhLBnoC+J79lpTUyQmorjhnMwlcQ5uPEYGpDjsOkkH49BjQLQBqs3jFtFdJNlksYmoQFDArLh8Xh+Qd6Ghcsb6FUuehDi+U/lqD71K/qiegeV1imcwjl7ExwiSrf4BZyCujV6cVcFo6VX+G9IcPyFjJnUufbU/jzrL1X99as36reXl8K32nFaOr+E8jWJEcJ55DpMVfSMe95/AJaOsGBH2GJCNpiRQbK4C8BjdmQA22QY2j03Em13i2YHqtNLU1NI04Yj2HJgA6fQc6VPNpA/D+Ryks554NnVy2mB72uRUfPLsqR4N0LOBQKArwJYO+5W2fgZX8oC1HR6HjNaQTVIG2FPwnTcXXGZZfNB7TE6pTKZUwaw91XWLAoFFGcnB5PHjsckgBjbWutrL+0h5Y1xw3DRGDumsnXb3MJwXrJIN5U7m0rgJ3yG5w4he5ckFG4pmNEkOm0/xOO4r4yL87wqtQM+hiJIVp+6iG2wPBKD35ElGkDx+UfC2v1mFG1o+M3AjNFty8biKMXwzyxnZLds8wYD2BxmCPHAldPOeLsy/0BugftYhVYFAhO8SqQ0j3oK7dHJZnI/jxmUS4onlxskSF8thmvNZjIrRZwEPxr0lBuLRuz3oy/FOHCsxwOPYh2M+e9u3J5pgPYz9gp6G7C9m0A11F9ddqKMfV+4sbq45/YspOysXvT+3pdFdYNg2fHbW8Dz301MqDVuGrz0Fuh0YMW8mddrpqzST7rV9BcvqPoNvadRndWp0p8HvbiqrFj5yFQ/vNFSXDpxpLEFWp+DcrF3FT1afWshFcmCfeAMjEvO65i0Y6XijQfSRPWx3TV/Df7Km3E1l+kLt56s/rwVzuRusNMhudznkwdLaS+QNdeal2jDPP4l9qHc98vTYZOSkxzD+njBWVWjFPKgipx6DkWvXQiW8OYcewVHE5yukinDMcfGgc0opDltYKDxIGBedkzc6jSfE7tlvESCDFUw0Hx0opS+U0lHCxNottbNWSxX9zZVvEhKWUSyBpaXwBc2a98M6UqPeXAs/GDon8Ax7hsthO8cM5HU7Ad0UvRR9lHmtyQKZ4MAe814X5h9MSUkQmhf96eVJ6p90OjIiqSIjvykvr2l5U55O/fPQKD+jIomYpNyGJQ25uQ2kIikRfAmuBHCPsWqkSDEqgZ5KDI2sifS/R43MbZg0idFHbCPNxXxZws1ACVE6hAhOdJwRkJLFBLPZpRGYJ50pko6XzMkgmSx40ljik6AQcKhFnLcQE6rF7PXFe1Ocoj0T3AXgSgJTDIhHRfHlYZKuSzc6uievOJGXY+i5GJkkTp7UM3y0LqATDbtFcbdBxO7o4T25JYlEjoH0uynUh8rapkxp62QN70svSF+hT4gGPlovlmcm/ComLi7mV4kTykV9NFWjE/QrwgQ4uIcAP0rQF4VZYRP2o3PhHHzfPMJj9Ir+uzKUlrH49ntT18AVvj1sc3YGjUT/Mt2Dxawa8ArcA7bCQIpvfwAYu22vEG/No/5RvPdA7g+AelLrPwzy+LtkLPhnpIxH14m4EYq8eeMHbPEPNm6G7Nv9B4jcFPZ8bJj0SEjP3MPgQdKTqqEoy2v6G32P/Y6dxOv04AxnoAeq+GILvUavtYCBXm+BaIhuodcfrN5B/V2EYMCPh+SxavjGyPwV0x4CJgUPGT0mQaODGBACIJZGsMXwAD0LGXx7l3CdAcKMIKI+f5CepWeD0BvyU/GcdBxPF8SwejC6LGZmAURFdsSWKR5HyHld2kbdIZO1Ixx+bnnzU7n5+blPNV9jnUDWhP2tC68tbN3PVIldsQPxSAcSpjOav7Q05uXn5zW2LLvDXn9B6syscPy9iDLEMmSrJz6nYuWMipukjM0AH8JkGS+XFyMRkzSCH7KD/hwm172SAyZYumHlefr5AddrtA0O0TnwaVZxcRY9Bfukn9Gf05N1r9DV9MoBsJ1f+ZrqUvtPHizJAntWybv7hmqLt6QLuK6ZS9Fqi1jO5rDoWPZXXII5Tgajg53cIXCjDCGIcYrRIY2n6+mXOa/W0bdhau3ryiEYe2FV/5oeaIYK/5w5frCyll6/cYO8DiNhw6t1MBWmznt91QX62UF1N7l0eHBZTRGpKaqpKVIPF9UcIzmReud9TSY75+K899GHbBu6wjoR7RKKZVYiYxSPf5/2wJT5e3NAhmUbVn5KLx1Ujg0+BGvpAIh0DezInTkzF37KVocxrKU3r1+XLtAe2lO3l66kfQfB/unKY+q8N375Ru8bc4pJXfEcESU95q+p8ZNZRTWH1d9FzvUdYXk5rLkcdkEisoKKVHQW/b3GEx6tPaYcoJfOr9wAbSBnv1IHpep0OExr4LPMkpJM+j7sly7UHkOzXjoAZljHCGiyegtNlwljM0v+c19ET9Pvst09a2Mtgcf5/ZSzYO5h1156+eyydfAsxGa9XAuF6vzjh6CssLq6ECysperXX0sX5h5ZdpZe3guxsGIPEtHk/aqXX1hVqP5HYVVVISkrrNqvXorIc+5Ou91Hnr/LcD2afi6eX7UBloOcs7cOpqgGaNfs1g7bNbs9z6wASaylN69d0/TFTIz6Ws8+oGV3mE2612wRTHKcVUbhjKadebloMc+dyXgMVtVK6BwMB/+mVW09igdRBWaRtNQX59d/VD//xdQ0TCiYNj1KT9sq6Wdu5WTbqk3qDXyDaLa1fv621LS01G3z61sD6lH8lAxDLicV921s6Bf92JOYvzNYCL1khbqBXEFUzC521N5NyzNaQIWhjyFyDoBIVrAjmv2UEaLlI+c6zw1jmVIPLLLZZUTj6GxGHW+mq1tgHXR2D85p4Q934+jLbtjVLcyCdS10NVzpHqxp4Q/hK7WopY/NRGx9HGsPGdFjOjcpjBnGYMVqY/4eqT5khWEHWUup2A/pTw7pdWgsWft7ETUERL96nRg0HNFPmCYba6pylECaExX89A9WLUOVB4oKLu/o1oqSYHCgLzBUlAz8hNFDRpeSU1XT+LRmDUgPaKbYdHDn9suF/tu13nHJij0N97LfS0QmqONuyONk7zvUI6Qa0pF9f2+oABL92AT6e0U//z9YqAiWtJLU1JK0gS+1aacwamiNqK067u9ZQ8f1d4qLodMzz3uL89Z68V/Hnr++hXWUuHgw8dfi972PeTyPefu3aNNucemQ74qFuIaJnVkOu4Q+yjuwmmC1FqZpl1i4uzoPxjkpPf3Xv545tl26Rr+dOvUd+omqJzch9dOeU7f10Y64nMcKK137DccIZq2WdXtdZjbEoLSzHwiMtrjYLDxpHQW8gjMX6XFYAE2zSWVD04EGYSs9MbO6sEo20BMEAB4mpvSypsKjZ4Stgzb+c3A9/MQT2+vrBy+qvyFxLUtLlSRF/Ri2wjfZ2dus2Q8lXx4608/jnqK5OOap6NY2PSjYYnECCjiEeLJll/pbmqfeIK+ps3+MxrlEhqmTPipVP7kqlF4VhpEb6r+Q7YOJg38kJ9SHBf3NBl6+9YchfbUjb5ahLSzUM3kPHmwFAsZ5rpai0S7E5xWzZ1j+fW7zsUWP2g5NXTw52ySCTrgG0+lbw60l2Y/CB185CoA8NK+tbRKxfjy6pm5hzQRRR+cMqv1Jbiw6STivtEvt3DRcy0QEh92JlUGo2PG4tSKHl00YD6xc8CK+YPYyy3io2lN8BcSjKRzrIV6ypOAobqxViJPaT9M9Hy5szY33mp7OX/Zu89L/7Ww5vqY2Y8b0pKgoiUhG5cPDPzq8qTV/WkzUOIvXVVA96kmjcBrr3HrYC/Wn+fYP6Z7T1rqy3zknbvqma/FvVk96fNXGkuaXrdHW5JGSxZT/2I/O73v+yNWafMdzc5NdxYurHs6h86e01sLKLz9EBrg+x36rxAaED7hRnAMx7Vzu+9wabh3zG8XLQjx0ablUJzmxdErxYT3kzQSd0SSafVqF5PXgpp0OyYJ1EyNHpGUZmvK575ySzd85JSqF7IBzSAbMM04+MbE58xF3/njXOGecSaermlw2y9PsSQdytLJVr8t+wg+rR8cZYoeNxVIzNdk3Bngi8U5LAlgTFoQnzJCa5EsCgYhCaGL+qPj7TdhG31p9tej3R04N//PXxNwJvyUqwaJqRPJY98TJ5TPndmflRAkAhBfe46sfKW5wizSge08Xb7Ca/GUVs55trngkKkrUS2WPzKttaaqq+idmahugkY+W6fN0I6i3gPt/x88U4wAAeJxjYGRgYADiGU9YXsXz23xl4GZnAIFH7fO+IdMc/WBxDgYmEAUASbMKwAB4nGNgZGBgZwABjj4Ghv//OfoZGBlQgT4ARicDZAAAAHicY2BgYGAfxJijD8Fmu4EqBwCSpgKpAAAAAAAADgBoAH4AzADgAQIBQgFsAZgB7gIuAooC0AL8A2IDjAOoA+AEMASwBNoFCAVaBcAGCAYuBnAGrAb2B04HigfSCCoIcAiGCJwIyAkkCVYJiAmsCfIKIApWCsQLknicY2BkYGDQZ2hmYGcAASYg5gJCBob/YD4DABqrAdAAeJxdkE1qg0AYhl8Tk9AIoVDaVSmzahcF87PMARLIMoFAl0ZHY1BHdBJIT9AT9AQ9RQ9Qeqy+yteNMzDzfM+88w0K4BY/cNAMB6N2bUaPPBLukybCLvleeAAPj8JD+hfhMV7hC3u4wxs7OO4NzQSZcI/8Ltwnfwi75E/hAR7wJTyk/xYeY49fYQ/PztM+jbTZ7LY6OWdBJdX/pqs6NYWa+zMxa13oKrA6Uoerqi/JwtpYxZXJ1coUVmeZUWVlTjq0/tHacjmdxuL90OR8O0UEDYMNdtiSEpz5XQGqzlm30kzUdAYFFOb8R7NOZk0q2lwAyz1i7oAr1xoXvrOgtYhZx8wY5KRV269JZ5yGpmzPTjQhvY9je6vEElPOuJP3mWKnP5M3V+YAAAB4nG2ReVPbMBDF/ULi2EkDBFqO3gdHLxUzDB9IkdexBllydRD49ihO3Ckz7B/a31utZnafkkGyiXnyclxhgB0MMUKKMTLkmGCKV5hhF3vYxxwHOMRrvMERjnGCU7zFO7zHB3zEJ3zGF3zFN5zhHBe4xHf8wE/8wm8w/MEVimTYKv44XR9MSCsUjVoeHE3vjQoNsSZ4mmxZmVWPjSz7jlou6/0qKOWEJdKMtCe793/hQfqxa6XWZHMXFl56RS4TvPXSaDeoy0zUUZB109KstDK8lHo5q6Qi1hcOnqkImubPS6aqRq7mlnaEWabub4iYblba3SRmgldS0+FWdhNtt04F14JUaqkl7tcpOpJtErvNt3Bd9HRT5JWxK25Ldjvp6br4hzfFiIdSmlzTg2fSUzNrLd1LE1ynxq4OVaVoKLjzJ60UPtj1RKzHzsbjly6inVnFBS2MucviPncU7Rr7lfTxRepDs1A2j3ZHRc7PuzFYSfE3ZOd4kjwBy227hA==) format("woff");font-weight:400;font-style:normal}.vjs-icon-play,.video-js .vjs-play-control .vjs-icon-placeholder,.video-js .vjs-big-play-button .vjs-icon-placeholder:before{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-play:before,.video-js .vjs-play-control .vjs-icon-placeholder:before,.video-js .vjs-big-play-button .vjs-icon-placeholder:before{content:""}.vjs-icon-play-circle{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-play-circle:before{content:""}.vjs-icon-pause,.video-js .vjs-play-control.vjs-playing .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-pause:before,.video-js .vjs-play-control.vjs-playing .vjs-icon-placeholder:before{content:""}.vjs-icon-volume-mute,.video-js .vjs-mute-control.vjs-vol-0 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-volume-mute:before,.video-js .vjs-mute-control.vjs-vol-0 .vjs-icon-placeholder:before{content:""}.vjs-icon-volume-low,.video-js .vjs-mute-control.vjs-vol-1 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-volume-low:before,.video-js .vjs-mute-control.vjs-vol-1 .vjs-icon-placeholder:before{content:""}.vjs-icon-volume-mid,.video-js .vjs-mute-control.vjs-vol-2 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-volume-mid:before,.video-js .vjs-mute-control.vjs-vol-2 .vjs-icon-placeholder:before{content:""}.vjs-icon-volume-high,.video-js .vjs-mute-control .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-volume-high:before,.video-js .vjs-mute-control .vjs-icon-placeholder:before{content:""}.vjs-icon-fullscreen-enter,.video-js .vjs-fullscreen-control .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-fullscreen-enter:before,.video-js .vjs-fullscreen-control .vjs-icon-placeholder:before{content:""}.vjs-icon-fullscreen-exit,.video-js.vjs-fullscreen .vjs-fullscreen-control .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-fullscreen-exit:before,.video-js.vjs-fullscreen .vjs-fullscreen-control .vjs-icon-placeholder:before{content:""}.vjs-icon-spinner{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-spinner:before{content:""}.vjs-icon-subtitles,.video-js .vjs-subs-caps-button .vjs-icon-placeholder,.video-js.video-js:lang(en-GB) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js.video-js:lang(en-IE) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js.video-js:lang(en-AU) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js.video-js:lang(en-NZ) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js .vjs-subtitles-button .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-subtitles:before,.video-js .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js.video-js:lang(en-GB) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js.video-js:lang(en-IE) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js.video-js:lang(en-AU) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js.video-js:lang(en-NZ) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js .vjs-subtitles-button .vjs-icon-placeholder:before{content:""}.vjs-icon-captions,.video-js:lang(en) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js:lang(fr-CA) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js .vjs-captions-button .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-captions:before,.video-js:lang(en) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js:lang(fr-CA) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js .vjs-captions-button .vjs-icon-placeholder:before{content:""}.vjs-icon-hd{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-hd:before{content:""}.vjs-icon-chapters,.video-js .vjs-chapters-button .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-chapters:before,.video-js .vjs-chapters-button .vjs-icon-placeholder:before{content:""}.vjs-icon-downloading{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-downloading:before{content:""}.vjs-icon-file-download{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-file-download:before{content:""}.vjs-icon-file-download-done{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-file-download-done:before{content:""}.vjs-icon-file-download-off{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-file-download-off:before{content:""}.vjs-icon-share{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-share:before{content:""}.vjs-icon-cog{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-cog:before{content:""}.vjs-icon-square{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-square:before{content:""}.vjs-icon-circle,.vjs-seek-to-live-control .vjs-icon-placeholder,.video-js .vjs-volume-level,.video-js .vjs-play-progress{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-circle:before,.vjs-seek-to-live-control .vjs-icon-placeholder:before,.video-js .vjs-volume-level:before,.video-js .vjs-play-progress:before{content:""}.vjs-icon-circle-outline{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-circle-outline:before{content:""}.vjs-icon-circle-inner-circle{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-circle-inner-circle:before{content:""}.vjs-icon-cancel,.video-js .vjs-control.vjs-close-button .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-cancel:before,.video-js .vjs-control.vjs-close-button .vjs-icon-placeholder:before{content:""}.vjs-icon-repeat{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-repeat:before{content:""}.vjs-icon-replay,.video-js .vjs-play-control.vjs-ended .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-replay:before,.video-js .vjs-play-control.vjs-ended .vjs-icon-placeholder:before{content:""}.vjs-icon-replay-5,.video-js .vjs-skip-backward-5 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-replay-5:before,.video-js .vjs-skip-backward-5 .vjs-icon-placeholder:before{content:""}.vjs-icon-replay-10,.video-js .vjs-skip-backward-10 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-replay-10:before,.video-js .vjs-skip-backward-10 .vjs-icon-placeholder:before{content:""}.vjs-icon-replay-30,.video-js .vjs-skip-backward-30 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-replay-30:before,.video-js .vjs-skip-backward-30 .vjs-icon-placeholder:before{content:""}.vjs-icon-forward-5,.video-js .vjs-skip-forward-5 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-forward-5:before,.video-js .vjs-skip-forward-5 .vjs-icon-placeholder:before{content:""}.vjs-icon-forward-10,.video-js .vjs-skip-forward-10 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-forward-10:before,.video-js .vjs-skip-forward-10 .vjs-icon-placeholder:before{content:""}.vjs-icon-forward-30,.video-js .vjs-skip-forward-30 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-forward-30:before,.video-js .vjs-skip-forward-30 .vjs-icon-placeholder:before{content:""}.vjs-icon-audio,.video-js .vjs-audio-button .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-audio:before,.video-js .vjs-audio-button .vjs-icon-placeholder:before{content:""}.vjs-icon-next-item{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-next-item:before{content:""}.vjs-icon-previous-item{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-previous-item:before{content:""}.vjs-icon-shuffle{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-shuffle:before{content:""}.vjs-icon-cast{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-cast:before{content:""}.vjs-icon-picture-in-picture-enter,.video-js .vjs-picture-in-picture-control .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-picture-in-picture-enter:before,.video-js .vjs-picture-in-picture-control .vjs-icon-placeholder:before{content:""}.vjs-icon-picture-in-picture-exit,.video-js.vjs-picture-in-picture .vjs-picture-in-picture-control .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-picture-in-picture-exit:before,.video-js.vjs-picture-in-picture .vjs-picture-in-picture-control .vjs-icon-placeholder:before{content:""}.vjs-icon-facebook{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-facebook:before{content:""}.vjs-icon-linkedin{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-linkedin:before{content:""}.vjs-icon-twitter{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-twitter:before{content:""}.vjs-icon-tumblr{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-tumblr:before{content:""}.vjs-icon-pinterest{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-pinterest:before{content:""}.vjs-icon-audio-description,.video-js .vjs-descriptions-button .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-audio-description:before,.video-js .vjs-descriptions-button .vjs-icon-placeholder:before{content:""}.video-js{display:inline-block;vertical-align:top;box-sizing:border-box;color:#fff;background-color:#000;position:relative;padding:0;font-size:10px;line-height:1;font-weight:400;font-style:normal;font-family:Arial,Helvetica,sans-serif;word-break:initial}.video-js:-moz-full-screen{position:absolute}.video-js:-webkit-full-screen{width:100%!important;height:100%!important}.video-js[tabindex="-1"]{outline:none}.video-js *,.video-js *:before,.video-js *:after{box-sizing:inherit}.video-js ul{font-family:inherit;font-size:inherit;line-height:inherit;list-style-position:outside;margin:0}.video-js.vjs-fluid,.video-js.vjs-16-9,.video-js.vjs-4-3,.video-js.vjs-9-16,.video-js.vjs-1-1{width:100%;max-width:100%}.video-js.vjs-fluid:not(.vjs-audio-only-mode),.video-js.vjs-16-9:not(.vjs-audio-only-mode),.video-js.vjs-4-3:not(.vjs-audio-only-mode),.video-js.vjs-9-16:not(.vjs-audio-only-mode),.video-js.vjs-1-1:not(.vjs-audio-only-mode){height:0}.video-js.vjs-16-9:not(.vjs-audio-only-mode){padding-top:56.25%}.video-js.vjs-4-3:not(.vjs-audio-only-mode){padding-top:75%}.video-js.vjs-9-16:not(.vjs-audio-only-mode){padding-top:177.7777777778%}.video-js.vjs-1-1:not(.vjs-audio-only-mode){padding-top:100%}.video-js.vjs-fill:not(.vjs-audio-only-mode){width:100%;height:100%}.video-js .vjs-tech{position:absolute;top:0;left:0;width:100%;height:100%}.video-js.vjs-audio-only-mode .vjs-tech{display:none}body.vjs-full-window,body.vjs-pip-window{padding:0;margin:0;height:100%}.vjs-full-window .video-js.vjs-fullscreen,body.vjs-pip-window .video-js{position:fixed;overflow:hidden;z-index:1000;left:0;top:0;bottom:0;right:0}.video-js.vjs-fullscreen:not(.vjs-ios-native-fs),body.vjs-pip-window .video-js{width:100%!important;height:100%!important;padding-top:0!important;display:block}.video-js.vjs-fullscreen.vjs-user-inactive{cursor:none}.vjs-pip-container .vjs-pip-text{position:absolute;bottom:10%;font-size:2em;background-color:#000000b3;padding:.5em;text-align:center;width:100%}.vjs-layout-tiny.vjs-pip-container .vjs-pip-text,.vjs-layout-x-small.vjs-pip-container .vjs-pip-text,.vjs-layout-small.vjs-pip-container .vjs-pip-text{bottom:0;font-size:1.4em}.vjs-hidden{display:none!important}.vjs-disabled{opacity:.5;cursor:default}.video-js .vjs-offscreen{height:1px;left:-9999px;position:absolute;top:0;width:1px}.vjs-lock-showing{display:block!important;opacity:1!important;visibility:visible!important}.vjs-no-js{padding:20px;color:#fff;background-color:#000;font-size:18px;font-family:Arial,Helvetica,sans-serif;text-align:center;width:300px;height:150px;margin:0 auto}.vjs-no-js a,.vjs-no-js a:visited{color:#66a8cc}.video-js .vjs-big-play-button{font-size:3em;line-height:1.5em;height:1.63332em;width:3em;display:block;position:absolute;top:50%;left:50%;padding:0;margin-top:-.81666em;margin-left:-1.5em;cursor:pointer;opacity:1;border:.06666em solid #fff;background-color:#2b333f;background-color:#2b333fb3;border-radius:.3em;transition:all .4s}.vjs-big-play-button .vjs-svg-icon{width:1em;height:1em;position:absolute;top:50%;left:50%;line-height:1;transform:translate(-50%,-50%)}.video-js:hover .vjs-big-play-button,.video-js .vjs-big-play-button:focus{border-color:#fff;background-color:#73859f;background-color:#73859f80;transition:all 0s}.vjs-controls-disabled .vjs-big-play-button,.vjs-has-started .vjs-big-play-button,.vjs-using-native-controls .vjs-big-play-button,.vjs-error .vjs-big-play-button{display:none}.vjs-has-started.vjs-paused.vjs-show-big-play-button-on-pause:not(.vjs-seeking,.vjs-scrubbing,.vjs-error) .vjs-big-play-button{display:block}.video-js button{background:none;border:none;color:inherit;display:inline-block;font-size:inherit;line-height:inherit;text-transform:none;text-decoration:none;transition:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.video-js.vjs-spatial-navigation-enabled .vjs-button:focus{outline:.0625em solid white;box-shadow:none}.vjs-control .vjs-button{width:100%;height:100%}.video-js .vjs-control.vjs-close-button{cursor:pointer;height:3em;position:absolute;right:0;top:.5em;z-index:2}.video-js .vjs-modal-dialog{background:rgba(0,0,0,.8);background:linear-gradient(180deg,rgba(0,0,0,.8),rgba(255,255,255,0));overflow:auto}.video-js .vjs-modal-dialog>*{box-sizing:border-box}.vjs-modal-dialog .vjs-modal-dialog-content{font-size:1.2em;line-height:1.5;padding:20px 24px;z-index:1}.vjs-menu-button{cursor:pointer}.vjs-menu-button.vjs-disabled{cursor:default}.vjs-workinghover .vjs-menu-button.vjs-disabled:hover .vjs-menu{display:none}.vjs-menu .vjs-menu-content{display:block;padding:0;margin:0;font-family:Arial,Helvetica,sans-serif;overflow:auto}.vjs-menu .vjs-menu-content>*{box-sizing:border-box}.vjs-scrubbing .vjs-control.vjs-menu-button:hover .vjs-menu{display:none}.vjs-menu li{display:flex;justify-content:center;list-style:none;margin:0;padding:.2em 0;line-height:1.4em;font-size:1.2em;text-align:center;text-transform:lowercase}.vjs-menu li.vjs-menu-item:focus,.vjs-menu li.vjs-menu-item:hover,.js-focus-visible .vjs-menu li.vjs-menu-item:hover{background-color:#73859f;background-color:#73859f80}.vjs-menu li.vjs-selected,.vjs-menu li.vjs-selected:focus,.vjs-menu li.vjs-selected:hover,.js-focus-visible .vjs-menu li.vjs-selected:hover{background-color:#fff;color:#2b333f}.vjs-menu li.vjs-selected .vjs-svg-icon,.vjs-menu li.vjs-selected:focus .vjs-svg-icon,.vjs-menu li.vjs-selected:hover .vjs-svg-icon,.js-focus-visible .vjs-menu li.vjs-selected:hover .vjs-svg-icon{fill:#000}.video-js .vjs-menu *:not(.vjs-selected):focus:not(:focus-visible),.js-focus-visible .vjs-menu *:not(.vjs-selected):focus:not(.focus-visible){background:none}.vjs-menu li.vjs-menu-title{text-align:center;text-transform:uppercase;font-size:1em;line-height:2em;padding:0;margin:0 0 .3em;font-weight:700;cursor:default}.vjs-menu-button-popup .vjs-menu{display:none;position:absolute;bottom:0;width:10em;left:-3em;height:0em;margin-bottom:1.5em;border-top-color:#2b333fb3}.vjs-pip-window .vjs-menu-button-popup .vjs-menu{left:unset;right:1em}.vjs-menu-button-popup .vjs-menu .vjs-menu-content{background-color:#2b333f;background-color:#2b333fb3;position:absolute;width:100%;bottom:1.5em;max-height:15em}.vjs-layout-tiny .vjs-menu-button-popup .vjs-menu .vjs-menu-content,.vjs-layout-x-small .vjs-menu-button-popup .vjs-menu .vjs-menu-content{max-height:5em}.vjs-layout-small .vjs-menu-button-popup .vjs-menu .vjs-menu-content{max-height:10em}.vjs-layout-medium .vjs-menu-button-popup .vjs-menu .vjs-menu-content{max-height:14em}.vjs-layout-large .vjs-menu-button-popup .vjs-menu .vjs-menu-content,.vjs-layout-x-large .vjs-menu-button-popup .vjs-menu .vjs-menu-content,.vjs-layout-huge .vjs-menu-button-popup .vjs-menu .vjs-menu-content{max-height:25em}.vjs-workinghover .vjs-menu-button-popup.vjs-hover .vjs-menu,.vjs-menu-button-popup .vjs-menu.vjs-lock-showing{display:block}.video-js .vjs-menu-button-inline{transition:all .4s;overflow:hidden}.video-js .vjs-menu-button-inline:before{width:2.222222222em}.video-js .vjs-menu-button-inline:hover,.video-js .vjs-menu-button-inline:focus,.video-js .vjs-menu-button-inline.vjs-slider-active{width:12em}.vjs-menu-button-inline .vjs-menu{opacity:0;height:100%;width:auto;position:absolute;left:4em;top:0;padding:0;margin:0;transition:all .4s}.vjs-menu-button-inline:hover .vjs-menu,.vjs-menu-button-inline:focus .vjs-menu,.vjs-menu-button-inline.vjs-slider-active .vjs-menu{display:block;opacity:1}.vjs-menu-button-inline .vjs-menu-content{width:auto;height:100%;margin:0;overflow:hidden}.video-js .vjs-control-bar{display:none;width:100%;position:absolute;bottom:0;left:0;right:0;height:3em;background-color:#2b333f;background-color:#2b333fb3}.video-js.vjs-spatial-navigation-enabled .vjs-control-bar{gap:1px}.video-js:not(.vjs-controls-disabled,.vjs-using-native-controls,.vjs-error) .vjs-control-bar.vjs-lock-showing{display:flex!important}.vjs-has-started .vjs-control-bar,.vjs-audio-only-mode .vjs-control-bar{display:flex;visibility:visible;opacity:1;transition:visibility .1s,opacity .1s}.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar{visibility:visible;opacity:0;pointer-events:none;transition:visibility 1s,opacity 1s}.vjs-controls-disabled .vjs-control-bar,.vjs-using-native-controls .vjs-control-bar,.vjs-error .vjs-control-bar{display:none!important}.vjs-audio.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar,.vjs-audio-only-mode.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar{opacity:1;visibility:visible;pointer-events:auto}.video-js .vjs-control{position:relative;text-align:center;margin:0;padding:0;height:100%;width:4em;flex:none}.video-js .vjs-control.vjs-visible-text{width:auto;padding-left:1em;padding-right:1em}.vjs-button>.vjs-icon-placeholder:before{font-size:1.8em;line-height:1.67}.vjs-button>.vjs-icon-placeholder{display:block}.vjs-button>.vjs-svg-icon{display:inline-block}.video-js .vjs-control:focus:before,.video-js .vjs-control:hover:before,.video-js .vjs-control:focus{text-shadow:0em 0em 1em white}.video-js *:not(.vjs-visible-text)>.vjs-control-text{border:0;clip:rect(0 0 0 0);height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.video-js .vjs-custom-control-spacer{display:none}.video-js .vjs-progress-control{cursor:pointer;flex:auto;display:flex;align-items:center;min-width:4em;touch-action:none}.video-js .vjs-progress-control.disabled{cursor:default}.vjs-live .vjs-progress-control{display:none}.vjs-liveui .vjs-progress-control{display:flex;align-items:center}.video-js .vjs-progress-holder{flex:auto;transition:all .2s;height:.3em}.video-js .vjs-progress-control .vjs-progress-holder{margin:0 10px}.video-js .vjs-progress-control:hover .vjs-progress-holder,.video-js.vjs-scrubbing.vjs-touch-enabled .vjs-progress-control .vjs-progress-holder{font-size:1.6666666667em}.video-js .vjs-progress-control:hover .vjs-progress-holder.disabled{font-size:1em}.video-js .vjs-progress-holder .vjs-play-progress,.video-js .vjs-progress-holder .vjs-load-progress,.video-js .vjs-progress-holder .vjs-load-progress div{position:absolute;display:block;height:100%;margin:0;padding:0;width:0}.video-js .vjs-play-progress{background-color:#fff}.video-js .vjs-play-progress:before{font-size:.9em;position:absolute;right:-.5em;line-height:.35em;z-index:1}.vjs-svg-icons-enabled .vjs-play-progress:before{content:none!important}.vjs-play-progress .vjs-svg-icon{position:absolute;top:-.35em;right:-.4em;width:.9em;height:.9em;pointer-events:none;line-height:.15em;z-index:1}.video-js .vjs-load-progress{background:rgba(114.9141509434,132.7028301887,159.3858490566,.5)}.video-js .vjs-load-progress div{background:rgba(114.9141509434,132.7028301887,159.3858490566,.75)}.video-js .vjs-time-tooltip{background-color:#fff;background-color:#fffc;border-radius:.3em;color:#000;float:right;font-family:Arial,Helvetica,sans-serif;font-size:1em;padding:6px 8px 8px;pointer-events:none;position:absolute;top:-3.4em;visibility:hidden;z-index:1}.video-js .vjs-progress-holder:focus .vjs-time-tooltip{display:none}.video-js .vjs-progress-control:hover .vjs-time-tooltip,.video-js .vjs-progress-control:hover .vjs-progress-holder:focus .vjs-time-tooltip,.video-js.vjs-scrubbing.vjs-touch-enabled .vjs-progress-control .vjs-time-tooltip{display:block;font-size:.6em;visibility:visible}.video-js .vjs-progress-control.disabled:hover .vjs-time-tooltip{font-size:1em}.video-js .vjs-progress-control .vjs-mouse-display{display:none;position:absolute;width:1px;height:100%;background-color:#000;z-index:1}.video-js .vjs-progress-control:hover .vjs-mouse-display,.video-js.vjs-scrubbing.vjs-touch-enabled .vjs-progress-control .vjs-mouse-display{display:block}.video-js.vjs-user-inactive .vjs-progress-control .vjs-mouse-display,.video-js.vjs-touch-enabled:not(.vjs-scrubbing) .vjs-progress-control .vjs-mouse-display{visibility:hidden;opacity:0;transition:visibility 1s,opacity 1s}.vjs-mouse-display .vjs-time-tooltip{color:#fff;background-color:#000;background-color:#000c}.video-js .vjs-slider{position:relative;cursor:pointer;padding:0;margin:0 .45em;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;background-color:#73859f;background-color:#73859f80}.video-js .vjs-slider.disabled{cursor:default}.video-js .vjs-slider:focus{text-shadow:0em 0em 1em white;box-shadow:0 0 1em #fff}.video-js.vjs-spatial-navigation-enabled .vjs-slider:focus{outline:.0625em solid white}.video-js .vjs-mute-control{cursor:pointer;flex:none}.video-js .vjs-volume-control{cursor:pointer;margin-right:1em;display:flex}.video-js .vjs-volume-control.vjs-volume-horizontal{width:5em}.video-js .vjs-volume-panel .vjs-volume-control{visibility:visible;opacity:0;width:1px;height:1px;margin-left:-1px}.video-js .vjs-volume-panel{transition:width 1s}.video-js .vjs-volume-panel.vjs-hover .vjs-volume-control,.video-js .vjs-volume-panel:active .vjs-volume-control,.video-js .vjs-volume-panel:focus .vjs-volume-control,.video-js .vjs-volume-panel .vjs-volume-control:active,.video-js .vjs-volume-panel.vjs-hover .vjs-mute-control~.vjs-volume-control,.video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active{visibility:visible;opacity:1;position:relative;transition:visibility .1s,opacity .1s,height .1s,width .1s,left 0s,top 0s}.video-js .vjs-volume-panel.vjs-hover .vjs-volume-control.vjs-volume-horizontal,.video-js .vjs-volume-panel:active .vjs-volume-control.vjs-volume-horizontal,.video-js .vjs-volume-panel:focus .vjs-volume-control.vjs-volume-horizontal,.video-js .vjs-volume-panel .vjs-volume-control:active.vjs-volume-horizontal,.video-js .vjs-volume-panel.vjs-hover .vjs-mute-control~.vjs-volume-control.vjs-volume-horizontal,.video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active.vjs-volume-horizontal{width:5em;height:3em;margin-right:0}.video-js .vjs-volume-panel.vjs-hover .vjs-volume-control.vjs-volume-vertical,.video-js .vjs-volume-panel:active .vjs-volume-control.vjs-volume-vertical,.video-js .vjs-volume-panel:focus .vjs-volume-control.vjs-volume-vertical,.video-js .vjs-volume-panel .vjs-volume-control:active.vjs-volume-vertical,.video-js .vjs-volume-panel.vjs-hover .vjs-mute-control~.vjs-volume-control.vjs-volume-vertical,.video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active.vjs-volume-vertical{left:-3.5em;transition:left 0s}.video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-hover,.video-js .vjs-volume-panel.vjs-volume-panel-horizontal:active,.video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active{width:10em;transition:width .1s}.video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-mute-toggle-only{width:4em}.video-js .vjs-volume-panel .vjs-volume-control.vjs-volume-vertical{height:8em;width:3em;left:-3000em;transition:visibility 1s,opacity 1s,height 1s 1s,width 1s 1s,left 1s 1s,top 1s 1s}.video-js .vjs-volume-panel .vjs-volume-control.vjs-volume-horizontal{transition:visibility 1s,opacity 1s,height 1s 1s,width 1s,left 1s 1s,top 1s 1s}.video-js .vjs-volume-panel{display:flex}.video-js .vjs-volume-bar{margin:1.35em .45em}.vjs-volume-bar.vjs-slider-horizontal{width:5em;height:.3em}.vjs-volume-bar.vjs-slider-vertical{width:.3em;height:5em;margin:1.35em auto}.video-js .vjs-volume-level{position:absolute;bottom:0;left:0;background-color:#fff}.video-js .vjs-volume-level:before{position:absolute;font-size:.9em;z-index:1}.vjs-slider-vertical .vjs-volume-level{width:.3em}.vjs-slider-vertical .vjs-volume-level:before{top:-.5em;left:-.3em;z-index:1}.vjs-svg-icons-enabled .vjs-volume-level:before{content:none}.vjs-volume-level .vjs-svg-icon{position:absolute;width:.9em;height:.9em;pointer-events:none;z-index:1}.vjs-slider-horizontal .vjs-volume-level{height:.3em}.vjs-slider-horizontal .vjs-volume-level:before{line-height:.35em;right:-.5em}.vjs-slider-horizontal .vjs-volume-level .vjs-svg-icon{right:-.3em;transform:translateY(-50%)}.vjs-slider-vertical .vjs-volume-level .vjs-svg-icon{top:-.55em;transform:translate(-50%)}.video-js .vjs-volume-panel.vjs-volume-panel-vertical{width:4em}.vjs-volume-bar.vjs-slider-vertical .vjs-volume-level{height:100%}.vjs-volume-bar.vjs-slider-horizontal .vjs-volume-level{width:100%}.video-js .vjs-volume-vertical{width:3em;height:8em;bottom:8em;background-color:#2b333f;background-color:#2b333fb3}.video-js .vjs-volume-horizontal .vjs-menu{left:-2em}.video-js .vjs-volume-tooltip{background-color:#fff;background-color:#fffc;border-radius:.3em;color:#000;float:right;font-family:Arial,Helvetica,sans-serif;font-size:1em;padding:6px 8px 8px;pointer-events:none;position:absolute;top:-3.4em;visibility:hidden;z-index:1}.video-js .vjs-volume-control:hover .vjs-volume-tooltip,.video-js .vjs-volume-control:hover .vjs-progress-holder:focus .vjs-volume-tooltip{display:block;font-size:1em;visibility:visible}.video-js .vjs-volume-vertical:hover .vjs-volume-tooltip,.video-js .vjs-volume-vertical:hover .vjs-progress-holder:focus .vjs-volume-tooltip{left:1em;top:-12px}.video-js .vjs-volume-control.disabled:hover .vjs-volume-tooltip{font-size:1em}.video-js .vjs-volume-control .vjs-mouse-display{display:none;position:absolute;width:100%;height:1px;background-color:#000;z-index:1}.video-js .vjs-volume-horizontal .vjs-mouse-display{width:1px;height:100%}.video-js .vjs-volume-control:hover .vjs-mouse-display{display:block}.video-js.vjs-user-inactive .vjs-volume-control .vjs-mouse-display{visibility:hidden;opacity:0;transition:visibility 1s,opacity 1s}.vjs-mouse-display .vjs-volume-tooltip{color:#fff;background-color:#000;background-color:#000c}.vjs-poster{display:inline-block;vertical-align:middle;cursor:pointer;margin:0;padding:0;position:absolute;top:0;right:0;bottom:0;left:0;height:100%}.vjs-has-started .vjs-poster,.vjs-using-native-controls .vjs-poster{display:none}.vjs-audio.vjs-has-started .vjs-poster,.vjs-has-started.vjs-audio-poster-mode .vjs-poster,.vjs-pip-container.vjs-has-started .vjs-poster{display:block}.vjs-poster img{width:100%;height:100%;object-fit:contain}.video-js .vjs-live-control{display:flex;align-items:flex-start;flex:auto;font-size:1em;line-height:3em}.video-js:not(.vjs-live) .vjs-live-control,.video-js.vjs-liveui .vjs-live-control{display:none}.video-js .vjs-seek-to-live-control{align-items:center;cursor:pointer;flex:none;display:inline-flex;height:100%;padding-left:.5em;padding-right:.5em;font-size:1em;line-height:3em;width:auto;min-width:4em}.video-js.vjs-live:not(.vjs-liveui) .vjs-seek-to-live-control,.video-js:not(.vjs-live) .vjs-seek-to-live-control{display:none}.vjs-seek-to-live-control.vjs-control.vjs-at-live-edge{cursor:auto}.vjs-seek-to-live-control .vjs-icon-placeholder{margin-right:.5em;color:#888}.vjs-svg-icons-enabled .vjs-seek-to-live-control{line-height:0}.vjs-seek-to-live-control .vjs-svg-icon{width:1em;height:1em;pointer-events:none;fill:#888}.vjs-seek-to-live-control.vjs-control.vjs-at-live-edge .vjs-icon-placeholder{color:red}.vjs-seek-to-live-control.vjs-control.vjs-at-live-edge .vjs-svg-icon{fill:red}.video-js .vjs-time-control{flex:none;font-size:1em;line-height:3em;min-width:2em;width:auto;padding-left:1em;padding-right:1em}.vjs-live .vjs-time-control,.vjs-live .vjs-time-divider,.video-js .vjs-current-time,.video-js .vjs-duration{display:none}.vjs-time-divider{display:none;line-height:3em}.vjs-normalise-time-controls:not(.vjs-live) .vjs-time-control{display:flex}.video-js .vjs-play-control{cursor:pointer}.video-js .vjs-play-control .vjs-icon-placeholder{flex:none}.vjs-text-track-display{position:absolute;bottom:3em;left:0;right:0;top:0;pointer-events:none}.vjs-error .vjs-text-track-display{display:none}.video-js.vjs-controls-disabled .vjs-text-track-display,.video-js.vjs-user-inactive.vjs-playing .vjs-text-track-display{bottom:1em}.video-js .vjs-text-track{font-size:1.4em;text-align:center;margin-bottom:.1em}.vjs-subtitles{color:#fff}.vjs-captions{color:#fc6}.vjs-tt-cue{display:block}video::-webkit-media-text-track-display{transform:translateY(-3em)}.video-js.vjs-controls-disabled video::-webkit-media-text-track-display,.video-js.vjs-user-inactive.vjs-playing video::-webkit-media-text-track-display{transform:translateY(-1.5em)}.video-js.vjs-force-center-align-cues .vjs-text-track-cue{text-align:center!important;width:80%!important}@supports not (inset: 10px){.video-js .vjs-text-track-display>div{top:0;right:0;bottom:0;left:0}}.video-js .vjs-picture-in-picture-control{cursor:pointer;flex:none}.video-js.vjs-audio-only-mode .vjs-picture-in-picture-control,.vjs-pip-window .vjs-picture-in-picture-control{display:none}.video-js .vjs-fullscreen-control{cursor:pointer;flex:none}.video-js.vjs-audio-only-mode .vjs-fullscreen-control,.vjs-pip-window .vjs-fullscreen-control{display:none}.vjs-playback-rate>.vjs-menu-button,.vjs-playback-rate .vjs-playback-rate-value{position:absolute;top:0;left:0;width:100%;height:100%}.vjs-playback-rate .vjs-playback-rate-value{pointer-events:none;font-size:1.5em;line-height:2;text-align:center}.vjs-playback-rate .vjs-menu{width:4em;left:0}.vjs-error .vjs-error-display .vjs-modal-dialog-content{font-size:1.4em;text-align:center}.vjs-loading-spinner{display:none;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);opacity:.85;text-align:left;border:.6em solid rgba(43,51,63,.7);box-sizing:border-box;background-clip:padding-box;width:5em;height:5em;border-radius:50%;visibility:hidden}.vjs-seeking .vjs-loading-spinner,.vjs-waiting .vjs-loading-spinner{display:flex;justify-content:center;align-items:center;animation:vjs-spinner-show 0s linear .3s forwards}.vjs-error .vjs-loading-spinner{display:none}.vjs-loading-spinner:before,.vjs-loading-spinner:after{content:"";position:absolute;box-sizing:inherit;width:inherit;height:inherit;border-radius:inherit;opacity:1;border:inherit;border-color:transparent;border-top-color:#fff}.vjs-seeking .vjs-loading-spinner:before,.vjs-seeking .vjs-loading-spinner:after,.vjs-waiting .vjs-loading-spinner:before,.vjs-waiting .vjs-loading-spinner:after{animation:vjs-spinner-spin 1.1s cubic-bezier(.6,.2,0,.8) infinite,vjs-spinner-fade 1.1s linear infinite}.vjs-seeking .vjs-loading-spinner:before,.vjs-waiting .vjs-loading-spinner:before{border-top-color:#fff}.vjs-seeking .vjs-loading-spinner:after,.vjs-waiting .vjs-loading-spinner:after{border-top-color:#fff;animation-delay:.44s}@keyframes vjs-spinner-show{to{visibility:visible}}@keyframes vjs-spinner-spin{to{transform:rotate(360deg)}}@keyframes vjs-spinner-fade{0%{border-top-color:#73859f}20%{border-top-color:#73859f}35%{border-top-color:#fff}60%{border-top-color:#73859f}to{border-top-color:#73859f}}.video-js.vjs-audio-only-mode .vjs-captions-button{display:none}.vjs-chapters-button .vjs-menu ul{width:24em}.video-js.vjs-audio-only-mode .vjs-descriptions-button{display:none}.vjs-subs-caps-button+.vjs-menu .vjs-captions-menu-item .vjs-svg-icon{width:1.5em;height:1.5em}.video-js .vjs-subs-caps-button+.vjs-menu .vjs-captions-menu-item .vjs-menu-item-text .vjs-icon-placeholder{vertical-align:middle;display:inline-block;margin-bottom:-.1em}.video-js .vjs-subs-caps-button+.vjs-menu .vjs-captions-menu-item .vjs-menu-item-text .vjs-icon-placeholder:before{font-family:VideoJS;content:"";font-size:1.5em;line-height:inherit}.video-js.vjs-audio-only-mode .vjs-subs-caps-button{display:none}.video-js .vjs-audio-button+.vjs-menu .vjs-descriptions-menu-item .vjs-menu-item-text .vjs-icon-placeholder,.video-js .vjs-audio-button+.vjs-menu .vjs-main-desc-menu-item .vjs-menu-item-text .vjs-icon-placeholder{vertical-align:middle;display:inline-block;margin-bottom:-.1em}.video-js .vjs-audio-button+.vjs-menu .vjs-descriptions-menu-item .vjs-menu-item-text .vjs-icon-placeholder:before,.video-js .vjs-audio-button+.vjs-menu .vjs-main-desc-menu-item .vjs-menu-item-text .vjs-icon-placeholder:before{font-family:VideoJS;content:" ";font-size:1.5em;line-height:inherit}.video-js.vjs-layout-small .vjs-current-time,.video-js.vjs-layout-small .vjs-time-divider,.video-js.vjs-layout-small .vjs-duration,.video-js.vjs-layout-small .vjs-remaining-time,.video-js.vjs-layout-small .vjs-playback-rate,.video-js.vjs-layout-small .vjs-volume-control,.video-js.vjs-layout-x-small .vjs-current-time,.video-js.vjs-layout-x-small .vjs-time-divider,.video-js.vjs-layout-x-small .vjs-duration,.video-js.vjs-layout-x-small .vjs-remaining-time,.video-js.vjs-layout-x-small .vjs-playback-rate,.video-js.vjs-layout-x-small .vjs-volume-control,.video-js.vjs-layout-tiny .vjs-current-time,.video-js.vjs-layout-tiny .vjs-time-divider,.video-js.vjs-layout-tiny .vjs-duration,.video-js.vjs-layout-tiny .vjs-remaining-time,.video-js.vjs-layout-tiny .vjs-playback-rate,.video-js.vjs-layout-tiny .vjs-volume-control{display:none}.video-js.vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal:hover,.video-js.vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal:active,.video-js.vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active,.video-js.vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-hover,.video-js.vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal:hover,.video-js.vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal:active,.video-js.vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active,.video-js.vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-hover,.video-js.vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal:hover,.video-js.vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal:active,.video-js.vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active,.video-js.vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-hover{width:auto;width:initial}.video-js.vjs-layout-x-small .vjs-progress-control,.video-js.vjs-layout-tiny .vjs-progress-control{display:none}.video-js.vjs-layout-x-small .vjs-custom-control-spacer{flex:auto;display:block}.vjs-modal-dialog.vjs-text-track-settings{background-color:#2b333f;background-color:#2b333fbf;color:#fff;height:70%}.vjs-spatial-navigation-enabled .vjs-modal-dialog.vjs-text-track-settings{height:80%}.vjs-error .vjs-text-track-settings{display:none}.vjs-text-track-settings .vjs-modal-dialog-content{display:table}.vjs-text-track-settings .vjs-track-settings-colors,.vjs-text-track-settings .vjs-track-settings-font,.vjs-text-track-settings .vjs-track-settings-controls{display:table-cell}.vjs-text-track-settings .vjs-track-settings-controls{text-align:right;vertical-align:bottom}@supports (display: grid){.vjs-text-track-settings .vjs-modal-dialog-content{display:grid;grid-template-columns:1fr 1fr;grid-template-rows:1fr;padding:20px 24px 0}.vjs-track-settings-controls .vjs-default-button{margin-bottom:20px}.vjs-text-track-settings .vjs-track-settings-controls{grid-column:1/-1}.vjs-layout-small .vjs-text-track-settings .vjs-modal-dialog-content,.vjs-layout-x-small .vjs-text-track-settings .vjs-modal-dialog-content,.vjs-layout-tiny .vjs-text-track-settings .vjs-modal-dialog-content{grid-template-columns:1fr}}.vjs-text-track-settings select{font-size:inherit}.vjs-track-setting>select{margin-right:1em;margin-bottom:.5em}.vjs-text-track-settings fieldset{margin:10px;border:none}.vjs-text-track-settings fieldset span{display:inline-block;padding:0 .6em .8em}.vjs-text-track-settings fieldset span>select{max-width:7.3em}.vjs-text-track-settings legend{color:#fff;font-weight:700;font-size:1.2em}.vjs-text-track-settings .vjs-label{margin:0 .5em .5em 0}.vjs-track-settings-controls button:focus,.vjs-track-settings-controls button:active{outline-style:solid;outline-width:medium;background-image:linear-gradient(0deg,#fff 88%,rgb(114.9141509434,132.7028301887,159.3858490566) 100%)}.vjs-track-settings-controls button:hover{color:#2b333fbf}.vjs-track-settings-controls button{background-color:#fff;background-image:linear-gradient(-180deg,#fff 88%,rgb(114.9141509434,132.7028301887,159.3858490566) 100%);color:#2b333f;cursor:pointer;border-radius:2px}.vjs-track-settings-controls .vjs-default-button{margin-right:1em}.vjs-title-bar{background:rgba(0,0,0,.9);background:linear-gradient(180deg,rgba(0,0,0,.9) 0%,rgba(0,0,0,.7) 60%,rgba(0,0,0,0) 100%);font-size:1.2em;line-height:1.5;transition:opacity .1s;padding:.666em 1.333em 4em;pointer-events:none;position:absolute;top:0;width:100%}.vjs-error .vjs-title-bar{display:none}.vjs-title-bar-title,.vjs-title-bar-description{margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vjs-title-bar-title{font-weight:700;margin-bottom:.333em}.vjs-playing.vjs-user-inactive .vjs-title-bar{opacity:0;transition:opacity 1s}.video-js .vjs-skip-forward-5,.video-js .vjs-skip-forward-10,.video-js .vjs-skip-forward-30,.video-js .vjs-skip-backward-5,.video-js .vjs-skip-backward-10,.video-js .vjs-skip-backward-30{cursor:pointer}.video-js .vjs-transient-button{position:absolute;height:3em;display:flex;align-items:center;justify-content:center;background-color:#32323280;cursor:pointer;opacity:1;transition:opacity 1s}.video-js:not(.vjs-has-started) .vjs-transient-button{display:none}.video-js.not-hover .vjs-transient-button:not(.force-display),.video-js.vjs-user-inactive .vjs-transient-button:not(.force-display){opacity:0}.video-js .vjs-transient-button span{padding:0 .5em}.video-js .vjs-transient-button.vjs-left{left:1em}.video-js .vjs-transient-button.vjs-right{right:1em}.video-js .vjs-transient-button.vjs-top{top:1em}.video-js .vjs-transient-button.vjs-near-top{top:4em}.video-js .vjs-transient-button.vjs-bottom{bottom:4em}.video-js .vjs-transient-button:hover{background-color:#323232e6}@media print{.video-js>*:not(.vjs-tech):not(.vjs-poster){visibility:hidden}}.vjs-resize-manager{position:absolute;top:0;left:0;width:100%;height:100%;border:none;z-index:-1000}.js-focus-visible .video-js *:focus:not(.focus-visible){outline:none}.video-js *:focus:not(:focus-visible){outline:none}.vjs-autoplay-countdown-overlay{position:absolute;top:0;left:0;width:100%;height:calc(100% - 46px);background:rgba(0,0,0,.85);display:none;flex-direction:column;justify-content:center;align-items:center;z-index:1000;padding:20px;box-sizing:border-box;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);opacity:0;transition:opacity .3s ease-in-out}.vjs-autoplay-countdown-overlay.autoplay-countdown-show{opacity:1}.autoplay-countdown-content{background:rgba(0,0,0,.9);border-radius:12px;padding:24px;max-width:400px;width:100%;text-align:center;box-shadow:0 8px 32px #0000004d;border:1px solid rgba(255,255,255,.1)}.autoplay-countdown-header{margin-bottom:20px}.autoplay-countdown-header h3{color:#fff;font-size:18px;font-weight:500;margin:0;line-height:1.4}.countdown-timer{color:#f44;font-weight:700;font-size:20px;animation:countdownPulse 1s infinite}@keyframes countdownPulse{0%,to{transform:scale(1);opacity:1}50%{transform:scale(1.1);opacity:.8}}.autoplay-countdown-video-info{display:flex;align-items:center;gap:12px;margin-bottom:24px;text-align:left}.next-video-thumbnail{flex-shrink:0;width:80px;height:45px;border-radius:6px;overflow:hidden;background:#333}.next-video-thumbnail img{width:100%;height:100%;object-fit:cover;display:block}.next-video-details{flex-grow:1;min-width:0}.next-video-title{color:#fff;font-size:14px;font-weight:600;margin:0 0 4px;line-height:1.3;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.next-video-author{color:#aaa;font-size:12px;margin:0 0 2px;line-height:1.2;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.next-video-duration{color:#ccc;font-size:11px;margin:0;line-height:1.2}.autoplay-countdown-actions{display:flex;gap:12px;justify-content:center;align-items:center}.autoplay-play-button,.autoplay-cancel-button{display:flex;align-items:center;justify-content:center;gap:6px;padding:10px 18px;border:none;border-radius:6px;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s ease;min-width:100px}.autoplay-play-button{background:#ff0000;color:#fff}.autoplay-play-button:hover{background:#e60000;transform:translateY(-1px)}.autoplay-play-button:active{transform:translateY(0)}.autoplay-cancel-button{background:rgba(255,255,255,.1);color:#fff;border:1px solid rgba(255,255,255,.2)}.autoplay-cancel-button:hover{background:rgba(255,255,255,.2);border-color:#ffffff4d}.autoplay-cancel-button:active{background:rgba(255,255,255,.1)}.autoplay-play-button svg,.autoplay-cancel-button svg{width:1.2em;height:1.2em;flex-shrink:0}.vjs-autoplay-toggle{width:3em!important;height:3em!important;flex:none;padding:0!important;margin:0 4px!important;line-height:3em!important;position:relative}.vjs-autoplay-toggle .vjs-autoplay-icon{width:1.2em;height:1.2em;display:flex;align-items:center;justify-content:center;margin:auto}.vjs-autoplay-toggle .vjs-autoplay-icon svg{width:100%;height:100%;display:block}@media (max-width: 480px){.autoplay-countdown-content{padding:20px;max-width:320px}.autoplay-countdown-header h3{font-size:16px}.countdown-timer{font-size:18px}.autoplay-countdown-video-info{gap:10px}.next-video-thumbnail{width:60px;height:34px}.next-video-title{font-size:13px}.autoplay-countdown-actions{flex-direction:column;gap:8px}.autoplay-play-button,.autoplay-cancel-button{width:100%}}.vjs-settings-button{width:3em;height:3em;display:flex;align-items:center;justify-content:center;padding:0;margin:0}.vjs-icon-cog1{font-size:30px!important;position:relative;top:-8px!important;display:flex;align-items:center;justify-content:center;width:100%;height:100%;line-height:1}.custom-settings-overlay{border:0;position:absolute;bottom:60px;right:20px;width:280px;height:420px;background:rgba(28,28,28,.95);color:#fff;border-radius:7px;box-shadow:0 4px 12px #00000080;display:none;z-index:1000;font-size:14px;overflow:visible}.settings-header{padding:12px 16px;border-bottom:1px solid rgba(255,255,255,.1);font-weight:700}.settings-item{padding:12px 16px;cursor:pointer;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid rgba(255,255,255,.1);transition:background .2s ease}.custom-settings-overlay .settings-left span.vjs-icon-placeholder{transform:inherit!important}.settings-item:last-child{border-bottom:none}.settings-item:hover{background:rgba(255,255,255,.05)}.speed-submenu,.quality-submenu,.subtitles-submenu{position:absolute;top:0;left:0;right:0;bottom:0;background:rgba(28,28,28,.95);display:none;flex-direction:column}.subtitle-option{padding:12px 16px;cursor:pointer;display:flex;justify-content:space-between;align-items:center;transition:background .2s ease}.subtitle-option:hover{background:rgba(255,255,255,.05)}.subtitle-option.active{background:rgba(255,255,255,.1)}.submenu-header{padding:12px 16px;border-bottom:1px solid rgba(255,255,255,.1);display:flex;align-items:center;cursor:pointer}.submenu-header:hover{background:rgba(255,255,255,.05)}.speed-option{padding:12px 16px;cursor:pointer;display:flex;justify-content:space-between;align-items:center;transition:background .2s ease}.speed-option:hover{background:rgba(255,255,255,.05)}.speed-option.active{background:rgba(255,255,255,.1)}.quality-option{padding:12px 16px;cursor:pointer;display:flex;justify-content:space-between;align-items:center;transition:background .2s ease}.quality-option:hover{background:rgba(255,255,255,.05)}.quality-option.active{background:rgba(255,255,255,.1)}.settings-left,.settings-right{display:inline-flex;align-items:center;gap:8px}.vjs-icon-cog:before{font-size:20px!important;position:relative;top:-5px!important}sup.hd-badge{font-size:10px;line-height:1;margin-left:6px;background:#e53935;color:#fff;padding:1px 4px;border-radius:3px} +html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}.playlist-items a{text-decoration:none!important}.video-js video{outline:none!important}.video-js .vjs-poster{border-radius:12px!important}.video-js video{border-radius:12px!important}.video-js div.vjs-control-bar{background:transparent!important;background-color:transparent!important;background-image:none!important;display:flex!important;flex-direction:row!important;align-items:center!important;justify-content:flex-start!important;padding:0 12px;height:48px}.video-container{width:100%;max-width:1200px;margin:0 auto;padding:0 20px;box-sizing:border-box}.video-js.vjs-fluid{width:100%!important;max-width:100%!important}.vjs-next-video-control .vjs-icon-placeholder{width:1.2em;height:1.2em;display:flex;align-items:center;justify-content:center;margin:auto}.vjs-next-video-control .vjs-icon-placeholder svg{width:100%;height:100%;display:block}.vjs-end-screen-overlay{position:absolute;top:0;left:0;width:100%;height:calc(100% - 46px);background:rgba(0,0,0,.9);display:none;flex-direction:column;justify-content:center;align-items:center;z-index:1000;padding:20px 0;box-sizing:border-box}.vjs-related-videos-title{color:#fff;font-size:24px;margin-bottom:20px;text-align:center;font-weight:700;flex-shrink:0}.vjs-related-videos-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:3px;width:100%;max-width:100%;margin:0;padding:16px;box-sizing:border-box;align-content:center;justify-items:center;max-height:calc(100vh - 200px);overflow:hidden;align-self:center;flex-shrink:0}.vjs-related-video-item{position:relative;cursor:pointer;border-radius:5px;overflow:hidden;transition:transform .2s ease,box-shadow .2s ease;background:#1a1a1a;border:1px solid #333;width:100%;max-width:100%;box-shadow:0 2px 8px #0000001a}.vjs-related-video-item:hover{transform:translateY(-2px);box-shadow:0 8px 25px #0000004d}.vjs-related-video-thumbnail{width:100%;height:100%;object-fit:cover;display:block;background:#1a1a1a;transition:transform .2s ease}.vjs-related-video-item:hover .vjs-related-video-thumbnail{transform:scale(1.02)}.vjs-related-video-overlay{position:absolute;top:0;left:0;right:0;bottom:0;background:linear-gradient(transparent,rgba(0,0,0,.9));color:#fff;padding:12px;opacity:0;transition:opacity .3s ease;display:flex;flex-direction:column;justify-content:flex-start;height:100%}.vjs-related-video-item:hover .vjs-related-video-overlay{opacity:1}.vjs-related-video-title{font-size:14px;font-weight:700;line-height:1.3;color:#fff;margin-bottom:4px}.vjs-related-video-meta{display:flex;flex-direction:row;gap:8px;align-items:center}.vjs-related-video-author{font-size:12px;color:#ccc}.vjs-related-video-views{font-size:12px;color:#aaa}.vjs-related-video-author:after{content:"•";margin-left:8px;color:#666}.vjs-related-video-duration{position:absolute;bottom:8px;right:8px;background:rgba(0,0,0,.8);color:#fff;padding:2px 6px;font-size:11px;font-weight:700;border-radius:2px;opacity:0;transition:opacity .3s ease}.vjs-related-video-item:hover .vjs-related-video-duration{opacity:1}.video-js.vjs-ended .vjs-control-bar{opacity:1!important;pointer-events:auto!important}.video-js.vjs-ended .vjs-control-bar .vjs-control,.video-js.vjs-ended .vjs-control-bar button{opacity:1!important;pointer-events:auto!important;cursor:pointer!important}.video-js.vjs-ended .vjs-control-bar .vjs-control.vjs-volume-control{opacity:0!important}.video-js.vjs-ended .vjs-control-bar .vjs-volume-panel.vjs-hover .vjs-volume-control{opacity:1!important}.video-js.vjs-ended .vjs-play-control{opacity:1!important;pointer-events:auto!important;cursor:pointer!important}.video-js.vjs-ended .vjs-progress-control,.video-js.vjs-ended .vjs-volume-panel{opacity:1!important;pointer-events:auto!important}.vjs-chapter-markers-track{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;overflow:hidden}.vjs-chapter-marker{position:absolute;top:0;width:2px;height:100%;background:rgba(255,255,255,.6);pointer-events:auto;cursor:pointer;transition:background .2s ease}.vjs-chapter-marker:hover{background:rgba(255,255,255,.9);width:3px}.vjs-chapter-marker-tooltip{position:absolute;bottom:8px;left:50%;transform:translate(-50%);background:rgba(0,0,0,.8);color:#fff;padding:4px 8px;border-radius:4px;font-size:11px;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .2s ease;z-index:1001}.vjs-chapter-marker:hover .vjs-chapter-marker-tooltip{opacity:1}.vjs-chapter-floating-tooltip{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif!important;line-height:1.4!important;animation:fadeIn .2s ease-in-out}@keyframes fadeIn{0%{opacity:0;transform:translate(-50%) translateY(5px)}to{opacity:1;transform:translate(-50%) translateY(0)}}.video-js .vjs-menu-button:not(.vjs-disabled) .vjs-menu{display:none!important}.video-js .vjs-menu-button:not(.vjs-disabled).vjs-lock-showing .vjs-menu,.video-js .vjs-menu-button:not(.vjs-disabled) .vjs-menu.vjs-lock-showing{display:block!important}.video-js .vjs-menu-button:hover .vjs-menu{display:none!important}.video-js .vjs-menu-button.vjs-lock-showing:hover .vjs-menu{display:block!important}.video-js .vjs-menu.vjs-lock-showing{display:block!important;opacity:1!important;visibility:visible!important}.video-js.chapters-open .vjs-menu,.video-js.chapters-open .vjs-menu.vjs-lock-showing,.video-js.chapters-open .vjs-hover-display,.video-js.chapters-open .vjs-time-tooltip,.video-js.chapters-open .vjs-progress-holder .vjs-mouse-display{display:none!important;opacity:0!important;visibility:hidden!important}.video-js .vjs-volume-panel.vjs-hover{transition:ease-in-out .5s!important;width:auto!important}.video-js .vjs-captions-button,.video-js .vjs-subs-caps-button{display:none!important}.video-js .vjs-subtitles-button .vjs-menu,.video-js .vjs-subtitles-button .vjs-menu.vjs-lock-showing{display:none!important;visibility:hidden!important;opacity:0!important;pointer-events:none!important}.video-js .vjs-text-track-display{position:absolute!important;bottom:6em!important;left:0!important;right:0!important;top:0!important;pointer-events:none!important;z-index:10!important}.video-js .vjs-text-track-cue{position:absolute!important;bottom:0!important;left:0!important;right:0!important;text-align:center!important;padding:0!important;background:transparent!important;border:none!important;font-size:1.2em!important;line-height:1.4!important;color:#fff!important;text-shadow:2px 2px 4px rgba(0,0,0,.8)!important;font-family:Arial,sans-serif!important;font-weight:600!important;white-space:pre-line!important;word-wrap:break-word!important;max-width:90%!important;margin:0 auto!important;z-index:11!important}.video-js .vjs-text-track-cue>div{background:rgba(0,0,0,.7)!important;padding:8px 12px!important;border-radius:4px!important;display:inline-block!important;margin:2px 0!important;max-width:100%!important;box-sizing:border-box!important}.video-js.vjs-fullscreen .vjs-text-track-display{bottom:8em!important}.video-js.vjs-fullscreen .vjs-text-track-cue{font-size:1.4em!important;max-width:85%!important}.video-js.vjs-fullscreen .vjs-text-track-cue>div{padding:10px 16px!important;font-size:1em!important}.video-js .vjs-subtitles-button .vjs-menu.vjs-lock-showing .vjs-menu-content{display:none!important;visibility:hidden!important;opacity:0!important;pointer-events:none!important}.video-js .vjs-chapters-button .vjs-menu,.video-js .vjs-chapters-button .vjs-menu.vjs-lock-showing,.video-js .vjs-chapters-button .vjs-menu.vjs-lock-showing .vjs-menu-content{display:none!important}.video-js .vjs-chapters-button .vjs-menu{display:none!important;visibility:hidden!important;opacity:0!important;pointer-events:none!important}.video-js .vjs-subtitles-button{position:relative;cursor:pointer!important;pointer-events:auto!important}.video-js button.vjs-subtitles-button{cursor:pointer!important;pointer-events:auto!important;touch-action:manipulation!important;-webkit-tap-highlight-color:transparent!important}.video-js button.vjs-subtitles-button:before{content:"";position:absolute;left:50%;transform:translate(-50%);bottom:6px;height:3px;background:#e1002d;border-radius:2px;width:0;padding:0;transition:none!important;animation:none!important;-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important}.video-js .vjs-subs-active button.vjs-subtitles-button:before{width:24px;transition:none!important;animation:none!important;-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important}.video-js button.vjs-subtitles-button{transition:none!important;animation:none!important;-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important}.video-js .vjs-autoplay-toggle .vjs-hover-display,.video-js .vjs-autoplay-toggle .vjs-tooltip,.video-js .vjs-autoplay-toggle .vjs-tooltip-text{display:none!important;visibility:hidden!important;opacity:0!important;pointer-events:none!important}.video-js .vjs-autoplay-toggle{position:relative}.video-js .vjs-autoplay-toggle:after{content:attr(title);position:absolute;bottom:100%;left:50%;transform:translate(-50%);background:rgba(0,0,0,.9);color:#fff;padding:6px 10px;border-radius:4px;font-size:12px;white-space:nowrap;pointer-events:none;opacity:0;visibility:hidden;transition:opacity .2s ease,visibility .2s ease;z-index:1000;margin-bottom:8px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;box-shadow:0 2px 8px #0000004d;border:1px solid rgba(255,255,255,.1)}.video-js .vjs-autoplay-toggle:hover:after,.video-js .vjs-autoplay-toggle:focus:after{opacity:1;visibility:visible}@media (min-width: 1200px){.vjs-related-videos-grid{grid-template-columns:repeat(4,1fr);gap:3px;padding:20px;max-height:calc(100vh - 220px)}}@media (min-width: 1024px) and (max-width: 1199px){.vjs-related-videos-grid{grid-template-columns:repeat(3,1fr);gap:3px;padding:18px;max-height:calc(100vh - 210px)}}@media (min-width: 768px) and (max-width: 1023px){.vjs-related-videos-grid{grid-template-columns:repeat(3,1fr);gap:3px;padding:14px;max-height:calc(100vh - 200px)}.video-js .vjs-control:hover:after,.video-js .vjs-control:focus:after,.video-js .vjs-control:active:after{display:none!important;opacity:0!important;visibility:hidden!important}.video-js .vjs-play-control:hover:after,.video-js .vjs-mute-control:hover:after,.video-js .vjs-volume-panel:hover:after,.video-js .vjs-fullscreen-control:hover:after,.video-js .vjs-picture-in-picture-control:hover:after,.video-js .vjs-settings-control:hover:after,.video-js .vjs-chapters-control:hover:after,.video-js .vjs-autoplay-toggle:hover:after,.video-js .vjs-next-video-control:hover:after,.video-js .vjs-remaining-time:hover:after{display:none!important;opacity:0!important;visibility:hidden!important}}@media (max-width: 767px){.video-js .vjs-autoplay-toggle.touch-active:after{opacity:1;visibility:visible}.video-js .vjs-autoplay-toggle:after{font-size:11px;padding:5px 8px;margin-bottom:6px}.video-container{padding:0 15px}.vjs-end-screen-overlay{padding:0;height:calc(100% - 46px)}.vjs-related-video-thumbnail{height:100%}.vjs-chapter-floating-tooltip{font-size:11px!important}.custom-chapters-overlay .video-chapter{right:10px;left:auto;width:100%;max-width:280px;height:calc(100% - 40px);max-height:calc(100% - 40px);overflow:hidden;bottom:40px}.video-js .vjs-settings-button{min-width:44px!important;height:44px!important;padding:0!important;margin:0 2px!important;display:flex!important;align-items:center!important;justify-content:center!important;touch-action:manipulation!important;-webkit-tap-highlight-color:transparent!important;cursor:pointer!important;z-index:1000!important;pointer-events:auto!important;position:relative!important}.video-js .vjs-settings-button .vjs-icon-cog{font-size:20px!important;width:20px!important;height:20px!important;display:flex!important;align-items:center!important;justify-content:center!important}.video-js .vjs-control-bar .vjs-button{touch-action:manipulation!important;-webkit-tap-highlight-color:transparent!important;-webkit-touch-callout:none!important;-webkit-user-select:none!important;user-select:none!important}.custom-settings-overlay .settings-item{padding:6px 16px;font-size:15px;touch-action:manipulation;line-height:18px}.custom-settings-overlay .settings-header{padding:10px 16px;font-size:18px;line-height:20px}.chapter-head{padding:10px 15px}.chapter-title h3 a{font-size:15px!important;line-height:20px!important;height:20px!important}.chapter-title p{font-size:11px!important;line-height:14px!important}.playlist-items a{padding:10px 16px!important;min-height:58px!important}.thumbnail-meta h4{font-size:13px!important;line-height:18px!important}.thumbnail-meta .meta-sub .meta-dynamic{font-size:11px!important;line-height:16px!important}}@media (max-width:767px){body div.custom-settings-overlay{bottom:40px}div.chapter-close button{width:30px;height:30px}.vjs-related-videos-grid{grid-template-columns:repeat(2,1fr);gap:3px;padding:10px;max-height:calc(100vh - 180px)}.video-js .vjs-control:hover:after,.video-js .vjs-control:focus:after,.video-js .vjs-control:active:after{display:none!important;opacity:0!important;visibility:hidden!important}.video-js .vjs-play-control:hover:after,.video-js .vjs-mute-control:hover:after,.video-js .vjs-volume-panel:hover:after,.video-js .vjs-fullscreen-control:hover:after,.video-js .vjs-picture-in-picture-control:hover:after,.video-js .vjs-settings-control:hover:after,.video-js .vjs-chapters-control:hover:after,.video-js .vjs-autoplay-toggle:hover:after,.video-js .vjs-next-video-control:hover:after,.video-js .vjs-remaining-time:hover:after{display:none!important;opacity:0!important;visibility:hidden!important}}@media (max-width: 480px){.video-container{padding:0 10px}.vjs-related-videos-grid{grid-template-columns:repeat(2,1fr);gap:3px;padding:8px;max-height:calc(100vh - 160px)}.video-js .vjs-control:hover:after,.video-js .vjs-control:focus:after,.video-js .vjs-control:active:after{display:none!important;opacity:0!important;visibility:hidden!important}.video-js .vjs-play-control:hover:after,.video-js .vjs-mute-control:hover:after,.video-js .vjs-volume-panel:hover:after,.video-js .vjs-fullscreen-control:hover:after,.video-js .vjs-picture-in-picture-control:hover:after,.video-js .vjs-settings-control:hover:after,.video-js .vjs-chapters-control:hover:after,.video-js .vjs-autoplay-toggle:hover:after,.video-js .vjs-next-video-control:hover:after,.video-js .vjs-remaining-time:hover:after{display:none!important;opacity:0!important;visibility:hidden!important}.vjs-end-screen-overlay{padding:0;height:calc(100% - 46px)}.vjs-related-video-thumbnail{height:100%}.video-js .vjs-settings-button .vjs-icon-cog{font-size:22px!important;width:22px!important;height:22px!important}}.video-js .vjs-settings-button{cursor:pointer!important;pointer-events:auto!important;position:relative!important;display:flex!important;align-items:center!important;justify-content:center!important;min-width:32px!important;height:32px!important;padding:0!important;margin:0 2px!important;border:none!important;background:transparent!important;color:inherit!important;font-size:inherit!important;line-height:inherit!important;text-align:center!important;vertical-align:middle!important;touch-action:manipulation!important;-webkit-tap-highlight-color:transparent!important;-webkit-touch-callout:none!important;-webkit-user-select:none!important;user-select:none!important}.video-js .vjs-settings-button:hover{background-color:#ffffff1a!important}.video-js .vjs-settings-button:focus{outline:2px solid #fff!important;outline-offset:2px!important}.video-js .vjs-settings-button .vjs-icon-cog{font-size:18px!important;width:18px!important;height:18px!important;display:flex!important;align-items:center!important;justify-content:center!important}.vjs-play-progress{background-color:#019932!important}.vjs-load-progress,.vjs-progress-holder{background:rgba(255,255,255,.5)!important}.video-js .vjs-progress-control{position:absolute!important;bottom:46px!important;left:0!important;right:0!important;width:100%!important;height:0!important;z-index:3!important;padding:0!important;margin:0 auto!important}.video-js .vjs-control-bar .vjs-progress-control{display:none!important}.video-js .vjs-progress-control.vjs-control{display:block!important}.video-js .vjs-control-bar .vjs-icon-placeholder,.video-js .vjs-control-bar .vjs-button .vjs-icon-placeholder,.video-js .vjs-control-bar [class*=vjs-icon-]{font-size:1.5em!important}.vjs-control-bar .custom-remaining-time .vjs-remaining-time-display{font-size:14px!important;font-weight:500;line-height:1;display:flex;align-items:center;justify-content:center;height:100%;color:#fff}.vjs-mouse-display{z-index:4!important}.vjs-slider-horizontal{top:-5px}.video-js .vjs-spacer-control{flex:1!important;min-width:1px!important;height:100%!important}.video-js .vjs-control-bar .vjs-control{flex:none!important}.video-js .vjs-autoplay-toggle{margin-right:10px!important}.video-js .vjs-picture-in-picture-control{margin-left:6px!important}.vjs-seek-indicator{position:absolute!important;top:50%!important;left:50%!important;transform:translate(-50%,-50%)!important;z-index:9999!important;pointer-events:none!important;display:none!important;align-items:center!important;justify-content:center!important;opacity:0!important;visibility:hidden!important;transition:opacity .2s ease-in-out!important}.vjs-seek-indicator-content{background:transparent!important;flex-direction:column!important;align-items:center!important;justify-content:center!important}.vjs-seek-indicator-icon{position:relative!important;display:flex!important;align-items:center!important;justify-content:center!important;margin-bottom:4px!important}.seek-icon-container{display:flex!important;flex-direction:column!important;align-items:center!important;justify-content:center!important;animation:seekPulse .3s ease-out!important}.youtube-seek-container{display:flex!important;align-items:center!important;justify-content:center!important;animation:youtubeSeekPulse .3s ease-out!important}.youtube-seek-circle{width:80px!important;height:80px!important;border-radius:50%!important;-webkit-border-radius:50%!important;-moz-border-radius:50%!important;background:rgba(0,0,0,.8)!important;backdrop-filter:blur(10px)!important;-webkit-backdrop-filter:blur(10px)!important;display:flex!important;flex-direction:column!important;align-items:center!important;justify-content:center!important;padding:0!important;box-shadow:0 4px 20px #0000004d!important;border:1px solid rgba(255,255,255,.15)!important;box-sizing:border-box!important;overflow:hidden!important}.youtube-seek-icon{display:flex!important;align-items:center!important;justify-content:center!important;margin-bottom:4px!important}.youtube-seek-icon svg{filter:drop-shadow(0 1px 2px rgba(0,0,0,.5))!important}.youtube-seek-time{color:#fff!important;font-size:10px!important;font-weight:500!important;text-align:center!important;line-height:1.2!important;opacity:.9!important;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif!important}@keyframes youtubeSeekPulse{0%{transform:scale(.7);opacity:.5}50%{transform:scale(1.05);opacity:.9}to{transform:scale(1);opacity:1}}.seek-seconds{color:#fff!important;font-size:16px!important;font-weight:700!important;text-shadow:0 2px 4px rgba(0,0,0,.7)!important;line-height:1!important}.vjs-seek-indicator-text{color:#fff!important;font-size:16px!important;font-weight:500!important;text-align:center!important;text-shadow:0 1px 2px rgba(0,0,0,.8)!important}button{cursor:pointer}.video-js{padding:0;height:100%!important}.video-chapter{position:absolute;top:auto;bottom:60px;width:min(360px,calc(100% - 20px));border:1px solid rgba(255,255,255,.12);border-radius:12px;height:calc(100% - 80px);background:rgba(18,18,18,.96);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);overflow:hidden;box-shadow:0 12px 30px #00000073;right:10px}.chapter-head{padding:12px 8px 10px 16px;position:sticky;top:0;left:0;background:linear-gradient(180deg,rgba(28,28,28,.95),rgba(18,18,18,.95));border-bottom:1px solid rgba(255,255,255,.08);z-index:2}.playlist-title{display:flex;align-items:center;gap:10px}.chapter-title{width:auto;flex:1;min-width:0}.chapter-title h3{margin:0;padding:0}.chapter-title h3 a{color:#fff;font-size:18px;line-height:26px;font-weight:700;text-decoration:none;white-space:nowrap;text-overflow:ellipsis;height:28px;overflow:hidden;display:block}.chapter-title p{margin:4px 0 0;padding:0;color:#fff;font-size:12px;font-weight:400;line-height:15px}.chapter-title p a{color:#fff;font-size:12px;font-weight:400;line-height:15px;text-decoration:none}.chapter-close{width:40px;margin-left:auto;display:flex;align-items:center;justify-content:flex-end}.chapter-close button{background:transparent;color:#fff;border:0;width:40px;height:40px;padding:0;display:flex;align-items:center;justify-content:center;border-radius:8px}.chapter-close button:hover{background:rgba(255,255,255,.1)}.playlist-action-menu{display:none;justify-content:space-between;gap:10px}.playlist-action-menu button{background:transparent;border:0;width:40px;height:40px;padding:0;display:flex;justify-content:center;align-items:center;border-radius:100px}.playlist-action-menu button:hover{background:rgba(0,0,0,.1)}.start-action{display:flex}.chapter-body{height:calc(100% - 80px);overflow:auto}.chapter-body ul{margin:0;padding:0}.playlist-items a{padding:12px;display:flex;align-items:center;text-decoration:none;gap:12px;width:100%;box-sizing:border-box;color:#fff}.playlist-items a:hover{background:rgba(255,255,255,.06)}.playlist-items.selected a{background:rgba(255,255,255,.14)}.playlist-drag-handle{width:24px;display:flex;justify-content:center;color:#e0e0e0;font-size:12px}.thumbnail-meta{flex:1;min-width:0;padding:0}.thumbnail-meta h4{margin:0 2px 4px 0;font-size:14px;line-height:20px;font-weight:600;overflow:hidden;text-overflow:ellipsis;color:#fff;white-space:normal;max-height:40px;-webkit-line-clamp:2;line-clamp:2;display:-webkit-box;-webkit-box-orient:vertical}.thumbnail-meta .meta-sub{display:flex;gap:8px;align-items:center}.thumbnail-meta .meta-sub .meta-dynamic{color:#bdbdbd;font-size:12px;line-height:18px}.thumbnail-action button{border:0;background:transparent;color:#fff;opacity:0}.playlist-items a:hover .thumbnail-action button{opacity:1}.chapter-body::-webkit-scrollbar{width:10px}.chapter-body::-webkit-scrollbar-thumb{background:rgba(255,255,255,.18);border-radius:8px}.chapter-body::-webkit-scrollbar-track{background:transparent}.video-js .vjs-control-bar .vjs-spacer-control{margin-left:auto}.video-js .vjs-control-bar .settings-item-svg{display:flex}.video-js .vjs-control-bar .settings-item-svg svg{width:auto!important;height:auto!important;transform:inherit!important}.video-js div.vjs-control{width:auto}.vjs-chapters-button button.vjs-button,.vjs-subtitles-button button.vjs-button,.video-js button.vjs-control{width:48px;height:48px;display:flex;align-items:center;justify-content:center}button.vjs-button>.vjs-icon-placeholder:before{line-height:48px;transition:ease-in-out .5s}.video-js .vjs-volume-panel div.vjs-volume-control{height:100%!important;display:flex;align-items:center;justify-content:center;margin:0;width:0;transition:ease-in-out .5s!important;opacity:0}.video-js .vjs-volume-panel div.vjs-volume-control .vjs-volume-bar{margin:0;top:0}.vjs-settings-button svg{transition:ease-in-out .3s}.vjs-settings-button.settings-clicked svg{transform:rotate(30deg)}.video-js span.vjs-control-text{position:absolute!important;bottom:125%;left:50%;transform:translate(-50%);background:rgba(0,0,0,.75);color:#fff;padding:6px 8px!important;border-radius:3px;font-size:13px;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .3s ease;z-index:1000;box-shadow:0 0 5px #0000004d;height:auto!important;width:auto!important;overflow:visible!important;clip:initial!important}.video-js button.vjs-button:hover span.vjs-control-text{opacity:1}.video-js .vjs-control:focus:before,.video-js .vjs-control:hover:before,.video-js .vjs-control:focus{text-shadow:none!important}.vjs-volume-panel{gap:5px}.video-js .vjs-play-progress.vjs-slider-bar+.vjs-time-tooltip{padding:0}.vjs-chapter-floating-tooltip{text-align:center;width:160px!important;max-width:100%!important;height:auto}.chapter-image-sprite{width:166px!important;max-width:100%!important;height:96px;margin:0 auto 10px;border-radius:6px;border:3px solid #FFF}.vjs-chapter-floating-tooltip .chapter-title{font-size:24px;margin:0 0 10px;font-weight:700;text-overflow:ellipsis;white-space:nowrap;height:30px;line-height:30px;overflow:hidden}.vjs-chapter-floating-tooltip .position-info,.vjs-chapter-floating-tooltip .chapter-info{font-size:15px;display:inline-block;margin:0 0 2px;line-height:normal;vertical-align:top;line-height:20px}@media (max-width:1024px){body div.custom-settings-overlay{height:calc(100% - 40px);max-height:300px}}@media (pointer: coarse){.video-js .vjs-volume-panel div.vjs-volume-control{width:auto;opacity:1}}@media (max-width:767px){.vjs-chapters-button button.vjs-button,.vjs-subtitles-button button.vjs-button,.video-js button.vjs-control{width:32px;height:32px}button.vjs-button>.vjs-icon-placeholder:before{line-height:32px}.vjs-next-video-control svg{width:32px;height:32px}.video-js div.vjs-control{height:32px}.vjs-button>.vjs-icon-placeholder:before{font-size:1.4em!important}.video-js .vjs-subs-active button.vjs-subtitles-button:before{width:20px}.video-js button.vjs-subtitles-button:before{bottom:2px}.video-js div.vjs-control-bar{padding:0 2px}.video-js .vjs-autoplay-toggle{margin-right:6px!important}.video-js .vjs-picture-in-picture-control{margin-left:6px!important}.video-js .vjs-text-track-display{bottom:8em!important}.video-js .vjs-text-track-cue{font-size:1.1em!important;max-width:95%!important}.video-js .vjs-text-track-cue>div{padding:6px 10px!important;font-size:.9em!important;background:rgba(0,0,0,.8)!important}.video-js.vjs-fullscreen .vjs-text-track-display{bottom:10em!important}.video-js.vjs-fullscreen .vjs-text-track-cue{font-size:1.3em!important;max-width:90%!important}.video-js.vjs-fullscreen .vjs-text-track-cue>div{padding:8px 12px!important;font-size:.95em!important}.video-js .vjs-subtitles-button button.vjs-button{min-width:32px!important;min-height:32px!important;touch-action:manipulation!important;-webkit-tap-highlight-color:transparent!important;-webkit-touch-callout:none!important;-webkit-user-select:none!important;user-select:none!important}.chapter-body{height:calc(100% - 70px)}.subtitles-submenu,.quality-submenu,.speed-submenu{height:100%;overflow:auto}}@media (max-width:399px){.vjs-chapters-button button.vjs-button,.vjs-subtitles-button button.vjs-button,.video-js button.vjs-control{width:28px;height:28px}button.vjs-button>.vjs-icon-placeholder:before{line-height:28px}.vjs-next-video-control svg{width:28px;height:28px}.video-js div.vjs-control{height:28px}.video-js .vjs-autoplay-toggle{margin-right:4px!important}.video-js .vjs-picture-in-picture-control{margin-left:4px!important}.video-js .vjs-text-track-display{bottom:7em!important}.video-js .vjs-text-track-cue{font-size:1em!important;max-width:98%!important}.video-js .vjs-text-track-cue>div{padding:4px 8px!important;font-size:.85em!important;background:rgba(0,0,0,.85)!important}.video-js.vjs-fullscreen .vjs-text-track-display{bottom:9em!important}.video-js.vjs-fullscreen .vjs-text-track-cue{font-size:1.2em!important;max-width:95%!important}.video-js.vjs-fullscreen .vjs-text-track-cue>div{padding:6px 10px!important;font-size:.9em!important}.vjs-button>.vjs-icon-placeholder:before{font-size:1.4em!important}}@media (min-width: 768px) and (max-width: 1024px){.video-js .vjs-text-track-display{bottom:7em!important}.video-js .vjs-text-track-cue{font-size:1.15em!important;max-width:88%!important}.video-js .vjs-text-track-cue>div{padding:7px 11px!important;font-size:.95em!important}.video-js.vjs-fullscreen .vjs-text-track-display{bottom:9em!important}}@media (min-width: 1025px){.video-js .vjs-text-track-display{bottom:6em!important}.video-js .vjs-autoplay-toggle{margin-right:12px!important}.video-js .vjs-picture-in-picture-control{margin-left:12px!important}.video-js .vjs-text-track-cue{font-size:1.2em!important;max-width:90%!important}.video-js .vjs-text-track-cue>div{padding:8px 12px!important;font-size:1em!important}.video-js.vjs-fullscreen .vjs-text-track-display{bottom:8em!important}}.vjs-svg-icon{display:inline-block;background-repeat:no-repeat;background-position:center;fill:currentColor;height:1.8em;width:1.8em}.vjs-svg-icon:before{content:none!important}.vjs-svg-icon:hover,.vjs-control:focus .vjs-svg-icon{filter:drop-shadow(0 0 .25em #fff)}.vjs-modal-dialog .vjs-modal-dialog-content,.video-js .vjs-modal-dialog,.vjs-button>.vjs-icon-placeholder:before,.video-js .vjs-big-play-button .vjs-icon-placeholder:before{position:absolute;top:0;left:0;width:100%;height:100%}.vjs-button>.vjs-icon-placeholder:before,.video-js .vjs-big-play-button .vjs-icon-placeholder:before{text-align:center}@font-face{font-family:VideoJS;src:url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAABTsAAsAAAAAIpAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADsAAABUIIslek9TLzIAAAFEAAAAPgAAAFZRiV32Y21hcAAAAYQAAAEJAAAD5p42+VxnbHlmAAACkAAADtIAABckI4l972hlYWQAABFkAAAAKwAAADYsvIjpaGhlYQAAEZAAAAAdAAAAJA+RCL1obXR4AAARsAAAABcAAAC8Q2YAAGxvY2EAABHIAAAAYAAAAGB7CIGGbWF4cAAAEigAAAAfAAAAIAFAAI9uYW1lAAASSAAAASUAAAIK1cf1oHBvc3QAABNwAAABfAAAAnXdFqh1eJxjYGRgYOBiMGCwY2BycfMJYeDLSSzJY5BiYGGAAJA8MpsxJzM9kYEDxgPKsYBpDiBmg4gCACY7BUgAeJxjYGR7yDiBgZWBgaWQ5RkDA8MvCM0cwxDOeI6BgYmBlZkBKwhIc01hcPjI+FGPHcRdyA4RZgQRADaGCyYAAHic7dPXbcMwAEXRK1vuvffem749XAbKV3bjBA6fXsaIgMMLEWoQJaAEFKNnlELyQ4K27zib5PNF6vl8yld+TKr5kH0+cUw0xv00Hwvx2DResUyFKrV4XoMmLdp06NKjz4AhI8ZMmDJjzoIlK9Zs2LJjz4EjJ85cuHLjziPe/0UWL17mf2tqKLz/9jK9f8tXpGCoRdPKhtS0RqFkWvVQNtSKoVYNtWaoddPXEBqG2jQ9XWgZattQO4baNdSeofYNdWCoQ0MdGerYUCeGOjXUmaHODXVhqEtDXRnq2lA3hro11J2h7g31YKhHQz0Z6tlQL4Z6NdSbod4N9WGoT9MfHF6GmhnZLxyDcRMAAAB4nJ1YC1hU17U+a5/HMA4iA3NmVBDmoQwP5TFnHlFeA4gYiUFRQINoSCBAyK3G2yi+0aipYtFcHYo2xsb4NiY3+VrNxSaX5uvt495ozNdoYoxmem2/L8HGpLc+InB279pnhlGr5mvL4eyz99nrrL32eu1/DQcc/okdYgdHOA6MQKp4r9gx0EcMHMezOalVasW5BM7NcXoSb9fFgE6KtSSBxWz1FYDPG+vMBGcKb9cebu2VS5s2aaTkCvRSf6C7Y+Ppibm5E09v7IDs2/3uZQtbD0zIyppwoHXh/93ukmyYgdePNRp65p5v+3v/9otQl2O7wP34cT88p8Md2YxpYLQZoRcy6FlSBRnwnGAe6BPMSCZo+7NJVqS0cE4uHendzhSnbPH6TDqL1+Nme5LZXkCHnGyoH0kne30WH+gswhm3q+pt/mTas9NLS64GnjmSlTPw0wVQT/ewRaBgxtydy3cuUB9/6SW+vb5yRvr+t0eOfPKJZ/9t3+4tL7xj32Xd3thCxi+ge6ifdsAN+l5+wi5HQ/cCoeull1AszS7CUfEcJzK7sKWJAdJhCd0sPM4+EY7QDm5ov08hXRQXE5bf6PV5Q5+IjW7X7Nku92Ask4l2hCRRD6TPqISiCJeQna3SCFwrhrNzXHzo4yFevBwxpzxk8WCIIfkvVEKVy32SbT8n68gzgaslpaiO2zIGIyuSb7RNf9HSuN26y/7OC1tgEmpiyA6aD4qcgTOiLThwGG0eB694FI8NHLLN6OBlRVaMxNAFS4JdXUG6mW8PwpKuYLCLXKGbu8iwYNdgO06Sn3Th+/vyZAxs8Ro30DjHe9gy8Fywi24OMm7Qyzh3MTZVOMYhLBnoC+J79lpTUyQmorjhnMwlcQ5uPEYGpDjsOkkH49BjQLQBqs3jFtFdJNlksYmoQFDArLh8Xh+Qd6Ghcsb6FUuehDi+U/lqD71K/qiegeV1imcwjl7ExwiSrf4BZyCujV6cVcFo6VX+G9IcPyFjJnUufbU/jzrL1X99as36reXl8K32nFaOr+E8jWJEcJ55DpMVfSMe95/AJaOsGBH2GJCNpiRQbK4C8BjdmQA22QY2j03Em13i2YHqtNLU1NI04Yj2HJgA6fQc6VPNpA/D+Ryks554NnVy2mB72uRUfPLsqR4N0LOBQKArwJYO+5W2fgZX8oC1HR6HjNaQTVIG2FPwnTcXXGZZfNB7TE6pTKZUwaw91XWLAoFFGcnB5PHjsckgBjbWutrL+0h5Y1xw3DRGDumsnXb3MJwXrJIN5U7m0rgJ3yG5w4he5ckFG4pmNEkOm0/xOO4r4yL87wqtQM+hiJIVp+6iG2wPBKD35ElGkDx+UfC2v1mFG1o+M3AjNFty8biKMXwzyxnZLds8wYD2BxmCPHAldPOeLsy/0BugftYhVYFAhO8SqQ0j3oK7dHJZnI/jxmUS4onlxskSF8thmvNZjIrRZwEPxr0lBuLRuz3oy/FOHCsxwOPYh2M+e9u3J5pgPYz9gp6G7C9m0A11F9ddqKMfV+4sbq45/YspOysXvT+3pdFdYNg2fHbW8Dz301MqDVuGrz0Fuh0YMW8mddrpqzST7rV9BcvqPoNvadRndWp0p8HvbiqrFj5yFQ/vNFSXDpxpLEFWp+DcrF3FT1afWshFcmCfeAMjEvO65i0Y6XijQfSRPWx3TV/Df7Km3E1l+kLt56s/rwVzuRusNMhudznkwdLaS+QNdeal2jDPP4l9qHc98vTYZOSkxzD+njBWVWjFPKgipx6DkWvXQiW8OYcewVHE5yukinDMcfGgc0opDltYKDxIGBedkzc6jSfE7tlvESCDFUw0Hx0opS+U0lHCxNottbNWSxX9zZVvEhKWUSyBpaXwBc2a98M6UqPeXAs/GDon8Ax7hsthO8cM5HU7Ad0UvRR9lHmtyQKZ4MAe814X5h9MSUkQmhf96eVJ6p90OjIiqSIjvykvr2l5U55O/fPQKD+jIomYpNyGJQ25uQ2kIikRfAmuBHCPsWqkSDEqgZ5KDI2sifS/R43MbZg0idFHbCPNxXxZws1ACVE6hAhOdJwRkJLFBLPZpRGYJ50pko6XzMkgmSx40ljik6AQcKhFnLcQE6rF7PXFe1Ocoj0T3AXgSgJTDIhHRfHlYZKuSzc6uievOJGXY+i5GJkkTp7UM3y0LqATDbtFcbdBxO7o4T25JYlEjoH0uynUh8rapkxp62QN70svSF+hT4gGPlovlmcm/ComLi7mV4kTykV9NFWjE/QrwgQ4uIcAP0rQF4VZYRP2o3PhHHzfPMJj9Ir+uzKUlrH49ntT18AVvj1sc3YGjUT/Mt2Dxawa8ArcA7bCQIpvfwAYu22vEG/No/5RvPdA7g+AelLrPwzy+LtkLPhnpIxH14m4EYq8eeMHbPEPNm6G7Nv9B4jcFPZ8bJj0SEjP3MPgQdKTqqEoy2v6G32P/Y6dxOv04AxnoAeq+GILvUavtYCBXm+BaIhuodcfrN5B/V2EYMCPh+SxavjGyPwV0x4CJgUPGT0mQaODGBACIJZGsMXwAD0LGXx7l3CdAcKMIKI+f5CepWeD0BvyU/GcdBxPF8SwejC6LGZmAURFdsSWKR5HyHld2kbdIZO1Ixx+bnnzU7n5+blPNV9jnUDWhP2tC68tbN3PVIldsQPxSAcSpjOav7Q05uXn5zW2LLvDXn9B6syscPy9iDLEMmSrJz6nYuWMipukjM0AH8JkGS+XFyMRkzSCH7KD/hwm172SAyZYumHlefr5AddrtA0O0TnwaVZxcRY9Bfukn9Gf05N1r9DV9MoBsJ1f+ZrqUvtPHizJAntWybv7hmqLt6QLuK6ZS9Fqi1jO5rDoWPZXXII5Tgajg53cIXCjDCGIcYrRIY2n6+mXOa/W0bdhau3ryiEYe2FV/5oeaIYK/5w5frCyll6/cYO8DiNhw6t1MBWmznt91QX62UF1N7l0eHBZTRGpKaqpKVIPF9UcIzmReud9TSY75+K899GHbBu6wjoR7RKKZVYiYxSPf5/2wJT5e3NAhmUbVn5KLx1Ujg0+BGvpAIh0DezInTkzF37KVocxrKU3r1+XLtAe2lO3l66kfQfB/unKY+q8N375Ru8bc4pJXfEcESU95q+p8ZNZRTWH1d9FzvUdYXk5rLkcdkEisoKKVHQW/b3GEx6tPaYcoJfOr9wAbSBnv1IHpep0OExr4LPMkpJM+j7sly7UHkOzXjoAZljHCGiyegtNlwljM0v+c19ET9Pvst09a2Mtgcf5/ZSzYO5h1156+eyydfAsxGa9XAuF6vzjh6CssLq6ECysperXX0sX5h5ZdpZe3guxsGIPEtHk/aqXX1hVqP5HYVVVISkrrNqvXorIc+5Ou91Hnr/LcD2afi6eX7UBloOcs7cOpqgGaNfs1g7bNbs9z6wASaylN69d0/TFTIz6Ws8+oGV3mE2612wRTHKcVUbhjKadebloMc+dyXgMVtVK6BwMB/+mVW09igdRBWaRtNQX59d/VD//xdQ0TCiYNj1KT9sq6Wdu5WTbqk3qDXyDaLa1fv621LS01G3z61sD6lH8lAxDLicV921s6Bf92JOYvzNYCL1khbqBXEFUzC521N5NyzNaQIWhjyFyDoBIVrAjmv2UEaLlI+c6zw1jmVIPLLLZZUTj6GxGHW+mq1tgHXR2D85p4Q934+jLbtjVLcyCdS10NVzpHqxp4Q/hK7WopY/NRGx9HGsPGdFjOjcpjBnGYMVqY/4eqT5khWEHWUup2A/pTw7pdWgsWft7ETUERL96nRg0HNFPmCYba6pylECaExX89A9WLUOVB4oKLu/o1oqSYHCgLzBUlAz8hNFDRpeSU1XT+LRmDUgPaKbYdHDn9suF/tu13nHJij0N97LfS0QmqONuyONk7zvUI6Qa0pF9f2+oABL92AT6e0U//z9YqAiWtJLU1JK0gS+1aacwamiNqK067u9ZQ8f1d4qLodMzz3uL89Z68V/Hnr++hXWUuHgw8dfi972PeTyPefu3aNNucemQ74qFuIaJnVkOu4Q+yjuwmmC1FqZpl1i4uzoPxjkpPf3Xv545tl26Rr+dOvUd+omqJzch9dOeU7f10Y64nMcKK137DccIZq2WdXtdZjbEoLSzHwiMtrjYLDxpHQW8gjMX6XFYAE2zSWVD04EGYSs9MbO6sEo20BMEAB4mpvSypsKjZ4Stgzb+c3A9/MQT2+vrBy+qvyFxLUtLlSRF/Ri2wjfZ2dus2Q8lXx4608/jnqK5OOap6NY2PSjYYnECCjiEeLJll/pbmqfeIK+ps3+MxrlEhqmTPipVP7kqlF4VhpEb6r+Q7YOJg38kJ9SHBf3NBl6+9YchfbUjb5ahLSzUM3kPHmwFAsZ5rpai0S7E5xWzZ1j+fW7zsUWP2g5NXTw52ySCTrgG0+lbw60l2Y/CB185CoA8NK+tbRKxfjy6pm5hzQRRR+cMqv1Jbiw6STivtEvt3DRcy0QEh92JlUGo2PG4tSKHl00YD6xc8CK+YPYyy3io2lN8BcSjKRzrIV6ypOAobqxViJPaT9M9Hy5szY33mp7OX/Zu89L/7Ww5vqY2Y8b0pKgoiUhG5cPDPzq8qTV/WkzUOIvXVVA96kmjcBrr3HrYC/Wn+fYP6Z7T1rqy3zknbvqma/FvVk96fNXGkuaXrdHW5JGSxZT/2I/O73v+yNWafMdzc5NdxYurHs6h86e01sLKLz9EBrg+x36rxAaED7hRnAMx7Vzu+9wabh3zG8XLQjx0ablUJzmxdErxYT3kzQSd0SSafVqF5PXgpp0OyYJ1EyNHpGUZmvK575ySzd85JSqF7IBzSAbMM04+MbE58xF3/njXOGecSaermlw2y9PsSQdytLJVr8t+wg+rR8cZYoeNxVIzNdk3Bngi8U5LAlgTFoQnzJCa5EsCgYhCaGL+qPj7TdhG31p9tej3R04N//PXxNwJvyUqwaJqRPJY98TJ5TPndmflRAkAhBfe46sfKW5wizSge08Xb7Ca/GUVs55trngkKkrUS2WPzKttaaqq+idmahugkY+W6fN0I6i3gPt/x88U4wAAeJxjYGRgYADiGU9YXsXz23xl4GZnAIFH7fO+IdMc/WBxDgYmEAUASbMKwAB4nGNgZGBgZwABjj4Ghv//OfoZGBlQgT4ARicDZAAAAHicY2BgYGAfxJijD8Fmu4EqBwCSpgKpAAAAAAAADgBoAH4AzADgAQIBQgFsAZgB7gIuAooC0AL8A2IDjAOoA+AEMASwBNoFCAVaBcAGCAYuBnAGrAb2B04HigfSCCoIcAiGCJwIyAkkCVYJiAmsCfIKIApWCsQLknicY2BkYGDQZ2hmYGcAASYg5gJCBob/YD4DABqrAdAAeJxdkE1qg0AYhl8Tk9AIoVDaVSmzahcF87PMARLIMoFAl0ZHY1BHdBJIT9AT9AQ9RQ9Qeqy+yteNMzDzfM+88w0K4BY/cNAMB6N2bUaPPBLukybCLvleeAAPj8JD+hfhMV7hC3u4wxs7OO4NzQSZcI/8Ltwnfwi75E/hAR7wJTyk/xYeY49fYQ/PztM+jbTZ7LY6OWdBJdX/pqs6NYWa+zMxa13oKrA6Uoerqi/JwtpYxZXJ1coUVmeZUWVlTjq0/tHacjmdxuL90OR8O0UEDYMNdtiSEpz5XQGqzlm30kzUdAYFFOb8R7NOZk0q2lwAyz1i7oAr1xoXvrOgtYhZx8wY5KRV269JZ5yGpmzPTjQhvY9je6vEElPOuJP3mWKnP5M3V+YAAAB4nG2ReVPbMBDF/ULi2EkDBFqO3gdHLxUzDB9IkdexBllydRD49ihO3Ckz7B/a31utZnafkkGyiXnyclxhgB0MMUKKMTLkmGCKV5hhF3vYxxwHOMRrvMERjnGCU7zFO7zHB3zEJ3zGF3zFN5zhHBe4xHf8wE/8wm8w/MEVimTYKv44XR9MSCsUjVoeHE3vjQoNsSZ4mmxZmVWPjSz7jlou6/0qKOWEJdKMtCe793/hQfqxa6XWZHMXFl56RS4TvPXSaDeoy0zUUZB109KstDK8lHo5q6Qi1hcOnqkImubPS6aqRq7mlnaEWabub4iYblba3SRmgldS0+FWdhNtt04F14JUaqkl7tcpOpJtErvNt3Bd9HRT5JWxK25Ldjvp6br4hzfFiIdSmlzTg2fSUzNrLd1LE1ynxq4OVaVoKLjzJ60UPtj1RKzHzsbjly6inVnFBS2MucviPncU7Rr7lfTxRepDs1A2j3ZHRc7PuzFYSfE3ZOd4kjwBy227hA==) format("woff");font-weight:400;font-style:normal}.vjs-icon-play,.video-js .vjs-play-control .vjs-icon-placeholder,.video-js .vjs-big-play-button .vjs-icon-placeholder:before{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-play:before,.video-js .vjs-play-control .vjs-icon-placeholder:before,.video-js .vjs-big-play-button .vjs-icon-placeholder:before{content:""}.vjs-icon-play-circle{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-play-circle:before{content:""}.vjs-icon-pause,.video-js .vjs-play-control.vjs-playing .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-pause:before,.video-js .vjs-play-control.vjs-playing .vjs-icon-placeholder:before{content:""}.vjs-icon-volume-mute,.video-js .vjs-mute-control.vjs-vol-0 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-volume-mute:before,.video-js .vjs-mute-control.vjs-vol-0 .vjs-icon-placeholder:before{content:""}.vjs-icon-volume-low,.video-js .vjs-mute-control.vjs-vol-1 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-volume-low:before,.video-js .vjs-mute-control.vjs-vol-1 .vjs-icon-placeholder:before{content:""}.vjs-icon-volume-mid,.video-js .vjs-mute-control.vjs-vol-2 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-volume-mid:before,.video-js .vjs-mute-control.vjs-vol-2 .vjs-icon-placeholder:before{content:""}.vjs-icon-volume-high,.video-js .vjs-mute-control .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-volume-high:before,.video-js .vjs-mute-control .vjs-icon-placeholder:before{content:""}.vjs-icon-fullscreen-enter,.video-js .vjs-fullscreen-control .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-fullscreen-enter:before,.video-js .vjs-fullscreen-control .vjs-icon-placeholder:before{content:""}.vjs-icon-fullscreen-exit,.video-js.vjs-fullscreen .vjs-fullscreen-control .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-fullscreen-exit:before,.video-js.vjs-fullscreen .vjs-fullscreen-control .vjs-icon-placeholder:before{content:""}.vjs-icon-spinner{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-spinner:before{content:""}.vjs-icon-subtitles,.video-js .vjs-subs-caps-button .vjs-icon-placeholder,.video-js.video-js:lang(en-GB) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js.video-js:lang(en-IE) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js.video-js:lang(en-AU) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js.video-js:lang(en-NZ) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js .vjs-subtitles-button .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-subtitles:before,.video-js .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js.video-js:lang(en-GB) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js.video-js:lang(en-IE) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js.video-js:lang(en-AU) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js.video-js:lang(en-NZ) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js .vjs-subtitles-button .vjs-icon-placeholder:before{content:""}.vjs-icon-captions,.video-js:lang(en) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js:lang(fr-CA) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js .vjs-captions-button .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-captions:before,.video-js:lang(en) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js:lang(fr-CA) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js .vjs-captions-button .vjs-icon-placeholder:before{content:""}.vjs-icon-hd{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-hd:before{content:""}.vjs-icon-chapters,.video-js .vjs-chapters-button .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-chapters:before,.video-js .vjs-chapters-button .vjs-icon-placeholder:before{content:""}.vjs-icon-downloading{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-downloading:before{content:""}.vjs-icon-file-download{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-file-download:before{content:""}.vjs-icon-file-download-done{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-file-download-done:before{content:""}.vjs-icon-file-download-off{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-file-download-off:before{content:""}.vjs-icon-share{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-share:before{content:""}.vjs-icon-cog{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-cog:before{content:""}.vjs-icon-square{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-square:before{content:""}.vjs-icon-circle,.vjs-seek-to-live-control .vjs-icon-placeholder,.video-js .vjs-volume-level,.video-js .vjs-play-progress{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-circle:before,.vjs-seek-to-live-control .vjs-icon-placeholder:before,.video-js .vjs-volume-level:before,.video-js .vjs-play-progress:before{content:""}.vjs-icon-circle-outline{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-circle-outline:before{content:""}.vjs-icon-circle-inner-circle{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-circle-inner-circle:before{content:""}.vjs-icon-cancel,.video-js .vjs-control.vjs-close-button .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-cancel:before,.video-js .vjs-control.vjs-close-button .vjs-icon-placeholder:before{content:""}.vjs-icon-repeat{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-repeat:before{content:""}.vjs-icon-replay,.video-js .vjs-play-control.vjs-ended .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-replay:before,.video-js .vjs-play-control.vjs-ended .vjs-icon-placeholder:before{content:""}.vjs-icon-replay-5,.video-js .vjs-skip-backward-5 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-replay-5:before,.video-js .vjs-skip-backward-5 .vjs-icon-placeholder:before{content:""}.vjs-icon-replay-10,.video-js .vjs-skip-backward-10 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-replay-10:before,.video-js .vjs-skip-backward-10 .vjs-icon-placeholder:before{content:""}.vjs-icon-replay-30,.video-js .vjs-skip-backward-30 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-replay-30:before,.video-js .vjs-skip-backward-30 .vjs-icon-placeholder:before{content:""}.vjs-icon-forward-5,.video-js .vjs-skip-forward-5 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-forward-5:before,.video-js .vjs-skip-forward-5 .vjs-icon-placeholder:before{content:""}.vjs-icon-forward-10,.video-js .vjs-skip-forward-10 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-forward-10:before,.video-js .vjs-skip-forward-10 .vjs-icon-placeholder:before{content:""}.vjs-icon-forward-30,.video-js .vjs-skip-forward-30 .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-forward-30:before,.video-js .vjs-skip-forward-30 .vjs-icon-placeholder:before{content:""}.vjs-icon-audio,.video-js .vjs-audio-button .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-audio:before,.video-js .vjs-audio-button .vjs-icon-placeholder:before{content:""}.vjs-icon-next-item{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-next-item:before{content:""}.vjs-icon-previous-item{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-previous-item:before{content:""}.vjs-icon-shuffle{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-shuffle:before{content:""}.vjs-icon-cast{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-cast:before{content:""}.vjs-icon-picture-in-picture-enter,.video-js .vjs-picture-in-picture-control .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-picture-in-picture-enter:before,.video-js .vjs-picture-in-picture-control .vjs-icon-placeholder:before{content:""}.vjs-icon-picture-in-picture-exit,.video-js.vjs-picture-in-picture .vjs-picture-in-picture-control .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-picture-in-picture-exit:before,.video-js.vjs-picture-in-picture .vjs-picture-in-picture-control .vjs-icon-placeholder:before{content:""}.vjs-icon-facebook{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-facebook:before{content:""}.vjs-icon-linkedin{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-linkedin:before{content:""}.vjs-icon-twitter{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-twitter:before{content:""}.vjs-icon-tumblr{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-tumblr:before{content:""}.vjs-icon-pinterest{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-pinterest:before{content:""}.vjs-icon-audio-description,.video-js .vjs-descriptions-button .vjs-icon-placeholder{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-audio-description:before,.video-js .vjs-descriptions-button .vjs-icon-placeholder:before{content:""}.video-js{display:inline-block;vertical-align:top;box-sizing:border-box;color:#fff;background-color:#000;position:relative;padding:0;font-size:10px;line-height:1;font-weight:400;font-style:normal;font-family:Arial,Helvetica,sans-serif;word-break:initial}.video-js:-moz-full-screen{position:absolute}.video-js:-webkit-full-screen{width:100%!important;height:100%!important}.video-js[tabindex="-1"]{outline:none}.video-js *,.video-js *:before,.video-js *:after{box-sizing:inherit}.video-js ul{font-family:inherit;font-size:inherit;line-height:inherit;list-style-position:outside;margin:0}.video-js.vjs-fluid,.video-js.vjs-16-9,.video-js.vjs-4-3,.video-js.vjs-9-16,.video-js.vjs-1-1{width:100%;max-width:100%}.video-js.vjs-fluid:not(.vjs-audio-only-mode),.video-js.vjs-16-9:not(.vjs-audio-only-mode),.video-js.vjs-4-3:not(.vjs-audio-only-mode),.video-js.vjs-9-16:not(.vjs-audio-only-mode),.video-js.vjs-1-1:not(.vjs-audio-only-mode){height:0}.video-js.vjs-16-9:not(.vjs-audio-only-mode){padding-top:56.25%}.video-js.vjs-4-3:not(.vjs-audio-only-mode){padding-top:75%}.video-js.vjs-9-16:not(.vjs-audio-only-mode){padding-top:177.7777777778%}.video-js.vjs-1-1:not(.vjs-audio-only-mode){padding-top:100%}.video-js.vjs-fill:not(.vjs-audio-only-mode){width:100%;height:100%}.video-js .vjs-tech{position:absolute;top:0;left:0;width:100%;height:100%}.video-js.vjs-audio-only-mode .vjs-tech{display:none}body.vjs-full-window,body.vjs-pip-window{padding:0;margin:0;height:100%}.vjs-full-window .video-js.vjs-fullscreen,body.vjs-pip-window .video-js{position:fixed;overflow:hidden;z-index:1000;left:0;top:0;bottom:0;right:0}.video-js.vjs-fullscreen:not(.vjs-ios-native-fs),body.vjs-pip-window .video-js{width:100%!important;height:100%!important;padding-top:0!important;display:block}.video-js.vjs-fullscreen.vjs-user-inactive{cursor:none}.vjs-pip-container .vjs-pip-text{position:absolute;bottom:10%;font-size:2em;background-color:#000000b3;padding:.5em;text-align:center;width:100%}.vjs-layout-tiny.vjs-pip-container .vjs-pip-text,.vjs-layout-x-small.vjs-pip-container .vjs-pip-text,.vjs-layout-small.vjs-pip-container .vjs-pip-text{bottom:0;font-size:1.4em}.vjs-hidden{display:none!important}.vjs-disabled{opacity:.5;cursor:default}.video-js .vjs-offscreen{height:1px;left:-9999px;position:absolute;top:0;width:1px}.vjs-lock-showing{display:block!important;opacity:1!important;visibility:visible!important}.vjs-no-js{padding:20px;color:#fff;background-color:#000;font-size:18px;font-family:Arial,Helvetica,sans-serif;text-align:center;width:300px;height:150px;margin:0 auto}.vjs-no-js a,.vjs-no-js a:visited{color:#66a8cc}.video-js .vjs-big-play-button{font-size:3em;line-height:1.5em;height:1.63332em;width:3em;display:block;position:absolute;top:50%;left:50%;padding:0;margin-top:-.81666em;margin-left:-1.5em;cursor:pointer;opacity:1;border:.06666em solid #fff;background-color:#2b333f;background-color:#2b333fb3;border-radius:.3em;transition:all .4s}.vjs-big-play-button .vjs-svg-icon{width:1em;height:1em;position:absolute;top:50%;left:50%;line-height:1;transform:translate(-50%,-50%)}.video-js:hover .vjs-big-play-button,.video-js .vjs-big-play-button:focus{border-color:#fff;background-color:#73859f;background-color:#73859f80;transition:all 0s}.vjs-controls-disabled .vjs-big-play-button,.vjs-has-started .vjs-big-play-button,.vjs-using-native-controls .vjs-big-play-button,.vjs-error .vjs-big-play-button{display:none}.vjs-has-started.vjs-paused.vjs-show-big-play-button-on-pause:not(.vjs-seeking,.vjs-scrubbing,.vjs-error) .vjs-big-play-button{display:block}.video-js button{background:none;border:none;color:inherit;display:inline-block;font-size:inherit;line-height:inherit;text-transform:none;text-decoration:none;transition:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.video-js.vjs-spatial-navigation-enabled .vjs-button:focus{outline:.0625em solid white;box-shadow:none}.vjs-control .vjs-button{width:100%;height:100%}.video-js .vjs-control.vjs-close-button{cursor:pointer;height:3em;position:absolute;right:0;top:.5em;z-index:2}.video-js .vjs-modal-dialog{background:rgba(0,0,0,.8);background:linear-gradient(180deg,rgba(0,0,0,.8),rgba(255,255,255,0));overflow:auto}.video-js .vjs-modal-dialog>*{box-sizing:border-box}.vjs-modal-dialog .vjs-modal-dialog-content{font-size:1.2em;line-height:1.5;padding:20px 24px;z-index:1}.vjs-menu-button{cursor:pointer}.vjs-menu-button.vjs-disabled{cursor:default}.vjs-workinghover .vjs-menu-button.vjs-disabled:hover .vjs-menu{display:none}.vjs-menu .vjs-menu-content{display:block;padding:0;margin:0;font-family:Arial,Helvetica,sans-serif;overflow:auto}.vjs-menu .vjs-menu-content>*{box-sizing:border-box}.vjs-scrubbing .vjs-control.vjs-menu-button:hover .vjs-menu{display:none}.vjs-menu li{display:flex;justify-content:center;list-style:none;margin:0;padding:.2em 0;line-height:1.4em;font-size:1.2em;text-align:center;text-transform:lowercase}.vjs-menu li.vjs-menu-item:focus,.vjs-menu li.vjs-menu-item:hover,.js-focus-visible .vjs-menu li.vjs-menu-item:hover{background-color:#73859f;background-color:#73859f80}.vjs-menu li.vjs-selected,.vjs-menu li.vjs-selected:focus,.vjs-menu li.vjs-selected:hover,.js-focus-visible .vjs-menu li.vjs-selected:hover{background-color:#fff;color:#2b333f}.vjs-menu li.vjs-selected .vjs-svg-icon,.vjs-menu li.vjs-selected:focus .vjs-svg-icon,.vjs-menu li.vjs-selected:hover .vjs-svg-icon,.js-focus-visible .vjs-menu li.vjs-selected:hover .vjs-svg-icon{fill:#000}.video-js .vjs-menu *:not(.vjs-selected):focus:not(:focus-visible),.js-focus-visible .vjs-menu *:not(.vjs-selected):focus:not(.focus-visible){background:none}.vjs-menu li.vjs-menu-title{text-align:center;text-transform:uppercase;font-size:1em;line-height:2em;padding:0;margin:0 0 .3em;font-weight:700;cursor:default}.vjs-menu-button-popup .vjs-menu{display:none;position:absolute;bottom:0;width:10em;left:-3em;height:0em;margin-bottom:1.5em;border-top-color:#2b333fb3}.vjs-pip-window .vjs-menu-button-popup .vjs-menu{left:unset;right:1em}.vjs-menu-button-popup .vjs-menu .vjs-menu-content{background-color:#2b333f;background-color:#2b333fb3;position:absolute;width:100%;bottom:1.5em;max-height:15em}.vjs-layout-tiny .vjs-menu-button-popup .vjs-menu .vjs-menu-content,.vjs-layout-x-small .vjs-menu-button-popup .vjs-menu .vjs-menu-content{max-height:5em}.vjs-layout-small .vjs-menu-button-popup .vjs-menu .vjs-menu-content{max-height:10em}.vjs-layout-medium .vjs-menu-button-popup .vjs-menu .vjs-menu-content{max-height:14em}.vjs-layout-large .vjs-menu-button-popup .vjs-menu .vjs-menu-content,.vjs-layout-x-large .vjs-menu-button-popup .vjs-menu .vjs-menu-content,.vjs-layout-huge .vjs-menu-button-popup .vjs-menu .vjs-menu-content{max-height:25em}.vjs-workinghover .vjs-menu-button-popup.vjs-hover .vjs-menu,.vjs-menu-button-popup .vjs-menu.vjs-lock-showing{display:block}.video-js .vjs-menu-button-inline{transition:all .4s;overflow:hidden}.video-js .vjs-menu-button-inline:before{width:2.222222222em}.video-js .vjs-menu-button-inline:hover,.video-js .vjs-menu-button-inline:focus,.video-js .vjs-menu-button-inline.vjs-slider-active{width:12em}.vjs-menu-button-inline .vjs-menu{opacity:0;height:100%;width:auto;position:absolute;left:4em;top:0;padding:0;margin:0;transition:all .4s}.vjs-menu-button-inline:hover .vjs-menu,.vjs-menu-button-inline:focus .vjs-menu,.vjs-menu-button-inline.vjs-slider-active .vjs-menu{display:block;opacity:1}.vjs-menu-button-inline .vjs-menu-content{width:auto;height:100%;margin:0;overflow:hidden}.video-js .vjs-control-bar{display:none;width:100%;position:absolute;bottom:0;left:0;right:0;height:3em;background-color:#2b333f;background-color:#2b333fb3}.video-js.vjs-spatial-navigation-enabled .vjs-control-bar{gap:1px}.video-js:not(.vjs-controls-disabled,.vjs-using-native-controls,.vjs-error) .vjs-control-bar.vjs-lock-showing{display:flex!important}.vjs-has-started .vjs-control-bar,.vjs-audio-only-mode .vjs-control-bar{display:flex;visibility:visible;opacity:1;transition:visibility .1s,opacity .1s}.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar{visibility:visible;opacity:0;pointer-events:none;transition:visibility 1s,opacity 1s}.vjs-controls-disabled .vjs-control-bar,.vjs-using-native-controls .vjs-control-bar,.vjs-error .vjs-control-bar{display:none!important}.vjs-audio.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar,.vjs-audio-only-mode.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar{opacity:1;visibility:visible;pointer-events:auto}.video-js .vjs-control{position:relative;text-align:center;margin:0;padding:0;height:100%;width:4em;flex:none}.video-js .vjs-control.vjs-visible-text{width:auto;padding-left:1em;padding-right:1em}.vjs-button>.vjs-icon-placeholder:before{font-size:1.8em;line-height:1.67}.vjs-button>.vjs-icon-placeholder{display:block}.vjs-button>.vjs-svg-icon{display:inline-block}.video-js .vjs-control:focus:before,.video-js .vjs-control:hover:before,.video-js .vjs-control:focus{text-shadow:0em 0em 1em white}.video-js *:not(.vjs-visible-text)>.vjs-control-text{border:0;clip:rect(0 0 0 0);height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.video-js .vjs-custom-control-spacer{display:none}.video-js .vjs-progress-control{cursor:pointer;flex:auto;display:flex;align-items:center;min-width:4em;touch-action:none}.video-js .vjs-progress-control.disabled{cursor:default}.vjs-live .vjs-progress-control{display:none}.vjs-liveui .vjs-progress-control{display:flex;align-items:center}.video-js .vjs-progress-holder{flex:auto;transition:all .2s;height:.3em}.video-js .vjs-progress-control .vjs-progress-holder{margin:0 10px}.video-js .vjs-progress-control:hover .vjs-progress-holder,.video-js.vjs-scrubbing.vjs-touch-enabled .vjs-progress-control .vjs-progress-holder{font-size:1.6666666667em}.video-js .vjs-progress-control:hover .vjs-progress-holder.disabled{font-size:1em}.video-js .vjs-progress-holder .vjs-play-progress,.video-js .vjs-progress-holder .vjs-load-progress,.video-js .vjs-progress-holder .vjs-load-progress div{position:absolute;display:block;height:100%;margin:0;padding:0;width:0}.video-js .vjs-play-progress{background-color:#fff}.video-js .vjs-play-progress:before{font-size:.9em;position:absolute;right:-.5em;line-height:.35em;z-index:1}.vjs-svg-icons-enabled .vjs-play-progress:before{content:none!important}.vjs-play-progress .vjs-svg-icon{position:absolute;top:-.35em;right:-.4em;width:.9em;height:.9em;pointer-events:none;line-height:.15em;z-index:1}.video-js .vjs-load-progress{background:rgba(114.9141509434,132.7028301887,159.3858490566,.5)}.video-js .vjs-load-progress div{background:rgba(114.9141509434,132.7028301887,159.3858490566,.75)}.video-js .vjs-time-tooltip{background-color:#fff;background-color:#fffc;border-radius:.3em;color:#000;float:right;font-family:Arial,Helvetica,sans-serif;font-size:1em;padding:6px 8px 8px;pointer-events:none;position:absolute;top:-3.4em;visibility:hidden;z-index:1}.video-js .vjs-progress-holder:focus .vjs-time-tooltip{display:none}.video-js .vjs-progress-control:hover .vjs-time-tooltip,.video-js .vjs-progress-control:hover .vjs-progress-holder:focus .vjs-time-tooltip,.video-js.vjs-scrubbing.vjs-touch-enabled .vjs-progress-control .vjs-time-tooltip{display:block;font-size:.6em;visibility:visible}.video-js .vjs-progress-control.disabled:hover .vjs-time-tooltip{font-size:1em}.video-js .vjs-progress-control .vjs-mouse-display{display:none;position:absolute;width:1px;height:100%;background-color:#000;z-index:1}.video-js .vjs-progress-control:hover .vjs-mouse-display,.video-js.vjs-scrubbing.vjs-touch-enabled .vjs-progress-control .vjs-mouse-display{display:block}.video-js.vjs-user-inactive .vjs-progress-control .vjs-mouse-display,.video-js.vjs-touch-enabled:not(.vjs-scrubbing) .vjs-progress-control .vjs-mouse-display{visibility:hidden;opacity:0;transition:visibility 1s,opacity 1s}.vjs-mouse-display .vjs-time-tooltip{color:#fff;background-color:#000;background-color:#000c}.video-js .vjs-slider{position:relative;cursor:pointer;padding:0;margin:0 .45em;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;background-color:#73859f;background-color:#73859f80}.video-js .vjs-slider.disabled{cursor:default}.video-js .vjs-slider:focus{text-shadow:0em 0em 1em white;box-shadow:0 0 1em #fff}.video-js.vjs-spatial-navigation-enabled .vjs-slider:focus{outline:.0625em solid white}.video-js .vjs-mute-control{cursor:pointer;flex:none}.video-js .vjs-volume-control{cursor:pointer;margin-right:1em;display:flex}.video-js .vjs-volume-control.vjs-volume-horizontal{width:5em}.video-js .vjs-volume-panel .vjs-volume-control{visibility:visible;opacity:0;width:1px;height:1px;margin-left:-1px}.video-js .vjs-volume-panel{transition:width 1s}.video-js .vjs-volume-panel.vjs-hover .vjs-volume-control,.video-js .vjs-volume-panel:active .vjs-volume-control,.video-js .vjs-volume-panel:focus .vjs-volume-control,.video-js .vjs-volume-panel .vjs-volume-control:active,.video-js .vjs-volume-panel.vjs-hover .vjs-mute-control~.vjs-volume-control,.video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active{visibility:visible;opacity:1;position:relative;transition:visibility .1s,opacity .1s,height .1s,width .1s,left 0s,top 0s}.video-js .vjs-volume-panel.vjs-hover .vjs-volume-control.vjs-volume-horizontal,.video-js .vjs-volume-panel:active .vjs-volume-control.vjs-volume-horizontal,.video-js .vjs-volume-panel:focus .vjs-volume-control.vjs-volume-horizontal,.video-js .vjs-volume-panel .vjs-volume-control:active.vjs-volume-horizontal,.video-js .vjs-volume-panel.vjs-hover .vjs-mute-control~.vjs-volume-control.vjs-volume-horizontal,.video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active.vjs-volume-horizontal{width:5em;height:3em;margin-right:0}.video-js .vjs-volume-panel.vjs-hover .vjs-volume-control.vjs-volume-vertical,.video-js .vjs-volume-panel:active .vjs-volume-control.vjs-volume-vertical,.video-js .vjs-volume-panel:focus .vjs-volume-control.vjs-volume-vertical,.video-js .vjs-volume-panel .vjs-volume-control:active.vjs-volume-vertical,.video-js .vjs-volume-panel.vjs-hover .vjs-mute-control~.vjs-volume-control.vjs-volume-vertical,.video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active.vjs-volume-vertical{left:-3.5em;transition:left 0s}.video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-hover,.video-js .vjs-volume-panel.vjs-volume-panel-horizontal:active,.video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active{width:10em;transition:width .1s}.video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-mute-toggle-only{width:4em}.video-js .vjs-volume-panel .vjs-volume-control.vjs-volume-vertical{height:8em;width:3em;left:-3000em;transition:visibility 1s,opacity 1s,height 1s 1s,width 1s 1s,left 1s 1s,top 1s 1s}.video-js .vjs-volume-panel .vjs-volume-control.vjs-volume-horizontal{transition:visibility 1s,opacity 1s,height 1s 1s,width 1s,left 1s 1s,top 1s 1s}.video-js .vjs-volume-panel{display:flex}.video-js .vjs-volume-bar{margin:1.35em .45em}.vjs-volume-bar.vjs-slider-horizontal{width:5em;height:.3em}.vjs-volume-bar.vjs-slider-vertical{width:.3em;height:5em;margin:1.35em auto}.video-js .vjs-volume-level{position:absolute;bottom:0;left:0;background-color:#fff}.video-js .vjs-volume-level:before{position:absolute;font-size:.9em;z-index:1}.vjs-slider-vertical .vjs-volume-level{width:.3em}.vjs-slider-vertical .vjs-volume-level:before{top:-.5em;left:-.3em;z-index:1}.vjs-svg-icons-enabled .vjs-volume-level:before{content:none}.vjs-volume-level .vjs-svg-icon{position:absolute;width:.9em;height:.9em;pointer-events:none;z-index:1}.vjs-slider-horizontal .vjs-volume-level{height:.3em}.vjs-slider-horizontal .vjs-volume-level:before{line-height:.35em;right:-.5em}.vjs-slider-horizontal .vjs-volume-level .vjs-svg-icon{right:-.3em;transform:translateY(-50%)}.vjs-slider-vertical .vjs-volume-level .vjs-svg-icon{top:-.55em;transform:translate(-50%)}.video-js .vjs-volume-panel.vjs-volume-panel-vertical{width:4em}.vjs-volume-bar.vjs-slider-vertical .vjs-volume-level{height:100%}.vjs-volume-bar.vjs-slider-horizontal .vjs-volume-level{width:100%}.video-js .vjs-volume-vertical{width:3em;height:8em;bottom:8em;background-color:#2b333f;background-color:#2b333fb3}.video-js .vjs-volume-horizontal .vjs-menu{left:-2em}.video-js .vjs-volume-tooltip{background-color:#fff;background-color:#fffc;border-radius:.3em;color:#000;float:right;font-family:Arial,Helvetica,sans-serif;font-size:1em;padding:6px 8px 8px;pointer-events:none;position:absolute;top:-3.4em;visibility:hidden;z-index:1}.video-js .vjs-volume-control:hover .vjs-volume-tooltip,.video-js .vjs-volume-control:hover .vjs-progress-holder:focus .vjs-volume-tooltip{display:block;font-size:1em;visibility:visible}.video-js .vjs-volume-vertical:hover .vjs-volume-tooltip,.video-js .vjs-volume-vertical:hover .vjs-progress-holder:focus .vjs-volume-tooltip{left:1em;top:-12px}.video-js .vjs-volume-control.disabled:hover .vjs-volume-tooltip{font-size:1em}.video-js .vjs-volume-control .vjs-mouse-display{display:none;position:absolute;width:100%;height:1px;background-color:#000;z-index:1}.video-js .vjs-volume-horizontal .vjs-mouse-display{width:1px;height:100%}.video-js .vjs-volume-control:hover .vjs-mouse-display{display:block}.video-js.vjs-user-inactive .vjs-volume-control .vjs-mouse-display{visibility:hidden;opacity:0;transition:visibility 1s,opacity 1s}.vjs-mouse-display .vjs-volume-tooltip{color:#fff;background-color:#000;background-color:#000c}.vjs-poster{display:inline-block;vertical-align:middle;cursor:pointer;margin:0;padding:0;position:absolute;top:0;right:0;bottom:0;left:0;height:100%}.vjs-has-started .vjs-poster,.vjs-using-native-controls .vjs-poster{display:none}.vjs-audio.vjs-has-started .vjs-poster,.vjs-has-started.vjs-audio-poster-mode .vjs-poster,.vjs-pip-container.vjs-has-started .vjs-poster{display:block}.vjs-poster img{width:100%;height:100%;object-fit:contain}.video-js .vjs-live-control{display:flex;align-items:flex-start;flex:auto;font-size:1em;line-height:3em}.video-js:not(.vjs-live) .vjs-live-control,.video-js.vjs-liveui .vjs-live-control{display:none}.video-js .vjs-seek-to-live-control{align-items:center;cursor:pointer;flex:none;display:inline-flex;height:100%;padding-left:.5em;padding-right:.5em;font-size:1em;line-height:3em;width:auto;min-width:4em}.video-js.vjs-live:not(.vjs-liveui) .vjs-seek-to-live-control,.video-js:not(.vjs-live) .vjs-seek-to-live-control{display:none}.vjs-seek-to-live-control.vjs-control.vjs-at-live-edge{cursor:auto}.vjs-seek-to-live-control .vjs-icon-placeholder{margin-right:.5em;color:#888}.vjs-svg-icons-enabled .vjs-seek-to-live-control{line-height:0}.vjs-seek-to-live-control .vjs-svg-icon{width:1em;height:1em;pointer-events:none;fill:#888}.vjs-seek-to-live-control.vjs-control.vjs-at-live-edge .vjs-icon-placeholder{color:red}.vjs-seek-to-live-control.vjs-control.vjs-at-live-edge .vjs-svg-icon{fill:red}.video-js .vjs-time-control{flex:none;font-size:1em;line-height:3em;min-width:2em;width:auto;padding-left:1em;padding-right:1em}.vjs-live .vjs-time-control,.vjs-live .vjs-time-divider,.video-js .vjs-current-time,.video-js .vjs-duration{display:none}.vjs-time-divider{display:none;line-height:3em}.vjs-normalise-time-controls:not(.vjs-live) .vjs-time-control{display:flex}.video-js .vjs-play-control{cursor:pointer}.video-js .vjs-play-control .vjs-icon-placeholder{flex:none}.vjs-text-track-display{position:absolute;bottom:3em;left:0;right:0;top:0;pointer-events:none}.vjs-error .vjs-text-track-display{display:none}.video-js.vjs-controls-disabled .vjs-text-track-display,.video-js.vjs-user-inactive.vjs-playing .vjs-text-track-display{bottom:1em}.video-js .vjs-text-track{font-size:1.4em;text-align:center;margin-bottom:.1em}.vjs-subtitles{color:#fff}.vjs-captions{color:#fc6}.vjs-tt-cue{display:block}video::-webkit-media-text-track-display{transform:translateY(-3em)}.video-js.vjs-controls-disabled video::-webkit-media-text-track-display,.video-js.vjs-user-inactive.vjs-playing video::-webkit-media-text-track-display{transform:translateY(-1.5em)}.video-js.vjs-force-center-align-cues .vjs-text-track-cue{text-align:center!important;width:80%!important}@supports not (inset: 10px){.video-js .vjs-text-track-display>div{top:0;right:0;bottom:0;left:0}}.video-js .vjs-picture-in-picture-control{cursor:pointer;flex:none}.video-js.vjs-audio-only-mode .vjs-picture-in-picture-control,.vjs-pip-window .vjs-picture-in-picture-control{display:none}.video-js .vjs-fullscreen-control{cursor:pointer;flex:none}.video-js.vjs-audio-only-mode .vjs-fullscreen-control,.vjs-pip-window .vjs-fullscreen-control{display:none}.vjs-playback-rate>.vjs-menu-button,.vjs-playback-rate .vjs-playback-rate-value{position:absolute;top:0;left:0;width:100%;height:100%}.vjs-playback-rate .vjs-playback-rate-value{pointer-events:none;font-size:1.5em;line-height:2;text-align:center}.vjs-playback-rate .vjs-menu{width:4em;left:0}.vjs-error .vjs-error-display .vjs-modal-dialog-content{font-size:1.4em;text-align:center}.vjs-loading-spinner{display:none;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);opacity:.85;text-align:left;border:.6em solid rgba(43,51,63,.7);box-sizing:border-box;background-clip:padding-box;width:5em;height:5em;border-radius:50%;visibility:hidden}.vjs-seeking .vjs-loading-spinner,.vjs-waiting .vjs-loading-spinner{display:flex;justify-content:center;align-items:center;animation:vjs-spinner-show 0s linear .3s forwards}.vjs-error .vjs-loading-spinner{display:none}.vjs-loading-spinner:before,.vjs-loading-spinner:after{content:"";position:absolute;box-sizing:inherit;width:inherit;height:inherit;border-radius:inherit;opacity:1;border:inherit;border-color:transparent;border-top-color:#fff}.vjs-seeking .vjs-loading-spinner:before,.vjs-seeking .vjs-loading-spinner:after,.vjs-waiting .vjs-loading-spinner:before,.vjs-waiting .vjs-loading-spinner:after{animation:vjs-spinner-spin 1.1s cubic-bezier(.6,.2,0,.8) infinite,vjs-spinner-fade 1.1s linear infinite}.vjs-seeking .vjs-loading-spinner:before,.vjs-waiting .vjs-loading-spinner:before{border-top-color:#fff}.vjs-seeking .vjs-loading-spinner:after,.vjs-waiting .vjs-loading-spinner:after{border-top-color:#fff;animation-delay:.44s}@keyframes vjs-spinner-show{to{visibility:visible}}@keyframes vjs-spinner-spin{to{transform:rotate(360deg)}}@keyframes vjs-spinner-fade{0%{border-top-color:#73859f}20%{border-top-color:#73859f}35%{border-top-color:#fff}60%{border-top-color:#73859f}to{border-top-color:#73859f}}.video-js.vjs-audio-only-mode .vjs-captions-button{display:none}.vjs-chapters-button .vjs-menu ul{width:24em}.video-js.vjs-audio-only-mode .vjs-descriptions-button{display:none}.vjs-subs-caps-button+.vjs-menu .vjs-captions-menu-item .vjs-svg-icon{width:1.5em;height:1.5em}.video-js .vjs-subs-caps-button+.vjs-menu .vjs-captions-menu-item .vjs-menu-item-text .vjs-icon-placeholder{vertical-align:middle;display:inline-block;margin-bottom:-.1em}.video-js .vjs-subs-caps-button+.vjs-menu .vjs-captions-menu-item .vjs-menu-item-text .vjs-icon-placeholder:before{font-family:VideoJS;content:"";font-size:1.5em;line-height:inherit}.video-js.vjs-audio-only-mode .vjs-subs-caps-button{display:none}.video-js .vjs-audio-button+.vjs-menu .vjs-descriptions-menu-item .vjs-menu-item-text .vjs-icon-placeholder,.video-js .vjs-audio-button+.vjs-menu .vjs-main-desc-menu-item .vjs-menu-item-text .vjs-icon-placeholder{vertical-align:middle;display:inline-block;margin-bottom:-.1em}.video-js .vjs-audio-button+.vjs-menu .vjs-descriptions-menu-item .vjs-menu-item-text .vjs-icon-placeholder:before,.video-js .vjs-audio-button+.vjs-menu .vjs-main-desc-menu-item .vjs-menu-item-text .vjs-icon-placeholder:before{font-family:VideoJS;content:" ";font-size:1.5em;line-height:inherit}.video-js.vjs-layout-small .vjs-current-time,.video-js.vjs-layout-small .vjs-time-divider,.video-js.vjs-layout-small .vjs-duration,.video-js.vjs-layout-small .vjs-remaining-time,.video-js.vjs-layout-small .vjs-playback-rate,.video-js.vjs-layout-small .vjs-volume-control,.video-js.vjs-layout-x-small .vjs-current-time,.video-js.vjs-layout-x-small .vjs-time-divider,.video-js.vjs-layout-x-small .vjs-duration,.video-js.vjs-layout-x-small .vjs-remaining-time,.video-js.vjs-layout-x-small .vjs-playback-rate,.video-js.vjs-layout-x-small .vjs-volume-control,.video-js.vjs-layout-tiny .vjs-current-time,.video-js.vjs-layout-tiny .vjs-time-divider,.video-js.vjs-layout-tiny .vjs-duration,.video-js.vjs-layout-tiny .vjs-remaining-time,.video-js.vjs-layout-tiny .vjs-playback-rate,.video-js.vjs-layout-tiny .vjs-volume-control{display:none}.video-js.vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal:hover,.video-js.vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal:active,.video-js.vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active,.video-js.vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-hover,.video-js.vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal:hover,.video-js.vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal:active,.video-js.vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active,.video-js.vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-hover,.video-js.vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal:hover,.video-js.vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal:active,.video-js.vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active,.video-js.vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-hover{width:auto;width:initial}.video-js.vjs-layout-x-small .vjs-progress-control,.video-js.vjs-layout-tiny .vjs-progress-control{display:none}.video-js.vjs-layout-x-small .vjs-custom-control-spacer{flex:auto;display:block}.vjs-modal-dialog.vjs-text-track-settings{background-color:#2b333f;background-color:#2b333fbf;color:#fff;height:70%}.vjs-spatial-navigation-enabled .vjs-modal-dialog.vjs-text-track-settings{height:80%}.vjs-error .vjs-text-track-settings{display:none}.vjs-text-track-settings .vjs-modal-dialog-content{display:table}.vjs-text-track-settings .vjs-track-settings-colors,.vjs-text-track-settings .vjs-track-settings-font,.vjs-text-track-settings .vjs-track-settings-controls{display:table-cell}.vjs-text-track-settings .vjs-track-settings-controls{text-align:right;vertical-align:bottom}@supports (display: grid){.vjs-text-track-settings .vjs-modal-dialog-content{display:grid;grid-template-columns:1fr 1fr;grid-template-rows:1fr;padding:20px 24px 0}.vjs-track-settings-controls .vjs-default-button{margin-bottom:20px}.vjs-text-track-settings .vjs-track-settings-controls{grid-column:1/-1}.vjs-layout-small .vjs-text-track-settings .vjs-modal-dialog-content,.vjs-layout-x-small .vjs-text-track-settings .vjs-modal-dialog-content,.vjs-layout-tiny .vjs-text-track-settings .vjs-modal-dialog-content{grid-template-columns:1fr}}.vjs-text-track-settings select{font-size:inherit}.vjs-track-setting>select{margin-right:1em;margin-bottom:.5em}.vjs-text-track-settings fieldset{margin:10px;border:none}.vjs-text-track-settings fieldset span{display:inline-block;padding:0 .6em .8em}.vjs-text-track-settings fieldset span>select{max-width:7.3em}.vjs-text-track-settings legend{color:#fff;font-weight:700;font-size:1.2em}.vjs-text-track-settings .vjs-label{margin:0 .5em .5em 0}.vjs-track-settings-controls button:focus,.vjs-track-settings-controls button:active{outline-style:solid;outline-width:medium;background-image:linear-gradient(0deg,#fff 88%,rgb(114.9141509434,132.7028301887,159.3858490566) 100%)}.vjs-track-settings-controls button:hover{color:#2b333fbf}.vjs-track-settings-controls button{background-color:#fff;background-image:linear-gradient(-180deg,#fff 88%,rgb(114.9141509434,132.7028301887,159.3858490566) 100%);color:#2b333f;cursor:pointer;border-radius:2px}.vjs-track-settings-controls .vjs-default-button{margin-right:1em}.vjs-title-bar{background:rgba(0,0,0,.9);background:linear-gradient(180deg,rgba(0,0,0,.9) 0%,rgba(0,0,0,.7) 60%,rgba(0,0,0,0) 100%);font-size:1.2em;line-height:1.5;transition:opacity .1s;padding:.666em 1.333em 4em;pointer-events:none;position:absolute;top:0;width:100%}.vjs-error .vjs-title-bar{display:none}.vjs-title-bar-title,.vjs-title-bar-description{margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vjs-title-bar-title{font-weight:700;margin-bottom:.333em}.vjs-playing.vjs-user-inactive .vjs-title-bar{opacity:0;transition:opacity 1s}.video-js .vjs-skip-forward-5,.video-js .vjs-skip-forward-10,.video-js .vjs-skip-forward-30,.video-js .vjs-skip-backward-5,.video-js .vjs-skip-backward-10,.video-js .vjs-skip-backward-30{cursor:pointer}.video-js .vjs-transient-button{position:absolute;height:3em;display:flex;align-items:center;justify-content:center;background-color:#32323280;cursor:pointer;opacity:1;transition:opacity 1s}.video-js:not(.vjs-has-started) .vjs-transient-button{display:none}.video-js.not-hover .vjs-transient-button:not(.force-display),.video-js.vjs-user-inactive .vjs-transient-button:not(.force-display){opacity:0}.video-js .vjs-transient-button span{padding:0 .5em}.video-js .vjs-transient-button.vjs-left{left:1em}.video-js .vjs-transient-button.vjs-right{right:1em}.video-js .vjs-transient-button.vjs-top{top:1em}.video-js .vjs-transient-button.vjs-near-top{top:4em}.video-js .vjs-transient-button.vjs-bottom{bottom:4em}.video-js .vjs-transient-button:hover{background-color:#323232e6}@media print{.video-js>*:not(.vjs-tech):not(.vjs-poster){visibility:hidden}}.vjs-resize-manager{position:absolute;top:0;left:0;width:100%;height:100%;border:none;z-index:-1000}.js-focus-visible .video-js *:focus:not(.focus-visible){outline:none}.video-js *:focus:not(:focus-visible){outline:none}.vjs-autoplay-countdown-overlay{position:absolute;top:0;left:0;width:100%;height:calc(100% - 46px);background:rgba(0,0,0,.85);display:none;flex-direction:column;justify-content:center;align-items:center;z-index:100000;padding:20px;box-sizing:border-box;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);opacity:0;transition:opacity .3s ease-in-out}.vjs-autoplay-countdown-overlay.autoplay-countdown-show{opacity:1}.autoplay-countdown-content{background:linear-gradient(135deg,rgba(0,0,0,.95),rgba(20,20,20,.9));border-radius:20px;padding:50px;max-width:480px;width:100%;text-align:center;box-shadow:0 20px 60px #0006,0 8px 32px #0003,inset 0 1px #ffffff1a;border:1px solid rgba(255,255,255,.15);-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);position:relative;overflow:hidden}.autoplay-countdown-content:before{content:"";position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,rgba(255,255,255,.3),transparent)}.autoplay-countdown-content:after{content:"";position:absolute;top:-50%;left:-50%;width:200%;height:200%;background:radial-gradient(circle,rgba(255,0,0,.05) 0%,transparent 70%);animation:backgroundPulse 4s ease-in-out infinite;pointer-events:none}@keyframes backgroundPulse{0%,to{opacity:.3;transform:scale(1)}50%{opacity:.6;transform:scale(1.1)}}.autoplay-countdown-header{position:relative;z-index:2}.autoplay-countdown-header h3{color:#fff;font-size:26px;font-weight:400;margin:0 0 10px;line-height:1.3;text-shadow:0 2px 4px rgba(0,0,0,.3)}.autoplay-countdown-header h3 span{font-weight:700}.autoplay-countdown-video-info{display:flex;flex-direction:column;align-items:center;gap:20px;text-align:center;position:relative;z-index:2;margin:0 0 50px}.next-video-thumbnail{flex-shrink:0;width:180px;height:101px;border-radius:12px;overflow:hidden;background:#333;position:relative;box-shadow:0 12px 32px #0006,0 4px 16px #0003;border:2px solid rgba(255,255,255,.1);transition:transform .3s ease,box-shadow .3s ease}.next-video-thumbnail:hover{transform:translateY(-4px) scale(1.02);box-shadow:0 16px 40px #00000080,0 8px 24px #0000004d}.next-video-thumbnail img{width:100%;height:100%;object-fit:cover;display:block}.play-overlay{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background:rgba(0,0,0,.8);border-radius:50%;width:64px;height:64px;display:flex;align-items:center;justify-content:center;color:#fff;transition:all .3s ease;box-shadow:0 8px 24px #00000080,0 4px 16px #0000004d;border:3px solid rgba(255,255,255,.2);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.play-overlay:hover{background:rgba(0,0,0,.9);transform:translate(-50%,-50%) scale(1.1);box-shadow:0 12px 32px #0009,0 6px 20px #0006}.play-overlay svg{margin-left:4px;width:28px;height:28px}.next-video-details{flex-grow:1;min-width:0;text-align:center}.next-video-title{color:#999;font-size:18px;font-weight:500;margin:0;line-height:1.4;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;text-shadow:0 2px 4px rgba(0,0,0,.3);letter-spacing:.5px}.next-video-author{color:#bbb;font-size:16px;margin:0 0 8px;line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}.next-video-duration{color:#999;font-size:14px;margin:0;line-height:1.2;font-weight:500}.autoplay-countdown-actions{display:flex;gap:24px;justify-content:center;align-items:center;position:relative;z-index:2;padding:0;margin-top:8px}button.autoplay-play-button,button.autoplay-cancel-button{display:flex;align-items:center;justify-content:center;gap:8px;padding:10px 20px;border:none;border-radius:8px;font-size:13px;font-weight:600;cursor:pointer;transition:all .3s cubic-bezier(.4,0,.2,1);min-width:140px;height:48px;position:relative;overflow:hidden;text-transform:uppercase;letter-spacing:.3px;line-height:1;white-space:nowrap;box-shadow:0 6px 20px #0000004d,inset 0 1px #ffffff1a;text-align:center}button.autoplay-play-button{background:linear-gradient(135deg,#ff0000,#e60000);color:#fff;border:1px solid rgba(255,255,255,.1)}.autoplay-play-button:before{content:"";position:absolute;top:0;left:-100%;width:100%;height:100%;background:linear-gradient(90deg,transparent,rgba(255,255,255,.2),transparent);transition:left .5s ease}.autoplay-play-button:hover{background:linear-gradient(135deg,#ff1a1a,#cc0000);transform:translateY(-2px);box-shadow:0 8px 25px #f006,inset 0 1px #ffffff4d}.autoplay-play-button:hover:before{left:100%}.autoplay-play-button:active{transform:translateY(-1px);box-shadow:0 4px 15px #ff00004d,inset 0 1px #fff3}.autoplay-cancel-button{background:linear-gradient(135deg,#404040,#2a2a2a);color:#fff;border:1px solid rgba(255,255,255,.1);box-shadow:0 6px 20px #0000004d,inset 0 1px #ffffff1a}.autoplay-cancel-button:hover{background:linear-gradient(135deg,#505050,#3a3a3a);transform:translateY(-2px);box-shadow:0 8px 25px #0006,inset 0 1px #fff3}.autoplay-cancel-button:active{transform:translateY(-1px);box-shadow:0 4px 15px #0000004d,inset 0 1px #ffffff1a}.autoplay-play-button svg,.autoplay-cancel-button svg{width:18px;height:18px;flex-shrink:0;filter:drop-shadow(0 1px 2px rgba(0,0,0,.3));transition:transform .3s ease;position:relative;z-index:1;display:block;margin:0;padding:0;vertical-align:middle}.autoplay-play-button:hover svg{transform:scale(1.05);filter:drop-shadow(0 2px 4px rgba(0,0,0,.4))}.autoplay-cancel-button svg{width:16px;height:16px}.autoplay-cancel-button:hover svg{transform:scale(1.05) rotate(90deg);filter:drop-shadow(0 2px 4px rgba(0,0,0,.4))}.autoplay-play-button span,.autoplay-cancel-button span{display:inline-block;vertical-align:middle;line-height:1;font-size:inherit;font-weight:inherit;letter-spacing:inherit;text-transform:inherit;position:relative;z-index:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;margin:0;padding:0;height:auto;align-self:center}.autoplay-play-button>*,.autoplay-cancel-button>*{vertical-align:middle;display:inline-block}.autoplay-play-button,.autoplay-cancel-button{align-items:center;justify-content:center}.autoplay-play-button svg,.autoplay-cancel-button svg{vertical-align:middle;display:inline-block}.vjs-autoplay-toggle .vjs-autoplay-icon svg{width:100%;height:100%;display:block}@media (max-width: 767px){.autoplay-countdown-video-info{margin-bottom:20px}.autoplay-countdown-content{padding:24px;max-width:400px}.autoplay-countdown-header h3{font-size:20px}.next-video-thumbnail{width:140px;height:78px}.play-overlay{width:48px;height:48px}.play-overlay svg{width:20px;height:20px}.next-video-title{font-size:18px}.next-video-author{font-size:14px}.autoplay-play-button,.autoplay-cancel-button{padding:12px 24px;font-size:14px;min-width:120px;height:44px;gap:6px;align-items:center;justify-content:center}.autoplay-play-button svg{width:16px;height:16px;vertical-align:middle}.autoplay-cancel-button svg{width:14px;height:14px;vertical-align:middle}}@media (max-width: 480px){.autoplay-countdown-content{padding:20px;max-width:350px}.autoplay-countdown-header h3{font-size:18px}.countdown-timer{font-size:24px;padding:10px 16px}.autoplay-countdown-video-info{gap:16px}.next-video-thumbnail{width:120px;height:68px}.play-overlay{width:40px;height:40px}.play-overlay svg{width:16px;height:16px}.next-video-title{font-size:16px}.next-video-author{font-size:13px}.autoplay-countdown-actions{gap:5px;padding:0}button.autoplay-play-button,button.autoplay-cancel-button{padding:10px 20px;width:120px;height:40px;min-width:120px}.autoplay-play-button,.autoplay-cancel-button{width:100%;min-width:100%;height:46px;gap:6px;padding:10px 20px;font-size:13px;align-items:center;justify-content:center}.autoplay-play-button svg{width:14px;height:14px;vertical-align:middle}.autoplay-cancel-button svg{width:12px;height:12px;vertical-align:middle}}.vjs-settings-button{width:3em;height:3em;display:flex;align-items:center;justify-content:center;padding:0;margin:0}.vjs-icon-cog1{font-size:30px!important;position:relative;top:-8px!important;display:flex;align-items:center;justify-content:center;width:100%;height:100%;line-height:1}.custom-settings-overlay{border:0;position:absolute;bottom:60px;right:20px;width:280px;height:350px;background:rgba(28,28,28,.95);color:#fff;border-radius:7px;box-shadow:0 4px 12px #00000080;display:none;z-index:1000;font-size:14px;overflow:auto}.settings-header{padding:12px 16px;border-bottom:1px solid rgba(255,255,255,.1);font-weight:700}.settings-item{padding:12px 16px;cursor:pointer;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid rgba(255,255,255,.1);transition:background .2s ease;gap:10px}.settings-item .settings-left span{display:flex}.custom-settings-overlay .settings-left span.vjs-icon-placeholder{transform:inherit!important}.settings-item:last-child{border-bottom:none}.settings-item:hover{background:rgba(255,255,255,.05)}.speed-submenu,.quality-submenu,.subtitles-submenu{position:absolute;top:0;left:0;right:0;bottom:0;background:rgba(28,28,28,.95);display:none;flex-direction:column}.subtitle-option{padding:12px 16px;cursor:pointer;display:flex;justify-content:space-between;align-items:center;transition:background .2s ease}.subtitle-option:hover{background:rgba(255,255,255,.05)}.subtitle-option.active{background:rgba(255,255,255,.1)}.submenu-header{padding:12px 16px;border-bottom:1px solid rgba(255,255,255,.1);display:flex;align-items:center;cursor:pointer;position:sticky;top:0;background:rgba(28,28,28,.95);z-index:1}.submenu-header:hover{background:rgba(28,28,28,1)}.speed-option{padding:12px 16px;cursor:pointer;display:flex;justify-content:space-between;align-items:center;transition:background .2s ease}.speed-option:hover{background:rgba(255,255,255,.05)}.speed-option.active{background:rgba(255,255,255,.1)}.quality-option{padding:12px 16px;cursor:pointer;display:flex;justify-content:space-between;align-items:center;transition:background .2s ease}.quality-option:hover{background:rgba(255,255,255,.05)}.quality-option.active{background:rgba(255,255,255,.1)}.settings-left{display:inline-flex;align-items:center;gap:8px}.settings-right{display:inline-flex;align-items:center;text-align:right}sup.hd-badge{font-size:10px;line-height:1;margin-left:6px;background:#e53935;color:#fff;padding:1px 4px;border-radius:3px} diff --git a/static/video_js/video-js.js b/static/video_js/video-js.js index ebbbc555..6e3d1190 100644 --- a/static/video_js/video-js.js +++ b/static/video_js/video-js.js @@ -1,4 +1,4 @@ -(function(){"use strict";var Rf=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Yc(s){return s&&s.__esModule&&Object.prototype.hasOwnProperty.call(s,"default")?s.default:s}function C_(s){if(s.__esModule)return s;var e=s.default;if(typeof e=="function"){var i=function r(){return this instanceof r?Reflect.construct(e,arguments,this.constructor):e.apply(this,arguments)};i.prototype=e.prototype}else i={};return Object.defineProperty(i,"__esModule",{value:!0}),Object.keys(s).forEach(function(r){var o=Object.getOwnPropertyDescriptor(s,r);Object.defineProperty(i,r,o.get?o:{enumerable:!0,get:function(){return s[r]}})}),i}var A_={exports:{}},Wc={},w_={exports:{}},Qc={exports:{}};/** +(function(){"use strict";var Rf=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Yc(s){return s&&s.__esModule&&Object.prototype.hasOwnProperty.call(s,"default")?s.default:s}function C_(s){if(s.__esModule)return s;var e=s.default;if(typeof e=="function"){var i=function a(){return this instanceof a?Reflect.construct(e,arguments,this.constructor):e.apply(this,arguments)};i.prototype=e.prototype}else i={};return Object.defineProperty(i,"__esModule",{value:!0}),Object.keys(s).forEach(function(a){var o=Object.getOwnPropertyDescriptor(s,a);Object.defineProperty(i,a,o.get?o:{enumerable:!0,get:function(){return s[a]}})}),i}var A_={exports:{}},Wc={},w_={exports:{}},Qc={exports:{}};/** * @license React * react.development.js * @@ -6,7 +6,7 @@ * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */Qc.exports;var D_;function wD(){return D_||(D_=1,function(s,e){(function(){function i(k,X){Object.defineProperty(u.prototype,k,{get:function(){console.warn("%s(...) is deprecated in plain JavaScript React classes. %s",X[0],X[1])}})}function r(k){return k===null||typeof k!="object"?null:(k=Ir&&k[Ir]||k["@@iterator"],typeof k=="function"?k:null)}function o(k,X){k=(k=k.constructor)&&(k.displayName||k.name)||"ReactClass";var ye=k+"."+X;Ra[ye]||(console.error("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.",X,k),Ra[ye]=!0)}function u(k,X,ye){this.props=k,this.context=X,this.refs=Uo,this.updater=ye||qs}function c(){}function f(k,X,ye){this.props=k,this.context=X,this.refs=Uo,this.updater=ye||qs}function m(k){return""+k}function b(k){try{m(k);var X=!1}catch{X=!0}if(X){X=console;var ye=X.error,xe=typeof Symbol=="function"&&Symbol.toStringTag&&k[Symbol.toStringTag]||k.constructor.name||"Object";return ye.call(X,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",xe),m(k)}}function S(k){if(k==null)return null;if(typeof k=="function")return k.$$typeof===Bo?null:k.displayName||k.name||null;if(typeof k=="string")return k;switch(k){case se:return"Fragment";case Ee:return"Profiler";case ke:return"StrictMode";case Ye:return"Suspense";case wn:return"SuspenseList";case dn:return"Activity"}if(typeof k=="object")switch(typeof k.tag=="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),k.$$typeof){case we:return"Portal";case nt:return(k.displayName||"Context")+".Provider";case je:return(k._context.displayName||"Context")+".Consumer";case Ze:var X=k.render;return k=k.displayName,k||(k=X.displayName||X.name||"",k=k!==""?"ForwardRef("+k+")":"ForwardRef"),k;case _t:return X=k.displayName||null,X!==null?X:S(k.type)||"Memo";case jt:X=k._payload,k=k._init;try{return S(k(X))}catch{}}return null}function x(k){if(k===se)return"<>";if(typeof k=="object"&&k!==null&&k.$$typeof===jt)return"<...>";try{var X=S(k);return X?"<"+X+">":"<...>"}catch{return"<...>"}}function A(){var k=De.A;return k===null?null:k.getOwner()}function D(){return Error("react-stack-top-frame")}function I(k){if(Nr.call(k,"key")){var X=Object.getOwnPropertyDescriptor(k,"key").get;if(X&&X.isReactWarning)return!1}return k.key!==void 0}function w(k,X){function ye(){Gs||(Gs=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",X))}ye.isReactWarning=!0,Object.defineProperty(k,"key",{get:ye,configurable:!0})}function j(){var k=S(this.type);return Pr[k]||(Pr[k]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),k=this.props.ref,k!==void 0?k:null}function B(k,X,ye,xe,Ie,Qe,Ve,ot){return ye=Qe.ref,k={$$typeof:me,type:k,key:X,props:Qe,_owner:Ie},(ye!==void 0?ye:null)!==null?Object.defineProperty(k,"ref",{enumerable:!1,get:j}):Object.defineProperty(k,"ref",{enumerable:!1,value:null}),k._store={},Object.defineProperty(k._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(k,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(k,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:Ve}),Object.defineProperty(k,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:ot}),Object.freeze&&(Object.freeze(k.props),Object.freeze(k)),k}function G(k,X){return X=B(k.type,X,void 0,void 0,k._owner,k.props,k._debugStack,k._debugTask),k._store&&(X._store.validated=k._store.validated),X}function V(k){return typeof k=="object"&&k!==null&&k.$$typeof===me}function W(k){var X={"=":"=0",":":"=2"};return"$"+k.replace(/[=:]/g,function(ye){return X[ye]})}function K(k,X){return typeof k=="object"&&k!==null&&k.key!=null?(b(k.key),W(""+k.key)):X.toString(36)}function oe(){}function Y(k){switch(k.status){case"fulfilled":return k.value;case"rejected":throw k.reason;default:switch(typeof k.status=="string"?k.then(oe,oe):(k.status="pending",k.then(function(X){k.status==="pending"&&(k.status="fulfilled",k.value=X)},function(X){k.status==="pending"&&(k.status="rejected",k.reason=X)})),k.status){case"fulfilled":return k.value;case"rejected":throw k.reason}}throw k}function ue(k,X,ye,xe,Ie){var Qe=typeof k;(Qe==="undefined"||Qe==="boolean")&&(k=null);var Ve=!1;if(k===null)Ve=!0;else switch(Qe){case"bigint":case"string":case"number":Ve=!0;break;case"object":switch(k.$$typeof){case me:case we:Ve=!0;break;case jt:return Ve=k._init,ue(Ve(k._payload),X,ye,xe,Ie)}}if(Ve){Ve=k,Ie=Ie(Ve);var ot=xe===""?"."+K(Ve,0):xe;return _i(Ie)?(ye="",ot!=null&&(ye=ot.replace(Ia,"$&/")+"/"),ue(Ie,X,ye,"",function(Wt){return Wt})):Ie!=null&&(V(Ie)&&(Ie.key!=null&&(Ve&&Ve.key===Ie.key||b(Ie.key)),ye=G(Ie,ye+(Ie.key==null||Ve&&Ve.key===Ie.key?"":(""+Ie.key).replace(Ia,"$&/")+"/")+ot),xe!==""&&Ve!=null&&V(Ve)&&Ve.key==null&&Ve._store&&!Ve._store.validated&&(ye._store.validated=2),Ie=ye),X.push(Ie)),1}if(Ve=0,ot=xe===""?".":xe+":",_i(k))for(var qe=0;qe";if(typeof D=="object"&&D!==null&&D.$$typeof===ut)return"<...>";try{var X=S(D);return X?"<"+X+">":"<...>"}catch{return"<...>"}}function A(){var D=we.A;return D===null?null:D.getOwner()}function R(){return Error("react-stack-top-frame")}function N(D){if(Ba.call(D,"key")){var X=Object.getOwnPropertyDescriptor(D,"key").get;if(X&&X.isReactWarning)return!1}return D.key!==void 0}function w(D,X){function ve(){Qs||(Qs=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",X))}ve.isReactWarning=!0,Object.defineProperty(D,"key",{get:ve,configurable:!0})}function H(){var D=S(this.type);return Fa[D]||(Fa[D]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),D=this.props.ref,D!==void 0?D:null}function I(D,X,ve,Se,Le,Qe,Ve,at){return ve=Qe.ref,D={$$typeof:Me,type:D,key:X,props:Qe,_owner:Le},(ve!==void 0?ve:null)!==null?Object.defineProperty(D,"ref",{enumerable:!1,get:H}):Object.defineProperty(D,"ref",{enumerable:!1,value:null}),D._store={},Object.defineProperty(D._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(D,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(D,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:Ve}),Object.defineProperty(D,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:at}),Object.freeze&&(Object.freeze(D.props),Object.freeze(D)),D}function G(D,X){return X=I(D.type,X,void 0,void 0,D._owner,D.props,D._debugStack,D._debugTask),D._store&&(X._store.validated=D._store.validated),X}function F(D){return typeof D=="object"&&D!==null&&D.$$typeof===Me}function Y(D){var X={"=":"=0",":":"=2"};return"$"+D.replace(/[=:]/g,function(ve){return X[ve]})}function K(D,X){return typeof D=="object"&&D!==null&&D.key!=null?(b(D.key),Y(""+D.key)):X.toString(36)}function se(){}function Q(D){switch(D.status){case"fulfilled":return D.value;case"rejected":throw D.reason;default:switch(typeof D.status=="string"?D.then(se,se):(D.status="pending",D.then(function(X){D.status==="pending"&&(D.status="fulfilled",D.value=X)},function(X){D.status==="pending"&&(D.status="rejected",D.reason=X)})),D.status){case"fulfilled":return D.value;case"rejected":throw D.reason}}throw D}function le(D,X,ve,Se,Le){var Qe=typeof D;(Qe==="undefined"||Qe==="boolean")&&(D=null);var Ve=!1;if(D===null)Ve=!0;else switch(Qe){case"bigint":case"string":case"number":Ve=!0;break;case"object":switch(D.$$typeof){case Me:case he:Ve=!0;break;case ut:return Ve=D._init,le(Ve(D._payload),X,ve,Se,Le)}}if(Ve){Ve=D,Le=Le(Ve);var at=Se===""?"."+K(Ve,0):Se;return Ei(Le)?(ve="",at!=null&&(ve=at.replace(Nr,"$&/")+"/"),le(Le,X,ve,"",function(Zt){return Zt})):Le!=null&&(F(Le)&&(Le.key!=null&&(Ve&&Ve.key===Le.key||b(Le.key)),ve=G(Le,ve+(Le.key==null||Ve&&Ve.key===Le.key?"":(""+Le.key).replace(Nr,"$&/")+"/")+at),Se!==""&&Ve!=null&&F(Ve)&&Ve.key==null&&Ve._store&&!Ve._store.validated&&(ve._store.validated=2),Le=ve),X.push(Le)),1}if(Ve=0,at=Se===""?".":Se+":",Ei(D))for(var qe=0;qe import('./MyComponent')) @@ -14,11 +14,11 @@ Your code should look like: Did you accidentally put curly braces around the import?`,X),"default"in X||console.error(`lazy: Expected the result of a dynamic import() call. Instead received: %s Your code should look like: - const MyComponent = lazy(() => import('./MyComponent'))`,X),X.default;throw k._result}function ve(){var k=De.H;return k===null&&console.error(`Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons: + const MyComponent = lazy(() => import('./MyComponent'))`,X),X.default;throw D._result}function be(){var D=we.H;return D===null&&console.error(`Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons: 1. You might have mismatching versions of React and the renderer (such as React DOM) 2. You might be breaking the Rules of Hooks 3. You might have more than one copy of React in the same app -See https://react.dev/link/invalid-hook-call for tips about how to debug and fix this problem.`),k}function Le(){}function Se(k){if(ut===null)try{var X=("require"+Math.random()).slice(0,7);ut=(s&&s[X]).call(s,"timers").setImmediate}catch{ut=function(xe){Na===!1&&(Na=!0,typeof MessageChannel>"u"&&console.error("This browser does not have a MessageChannel implementation, so enqueuing tasks via await act(async () => ...) will fail. Please file an issue at https://github.com/facebook/react/issues if you encounter this warning."));var Ie=new MessageChannel;Ie.port1.onmessage=xe,Ie.port2.postMessage(void 0)}}return ut(k)}function ce(k){return 1 ...) without await. This could lead to unexpected testing behaviour, interleaving multiple act calls and mixing their scopes. You should - await act(async () => ...);"))}),{then:function(qe,Wt){Ie=!0,Ve.then(function(gs){if(Te(X,ye),ye===0){try{fe(xe),Se(function(){return J(gs,qe,Wt)})}catch(Ud){De.thrownErrors.push(Ud)}if(0 ...)"))}),De.actQueue=null),0De.recentlyCreatedOwnerStacks++;return B(k,Ie,void 0,void 0,A(),xe,qe?Error("react-stack-top-frame"):La,qe?$s(x(k)):Xs)},e.createRef=function(){var k={current:null};return Object.seal(k),k},e.forwardRef=function(k){k!=null&&k.$$typeof===_t?console.error("forwardRef requires a render function but received a `memo` component. Instead of forwardRef(memo(...)), use memo(forwardRef(...))."):typeof k!="function"?console.error("forwardRef requires a render function but was given %s.",k===null?"null":typeof k):k.length!==0&&k.length!==2&&console.error("forwardRef render functions accept exactly two parameters: props and ref. %s",k.length===1?"Did you forget to use the ref parameter?":"Any additional parameter will be undefined."),k!=null&&k.defaultProps!=null&&console.error("forwardRef render functions do not support defaultProps. Did you accidentally pass a React component?");var X={$$typeof:Ze,render:k},ye;return Object.defineProperty(X,"displayName",{enumerable:!1,configurable:!0,get:function(){return ye},set:function(xe){ye=xe,k.name||k.displayName||(Object.defineProperty(k,"name",{value:xe}),k.displayName=xe)}}),X},e.isValidElement=V,e.lazy=function(k){return{$$typeof:jt,_payload:{_status:-1,_result:k},_init:Pe}},e.memo=function(k,X){k==null&&console.error("memo: The first argument must be a component. Instead received: %s",k===null?"null":typeof k),X={$$typeof:_t,type:k,compare:X===void 0?null:X};var ye;return Object.defineProperty(X,"displayName",{enumerable:!1,configurable:!0,get:function(){return ye},set:function(xe){ye=xe,k.name||k.displayName||(Object.defineProperty(k,"name",{value:xe}),k.displayName=xe)}}),X},e.startTransition=function(k){var X=De.T,ye={};De.T=ye,ye._updatedFibers=new Set;try{var xe=k(),Ie=De.S;Ie!==null&&Ie(ye,xe),typeof xe=="object"&&xe!==null&&typeof xe.then=="function"&&xe.then(Le,Br)}catch(Qe){Br(Qe)}finally{X===null&&ye._updatedFibers&&(k=ye._updatedFibers.size,ye._updatedFibers.clear(),10"u"&&console.error("This browser does not have a MessageChannel implementation, so enqueuing tasks via await act(async () => ...) will fail. Please file an issue at https://github.com/facebook/react/issues if you encounter this warning."));var Le=new MessageChannel;Le.port1.onmessage=Se,Le.port2.postMessage(void 0)}}return dt(D)}function Pe(D){return 1 ...) without await. This could lead to unexpected testing behaviour, interleaving multiple act calls and mixing their scopes. You should - await act(async () => ...);"))}),{then:function(qe,Zt){Le=!0,Ve.then(function(Ts){if(rt(X,ve),ve===0){try{xe(Se),fe(function(){return de(Ts,qe,Zt)})}catch(Ud){we.thrownErrors.push(Ud)}if(0 ...)"))}),we.actQueue=null),0we.recentlyCreatedOwnerStacks++;return I(D,Le,void 0,void 0,A(),Se,qe?Error("react-stack-top-frame"):Pr,qe?Ws(E(D)):Ks)},e.createRef=function(){var D={current:null};return Object.seal(D),D},e.forwardRef=function(D){D!=null&&D.$$typeof===Et?console.error("forwardRef requires a render function but received a `memo` component. Instead of forwardRef(memo(...)), use memo(forwardRef(...))."):typeof D!="function"?console.error("forwardRef requires a render function but was given %s.",D===null?"null":typeof D):D.length!==0&&D.length!==2&&console.error("forwardRef render functions accept exactly two parameters: props and ref. %s",D.length===1?"Did you forget to use the ref parameter?":"Any additional parameter will be undefined."),D!=null&&D.defaultProps!=null&&console.error("forwardRef render functions do not support defaultProps. Did you accidentally pass a React component?");var X={$$typeof:ot,render:D},ve;return Object.defineProperty(X,"displayName",{enumerable:!1,configurable:!0,get:function(){return ve},set:function(Se){ve=Se,D.name||D.displayName||(Object.defineProperty(D,"name",{value:Se}),D.displayName=Se)}}),X},e.isValidElement=F,e.lazy=function(D){return{$$typeof:ut,_payload:{_status:-1,_result:D},_init:Ie}},e.memo=function(D,X){D==null&&console.error("memo: The first argument must be a component. Instead received: %s",D===null?"null":typeof D),X={$$typeof:Et,type:D,compare:X===void 0?null:X};var ve;return Object.defineProperty(X,"displayName",{enumerable:!1,configurable:!0,get:function(){return ve},set:function(Se){ve=Se,D.name||D.displayName||(Object.defineProperty(D,"name",{value:Se}),D.displayName=Se)}}),X},e.startTransition=function(D){var X=we.T,ve={};we.T=ve,ve._updatedFibers=new Set;try{var Se=D(),Le=we.S;Le!==null&&Le(ve,Se),typeof Se=="object"&&Se!==null&&typeof Se.then=="function"&&Se.then(Ae,ja)}catch(Qe){ja(Qe)}finally{X===null&&ve._updatedFibers&&(D=ve._updatedFibers.size,ve._updatedFibers.clear(),10";if(typeof se=="object"&&se!==null&&se.$$typeof===ue)return"<...>";try{var ke=s(se);return ke?"<"+ke+">":"<...>"}catch{return"<...>"}}function o(){var se=ve.A;return se===null?null:se.getOwner()}function u(){return Error("react-stack-top-frame")}function c(se){if(Le.call(se,"key")){var ke=Object.getOwnPropertyDescriptor(se,"key").get;if(ke&&ke.isReactWarning)return!1}return se.key!==void 0}function f(se,ke){function Ee(){Te||(Te=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",ke))}Ee.isReactWarning=!0,Object.defineProperty(se,"key",{get:Ee,configurable:!0})}function m(){var se=s(this.type);return J[se]||(J[se]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),se=this.props.ref,se!==void 0?se:null}function b(se,ke,Ee,je,nt,Ze,Ye,wn){return Ee=Ze.ref,se={$$typeof:D,type:se,key:ke,props:Ze,_owner:nt},(Ee!==void 0?Ee:null)!==null?Object.defineProperty(se,"ref",{enumerable:!1,get:m}):Object.defineProperty(se,"ref",{enumerable:!1,value:null}),se._store={},Object.defineProperty(se._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(se,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(se,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:Ye}),Object.defineProperty(se,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:wn}),Object.freeze&&(Object.freeze(se.props),Object.freeze(se)),se}function S(se,ke,Ee,je,nt,Ze,Ye,wn){var _t=ke.children;if(_t!==void 0)if(je)if(Se(_t)){for(je=0;je<_t.length;je++)x(_t[je]);Object.freeze&&Object.freeze(_t)}else console.error("React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.");else x(_t);if(Le.call(ke,"key")){_t=s(se);var jt=Object.keys(ke).filter(function(Ir){return Ir!=="key"});je=0";if(typeof W=="object"&&W!==null&&W.$$typeof===le)return"<...>";try{var pe=s(W);return pe?"<"+pe+">":"<...>"}catch{return"<...>"}}function o(){var W=be.A;return W===null?null:W.getOwner()}function u(){return Error("react-stack-top-frame")}function c(W){if(Ae.call(W,"key")){var pe=Object.getOwnPropertyDescriptor(W,"key").get;if(pe&&pe.isReactWarning)return!1}return W.key!==void 0}function f(W,pe){function me(){rt||(rt=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",pe))}me.isReactWarning=!0,Object.defineProperty(W,"key",{get:me,configurable:!0})}function m(){var W=s(this.type);return de[W]||(de[W]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),W=this.props.ref,W!==void 0?W:null}function b(W,pe,me,De,Ue,ot,Ye,Ji){return me=ot.ref,W={$$typeof:R,type:W,key:pe,props:ot,_owner:Ue},(me!==void 0?me:null)!==null?Object.defineProperty(W,"ref",{enumerable:!1,get:m}):Object.defineProperty(W,"ref",{enumerable:!1,value:null}),W._store={},Object.defineProperty(W._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(W,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(W,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:Ye}),Object.defineProperty(W,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:Ji}),Object.freeze&&(Object.freeze(W.props),Object.freeze(W)),W}function S(W,pe,me,De,Ue,ot,Ye,Ji){var Et=pe.children;if(Et!==void 0)if(De)if(fe(Et)){for(De=0;De React keys must be passed directly to JSX without using spread: let props = %s; - <%s key={someKey} {...props} />`,je,_t,jt,_t),we[_t+je]=!0)}if(_t=null,Ee!==void 0&&(i(Ee),_t=""+Ee),c(ke)&&(i(ke.key),_t=""+ke.key),"key"in ke){Ee={};for(var dn in ke)dn!=="key"&&(Ee[dn]=ke[dn])}else Ee=ke;return _t&&f(Ee,typeof se=="function"?se.displayName||se.name||"Unknown":se),b(se,_t,Ze,nt,o(),Ee,Ye,wn)}function x(se){typeof se=="object"&&se!==null&&se.$$typeof===D&&se._store&&(se._store.validated=1)}var A=nn,D=Symbol.for("react.transitional.element"),I=Symbol.for("react.portal"),w=Symbol.for("react.fragment"),j=Symbol.for("react.strict_mode"),B=Symbol.for("react.profiler"),G=Symbol.for("react.consumer"),V=Symbol.for("react.context"),W=Symbol.for("react.forward_ref"),K=Symbol.for("react.suspense"),oe=Symbol.for("react.suspense_list"),Y=Symbol.for("react.memo"),ue=Symbol.for("react.lazy"),he=Symbol.for("react.activity"),Pe=Symbol.for("react.client.reference"),ve=A.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,Le=Object.prototype.hasOwnProperty,Se=Array.isArray,ce=console.createTask?console.createTask:function(){return null};A={"react-stack-bottom-frame":function(se){return se()}};var Te,J={},fe=A["react-stack-bottom-frame"].bind(A,u)(),me=ce(r(u)),we={};Wc.Fragment=w,Wc.jsx=function(se,ke,Ee,je,nt){var Ze=1e4>ve.recentlyCreatedOwnerStacks++;return S(se,ke,Ee,!1,je,nt,Ze?Error("react-stack-top-frame"):fe,Ze?ce(r(se)):me)},Wc.jsxs=function(se,ke,Ee,je,nt){var Ze=1e4>ve.recentlyCreatedOwnerStacks++;return S(se,ke,Ee,!0,je,nt,Ze?Error("react-stack-top-frame"):fe,Ze?ce(r(se)):me)}}()),Wc}A_.exports=DD();var Fl=A_.exports,O_={exports:{}},Ig={exports:{}},Ng={};/** + <%s key={someKey} {...props} />`,De,Et,ut,Et),he[Et+De]=!0)}if(Et=null,me!==void 0&&(i(me),Et=""+me),c(pe)&&(i(pe.key),Et=""+pe.key),"key"in pe){me={};for(var mt in pe)mt!=="key"&&(me[mt]=pe[mt])}else me=pe;return Et&&f(me,typeof W=="function"?W.displayName||W.name||"Unknown":W),b(W,Et,ot,Ue,o(),me,Ye,Ji)}function E(W){typeof W=="object"&&W!==null&&W.$$typeof===R&&W._store&&(W._store.validated=1)}var A=cn,R=Symbol.for("react.transitional.element"),N=Symbol.for("react.portal"),w=Symbol.for("react.fragment"),H=Symbol.for("react.strict_mode"),I=Symbol.for("react.profiler"),G=Symbol.for("react.consumer"),F=Symbol.for("react.context"),Y=Symbol.for("react.forward_ref"),K=Symbol.for("react.suspense"),se=Symbol.for("react.suspense_list"),Q=Symbol.for("react.memo"),le=Symbol.for("react.lazy"),ue=Symbol.for("react.activity"),Ie=Symbol.for("react.client.reference"),be=A.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,Ae=Object.prototype.hasOwnProperty,fe=Array.isArray,Pe=console.createTask?console.createTask:function(){return null};A={"react-stack-bottom-frame":function(W){return W()}};var rt,de={},xe=A["react-stack-bottom-frame"].bind(A,u)(),Me=Pe(a(u)),he={};Wc.Fragment=w,Wc.jsx=function(W,pe,me,De,Ue){var ot=1e4>be.recentlyCreatedOwnerStacks++;return S(W,pe,me,!1,De,Ue,ot?Error("react-stack-top-frame"):xe,ot?Pe(a(W)):Me)},Wc.jsxs=function(W,pe,me,De,Ue){var ot=1e4>be.recentlyCreatedOwnerStacks++;return S(W,pe,me,!0,De,Ue,ot?Error("react-stack-top-frame"):xe,ot?Pe(a(W)):Me)}}()),Wc}A_.exports=DD();var Hl=A_.exports,O_={exports:{}},Ig={exports:{}},Pg={};/** * @license React * scheduler.development.js * @@ -39,7 +39,7 @@ React keys must be passed directly to JSX without using spread: * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var R_;function kD(){return R_||(R_=1,function(s){(function(){function e(){if(K=!1,he){var J=s.unstable_now();Le=J;var fe=!0;try{e:{V=!1,W&&(W=!1,Y(Pe),Pe=-1),G=!0;var me=B;try{t:{for(c(J),j=r(D);j!==null&&!(j.expirationTime>J&&m());){var we=j.callback;if(typeof we=="function"){j.callback=null,B=j.priorityLevel;var se=we(j.expirationTime<=J);if(J=s.unstable_now(),typeof se=="function"){j.callback=se,c(J),fe=!0;break t}j===r(D)&&o(D),c(J)}else o(D);j=r(D)}if(j!==null)fe=!0;else{var ke=r(I);ke!==null&&b(f,ke.startTime-J),fe=!1}}break e}finally{j=null,B=me,G=!1}fe=void 0}}finally{fe?Se():he=!1}}}function i(J,fe){var me=J.length;J.push(fe);e:for(;0>>1,se=J[we];if(0>>1;weu(je,me))ntu(Ze,je)?(J[we]=Ze,J[nt]=me,we=nt):(J[we]=je,J[Ee]=me,we=Ee);else if(ntu(Ze,me))J[we]=Ze,J[nt]=me,we=nt;else break e}}return fe}function u(J,fe){var me=J.sortIndex-fe.sortIndex;return me!==0?me:J.id-fe.id}function c(J){for(var fe=r(I);fe!==null;){if(fe.callback===null)o(I);else if(fe.startTime<=J)o(I),fe.sortIndex=fe.expirationTime,i(D,fe);else break;fe=r(I)}}function f(J){if(W=!1,c(J),!V)if(r(D)!==null)V=!0,he||(he=!0,Se());else{var fe=r(I);fe!==null&&b(f,fe.startTime-J)}}function m(){return K?!0:!(s.unstable_now()-LeJ||125we?(J.sortIndex=me,i(I,J),r(D)===null&&J===r(I)&&(W?(Y(Pe),Pe=-1):W=!0,b(f,me-we))):(J.sortIndex=se,i(D,J),V||G||(V=!0,he||(he=!0,Se()))),J},s.unstable_shouldYield=m,s.unstable_wrapCallback=function(J){var fe=B;return function(){var me=B;B=fe;try{return J.apply(this,arguments)}finally{B=me}}},typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error())})()}(Ng)),Ng}var M_;function OD(){return M_||(M_=1,Ig.exports=kD()),Ig.exports}var Pg={exports:{}},Mi={};/** + */var R_;function kD(){return R_||(R_=1,function(s){(function(){function e(){if(K=!1,ue){var de=s.unstable_now();Ae=de;var xe=!0;try{e:{F=!1,Y&&(Y=!1,Q(Ie),Ie=-1),G=!0;var Me=I;try{t:{for(c(de),H=a(R);H!==null&&!(H.expirationTime>de&&m());){var he=H.callback;if(typeof he=="function"){H.callback=null,I=H.priorityLevel;var W=he(H.expirationTime<=de);if(de=s.unstable_now(),typeof W=="function"){H.callback=W,c(de),xe=!0;break t}H===a(R)&&o(R),c(de)}else o(R);H=a(R)}if(H!==null)xe=!0;else{var pe=a(N);pe!==null&&b(f,pe.startTime-de),xe=!1}}break e}finally{H=null,I=Me,G=!1}xe=void 0}}finally{xe?fe():ue=!1}}}function i(de,xe){var Me=de.length;de.push(xe);e:for(;0>>1,W=de[he];if(0>>1;heu(De,Me))Ueu(ot,De)?(de[he]=ot,de[Ue]=Me,he=Ue):(de[he]=De,de[me]=Me,he=me);else if(Ueu(ot,Me))de[he]=ot,de[Ue]=Me,he=Ue;else break e}}return xe}function u(de,xe){var Me=de.sortIndex-xe.sortIndex;return Me!==0?Me:de.id-xe.id}function c(de){for(var xe=a(N);xe!==null;){if(xe.callback===null)o(N);else if(xe.startTime<=de)o(N),xe.sortIndex=xe.expirationTime,i(R,xe);else break;xe=a(N)}}function f(de){if(Y=!1,c(de),!F)if(a(R)!==null)F=!0,ue||(ue=!0,fe());else{var xe=a(N);xe!==null&&b(f,xe.startTime-de)}}function m(){return K?!0:!(s.unstable_now()-Aede||125he?(de.sortIndex=Me,i(N,de),a(R)===null&&de===a(N)&&(Y?(Q(Ie),Ie=-1):Y=!0,b(f,Me-he))):(de.sortIndex=W,i(R,de),F||G||(F=!0,ue||(ue=!0,fe()))),de},s.unstable_shouldYield=m,s.unstable_wrapCallback=function(de){var xe=I;return function(){var Me=I;I=xe;try{return de.apply(this,arguments)}finally{I=Me}}},typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error())})()}(Pg)),Pg}var M_;function OD(){return M_||(M_=1,Ig.exports=kD()),Ig.exports}var Ng={exports:{}},Ni={};/** * @license React * react-dom.development.js * @@ -47,11 +47,11 @@ React keys must be passed directly to JSX without using spread: * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var L_;function RD(){return L_||(L_=1,function(){function s(){}function e(x){return""+x}function i(x,A,D){var I=3` tag.%s',D),typeof x=="string"&&typeof A=="object"&&A!==null&&typeof A.as=="string"){D=A.as;var I=r(D,A.crossOrigin);m.d.L(x,D,{crossOrigin:I,integrity:typeof A.integrity=="string"?A.integrity:void 0,nonce:typeof A.nonce=="string"?A.nonce:void 0,type:typeof A.type=="string"?A.type:void 0,fetchPriority:typeof A.fetchPriority=="string"?A.fetchPriority:void 0,referrerPolicy:typeof A.referrerPolicy=="string"?A.referrerPolicy:void 0,imageSrcSet:typeof A.imageSrcSet=="string"?A.imageSrcSet:void 0,imageSizes:typeof A.imageSizes=="string"?A.imageSizes:void 0,media:typeof A.media=="string"?A.media:void 0})}},Mi.preloadModule=function(x,A){var D="";typeof x=="string"&&x||(D+=" The `href` argument encountered was "+o(x)+"."),A!==void 0&&typeof A!="object"?D+=" The `options` argument encountered was "+o(A)+".":A&&"as"in A&&typeof A.as!="string"&&(D+=" The `as` option encountered was "+o(A.as)+"."),D&&console.error('ReactDOM.preloadModule(): Expected two arguments, a non-empty `href` string and, optionally, an `options` object with an `as` property valid for a `` tag.%s',D),typeof x=="string"&&(A?(D=r(A.as,A.crossOrigin),m.d.m(x,{as:typeof A.as=="string"&&A.as!=="script"?A.as:void 0,crossOrigin:D,integrity:typeof A.integrity=="string"?A.integrity:void 0})):m.d.m(x))},Mi.requestFormReset=function(x){m.d.r(x)},Mi.unstable_batchedUpdates=function(x,A){return x(A)},Mi.useFormState=function(x,A,D){return c().useFormState(x,A,D)},Mi.useFormStatus=function(){return c().useHostTransitionStatus()},Mi.version="19.1.0",typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error())}()),Mi}var I_;function MD(){return I_||(I_=1,Pg.exports=RD()),Pg.exports}var Kc={};/** +See https://react.dev/link/invalid-hook-call for tips about how to debug and fix this problem.`),E}typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());var f=cn,m={d:{f:s,r:function(){throw Error("Invalid form element. requestFormReset must be passed a form that was rendered by React.")},D:s,C:s,L:s,m:s,X:s,S:s,M:s},p:0,findDOMNode:null},b=Symbol.for("react.portal"),S=f.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;typeof Map=="function"&&Map.prototype!=null&&typeof Map.prototype.forEach=="function"&&typeof Set=="function"&&Set.prototype!=null&&typeof Set.prototype.clear=="function"&&typeof Set.prototype.forEach=="function"||console.error("React depends on Map and Set built-in types. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills"),Ni.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=m,Ni.createPortal=function(E,A){var R=2` tag.%s',R),typeof E=="string"&&typeof A=="object"&&A!==null&&typeof A.as=="string"){R=A.as;var N=a(R,A.crossOrigin);m.d.L(E,R,{crossOrigin:N,integrity:typeof A.integrity=="string"?A.integrity:void 0,nonce:typeof A.nonce=="string"?A.nonce:void 0,type:typeof A.type=="string"?A.type:void 0,fetchPriority:typeof A.fetchPriority=="string"?A.fetchPriority:void 0,referrerPolicy:typeof A.referrerPolicy=="string"?A.referrerPolicy:void 0,imageSrcSet:typeof A.imageSrcSet=="string"?A.imageSrcSet:void 0,imageSizes:typeof A.imageSizes=="string"?A.imageSizes:void 0,media:typeof A.media=="string"?A.media:void 0})}},Ni.preloadModule=function(E,A){var R="";typeof E=="string"&&E||(R+=" The `href` argument encountered was "+o(E)+"."),A!==void 0&&typeof A!="object"?R+=" The `options` argument encountered was "+o(A)+".":A&&"as"in A&&typeof A.as!="string"&&(R+=" The `as` option encountered was "+o(A.as)+"."),R&&console.error('ReactDOM.preloadModule(): Expected two arguments, a non-empty `href` string and, optionally, an `options` object with an `as` property valid for a `` tag.%s',R),typeof E=="string"&&(A?(R=a(A.as,A.crossOrigin),m.d.m(E,{as:typeof A.as=="string"&&A.as!=="script"?A.as:void 0,crossOrigin:R,integrity:typeof A.integrity=="string"?A.integrity:void 0})):m.d.m(E))},Ni.requestFormReset=function(E){m.d.r(E)},Ni.unstable_batchedUpdates=function(E,A){return E(A)},Ni.useFormState=function(E,A,R){return c().useFormState(E,A,R)},Ni.useFormStatus=function(){return c().useHostTransitionStatus()},Ni.version="19.1.0",typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error())}()),Ni}var I_;function MD(){return I_||(I_=1,Ng.exports=RD()),Ng.exports}var Kc={};/** * @license React * react-dom-client.development.js * @@ -59,61 +59,61 @@ See https://react.dev/link/invalid-hook-call for tips about how to debug and fix * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var N_;function LD(){return N_||(N_=1,function(){function s(t,n){for(t=t.memoizedState;t!==null&&0=n.length)return l;var d=n[a],p=Di(t)?t.slice():et({},t);return p[d]=e(t[d],n,a+1,l),p}function i(t,n,a){if(n.length!==a.length)console.warn("copyWithRename() expects paths of the same length");else{for(var l=0;lra?console.error("Unexpected pop."):(n!==cb[ra]&&console.error("Unexpected Fiber popped."),t.current=ub[ra],ub[ra]=null,cb[ra]=null,ra--)}function Le(t,n,a){ra++,ub[ra]=t.current,cb[ra]=a,t.current=n}function Se(t){return t===null&&console.error("Expected host context to exist. This error is likely caused by a bug in React. Please file an issue."),t}function ce(t,n){Le(so,n,t),Le(Vh,t,t),Le(no,null,t);var a=n.nodeType;switch(a){case 9:case 11:a=a===9?"#document":"#fragment",n=(n=n.documentElement)&&(n=n.namespaceURI)?xC(n):ya;break;default:if(a=n.tagName,n=n.namespaceURI)n=xC(n),n=EC(n,a);else switch(a){case"svg":n=Gc;break;case"math":n=wg;break;default:n=ya}}a=a.toLowerCase(),a=fn(null,a),a={context:n,ancestorInfo:a},ve(no,t),Le(no,a,t)}function Te(t){ve(no,t),ve(Vh,t),ve(so,t)}function J(){return Se(no.current)}function fe(t){t.memoizedState!==null&&Le(zm,t,t);var n=Se(no.current),a=t.type,l=EC(n.context,a);a=fn(n.ancestorInfo,a),l={context:l,ancestorInfo:a},n!==l&&(Le(Vh,t,t),Le(no,l,t))}function me(t){Vh.current===t&&(ve(no,t),ve(Vh,t)),zm.current===t&&(ve(zm,t),Df._currentValue=Bl)}function we(t){return typeof Symbol=="function"&&Symbol.toStringTag&&t[Symbol.toStringTag]||t.constructor.name||"Object"}function se(t){try{return ke(t),!1}catch{return!0}}function ke(t){return""+t}function Ee(t,n){if(se(t))return console.error("The provided `%s` attribute is an unsupported type %s. This value must be coerced to a string before using it here.",n,we(t)),ke(t)}function je(t,n){if(se(t))return console.error("The provided `%s` CSS property is an unsupported type %s. This value must be coerced to a string before using it here.",n,we(t)),ke(t)}function nt(t){if(se(t))return console.error("Form field values (value, checked, defaultValue, or defaultChecked props) must be strings, not %s. This value must be coerced to a string before using it here.",we(t)),ke(t)}function Ze(t){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u")return!1;var n=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(n.isDisabled)return!0;if(!n.supportsFiber)return console.error("The installed version of React DevTools is too old and will not work with the current version of React. Please update React DevTools. https://react.dev/link/react-devtools"),!0;try{fc=n.inject(t),Fi=n}catch(a){console.error("React instrumentation encountered an error: %s.",a)}return!!n.checkDCE}function Ye(t){if(typeof uL=="function"&&cL(t),Fi&&typeof Fi.setStrictMode=="function")try{Fi.setStrictMode(fc,t)}catch(n){yr||(yr=!0,console.error("React instrumentation encountered an error: %s",n))}}function wn(t){Ce=t}function _t(){Ce!==null&&typeof Ce.markCommitStopped=="function"&&Ce.markCommitStopped()}function jt(t){Ce!==null&&typeof Ce.markComponentRenderStarted=="function"&&Ce.markComponentRenderStarted(t)}function dn(){Ce!==null&&typeof Ce.markComponentRenderStopped=="function"&&Ce.markComponentRenderStopped()}function Ir(t){Ce!==null&&typeof Ce.markRenderStarted=="function"&&Ce.markRenderStarted(t)}function Ra(){Ce!==null&&typeof Ce.markRenderStopped=="function"&&Ce.markRenderStopped()}function qs(t,n){Ce!==null&&typeof Ce.markStateUpdateScheduled=="function"&&Ce.markStateUpdateScheduled(t,n)}function Au(t){return t>>>=0,t===0?32:31-(dL(t)/hL|0)|0}function Uo(t){if(t&1)return"SyncHydrationLane";if(t&2)return"Sync";if(t&4)return"InputContinuousHydration";if(t&8)return"InputContinuous";if(t&16)return"DefaultHydration";if(t&32)return"Default";if(t&128)return"TransitionHydration";if(t&4194048)return"Transition";if(t&62914560)return"Retry";if(t&67108864)return"SelectiveHydration";if(t&134217728)return"IdleHydration";if(t&268435456)return"Idle";if(t&536870912)return"Offscreen";if(t&1073741824)return"Deferred"}function zt(t){var n=t&42;if(n!==0)return n;switch(t&-t){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t&4194048;case 4194304:case 8388608:case 16777216:case 33554432:return t&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return console.error("Should have found matching lanes. This is a bug in React."),t}}function ms(t,n,a){var l=t.pendingLanes;if(l===0)return 0;var d=0,p=t.suspendedLanes,T=t.pingedLanes;t=t.warmLanes;var C=l&134217727;return C!==0?(l=C&~p,l!==0?d=zt(l):(T&=C,T!==0?d=zt(T):a||(a=C&~t,a!==0&&(d=zt(a))))):(C=l&~p,C!==0?d=zt(C):T!==0?d=zt(T):a||(a=l&~t,a!==0&&(d=zt(a)))),d===0?0:n!==0&&n!==d&&!(n&p)&&(p=d&-d,a=n&-n,p>=a||p===32&&(a&4194048)!==0)?n:d}function _i(t,n){return(t.pendingLanes&~(t.suspendedLanes&~t.pingedLanes)&n)===0}function Bo(t,n){switch(t){case 1:case 2:case 4:case 8:case 64:return n+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return n+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return console.error("Should have found matching lanes. This is a bug in React."),-1}}function De(){var t=Vm;return Vm<<=1,!(Vm&4194048)&&(Vm=256),t}function Nr(){var t=qm;return qm<<=1,!(qm&62914560)&&(qm=4194304),t}function $s(t){for(var n=[],a=0;31>a;a++)n.push(t);return n}function Gs(t,n){t.pendingLanes|=n,n!==268435456&&(t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0)}function Ma(t,n,a,l,d,p){var T=t.pendingLanes;t.pendingLanes=a,t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0,t.expiredLanes&=a,t.entangledLanes&=a,t.errorRecoveryDisabledLanes&=a,t.shellSuspendCounter=0;var C=t.entanglements,R=t.expirationTimes,L=t.hiddenUpdates;for(a=T&~a;0$h&&console.error("disabledDepth fell below zero. This is a bug in React. Please file an issue.")}function hn(t){if(yb===void 0)try{throw Error()}catch(a){var n=a.stack.trim().match(/\n( *(at )?)/);yb=n&&n[1]||"",oA=-1)":-1T||L[p]!==Z[T]){var ne=` -`+L[p].replace(" at new "," at ");return t.displayName&&ne.includes("")&&(ne=ne.replace("",t.displayName)),typeof t=="function"&&bb.set(t,ne),ne}while(1<=p&&0<=T);break}}}finally{vb=!1,ie.H=l,Ud(),Error.prepareStackTrace=a}return L=(L=t?t.displayName||t.name:"")?hn(L):"",typeof t=="function"&&bb.set(t,L),L}function Fd(t){var n=Error.prepareStackTrace;if(Error.prepareStackTrace=void 0,t=t.stack,Error.prepareStackTrace=n,t.startsWith(`Error: react-stack-top-frame + */var P_;function LD(){return P_||(P_=1,function(){function s(t,n){for(t=t.memoizedState;t!==null&&0=n.length)return l;var d=n[r],p=Mi(t)?t.slice():Je({},t);return p[d]=e(t[d],n,r+1,l),p}function i(t,n,r){if(n.length!==r.length)console.warn("copyWithRename() expects paths of the same length");else{for(var l=0;llr?console.error("Unexpected pop."):(n!==cb[lr]&&console.error("Unexpected Fiber popped."),t.current=ub[lr],ub[lr]=null,cb[lr]=null,lr--)}function Ae(t,n,r){lr++,ub[lr]=t.current,cb[lr]=r,t.current=n}function fe(t){return t===null&&console.error("Expected host context to exist. This error is likely caused by a bug in React. Please file an issue."),t}function Pe(t,n){Ae(ro,n,t),Ae(Vh,t,t),Ae(ao,null,t);var r=n.nodeType;switch(r){case 9:case 11:r=r===9?"#document":"#fragment",n=(n=n.documentElement)&&(n=n.namespaceURI)?xC(n):_r;break;default:if(r=n.tagName,n=n.namespaceURI)n=xC(n),n=EC(n,r);else switch(r){case"svg":n=Gc;break;case"math":n=wg;break;default:n=_r}}r=r.toLowerCase(),r=bn(null,r),r={context:n,ancestorInfo:r},be(ao,t),Ae(ao,r,t)}function rt(t){be(ao,t),be(Vh,t),be(ro,t)}function de(){return fe(ao.current)}function xe(t){t.memoizedState!==null&&Ae(zm,t,t);var n=fe(ao.current),r=t.type,l=EC(n.context,r);r=bn(n.ancestorInfo,r),l={context:l,ancestorInfo:r},n!==l&&(Ae(Vh,t,t),Ae(ao,l,t))}function Me(t){Vh.current===t&&(be(ao,t),be(Vh,t)),zm.current===t&&(be(zm,t),Df._currentValue=Fl)}function he(t){return typeof Symbol=="function"&&Symbol.toStringTag&&t[Symbol.toStringTag]||t.constructor.name||"Object"}function W(t){try{return pe(t),!1}catch{return!0}}function pe(t){return""+t}function me(t,n){if(W(t))return console.error("The provided `%s` attribute is an unsupported type %s. This value must be coerced to a string before using it here.",n,he(t)),pe(t)}function De(t,n){if(W(t))return console.error("The provided `%s` CSS property is an unsupported type %s. This value must be coerced to a string before using it here.",n,he(t)),pe(t)}function Ue(t){if(W(t))return console.error("Form field values (value, checked, defaultValue, or defaultChecked props) must be strings, not %s. This value must be coerced to a string before using it here.",he(t)),pe(t)}function ot(t){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u")return!1;var n=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(n.isDisabled)return!0;if(!n.supportsFiber)return console.error("The installed version of React DevTools is too old and will not work with the current version of React. Please update React DevTools. https://react.dev/link/react-devtools"),!0;try{fc=n.inject(t),$i=n}catch(r){console.error("React instrumentation encountered an error: %s.",r)}return!!n.checkDCE}function Ye(t){if(typeof uL=="function"&&cL(t),$i&&typeof $i.setStrictMode=="function")try{$i.setStrictMode(fc,t)}catch(n){Ta||(Ta=!0,console.error("React instrumentation encountered an error: %s",n))}}function Ji(t){Ee=t}function Et(){Ee!==null&&typeof Ee.markCommitStopped=="function"&&Ee.markCommitStopped()}function ut(t){Ee!==null&&typeof Ee.markComponentRenderStarted=="function"&&Ee.markComponentRenderStarted(t)}function mt(){Ee!==null&&typeof Ee.markComponentRenderStopped=="function"&&Ee.markComponentRenderStopped()}function ji(t){Ee!==null&&typeof Ee.markRenderStarted=="function"&&Ee.markRenderStarted(t)}function jt(){Ee!==null&&typeof Ee.markRenderStopped=="function"&&Ee.markRenderStopped()}function li(t,n){Ee!==null&&typeof Ee.markStateUpdateScheduled=="function"&&Ee.markStateUpdateScheduled(t,n)}function zi(t){return t>>>=0,t===0?32:31-(dL(t)/hL|0)|0}function Kt(t){if(t&1)return"SyncHydrationLane";if(t&2)return"Sync";if(t&4)return"InputContinuousHydration";if(t&8)return"InputContinuous";if(t&16)return"DefaultHydration";if(t&32)return"Default";if(t&128)return"TransitionHydration";if(t&4194048)return"Transition";if(t&62914560)return"Retry";if(t&67108864)return"SelectiveHydration";if(t&134217728)return"IdleHydration";if(t&268435456)return"Idle";if(t&536870912)return"Offscreen";if(t&1073741824)return"Deferred"}function ct(t){var n=t&42;if(n!==0)return n;switch(t&-t){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t&4194048;case 4194304:case 8388608:case 16777216:case 33554432:return t&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return console.error("Should have found matching lanes. This is a bug in React."),t}}function _s(t,n,r){var l=t.pendingLanes;if(l===0)return 0;var d=0,p=t.suspendedLanes,T=t.pingedLanes;t=t.warmLanes;var C=l&134217727;return C!==0?(l=C&~p,l!==0?d=ct(l):(T&=C,T!==0?d=ct(T):r||(r=C&~t,r!==0&&(d=ct(r))))):(C=l&~p,C!==0?d=ct(C):T!==0?d=ct(T):r||(r=l&~t,r!==0&&(d=ct(r)))),d===0?0:n!==0&&n!==d&&!(n&p)&&(p=d&-d,r=n&-n,p>=r||p===32&&(r&4194048)!==0)?n:d}function Ei(t,n){return(t.pendingLanes&~(t.suspendedLanes&~t.pingedLanes)&n)===0}function Fo(t,n){switch(t){case 1:case 2:case 4:case 8:case 64:return n+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return n+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return console.error("Should have found matching lanes. This is a bug in React."),-1}}function we(){var t=Vm;return Vm<<=1,!(Vm&4194048)&&(Vm=256),t}function Ba(){var t=qm;return qm<<=1,!(qm&62914560)&&(qm=4194304),t}function Ws(t){for(var n=[],r=0;31>r;r++)n.push(t);return n}function Qs(t,n){t.pendingLanes|=n,n!==268435456&&(t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0)}function Ir(t,n,r,l,d,p){var T=t.pendingLanes;t.pendingLanes=r,t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0,t.expiredLanes&=r,t.entangledLanes&=r,t.errorRecoveryDisabledLanes&=r,t.shellSuspendCounter=0;var C=t.entanglements,O=t.expirationTimes,L=t.hiddenUpdates;for(r=T&~r;0$h&&console.error("disabledDepth fell below zero. This is a bug in React. Please file an issue.")}function vn(t){if(yb===void 0)try{throw Error()}catch(r){var n=r.stack.trim().match(/\n( *(at )?)/);yb=n&&n[1]||"",oA=-1)":-1T||L[p]!==J[T]){var ne=` +`+L[p].replace(" at new "," at ");return t.displayName&&ne.includes("")&&(ne=ne.replace("",t.displayName)),typeof t=="function"&&bb.set(t,ne),ne}while(1<=p&&0<=T);break}}}finally{vb=!1,ie.H=l,Ud(),Error.prepareStackTrace=r}return L=(L=t?t.displayName||t.name:"")?vn(L):"",typeof t=="function"&&bb.set(t,L),L}function Fd(t){var n=Error.prepareStackTrace;if(Error.prepareStackTrace=void 0,t=t.stack,Error.prepareStackTrace=n,t.startsWith(`Error: react-stack-top-frame `)&&(t=t.slice(29)),n=t.indexOf(` `),n!==-1&&(t=t.slice(n+1)),n=t.indexOf("react-stack-bottom-frame"),n!==-1&&(n=t.lastIndexOf(` -`,n)),n!==-1)t=t.slice(0,n);else return"";return t}function Hd(t){switch(t.tag){case 26:case 27:case 5:return hn(t.type);case 16:return hn("Lazy");case 13:return hn("Suspense");case 19:return hn("SuspenseList");case 0:case 15:return Bd(t.type,!1);case 11:return Bd(t.type.render,!1);case 1:return Bd(t.type,!0);case 31:return hn("Activity");default:return""}}function Fo(t){try{var n="";do{n+=Hd(t);var a=t._debugInfo;if(a)for(var l=a.length-1;0<=l;l--){var d=a[l];if(typeof d.name=="string"){var p=n,T=d.env,C=hn(d.name+(T?" ["+T+"]":""));n=p+C}}t=t.return}while(t);return n}catch(R){return` -Error generating stack: `+R.message+` -`+R.stack}}function Ti(t){return(t=t?t.displayName||t.name:"")?hn(t):""}function wu(){if(Bn===null)return null;var t=Bn._debugOwner;return t!=null?ue(t):null}function Hy(){if(Bn===null)return"";var t=Bn;try{var n="";switch(t.tag===6&&(t=t.return),t.tag){case 26:case 27:case 5:n+=hn(t.type);break;case 13:n+=hn("Suspense");break;case 19:n+=hn("SuspenseList");break;case 31:n+=hn("Activity");break;case 30:case 0:case 15:case 1:t._debugOwner||n!==""||(n+=Ti(t.type));break;case 11:t._debugOwner||n!==""||(n+=Ti(t.type.render))}for(;t;)if(typeof t.tag=="number"){var a=t;t=a._debugOwner;var l=a._debugStack;t&&l&&(typeof l!="string"&&(a._debugStack=l=Fd(l)),l!==""&&(n+=` +`,n)),n!==-1)t=t.slice(0,n);else return"";return t}function Hd(t){switch(t.tag){case 26:case 27:case 5:return vn(t.type);case 16:return vn("Lazy");case 13:return vn("Suspense");case 19:return vn("SuspenseList");case 0:case 15:return Bd(t.type,!1);case 11:return Bd(t.type.render,!1);case 1:return Bd(t.type,!0);case 31:return vn("Activity");default:return""}}function Ho(t){try{var n="";do{n+=Hd(t);var r=t._debugInfo;if(r)for(var l=r.length-1;0<=l;l--){var d=r[l];if(typeof d.name=="string"){var p=n,T=d.env,C=vn(d.name+(T?" ["+T+"]":""));n=p+C}}t=t.return}while(t);return n}catch(O){return` +Error generating stack: `+O.message+` +`+O.stack}}function Ci(t){return(t=t?t.displayName||t.name:"")?vn(t):""}function wu(){if(Vn===null)return null;var t=Vn._debugOwner;return t!=null?le(t):null}function Hy(){if(Vn===null)return"";var t=Vn;try{var n="";switch(t.tag===6&&(t=t.return),t.tag){case 26:case 27:case 5:n+=vn(t.type);break;case 13:n+=vn("Suspense");break;case 19:n+=vn("SuspenseList");break;case 31:n+=vn("Activity");break;case 30:case 0:case 15:case 1:t._debugOwner||n!==""||(n+=Ci(t.type));break;case 11:t._debugOwner||n!==""||(n+=Ci(t.type.render))}for(;t;)if(typeof t.tag=="number"){var r=t;t=r._debugOwner;var l=r._debugStack;t&&l&&(typeof l!="string"&&(r._debugStack=l=Fd(l)),l!==""&&(n+=` `+l))}else if(t.debugStack!=null){var d=t.debugStack;(t=t.owner)&&d&&(n+=` `+Fd(d))}else break;var p=n}catch(T){p=` Error generating stack: `+T.message+` -`+T.stack}return p}function Me(t,n,a,l,d,p,T){var C=Bn;kn(t);try{return t!==null&&t._debugTask?t._debugTask.run(n.bind(null,a,l,d,p,T)):n(a,l,d,p,T)}finally{kn(C)}throw Error("runWithFiberInDEV should never be called in production. This is a bug in React.")}function kn(t){ie.getCurrentStack=t===null?null:Hy,br=!1,Bn=t}function Si(t){switch(typeof t){case"bigint":case"boolean":case"number":case"string":case"undefined":return t;case"object":return nt(t),t;default:return""}}function yt(t){var n=t.type;return(t=t.nodeName)&&t.toLowerCase()==="input"&&(n==="checkbox"||n==="radio")}function jy(t){var n=yt(t)?"checked":"value",a=Object.getOwnPropertyDescriptor(t.constructor.prototype,n);nt(t[n]);var l=""+t[n];if(!t.hasOwnProperty(n)&&typeof a<"u"&&typeof a.get=="function"&&typeof a.set=="function"){var d=a.get,p=a.set;return Object.defineProperty(t,n,{configurable:!0,get:function(){return d.call(this)},set:function(T){nt(T),l=""+T,p.call(this,T)}}),Object.defineProperty(t,n,{enumerable:a.enumerable}),{getValue:function(){return l},setValue:function(T){nt(T),l=""+T},stopTracking:function(){t._valueTracker=null,delete t[n]}}}}function Fr(t){t._valueTracker||(t._valueTracker=jy(t))}function Ho(t){if(!t)return!1;var n=t._valueTracker;if(!n)return!0;var a=n.getValue(),l="";return t&&(l=yt(t)?t.checked?"true":"false":t.value),t=l,t!==a?(n.setValue(t),!0):!1}function Du(t){if(t=t||(typeof document<"u"?document:void 0),typeof t>"u")return null;try{return t.activeElement||t.body}catch{return t.body}}function ti(t){return t.replace(yL,function(n){return"\\"+n.charCodeAt(0).toString(16)+" "})}function At(t,n){n.checked===void 0||n.defaultChecked===void 0||uA||(console.error("%s contains an input of type %s with both checked and defaultChecked props. Input elements must be either controlled or uncontrolled (specify either the checked prop, or the defaultChecked prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://react.dev/link/controlled-components",wu()||"A component",n.type),uA=!0),n.value===void 0||n.defaultValue===void 0||lA||(console.error("%s contains an input of type %s with both value and defaultValue props. Input elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://react.dev/link/controlled-components",wu()||"A component",n.type),lA=!0)}function ku(t,n,a,l,d,p,T,C){t.name="",T!=null&&typeof T!="function"&&typeof T!="symbol"&&typeof T!="boolean"?(Ee(T,"type"),t.type=T):t.removeAttribute("type"),n!=null?T==="number"?(n===0&&t.value===""||t.value!=n)&&(t.value=""+Si(n)):t.value!==""+Si(n)&&(t.value=""+Si(n)):T!=="submit"&&T!=="reset"||t.removeAttribute("value"),n!=null?jd(t,T,Si(n)):a!=null?jd(t,T,Si(a)):l!=null&&t.removeAttribute("value"),d==null&&p!=null&&(t.defaultChecked=!!p),d!=null&&(t.checked=d&&typeof d!="function"&&typeof d!="symbol"),C!=null&&typeof C!="function"&&typeof C!="symbol"&&typeof C!="boolean"?(Ee(C,"name"),t.name=""+Si(C)):t.removeAttribute("name")}function jo(t,n,a,l,d,p,T,C){if(p!=null&&typeof p!="function"&&typeof p!="symbol"&&typeof p!="boolean"&&(Ee(p,"type"),t.type=p),n!=null||a!=null){if(!(p!=="submit"&&p!=="reset"||n!=null))return;a=a!=null?""+Si(a):"",n=n!=null?""+Si(n):a,C||n===t.value||(t.value=n),t.defaultValue=n}l=l??d,l=typeof l!="function"&&typeof l!="symbol"&&!!l,t.checked=C?t.checked:!!l,t.defaultChecked=!!l,T!=null&&typeof T!="function"&&typeof T!="symbol"&&typeof T!="boolean"&&(Ee(T,"name"),t.name=T)}function jd(t,n,a){n==="number"&&Du(t.ownerDocument)===t||t.defaultValue===""+a||(t.defaultValue=""+a)}function Fp(t,n){n.value==null&&(typeof n.children=="object"&&n.children!==null?nb.Children.forEach(n.children,function(a){a==null||typeof a=="string"||typeof a=="number"||typeof a=="bigint"||dA||(dA=!0,console.error("Cannot infer the option value of complex children. Pass a `value` prop or use a plain string as children to