Hermes Agent commited on
Commit
acd39c7
·
1 Parent(s): a0902ab

feat(mobile-ui): add alphabet touch-drag scrubber, 16:9 full backdrop, fix dots overlap and tap lag

Browse files
Files changed (3) hide show
  1. apex/ui/abyss.css +113 -25
  2. apex/ui/spotlight-loader.js +102 -1
  3. apex/ui/spotlight.css +71 -25
apex/ui/abyss.css CHANGED
@@ -402,12 +402,23 @@ input[type="radio"]:checked {
402
 
403
  /* Jellyfin 12 modern app shell (React / MUI) [BETA] */
404
 
405
- /* Jellyfin Alphabet Picker (A-Z Quick Scroller) - Transparent, Small & Edge-Pinned */
406
  .alphaPicker,
407
  .alphaPicker-fixed,
408
  .alphaPicker-fixed-right,
409
  .alphanumeric-scrollbar,
410
  div[class*="alphaPicker"] {
 
 
 
 
 
 
 
 
 
 
 
411
  background: transparent !important;
412
  background-color: transparent !important;
413
  background-image: none !important;
@@ -415,16 +426,15 @@ div[class*="alphaPicker"] {
415
  border: none !important;
416
  -webkit-backdrop-filter: none !important;
417
  backdrop-filter: none !important;
418
- right: 0 !important;
419
- margin-right: 0 !important;
420
- padding-right: 1px !important;
421
- padding-left: 0 !important;
422
- width: auto !important;
423
- min-width: 0 !important;
424
- max-width: 18px !important;
425
  pointer-events: auto !important;
426
- z-index: 100 !important;
427
- align-self: center;
 
 
 
 
 
 
428
  }
429
 
430
  .alphaPicker .alphaPickerInner,
@@ -441,14 +451,14 @@ div[class*="alphaPickerInner"] {
441
  backdrop-filter: none !important;
442
  padding: 0 !important;
443
  margin: 0 !important;
444
- width: auto !important;
445
- min-width: 0 !important;
446
- max-width: 18px !important;
447
  border-radius: 0 !important;
448
  display: flex !important;
449
  flex-direction: column !important;
450
  align-items: center !important;
451
- justify-content: center !important;
452
  }
453
 
454
  .alphaPickerButton,
@@ -459,34 +469,74 @@ div[class*="alphaPicker"] button,
459
  div[class*="alphaPickerButton"] {
460
  background: transparent !important;
461
  background-color: transparent !important;
462
- color: rgba(255, 255, 255, 0.55) !important;
463
  font-size: 8.5px !important;
464
  font-weight: 700 !important;
465
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, monospace, sans-serif !important;
466
  line-height: 1 !important;
467
- padding: 1px 2px !important;
468
  margin: 0 !important;
469
- min-width: 12px !important;
470
- max-width: 16px !important;
471
- height: auto !important;
472
- min-height: 0 !important;
 
 
473
  border: none !important;
474
  border-radius: 2px !important;
475
  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.95), 0 0 3px rgba(0, 0, 0, 0.9) !important;
476
- transition: color 0.15s ease, transform 0.15s ease, background-color 0.15s ease !important;
 
 
477
  }
478
 
479
  .alphaPickerButton:hover,
480
  .alphaPickerButton:focus,
 
 
481
  .alphaPickerButton.selectedItem,
482
  .alphaPickerButton-selected,
483
  .alphaPicker-fixed-right .MuiButtonBase-root:hover,
484
  .alphaPicker-fixed-right .MuiButtonBase-root.Mui-selected {
485
  color: #ffffff !important;
486
  background: rgba(var(--abyss-accent, 0, 164, 220), 0.35) !important;
487
- transform: scale(1.25) !important;
488
  font-weight: 900 !important;
489
- text-shadow: 0 0 6px rgba(var(--abyss-accent, 0, 164, 220), 0.8) !important;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
490
  }
491
 
492
  .MuiTouchRipple-root {
@@ -3417,8 +3467,46 @@ body.videoPlayerContainerVisible #abyss-spotlight-backdrop {
3417
  display: none !important;
3418
  }
3419
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3420
  /* 13. Android & Mobile Perfection */
3421
  @media (max-width: 959px) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3422
  .MuiDrawer-modal .MuiDrawer-paper,
3423
  .mainDrawer {
3424
  position: fixed !important;
@@ -3428,8 +3516,8 @@ body.videoPlayerContainerVisible #abyss-spotlight-backdrop {
3428
  width: 280px !important;
3429
  max-width: 80vw !important;
3430
  background: rgba(17, 17, 21, 0.98) !important;
3431
- backdrop-filter: blur(25px) !important;
3432
- -webkit-backdrop-filter: blur(25px) !important;
3433
  border: none !important;
3434
  border-right: 1px solid rgba(255, 255, 255, 0.1) !important;
3435
  box-shadow: 0 8px 32px rgba(0, 0, 0, 0.7) !important;
 
402
 
403
  /* Jellyfin 12 modern app shell (React / MUI) [BETA] */
404
 
405
+ /* Jellyfin Alphabet Picker (A-Z Quick Scroller) - Transparent, Full Height, Edge-Pinned & Evenly Spaced */
406
  .alphaPicker,
407
  .alphaPicker-fixed,
408
  .alphaPicker-fixed-right,
409
  .alphanumeric-scrollbar,
410
  div[class*="alphaPicker"] {
411
+ position: fixed !important;
412
+ top: 72px !important;
413
+ bottom: 24px !important;
414
+ right: 2px !important;
415
+ height: calc(100vh - 96px) !important;
416
+ max-height: calc(100vh - 96px) !important;
417
+ margin: 0 !important;
418
+ padding: 2px 0 !important;
419
+ width: 22px !important;
420
+ min-width: 0 !important;
421
+ max-width: 24px !important;
422
  background: transparent !important;
423
  background-color: transparent !important;
424
  background-image: none !important;
 
426
  border: none !important;
427
  -webkit-backdrop-filter: none !important;
428
  backdrop-filter: none !important;
 
 
 
 
 
 
 
429
  pointer-events: auto !important;
430
+ touch-action: none !important;
431
+ user-select: none !important;
432
+ -webkit-user-select: none !important;
433
+ z-index: 1000 !important;
434
+ display: flex !important;
435
+ flex-direction: column !important;
436
+ justify-content: space-between !important;
437
+ align-items: center !important;
438
  }
439
 
440
  .alphaPicker .alphaPickerInner,
 
451
  backdrop-filter: none !important;
452
  padding: 0 !important;
453
  margin: 0 !important;
454
+ width: 100% !important;
455
+ height: 100% !important;
456
+ max-height: 100% !important;
457
  border-radius: 0 !important;
458
  display: flex !important;
459
  flex-direction: column !important;
460
  align-items: center !important;
461
+ justify-content: space-between !important;
462
  }
463
 
464
  .alphaPickerButton,
 
469
  div[class*="alphaPickerButton"] {
470
  background: transparent !important;
471
  background-color: transparent !important;
472
+ color: rgba(255, 255, 255, 0.6) !important;
473
  font-size: 8.5px !important;
474
  font-weight: 700 !important;
475
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, monospace, sans-serif !important;
476
  line-height: 1 !important;
477
+ padding: 0 !important;
478
  margin: 0 !important;
479
+ width: 20px !important;
480
+ min-width: 0 !important;
481
+ flex: 1 1 0% !important;
482
+ display: flex !important;
483
+ align-items: center !important;
484
+ justify-content: center !important;
485
  border: none !important;
486
  border-radius: 2px !important;
487
  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.95), 0 0 3px rgba(0, 0, 0, 0.9) !important;
488
+ transition: color 0.1s ease, transform 0.1s ease, background-color 0.1s ease !important;
489
+ touch-action: none !important;
490
+ cursor: pointer !important;
491
  }
