kayjaydee
355df8dbbe
feat: redesign entire portfolio with bold modern dark theme
...
Complete visual overhaul of all pages and components with generous spacing,
bold typography, hover effects, gradient accents, and section differentiation.
Hero features animated terminal mockup and gradient text. Cards use hover
transforms with brand-colored shadows. CTAs use gradient backgrounds.
All i18n keys, data structures, SEO meta, and composable logic preserved.
2026-04-08 19:08:55 +02:00
kayjaydee
578a0afa1a
fix: rewrite AppHeader — replace UDrawer with USlideover, clean design
...
UDrawer (vaul-vue bottom-sheet) rendered content in DOM even when closed,
causing mobile nav to show on desktop. Replaced with USlideover (proper
sidebar panel). Also: backdrop-blur header, UButton for actions, Lucide
icons, brand color active states.
2026-04-08 18:55:58 +02:00
kayjaydee
bd7e02f6ce
fix: correct i18n key paths for projects, featured, testimonials
...
- useProjects: projects.${id}.* → projectData.${id}.* (matches locale structure)
- FeaturedProjectsSection: home.projects.* → home.featuredProjects.*
- TestimonialsSection: home.testimonials.* → testimonials.*
2026-04-08 18:53:49 +02:00
kayjaydee
1cdddb7cf4
fix: use array syntax for components config with pathPrefix
...
Nuxt requires array syntax when configuring pathPrefix per directory.
Object syntax { pathPrefix: false } doesn't register component dirs.
2026-04-08 18:48:19 +02:00
kayjaydee
ef9ceeae17
fix: add pathPrefix: false to components config for auto-import
...
Nuxt prefixes components in subdirectories (layout/AppHeader → LayoutAppHeader).
Setting pathPrefix: false allows using <AppHeader>, <HeroSection>, etc. directly.
2026-04-08 18:47:05 +02:00
kayjaydee
5565940d3c
docs(03-04): complete Dockerfile SSR + legacy cleanup plan
2026-04-08 18:41:40 +02:00
kayjaydee
eebcb446e8
chore(03-04): remove legacy SPA files and verify GA4 config
...
- Delete entire src/ directory (160+ legacy Vue SPA files)
- Delete old/, nginx.conf, index.html, eslint.config.ts, env.d.ts
- GA4 nuxt-gtag already correctly configured (production-only, runtimeConfig)
- No formation.vue exists, /formation returns 404 naturally
2026-04-08 18:40:53 +02:00
kayjaydee
c4a7083f79
feat(03-04): Dockerfile SSR multi-stage + docker-compose Traefik port 3000
...
- Rewrite Dockerfile: node:22-alpine build + runtime, copy .output/, node server
- Add .dockerignore excluding node_modules, .nuxt, .output, src, .git, .planning
- Update docker-compose loadbalancer port from 80 to 3000
- Add SMTP and GA4 environment variables to docker-compose
2026-04-08 18:40:23 +02:00
kayjaydee
8adcd19dbe
docs(03-03): complete About/Contact/Fiverr/Error pages plan
2026-04-08 18:39:22 +02:00
kayjaydee
4f5a8a821f
docs(03-02): complete main pages plan
...
- SUMMARY.md for landing + projects + detail pages
- STATE.md updated to plan 2/3 phase 3
- ROADMAP.md progress updated
- Requirements PAGE-01, PAGE-02, PAGE-03 marked complete
2026-04-08 18:39:09 +02:00
kayjaydee
11ace3dca4
feat(03-03): create error.vue (404 page) with i18n keys
...
- error.vue in app/ with statusCode display, i18n message, clearError redirect
- Added error.notFound, error.generic, error.backHome keys to fr.json and en.json
2026-04-08 18:38:35 +02:00
kayjaydee
8443f590b7
feat(03-03): build Fiverr page with hero, service cards, FAQ accordion, and CTA
...
- Hero with stats (available services count, rating) and profile CTA
- Service cards grid with NuxtImg, price/status badges, order buttons
- FAQSection with UAccordion using homeFAQs data
- Final CTA section linking to Fiverr profile
2026-04-08 18:38:01 +02:00
kayjaydee
72fc84e2ef
feat(03-02): project detail page with dynamic route and gallery
...
- Dynamic route /project/[id] with findById composable
- 404 via createError if project not found
- Hero grid: image + info + CTA buttons (demo, source, custom)
- About section with features list (checkmarks)
- Technologies section with TechBadge
- Gallery thumbnails with zoom overlay, opens ProjectGallery modal
- Sidebar: project info card + related projects
- Responsive 2-col layout (main + sidebar)
2026-04-08 18:37:58 +02:00
kayjaydee
bc7cdacf80
feat(03-03): build About page with tech stack badges and Contact page with form
...
- About: hero bio, 5 tech categories with TechBadge (UCard grid), approach cards, CTA
- Contact: hero stats, ContactForm component, contact info from siteConfig, social links, FAQ cards
2026-04-08 18:37:34 +02:00
kayjaydee
bd78920ddf
feat(03-02): projects page with search and category filters
...
- Text search filtering by title, description, technologies
- Category filter buttons (UButton solid/soft variants)
- ProjectCard grid responsive 1/2/3 columns
- Empty state with reset button
- Stats: total projects, featured, categories
2026-04-08 18:37:17 +02:00
kayjaydee
59495cabf3
feat(03-02): landing page with 6 sections
...
- HeroSection, FeaturedProjectsSection, ServicesSection
- TestimonialsSection, FAQSection with homeFAQs, CTASection
- Preserved useSeoMeta and JSON-LD from Phase 2 stub
2026-04-08 18:36:49 +02:00
kayjaydee
3f5d432a39
docs(03-01): complete shared components plan
...
- SUMMARY.md with 3 tasks, 17 files, 239s duration
- STATE.md advanced to phase 3 plan 1
- ROADMAP.md updated with plan progress
- COMP-01 to COMP-04 marked complete
2026-04-08 18:35:37 +02:00
kayjaydee
9a1be02c6c
feat(03-01): create ContactForm with Zod validation and nodemailer SMTP server route
...
- ContactForm.vue: UForm + Zod schema (name/email/message) + useToast feedback
- server/api/contact.post.ts: nodemailer SMTP with server-side validation + HTML escaping
- SMTP credentials in private runtimeConfig (T-03-03)
- HTML escaping prevents XSS in email body (T-03-02)
2026-04-08 18:34:38 +02:00
kayjaydee
5502364e77
feat(03-01): create 9 shared components for landing sections and project display
...
- HeroSection: title + subtitle + 3 CTA UButtons
- FeaturedProjectsSection: 3 featured projects via useProjects()
- ServicesSection: 4 service cards with UCard + UIcon
- TestimonialsSection: UCard per testimonial with ratings and stats
- FAQSection: UAccordion with i18n-resolved items
- CTASection: final CTA with 2 UButtons
- ProjectCard: NuxtLink + NuxtImg + UBadge + schema.org microdata
- TechBadge: Technology lookup with NuxtImg + UBadge level
- ProjectGallery: UModal fullscreen + UCarousel + thumbnails + keyboard nav
2026-04-08 18:34:03 +02:00
kayjaydee
222fa069fd
feat(03-01): install deps, migrate site config, add SMTP runtimeConfig, wrap UApp
...
- Install nodemailer, zod, @types/nodemailer
- Create app/data/site.ts with migrated siteConfig from src/config/site.ts
- Add SiteConfig, ContactInfo, SocialLink, FiverrService, FiverrConfig to shared/types
- Add smtpHost/smtpUser/smtpPass/smtpTo to private runtimeConfig
- Wrap app.vue with UApp for useToast() support
2026-04-08 18:32:24 +02:00
kayjaydee
b5420b3902
docs(03): fix plan blockers — remove formation completely, cleanup legacy
...
- Remove PAGE-07 from requirements (formation deleted per D-19)
- No redirect, /formation returns 404 naturally
- Plan 04 now includes full legacy src/ cleanup
- Update success criteria: 7 routes, SMTP instead of EmailJS
2026-04-08 18:29:39 +02:00
kayjaydee
e5e14ef362
docs(03): create phase 3 plans — pages, components, Docker SSR
...
4 plans across 3 waves: shared components + deps (wave 1),
pages landing/projects/detail + about/contact/fiverr/404 (wave 2),
Dockerfile SSR + GA4 + docker-compose (wave 3).
2026-04-08 18:25:28 +02:00
kayjaydee
049b1f0f81
docs(03): research phase Pages & Ship domain
2026-04-08 18:19:06 +02:00
kayjaydee
e6c6295aaa
docs(03): update context — SMTP direct OVH, remove formation from scope
...
- Contact form uses server-side nodemailer via Nuxt API route (not EmailJS)
- Formation page removed from Phase 3 scope (was SaaS pricing, not portfolio)
2026-04-08 17:26:02 +02:00
kayjaydee
9e0149d49d
feat: remove formation/pricing page and all related content
...
Formation was a SaaS pricing page unrelated to the portfolio.
Removed: page, nav link, locale keys (nav.formation, seo.formation,
pricing.*) in both FR and EN, legacy source files.
2026-04-08 17:24:54 +02:00
kayjaydee
0697dbcfe6
feat(docker): add docker-compose configuration for portfolio service
...
- Introduced a new docker-compose.yml file to define the portfolio service.
- Configured Traefik routing with TLS settings and redirect middleware for non-www to www.
- Set up environment variables and network configuration for the service.
2026-04-08 16:48:47 +02:00
kayjaydee
3c40051ca9
docs(03): create phase 3 context from discussion
...
Decisions: 6-section landing, UModal+UCarousel gallery with thumbnails,
3-field contact form with EmailJS+Zod, SSR Docker with runtimeConfig.
2026-04-08 16:48:21 +02:00
kayjaydee
c27141b51f
docs(state): mark phase 2 verification pass and complete
...
All 3 TypeScript errors resolved, build passes, server renders.
Phase 2 SSR Shell marked complete.
2026-04-08 16:41:19 +02:00
kayjaydee
d2916e60bc
fix: add tailwindcss as devDependency for Nuxt UI v3
...
@nuxt/ui provides the Vite plugin but tailwindcss package itself
must be installed for @import "tailwindcss" to resolve in CSS.
2026-04-08 16:39:39 +02:00
kayjaydee
836c2a462c
fix: remove legacy tailwind.config.js conflicting with Nuxt UI v3
...
Nuxt UI v3 manages Tailwind v4 internally. The old tailwind.config.js
pointed to src/ and used Tailwind v3 format, causing SSR conflicts.
2026-04-08 16:38:07 +02:00
kayjaydee
76a2772951
fix: remove vite.config.ts and postcss.config.js conflicting with Nuxt
...
These are legacy configs from the Vue SPA. Nuxt manages Vite and
PostCSS internally — external configs cause IPC connection errors.
2026-04-08 16:34:12 +02:00
kayjaydee
3566b91fe6
fix(i18n): move locale files to i18n/locales/ for @nuxtjs/i18n resolution
...
@nuxtjs/i18n resolves langDir relative to its own i18n/ directory,
not the project root. Moved fr.json and en.json accordingly.
2026-04-08 16:33:07 +02:00
kayjaydee
2332c69557
fix(02): resolve 3 typecheck errors and i18n langDir path
...
- useSetLocale → destructured setLocale from useI18n()
- addSeoAttributes → seo option for useLocaleHead()
- process.env → import.meta.env for Nuxt compatibility
- langDir: 'locales/' → 'app/locales/' (Nuxt 4 resolves from project root)
2026-04-08 16:31:58 +02:00
kayjaydee
d424084b46
docs(02-02): complete layout shell plan (header + footer + default layout)
2026-04-08 16:27:02 +02:00
kayjaydee
c320085435
feat(02-02): create AppFooter, default layout, update app.vue with useLocaleHead
...
- AppFooter with copyright + Gitea/LinkedIn/Fiverr social icons (rel=noopener noreferrer)
- Default layout wraps header + slot + footer with min-h-screen flex
- app.vue uses NuxtLayout + useLocaleHead for global hreflang/canonical
- Fixed a11y.github -> a11y.gitea in both locale files
2026-04-08 16:26:14 +02:00
kayjaydee
61925c3c4d
docs(02-03): complete per-route SEO metadata plan
2026-04-08 16:26:04 +02:00
kayjaydee
57f60e4bdc
feat(02-02): create AppHeader with nav, lang/theme toggles, mobile drawer
...
- Sticky header with z-[1020], desktop nav with locale-aware NuxtLinks
- FR/EN text toggle using useSetLocale, dark/light icon toggle using useColorMode
- Mobile UDrawer with stacked nav links and toggles
- WCAG: min-w-11 min-h-11 touch targets, focus-visible:ring-2, aria-current on active link
2026-04-08 16:25:16 +02:00
kayjaydee
7f767154b3
feat(02-03): add per-route SEO metadata and JSON-LD to all page stubs
...
- useSeoMeta() with localized title/description/og tags on all 6 pages
- Homepage JSON-LD with Person + ProfessionalService schema
- og:image absolute URL on every page
- Stub templates with max-w-7xl wrapper and h1
2026-04-08 16:25:13 +02:00
kayjaydee
8a49a7fc88
docs(02-01): complete design system + i18n config plan
2026-04-08 16:23:48 +02:00
kayjaydee
69794e4bd9
feat(02-01): migrate i18n translations for Phase 2 scope
...
- nav, footer, a11y, seo keys from UI-SPEC copywriting contract
- All existing keys migrated from src/locales/fr.ts and en.ts
- Includes home, projects, about, contact, fiverr, faq, pricing, projectData, testimonials, common
- Emojis stripped from translation values for clean rendering
2026-04-08 16:23:03 +02:00
kayjaydee
7cf1366649
feat(02-01): design system, color-mode, sitemap config
...
- Brand color #85cb85 as CSS @theme with full shade palette
- app.config.ts maps Nuxt UI primary to brand
- colorMode with cookie storage, dark default, no FOUC
- i18n baseUrl and site.url for absolute SEO URLs
- Static og:image placeholder in public/
2026-04-08 16:17:04 +02:00
kayjaydee
068cc37397
docs(state): phase 2 planned
2026-04-08 16:13:48 +02:00
kayjaydee
87cbad25c1
docs(02): update CONTEXT.md D-05 Gitea + D-12 static og:image
2026-04-08 16:12:23 +02:00
kayjaydee
55497fe001
docs(02): create phase 2 SSR shell plans
2026-04-08 16:10:05 +02:00
kayjaydee
5db163a9b1
docs(02): research phase SSR shell domain
2026-04-08 15:57:15 +02:00
kayjaydee
ae7ca3a34b
docs(state): record phase 2 UI-SPEC session
2026-04-08 15:38:39 +02:00
kayjaydee
603b403cbb
docs(phase-02): UI design contract for SSR Shell
2026-04-08 15:37:38 +02:00
kayjaydee
1254db7c8a
docs(state): record phase 2 context session
2026-04-08 15:32:51 +02:00
kayjaydee
4fa965628a
docs(02): capture phase context
2026-04-08 15:32:30 +02:00
kayjaydee
c5de7de3e4
docs(phase-01): evolve PROJECT.md after phase completion
2026-04-08 15:19:34 +02:00