Repository navigation
feat(status-pages): themeable public page with a live editor preview - #1938
Merged
Merged
Maple Review Bot / Maple / review
completed
Oct 31, 2026 in 2m 9s
Confidence 6/10 · 2 issues to address
🟡 Confidence 6/10 · needs attention. Held at 6 because a correctness warning is open.
2 warnings −2 · 1 note · tests covered · risk high −1 · 4 defects fixed in earlier rounds
Replaces brand_color with a full page theme (preset, appearance, hex overrides, radius, font), validated to WCAG AA, and adds an Appearance editor with a live preview of the real public page. The card-contrast and partial-PATCH defects from the earlier review are fixed and pinned by tests; safe to merge.
["F6", "F7"]
themereplacesbrand_colorin the table, v2 API and snapshot, with a decoding default for old snapshotsthemeContrastIssuerefuses text or status colours under 4.5:1 on the background and cardsStatusPagesService.updatemerges a partial theme under aFOR UPDATErow lock- The editor renders the public page in a script-less
sandbox=""iframe
Before merge
- Migration · Check it is safe on production data and with the code still deployed ·
packages/db/drizzle/20261029112043_status_page_theme/migration.sql - Migration · Check it is safe on production data and with the code still deployed ·
packages/db/drizzle/20261030192905_merge_status_page_theme/migration.sql - Manual · Regenerate the iOS client's
apps/ios/Packages/MapleAPI/Sources/MapleAPI/openapi.jsonfrom the updated v2 spec - Manual · Note the v2
brand_color→themebreak for API consumers; an old field is now silently ignored - Manual · Merge the db migration on the current chain and confirm
parity.test.tsstays green in CI
Still open from earlier reviews
- 🟠 Warning · F6 · Status labels drop to ~1.3:1 on an overridden card colour ·
packages/status-page/src/styles.ts:45 - 🟠 Warning · F7 · Partial
themePATCH merges a stale read and drops a concurrent edit ·apps/api/src/routes/v2/status-pages.http.ts:230 - 🔵 Note · F2 · The preview rebuilds and reloads the whole page document on every keystroke ·
apps/web/src/page/alerts/status-pages/editor/view-appearance.ts:389
What was checked
- Ran the WCAG maths over all four presets: worst status pair is 4.60:1, so no preset is unsaveable
themeContrastIssuenow checksok/degraded/partial/major/maintagainst bothbgandcard(packages/domain/src/status-page.ts:424)forUpdate()is an existing effect-orm builder method (AlertsService.ts:711); the merge reads after the lock
6241ed0 · Reply "won't fix" to dismiss a finding, or mention @maple-review-bot to ask about one.
Loading