Commit Graph

228 Commits

Author SHA1 Message Date
kayjaydee d5dbbb6dff feat(hytale): add HytaleDemoGrid component and demo data
- Introduced HytaleDemoGrid.vue to showcase live Hytale plugins with a responsive layout.
- Created hytaleDemos.ts to manage demo data, including details for VotePipe and GravityFlip plugins.
- Updated Hytale page to include the new demo grid section.
- Enhanced AppFooter and ServicesSection with i18n support for better localization.
- Added new blog post detailing the development process of the GravityFlip plugin, available in both English and French.

This commit enhances the visibility of Hytale plugins and improves the overall user experience on the site.
2026-04-25 15:39:53 +02:00
kayjaydee 0d238c5b0d feat(pricing): recalibrate to real Hytale market (149€/349€/790€)
Pricing refonte après rapport 3 (RESEARCH/Hytale/3 Pricing Calibration).

**Décision clé du rapport** : aucun serveur Hytale n'a payé €500+ pour
un plugin single en 2026 (public data). Top server Runeteria = 29 CCU
peak, €200-800/mois gross revenue ceiling. 70-80% du top 30 serveurs
= volunteer/owner-coded, zéro budget externe.

**Nouvelle grille adaptée à la réalité du marché Hytale** :
- Plugin Essentiel     149€   (1 feature, ≤8h, livraison 3-5j)
- Système Sur-Mesure   349€   (GUI in-game, ≤20h, 1-2 sem)  [featured]
- Module Flagship      790€   (quote-based, top-30 tier only)
- Retainer Mensuel     450€/mois (~12h/mo)
- Site Gaming          500€

**Ajout** : pricingNote avec mention 45€/h (spot fixes) et flagship CTA.

Ancienne grille (400€/1500€/5000€) filtrait 95% du marché — non viable.
Nouvelle grille capture ~85% de la demande Hytale observée tout en
laissant room upsell pour les 5-8 flagship servers réels.

RESEARCH/Hytale/3 ajouté (rapport complet avec top 30 audit, BBB
scatter analysis, WTP evidence par segment, 3 scénarios projetés).
2026-04-24 13:51:41 +02:00
kayjaydee 133f7fdaa3 feat(rebrand): pricing market-calibrated + remove /fiverr entirely
PRICING (/hytale) calibrated from market research (RESEARCH/Hytale/):
- Plugin Express: from 400€ (1-2j, petit système scopé)
- Projet Sur-Mesure: from 1 500€ (2-6 sem, featured popular)
- Système MMO Complet: from 5 000€ (4-8 sem, stack complet)
- Retainer Mensuel: from 800€/mois (4-8h/sem)
- Site Gaming/Serveur: from 1 000€ (Nuxt SSR + vote-rewards)

Source: TJM défensif senior Java FR 7ans = €450-650/jour (Freelance.com,
Arc.dev, Portage360). Segments cibles : small network (2-5 staff) +
mid-tier RPG/MMO (5-15 staff). Hobbyistes redirigés vers plugins
productisés BBB $15-25 (phase 10 future).

REMOVED /fiverr page entirely:
- Deleted app/pages/fiverr.vue (page removed from build + SEO)
- Removed from AppHeader navLinks + AppFooter quickLinks + socialLinks
- Removed nav.fiverr + a11y.fiverr + seo.fiverr + full fiverr.* block
  from fr.json + en.json (~75 clés chacun)
- Removed fiverr + FiverrConfig + FiverrService from site.ts + shared types
- Removed /fiverr internal links priority (redirected to /hytale)
- JSON-LD index.vue sameAs cleaned (LinkedIn + Gitea only, no Fiverr)
- reviewsLink testimonials redirected to /contact
Rationale: analyse de marché explicite "Fiverr destroys senior
positioning faster than it generates revenue"

RESEARCH/Hytale/ added (3 deep reports on pricing + prospection).
2026-04-24 13:32:23 +02:00
kayjaydee 0994260641 docs: audit plugins vs dominants gratuits (baseline top 10 CurseForge)
PLUGINS.md:
- FireballStaff → ChainLightning Sceptre (évite conflit Wan's Wonder
  Weapons 342K free). Chaînage BFS 5 targets max radius 8, damage
  dégressif 8/6/4/3/2, particles ELECTRIC_SPARK+END_ROD. Toujours 1j.
- Note "Audit concurrence" ajoutée listant les 6 dominants évités

