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 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
- - [Browser Compatibility](#browser-compatibility)
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
- ### Subtitle Controls
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
 
@@ -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: opacity 0.2s ease;
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
- }