Block Content
Type de ressource : Schéma Sanity (Array/Block)
Fichier source :apps/studio/schemaTypes/blockContent.ts
Statut : Actif
Slice : 2 (Blog)
Version : 1.0
1. Vue dâensemble (DOC)
Section titled â1. Vue dâensemble (DOC)â1.1. Description
Section titled â1.1. DescriptionâSchĂ©ma rĂ©utilisable pour le contenu riche en Portable Text. DĂ©finit les styles de blocs, les listes, les dĂ©corateurs de texte et les annotations (liens). UtilisĂ© par les schĂ©mas post et author.
1.2. Objectif
Section titled â1.2. Objectifâ- Fournir un format standardisĂ© pour le contenu riche
- Permettre lâĂ©dition de texte avec formatage (titres, listes, liens)
- Supporter lâinsertion dâimages dans le texte
- Ătre rĂ©utilisable dans plusieurs schĂ©mas
1.3. Cas dâusage
Section titled â1.3. Cas dâusageâ- RĂ©daction du corps des articles de blog
- RĂ©daction des biographies dâauteurs (version simplifiĂ©e inline)
- Tout contenu nécessitant du texte riche avec des liens
- Support des images insérées dans le texte
1.4. Relations avec dâautres schĂ©mas
Section titled â1.4. Relations avec dâautres schĂ©masâ| Relation | SchĂ©ma | Type | Description |
|---|---|---|---|
| Utilisé par | post |
Composition | Le champ body utilise le schéma blockContent |
| Utilisé par | author |
Composition (inline) | Le champ bio utilise une version simplifiée inline |
| Dépend de | Aucun | - | Schéma utilitaire indépendant |
2. Structure des données (DOC)
Section titled â2. Structure des donnĂ©es (DOC)â2.1. Styles de blocs disponibles
Section titled â2.1. Styles de blocs disponiblesâ| Style | Valeur | Description |
|---|---|---|
| Normal | normal |
Paragraphe normal |
| H1 | h1 |
Titre de niveau 1 |
| H2 | h2 |
Titre de niveau 2 |
| H3 | h3 |
Titre de niveau 3 |
| H4 | h4 |
Titre de niveau 4 |
| Quote | blockquote |
Citation |
2.2. Listes disponibles
Section titled â2.2. Listes disponiblesâ| Type | Valeur | Description |
|---|---|---|
| Bullet | bullet |
Liste Ă puces |
2.3. Décorateurs de texte (inline)
Section titled â2.3. DĂ©corateurs de texte (inline)â| DĂ©corateur | Valeur | Description |
|---|---|---|
| Strong | strong |
Texte en gras |
| Emphasis | em |
Texte en italique |
2.4. Annotations disponibles
Section titled â2.4. Annotations disponiblesâ| Annotation | Nom | Description |
|---|---|---|
| URL | link |
Lien hypertexte avec champ href |
2.5. Types de contenus additionnels
Section titled â2.5. Types de contenus additionnelsâ| Type | Description |
|---|---|
image |
Images pouvant ĂȘtre insĂ©rĂ©es dans le contenu avec hotspot activĂ© |
3. Contrats dâEntrĂ©e/Sortie (SPEC)
Section titled â3. Contrats dâEntrĂ©e/Sortie (SPEC)â3.1. Inputs (crĂ©ation/modification)
Section titled â3.1. Inputs (crĂ©ation/modification)â| Champ | Type | Validation | Description |
|---|---|---|---|
| Blocs de texte | array |
Aucune | Liste des blocs Portable Text |
| Images | array |
Aucune | Images insérées dans le contenu |
3.2. Outputs (structure du document)
Section titled â3.2. Outputs (structure du document)â| Champ | Type | Description |
|---|---|---|
_type |
string |
Type du bloc (block ou image) |
style |
string |
Style du bloc (normal, h1, h2, etc.) |
children |
array |
Contenu textuel du bloc |
markDefs |
array |
Définitions des annotations (liens) |
hotspot |
object |
Configuration du recadrage des images |
3.3. Ătats du document
Section titled â3.3. Ătats du documentâNon applicable - blockContent est un schĂ©ma de type array, pas un document.
4. Implémentation (CODE)
Section titled â4. ImplĂ©mentation (CODE)â4.1. Code du schĂ©ma
Section titled â4.1. Code du schĂ©maâimport {defineType, defineArrayMember} from 'sanity'
export default defineType({ title: 'Block Content', name: 'blockContent', type: 'array', of: [ defineArrayMember({ title: 'Block', type: 'block', styles: [ {title: 'Normal', value: 'normal'}, {title: 'H1', value: 'h1'}, {title: 'H2', value: 'h2'}, {title: 'H3', value: 'h3'}, {title: 'H4', value: 'h4'}, {title: 'Quote', value: 'blockquote'}, ], lists: [{title: 'Bullet', value: 'bullet'}], marks: { decorators: [ {title: 'Strong', value: 'strong'}, {title: 'Emphasis', value: 'em'}, ], annotations: [ { title: 'URL', name: 'link', type: 'object', fields: [ { title: 'URL', name: 'href', type: 'url', }, ], }, ], }, }), defineArrayMember({ type: 'image', options: {hotspot: true}, }), ],})4.2. RequĂȘtes GROQ associĂ©es
Section titled â4.2. RequĂȘtes GROQ associĂ©esâRequĂȘte principale (utilisation dans post)
Section titled âRequĂȘte principale (utilisation dans post)â*[_type == "post" && slug.current == $slug][0] { _id, title, body}4.3. Types TypeScript (gĂ©nĂ©ration automatique)
Section titled â4.3. Types TypeScript (gĂ©nĂ©ration automatique)âNon implĂ©mentĂ© - sanity-typegen nâest pas configurĂ© dans le projet actuel.
// Types à implémenter manuellement si nécessaireexport type PortableTextBlock = { _type: 'block'; style: 'normal' | 'h1' | 'h2' | 'h3' | 'h4' | 'blockquote'; children: Array<{ _type: 'span'; text: string; marks?: string[]; }>; markDefs?: Array<{ _type: 'link'; _key: string; href: string; }>;};
export type BlockContent = Array<PortableTextBlock | ImageAsset>;5. Tests attendus (TEST)
Section titled â5. Tests attendus (TEST)â5.1. Tests unitaires
Section titled â5.1. Tests unitairesâ| ScĂ©nario | Description | RĂ©sultat attendu |
|---|---|---|
| Styles de blocs | Créer un bloc avec style h1 | Bloc créé avec style h1 |
| Listes | Créer une liste à puces | Liste créée avec style bullet |
| Liens | Créer un lien avec annotation | Lien créé avec markDef href |
| Images | Insérer une image avec hotspot | Image insérée avec configuration hotspot |
5.2. Tests dâintĂ©gration
Section titled â5.2. Tests dâintĂ©grationâ| ScĂ©nario | DĂ©pendances | Description | RĂ©sultat attendu |
|---|---|---|---|
| Consommation post | Schéma post + blockContent | Créer un article avec body | Contenu Portable Text fonctionnel |
| Consommation author | Schéma author + blockContent inline | Créer une bio avec Portable Text | Contenu Portable Text simplifié fonctionnel |
| Rendu Astro | Route + PortableText component | Rendre le contenu Portable Text | Contenu rendu correctement |
5.3. Tests E2E
Section titled â5.3. Tests E2Eâ| ScĂ©nario | Parcours utilisateur | Description | RĂ©sultat attendu |
|---|---|---|---|
| Ădition â Rendu | Studio â Build â Site | Ăditer un article avec contenu riche | Contenu rendu correctement sur le site |
| Liens cliquables | Site â Navigation | Cliquer sur un lien dans le contenu | Navigation vers lâURL cible |
6. IntĂ©gration (INTĂG)
Section titled â6. IntĂ©gration (INTĂG)â6.1. IntĂ©gration avec les composants
Section titled â6.1. IntĂ©gration avec les composantsâ| Composant | Type | RĂŽle | MĂ©thode dâintĂ©gration |
|---|---|---|---|
| Schéma post | L1 | Champ body | Type blockContent |
| Schéma author | L1 | Champ bio (inline) | Version simplifiée inline de blockContent |
| PortableText component | L2 | Rendu du contenu | Utilisation de @portabletext/react (à implémenter) |
6.2. Points dâattention
Section titled â6.2. Points dâattentionâ- Ce schĂ©ma est rĂ©utilisable dans plusieurs autres schĂ©mas
- Les images insérées utilisent le hotspot pour le recadrage
- Les liens sont stockés comme annotations dans les markDefs
- Portable Text est le format standard de Sanity pour le contenu riche
- Nécessite @portabletext/react pour le rendu cÎté frontend (à implémenter)
- Dans
author, une version simplifiée inline est utilisée (style normal uniquement, pas de listes)
6.3. Vérification de cohérence
Section titled â6.3. VĂ©rification de cohĂ©renceâ- Le schĂ©ma ne casse aucun schĂ©ma existant
- Les styles de blocs sont correctement rendus
- Les liens fonctionnent correctement
- Les images sont affichées avec le bon recadrage
7. Sécurité
Section titled â7. SĂ©curitĂ©â7.1. MĂ©canismes de sĂ©curitĂ©
Section titled â7.1. MĂ©canismes de sĂ©curitĂ©â- â Les images sont stockĂ©es dans Sanity Asset API avec accĂšs contrĂŽlĂ©
- â Les URLs dans les liens sont validĂ©es par Sanity (type url)
- â Les permissions Sanity sont configurĂ©es par rĂŽle
7.2. Validation des entrées
Section titled â7.2. Validation des entrĂ©esâ- â Les URLs des liens sont validĂ©es automatiquement par Sanity
- â Les images sont validĂ©es lors de lâupload
8. Performance et limites
Section titled â8. Performance et limitesâ8.1. Limites Sanity
Section titled â8.1. Limites Sanityâ| Limite | Valeur | StratĂ©gie dâoptimisation |
|---|---|---|
| Taille du document | 16 MB | Ăviter les contenus trop volumineux |
| Profondeur des blocs | LimitĂ©e par lâĂ©diteur | Limiter les imbrications |
8.2. Optimisations appliquées
Section titled â8.2. Optimisations appliquĂ©esâ- â Utilisation de Portable Text (format optimisĂ© par Sanity)
- â Images optimisĂ©es via Sanity Asset API
9. Débogage et troubleshooting
Section titled â9. DĂ©bogage et troubleshootingâ9.1. ProblĂšmes courants
Section titled â9.1. ProblĂšmes courantsâ| SymptĂŽme | Cause probable | Solution |
|---|---|---|
| Styles non appliqués | Composant PortableText manquant | Installer @portabletext/react |
| Liens non cliquables | Annotation mal configurée | Vérifier la structure des markDefs |
| Images non affichĂ©es | Hotspot mal configurĂ© | VĂ©rifier la configuration de lâimage |
9.2. Commandes de debug
Section titled â9.2. Commandes de debugâ# Extraire le schĂ©ma depuis Sanitynpx sanity schema extract
# Générer les types TypeScript (à implémenter)npx sanity typegen generate10. Bonnes pratiques
Section titled â10. Bonnes pratiquesâ10.1. Architecture
Section titled â10.1. Architectureâ- â Utiliser @portabletext/react pour le rendu (Ă implĂ©menter)
- â Centraliser les composants de rendu Portable Text
- â Documenter les styles et annotations disponibles
10.2. Code
Section titled â10.2. Codeâ- â
Utiliser
defineArrayMemberpour chaque type de contenu - â Configurer les styles et annotations appropriĂ©s
- â Activer le hotspot pour les images
10.3. Maintenance
Section titled â10.3. Maintenanceâ- â Mettre Ă jour ce fichier lors de toute modification du schĂ©ma
- â Tester le rendu Portable Text aprĂšs modification
- â VĂ©rifier la compatibilitĂ© avec @portabletext/react
11. Ăvolutions et roadmap
Section titled â11. Ăvolutions et roadmapâ11.1. AmĂ©liorations planifiĂ©es
Section titled â11.1. AmĂ©liorations planifiĂ©esâ- ImplĂ©mentation de @portabletext/react pour le rendu
- Ajout de styles supplémentaires (ex: h5, h6)
- Ajout de types de listes (ex: numbered)
- Personnalisation des composants de rendu
11.2. Limitations connues
Section titled â11.2. Limitations connuesâ- â Portable Text nĂ©cessite une librairie de rendu spĂ©cifique
- â Les styles sont limitĂ©s Ă ceux configurĂ©s dans le schĂ©ma
- â La customisation visuelle nĂ©cessite du code custom
12. Ressources liées
Section titled â12. Ressources liĂ©esâ- Documentation Sanity : Portable Text
- Documentation Portable Text : @portabletext/react
- Schémas utilisant :
post,author - Pages Astro consommatrices :
apps/web/src/pages/blog/[...slug].astro - Composants dâaffichage : Potentiellement un composant PortableText personnalisĂ© (Ă implĂ©menter)
13. Historique des modifications
Section titled â13. Historique des modificationsâ| Date | Version | Description | Auteur |
|---|---|---|---|
| 2026-09-15 | 1.0 | Création initiale | Devin |