Cinder pass across /admin, the login gate, and the library's a11y floor #177
Reference in New Issue
Block a user
Delete Branch "vision-check"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
One commit (
af07314), three strands of browser-UI work against one design system.docs/design-system.mdwas updated to match the CSS, not the reverse.Library (Reader-facing)
Findings came out of a two-axis design review of the library surface; the fixes are the P1/P2 set plus the cheap P3s.
.chromesticks attop: 0. Search and the tab row were unreachable three screens into a 300-item library — exactly where they earn their keep. Everything above them (.topbar,.keyrow,.recent) still scrolls away on purpose: another 150px of permanent chrome on an 844px phone costs more than re-scrolling for an icon reminder.:focus-visiblering (2px solid var(--paper), offset 2px) on the nine controls that defined none and fell back to the UA blue — a colour tuned for neither branch of this palette..searchbarkeeps its:focus-withinborder recolour as a resting cue but no longer stands in for the ring.Saving…and carriesaria-busy. htmx sets neither, so the wait — up to its own 15s timeout, and this app is used on a phone in dead zones — was silent in both the visual and the assistive channel. Deliberately--mute, not--ember: ember means "new chapter" and nothing else..is-new .titletakeswidth: fit-content, or-webkit-boxstretches the ember underline past the text it is supposed to be sized to..libswitch areaches a real 44px under(pointer: coarse)— padding plus an 11px line landed at 43./admin
thead, labels state cells for a screen reader, and has an empty state where the sites table previously assumed rows.#noticeslot,#sr-announce,filter.js.admin_render_test.goandcard_render_test.gorender the templates directly, so markup regressions in either surface fail without a browser.Login
DISCORD_GUILD_NAME(optional) names the community on the login screen and in the refusal message, so a stranger knows which Discord to ask for an invite. Unset degrades to a generic label. Neither form names the numeric guild id — that was never actionable, and the gate still reveals nothing about whether a given guild exists.Handlers
maxChapterNum(9999) now bounds both typed-chapter paths.uiChapterandadminSeriesCorrectLatesteach parsed afloat64with no ceiling, so a hand-rolled POST stored1e308and every later reader of that row — the poller'sHasNewChaptercomparison, the display string — inherited it. Matches themaxon the card's chapter input. The API PUT path is deliberately untouched: it carries the userscripts' own scraped numbers, not typed input.Verification
cd backend && go test ./...green (Docker-backedpgtest).TestChapterOverrideRejectsBadInputgained"10000"and"1e5"— both parse fine asfloat64, so they only fail if the bound exists.zoom: 1.2) desktop, against the real templates + real CSS. MeasuredchromeTop = 0atscrollY 950,2px solid rgb(242,236,229)rings,content: "Saving…"atopacity: 1after 2.4s,aria-busytrueduring / cleared after,libswitchH = 44in ahasTouchcontext, no horizontal overflow at either width.detect.mjsontemplates/:[], exit 0.Note on shape
The three strands landed as one commit because
admin_series.goandstyle.csseach carry hunks from more than one of them; splitting cleanly would have needed hunk-level surgery. Say the word if you want it split before merge.