This commit moves project search filtering from the server to the
client.
Changes include:
- Remove `Query` field from `ListTablosInput` and related handlers
- Add French date formatting for project cards
- Convert search form to client-side filter with data attributes
- Add empty state message for no search results
- Update button border-radius from 0 to 0.7rem
- Increase air.toml build command to include Tailwind CSS generation
backend
Create the foundational structure for managing design-system CSS with
co-located sources and semantic tokens:
- Add `cmd/buildstyles` to concatenate ordered CSS sources into a single
shipped stylesheet
- Define semantic color and effect tokens in `internal/web/ui/base.css`
- Move primitive and catalog CSS sources from `static/css/` to
co-located locations under `internal/web/ui/`
- Update test contract to verify token presence and proper stylesheet
generation
- Regenerate `static/styles.css` with new semantic token layer and
source annotations
Drop the is_temporary boolean from the DB schema (new migration), types,
API routers/helpers/middleware, and all frontend components and tests.
Access control now relies solely on is_client.
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
profiles.id has ON DELETE CASCADE from auth.users, so calling
auth.admin.deleteUser already removes the profile row. Only the
org soft-delete needs to happen explicitly.
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
- Add isDeletingAccount ref to prevent double-tap race
- Guard against null session before calling API
- Set 15s timeout on delete request (API makes 3-4 Supabase round-trips)
- Log error to console and restore guard in finally block
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
- Use direct cast pattern consistent with rest of file
- Add console.warn/error logging for count query failure and rollback failures
- Move DELETE /me tests to end of suite to avoid ownerUser teardown ordering issue
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
The USE_CLIENT_PASSWORD_INVITES flag was hardcoded true. This removes the
dead else-branch (old is_temporary flow sending users to app.xtablo.com/login)
and always shows the Accès client form that routes new clients through
clients.xtablo.com/set-password with is_client: true.
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>