Harden authentication and put filter toggle and fields in one row

Security: per-username login throttling, constant-time unknown-user check,
Sec-Fetch-Site CSRF guard for writes, session rotation on login and
password change, absolute session lifetime, sessions ended on reset and
deactivation, last-admin protection, input length caps, ASCII usernames,
clickjacking headers. Covered by tests/authentication.test.ts.

Filter panel: toggle, fields and count share one row to save space.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Grovy311 2026-09-28 21:30:30 +02:00
parent 8d2948cdb1
commit 5073d9342a
18 changed files with 683 additions and 81 deletions

View file

@ -452,13 +452,25 @@ a {
background: var(--color-bg);
}
.filter-panel-header {
.filter-panel-row {
display: flex;
align-items: center;
gap: 10px;
}
.filter-panel-header .filter-panel-toggle {
/* Expanded: the fields carry a label above their input, so toggle and
count sit on the input line (bottom) instead of the label line. */
.filter-panel-row-expanded {
align-items: flex-end;
}
.filter-panel-row-expanded .filter-panel-toggle,
.filter-panel-row-expanded .filter-panel-count {
margin-bottom: calc((2.1rem - 24px) / 2);
}
.filter-panel-row .filter-panel-toggle {
flex: 0 0 auto;
width: 24px;
height: 24px;
padding: 0;
@ -468,7 +480,7 @@ a {
color: var(--color-ink-soft);
}
.filter-panel-header .filter-panel-toggle:hover {
.filter-panel-row .filter-panel-toggle:hover {
background: var(--color-surface);
}
@ -503,10 +515,11 @@ a {
.filter-bar {
display: flex;
flex: 1 1 auto;
min-width: 0;
flex-wrap: wrap;
align-items: flex-end;
gap: var(--space-sm) var(--space-md);
margin-top: 0.5rem;
}
.filter-bar-field,