/* ── Service tiles ──────────────────────────────────────────────── */ .service-tile { background: var(--card); border: 1px solid var(--border); border-radius: 20px; overflow: hidden; padding: 21px 12px 17px; display: flex; flex-direction: column; align-items: center; cursor: pointer; position: relative; transition: transform 0.18s, border-color 0.18s, background 0.18s, box-shadow 0.18s, opacity 0.18s; animation: tileIn 0.45s cubic-bezier(0.2, 0.8, 0.3, 1) backwards; } @keyframes tileIn { from { opacity: 0; transform: translateY(10px) scale(0.96); } } .service-tile:hover { transform: translateY(-4px); border-color: var(--border-strong); background: var(--card-hover); box-shadow: var(--shadow-hover); } .service-tile:active { transform: translateY(-1px) scale(0.985); } .service-tile:focus-visible { outline: 2px solid rgba(66, 243, 154, 0.45); outline-offset: 2px; } .service-tile.disabled { opacity: 0.55; } .tile-icon { width: 62px; height: 62px; display: block; object-fit: contain; } .tile-icon-fallback { width: 62px; height: 62px; display: flex; align-items: center; justify-content: center; color: var(--text-3); font-size: 1.2rem; font-weight: 700; } .tile-name { margin-top: 13px; font-size: 0.86rem; font-weight: 650; text-align: center; line-height: 1.25; min-height: 2.5em; display: flex; align-items: center; justify-content: center; color: var(--text); max-width: 100%; } /* Status pill — dot + label inside a rounded pill */ .tile-status { margin-top: 9px; display: inline-flex; align-items: center; gap: 6px; font-size: 0.69rem; font-weight: 700; padding: 3px 10px; border-radius: 99px; letter-spacing: 0.01em; white-space: nowrap; background: rgba(255, 255, 255, 0.05); color: var(--text-2); } .status-text { line-height: 1; } .status-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--text-3); flex-shrink: 0; } .status-dot.active { background: var(--accent); } .status-dot.needs-attention { background: var(--amber); } .status-dot.failed { background: var(--red); } .status-dot.inactive, .status-dot.disabled { background: var(--text-3); } .status-dot.syncing, .status-dot.loading, .status-dot.checking-reachability { background: var(--blue); animation: tile-dot-pulse 1.4s ease-in-out infinite; } .status-dot.unknown { background: var(--text-3); } @keyframes tile-dot-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.35; } } /* Progressive enhancement: tint the whole pill on modern browsers */ .tile-status:has(.status-dot.active) { background: var(--accent-dim); color: var(--accent); } .tile-status:has(.status-dot.needs-attention) { background: rgba(233, 182, 74, 0.10); color: var(--amber); } .tile-status:has(.status-dot.failed) { background: rgba(246, 97, 81, 0.10); color: var(--red); } .tile-status:has(.status-dot.syncing), .tile-status:has(.status-dot.loading), .tile-status:has(.status-dot.checking-reachability) { background: rgba(120, 174, 237, 0.10); color: var(--blue); } .support-status-label { font-size: 0.69rem; font-weight: 700; color: var(--text-2); } /* ── Bitcoin IBD sync tile ──────────────────────────────────────── */ .tile-sync-container { margin-top: 12px; width: 100%; padding: 0 6px; } .tile-sync-label { font-size: 0.66rem; font-weight: 750; letter-spacing: 0.06em; text-transform: uppercase; color: var(--amber); text-align: center; } .tile-sync-bar-row { display: flex; align-items: center; gap: 8px; margin-top: 7px; } .tile-sync-bar-track { flex: 1; height: 7px; border-radius: 99px; background: rgba(255, 255, 255, 0.07); overflow: hidden; } .tile-sync-bar-fill { height: 100%; border-radius: 99px; background: linear-gradient(90deg, #42f39a, #1aa45d); transition: width 0.6s cubic-bezier(0.3, 0.7, 0.3, 1); } .tile-sync-percent { font-family: var(--mono); font-size: 0.7rem; font-weight: 700; color: var(--amber); flex-shrink: 0; } .tile-sync-eta { margin-top: 6px; font-family: var(--mono); font-size: 0.66rem; color: var(--text-3); text-align: center; }