492
 
493
  .alphaPickerButton:hover,
494
  .alphaPickerButton:focus,
495
+ .alphaPickerButton:active,
496
+ .alphaPickerButton.active-scrub,
497
  .alphaPickerButton.selectedItem,
498
  .alphaPickerButton-selected,
499
  .alphaPicker-fixed-right .MuiButtonBase-root:hover,
500
  .alphaPicker-fixed-right .MuiButtonBase-root.Mui-selected {
501
  color: #ffffff !important;
502
  background: rgba(var(--abyss-accent, 0, 164, 220), 0.35) !important;
503
+ transform: scale(1.3) !important;
504
  font-weight: 900 !important;
505
+ text-shadow: 0 0 8px rgba(var(--abyss-accent, 0, 164, 220), 0.9) !important;
506
+ }
507
+
508
+ /* Floating Alphabet Scrub HUD Bubble */
509
+ #alpha-scrubber-hud {
510
+ position: fixed !important;
511
+ top: 50% !important;
512
+ right: 48px !important;
513
+ transform: translateY(-50%) scale(0.9) !important;
514
+ width: 64px !important;
515
+ height: 64px !important;
516
+ border-radius: 50% !important;
517
+ background: rgba(12, 14, 20, 0.92) !important;
518
+ border: 1.5px solid rgba(var(--abyss-accent, 0, 164, 220), 0.7) !important;
519
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.75), 0 0 20px rgba(var(--abyss-accent, 0, 164, 220), 0.4) !important;
520
+ backdrop-filter: blur(12px) !important;
521
+ -webkit-backdrop-filter: blur(12px) !important;
522
+ color: #ffffff !important;
523
+ font-size: 32px !important;
524
+ font-weight: 900 !important;
525
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif !important;
526
+ display: flex !important;
527
+ align-items: center !important;
528
+ justify-content: center !important;
529
+ z-index: 10001 !important;
530
+ pointer-events: none !important;
531
+ opacity: 0 !important;
532
+ visibility: hidden !important;
533
+ transition: opacity 0.15s ease, transform 0.15s ease, visibility 0.15s ease !important;
534
+ }
535
+
536
+ #alpha-scrubber-hud.visible {
537
+ opacity: 1 !important;
538
+ visibility: visible !important;
539
+ transform: translateY(-50%) scale(1) !important;
540
  }
