@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
@@ -0,0 +1,105 @@
1
+ name: Build and Deploy Site
2
+
3
+ on:
4
+ # Manual trigger
5
+ workflow_dispatch:
6
+ inputs:
7
+ force_rebuild:
8
+ description: 'Force rebuild (ignore cache)'
9
+ required: false
10
+ type: boolean
11
+ default: false
12
+
13
+ # Scheduled rebuild (daily at midnight UTC)
14
+ schedule:
15
+ - cron: '0 0 * * *'
16
+
17
+ # Trigger on push to main
18
+ push:
19
+ branches:
20
+ - main
21
+
22
+ # Webhook from data repository (requires setup)
23
+ repository_dispatch:
24
+ types: [data-updated]
25
+
26
+ permissions:
27
+ contents: read
28
+ pages: write
29
+ id-token: write
30
+
31
+ # Prevent concurrent deployments
32
+ concurrency:
33
+ group: "pages"
34
+ cancel-in-progress: false
35
+
36
+ jobs:
37
+ build:
38
+ runs-on: ubuntu-latest
39
+
40
+ steps:
41
+ - name: 📦 Checkout Engine Repository
42
+ uses: actions/checkout@v4
43
+
44
+ - name: 🔧 Install Dependencies
45
+ run: |
46
+ sudo apt-get update
47
+ sudo apt-get install -y jq curl
48
+
49
+ - name: 🏗️ Build Site
50
+ run: |
51
+ # Set execute permission
52
+ chmod +x build.sh
53
+
54
+ # Run build script
55
+ if [ "${{ github.event.inputs.force_rebuild }}" = "true" ]; then
56
+ ./build.sh --force
57
+ else
58
+ ./build.sh
59
+ fi
60
+ env:
61
+ MANIFEST_URL: ${{ secrets.MANIFEST_URL || 'https://raw.githubusercontent.com/YOUR_USERNAME/retro-portfolio-data/main/manifest.json' }}
62
+
63
+ - name: 📊 Build Summary
64
+ run: |
65
+ echo "### 🎨 Build Summary" >> $GITHUB_STEP_SUMMARY
66
+ echo "" >> $GITHUB_STEP_SUMMARY
67
+ echo "**Build Date:** $(date -u +"%Y-%m-%d %H:%M:%S UTC")" >> $GITHUB_STEP_SUMMARY
68
+
69
+ if [ -f dist/build-info.json ]; then
70
+ echo "**Manifest Version:** $(jq -r '.version' dist/build-info.json)" >> $GITHUB_STEP_SUMMARY
71
+ echo "**Data Source:** $(jq -r '.dataSource' dist/build-info.json)" >> $GITHUB_STEP_SUMMARY
72
+ echo "**Cache Used:** $(jq -r '.cacheUsed' dist/build-info.json)" >> $GITHUB_STEP_SUMMARY
73
+ fi
74
+
75
+ echo "" >> $GITHUB_STEP_SUMMARY
76
+ echo "**Files Generated:**" >> $GITHUB_STEP_SUMMARY
77
+ echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
78
+ ls -lh dist/ >> $GITHUB_STEP_SUMMARY
79
+ echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
80
+
81
+ - name: 📤 Upload Artifact
82
+ uses: actions/upload-pages-artifact@v3
83
+ with:
84
+ path: ./dist
85
+
86
+ deploy:
87
+ needs: build
88
+ runs-on: ubuntu-latest
89
+
90
+ environment:
91
+ name: github-pages
92
+ url: ${{ steps.deployment.outputs.page_url }}
93
+
94
+ steps:
95
+ - name: 🚀 Deploy to GitHub Pages
96
+ id: deployment
97
+ uses: actions/deploy-pages@v4
98
+
99
+ - name: ✅ Deployment Complete
100
+ run: |
101
+ echo "### 🎉 Deployment Successful!" >> $GITHUB_STEP_SUMMARY
102
+ echo "" >> $GITHUB_STEP_SUMMARY
103
+ echo "**Site URL:** ${{ steps.deployment.outputs.page_url }}" >> $GITHUB_STEP_SUMMARY
104
+ echo "" >> $GITHUB_STEP_SUMMARY
105
+ echo "Your site has been successfully deployed!" >> $GITHUB_STEP_SUMMARY
package/ADMIN_SETUP.md ADDED
@@ -0,0 +1,306 @@
1
+ # 🔧 Configuration de l'Admin pour Site-as-a-Package
2
+
3
+ ## 📋 Vue d'ensemble
4
+
5
+ Pour utiliser votre interface admin avec le système Site-as-a-Package, vous avez **deux options** :
6
+
7
+ ### **Option A : Admin dans le repo de données** (Recommandé)
8
+ - Admin hébergé dans `retro-portfolio-data`
9
+ - Modifie directement les fichiers data/
10
+ - Commit et push automatique vers GitHub
11
+ - Déclenche rebuild du site engine
12
+
13
+ ### **Option B : Admin local séparé**
14
+ - Admin sur votre machine uniquement
15
+ - Utilise l'API Python existante
16
+ - Vous push manuellement vers GitHub
17
+
18
+ ---
19
+
20
+ ## 🚀 Option A : Admin dans le Data Repo (Recommandé)
21
+
22
+ ### Architecture
23
+
24
+ ```
25
+ retro-portfolio-data/
26
+ ├── config/
27
+ ├── data/
28
+ ├── lang/
29
+ ├── admin/ ← Nouveau dossier
30
+ │ ├── index.html (admin.html)
31
+ │ ├── admin.css
32
+ │ ├── admin.js (logique admin)
33
+ │ └── api/
34
+ │ └── github-sync.php (ou .js pour serverless)
35
+ └── .github/workflows/
36
+ └── notify-engine.yml (notifie le engine après modification)
37
+ ```
38
+
39
+ ### Fonctionnement
40
+
41
+ 1. **Vous modifiez** via l'admin → `retro-portfolio-data.github.io/admin/`
42
+ 2. **Admin commit** les changements vers `data/` via GitHub API
43
+ 3. **Webhook** notifie `retro-portfolio-engine`
44
+ 4. **Engine rebuild** automatiquement avec nouvelles données
45
+
46
+ ### Avantages
47
+
48
+ ✅ Accessible de partout (web-based)
49
+ ✅ Pas besoin de Python local
50
+ ✅ Git history automatique
51
+ ✅ Rebuild automatique du site
52
+
53
+ ### Configuration requise
54
+
55
+ 1. **Personal Access Token (PAT)** avec scope `repo`
56
+ 2. **GitHub Pages** activé sur `retro-portfolio-data`
57
+
58
+ ---
59
+
60
+ ## 🛠️ Option B : Admin Local (Simple)
61
+
62
+ ### Architecture
63
+
64
+ ```
65
+ votre-machine/
66
+ ├── retro-portfolio-data/ (clone du repo)
67
+ │ ├── config/
68
+ │ ├── data/
69
+ │ └── lang/
70
+ └── admin-local/
71
+ ├── admin.html
72
+ ├── admin_api.py (votre API existante)
73
+ └── scripts/
74
+ ```
75
+
76
+ ### Fonctionnement
77
+
78
+ 1. **Clone** `retro-portfolio-data` localement
79
+ 2. **Lancez** `python3 admin_api.py`
80
+ 3. **Ouvrez** `admin.html` dans le navigateur
81
+ 4. **Modifiez** vos données
82
+ 5. **Push manuellement** :
83
+ ```bash
84
+ cd retro-portfolio-data
85
+ git add data/
86
+ git commit -m "Update content via admin"
87
+ git push
88
+ ```
89
+ 6. **Rebuild** déclenché automatiquement
90
+
91
+ ### Avantages
92
+
93
+ ✅ Utilise votre admin existant
94
+ ✅ Pas de configuration complexe
95
+ ✅ Contrôle total
96
+
97
+ ### Inconvénients
98
+
99
+ ❌ Nécessite Python local
100
+ ❌ Push manuel requis
101
+ ❌ Pas accessible à distance
102
+
103
+ ---
104
+
105
+ ## 🎨 Configuration de l'Option B (Quick Start)
106
+
107
+ ### 1. Préparer le repo de données
108
+
109
+ ```bash
110
+ # Créer et cloner le repo de données
111
+ git clone https://github.com/YOUR_USERNAME/retro-portfolio-data.git
112
+ cd retro-portfolio-data
113
+
114
+ # Copier vos données existantes
115
+ cp -r ../retro-portfolio/config ./
116
+ cp -r ../retro-portfolio/data ./
117
+ cp -r ../retro-portfolio/lang ./
118
+
119
+ git add .
120
+ git commit -m "Initial data import"
121
+ git push
122
+ ```
123
+
124
+ ### 2. Configurer l'admin local
125
+
126
+ ```bash
127
+ # Créer dossier admin
128
+ mkdir -p admin-local
129
+
130
+ # Copier admin files
131
+ cp ../retro-portfolio/admin.html admin-local/
132
+ cp ../retro-portfolio/admin.css admin-local/
133
+ cp ../retro-portfolio/admin_api.py admin-local/
134
+ cp -r ../retro-portfolio/scripts admin-local/
135
+
136
+ # Copier .env (credentials Cloudinary)
137
+ cp ../retro-portfolio/.env admin-local/
138
+ ```
139
+
140
+ ### 3. Modifier admin_api.py pour pointer vers le data repo
141
+
142
+ ```python
143
+ # admin-local/admin_api.py
144
+
145
+ # Modifier les chemins
146
+ DATA_DIR = '../retro-portfolio-data/data'
147
+ CONFIG_DIR = '../retro-portfolio-data/config'
148
+ LANG_DIR = '../retro-portfolio-data/lang'
149
+ ```
150
+
151
+ ### 4. Lancer l'admin
152
+
153
+ ```bash
154
+ cd admin-local
155
+ python3 admin_api.py
156
+
157
+ # Dans un autre terminal
158
+ cd retro-portfolio-data
159
+ python3 -m http.server 8001
160
+
161
+ # Ouvrir http://localhost:8001/admin-local/admin.html
162
+ ```
163
+
164
+ ### 5. Workflow de mise à jour
165
+
166
+ ```bash
167
+ # Après modification via admin
168
+ cd retro-portfolio-data
169
+
170
+ # Vérifier les changements
171
+ git status
172
+
173
+ # Commit
174
+ git add data/ lang/
175
+ git commit -m "Update content via admin"
176
+
177
+ # Push (déclenche rebuild automatique)
178
+ git push
179
+ ```
180
+
181
+ ---
182
+
183
+ ## 🌐 Configuration de l'Option A (Avancé)
184
+
185
+ ### 1. Activer GitHub Pages sur le data repo
186
+
187
+ ```bash
188
+ # Dans retro-portfolio-data/
189
+ mkdir -p admin
190
+ cp ../retro-portfolio/admin.html admin/index.html
191
+ cp ../retro-portfolio/admin.css admin/
192
+
193
+ git add admin/
194
+ git commit -m "Add web-based admin"
195
+ git push
196
+ ```
197
+
198
+ Settings → Pages → Source: `main` branch → `/` (root)
199
+
200
+ ### 2. Créer l'API serverless
201
+
202
+ ```javascript
203
+ // admin/api/sync.js (pour Vercel/Netlify)
204
+ import { Octokit } from "@octokit/rest";
205
+
206
+ export default async function handler(req, res) {
207
+ if (req.method !== 'POST') {
208
+ return res.status(405).json({ error: 'Method not allowed' });
209
+ }
210
+
211
+ const { category, data, message } = req.body;
212
+ const PAT = process.env.GITHUB_PAT;
213
+
214
+ const octokit = new Octokit({ auth: PAT });
215
+
216
+ try {
217
+ // Get current file content
218
+ const { data: currentFile } = await octokit.repos.getContent({
219
+ owner: 'YOUR_USERNAME',
220
+ repo: 'retro-portfolio-data',
221
+ path: `data/${category}.json`,
222
+ });
223
+
224
+ // Update file
225
+ await octokit.repos.createOrUpdateFileContents({
226
+ owner: 'YOUR_USERNAME',
227
+ repo: 'retro-portfolio-data',
228
+ path: `data/${category}.json`,
229
+ message: message || 'Update via admin',
230
+ content: Buffer.from(JSON.stringify(data, null, 2)).toString('base64'),
231
+ sha: currentFile.sha,
232
+ });
233
+
234
+ res.status(200).json({ success: true });
235
+ } catch (error) {
236
+ res.status(500).json({ error: error.message });
237
+ }
238
+ }
239
+ ```
240
+
241
+ ### 3. Adapter admin.html
242
+
243
+ ```javascript
244
+ // Dans admin.html, remplacer les appels API
245
+
246
+ async function saveData(category, items) {
247
+ const response = await fetch('/api/sync', {
248
+ method: 'POST',
249
+ headers: { 'Content-Type': 'application/json' },
250
+ body: JSON.stringify({
251
+ category,
252
+ data: { items },
253
+ message: `Update ${category} via web admin`
254
+ })
255
+ });
256
+
257
+ if (!response.ok) throw new Error('Failed to save');
258
+
259
+ // Déclencher rebuild du engine
260
+ await triggerRebuild();
261
+ }
262
+
263
+ async function triggerRebuild() {
264
+ await fetch('https://api.github.com/repos/YOUR_USERNAME/retro-portfolio-engine/dispatches', {
265
+ method: 'POST',
266
+ headers: {
267
+ 'Authorization': `token ${GITHUB_PAT}`,
268
+ 'Accept': 'application/vnd.github+json'
269
+ },
270
+ body: JSON.stringify({ event_type: 'data-updated' })
271
+ });
272
+ }
273
+ ```
274
+
275
+ ---
276
+
277
+ ## 🔐 Sécurité
278
+
279
+ ### Pour l'Option A (Web Admin)
280
+
281
+ 1. **Protéger l'admin** avec authentification
282
+ 2. **Utiliser des secrets** pour le PAT (variables d'environnement)
283
+ 3. **Limiter les permissions** du PAT au strict nécessaire
284
+
285
+ ### Pour l'Option B (Local Admin)
286
+
287
+ 1. **Ne jamais commit** votre `.env` avec credentials
288
+ 2. **Ajouter** `.env` au `.gitignore`
289
+
290
+ ---
291
+
292
+ ## 📊 Recommandation
293
+
294
+ Pour votre cas, je recommande **Option B** car :
295
+
296
+ ✅ Plus simple à mettre en place
297
+ ✅ Réutilise votre admin existant
298
+ ✅ Pas de configuration serverless
299
+ ✅ Contrôle total local
300
+
301
+ Le workflow devient :
302
+ ```
303
+ Modifier via admin local → git push → Rebuild auto du site
304
+ ```
305
+
306
+ Voulez-vous que je vous prépare les scripts pour l'Option B ?