Foundry retheme, admin pagination, and CLI fix #479

Merged
adam merged 19 commits from frontend-rebuild into main 2026-06-25 08:10:37 -05:00
Owner

Summary

  • Foundry design system retheme across all pages (dark-only, ember/charcoal tokens, new SVG logo/favicon, theme toggle removed)
  • Admin list pagination restored with shared fdry-paginator component (users, groups, domains, invitations, password resets, emails)
  • Shared fdry-combobox and fdry-datetime-row components extracted and used on user/client forms
  • Safari blank-page fix: disabled Angular auto-generated CSP meta tag conflicting with Helmet header
  • Passkey spinner hang fix: added timeout race on platformAuthenticatorIsAvailable()
  • CLI fix: restructured generate subcommands so generate password-reset <username> dispatches correctly instead of falling through to generate random

Test plan

  • Login, passkey, MFA flows in Chrome
  • All admin routes: users, groups, domains, invitations, password resets, emails, clients
  • CRUD: create/delete group, edit user form
  • Sidenav and admin nav links
  • Safari end-to-end (login, passkey, MFA, admin)
  • CLI: generate password-reset auth_admin returns reset URL
  • Clients pagination (known gap — deferred)

Deferred

  • Column sort on lists
  • Shared icons component
  • Timezone handling on date inputs
  • Clients pagination

🤖 Generated with Claude Code

## Summary - Foundry design system retheme across all pages (dark-only, ember/charcoal tokens, new SVG logo/favicon, theme toggle removed) - Admin list pagination restored with shared `fdry-paginator` component (users, groups, domains, invitations, password resets, emails) - Shared `fdry-combobox` and `fdry-datetime-row` components extracted and used on user/client forms - Safari blank-page fix: disabled Angular auto-generated CSP meta tag conflicting with Helmet header - Passkey spinner hang fix: added timeout race on `platformAuthenticatorIsAvailable()` - CLI fix: restructured `generate` subcommands so `generate password-reset <username>` dispatches correctly instead of falling through to `generate random` ## Test plan - [x] Login, passkey, MFA flows in Chrome - [x] All admin routes: users, groups, domains, invitations, password resets, emails, clients - [x] CRUD: create/delete group, edit user form - [x] Sidenav and admin nav links - [x] Safari end-to-end (login, passkey, MFA, admin) - [x] CLI: `generate password-reset auth_admin` returns reset URL - [ ] Clients pagination (known gap — deferred) ## Deferred - Column sort on lists - Shared icons component - Timezone handling on date inputs - Clients pagination 🤖 Generated with [Claude Code](https://claude.com/claude-code)
adam added 19 commits 2026-06-24 20:08:21 -05:00
- Replaced favicon and logo SVGs with new designs.
- Removed theme toggle component from the header.
- Simplified theme service to enforce dark mode.
- Updated application color in configuration.
- Enhanced custom CSS with Foundry design tokens and styles.
- Add 1s timeout race to platformAuthenticatorIsAvailable() so the
  passkey check does not permanently block the loading spinner
- Remove Google Fonts @import from custom.css (blocked by style-src
  'self' CSP; self-host woff2 files to restore IBM Plex Sans)
- Add 'strict-dynamic' to Helmet script-src to align with Angular's
  generated meta CSP (required for Safari module loading)

Safari blank page on localhost remains unresolved.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adding 'strict-dynamic' to the Helmet header caused 'unsafe-inline' to
be ignored, blocking Angular's inline bootstrap scripts. The hashes only
exist in Angular's generated meta CSP, not the HTTP header — so nothing
was trusted. Reverts to 'self' 'unsafe-inline' only.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Expanded the description of the gate repository, detailing its purpose as a private SSO provider and its features.
- Clarified the reasons for the fork from VoidAuth, emphasizing supply-chain control and UI improvements.
- Documented significant changes made in the `frontend-rebuild` branch, including updates to CSS, theme handling, and bug fixes related to CSP and loading issues.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Angular's autoCsp feature was emitting a CSP meta tag with
'strict-dynamic' and sha256 hashes into the built index.html.
This created a dual-CSP conflict with Helmet's HTTP header —
Safari takes the intersection of both policies, which blocked
Angular's module script loading and resulted in a blank page.

Disabling autoCsp leaves Helmet as the sole CSP authority.

Also fixes two Zod v4 transform type annotations in
shared/validators.ts that were blocking the frontend build.
- Replace Angular Material login form with custom Foundry markup
- Add global foundry.scss primitives (fdry-btn, fdry-input, fdry-checkbox, fdry-link)
- Fix Helmet upgrade-insecure-requests + HSTS over HTTP for local dev
- Disable Angular autoCsp to resolve Safari blank page
- Fix Zod v4 validator build errors
- Add submitted flag so validation only shows after user action
- Replace Angular Material on registration page with fdry-* primitives
- Rebuild new-password-input with Foundry input styling
- Add segmented password strength meter with ember/brass/green colors
- Remove Material imports from registration and password components
- Replace Angular Material form with fdry-* primitives
- Match login/register card layout and wordmark
- Add submitted flag for validation UX
- Move login-card/page/brand/form/divider/foot styles from login.component.scss to global foundry.scss
- Migrate login, registration, forgot-password, approval-required, user-expired, forbidden, and not-found to fdry-* classes
- Add fdry-card--wide for registration and status pages
- Add i18n content for page-not-found
- Replace mat-toolbar header with custom fdry-header markup
- Add foundry.gate wordmark to header
- Replace mat-drawer sidenav with custom app-sidenav component
- Add fdry-icon-btn, fdry-drawer styles to foundry.scss
- Remove MaterialModule from app and header components
Complete the remaining auth-flow pages, settings home, and OIDC consent on
fdry primitives. Retheme dialogs and shared components, migrate the admin
clients list off Material, and remove the stale HANDOFF doc plus sidenav
transloco leftover.

Co-authored-by: Cursor <cursoragent@cursor.com>
Replace Material tables and form controls across admin domains, groups,
invitations, users, password-resets, emails, and upsert-client with
Foundry primitives and shared list/form CSS.

Co-authored-by: Cursor <cursoragent@cursor.com>
Deduplicate admin form pickers with app-fdry-combobox and
app-fdry-datetime-row, retheme the email preview dialog, add paginator
i18n, and remove unused mat-card.form-card styles.

Co-authored-by: Cursor <cursoragent@cursor.com>
Add app-fdry-paginator and client-side page slicing for users, groups,
domains, invitations, and password-resets; refactor emails to use the
same component with server-side fetch.

Co-authored-by: Cursor <cursoragent@cursor.com>
Drop accidentally committed .DS_Store, .claude/, MCP configs, and the
heavy React demo bundle from foundry-design. Keep tokens, assets, and
docs; ignore these paths going forward.

Co-authored-by: Cursor <cursoragent@cursor.com>
fix: restructure generate subcommands so password-reset dispatches correctly
All checks were successful
Test / test (pull_request) Successful in 58s
977527e8d4
Flat 'generate password-reset' command was matching the parent token
against 'generate random', causing the wrong handler to run. Nesting
both under a proper 'generate' parent with .demandCommand(1) fixes
dispatch.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
adam merged commit 943d8c5b85 into main 2026-06-25 08:10:37 -05:00
Sign in to join this conversation.
No description provided.