admin: ui polish pass, thirty findings from the emil audit
Gates / frontend (push) Failing after 1m6s
Gates / package (push) Skipped
Gates / container (push) Skipped
Gates / test (push) Failing after 3m29s
Gates / test-aarch64 (push) Successful in 9m53s
CI / gates (push) Failing after 13m23s

selected states stop changing font weight, buttons gain a pressed scale and scoped 120ms transitions with a reduced-motion override, every loading and empty state reserves its height, charts measure before first paint, hit targets rise to the 44px enhanced target where layout permits, long domains clamp to two lines on an unpadded inner span, chips and name cells truncate, tabular figures on counts and time columns, a z-index layer scale replaces magic numbers and fixes the dialog-over-confirm tie, history's empty state gains a clear-filters action, page headings balance, font smoothing and color-scheme land on the html reset.
This commit is contained in:
2026-09-01 23:23:07 +02:00
parent 2ae0c974a4
commit e656670dd4
30 changed files with 399 additions and 82 deletions
@@ -46,6 +46,7 @@ const styles = stylex.create({
fontSize: "1.5rem",
lineHeight: "2rem",
fontWeight: 600,
textWrap: "balance",
},
intro: {
marginTop: "0.25rem",
@@ -94,6 +95,18 @@ const styles = stylex.create({
lineHeight: "1.25rem",
color: colors.textMuted,
},
/** One card: the badge and title row, the meta line, and the card's padding. */
activeLoading: {
minHeight: "4rem",
},
/**
* The table header and three rows, at 2.25rem each. Deliberately short of a
* full page of history: an install with nothing resolved collapses to one
* muted line, and a taller reserve would leave a hole on the common case.
*/
historyLoading: {
minHeight: "9rem",
},
cardList: {
marginTop: "0.75rem",
display: "flex",
@@ -339,8 +352,8 @@ function HistoryRow({ event, onPurge, busy }: { event: DiagnosticEvent; onPurge:
</Link>
</td>
<td {...stylex.props(styles.cell)}>{event.subject}</td>
<td {...stylex.props(styles.cell, styles.nowrap)}>{formatTime(event.first_seen)}</td>
<td {...stylex.props(styles.cell, styles.nowrap)}>
<td {...stylex.props(styles.cell, styles.nowrap, shared.tabularNums)}>{formatTime(event.first_seen)}</td>
<td {...stylex.props(styles.cell, styles.nowrap, shared.tabularNums)}>
{event.resolved_at === null ? "—" : formatTime(event.resolved_at)}
</td>
<td {...stylex.props(styles.cell, styles.nowrap, shared.tabularNums)}>{event.occurrences}</td>
@@ -436,7 +449,7 @@ export default function DiagnosticsPage() {
{active.status === "error" ? (
<InlineError error={active.error} onRetry={() => void active.refetch()} />
) : active.data === undefined ? (
<p {...stylex.props(styles.empty, shared.pulse)} role="status">
<p {...stylex.props(styles.empty, styles.activeLoading, shared.pulse)} role="status">
Loading diagnostics
</p>
) : activeRows.length === 0 ? (
@@ -474,7 +487,7 @@ export default function DiagnosticsPage() {
{history.status === "error" ? (
<InlineError error={history.error} onRetry={() => void history.refetch()} />
) : history.data === undefined ? (
<p {...stylex.props(styles.empty, shared.pulse)} role="status">
<p {...stylex.props(styles.empty, styles.historyLoading, shared.pulse)} role="status">
Loading history
</p>
) : historyRows.length === 0 ? (
@@ -509,7 +522,8 @@ export default function DiagnosticsPage() {
</table>
</div>
<p {...stylex.props(styles.footer, styles.note)}>
Showing {historyRows.length} resolved {historyRows.length === 1 ? "entry" : "entries"}
Showing <span {...stylex.props(shared.tabularNums)}>{historyRows.length}</span> resolved{" "}
{historyRows.length === 1 ? "entry" : "entries"}
{hasMore(history) ? "" : " — end of history"}
</p>
<MoreButton section={history} />