Frontend polish: loading states, CSS variables, focus indicators, scroll lock

- Add tab refresh loading bar animation for all 4 tab loaders
- Add profiles loading guard to prevent concurrent fetches
- Centralize theme colors into CSS variables (--text-secondary, --text-muted,
  --bg-secondary, --success-color, --shadow-color) for both dark/light themes
- Replace hardcoded gray values across 10 CSS files with variables
- Fix duplicate .btn-sm definition in modal.css
- Fix z-index: toast 2001→2500 to safely clear modals at 2000
- Add :focus-visible keyboard navigation indicators for all interactive elements
- Add responsive breakpoints for tab bar and header on narrow screens
- Prevent background page scroll when command palette is open

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-25 21:09:42 +03:00
parent 82e12ffaac
commit 7f80faf8be
17 changed files with 162 additions and 49 deletions

View File

@@ -87,7 +87,7 @@ h2 {
}
.health-dot.health-online {
background-color: #4CAF50;
background-color: var(--primary-color);
box-shadow: 0 0 6px rgba(76, 175, 80, 0.6);
}
@@ -97,7 +97,7 @@ h2 {
}
.health-dot.health-unknown {
background-color: #9E9E9E;
background-color: var(--text-secondary);
animation: pulse 2s infinite;
}
@@ -166,12 +166,32 @@ h2 {
.tab-panel {
display: none;
position: relative;
}
.tab-panel.active {
display: block;
}
/* Thin animated bar at top of tab panel during data refresh */
.tab-panel.refreshing::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 40%;
height: 2px;
background: var(--primary-color);
border-radius: 1px;
animation: tab-loading-slide 1.2s ease-in-out infinite;
z-index: 2;
}
@keyframes tab-loading-slide {
0% { left: -40%; }
100% { left: 100%; }
}
/* Theme Toggle */
.search-toggle,
.theme-toggle {
@@ -247,7 +267,7 @@ h2 {
background: var(--card-bg);
border: 1px solid var(--border-color);
border-radius: 12px;
box-shadow: 0 16px 48px rgba(0, 0, 0, 0.3);
box-shadow: 0 16px 48px var(--shadow-color);
display: flex;
flex-direction: column;
overflow: hidden;
@@ -347,10 +367,32 @@ h2 {
text-align: center;
}
@media (max-width: 900px) {
.server-info {
flex-wrap: wrap;
gap: 4px;
}
}
@media (max-width: 768px) {
header {
flex-direction: column;
gap: 8px;
text-align: center;
}
.container {
padding: 12px;
}
}
@media (max-width: 600px) {
.tab-bar {
flex-wrap: wrap;
}
.tab-btn {
padding: 8px 12px;
font-size: 0.9rem;
}
}