
# Collections et markdown

Trois propriétés transforment une définition de page unique en plusieurs routes, ou remplacent l'arbre de composants par de la prose : `collection` se déploie sur les enregistrements d'une table, `markdown` rend un corps depuis un fichier, et `contentDir` se déploie sur un répertoire de fichiers.

## `collection`

Un bloc `collection` génère une route par enregistrement. Le `path` de la page doit porter un segment dynamique, et `slugField` nomme le champ dont la valeur le remplit.

| Propriété   | Description                                                     |
| ----------- | --------------------------------------------------------------- |
| `table`     | **Obligatoire.** Table à partir de laquelle générer les pages.  |
| `slugField` | **Obligatoire.** Champ dont la valeur devient le segment d'URL. |
| `filter`    | Conditions limitant quels enregistrements génèrent une page.    |

```yaml
pages:
  - name: Blog Post
    path: /blog/:slug
    collection:
      table: posts
      slugField: slug
      filter:
        - { field: published, operator: eq, value: true }
    rss: { limit: 20 }
    components:
      - { type: text, tag: h1, content: '$record.title' }
      - { type: text, content: '$record.body', props: { format: markdown } }
```

L'enregistrement généré est exposé comme `$record.*` à tout l'arbre, `meta` compris — le SEO par enregistrement est donc gratuit. Une URL ne correspondant à aucun enregistrement renvoie `404`.

## `markdown`

Rend le corps de la page depuis du markdown plutôt que depuis des composants.

| Propriété | Description                                                                                  |
| --------- | -------------------------------------------------------------------------------------------- |
| `content` | Chaîne markdown inline.                                                                      |
| `file`    | Chemin vers un fichier markdown, résolu depuis la racine du projet. Exclusif avec `content`. |
| `layout`  | Style d'encadrement : `prose` (défaut), `docs`, `full` ou `none`.                            |
| `toc`     | Table des matières — `true`, ou `{ maxDepth, position }`.                                    |

`toc.maxDepth` va de 1 à 6 ; `toc.position` vaut `top` ou `sidebar`.

```yaml
pages:
  - name: Docs Home
    path: /docs
    markdown:
      file: content/docs/home.md
      layout: docs
      toc: { maxDepth: 3, position: sidebar }
```

Le frontmatter YAML placé entre les délimiteurs `---` est analysé et exposé comme `$frontmatter.*`, utilisable dans `meta` et les propriétés frères. Le HTML markdown rendu est assaini, de façon cohérente avec les composants de contenu `text` et `alert`.

## `contentDir`

`contentDir` est une propriété **de page**. Elle déploie une définition de page unique sur chaque fichier markdown d'un répertoire et dérive une barre latérale de navigation depuis leur frontmatter — c'est ainsi que cette documentation est construite.

| Propriété          | Description                                                                                    |
| ------------------ | ---------------------------------------------------------------------------------------------- |
| `directory`        | **Obligatoire.** Répertoire contenant les fichiers markdown.                                   |
| `slugFrom`         | **Obligatoire.** Dérive le slug depuis `filename` ou `filepath`.                               |
| `include`          | Motif glob filtrant les fichiers pris en compte, p. ex. `*.md`.                                |
| `index`            | Slug servi au chemin de base de la collection, ce qui en fait la porte d'entrée de la section. |
| `sort`             | `{ field, order }` — ordonne les entrées par un champ de frontmatter, `asc` ou `desc`.         |
| `filter`           | Conditions clé/valeur sur le frontmatter restreignant quels fichiers deviennent des pages.     |
| `nav`              | Barre latérale dérivée de la collection (voir ci-dessous).                                     |
| `editUrl`          | Modèle de lien « modifier cette page ». `{lang}` et `{slug}` sont interpolés.                  |
| `issueUrl`         | Modèle de lien « signaler un problème ».                                                       |
| `contributionNote` | Texte rendu dans le pied de page de contribution.                                              |

`nav` accepte `enabled`, `groupBy` (la clé de frontmatter qui regroupe les articles en sections de barre latérale), `labelFrom` (la clé fournissant le libellé de chaque lien), ainsi que `groupLabels`, `groupIcons`, `collapsed` et `tabs` pour la présentation.

```yaml
pages:
  - name: docs
    path: /docs/:slug
    contentDir:
      directory: content/docs
      slugFrom: filename
      include: '*.md'
      index: introduction
      sort: { field: order, order: asc }
      nav: { enabled: true, groupBy: section, labelFrom: sidebarLabel }
    markdown:
      layout: docs
      toc: { maxDepth: 3, position: sidebar }
    components:
      - { type: container, element: header }
```

:::callout
**`contentDir` n'est pas une source de composant.** Elle se place à côté de `components` sur la page, pas à l'intérieur d'un composant. Le bloc `markdown` de la page met ensuite en forme chaque article généré — une seule décision de `layout` et de `toc` couvre tout le répertoire.
:::

## Pages connexes

- [Présentation des pages](/fr/docs/pages-overview) — le tableau complet des propriétés de page.
- [Routage et chemins](/fr/docs/pages-routing) — le segment dynamique qu'une collection remplit.
- [SEO et métadonnées](/fr/docs/seo-meta) — métadonnées par enregistrement et par article.
- [Composants de contenu](/fr/docs/content-components) — les fragments markdown inline.
- [llms.txt](/fr/docs/llms-txt) — l'index lisible par machine dérivé des répertoires de contenu.
