6.6 KiB
6.6 KiB
Detailed Frontend Directory Structure
This document is a granulated shard from the main "5-front-end-architecture.md" focusing on "Detailed Frontend Directory Structure".
The BMad DiCaster frontend will adhere to the Next.js App Router conventions and build upon the structure provided by the Vercel/Supabase Next.js App Router template. The monorepo structure defined in the main Architecture Document (docs/architecture.md) already outlines the top-level directories. This section details the frontend-specific organization.
Naming Conventions Adopted:
- Directories:
kebab-case(e.g.,app/(web)/newsletter-list/,app/components/core/) - React Component Files (.tsx):
PascalCase.tsx(e.g.,NewsletterCard.tsx,PodcastPlayer.tsx). Next.js App Router special files (e.g.,page.tsx,layout.tsx,loading.tsx,global-error.tsx,not-found.tsx) retain their conventional lowercase or kebab-case names. - Non-Component TypeScript Files (.ts): Primarily
camelCase.ts(e.g.,utils.ts,uiSlice.ts). Configuration files (e.g.,tailwind.config.ts) and shared type definition files (e.g.,api-schemas.ts,domain-models.ts) may retainkebab-caseas per common practice or previous agreement.
{project-root}/
├── app/ # Next.js App Router (Frontend Pages, Layouts, API Routes)
│ ├── (web)/ # Group for user-facing web pages
│ │ ├── newsletters/ # Route group for newsletter features
│ │ │ ├── [newsletterId]/ # Dynamic route for individual newsletter detail
│ │ │ │ ├── page.tsx # Newsletter Detail Page component
│ │ │ │ └── loading.tsx # Optional: Loading UI for this route
│ │ │ ├── page.tsx # Newsletter List Page component
│ │ │ └── layout.tsx # Optional: Layout specific to /newsletters routes
│ │ ├── layout.tsx # Root layout for all (web) pages
│ │ └── page.tsx # Homepage (displays newsletter list)
│ ├── (api)/ # API route handlers (as defined in main architecture [cite: 82, 127, 130, 133])
│ │ ├── system/
│ │ │ └── ...
│ │ └── webhooks/
│ │ └── ...
│ ├── components/ # Application-specific UI React components (Core Logic)
│ │ ├── core/ # Core, reusable application components
│ │ │ ├── NewsletterCard.tsx
│ │ │ ├── PodcastPlayer.tsx
│ │ │ ├── DownloadButton.tsx
│ │ │ └── BackButton.tsx
│ │ └── layout/ # General layout components
│ │ └── PageWrapper.tsx # Consistent padding/max-width for pages
│ ├── auth/ # Auth-related pages and components (from template, MVP frontend is public)
│ ├── login/page.tsx # Login page (from template, MVP frontend is public)
│ └── global-error.tsx # Optional: Custom global error UI (Next.js special file)
│ └── not-found.tsx # Optional: Custom 404 page UI (Next.js special file)
│ ├── components/ # Shadcn UI components root (as configured by components.json [cite: 92])
│ │ └── ui/ # Base UI elements from Shadcn (e.g., Button.tsx, Card.tsx)
│ ├── lib/ # General utility functions for frontend [cite: 86, 309]
│ │ ├── utils.ts # General utility functions (date formatting, etc.)
│ │ └── hooks/ # Custom global React hooks
│ │ └── useScreenWidth.ts # Example custom hook
│ ├── store/ # Zustand state management
│ │ ├── index.ts # Main store setup/export (can be store.ts or index.ts)
│ │ └── slices/ # Individual state slices
│ │ └── podcastPlayerSlice.ts # State for the podcast player
│ ├── public/ # Static assets (images, favicon, etc.) [cite: 89]
│ │ └── logo.svg # Application logo (to be provided [cite: 379])
│ ├── shared/ # Shared code/types between frontend and Supabase functions [cite: 89, 97]
│ │ └── types/
│ │ ├── api-schemas.ts # Zod schemas for API req/res
│ │ └── domain-models.ts # Core entity types (HNPost, Newsletter, etc. from main arch)
│ ├── styles/ # Global styles [cite: 90]
│ │ └── globals.css # Tailwind base styles, custom global styles
│ ├── utils/ # Root utilities (from template [cite: 91])
│ │ └── supabase/ # Supabase helper functions FOR FRONTEND (from template [cite: 92, 309])
│ │ ├── client.ts # Client-side Supabase client
│ │ ├── middleware.ts # Logic for Next.js middleware (Supabase auth [cite: 92, 311])
│ │ └── server.ts # Server-side Supabase client
│ ├── tailwind.config.ts # Tailwind CSS configuration [cite: 93]
│ └── tsconfig.json # TypeScript configuration (includes path aliases like @/* [cite: 101])
Notes on Frontend Structure:
app/(web)/: Route group for user-facing pages.newsletters/page.tsx: Server Component for listing newsletters. [cite: 375, 573]newsletters/[newsletterId]/page.tsx: Server Component for displaying a single newsletter. [cite: 376, 576]
app/components/core/: Houses application-specific React components likeNewsletterCard.tsx,PodcastPlayer.tsx,DownloadButton.tsx,BackButton.tsx(identified inux-ui-spec.txt). Components followPascalCase.tsx.app/components/layout/: For structural layout components, e.g.,PageWrapper.tsx. Components followPascalCase.tsx.components/ui/: Standard directory for Shadcn UI components (e.g.,Button.tsx,Card.tsx).lib/hooks/: Custom React hooks (e.g.,useScreenWidth.ts), files followcamelCase.ts.store/slices/: Zustand state slices.podcastPlayerSlice.tsfor podcast player state. Files followcamelCase.ts.shared/types/: Type definitions.api-schemas.tsanddomain-models.tsusekebab-case.ts.utils/supabase/: Template-provided Supabase clients. Files followcamelCase.ts.- Path Aliases:
tsconfig.jsonuses@/*aliases. [cite: 98, 101]