b5fe5deed5
- Register `content:file:afterParse` hook to inject `wordCount` + `minutes` on every parsed markdown content object (D-19: 200 wpm, floor 1 min). - Import pure util `countWordsInMinimalBody` from app/utils/countWords. - Guard against non-`.md` files (defensive — hook fires on all sources). - Values persist in @nuxt/content SQLite DB and are queryable via queryCollection thanks to matching Zod fields (content.config.ts).
2.0 KiB
2.0 KiB
gsd_state_version, milestone, milestone_name, status, last_updated, last_activity, progress
| gsd_state_version | milestone | milestone_name | status | last_updated | last_activity | progress | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1.0 | v1.0 | milestone | Context gathered — ready for /gsd-plan-phase 6 | 2026-04-22T06:55:05.535Z | 2026-04-22 |
|
Project State
Project Reference
- PROJECT.md: .planning/PROJECT.md
- REQUIREMENTS.md: .planning/REQUIREMENTS.md
- ROADMAP.md: .planning/ROADMAP.md
Current Focus
Phase: Phase 6 — Blog Pages Plan: — Status: Context gathered — ready for /gsd-plan-phase 6 Last activity: 2026-04-22 Resume file: .planning/phases/06-blog-pages/06-UI-SPEC.md
Accumulated Context
- M1 complet — déployé en production sur killiandalcin.fr (phases 1–4)
- Stack : Nuxt 4 SSR + Nuxt UI v3 + Tailwind v4 + pnpm + @nuxt/content v3
- Phase 5 shipped: @nuxt/content installé, collections bilingues
blog_fr/blog_en, composants MDC (ProseImg, Alert, ProsePre, Columns, Details, Badge, Video, Clear), Shiki single github-dark,app/pages/blog/[slug].vuerend les articles FR/EN - Gotchas Phase 5 (à retenir) :
- Catch-all
[...slug].vue+@nuxtjs/i18nstrategyprefix→ page component résout à{}(Vue warn: missing template). Fix : single-segment[slug].vue. queryCollection(variable)pas analysable par le Vite extractor de @nuxt/content → utiliser toujours des littérauxqueryCollection('blog_fr')/queryCollection('blog_en').i18n.baseUrlrequis pouruseLocaleHead(SEO tags). Ne pas retirer.- Redirection langue-détectée sans langue dans l'URL :
detectBrowserLanguage.redirectOn: 'no prefix'+fallbackLocale. Éviter lesrouteRules/blog/**hardcodés (cassent le slug + bloquent la détection navigateur).
- Catch-all
- Objectif double : ranker sur "Hytale plugin developer" ET capter trafic longue traîne via contenu communauté
- Articles bilingues : structure FR/EN dans content/ (ex: content/fr/blog/, content/en/blog/)
- og:image par article : image frontmatter ou fallback branded — jamais l'og-image.png générique M1