Structure du projet

Comprendre comment Starter Free est organisé afin que vous puissiez l'étendre sans casser son architecture.

Starter FreeMise à jour 14 octobre 2026
DémarrageStructure

Vue d’ensembleLien vers la section

Starter Free est structuré pour clarté et évolution à long terme.

Ce n'est pas un dossier de démo. C'est un architecture adaptées à la production conçu pour vous aider à étendre les fonctionnalités sans transformer les pages en fichiers volumineux et fragiles.

Comprendre la structure tôt vous aide à:

  • Étendre les fonctionnalités proprement
  • garder les routes lisibles
  • fil backend progressivement
  • éviter les refactors causés par des responsabilités mixtes

Idée clé

Vous n'apprenez pas seulement où vivent les fichiers. Vous apprenez comment l'architecture produit évolue d'une surface SaaS simulée à un produit réel.

Modèle mentalLien vers la section

Les pages définissent les routes. Les composants définissent les caractéristiques. UI définit les primitives.

CoucheResponsabilité
app/Routage, mises en page et points d'entrée des produits
components/Composition des caractéristiques et logique d'interaction
@pycolors/uiprimitives d'interface utilisateur stateless utilisées dans le produit

Règle du système

Gardez les pages minces. Lorsque la logique d'interaction se développe, déplacez-la dans un dossier de fonctionnalités.

Premiers points de personnalisationLien vers la section

Les chemins ici sont relatifs à votre paiement Starter Free. Dans la source monorepo, ce checkout est apps/starter-free; n'importez pas les paquets privés de monorepo dans le starter livré indépendamment.

FichierCommencez ici pour
app/layout.tsxNom de l'application, métadonnées de page et document racine
app/(app)/layout.tsxEn-tête d'application et shell de l'application
app/globals.cssStyles et tokens sémantiques pour les deux thèmes
lib/getting-started.tsLe contenu et les liens du guide d'information du tableau de bord
components/app/app-sidebar.tsxNavigation dans les applications de bureau

Gardez le bootstrap d'apparence et le contrôle de thème existant lors du changement de marque. Le guide du tableau de bord ne suit pas l'achèvement ou l'état du projet. Essayez le Workflow de première session avant de modifier la fonctionnalité du projet.

StructureLien vers la section

layout.tsx
globals.css
layout.tsx
layout.tsx
page.tsx
layout.tsx
project-provider.tsx
project-create-dialog.tsx
project-table.tsx
project-row-actions.tsx
project-rename-dialog.tsx
project-confirm-delete-dialog.tsx
project-types.ts
project-storage.ts
getting-started.ts
theme.ts

Cette structure est intentionnellement petite. Il sépare la propriété de la route de la composition des fonctionnalités.

Flux d'architectureLien vers la section

architecture-flow.txt
App Router pages
  ↓
Feature components
  ↓
PyColors UI primitives

Une page doit décrire la surface du produit. Les composants de fonctionnalité doivent posséder des interactions. Les primitives UI doivent rester réutilisables et apatrides.

Couche d'route

The route layer defines URLs, page structure, layout composition, and high-level orchestration.

Page structureLayoutsNavigationRoute composition

App directoryLien vers la section

Les app/ répertoire est la couche de routage. Les (app) Le groupe de routes fournit le shell d'application sans ajouter (app) à l'URL. Par exemple, app/(app)/projects/page.tsx sert /projects, et le niché [id]/page.tsx sert un ID de projet réel sélectionné dans la liste.

app/(app)/projects/layout.tsx monts ProjectProvider pour les routes de liste et de détail. Conservez cette limite partagée afin que la navigation ne crée pas un deuxième magasin de projets déconnecté. Le tableau de bord reste un composant serveur ; la page Projets existante et le fournisseur utilisent une limite client pour l'état local.

Il définit:

  • auth points d'entrée
  • pages de tableau de bord
  • routes des produits
  • paramètres et surfaces de facturation
  • composition de mise en page de haut niveau

Règle de la page