541
 
542
  .MuiTouchRipple-root {
 
3467
  display: none !important;
3468
  }
3469
 
3470
+ /* Mobile Touch & Tap Lag Elimination (0ms Click Response) */
3471
+ html,
3472
+ body,
3473
+ button,
3474
+ a,
3475
+ .card,
3476
+ .cardBox,
3477
+ .cardScalable,
3478
+ .emby-button,
3479
+ .paper-icon-button-light,
3480
+ .listItem,
3481
+ .navMenuOption,
3482
+ .headerButton,
3483
+ .emby-tab-button,
3484
+ .btn {
3485
+ touch-action: manipulation !important;
3486
+ -webkit-tap-highlight-color: transparent !important;
3487
+ }
3488
+
3489
  /* 13. Android & Mobile Perfection */
3490
  @media (max-width: 959px) {
3491
+ :root {
3492
+ --abyss-glass-blur: 4px !important;
3493
+ --abyss-backdrop-blur: 6px !important;
3494
+ }
3495
+
3496
+ .cardImageContainer .cardImage {
3497
+ background-size: cover !important;
3498
+ background-position: center top !important;
3499
+ image-rendering: -webkit-optimize-contrast !important;
3500
+ }
3501
+
3502
+ .card:active .cardScalable,
3503
+ .cardBox:active,
3504
+ .listItem:active,
3505
+ .emby-button:active {
3506
+ transform: scale(0.97) !important;
3507
+ transition: transform 0.08s ease !important;
3508
+ }
3509
+
3510
  .MuiDrawer-modal .MuiDrawer-paper,
3511
  .mainDrawer {
3512
  position: fixed !important;
 
3516
  width: 280px !important;
3517
  max-width: 80vw !important;
3518
  background: rgba(17, 17, 21, 0.98) !important;
3519
+ backdrop-filter: blur(12px) !important;
3520
+ -webkit-backdrop-filter: blur(12px) !important;
3521
  border: none !important;
3522
  border-right: 1px solid rgba(255, 255, 255, 0.1) !important;
3523
  box-shadow: 0 8px 32px rgba(0, 0, 0, 0.7) !important;
apex/ui/spotlight-loader.js CHANGED
@@ -90,7 +90,7 @@
90
  "@media (min-width:1920px) { ." + FRAME_CLASS + " { height:68vh;max-height:860px; } }" +
91
  "@media (max-width:1024px) and (orientation:portrait) { ." + FRAME_CLASS + " { height:54vh;min-height:360px;max-height:500px; } }" +
92
  "@media (max-width:1024px) and (orientation:landscape) and (hover:none) and (pointer:coarse) { ." + FRAME_CLASS + " { height:100vh;min-height:280px;max-height:420px; } }" +
93
- "@media (max-width:600px) and (orientation:portrait) { ." + FRAME_CLASS + " { height:52vh;min-height:340px;max-height:460px; } }" +
94
  "@media (max-width:900px) and (orientation:landscape) and (max-height:500px) { ." + FRAME_CLASS + " { height:100vh;min-height:200px; } }";
95
  document.head.appendChild(style);
96
  }
@@ -386,6 +386,105 @@
386
  return installed;
387
  }
