Skip to content

Platform UI view inventory ​

Status: Current (2026-06-22)

ADR: 0033 — Platform Foundation UI & View Inventory

ADO: Epic AB#3074 (Platform build)


This document is the per-view specification matrix for every platform-foundation view. For the governing decision (view inventory rules, card naming convention, feature ADR convention) see ADR 0033. For the member-detail field model see member-directory-rbac.md.

Mockup file path convention (ADR 0033) ​

Screen mockup HTML files live under packages/ui/design-system/screens/ in platform-specific subfolders. All paths in the "Mockup" rows below use the screens/web/ prefix — the web browser client is the current platform-foundation target.

SubfolderPurpose
screens/web/Responsive HTML mockups for the web browser client (Desktop, Tablet, Phone viewports)
screens/mobile/Native HTML mockups for iPhone + Android app — reserved; placeholder files only at this time
screens/tablet/Native HTML mockups for iPad app — reserved; placeholder files only at this time
components/Shared component snippet cards (tab bar, buttons, empty state, etc.)

Responsive layout (ratified) ​

BreakpointViewport widthPrimary navContent
Phone< 640 pxFixed bottom tab bar (5 tabs, 60px + safe-area)Single column, full width, 80px bottom padding
Tablet640 – 1023 pxFixed bottom tab barSingle column, max 640px centered
Desktop≥ 1024 pxFixed left sidebar (220px)Fluid column, max 860px centered, 32px padding

Five primary destinations (locked): Home · Watch & Listen · Calendar · Messages · Me

DesignSync card naming &ZeroWidthSpace;

<Screen> — <Variant/Role> · <Platform> · <Viewport>

Platform values: Web, iPhone App, iPad App, Android App. Viewport values (web only): Desktop, Tablet, Phone. Native apps omit the viewport suffix.


View specifications &ZeroWidthSpace;

A1 — Landing / public home &ZeroWidthSpace;

AttributeValue
Route/
AccessPublic (unauthenticated)
Mockuppackages/ui/design-system/screens/web/landing.html
Card namesLanding · Web · Desktop, Landing · Web · Tablet, Landing · Web · Phone
ADOStory under Feature AB#3090

Purpose: First page a visitor sees. Heritage Virginia branding, brief community description, sign-in CTA, and "Request Community Access" link. No feature content. Redirect to /app/home if the user is already authenticated.

Key states: Unauthenticated only. No tab bar, no sidebar. Centered card layout (similar to sign-in chrome).


A2 — Sign-in &ZeroWidthSpace;

AttributeValue
Route/sign-in
AccessPublic
Mockuppackages/ui/design-system/screens/web/sign-in.html (exists)
Card namesSign-in · Web · Desktop, Sign-in · Web · Tablet, Sign-in · Web · Phone
ADOStory under Feature AB#3085

Purpose: Clerk-backed sign-in with Apple and Google social sign-in, plus email/password. Links to "Request Community Access" (A3) for new members.

Key states: Default, error (invalid credentials), loading. No app chrome (no tab bar/sidebar).


A3 — Request access (sign-up step 1) &ZeroWidthSpace;

AttributeValue
Route/sign-up
AccessPublic
Mockuppackages/ui/design-system/screens/web/sign-up-request.html
Card namesSign-up — Request Access · Web · Desktop, Sign-up — Request Access · Web · Tablet, Sign-up — Request Access · Web · Phone
ADOStory under Feature AB#3086

Purpose: Closed-community intake form. Collects name, email, and optional note to the minister. Submits a member-join approval request (ADR 0007). User is informed the request is pending.

Key states: Form, submitting, submitted (→ A5 pending screen).


A4 — Create account (sign-up step 2) &ZeroWidthSpace;

AttributeValue
Route/sign-up/account
AccessPublic (post-approval link)
Mockuppackages/ui/design-system/screens/web/sign-up-account.html
Card namesSign-up — Create Account · Web · Desktop, Sign-up — Create Account · Web · Tablet, Sign-up — Create Account · Web · Phone
ADOStory under Feature AB#3086

