@mtldev514/retro-portfolio-engine 1.0.0 → 1.1.2

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 (52) hide show
  1. package/.github/workflows/build-and-deploy.yml +105 -0
  2. package/ADMIN_SETUP.md +306 -0
  3. package/README.md +193 -301
  4. package/USAGE.md +451 -0
  5. package/build.sh +326 -0
  6. package/index.html +85 -0
  7. package/js/manifest-loader.js +313 -0
  8. package/manifest.json +74 -0
  9. package/package.json +14 -38
  10. package/setup-admin.sh +134 -0
  11. package/sync-after-admin.sh +58 -0
  12. package/bin/cli.js +0 -103
  13. package/engine/admin/admin.css +0 -720
  14. package/engine/admin/admin.html +0 -801
  15. package/engine/admin/admin_api.py +0 -230
  16. package/engine/admin/scripts/backup.sh +0 -116
  17. package/engine/admin/scripts/config_loader.py +0 -180
  18. package/engine/admin/scripts/init.sh +0 -141
  19. package/engine/admin/scripts/manager.py +0 -308
  20. package/engine/admin/scripts/restore.sh +0 -121
  21. package/engine/admin/scripts/server.py +0 -41
  22. package/engine/admin/scripts/update.sh +0 -321
  23. package/engine/admin/scripts/validate_json.py +0 -62
  24. package/engine/fonts.css +0 -37
  25. package/engine/index.html +0 -190
  26. package/engine/js/config-loader.js +0 -370
  27. package/engine/js/config.js +0 -173
  28. package/engine/js/counter.js +0 -17
  29. package/engine/js/effects.js +0 -97
  30. package/engine/js/i18n.js +0 -68
  31. package/engine/js/init.js +0 -107
  32. package/engine/js/media.js +0 -264
  33. package/engine/js/render.js +0 -282
  34. package/engine/js/router.js +0 -133
  35. package/engine/js/sparkle.js +0 -123
  36. package/engine/js/themes.js +0 -607
  37. package/engine/style.css +0 -2037
  38. package/index.js +0 -35
  39. package/scripts/admin.js +0 -67
  40. package/scripts/build.js +0 -142
  41. package/scripts/init.js +0 -237
  42. package/scripts/post-install.js +0 -16
  43. package/scripts/serve.js +0 -54
  44. package/templates/user-portfolio/.github/workflows/deploy.yml +0 -57
  45. package/templates/user-portfolio/config/app.json +0 -36
  46. package/templates/user-portfolio/config/categories.json +0 -241
  47. package/templates/user-portfolio/config/languages.json +0 -15
  48. package/templates/user-portfolio/config/media-types.json +0 -59
  49. package/templates/user-portfolio/data/painting.json +0 -3
  50. package/templates/user-portfolio/data/projects.json +0 -3
  51. package/templates/user-portfolio/lang/en.json +0 -114
  52. package/templates/user-portfolio/lang/fr.json +0 -114
package/README.md CHANGED
@@ -1,408 +1,300 @@
1
- # @retro-portfolio/engine
1
+ # 🎨 Site-as-a-Package Engine
2
2
 
