File Structure
After running npm run generate, Nuxt emits a static SPA to .output/public. Key source entry points:
nuxt.config.ts (app config)
export default defineNuxtConfig({
ssr: false,
nitro: { preset: "static" },
css: ["~/assets/css-entry.css"],
app: {
head: {
title: "Orisa - Nuxt Template",
// fonts, vendor CSS, theme-init.js …
},
},
vite: {
plugins: [vueJsx()],
},
});
app/pages/*.vue (file-based routes)
<script setup lang="ts">
import Index2Page from "@/components/pages/Index2Page";
definePageMeta({
headerStyle: 2,
footerStyle: 2,
mainClass: "bg-neutral-0",
});
</script>
<template>
<component :is="Index2Page" />
</template>
app/layouts/default.vue (shared shell)
Selects header/footer styles from definePageMeta, mounts global effects (GSAP ScrollSmoother, ripples, cursor…), and wraps page content in the smooth-scroll DOM.
app/components/effects/*
Client-side motion modules remount/cleanup on route change so ScrollTrigger, Swiper, and jQuery ripples do not leak between pages.
Dependencies
{
"name": "orisa-nuxt",
"version": "1.0.0",
"engines": { "node": ">=20" },
"scripts": {
"dev": "nuxt dev",
"build": "nuxt build",
"generate": "nuxt generate",
"preview": "nuxt preview"
},
"dependencies": {
"bootstrap": "^5.3.3",
"gsap": "^3.12.7",
"isotope-layout": "^3.0.6",
"nuxt": "^4.6.3",
"swiper": "^11.2.5",
"vue": "^3.5.44",
"vue-router": "^5.4.0"
}
}