701 lines
17 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

:root {
--bg: #0b0f14;
--card: #0f1520;
--text: #e6eef8;
--subtle: #9fb3c8;
--accent: #79c0ff;
--success: #3dd598;
--danger: #ff6b6b;
--header-h: 56px;
}
* { box-sizing: border-box; }
html, body, #root {
height: 100%;
margin: 0;
background: radial-gradient(1200px 800px at 20% -10%, #12202f 0%, #0b0f14 40%),
radial-gradient(900px 600px at 80% 110%, #1a2740 0%, #0b0f14 40%);
color: var(--text);
font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial, "Apple Color Emoji", "Segoe UI Emoji";
}
.app {
min-height: 100%;
display: grid;
place-items: center;
padding: 24px;
}
.appbar {
display:flex; align-items:center; justify-content:space-between;
margin-bottom: 12px;
}
/* Button container */
.burger{
grid-area: burger;
display:grid; /* centers SVG */
place-items:center;
width:40px; height:40px; /* good touch target */
padding:0; line-height:0; /* no baseline artifacts */
border-radius:12px;
color:var(--text);
background:rgba(255,255,255,.08);
border:1px solid rgba(255,255,255,.15);
cursor:pointer;
}
/* SVG itself */
.burger-icon{
display:block;
shape-rendering:geometricPrecision;
}
/* polish */
.burger:hover{ background:rgba(255,255,255,.12); }
.burger:focus-visible{ outline:2px solid var(--accent); outline-offset:2px; }
.brand { color: var(--text); text-decoration:none; font-weight:800; grid-area: title; justify-self: start; }
.drawer {
position:absolute; left:16px; top:56px; display:flex; flex-direction:column;
gap:8px; padding:12px; border-radius:12px; background:rgba(15,21,32,0.98);
border:1px solid rgba(255,255,255,0.12); box-shadow:0 20px 40px rgba(0,0,0,0.35);
transform: translateY(-12px) scale(0.98); opacity:0; pointer-events:none; transition:0.16s ease;
}
.drawer.open { transform:none; opacity:1; pointer-events:auto; }
.navlink { color:var(--text); text-decoration:none; font-weight:700; }
.navlink.active { color:var(--accent); }
.card {
background: linear-gradient(180deg, rgba(255,255,255,0.04), rgba(255,255,255,0.02));
border: 1px solid rgba(255,255,255,0.08);
border-radius: 16px;
padding: 28px 32px;
box-shadow: 0 10px 30px rgba(0,0,0,0.25);
max-width: 720px;
width: 100%;
text-align: center;
container-type: inline-size;
position: relative;
isolation: isolate;
}
.h1 {
margin: 0 0 8px 0;
font-size: clamp(20px, 2.4vw, 28px);
font-weight: 600;
color: var(--text);
}
.subtle {
margin: 0 0 24px 0;
color: var(--subtle);
font-size: 14px;
}
.clock {
font-variant-numeric: tabular-nums;
letter-spacing: 1px; /* slightly lighter spacing for smaller size */
font-weight: 700;
font-size: clamp(20px, 5vw, 36px); /* smaller now */
line-height: 1.1;
}
.date {
margin-top: 12px;
color: var(--accent);
font-weight: 600;
font-size: clamp(14px, 2.5vw, 18px);
}
.footer {
margin-top: 20px;
color: var(--subtle);
font-size: 12px;
}
kbd {
padding: 2px 6px;
border-radius: 6px;
background: rgba(255,255,255,0.08);
border: 1px solid rgba(255,255,255,0.15);
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
}
.timer {
margin-top: 8px;
font-variant-numeric: tabular-nums;
letter-spacing: 2px;
font-weight: 700;
font-size: clamp(40px, 10vw, 90px);
line-height: 1.05;
white-space: nowrap;
}
.timer-block {
display: grid;
gap: 16px;
justify-items: center;
text-align: center;
width: 100%;
}
.timer-meta {
display: grid;
gap: 4px;
}
.timer-status {
margin-top: 23px;
color: var(--subtle);
font-size: 12px;
}
.timer-sep {
white-space: nowrap;
}
.timer-season {
color: var(--subtle);
font-weight: 600;
font-size: clamp(12px, 2vw, 14px);
}
.timer-episode {
color: var(--text);
font-weight: 700;
font-size: clamp(14px, 3vw, 18px);
}
.timer-toprow {
display: flex;
gap: 12px;
align-items: center;
justify-content: center;
flex-wrap: wrap;
}
/* ====== Site chrome (outside card) ====== */
.site {
min-height: 100dvh;
position: relative;
/* push-mode: the content will slide right when sidebar is open */
}
.site-header{
position: fixed;
z-index: 50;
top: 0; left: 16px; right: 16px;
height: var(--header-h);
display: flex;
align-items: center;
gap: 12px;
justify-content: flex-start;
}
.brand {
font-weight: 900;
color: var(--text);
text-decoration: none;
letter-spacing: 0.2px;
text-shadow: 0 1px 10px rgba(0,0,0,0.25);
}
.auth-chip {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 8px 10px;
border-radius: 12px;
background: rgba(255,255,255,0.06);
border: 1px solid rgba(255,255,255,0.08);
color: var(--text);
font-size: 13px;
}
.auth-chip.signed-in {
background: rgba(255,255,255,0.08);
border-color: rgba(255,255,255,0.12);
}
.auth-chip.muted { color: var(--subtle); }
.auth-avatar {
width: 32px; height: 32px; border-radius: 50%; object-fit: cover;
border: 1px solid rgba(255,255,255,0.18);
}
.auth-meta { display: grid; gap: 2px; }
.auth-name { font-weight: 700; font-size: 13px; }
.auth-subtle { color: var(--subtle); font-size: 11px; }
.auth-error { color: var(--danger); font-size: 11px; }
.auth-btn {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 8px 12px;
border-radius: 12px;
border: 1px solid rgba(255,255,255,0.12);
background: rgba(255,255,255,0.08);
color: var(--text);
cursor: pointer;
}
.auth-btn:hover { background: rgba(255,255,255,0.12); }
.auth-icon {
width: 20px; height: 20px;
display: grid; place-items: center;
background: white;
color: #4285f4;
border-radius: 6px;
font-weight: 800;
font-size: 12px;
}
.auth-signout {
margin-left: 10px;
padding: 6px 10px;
border-radius: 10px;
border: 1px solid rgba(255,255,255,0.12);
background: rgba(255,255,255,0.06);
color: var(--text);
cursor: pointer;
}
.auth-signout:hover { background: rgba(255,255,255,0.1); }
/* Sidebar (full height, left) */
.sidebar {
position: fixed;
z-index: 40;
top: 0; left: 0; bottom: 0;
width: clamp(240px, 28vw, 320px);
backdrop-filter: blur(4px);
background: rgba(15,21,32,0.96);
border-right: 1px solid rgba(255,255,255,0.12);
transform: translateX(-100%);
transition: transform 180ms ease;
display: flex;
flex-direction: column;
gap: 14px;
padding: 70px 16px 16px; /* leave space under header */
}
.sidebar.open { transform: translateX(0); }
.sidebar-nav {
display: grid;
gap: 10px;
}
.navlink {
color: var(--text);
text-decoration: none;
font-weight: 800;
padding: 10px 12px;
border-radius: 10px;
background: rgba(255,255,255,0.04);
border: 1px solid rgba(255,255,255,0.10);
}
.navlink.active { color: var(--accent); border-color: rgba(121,192,255,0.6); }
.sidebar-auth {
margin-top: auto;
padding-top: 12px;
border-top: 1px solid rgba(255,255,255,0.12);
display: grid;
gap: 8px;
}
.sidebar-auth-title {
font-size: 13px;
font-weight: 800;
color: var(--text);
}
.sidebar-auth-note {
font-size: 12px;
color: var(--subtle);
}
.sidebar-auth .auth-btn {
width: 100%;
justify-content: center;
}
.sidebar-auth .auth-chip {
width: 100%;
justify-content: flex-start;
gap: 10px;
}
/* Backdrop (for overlap mode, also clickable to close) */
.backdrop {
position: fixed;
inset: 0;
z-index: 30;
background: rgba(0,0,0,0.0);
opacity: 0;
pointer-events: none;
transition: opacity 180ms ease;
border: 0;
}
.backdrop.open {
background: rgba(0,0,0,0.35);
opacity: 1;
pointer-events: auto;
}
/* Main content wrapper; centers the card like before */
.site-content {
min-height: calc(100dvh - var(--header-h));
display: grid;
place-items: center;
padding: calc(var(--header-h) + 12px) 24px 32px;
}
/* ====== Card stays as you had ====== */
/* .card { ... } remains unchanged—already centered and relative */
.pill {
padding: 4px 10px;
border-radius: 999px;
font-weight: 700;
font-size: 12px;
border: 1px solid rgba(255,255,255,0.15);
}
.pill.running { background: rgba(0,255,128,0.12); }
.pill.waiting { background: rgba(255,255,0,0.10); }
.pill.ended { background: rgba(255,0,0,0.10); }
.timer-now {
display: inline-flex;
gap: 8px;
align-items: baseline;
}
.timer-now .muted { color: var(--subtle); font-size: 12px; }
.timer-now .now-digits {
font-variant-numeric: tabular-nums;
font-weight: 700;
font-size: clamp(14px, 2.5vw, 18px);
}
.timer-hero {
width: 100%;
display: flex;
align-items: baseline;
justify-content: center;
gap: 0.15em;
white-space: nowrap;
overflow: hidden;
font-variant-numeric: tabular-nums;
letter-spacing: 0.5px;
font-weight: 800;
font-size: clamp(24px, 13cqw, 88px);
line-height: 1.05;
}
.timer-hero .hero-sep { white-space: nowrap; }
.hero-sep { white-space: nowrap; font-size: 0.8em; }
.hero-number.elapsed { font-size: 1em; }
.hero-number.total { font-size: 0.66em; opacity: 0.9; }
.timer-hero.has-hours {
letter-spacing: 0.25px;
font-size: clamp(22px, 10.5cqw, 80px);
}
.timer-hero.has-hours .hero-number.total { font-size: 0.6em; }
.timer-hero.has-hours .hero-sep { font-size: 0.72em; }
/* Progress bar */
.progress {
position: relative;
width: min(100%, 640px);
height: 8px;
margin-inline: auto;
background: rgba(255,255,255,0.08);
border: 1px solid rgba(255,255,255,0.10);
border-radius: 999px;
overflow: hidden;
}
.progress-fill {
height: 100%;
width: 0%;
background: var(--accent);
transition: width 200ms linear;
}
.progress-fill.waiting { width: 0%; }
.progress-fill.ended { width: 100%; }
.timer-status {
color: var(--subtle);
font-size: 12px;
margin-top: -4px;
}
.countdown-overlay {
position: absolute;
inset: 0;
z-index: 999;
display: grid;
place-items: center;
background: rgba(0, 0, 0, 0.35);
backdrop-filter: blur(2px);
pointer-events: none;
}
.countdown-wrap {
text-align: center;
color: var(--text);
text-shadow: 0 6px 24px rgba(0,0,0,0.45);
animation: pop 180ms ease-out;
}
.countdown-number {
font-variant-numeric: tabular-nums;
font-weight: 900;
letter-spacing: 2px;
line-height: 0.95;
text-shadow: 0 8px 28px rgba(0,0,0,0.55);
font-size: clamp(48px, 26cqw, 220px);
}
.countdown-label {
margin-bottom: 8px;
font-size: clamp(12px, 2.2cqw, 22px);
font-weight: 700;
color: var(--subtle);
}
.card:has(.countdown-overlay) .timer-meta,
.card:has(.countdown-overlay) .timer-toprow,
.card:has(.countdown-overlay) .timer-hero,
.card:has(.countdown-overlay) .progress,
.card:has(.countdown-overlay) .timer-status {
filter: blur(1px) brightness(0.85);
}
.shows-page { display:grid; gap:12px; }
.shows-grid {
display:grid; gap:10px; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
margin: 6px 0 8px;
}
.show-card {
text-align:left; padding:12px; border-radius:12px; cursor:pointer;
background: rgba(255,255,255,0.05);
border: 1px solid rgba(255,255,255,0.12);
color: var(--text);
}
.show-card .title { font-weight:800; }
.show-card.selected { outline: 2px solid var(--accent); background: rgba(121,192,255,0.10); }
.form-row { display:flex; gap:8px; flex-wrap:wrap; align-items:center; justify-content:center; }
.input {
min-width: 220px; padding:10px 12px; border-radius:10px;
background: rgba(255,255,255,0.06); border:1px solid rgba(255,255,255,0.15);
color: var(--text);
}
.primary {
padding:10px 14px; border-radius:10px; font-weight:800; cursor:pointer;
background: var(--accent); color:#0b0f14; border:none;
}
.primary:disabled { opacity:0.5; cursor:not-allowed; }
.scrape-card {
padding: 14px;
border-radius: 14px;
background: rgba(255,255,255,0.04);
border: 1px solid rgba(255,255,255,0.1);
text-align: left;
}
.scrape-row { display:flex; gap:10px; align-items:center; flex-wrap:wrap; }
.scrape-result { margin-top: 10px; padding: 12px; border-radius: 12px; background: rgba(255,255,255,0.03); border:1px solid rgba(255,255,255,0.07); }
.scrape-meta { display:flex; gap:8px; flex-wrap:wrap; margin-bottom:6px; }
.pill {
padding: 6px 10px;
border-radius: 10px;
background: rgba(255,255,255,0.08);
border: 1px solid rgba(255,255,255,0.12);
font-weight: 700;
font-size: 12px;
}
.scrape-title { font-weight: 800; font-size: 16px; }
.footer a { text-decoration: underline; }
.site-header { position: fixed; z-index: 60; top: 0; left: 16px; right: 16px; height: var(--header-h); display:flex; align-items:center; gap:12px; }
/* Centered badge that sizes to its content */
.timesync-banner{
position: fixed;
z-index: 70;
top: calc(env(safe-area-inset-top, 0px) + var(--header-h) + 6px);
left: 50%;
transform: translateX(-50%);
display: inline-flex;
align-items: center;
gap: 10px;
padding: 8px 12px;
width: max-content; /* shrink to content */
max-width: 92vw; /* keep inside viewport */
white-space: nowrap; /* single line (desktop) */
border-radius: 12px;
background: rgba(255,200,0,.12);
border: 1px solid rgba(255,200,0,.35);
color: #ffe9a6;
box-sizing: border-box;
}
/* message shouldnt force stretch */
.timesync-msg { flex: 0 1 auto; }
/* buttons stay tidy */
.timesync-actions{
margin-left: 8px;
display: inline-flex;
align-items: center;
gap: 8px;
}
.timesync-btn,
.timesync-close{
appearance: none;
border: 1px solid rgba(255,255,255,.18);
background: rgba(255,255,255,.08);
color: inherit;
font: inherit;
line-height: 1;
height: 30px;
padding: 6px 10px;
border-radius: 10px;
cursor: pointer;
}
.timesync-close{ width: 30px; padding: 0; }
@keyframes pop {
from { transform: scale(0.98); opacity: 0.0; }
to { transform: scale(1); opacity: 1.0; }
}
@media (prefers-reduced-motion: reduce) {
.progress-fill { transition: none; }
.countdown-wrap {animation: none;}
.timesync-banner {
flex-wrap: wrap;
gap: 8px 10px;
}
.timesync-actions {
width: 100%;
justify-content: flex-end;
}
}
@media (max-width: 720px){
.site-header{
grid-template-columns: auto 1fr;
grid-template-areas:
"burger title"
"banner banner";
row-gap: 8px;
height: calc(var(--header-h) + 40px);
}
}
@media (max-width: 640px){
.timesync-banner{
display: flex;
flex-wrap: wrap;
row-gap: 6px;
white-space: normal; /* allow wrap */
max-width: min(900px, 92vw);
}
.timesync-msg{ flex: 1 1 100%; } /* text on first row */
.timesync-actions{ margin-left: auto; }
.site-content{
padding-top: calc(var(--header-h) + 72px); /* push card down so it won't sit under the banner */
}
}
@container (max-width: 420px) {
.timer-hero { font-size: clamp(22px, 11cqw, 72px); letter-spacing: 0.25px; }
.hero-number.total, .hero-sep { font-size: 0.62em; }
}
@container (max-width: 360px) {
.timer-hero { font-size: clamp(20px, 10cqw, 64px); letter-spacing: 0; }
}
@supports not (container-type: inline-size) {
.timer-hero { font-size: clamp(28px, 8vw, 96px); }
}
/* Toasts */
.toast-viewport {
position: fixed;
bottom: 16px;
right: 16px;
display: grid;
gap: 8px;
z-index: 200;
max-width: 320px;
}
.toast {
display: grid;
grid-template-columns: 1fr auto;
gap: 8px;
padding: 12px 14px;
border-radius: 12px;
background: rgba(15, 21, 32, 0.94);
border: 1px solid rgba(255,255,255,0.12);
box-shadow: 0 12px 30px rgba(0,0,0,0.35);
}
.toast.toast-error { border-color: rgba(255, 99, 99, 0.4); }
.toast.toast-warn { border-color: rgba(255, 193, 99, 0.4); }
.toast.toast-info { border-color: rgba(121, 192, 255, 0.4); }
.toast-body { text-align: left; }
.toast-title { font-weight: 700; font-size: 13px; margin-bottom: 2px; }
.toast-message { font-size: 13px; color: var(--text); }
.toast-detail { font-size: 12px; color: var(--subtle); margin-top: 2px; }
.toast-close {
background: transparent;
color: var(--subtle);
border: none;
font-size: 16px;
cursor: pointer;
align-self: start;
}
.toast-close:hover { color: var(--text); }
/* Debug overlay */
.debug-overlay {
position: fixed;
bottom: 16px;
right: 16px;
z-index: 190;
color: var(--text);
}
.debug-toggle {
background: rgba(255,255,255,0.08);
color: var(--text);
border: 1px solid rgba(255,255,255,0.15);
border-radius: 10px;
padding: 8px 10px;
cursor: pointer;
font-weight: 700;
}
.debug-toggle:hover { background: rgba(255,255,255,0.12); }
.debug-panel {
margin-top: 10px;
width: min(420px, 90vw);
max-height: 50vh;
background: rgba(11, 15, 20, 0.96);
border: 1px solid rgba(255,255,255,0.12);
border-radius: 12px;
box-shadow: 0 16px 32px rgba(0,0,0,0.4);
display: flex;
flex-direction: column;
}
.debug-header {
padding: 10px 12px;
font-weight: 700;
border-bottom: 1px solid rgba(255,255,255,0.08);
}
.debug-body {
padding: 8px 12px;
overflow: auto;
display: grid;
gap: 6px;
}
.debug-row {
display: grid;
grid-template-columns: auto auto 1fr;
gap: 8px;
align-items: baseline;
font-size: 12px;
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
}
.debug-row .debug-label { font-weight: 700; }
.debug-row .debug-details { color: var(--subtle); font-weight: 400; }
.debug-row.level-error { color: #ffaaaa; }
.debug-row.level-warn { color: #ffd27f; }
.debug-row.level-info { color: #9bd4ff; }
.debug-row.level-debug { color: #b3c4ff; }
.debug-empty { color: var(--subtle); font-size: 12px; }
.link-btn {
background: none;
border: none;
color: var(--accent);
cursor: pointer;
font-weight: 700;
text-decoration: underline;
padding: 0 2px;
}
.link-btn.danger { color: var(--danger); }
.link-btn:hover { color: #bfe3ff; }