Adds a select+button next to the permission editor: pick any other role
from the dropdown, click "Use as template" → all checkboxes are replaced
with that role's permission set. Local-only (no API call); the user still
hits "Save changes" to persist. Includes a banner confirming the load
with the source role name + perm count.
Selector excludes the currently-edited role. Hidden for non-admins.
UI: dark card row matching the Foundry Deck token system (--bg-card,
--text-dim mono label, --bg-sink select with --accent focus border).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace hardcoded light-theme inline colors (#fff/#f8f9fa/#e8f5e9/#888…)
with semantic CSS classes that consume the existing design tokens
(--bg-card/--ember/--ember-soft/--accent/--text-dim/--steel/etc.). Fixes
the unreadable role names, faded checkmark cards, and washed-out success
banner — everything was rendering "white-on-cream" against the dark
Foundry Deck background.
Visual structure now:
- two-column grid (sidebar 280px / detail flex)
- role-card: dark surface, ember-soft + 3px ember edge + glow on selected,
Saira Condensed display name + mono permission count
- perm-group card with dashed steel header
- perm-item: bg-sink default; ember-soft + accent border + ember-tint check
glyph on checked; native checkbox restyled with the ember palette
- banner pill: success-green or danger-red token, mono text
- create-role card: ember left-edge, mono uppercase labels
- delete uses .btn-danger (already in the token set)
No state/logic changes — same fetch + toggle + save flow.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Frontend no longer has any wizard flow. Backend URL is baked into the bundle
at build time via VITE_HF_BACKEND_BASE_URL (forwarded as a Dockerfile ARG
from compose).
- src/App.tsx: drop SetupWizardPage import + appState='setup' fallback +
HF_WIZARD_PORT-via-localStorage probe. getApiBase() now reads
import.meta.env.VITE_HF_BACKEND_BASE_URL with localStorage as an escape
hatch for dev. When /config/status reports no admin yet, show a card
prompting the operator to run `docker exec hf_backend hf-cli admin
create-user ...`.
- src/pages/SetupWizardPage.tsx: deleted (~250 lines)
- src/index.css: drop .setup-wizard + .setup-* styles (~36 lines)
- src/vite-env.d.ts: add VITE_HF_BACKEND_BASE_URL to ImportMetaEnv
- Dockerfile: ARG VITE_HF_BACKEND_BASE_URL → ENV → npm run build
Build the prod image with:
docker build --build-arg VITE_HF_BACKEND_BASE_URL=https://hf-api.hangman-lab.top \
-t git.hangman-lab.top/zhi/harborforge-frontend:latest .
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace the ⚓ emoji with a real logo image used as the in-app brand
mark and the favicon. Default bundled public/logo.svg is the
HangmanLab mark recolored to the Foundry-Deck ember (#ff6a1a).
Override at deploy time via HARBORFORGE_LOGO_URL (injected into
runtime-config.js; getLogoUrl() + favicon swap), no rebuild needed.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Complete visual redesign via a single centralized design system in
src/index.css (no JSX/logic changes; all existing class selectors kept
1:1, so all ~20 pages restyle at once): blackened-steel dark palette,
molten-ember accent with heat glow, blueprint-grid + grain background,
Saira Condensed / Hanken Grotesk / JetBrains Mono web fonts, staggered
load animations, reduced-motion fallback. README written from stub.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Add freeze/start/close action buttons on MilestoneDetailPage
- Freeze: visible in open status, calls POST .../actions/freeze
- Start: visible in freeze status, calls POST .../actions/start
- Close: visible in open/freeze/undergoing, with reason input + confirmation
- Display started_at in milestone meta when present
- Hide edit button and create-item buttons in terminal states
- Add CSS badge styles for freeze (purple), undergoing (amber), completed (green)
- All actions show loading state and error feedback
- SetupWizardPage: step-by-step config (DB, admin, project)
- Connects directly to AbstractWizard via SSH tunnel (127.0.0.1)
- App.tsx: detect backend health, show wizard if not ready
- Auto-switch wizard to readonly after setup
- Add VITE_WIZARD_PORT build arg
- Add vite-env.d.ts for type safety
- Login page with JWT auth
- Dashboard with stats and charts
- Issues list with pagination, filtering
- Issue detail with comments, status transitions
- Create issue form
- Dark theme UI
- Docker (nginx) with API proxy to backend
- Sidebar navigation