@fraza/core 0.3.8 → 0.3.12

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 (115) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/THIRD-PARTY-NOTICES.md +2 -2
  3. package/changelog.json +86 -0
  4. package/dist/docs/00-decouverte/01-qu-est-ce-que-fraza.md +1 -1
  5. package/dist/docs/01-demarrage/01-installation.md +9 -15
  6. package/dist/docs/01-demarrage/02-tour-du-proprietaire.md +1 -1
  7. package/dist/docs/01-demarrage/03-configuration.md +1 -1
  8. package/dist/docs/02-guides/accepter-des-paiements.md +1 -1
  9. package/dist/docs/02-guides/basculer-sur-le-registre-de-secours.md +3 -3
  10. package/dist/docs/02-guides/blocs-personnalises.md +1 -1
  11. package/dist/docs/02-guides/etendre-l-admin.md +2 -2
  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/02-features/admin.md +13 -2
  17. package/dist/docs/03-reference/03-registres/media-registry.md +4 -4
  18. package/dist/docs/03-reference/04-partage/composants.md +2 -0
  19. package/dist/docs/03-reference/05-cli/fraza-key.md +1 -1
  20. package/dist/docs/03-reference/06-configuration/paquets-supportes.md +1 -1
  21. package/dist/docs/03-reference/06-configuration/variables-d-environnement.md +2 -2
  22. package/dist/docs/04-architecture/02-frontieres-serveur-client.md +1 -1
  23. package/dist/docs/04-architecture/05-securite.md +1 -1
  24. package/dist/docs/04-architecture/07-licence-et-propriete.md +1 -1
  25. package/dist/docs/05-contribution/03-redaction.md +10 -0
  26. package/dist/docs/05-contribution/05-publication.md +0 -1
  27. package/dist/docs/06-modules/booking/{installation.md → 01-installation.md} +35 -20
  28. package/dist/docs/06-modules/booking/{configuration.md → 02-configuration.md} +5 -5
  29. package/dist/docs/06-modules/booking/{admin.md → 03-admin.md} +3 -3
  30. package/dist/docs/06-modules/booking/{reservation-en-ligne.md → 04-reservation-en-ligne.md} +2 -2
  31. package/dist/docs/06-modules/booking/{courriels.md → 05-courriels.md} +2 -2
  32. package/dist/docs/06-modules/booking/{modele-de-donnees.md → 06-modele-de-donnees.md} +1 -1
  33. package/dist/docs/06-modules/booking/{api.md → 07-api.md} +2 -2
  34. package/dist/docs/06-modules/booking/index.md +22 -12
  35. package/dist/docs/06-modules/drive/01-installation.md +92 -0
  36. package/dist/docs/06-modules/drive/{configuration.md → 02-configuration.md} +5 -5
  37. package/dist/docs/06-modules/drive/{admin.md → 03-admin.md} +8 -8
  38. package/dist/docs/06-modules/drive/{partages.md → 04-partages.md} +5 -5
  39. package/dist/docs/06-modules/drive/{fichiers.md → 05-fichiers.md} +4 -4
  40. package/dist/docs/06-modules/drive/{modele-de-donnees.md → 06-modele-de-donnees.md} +2 -2
  41. package/dist/docs/06-modules/drive/{api.md → 07-api.md} +5 -5
  42. package/dist/docs/06-modules/drive/index.md +23 -13
  43. package/dist/docs/06-modules/facturation/{installation.md → 01-installation.md} +61 -39
  44. package/dist/docs/06-modules/facturation/{configuration.md → 02-configuration.md} +5 -5
  45. package/dist/docs/06-modules/facturation/{facturation.md → 03-facturation.md} +4 -4
  46. package/dist/docs/06-modules/facturation/{taxes.md → 04-taxes.md} +2 -2
  47. package/dist/docs/06-modules/facturation/{paiements.md → 05-paiements.md} +3 -3
  48. package/dist/docs/06-modules/facturation/{recurrences-et-rappels.md → 06-recurrences-et-rappels.md} +4 -4
  49. package/dist/docs/06-modules/facturation/{courriels.md → 07-courriels.md} +5 -5
  50. package/dist/docs/06-modules/facturation/{modele-de-donnees.md → 08-modele-de-donnees.md} +2 -2
  51. package/dist/docs/06-modules/facturation/{api.md → 09-api.md} +3 -3
  52. package/dist/docs/06-modules/facturation/index.md +26 -16
  53. package/dist/docs/06-modules/forms/{installation.md → 01-installation.md} +25 -30
  54. package/dist/docs/06-modules/forms/{configuration.md → 02-configuration.md} +6 -6
  55. package/dist/docs/06-modules/forms/{champs.md → 03-champs.md} +4 -4
  56. package/dist/docs/06-modules/forms/{admin.md → 04-admin.md} +9 -9
  57. package/dist/docs/06-modules/forms/{soumissions.md → 05-soumissions.md} +7 -7
  58. package/dist/docs/06-modules/forms/{affichage.md → 06-affichage.md} +3 -3
  59. package/dist/docs/06-modules/forms/{modele-de-donnees.md → 07-modele-de-donnees.md} +3 -3
  60. package/dist/docs/06-modules/forms/{api.md → 08-api.md} +4 -4
  61. package/dist/docs/06-modules/forms/index.md +26 -14
  62. package/dist/docs/06-modules/index.md +2 -2
  63. package/dist/docs/06-modules/medias/{installation.md → 01-installation.md} +33 -36
  64. package/dist/docs/06-modules/medias/{configuration.md → 02-configuration.md} +5 -5
  65. package/dist/docs/06-modules/medias/{televersement.md → 03-televersement.md} +4 -4
  66. package/dist/docs/06-modules/medias/{admin.md → 04-admin.md} +7 -7
  67. package/dist/docs/06-modules/medias/{modele-de-donnees.md → 06-modele-de-donnees.md} +4 -4
  68. package/dist/docs/06-modules/medias/{api.md → 07-api.md} +6 -6
  69. package/dist/docs/06-modules/medias/index.md +25 -13
  70. package/dist/docs/06-modules/pages/{installation.md → 01-installation.md} +15 -17
  71. package/dist/docs/06-modules/pages/{configuration.md → 02-configuration.md} +1 -1
  72. package/dist/docs/06-modules/pages/{admin.md → 03-admin.md} +6 -6
  73. package/dist/docs/06-modules/pages/{modele-de-donnees.md → 04-modele-de-donnees.md} +2 -2
  74. package/dist/docs/06-modules/pages/{templates.md → 05-templates.md} +1 -1
  75. package/dist/docs/06-modules/pages/{api.md → 06-api.md} +2 -2
  76. package/dist/docs/06-modules/pages/index.md +21 -9
  77. package/dist/docs/06-modules/posts/{installation.md → 01-installation.md} +28 -34
  78. package/dist/docs/06-modules/posts/{configuration.md → 02-configuration.md} +6 -6
  79. package/dist/docs/06-modules/posts/{types-et-champs.md → 03-types-et-champs.md} +11 -11
  80. package/dist/docs/06-modules/posts/{taxonomies-et-relations.md → 04-taxonomies-et-relations.md} +5 -5
  81. package/dist/docs/06-modules/posts/{admin.md → 05-admin.md} +13 -13
  82. package/dist/docs/06-modules/posts/{modele-de-donnees.md → 06-modele-de-donnees.md} +3 -3
  83. package/dist/docs/06-modules/posts/{templates.md → 07-templates.md} +2 -2
  84. package/dist/docs/06-modules/posts/{api.md → 08-api.md} +3 -3
  85. package/dist/docs/06-modules/posts/index.md +25 -13
  86. package/dist/docs/assets/decouverte/tableau-de-bord.dark.webp +0 -0
  87. package/dist/docs/assets/decouverte/tableau-de-bord.light.webp +0 -0
  88. package/dist/docs/assets/demarrage/connexion.dark.webp +0 -0
  89. package/dist/docs/assets/demarrage/connexion.light.webp +0 -0
  90. package/dist/docs/assets/demarrage/roles.dark.webp +0 -0
  91. package/dist/docs/assets/demarrage/roles.light.webp +0 -0
  92. package/dist/docs/assets/demarrage/tableau-de-bord-neuf.dark.webp +0 -0
  93. package/dist/docs/assets/demarrage/tableau-de-bord-neuf.light.webp +0 -0
  94. package/dist/docs/assets/modules/booking/agenda.dark.webp +0 -0
  95. package/dist/docs/assets/modules/booking/agenda.light.webp +0 -0
  96. package/dist/docs/assets/modules/drive/navigateur.dark.webp +0 -0
  97. package/dist/docs/assets/modules/drive/navigateur.light.webp +0 -0
  98. package/dist/docs/assets/modules/facturation/factures.dark.webp +0 -0
  99. package/dist/docs/assets/modules/facturation/factures.light.webp +0 -0
  100. package/dist/docs/assets/modules/forms/constructeur.dark.webp +0 -0
  101. package/dist/docs/assets/modules/forms/constructeur.light.webp +0 -0
  102. package/dist/docs/assets/modules/medias/mediatheque.dark.webp +0 -0
  103. package/dist/docs/assets/modules/medias/mediatheque.light.webp +0 -0
  104. package/dist/docs/assets/modules/pages/liste.dark.webp +0 -0
  105. package/dist/docs/assets/modules/pages/liste.light.webp +0 -0
  106. package/dist/docs/assets/modules/posts/liste.dark.webp +0 -0
  107. package/dist/docs/assets/modules/posts/liste.light.webp +0 -0
  108. package/dist/docs/assets/reference/liste-compacte.dark.webp +0 -0
  109. package/dist/docs/assets/reference/liste-compacte.light.webp +0 -0
  110. package/dist/features/admin/components/dashboard/DashboardGrid.client.js +34 -23
  111. package/dist/shared/lib/version.js +1 -1
  112. package/package.json +1 -1
  113. package/supported.json +1 -1
  114. package/dist/docs/06-modules/drive/installation.md +0 -69
  115. /package/dist/docs/06-modules/medias/{integration.md → 05-integration.md} +0 -0
