@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap'); * { margin: 0; padding: 0; box-sizing: border-box; } :root { --bg: #0a0e1a; --surface: #131829; --border: rgba(255,255,255,0.06); --text: #e2e8f0; --text-dim: #64748b; --blue: #3b82f6; --cyan: #06b6d4; --green: #22c55e; --red: #ef4444; --orange: #f59e0b; } body { font-family: 'Inter', -apple-system, sans-serif; background: var(--bg); color: var(--text); min-height: 100dvh; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 1.5rem; overflow: hidden; } .container { width: 100%; max-width: 380px; display: flex; flex-direction: column; align-items: center; gap: 2rem; } h1 { font-size: 1.1rem; font-weight: 600; letter-spacing: 0.05em; text-transform: uppercase; color: var(--text-dim); } /* ── Progress Ring ── */ .ring-wrapper { position: relative; width: 260px; height: 260px; } .ring-svg { width: 100%; height: 100%; transform: rotate(-90deg); } .ring-bg { fill: none; stroke: var(--border); stroke-width: 8; } .ring-fg { fill: none; stroke: url(#grad); stroke-width: 8; stroke-linecap: round; transition: stroke-dashoffset 0.4s ease; } .ring-center { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 0.3rem; } .countdown { font-size: 3.2rem; font-weight: 700; font-variant-numeric: tabular-nums; line-height: 1; background: linear-gradient(135deg, var(--blue), var(--cyan)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } .countdown.idle { font-size: 1.6rem; background: none; -webkit-text-fill-color: var(--text-dim); } .countdown-label { font-size: 0.75rem; font-weight: 500; text-transform: uppercase; letter-spacing: 0.1em; color: var(--text-dim); } /* ── Status Badge ── */ .badge { display: inline-flex; align-items: center; gap: 0.5rem; padding: 0.6rem 1.4rem; border-radius: 100px; font-size: 0.85rem; font-weight: 600; letter-spacing: 0.02em; border: 1px solid var(--border); background: var(--surface); } .badge .dot { width: 10px; height: 10px; border-radius: 50%; flex-shrink: 0; } .badge.running .dot { background: var(--cyan); box-shadow: 0 0 8px var(--cyan); animation: pulse-dot 1.5s ease-in-out infinite; } .badge.open .dot { background: var(--green); box-shadow: 0 0 8px var(--green); } .badge.closed .dot { background: var(--red); box-shadow: 0 0 6px var(--red); } .badge.counting .dot { background: var(--orange); box-shadow: 0 0 8px var(--orange); animation: pulse-dot 0.8s ease-in-out infinite; } @keyframes pulse-dot { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } } /* ── Info row ── */ .info { display: flex; gap: 1.5rem; } .info-item { text-align: center; } .info-value { font-size: 1.3rem; font-weight: 600; font-variant-numeric: tabular-nums; } .info-label { font-size: 0.7rem; color: var(--text-dim); text-transform: uppercase; letter-spacing: 0.08em; margin-top: 0.15rem; } /* ── Glow effect behind ring ── */ .glow { position: absolute; inset: 20px; border-radius: 50%; background: radial-gradient(circle, rgba(6,182,212,0.12) 0%, transparent 70%); opacity: 0; transition: opacity 0.6s ease; pointer-events: none; } .glow.active { opacity: 1; } /* ── Controls ── */ .controls { display: flex; gap: 0.6rem; width: 100%; justify-content: center; flex-wrap: wrap; } .run-container { display: flex; width: 100%; gap: 0.6rem; } #btn-run { flex-grow: 1; font-size: 1.4rem; padding: 1.2rem; } .btn { display: inline-flex; align-items: center; justify-content: center; gap: 0.4rem; padding: 0.65rem 1.2rem; border-radius: 12px; border: 1px solid var(--border); background: var(--surface); color: var(--text); font-family: inherit; font-size: 0.82rem; font-weight: 600; cursor: pointer; transition: all 0.15s ease; user-select: none; -webkit-tap-highlight-color: transparent; } .btn:hover { background: rgba(59,130,246,0.12); border-color: var(--blue); } .btn:active { transform: scale(0.96); } .btn.primary { background: linear-gradient(135deg, var(--blue), var(--cyan)); border-color: transparent; color: #fff; } .btn.primary:hover { filter: brightness(1.15); background: linear-gradient(135deg, var(--blue), var(--cyan)); } .btn.danger { border-color: rgba(239,68,68,0.3); } .btn.danger:hover { background: rgba(239,68,68,0.15); border-color: var(--red); } .btn.success { border-color: rgba(34,197,94,0.3); } .btn.success:hover { background: rgba(34,197,94,0.15); border-color: var(--green); } .btn:disabled { opacity: 0.45; pointer-events: none; } .dur-input-group { display: flex; align-items: center; gap: 0.4rem; background: var(--surface); border: 1px solid var(--border); border-radius: 12px; padding: 0 0.8rem; transition: border-color 0.15s ease; } .dur-input-group:focus-within { border-color: var(--blue); } .dur-input { width: 64px; background: transparent; border: none; color: var(--text); font-family: inherit; font-size: 1.2rem; font-weight: 600; font-variant-numeric: tabular-nums; padding: 0.8rem 0; outline: none; text-align: right; } .dur-input::-webkit-inner-spin-button { opacity: 0.3; } .dur-unit { font-size: 0.85rem; color: var(--text-dim); font-weight: 500; }