@fraza/core 0.3.7 → 0.3.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +4 -0
  3. package/THIRD-PARTY-NOTICES.md +2 -2
  4. package/changelog.json +61 -0
  5. package/dist/docs/00-decouverte/01-qu-est-ce-que-fraza.md +1 -1
  6. package/dist/docs/01-demarrage/01-installation.md +9 -15
  7. package/dist/docs/01-demarrage/02-tour-du-proprietaire.md +1 -1
  8. package/dist/docs/01-demarrage/03-configuration.md +1 -1
  9. package/dist/docs/02-guides/accepter-des-paiements.md +1 -1
  10. package/dist/docs/02-guides/basculer-sur-le-registre-de-secours.md +3 -3
  11. package/dist/docs/02-guides/blocs-personnalises.md +1 -1
  12. package/dist/docs/02-guides/gerer-les-medias.md +1 -1
  13. package/dist/docs/02-guides/index.md +1 -1
  14. package/dist/docs/02-guides/seo-et-metadonnees.md +1 -1
  15. package/dist/docs/03-reference/01-cores/templates.md +3 -3
  16. package/dist/docs/03-reference/03-registres/media-registry.md +4 -4
  17. package/dist/docs/03-reference/05-cli/fraza-key.md +1 -1
  18. package/dist/docs/03-reference/06-configuration/paquets-supportes.md +1 -1
  19. package/dist/docs/03-reference/06-configuration/variables-d-environnement.md +2 -2
  20. package/dist/docs/04-architecture/02-frontieres-serveur-client.md +1 -1
  21. package/dist/docs/04-architecture/05-securite.md +1 -1
  22. package/dist/docs/04-architecture/07-licence-et-propriete.md +1 -1
  23. package/dist/docs/05-contribution/03-redaction.md +10 -0
  24. package/dist/docs/05-contribution/05-publication.md +0 -1
  25. package/dist/docs/06-modules/booking/{installation.md → 01-installation.md} +35 -20
  26. package/dist/docs/06-modules/booking/{configuration.md → 02-configuration.md} +5 -5
  27. package/dist/docs/06-modules/booking/{admin.md → 03-admin.md} +3 -3
  28. package/dist/docs/06-modules/booking/{reservation-en-ligne.md → 04-reservation-en-ligne.md} +2 -2
  29. package/dist/docs/06-modules/booking/{courriels.md → 05-courriels.md} +2 -2
  30. package/dist/docs/06-modules/booking/{modele-de-donnees.md → 06-modele-de-donnees.md} +1 -1
  31. package/dist/docs/06-modules/booking/{api.md → 07-api.md} +2 -2
  32. package/dist/docs/06-modules/booking/index.md +22 -12
  33. package/dist/docs/06-modules/drive/01-installation.md +92 -0
  34. package/dist/docs/06-modules/drive/{configuration.md → 02-configuration.md} +5 -5
  35. package/dist/docs/06-modules/drive/{admin.md → 03-admin.md} +8 -8
  36. package/dist/docs/06-modules/drive/{partages.md → 04-partages.md} +5 -5
  37. package/dist/docs/06-modules/drive/{fichiers.md → 05-fichiers.md} +4 -4
  38. package/dist/docs/06-modules/drive/{modele-de-donnees.md → 06-modele-de-donnees.md} +2 -2
  39. package/dist/docs/06-modules/drive/{api.md → 07-api.md} +5 -5
  40. package/dist/docs/06-modules/drive/index.md +22 -12
  41. package/dist/docs/06-modules/facturation/{installation.md → 01-installation.md} +61 -39
  42. package/dist/docs/06-modules/facturation/{configuration.md → 02-configuration.md} +5 -5
  43. package/dist/docs/06-modules/facturation/{facturation.md → 03-facturation.md} +4 -4
  44. package/dist/docs/06-modules/facturation/{taxes.md → 04-taxes.md} +2 -2
  45. package/dist/docs/06-modules/facturation/{paiements.md → 05-paiements.md} +3 -3
  46. package/dist/docs/06-modules/facturation/{recurrences-et-rappels.md → 06-recurrences-et-rappels.md} +4 -4
  47. package/dist/docs/06-modules/facturation/{courriels.md → 07-courriels.md} +5 -5
  48. package/dist/docs/06-modules/facturation/{modele-de-donnees.md → 08-modele-de-donnees.md} +2 -2
  49. package/dist/docs/06-modules/facturation/{api.md → 09-api.md} +3 -3
  50. package/dist/docs/06-modules/facturation/index.md +26 -16
  51. package/dist/docs/06-modules/forms/{installation.md → 01-installation.md} +25 -30
  52. package/dist/docs/06-modules/forms/{configuration.md → 02-configuration.md} +4 -4
  53. package/dist/docs/06-modules/forms/{champs.md → 03-champs.md} +4 -4
  54. package/dist/docs/06-modules/forms/{admin.md → 04-admin.md} +9 -9
  55. package/dist/docs/06-modules/forms/{soumissions.md → 05-soumissions.md} +7 -7
  56. package/dist/docs/06-modules/forms/{affichage.md → 06-affichage.md} +3 -3
  57. package/dist/docs/06-modules/forms/{modele-de-donnees.md → 07-modele-de-donnees.md} +3 -3
  58. package/dist/docs/06-modules/forms/{api.md → 08-api.md} +4 -4
  59. package/dist/docs/06-modules/forms/index.md +26 -14
  60. package/dist/docs/06-modules/index.md +2 -2
  61. package/dist/docs/06-modules/medias/{installation.md → 01-installation.md} +33 -36
  62. package/dist/docs/06-modules/medias/{configuration.md → 02-configuration.md} +5 -5
  63. package/dist/docs/06-modules/medias/{televersement.md → 03-televersement.md} +4 -4
  64. package/dist/docs/06-modules/medias/{admin.md → 04-admin.md} +7 -7
  65. package/dist/docs/06-modules/medias/{modele-de-donnees.md → 06-modele-de-donnees.md} +4 -4
  66. package/dist/docs/06-modules/medias/{api.md → 07-api.md} +6 -6
  67. package/dist/docs/06-modules/medias/index.md +25 -13
  68. package/dist/docs/06-modules/pages/{installation.md → 01-installation.md} +15 -17
  69. package/dist/docs/06-modules/pages/{configuration.md → 02-configuration.md} +1 -1
  70. package/dist/docs/06-modules/pages/{admin.md → 03-admin.md} +6 -6
  71. package/dist/docs/06-modules/pages/{modele-de-donnees.md → 04-modele-de-donnees.md} +2 -2
  72. package/dist/docs/06-modules/pages/{templates.md → 05-templates.md} +1 -1
  73. package/dist/docs/06-modules/pages/{api.md → 06-api.md} +2 -2
  74. package/dist/docs/06-modules/pages/index.md +21 -9
  75. package/dist/docs/06-modules/posts/{installation.md → 01-installation.md} +28 -34
  76. package/dist/docs/06-modules/posts/{configuration.md → 02-configuration.md} +6 -6
  77. package/dist/docs/06-modules/posts/{types-et-champs.md → 03-types-et-champs.md} +11 -11
  78. package/dist/docs/06-modules/posts/{taxonomies-et-relations.md → 04-taxonomies-et-relations.md} +5 -5
  79. package/dist/docs/06-modules/posts/{admin.md → 05-admin.md} +13 -13
  80. package/dist/docs/06-modules/posts/{modele-de-donnees.md → 06-modele-de-donnees.md} +3 -3
  81. package/dist/docs/06-modules/posts/{templates.md → 07-templates.md} +2 -2
  82. package/dist/docs/06-modules/posts/{api.md → 08-api.md} +3 -3
  83. package/dist/docs/06-modules/posts/index.md +25 -13
  84. package/dist/shared/lib/version.js +1 -1
  85. package/package.json +1 -1
  86. package/supported.json +1 -1
  87. package/dist/docs/06-modules/drive/installation.md +0 -69
  88. /package/dist/docs/06-modules/medias/{integration.md → 05-integration.md} +0 -0
