Modal revamp: the living layer — dashboard-grade motion, compositor-only
- entrance: soft rise + settle, one-shot spring - header light-sweep: the dashboard's signature strip (same keyframes, same transform-only technique) drifting across both modal headers - progress sheen: a light band scanning the FILL — it lives inside the fill's clip, so zero progress shows nothing and motion is gated by real progress - hero stats become glass chips with per-state color identity (found green, missing amber, downloaded accent) and a top light-edge each - download modal's close X matches the discovery one (circular ghost, rotates) - press feel on every pill button (active scale) - all of it honors prefers-reduced-motion; only transform/opacity animate
This commit is contained in:
parent
a5530c45be
commit
57c44064b1
1 changed files with 157 additions and 0 deletions
|
|
@ -66166,3 +66166,160 @@ body.em-scroll-lock { overflow: hidden; }
|
||||||
.youtube-discovery-modal .modal-btn-primary:hover {
|
.youtube-discovery-modal .modal-btn-primary:hover {
|
||||||
box-shadow: 0 6px 26px rgba(var(--accent-rgb), 0.5);
|
box-shadow: 0 6px 26px rgba(var(--accent-rgb), 0.5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ── Modal revamp: the living layer (dashboard-grade motion, all
|
||||||
|
compositor-only: transform/opacity only, one-shots or self-gating) ── */
|
||||||
|
|
||||||
|
/* Entrance — a soft rise + settle, once */
|
||||||
|
.download-missing-modal-content,
|
||||||
|
.youtube-discovery-modal {
|
||||||
|
animation: modal-revamp-enter 0.38s cubic-bezier(0.22, 1.2, 0.36, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes modal-revamp-enter {
|
||||||
|
0% { opacity: 0; transform: translateY(12px) scale(0.975); }
|
||||||
|
100% { opacity: 1; transform: translateY(0) scale(1); }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Header light-sweep — the dashboard signature, same keyframes, same
|
||||||
|
compositor-only strip technique. Headers clip it. */
|
||||||
|
.download-missing-modal-header::after,
|
||||||
|
.youtube-discovery-modal .modal-header::after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 60%;
|
||||||
|
background: linear-gradient(90deg,
|
||||||
|
transparent 0%,
|
||||||
|
rgba(var(--accent-rgb), 0.05) 40%,
|
||||||
|
rgba(var(--accent-rgb), 0.10) 50%,
|
||||||
|
rgba(var(--accent-rgb), 0.05) 60%,
|
||||||
|
transparent 100%);
|
||||||
|
transform: translateX(-40%);
|
||||||
|
opacity: 0;
|
||||||
|
animation: dashboard-header-sweep 12s ease-in-out infinite;
|
||||||
|
pointer-events: none;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.youtube-discovery-modal .modal-header {
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Progress sheen — a light band scanning the FILL. It lives inside the
|
||||||
|
fill (overflow hidden), so 0% progress shows nothing and a finished bar
|
||||||
|
keeps a gentle pulse of life: the motion is gated by real progress. */
|
||||||
|
.download-missing-modal-content .progress-fill,
|
||||||
|
.youtube-discovery-modal .progress-bar-fill {
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.download-missing-modal-content .progress-fill::before,
|
||||||
|
.youtube-discovery-modal .progress-bar-fill::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 45%;
|
||||||
|
background: linear-gradient(90deg,
|
||||||
|
transparent,
|
||||||
|
rgba(255, 255, 255, 0.22) 50%,
|
||||||
|
transparent);
|
||||||
|
transform: translateX(-110%);
|
||||||
|
animation: modal-progress-sheen 2.4s ease-in-out infinite;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes modal-progress-sheen {
|
||||||
|
0% { transform: translateX(-110%); }
|
||||||
|
60%, 100% { transform: translateX(330%); }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Hero stat chips — glass cards with per-state color identity */
|
||||||
|
.download-dashboard-stats {
|
||||||
|
gap: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dashboard-stat {
|
||||||
|
padding: 10px 18px;
|
||||||
|
border-radius: 14px;
|
||||||
|
background: rgba(255, 255, 255, 0.03);
|
||||||
|
border: 1px solid rgba(255, 255, 255, 0.06);
|
||||||
|
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.05);
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dashboard-stat::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 15%;
|
||||||
|
right: 15%;
|
||||||
|
height: 1.5px;
|
||||||
|
background: linear-gradient(90deg, transparent, var(--stat-edge, rgba(var(--accent-rgb), 0.7)), transparent);
|
||||||
|
}
|
||||||
|
|
||||||
|
.dashboard-stat-number {
|
||||||
|
font-variant-numeric: tabular-nums;
|
||||||
|
font-weight: 800;
|
||||||
|
letter-spacing: -0.02em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dashboard-stat-label {
|
||||||
|
font-size: 9.5px;
|
||||||
|
font-weight: 700;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.16em;
|
||||||
|
color: rgba(255, 255, 255, 0.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.dashboard-stat.stat-found { --stat-edge: rgba(74, 222, 128, 0.7); }
|
||||||
|
.dashboard-stat.stat-found .dashboard-stat-number { color: #4ade80; }
|
||||||
|
.dashboard-stat.stat-missing { --stat-edge: rgba(251, 191, 36, 0.7); }
|
||||||
|
.dashboard-stat.stat-missing .dashboard-stat-number { color: #fbbf24; }
|
||||||
|
.dashboard-stat.stat-downloaded { --stat-edge: rgba(var(--accent-rgb), 0.8); }
|
||||||
|
.dashboard-stat.stat-downloaded .dashboard-stat-number { color: rgb(var(--accent-light-rgb)); }
|
||||||
|
|
||||||
|
/* Download modal close ✕ matches the discovery one: circular ghost, rotates */
|
||||||
|
.download-missing-modal-close {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
border-radius: 50%;
|
||||||
|
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||||
|
background: rgba(255, 255, 255, 0.04);
|
||||||
|
color: rgba(255, 255, 255, 0.7);
|
||||||
|
cursor: pointer;
|
||||||
|
transition: background 0.2s, transform 0.2s, color 0.2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.download-missing-modal-close:hover {
|
||||||
|
background: rgba(239, 68, 68, 0.18);
|
||||||
|
color: #fff;
|
||||||
|
transform: rotate(90deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Press feel on every pill */
|
||||||
|
.download-control-btn:active,
|
||||||
|
.youtube-discovery-modal .modal-btn:active {
|
||||||
|
transform: translateY(0) scale(0.97);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Respect reduced motion + the global performance mode */
|
||||||
|
@media (prefers-reduced-motion: reduce) {
|
||||||
|
.download-missing-modal-content,
|
||||||
|
.youtube-discovery-modal,
|
||||||
|
.download-missing-modal-header::after,
|
||||||
|
.youtube-discovery-modal .modal-header::after,
|
||||||
|
.download-missing-modal-content .progress-fill::before,
|
||||||
|
.youtube-discovery-modal .progress-bar-fill::before {
|
||||||
|
animation: none !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue