# Cachet Peintres Décorateurs — Site Web Site vitrine statique pour **Cachet Peintres Décorateurs** (9500-5609 Québec Inc). Construit avec **Astro v5 + Tailwind v4 + Decap CMS**, déployé sur **Cloudflare Pages**. ## Stack | Technologie | Rôle | |---|---| | Astro v5 | Framework SSG (zéro JS par défaut) | | Tailwind v4 | CSS utility-first (config par `@theme` dans global.css) | | Decap CMS | Interface d'édition de contenu (via `/admin/`) | | Cloudflare Pages | Hébergement statique + CDN global | | Cloudflare Functions | Traitement du formulaire de soumission | | Resend | Envoi de courriel via API | ## Prérequis - Node.js ≥ 18 - npm ≥ 9 ## Installation locale ```bash cd cachetdeco npm install npm run dev ``` Ouvre [http://localhost:4321](http://localhost:4321) dans le navigateur. ## Structure du projet ``` cachetdeco/ ├── public/ │ ├── admin/ # Decap CMS (index.html + config.yml) │ ├── fonts/ # Polices Cocogoose & Geoform │ ├── images/ # Images statiques (logo, uploads CMS) │ ├── favicon.svg │ └── robots.txt ├── functions/ │ └── api/ │ └── soumission.ts # Cloudflare Pages Function → Resend API ├── src/ │ ├── i18n/ # Infrastructure i18n │ │ ├── config.ts # Locales et routes │ │ ├── ui.ts # Traductions FR │ │ └── utils.ts # Fonctions getLangFromUrl() et t() │ ├── components/ # Composants Astro réutilisables │ ├── content/ # Contenu géré par CMS │ │ ├── services/fr/ # Services en markdown │ │ └── settings/ # general.json et seo.json │ ├── content.config.ts # Définitions des collections (Astro v5) │ ├── layouts/ │ │ └── BaseLayout.astro │ ├── pages/ # Pages Astro (routes) │ └── styles/ │ └── global.css # Tailwind + @theme brand tokens ├── astro.config.mjs ├── tsconfig.json ├── .env.example └── package.json ``` ## Variables d'environnement Copiez `.env.example` en `.env` pour le développement local : ```bash cp .env.example .env ``` | Variable | Description | Où la configurer | |---|---|---| | `RESEND_API_KEY` | Clé API Resend (envoi de courriels) | Cloudflare Pages > Settings > Environment variables | | `CONTACT_EMAIL` | Adresse de destination des soumissions | Cloudflare Pages > Settings > Environment variables | > **Note :** Ces variables NE doivent PAS être dans le code source. Elles sont injectées au runtime par Cloudflare Pages Functions. ## Déploiement sur Cloudflare Pages 1. Créez un dépôt GitHub et poussez le code 2. Dans Cloudflare Pages, créez un nouveau projet connecté à ce dépôt 3. Configurez : - **Build command :** `npm run build` - **Build output directory :** `dist` - **Node.js version :** 18 4. Ajoutez les variables d'environnement (`RESEND_API_KEY`, `CONTACT_EMAIL`) 5. Déclenchez un déploiement Les fonctions dans `functions/` sont automatiquement déployées comme Cloudflare Pages Functions. ## Gestion du contenu (Decap CMS) ### Configuration initiale 1. Créez un **GitHub OAuth App** : - GitHub > Settings > Developer settings > OAuth Apps > New OAuth App - Homepage URL : `https://cachetdeco.com` - Authorization callback URL : `https://cachetdeco.com/admin/` - Notez le **Client ID** 2. Modifiez `public/admin/config.yml` : ```yaml backend: name: github repo: your-org/cachetdeco # Remplacez par votre dépôt branch: main auth_type: pkce app_id: YOUR_GITHUB_OAUTH_APP_CLIENT_ID # Remplacez par votre Client ID ``` 3. Accédez à `https://cachetdeco.com/admin/` et connectez-vous avec GitHub ### Flux de publication ``` Éditeur → Decap CMS (/admin/) → Commit GitHub → Webhook → Cloudflare Pages Build → Site mis à jour ``` Le délai de publication est d'environ **1–2 minutes** après une modification. ### Collections disponibles | Collection | Chemin | Description | |---|---|---| | Services | `src/content/services/fr/*.md` | Pages de services (markdown) | | Paramètres généraux | `src/content/settings/general.json` | Nom, téléphone, courriel, adresse | | Paramètres SEO | `src/content/settings/seo.json` | Titre, description, mots-clés par défaut | ## Branding ### Palette de couleurs | Token | Valeur | Usage | |---|---|---| | `--color-brand-600` | `#314732` | CTA, boutons principaux, titres | | `--color-brand-700` | `#263a27` | Hover state | | `--color-brand-400` | `#7a8876` | Accents, bordures | | `--color-brand-50` | `#f0f4ef` | Fonds de section | | `--color-gray-dark` | `#444445` | Texte courant | | `--color-gray-light` | `#b7b6b6` | Texte secondaire, placeholders | ### Typographie - **Cocogoose Medium** — titres et en-têtes (`font-family: var(--font-display)`) - **Geoform Bold** — corps de texte et sous-titres (`font-family: var(--font-body)`) ## i18n — Ajouter l'anglais plus tard Quand le client souhaite une version anglaise, voici les étapes : 1. Ajoutez `'en'` dans `src/i18n/config.ts` : ```ts export const locales = ['fr', 'en'] as const; export const routes = { services: { fr: 'services', en: 'services' }, contact: { fr: 'contact', en: 'contact' }, soumission: { fr: 'soumission', en: 'quote' }, }; ``` 2. Ajoutez `'en'` dans `astro.config.mjs` : ```js i18n: { locales: ['fr', 'en'], ... } ``` 3. Traduisez toutes les clés dans `src/i18n/ui.ts` (section `en: { ... }`) 4. Créez `src/pages/en/` avec les 4 fichiers de page (ils importent les mêmes composants) 5. Ajoutez `en` dans `public/admin/config.yml` sous `i18n.locales` 6. Décommentez le composant `LanguagePicker` dans `Header.astro` Aucune refactorisation structurelle n'est nécessaire — l'infrastructure est déjà en place. ## Mentions légales obligatoires Conformément aux exigences légales québécoises, les informations suivantes doivent apparaître visiblement sur le site : - **Raison sociale :** 9500-5609 Québec Inc - **Numéro RBQ :** 5839 8736 01 (obligatoire pour tout service nécessitant une modification d'un bâtiment) Ces informations sont affichées dans le footer de chaque page. ## Commandes disponibles ```bash npm run dev # Serveur de développement local (http://localhost:4321) npm run build # Build de production (dans dist/) npm run preview # Prévisualisation du build de production ```