feat: times in the reader's own zone; the audit log shows exact moments (milestone 490)
- users.time_zone (0034). An account without one takes the browser's zone on its first page (POST /account/time-zone/adopt, never over a choice made by hand); the session follows the account on every request. - /account: who you are and the zone every page writes its times in, reached from your name in the sidebar. - formatting.when: 'Today 06:58', 'Yesterday 23:41', 'Tue 6 Oct 14:12', '6 Oct 2025 14:12', 24-hour, in the reader's zone; |ago's hover is the exact local moment instead of UTC; tz_label() for column headers. - Audit log: When (EDT) with exact times, one detail fact a line, on classes. - tzdata in the image, and the airgapped smoke checks a zone resolves. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -97,8 +97,12 @@ code { font-family: var(--fs-font-mono); font-size: 0.875em; background: var(--b
|
||||
background: var(--red-dim); color: var(--red); font-size: 0.75rem; font-weight: 500;
|
||||
font-variant-numeric: tabular-nums;
|
||||
}
|
||||
.side-user { border-top: 1px solid var(--border); padding: 0.7rem 1.25rem; }
|
||||
.side-user { border-top: 1px solid var(--border); padding: 0.7rem 1.25rem;
|
||||
display: flex; align-items: center; justify-content: space-between; gap: 0.5rem; }
|
||||
.side-user form { margin: 0; }
|
||||
.side-user a { color: var(--text-muted); font-size: 0.84rem; text-decoration: none;
|
||||
overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
||||
.side-user a:hover, .side-user a[aria-current="page"] { color: var(--text); }
|
||||
.side-user button {
|
||||
color: var(--text-muted); font-size: 0.84rem; text-decoration: none;
|
||||
display: flex; align-items: center; gap: 0.4rem;
|
||||
@@ -108,7 +112,8 @@ code { font-family: var(--fs-font-mono); font-size: 0.875em; background: var(--b
|
||||
/* Keyboard focus: a clear inset ring on every interactive sidebar element. */
|
||||
.sidebar .brand:focus-visible,
|
||||
.side-nav a:focus-visible,
|
||||
.side-user button:focus-visible {
|
||||
.side-user button:focus-visible,
|
||||
.side-user a:focus-visible {
|
||||
outline: 2px solid var(--accent); outline-offset: -2px; color: var(--text);
|
||||
}
|
||||
.app-main { flex: 1; min-width: 0; display: flex; flex-direction: column; }
|
||||
@@ -193,6 +198,7 @@ strong, b, th { font-weight: 500; }
|
||||
.filter-bar { display: flex; flex-wrap: wrap; gap: 0.5rem; align-items: center; margin-bottom: 0.75rem; }
|
||||
.filter-bar input[type=search] { flex: 1 1 16rem; width: auto; }
|
||||
.filter-bar select { width: auto; flex: 0 0 auto; }
|
||||
.page-actions .filter-bar { margin: 0; }
|
||||
/* A small label that links somewhere, such as a group that filters the list. */
|
||||
.chip { display: inline-block; margin: 0.1rem 0.3rem 0.1rem 0; padding: 0.05rem 0.45rem; font-size: 0.75rem;
|
||||
color: var(--text-muted); border: 1px solid var(--border); border-radius: var(--fs-radius-sm); white-space: nowrap; }
|
||||
@@ -219,6 +225,8 @@ strong, b, th { font-weight: 500; }
|
||||
/* A second link inside a row that opens as a whole: it sits above the row's target. */
|
||||
.table tr.row-link .row-inner { position: relative; z-index: 1; }
|
||||
.table td.nowrap { white-space: nowrap; }
|
||||
/* An audit entry's details, one fact a line (milestone 490). */
|
||||
.audit-facts { font-size: 0.8rem; color: var(--text-muted); }
|
||||
.cell-note { font-size: 0.78rem; color: var(--text-muted); margin-top: 0.2rem; }
|
||||
/* An alert episode's own transitions, folded under it (#5316). */
|
||||
.episode-steps { margin-top: 0.3rem; font-size: 0.8rem; }
|
||||
|
||||
Reference in New Issue
Block a user