Skip to content

Type de ressource : Schéma Sanity (Array/Block)
Fichier source : apps/studio/schemaTypes/blockContent.ts
Statut : Actif
Slice : 2 (Blog)
Version : 1.0


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.

  • 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
  • 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
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

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
Type Valeur Description
Bullet bullet Liste Ă  puces
Décorateur Valeur Description
Strong strong Texte en gras
Emphasis em Texte en italique
Annotation Nom Description
URL link Lien hypertexte avec champ href
Type Description
image Images pouvant ĂȘtre insĂ©rĂ©es dans le contenu avec hotspot activĂ©

Champ Type Validation Description
Blocs de texte array Aucune Liste des blocs Portable Text
Images array Aucune Images insérées dans le contenu
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

Non applicable - blockContent est un schéma de type array, pas un document.


apps/studio/schemaTypes/blockContent.ts
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},
}),
],
})
*[_type == "post" && slug.current == $slug][0] {
_id,
title,
body
}

Non implĂ©mentĂ© - sanity-typegen n’est pas configurĂ© dans le projet actuel.

// Types à implémenter manuellement si nécessaire
export 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>;

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
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
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

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)
  • 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)
  • 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

  • ✅ 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
  • ✅ Les URLs des liens sont validĂ©es automatiquement par Sanity
  • ✅ Les images sont validĂ©es lors de l’upload

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
  • ✅ Utilisation de Portable Text (format optimisĂ© par Sanity)
  • ✅ Images optimisĂ©es via Sanity Asset API

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
Terminal window
# Extraire le schéma depuis Sanity
npx sanity schema extract
# Générer les types TypeScript (à implémenter)
npx sanity typegen generate

  • ✅ Utiliser @portabletext/react pour le rendu (Ă  implĂ©menter)
  • ✅ Centraliser les composants de rendu Portable Text
  • ✅ Documenter les styles et annotations disponibles
  • ✅ Utiliser defineArrayMember pour chaque type de contenu
  • ✅ Configurer les styles et annotations appropriĂ©s
  • ✅ Activer le hotspot pour les images
  • ✅ 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

  • 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
  • ❌ 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

  • 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)

Date Version Description Auteur
2026-09-15 1.0 Création initiale Devin
Edit page

Last updated: