site-phase-5
Phase 5 — Create base components derived from blueprint, i18n setup (PT-BR + EN), SEO schema markup. No template copying.
SKILL.md.claude/skills/site-phase-5/SKILL.md
GitHubPhase 5 — Base Components + i18n + SEO
Objective
Create animation components derived from the blueprint, set up bilingual i18n, and add SEO schema markup. Every component must be unique to THIS site.
Step 1 — Read references
Read: sites/_templates/i18n-setup.js
Read: sites/_templates/seo-templates.jsx
Read: sites/$LEAD_ID/mapa-encantamento.md
Step 2 — Create blueprint-derived components
For EACH animation specified in the blueprint, create the corresponding component.
Before building from scratch, check MCPs:
magic-ui— blur-fade, aurora-text, number-ticker, shimmer-buttonaceternity-ui— parallax-scroll, text-generate-effect, hero-highlight, 3D-card- If the MCP has the component, USE IT. Customize colors/timings for this site.
MANDATORY components (only 2):
LanguageToggle.jsx— functional (react-i18next changeLanguage). Visual can be unique.Button.jsx— with variants based on THIS site's color tokens.
BANNED parameters (from old template):
- ScrollReveal: y:60, duration:0.8, ease:'power3.out'
- AnimatedText: duration:0.5, delay:i*0.08, ease:[0.25, 0.46, 0.45, 0.94]
- ParallaxImage: speed:0.2, h-[120%]
- CountUp: duration:2, ease:'power2.out'
If you need similar functionality, use DIFFERENT parameters derived from the blueprint.
Cleanup patterns (reference, don't copy):
- GSAP: always
gsap.context()withctx.revert()in useEffect cleanup - Motion:
viewport={{ once: true }}for entry animations - ScrollTrigger: kill on cleanup
- Lenis: destroy on cleanup
- prefers-reduced-motion: respect via CSS @media or JS matchMedia
Reference patterns (do NOT copy components, only patterns):
Read: sites/_templates/component-templates.jsx
Step 3 — Layout base
Create src/components/layout/Section.jsx based on the template.
Step 4 — i18n config
Create src/i18n/index.js exactly as in i18n-setup.js template.
Import BEFORE App in main.jsx.
Step 5 — i18n PT-BR
Create src/i18n/pt-BR.json with ALL site strings, correct accents (a, e, c, o, i, u).
Structure: nav, hero, each section from Phase 3, contact, footer, lang.
Fill with REAL briefing data — ZERO placeholders.
Step 6 — i18n EN
Create src/i18n/en.json with SAME structure as pt-BR.json. Naturally translated (not robotic).
Proper nouns stay in Portuguese.
Step 7 — Structured data
Create src/data/content.js with all briefing data organized for components.
Step 8 — SEO
Based on seo-templates.jsx:
src/components/seo/JsonLd.jsx— schema.org with MOST SPECIFIC type. ALL data: address, coordinates, hours, reviews, social (sameAs), services, professional registry, knowsAbout, alumniOf, award, memberOf.src/components/seo/FaqSchema.jsx— SPECIFIC questions about this client (not generic).
Exit Gate (blocking)
.claude/scripts/gate-i18n-keys.sh $LEAD_ID
Constraints
| Rule | Enforced by |
|---|---|
| Same keys in pt-BR.json and en.json | gate-i18n-keys.sh |
| No banned animation parameters | Visual review in Phase 7 |
| Components derived from blueprint, not template | gate-anti-similarity.sh in Phase 6 |
| Correct PT-BR accents | playwright-validate.py (pt_br_accents) |
Exit Criteria
- Animation components created per blueprint (NOT generic template)
- NO component with parameters identical to old template
- LanguageToggle and Button created
- pt-BR.json and en.json with same keys and correct accents
- JsonLd.jsx and FaqSchema.jsx with real data
- content.js with structured data