/* plyr.fm design tokens */ :root { --accent: #6a9fff; --accent-hover: #8ab3ff; --accent-muted: #4a7ddd; --bg-primary: #0a0a0a; --bg-secondary: #141414; --bg-tertiary: #1a1a1a; --bg-hover: #1f1f1f; --border-subtle: #282828; --border-default: #333333; --border-emphasis: #444444; --text-primary: #e8e8e8; --text-secondary: #b0b0b0; --text-tertiary: #808080; --text-muted: #666666; --success: #4ade80; --warning: #fbbf24; --error: #ef4444; } * { box-sizing: border-box; } body { font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Fira Code', 'Consolas', monospace; background: var(--bg-primary); color: var(--text-primary); max-width: 900px; margin: 0 auto; padding: 24px; line-height: 1.6; -webkit-font-smoothing: antialiased; } h1 { color: var(--text-primary); font-size: 1.5rem; font-weight: 600; margin: 0 0 4px 0; } .subtitle { color: var(--text-tertiary); margin: 0 0 32px 0; font-size: 0.9rem; } /* auth form */ .auth-section { background: var(--bg-secondary); border: 1px solid var(--border-subtle); border-radius: 8px; padding: 20px; margin-bottom: 24px; } .auth-section input[type="password"] { font-family: inherit; background: var(--bg-tertiary); border: 1px solid var(--border-default); color: var(--text-primary); padding: 10px 14px; border-radius: 6px; width: 280px; font-size: 0.9rem; } .auth-section input:focus { outline: none; border-color: var(--accent); } /* buttons */ .btn { font-family: inherit; font-size: 0.85rem; font-weight: 500; padding: 10px 16px; border-radius: 6px; border: none; cursor: pointer; transition: all 0.15s ease; } .btn-primary { background: var(--accent); color: var(--bg-primary); } .btn-primary:hover { background: var(--accent-hover); } .btn-secondary { background: var(--bg-tertiary); color: var(--text-secondary); border: 1px solid var(--border-default); } .btn-secondary:hover { background: var(--bg-hover); border-color: var(--border-emphasis); } .btn-warning { background: var(--warning); color: var(--bg-primary); } .btn-warning:hover { background: #d97706; } .btn:disabled { background: var(--bg-tertiary); color: var(--text-muted); cursor: not-allowed; border: 1px solid var(--border-subtle); } /* header row */ .header-row { display: flex; align-items: center; justify-content: space-between; margin-bottom: 20px; } /* filter controls */ .filter-row { display: flex; align-items: center; gap: 8px; margin-bottom: 16px; padding-bottom: 16px; border-bottom: 1px solid var(--border-subtle); } .filter-label { color: var(--text-tertiary); font-size: 0.85rem; margin-right: 4px; } .filter-btn { font-family: inherit; font-size: 0.8rem; padding: 6px 12px; border-radius: 4px; border: 1px solid var(--border-default); background: var(--bg-tertiary); color: var(--text-secondary); cursor: pointer; transition: all 0.15s ease; } .filter-btn:hover { background: var(--bg-hover); border-color: var(--border-emphasis); color: var(--text-primary); } .filter-btn.active { background: var(--accent); color: var(--bg-primary); border-color: var(--accent); } .filter-count { margin-left: auto; color: var(--text-tertiary); font-size: 0.85rem; } .header-row h2 { margin: 0; font-size: 1.1rem; font-weight: 500; color: var(--text-primary); } /* flags list */ .flags-list { display: flex; flex-direction: column; gap: 16px; } .flag-card { background: var(--bg-secondary); border: 1px solid var(--border-subtle); border-radius: 8px; padding: 20px; } .flag-card.resolved { opacity: 0.5; } .flag-header { display: flex; justify-content: space-between; align-items: flex-start; gap: 16px; } .track-info { flex: 1; min-width: 0; } .track-info h3 { margin: 0 0 4px 0; font-size: 1rem; font-weight: 500; color: var(--text-primary); } .track-info h3 a { color: var(--text-primary); text-decoration: none; } .track-info h3 a:hover { color: var(--accent); text-decoration: underline; } .track-info .artist { color: var(--text-secondary); font-size: 0.9rem; } .track-info .artist a { color: var(--accent); text-decoration: none; } .track-info .artist a:hover { text-decoration: underline; } .track-info .uri { font-size: 0.75rem; color: var(--text-muted); word-break: break-all; margin-top: 8px; } .flag-badges { display: flex; flex-direction: column; align-items: flex-end; gap: 6px; flex-shrink: 0; } .badge { display: inline-block; padding: 4px 10px; border-radius: 4px; font-size: 0.75rem; font-weight: 500; } .badge.pending { background: rgba(251, 191, 36, 0.15); color: var(--warning); } .badge.resolved { background: rgba(74, 222, 128, 0.15); color: var(--success); } .badge.matches { background: rgba(106, 159, 255, 0.15); color: var(--accent); } .badge.env { background: rgba(139, 92, 246, 0.15); color: #a78bfa; text-transform: uppercase; letter-spacing: 0.5px; } /* matches section */ .matches { background: var(--bg-primary); border-radius: 6px; padding: 14px; margin-top: 16px; } .matches h4 { margin: 0 0 10px 0; color: var(--text-tertiary); font-size: 0.8rem; font-weight: 500; text-transform: lowercase; } .match-item { display: flex; justify-content: space-between; align-items: center; padding: 8px 0; border-bottom: 1px solid var(--border-subtle); font-size: 0.85rem; } .match-item:last-child { border-bottom: none; } .match-item .title { color: var(--text-primary); } .match-item .artist { color: var(--text-tertiary); } /* actions */ .flag-actions { display: flex; justify-content: flex-end; gap: 10px; margin-top: 16px; padding-top: 16px; border-top: 1px solid var(--border-subtle); } /* resolution info display */ .resolution-info { display: flex; flex-direction: column; gap: 8px; width: 100%; } .resolution-reason { color: var(--success); font-size: 0.85rem; font-weight: 500; text-align: right; } .resolution-notes { background: var(--bg-primary); border: 1px solid var(--border-subtle); border-radius: 6px; padding: 12px 14px; font-size: 0.8rem; color: var(--text-secondary); line-height: 1.5; width: 100%; text-align: left; } /* multi-step resolve flow */ .resolve-flow { display: flex; gap: 8px; align-items: center; } /* reason selection (step 2) */ .reason-select { display: flex; gap: 6px; flex-wrap: wrap; align-items: center; } .reason-btn { font-family: inherit; font-size: 0.8rem; padding: 6px 12px; border-radius: 4px; border: 1px solid var(--border-default); background: var(--bg-tertiary); color: var(--text-secondary); cursor: pointer; transition: all 0.15s ease; } .reason-btn:hover { background: var(--bg-hover); border-color: var(--border-emphasis); color: var(--text-primary); } .reason-btn.selected { background: var(--warning); color: var(--bg-primary); border-color: var(--warning); } .reason-btn.cancel { background: transparent; border-color: var(--border-subtle); color: var(--text-muted); } .reason-btn.cancel:hover { border-color: var(--error); color: var(--error); } /* confirm step (step 3) */ .confirm-step { display: flex; gap: 8px; align-items: center; } .confirm-text { color: var(--text-secondary); font-size: 0.85rem; } .confirm-text strong { color: var(--warning); } .btn-confirm { background: var(--error); color: white; } .btn-confirm:hover { background: #dc2626; } /* states */ .empty, .loading { color: var(--text-muted); text-align: center; padding: 48px 24px; } .no-context { color: var(--text-muted); font-style: italic; } /* toast */ .toast { position: fixed; bottom: 24px; left: 24px; padding: 12px 20px; border-radius: 6px; font-size: 0.85rem; animation: fadeInUp 0.2s ease, fadeOut 0.3s ease 2.7s forwards; } .toast.success { background: rgba(74, 222, 128, 0.15); color: var(--success); border: 1px solid rgba(74, 222, 128, 0.3); } .toast.error { background: rgba(239, 68, 68, 0.15); color: var(--error); border: 1px solid rgba(239, 68, 68, 0.3); } @keyframes fadeInUp { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } @keyframes fadeOut { to { opacity: 0; } } /* htmx indicator */ .htmx-indicator { opacity: 0; transition: opacity 0.2s ease; } .htmx-request .htmx-indicator { opacity: 1; } .htmx-request.htmx-indicator { opacity: 1; } /* refresh button with inline indicator */ .btn-secondary .htmx-indicator { display: none; margin-right: 6px; } .btn-secondary.htmx-request .htmx-indicator { display: inline; } /* mobile */ @media (max-width: 640px) { body { padding: 16px; } .auth-section input[type="password"] { width: 100%; margin-bottom: 12px; } .flag-header { flex-direction: column; } .flag-badges { margin-top: 12px; } }