Saved rules and client form drafts can now be edited through the rule
modal. On the Rules tab, saving re-runs client setup so the firewall
matches, and both add and edit ask for confirmation.
Comma-separated destinations were rejected because drafts were validated
before being split; validate each one after splitting instead. When
editing, the first destination updates the rule and the rest are added
as new rules.
Pin the id in the client_rules PUT handler so a request body can't
change it.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Rebuild every page on a shared set of twui-based primitives with a dense
ops-console look, WireGuard red accent and light/dark/system theming.
- Add design tokens (WireGuard red accent, zinc neutrals, theme-flipping
semantic colours) and a no-flash theme cookie + toggle
- Add shared components: page header, panel, sub-nav, data table with
mobile card list, stat tile, status dot, key-value list, copy button,
inline alert, empty state, form section/actions, confirm dialog and
toast providers
- New admin shell (sidebar, sticky header, mobile drawer) and a centered
shell for auth and 404; strip the public template pages
- Unify adding clients at /admin/clients/add with a host picker; tabbed
client detail (Overview / Rules / Config & QR) with config copy/download
- Re-run client setup after rule changes on the detail page so the
firewall matches the DB
- Split Setup into status/maintenance/firewall and Settings into
profile/password subpages
- Replace window.confirm/alert and page reloads with in-app dialogs,
toasts and in-place list updates
- Fix nested rule form submitting the client form, prefilled signup
passwords, hidden submit buttons, fields not updating after "next
free" lookups, and TinyMCE white-on-white in dark mode
Co-Authored-By: Claude Opus 5.5 <[email protected]>