feat: add CSS for source-tile offline and auth-required states

Add Phase 3 source tile component CSS rules to style.css, inserted
before the @media (prefers-reduced-motion) block as specified.

Rules added:
- .source-tile: base flex column layout (centered, 12px gap, 24px padding)
- .source-tile--offline: opacity 0.45, dashed border
- .source-tile--offline .source-tile__name: var(--text-dim) color
- .source-tile--offline .source-tile__badge: var(--err) bg, bold, uppercase
- .source-tile--offline .source-tile__last-seen: 11px font, dim color
- .source-tile--auth: var(--warn) border-color, dashed border
- .source-tile__name: 15px/600 font, var(--text) color
- .source-tile__login-btn: accent bg, 8px 20px padding, opacity transition
- .source-tile__login-btn:hover: opacity 0.85
- .source-tile__login-btn:focus-visible: 2px solid accent outline
- .source-tile__hint: 11px font, var(--text-muted) color

grep -c 'source-tile' style.css returns 11 lines (all required selectors present).

Tests: 15 new tests added to test_frontend_css.py covering all selectors,
properties, positioning before reduced-motion block, and brace balance.
All 150 CSS tests pass.
This commit is contained in:
Brian Krabach
2026-03-31 02:23:24 -07:00
parent 7100fd881e
commit 38a032b2d5
2 changed files with 345 additions and 0 deletions
+80
View File
@@ -795,6 +795,86 @@ body {
color: var(--bell);
}
/* ============================================================
Source tile states — offline and auth-required (Phase 3)
============================================================ */
.source-tile {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 12px;
padding: 24px;
height: var(--tile-height);
background: var(--bg-tile);
border: 1px solid var(--border);
border-radius: 4px;
}
.source-tile--offline {
opacity: 0.45;
border-style: dashed;
}
.source-tile--offline .source-tile__name {
color: var(--text-dim);
}
.source-tile--offline .source-tile__badge {
background: var(--err);
color: #ffffff;
font-size: 10px;
font-weight: bold;
padding: 2px 8px;
border-radius: 10px;
text-transform: uppercase;
}
.source-tile--offline .source-tile__last-seen {
font-size: 11px;
color: var(--text-dim);
}
.source-tile--auth {
border-color: var(--warn);
border-style: dashed;
}
.source-tile__name {
font-size: 15px;
font-weight: 600;
color: var(--text);
}
.source-tile__login-btn {
background: var(--accent);
color: var(--bg);
border: none;
border-radius: 4px;
padding: 8px 20px;
font-size: 13px;
font-weight: 600;
cursor: pointer;
opacity: 1;
transition: opacity var(--t-fast);
}
.source-tile__login-btn:hover {
opacity: 0.85;
}
.source-tile__login-btn:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
.source-tile__hint {
font-size: 11px;
color: var(--text-muted);
}
/* ─── Reduced Motion ──────────────────────────────────────────── */
@media (prefers-reduced-motion: reduce) {