feat: migrate landing from Next.js to Nuxt 4 (Vue 3)

Full 1:1 migration preserving all visuals, animations and behavior:
- Nuxt 4 + Vue 3 (script setup, TypeScript strict) with SSG output
- Tailwind CSS v4 with @tailwindcss/vite
- Ant Design Vue 4 (dark theme, RTL, Persian locale) for design system
- Pinia for state management (ui + contact stores)
- motion-v (framer-motion port) for all animations
- lucide-vue-next for icons
- SEO improvements: og:image, canonical fix, real 404 page, JSON-LD services
- JS bundle reduced from 302KB to 239KB gzip
- Docker/nginx deployment preserved (out/ -> nginx)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
S. Esmaeili
2026-10-06 16:28:05 +03:30
co-authored by Claude Opus 4.6
parent 1af5b555b8
commit e31ef5a21f
127 changed files with 12160 additions and 3464 deletions
+23
View File
@@ -0,0 +1,23 @@
import { siteConfig } from "../../shared/config/site";
export default defineEventHandler((event) => {
setHeader(event, "Content-Type", "application/manifest+json; charset=utf-8");
return {
name: siteConfig.name,
short_name: siteConfig.name,
lang: siteConfig.lang,
dir: siteConfig.dir,
start_url: "/",
display: "standalone",
background_color: siteConfig.themeColor,
theme_color: siteConfig.themeColor,
icons: [
{
src: siteConfig.favicon,
sizes: "any",
type: "image/svg+xml",
purpose: "any",
},
],
};
});
+13
View File
@@ -0,0 +1,13 @@
import { siteConfig } from "../../shared/config/site";
export default defineEventHandler((event) => {
setHeader(event, "Content-Type", "text/plain; charset=utf-8");
return [
"User-Agent: *",
"Allow: /",
"",
`Host: ${siteConfig.url}`,
`Sitemap: ${siteConfig.url}/sitemap.xml`,
"",
].join("\n");
});
+15
View File
@@ -0,0 +1,15 @@
import { absUrl } from "../../shared/config/site";
const pages = ["/"];
export default defineEventHandler((event) => {
setHeader(event, "Content-Type", "application/xml; charset=utf-8");
const lastmod = new Date().toISOString();
const urls = pages
.map(
(p) =>
`<url>\n<loc>${absUrl(p)}</loc>\n<lastmod>${lastmod}</lastmod>\n<changefreq>monthly</changefreq>\n<priority>1</priority>\n</url>`,
)
.join("\n");
return `<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n${urls}\n</urlset>\n`;
});