[
  {
    "path": ".github/workflows/ci.yml",
    "content": "name: CI\n\non:\n  push:\n    branches:\n      - main\n\n  pull_request:\n    branches:\n      - main\n\njobs:\n  lint:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - uses: pnpm/action-setup@v4\n      - uses: actions/setup-node@v4\n        with:\n          node-version: lts/*\n          cache: pnpm\n\n      - name: Install\n        run: pnpm install\n\n      - name: Lint\n        run: pnpm run lint\n\n  typecheck:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - uses: pnpm/action-setup@v4\n      - uses: actions/setup-node@v4\n        with:\n          node-version: lts/*\n          cache: pnpm\n\n      - name: Install\n        run: pnpm install\n\n      - name: Typecheck\n        run: pnpm run typecheck\n"
  },
  {
    "path": ".github/workflows/gh-pages.yml",
    "content": "name: GitHub Pages\n\non:\n  push:\n    branches:\n      - main\n  workflow_dispatch:\n\npermissions:\n  contents: read\n  pages: write\n  id-token: write\n\nconcurrency:\n  group: 'pages'\n  cancel-in-progress: true\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Install Dependencies\n        uses: pnpm/action-setup@v4\n        with:\n          run_install: true\n\n      - name: Setup Node\n        uses: actions/setup-node@v4\n        with:\n          node-version: lts/*\n\n      - name: Build\n        run: npm run generate\n\n      - name: Upload artifact\n        uses: actions/upload-pages-artifact@v3\n        with:\n          path: ./dist\n\n  deploy:\n    environment:\n      name: github-pages\n      url: ${{ steps.deployment.outputs.page_url }}\n    runs-on: ubuntu-latest\n    needs: build\n    steps:\n      - name: Deploy to GitHub Pages\n        id: deployment\n        uses: actions/deploy-pages@v4\n"
  },
  {
    "path": ".gitignore",
    "content": "node_modules\n*.log\ndist\n.output\n.nuxt\n.vercel\n"
  },
  {
    "path": ".npmrc",
    "content": "shamefully-hoist=true\nstrict-peer-dependencies=false\nshell-emulator=true\n# fix code ERESOLVE \\n ERESOLVE could not resolve\nlegacy-peer-deps=true"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n  \"eslint.useFlatConfig\": true,\n\n  // Auto fix\n  \"editor.codeActionsOnSave\": {\n    \"source.fixAll.eslint\": \"explicit\",\n    \"source.organizeImports\": \"never\"\n  },\n  \"typescript.tsdk\": \"node_modules/typescript/lib\"\n}\n"
  },
  {
    "path": "Dockerfile",
    "content": "FROM node:20-alpine as build-stage\n\nWORKDIR /app\nRUN corepack enable\n\nCOPY .npmrc package.json pnpm-lock.yaml ./\nRUN --mount=type=cache,id=pnpm-store,target=/root/.pnpm-store \\\n    pnpm install --frozen-lockfile\n\nCOPY . .\nRUN pnpm build\n\n# SSR\nFROM node:20-alpine as production-stage\n\nWORKDIR /app\n\nCOPY --from=build-stage /app/.output ./.output\n\nEXPOSE 3000\n\nCMD [\"node\", \".output/server/index.mjs\"]\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2021 Element Plus\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# Element Plus with Nuxt 3 Minimal Starter\n\n- SSR Preview: <https://element-plus-nuxt.vercel.app/>\n- SSG Preview: <https://nuxt-starter.element-plus.org/>\n\nWe recommend to look at the [Nuxt 3 Docs](https://nuxt.com/) and [Element Plus Docs](https://element-plus.org/).\n\n> If you are looking for a Vite + Vue + Element Plus starter, check out [element-plus-vite-starter](https://github.com/element-plus/element-plus-vite-starter/).\n\n## Setup\n\nMake sure to install the dependencies\n\n```bash\npnpm install\n```\n\n## Development\n\nStart the development server on `http://localhost:3000`\n\n```bash\npnpm dev\n```\n\nMore info about [nuxt deployment](https://nuxt.com/docs/getting-started/deployment#presets).\n\nRun `npm run generate` to generate static html in `.output/public`.\n\n## Production\n\nBuild the application for production:\n\n```bash\npnpm build\n```\n\nCheckout the [deployment documentation](https://nuxt.com/docs/getting-started/deployment).\n\n## Deploy\n\nYou need set `NITRO_PRESET=vercel-edge`, see [Nuxt on Vercel](https://vercel.com/docs/frameworks/nuxt#edge-functions).\n\n## Ref\n\n- [vitesse-nuxt3](https://github.com/antfu/vitesse-nuxt3)\n"
  },
  {
    "path": "app/app.vue",
    "content": "<script setup lang=\"ts\">\nimport { appName } from '~/constants'\n\nuseHead({\n  title: appName,\n})\n</script>\n<template>\n  <NuxtLayout>\n    <NuxtPage />\n  </NuxtLayout>\n</template>\n"
  },
  {
    "path": "app/assets/scss/element/dark.scss",
    "content": "@forward 'element-plus/theme-chalk/src/dark/var.scss' with (\n  $bg-color: (\n    'page': #0a0a0a,\n    'overlay': #1d1e1f,\n  )\n);\n"
  },
  {
    "path": "app/assets/scss/element/index.scss",
    "content": "$-colors: (\n  'primary': (\n    'base': rgba(107,33,168, 1),\n  ),\n  'success': (\n    'base': green,\n  ),\n  'warning': (\n    'base': #f9a23c,\n  ),\n  'danger': (\n    'base': #ff3300,\n  ),\n  'error': (\n    'base': #f56c6c,\n  ),\n  'info': (\n    'base': #909399,\n  ),\n);\n\n@forward 'element-plus/theme-chalk/src/common/var.scss' with (\n  $colors: $-colors\n);\n\n@use './dark.scss';\n"
  },
  {
    "path": "app/assets/scss/index.scss",
    "content": "html,\nbody,\n#app {\n  margin: 0;\n  padding: 0;\n}\n\nhtml.dark {\n  background: #222;\n  color: white;\n}\n\na {\n  font-weight: 400;\n  color: var(--el-color-primary);\n}\n"
  },
  {
    "path": "app/components/DarkToggle.vue",
    "content": "<script setup lang=\"ts\">\nconst color = useColorMode()\n\nuseHead({\n  meta: [{\n    id: 'theme-color',\n    name: 'theme-color',\n    content: () => color.value === 'dark' ? '#222222' : '#ffffff',\n  }],\n})\n\nfunction toggleDark() {\n  color.preference = color.value === 'dark' ? 'light' : 'dark'\n}\n</script>\n\n<template>\n  <button class=\"inline-flex justify-center items-center\" @click=\"toggleDark\">\n    <div class=\"i-ri-sun-line dark:i-ri-moon-line\" />\n  </button>\n</template>\n"
  },
  {
    "path": "app/components/GitHubLink.vue",
    "content": "<script setup lang=\"ts\">\nimport { repository } from \"~/../package.json\";\n</script>\n\n<template>\n  <a class=\"inline-flex justify-center items-center dark:text-white\" :href=\"repository.url\" target=\"_blank\">\n    <div i-ri-github-line />\n  </a>\n</template>\n"
  },
  {
    "path": "app/components/NuxtLogo.vue",
    "content": "<template>\n  <svg\n    viewBox=\"0 0 221 65\"\n    fill=\"none\"\n    xmlns=\"http://www.w3.org/2000/svg\"\n    class=\"h-8\"\n  >\n    <g clip-path=\"url(#a)\">\n      <path\n        fill=\"currentColor\"\n        d=\"M82.5623 18.5705h7.3017l15.474 24.7415V18.5705h6.741v35.0576h-7.252L89.3025 28.938v24.6901h-6.7402V18.5705ZM142.207 53.628h-6.282v-3.916c-1.429 2.7559-4.339 4.3076-8.015 4.3076-5.822 0-9.603-4.1069-9.603-10.0175V28.3847h6.282v14.3251c0 3.4558 2.146 5.8592 5.362 5.8592 3.524 0 5.974-2.7044 5.974-6.4099V28.3847h6.282V53.628ZM164.064 53.2289l-6.026-8.4144-6.027 8.4144h-6.69l9.296-13.1723-8.58-12.0709h6.843l5.158 7.2641 5.106-7.2641h6.895l-8.632 12.0709 9.295 13.1723h-6.638ZM183.469 20.7726v7.6116h7.149v5.1593h-7.149v12.5311c0 .4208.17.8245.473 1.1223.303.2978.715.4654 1.144.4661h5.532v5.9547h-4.137c-5.617 0-9.293-3.2062-9.293-8.8109V33.5484h-5.056v-5.1642h3.172c1.479 0 2.34-.8639 2.34-2.2932v-5.3184h5.825Z\"\n      />\n      <path\n        fill-rule=\"evenodd\"\n        clip-rule=\"evenodd\"\n        d=\"M30.1185 11.5456c-1.8853-3.24168-6.5987-3.24169-8.484 0L1.08737 46.8747c-1.885324 3.2417.47133 7.2938 4.24199 7.2938H21.3695c-1.6112-1.4081-2.2079-3.8441-.9886-5.9341l15.5615-26.675-5.8239-10.0138Z\"\n        fill=\"#80EEC0\"\n      />\n      <path\n        d=\"M43.1374 19.2952c1.5603-2.6523 5.461-2.6523 7.0212 0l17.0045 28.9057c1.5603 2.6522-.39 5.9676-3.5106 5.9676h-34.009c-3.1206 0-5.0709-3.3154-3.5106-5.9676l17.0045-28.9057ZM209.174 53.8005H198.483c0-1.8514.067-3.4526 0-6.0213h10.641c1.868 0 3.353.1001 4.354-.934 1-1.0341 1.501-2.3351 1.501-3.9029 0-1.8347-.667-3.2191-2.002-4.1532-1.301-.9674-2.985-1.4511-5.054-1.4511h-2.601v-5.2539h2.652c1.701 0 3.119-.4003 4.253-1.2009 1.134-.8006 1.701-1.9849 1.701-3.5527 0-1.301-.434-2.3351-1.301-3.1023-.834-.8007-2.001-1.201-3.503-1.201-1.634 0-2.918.4837-3.853 1.4511-.9.9674-1.401 2.1517-1.501 3.5527h-6.254c.133-3.2358 1.251-5.7877 3.352-7.6558 2.135-1.868 4.887-2.8021 8.256-2.8021 2.402 0 4.42.4337 6.055 1.301 1.668.834 2.919 1.9515 3.753 3.3525.867 1.4011 1.301 2.9523 1.301 4.6536 0 1.9681-.551 3.636-1.651 5.0037-1.068 1.3344-2.402 2.235-4.004 2.7021 1.969.4003 3.57 1.3677 4.804 2.9022 1.234 1.5011 1.852 3.4025 1.852 5.7043 0 1.9347-.468 3.7028-1.402 5.304-.934 1.6012-2.301 2.8855-4.103 3.8529-1.768.9674-3.953 1.4511-6.555 1.4511Z\"\n        fill=\"#00DC82\"\n      />\n    </g>\n    <defs>\n      <clipPath id=\"a\"><path fill=\"#fff\" d=\"M0 0h221v65H0z\"/></clipPath>\n    </defs>\n  </svg>\n</template>\n"
  },
  {
    "path": "app/components/RightTopMenu.vue",
    "content": "<template>\n  <div class=\"flex justify-center items-center gap-4 text-base\">\n    <DarkToggle />\n    <GitHubLink />\n  </div>\n</template>\n"
  },
  {
    "path": "app/components/TheCounter.vue",
    "content": "<script setup lang=\"ts\">\nconst { count } = useCount();\n</script>\n\n<template>\n  <el-input-number v-model=\"count\" :min=\"1\" :max=\"10\" />\n</template>\n"
  },
  {
    "path": "app/components/TheExamples.vue",
    "content": "<script setup lang=\"ts\">\n\nconst hello = () => ElMessage.info(\"hello world\");\nconst helloSuccess = () => ElMessage.success(\"hello world\");\n\nconst color = useColorMode();\nconst colorMode = computed({\n  get: () => color.value === 'dark',\n  set: () => (color.preference = (color.value === 'dark' ? 'light' : 'dark')),\n});\n</script>\n\n<template>\n  <ClientOnly>\n    <el-switch v-model=\"colorMode\" inline-prompt active-text=\"dark\" inactive-text=\"light\" size=\"large\"/>\n  </ClientOnly>\n\n  <br >\n\n  <el-dropdown class=\"m-4\" type=\"primary\">\n    <el-button type=\"primary\">\n      Dropdown List\n      <el-icon class=\"el-icon--right\">\n        <el-icon-arrow-down />\n      </el-icon>\n    </el-button>\n    <template #dropdown>\n      <el-dropdown-menu>\n        <el-dropdown-item>Action 1</el-dropdown-item>\n        <el-dropdown-item>Action 2</el-dropdown-item>\n        <el-dropdown-item>Action 3</el-dropdown-item>\n        <el-dropdown-item>Action 4</el-dropdown-item>\n        <el-dropdown-item>Action 5</el-dropdown-item>\n      </el-dropdown-menu>\n    </template>\n  </el-dropdown>\n\n  <br >\n\n  <el-button :icon=\"ElIconView\" class=\"m-4\" @click=\"hello\">Hello</el-button>\n  <el-button class=\"m-4\" type=\"primary\" @click=\"hello\">Hello</el-button>\n  <el-button class=\"m-4\" type=\"success\" @click=\"helloSuccess\">Hello</el-button>\n\n  <br >\n\n  <TheCounter class=\"m-4\" />\n\n  <div class=\"flex flex-col gap-2 items-center justify-center\">\n    <ExampleDatePickers />\n    <ExampleIcons />\n    <ExampleButtons />\n    <ExampleSwitches />\n    <ExampleTags />\n  </div>\n</template>\n"
  },
  {
    "path": "app/components/TheLogos.vue",
    "content": "<script setup lang=\"ts\">\n</script>\n\n<template>\n  <div class=\"display-logo\" flex=\"~\" gap-2 items-center>\n    <img\n      class=\"logo\"\n      src=\"https://element-plus.org/images/element-plus-logo.svg\"\n    >\n    <el-icon><ElIconPlus /></el-icon>\n    <NuxtLogo class=\"logo\" />\n  </div>\n  <h2>\n    <a target=\"_blank\" href=\"https://element-plus.org/\">Element Plus</a>\n    With\n    <a target=\"_blank\" href=\"https://v3.nuxtjs.org/\">NuxtJS</a>\n  </h2>\n</template>\n\n<style>\n.display-logo {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n}\n\n.logo {\n  max-height: 3rem;\n}\n</style>\n"
  },
  {
    "path": "app/components/example/Buttons.vue",
    "content": "<script setup lang=\"ts\">\nconst count = ref(0)\n</script>\n\n<template>\n  <div class=\"my-2 flex flex-wrap items-center justify-center text-center\">\n    <el-button @click=\"count++\">\n      count is: {{ count }}\n    </el-button>\n    <el-button type=\"primary\" @click=\"count++\">\n      count is: {{ count }}\n    </el-button>\n    <el-button type=\"success\" @click=\"count++\">\n      count is: {{ count }}\n    </el-button>\n    <el-button type=\"warning\" @click=\"count++\">\n      count is: {{ count }}\n    </el-button>\n    <el-button type=\"danger\" @click=\"count++\">\n      count is: {{ count }}\n    </el-button>\n    <el-button type=\"info\" @click=\"count++\">\n      count is: {{ count }}\n    </el-button>\n  </div>\n</template>\n"
  },
  {
    "path": "app/components/example/DatePickers.vue",
    "content": "\n<script setup lang=\"ts\">\nimport zhCn from \"element-plus/es/locale/lang/zh-cn\";\n\nconst timeValue = ref(\"\");\n</script>\n\n<template>\n  <el-config-provider :locale=\"zhCn\">\n    <el-date-picker\n      v-model=\"timeValue\"\n      type=\"date\"\n      placeholder=\"请选择日期\"\n    />\n  </el-config-provider>\n</template>\n"
  },
  {
    "path": "app/components/example/Icons.vue",
    "content": "<template>\n  <div class=\"pt-4 flex gap-2\">\n    <el-icon class=\"cursor-pointer\">\n      <el-icon-grape />\n    </el-icon>\n    <el-icon class=\"cursor-pointer\">\n      <ElIconIceCream />\n    </el-icon>\n    <el-icon class=\"cursor-pointer mb-4\">\n      <ElIconIceDrink />\n    </el-icon>\n  </div>\n</template>\n"
  },
  {
    "path": "app/components/example/Switches.vue",
    "content": "<script setup lang=\"ts\">\nconst value1 = ref(true)\n</script>\n\n<template>\n  <div>\n    <el-switch v-model=\"value1\" />\n    <el-switch\n      v-model=\"value1\"\n      class=\"m-2\"\n      style=\"--ep-switch-on-color: black; --ep-switch-off-color: gray;\"\n    />\n  </div>\n</template>\n"
  },
  {
    "path": "app/components/example/Tags.vue",
    "content": "<template>\n  <div>\n    <el-tag type=\"success\" class=\"m-1\">\n      Tag 1\n    </el-tag>\n    <el-tag type=\"warning\" class=\"m-1\">\n      Tag 1\n    </el-tag>\n    <el-tag type=\"danger\" class=\"m-1\">\n      Tag 1\n    </el-tag>\n    <el-tag type=\"info\" class=\"m-1\">\n      Tag 1\n    </el-tag>\n  </div>\n</template>\n"
  },
  {
    "path": "app/composables/count.ts",
    "content": "export function useCount() {\n  const count = useState('count', () => Math.round(Math.random() * 20))\n\n  function inc() {\n    count.value += 1\n  }\n  function dec() {\n    count.value -= 1\n  }\n\n  return {\n    count,\n    inc,\n    dec,\n  }\n}\n"
  },
  {
    "path": "app/constants/index.ts",
    "content": "export const appName = 'Element Plus Nuxt Starter'\nexport const appDescription = 'Nuxt Starter for Element Plus'\n"
  },
  {
    "path": "app/layouts/README.md",
    "content": "## Layouts\n\nVue components in this dir are used as layouts.\n\nBy default, `default.vue` will be used unless an alternative is specified in the route meta.\n\n```vue\n<script setup lang=\"ts\">\ndefinePageMeta({\n  layout: 'home',\n})\n</script>\n```\n\nLearn more on https://nuxt.com/docs/guide/directory-structure/layouts\n"
  },
  {
    "path": "app/layouts/default.vue",
    "content": "<template>\n  <main class=\"px-10 py-20 text-center\">\n    <RightTopMenu class=\"absolute top-4 right-4\" />\n\n    <slot />\n    <div class=\"mx-auto mt-5 text-center text-sm opacity-25\">\n      [Default Layout]\n    </div>\n  </main>\n</template>\n"
  },
  {
    "path": "app/layouts/home.vue",
    "content": "<template>\n  <main class=\"px-10 py-20 text-center\">\n    <RightTopMenu class=\"absolute top-4 right-4\" />\n\n    <slot />\n    <div class=\"mx-auto mt-5 text-center text-sm opacity-25\">\n      [Home Layout]\n    </div>\n  </main>\n</template>\n"
  },
  {
    "path": "app/pages/[...all].vue",
    "content": "<script setup lang=\"ts\">\nconst router = useRouter()\n</script>\n\n<template>\n  <main p=\"x4 y10\" text=\"center teal-700 dark:gray-200\">\n    <div text-4xl>\n      <div i-ep-warning inline-block />\n    </div>\n    <div>Not found</div>\n    <div>\n      <button text-sm btn m=\"3 t8\" @click=\"router.back()\">\n        Back\n      </button>\n    </div>\n  </main>\n</template>\n"
  },
  {
    "path": "app/pages/hi/[id].vue",
    "content": "<script setup lang=\"ts\">\nconst route = useRoute()\nconst user = useUserStore()\nconst name = (route.params as { id: string}).id\n\nwatchEffect(() => {\n  user.setNewName((route.params as { id: string}).id)\n})\n</script>\n\n<template>\n  <div m-3>\n    <h3>Hi, {{ name }}!</h3>\n\n    <template v-if=\"user.otherNames.length\">\n      <span>Also as known as:</span>\n      <ul>\n        <li v-for=\"otherName in user.otherNames\" :key=\"otherName\">\n          <router-link :to=\"`/hi/${otherName}`\" replace>\n            {{ otherName }}\n          </router-link>\n        </li>\n      </ul>\n    </template>\n\n    <TheCounter />\n\n    <div>\n      <NuxtLink to=\"/\">Back</NuxtLink>\n    </div>\n  </div>\n</template>\n"
  },
  {
    "path": "app/pages/index.vue",
    "content": "<script setup lang=\"ts\">\ndefinePageMeta({\n  layout: 'home',\n})\n</script>\n\n<template>\n  <div class=\"page-index\">\n    <TheLogos />\n    <TheExamples />\n  </div>\n</template>\n\n<style>\n.page-index {\n  padding-top: 60px;\n  text-align: center;\n}\n</style>\n"
  },
  {
    "path": "app/stores/user.ts",
    "content": "import { acceptHMRUpdate, defineStore } from \"pinia\";\n\nexport const useUserStore = defineStore(\"user\", () => {\n  /**\n   * Current named of the user.\n   */\n  const savedName = ref(\"\");\n  const previousNames = ref(new Set<string>());\n\n  const usedNames = computed(() => Array.from(previousNames.value));\n  const otherNames = computed(() =>\n    usedNames.value.filter((name) => name !== savedName.value)\n  );\n\n  /**\n   * Changes the current name of the user and saves the one that was used\n   * before.\n   *\n   * @param name - new name to set\n   */\n  function setNewName(name: string) {\n    if (savedName.value) previousNames.value.add(savedName.value);\n\n    savedName.value = name;\n  }\n\n  return {\n    setNewName,\n    otherNames,\n    savedName,\n  };\n});\n\nif (import.meta.hot)\n  import.meta.hot.accept(acceptHMRUpdate(useUserStore, import.meta.hot));\n"
  },
  {
    "path": "eslint.config.mjs",
    "content": "import withNuxt from './.nuxt/eslint.config.mjs'\n\n// https://eslint.nuxt.com/packages/module\nexport default withNuxt(\n  {\n    rules: {\n      'vue/multi-word-component-names': 'off',\n    }\n  }\n  // your custom flat configs go here, for example:\n  // {\n  //   files: ['**/*.ts', '**/*.tsx'],\n  //   rules: {\n  //     'no-console': 'off' // allow console.log in TypeScript files\n  //   }\n  // },\n  // {\n  //   ...\n  // }\n)\n"
  },
  {
    "path": "nuxt.config.ts",
    "content": "// https://v3.nuxtjs.org/docs/directory-structure/nuxt.config\nexport default defineNuxtConfig({\n  modules: [\n    '@nuxt/eslint',\n    '@vueuse/nuxt',\n    '@unocss/nuxt',\n    '@pinia/nuxt',\n    '@element-plus/nuxt',\n    '@nuxtjs/color-mode'\n  ],\n\n  devtools: {\n    enabled: true,\n  },\n\n  app: {\n    // head\n    head: {\n      title: 'Element Plus + Nuxt 3',\n      meta: [\n        { name: 'viewport', content: 'width=device-width, initial-scale=1' },\n        {\n          name: 'description',\n          content: 'ElementPlus + Nuxt3',\n        },\n      ],\n      link: [{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }],\n    }\n  },\n\n  // css\n  css: [\n    '@unocss/reset/tailwind.css',\n    '~/assets/scss/index.scss'\n  ],\n\n  // vueuse\n  vueuse: {\n    ssrHandlers: true,\n  },\n\n  // colorMode\n  colorMode: {\n    classSuffix: '',\n  },\n\n  future: {\n    compatibilityVersion: 4,\n  },\n\n  experimental: {\n    // when using generate, payload js assets included in sw precache manifest\n    // but missing on offline, disabling extraction it until fixed\n    payloadExtraction: false,\n    renderJsonPayloads: true,\n    typedPages: true,\n  },\n\n  compatibilityDate: '2024-08-14',\n\n  nitro: {\n    esbuild: {\n      options: {\n        target: 'esnext',\n      },\n    },\n    prerender: {\n      crawlLinks: false,\n      routes: ['/'],\n      ignore: ['/hi'],\n    },\n  },\n\n  vite: {\n    css: {\n      preprocessorOptions: {\n        scss: {\n          additionalData: `@use \"@/assets/scss/element/index.scss\" as element;`,\n        },\n      },\n    },\n  },\n\n  elementPlus: {\n    icon: 'ElIcon',\n    importStyle: 'scss',\n    themes: ['dark'],\n  },\n})\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"element-plus-nuxt-starter\",\n  \"type\": \"module\",\n  \"private\": true,\n  \"packageManager\": \"pnpm@10.14.0\",\n  \"version\": \"0.1.0\",\n  \"description\": \"Element Plus with Nuxt 3 Minimal Starter\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/element-plus/element-plus-nuxt-starter\"\n  },\n  \"author\": \"Element Plus Team\",\n  \"license\": \"MIT\",\n  \"scripts\": {\n    \"preinstall\": \"npx only-allow pnpm\",\n    \"dev\": \"nuxi dev\",\n    \"build\": \"nuxi build\",\n    \"lint\": \"eslint .\",\n    \"lint:fix\": \"eslint . --fix\",\n    \"preview\": \"nuxi preview\",\n    \"start\": \"node .output/server/index.mjs\",\n    \"generate\": \"nuxi generate\",\n    \"prepare\": \"nuxi prepare\",\n    \"typecheck\": \"vue-tsc --noEmit\"\n  },\n  \"dependencies\": {\n    \"@element-plus/icons-vue\": \"^2.3.1\",\n    \"element-plus\": \"^2.10.5\"\n  },\n  \"devDependencies\": {\n    \"@element-plus/nuxt\": \"^1.1.4\",\n    \"@iconify-json/ri\": \"^1.2.5\",\n    \"@nuxt/eslint\": \"^1.7.1\",\n    \"@nuxtjs/color-mode\": \"^3.5.2\",\n    \"@pinia/nuxt\": \"^0.11.2\",\n    \"@unocss/nuxt\": \"^66.4.0\",\n    \"@vueuse/nuxt\": \"^13.6.0\",\n    \"consola\": \"^3.4.2\",\n    \"eslint\": \"^9.32.0\",\n    \"nuxt\": \"^4.0.2\",\n    \"sass\": \"^1.89.2\",\n    \"typescript\": \"^5.9.2\",\n    \"vue-tsc\": \"^3.0.5\"\n  },\n  \"peerDependencies\": {\n    \"pinia\": \"^2.1.6\"\n  },\n  \"pnpm\": {\n    \"peerDependencyRules\": {\n      \"ignoreMissing\": [\n        \"webpack\",\n        \"vite\",\n        \"vue\"\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "public/CNAME",
    "content": "nuxt-starter.element-plus.org\n"
  },
  {
    "path": "server/api/pageview.ts",
    "content": "const startAt = Date.now()\nlet count = 0\n\nexport default defineEventHandler(() => ({\n  pageview: count++,\n  startAt,\n}))\n"
  },
  {
    "path": "server/tsconfig.json",
    "content": "{\n  \"extends\": \"../.nuxt/tsconfig.server.json\"\n}\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  // https://v3.nuxtjs.org/concepts/typescript\n  \"extends\": \"./.nuxt/tsconfig.json\"\n}\n"
  },
  {
    "path": "uno.config.ts",
    "content": "import {\n  defineConfig,\n  presetAttributify,\n  presetIcons,\n  presetTypography,\n  presetUno,\n  presetWebFonts,\n  transformerDirectives,\n  transformerVariantGroup,\n} from 'unocss'\n\nexport default defineConfig({\n  shortcuts: [\n    ['btn', 'px-4 py-1 rounded inline-block bg-teal-600 text-white cursor-pointer hover:bg-teal-700 disabled:cursor-default disabled:bg-gray-600 disabled:opacity-50'],\n    ['icon-btn', 'inline-block cursor-pointer select-none opacity-75 transition duration-200 ease-in-out hover:opacity-100 hover:text-teal-600'],\n  ],\n  presets: [\n    presetUno(),\n    presetAttributify(),\n    presetIcons({\n      scale: 1.2,\n    }),\n    presetTypography(),\n    presetWebFonts({\n      fonts: {\n        sans: 'DM Sans',\n        serif: 'DM Serif Display',\n        mono: 'DM Mono',\n      },\n    }),\n  ],\n  transformers: [\n    transformerDirectives(),\n    transformerVariantGroup(),\n  ],\n})\n"
  }
]