3
- [![npm version](https://badge.fury.io/js/%40retro-portfolio%2Fengine.svg)](https://www.npmjs.com/package/@retro-portfolio/engine)
4
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
3
+ Un moteur de site web autonome qui récupère son contenu depuis un repo distant et se construit automatiquement. Concept **Site-as-a-Package** : le code du moteur est séparé des données.
5
4
 
6
- **Site-as-a-Package** 🎨 Un moteur de portfolio rétro que vous installez via NPM. Vous fournissez vos données, le package fournit tout le reste.
5
+ ## 🚀 Concept
7
6
 
8
- ## 🎯 Concept
7
+ Au lieu d'avoir un site avec du contenu figé, ce repo contient uniquement :
9
8
 
10
- Au lieu de cloner un repo complet, vous **installez un package NPM** qui contient tout le moteur (HTML, CSS, JS, admin). Vous gardez uniquement **vos données** dans votre repo.
9
+ 1. **Le moteur de rendu** (HTML, CSS, JS)
10
+ 2. **Un script de build** qui récupère les données distantes
11
+ 3. **Une GitHub Action** qui automatise tout
11
12
 
12
- ### Avantages
13
+ Les **données, traductions et configurations** sont stockées dans un repo séparé. À chaque build, le moteur récupère la dernière version du contenu.
13
14
 
14
- **Un seul repo** pour l'utilisateur (juste ses données)
15
- ✅ **Mises à jour faciles** via `npm update`
16
- ✅ **Pas de merge conflicts** pour récupérer les nouvelles features
17
- ✅ **Workflow simple** : `npm install` → `npm run build`
18
- ✅ **Admin inclus** pour gérer le contenu visuellement
15
+ ## 📁 Architecture
19
16
 
20
- ---
21
-
22
- ## 🚀 Quick Start
23
-
24
- ### Pour créer votre portfolio
25
-
26
- ```bash
27
- # 1. Créer un nouveau portfolio
28
- npx @retro-portfolio/engine init mon-portfolio
29
- cd mon-portfolio
30
-
31
- # 2. Installer les dépendances
32
- npm install
33
-
34
- # 3. Lancer le serveur de dev
35
- npm run dev
36
-
37
- # 4. Ouvrir http://localhost:8000
38
- ```
39
-
40
- C'est tout ! 🎉
41
-
42
- ---
43
-
44
- ## 📦 Installation dans un projet existant
45
-
46
- ```bash
47
- npm install @retro-portfolio/engine
48
17
  ```
49
-
50
- Puis ajoutez les scripts dans votre `package.json` :
51
-
52
- ```json
53
- {
54
- "scripts": {
55
- "build": "retro-portfolio build",
56
- "dev": "retro-portfolio dev",
57
- "admin": "retro-portfolio admin"
58
- }
59
- }
60
- ```
61
-
62
- ---
63
-
64
- ## 📁 Structure de votre projet
65
-
66
- Après `init`, votre projet contient **uniquement vos données** :
67
-
68
- ```
69
- mon-portfolio/
70
- ├── package.json (dépendance: @retro-portfolio/engine)
71
- ├── config/ (VOS configurations)
18
+ retro-portfolio-engine/ (Ce repo - Le moteur)
19
+ ├── index.html Squelette HTML
20
+ ├── style.css, fonts.css Styles
21
+ ├── js/
22
+ │ ├── manifest-loader.js Charge le manifest distribué
23
+ │ ├── i18n.js, render.js Modules du moteur
24
+ │ └── ...
25
+ ├── build.sh Script de build avec cache
26
+ ├── manifest.json Configuration du data repo
27
+ └── .github/workflows/
28
+ └── build-and-deploy.yml Automatisation GitHub
29
+
30
+ retro-portfolio-data/ (Repo séparé - Les données)
31
+ ├── manifest.json Point d'entrée
32
+ ├── config/
72
33
  │ ├── app.json
73
34
  │ ├── languages.json
74
35
  │ └── categories.json
75
- ├── data/ (VOTRE contenu)
36
+ ├── data/
76
37
  │ ├── painting.json
77
- │ └── projects.json
78
- ├── lang/ (VOS traductions)
79
- ├── en.json
80
- └── fr.json
81
- └── assets/ (VOS images, etc.)
38
+ │ └── ...
39
+ └── lang/
40
+ ├── en.json
41
+ └── fr.json
82
42
  ```
83
43
 
84
- **Pas de code du site** dans votre repo ! Tout vient du package NPM.
85
-
86
- ---
87
-
88
- ## 🛠️ Commandes
89
-
90
- ### `retro-portfolio init [directory]`
44
+ ## 🔧 Installation
91
45
 
92
- Crée un nouveau portfolio avec les templates de données.
46
+ ### 1. Cloner le repo moteur
93
47
 
94
48
  ```bash
95
- # Créer dans le dossier actuel
96
- retro-portfolio init
97
-
98
- # Créer dans un nouveau dossier
99
- retro-portfolio init mon-portfolio
100
-
101
- # Forcer l'écrasement
102
- retro-portfolio init --force
49
+ git clone https://github.com/YOUR_USERNAME/retro-portfolio-engine.git
50
+ cd retro-portfolio-engine
103
51
  ```
104
52
 
105
- ### `retro-portfolio build`
53
+ ### 2. Configurer le manifest
106
54
 
107
- Génère le site statique en fusionnant le moteur avec vos données.
55
+ Éditez `manifest.json` et changez les URLs :
108
56
 
109
- ```bash
110
- # Build standard
111
- npm run build
112
-
113
- # Spécifier le dossier de sortie
114
- retro-portfolio build --output public
115
-
116
- # Watch mode (rebuild automatique)
117
- retro-portfolio build --watch
57
+ ```json
58
+ {
59
+ "dataRepository": {
60
+ "owner": "YOUR_USERNAME",
61
+ "repo": "retro-portfolio-data",
62
+ "branch": "main",
63
+ "baseUrl": "https://raw.githubusercontent.com/YOUR_USERNAME/retro-portfolio-data/main/"
64
+ }
65
+ }
118
66
  ```
119
67
 
120
- **Ce qui se passe** :
121
- 1. Le package copie ses fichiers engine (HTML, CSS, JS)
122
- 2. Il fusionne avec vos fichiers `config/`, `data/`, `lang/`
123
- 3. Génère un site complet dans `dist/`
124
-
125
- ### `retro-portfolio dev`
126
-
127
- Lance un serveur de développement local.
68
+ ### 3. Build local (avec cache)
128
69
 
129
70
  ```bash
130
- npm run dev
71
+ # Build normal (utilise le cache si disponible)
72
+ ./build.sh
131
73
 
132
- # Port personnalisé
133
- retro-portfolio dev --port 3000
74
+ # Force le re-téléchargement complet
75
+ ./build.sh --force
134
76
 
135
- # Ouvrir automatiquement le navigateur
136
- retro-portfolio dev --open
77
+ # Tester localement
78
+ cd dist
79
+ python3 -m http.server 8000
80
+ # Ouvrir http://localhost:8000
137
81
  ```
138
82
 
139
- ### `retro-portfolio admin`
83
+ ### 4. Déploiement automatique sur GitHub Pages
140
84
 
141
- Lance l'interface d'administration pour gérer votre contenu.
85
+ 1. **Activer GitHub Pages** dans les paramètres du repo :
86
+ - Settings → Pages
87
+ - Source : **GitHub Actions**
142
88
 
143
- ```bash
144
- npm run admin
89
+ 2. **Configurer le secret (optionnel)** :
90
+ - Settings → Secrets → Actions
91
+ - Ajouter `MANIFEST_URL` si votre manifest est ailleurs
145
92
 
146
- # Port personnalisé
147
- retro-portfolio admin --port 5001
93
+ 3. **Déclencher un build** :
94
+ - Push sur `main` → build automatique
95
+ - Actions → Build and Deploy Site → Run workflow
148
96
 
149
- # Ouvrir automatiquement le navigateur
150
- retro-portfolio admin --open
151
- ```
97
+ ## 🎯 Utilisation
152
98
 
153
- **Interface admin** : Ajoutez/modifiez votre contenu visuellement, uploadez des images, gérez les traductions.
99
+ ### Mode 1 : Build automatique (recommandé)
154
100
 
155
- ---
101
+ GitHub Action se déclenche automatiquement :
156
102
 
157
- ## 🔄 Workflow Complet
103
+ - À chaque push sur `main`
104
+ - ✅ Tous les jours à minuit (récupère les nouvelles données)
105
+ - ✅ Manuellement depuis l'onglet Actions
158
106
 
159
- ### 1️⃣ Setup initial
107
+ ### Mode 2 : Build manuel
160
108
 
161
109
  ```bash
162
- npx @retro-portfolio/engine init mon-portfolio
163
- cd mon-portfolio
164
- npm install
165
- ```
166
-
167
- ### 2️⃣ Configuration
110
+ # Build avec cache (rapide)
111
+ ./build.sh
168
112
 
169
- Éditez vos fichiers de config :
113
+ # Build complet (ignore le cache)
114
+ ./build.sh --force
170
115
 
171
- ```bash
172
- # Configurez votre site
173
- nano config/app.json
116
+ # Build avec manifest custom
117
+ ./build.sh --manifest https://example.com/manifest.json
174
118
 
175
- # Ajoutez vos catégories
176
- nano config/categories.json
119
+ # Options avancées
120
+ ./build.sh --help
177
121
  ```
178
122
 
179
- ### 3️⃣ Ajout de contenu
123
+ ## 🔄 Mettre à jour le contenu
180
124
 
181
- **Option A** : Via l'admin (recommandé)
125
+ ### Option A : Modifier le repo de données
182
126
 
183
- ```bash
184
- npm run admin
185
- # Ouvrir http://localhost:5001/admin.html
186
- # Upload images, ajouter descriptions, etc.
187
- ```
127
+ 1. Modifier les fichiers dans `retro-portfolio-data/`
128
+ 2. Commit & push
129
+ 3. (Optionnel) Déclencher un rebuild du moteur
188
130
 
189
- **Option B** : Édition manuelle JSON
131
+ ### Option B : Utiliser un webhook
190
132
 
191
- ```bash
192
- nano data/painting.json
193
- ```
133
+ Configurez le repo de données pour notifier le moteur :
194
134
 
195
- ### 4️⃣ Preview local
135
+ ```yaml
136
+ # Dans retro-portfolio-data/.github/workflows/notify.yml
137
+ on:
138
+ push:
139
+ branches: [main]
196
140
 
197
- ```bash
198
- npm run dev
199
- # Ouvrir http://localhost:8000
141
+ jobs:
142
+ notify-engine:
143
+ runs-on: ubuntu-latest
144
+ steps:
145
+ - name: Trigger rebuild
146
+ run: |
147
+ curl -X POST \
148
+ -H "Authorization: token ${{ secrets.PAT_TOKEN }}" \
149
+ https://api.github.com/repos/YOUR_USERNAME/retro-portfolio-engine/dispatches \
150
+ -d '{"event_type": "data-updated"}'
200
151
  ```
201
152
 
202
- ### 5️⃣ Build pour production
153
+ ## 🛡️ Sécurité et Bonnes Pratiques
203
154
 
204
- ```bash
205
- npm run build
206
- # → génère dist/
207
- ```
155
+ ### ✅ CORS
208
156
 
209
- ### 6️⃣ Déploiement
157
+ `raw.githubusercontent.com` envoie automatiquement `Access-Control-Allow-Origin: *`, donc **pas de problème CORS** pour les requêtes GET.
210
158
 
211
- **GitHub Pages** :
159
+ ### Validation des données
212
160
 
213
- ```bash
214
- # Pusher le dossier dist/ sur la branche gh-pages
215
- git add dist -f
216
- git commit -m "Deploy"
217
- git subtree push --prefix dist origin gh-pages
161
+ Le `manifest-loader.js` valide la structure du manifest :
162
+
163
+ ```javascript
164
+ validateManifest(manifest) {
165
+ const required = ['version', 'dataRepository', 'structure'];
166
+ // Validation stricte
167
+ }
218
168
  ```
219
169
 
220
- Ou utilisez la GitHub Action fournie (voir section Déploiement).
170
+ ### Cache intelligent
221
171
 
222
- ---
172
+ Le script `build.sh` utilise un cache local (`.cache/`) :
223
173
 
224
- ## 🎨 Personnalisation
174
+ - Accélère les builds répétés
175
+ - 🔄 TTL de 1 heure par défaut
176
+ - 🔨 Option `--force` pour forcer le refresh
225
177
 
226
- ### Ajouter un thème custom
178
+ ### Sanitisation
227
179
 
228
- Créez `assets/custom-theme.css` :
180
+ Tous les contenus HTML sont sanitisés pour éviter les XSS :
229
181
 
230
- ```css
231
- :root {
232
- --primary-color: #your-color;
233
- --font-family: 'Your-Font', monospace;
182
+ ```javascript
183
+ sanitizeHTML(str) {
184
+ const temp = document.createElement('div');
185
+ temp.textContent = str;
186
+ return temp.innerHTML;
234
187
  }
235
188
  ```
236
189
 
237
- Le build l'inclura automatiquement !
238
-
239
- ### Ajouter des pages custom
190
+ ## 📊 Fonctionnalités
240
191
 
241
- Créez `pages/about.html` dans votre projet. Le moteur le détectera au build.
192
+ ### Avantages
242
193
 
243
- ---
194
+ - **🔄 Toujours à jour** : Récupère la dernière version du contenu à chaque build
195
+ - **📦 Léger** : Le repo moteur est quasi vide
196
+ - **🌍 Multi-langues** : Support natif de plusieurs langues
197
+ - **⚡ Performant** : Cache intelligent, build optimisé
198
+ - **🔒 Sécurisé** : Validation, sanitisation, pas d'eval()
199
+ - **🚀 Zero-config** : Push et c'est déployé
244
200
 
245
- ## 🔄 Mettre à jour le moteur
201
+ ### 🎨 Personnalisation
246
202
 
247
- Pour récupérer les dernières features du moteur :
203
+ Vous pouvez modifier :
248
204
 
249
- ```bash
250
- npm update @retro-portfolio/engine
205
+ - `style.css` : Apparence visuelle
206
+ - `js/render.js` : Logique de rendu
207
+ - `manifest.json` : Source des données
251
208
 
252
- # Ou version spécifique
253
- npm install @retro-portfolio/engine@latest
254
- ```
255
-
256
- **Aucun conflit de merge** ! Vos données restent intactes.
209
+ ## 🐛 Dépannage
257
210
 
258
- ---
211
+ ### Le build échoue
259
212
 
260
- ## 🌐 Déploiement
213
+ ```bash
214
+ # Vérifier que jq est installé
215
+ which jq
261
216
 
262
- ### GitHub Pages (automatique)
217
+ # Tester manuellement le manifest
218
+ curl https://raw.githubusercontent.com/YOUR_USERNAME/retro-portfolio-data/main/manifest.json
263
219
 
264
- Créez `.github/workflows/deploy.yml` :
220
+ # Build en mode verbose
221
+ bash -x build.sh
222
+ ```
265
223
 
266
- ```yaml
267
- name: Deploy to GitHub Pages
224
+ ### Les données ne se mettent pas à jour
268
225
 
269
- on:
270
- push:
271
- branches: [main]
226
+ ```bash
227
+ # Forcer le re-téléchargement
228
+ ./build.sh --force
272
229
 
273
- jobs:
274
- deploy:
275
- runs-on: ubuntu-latest
276
- steps:
277
- - uses: actions/checkout@v3
278
- - uses: actions/setup-node@v3
279
- with:
280
- node-version: '18'
281
-
282
- - run: npm install
283
- - run: npm run build
284
-
285
- - uses: peaceiris/actions-gh-pages@v3
286
- with:
287
- github_token: ${{ secrets.GITHUB_TOKEN }}
288
- publish_dir: ./dist
230
+ # Vider le cache
231
+ rm -rf .cache
232
+ ./build.sh
289
233
  ```
290
234
 
291
- Push sur `main` → Site déployé automatiquement ! ✨
235
+ ### GitHub Action échoue
292
236
 
293
- ### Netlify / Vercel
294
-
295
- **Build command** : `npm run build`
296
- **Publish directory** : `dist`
297
-
298
- ---
237
+ 1. Vérifier que GitHub Pages est activé
238
+ 2. Vérifier les permissions dans Settings → Actions → Workflow permissions
239
+ 3. Consulter les logs dans Actions → Build and Deploy
299
240
 
300
241
  ## 📚 Documentation Avancée
301
242
 
302
- ### Structure du package
243
+ ### Structure du Manifest
303
244
 
304
- ```
305
- @retro-portfolio/engine/
306
- ├── engine/ (Code du site - copié au build)
307
- │ ├── index.html
308
- │ ├── style.css
309
- │ ├── js/
310
- │ └── admin/
311
- ├── scripts/ (Scripts Node.js)
312
- │ ├── build.js
313
- │ ├── serve.js
314
- │ └── admin.js
315
- ├── bin/
316
- │ └── cli.js (CLI retro-portfolio)
317
- └── templates/ (Templates pour init)
318
- ```
319
-
320
- ### API de données
321
-
322
- Format des fichiers JSON :
323
-
324
- **data/painting.json** :
325
245
  ```json
326
246
  {
327
- "items": [
328
- {
329
- "id": "unique-id",
330
- "title": {
331
- "en": "Sunset",
332
- "fr": "Coucher de soleil"
333
- },
334
- "description": {
335
- "en": "A beautiful sunset",
336
- "fr": "Un magnifique coucher de soleil"
337
- },
338
- "image": "https://cloudinary.com/...",
339
- "date": "2026-01-15"
247
+ "version": "1.0.0",
248
+ "dataRepository": {
249
+ "type": "github",
250
+ "baseUrl": "https://raw.githubusercontent.com/..."
251
+ },
252
+ "structure": {
253
+ "config": {
254
+ "app": "config/app.json",
255
+ "languages": "config/languages.json"
256
+ },
257
+ "data": {
258
+ "painting": "data/painting.json"
259
+ },
260
+ "lang": {
261
+ "en": "lang/en.json"
340
262
  }
341
- ]
342
- }
343
- ```
344
-
345
- **lang/en.json** :
346
- ```json
347
- {
348
- "header_title": "My Portfolio",
349
- "nav_painting": "Paintings",
350
- "footer_copy": "© 2026 Your Name"
263
+ }
351
264
  }
352
265
  ```
353
266
 
354
- ---
355
-
356
- ## 🐛 Dépannage
357
-
358
- ### Le build échoue
359
-
360
- ```bash
361
- # Vérifier que les dossiers requis existent
362
- ls -la config/ data/ lang/
363
-
364
- # Réinstaller le package
365
- rm -rf node_modules
366
- npm install
367
- ```
267
+ ### API du ManifestLoader
368
268
 
369
- ### L'admin ne démarre pas
269
+ ```javascript
270
+ // Initialiser
271
+ await ManifestLoader.init('./manifest.json');
370
272
 
371
- L'admin nécessite Python 3 et Flask :
273
+ // Récupérer des URLs
274
+ const appConfigUrl = ManifestLoader.getConfigUrl('app');
275
+ const paintingUrl = ManifestLoader.getDataUrl('painting');
276
+ const frTransUrl = ManifestLoader.getLangUrl('fr');
372
277
 
373
- ```bash
374
- pip install flask flask-cors
278
+ // Lister les langues disponibles
279
+ const langs = ManifestLoader.getAvailableLanguages();
375
280
  ```
376
281
 
377
- ### Les images ne s'affichent pas
378
-
379
- Vérifiez que vos URLs d'images sont complètes (Cloudinary, etc.) ou placez-les dans `assets/`.
380
-
381
- ---
382
-
383
282
  ## 🤝 Contribution
384
283
 
385
- Ce package est open source ! Pour contribuer :
284
+ Les contributions sont les bienvenues ! Pour contribuer :
386
285
 
387
- 1. Fork le repo [retro-portfolio-engine](https://github.com/YOUR_USERNAME/retro-portfolio-engine)
388
- 2. Créez une branche feature
389
- 3. Soumettez une Pull Request
390
-
391
- ---
286
+ 1. Fork le projet
287
+ 2. Créer une branche (`git checkout -b feature/amazing`)
288
+ 3. Commit vos changements
289
+ 4. Push et créer une Pull Request
392
290
 
393
291
  ## 📄 Licence
394
292
 
395
- MIT © Alex
293
+ MIT License - Utilisation libre
396
294
 
397
295
  ---
398
296
 
399
- ## 🔗 Liens
400
-
401
- - [Documentation](https://github.com/YOUR_USERNAME/retro-portfolio-engine)
402
- - [NPM Package](https://www.npmjs.com/package/@retro-portfolio/engine)
403
- - [Issues](https://github.com/YOUR_USERNAME/retro-portfolio-engine/issues)
404
- - [Exemples](https://github.com/YOUR_USERNAME/retro-portfolio-examples)
405
-
406
- ---
297
+ **Fait avec 💜 par Alex**
407
298
 
408
- **Fait avec 💜 pour la communauté créative**
299
+ 🔗 [Demo](https://YOUR_USERNAME.github.io/retro-portfolio-engine/)
300
+ 🐛 [Issues](https://github.com/YOUR_USERNAME/retro-portfolio-engine/issues)