myetv-player 1.0.8 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +76 -2
- package/css/myetv-player.css +321 -208
- package/css/myetv-player.min.css +1 -1
- package/dist/myetv-player.js +219 -37
- package/dist/myetv-player.min.js +204 -26
- package/package.json +3 -1
- package/plugins/cloudflare/README.md +26 -4
- package/plugins/cloudflare/myetv-player-cloudflare-stream-plugin.js +1273 -217
- package/plugins/facebook/myetv-player-facebook-plugin.js +1340 -164
- package/plugins/twitch/myetv-player-twitch-plugin.js +428 -167
- package/plugins/vimeo/README.md +1 -1
- package/plugins/vimeo/myetv-player-vimeo.js +560 -247
- package/plugins/youtube/README.md +18 -7
- package/plugins/youtube/myetv-player-youtube-plugin.js +1485 -190
- package/scss/_base.scss +0 -15
- package/scss/_controls.scss +182 -2
- package/scss/_menus.scss +51 -0
- package/scss/_responsive.scss +187 -321
- package/scss/_title-overlay.scss +27 -0
- package/scss/_video.scss +0 -75
- package/scss/_watermark.scss +120 -0
- package/scss/myetv-player.scss +7 -7
- package/src/controls.js +72 -21
- package/src/core.js +43 -5
- package/src/events.js +33 -5
- package/src/utils.js +20 -6
- package/src/watermark.js +51 -0
package/README.md
CHANGED
|
@@ -15,7 +15,7 @@ A modern and complete HTML5 + JavaScript + css video player with custom controls
|
|
|
15
15
|
- [Api Events](#api-events)
|
|
16
16
|
- [Keyboard Controls](#keyboard-controls)
|
|
17
17
|
- [CSS Customization](#css-customization)
|
|
18
|
-
- [
|
|
18
|
+
- [Multi-Language i18n](#internationalization-i18n)
|
|
19
19
|
- [Plugins Feature](#plugins-feature)
|
|
20
20
|
- [Chapters Feature](#chapters-feature)
|
|
21
21
|
- [Playlist Feature](#playlist-feature)
|
|
@@ -113,6 +113,7 @@ const player = new MYETVvideoplayer('my-video', {
|
|
|
113
113
|
| `defaultQuality` | string | `'auto'` | Default video quality |
|
|
114
114
|
| `showTitleOverlay` | boolean | `false` | Show video title overlay |
|
|
115
115
|
| `videoTitle` | string | `''` | Title to show in overlay |
|
|
116
|
+
| `videoSubtitle` | string | `''` | Sub-Title to show in overlay |
|
|
116
117
|
| `persistentTitle` | boolean | `false` | Keep title always visible |
|
|
117
118
|
| `language` | string | `en` | Interface language code |
|
|
118
119
|
| `brandLogoEnabled` | boolean | `false` | Show/hide the brand logo in the controlbar |
|
|
@@ -185,7 +186,7 @@ player.getSelectedQuality(); // Selected quality
|
|
|
185
186
|
player.getCurrentPlayingQuality(); // Actual playing quality
|
|
186
187
|
player.enableAutoQuality(); // Enable automatic selection
|
|
187
188
|
```
|
|
188
|
-
###
|
|
189
|
+
### Subtitles Controls
|
|
189
190
|
```
|
|
190
191
|
// Subtitles
|
|
191
192
|
player.toggleSubtitles(); // Toggle subtitles
|
|
@@ -746,6 +747,79 @@ Minimal DOM manipulation thanks to CSS-based theming
|
|
|
746
747
|
|
|
747
748
|
Hardware-accelerated transitions for smooth playback
|
|
748
749
|
|
|
750
|
+
## Internationalization (i18n)
|
|
751
|
+
|
|
752
|
+
The MYETV player includes a comprehensive internationalization system that allows the user interface to be displayed in multiple languages. The system automatically translates all controls, buttons, tooltips, and player messages into the selected language.
|
|
753
|
+
|
|
754
|
+
### Automatic Language Detection
|
|
755
|
+
|
|
756
|
+
If no language is specified in the initialization options, the player **automatically detects the language from the user's browser** using `navigator.language`. The system extracts the language code (e.g., `en` from `en-US`) and if a translation is available, applies it automatically. Otherwise, it defaults to English.
|
|
757
|
+
|
|
758
|
+
### Available Languages
|
|
759
|
+
|
|
760
|
+
The player currently supports the following languages:
|
|
761
|
+
|
|
762
|
+
| Code | Language | Native Name |
|
|
763
|
+
|------|----------|-------------|
|
|
764
|
+
| `it` | Italian | Italiano |
|
|
765
|
+
| `en` | English | English |
|
|
766
|
+
| `es` | Spanish | Español |
|
|
767
|
+
| `fr` | French | Français |
|
|
768
|
+
| `de` | German | Deutsch |
|
|
769
|
+
| `pt` | Portuguese | Português |
|
|
770
|
+
| `zh` | Chinese | 中文 |
|
|
771
|
+
| `ja` | Japanese | 日本語 |
|
|
772
|
+
| `ru` | Russian | Русский |
|
|
773
|
+
| `ar` | Arabic | العربية |
|
|
774
|
+
|
|
775
|
+
### Setting Language at Initialization
|
|
776
|
+
|
|
777
|
+
To specify a language during player initialization, use the `language` option:
|
|
778
|
+
```
|
|
779
|
+
const player = new VideoPlayer('myVideo', {
|
|
780
|
+
language: 'en', // Set to English
|
|
781
|
+
// other options...
|
|
782
|
+
});
|
|
783
|
+
```
|
|
784
|
+
### Changing Language Dynamically
|
|
785
|
+
|
|
786
|
+
You can change the player language at any time using the `setLanguage()` method:
|
|
787
|
+
```
|
|
788
|
+
// Change language to Spanish
|
|
789
|
+
player.setLanguage('es');
|
|
790
|
+
|
|
791
|
+
// Change language to French
|
|
792
|
+
player.setLanguage('fr');
|
|
793
|
+
```
|
|
794
|
+
The method returns `true` if the language was successfully changed, `false` if the specified language is not available.
|
|
795
|
+
|
|
796
|
+
### Getting Language Information
|
|
797
|
+
|
|
798
|
+
The player provides several methods to retrieve language information:
|
|
799
|
+
|
|
800
|
+
#### Get current language:
|
|
801
|
+
```
|
|
802
|
+
const currentLang = player.getCurrentLanguage();
|
|
803
|
+
console.log(currentLang); // e.g., 'en'
|
|
804
|
+
```
|
|
805
|
+
#### Get list of supported languages:
|
|
806
|
+
```
|
|
807
|
+
const languages = player.getSupportedLanguages();
|
|
808
|
+
console.log(languages); // ['it', 'en', 'es', 'fr', 'de', 'pt', 'zh', 'ja', 'ru', 'ar']
|
|
809
|
+
```
|
|
810
|
+
### Translated Elements
|
|
811
|
+
|
|
812
|
+
The i18n system automatically translates the following interface elements:
|
|
813
|
+
|
|
814
|
+
- Control buttons (play/pause, mute, fullscreen, etc.)
|
|
815
|
+
- Settings menus
|
|
816
|
+
- Video quality options
|
|
817
|
+
- Subtitle controls
|
|
818
|
+
- Playback speed controls
|
|
819
|
+
- Playlist controls
|
|
820
|
+
- Tooltips and help messages
|
|
821
|
+
- Brand logo
|
|
822
|
+
|
|
749
823
|
## Plugins feature
|
|
750
824
|
The player supports custom plugins to extend its functionality. Every plugins must have its own documentation to clearly known how to use it. Plugins are modular so you can add or remove any plugins whenever you want. This is just an example based on two plugins.
|
|
751
825
|
|
package/css/myetv-player.css
CHANGED
|
@@ -97,21 +97,6 @@ body {
|
|
|
97
97
|
opacity: 0;
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
-
.video-wrapper:not(.has-controls) .video-watermark.watermark-bottomleft:not(.hide-on-autohide),
|
|
101
|
-
.video-wrapper:not(.has-controls) .video-watermark.watermark-bottomright:not(.hide-on-autohide) {
|
|
102
|
-
bottom: 15px;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
.video-wrapper.has-controls .video-watermark {
|
|
106
|
-
visibility: visible;
|
|
107
|
-
opacity: 0.7;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
.video-wrapper.has-controls .video-watermark.watermark-bottomleft,
|
|
111
|
-
.video-wrapper.has-controls .video-watermark.watermark-bottomright {
|
|
112
|
-
bottom: 90px;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
100
|
.hidden {
|
|
116
101
|
display: none !important;
|
|
117
102
|
}
|
|
@@ -2301,73 +2286,6 @@ video::-webkit-media-text-track-display {
|
|
|
2301
2286
|
right: 15px;
|
|
2302
2287
|
}
|
|
2303
2288
|
|
|
2304
|
-
/* Bottom positions - Increased spacing from controlbar (was 70px, now 90px) */
|
|
2305
|
-
.video-watermark.watermark-bottomleft {
|
|
2306
|
-
bottom: 90px; /* Increased spacing */
|
|
2307
|
-
left: 15px;
|
|
2308
|
-
}
|
|
2309
|
-
|
|
2310
|
-
.video-watermark.watermark-bottomright {
|
|
2311
|
-
bottom: 90px; /* Increased spacing */
|
|
2312
|
-
right: 15px;
|
|
2313
|
-
}
|
|
2314
|
-
|
|
2315
|
-
/* DYNAMIC POSITIONING: Always visible watermark moves down when controls are hidden */
|
|
2316
|
-
/* This applies ONLY to watermarks without hide-on-autohide class (always visible) */
|
|
2317
|
-
.video-wrapper:not(.has-controls) .video-watermark.watermark-bottomleft:not(.hide-on-autohide) {
|
|
2318
|
-
bottom: 15px; /* Move to bottom corner when controls hidden */
|
|
2319
|
-
}
|
|
2320
|
-
|
|
2321
|
-
.video-wrapper:not(.has-controls) .video-watermark.watermark-bottomright:not(.hide-on-autohide) {
|
|
2322
|
-
bottom: 15px; /* Move to bottom corner when controls hidden */
|
|
2323
|
-
}
|
|
2324
|
-
|
|
2325
|
-
/* When controls are shown, bottom watermark stays above controlbar */
|
|
2326
|
-
.video-wrapper.has-controls .video-watermark.watermark-bottomleft,
|
|
2327
|
-
.video-wrapper.has-controls .video-watermark.watermark-bottomright {
|
|
2328
|
-
bottom: 90px; /* Stay above controlbar */
|
|
2329
|
-
}
|
|
2330
|
-
|
|
2331
|
-
/* Responsive adjustments for mobile */
|
|
2332
|
-
@media (max-width: 768px) {
|
|
2333
|
-
.video-watermark img {
|
|
2334
|
-
max-width: 100px;
|
|
2335
|
-
max-height: 50px;
|
|
2336
|
-
}
|
|
2337
|
-
.video-watermark.watermark-topleft,
|
|
2338
|
-
.video-watermark.watermark-topright {
|
|
2339
|
-
top: 10px;
|
|
2340
|
-
}
|
|
2341
|
-
.video-watermark.watermark-topleft,
|
|
2342
|
-
.video-watermark.watermark-bottomleft {
|
|
2343
|
-
left: 10px;
|
|
2344
|
-
}
|
|
2345
|
-
.video-watermark.watermark-topright,
|
|
2346
|
-
.video-watermark.watermark-bottomright {
|
|
2347
|
-
right: 10px;
|
|
2348
|
-
}
|
|
2349
|
-
/* Bottom spacing adjusted for mobile */
|
|
2350
|
-
.video-watermark.watermark-bottomleft,
|
|
2351
|
-
.video-watermark.watermark-bottomright {
|
|
2352
|
-
bottom: 75px; /* Above controlbar on mobile */
|
|
2353
|
-
}
|
|
2354
|
-
/* Always visible watermark on mobile - moves down when controls hidden */
|
|
2355
|
-
.video-wrapper:not(.has-controls) .video-watermark.watermark-bottomleft:not(.hide-on-autohide),
|
|
2356
|
-
.video-wrapper:not(.has-controls) .video-watermark.watermark-bottomright:not(.hide-on-autohide) {
|
|
2357
|
-
bottom: 10px; /* Move to corner on mobile */
|
|
2358
|
-
}
|
|
2359
|
-
}
|
|
2360
|
-
/* Extra small screens */
|
|
2361
|
-
@media (max-width: 480px) {
|
|
2362
|
-
.video-watermark.watermark-bottomleft,
|
|
2363
|
-
.video-watermark.watermark-bottomright {
|
|
2364
|
-
bottom: 65px;
|
|
2365
|
-
}
|
|
2366
|
-
.video-wrapper:not(.has-controls) .video-watermark.watermark-bottomleft:not(.hide-on-autohide),
|
|
2367
|
-
.video-wrapper:not(.has-controls) .video-watermark.watermark-bottomright:not(.hide-on-autohide) {
|
|
2368
|
-
bottom: 8px;
|
|
2369
|
-
}
|
|
2370
|
-
}
|
|
2371
2289
|
/* Clickable watermark cursor */
|
|
2372
2290
|
.video-watermark[style*="cursor: pointer"] {
|
|
2373
2291
|
cursor: pointer !important;
|
|
@@ -2515,6 +2433,31 @@ video::-webkit-media-text-track-display {
|
|
|
2515
2433
|
-moz-osx-font-smoothing: grayscale;
|
|
2516
2434
|
}
|
|
2517
2435
|
|
|
2436
|
+
.subtitle-text {
|
|
2437
|
+
color: var(--player-text-color);
|
|
2438
|
+
font-size: 14px;
|
|
2439
|
+
font-weight: 400;
|
|
2440
|
+
line-height: 1.3;
|
|
2441
|
+
margin: 5px 0 0 0;
|
|
2442
|
+
white-space: nowrap;
|
|
2443
|
+
overflow: hidden;
|
|
2444
|
+
text-overflow: ellipsis;
|
|
2445
|
+
text-shadow: 0 2px 8px rgba(0, 0, 0, 0.7);
|
|
2446
|
+
opacity: 0.9;
|
|
2447
|
+
-webkit-font-smoothing: antialiased;
|
|
2448
|
+
-moz-osx-font-smoothing: grayscale;
|
|
2449
|
+
}
|
|
2450
|
+
|
|
2451
|
+
@media (max-width: 768px) {
|
|
2452
|
+
.subtitle-text {
|
|
2453
|
+
font-size: 12px;
|
|
2454
|
+
}
|
|
2455
|
+
}
|
|
2456
|
+
@media (max-width: 480px) {
|
|
2457
|
+
.subtitle-text {
|
|
2458
|
+
font-size: 11px;
|
|
2459
|
+
}
|
|
2460
|
+
}
|
|
2518
2461
|
/* CONTROLS - IMPROVED RESPONSIVE DESIGN */
|
|
2519
2462
|
.controls {
|
|
2520
2463
|
position: absolute;
|
|
@@ -4591,6 +4534,19 @@ video::-webkit-media-text-track-display {
|
|
|
4591
4534
|
cursor: pointer !important;
|
|
4592
4535
|
}
|
|
4593
4536
|
|
|
4537
|
+
.controls,
|
|
4538
|
+
.progress-container,
|
|
4539
|
+
.progress-bar,
|
|
4540
|
+
.controls-main,
|
|
4541
|
+
.controls-left,
|
|
4542
|
+
.controls-right,
|
|
4543
|
+
.time-display {
|
|
4544
|
+
user-select: none;
|
|
4545
|
+
-webkit-user-select: none;
|
|
4546
|
+
-moz-user-select: none;
|
|
4547
|
+
-ms-user-select: none;
|
|
4548
|
+
}
|
|
4549
|
+
|
|
4594
4550
|
.progress-container {
|
|
4595
4551
|
position: relative;
|
|
4596
4552
|
overflow: visible !important;
|
|
@@ -4642,7 +4598,7 @@ video::-webkit-media-text-track-display {
|
|
|
4642
4598
|
height: 14px;
|
|
4643
4599
|
background: var(--player-accent, #ff0000);
|
|
4644
4600
|
cursor: grab;
|
|
4645
|
-
transition:
|
|
4601
|
+
transition: all 0.2s ease;
|
|
4646
4602
|
z-index: 10;
|
|
4647
4603
|
pointer-events: auto;
|
|
4648
4604
|
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
|
|
@@ -4712,6 +4668,75 @@ video::-webkit-media-text-track-display {
|
|
|
4712
4668
|
opacity: 1 !important;
|
|
4713
4669
|
}
|
|
4714
4670
|
|
|
4671
|
+
@media (max-width: 768px) {
|
|
4672
|
+
.progress-bar {
|
|
4673
|
+
height: 4px;
|
|
4674
|
+
}
|
|
4675
|
+
.progress-handle {
|
|
4676
|
+
touch-action: none;
|
|
4677
|
+
-webkit-touch-callout: none;
|
|
4678
|
+
}
|
|
4679
|
+
.progress-handle::before {
|
|
4680
|
+
content: "";
|
|
4681
|
+
position: absolute;
|
|
4682
|
+
top: 50%;
|
|
4683
|
+
left: 50%;
|
|
4684
|
+
transform: translate(-50%, -50%);
|
|
4685
|
+
width: 50px;
|
|
4686
|
+
height: 50px;
|
|
4687
|
+
border-radius: 50%;
|
|
4688
|
+
background: transparent;
|
|
4689
|
+
z-index: -1;
|
|
4690
|
+
}
|
|
4691
|
+
.progress-handle:active {
|
|
4692
|
+
width: 24px !important;
|
|
4693
|
+
height: 24px !important;
|
|
4694
|
+
box-shadow: 0 3px 8px rgba(0, 0, 0, 0.4);
|
|
4695
|
+
}
|
|
4696
|
+
.progress-handle-circle:active {
|
|
4697
|
+
border-radius: 50%;
|
|
4698
|
+
}
|
|
4699
|
+
.progress-handle-square:active {
|
|
4700
|
+
border-radius: 5px;
|
|
4701
|
+
}
|
|
4702
|
+
.progress-handle-diamond:active {
|
|
4703
|
+
border-radius: 4px;
|
|
4704
|
+
transform: translate(-50%, -50%) rotate(45deg);
|
|
4705
|
+
}
|
|
4706
|
+
.progress-handle-arrow:active {
|
|
4707
|
+
border-left: 12px solid transparent;
|
|
4708
|
+
border-right: 12px solid transparent;
|
|
4709
|
+
border-bottom: 24px solid var(--player-accent, #ff0000);
|
|
4710
|
+
}
|
|
4711
|
+
.progress-handle-triangle:active {
|
|
4712
|
+
border-left: 13px solid transparent;
|
|
4713
|
+
border-right: 13px solid transparent;
|
|
4714
|
+
border-bottom: 24px solid var(--player-accent, #ff0000);
|
|
4715
|
+
}
|
|
4716
|
+
.progress-handle-heart:active,
|
|
4717
|
+
.progress-handle-star:active {
|
|
4718
|
+
width: 26px !important;
|
|
4719
|
+
height: 26px !important;
|
|
4720
|
+
}
|
|
4721
|
+
}
|
|
4722
|
+
@media (max-width: 480px) {
|
|
4723
|
+
.progress-bar {
|
|
4724
|
+
height: 4px;
|
|
4725
|
+
}
|
|
4726
|
+
.progress-handle::before {
|
|
4727
|
+
width: 60px;
|
|
4728
|
+
height: 60px;
|
|
4729
|
+
}
|
|
4730
|
+
.progress-handle:active {
|
|
4731
|
+
width: 28px !important;
|
|
4732
|
+
height: 28px !important;
|
|
4733
|
+
}
|
|
4734
|
+
.progress-handle-heart:active,
|
|
4735
|
+
.progress-handle-star:active {
|
|
4736
|
+
width: 30px !important;
|
|
4737
|
+
height: 30px !important;
|
|
4738
|
+
}
|
|
4739
|
+
}
|
|
4715
4740
|
/* Main controls container */
|
|
4716
4741
|
.controls {
|
|
4717
4742
|
position: absolute;
|
|
@@ -4737,6 +4762,57 @@ video::-webkit-media-text-track-display {
|
|
|
4737
4762
|
z-index: 20 !important;
|
|
4738
4763
|
}
|
|
4739
4764
|
|
|
4765
|
+
.progress-container,
|
|
4766
|
+
.progress-bar,
|
|
4767
|
+
.progress-handle {
|
|
4768
|
+
touch-action: none;
|
|
4769
|
+
-webkit-touch-callout: none;
|
|
4770
|
+
}
|
|
4771
|
+
|
|
4772
|
+
/* Badge for video in encoding (duration Infinity/NaN) */
|
|
4773
|
+
.encoding-badge {
|
|
4774
|
+
display: inline-block;
|
|
4775
|
+
background: rgba(128, 128, 128, 0.8);
|
|
4776
|
+
color: white;
|
|
4777
|
+
padding: 2px 8px;
|
|
4778
|
+
border-radius: 4px;
|
|
4779
|
+
font-size: 11px;
|
|
4780
|
+
font-weight: 500;
|
|
4781
|
+
text-transform: uppercase;
|
|
4782
|
+
letter-spacing: 0.5px;
|
|
4783
|
+
white-space: nowrap;
|
|
4784
|
+
backdrop-filter: blur(4px);
|
|
4785
|
+
border: 1px solid rgba(255, 255, 255, 0.2);
|
|
4786
|
+
animation: encoding-pulse 2s ease-in-out infinite;
|
|
4787
|
+
}
|
|
4788
|
+
|
|
4789
|
+
/* Class for the container when shows the badge */
|
|
4790
|
+
.time-display .encoding-state {
|
|
4791
|
+
display: flex;
|
|
4792
|
+
align-items: center;
|
|
4793
|
+
}
|
|
4794
|
+
|
|
4795
|
+
/* animation for the badge */
|
|
4796
|
+
@keyframes encoding-pulse {
|
|
4797
|
+
0%, 100% {
|
|
4798
|
+
opacity: 0.8;
|
|
4799
|
+
}
|
|
4800
|
+
50% {
|
|
4801
|
+
opacity: 1;
|
|
4802
|
+
}
|
|
4803
|
+
}
|
|
4804
|
+
@media (max-width: 480px) {
|
|
4805
|
+
.encoding-badge {
|
|
4806
|
+
font-size: 9px;
|
|
4807
|
+
padding: 1px 6px;
|
|
4808
|
+
}
|
|
4809
|
+
}
|
|
4810
|
+
@media (max-width: 350px) {
|
|
4811
|
+
.encoding-badge {
|
|
4812
|
+
font-size: 8px;
|
|
4813
|
+
padding: 1px 4px;
|
|
4814
|
+
}
|
|
4815
|
+
}
|
|
4740
4816
|
/* PROGRESS BAR */
|
|
4741
4817
|
.progress-container {
|
|
4742
4818
|
width: 100%;
|
|
@@ -12517,6 +12593,54 @@ video::-webkit-media-text-track-display {
|
|
|
12517
12593
|
cursor: pointer !important;
|
|
12518
12594
|
}
|
|
12519
12595
|
|
|
12596
|
+
/* ===================================
|
|
12597
|
+
FIX SUBMENU CLIPPING ON SMALL SCREENS
|
|
12598
|
+
=================================== */
|
|
12599
|
+
/* Change positioning from bottom-aligned to top-aligned when menu would be clipped */
|
|
12600
|
+
/* ONLY affects submenus inside settings menu (small screen mode) */
|
|
12601
|
+
@media (max-height: 600px) {
|
|
12602
|
+
.settings-menu .settings-submenu,
|
|
12603
|
+
.settings-option .settings-submenu,
|
|
12604
|
+
.settings-option .quality-submenu,
|
|
12605
|
+
.settings-option .speed-submenu {
|
|
12606
|
+
/* Remove bottom positioning */
|
|
12607
|
+
bottom: auto !important;
|
|
12608
|
+
/* Align to top of parent option */
|
|
12609
|
+
top: 0 !important;
|
|
12610
|
+
/* Reduce max-height on very small screens */
|
|
12611
|
+
max-height: 150px !important;
|
|
12612
|
+
}
|
|
12613
|
+
}
|
|
12614
|
+
/* Even smaller screens - ultra compact */
|
|
12615
|
+
@media (max-height: 400px) {
|
|
12616
|
+
.settings-menu .settings-submenu,
|
|
12617
|
+
.settings-option .settings-submenu,
|
|
12618
|
+
.settings-option .quality-submenu,
|
|
12619
|
+
.settings-option .speed-submenu {
|
|
12620
|
+
max-height: 120px !important;
|
|
12621
|
+
}
|
|
12622
|
+
}
|
|
12623
|
+
/* For very small players (width < 400px) - only inside settings menu */
|
|
12624
|
+
@media (max-width: 400px) {
|
|
12625
|
+
.settings-menu .settings-submenu,
|
|
12626
|
+
.settings-option .settings-submenu,
|
|
12627
|
+
.settings-option .quality-submenu,
|
|
12628
|
+
.settings-option .speed-submenu {
|
|
12629
|
+
/* Switch to top alignment */
|
|
12630
|
+
bottom: auto !important;
|
|
12631
|
+
top: 0 !important;
|
|
12632
|
+
max-height: 180px !important;
|
|
12633
|
+
}
|
|
12634
|
+
}
|
|
12635
|
+
/* EXCLUDE standalone subtitles menu (the one that appears when player is large) */
|
|
12636
|
+
/* Keep original bottom positioning for standalone menus */
|
|
12637
|
+
.subtitles-button .subtitles-menu,
|
|
12638
|
+
.yt-subtitles-submenu:not(.settings-option *),
|
|
12639
|
+
.yt-quality-submenu:not(.settings-option *) {
|
|
12640
|
+
bottom: 0 !important;
|
|
12641
|
+
top: auto !important;
|
|
12642
|
+
}
|
|
12643
|
+
|
|
12520
12644
|
.audio-player {
|
|
12521
12645
|
width: 320px;
|
|
12522
12646
|
height: 80px;
|
|
@@ -12557,6 +12681,120 @@ video::-webkit-media-text-track-display {
|
|
|
12557
12681
|
--player-primary-dark: #c62828;
|
|
12558
12682
|
}
|
|
12559
12683
|
|
|
12684
|
+
.video-watermark {
|
|
12685
|
+
position: absolute;
|
|
12686
|
+
z-index: 15;
|
|
12687
|
+
pointer-events: auto;
|
|
12688
|
+
opacity: 0.7;
|
|
12689
|
+
transition: opacity 0.3s ease, visibility 0.3s ease, bottom 0.3s ease;
|
|
12690
|
+
}
|
|
12691
|
+
|
|
12692
|
+
.video-watermark {
|
|
12693
|
+
visibility: visible;
|
|
12694
|
+
opacity: 0.7;
|
|
12695
|
+
}
|
|
12696
|
+
|
|
12697
|
+
.video-wrapper:not(.has-controls) .video-watermark.hide-on-autohide {
|
|
12698
|
+
visibility: hidden;
|
|
12699
|
+
opacity: 0;
|
|
12700
|
+
}
|
|
12701
|
+
|
|
12702
|
+
.video-wrapper.has-controls .video-watermark {
|
|
12703
|
+
visibility: visible;
|
|
12704
|
+
opacity: 0.7;
|
|
12705
|
+
}
|
|
12706
|
+
|
|
12707
|
+
.video-watermark:hover {
|
|
12708
|
+
opacity: 1;
|
|
12709
|
+
}
|
|
12710
|
+
|
|
12711
|
+
.video-watermark img {
|
|
12712
|
+
display: block;
|
|
12713
|
+
max-width: 150px;
|
|
12714
|
+
max-height: 80px;
|
|
12715
|
+
width: auto;
|
|
12716
|
+
height: auto;
|
|
12717
|
+
object-fit: contain;
|
|
12718
|
+
}
|
|
12719
|
+
|
|
12720
|
+
/* Top positions */
|
|
12721
|
+
.video-watermark.watermark-topleft {
|
|
12722
|
+
top: 15px;
|
|
12723
|
+
left: 15px;
|
|
12724
|
+
}
|
|
12725
|
+
|
|
12726
|
+
.video-watermark.watermark-topright {
|
|
12727
|
+
top: 15px;
|
|
12728
|
+
right: 15px;
|
|
12729
|
+
}
|
|
12730
|
+
|
|
12731
|
+
/* Bottom positions - Dynamic with controlbar height + spacing */
|
|
12732
|
+
.video-watermark.watermark-bottomleft {
|
|
12733
|
+
bottom: calc(var(--player-controls-height, 70px) + 15px);
|
|
12734
|
+
left: 15px;
|
|
12735
|
+
}
|
|
12736
|
+
|
|
12737
|
+
.video-watermark.watermark-bottomright {
|
|
12738
|
+
bottom: calc(var(--player-controls-height, 70px) + 15px);
|
|
12739
|
+
right: 15px;
|
|
12740
|
+
}
|
|
12741
|
+
|
|
12742
|
+
/* When controls hidden, move to corner */
|
|
12743
|
+
.video-wrapper:not(.has-controls) .video-watermark.watermark-bottomleft:not(.hide-on-autohide) {
|
|
12744
|
+
bottom: 15px;
|
|
12745
|
+
}
|
|
12746
|
+
|
|
12747
|
+
.video-wrapper:not(.has-controls) .video-watermark.watermark-bottomright:not(.hide-on-autohide) {
|
|
12748
|
+
bottom: 15px;
|
|
12749
|
+
}
|
|
12750
|
+
|
|
12751
|
+
/* When controls shown, stay above controlbar */
|
|
12752
|
+
.video-wrapper.has-controls .video-watermark.watermark-bottomleft,
|
|
12753
|
+
.video-wrapper.has-controls .video-watermark.watermark-bottomright {
|
|
12754
|
+
bottom: calc(var(--player-controls-height, 70px) + 15px);
|
|
12755
|
+
}
|
|
12756
|
+
|
|
12757
|
+
/* Responsive */
|
|
12758
|
+
@media (max-width: 768px) {
|
|
12759
|
+
.video-watermark img {
|
|
12760
|
+
max-width: 100px;
|
|
12761
|
+
max-height: 50px;
|
|
12762
|
+
}
|
|
12763
|
+
.video-watermark.watermark-topleft,
|
|
12764
|
+
.video-watermark.watermark-topright {
|
|
12765
|
+
top: 10px;
|
|
12766
|
+
}
|
|
12767
|
+
.video-watermark.watermark-topleft,
|
|
12768
|
+
.video-watermark.watermark-bottomleft {
|
|
12769
|
+
left: 10px;
|
|
12770
|
+
}
|
|
12771
|
+
.video-watermark.watermark-topright,
|
|
12772
|
+
.video-watermark.watermark-bottomright {
|
|
12773
|
+
right: 10px;
|
|
12774
|
+
}
|
|
12775
|
+
.video-watermark.watermark-bottomleft,
|
|
12776
|
+
.video-watermark.watermark-bottomright {
|
|
12777
|
+
bottom: calc(var(--player-controls-height, 60px) + 10px);
|
|
12778
|
+
}
|
|
12779
|
+
.video-wrapper:not(.has-controls) .video-watermark.watermark-bottomleft:not(.hide-on-autohide),
|
|
12780
|
+
.video-wrapper:not(.has-controls) .video-watermark.watermark-bottomright:not(.hide-on-autohide) {
|
|
12781
|
+
bottom: 10px;
|
|
12782
|
+
}
|
|
12783
|
+
}
|
|
12784
|
+
@media (max-width: 480px) {
|
|
12785
|
+
.video-watermark.watermark-bottomleft,
|
|
12786
|
+
.video-watermark.watermark-bottomright {
|
|
12787
|
+
bottom: calc(var(--player-controls-height, 55px) + 10px);
|
|
12788
|
+
}
|
|
12789
|
+
.video-wrapper:not(.has-controls) .video-watermark.watermark-bottomleft:not(.hide-on-autohide),
|
|
12790
|
+
.video-wrapper:not(.has-controls) .video-watermark.watermark-bottomright:not(.hide-on-autohide) {
|
|
12791
|
+
bottom: 8px;
|
|
12792
|
+
}
|
|
12793
|
+
}
|
|
12794
|
+
.video-watermark[style*="cursor: pointer"] {
|
|
12795
|
+
cursor: pointer !important;
|
|
12796
|
+
}
|
|
12797
|
+
|
|
12560
12798
|
/* RESPONSIVE DESIGN - PROGRESSIVE DEGRADATION CON MENU A TENDINA */
|
|
12561
12799
|
/* Large tablets and small desktops */
|
|
12562
12800
|
@media (max-width: 768px) {
|
|
@@ -13780,128 +14018,3 @@ video::-webkit-media-text-track-display {
|
|
|
13780
14018
|
bottom: 0 !important;
|
|
13781
14019
|
overflow: visible !important;
|
|
13782
14020
|
}
|
|
13783
|
-
|
|
13784
|
-
/* ===================================
|
|
13785
|
-
WATERMARK OVERLAY
|
|
13786
|
-
=================================== */
|
|
13787
|
-
.video-watermark {
|
|
13788
|
-
position: absolute;
|
|
13789
|
-
z-index: 15; /* Above video (10), below controls (100) */
|
|
13790
|
-
pointer-events: auto;
|
|
13791
|
-
opacity: 0.7;
|
|
13792
|
-
transition: opacity 0.3s ease, visibility 0.3s ease, bottom 0.3s ease;
|
|
13793
|
-
}
|
|
13794
|
-
|
|
13795
|
-
/* Watermark visible by default */
|
|
13796
|
-
.video-watermark {
|
|
13797
|
-
visibility: visible;
|
|
13798
|
-
opacity: 0.7;
|
|
13799
|
-
}
|
|
13800
|
-
|
|
13801
|
-
/* Hide watermark when it has hide-on-autohide class AND controls are hidden */
|
|
13802
|
-
.video-wrapper:not(.has-controls) .video-watermark.hide-on-autohide {
|
|
13803
|
-
visibility: hidden;
|
|
13804
|
-
opacity: 0;
|
|
13805
|
-
}
|
|
13806
|
-
|
|
13807
|
-
/* Show watermark when controls are shown */
|
|
13808
|
-
.video-wrapper.has-controls .video-watermark {
|
|
13809
|
-
visibility: visible;
|
|
13810
|
-
opacity: 0.7;
|
|
13811
|
-
}
|
|
13812
|
-
|
|
13813
|
-
.video-watermark:hover {
|
|
13814
|
-
opacity: 1;
|
|
13815
|
-
}
|
|
13816
|
-
|
|
13817
|
-
.video-watermark img {
|
|
13818
|
-
display: block;
|
|
13819
|
-
max-width: 150px;
|
|
13820
|
-
max-height: 80px;
|
|
13821
|
-
width: auto;
|
|
13822
|
-
height: auto;
|
|
13823
|
-
object-fit: contain;
|
|
13824
|
-
}
|
|
13825
|
-
|
|
13826
|
-
/* Watermark positions - Top positions unchanged */
|
|
13827
|
-
.video-watermark.watermark-topleft {
|
|
13828
|
-
top: 15px;
|
|
13829
|
-
left: 15px;
|
|
13830
|
-
}
|
|
13831
|
-
|
|
13832
|
-
.video-watermark.watermark-topright {
|
|
13833
|
-
top: 15px;
|
|
13834
|
-
right: 15px;
|
|
13835
|
-
}
|
|
13836
|
-
|
|
13837
|
-
/* Bottom positions - Increased spacing from controlbar (was 70px, now 90px) */
|
|
13838
|
-
.video-watermark.watermark-bottomleft {
|
|
13839
|
-
bottom: 90px; /* Increased spacing */
|
|
13840
|
-
left: 15px;
|
|
13841
|
-
}
|
|
13842
|
-
|
|
13843
|
-
.video-watermark.watermark-bottomright {
|
|
13844
|
-
bottom: 90px; /* Increased spacing */
|
|
13845
|
-
right: 15px;
|
|
13846
|
-
}
|
|
13847
|
-
|
|
13848
|
-
/* DYNAMIC POSITIONING: Always visible watermark moves down when controls are hidden */
|
|
13849
|
-
/* This applies ONLY to watermarks without hide-on-autohide class (always visible) */
|
|
13850
|
-
.video-wrapper:not(.has-controls) .video-watermark.watermark-bottomleft:not(.hide-on-autohide) {
|
|
13851
|
-
bottom: 15px; /* Move to bottom corner when controls hidden */
|
|
13852
|
-
}
|
|
13853
|
-
|
|
13854
|
-
.video-wrapper:not(.has-controls) .video-watermark.watermark-bottomright:not(.hide-on-autohide) {
|
|
13855
|
-
bottom: 15px; /* Move to bottom corner when controls hidden */
|
|
13856
|
-
}
|
|
13857
|
-
|
|
13858
|
-
/* When controls are shown, bottom watermark stays above controlbar */
|
|
13859
|
-
.video-wrapper.has-controls .video-watermark.watermark-bottomleft,
|
|
13860
|
-
.video-wrapper.has-controls .video-watermark.watermark-bottomright {
|
|
13861
|
-
bottom: 90px; /* Stay above controlbar */
|
|
13862
|
-
}
|
|
13863
|
-
|
|
13864
|
-
/* Responsive adjustments for mobile */
|
|
13865
|
-
@media (max-width: 768px) {
|
|
13866
|
-
.video-watermark img {
|
|
13867
|
-
max-width: 100px;
|
|
13868
|
-
max-height: 50px;
|
|
13869
|
-
}
|
|
13870
|
-
.video-watermark.watermark-topleft,
|
|
13871
|
-
.video-watermark.watermark-topright {
|
|
13872
|
-
top: 10px;
|
|
13873
|
-
}
|
|
13874
|
-
.video-watermark.watermark-topleft,
|
|
13875
|
-
.video-watermark.watermark-bottomleft {
|
|
13876
|
-
left: 10px;
|
|
13877
|
-
}
|
|
13878
|
-
.video-watermark.watermark-topright,
|
|
13879
|
-
.video-watermark.watermark-bottomright {
|
|
13880
|
-
right: 10px;
|
|
13881
|
-
}
|
|
13882
|
-
/* Bottom spacing adjusted for mobile */
|
|
13883
|
-
.video-watermark.watermark-bottomleft,
|
|
13884
|
-
.video-watermark.watermark-bottomright {
|
|
13885
|
-
bottom: 75px; /* Above controlbar on mobile */
|
|
13886
|
-
}
|
|
13887
|
-
/* Always visible watermark on mobile - moves down when controls hidden */
|
|
13888
|
-
.video-wrapper:not(.has-controls) .video-watermark.watermark-bottomleft:not(.hide-on-autohide),
|
|
13889
|
-
.video-wrapper:not(.has-controls) .video-watermark.watermark-bottomright:not(.hide-on-autohide) {
|
|
13890
|
-
bottom: 10px; /* Move to corner on mobile */
|
|
13891
|
-
}
|
|
13892
|
-
}
|
|
13893
|
-
/* Extra small screens */
|
|
13894
|
-
@media (max-width: 480px) {
|
|
13895
|
-
.video-watermark.watermark-bottomleft,
|
|
13896
|
-
.video-watermark.watermark-bottomright {
|
|
13897
|
-
bottom: 65px;
|
|
13898
|
-
}
|
|
13899
|
-
.video-wrapper:not(.has-controls) .video-watermark.watermark-bottomleft:not(.hide-on-autohide),
|
|
13900
|
-
.video-wrapper:not(.has-controls) .video-watermark.watermark-bottomright:not(.hide-on-autohide) {
|
|
13901
|
-
bottom: 8px;
|
|
13902
|
-
}
|
|
13903
|
-
}
|
|
13904
|
-
/* Clickable watermark cursor */
|
|
13905
|
-
.video-watermark[style*="cursor: pointer"] {
|
|
13906
|
-
cursor: pointer !important;
|
|
13907
|
-
}
|