Repository navigation
feat(ui): UI overhaul with shared uikit components and light/dark design tokens - #66
Merged
Merged
Conversation
… components theme.css holds every token as light-dark(<light>, <dark>), so re-theming is a one-file change; base.css maps them to Tailwind utilities. Both apps' layouts now render through uikit.Page and uikit.AppShell (skip link, responsive nav with a mobile menu, theme toggle, language menu, sign out). depguard keeps uikit from importing apps or data packages; the web app's name comes from APP_NAME instead of the leftover "Better Stack" brand. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ocale Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Auth pages use the centered AuthLayout card (h1 per page), the dashboard and Account page use cards, badges and a device list, and the welcome pages use theme tokens only. The footer shows APP_NAME instead of a fixed brand. Old view components and class constants are gone; patch target ids, input names and Datastar behaviour are unchanged. New render/handler tests keep ui coverage at 74.0%. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Remove admin, ban and revoke-all ask in an accessible dialog (posting directly without JS). The admins table no longer clips its actions, the sessions table's action column has a label, empty lists show an empty state, and the auth pages have an h1. Patch targets, input names and test ids are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
TestTemplatesUseThemeTokens (both apps) scans the app and packages/uikit for Tailwind palette utilities and dark: variants other than icon swaps, so a theme stays a one-file change. TableWrap is relative so sr-only labels inside a table cannot widen the page. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
jayleaton
marked this pull request as ready for review
October 22, 2026 11:47
Importing apps/admin/internal/services from packages/uikit fails Go's internal rule at typecheck, which aborted the whole probe run instead of being reported by depguard. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Both apps get one design system: tokens with a light and a dark value each, a shared templ component set, and every page in both apps rebuilt on it. Re-theming is now a one-file change (
packages/uikit/theme.css+make css).<html class="light|dark">from thethemecookie, so the first paint is right with no pre-paint script under the strict nonce CSP. The existing toggle is kept.APP_NAME(default "My App") names the web app,ADMIN_APP_NAMEthe admin.<dialog>instead ofconfirm(); without JS they still post directly. The Admins table no longer clips Remove at 1280px.TestTemplatesUseThemeTokens(both apps) fails on raw palette classes (bg-blue-600…) ordark:variants outside icon swaps, so the one-file theming holds. Proven by plantingbg-blue-500 dark:bg-red-900: it failed with 3 errors.Evidence
Real servers (
server+adminagainst a throwaway Postgres), seeded with 8 users, a ban, a role change and a pending invite. Headless Chromium took 96 before shots (origin/main @ fcc7578) and 100 after shots: every page in light + dark, desktop 1280 + mobile 390, en plus a ja sample, and the mobile menu open. Selected pairs:axe-core 4.x (wcag2a/aa, wcag21a/aa, best-practice; 21 pages × light/dark, desktop, en; full tables: before · after):
Local checks before each push on the touched packages:
gofmt -l(empty),go vet,golangci-lint run→0 issues.,check-test-boundaries.shOK.go test ./apps/web/ui/... ./apps/admin/ui/...: ok. Coverage: web ui 74.0% (unchanged, floor 70), admin ui 88.5% (floor 80). Fullmake ciruns here in CI.Merge Danger
Door: two-way. Only templates, CSS, docs and one new optional env var (
APP_NAME) change; there are no migrations or data changes. A revert restores the old UI.Blast Radius: UI
Every page of both browser UIs changes look. Anything scraping old class names or markup would break; the repo's own tests were updated without weakening behaviour checks. The JSON API, auth and the mobile app are untouched. Three web dashboard placeholders changed: a dead "Support" button and the redundant Home and "Back to dashboard" buttons were removed (the nav covers them). The theme uses
light-dark()(Chrome 123+, Safari 17.5+, Firefox 120+).🤖 Generated with Claude Code