IDEAS-BACKLOG.md:
- #12 TreasureHunt Map → EchoLocation Sonar (conflit BetterMap 502K).
  Crystal sonar burst qui reveal + aggro mobs radius 15. Unique.
- #30 StatBoost Food → Storm Seal Talisman (conflit Wan's + RPG
  Leveling). Weather interaction rare : charge pendant orages, décharge
  AoE foudre au clic.
- Section Notes mise à jour avec audit complet des dominants

Principe conservé : wow + dev rapide 1-2j, mais différenciation
sémantique vs Wan's Wonder Weapons / BetterMap / Spellbook / RPG
Leveling. Catégories sous-servies (magie, quêtes, anti-triche) toujours
prioritaires selon analyse marché.
2026-04-22 23:19:51 +02:00
kayjaydee 1810e3ed3d docs: rebalance plugins + backlog after Hytale market analysis (avril 2026)
PLUGINS.md (Phase 10 actifs):
- GravityFlip conservé (teaser gif-ready, 1j)
- FireballStaff (magie, catégorie 1-seul-payant, 1j)
- ShadowClone Decoy (combat unique, gameplay-saving, 1j)
- GrapplingHook (mouvement classique wow, 1.5j)
- EarthquakeSlam (combat AoE visuel max, 1j)
Total: ~6.5j (vs 10j avant). Tous "wow + dev rapide" mais rééquilibrés
vers catégories moins saturées quand possible.

IDEAS-BACKLOG.md (pipeline long terme):
- 30 concepts réécrits, priorité aux catégories vides:
  * Magie (8 ideas) - catégorie 1-seul-payant
  * Quêtes & NPCs (4) - quasi vide
  * Anti-triche light (3) - seulement 2 gratuits
  * Discord intégrations (3) - seulement 6 payants
  * Mini-bibliothèques (3) - catégorie 6 payants
  * Combat counter-play (5) - différenciant dans 120 RPG
  * MMO mechanics (4) - serveurs flagship demande
- Bundles pipeline suggérés (Spell Pack, MMO Essentials, Admin Suite, Combat)
- Frameworks long terme (myth_lib, Quest Framework, MythGuard, MythArena)
  renvoyés en Phase 12+ (planning séparé)

Source: rapport analyse marché Hytale interne (BuiltByBit 235 créateurs,
295 plugins payants, 1221 serveurs, catégories sous-servies identifiées).
2026-04-22 23:16:01 +02:00
kayjaydee 7ce378a419 docs(11): mark Phase 11 shipped — rebranding + cocon complete
- REBRAND-01/02/03 commited in f72170b (JSON-LD + 14 i18n keys FR/EN)
- COCON-01 already shipped with M1.1 carry-over (HytaleRecentArticles
  live sur /hytale.vue:38, bilingue FR/EN avec filter tag hytale)

M1.2 progress: 4/6 plans (67%). Seule Phase 10 (5 demo plugins Hytale)
reste — user code les plugins en side, Plan 10-03 (HytaleDemoGrid) à
attaquer quand ≥1 plugin shippé sur GitHub.
2026-04-22 22:57:15 +02:00
kayjaydee 72e25d9406 feat(rebrand): align jobTitle + meta + i18n on Hytale Plugin Developer (REBRAND-01/02/03)
- app/pages/index.vue: JSON-LD utilise siteConfig.jobTitle (Hytale Plugin Developer)
  + siteConfig.contact.email au lieu de hardcode "Developpeur Full Stack"
- nuxt.config.ts: site.name "Developpeur Full Stack" → "Hytale Plugin Developer"
- app/data/site.ts: description "Professional Full Stack Developer..." →
  "Hytale Plugin Developer & Web Developer..."
- i18n/fr.json + en.json: refonte positionnement sur 14 clés
  - a11y.logoLabel, seo.home/about/contact, about.title/intro/approach/cta,
    home.cta2, contact.title/subtitle/faq.projectTypes, projects.subtitle
  - Le titre principal "Hytale Plugin Developer & [Freelance] Web Dev"
  - Les 2 occurrences "full stack" restantes sont contextuelles (skills)

Laisse les projets web/bot existants (virtual-tour, flowboard, xinko...) visibles,
mentionne Hytale plugins car Phase 10 (5 démos) est planifiée.
2026-04-22 22:55:37 +02:00
kayjaydee 4e7c84912a docs(10): plan Phase 10 — 5 demo plugins Hytale
- 10-CONTEXT: specs des 5 plugins (GravityFlip, MagneticHand, TimeRewind,
  BlackHoleGrenade, Paintball) avec core mechanics, wow factor, complexité