package/CHANGELOG.md CHANGED
@@ -4,6 +4,38 @@ Historique des versions publiées de `@fraza/core`.
4
4
 
5
5
  Ce fichier est généré par `fraza-module changelog` à partir des messages de commit. Ne pas le modifier à la main.
6
6
 
7
+ ## 0.3.12 (2026-10-25)
8
+
9
+ ### Documentation
10
+
11
+ - update screenshots for various pages (08afd94)
12
+
13
+ ## 0.3.11 (2026-10-25)
14
+
15
+ ### Corrections
16
+
17
+ - **admin** : update dashboard grid layout documentation and implementation (8a86eb3)
18
+
19
+ ### Documentation
20
+
21
+ - **form** : update section grouping and order in admin configuration (5ae2e37)
22
+
23
+ ## 0.3.10 (2026-10-25)
24
+
25
+ ### Autres
26
+
27
+ - Update dependencies, fix vulnerabilities (23dbec5)
28
+
29
+ ## 0.3.9 (2026-10-25)
30
+
31
+ ### Refontes
32
+
33
+ - **docs/06-modules** : reorganize module documentation into numbered files (9c93a28)
34
+
35
+ ### Documentation
36
+
37
+ - reorder and update installation instructions (254c39d)
38
+
7
39
  ## 0.3.8 (2026-10-25)
8
40
 
9
41
  ### Documentation
@@ -19,7 +19,7 @@ Il est généré par `fraza-module notices` à partir de l'arbre réellement ins
19
19
 
20
20
  | Paquet | Version | Licence |
21
21
  |---|---|---|
22
- | `@fraza/icons` | 0.3.10 | MIT |
22
+ | `@fraza/icons` | 0.3.16 | MIT |
23
23
  | `node-cron` | 4.2.1 | ISC |
24
24
  | `pg` | 8.20.0 | MIT |
25
25
  | `pg-cloudflare` | 1.3.0 | MIT |
@@ -146,7 +146,7 @@ OTHER DEALINGS IN THE FONT SOFTWARE.
146
146
 
147
147
  ## Textes de licence
148
148
 
149
- ### @fraza/icons@0.3.10
149
+ ### @fraza/icons@0.3.16
150
150
 
151
151
  Licence : MIT
152
152
 
