Matthias Nott
2026-02-21 ed26def7d76ac011075c11e8c1679ed1f7a08abc
static/index.html
....@@ -13,7 +13,7 @@
1313 #main { flex: 1; display: flex; flex-direction: column; overflow-x: hidden; }
1414 #topbar { background: #111827; border-bottom: 1px solid #1f2937; padding: 0.75rem 1.5rem; display: flex; align-items: center; gap: 1rem; }
1515 #page-content { flex: 1; padding: 1.5rem; overflow-y: auto; }
16
- .breadcrumb { display: flex; align-items: center; gap: 0.5rem; font-size: 0.875rem; color: #9ca3af; }
16
+ .breadcrumb { display: flex; align-items: center; gap: 0.5rem; font-size: 0.875rem; color: #9ca3af; flex-wrap: wrap; }
1717 .breadcrumb a { color: #60a5fa; cursor: pointer; text-decoration: none; }
1818 .breadcrumb a:hover { text-decoration: underline; }
1919 .breadcrumb .sep { color: #4b5563; }
....@@ -22,19 +22,28 @@
2222 .sidebar-logo { padding: 1.25rem 1rem; font-size: 1.125rem; font-weight: 700; color: #f3f4f6; border-bottom: 1px solid #1f2937; display: flex; align-items: center; gap: 0.5rem; }
2323 .sidebar-nav { padding: 0.75rem 0.5rem; flex: 1; }
2424 .sidebar-footer { padding: 0.75rem 1rem; border-top: 1px solid #1f2937; font-size: 0.75rem; color: #6b7280; }
25
- .project-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 1rem; }
26
- .env-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 1rem; }
27
- .service-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 1rem; }
28
- .stat-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 1rem; }
25
+ .grid-auto { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 1rem; }
26
+ .grid-stats { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 0.75rem; }
27
+ .grid-metrics { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 1rem; }
2928 .card-clickable { cursor: pointer; transition: border-color 0.2s, transform 0.15s; }
3029 .card-clickable:hover { border-color: #60a5fa; transform: translateY(-1px); }
30
+ .stat-tile { cursor: pointer; transition: border-color 0.2s, transform 0.1s; }
31
+ .stat-tile:hover { border-color: #60a5fa; transform: translateY(-2px); }
32
+ .filter-badge { display: inline-flex; align-items: center; gap: 0.375rem; padding: 0.25rem 0.625rem; border-radius: 9999px; font-size: 0.75rem; font-weight: 600; background: rgba(59,130,246,0.15); color: #60a5fa; border: 1px solid rgba(59,130,246,0.3); }
33
+ .filter-badge button { background: none; border: none; color: #60a5fa; cursor: pointer; font-size: 0.875rem; padding: 0; line-height: 1; }
34
+ .filter-badge button:hover { color: #f87171; }
35
+ .view-toggle { display: flex; background: #1f2937; border-radius: 0.375rem; overflow: hidden; border: 1px solid #374151; }
36
+ .view-toggle button { background: none; border: none; color: #6b7280; padding: 0.25rem 0.5rem; font-size: 0.75rem; cursor: pointer; display: flex; align-items: center; gap: 0.25rem; }
37
+ .view-toggle button.active { background: rgba(59,130,246,0.2); color: #60a5fa; }
38
+ .view-toggle button:hover:not(.active) { color: #d1d5db; }
3139 .mobile-overlay { display: none; position: fixed; inset: 0; background: rgba(0,0,0,0.6); z-index: 40; }
3240 @media (max-width: 768px) {
3341 #sidebar { position: fixed; left: -240px; top: 0; bottom: 0; z-index: 50; transition: left 0.2s; }
3442 #sidebar.open { left: 0; }
3543 .mobile-overlay.open { display: block; }
3644 .hamburger { display: block; }
37
- .project-grid, .env-grid, .service-grid { grid-template-columns: 1fr; }
45
+ .grid-auto { grid-template-columns: 1fr; }
46
+ .grid-stats { grid-template-columns: repeat(2, 1fr); }
3847 }
3948 </style>
4049 </head>
....@@ -53,7 +62,6 @@
5362
5463 <!-- App Shell -->
5564 <div id="app" style="display:none;">
56
- <!-- Mobile overlay -->
5765 <div id="mobile-overlay" class="mobile-overlay" onclick="toggleSidebar()"></div>
5866
5967 <!-- Sidebar -->
....@@ -66,10 +74,6 @@
6674 <a class="sidebar-link active" data-page="dashboard" onclick="showPage('dashboard')">
6775 <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="7" height="7" rx="1"/><rect x="14" y="3" width="7" height="7" rx="1"/><rect x="3" y="14" width="7" height="7" rx="1"/><rect x="14" y="14" width="7" height="7" rx="1"/></svg>
6876 Dashboard
69
- </a>
70
- <a class="sidebar-link" data-page="services" onclick="showPage('services')">
71
- <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 2L2 7l10 5 10-5-10-5z"/><path d="M2 17l10 5 10-5"/><path d="M2 12l10 5 10-5"/></svg>
72
- Services
7377 </a>
7478 <a class="sidebar-link" data-page="backups" onclick="showPage('backups')">
7579 <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg>
....@@ -91,17 +95,26 @@
9195
9296 <!-- Main Content -->
9397 <div id="main">
94
- <!-- Top bar -->
9598 <div id="topbar">
9699 <button class="hamburger" onclick="toggleSidebar()">&#9776;</button>
97100 <div id="breadcrumbs" class="breadcrumb" style="flex:1;"></div>
101
+ <div id="view-toggle-wrap" style="display:none;">
102
+ <div class="view-toggle">
103
+ <button id="btn-view-cards" class="active" onclick="setViewMode('cards')" title="Card view">
104
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="7" height="7"/><rect x="14" y="3" width="7" height="7"/><rect x="3" y="14" width="7" height="7"/><rect x="14" y="14" width="7" height="7"/></svg>
105
+ Cards
106
+ </button>
107
+ <button id="btn-view-table" onclick="setViewMode('table')" title="Table view">
108
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="3" y1="6" x2="21" y2="6"/><line x1="3" y1="12" x2="21" y2="12"/><line x1="3" y1="18" x2="21" y2="18"/></svg>
109
+ Table
110
+ </button>
111
+ </div>
112
+ </div>
98113 <div style="display:flex;align-items:center;gap:0.75rem;">
99114 <div id="refresh-indicator" class="refresh-ring paused" title="Auto-refresh"></div>
100115 <button class="btn btn-ghost btn-xs" onclick="refreshCurrentPage()" title="Refresh now">Refresh</button>
101116 </div>
102117 </div>
103
-
104
- <!-- Page content -->
105118 <div id="page-content"></div>
106119 </div>
107120 </div>
....@@ -121,7 +134,7 @@
121134 </div>
122135 <div class="modal-footer">
123136 <button class="btn btn-ghost btn-sm" onclick="closeLogModal()">Close</button>
124
- <button class="btn btn-primary btn-sm" id="log-refresh-btn" onclick="refreshLogs()">Refresh</button>
137
+ <button class="btn btn-primary btn-sm" onclick="refreshLogs()">Refresh</button>
125138 </div>
126139 </div>
127140 </div>