| 1 | /* home: the launcher everyone who isn't an admin lands on ------------------ */ |
| 2 | |
| 3 | .home { display: grid; justify-items: center; align-content: start; max-width: 760px; padding-top: max(40px, 9vh); } |
| 4 | .home .globe { width: 52px; height: 52px; } |
| 5 | .page h1.greeting { margin: 0; font-size: 28px; font-weight: 250; letter-spacing: -0.01em; line-height: 1.2; } |
| 6 | .page.home h1.greeting { margin: 14px 0 30px; text-align: center; text-wrap: balance; } |
| 7 | .home .empty p { margin: 0 0 4px; } |
| 8 | .home .load { display: flex; align-items: center; gap: 8px; margin: -18px 0 26px; color: var(--text-2); font-size: 13px; } |
| 9 | .home .load .meter { width: 48px; min-width: 0; } |
| 10 | .home .issues { width: 100%; max-width: 600px; margin-top: 16px; } |
| 11 | .home .empty p:first-child { color: var(--text-2); } |
| 12 | |
| 13 | /* An app is a card that opens it; admins and friends see the same ones. */ |
| 14 | .apps { display: grid; grid-template-columns: repeat(auto-fill, minmax(136px, 1fr)); gap: 4px; align-content: start; } |
| 15 | .apps > .skeleton { height: 40px; border-radius: var(--radius); } |
| 16 | .app { |
| 17 | display: flex; |
| 18 | align-items: center; |
| 19 | gap: 9px; |
| 20 | min-width: 0; |
| 21 | height: 40px; |
| 22 | padding: 0 10px 0 8px; |
| 23 | border: 1px solid var(--line); |
| 24 | border-radius: var(--radius); |
| 25 | background: var(--surface); |
| 26 | color: var(--text); |
| 27 | font-size: 13px; |
| 28 | transition: background-color 150ms, border-color 150ms; |
| 29 | } |
| 30 | .app:hover { background: var(--hover); border-color: var(--axis); } |
| 31 | .app :is(img, .monogram) { flex: none; width: 24px; height: 24px; font-size: 12px; transition: transform 200ms var(--ease-out); } |
| 32 | .app:hover :is(img, .monogram) { transform: scale(1.08); } |
| 33 | .app:active :is(img, .monogram) { transform: scale(0.94); transition-duration: 100ms; } |
| 34 | .app .name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } |
| 35 | .app .status { flex: none; } |
| 36 | .app .status-label { flex: none; color: var(--text-2); font-size: 12px; } |
| 37 | .app.out :is(img, .monogram) { filter: grayscale(1); opacity: 0.45; } |
| 38 | .app.out .name { color: var(--text-2); } |
| 39 | .app.down { border-color: color-mix(in srgb, var(--critical) 55%, var(--line)); } |
| 40 | .app.degraded { border-color: color-mix(in srgb, var(--warning) 55%, var(--line)); } |
| 41 | .app > .skeleton.icon { width: 24px; height: 24px; border-radius: 22%; } |
| 42 | |
| 43 | .home .apps { width: 100%; max-width: 600px; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 8px; } |
| 44 | .home .app { height: 52px; padding: 0 14px 0 12px; gap: 12px; border-radius: var(--radius-lg); font-size: 14px; } |
| 45 | .home .app :is(img, .monogram) { width: 30px; height: 30px; font-size: 14px; } |
| 46 | .home .app > .skeleton.icon { width: 30px; height: 30px; } |
| 47 | |
| 48 | /* admin overview ---------------------------------------------------------- */ |
| 49 | |
| 50 | .overview .page-head { margin-bottom: 14px; } |
| 51 | |
| 52 | .staging { padding: 12px 14px; margin-bottom: 18px; border: 1px solid color-mix(in srgb, var(--warning) 50%, var(--line)); border-radius: var(--radius); background: color-mix(in srgb, var(--warning) 6%, var(--page)); } |
| 53 | .staging-heading { display: flex; align-items: baseline; gap: 10px; margin-bottom: 8px; } |
| 54 | .staging-heading h2 { margin: 0; color: color-mix(in srgb, var(--warning) 65%, var(--text)); } |
| 55 | .staging-heading span { color: var(--text-2); font-size: 12px; } |
| 56 | .staging-list { display: flex; flex-wrap: wrap; gap: 6px; } |
| 57 | .staging-list a { display: flex; align-items: center; gap: 7px; padding: 5px 9px; border: 1px solid var(--line); border-radius: var(--radius); background: var(--surface); font-size: 13px; } |
| 58 | .staging-list a:hover { border-color: var(--warning); } |
| 59 | .staging-list a .mono { font-size: 11px; } |
| 60 | .staging-list a[aria-busy="true"] { opacity: 0.6; } |
| 61 | .stage-menu { |
| 62 | position: fixed; inset: auto; margin: 0; padding: 4px; min-width: 140px; |
| 63 | border: 1px solid var(--line); border-radius: var(--radius); background: var(--surface); |
| 64 | box-shadow: 0 8px 24px #0002; |
| 65 | } |
| 66 | .stage-menu button { |
| 67 | display: flex; align-items: center; gap: 8px; width: 100%; padding: 7px 10px; |
| 68 | border: 0; border-radius: 4px; background: none; color: var(--critical); text-align: left; |
| 69 | } |
| 70 | .stage-menu button:hover, .stage-menu button:focus-visible { background: var(--hover); } |
| 71 | .stage-menu button:disabled { opacity: 0.5; } |
| 72 | |
| 73 | .glance { display: grid; grid-template-columns: minmax(290px, 2fr) minmax(0, 3fr); gap: 24px; align-items: start; } |
| 74 | .changes { margin: 0; padding: 0; list-style: none; font-size: 13px; } |
| 75 | .changes li { display: grid; grid-template-columns: 14px 1fr auto; gap: 10px; align-items: center; min-height: 32px; border-bottom: 1px solid var(--grid); } |
| 76 | .changes li:last-child { border-bottom: 0; } |
| 77 | .changes li > svg { color: var(--muted); } |
| 78 | .changes li.warn > svg:not(.status) { color: var(--warning); } |
| 79 | .changes .what { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } |
| 80 | .changes a { border-radius: 3px; transition: color 150ms; } |
| 81 | .changes .muted a { color: var(--text-2); text-decoration: underline dotted var(--axis); text-underline-offset: 3px; } |
| 82 | .changes a[href]:hover { color: var(--accent); text-decoration-color: currentColor; } |
| 83 | .changes.issues { border-bottom: 1px solid var(--grid); } |
| 84 | .issues li > .status { justify-self: center; } |
| 85 | .changes time { color: var(--muted); font-size: 12px; font-variant-numeric: tabular-nums; } |
| 86 | |
| 87 | .section-head { display: flex; align-items: center; gap: 12px; margin: 22px 0 6px; } |
| 88 | .section-head h2 { margin: 0; } |
| 89 | .section-head > .segmented { margin-left: auto; } |
| 90 | .section-head h2 a[href]:hover { text-decoration: underline; text-underline-offset: 3px; } |
| 91 | .changes li > .skeleton { grid-column: 1 / -1; } |
| 92 | |
| 93 | .pool { margin-bottom: 4px; } |
| 94 | .pool .donut-row svg { width: 120px; height: 120px; } |
| 95 | .pool .changes .scanning { display: flex; align-items: center; gap: 8px; } |
| 96 | .pool .changes .meter { flex: 1; max-width: 160px; } |
| 97 | .pool .changes li > .muted { font-size: 12px; } |