feat(enclave): standardize settings page to the redesigned shell (LC-463) #446

Merged
longjacksonle merged 2 commits from feat/enclave-settings-redesign into main 2026-06-25 04:27:02 +02:00

What

Standardizes /enclave/{id}/settings (the last page on the old flat full-width single-column style) to the redesigned Settings/Manage/Info shell. Ref data/ref-enclave-settings.jpg. Closes LC-463 (subtasks LC-464..468).

Structure (approved)

Vertical-tab Settings shell, five tabs (client-side - single route unchanged):

  • General - Name/Description, Visibility, Invite code
  • Members - member list + invite-by-search
  • Moderation - Anti-spam, Coyote Mode, Shame tags, Banned users
  • Customization - Custom emojis, User groups, Branding
  • Danger zone - Delete enclave (owner-only)

Standard header + back-to-enclave affordance; every section is a .lc-set-card; buttons/inputs standardized to .btn / .input.

UX fixes

  • Danger zone (4): red card + type-to-confirm gate (reuses the delete-account/room component, already global in roominfo.js). Owner-only, gating unchanged.
  • Save feedback (5): each redirect-based action appends ?ok=<code>, resolved to a localized message and shown as a toast on load - nothing completes silently. Rotate shows the new code + a toast.
  • Toggles (6): styled .lc-switch reflecting current on/off state (Visibility, Coyote, Shame, Share emojis); still submits the same POST-flip value, so the server contract is unchanged.
  • Member rows (7): role badges, aligned actions, Kick destructive, Kick + Transfer confirms.
  • Emoji upload (8): profile-avatar treatment - styled file button, shows chosen filename, validates png/gif/webp + ≤256 KiB before submit with an inline error.
  • Invite code (9): one-click copy with a "Copied" flip.
  • Empty states (10): shared partials/empty_state.html for no bans / emojis / groups.
  • Header (11): matches the other redesigned pages.

Preserve (no change)

Enclave/role data models, all authz (rename/rotate/kick/transfer/delete/toggles), action routes + methods, validation limits, and hx-swap-oob targets - the live member region #lc-enclave-settings-members and its shared partial (used by the WS OOB fragment) are kept intact.

Verification

