Spaces:
Running
Running
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- apex/ui/abyss.css +113 -25
- apex/ui/spotlight-loader.js +102 -1
- 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,
|
| 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 |
-
|
| 427 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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:
|
| 445 |
-
|
| 446 |
-
max-
|
| 447 |
border-radius: 0 !important;
|
| 448 |
display: flex !important;
|
| 449 |
flex-direction: column !important;
|
| 450 |
align-items: center !important;
|
| 451 |
-
justify-content:
|
| 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.
|
| 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:
|
| 468 |
margin: 0 !important;
|
| 469 |
-
|
| 470 |
-
|
| 471 |
-
|
| 472 |
-
|
|
|
|
|
|
|
| 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.
|
|
|
|
|
|
|
| 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.
|
| 488 |
font-weight: 900 !important;
|
| 489 |
-
text-shadow: 0 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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(
|
| 3432 |
-
-webkit-backdrop-filter: blur(
|
| 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:
|
| 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:
|
| 729 |
#backdrop {
|
| 730 |
-
|
| 731 |
-
|
| 732 |
-
|
| 733 |
-
|
| 734 |
-
|
| 735 |
-
|
|
|
|
|
|
|
| 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
|
| 745 |
transform: none !important;
|
|
|
|
| 746 |
image-rendering: -webkit-optimize-contrast;
|
| 747 |
}
|
| 748 |
|
| 749 |
#content {
|
| 750 |
-
padding:
|
| 751 |
justify-content: flex-end;
|
| 752 |
}
|
| 753 |
|
| 754 |
#logo {
|
| 755 |
-
max-width:
|
| 756 |
-
max-height:
|
| 757 |
object-position: left bottom;
|
| 758 |
-
margin-bottom:
|
| 759 |
}
|
| 760 |
|
| 761 |
#title {
|
| 762 |
-
font-size: clamp(1.
|
| 763 |
-
margin-bottom:
|
| 764 |
-
line-height: 1.
|
| 765 |
}
|
| 766 |
|
| 767 |
#meta {
|
|
@@ -776,13 +780,13 @@ body {
|
|
| 776 |
}
|
| 777 |
|
| 778 |
#episode-label {
|
| 779 |
-
font-size:
|
| 780 |
-
font-weight:
|
| 781 |
-
margin-bottom:
|
| 782 |
}
|
| 783 |
|
| 784 |
#plot {
|
| 785 |
-
font-size: 0.
|
| 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 |
-
|
| 797 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 798 |
}
|
| 799 |
|
| 800 |
.btn {
|
| 801 |
-
|
| 802 |
-
font-size: 0.
|
| 803 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 804 |
}
|
| 805 |
|
|
|
|
| 806 |
#carousel-dots {
|
| 807 |
-
bottom:
|
|
|
|
|
|
|
|
|
|
| 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 {
|