- 10-01-PLAN: brainstorm done (concepts locked)
- 10-02-PLAN: 5 waves de code (1 plugin par wave, complexité ascendante)
  Java + Gradle Kotlin DSL + JDK 17 + MIT license, repos kayjaydee/hytale-*
- 10-03-PLAN: composant HytaleDemoGrid.vue + intégration /hytale +
  i18n hytale.demos.* + data source app/data/hytaleDemos.ts
- IDEAS-BACKLOG.md (root): 30 concepts supplémentaires pour v1.3+
  classés par mouvement/combat/monde/social/économie

Effort estimé Phase 10: ~10 jours code + 1-2 jours frontend intégration.
2026-04-22 22:49:59 +02:00
kayjaydee 29f4a47ace docs(09): mark Phase 9 shipped — M1.1 live sur killiandalcin.fr
DEPLOY-02 + DEPLOY-03 validés. Build hang résolu via hook close dans
nuxt.config.ts (nuxt/nuxt#33987). Next: Phase 10 (démos plugins).
2026-04-22 22:40:49 +02:00
kayjaydee 237e7c06af fix(nuxt.config): add hook to prevent Docker build hangs due to esbuild zombie process 2026-04-22 22:36:50 +02:00
kayjaydee b424a2deed docs(m1.2): bootstrap milestone — ship to prod + credibility gap
- PROJECT.md: v1.2 active, why-now, scope resserré (deploy + demos + rebrand)
- REQUIREMENTS.md: v1.2 section (DEPLOY-02/03, DEMO-01/02/03, REBRAND-01/02/03, COCON-01)
- ROADMAP.md: phases 9 (Deploy), 10 (Demo Plugins), 11 (Rebranding + Cocon) — 6 plans
- STATE.md: reset progress 0/6, focus Phase 9, context gotchas M1.1 conservé
- MILESTONES.md: M1.1 partielle (Phase 8 carried), M1.2 active

Prochaine étape: /gsd-plan-phase 9
2026-04-22 22:24:00 +02:00
kayjaydee e44175b9e4 chore: archive v1.1 milestone — SEO Hytale Autorité & Contenu shipped
M1.1 complete (phases 5-8, 13 plans):
- @nuxt/content v3 + Shiki syntax highlighting
- Blog listing + article pages SSR bilingue (TOC + prev/next)
- JSON-LD Article/Breadcrumb/CollectionPage + sitemap hreflang x-default
- 2 articles seed Hytale FR+EN (API Java réelle)
- Cocon sémantique /blog ↔ /hytale
2026-04-22 22:08:00 +02:00
kayjaydee 37b87b4b54 docs(08): capture API correction — Kotlin→Java rewrite based on hytalemodding.dev 2026-04-22 22:03:44 +02:00
kayjaydee a4fd4e78d2 refactor(08-03): rewrite EN article with real Hytale Java API 2026-04-22 22:02:59 +02:00
kayjaydee eb3553753a refactor(08-03): rewrite FR article with real Hytale Java API 2026-04-22 22:01:56 +02:00
kayjaydee fc7392ee1a refactor(08-02): rewrite EN article with real Hytale Java API 2026-04-22 22:00:42 +02:00
kayjaydee 1d30828a6f refactor(08-02): rewrite FR article with real Hytale Java API 2026-04-22 22:00:37 +02:00
kayjaydee b8ddd8e14e docs(08): mark Phase 8 complete — M1.1 milestone shipped .planning/ROADMAP.md .planning/phases/08-content-cocon-semantique/08-VERIFICATION.md 2026-04-22 21:55:24 +02:00
kayjaydee 6eb81b1f5b docs(08-03): article seed 2 positionnement Hytale 2026 SUMMARY
- 2 articles markdown FR+EN (même slug) 1148/1009 mots, draft: false
- Tags ['hytale', 'industry', 'analysis'], date 2026-04-21 (ordering test)
- Coroutines Kotlin lifecycle-aware (SupervisorJob + cancel onDisable)
- Cocon sémantique bidirectionnel fermé avec l'article 08-02
2026-04-22 21:53:25 +02:00
kayjaydee 078e1a8a5f docs(08-02): capture summary — first Hytale plugin tutorial (FR+EN seed article) 2026-04-22 21:52:53 +02:00
kayjaydee 5c10c275b1 feat(08-03): add EN blog article 'Hytale plugin development in 2026'
- Positioning/authority article 1009 words, draft: false, same slug as FR
- Tags ['hytale', 'industry', 'analysis'], date 2026-04-21
- 6 sections mirroring FR structure (idiomatic EN, not literal translation)
- Same Kotlin coroutines code block (code not translated)
- 2 inline links to /en/hytale (intro + outlook section)
2026-04-22 21:52:21 +02:00
kayjaydee bb0ddcfa38 feat(08-03): add FR blog article 'Développement de plugins Hytale en 2026'
- Article positionnement/autorité 1148 mots, draft: false
- Tags ['hytale', 'industry', 'analysis'], date 2026-04-21
- 6 sections (intro, stack, patterns, écosystème, outlook, conclusion)
- 1 bloc Kotlin coroutines moderne (SupervisorJob + Dispatchers.IO + cancel lifecycle)
- 2 liens inline vers /hytale (intro + section outlook)
2026-04-22 21:52:16 +02:00
kayjaydee 0ba23acd1b feat(08-02): add EN article how-to-build-your-first-hytale-plugin
- Equivalent EN version (970 mots), same slug
- 3 Kotlin code blocks (build.gradle.kts, event listener, command)
- 2 inline links to /en/hytale (intro + build section)
- Frontmatter Zod-valid : draft false, tags [hytale, tutorial, kotlin], date 2026-04-22
2026-04-22 21:52:00 +02:00
kayjaydee 7acea07812 feat(08-02): add FR article how-to-build-your-first-hytale-plugin
- Tutorial debutant plugin Hytale en Kotlin (1049 mots)
- 3 blocs code Kotlin realistes (build.gradle.kts, event listener, command)
- 2 liens inline vers /hytale (intro + build section)
- Frontmatter Zod-valide : draft false, tags [hytale, tutorial, kotlin], date 2026-04-22
2026-04-22 21:50:57 +02:00
kayjaydee c0308edc2d docs(08-01): scaffold HytaleRecentArticles SUMMARY — component bilingue + i18n FR/EN + injection /hytale 2026-04-22 21:48:48 +02:00
kayjaydee 2d004b15a7 feat(08-01): inject HytaleRecentArticles in /hytale + add i18n keys FR/EN
- app/pages/hytale.vue: <HytaleRecentArticles /> inserted after TestimonialsSection wrapper, before closing root div
- i18n/locales/fr.json: hytale.recentArticles {title, subtitle, viewAll} accentue style (aligned with blog.* 2026)
- i18n/locales/en.json: mirror keys
- No script changes (auto-import Nuxt)
2026-04-22 21:47:57 +02:00
kayjaydee 5eb494278d feat(08-01): add HytaleRecentArticles component (queryCollection bilingual + JS tag filter)
- Bilingual literal branches queryCollection('blog_fr'|'blog_en') (Phase 5 Pitfall D-03)
- JS post-filter tags.includes('hytale') + slice(0,2) (D-11 — SQLite LIKE unreliable on JSON array)
- v-if=articles.length hides section when no hytale-tagged articles (D-12)
- BlogCard variant=compact in grid 2 col desktop / 1 col mobile
- NuxtLink localePath('/blog') viewAll CTA
- useAsyncData key hytale-recent-${locale.value} + watch:[locale]
2026-04-22 21:47:23 +02:00
kayjaydee 9cc1dbec5d docs(08): create phase plan — content & cocon sémantique (3 plans, 2 waves)
- 08-01 (W1): HytaleRecentArticles.vue scaffold + injection hytale.vue + i18n
- 08-02 (W2): article tutorial how-to-build-your-first-hytale-plugin FR+EN
- 08-03 (W2): article positionnement hytale-plugin-development-2026 FR+EN
2026-04-22 18:38:13 +02:00
kayjaydee 9d6ed1780b docs(08): map analogs for seed articles + HytaleRecentArticles component .planning/phases/08-content-cocon-semantique/08-PATTERNS.md 2026-04-22 18:32:43 +02:00
kayjaydee 32609a9843 docs(08): capture phase context — 2 articles seed Hytale + HytaleRecentArticles section (cocon sémantique blog↔hytale) .planning/phases/08-content-cocon-semantique/08-CONTEXT.md 2026-04-22 12:19:00 +02:00
kayjaydee 110c2dff86 docs(07): mark Phase 7 complete in ROADMAP (4/4 plans) .planning/ROADMAP.md .planning/phases/07-seo-blog/07-VERIFICATION.md 2026-04-22 11:25:57 +02:00
kayjaydee 6956155ce9 docs(07-04): complete sitemap dynamic feed plan
- Add 07-04-SUMMARY.md (endpoint Nitro bilingue + hreflang x-default + draft filter)
- Update STATE.md (14/15 plans, 93%)
- Check SEO-12 in REQUIREMENTS.md and ROADMAP.md
- Document gotcha queryCollection import from '@nuxt/content/server' (vue-tsc auto-import not resolved in server/)
2026-04-22 11:22:57 +02:00
kayjaydee ae274e77ca docs(07-02): complete blog article SEO plan summary + state update
Plan 07-02 shipped: useSeoMeta D-15 + useSchemaOrg Article/Breadcrumb on /blog/[slug],
resolveOgImage helper + og-blog-default.jpg fallback. Curl SSR validated,
typecheck green. Requirements satisfied: SEO-10, SEO-11, SEO-13, SEO-15.
2026-04-22 11:21:46 +02:00
kayjaydee 306e7bb12f feat(07-04): add dynamic sitemap URL feed for bilingual blog articles
- Nitro route server/api/__sitemap__/urls.ts via defineSitemapEventHandler
- Queries blog_fr + blog_en with literal strings and event first-arg (Pitfalls 1 & 2)
- Filters draft=false (D-10, T-07-06 mitigation)
- lastmod = updated ?? date (D-09)
- Emits hreflang alternates fr/en/x-default for bilingual pairs, none for single-language (D-11)
- Feeds @nuxtjs/sitemap via sitemap.sources declared in 07-01
2026-04-22 11:20:09 +02:00
kayjaydee 2582c87df4 feat(07-02): enrich blog article page with full SEO meta + Article/Breadcrumb JSON-LD
- D-15: useSeoMeta extended with ogImage (absolute via resolveOgImage),
  ogUrl (canonical), ogLocale + ogLocaleAlternate (emitted only when bilingual
  pair exists), twitterCard + twitterImage, article:published_time,
  article:modified_time (fallback to date when updated absent — D-13),
  articleAuthor
- SEO-11/SEO-15: useSchemaOrg([defineArticle, defineBreadcrumb])
  — Article author/publisher reference global Person via @id=#killian
  (from app/utils/seo-person.ts KILLIAN_PERSON_ID), image mirrors ogImage,
  mainEntityOfPage = canonical; BreadcrumbList emits Accueil → Blog → title
- Pitfall 7: altExists query via queryCollection('blog_en'|'blog_fr') with
  literal collection names (Vite extractor constraint)
- inLanguageTag computed cast to satisfy overly narrow defineArticle typings
  without changing runtime emission
- Validated SSR: curl /fr/blog/test-kotlin-syntax returns og:image absolute,
  article:published_time, Article JSON-LD (author @id=#killian), BreadcrumbList 3 items
2026-04-22 11:19:58 +02:00
kayjaydee d37f870f49 docs(07-03): blog listing SEO enrichment SUMMARY — D-16 + CollectionPage/Breadcrumb JSON-LD 2026-04-22 11:17:55 +02:00
kayjaydee d2ab5681da feat(07-03): enrich blog listing with D-16 useSeoMeta + CollectionPage/Breadcrumb JSON-LD
- Add SITE_URL + OG_FALLBACK constants (fallback hardcoded, resolveOgImage helper owned by 07-02)
- Extend useSeoMeta: ogImage (absolute /og-blog-default.jpg), ogUrl, ogLocale, ogLocaleAlternate, twitterCard, twitterImage
- Add useSchemaOrg([defineWebPage CollectionPage, defineBreadcrumb(Accueil -> Blog)])
- inLanguage resolved at setup (type constraint: literal union, not ComputedRef)
- Requirements: SEO-10, SEO-13, SEO-15
2026-04-22 11:17:10 +02:00
kayjaydee b69252c556 feat(07-02): add resolveOgImage helper + og-blog-default.jpg fallback asset
- app/utils/resolve-og-image.ts: absolutises frontmatter image or falls back to /og-blog-default.jpg
- public/og-blog-default.jpg: placeholder (copied from og-image.png) — branded 1200x630 design follow-up pending
2026-04-22 11:16:37 +02:00
kayjaydee 44fcca6345 docs(07-01): capture plan summary
Foundation SEO Blog shipped — nuxt-schema-org installed, blog schema extended
with updated field, global Person/WebSite schema.org emitted SSR, sitemap.sources
wired to future Nitro endpoint (07-04).
2026-04-22 11:14:46 +02:00
kayjaydee 1a2cfc360b feat(07-01): wire global schema.org Person + WebSite and sitemap sources
- nuxt.config.ts: register 'nuxt-schema-org' module + sitemap.sources=['/api/__sitemap__/urls']
- app/utils/seo-person.ts: KILLIAN_PERSON_ID + killianPerson (derived from siteConfig, email excluded)
- app/app.vue: useSchemaOrg([definePerson(killianPerson), defineWebSite({name, inLanguage})]) appended (D-12)
- Verified SSR: /fr emits JSON-LD Person @id=#killian + WebSite (curl, pas d'hydratation)
2026-04-22 11:13:51 +02:00
kayjaydee 2ec6a213f0 chore(07-01): install nuxt-schema-org + add updated field to blog schema
- pnpm add -D nuxt-schema-org@^6.0.4 (D-01, D-04)
- content.config.ts blogSchema: updated: z.string().optional() (D-13, D-14)
- Caches content/.nuxt vidés (Pitfall 8)
2026-04-22 11:10:39 +02:00
kayjaydee 543bcb00fb docs(roadmap): mark Phase 6 plans 03-04 complete (summaries present since 2026-04-22) .planning/ROADMAP.md 2026-04-22 11:09:26 +02:00
kayjaydee 43d52a42e9 docs(07): plan SEO blog — 4 plans (schema-org, useSeoMeta enrich, sitemap Nitro) .planning/phases/07-seo-blog/07-01-PLAN.md .planning/phases/07-seo-blog/07-02-PLAN.md .planning/phases/07-seo-blog/07-03-PLAN.md .planning/phases/07-seo-blog/07-04-PLAN.md .planning/ROADMAP.md 2026-04-22 10:40:12 +02:00
kayjaydee 0577cc4041 docs(07): map analogs for new SEO files (schema-org + sitemap Nitro) .planning/phases/07-seo-blog/07-PATTERNS.md 2026-04-22 10:34:19 +02:00
kayjaydee a9c9aef9b8 docs(07): capture phase research — nuxt-schema-org + sitemap Nitro endpoint .planning/phases/07-seo-blog/07-RESEARCH.md 2026-04-22 10:32:18 +02:00
kayjaydee 275d8f268c docs(07): capture phase context — SEO blog (JSON-LD via nuxt-schema-org, og:image hybride, sitemap Nitro endpoint, hreflang alternates) 2026-04-22 10:25:39 +02:00
kayjaydee 71ab4f29d0 docs(06-04): article chrome SUMMARY — BlogToc + BlogPrevNext + enriched [slug].vue 2026-04-22 10:10:41 +02:00
kayjaydee a6bb9463dd feat(06-04): enrich blog article page with breadcrumb, TOC, prev/next
- isFr converti en computed (fix Phase 5 non-reactive isFr)
- { watch: [locale] } sur les 2 useAsyncData (article + surround)
- queryCollectionItemSurroundings avec littéraux 'blog_fr'/'blog_en', fields explicites
- Article query WITHOUT draft filter (direct URL access, D-14)
- Surround query WITH .where('draft','=',false).order('date','DESC')
- Mapping prev=surround[1], next=surround[0] (Pitfall 4 DESC order)
- Header: UBreadcrumb + H1 + meta row (date Intl + reading time) + tags + cover NuxtImg eager
- Layout grid desktop [1fr_16rem] avec max-w-3xl colonne article
- ContentRenderer prose wrapper Phase 5 préservé
- BlogToc aside + BlogPrevNext en bas
- ogType: 'article' (préparation Phase 7)

Requirements: BLOG-03, BLOG-06
2026-04-22 10:09:23 +02:00
kayjaydee 42369a1cb4 feat(06-04): add BlogPrevNext component (grid 2 cols, BlogCard compact variant) 2026-04-22 10:06:52 +02:00
kayjaydee be532c545d feat(06-04): add BlogToc component (sticky desktop + drawer mobile + IntersectionObserver highlight) 2026-04-22 10:06:38 +02:00