/* Login page — tokens and base reset come from base.css */ /* Centre the card in the viewport (overrides base.css body). */ body { min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 1.5rem; } .wrap { width: 100%; max-width: 360px; } .brand { display: flex; align-items: center; justify-content: center; gap: 0.6rem; margin-bottom: 1.75rem; } .brand h1 { margin: 0; font-size: var(--fs-lg); font-weight: 600; letter-spacing: -0.01em; } .card { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); padding: 1.5rem; } label { display: block; font-size: var(--fs-xs); font-weight: 600; color: var(--text-2); margin-bottom: 0.4rem; } input { width: 100%; min-height: var(--tap); padding: 0 0.85rem; background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--radius-sm); color: var(--text); font-family: inherit; font-size: 16px; /* prevents iOS zoom on focus */ outline: none; transition: border-color 0.2s; } input:focus { border-color: var(--accent); } input::placeholder { color: var(--text-3); } /* Second field in a stacked pair (username above password) needs the gap the single-field form never had. */ label.stacked { margin-top: 1rem; } .error-msg { background: var(--surface-2); border: 1px solid var(--border); border-left: 3px solid var(--danger); border-radius: var(--radius-sm); padding: 0.7rem 0.85rem; color: var(--text-2); font-size: var(--fs-sm); margin-bottom: 1rem; } button { width: 100%; min-height: var(--tap); margin-top: 1rem; background: var(--accent); color: var(--bg); border: none; border-radius: var(--radius-sm); font-family: inherit; font-size: var(--fs-sm); font-weight: 600; cursor: pointer; transition: opacity 0.15s; } button:hover { opacity: 0.88; }