Claude Integration
68f37f554f
feat(plugins): content-pages + legal-pages (Phase 4.1 + 4.3)
...
Plugin content-pages :
- Modèle Prisma ContentPage (slug PK, title, body markdown, category, published)
- lib/content-pages.ts : helpers upsert/get/list/unpublish
- lib/markdown.ts : mini-renderer markdown server-side sans deps externe
(h1-h3, paragraphes, gras/italique, liens, listes ul/ol, hr, blockquote,
échappement HTML)
- ContentPageRenderer server component, applique le theme Guyane (font-serif)
- 5 pages seedées : /a-propos, /faq, /comment-ca-marche,
/pour-comites-entreprise, /devenir-loueur
- Routes publiques + force-dynamic + guard requirePluginOr404
Plugin legal-pages :
- Réutilise le même modèle ContentPage, catégorie 'legal'
- 3 pages seedées : /cgv, /mentions-legales, /politique-de-confidentialite
(contenu de base, à valider par avocat avant prod réelle)
Admin :
- /admin/content-pages : table par catégorie, statut publié/dépublié
- /admin/content-pages/[slug] : éditeur markdown + toggle publié
- PATCH /api/admin/content-pages/[slug]
Hooks plugin :
- onEnable seed + republish toutes les pages
- onDisable dépublie toute la catégorie sans la supprimer (preserve les edits)
2026-05-31 10:12:13 +00:00
Claude Integration
be2391998d
feat(plugins): seasonality + min-stay (Phase 3.2 + 3.4)
...
Plugin seasonality :
- Migration : Carbet.seasonalConstraints JSONB nullable
- lib/seasonality.ts : enum Season (DRY|LOW_WATER|WET), currentSeason() helper
Guyane (juil-sept sèche, oct-nov étiage, déc-juin pluies), parseSeasonalConstraints,
isCurrentlyOpen, SEASON_META (label/emoji/tone)
- Composant <SeasonBanner /> server, gated par plugin, ajouté dans layout
au-dessus de tout le contenu — bandeau couleur+emoji+message contextuel
Plugin min-stay :
- Migration : Carbet.minStayNights, maxStayNights, minCapacity nullable
- Composant <StayConstraints /> client, gated par plugin — pill text
'2 nuits minimum', '2-7 nuits', 'groupe 4+ recommandé'
- Carbet card et fiche enrichies avec les contraintes
Tous deux désactivables : sans le toggle, comportement legacy inchangé.
2026-05-31 08:50:26 +00:00
Claude Integration
5e59202505
feat(plugins): access-type + demo-carbets-seed (Phase 3.1 + 2.5)
...
Plugin access-type :
- Migration : enum AccessType (ROAD_AND_RIVER, RIVER_ONLY), champ accessType
sur Carbet avec default ROAD_AND_RIVER, roadAccessNote optionnel,
pirogueDurationMin rendu nullable + index sur accessType
- Schema Prisma mis à jour
- Composant <AccessTypeBadge> client, gated par le plugin
- Carbet card et fiche enrichies : badge + texte adapté (Pirogue vs Route+pirogue
vs Route directe), section Accès enrichie avec roadAccessNote
- formatPirogueDuration accepte null
Plugin demo-carbets-seed :
- Hook onEnable : 3 propriétaires demo (Yann/Émilie/CE Hôpital) + 6 carbets
variés (Maroni, Approuague, Comté, Oyapock, Mahury, Kourou) avec mix
3 RIVER_ONLY + 3 ROAD_AND_RIVER, GPS plausibles, descriptions naturelles
- Hook onDisable : archive (status=ARCHIVED) les carbets demo via slug prefix
- Toutes les fixtures idempotentes (upsert via slug + email)
2026-05-31 02:56:25 +00:00
Claude Integration
d19701e275
feat(plugins-visuels): theme-guyane + landing-hero + landing-sections
...
Phase 2 visuals — la page d'accueil prend vie via 3 plugins activables :
- theme-guyane : palette tropicale (vert canopée, eau Maroni, ocre latérite,
bois karbé, blanc cassé), tokens CSS, typographie display Cormorant Garamond,
gradient ambient discret. Activé via body[data-theme=guyane].
- landing-hero : section plein écran avec illustration vectorielle SVG (carbet
sur pilotis au crépuscule + fleuve + jungle), claim 'Le karbé qui dort vous
attend', double CTA Découvrir / Proposer. Fallback = hero minimaliste actuel.
- landing-sections : 5 sections en cascade — 2 expériences (route+fleuve vs
expédition fleuve), Comment ça marche (3 étapes), CE (registre coop sans
commission), Témoignages (3 stubs), Footer riche avec navigation.
Illustrations 100% SVG inline (pas de dépendance image externe). Quand le
plugin image-gallery-seed sera activé (Phase 2.4), les photos remplaceront
progressivement les SVG. Aucune coupure sur le rendu actuel : tous les plugins
visuels sont disabled par défaut, le site garde son look minimaliste tant que
l'admin ne les a pas activés depuis /admin/plugins.
2026-05-30 23:19:24 +00:00
Claude Integration
62cc464738
feat(plugins): foundation système Plugin Karbé
...
- Modèle Prisma Plugin (key, name, description, category, version, enabled,
config JSONB, migrationsApplied, timestamps) + migration SQL
- PluginRegistry (src/lib/plugins/registry.ts) avec 12 plugins déclarés :
visuels (theme-guyane, landing-hero, landing-sections, image-gallery-seed,
demo-carbets-seed), métier (access-type, seasonality, pirogue-providers,
min-stay), contenus (content-pages, legal-pages), i18n (i18n-fr-en)
- Server helpers (server.ts) : sync, isEnabled, getEnabledKeys, toggle avec
hooks onEnable/onDisable, updateConfig, cache 5s
- Client bridge (client.tsx) : PluginProvider + useIsPluginEnabled
- Composant <IfPluginEnabled plugin=... fallback=...>
- Guard requirePluginOr404 pour pages et routes
- Page admin /admin/plugins avec table toggle par catégorie + édition config
- Route PATCH /api/admin/plugins/[key] + GET
- Layout async qui sync registry + passe enabledKeys au PluginProvider
Tous plugins en enabled=false par défaut, activation pilotée depuis l'admin.
2026-05-30 22:17:10 +00:00