9.8 KiB
phase, slug, status, shadcn_initialized, preset, created
| phase | slug | status | shadcn_initialized | preset | created |
|---|---|---|---|---|---|
| 2 | content | draft | false | none | 2026-04-10 |
Phase 2 — Content — UI Design Contract
Contrat visuel et d'interaction pour la phase Content. Genere par gsd-ui-researcher, verifie par gsd-ui-checker.
Design System
| Property | Value |
|---|---|
| Tool | Nuxt UI v3 (UCard, UButton, UIcon, etc.) — source: CLAUDE.md |
| Preset | not applicable |
| Component library | Nuxt UI v3 (basé sur Radix primitives via reka-ui) |
| Icon library | Lucide via i-lucide-* (UIcon) — source: HeroSection.vue existant |
| Font | Inter ou system-ui (hérité de Nuxt UI v3 default) |
Note: shadcn non applicable — stack Nuxt 4 + Nuxt UI v3 + Tailwind v4. Registry safety gate: non applicable (Nuxt UI v3 est la source officielle, pas de tiers).
Spacing Scale
Déclaré (multiples de 4, aligné avec l'échelle Tailwind utilisée dans le codebase existant):
| Token | Value | Usage |
|---|---|---|
| xs | 4px | Gaps icônes, padding inline (gap-1, p-1) |
| sm | 8px | Espacement compact — badges, labels (gap-2, p-2) |
| md | 16px | Espacement default — padding cartes, champs (p-4, gap-4) |
| lg | 24px | Section padding interne — entre éléments de section (p-6, gap-6) |
| xl | 32px | Gaps layout — grilles pricing (gap-8) |
| 2xl | 48px | Séparations de sections majeures (py-12) |
| 3xl | 64px | Espacement page — sections hero/content (py-16 à py-24) |
Exceptions:
- Touch targets boutons CTA: min 44px de hauteur (
py-3+ hauteur de texte = ~44px OK) - Carousel testimonials: padding horizontal -mx-4 px-4 conservé pour débordement visuel (pattern existant)
- Hero section: py-16 md:py-24 conservé tel quel (source: HeroSection.vue)
Typography
Détectée dans le codebase existant — reproduire exactement ces valeurs:
| Role | Size | Weight | Line Height |
|---|---|---|---|
| Body / quote testimonial | 14px (text-sm) | 400 (regular) | 1.5 (leading-relaxed) |
| Label / meta / badge | 14px (text-sm) | 500 (medium) | 1.4 |
| Heading section (h2) | 30-48px responsif (text-3xl→text-5xl) | 700 (bold) | 1.2 |
| Display / H1 hero | 36-72px responsif (text-4xl→text-7xl) | 800 (extrabold) | 1.1 (tracking-tight) |
Règles supplémentaires:
- Accent décoratif mono:
font-mono text-smpour labels de section (ex:// testimonials,// pricing) - Gradient text sur H1 et H2:
bg-gradient-to-r from-brand-500 via-brand-400 to-emerald-400 bg-clip-text text-transparent(pattern existant) - Sous-titres de sections:
text-lg text-gray-500 dark:text-gray-400 leading-relaxed - Prix dans grille tarifaire:
text-3xl font-boldpour le montant,text-sm text-gray-500pour la période/unité
Color
Palette détectée dans app/assets/css/main.css + composants existants:
| Role | Value | Usage |
|---|---|---|
| Dominant (60%) | bg-white dark:bg-gray-950 |
Fond page, sections principales |
| Secondary (30%) | bg-gray-50 dark:bg-gray-900 / bg-white/80 dark:bg-gray-900/60 |
Cartes, terminal hero, cartes témoignages, cartes pricing |
| Accent (10%) | brand-500 = #85cb85 (vert) |
Voir liste ci-dessous |
| Destructive | Non applicable dans cette phase — aucune action destructive |
Accent réservé exclusivement à:
- Badge "Disponible pour vos projets" — fond
bg-brand-500/10, textetext-brand-700 dark:text-brand-400 - Curseur et highlight terminal hero —
bg-brand-500,text-brand-500 - Bouton CTA primaire —
bg-brand-500 hover:bg-brand-600 - Stats témoignages (chiffres) — gradient
from-brand-400 to-brand-600 - Hover border cartes testimonials/pricing —
hover:border-brand-500/40 - Étoiles rating:
text-yellow-400(NON brand-500 — jaune uniquement pour étoiles) - Gradient H1 hero —
from-brand-500 via-brand-400 to-emerald-400
Dark mode: systématiquement déclaré en paire light dark:dark sur chaque token de couleur.
Composants Nuxt UI v3 — Inventaire Phase 2
| Composant | Usage | Props clés |
|---|---|---|
UCard |
Cartes pricing, cartes témoignages page /hytale | class pour override padding |
UButton |
CTA "Demander un devis", CTA Discord, CTA Contact | color="primary" ou outline |
UBadge |
Badge "Disponible pour vos projets", badge tier pricing | color, variant |
UIcon |
Toutes icônes (i-lucide-*) | name, class pour taille |
UDivider |
Séparation entre stats témoignages | vertical |
NuxtLink |
Navigation interne — liens /contact, /hytale | localePath() obligatoire |
NuxtImg |
Avatars témoignages | loading="lazy", width, height |
Pas de composant carousel natif Nuxt UI v3 — utiliser le pattern scroll horizontal existant (overflow-x-auto snap-x snap-mandatory) déjà en place dans TestimonialsSection.vue.
Copywriting Contract
Hero Homepage (refonte CONT-01)
| Element | FR | EN |
|---|---|---|
| H1 | "Hytale Plugin Developer" (gradient sur les 2 derniers mots) | "Hytale Plugin Developer" |
| Sous-titre | "Des plugins performants et sur-mesure pour votre serveur Hytale" | "High-performance, custom plugins for your Hytale server" |
| Badge statut | "Disponible pour vos projets" | "Available for projects" |
| CTA primaire | "Rejoindre sur Discord" | "Join on Discord" |
| CTA secondaire | "Me contacter" | "Contact me" |
| Floating card stats | "50+ projets" / "Note 5.0" | "50+ projects" / "5.0 rating" |
| Terminal — role | 'Hytale Plugin Developer' (remplace 'Full Stack Dev') |
idem |
Page /hytale — Hero dédié (CONT-02)
| Element | FR | EN |
|---|---|---|
| Label mono | // hytale |
// hytale |
| H1 | "Plugins Hytale sur-mesure" | "Custom Hytale Plugins" |
| Sous-titre | "Développement de plugins performants pour votre serveur Hytale, de la conception à la livraison." | "High-performance plugin development for your Hytale server, from design to delivery." |
Grille Tarifaire — 5 tiers (CONT-03 / D-09 / D-10)
| Tier | FR label | EN label | Prix FR | Prix EN | CTA |
|---|---|---|---|---|---|
| Plugin Simple | "Plugin Simple" | "Simple Plugin" | "À partir de 50€" | "From €50" | "Demander un devis" / "Request a quote" |
| Plugin Complexe | "Plugin Complexe" | "Complex Plugin" | "Sur devis" | "Custom quote" | "Demander un devis" / "Request a quote" |
| Sur-Mesure | "Développement Sur-Mesure" | "Custom Development" | "Sur devis" | "Custom quote" | "Demander un devis" / "Request a quote" |
| Maintenance | "Maintenance & Support" | "Maintenance & Support" | "À partir de 30€/mois" | "From €30/month" | "Demander un devis" / "Request a quote" |
| Web | "Développement Web" | "Web Development" | "Sur devis" | "Custom quote" | "Demander un devis" / "Request a quote" |
CTA universel pricing: "Demander un devis" → redirige /contact (source: D-11).
Témoignages (CONT-04)
| Element | FR | EN |
|---|---|---|
| Label mono section | // témoignages |
// testimonials |
| Titre section | (existant — conserver, passer en i18n si hardcodé) | (existant) |
| Stat — clients | "avis clients" | "client reviews" |
| Stat — note | "note moyenne" | "average rating" |
| Stat — projets | "projets livrés" | "projects delivered" |
| totalReviews corrigé | 5 (source: D-16, FIX-04) |
5 |
États vides et erreurs
| Element | Copy FR | Copy EN |
|---|---|---|
| État vide témoignages (si aucun chargé) | "Aucun témoignage disponible pour l'instant." | "No testimonials available yet." |
| Erreur chargement image avatar | Masquer l'image, afficher initiales (fallback silencieux) | idem |
| Pas de cas de destruction dans cette phase | n/a | n/a |
Aucune action destructive dans cette phase — pas de confirmation dialog requise.
Patterns d'Interaction
Carousel / Scroll horizontal (homepage + /hytale)
- Pattern:
overflow-x-auto snap-x snap-mandatory scrollbar-hide(source: TestimonialsSection.vue existant) - Homepage: 2-3 témoignages featured (source: D-15)
- Page /hytale: les 5 témoignages complets avec plus de détails (source: D-15)
- Pas de navigation dots/arrows requise en v1 — scroll natif suffit
Cartes Pricing
- Layout: grille responsive
grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3(5 tiers → 2+3 ou 3+2) - Hover:
hover:border-brand-500/40 hover:shadow-xl hover:shadow-brand-500/10 hover:-translate-y-1(pattern cartes existant) - Tier le plus populaire: badge "Populaire" / "Popular" en
UBadge color="primary" - CTA de chaque carte:
UButtonfull-width vers/contact
Lien Discord (D-02, D-07)
- Bouton hero primaire: ouvre profil Discord personnel dans un nouvel onglet (
target="_blank" rel="noopener") - Icône:
i-lucide-message-circleoui-simple-icons-discordsi disponible dans Nuxt UI
Badge "Disponible"
- Composant: inline-flex avec point animé
animate-ping(pattern existant HeroSection.vue) - Passer la string en i18n (source: D-03) — clé:
hero.badge.available
SEO & i18n — Contraintes Visuelles
- Toutes les strings visibles dans cette phase doivent avoir une clé i18n dans
fr.jsoneten.json(source: I18N-03) - Pas de strings hardcodées dans les templates — 0 exception pour cette phase
- Titre de page /hytale:
useSeoMeta()avectitleetogTitlespécifiques (source: I18N-04) totalReviewsdanstestimonials.tscorrigé à5avant affichage (source: FIX-04 / D-16)
Registry Safety
| Registry | Blocks Used | Safety Gate |
|---|---|---|
| Nuxt UI v3 (officiel) | UCard, UButton, UBadge, UIcon, UDivider | not required — officiel Nuxt |
| shadcn | aucun | not applicable — projet Nuxt/Vue |
| tiers | aucun | not applicable |
Checker Sign-Off
- Dimension 1 Copywriting: PASS
- Dimension 2 Visuals: PASS
- Dimension 3 Color: PASS
- Dimension 4 Typography: PASS
- Dimension 5 Spacing: PASS
- Dimension 6 Registry Safety: PASS
Approval: pending