388
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
389
  function boot() {
390
  function ensureDarkTheme() {
391
  try {
@@ -487,6 +586,7 @@
487
  var run = function () {
488
  installScheduled = false;
489
  installSpotlight();
 
490
  replaceServerNameText();
491
  };
492
 
@@ -525,6 +625,7 @@
525
  setInterval(function () {
526
  syncSettingsTheme();
527
  scheduleInstall();
 
528
  replaceServerNameText();
529
  if (currentSync) safe(currentSync);
530
  }, 2000);
 
90
  "@media (min-width:1920px) { ." + FRAME_CLASS + " { height:68vh;max-height:860px; } }" +
91
  "@media (max-width:1024px) and (orientation:portrait) { ." + FRAME_CLASS + " { height:54vh;min-height:360px;max-height:500px; } }" +
92
  "@media (max-width:1024px) and (orientation:landscape) and (hover:none) and (pointer:coarse) { ." + FRAME_CLASS + " { height:100vh;min-height:280px;max-height:420px; } }" +
93
+ "@media (max-width:768px) and (orientation:portrait) { ." + FRAME_CLASS + " { height:48vh;min-height:380px;max-height:450px; } }" +
94
  "@media (max-width:900px) and (orientation:landscape) and (max-height:500px) { ." + FRAME_CLASS + " { height:100vh;min-height:200px; } }";
95
  document.head.appendChild(style);
96
  }
 
386
  return installed;
387
  }
388
 
389
+ var scrubberHud = null;
390
+ var scrubberActive = false;
391
+ var lastScrubbedLetter = "";
392
+
393
+ function ensureScrubberHud() {
394
+ if (scrubberHud && scrubberHud.isConnected) return scrubberHud;
395
+ scrubberHud = document.getElementById("alpha-scrubber-hud");
396
+ if (!scrubberHud) {
397
+ scrubberHud = document.createElement("div");
398
+ scrubberHud.id = "alpha-scrubber-hud";
399
+ document.body.appendChild(scrubberHud);
400
+ }
401
+ return scrubberHud;
402
+ }
403
+
404
+ function showScrubberHud(letter) {
405
+ var hud = ensureScrubberHud();
406
+ if (!hud) return;
407
+ hud.textContent = letter;
408
+ hud.classList.add("visible");
409
+ }
410
+
411
+ function hideScrubberHud() {
412
+ if (scrubberHud) {
413
+ scrubberHud.classList.remove("visible");
414
+ }
415
+ var activeButtons = document.querySelectorAll(".alphaPickerButton.active-scrub");
416
+ for (var i = 0; i < activeButtons.length; i++) {
417
+ activeButtons[i].classList.remove("active-scrub");
418
+ }
419
+ lastScrubbedLetter = "";
420
+ }
421
+
422
+ function installAlphaPickerScrubber() {
423
+ safe(function () {
424
+ var pickers = document.querySelectorAll(
425
+ ".alphaPicker, .alphaPicker-fixed, .alphaPicker-fixed-right, .alphanumeric-scrollbar, div[class*='alphaPicker']"
426
+ );
427
+ for (var p = 0; p < pickers.length; p++) {
428
+ var picker = pickers[p];
429
+ if (picker._scrubberInstalled) continue;
430
+ picker._scrubberInstalled = true;
431
+
432
+ var handleTouch = function (e) {
433
+ if (!e.touches || !e.touches.length) return;
434
+ var touch = e.touches[0];
435
+ var rect = picker.getBoundingClientRect();
436
+ var buttons = picker.querySelectorAll("button, .alphaPickerButton, .MuiButtonBase-root");
437
+ if (!buttons.length) return;
438
+
439
+ var relY = (touch.clientY - rect.top) / rect.height;
440
+ var index = Math.floor(relY * buttons.length);
441
+ if (index < 0) index = 0;
442
+ if (index >= buttons.length) index = buttons.length - 1;
443
+
444
+ var targetBtn = buttons[index];
445
+ if (!targetBtn) return;
446
+
447
+ var letter = (targetBtn.textContent || "").trim();
448
+ if (letter && letter !== lastScrubbedLetter) {
449
+ lastScrubbedLetter = letter;
450
+ showScrubberHud(letter);
451
+
452
+ var activeButtons = picker.querySelectorAll(".active-scrub");
453
+ for (var a = 0; a < activeButtons.length; a++) {
454
+ activeButtons[a].classList.remove("active-scrub");
455
+ }
456
+ targetBtn.classList.add("active-scrub");
457
+
458
+ targetBtn.click();
459
+
460
+ if (navigator.vibrate) {
461
+ try { navigator.vibrate(5); } catch (ve) {}
462
+ }
463
+ }
464
+ };
465
+
466
+ picker.addEventListener("touchstart", function (e) {
467
+ scrubberActive = true;
468
+ handleTouch(e);
469
+ }, { passive: true });
470
+
471
+ picker.addEventListener("touchmove", function (e) {
472
+ if (!scrubberActive) return;
473
+ if (e.cancelable) e.preventDefault();
474
+ handleTouch(e);
475
+ }, { passive: false });
476
+
477
+ var endHandler = function () {
478
+ scrubberActive = false;
479
+ hideScrubberHud();
480
+ };
481
+
482
+ picker.addEventListener("touchend", endHandler, { passive: true });
483
+ picker.addEventListener("touchcancel", endHandler, { passive: true });
484
+ }
485
+ });
486
+ }
487
+
488
  function boot() {
489
  function ensureDarkTheme() {
490
  try {
 
586
  var run = function () {
587
  installScheduled = false;
588
  installSpotlight();
589
+ installAlphaPickerScrubber();
590
  replaceServerNameText();
591
  };
592
 
 
625
  setInterval(function () {
626
  syncSettingsTheme();
627
  scheduleInstall();
628
+ installAlphaPickerScrubber();
629
  replaceServerNameText();
630
  if (currentSync) safe(currentSync);
631
  }, 2000);
apex/ui/spotlight.css CHANGED
@@ -725,43 +725,47 @@ body {
725
  }
726
 
727
  @media (max-width: 768px) and (orientation: portrait) {
728
- /* Mobile Full-Widescreen Backdrop: Remove the heavy left/right black side cutoffs */
729
  #backdrop {
730
- -webkit-mask-image:
731
- linear-gradient(to bottom, black 55%, transparent 100%),
732
- linear-gradient(to bottom, transparent 0%, black 5%);
733
- mask-image:
734
- linear-gradient(to bottom, black 55%, transparent 100%),
735
- linear-gradient(to bottom, transparent 0%, black 5%);
 
 
736
  -webkit-mask-composite: source-over;
737
  mask-composite: add;
 
738
  }
739
 
740
  #backdrop img {
741
  width: 100%;
742
  height: 100%;
743
  object-fit: cover;
744
- object-position: center 20%;
745
  transform: none !important;
 
746
  image-rendering: -webkit-optimize-contrast;
747
  }
748
 
749
  #content {
750
- padding: 10vh 4.5vw 3vh;
751
  justify-content: flex-end;
752
  }
753
 
754
  #logo {
755
- max-width: 70vw;
756
- max-height: 70px;
757
  object-position: left bottom;
758
- margin-bottom: 10px;
759
  }
760
 
761
  #title {
762
- font-size: clamp(1.4rem, 5.5vw, 2.2rem);
763
- margin-bottom: 8px;
764
- line-height: 1.1;
765
  }