@@ -4,7 +4,7 @@ description: Tables fraza_media et fraza_media_references, migrations, cycle de
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/medias/integration
7
+ - 06-modules/medias/05-integration
8
8
  - 03-reference/01-cores/database
9
9
  ---
10
10
 
@@ -36,13 +36,13 @@ La suppression d'un compte utilisateur vide `uploaded_by` mais ne touche pas au
36
36
 
37
37
  ### Pourquoi deux noms
38
38
 
39
- `filename` et `storage_key` sont indépendants. Renommer un média réécrit le premier et laisse le second intact, ce qui n'invalide aucune référence puisque les contenus référencent `id`. Voir [Téléversement](./televersement.md).
39
+ `filename` et `storage_key` sont indépendants. Renommer un média réécrit le premier et laisse le second intact, ce qui n'invalide aucune référence puisque les contenus référencent `id`. Voir [Téléversement](./03-televersement.md).
40
40
 
41
41
  ### `alt_text` et `caption` sont la source de vérité
42
42
 
43
43
  Ces deux colonnes ne sont pas des valeurs par défaut : ce sont les valeurs. Les blocs image du BlockEditor ne conservent pas de copie locale, ils relisent la fiche du média à chaque rendu.
44
44
 
45
- Corriger un texte alternatif dans la médiathèque le corrige donc partout où l'image est utilisée, sans toucher aux contenus. C'est la contrepartie de la normalisation stricte décrite dans [Intégration](./integration.md).
45
+ Corriger un texte alternatif dans la médiathèque le corrige donc partout où l'image est utilisée, sans toucher aux contenus. C'est la contrepartie de la normalisation stricte décrite dans [Intégration](./05-integration.md).
46
46
 
47
47
  ## `fraza_media_references`
48
48
 
@@ -85,7 +85,7 @@ Les migrations sont numérotées dans `src/migrations.js` et appliquées une foi
85
85
 
86
86
  | Migration | Effet |
87
87
  |---|---|
88
- | `001-drop-media-visibility` | Retire la colonne `visibility` et son index, ancien correctif rejoué à chaque `init`. **Tous les médias sont publics**, et la route de fichier ne vérifie ni session ni permission. Voir [Configuration](./configuration.md). |
88
+ | `001-drop-media-visibility` | Retire la colonne `visibility` et son index, ancien correctif rejoué à chaque `init`. **Tous les médias sont publics**, et la route de fichier ne vérifie ni session ni permission. Voir [Configuration](./02-configuration.md). |
89
89
  | `002-office-mime-types` | Donne leur type MIME aux `.doc`, `.docx`, `.xls`, `.xlsx`, `.ppt` et `.pptx` enregistrés en `application/octet-stream`, d'après l'extension de leur clé de stockage. |
90
90
 
91
91
  ## Cycle de vie d'un fichier
@@ -4,7 +4,7 @@ description: Routes HTTP d'admin de la médiathèque, route publique de service
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/medias/integration
7
+ - 06-modules/medias/05-integration
8
8
  - 03-reference/03-registres/media-registry
9
9
  ---
10
10
 
@@ -28,7 +28,7 @@ import { getMediaById, buildMediaUrl, attachMedia } from '@fraza/core/media-regi
28
28
 
29
29
  ## API
30
30
 
31
- Les fonctions utilisables depuis du code sont documentées dans [Registre média](../../03-reference/03-registres/media-registry.md), et leur usage dans [Intégration](./integration.md).
31
+ Les fonctions utilisables depuis du code sont documentées dans [Registre média](../../03-reference/03-registres/media-registry.md), et leur usage dans [Intégration](./05-integration.md).
32
32
 
33
33
  | Façade | Rôle |
34
34
  |---|---|
