Handle stale sync state in client UI
Some checks failed
Build and Deploy Gateway / build-and-push (push) Successful in 14s
Build and Deploy Gateway / deploy (push) Failing after 1m21s

This commit is contained in:
2026-07-11 19:31:35 +03:00
parent a775d8456a
commit 198669694c
7 changed files with 410 additions and 26 deletions

View File

@@ -49,6 +49,100 @@ p {
background: light-dark(oklch(0.965 0.006 145), oklch(0.18 0.012 145));
}
.app-boot {
min-height: 100vh;
display: grid;
place-content: center;
justify-items: start;
gap: 14px;
padding: 32px;
background: light-dark(oklch(0.965 0.006 145), oklch(0.18 0.012 145));
color: light-dark(oklch(0.24 0.014 145), oklch(0.93 0.008 145));
font-family: 'JetBrains Mono', 'SF Mono', ui-monospace, Menlo, monospace;
}
.app-boot > span,
.app-boot summary {
color: light-dark(oklch(0.53 0.014 145), oklch(0.68 0.012 145));
font-size: 11px;
}
.app-boot h1 {
max-width: 22ch;
margin: 0;
font-size: clamp(22px, 5vw, 34px);
letter-spacing: -0.05em;
}
.app-boot p {
max-width: 58ch;
color: light-dark(oklch(0.53 0.014 145), oklch(0.68 0.012 145));
font-size: 12px;
line-height: 1.7;
}
.app-boot button,
.client-stale-banner button {
padding: 8px 12px;
border: 0;
border-radius: 8px;
background: light-dark(oklch(0.91 0.02 185), oklch(0.28 0.03 185));
cursor: pointer;
}
.app-boot button:focus-visible,
.client-stale-banner button:focus-visible {
outline: 2px solid oklch(0.65 0.11 185);
outline-offset: 3px;
}
.app-boot details {
max-width: min(640px, calc(100vw - 64px));
margin-top: 8px;
}
.app-boot summary {
cursor: pointer;
}
.app-boot code,
.app-boot pre {
display: block;
overflow-x: auto;
margin: 12px 0 0;
font-size: 11px;
line-height: 1.6;
white-space: pre-wrap;
}
.client-stale-banner {
position: fixed;
top: 16px;
left: 50%;
z-index: 60;
display: grid;
grid-template-columns: auto auto auto;
align-items: center;
gap: 12px;
padding: 9px 10px 9px 14px;
border-radius: 12px;
background: color-mix(in oklch, var(--client-panel) 90%, transparent);
box-shadow: 0 10px 32px oklch(0.08 0.015 145 / 0.14);
backdrop-filter: blur(12px);
color: var(--client-muted);
font: 600 10px/1.3 'JetBrains Mono', 'SF Mono', ui-monospace, Menlo, monospace;
transform: translateX(-50%);
}
.client-stale-banner strong {
color: var(--client-text);
}
.client-stale-banner button {
color: var(--client-text);
font-size: 10px;
}
/* ============ Client overview ============ */
.app.client-app {
@@ -1897,6 +1991,16 @@ p {
padding: 20px 14px;
}
.client-stale-banner {
width: calc(100% - 28px);
grid-template-columns: 1fr auto;
}
.client-stale-banner span {
grid-column: 1 / -1;
grid-row: 2;
}
.client-panel {
position: static;
grid-template-columns: 1fr;