766
 
767
  #meta {
@@ -776,13 +780,13 @@ body {
776
  }
777
 
778
  #episode-label {
779
- font-size: medium;
780
- font-weight: bold;
781
- margin-bottom: 8px;
782
  }
783
 
784
  #plot {
785
- font-size: 0.85rem;
786
  line-height: 1.35;
787
  max-width: 92vw;
788
  margin-bottom: 12px;
@@ -792,19 +796,61 @@ body {
792
  overflow: hidden;
793
  }
794
 
 
795
  #buttons {
796
- gap: 8px;
797
- margin-bottom: 4px;
 
 
 
 
 
798
  }
799
 
800
  .btn {
801
- padding: 8px 16px;
802
- font-size: 0.88rem;
803
- height: 38px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
804
  }
805
 
 
806
  #carousel-dots {
807
- bottom: 2px;
 
 
 
808
  }
809
 
810
  #update-toast {
 
725
  }
726
 
727
  @media (max-width: 768px) and (orientation: portrait) {
728
+ /* Mobile Full-Widescreen Backdrop: 16:9 ratio displays 100% of the image edge-to-edge without side cropping */
729
  #backdrop {
730
+ position: absolute;
731
+ top: 0;
732
+ left: 0;
733
+ width: 100%;
734
+ height: 56.25vw;
735
+ max-height: 260px;
736
+ -webkit-mask-image: linear-gradient(to bottom, black 75%, transparent 100%);
737
+ mask-image: linear-gradient(to bottom, black 75%, transparent 100%);
738
  -webkit-mask-composite: source-over;
739
  mask-composite: add;
740
+ overflow: hidden;
741
  }