Une page devrait composer la fonctionnalité. Elle ne doit pas devenir la caractéristique elle-même.

Répertoire des composantsLien vers la section

Les components/ Le répertoire contient des blocs de construction au niveau des fonctionnalités.

Par exemple, la fonctionnalité de projets conserve son fournisseur local de navigateur, le rendu de table, les actions de ligne, les boîtes de dialogue et les types d'échantillons ensemble.

project-provider.tsx
project-create-dialog.tsx
project-table.tsx
project-row-actions.tsx
project-rename-dialog.tsx
project-confirm-delete-dialog.tsx
project-types.ts

Un extrait de composition ciblé de la page Projets transmet l'état actuel et les rappels à la table :

Project table composition (inside the existing Projects provider)
"use client";

import { ProjectTable } from "@/components/projects/project-table";
import { useProjects } from "@/components/projects/project-provider";

export function ProjectList() {
  const { projects, isLoading, renameProject, deleteProject } = useProjects();

  return (
    <ProjectTable
      projects={projects}
      isLoading={isLoading}
      onRename={renameProject}
      onDelete={deleteProject}
    />
  );
}

Cet extrait ne remplace pas la page complète. Conserver ses contrôles de création/réinitialisation, avis de stockage, liens de détails, et PageShell. Rendre un tel consommateur seulement en dessous de l'existant ProjectProvider; useProjects sortir de ce contexte. Réutilisez les boîtes de dialogue et les actions de ligne livrées au lieu de les remplacer par des composants réservés.

Fausse stratégie de donnéesLien vers la section

Les exemples de projet sont des données initiales / réinitialisées, pas la seule source de vérité après qu'un utilisateur modifie un projet. Le flux de courant est:

local-project-data-flow.txt
ProjectProvider
  -> read saved browser-local projects (or initial samples)
  -> expose projects, loading, storage notice, and mutation callbacks
  -> create / rename / delete -> update state and attempt localStorage write
  -> confirmed Reset demo -> replace local projects with original samples

components/projects/project-types.ts Possède le complet Project type et MOCK_PROJECTS. Réutilisez ce type au lieu de copier une interface réduite. components/projects/project-provider.tsx possède l'état de React et les mutations; lib/project-storage.ts possède la lecture / écriture des enregistrements de projet stockés.

Changement MOCK_PROJECTS ne remplace pas une collection de projets enregistrée valide. Utilisez la confirmation Réinitialiser démo action uniquement lorsque vous avez l'intention de rejeter les modifications locales. Les données enregistrées non valides reviennent à des échantillons avec un avis. Lorsque le stockage du navigateur n'est pas disponible, les modifications restent en mémoire pour la visite en cours uniquement. Il ne s'agit pas d'une base de données partagée, d'une authentification ou d'une synchronisation entre appareils.

Plus tard, remplacez cette limite de persistance locale du navigateur par vos propres opérations de projet de validation, d'autorisation et de sauvegarde de base de données côté serveur. Gardez les composants de présentation séparés de cette intégration spécifique au produit.

Modèle PageShellLien vers la section

Les pages SaaS principales utilisent un shell partagé pour une structure de page cohérente.

PageShell composition
import { PageShell } from "@/components/app/page-shell";

export function ReportsPreview() {
  return (
    <PageShell title="Reports" description="Explore your report layout.">
      <p>No reports yet.</p>
    </PageShell>
  );
}

Utilisez ce modèle pour conserver :

  • Espacement des pages cohérent
  • En-têtes prévisibles
  • actions alignées
  • Métadonnées structurées

Ne le contournez pas à moins que la page ait vraiment besoin d'une mise en page différente.

Dialog patternLien vers la section

Les boîtes de dialogue sont isolées de la page et contrôlées par leur fonction parent.

project-rename-dialog.tsx
project-confirm-delete-dialog.tsx

Propriété recommandée:

PréoccupationPropriétaire
État ouvertComposant de fonctionnalité parent
Interface utilisateur du formulaireComposant de boîte de dialogue
Appel API plus tardFonctionnalité / couche de service
primitive visuelle@pycolors/ui boîte dialogue

