mirror of
https://github.com/warmbly/warmbly.git
synced 2026-08-20 00:01:21 +00:00
c696a1d251
LockedSurface + feature gating: - New useFeatureAccess() hook: single source of truth for "can this org do X". Reads subscription + role, returns hasInbox, hasAdvanced, hasBulkOps, hasTeam, hasWebhooks, isOwner, plus the current plan name and status. Pages consult this instead of querying the subscription directly. - New LockedSurface component: renders the real page contents behind a frosted overlay at 40% opacity, with a centered upgrade card on top. Card has the feature name, a blurb, optional bullets, and a slate-900 "Upgrade to <Plan>" button (or a "ask your owner" line if the viewer isn't the owner). Users see what they'd unlock rather than a blank page. - /app/unibox is now wrapped in LockedSurface. Non-paid orgs get the lock with bullets for the actual inbox features. Billing access: - /app/billing checks access.isOwner before rendering. Non-owners see an EmptyBlock explaining that billing is owner-scoped. The UserNav menu also hides the Billing item entirely from non-owners so the route isn't even discoverable. Settings — two-pane sheet: - Left nav rail (200px, hairline divider) with 6 sections: Profile, Notifications, Security, Members, Workspace (owner-only), Danger zone. Each row is the same NavRow visual as the main sidebar — small icon, h-7, slate-200/70 active state. - Right panel renders the active section, paginated via URL hash (#profile, #members, …) so deep links work. - Profile: first/last name + disabled email + Save. - Notifications: 5 toggle rows using a slate-900 switch. - Security: sessions / 2FA / change-password rows. - Members: inline invite form (email + role pill toggle + Invite button) at the top, members list, pending invitations list, link out to the full /app/team page. - Workspace (owner-only): workspace name + default sender domain. - Danger zone: red-bordered cards for Delete account and Leave workspace, each with their own destructive button.
Warmbly Web App
React + TypeScript frontend for Warmbly.
Stack
- React 19
- Vite (Rolldown)
- TypeScript
- TanStack Query
- Zustand
- Tailwind CSS 4
Prerequisites
- Node.js 20+
- pnpm 10+
Setup
cd web
pnpm install
cp .env.example .env
Run
pnpm dev
Default dev URL: http://localhost:5173
Quality Checks
pnpm lint
pnpm test:run
pnpm build
Project Layout
src/approute pages and layoutssrc/componentsUI and feature componentssrc/lib/apiAPI clients, hooks, and modelssrc/storesZustand store slices