742
 
743
  #backdrop img {
744
  width: 100%;
745
  height: 100%;
746
  object-fit: cover;
747
+ object-position: center top;
748
  transform: none !important;
749
+ animation: none !important;
750
  image-rendering: -webkit-optimize-contrast;
751
  }
752
 
753
  #content {
754
+ padding: 0 4.5vw 42px !important;
755
  justify-content: flex-end;
756
  }
757
 
758
  #logo {
759
+ max-width: 65vw;
760
+ max-height: 60px;
761
  object-position: left bottom;
762
+ margin-bottom: 8px;
763
  }
764
 
765
  #title {
766
+ font-size: clamp(1.3rem, 5vw, 1.9rem);
767
+ margin-bottom: 6px;
768
+ line-height: 1.15;
769
  }
770
 
771
  #meta {
 
780
  }
781
 
782
  #episode-label {
783
+ font-size: 0.95rem;
784
+ font-weight: 700;
785
+ margin-bottom: 6px;
786
  }
787
 
788
  #plot {
789
+ font-size: 0.82rem;
790
  line-height: 1.35;
791
  max-width: 92vw;
792
  margin-bottom: 12px;
 
796
  overflow: hidden;
797
  }
798
 
799
+ /* Action buttons: single flex row, Play truncates gracefully, Trailer fits, Info is square */
800
  #buttons {
801
+ display: flex !important;
802
+ flex-direction: row !important;
803
+ align-items: center !important;
804
+ gap: 8px !important;
805
+ width: 100% !important;
806
+ max-width: 100% !important;
807
+ margin-bottom: 14px !important;
808
  }
809
 
810
  .btn {
811
+ height: 38px !important;
812
+ font-size: 0.85rem !important;
813
+ }
814
+
815
+ .btn-play {
816
+ flex: 1 1 auto !important;
817
+ min-width: 0 !important;
818
+ max-width: none !important;
819
+ padding: 8px 12px !important;
820
+ margin-right: 0 !important;
821
+ white-space: nowrap !important;
822
+ overflow: hidden !important;
823
+ text-overflow: ellipsis !important;
824
+ justify-content: center !important;
825
+ }
826
+
827
+ .btn-trailer {
828
+ flex: 0 0 auto !important;
829
+ padding: 8px 12px !important;
830
+ margin-right: 0 !important;
831
+ white-space: nowrap !important;
832
+ }
833
+
834
+ .btn-info {
835
+ flex: 0 0 38px !important;
836
+ width: 38px !important;
837
+ min-width: 38px !important;
838
+ max-width: 38px !important;
839
+ height: 38px !important;
840
+ padding: 0 !important;
841
+ margin-right: 0 !important;
842
+ display: inline-flex !important;
843
+ align-items: center !important;
844
+ justify-content: center !important;
845
+ box-sizing: border-box !important;
846
  }
847
 
848
+ /* Dots positioned safely at bottom with clean separation */
849
  #carousel-dots {
850
+ bottom: 8px !important;
851
+ padding: 4px 10px !important;
852
+ gap: 6px !important;
853
+ z-index: 10 !important;
854
  }
855
 
856
  #update-toast {