package/changelog.json CHANGED
@@ -1,6 +1,92 @@
1
1
  {
2
2
  "name": "@fraza/core",
3
3
  "versions": [
4
+ {
5
+ "version": "0.3.12",
6
+ "date": "2026-10-25",
7
+ "breaking": [],
8
+ "envAdded": [],
9
+ "envRemoved": [],
10
+ "templateChanged": [],
11
+ "action": [],
12
+ "entries": [
13
+ {
14
+ "type": "docs",
15
+ "scope": null,
16
+ "subject": "update screenshots for various pages",
17
+ "hash": "08afd94",
18
+ "breaking": false
19
+ }
20
+ ]
21
+ },
22
+ {
23
+ "version": "0.3.11",
24
+ "date": "2026-10-25",
25
+ "breaking": [],
26
+ "envAdded": [],
27
+ "envRemoved": [],
28
+ "templateChanged": [],
29
+ "action": [],
30
+ "entries": [
31
+ {
32
+ "type": "fix",
33
+ "scope": "admin",
34
+ "subject": "update dashboard grid layout documentation and implementation",
35
+ "hash": "8a86eb3",
36
+ "breaking": false
37
+ },
38
+ {
39
+ "type": "docs",
40
+ "scope": "form",
41
+ "subject": "update section grouping and order in admin configuration",
42
+ "hash": "5ae2e37",
43
+ "breaking": false
44
+ }
45
+ ]
46
+ },
47
+ {
48
+ "version": "0.3.10",
49
+ "date": "2026-10-25",
50
+ "breaking": [],
51
+ "envAdded": [],
52
+ "envRemoved": [],
53
+ "templateChanged": [],
54
+ "action": [],
55
+ "entries": [
56
+ {
57
+ "type": "Chore",
58
+ "scope": null,
59
+ "subject": "Update dependencies, fix vulnerabilities",
60
+ "hash": "23dbec5",
61
+ "breaking": false
62
+ }
63
+ ]
64
+ },
65
+ {
66
+ "version": "0.3.9",
67
+ "date": "2026-10-25",
68
+ "breaking": [],
69
+ "envAdded": [],
70
+ "envRemoved": [],
71
+ "templateChanged": [],
72
+ "action": [],
73
+ "entries": [
74
+ {
75
+ "type": "docs",
76
+ "scope": null,
77
+ "subject": "reorder and update installation instructions",
78
+ "hash": "254c39d",
79
+ "breaking": false
80
+ },
81
+ {
82
+ "type": "refactor",
83
+ "scope": "docs/06-modules",
84
+ "subject": "reorganize module documentation into numbered files",
85
+ "hash": "9c93a28",
86
+ "breaking": false
87
+ }
88
+ ]
89
+ },
4
90
  {
5
91
  "version": "0.3.8",
6
92
  "date": "2026-10-25",
@@ -69,7 +69,7 @@ Le core et les modules gratuits, publiés sous `@fraza/`, relèvent de la licenc
69
69
 
70
70
  ## L'accès
71
71
 
72
- Le core, `@fraza/start` et les modules gratuits, sous le scope `@fraza`, sont publiés sur npmjs et s'installent sans compte ni configuration. Chaque version est aussi publiée sur le registre `https://registry.fraza.ca/`, en copie de secours. Les modules Pro vivent sous le scope `@fraza-pro`, sur ce registre seulement, qui ne les sert qu'avec les identifiants délivrés avec la licence. L'accès est décrit dans [Installation](../01-demarrage/01-installation.md).
72
+ Le core, `@fraza/start` et les modules gratuits, sous le scope `@fraza`, sont publiés sur npmjs et s'installent sans compte ni configuration. Les modules Pro vivent sous le scope `@fraza-pro`, sur le registre `https://registry.fraza.ca/`, qui ne les sert qu'avec les identifiants délivrés avec la licence. L'accès est décrit dans [Installation](../01-demarrage/01-installation.md).
73
73
 
74
74
  ## Étape suivante
75
75
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: Installation
3
- description: Configurer le registre Fraza, générer un projet avec npx @fraza/start et initialiser la base.
3
+ description: Générer un projet avec npx @fraza/start, configurer l'environnement et initialiser la base.
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
@@ -8,7 +8,7 @@ related:
8
8
  - 01-demarrage/03-configuration
9
9
  ---
10
10
 
11
- Un projet Fraza se génère par une seule commande. Cette page couvre l'accès au registre, la génération et le premier démarrage.
11
+ Un projet Fraza se génère par une seule commande. Le core, `@fraza/start` et les modules gratuits viennent de npmjs, le registre par défaut de npm : il n'y a rien à configurer ni de compte à créer. Cette page couvre la génération et le premier démarrage.
12
12
 
13
13
  ## Prérequis
14
14
 
@@ -17,13 +17,7 @@ Un projet Fraza se génère par une seule commande. Cette page couvre l'accès a
17
17
  - Un compte sur le registre `https://registry.fraza.ca/`, seulement pour les modules Pro.
18
18
  - Un terminal bash, zsh ou PowerShell. Sous Windows, les commandes de cette documentation sont écrites pour PowerShell, pas pour l'invite `cmd.exe`.
19
19
 
20
- ## 1. Le registre
21
-
22
- Rien à configurer. Le core, `@fraza/start` et les modules gratuits sont publiés sur npmjs, le registre par défaut de npm : aucune ligne de configuration ni connexion n'est demandée. Seuls les modules Pro passent par le registre Fraza, avec un compte : voir [Modules Pro](#modules-pro).
23
-
24
- Chaque version gratuite est aussi publiée sur `https://registry.fraza.ca/`, en copie de secours. Si npmjs devient indisponible, voir [Basculer sur le registre de secours](../02-guides/basculer-sur-le-registre-de-secours.md).
25
-
26
- ## 2. Générer le projet
20
+ ## 1. Générer le projet
27
21
 
28
22
  ```bash
29
23
  npx @fraza/start
@@ -37,11 +31,11 @@ La commande enchaîne :
37
31
  2. L'écriture d'un `README.md` au nom du projet et l'ajout des scripts `dev`, `build`, `postinstall` et `audit`. Les trois premiers sont préfixés par `fraza-modules sync`.
38
32
  3. La copie des fichiers de gabarit : `app/`, `components/`, `styles/`, `instrumentation.js`, `theme.js`, `jsconfig.json`. Le `next.config.mjs` de `create-next-app` est conservé, car c'est lui qui branche Tailwind : seul `devIndicators: false` y est ajouté.
39
33
  4. Le `.gitignore` : les règles `.env*` de `create-next-app` restent actives, `!.env.example` rend le modèle à git, et `app/.fraza/` s'ajoute. Le `.npmrc` n'est pas ignoré.
40
- 5. L'écriture du `.npmrc` du projet : les scopes `@fraza` et `@fraza-pro` vers le registre, sans token. Le token ne sert qu'aux modules Pro, et `npx fraza-key` l'ajoute le jour où le projet en installe un.
34
+ 5. L'écriture du `.npmrc` du projet : la ligne de scope `@fraza-pro`, sans token. Elle ne sert qu'aux modules Pro, et `npx fraza-key` y ajoute le token le jour où le projet en installe un.
41
35
  6. L'installation de `@fraza/core`.
42
36
  7. La création de `.env.example`, copie du modèle du package sans aucune valeur secrète, et de `.env.local`, la même copie avec `FRAZA_ENCRYPTION_KEY` générée et `NEXT_PUBLIC_URL` locale. Un fichier qui existe déjà n'est pas remplacé.
43
37
 
44
- ## 3. Configurer l'environnement
38
+ ## 2. Configurer l'environnement
45
39
 
46
40
  Les valeurs de la machine vont dans `.env.local`, que git ignore. Le CLI l'a créé à partir de `node_modules/@fraza/core/.env.example`, avec la clé de chiffrement déjà générée. Il reste à le remplir avant de démarrer.
47
41
 
@@ -55,7 +49,7 @@ FRAZA_DATABASE_URL=postgres://user:password@localhost:5432/mon_projet
55
49
 
56
50
  `.env.example`, lui, est suivi par git et ne porte que des noms de variables et des valeurs sans secret. Il ne se charge pas : il sert de modèle à une nouvelle machine, qui le copie en `.env.local`. Le détail de chaque variable est dans [Configuration](./03-configuration.md), et la règle complète dans [Secrets et git](#secrets-et-git).
57
51
 
58
- ## 4. Initialiser la base
52
+ ## 3. Initialiser la base
59
53
 
60
54
  ```bash
61
55
  npx fraza-db test # vérifier la connexion
@@ -69,7 +63,7 @@ npx fraza-db init # créer les tables
69
63
 
70
64
  La commande est idempotente : la relancer après chaque ajout de module ne casse rien.
71
65
 
72
- ## 5. Démarrer
66
+ ## 4. Démarrer
73
67
 
74
68
  ```bash
75
69
  npm run dev
@@ -92,7 +86,7 @@ npm config set "@fraza-pro:registry" https://registry.fraza.ca/
92
86
  npm login --registry=https://registry.fraza.ca/
93
87
  ```
94
88
 
95
- Le token est déposé dans `~/.npmrc`, le `.npmrc` du dossier personnel : `%USERPROFILE%\.npmrc` sous Windows. Il est lié à l'hôte du registre, pas au scope : la même ligne sert à `@fraza-pro`, et à `@fraza` pour un projet passé sur le registre de secours. Il n'expire pas dans le temps : il cesse de fonctionner seulement si le secret du serveur change, si le mot de passe est modifié, ou si le compte est révoqué.
89
+ Le token est déposé dans `~/.npmrc`, le `.npmrc` du dossier personnel : `%USERPROFILE%\.npmrc` sous Windows. Il n'expire pas dans le temps : il cesse de fonctionner seulement si le secret du serveur change, si le mot de passe est modifié, ou si le compte est révoqué.
96
90
 
97
91
  Écrire ensuite le token dans le `.npmrc` du projet. La commande se relance après chaque nouveau `npm login` :
98
92
 
@@ -126,7 +120,7 @@ Le `.npmrc`, lui, reste suivi par git. Il pointe le scope `@fraza-pro` vers `htt
126
120
 
127
121
  | Symptôme | Cause probable |
128
122
  |---|---|
129
- | `404 Not Found - @fraza/core` à l'installation | Une ligne `@fraza:registry` du `.npmrc` du projet ou de `~/.npmrc` pointe vers un registre qui n'a pas le paquet. La retirer pour revenir à npmjs, ou la pointer vers `https://registry.fraza.ca/`. |
123
+ | `404 Not Found - @fraza/core` à l'installation | Une ligne `@fraza:registry` du `.npmrc` du projet ou de `~/.npmrc` pointe vers un registre qui n'a pas le paquet. La retirer pour revenir à npmjs. |
130
124
  | npmjs injoignable, ou `@fraza/core` retiré de npmjs | Voir [Basculer sur le registre de secours](../02-guides/basculer-sur-le-registre-de-secours.md). |
131
125
  | `401` ou `404` sur un `@fraza-pro/module-*` | Ligne `@fraza-pro:registry` ou token absent du `.npmrc`. Voir [Modules Pro](#modules-pro) : `npm login` puis `npx fraza-key`. |
132
126
  | `FRAZA_DATABASE_URL is not defined` | `.env.local` non rempli, ou variable absente de la plateforme en production. |
@@ -78,7 +78,7 @@ npm run dev
78
78
 
79
79
  Une section **Pages** apparaît dans la barre latérale. Ouvrir `/admin/pages`, créer une page, lui donner un titre et un slug, ajouter quelques blocs, la passer en visible, enregistrer. L'URL publique complète est affichée sous le champ slug, et le bouton de lien de la liste l'ouvre dans un nouvel onglet.
80
80
 
81
- La page est en ligne. Le détail de l'écran est dans [Administration du module Pages](../06-modules/pages/admin.md), et les variantes d'installation dans [Installation](../06-modules/pages/installation.md).
81
+ La page est en ligne. Le détail de l'écran est dans [Administration du module Pages](../06-modules/pages/03-admin.md), et les variantes d'installation dans [Installation](../06-modules/pages/01-installation.md).
82
82
 
83
83
  ## Ce qui vient de se passer
84
84
 
@@ -168,7 +168,7 @@ node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
168
168
  STRIPE_WEBHOOK_SECRET=whsec_…
169
169
  ```
170
170
 
171
- Le core sert l'endpoint de webhook Stripe et vérifie la signature de chaque événement, sans le SDK Stripe. `STRIPE_WEBHOOK_SECRET` suffit à l'activer : sans lui, la route répond 404. Les appels sortants vers Stripe (sessions de paiement, remboursements) appartiennent au module qui encaisse, avec son propre SDK. Le module de [facturation](../06-modules/facturation/configuration.md) demande aussi `STRIPE_SECRET_KEY`.
171
+ Le core sert l'endpoint de webhook Stripe et vérifie la signature de chaque événement, sans le SDK Stripe. `STRIPE_WEBHOOK_SECRET` suffit à l'activer : sans lui, la route répond 404. Les appels sortants vers Stripe (sessions de paiement, remboursements) appartiennent au module qui encaisse, avec son propre SDK. Le module de [facturation](../06-modules/facturation/02-configuration.md) demande aussi `STRIPE_SECRET_KEY`.
172
172
 
173
173
  ### Récupérer la clé secrète
174
174
 
@@ -8,7 +8,7 @@ related:
8
8
  - 03-reference/01-cores/api
9
9
  ---
10
10
 
11
- Le core sert l'endpoint de webhook Stripe et vérifie la signature de chaque événement. Les appels vers Stripe, eux, passent par le SDK officiel, que le projet installe. Ce guide couvre le parcours complet d'un paiement unique par Checkout, le plus court chemin vers un encaissement fiable. Le module de [facturation](../06-modules/facturation/paiements.md) fait déjà tout cela pour les factures.
11
+ Le core sert l'endpoint de webhook Stripe et vérifie la signature de chaque événement. Les appels vers Stripe, eux, passent par le SDK officiel, que le projet installe. Ce guide couvre le parcours complet d'un paiement unique par Checkout, le plus court chemin vers un encaissement fiable. Le module de [facturation](../06-modules/facturation/05-paiements.md) fait déjà tout cela pour les factures.
12
12
 
13
13
  ## Configuration
14
14
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: Basculer sur le registre de secours
3
- description: Installer @fraza/* depuis registry.fraza.ca quand npmjs est indisponible, puis revenir à npmjs.
3
+ description: Installer @fraza/* depuis registry.fraza.ca quand npmjs est indisponible ou par choix, puis revenir à npmjs.
4
4
  related:
5
5
  title: Étapes suivantes
6
6
  links:
@@ -8,11 +8,11 @@ related:
8
8
  - 02-guides/mettre-a-jour-un-projet
9
9
  ---
10
10
 
11
- Ce guide s'adresse à qui doit installer ou déployer un projet Fraza pendant que npmjs ne sert plus les paquets `@fraza/*` : panne de npmjs, ou paquet retiré de npmjs.
11
+ Un projet installe `@fraza/*` depuis npmjs par défaut. Ce guide s'adresse à qui veut l'installer depuis le registre Fraza à la place : en urgence, pendant que npmjs ne sert plus les paquets (panne de npmjs, paquet retiré de npmjs), ou par choix.
12
12
 
13
13
  ## Pourquoi c'est possible
14
14
 
15
- Le core, `@fraza/start` et les modules gratuits sont publiés sur npmjs, d'où un projet les installe par défaut. Chaque version publiée sur npmjs l'est aussi sur `https://registry.fraza.ca/`, en copie de secours, en lecture libre. Ce registre porte en plus des versions intermédiaires, publiées pour tester un changement, qui ne vont pas sur npmjs.
15
+ Chaque version de `@fraza/*` publiée sur npmjs l'est aussi sur `https://registry.fraza.ca/`, en copie de secours, en lecture libre. Ce registre porte en plus des versions intermédiaires, publiées pour tester un changement, qui ne vont pas sur npmjs.
16
16
 
17
17
  Les deux registres reçoivent le même fichier, octet pour octet : la commande de publication construit un seul tarball et l'envoie aux deux. Le `package-lock.json` vérifie l'empreinte (`integrity`) de chaque paquet installé. Comme l'empreinte est la même sur les deux registres, le lockfile reste valable après la bascule.
18
18
 
@@ -73,7 +73,7 @@ Champs disponibles : `TextField`, `TextareaField`, `NumberField`, `SelectField`,
73
73
 
74
74
  `IconField` propose tout le jeu `@fraza/icons` et stocke le nom choisi. Le rendu du bloc l'affiche avec `<Icon name={item.icon} />` de `@fraza/core/shared/components/Icon`, qui ne charge que cette icône. Aucune liste à tenir dans le projet. Voir [Sélecteur d'icône d'un bloc](../03-reference/04-partage/icones.md#sélecteur-dicône-dun-bloc).
75
75
 
76
- `ImageField` passe par le sélecteur de [`@fraza/module-medias`](../06-modules/medias/index.md) et se masque quand le module est absent. Voir [Intégrer les médias](../06-modules/medias/integration.md).
76
+ `ImageField` passe par le sélecteur de [`@fraza/module-medias`](../06-modules/medias/index.md) et se masque quand le module est absent. Voir [Intégrer les médias](../06-modules/medias/05-integration.md).
77
77
 
78
78
  ### `render.js`
79
79
 
@@ -189,12 +189,12 @@ Le composant reçoit `data`, le retour du fetcher, `loading` et `size`. **Si le
189
189
 
190
190
  ### Largeur d'une tuile
191
191
 
192
- La grille compte 4 colonnes sur un écran large. `size` déclare la largeur d'une tuile en colonnes : `default` à l'arrivée, `min` et `max` pour borner ce que l'utilisateur peut choisir. Sans `size`, une tuile fait une colonne et peut s'étendre à quatre.
192
+ La grille compte jusqu'à 4 colonnes, selon la place dont elle dispose : 3 sur un portable de 1440 px, une sur un téléphone. `size` déclare la largeur d'une tuile en colonnes : `default` à l'arrivée, `min` et `max` pour borner ce que l'utilisateur peut choisir. Sans `size`, une tuile fait une colonne et peut s'étendre à quatre.
193
193
 
194
194
  ```jsx
195
195
  function OrdersWidget({ data, loading, size }) {
196
196
  // `size` est la largeur réellement occupée : 1 sur un téléphone, au plus 2
197
- // sur un écran moyen, la largeur choisie sur un grand écran.
197
+ // sur un écran moyen, 3 sur un portable, la largeur choisie sur un grand écran.
198
198
  const wide = size >= 2;
199
199
  return (
200
200
  <Card padding="none" spacing="none" className="px-5 py-4">
@@ -24,7 +24,7 @@ npm install @fraza/module-medias
24
24
  FRAZA_MODULE_MEDIAS=true
25
25
  ```
26
26
 
27
- Le détail de l'installation, dont la route de fichier à monter dans le projet, est dans [Installer le module Médias](../06-modules/medias/installation.md).
27
+ Le détail de l'installation, dont la route de fichier à monter dans le projet, est dans [Installer le module Médias](../06-modules/medias/01-installation.md).
28
28
 
29
29
  ```bash
30
30
  npx fraza-db init
@@ -56,6 +56,6 @@ Pour savoir lesquels vont ensemble, et dans quel ordre, [Que peut-on construire]
56
56
 
57
57
  | Guide | Besoin |
58
58
  |---|---|
59
- | [Basculer sur le registre de secours](./basculer-sur-le-registre-de-secours.md) | Installer `@fraza/*` depuis le registre Fraza quand npmjs est indisponible. |
59
+ | [Basculer sur le registre de secours](./basculer-sur-le-registre-de-secours.md) | Installer `@fraza/*` depuis le registre Fraza quand npmjs est indisponible, ou par choix. |
60
60
 
61
61
  Pour le détail d'une signature ou d'une option, voir la [Référence](../03-reference/index.md).
@@ -129,7 +129,7 @@ Un contenu dont la zone SEO est vide n'a pas de raison de sortir sans descriptio
129
129
 
130
130
  Passez ces deux valeurs aux quatre endroits de ce guide, pas seulement au rendu : `SeoFields` les affiche en filigrane, `SeoScoreBadge` et `computeSeoScore` les comptent dans le score. Sans cela l'éditeur signale une description manquante alors que la page publique en émet une.
131
131
 
132
- `@fraza/module-posts` en donne un exemple complet : il dérive la description d'un champ `text` ou `editor` et l'image d'un champ `thumbnail` ou `image`, avec un drapeau de configuration pour désigner explicitement la source. Voir [Repli SEO automatique](../06-modules/posts/types-et-champs.md#repli-seo-automatique).
132
+ `@fraza/module-posts` en donne un exemple complet : il dérive la description d'un champ `text` ou `editor` et l'image d'un champ `thumbnail` ou `image`, avec un drapeau de configuration pour désigner explicitement la source. Voir [Repli SEO automatique](../06-modules/posts/03-types-et-champs.md#repli-seo-automatique).
133
133
 
134
134
  ## Tokens
135
135
 
@@ -22,7 +22,7 @@ Registre **purement serveur**. Voir les notes pour la raison : ce n'est pas un o
22
22
 
23
23
  ## Qui alimente le registre
24
24
 
25
- 1. Le projet hôte dépose un fichier dans `components/fraza/templates/<id>.js` exportant `meta` et un composant par défaut. Le CLI `fraza-modules sync` génère le manifeste `app/.fraza/templates.server.js` qui appelle `registerTemplate` au boot. C'est de là que vient le template `default` de [`@fraza/module-pages`](../../06-modules/pages/templates.md), qui n'en enregistre aucun lui-même. [`@fraza/module-posts`](../../06-modules/posts/templates.md) en enregistre un par type déclaré, que le projet remplace en reprenant le même identifiant : le manifeste enregistre les templates du projet avec `override: true`.
25
+ 1. Le projet hôte dépose un fichier dans `components/fraza/templates/<id>.js` exportant `meta` et un composant par défaut. Le CLI `fraza-modules sync` génère le manifeste `app/.fraza/templates.server.js` qui appelle `registerTemplate` au boot. C'est de là que vient le template `default` de [`@fraza/module-pages`](../../06-modules/pages/05-templates.md), qui n'en enregistre aucun lui-même. [`@fraza/module-posts`](../../06-modules/posts/07-templates.md) en enregistre un par type déclaré, que le projet remplace en reprenant le même identifiant : le manifeste enregistre les templates du projet avec `override: true`.
26
26
  2. Un module peut enregistrer un template à l'exécution via l'API impérative, quand l'identifiant dépend d'une condition inconnue au build.
27
27
 
28
28
  ## API
@@ -63,8 +63,8 @@ Le registre est agnostique : ce sont les modules qui décident des props passée
63
63
 
64
64
  | `kind` | Props |
65
65
  |---|---|
66
- | `'page'` | `{ page, blocks, url, breadcrumb }`. Voir [Templates de page](../../06-modules/pages/templates.md). |
67
- | `'post'` | `{ post, blocks, url, breadcrumb }`. Voir [Templates de post](../../06-modules/posts/templates.md). |
66
+ | `'page'` | `{ page, blocks, url, breadcrumb }`. Voir [Templates de page](../../06-modules/pages/05-templates.md). |
67
+ | `'post'` | `{ post, blocks, url, breadcrumb }`. Voir [Templates de post](../../06-modules/posts/07-templates.md). |
68
68
 
69
69
  Le template est **responsable du rendu des blocs**. Il importe son propre `<Content>` depuis `components/fraza/templates/content.js` et l'utilise avec `<Content blocks={blocks} />`. Aucun `children` n'est injecté implicitement : le template a la main complète sur sa JSX.
70
70
 
@@ -210,7 +210,7 @@ Le composant reçoit trois props :
210
210
  |---|---|
211
211
  | `data` | Retour du fetcher, ou `null` si le fetcher a échoué ou n'existe pas. |
212
212
  | `loading` | `true` tant que la donnée n'est pas là. |
213
- | `size` | Largeur réellement occupée, en colonnes : la largeur choisie, bornée par les colonnes de l'écran. |
213
+ | `size` | Largeur réellement occupée, en colonnes : la largeur choisie, bornée par les colonnes de la grille. |
214
214
 
215
215
  `size` sert à adapter le rendu. La tuile de facturation pose son graphique à côté de ses chiffres à partir de deux colonnes, et dessous sur une seule. Sur un téléphone, `size` vaut toujours 1.
216
216
 
@@ -222,7 +222,18 @@ Une tuile `devkit` est écartée par le tableau de bord, pas par le registre. `F
222
222
 
223
223
  ## Disposition du tableau de bord
224
224
 
225
- Les tuiles sont posées dans une **grille de 4 colonnes** à partir de 80rem de large, de 2 colonnes à partir de 48rem, d'une seule en dessous. Une tuile occupe de 1 à 4 colonnes, bornées par celles de l'écran, et sa hauteur suit son contenu.
225
+ Les tuiles sont posées dans une grille de 1 à 4 colonnes. Le nombre suit la **largeur de la grille elle-même**, pas celle de la fenêtre : la barre latérale prend déjà le quart d'un écran de portable, et quatre colonnes dans le reste donnaient des tuiles trop étroites pour se lire.
226
+
227
+ | Largeur de la grille | Colonnes | Avec la barre latérale |
228
+ |---|---|---|
229
+ | 80rem (1280 px) et plus | 4 | fenêtre d'environ 1510 px et plus |
230
+ | de 64rem (1024 px) à 80rem | 3 | de 1250 à 1510 px environ, dont le portable de 1440 px |
231
+ | de 42rem (672 px) à 64rem | 2 | de 900 à 1250 px environ |
232
+ | moins de 42rem | 1 | téléphone |
233
+
234
+ Une tuile occupe de 1 à 4 colonnes, bornées par celles de la grille : une tuile de 4 colonnes en prend 3 sur un portable, soit toute la largeur. Sa hauteur suit son contenu.
235
+
236
+ Les colonnes sont des requêtes de conteneur Tailwind (`@container`, puis `@2xl:`, `@5xl:` et `@7xl:`) : le bon nombre est déjà dans le HTML du serveur, sans saut au chargement. Le composant mesure aussi la largeur de la grille, avec les mêmes seuils, pour donner à chaque tuile son `size` et borner le redimensionnement en mode édition.
226
237
 
227
238
  La grille se tasse d'elle-même. Ses rangées font 4 px, et chaque tuile en couvre autant que sa hauteur mesurée l'exige, espacement compris : un `ResizeObserver` suit la hauteur de chaque tuile. Avec `grid-auto-flow: dense`, une tuile courte remonte dans le vide laissé à côté d'une tuile haute. Le résultat est celui d'une maçonnerie, avec en plus des tuiles qui s'étendent sur plusieurs colonnes. Avant la mesure (rendu serveur, puis premier affichage) la grille garde des rangées ordinaires : une tuile peut y laisser un vide sous elle, jamais en chevaucher une autre.
228
239
 
@@ -10,7 +10,7 @@ related:
10
10
 
11
11
  Le gestionnaire de médias est distribué comme un module externe, [`@fraza/module-medias`](../../06-modules/medias/index.md). Le core ne dépend pas de ce package : il fournit un **registre** que le module remplit au runtime.
12
12
 
13
- Un module tiers peut donc téléverser un fichier et attacher des médias à son contenu sans déclarer `@fraza/module-medias` en dépendance, et sans conditionner ses appels. Le mode d'emploi côté consommateur est dans [Intégrer les médias](../../06-modules/medias/integration.md).
13
+ Un module tiers peut donc téléverser un fichier et attacher des médias à son contenu sans déclarer `@fraza/module-medias` en dépendance, et sans conditionner ses appels. Le mode d'emploi côté consommateur est dans [Intégrer les médias](../../06-modules/medias/05-integration.md).
14
14
 
15
15
  Quand le module est absent ou désactivé (`FRAZA_MODULE_MEDIAS` différent de `true`), les façades restent appelables et se comportent de façon **neutre** : les lectures retournent vide, les écritures retournent un échec explicite, `getMediaPicker()` retourne `null`. Le code consommateur reste naïf.
16
16
 
@@ -72,7 +72,7 @@ Chaque façade transmet ses arguments au module tels quels. `client` y désigne
72
72
 
73
73
  La taille enregistrée d'un fichier est celle des octets stockés, après optimisation : un ancien paramètre `size` d'`uploadMedia` ou de `replaceMedia` est ignoré.
74
74
 
75
- Le détail du comportement de chaque écriture, avec le module actif, est dans [Téléversement](../../06-modules/medias/televersement.md) et [API](../../06-modules/medias/api.md).
75
+ Le détail du comportement de chaque écriture, avec le module actif, est dans [Téléversement](../../06-modules/medias/03-televersement.md) et [API](../../06-modules/medias/07-api.md).
76
76
 
77
77
  ```js
78
78
  import { attachMedia, detachAllForSource } from '@fraza/core/media-registry';
@@ -119,7 +119,7 @@ const url = buildMediaUrl(result.media);
119
119
 
120
120
  `uploadedBy` est optionnel. Omis, la colonne `uploaded_by` reste nulle et la médiathèque n'affiche aucun auteur, ce qui est exact pour un dépôt machine. La colonne porte une clé étrangère vers la table des utilisateurs : seul un identifiant réel, ou rien, est accepté. Un identifiant inventé fait échouer l'enregistrement.
121
121
 
122
- Les formats, les tailles et les validations sont les mêmes que pour un téléversement depuis l'interface : la règle vit dans la fonction, pas dans la route. Voir [Téléversement](../../06-modules/medias/televersement.md).
122
+ Les formats, les tailles et les validations sont les mêmes que pour un téléversement depuis l'interface : la règle vit dans la fonction, pas dans la route. Voir [Téléversement](../../06-modules/medias/03-televersement.md).
123
123
 
124
124
  `deleteMedia` refuse un média encore référencé. Interroger `countReferences` avant, ou lire le champ `referenceCount` de l'échec.
125
125
 
@@ -167,7 +167,7 @@ Vérifier `isMediaPickerAvailable()` **avant** de rendre : `getMediaPicker()` re
167
167
  | `initialSelected` | Tableau de médias déjà retenus, affichés cochés à l'ouverture. Mode multiple. |
168
168
  | `title` | Titre de la fenêtre. |
169
169
 
170
- En mode multiple, la sélection retient les objets média et survit donc à la pagination et aux filtres, `onSelect` rend le tableau dans l'ordre où la sélection a été constituée, et le téléversement accepte plusieurs fichiers. Voir [Intégrer les médias](../../06-modules/medias/integration.md).
170
+ En mode multiple, la sélection retient les objets média et survit donc à la pagination et aux filtres, `onSelect` rend le tableau dans l'ordre où la sélection a été constituée, et le téléversement accepte plusieurs fichiers. Voir [Intégrer les médias](../../06-modules/medias/05-integration.md).
171
171
 
172
172
  ## Route fichier
173
173
 
@@ -663,6 +663,8 @@ Un clic qui part d'un contrôle de la ligne lui appartient : un bouton, un lien,
663
663
 
664
664
  Sous 1024 px de large, `Table` ne rend plus le tableau mais une liste : une ligne par élément, deux lignes de texte au plus. Une carte par élément, qui reprenait toutes les colonnes en grille, faisait défiler trois éléments par écran de téléphone. La liste en montre une dizaine, et le détail reste à un toucher.
665
665
 
666
+ ![La liste des factures sur un téléphone : une ligne par facture, le client et le numéro à gauche, le montant et le statut à droite](../../assets/reference/liste-compacte.light.webp)
667
+
666
668
  ```
667
669
  ┌────────────────────────────────────────────────────┐
668
670
  │ ☐ Boréalis Café inc. 1 345,21 $ … │
@@ -74,7 +74,7 @@ Le registre Fraza tourne sous Verdaccio, qui ne sert pas la route de `npm access
74
74
 
75
75
  ## Basculer sur le registre de secours
76
76
 
77
- `secours` et `npmjs` changent le registre d'où le projet installe `@fraza/*`, pour une panne de npmjs ou un paquet retiré de npmjs. Ils écrivent le `.npmrc` et réécrivent l'hôte des adresses `@fraza/*` du `package-lock.json` : sans cette réécriture, `npm ci` retournerait chercher les paquets sur l'hôte d'origine. Lancer ensuite `npm install`, puis committer les deux fichiers. Voir [Basculer sur le registre de secours](../../02-guides/basculer-sur-le-registre-de-secours.md).
77
+ `secours` et `npmjs` changent le registre d'où le projet installe `@fraza/*`, pour une panne de npmjs, un paquet retiré de npmjs, ou par choix. Ils écrivent le `.npmrc` et réécrivent l'hôte des adresses `@fraza/*` du `package-lock.json` : sans cette réécriture, `npm ci` retournerait chercher les paquets sur l'hôte d'origine. Lancer ensuite `npm install`, puis committer les deux fichiers. Voir [Basculer sur le registre de secours](../../02-guides/basculer-sur-le-registre-de-secours.md).
78
78
 
79
79
  ## Quand la lancer
80
80
 
@@ -32,7 +32,7 @@ Trois informations distinctes qu'un simple champ `peerDependencies` ne porte pas
32
32
  "node": { "floor": "20.12.0", "range": ">=20.12.0", "tested": "22.0.0" }
33
33
  },
34
34
  "packages": {
35
- "next": { "floor": "16.0.0", "range": ">=16.0.0 <17.0.0", "tested": "16.3.8" },
35
+ "next": { "floor": "16.0.0", "range": ">=16.0.0 <17.0.0", "tested": "16.4.3" },
36
36
  "sharp": { "floor": "0.35.0", "range": ">=0.35.0 <1.0.0", "tested": "0.35.5",
37
37
  "requiredBy": ["@fraza/module-medias"] }
38
38
  }
@@ -142,7 +142,7 @@ Les variables `FRAZA_EMAIL_FROM_*` et `FRAZA_EMAIL_LOGO*` servent les deux fourn
142
142
  |---|---|---|---|
143
143
  | `STRIPE_WEBHOOK_SECRET` | — | `core/payments` | Secret de signature de l'endpoint de webhook (`whsec_…`). Sans lui, la route répond 404. |
144
144
 
145
- Le core ne garde de Stripe que l'endpoint de webhook, et il vérifie la signature sans le SDK. `STRIPE_SECRET_KEY` appartient au module qui appelle Stripe, la [facturation](../../06-modules/facturation/configuration.md) par exemple, et se déclare dans son manifeste.
145
+ Le core ne garde de Stripe que l'endpoint de webhook, et il vérifie la signature sans le SDK. `STRIPE_SECRET_KEY` appartient au module qui appelle Stripe, la [facturation](../../06-modules/facturation/02-configuration.md) par exemple, et se déclare dans son manifeste.
146
146
 
147
147
  ## Authentification
148
148
 
@@ -208,7 +208,7 @@ La tuile `update` du tableau de bord lit la même variable, mais elle n'a aucune
208
208
 
209
209
  ## Variables d'un module
210
210
 
211
- Chaque module, `@fraza/module-*` ou `@fraza-pro/module-*`, déclare ses propres variables dans `manifest.envVars`. Leur effet est documenté module par module : [Pages](../../06-modules/pages/configuration.md), [Posts](../../06-modules/posts/configuration.md), [Médias](../../06-modules/medias/configuration.md), [Formulaires](../../06-modules/forms/configuration.md), [Facturation](../../06-modules/facturation/configuration.md), [Fichiers](../../06-modules/drive/configuration.md), [Rendez-vous](../../06-modules/booking/configuration.md). Une variable `required: true` absente produit un avertissement au boot, sans faire tomber le serveur : le module gère son propre repli. `fraza-doctor`, lui, la signale comme bloquante ; il reste muet sur les optionnelles absentes, dont la valeur par défaut suffit.
211
+ Chaque module, `@fraza/module-*` ou `@fraza-pro/module-*`, déclare ses propres variables dans `manifest.envVars`. Leur effet est documenté module par module : [Pages](../../06-modules/pages/02-configuration.md), [Posts](../../06-modules/posts/02-configuration.md), [Médias](../../06-modules/medias/02-configuration.md), [Formulaires](../../06-modules/forms/02-configuration.md), [Facturation](../../06-modules/facturation/02-configuration.md), [Fichiers](../../06-modules/drive/02-configuration.md), [Rendez-vous](../../06-modules/booking/02-configuration.md). Une variable `required: true` absente produit un avertissement au boot, sans faire tomber le serveur : le module gère son propre repli. `fraza-doctor`, lui, la signale comme bloquante ; il reste muet sur les optionnelles absentes, dont la valeur par défaut suffit.
212
212
 
213
213
  Un module porte en plus une variable d'activation de la forme `FRAZA_MODULE_<NOM>`, où `<NOM>` est le nom du paquet sans son préfixe : `@fraza-pro/module-billing` s'active par `FRAZA_MODULE_BILLING`. Installé mais non activé, il n'enregistre rien.
214
214
 
@@ -88,7 +88,7 @@ Deux raisons.
88
88
 
89
89
  **Échec silencieux en production.** S'appeler via l'URL publique ressort sur le reverse proxy ou le WAF, qui bloque ou réécrit ces requêtes serveur à serveur. La réponse n'est pas le JSON attendu, le code fait `if (!res.ok) return []`, et la section disparaît sans erreur, alors qu'elle s'affichait en développement.
90
90
 
91
- **À la place, lire la donnée directement côté serveur** via les helpers `./public` que chaque module de contenu expose : [`getPublicPosts`, `getPublicPostBySlug`, `getPublicTaxonomyTerms`](../06-modules/posts/api.md) pour `@fraza/module-posts`, [`listPublicChildPages`, `getPublishedPageBySegments`](../06-modules/pages/api.md) pour `@fraza/module-pages`.
91
+ **À la place, lire la donnée directement côté serveur** via les helpers `./public` que chaque module de contenu expose : [`getPublicPosts`, `getPublicPostBySlug`, `getPublicTaxonomyTerms`](../06-modules/posts/08-api.md) pour `@fraza/module-posts`, [`listPublicChildPages`, `getPublishedPageBySegments`](../06-modules/pages/06-api.md) pour `@fraza/module-pages`.
92
92
 
93
93
  Les routes HTTP restent réservées aux clients navigateur et à l'admin.
94
94
 
@@ -156,7 +156,7 @@ Deux limites à connaître avant d'en ajouter une :
156
156
 
157
157
  L'ordre compte : la deuxième ligne couvre la grande majorité des alertes d'un site Fraza. Next tire `postcss`, `nanoid`, `sharp` et tout le reste de leur arbre, si bien qu'un `npm update next` règle d'un coup la plupart des alertes remontées par `npm audit`. La cible de cette montée est le champ `tested` de [`supported.json`](../03-reference/06-configuration/paquets-supportes.md) : c'est lui que `fraza-doctor` affiche dans son remède.
158
158
 
159
- **Un `package-lock.json` figé est le risque, pas l'exception.** Next lui-même est régulièrement l'objet d'avis de sécurité : la ligne `16.0.0` à `16.3.2` portait deux exécutions de code à distance non authentifiées, et le `sharp` embarqué traînait une faille `libheif` sous `0.35.4`, puis une faille `librsvg` sous `0.35.5`. Un site qui n'a pas rafraîchi son verrou depuis sa création reste exposé même si son `package.json` autorise déjà la version corrigée.
159
+ **Un `package-lock.json` figé est le risque, pas l'exception.** Next lui-même est régulièrement l'objet d'avis de sécurité : la ligne `16.0.0` à `16.3.2` portait deux exécutions de code à distance non authentifiées, la ligne `16.0.0` à `16.4.0` deux autres, corrigées en `16.4.1`, et le `sharp` embarqué traînait une faille `libheif` sous `0.35.4`, puis une faille `librsvg` sous `0.35.5`. Un site qui n'a pas rafraîchi son verrou depuis sa création reste exposé même si son `package.json` autorise déjà la version corrigée.
160
160
 
161
161
  ## Signaler une faille
162
162
 
@@ -77,7 +77,7 @@ L'inverse est permis : un module Pro dépend du core et peut s'appuyer sur les m
77
77
 
78
78
  ## Distribution par le registre
79
79
 
80
- Les paquets sont distribués sous deux scopes. Les paquets Fraza Libre, sous `@fraza`, sont publiés sur npmjs, d'où ils s'installent sans connexion, et sur `registry.fraza.ca` en copie de secours. Les paquets Pro, sous `@fraza-pro`, ne sont publiés que sur `registry.fraza.ca`, et demandent des identifiants nominatifs délivrés par HYKO. Pour eux, le registre est la vraie barrière : sans ces identifiants, le paquet n'est pas installable. L'administration des comptes et des droits est décrite dans [Registre Verdaccio](../05-contribution/06-registre-verdaccio.md).
80
+ Les paquets sont distribués sous deux scopes. Les paquets Fraza Libre, sous `@fraza`, sont publiés sur npmjs, d'où ils s'installent sans connexion. Les paquets Pro, sous `@fraza-pro`, ne sont publiés que sur `registry.fraza.ca`, et demandent des identifiants nominatifs délivrés par HYKO. Pour eux, le registre est la vraie barrière : sans ces identifiants, le paquet n'est pas installable. L'administration des comptes et des droits est décrite dans [Registre Verdaccio](../05-contribution/06-registre-verdaccio.md).
81
81
 
82
82
  Un contrat n'empêche rien techniquement. Il ouvre un recours après la violation, à condition de pouvoir la prouver. Le contrat Pro donne ce recours, le registre empêche l'installation sans droit.
83
83
 
@@ -130,6 +130,16 @@ Uniforme sur toute la section `03-reference/` :
130
130
  4. `## Variables d'environnement`, le cas échéant.
131
131
  5. `## Notes` : pièges et frontières, à la fin.
132
132
 
133
+ ### Structure d'une section de module
134
+
135
+ Uniforme sur toute la section `06-modules/`, pour que la commande d'installation se trouve au même endroit d'un module à l'autre :
136
+
137
+ 1. `index.md` : une phrase de présentation, le bloc `npm i <paquet>`, puis le tableau Paquet, Licence, Registre et Activation, suivi d'un renvoi à Installation. Viennent ensuite la capture, `## Pages de cette section` et `## Ce que le module apporte`.
138
+ 2. Les pages portent un préfixe numérique dans l'ordre du tableau « Pages de cette section », `01-installation.md` en tête. Le site de documentation retire le préfixe de l'URL et s'en sert pour ordonner la barre latérale.
139
+ 3. `01-installation.md` : une phrase, `## Prérequis`, puis `## Installer`, qui enchaîne le paquet, la variable d'activation, `fraza-modules sync` et `fraza-db init`. Viennent ensuite les étapes propres au module, puis `## Vérifier`, `## Mettre à jour` et `## Notes`.
140
+
141
+ Une variable d'environnement montrée dans une page de module va dans un bloc `dotenv`, jamais dans un bloc `bash`.
142
+
133
143
  ### Blocs de commandes
134
144
 
135
145
  Une commande documentée se copie et s'exécute telle quelle dans **bash, zsh et PowerShell**, y compris PowerShell 5.1, celui que Windows livre par défaut. L'invite `cmd.exe` n'est pas une cible : elle ne connaît pas les commentaires `#`, que les blocs utilisent.
@@ -165,7 +165,6 @@ Un `@fraza/module-*` suit la même procédure et les mêmes registres. Un module
165
165
  - Le champ `files` ne publie que `dist`, `LICENSE`, `THIRD-PARTY-NOTICES.md`, `CHANGELOG.md` et `changelog.json`. `README.md` est ajouté par npm quel que soit le champ, et le core y ajoute `.env.example`. `fraza-module release-check` refuse un paquet dont les notes de version manquent ou ne sont pas déclarées dans `files` : sans elles, `fraza-update` ne peut rien annoncer. Chaque module porte son propre exemplaire des deux fichiers légaux : voir [Licence et propriété](../04-architecture/07-licence-et-propriete.md).
166
166
  - Avant publication, vérifier que `dist/` ne contient aucune syntaxe JSX brute. Voir [Créer un module](../02-guides/creer-un-module.md#build-avant-publication).
167
167
  - La documentation d'usage du module vit dans [`docs/06-modules/`](../06-modules/index.md) du core, pas dans le dépôt du module. La mettre à jour **et la publier avant** de publier le module : sinon un projet installe un module dont la documentation décrit la version précédente.
168
- - Mettre à jour la version indiquée en tête de `docs/06-modules/<module>/index.md`.
169
168
 
170
169
  ## Administration du registre
171
170