Prototype Shell
Technical documentation of the UI/UX structure, components, and naming conventions of our app prototype.
Architecture & File Structure
The prototype lives under /prototype/ in the App Router. All pages share the same layout with PhoneFrame, BottomNav, and state management via usePrototypeState.
apps/web/src/
├── app/[locale]/prototype/ # Page routes (19 pages)
│ ├── layout.tsx # PrototypeStateProvider + PhoneFrame
│ ├── page.tsx # Entry router (→ home or onboarding)
│ ├── onboarding/ # 5-step onboarding flow
│ ├── home/ # Home Feed
│ ├── explore/ # Explore + detail pages
│ ├── messages/ # Conversations
│ ├── dashboard/ # Host/Au Pair dashboard
│ ├── journey/ # Gamification journey
│ └── ...
├── components/
│ ├── prototype/ # 12 prototype-specific components
│ └── ui/ # 9 reusable UI primitives
├── hooks/
│ ├── use-prototype-state.tsx # 4-state context (localStorage)
│ └── use-perspective.tsx # au-pair | host-family (cookie)
└── lib/
└── prototype-mock-data.ts # Types + mock data collectionsPrototype States
The prototype has 4 states that control navigation, content, and visible features. State is persisted in localStorage.
Au Pair — Searching
ap-searching
Au Pair — Matched
ap-matched
Host Family — Searching
hf-searching
Host Family — Matched
hf-matched
const { state, setState, isAuPair, isHostFamily, isSearching, isMatched } = usePrototypeState();
// state: "ap-searching" | "ap-matched" | "hf-searching" | "hf-matched"
// Persisted in localStorage("aupairgo-prototype-state")Layout Shell
Responsive design: fullscreen on mobile, iPhone frame with state switcher on desktop.
Mobile (< sm) Desktop (>= sm) ┌────────────────┐ ┌─────────────────────────────────┐ │ Full-screen │ │ Backdrop (stone-900/60 blur) │ │ │ │ │ │ ┌────────────┐ │ │ ┌──────────┐ ┌────────────┐ │ │ │ ProtoHeader│ │ │ │ PhoneFrame│ │ State │ │ │ ├────────────┤ │ │ │ 390×844px │ │ Switcher │ │ │ │ │ │ │ │ │ │ │ │ │ │ Content │ │ │ │ Content │ │ ● ap-search│ │ │ │ (scroll) │ │ │ │ (scroll) │ │ ● ap-match │ │ │ │ │ │ │ │ │ │ ● hf-search│ │ │ ├────────────┤ │ │ ├───────────┤ │ ● hf-match │ │ │ │ BottomNav │ │ │ │ BottomNav │ └────────────┘ │ │ └────────────┘ │ │ └──────────┘ [✕] │ └────────────────┘ └─────────────────────────────────┘
Every page follows the same structure: Header → scrollable content → BottomNav.
// Every prototype page follows this pattern:
<div className="flex flex-1 flex-col overflow-hidden bg-stone-50">
<ProtoHeader title="..." showBack /> {/* or <HomeHeader /> */}
<div className="flex-1 overflow-y-auto">
{/* Page content */}
</div>
<BottomNav />
</div>Navigation
Dynamic bottom tabs change based on state. Additional pages are accessible via the More menu.
Bottom Tabs (state-dependent)
ap-searching
ap-matched
hf-searching
hf-matched
More Menu (always available)
Pages & Routes
19 pages organized in 5 categories: Entry, Main Tabs, More Menu, Actions, and Detail views.
| Route | Page | Category |
|---|---|---|
| /prototype | Entry Router | Entry |
| /prototype/onboarding | Onboarding | Entry |
| /prototype/[role]/searching/home | Home (Searching) | Main Tabs |
| /prototype/[role]/matched/home | Home (Matched) | Main Tabs |
| /prototype/[role]/searching/explore | Explore | Main Tabs |
| /prototype/[role]/searching/messages | Messages (Searching) | Main Tabs |
| /prototype/[role]/matched/messages | Messages (Matched) | Main Tabs |
| /prototype/[role]/matched/dashboard | Dashboard | Main Tabs |
| /prototype/[role]/matched/perks | Perks | Main Tabs |
| /prototype/[role]/searching/journey | Journey | More Menu |
| /prototype/[role]/learning | Learning | More Menu |
| /prototype/[role]/profile | Profile | More Menu |
| /prototype/[role]/settings | Settings | More Menu |
| /prototype/[role]/help | Help | More Menu |
| /prototype/[role]/create | Create Post | Actions |
| /prototype/[role]/notifications | Notifications | Actions |
| /prototype/[role]/favorites | Favorites | Actions |
| /prototype/[role]/explore/family/[id] | Family Detail | Detail |
| /prototype/[role]/explore/aupair/[id] | Au Pair Detail | Detail |
Prototype Components
12 specialized components for the prototype. All live under components/prototype/.
PhoneFrame
components/prototype/phone-frame.tsx
shell.shell.components.phoneFrame
BottomNav
components/prototype/bottom-nav.tsx
shell.shell.components.bottomNav
ProtoHeader
components/prototype/proto-header.tsx
shell.shell.components.protoHeader
HomeHeader
components/prototype/proto-header.tsx
shell.shell.components.homeHeader
PostCard
components/prototype/post-card.tsx
shell.shell.components.postCard
StoriesRow
components/prototype/stories-row.tsx
shell.shell.components.storiesRow
FamilyCard
components/prototype/family-card.tsx
shell.shell.components.familyCard
AuPairCard
components/prototype/aupair-card.tsx
shell.shell.components.auPairCard
MessagePreview
components/prototype/message-preview.tsx
shell.shell.components.messagePreview
NotificationItem
components/prototype/notification-item.tsx
shell.shell.components.notificationItem
FilterChips
components/prototype/filter-chips.tsx
shell.shell.components.filterChips
DashboardWidgets
components/prototype/dashboard-widgets.tsx
shell.shell.components.dashboardWidgets
UI Primitives
9 reusable base UI components based on Shadcn/Radix. Located under components/ui/.
Button
components/ui/
Badge
components/ui/
Card
components/ui/
Input
components/ui/
Textarea
components/ui/
Label
components/ui/
Avatar
components/ui/
SegmentedControl
components/ui/
Separator
components/ui/
Color Scheme
Data Model & Mock Data
All data comes from prototype-mock-data.ts. Defines types and static test data for the prototype.
MockUser
id, name, avatar, country, countryFlag, age, languages, bio, role, isOnline
MockFamily
id, name, location, children[], description, languages, rating, lookingFor
MockAuPairProfile
id, name, age, country, bio, languages, experience, interests, rating
MockPost
id, author, category, title, content, likes, comments, media[], timeAgo
MockConversation
id, participant, lastMessage, timeAgo, unread
MockNotification
id, type, user?, message, timeAgo, read
Post Categories
Internationalization
All texts are translated via next-intl. Prototype translations use the 'prototype.*' namespace in JSON files.
// Namespaces in messages/{locale}.json:
prototype.nav.* // Bottom nav labels
prototype.home.* // Home page
prototype.explore.* // Explore page
prototype.messages.* // Messages
prototype.dashboard.* // Dashboard
prototype.profile.* // Profile
prototype.journey.* // Journey (gamification)
prototype.learning.* // Learning
prototype.perks.* // Perks
prototype.create.* // Create post
prototype.notifications.* // Notifications
prototype.favorites.* // Favorites
prototype.settings.* // Settings
prototype.help.* // Help
prototype.onboarding.* // Onboarding flow
prototype.common.* // Shared labels (back, save, cancel...)
// 14 active locales:
de (default), en, es, fr, id, it, ka, nb, ne, nl, pt, th, uk, zh