Modèle de contenu et médias
Comment un site sépare les textes de la mise en page, ce que valident l’éditeur, l’API et les agents, et comment fonctionnent les médias.
Chaque site est un projet Astro qui stocke dans des fichiers de contenu typés ce que son propriétaire modifie, et garde la mise en page dans le code. Une page lit le contenu et le met en page. Elle ne contient jamais elle-même le nom de l’entreprise, un prix ou des horaires d’ouverture.
Le modèle de contenu est la liste de ces types de contenu et de leurs champs. Il est défini une seule fois dans le fichier src/content.config.ts du projet (un schéma Zod par type). À chaque compilation, il est exporté sous forme de schémas JSON, et l’éditeur, l’API REST, MCP et la CLI valident chaque modification à partir de ces schémas. Toute valeur non conforme est refusée avec le nom du champ, et rien n’est enregistré.
Le modèle provient de la dernière compilation. Compilez le site une fois avant de consulter son modèle de contenu.
Collections et éléments uniques
Une collection contient plusieurs entrées, chacune dans son propre fichier. Le nom du fichier est le slug de l’entrée : lettres minuscules, chiffres et traits d’union. Un élément unique est un document JSON stocké à un chemin fixe.
Le modèle de départ Atelier201 comprend les éléments suivants :
| Nom | Type | Contenu |
|---|---|---|
business | élément unique | Nom, slogan, description, téléphone, e-mail, adresse, horaires d’ouverture, réseaux sociaux, mentions légales, liens de réservation et de carte, et langue du site |
theme | élément unique | Quatre couleurs de marque, rayon des angles, paire de polices et mode clair, sombre ou automatique |
navigation | élément unique | Liens de l’en-tête, liens du pied de page et bouton d’appel à l’action |
integrations | élément unique | Identifiant Google Analytics, domaine Plausible et code ajouté dans l’en-tête ou à la fin du corps de page |
services | collection, JSON | Services avec nom, description, prix, ordre et image |
blog | collection, Markdown | Articles avec titre, description, date, auteur, image de couverture, tags, services associés (relation vers services par slug) et indicateur de brouillon |
Le modèle de départ est une structure de base : il inclut ces deux collections à titre d’exemple et ne présume rien de l’activité. Un site supprime celles dont il n’a pas besoin et ajoute les siennes (une équipe, un menu, des événements).
Une collection de contenu utilise Markdown : des champs dans le front matter et un corps de texte. Une collection de données utilise JSON et n’a pas de corps de texte.
Toute nouvelle entrée créée via l’API ou MCP est d’abord un brouillon si sa collection comporte un champ de brouillon. Une personne décide ainsi de sa publication.
Modifier le contenu sans casser la mise en page
Pour modifier des textes, des entrées et les informations de l’entreprise, privilégiez les appels dédiés au contenu plutôt que la modification directe des fichiers :
| Tâche | REST | MCP | CLI |
|---|---|---|---|
| Lire le modèle | Lire le modèle de contenu | get_content_model | atelier201 content model |
| Enregistrer une entrée | Créer ou mettre à jour une entrée | save_entry | atelier201 content save |
| Modifier un texte | Modifier un champ | set_field | atelier201 content set |
Utilisez les appels aux fichiers uniquement pour modifier le code : une mise en page, un composant ou le modèle de contenu lui-même. Pour ajouter un champ, ajoutez-le dans src/content.config.ts avec .default() ou .optional() afin que les entrées existantes restent valides.
Modification directe : data-atelier201-field
Le propriétaire clique sur un court texte de la page et le modifie directement. C’est possible parce que le texte contient l’adresse du champ dont il provient :
<h1 data-atelier201-field="business:/name">Morning Crumb Bakery</h1>
<time data-atelier201-field="business:/hours/2/close">15:00</time>L’adresse suit le format <singleton>:<JSON pointer> : business, theme ou
navigation, suivi de deux-points puis d’un pointeur RFC 6901 vers l’intérieur du fichier de cet élément unique. La même adresse fonctionne avec set_field et atelier201 content set.
Respectez ces règles lorsque vous modifiez un composant :
- Placez l’attribut sur un élément dont le texte entier correspond exactement au champ, sans aucun autre contenu. Atelier201 remplace le texte de l’élément. Pour « Appelez-nous : 555 0100 », placez uniquement le numéro dans un
span. - Déplacez l’attribut avec l’élément lorsque vous en modifiez le style, et ajoutez-le partout où vous affichez un champ d’élément unique à un nouvel endroit.
- Ne l’ajoutez pas à un texte composé de plusieurs champs, à un texte transformé (une date mise en forme), à un corps Markdown ou à des entrées de collection. Une entrée affichée sur une page conserve plutôt
data-atelier201-entry="<collection>/<slug>"sur son conteneur.
Le site reste statique
Un site conçu pour Atelier201 est un site Astro statique : sans adaptateur serveur, rendu côté serveur, framework côté client ni requête vers une autre origine à l’exécution (y compris pour les polices, les balises d’analyse d’audience et les cartes intégrées). Il utilise une seule langue, définie dans business.locale. Ses dépendances sont astro et @astrojs/mdx (désactivé jusqu’à l’ajout de mdx() à la configuration), car la compilation s’effectue sans accès au réseau. Le fichier AGENTS.md du modèle de départ répertorie ces règles pour tout agent qui modifie le code.
Médias
Importez une image, un PDF ou une courte vidéo sur le site, puis référencez-la sous la forme /media/<filename> dans le contenu, par exemple dans le champ coverImage d’un article de blog.
- Chaque fichier peut peser jusqu’à 20 MB. Avec MCP, les fichiers importés sont encodés en base64 et limités à 5 MB.
- Ajoutez un texte
altà chaque image pour les personnes qui ne peuvent pas la voir. - Les médias sont déduits de l’espace de stockage du forfait : 100 MB sur un brouillon et 5 GB sur un Site.
- Tout fichier importé est pris en compte à partir de la prochaine compilation. La suppression d’un fichier le retire des compilations suivantes. Les compilations déjà publiées en conservent une copie jusqu’à leur remplacement par une nouvelle publication.