just build-css, just check (clippy + fmt clean), just test, just test-saas all green (the live-member-wiring test still passes - the template keeps data-lc-live-topic, #lc-enclave-settings-members, and the /kick control). just verify built the release binary clean; its server-up harness lacks the mandatory LETS_CHAT_BUNYIP_SSO_* startup vars, so the standalone server cannot boot to serve /login in this sandbox (environmental, not a regression).

🤖 Generated with Claude Code

## What Standardizes `/enclave/{id}/settings` (the last page on the old flat full-width single-column style) to the redesigned Settings/Manage/Info shell. Ref `data/ref-enclave-settings.jpg`. Closes LC-463 (subtasks LC-464..468). ## Structure (approved) Vertical-tab Settings shell, five tabs (client-side - single route unchanged): - **General** - Name/Description, Visibility, Invite code - **Members** - member list + invite-by-search - **Moderation** - Anti-spam, Coyote Mode, Shame tags, Banned users - **Customization** - Custom emojis, User groups, Branding - **Danger zone** - Delete enclave (owner-only) Standard header + back-to-enclave affordance; every section is a `.lc-set-card`; buttons/inputs standardized to `.btn` / `.input`. ## UX fixes - **Danger zone (4)**: red card + type-to-confirm gate (reuses the delete-account/room component, already global in `roominfo.js`). Owner-only, gating unchanged. - **Save feedback (5)**: each redirect-based action appends `?ok=<code>`, resolved to a localized message and shown as a toast on load - nothing completes silently. Rotate shows the new code + a toast. - **Toggles (6)**: styled `.lc-switch` reflecting current on/off state (Visibility, Coyote, Shame, Share emojis); still submits the same POST-flip value, so the server contract is unchanged. - **Member rows (7)**: role badges, aligned actions, Kick destructive, Kick + Transfer confirms. - **Emoji upload (8)**: profile-avatar treatment - styled file button, shows chosen filename, validates png/gif/webp + ≤256 KiB before submit with an inline error. - **Invite code (9)**: one-click copy with a "Copied" flip. - **Empty states (10)**: shared `partials/empty_state.html` for no bans / emojis / groups. - **Header (11)**: matches the other redesigned pages. ## Preserve (no change) Enclave/role data models, all authz (rename/rotate/kick/transfer/delete/toggles), action routes + methods, validation limits, and `hx-swap-oob` targets - the live member region `#lc-enclave-settings-members` and its shared partial (used by the WS OOB fragment) are kept intact. ## Verification `just build-css`, `just check` (clippy + fmt clean), `just test`, `just test-saas` all green (the live-member-wiring test still passes - the template keeps `data-lc-live-topic`, `#lc-enclave-settings-members`, and the `/kick` control). `just verify` built the release binary clean; its `server-up` harness lacks the mandatory `LETS_CHAT_BUNYIP_SSO_*` startup vars, so the standalone server cannot boot to serve `/login` in this sandbox (environmental, not a regression). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
feat(enclave): standardize settings page to the redesigned shell (LC-463)
All checks were successful
check-secrets / Nosey parker (push) Successful in 6s
check-secrets / TruffleHog (push) Successful in 9s
check-secrets / Kingfisher (push) Successful in 9s
c0c1726c7f
The enclave settings page was the last surface still on the old flat, full-width, single-column style. Brought it in line with the redesigned Settings / Manage / Info pages.

Structure (approved): the Settings vertical-tab shell with five tabs - General (Name/Description, Visibility, Invite code), Members, Moderation (Anti-spam, Coyote Mode, Shame tags, Banned users), Customization (Custom emojis, User groups, Branding), and an owner-only Danger zone (Delete). Client-side tabs (enclave_settings.js, hash + sessionStorage), so the single /enclave/{id}/settings route is unchanged. Standard header with a back-to-enclave affordance; every section is a .lc-set-card; buttons/inputs standardized to .btn / .input.

UX fixes:
- Danger zone: red card with a type-to-confirm gate (reusing the delete-account/room component, already global in roominfo.js). Owner-only (can_delete), unchanged gating.
- Save feedback on every action: each redirect-based handler now appends ?ok=<code>, resolved to a localized message and surfaced as a toast on load (enclave_settings.js), so nothing completes silently. Rotate shows the new code + a toast.
- Toggle switches (Visibility, Coyote, Shame, Share emojis): styled .lc-switch reflecting the current on/off state, still submitting the same POST-flip value (server contract unchanged); the post-redirect reload renders the new state.
- Member rows: role badges, aligned actions, Kick destructive, Kick + Transfer confirms.
- Emoji upload: profile-avatar treatment - styled file button, shows the chosen filename, validates png/gif/webp + <=256 KiB before submit with an inline error.
- Invite code: one-click copy with a "Copied" flip.
- Shared empty-state for no bans / no emojis / no groups.

Layout/styling + confirm/feedback/copy UI only: no change to enclave/role data models, authorization rules, server functions, validation limits, or hx-swap-oob targets. The live member region (#lc-enclave-settings-members) and its shared partial (used by the WS OOB fragment) are preserved. Verified with just build-css, just check, just test, just test-saas. just verify built the release binary clean; its server-up harness lacks the mandatory LETS_CHAT_BUNYIP_SSO_* startup vars so the standalone server cannot boot to serve /login in this sandbox (environmental).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Merge remote-tracking branch 'origin/main' into feat/enclave-settings-redesign
All checks were successful
check-secrets / Nosey parker (push) Successful in 7s
check-secrets / TruffleHog (push) Successful in 7s
check-secrets / Kingfisher (push) Successful in 10s
check-secrets / Kingfisher (pull_request) Successful in 8s
check-secrets / Nosey parker (pull_request) Successful in 8s
check-secrets / TruffleHog (pull_request) Successful in 13s
Check / clippy + fmt + tests (pull_request) Successful in 5m45s
Create release / Create release from merged PR (pull_request) Has been skipped
ae3549b8af
longjacksonle scheduled this pull request to auto merge when all checks succeed 2026-06-25 04:22:12 +02:00
longjacksonle deleted branch feat/enclave-settings-redesign 2026-06-25 04:27:02 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
psa-systems/lets-chat!446
No description provided.