13 KiB
phase, plan, type, wave, depends_on, files_modified, autonomous, requirements, must_haves
| phase | plan | type | wave | depends_on | files_modified | autonomous | requirements | must_haves | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 02-content | 03 | execute | 2 |
|
|
false |
|
|
Purpose: A visitor landing on /hytale sees Killian's Hytale plugin development services, transparent pricing tiers with CTAs to contact, and client testimonials proving track record (CONT-02, CONT-03, CONT-04).
Output: New hytale.vue page and 3 new section components in app/components/sections/hytale/.
<execution_context> @$HOME/.claude/get-shit-done/workflows/execute-plan.md @$HOME/.claude/get-shit-done/templates/summary.md </execution_context>
@.planning/PROJECT.md @.planning/ROADMAP.md @.planning/phases/02-content/02-CONTEXT.md @.planning/phases/02-content/02-RESEARCH.md @.planning/phases/02-content/02-UI-SPEC.md @.planning/phases/02-content/02-01-SUMMARY.md@app/pages/index.vue @app/components/sections/HeroSection.vue @app/components/sections/TestimonialsSection.vue @app/data/pricing.ts @i18n/locales/fr.json
export interface PricingTier { id: string priceFixed: string | null priceLabel?: string featured?: boolean }export const hytalePricing: PricingTier[] // 5 tiers
// Accepts optional featured prop — omit prop to show all 5 testimonials
hytale.hero.label, hytale.hero.title, hytale.hero.subtitle, hytale.services.label, hytale.services.title, hytale.services.subtitle, hytale.pricing.label, hytale.pricing.title, hytale.pricing.subtitle, hytale.pricing.cta, hytale.pricing.popular, hytale.pricing.from, hytale.pricing.perMonth, hytale.pricing.onQuote, hytale.pricing.{tierId}.name, hytale.pricing.{tierId}.description, hytale.pricing.{tierId}.features.{0-3}, seo.hytale.title, seo.hytale.description
Task 1: Create hytale.vue page and 3 section components app/pages/hytale.vue, app/components/sections/hytale/HytaleHeroSection.vue, app/components/sections/hytale/HytalePricingSection.vue, app/components/sections/hytale/HytaleServicesSection.vue app/pages/index.vue, app/components/sections/HeroSection.vue, app/components/sections/ServicesSection.vue, app/data/pricing.ts Create 4 new files following existing project patterns (index.vue structure, section component patterns).1. app/pages/hytale.vue — Follow index.vue pattern exactly (per D-08):
<script setup lang="ts">
const { t } = useI18n()
const localePath = useLocalePath()
useSeoMeta({
title: () => t('seo.hytale.title'),
description: () => t('seo.hytale.description'),
ogTitle: () => t('seo.hytale.title'),
ogDescription: () => t('seo.hytale.description'),
ogImage: 'https://killiandalcin.fr/og-image.png',
ogType: 'website',
})
useHead({
script: [{
type: 'application/ld+json',
innerHTML: JSON.stringify({
'@context': 'https://schema.org',
'@type': 'Service',
name: 'Hytale Plugin Development',
provider: {
'@type': 'Person',
name: "Killian' DAL-CIN",
jobTitle: 'Hytale Plugin Developer',
},
}),
}],
})
</script>
<template>
<div>
<HytaleHeroSection />
<HytaleServicesSection />
<HytalePricingSection />
<TestimonialsSection />
</div>
</template>
Note: TestimonialsSection without featured prop shows all 5 testimonials (per D-15).
2. app/components/sections/hytale/HytaleHeroSection.vue — Simpler hero than homepage. Follow UI-SPEC:
- Mono label:
{{ t('hytale.hero.label') }}withfont-mono text-sm text-brand-500 - H1:
{{ t('hytale.hero.title') }}with gradient text styling (same as homepage H1) - Subtitle:
{{ t('hytale.hero.subtitle') }}withtext-lg text-gray-500 dark:text-gray-400 - Section padding:
py-16 md:py-24(matching existing hero pattern) - Center-aligned, max-width container:
max-w-4xl mx-auto text-center - Use
<script setup lang="ts">withconst { t } = useI18n()
3. app/components/sections/hytale/HytaleServicesSection.vue — Services/expertise:
- Mono label:
{{ t('hytale.services.label') }} - H2 title:
{{ t('hytale.services.title') }} - Subtitle:
{{ t('hytale.services.subtitle') }} - Display 3-4 service cards using
UCardin a responsive gridgrid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 - Each card shows an icon (
UIconwith lucide icons likei-lucide-puzzle,i-lucide-settings,i-lucide-shield), title, and short description - Service content via i18n keys. Create simple service items inline (not from data file — services are page-specific):
- Plugin Development (i-lucide-puzzle)
- Server Configuration (i-lucide-settings)
- Maintenance & Support (i-lucide-shield-check)
- Add i18n keys for service items:
hytale.services.items.{id}.titleandhytale.services.items.{id}.description— these keys MUST also be added to fr.json and en.json (executor: add them to both locale files). - Section padding:
py-16 md:py-24, max-w-7xl container
4. app/components/sections/hytale/HytalePricingSection.vue — Pricing grid (per D-09, D-10, D-11, CONT-03, UI-SPEC):
- Mono label:
{{ t('hytale.pricing.label') }} - H2 title:
{{ t('hytale.pricing.title') }} - Subtitle:
{{ t('hytale.pricing.subtitle') }} - Import
hytalePricingfrom~/data/pricing - Grid:
grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6(5 tiers wrap to 3+2 or 2+3) - Each tier is a
UCard:- If
tier.featured, addring-2 ring-brand-500class andUBadgewith{{ t('hytale.pricing.popular') }} - Header:
{{ t('hytale.pricing.${tier.id}.name') }}as h3 - Price display: If
tier.priceFixed, show{{ t('hytale.pricing.from') }} {{ tier.priceFixed }}. If not, show{{ t('hytale.pricing.onQuote') }}. - Description:
{{ t('hytale.pricing.${tier.id}.description') }} - Features list: Loop 0-3,
{{ t('hytale.pricing.${tier.id}.features.${i}') }}withUIcon name="i-lucide-check"prefix - Footer CTA:
UButtonwith{{ t('hytale.pricing.cta') }},:to="localePath('/contact')",blockprop,color="primary"for featured tier /variant="outline"for others
- If
- Hover effect on cards:
hover:border-brand-500/40 hover:shadow-xl hover:shadow-brand-500/10 hover:-translate-y-1 transition-all duration-200 - All text via i18n — zero hardcoded strings
test -f app/pages/hytale.vue && test -f app/components/sections/hytale/HytaleHeroSection.vue && test -f app/components/sections/hytale/HytalePricingSection.vue && test -f app/components/sections/hytale/HytaleServicesSection.vue && grep -q "useSeoMeta" app/pages/hytale.vue && grep -q "hytalePricing" app/components/sections/hytale/HytalePricingSection.vue && grep -q "localePath.*contact" app/components/sections/hytale/HytalePricingSection.vue && echo "PASS" || echo "FAIL"
<acceptance_criteria>
test -f app/pages/hytale.vuesucceeds (page exists)test -f app/components/sections/hytale/HytalePricingSection.vuesucceedsgrep "useSeoMeta" app/pages/hytale.vueshows SEO meta setupgrep "hytalePricing" app/components/sections/hytale/HytalePricingSection.vueshows data importgrep "localePath" app/components/sections/hytale/HytalePricingSection.vueshows CTA links to /contactgrep "UCard" app/components/sections/hytale/HytalePricingSection.vueshows Nuxt UI cardsgrep "t('hytale" app/components/sections/hytale/HytaleHeroSection.vueshows i18n usage- No hardcoded French or English strings in any of the 4 files (except schema.org JSON-LD values which are language-neutral) </acceptance_criteria> 4 files created: hytale.vue page with SEO + JSON-LD, 3 section components. /hytale renders hero, services, pricing (5 tiers with CTAs to /contact), and all 5 testimonials.
<threat_model>
Trust Boundaries
| Boundary | Description |
|---|---|
| JSON-LD output | Schema.org structured data rendered in page head |
| CTA links | Pricing buttons redirect to /contact |
STRIDE Threat Register
| Threat ID | Category | Component | Disposition | Mitigation Plan |
|---|---|---|---|---|
| T-02-05 | I (Information Disclosure) | JSON-LD in hytale.vue | accept | Intentionally public structured data for SEO |
| T-02-06 | T (Tampering) | Pricing data | accept | Static TypeScript data, no user input, SSR-rendered |
| </threat_model> |
<success_criteria>
- /hytale page exists with 4 sections, all content bilingual
- Pricing grid shows 5 tiers with working CTAs to /contact
- All 5 testimonials visible on /hytale, only 3 featured on homepage
- SSR renders full HTML (no JS required to see content)
- Human verification confirms visual quality </success_criteria>