Skip to main content

max / makenotwork

11.3 KB · 465 lines History Blame Raw
1 /* ===========================================
2 ADMIN & HEALTH DASHBOARDS
3 =========================================== */
4
5 /* Admin dashboards (templates/dashboards/admin-*.html). Every admin
6 page had a duplicate `h1 { font-size: 2rem; margin-bottom: 0.5rem; }`
7 inline, consolidated here. */
8
9 /* System health dashboard (templates/pages/health.html). */
10 .health-page {
11 padding: var(--gap-page);
12 }
13
14 .health-page .health-container {
15 max-width: 900px;
16 margin: 0 auto;
17 }
18
19 .health-page .health-grid {
20 display: grid;
21 grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
22 gap: var(--gap-pane);
23 margin-bottom: var(--gap-page);
24 }
25
26 .health-page .health-card {
27 background: var(--surface-sunken);
28 padding: var(--gap-pane);
29 }
30
31 .health-page .health-card h3 {
32 font-family: var(--font-mono);
33 font-size: var(--text-note);
34 margin-bottom: var(--gap-section);
35 display: flex;
36 align-items: center;
37 gap: var(--gap-peer);
38 }
39
40 .health-page .status-indicator {
41 width: 10px;
42 height: 10px;
43 border-radius: var(--radius-round);
44 display: inline-block;
45 }
46
47 .health-page .status-ok { background: var(--success); }
48 .health-page .status-warn { background: var(--warning); }
49 .health-page .status-error { background: var(--danger); }
50 .health-page .status-unknown { background: var(--content-muted); }
51
52 .health-page .health-card dl {
53 display: grid;
54 grid-template-columns: auto 1fr;
55 gap: var(--gap-peer) var(--gap-section);
56 font-size: var(--text-note);
57 }
58
59 .health-page .health-card dt { opacity: 0.7; }
60 .health-page .health-card dd {
61 font-family: var(--font-mono);
62 text-align: right;
63 }
64
65 .health-page .section-title {
66 font-family: var(--font-mono);
67 font-size: var(--text-body);
68 margin: var(--gap-page) 0 var(--gap-section);
69 padding-bottom: var(--gap-peer);
70 border-bottom: 1px solid var(--border);
71 }
72 .health-page .test-list {
73 list-style: none;
74 padding: 0;
75 margin: 0;
76 }
77
78 .health-page .test-list li {
79 display: flex;
80 justify-content: space-between;
81 padding: var(--gap-peer) 0;
82 border-bottom: 1px solid var(--border);
83 font-size: var(--text-note);
84 }
85
86 .health-page .test-list li:last-child { border-bottom: none; }
87
88 .health-page .test-name { font-family: var(--font-mono); }
89
90 .health-page .test-pass { color: var(--success); }
91 .health-page .test-fail { color: var(--danger); }
92 .health-page .summary-bar {
93 display: flex;
94 gap: var(--gap-page);
95 padding: var(--gap-section);
96 background: var(--surface-sunken);
97 margin-bottom: var(--gap-page);
98 font-family: var(--font-mono);
99 font-size: var(--text-note);
100 }
101
102 .health-page .summary-item {
103 display: flex;
104 align-items: center;
105 gap: var(--gap-peer);
106 }
107
108 .health-page .timestamp {
109 font-size: var(--text-fine);
110 opacity: 0.6;
111 text-align: right;
112 margin-top: var(--gap-page);
113 }
114
115 .health-page details.check-list {
116 background: var(--surface-overlay);
117 padding: var(--gap-pane);
118 margin-bottom: var(--gap-page);
119 }
120
121 .health-page details.check-list summary {
122 font-family: var(--font-mono);
123 font-size: var(--text-note);
124 cursor: pointer;
125 list-style: none;
126 display: flex;
127 align-items: center;
128 gap: var(--gap-peer);
129 }
130
131 .health-page details.check-list summary::-webkit-details-marker { display: none; }
132
133 .health-page details.check-list summary::before {
134 content: "â–¶";
135 font-size: var(--text-fine);
136 transition: transform 0.15s;
137 }
138
139 .health-page details.check-list[open] summary::before {
140 transform: rotate(90deg);
141 }
142
143 .health-page details.check-list .test-list {
144 margin-top: var(--gap-section);
145 }
146 /* ===========================================
147 IMPORT WIZARD
148 =========================================== */
149
150 /* Import data wizard (templates/dashboards/dashboard-import.html).
151 Page-specific upload + column-mapping + progress flow. Migration also
152 fixed token bypasses: --border-color → --border, --accent → --highlight,
153 --success-background → --success-bg, --error-background → --error-bg. */
154
155 .import-page .back-link {
156 display: inline-block;
157 margin-bottom: var(--gap-pane);
158 font-size: var(--text-note);
159 opacity: 0.7;
160 }
161
162 .import-page .back-link:hover { opacity: 1; }
163
164 .import-page .form-group { margin-bottom: var(--gap-pane); }
165
166 .import-page .form-group label {
167 display: block;
168 font-family: var(--font-mono);
169 font-size: var(--text-note);
170 font-weight: bold;
171 margin-bottom: var(--gap-peer);
172 }
173
174 .import-page .form-group select,
175 .import-page .form-group input[type="file"] {
176 width: 100%;
177 padding: var(--gap-peer);
178 font-size: var(--text-note);
179 border: 1px solid var(--border);
180 background: var(--surface-page);
181 }
182
183 .import-page .csv-preview {
184 margin-top: var(--gap-section);
185 overflow-x: auto;
186 }
187
188 .import-page .csv-preview table {
189 width: 100%;
190 border-collapse: collapse;
191 font-size: var(--text-note);
192 }
193
194 .import-page .csv-preview th,
195 .import-page .csv-preview td {
196 padding: var(--gap-peer) var(--gap-group);
197 border: 1px solid var(--border);
198 text-align: left;
199 }
200
201 .import-page .csv-preview th {
202 background: var(--surface-sunken);
203 font-family: var(--font-mono);
204 }
205
206 .import-page .column-mapping { margin-top: var(--gap-section); }
207
208 .import-page .mapping-row {
209 display: flex;
210 align-items: center;
211 gap: var(--gap-section);
212 margin-bottom: var(--gap-peer);
213 }
214
215 .import-page .mapping-row label {
216 min-width: 100px;
217 font-size: var(--text-note);
218 font-family: var(--font-mono);
219 margin-bottom: 0;
220 }
221
222 .import-page .mapping-row select {
223 flex: 1;
224 padding: var(--gap-bound);
225 font-size: var(--text-note);
226 }
227
228 .import-page .progress-stats {
229 display: flex;
230 gap: var(--gap-page);
231 font-size: var(--text-note);
232 font-family: var(--font-mono);
233 }
234
235 .import-page .progress-stats .stat-value { font-weight: bold; }
236
237 .import-page .import-result {
238 padding: var(--gap-section);
239 margin-bottom: var(--gap-section);
240 font-size: var(--text-note);
241 }
242
243 .import-page .import-result.success { background: color-mix(in oklch, var(--success) 12%, var(--surface-page)); }
244 .import-page .import-result.error { background: color-mix(in oklch, var(--danger) 10%, var(--surface-page)); }
245
246 .import-page .error-log {
247 margin-top: var(--gap-section);
248 padding: var(--gap-peer);
249 background: var(--surface-sunken);
250 font-family: var(--font-mono);
251 font-size: var(--text-fine);
252 max-height: 200px;
253 overflow-y: auto;
254 white-space: pre-wrap;
255 }
256
257 .import-page .import-history { margin-top: var(--gap-page); }
258
259 .import-page .history-table {
260 width: 100%;
261 border-collapse: collapse;
262 font-size: var(--text-note);
263 }
264
265 .import-page .history-table th,
266 .import-page .history-table td {
267 padding: var(--gap-peer);
268 border-bottom: 1px solid var(--border);
269 text-align: left;
270 }
271
272 .import-page .history-table th {
273 font-family: var(--font-mono);
274 font-weight: bold;
275 }
276
277 .import-page .import-note {
278 background: var(--surface-sunken);
279 padding: var(--gap-section);
280 margin-top: var(--gap-page);
281 font-size: var(--text-note);
282 }
283
284 .import-page .import-note h3 {
285 font-family: var(--font-mono);
286 font-size: var(--text-note);
287 margin-bottom: var(--gap-peer);
288 }
289
290 /* ===========================================
291 DELETE ACCOUNT PAGE
292 =========================================== */
293
294 /* Delete account page (templates/dashboards/dashboard-delete-account.html).
295 Overrides .warning-box to use --danger (delete is danger, not warning)
296 and the .form-status partial styling. Scoped to keep the global versions
297 intact for other pages. */
298
299 .delete-account-page .warning-box {
300 background: var(--danger);
301 color: var(--primary-light);
302 padding: var(--gap-pane);
303 margin-bottom: var(--gap-page);
304 }
305
306 .delete-account-page .warning-box h3 {
307 font-family: var(--font-mono);
308 font-size: var(--text-body);
309 margin-bottom: var(--gap-peer);
310 }
311
312 .delete-account-page .warning-box ul {
313 margin: var(--gap-peer) 0 0 var(--gap-pane);
314 font-size: var(--text-note);
315 }
316
317 .delete-account-page .warning-box li { margin-bottom: var(--gap-bound); }
318
319 .delete-account-page .export-prompt {
320 background: var(--surface-sunken);
321 padding: var(--gap-pane);
322 margin-bottom: var(--gap-page);
323 }
324
325 .delete-account-page .export-prompt h3 {
326 font-family: var(--font-mono);
327 font-size: var(--text-body);
328 margin-bottom: var(--gap-peer);
329 }
330
331 .delete-account-page .export-prompt p {
332 font-size: var(--text-note);
333 margin-bottom: var(--gap-section);
334 }
335
336 .delete-account-page .delete-form {
337 background: var(--surface-overlay);
338 padding: var(--gap-pane);
339 }
340
341 .delete-account-page .delete-form .form-group { margin-bottom: var(--gap-pane); }
342
343 .delete-account-page .delete-form label {
344 display: block;
345 margin-bottom: var(--gap-peer);
346 font-family: var(--font-mono);
347 font-size: var(--text-note);
348 }
349
350 .delete-account-page .delete-form .hint {
351 font-size: var(--text-note);
352 opacity: 0.7;
353 margin-top: var(--gap-bound);
354 }
355
356 .delete-account-page .delete-form input[type="text"] {
357 width: 100%;
358 padding: var(--gap-section);
359 font-size: var(--text-body);
360 border: 2px solid var(--border);
361 background: var(--surface-sunken);
362 }
363
364 .delete-account-page .delete-form input[type="text"]:focus {
365 border-color: var(--danger);
366 outline: none;
367 }
368
369 .delete-account-page .back-link {
370 display: inline-block;
371 margin-bottom: var(--gap-pane);
372 font-size: var(--text-note);
373 opacity: 0.7;
374 }
375
376 .delete-account-page .back-link:hover { opacity: 1; }
377
378 .delete-account-page .form-actions {
379 display: flex;
380 gap: var(--gap-section);
381 align-items: center;
382 }
383
384 .delete-account-page .form-status { font-size: var(--text-note); }
385 .delete-account-page .form-status.error { color: var(--danger); }
386 .delete-account-page .form-status.success { color: var(--success); }
387
388 /* ===========================================
389 EXPORT PAGE
390 =========================================== */
391
392 /* Export data page (templates/dashboards/dashboard-export.html).
393 `.export-card` and its inner classes (`-info`, `-title`, `-desc`, `-meta`)
394 are intentionally page-scoped: this is a row-layout card (info on left,
395 action button on right, flex justify-between) that doesn't fit `.card-muted`
396 cleanly. Background uses `--light-background` rather than `--surface-muted`
397 for visual distinction from the surrounding dashboard surface. */
398
399 .export-page .export-cards {
400 display: grid;
401 gap: var(--gap-section);
402 }
403
404 .export-page .export-card {
405 background: var(--surface-overlay);
406 padding: var(--gap-pane);
407 display: flex;
408 justify-content: space-between;
409 align-items: flex-start;
410 gap: var(--gap-section);
411 }
412
413 .export-page .export-card-info { flex: 1; }
414
415 .export-page .export-card-title {
416 font-family: var(--font-mono);
417 font-weight: bold;
418 font-size: var(--text-lead);
419 margin-bottom: var(--gap-peer);
420 }
421
422 .export-page .export-card-desc {
423 font-size: var(--text-note);
424 opacity: 0.8;
425 margin-bottom: var(--gap-peer);
426 }
427
428 .export-page .export-card-meta {
429 font-size: var(--text-fine);
430 opacity: 0.6;
431 }
432
433 .export-page .export-card button { white-space: nowrap; }
434
435 .export-page .export-note {
436 background: var(--surface-sunken);
437 padding: var(--gap-section);
438 margin-top: var(--gap-page);
439 font-size: var(--text-note);
440 }
441
442 .export-page .export-note h3 {
443 font-family: var(--font-mono);
444 font-size: var(--text-note);
445 margin-bottom: var(--gap-peer);
446 }
447
448 .export-page .back-link {
449 display: inline-block;
450 margin-bottom: var(--gap-pane);
451 font-size: var(--text-note);
452 opacity: 0.7;
453 }
454
455 .export-page .back-link:hover { opacity: 1; }
456
457 .export-page .export-status {
458 margin-top: var(--gap-peer);
459 font-size: var(--text-note);
460 }
461
462 .export-page .export-status.success { color: var(--success); }
463 .export-page .export-status.error { color: var(--danger); }
464
465