Purpose: After the minister approves the join request, the new member follows an emailed link to create their Clerk account (set display name, choose Apple/Google or email/password). One-time flow; not accessible after account creation.

Key states: Form, submitting, complete (→ A2 sign-in or → S2 home).


A5 — Account pending approval &ZeroWidthSpace;

AttributeValue
Route/pending
AccessPublic / authenticated-but-pending
Mockuppackages/ui/design-system/screens/web/account-pending.html
Card namesAccount Pending · Web · Desktop, Account Pending · Web · Tablet, Account Pending · Web · Phone
ADOStory under Feature AB#3086

Purpose: Shown after A3 (request submitted) or if a member signs in while their account is still pending_approval. Explains that leadership will review and approve. No app chrome.

Key states: Pending (default). If approved and user returns, redirect to /app/home.


A6 — Sign-out confirmation &ZeroWidthSpace;

AttributeValue
RouteModal / flow (not a standalone route)
AccessAll authenticated roles
Mockuppackages/ui/design-system/screens/web/sign-out.html
Card namesSign-out · Web · Desktop, Sign-out · Web · Tablet, Sign-out · Web · Phone
ADOStory under Feature AB#3090

Purpose: Confirmation dialog before signing the user out. "Sign out" CTA clears the Clerk session and redirects to A2.

Key states: Confirmation modal overlay (shown over whichever page the user was on).


S1 — App shell / navigation chrome &ZeroWidthSpace;