Cela rend les flux de renommage et de suppression plus faciles à câbler plus tard sans changer la structure de la page.

Ajouter une nouvelle fonctionnalitéLien vers la section

Commencez par une route statique dans le shell d'application existant. Ce sont de nouveaux fichiers d'exemple à créer dans votre copie du dépôt, pas des fichiers déjà inclus dans Free. Aucun backend ou modèle d'autorisation n'est introduit par cet exemple.

Ajouter l'routeLien vers la section

From the Starter Free checkout
mkdir -p 'app/(app)/reports' components/reports

Utilisez le chemin d'accès au groupe d'routes indiqué pour que la nouvelle page partage la disposition de l'application.

Créer le dossier des fonctionnalitésLien vers la section

Enregistrer ce composant dans components/reports/report-panel.tsx:

components/reports/report-panel.tsx
export function ReportPanel() {
  return <p>No reports yet. Connect your own report data when ready.</p>;
}

Composez la pageLien vers la section

Sauvegarder la route dans app/(app)/reports/page.tsx:

app/(app)/reports/page.tsx
import { PageShell } from "@/components/app/page-shell";
import { ReportPanel } from "@/components/reports/report-panel";

export default function ReportsPage() {
  return (
    <PageShell title="Reports" description="Your product reports.">
      <ReportPanel />
    </PageShell>
  );
}

Ouvrir /reports dans le starter de course. Les deux fichiers peuvent rester des composants de serveur ; ajoutez un panneau latéral client uniquement lorsque l'interaction réelle l'exige. Exécutez les contrôles dans les scripts de paquet de votre copie du dépôt avant de vous engager dans votre personnalisation.

Guide de décisionLien vers la section

Utilisez la structure Starter Free si :

  • vous voulez des fichiers de route minces
  • Les fonctionnalités doivent évoluer de manière indépendante
  • Les données simulées deviendront plus tard des données backend.
  • Les dialogues et les actions en ligne doivent rester réutilisables
  • vous voulez un chemin clair de la surface frontale au câblage de production

Évitez de modifier la structure si :

  • vous n'avez pas encore exploré la tranche verticale complète
  • le changement ne sauve que quelques lignes aujourd'hui
  • La route commencerait à posséder trop de logique
  • Les primitives de l'interface utilisateur commenceraient à récupérer des données
  • la couche simulée deviendrait dispersée globalement

Préférez

  • Dossiers basés sur les fonctionnalités
  • pages minces
  • Données simulées proches de la fonctionnalité
  • dialogues isolés et actions en ligne
  • Les primitives qui restent apatrides

Éviter

  • mettre la logique de fonctionnalité directement dans les pages
  • récupération de données dans les primitives de l'interface utilisateur
  • placer toutes les données simulées dans un fichier global
  • Dupliquer la logique de dialogue à travers les routes
  • supprimer la structure avant de la comprendre

Câblage backend plus tardLien vers la section

Lorsque vous connectez un backend, la structure reste familière.

Aujourd'huiPlus tard
Fournisseur de projet et stockage local de navigateurVos opérations de projet autorisées, soutenues par une base de données
État du dialogue localaction serveur ou mutation API
Portail de facturation désactivéPortail de facturation Stripe
écrans Auth simulésfournisseur d' Auth réel
membres statiquesMembres de l'organisation du backend

L'objectif est de réutiliser la présentation tout en implémentant une frontière de produit réelle, pas simplement remplacer un appel de base de données pour le stockage local. Starter Pro fournit des fondations connectées configurables, pas une migration automatique des projets Free. Réexamen Ce qui est inclus et les Guide de mise à niveau avant de planifier votre intégration.

Mise à niveau lorsque le câblage devient le bloqueur

Starter Free valide la surface du produit. Starter Pro relie la couche métier avec des fondations adaptées à la production, de facturation, de backend et de livraison. /docs/starter-pro

Questions courantesLien vers la section

Prochaines étapesLien vers la section