@@ -65,11 +65,11 @@ Un refus répond l'erreur d'API du core, `{ error, code, message }`, voir [API](
65
65
 
66
66
  `kind=other` garde les types MIME que la table des types ne connaît pas.
67
67
 
68
- `POST /media` attend un champ `file`, plus éventuellement `altText` et `caption`. Voir [Téléversement](./televersement.md) pour les formats et les limites. Le corps de `POST /media` et de `POST /media/:id/replace` est plafonné à 101 Mio, la limite d'une vidéo plus 1 Mio d'enveloppe : au-delà, le routeur du core répond 413 sans lire le corps.
68
+ `POST /media` attend un champ `file`, plus éventuellement `altText` et `caption`. Voir [Téléversement](./03-televersement.md) pour les formats et les limites. Le corps de `POST /media` et de `POST /media/:id/replace` est plafonné à 101 Mio, la limite d'une vidéo plus 1 Mio d'enveloppe : au-delà, le routeur du core répond 413 sans lire le corps.
69
69
 
70
70
  `POST /media/bulk-download` attend `{ ids }`, **cent au plus**, et renvoie une archive assemblée à la volée, sans recompression. Les objets absents du stockage sont sautés sans faire échouer l'archive.
71
71
 
72
- `DELETE /media/:id` échoue en `409`, code `in_use`, si le média est encore référencé, avec le nombre de contenus concernés dans le message. Détacher d'abord. Voir [Intégration](./integration.md). Le refus vaut aussi pour une référence écrite pendant la suppression par une transaction encore ouverte : la clé étrangère le garantit, et la réponse est la même.
72
+ `DELETE /media/:id` échoue en `409`, code `in_use`, si le média est encore référencé, avec le nombre de contenus concernés dans le message. Détacher d'abord. Voir [Intégration](./05-integration.md). Le refus vaut aussi pour une référence écrite pendant la suppression par une transaction encore ouverte : la clé étrangère le garantit, et la réponse est la même.
73
73
 
74
74
  ### Publique
75
75
 
@@ -77,11 +77,11 @@ Un refus répond l'erreur d'API du core, `{ error, code, message }`, voir [API](
77
77
  |---|---|---|
78
78
  | `GET` | `/za/media/:filename` | aucune |
79
79
 
80
- Ce n'est **pas** une route du routeur d'API : c'est un Route Handler Next.js monté par le projet, hors du préfixe `/za/api`. Voir [Installation](./installation.md).
80
+ Ce n'est **pas** une route du routeur d'API : c'est un Route Handler Next.js monté par le projet, hors du préfixe `/za/api`. Voir [Installation](./01-installation.md).
81
81
 
82
82
  Elle retrouve la fiche par son nom public, lit l'objet au stockage et diffuse le flux. Elle répond `404` « Fichier introuvable. » si le nom est inconnu ou si le stockage répond 404, `400` « Nom de fichier invalide. » si le nom est illisible, `500` si le stockage ne répond pas, avec le message générique du core. Ces trois réponses sont du texte brut. Ces réponses portent `Cache-Control: no-store` : aucun cache ne les garde. Sans le module, le relais du core répond le même 404, `no-store` compris.
83
83
 
84
- Les en-têtes appliqués sont détaillés dans [Téléversement](./televersement.md). Le point à retenir : seuls JPEG, PNG, GIF et WebP sont servis en affichage direct, tout le reste est forcé en téléchargement.
84
+ Les en-têtes appliqués sont détaillés dans [Téléversement](./03-televersement.md). Le point à retenir : seuls JPEG, PNG, GIF et WebP sont servis en affichage direct, tout le reste est forcé en téléchargement.
85
85
 
86
86
  ## Notes
87
87
 
@@ -4,28 +4,40 @@ description: Médiathèque partagée, téléversement vers un stockage objet, op
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/medias/installation
8
- - 06-modules/medias/admin
9
- - 06-modules/medias/integration
7
+ - 06-modules/medias/01-installation
8
+ - 06-modules/medias/04-admin
9
+ - 06-modules/medias/05-integration
10
10
  ---
11
11
 
12
12
  `@fraza/module-medias` ajoute une médiathèque à l'admin et remplit le [registre média](../../03-reference/03-registres/media-registry.md) du core. Les autres modules l'utilisent sans jamais le déclarer en dépendance : ils appellent les façades du core, qui deviennent actives dès que ce module est installé.
13
13
 
14
+ ```bash
15
+ npm i @fraza/module-medias
16
+ ```
17
+
18
+ | Paquet | `@fraza/module-medias` |
19
+ |---|---|
20
+ | Licence | MIT, Fraza Libre. |
21
+ | Registre | npmjs, sans compte ni configuration. |
22
+ | Activation | `FRAZA_MODULE_MEDIAS=true` |
23
+
24
+ L'activation, la création des tables et la route de fichier sont dans [Installation](./01-installation.md).
25
+
14
26
  ![La médiathèque, sa grille de vignettes, sa recherche et son filtre par type](../../assets/modules/medias/mediatheque.light.webp)
15
27
 
16
- La grille est le point d'entrée humain de la bibliothèque : recherche par nom de fichier, filtre par type, téléversement. C'est le même fonds que vient chercher un bloc image ou un champ média d'un autre module, par le registre plutôt que par un import. Voir [Intégration](./integration.md).
28
+ La grille est le point d'entrée humain de la bibliothèque : recherche par nom de fichier, filtre par type, téléversement. C'est le même fonds que vient chercher un bloc image ou un champ média d'un autre module, par le registre plutôt que par un import. Voir [Intégration](./05-integration.md).
17
29
 
18
30
  ## Pages de cette section
19
31
 
20
32
  | Page | Contenu |
21
33
  |---|---|
22
- | [Installation](./installation.md) | Installer le module, créer les tables, monter la route de fichier. |
23
- | [Configuration](./configuration.md) | Variables d'environnement, stockage objet, permissions, entrée d'admin. |
24
- | [Téléversement](./televersement.md) | Formats acceptés, limites, validation, optimisation, nommage. |
25
- | [Administration](./admin.md) | La médiathèque : filtres, sélection multiple, actions groupées, fiche d'un média. |
26
- | [Intégration](./integration.md) | Référencer un média depuis un autre module ou un bloc. |
27
- | [Modèle de données](./modele-de-donnees.md) | Tables `fraza_media` et `fraza_media_references`. |
28
- | [API](./api.md) | Routes HTTP d'admin et route publique de fichier. |
34
+ | [Installation](./01-installation.md) | Installer le module, créer les tables, monter la route de fichier. |
35
+ | [Configuration](./02-configuration.md) | Variables d'environnement, stockage objet, permissions, entrée d'admin. |
36
+ | [Téléversement](./03-televersement.md) | Formats acceptés, limites, validation, optimisation, nommage. |
37
+ | [Administration](./04-admin.md) | La médiathèque : filtres, sélection multiple, actions groupées, fiche d'un média. |
38
+ | [Intégration](./05-integration.md) | Référencer un média depuis un autre module ou un bloc. |
39
+ | [Modèle de données](./06-modele-de-donnees.md) | Tables `fraza_media` et `fraza_media_references`. |
40
+ | [API](./07-api.md) | Routes HTTP d'admin et route publique de fichier. |
29
41
 
30
42
  ## Ce que le module apporte
31
43
 
@@ -44,7 +56,7 @@ C'est le seul module officiel dont la valeur principale n'est pas sa propre inte
44
56
 
45
57
  Sans ce module, ces façades sont des fonctions neutres : les lectures renvoient vide, les écritures renvoient un échec explicite, le sélecteur d'image se masque. Aucun code appelant n'a donc à se conditionner.
46
58
 
47
- C'est ce contrat qui est documenté dans [Intégration](./integration.md).
59
+ C'est ce contrat qui est documenté dans [Intégration](./05-integration.md).
48
60
 
49
61
  ## Où vivent les fichiers
50
62
 
@@ -55,7 +67,7 @@ Deux noms coexistent donc pour chaque fichier :
55
67
  - une **clé de stockage** privée, jamais exposée, de la forme `media/<année>/<mois>/<nom unique>` ;
56
68
  - un **nom public** assaini, utilisé dans l'URL `/za/media/<nom>`.
57
69
 
58
- Renommer un média change le second sans toucher au premier, ce qui n'invalide aucune référence. Voir [Téléversement](./televersement.md).
70
+ Renommer un média change le second sans toucher au premier, ce qui n'invalide aucune référence. Voir [Téléversement](./03-televersement.md).
59
71
 
60
72
  ## Notes
61
73
 
@@ -1,19 +1,19 @@
1
1
  ---
2
2
  title: Installation
3
- description: Installer @fraza/module-pages, créer la table, activer le module et brancher le rendu public à la racine du site.
3
+ description: Installer @fraza/module-pages, créer la table, brancher le rendu public et fournir le template par défaut.
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/pages/configuration
8
- - 06-modules/pages/templates
7
+ - 06-modules/pages/02-configuration
8
+ - 06-modules/pages/05-templates
9
9
  ---
10
10
 
11
- Cette page couvre l'installation de `@fraza/module-pages` dans un projet déjà structuré par `@fraza/start`. Le module n'est jamais déclaré à la main : il est découvert au boot par scan des dépendances, comme décrit dans [Cycle de vie d'un module](../../02-guides/cycle-de-vie-d-un-module.md).
11
+ Cette page installe `@fraza/module-pages` dans un projet créé par `npx @fraza/start`. Le module n'est jamais déclaré à la main : il est découvert au boot par scan des dépendances, comme décrit dans [Cycle de vie d'un module](../../02-guides/cycle-de-vie-d-un-module.md).
12
12
 
13
13
  ## Prérequis
14
14
 
15
- - Un projet généré par `npx @fraza/start`, avec `@fraza/core` installé.
16
- - Aucune configuration ni connexion : le module est gratuit et publié sur npmjs.
15
+ - Un projet créé par `npx @fraza/start`, avec `@fraza/core` à jour.
16
+ - Aucun compte : le paquet est publié sur npmjs.
17
17
 
18
18
  ## Installer
19
19
 
@@ -23,21 +23,21 @@ npm i @fraza/module-pages
23
23
 
24
24
  Ajouter la variable d'activation à `.env.local`, et aux variables de la plateforme en production :
25
25
 
26
- ```bash
26
+ ```dotenv
27
27
  #------ MODULE - PAGES ------#
28
28
  FRAZA_MODULE_PAGES=true
29
29
  ```
30
30
 
31
- Sans ce drapeau, le module est ignoré : aucune table, aucune route, aucune entrée d'admin. Le détail des variables est dans [Configuration](./configuration.md).
31
+ Sans ce drapeau, le module est ignoré : aucune table, aucune route, aucune entrée d'admin. Le détail des variables est dans [Configuration](./02-configuration.md).
32
32
 
33
- Régénérer les manifestes puis créer la table :
33
+ Régénérer les manifestes, puis créer la table :
34
34
 
35
35
  ```bash
36
36
  npx fraza-modules sync # déclenché automatiquement au postinstall
37
37
  npx fraza-db init # crée fraza_pages_page
38
38
  ```
39
39
 
40
- `fraza-db init` est idempotent. Sur une base qui possède déjà la table, il applique les migrations de schéma en attente sans toucher aux données. Voir [Modèle de données](./modele-de-donnees.md).
40
+ `fraza-db init` est idempotent : sur une base qui a déjà la table, il applique les migrations en attente sans toucher aux données. Il enregistre aussi les permissions `pages.view` et `pages.manage`, et les attribue au rôle `admin`. Voir [Modèle de données](./04-modele-de-donnees.md).
41
41
 
42
42
  ## Brancher le rendu public
43
43
 
@@ -53,7 +53,7 @@ Le catch-all ne couvre pas la racine `/`. L'accueil du site reste `app/(public)/
53
53
 
54
54
  ### Projet sans catch-all dynamique
55
55
 
56
- Si le projet n'utilise pas le registre de résolveurs, la vue publique se re-exporte directement :
56
+ Si le projet n'utilise pas le registre de résolveurs, la vue publique se réexporte directement :
57
57
 
58
58
  ```js
59
59
  // app/(public)/[...slug]/page.js
@@ -68,7 +68,7 @@ Le module n'embarque aucun template. Il résout `page.template`, et retombe sur
68
68
 
69
69
  Le template `default` est fourni par le projet hôte dans `components/fraza/templates/default.js`, et enregistré au boot par le manifeste que génère `fraza-modules sync`. Le start template en fournit un. Sans aucun template enregistré, le module rend les blocs bruts via `BlockListRenderer` du core, sans mise en page.
70
70
 
71
- Voir [Templates](./templates.md) pour en écrire un.
71
+ Voir [Templates](./05-templates.md) pour en écrire un.
72
72
 
73
73
  ## Vérifier
74
74
 
@@ -79,20 +79,18 @@ Voir [Templates](./templates.md) pour en écrire un.
79
79
  2. `Pages` apparaît dans la barre latérale de l'admin.
80
80
  3. Créer une page depuis `/admin/pages`, la laisser en visibilité publique, puis l'ouvrir à `/<slug>`.
81
81
 
82
- Les permissions du module sont enregistrées et attribuées au rôle `admin` pendant `fraza-db init`. Un module ajouté après coup n'a donc besoin que d'un `npx fraza-db init` pour que `pages.view` et `pages.manage` apparaissent dans `/admin/roles`.
83
-
84
82
  ## Mettre à jour
85
83
 
86
84
  ```bash
87
85
  npx fraza-update
88
86
  ```
89
87
 
90
- La commande installe la dernière version de tous les paquets Fraza du site, toutes à la fois : tous les paquets Fraza à leur dernière version fonctionnent ensemble. Mettre à jour `@fraza/module-pages` seul, par `npm i`, laisserait le core et les autres modules en arrière.
88
+ La commande installe la dernière version de tous les paquets Fraza du site, toutes à la fois, puis enchaîne `fraza-modules sync`, `fraza-db migrate` et `fraza-doctor`. Tous les paquets Fraza à leur dernière version fonctionnent ensemble : mettre à jour `@fraza/module-pages` seul, par `npm i`, laisserait le core et les autres modules en arrière.
91
89
 
92
- Les notes de version sont livrées avec le package, dans `node_modules/@fraza/module-pages/CHANGELOG.md`.
90
+ Les notes de version sont livrées avec le paquet, dans `node_modules/@fraza/module-pages/CHANGELOG.md`.
93
91
 
94
92
  ## Notes
95
93
 
96
94
  - Le module dépend de `@fraza/core` en `peerDependency`. Il n'embarque pas sa propre copie du core.
97
- - Les blocs image utilisent le registre de médias du core. Si `@fraza/module-medias` est installé, le sélecteur d'image et l'image de partage Open Graph deviennent disponibles dans l'éditeur. Le module le déclare comme module optionnel, dans `manifest.optionalModules` : `npx fraza-doctor` le rappelle par une information tant qu'il manque. Voir [Dépendances souples](../../03-reference/01-cores/modules.md#dépendances-souples).
98
95
  - Désinstaller le module ne supprime pas la table. `dropTables` est exporté depuis `@fraza/module-pages` pour le faire explicitement.
96
+ - Les blocs image utilisent le registre de médias du core. Si `@fraza/module-medias` est installé, le sélecteur d'image et l'image de partage Open Graph deviennent disponibles dans l'éditeur. Le module le déclare comme module optionnel, dans `manifest.optionalModules` : `npx fraza-doctor` le rappelle par une information tant qu'il manque. Voir [Dépendances souples](../../03-reference/01-cores/modules.md#dépendances-souples).
@@ -4,7 +4,7 @@ description: Variables d'environnement, permissions et intégration à l'admin d
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/pages/modele-de-donnees
7
+ - 06-modules/pages/04-modele-de-donnees
8
8
  - 03-reference/06-configuration/variables-d-environnement
9
9
  ---
10
10
 
@@ -4,8 +4,8 @@ description: Liste arborescente, formulaire d'édition, sélecteur de parent, da
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/pages/modele-de-donnees
8
- - 06-modules/pages/templates
7
+ - 06-modules/pages/04-modele-de-donnees
8
+ - 06-modules/pages/05-templates
9
9
  ---
10
10
 
11
11
  Le module ajoute une section `Pages` à la barre latérale de l'admin. Tout le contenu d'une page s'y édite : titre, slug, blocs, template, parent, visibilité et SEO. Cette page décrit ce que fait l'interface, y compris les quelques comportements qui surprennent.
@@ -18,7 +18,7 @@ Le module ajoute une section `Pages` à la barre latérale de l'admin. Tout le c
18
18
  | `/admin/pages/new` | Création. |
19
19
  | `/admin/pages/edit/<id>` | Édition. |
20
20
 
21
- L'accès à la section demande `pages.view` : sans elle, `/admin/pages` répond 404, comme une page inconnue. Créer, modifier, dupliquer et supprimer demandent `pages.manage`. Voir [Configuration](./configuration.md).
21
+ L'accès à la section demande `pages.view` : sans elle, `/admin/pages` répond 404, comme une page inconnue. Créer, modifier, dupliquer et supprimer demandent `pages.manage`. Voir [Configuration](./02-configuration.md).
22
22
 
23
23
  ## Liste
24
24
 
@@ -47,7 +47,7 @@ La duplication reprend les blocs, le SEO, le template et la visibilité de l'ori
47
47
 
48
48
  ### Colonne SEO
49
49
 
50
- Quand `FRAZA_SEO` est actif, une colonne affiche le score SEO de chaque page. Le drapeau inactif, la colonne n'existe pas. Voir [Configuration](./configuration.md).
50
+ Quand `FRAZA_SEO` est actif, une colonne affiche le score SEO de chaque page. Le drapeau inactif, la colonne n'existe pas. Voir [Configuration](./02-configuration.md).
51
51
 
52
52
  ## Formulaire
53
53
 
@@ -57,7 +57,7 @@ L'en-tête de l'édition montre l'adresse complète de la page, et le bouton `Vo
57
57
 
58
58
  ### Slug et aperçu d'URL
59
59
 
60
- Sous le champ slug, l'URL publique complète est recalculée à chaque frappe, en préfixant le chemin du parent sélectionné. Le slug saisi est normalisé à l'enregistrement, et suffixé s'il entre en collision avec celui d'une page de même parent. Les règles complètes sont dans [Modèle de données](./modele-de-donnees.md).
60
+ Sous le champ slug, l'URL publique complète est recalculée à chaque frappe, en préfixant le chemin du parent sélectionné. Le slug saisi est normalisé à l'enregistrement, et suffixé s'il entre en collision avec celui d'une page de même parent. Les règles complètes sont dans [Modèle de données](./04-modele-de-donnees.md).
61
61
 
62
62
  ### Contenu
63
63
 
@@ -79,7 +79,7 @@ Les dates s'affichent en français (`fr-CA`), dans le fuseau du navigateur. « C
79
79
 
80
80
  ### Template
81
81
 
82
- Le sélecteur liste les templates de `kind: 'page'` enregistrés dans le projet. Voir [Templates](./templates.md).
82
+ Le sélecteur liste les templates de `kind: 'page'` enregistrés dans le projet. Voir [Templates](./05-templates.md).
83
83
 
84
84
  Si la page porte un template qui n'existe plus, le sélecteur se réaligne sur le premier template disponible, et l'enregistrement suivant écrit cette valeur. Le rendu public, lui, ne réécrit rien : il retombe sur `default` tant que le champ n'a pas été enregistré.
85
85
 
@@ -4,8 +4,8 @@ description: Table fraza_pages_page, hiérarchie par parent_id, règles de slug,
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/pages/api
8
- - 06-modules/pages/templates
7
+ - 06-modules/pages/06-api
8
+ - 06-modules/pages/05-templates
9
9
  ---
10
10
 
11
11
  Le module crée une seule table, `fraza_pages_page`. Comprendre sa forme est nécessaire pour écrire un template, appeler l'API ou diagnostiquer une URL qui ne résout pas.
@@ -109,7 +109,7 @@ Au rendu, le module cherche le template dont l'identifiant vaut `page.template`.
109
109
 
110
110
  Un template supprimé du projet ne casse donc pas les pages qui l'utilisaient : elles retombent sur `default` jusqu'à ce que leur champ soit changé.
111
111
 
112
- L'éditeur, lui, ne se comporte pas pareil. Face à un template inconnu, son sélecteur se réaligne sur le premier template de la liste, et l'enregistrement suivant écrit cette valeur en base. Renommer l'identifiant d'un template déjà utilisé demande donc de repasser sur les pages concernées, sous peine de les voir migrer une à une vers un template arbitraire. Voir [Administration](./admin.md).
112
+ L'éditeur, lui, ne se comporte pas pareil. Face à un template inconnu, son sélecteur se réaligne sur le premier template de la liste, et l'enregistrement suivant écrit cette valeur en base. Renommer l'identifiant d'un template déjà utilisé demande donc de repasser sur les pages concernées, sous peine de les voir migrer une à une vers un template arbitraire. Voir [Administration](./03-admin.md).
113
113
 
114
114
  ## Notes
115
115
 
@@ -4,7 +4,7 @@ description: Routes HTTP d'admin et publiques, et fonctions serveur importables
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/pages/modele-de-donnees
7
+ - 06-modules/pages/04-modele-de-donnees
8
8
  - 03-reference/01-cores/api
9
9
  ---
10
10
 
@@ -24,7 +24,7 @@ Le module expose ses pages de deux façons : des routes HTTP pour le navigateur,
24
24
  import { listPublicChildPages, getPublishedPageBySegments } from '@fraza/module-pages/public';
25
25
  ```
26
26
 
27
- `@fraza/module-pages/public` exporte aussi `default` et `generateMetadata`, destinés au re-export dans un catch-all. Voir [Installation](./installation.md).
27
+ `@fraza/module-pages/public` exporte aussi `default` et `generateMetadata`, destinés au re-export dans un catch-all. Voir [Installation](./01-installation.md).
28
28
 
29
29
  ## API
30
30
 
@@ -4,28 +4,40 @@ description: Pages CMS hiérarchiques rendues à la racine du site, éditées au
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/pages/installation
8
- - 06-modules/pages/configuration
7
+ - 06-modules/pages/01-installation
8
+ - 06-modules/pages/02-configuration
9
9
  ---
10
10
 
11
11
  `@fraza/module-pages` ajoute une section « Pages » à l'admin et rend chaque page publiée à la racine du site, à l'URL construite depuis sa chaîne de parents. Le contenu est édité au `BlockEditor` du core et rendu par un template fourni par le projet hôte.
12
12
 
13
+ ```bash
14
+ npm i @fraza/module-pages
15
+ ```
16
+
17
+ | Paquet | `@fraza/module-pages` |
18
+ |---|---|
19
+ | Licence | MIT, Fraza Libre. |
20
+ | Registre | npmjs, sans compte ni configuration. |
21
+ | Activation | `FRAZA_MODULE_PAGES=true` |
22
+
23
+ L'activation, la création de la table et le rendu public sont dans [Installation](./01-installation.md).
24
+
13
25
  Le module est indépendant de `@fraza/module-posts`. Les deux peuvent cohabiter : pages sert de repli sur toute URL non réclamée, posts réserve son préfixe.
14
26
 
15
27
  ![La liste des pages dans l'admin, rangée en arbre](../../assets/modules/pages/liste.light.webp)
16
28
 
17
- La liste range chaque page sous son parent, décalée d'un cran par niveau, et affiche sous le titre le chemin public reconstruit depuis la chaîne des parents. La colonne SEO n'apparaît que si `FRAZA_SEO` est actif. Le détail de l'écran est dans [Administration](./admin.md).
29
+ La liste range chaque page sous son parent, décalée d'un cran par niveau, et affiche sous le titre le chemin public reconstruit depuis la chaîne des parents. La colonne SEO n'apparaît que si `FRAZA_SEO` est actif. Le détail de l'écran est dans [Administration](./03-admin.md).
18
30
 
19
31
  ## Pages de cette section
20
32
 
21
33
  | Page | Contenu |
22
34
  |---|---|
23
- | [Installation](./installation.md) | Installer le module, créer la table, brancher le rendu public. |
24
- | [Configuration](./configuration.md) | Variables d'environnement, permissions, entrée d'admin. |
25
- | [Administration](./admin.md) | Liste arborescente, formulaire, parent, dates et enregistrement. |
26
- | [Modèle de données](./modele-de-donnees.md) | Table `fraza_pages_page`, hiérarchie, règles de slug et de visibilité. |
27
- | [Templates](./templates.md) | Écrire un template de page et les propriétés qu'il reçoit. |
28
- | [API](./api.md) | Routes HTTP et fonctions serveur importables. |
35
+ | [Installation](./01-installation.md) | Installer le module, créer la table, brancher le rendu public. |
36
+ | [Configuration](./02-configuration.md) | Variables d'environnement, permissions, entrée d'admin. |
37
+ | [Administration](./03-admin.md) | Liste arborescente, formulaire, parent, dates et enregistrement. |
38
+ | [Modèle de données](./04-modele-de-donnees.md) | Table `fraza_pages_page`, hiérarchie, règles de slug et de visibilité. |
39
+ | [Templates](./05-templates.md) | Écrire un template de page et les propriétés qu'il reçoit. |
40
+ | [API](./06-api.md) | Routes HTTP et fonctions serveur importables. |
29
41
 
30
42
  ## Ce que le module apporte
31
43
 
@@ -4,16 +4,16 @@ description: Installer @fraza/module-posts, déclarer un premier type, créer le
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/posts/types-et-champs
8
- - 06-modules/posts/configuration
7
+ - 06-modules/posts/03-types-et-champs
8
+ - 06-modules/posts/02-configuration
9
9
  ---
10
10
 
11
- Cette page couvre l'installation de `@fraza/module-posts` dans un projet déjà structuré par `@fraza/start`. Le module n'est jamais déclaré à la main : il est découvert au boot par scan des dépendances, comme décrit dans [Cycle de vie d'un module](../../02-guides/cycle-de-vie-d-un-module.md).
11
+ Cette page installe `@fraza/module-posts` dans un projet créé par `npx @fraza/start`. Le module n'est jamais déclaré à la main : il est découvert au boot par scan des dépendances, comme décrit dans [Cycle de vie d'un module](../../02-guides/cycle-de-vie-d-un-module.md).
12
12
 
13
13
  ## Prérequis
14
14
 
15
- - Un projet généré par `npx @fraza/start`, avec `@fraza/core` installé.
16
- - Aucune configuration ni connexion : le module est gratuit et publié sur npmjs.
15
+ - Un projet créé par `npx @fraza/start`, avec `@fraza/core` à jour.
16
+ - Aucun compte : le paquet est publié sur npmjs.
17
17
 
18
18
  ## Installer
19
19
 
@@ -21,33 +21,29 @@ Cette page couvre l'installation de `@fraza/module-posts` dans un projet déjà
21
21
  npm i @fraza/module-posts
22
22
  ```
23
23
 
24
- ## Déclarer un premier type
24
+ Ajouter la variable d'activation et un premier type à `.env.local`, et aux variables de la plateforme en production :
25
25
 
26
- Contrairement aux autres modules, activer `@fraza/module-posts` ne suffit pas : sans type déclaré, il ne crée aucune section d'admin et ne rend rien.
27
-
28
- ```bash
26
+ ```dotenv
29
27
  #------ MODULE - POSTS ------#
30
28
  FRAZA_MODULE_POSTS=true
31
29
  FRAZA_MODULE_POSTS_TYPES=blogue:Blogue:MoonIcon
32
30
  FRAZA_MODULE_POSTS_TYPE_BLOGUE=title:title|slug:slug|date:date:now:sidebar|content:editor:Contenu
33
31
  ```
34
32
 
35
- Trois lignes, dans cet ordre : le drapeau d'activation, la liste des types, puis les champs de chaque type. Le nom de la variable de champs est dérivé de la clé du type en majuscules.
33
+ Sans le drapeau, le module est ignoré : aucune table, aucune route, aucune entrée d'admin. Contrairement aux autres modules, le drapeau seul ne suffit pas : sans type déclaré, le module ne crée aucune section d'admin et ne rend rien.
36
34
 
37
- La syntaxe complète est dans [Types et champs](./types-et-champs.md).
35
+ Les trois lignes viennent dans cet ordre : le drapeau d'activation, la liste des types, puis les champs de chaque type. Le nom de la variable de champs est dérivé de la clé du type en majuscules. La syntaxe complète est dans [Types et champs](./03-types-et-champs.md).
38
36
 
39
- ## Créer les tables
37
+ Régénérer les manifestes, puis créer les tables :
40
38
 
41
39
  ```bash
42
40
  npx fraza-modules sync # déclenché automatiquement au postinstall
43
41
  npx fraza-db init # crée les tables du module
44
42
  ```
45
43
 
46
- `fraza-db init` est **sensible à la configuration** pour ce module. Il ne crée les tables de taxonomies que si au moins un type déclare un champ `taxonomy`, et la table des relations que si au moins un type déclare un champ `relation`.
47
-
48
- Conséquence directe : après avoir ajouté une taxonomie ou une relation à un type existant, il faut relancer `npx fraza-db init`. La commande est idempotente, elle ne touche pas aux données en place.
44
+ `fraza-db init` est idempotent : sur une base qui a déjà les tables, il applique les migrations en attente sans toucher aux données. Il enregistre aussi les permissions `posts.view` et `posts.manage`, et les attribue au rôle `admin`.
49
45
 
50
- Voir [Modèle de données](./modele-de-donnees.md) pour le détail des tables et des migrations.
46
+ Pour ce module, `fraza-db init` est **sensible à la configuration**. Il ne crée les tables de taxonomies que si au moins un type déclare un champ `taxonomy`, et la table des relations que si au moins un type déclare un champ `relation`. Après avoir ajouté une taxonomie ou une relation à un type existant, relancer `npx fraza-db init`. Voir [Modèle de données](./06-modele-de-donnees.md).
51
47
 
52
48
  ## Brancher le rendu public
53
49
 
@@ -59,28 +55,17 @@ app/(public)/[...slug]/page.js
59
55
 
60
56
  Ce fichier itère les résolveurs de [`core/public-content`](../../03-reference/01-cores/public-content.md). Le module y enregistre le sien au boot, à la priorité 10. **Il n'y a donc rien à importer** : l'installation suffit.
61
57
 
62
- Le sous-chemin `@fraza/module-posts/public` exporte bien une vue par défaut, `PostPublicView({ postType, slug })`, mais elle sert de repli de débogage pour un projet qui voudrait court-circuiter le registre. Le start template ne l'utilise pas : une URL de post porte toujours son type en premier segment, elle ne se prête donc pas à un fichier de route fixe. Voir [API](./api.md).
58
+ Le sous-chemin `@fraza/module-posts/public` exporte bien une vue par défaut, `PostPublicView({ postType, slug })`, mais elle sert de repli de débogage pour un projet qui voudrait court-circuiter le registre. Le start template ne l'utilise pas : une URL de post porte toujours son type en premier segment, elle ne se prête donc pas à un fichier de route fixe. Voir [API](./08-api.md).
63
59
 
64
60
  ## Fournir un template
65
61
 
66
62
  Le module enregistre lui-même un template `default` par type, qui rend le titre puis les blocs bruts via `BlockListRenderer`. C'est suffisant pour vérifier l'installation, pas pour un site.
67
63
 
68
- Pour reprendre la main sur la mise en page, écrire un template dans `components/fraza/templates/` et le déclarer sur le type. Voir [Templates](./templates.md).
69
-
70
- ## Vérifier
71
-
72
- 1. La connexion à la base répond :
73
- ```bash
74
- npx fraza-db test
75
- ```
76
- 2. Une section `Blogue` apparaît dans la barre latérale de l'admin, avec un item `Posts`.
77
- 3. Créer un post depuis `/admin/posts/blogue/list`, le laisser en visibilité publique, puis l'ouvrir à `/blogue/<slug>`. Voir [Administration](./admin.md).
64
+ Pour reprendre la main sur la mise en page, écrire un template dans `components/fraza/templates/` et le déclarer sur le type. Voir [Templates](./07-templates.md).
78
65
 
79
- Les permissions du module sont enregistrées et attribuées au rôle `admin` pendant `fraza-db init`. Un module ajouté après coup n'a donc besoin que d'un `npx fraza-db init` pour que `posts.view` et `posts.manage` apparaissent dans `/admin/roles`.
66
+ ## Ajouter les médias
80
67
 
81
- ## Médias
82
-
83
- Si un type déclare un champ `image`, `thumbnail` ou `gallery` sans que `@fraza/module-medias` soit installé et activé, le module journalise un avertissement au boot listant les champs concernés. Le module démarre quand même, mais le sélecteur d'image reste indisponible dans l'éditeur.
68
+ Si un type déclare un champ `image`, `thumbnail` ou `gallery` sans que `@fraza/module-medias` soit installé et activé, le module journalise au boot un avertissement qui liste les champs concernés. Le module démarre quand même, mais le sélecteur d'image reste indisponible dans l'éditeur.
84
69
 
85
70
  Le module déclare `@fraza/module-medias` comme module optionnel, dans `manifest.optionalModules` : `npx fraza-doctor` le rappelle par une information tant qu'il manque, sans en faire un constat bloquant. Voir [Dépendances souples](../../03-reference/01-cores/modules.md#dépendances-souples).
86
71
 
@@ -90,21 +75,30 @@ npm i @fraza/module-medias
90
75
 
91
76
  Puis, dans `.env.local` :
92
77
 
93
- ```bash
78
+ ```dotenv
94
79
  FRAZA_MODULE_MEDIAS=true
95
80
  ```
96
81
 
97
82
  Voir [Module Médias](../medias/index.md).
98
83
 
84
+ ## Vérifier
85
+
86
+ 1. La connexion à la base répond :
87
+ ```bash
88
+ npx fraza-db test
89
+ ```
90
+ 2. Une section `Blogue` apparaît dans la barre latérale de l'admin, avec un item `Posts`.
91
+ 3. Créer un post depuis `/admin/posts/blogue/list`, le laisser en visibilité publique, puis l'ouvrir à `/blogue/<slug>`. Voir [Administration](./05-admin.md).
92
+
99
93
  ## Mettre à jour
100
94
 
101
95
  ```bash
102
96
  npx fraza-update
103
97
  ```
104
98
 
105
- La commande installe la dernière version de tous les paquets Fraza du site, toutes à la fois : tous les paquets Fraza à leur dernière version fonctionnent ensemble. Mettre à jour `@fraza/module-posts` seul, par `npm i`, laisserait le core et les autres modules en arrière.
99
+ La commande installe la dernière version de tous les paquets Fraza du site, toutes à la fois, puis enchaîne `fraza-modules sync`, `fraza-db migrate` et `fraza-doctor`. Tous les paquets Fraza à leur dernière version fonctionnent ensemble : mettre à jour `@fraza/module-posts` seul, par `npm i`, laisserait le core et les autres modules en arrière.
106
100
 
107
- Les notes de version sont livrées avec le package, dans `node_modules/@fraza/module-posts/CHANGELOG.md`.
101
+ Les notes de version sont livrées avec le paquet, dans `node_modules/@fraza/module-posts/CHANGELOG.md`.
108
102
 
109
103
  ## Notes
110
104
 
@@ -4,11 +4,11 @@ description: Variables d'environnement, permissions et intégration à l'admin d
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
7
- - 06-modules/posts/types-et-champs
7
+ - 06-modules/posts/03-types-et-champs
8
8
  - 03-reference/06-configuration/variables-d-environnement
9
9
  ---
10
10
 
11
- Le module inverse la répartition habituelle : la **structure** du contenu vit dans les variables d'environnement, le **contenu** vit en base. Cette page couvre les variables globales, les permissions et l'admin. La syntaxe de déclaration des types est traitée à part, dans [Types et champs](./types-et-champs.md).
11
+ Le module inverse la répartition habituelle : la **structure** du contenu vit dans les variables d'environnement, le **contenu** vit en base. Cette page couvre les variables globales, les permissions et l'admin. La syntaxe de déclaration des types est traitée à part, dans [Types et champs](./03-types-et-champs.md).
12
12
 
13
13
  ## Variables d'environnement
14
14
 
@@ -16,7 +16,7 @@ Le module inverse la répartition habituelle : la **structure** du contenu vit d
16
16
  |---|---|---|
17
17
  | `FRAZA_MODULE_POSTS` | oui | `true` active le module. Absente ou fausse, le module est ignoré : aucune table, aucune route, aucune entrée d'admin. |
18
18
  | `FRAZA_MODULE_POSTS_TYPES` | non | Liste des types de contenu. Absente, le module est actif mais ne déclare rien. |
19
- | `FRAZA_MODULE_POSTS_TYPE_<CLÉ>` | non | Champs d'un type. Voir [Types et champs](./types-et-champs.md). Une erreur de déclaration fait échouer le démarrage. |
19
+ | `FRAZA_MODULE_POSTS_TYPE_<CLÉ>` | non | Champs d'un type. Voir [Types et champs](./03-types-et-champs.md). Une erreur de déclaration fait échouer le démarrage. |
20
20
  | `FRAZA_MODULE_POSTS_TYPE_<CLÉ>_PRIVATE` | non | Champs retirés des réponses publiques et du rendu public. Chaque nom doit désigner un champ déclaré du type. |
21
21
  | `FRAZA_MODULE_POSTS_TYPE_<CLÉ>_LIST` | non | Colonnes du tableau d'admin. |
22
22
  | `FRAZA_MODULE_POSTS_TYPE_<CLÉ>_ORDERABLE` | non | `true` active le réordonnancement manuel. |
@@ -38,7 +38,7 @@ Quand le drapeau est actif :
38
38
  - Les valeurs sont stockées sous la clé `seo` des données du post.
39
39
  - Le rendu public transforme cet objet en métadonnées Next.js avec `buildSeoMetadata`, en `ogType: 'article'`.
40
40
  - Le jeton `seo` devient utilisable comme colonne dans `_LIST`, affichant une pastille de score.
41
- - Les champs laissés vides retombent sur le contenu du post : la méta description est dérivée d'un champ `text` ou `editor`, l'image de partage d'un champ `thumbnail` ou `image`. Voir [Repli SEO automatique](./types-et-champs.md#repli-seo-automatique).
41
+ - Les champs laissés vides retombent sur le contenu du post : la méta description est dérivée d'un champ `text` ou `editor`, l'image de partage d'un champ `thumbnail` ou `image`. Voir [Repli SEO automatique](./03-types-et-champs.md#repli-seo-automatique).
42
42
 
43
43
  Drapeau inactif, la page publique n'expose que son titre comme métadonnée, et aucun repli n'est calculé.
44
44
 
@@ -64,13 +64,13 @@ Le module enregistre **une section de navigation par type déclaré**, et non un
64
64
  | Propriété | Valeur |
65
65
  |---|---|
66
66
  | Titre de section | Libellé du type, ou clé capitalisée si aucun libellé n'est donné. |
67
- | Icône | Troisième segment de la déclaration du type, `BookIcon` par défaut. Un nom du jeu `@fraza/icons`, ou une icône exportée par `components/fraza/icons.js`. Voir [Types et champs](./types-et-champs.md#déclarer-un-type). |
67
+ | Icône | Troisième segment de la déclaration du type, `BookIcon` par défaut. Un nom du jeu `@fraza/icons`, ou une icône exportée par `components/fraza/icons.js`. Voir [Types et champs](./03-types-et-champs.md#déclarer-un-type). |
68
68
  | Ordre | 300 pour le premier type, puis 301, 302, dans l'ordre de déclaration. |
69
69
  | Chemin de la liste | `/admin/posts/<clé>/list` |
70
70
  | Chemin d'une taxonomie | `/admin/posts/<clé>/taxonomies/<clé de taxonomie>` |
71
71
  | Permission | `posts.view` sur tous les items. |
72
72
 
73
- Les écrans desservis par ces entrées sont décrits dans [Administration](./admin.md).
73
+ Les écrans desservis par ces entrées sont décrits dans [Administration](./05-admin.md).
74
74
 
75
75
  L'ordre des sections suit donc l'ordre de `FRAZA_MODULE_POSTS_TYPES`, et les types occupent une plage continue à partir de 300. Un autre module ne peut pas s'intercaler entre deux types : il se place avant en prenant un ordre inférieur à 300, ou après en prenant un ordre supérieur à la plage occupée. Voir [Étendre l'admin](../../02-guides/etendre-l-admin.md).
76
76