AttributeValue
RouteShell — present on all /app/* routes
AccessAll authenticated roles
Mockuppackages/ui/design-system/components/tab-bar.html (exists, authoritative for tabs)
Card namesShell — Tab Bar · Web · Phone, Shell — Tab Bar · Web · Tablet, Shell — Sidebar · Web · Desktop
ADOStory under Feature AB#3090

Purpose: The persistent app chrome: bottom tab bar on phone/tablet (5 tabs); left sidebar on desktop (same 5 destinations). Includes the Heritage Virginia wordmark (desktop) and avatar/sign-out affordance. Admin and minister see RBAC-gated portal links in the sidebar (desktop) or in their Profile hub (P1, phone).

Tab order (locked): Home · Watch & Listen · Calendar · Messages · Me

RBAC nav: Portal links are appended after "Me" (sidebar, desktop) or surfaced in P1 (phone) for admin and ministry_leader only. Links are driven by canManage/role from the session; not rendered for member or visitor. Feature-registry entries are appended by the feature registry (ADR 0030) when each feature is onboarded.


S2 — Home (feature-icon grid) &ZeroWidthSpace;

AttributeValue
Route/app/home
AccessAll authenticated roles
Mockuppackages/ui/design-system/screens/web/home.html (rework: registry-driven icon grid)
Card namesHome · Web · Desktop, Home · Web · Tablet, Home · Web · Phone
ADOStory under Feature AB#3692

Purpose: The first screen after sign-in. Shows a greeting with the user's name, then a grid of feature icons — one icon per onboarded feature. Icons are driven by the feature registry (GET /config/features, ADR 0030); un-onboarded features show nothing. Platform foundation = 0 or 1 icons (Messages if onboarded). "Watch & Listen", "Calendar", etc. icons appear here automatically when those features are onboarded.

Key states: Empty (foundation, no features yet — show a "more coming soon" placeholder if nothing is registered); populated (one icon per feature); RBAC-filtered (some features have minRole filtering).


S3 — Messages inbox shell &ZeroWidthSpace;

AttributeValue
Route/app/messages
AccessAll authenticated roles
Mockuppackages/ui/design-system/screens/web/messages.html
Card namesMessages · Web · Desktop, Messages · Web · Tablet, Messages · Web · Phone
ADOStory under Feature AB#3090

Purpose: Simple platform-foundation inbox shell. In the platform phase (no Messaging feature yet) this shows a single-column list of messages from Heritage Virginia leadership (one-way broadcasts). Reuses components/message-row.html pattern. Full messaging feature (Pony Express, ADR 0018) is out of platform scope.

Key states: Empty (no messages), populated, unread badges.


P1 — Profile (Me hub) &ZeroWidthSpace;

AttributeValue
Route/app/profile
AccessSelf (all authenticated roles viewing their own profile)
Mockuppackages/ui/design-system/screens/web/profile.html (cleanup: remove feature tags)
Card namesProfile — Me · Web · Desktop, Profile — Me · Web · Tablet, Profile — Me · Web · Phone
ADOStory under Feature AB#3086

Purpose: The user's own profile hub. Shows avatar, display name, role, family group. Sub-nav rows: Edit profile (P2), Privacy & visibility (P3), Notification preferences (P4), About & Help (P5), Sign out (A6). Admin and minister also see portal links here (phone viewport) or in the sidebar (S1, desktop viewport).

Platform-only tags: No feature tags (no "Bible Study", no "Homeschool Co-op" — those are feature content, not platform). Role badge only.


P2 — Edit own profile &ZeroWidthSpace;

AttributeValue
Route/app/profile/edit
AccessSelf
Mockuppackages/ui/design-system/screens/web/profile-edit.html
Card namesProfile — Edit · Web · Desktop, Profile — Edit · Web · Tablet, Profile — Edit · Web · Phone
ADOStory under Feature AB#3086

Purpose: Edit display name, avatar, phone, address, birthday, anniversary, bio. Member edits their own fields only. PATCH /me/profile. Role and family composition are not editable here.


P3 — Privacy & visibility &ZeroWidthSpace;

AttributeValue
Route/app/profile/privacy
AccessSelf
Mockuppackages/ui/design-system/screens/web/profile-privacy.html
Card namesProfile — Privacy · Web · Desktop, Profile — Privacy · Web · Tablet, Profile — Privacy · Web · Phone
ADOStory under Feature AB#3086

Purpose: Control phonePublic (whether phone number appears to peer members) and any other member-controlled visibility toggles. PATCH /me/profile.


P4 — Notification preferences &ZeroWidthSpace;

AttributeValue
Route/app/profile/notifications
AccessSelf
Mockuppackages/ui/design-system/screens/web/profile-notifications.html
Card namesProfile — Notifications · Web · Desktop, Profile — Notifications · Web · Tablet, Profile — Notifications · Web · Phone
ADOStory under Feature AB#3086

Purpose: Toggle push, email, and SMS notification categories. Calls PATCH /me/notifications. Platform foundation: show the settings surface with stubs; full delivery via ADR 0013 (Twilio).


P5 — About & Help &ZeroWidthSpace;

AttributeValue
Route/app/about
AccessAll authenticated roles
Mockuppackages/ui/design-system/screens/web/about-help.html
Card namesAbout & Help · Web · Desktop, About & Help · Web · Tablet, About & Help · Web · Phone
ADOStory under Feature AB#3086

Purpose: Static page — Heritage Virginia contact info, app version, copyright, privacy policy link, terms of use link. No dynamic data. Accessed from P1.


F1 — Family management &ZeroWidthSpace;

AttributeValue
Route/app/family
AccessFamily head (primary account)
Mockuppackages/ui/design-system/screens/web/family.html (exists)
Card namesFamily · Web · Desktop, Family · Web · Tablet, Family · Web · Phone
ADOStory under Feature AB#3086

Purpose: Shows the family group: member list with relationship + status badges. Add spouse (→ F2) and Add child (→ F3) CTAs. Family composition changes route through the approval queue (ADR 0007). If no family group yet, shows a "not linked" placeholder.


F2 — Add spouse &ZeroWidthSpace;

AttributeValue
Route/app/family/add-spouse
AccessFamily head
Mockuppackages/ui/design-system/screens/web/family-add-spouse.html (exists)
Card namesFamily — Add Spouse · Web · Desktop, Family — Add Spouse · Web · Tablet, Family — Add Spouse · Web · Phone
ADOStory under Feature AB#3086

Purpose: Approval-gated spouse-invite form. Posts spouse-add to the approval workflow (ADR 0007). Shows pending state after submission.


F3 — Add child &ZeroWidthSpace;

AttributeValue
Route/app/family/add-child
AccessFamily head
Mockuppackages/ui/design-system/screens/web/family-add-child.html
Card namesFamily — Add Child · Web · Desktop, Family — Add Child · Web · Tablet, Family — Add Child · Web · Phone
ADOStory under Feature AB#3086

Purpose: Create a child sub-account (username + PIN — ADR 0007). Split from the inline Add Child form in family.html into its own screen. Posts to /family-groups/:id/children.


M1 — Members directory &ZeroWidthSpace;

AttributeValue
Route/app/members
AccessAll authenticated roles
Mockuppackages/ui/design-system/screens/web/members.html (rework: verify last-name sort + grouping)
Card namesMembers — Directory · Web · Desktop, Members — Directory · Web · Tablet, Members — Directory · Web · Phone
ADOStory under Members feature

Purpose: Full member directory. Sorted alphabetically by last name. Members of the same family grouped together under their family name. Search bar (?q=). Clicking a member navigates to M2 or M3 (replaces the inline toggleSelected panel). Children visible to admin/ministry_leader only.


M2 — Member detail (adult) &ZeroWidthSpace;

AttributeValue
Route/app/members/:id
AccessAll authenticated roles (403 for peer member viewing a child)
Mockuppackages/ui/design-system/screens/web/member-detail-adult.html
Card namesMembers — Detail (Adult) · Web · Desktop, Members — Detail (Adult) · Web · Tablet, Members — Detail (Adult) · Web · Phone
ADOStory AB#3693 (re-scoped)

Purpose: Full-page member detail for an adult. Shows birthday, anniversary (if married), address, phone, email. Same fields for all viewers. Admin and minister see a "Manage" button (→ M4 or M5). See ADR 0032 for the field model.


M3 — Member detail (kid) &ZeroWidthSpace;

AttributeValue
Route/app/members/:id (child account)
AccessAdmin, ministry_leader, family head; 403 for peer members
Mockuppackages/ui/design-system/screens/web/member-detail-kid.html
Card namesMembers — Detail (Kid) · Web · Desktop, Members — Detail (Kid) · Web · Tablet, Members — Detail (Kid) · Web · Phone
ADOTask under AB#3693

Purpose: Member detail for a child sub-account. Shows birthday only. No contact information. Same "Manage" button affordance for admin/minister navigates to M4/M5.


M4 — Member manage (admin) &ZeroWidthSpace;

AttributeValue
Route/app/members/:id/manage (admin role)
Accessadmin only
Mockuppackages/ui/design-system/screens/web/member-manage-admin.html
Card namesMembers — Manage (Admin) · Web · Desktop, Members — Manage (Admin) · Web · Tablet, Members — Manage (Admin) · Web · Phone
ADOTask under AB#3693

Purpose: Admin management screen for a specific member. Edit profile fields (any member); change account status (suspend/reactivate); change role (links to AD3 Role Assignment page); view audit log for this member. Server returns 403 for callers outside admin.


M5 — Member manage (minister) &ZeroWidthSpace;

AttributeValue
Route/app/members/:id/manage (ministry_leader role)
Accessministry_leader only
Mockuppackages/ui/design-system/screens/web/member-manage-minister.html
Card namesMembers — Manage (Minister) · Web · Desktop, Members — Manage (Minister) · Web · Tablet, Members — Manage (Minister) · Web · Phone
ADOTask under AB#3693

Purpose: Minister pastoral management screen for a specific member. Pastoral overview: family context, account type; initiate approval-queue actions. No write access to profile fields, status, or role. Server returns 403 for callers outside ministry_leader.


AD1 — Admin portal hub &ZeroWidthSpace;

AttributeValue
Route/app/admin
Accessadmin only
Mockuppackages/ui/design-system/screens/web/admin.html (exists)
Card namesAdmin — Hub · Web · Desktop, Admin — Hub · Web · Tablet, Admin — Hub · Web · Phone
ADOStory under Feature AB#3166

Purpose: Admin portal landing. Summary sections linking to AD2–AD5. Quick stats.


AD2 — Approval queue &ZeroWidthSpace;

AttributeValue
Route/app/admin/approvals
Accessadmin, ministry_leader
Mockuppackages/ui/design-system/screens/web/admin-approval-queue.html (exists)
Card namesAdmin — Approval Queue · Web · Desktop, Admin — Approval Queue · Web · Tablet, Admin — Approval Queue · Web · Phone
ADOStory under Feature AB#3166

Purpose: Queue of all pending approval items (member-join, spouse-add, child-add, content-publish). Filter pills by type. Approve/deny actions (ADR 0007).


AD3 — Role assignment &ZeroWidthSpace;

AttributeValue
Route/app/admin/roles
Accessadmin only
Mockuppackages/ui/design-system/screens/web/admin-role-assignment.html (exists)
Card namesAdmin — Role Assignment · Web · Desktop, Admin — Role Assignment · Web · Tablet, Admin — Role Assignment · Web · Phone
ADOStory under Feature AB#3166

Purpose: Search members, select a role, save. PUT /members/:id with role field. Admin-only.


AD4 — Content oversight &ZeroWidthSpace;

AttributeValue
Route/app/admin/content
Accessadmin, ministry_leader
Mockuppackages/ui/design-system/screens/web/admin-content-oversight.html (exists)
Card namesAdmin — Content Oversight · Web · Desktop, Admin — Content Oversight · Web · Tablet, Admin — Content Oversight · Web · Phone
ADOStory under Feature AB#3166

Purpose: Published announcements and pending content items. Withdraw or demote published content. Filter by type.


AD5 — Audit log &ZeroWidthSpace;

AttributeValue
Route/app/admin/audit-log
Accessadmin only
Mockuppackages/ui/design-system/screens/web/admin-audit-log.html (exists)
Card namesAdmin — Audit Log · Web · Desktop, Admin — Audit Log · Web · Tablet, Admin — Audit Log · Web · Phone
ADOStory under Feature AB#3166

Purpose: Cursor-paginated audit log (GET /admin/audit-log). Login/logout, approval actions, content events. Can be filtered to a specific member via ?memberId= (linked from M4).


MN1 — Minister portal hub &ZeroWidthSpace;

AttributeValue
Route/app/minister
Accessministry_leader
Mockuppackages/ui/design-system/screens/web/minister-portal.html (exists)
Card namesMinister — Hub · Web · Desktop, Minister — Hub · Web · Tablet, Minister — Hub · Web · Phone
ADOStory under Feature AB#3166

Purpose: Minister portal landing. Pending approvals summary, published announcements. Links to AD2 (Approval Queue, shared with admin) and MN2 (Oversight).


MN2 — Minister oversight &ZeroWidthSpace;

AttributeValue
Route/app/minister/oversight
Accessministry_leader
Mockuppackages/ui/design-system/screens/web/minister-oversight.html
Card namesMinister — Oversight · Web · Desktop, Minister — Oversight · Web · Tablet, Minister — Oversight · Web · Phone
ADOStory under Feature AB#3166

Purpose: Pastoral overview — family group list, pending pastoral items, member count by status. Read-only. Minister can navigate from here to individual member detail (→ M2/M3) and then to the minister management screen (→ M5) for specific members.


U1 — Not found / 404 &ZeroWidthSpace;

AttributeValue
Route* (catch-all)
AccessAll
Mockuppackages/ui/design-system/screens/web/system-404.html
Card namesSystem — 404 · Web · Desktop, System — 404 · Web · Tablet, System — 404 · Web · Phone
ADOStory under new system/utility feature

Purpose: Shown for unmatched routes and disabled feature routes that return nothing. Heritage Virginia branding, "Go home" CTA, no app chrome.


U2 — Access denied / 403 &ZeroWidthSpace;

AttributeValue
Route(rendered programmatically on 403 API response)
AccessAll
Mockuppackages/ui/design-system/screens/web/system-403.html
Card namesSystem — 403 · Web · Desktop, System — 403 · Web · Tablet, System — 403 · Web · Phone
ADOStory under new system/utility feature

Purpose: Shown when a user navigates to a role-restricted URL or the API returns 403. Explains access is restricted. "Go home" CTA.


U3 — Empty state (component) &ZeroWidthSpace;

AttributeValue
Route(component, not a route)
AccessAll
Mockuppackages/ui/design-system/components/empty-state.html
Card namesComponents — Empty State · Web · Desktop
ADOTask under AB#3237

Purpose: Reusable empty-state component with icon, heading, body text, optional CTA button. Used on MembersPage (no results), Messages (no messages), etc.


U4 — Loading / skeleton (component) &ZeroWidthSpace;

AttributeValue
Route(component, not a route)
AccessAll
Mockuppackages/ui/design-system/components/loading.html
Card namesComponents — Loading · Web · Desktop
ADOTask under AB#3237

Purpose: Skeleton loading state pattern for list and card surfaces. Used while API data is loading.


U5 — Error boundary &ZeroWidthSpace;

AttributeValue
Route(rendered by React error boundary)
AccessAll
Mockuppackages/ui/design-system/screens/web/system-error.html
Card namesSystem — Error · Web · Desktop, System — Error · Web · Tablet, System — Error · Web · Phone
ADOStory under new system/utility feature

Purpose: React error boundary catch-all. "Something went wrong" message with a "Reload" or "Go home" CTA. Heritage Virginia branding.


M6 — Export members to Excel/CSV (ROADMAP) &ZeroWidthSpace;

Status: ROADMAP — not built in platform phase.

Description: Allow admin to export the full member directory to Excel/CSV. Requires server-side generation and download link. Needs code and API work. Created as a Priority 4 ADO story (roadmap item) under the Members feature.

ADO: Roadmap story, Priority 4, tag roadmap, parent = Members feature.


Native app view catalog (designed in later phases) &ZeroWidthSpace;

All views A1–U5 apply to native app platforms. Designed in separate passes per platform:

  • iPhone / iPad: delivery phase per ADR 0009, Epic AB#3077.
  • Android: delivery phase per ADR 0014, Epic AB#3139.

Card naming for native: <Screen> · iPhone App, <Screen> · iPad App, <Screen> · Android App.


Code-readiness gaps &ZeroWidthSpace;

GapWorkADO
No feature registry codeBuild FeatureRegistryEntry in packages/shared-config; GET /config/features; Home gridAB#3692
No /app/members/:id or /manage routesAdd routes + MemberDetailPage + MemberManagePageAB#3693
No last-name sort / family grouping in MembersPageAdd sort + grouping; navigate on clickAB#3693
No real Home / Messages / Me hub routesAdd /app/home, /app/messages, /app/me; fix AppLayout tab mappingsAB#3090
RBAC nav unused (_showAdmin computed but not rendered)Render portal links; add isMinister; reconcile role utilsAB#3087 + AB#3166
Profile sub-views missingAdd P2–P5 routes + pagesAB#3086
No Tabs/SegmentedControl in @hch/uiAdd componentAB#3237
Token drift: #15803D not in tokens.tsCanonicalize success green in tokens.ts; update mockupsAB#3237
Profile feature tagsRemove "Bible Study" / "Homeschool Co-op" from profile.htmlAB#3086

Heritage Community Hub — Internal. Access restricted via Cloudflare Access + Entra ID.