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"
  }
}