Repository: antfu-collective/vitesse Branch: main Commit: 8a01bc9283fe Files: 75 Total size: 102.7 KB Directory structure: gitextract_7rc8tos6/ ├── .dockerignore ├── .editorconfig ├── .github/ │ ├── FUNDING.yml │ └── workflows/ │ └── ci.yml ├── .gitignore ├── .npmrc ├── .vscode/ │ ├── extensions.json │ └── settings.json ├── Dockerfile ├── LICENSE ├── README.md ├── README.zh-CN.md ├── cypress/ │ ├── e2e/ │ │ └── basic.spec.ts │ └── tsconfig.json ├── cypress.config.ts ├── eslint.config.js ├── index.html ├── locales/ │ ├── README.md │ ├── ar.yml │ ├── de.yml │ ├── en.yml │ ├── es.yml │ ├── fr.yml │ ├── id.yml │ ├── it.yml │ ├── ja.yml │ ├── ka.yml │ ├── ko.yml │ ├── pl.yml │ ├── pt-BR.yml │ ├── ru.yml │ ├── tr.yml │ ├── uk.yml │ ├── uz.yml │ ├── vi.yml │ └── zh-CN.yml ├── netlify.toml ├── package.json ├── pnpm-workspace.yaml ├── public/ │ └── _headers ├── src/ │ ├── App.vue │ ├── auto-imports.d.ts │ ├── components/ │ │ ├── README.md │ │ ├── TheCounter.vue │ │ ├── TheFooter.vue │ │ └── TheInput.vue │ ├── components.d.ts │ ├── composables/ │ │ └── dark.ts │ ├── layouts/ │ │ ├── 404.vue │ │ ├── README.md │ │ ├── default.vue │ │ └── home.vue │ ├── main.ts │ ├── modules/ │ │ ├── README.md │ │ ├── i18n.ts │ │ ├── nprogress.ts │ │ ├── pinia.ts │ │ └── pwa.ts │ ├── pages/ │ │ ├── README.md │ │ ├── [...all].vue │ │ ├── about.md │ │ ├── hi/ │ │ │ └── [name].vue │ │ └── index.vue │ ├── route-map.d.ts │ ├── shims.d.ts │ ├── stores/ │ │ └── user.ts │ ├── styles/ │ │ ├── main.css │ │ └── markdown.css │ └── types.ts ├── test/ │ ├── __snapshots__/ │ │ └── component.test.ts.snap │ ├── basic.test.ts │ └── component.test.ts ├── tsconfig.json ├── uno.config.ts └── vite.config.ts ================================================ FILE CONTENTS ================================================ ================================================ FILE: .dockerignore ================================================ node_modules dist ================================================ FILE: .editorconfig ================================================ root = true [*] charset = utf-8 indent_style = space indent_size = 2 end_of_line = lf insert_final_newline = true trim_trailing_whitespace = true ================================================ FILE: .github/FUNDING.yml ================================================ open_collective: antfu github: [antfu] ================================================ FILE: .github/workflows/ci.yml ================================================ name: CI on: push: branches: - main pull_request: branches: - main jobs: lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: pnpm/action-setup@v3 - uses: actions/setup-node@v4 with: node-version: lts/* cache: pnpm - name: Install run: pnpm install - name: Lint run: pnpm run lint typecheck: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: pnpm/action-setup@v3 - uses: actions/setup-node@v4 with: node-version: lts/* cache: pnpm - name: Install run: pnpm install - name: Typecheck run: pnpm run typecheck test: runs-on: ${{ matrix.os }} strategy: matrix: node-version: [20.x, 22.x] os: [ubuntu-latest] fail-fast: false steps: - uses: actions/checkout@v4 - uses: pnpm/action-setup@v3 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} registry-url: https://registry.npmjs.org/ cache: pnpm - run: pnpm install - run: pnpm run test:unit test-e2e: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/cache@v4 with: path: | ~/.cache key: cypress-cache-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }} - uses: pnpm/action-setup@v3 - name: Use Node.js uses: actions/setup-node@v4 with: node-version: lts/* registry-url: https://registry.npmjs.org/ cache: pnpm - run: pnpm install - name: Cypress PNPM Patch run: cp pnpm-lock.yaml package-lock.json - name: Cypress uses: cypress-io/github-action@v6 with: install-command: echo build: pnpm run build start: npx vite preview --port 3333 ================================================ FILE: .gitignore ================================================ .DS_Store .vite-ssg-dist .vite-ssg-temp *.local dist dist-ssr node_modules .idea/ *.log cypress/downloads public/assets/fonts ================================================ FILE: .npmrc ================================================ shamefully-hoist=true ================================================ FILE: .vscode/extensions.json ================================================ { "recommendations": [ "antfu.iconify", "antfu.unocss", "antfu.vite", "antfu.goto-alias", "csstools.postcss", "dbaeumer.vscode-eslint", "vue.volar", "lokalise.i18n-ally", "streetsidesoftware.code-spell-checker" ] } ================================================ FILE: .vscode/settings.json ================================================ { "cSpell.words": ["Vitesse", "Vite", "unocss", "vitest", "vueuse", "pinia", "demi", "antfu", "iconify", "intlify", "vitejs", "unplugin", "pnpm"], "i18n-ally.sourceLanguage": "en", "i18n-ally.keystyle": "nested", "i18n-ally.localesPaths": "locales", "i18n-ally.sortKeys": true, // Disable the default formatter "prettier.enable": false, "editor.formatOnSave": false, // Auto fix "editor.codeActionsOnSave": { "source.fixAll.eslint": "explicit", "source.organizeImports": "never" }, // Silent the stylistic rules in you IDE, but still auto fix them "eslint.rules.customizations": [ { "rule": "style/*", "severity": "off" }, { "rule": "format/*", "severity": "off" }, { "rule": "*-indent", "severity": "off" }, { "rule": "*-spacing", "severity": "off" }, { "rule": "*-spaces", "severity": "off" }, { "rule": "*-order", "severity": "off" }, { "rule": "*-dangle", "severity": "off" }, { "rule": "*-newline", "severity": "off" }, { "rule": "*quotes", "severity": "off" }, { "rule": "*semi", "severity": "off" } ], // The following is optional. // It's better to put under project setting `.vscode/settings.json` // to avoid conflicts with working with different eslint configs // that does not support all formats. "eslint.validate": [ "javascript", "javascriptreact", "typescript", "typescriptreact", "vue", "html", "markdown", "json", "jsonc", "yaml" ] } ================================================ FILE: Dockerfile ================================================ FROM node:20-alpine AS build-stage WORKDIR /app RUN corepack enable COPY .npmrc package.json pnpm-lock.yaml pnpm-workspace.yaml ./ RUN --mount=type=cache,id=pnpm-store,target=/root/.pnpm-store \ pnpm install --frozen-lockfile COPY . . RUN pnpm build FROM nginx:stable-alpine AS production-stage COPY --from=build-stage /app/dist /usr/share/nginx/html EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] ================================================ FILE: LICENSE ================================================ MIT License Copyright (c) 2020-PRESENT Anthony Fu Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================

Vitesse - Opinionated Vite Starter Template

Mocking up web app with Vitesse(speed)


Live Demo


> **Note**: This template is created during the early transition of Vue 3 and Vite. At this moment, if you are seeking for better Vue developer experience and more consistent maintenance, we recommend using [Nuxt](https://nuxt.com) instead (it also works perfectly with SPA or SSG as needed). This template still serves as a reference, but expect slower updates.

English | 简体中文


## Features - ⚡️ [Vue 3](https://github.com/vuejs/core), [Vite](https://github.com/vitejs/vite), [pnpm](https://pnpm.io/), [esbuild](https://github.com/evanw/esbuild) - born with fastness - 🗂 [File based routing](./src/pages) - 📦 [Components auto importing](./src/components) - 🍍 [State Management via Pinia](https://pinia.vuejs.org/) - 📑 [Layout system](./src/layouts) - 📲 [PWA](https://github.com/antfu/vite-plugin-pwa) - 🎨 [UnoCSS](https://github.com/antfu/unocss) - the instant on-demand atomic CSS engine - 😃 [Use icons from any icon sets with classes](https://github.com/antfu/unocss/tree/main/packages/preset-icons) - 🌍 [I18n ready](./locales) - 🔎 [Component Preview](https://github.com/johnsoncodehk/vite-plugin-vue-component-preview) - 🗒 [Markdown Support](https://github.com/unplugin/unplugin-vue-markdown) - 🔥 Use the [new `
================================================ FILE: locales/README.md ================================================ ## i18n This directory is to serve your locale translation files. YAML under this folder would be loaded automatically and register with their filenames as locale code. Check out [`vue-i18n`](https://github.com/intlify/vue-i18n-next) for more details. If you are using VS Code, [`i18n Ally`](https://github.com/lokalise/i18n-ally) is recommended to make the i18n experience better. ================================================ FILE: locales/ar.yml ================================================ button: about: حول back: رجوع go: تجربة home: الرئيسية toggle_dark: التغيير إلى الوضع المظلم toggle_langs: تغيير اللغة intro: desc: vite مثال لتطبيق dynamic-route: عرض لتوجيهات ديناميكية hi: مرحبا {name} aka: معروف أيضا تحت مسمى whats-your-name: ما إسمك؟ not-found: صفحة غير موجودة ================================================ FILE: locales/de.yml ================================================ button: about: Über back: Zurück go: Los home: Startseite toggle_dark: Dunkelmodus umschalten toggle_langs: Sprachen ändern intro: desc: Vite Startvorlage mit Vorlieben dynamic-route: Demo einer dynamischen Route hi: Hi, {name}! aka: Auch bekannt als whats-your-name: Wie heißt du? not-found: Nicht gefunden ================================================ FILE: locales/en.yml ================================================ button: about: About back: Back go: GO home: Home toggle_dark: Toggle dark mode toggle_langs: Change languages intro: desc: Opinionated Vite Starter Template dynamic-route: Demo of dynamic route hi: Hi, {name}! aka: Also known as whats-your-name: What's your name? not-found: Not found ================================================ FILE: locales/es.yml ================================================ button: about: Acerca de back: Atrás go: Ir home: Inicio toggle_dark: Alternar modo oscuro toggle_langs: Cambiar idiomas intro: desc: Plantilla de Inicio de Vite Dogmática dynamic-route: Demo de ruta dinámica hi: ¡Hola, {name}! aka: También conocido como whats-your-name: ¿Cómo te llamas? not-found: No se ha encontrado ================================================ FILE: locales/fr.yml ================================================ button: about: À propos back: Retour go: Essayer home: Accueil toggle_dark: Basculer en mode sombre toggle_langs: Changer de langue intro: desc: Exemple d'application Vite dynamic-route: Démo de route dynamique hi: Salut, {name}! aka: Aussi connu sous le nom de whats-your-name: Comment t'appelles-tu ? not-found: Page non trouvée ================================================ FILE: locales/id.yml ================================================ button: about: Tentang back: Kembali go: Pergi home: Beranda toggle_dark: Ubah ke mode gelap toggle_langs: Ubah bahasa intro: desc: Template awal vite dynamic-route: Contoh rute dinamik hi: Halo, {name}! aka: Juga diketahui sebagai whats-your-name: Siapa nama anda? not-found: Tidak ditemukan ================================================ FILE: locales/it.yml ================================================ button: about: Su di me back: Indietro go: Vai home: Home toggle_dark: Attiva/disattiva modalità scura toggle_langs: Cambia lingua intro: desc: Modello per una Applicazione Vite dynamic-route: Demo di rotta dinamica hi: Ciao, {name}! whats-your-name: Come ti chiami? not-found: Non trovato ================================================ FILE: locales/ja.yml ================================================ button: about: これは? back: 戻る go: 進む home: ホーム toggle_dark: ダークモード切り替え toggle_langs: 言語切り替え intro: desc: 固執された Vite スターターテンプレート dynamic-route: 動的ルートのデモ hi: こんにちは、{name}! whats-your-name: 君の名は。 not-found: 見つかりませんでした ================================================ FILE: locales/ka.yml ================================================ button: about: შესახებ back: უკან go: დაწყება home: მთავარი toggle_dark: გადართე მუქი რეჟიმი toggle_langs: ენის შეცვლა intro: desc: Opinionated Vite Starter Template dynamic-route: დინამიური როუტინგის დემო hi: გამარჯობა, {name}! aka: ასევე ცნობილი როგორც whats-your-name: რა გქვია? not-found: ვერ მოიძებნა ================================================ FILE: locales/ko.yml ================================================ button: about: 소개 back: 뒤로가기 go: 이동 home: 홈 toggle_dark: 다크모드 토글 toggle_langs: 언어 변경 intro: desc: Vite 애플리케이션 템플릿 dynamic-route: 다이나믹 라우트 데모 hi: 안녕, {name}! whats-your-name: 이름이 뭐예요? not-found: 찾을 수 없습니다 ================================================ FILE: locales/pl.yml ================================================ button: about: O nas back: Wróć go: WEJDŹ home: Strona główna toggle_dark: Ustaw tryb nocny toggle_langs: Zmień język intro: desc: Opiniowany szablon startowy Vite dynamic-route: Demonstracja dynamicznego route hi: Cześć, {name}! aka: Znany też jako whats-your-name: Jak masz na imię? not-found: Nie znaleziono ================================================ FILE: locales/pt-BR.yml ================================================ button: about: Sobre back: Voltar go: Ir home: Início toggle_dark: Alternar modo escuro toggle_langs: Mudar de idioma intro: desc: Modelo Opinativo de Partida de Vite dynamic-route: Demonstração de rota dinâmica hi: Olá, {name}! aka: Também conhecido como whats-your-name: Qual é o seu nome? not-found: Não encontrado ================================================ FILE: locales/ru.yml ================================================ button: about: О шаблоне back: Назад go: Перейти home: Главная toggle_dark: Включить темный режим toggle_langs: Сменить язык intro: desc: Самостоятельный начальный шаблон Vite dynamic-route: Демо динамического маршрута hi: Привет, {name}! whats-your-name: Как тебя зовут? not-found: Не найден ================================================ FILE: locales/tr.yml ================================================ button: about: Hakkımda back: Geri go: İLERİ home: Anasayfa toggle_dark: Karanlık modu değiştir toggle_langs: Dilleri değiştir intro: desc: Görüşlü Vite Başlangıç Şablonu dynamic-route: Dinamik rota demosu hi: Merhaba, {name}! aka: Ayrıca şöyle bilinir whats-your-name: Adınız nedir? not-found: Bulunamadı ================================================ FILE: locales/uk.yml ================================================ button: about: Про шаблон back: Назад go: Перейти home: Головна toggle_dark: Переключити темний режим toggle_langs: Змінити мову intro: desc: Самостійний початковий шаблон Vite dynamic-route: Демо динамічного маршруту hi: Привіт, {name}! whats-your-name: Як тебе звати? not-found: Не знайдено ================================================ FILE: locales/uz.yml ================================================ button: about: Haqida back: Orqaga go: Kettik home: Bosh sahifa toggle_dark: Qorong‘i rejimga o‘tish toggle_langs: Tilni o‘zgartirish intro: desc: O‘ylangan boshlang‘ich Vite shabloni dynamic-route: Dynamic route demo'si hi: Assalomu alaykum, {name}! aka: shuningdek whats-your-name: Ismingiz nima? not-found: Topilmadi ================================================ FILE: locales/vi.yml ================================================ button: about: Về back: Quay lại go: Đi home: Khởi đầu toggle_dark: Chuyển đổi chế độ tối toggle_langs: Thay đổi ngôn ngữ intro: desc: Ý kiến cá nhân Vite Template để bắt đầu dynamic-route: Bản giới thiệu về dynamic route hi: Hi, {name}! whats-your-name: Tên bạn là gì? not-found: Không tìm thấy ================================================ FILE: locales/zh-CN.yml ================================================ button: about: 关于 back: 返回 go: 确定 home: 首页 toggle_dark: 切换深色模式 toggle_langs: 切换语言 intro: desc: 固执己见的 Vite 项目模板 dynamic-route: 动态路由演示 hi: 你好,{name} aka: 也叫 whats-your-name: 输入你的名字 not-found: 未找到页面 ================================================ FILE: netlify.toml ================================================ [build] publish = "dist" command = "pnpm run build" [build.environment] NODE_VERSION = "22" [[redirects]] from = "/*" to = "/index.html" status = 200 [[headers]] for = "/manifest.webmanifest" [headers.values] Content-Type = "application/manifest+json" ================================================ FILE: package.json ================================================ { "type": "module", "private": true, "packageManager": "pnpm@10.30.2", "scripts": { "build": "vite-ssg build", "dev": "vite --port 3333 --open", "lint": "eslint .", "preview": "vite preview", "preview-https": "serve dist", "test": "vitest", "test:e2e": "cypress open", "test:unit": "vitest", "typecheck": "vue-tsc --noEmit", "up": "taze major -I", "postinstall": "npx simple-git-hooks", "sizecheck": "npx vite-bundle-visualizer" }, "dependencies": { "@unhead/vue": "catalog:frontend", "@unocss/reset": "catalog:frontend", "@vueuse/core": "catalog:frontend", "nprogress": "catalog:frontend", "pinia": "catalog:frontend", "vue": "catalog:frontend", "vue-i18n": "catalog:frontend", "vue-router": "catalog:frontend" }, "devDependencies": { "@antfu/eslint-config": "catalog:dev", "@iconify-json/carbon": "catalog:dev", "@intlify/unplugin-vue-i18n": "catalog:build", "@shikijs/markdown-it": "catalog:build", "@types/markdown-it-link-attributes": "catalog:types", "@types/nprogress": "catalog:types", "@unocss/eslint-config": "catalog:build", "@vitejs/plugin-vue": "catalog:build", "@vue-macros/volar": "catalog:dev", "@vue/test-utils": "catalog:dev", "beasties": "catalog:build", "cypress": "catalog:dev", "cypress-vite": "catalog:dev", "eslint": "catalog:dev", "eslint-plugin-cypress": "catalog:dev", "eslint-plugin-format": "catalog:dev", "https-localhost": "catalog:dev", "lint-staged": "catalog:dev", "markdown-it-link-attributes": "catalog:build", "rollup": "catalog:build", "shiki": "catalog:build", "simple-git-hooks": "catalog:dev", "taze": "catalog:dev", "typescript": "catalog:dev", "unocss": "catalog:build", "unplugin-auto-import": "catalog:build", "unplugin-vue-components": "catalog:build", "unplugin-vue-macros": "catalog:build", "unplugin-vue-markdown": "catalog:build", "vite": "catalog:build", "vite-bundle-visualizer": "catalog:build", "vite-plugin-inspect": "catalog:build", "vite-plugin-pwa": "catalog:build", "vite-plugin-vue-devtools": "catalog:build", "vite-plugin-vue-layouts": "catalog:build", "vite-ssg": "catalog:build", "vite-ssg-sitemap": "catalog:build", "vitest": "catalog:dev", "vue-tsc": "catalog:dev" }, "resolutions": { "unplugin": "catalog:build", "vite": "catalog:build", "vite-plugin-inspect": "catalog:build" }, "simple-git-hooks": { "pre-commit": "pnpm lint-staged" }, "lint-staged": { "*": "eslint --fix" } } ================================================ FILE: pnpm-workspace.yaml ================================================ shellEmulator: true trustPolicy: no-downgrade packages: [] catalogs: build: '@intlify/unplugin-vue-i18n': ^11.0.7 '@shikijs/markdown-it': ^3.23.0 '@unocss/eslint-config': ^66.6.1 '@vitejs/plugin-vue': ^6.0.4 beasties: ^0.4.1 markdown-it-link-attributes: ^4.0.1 rollup: ^4.59.0 shiki: ^3.23.0 unocss: ^66.6.1 unplugin: ^2.3.11 unplugin-auto-import: ^21.0.0 unplugin-vue-components: ^31.0.0 unplugin-vue-macros: ^2.14.5 unplugin-vue-markdown: ^29.2.0 vite: ^7.3.1 vite-bundle-visualizer: ^1.2.1 vite-plugin-inspect: ^11.3.3 vite-plugin-pwa: ^1.2.0 vite-plugin-vue-devtools: ^8.0.6 vite-plugin-vue-layouts: ^0.11.0 vite-ssg: ^28.3.0 vite-ssg-sitemap: ^0.10.0 dev: '@antfu/eslint-config': ^7.6.1 '@iconify-json/carbon': ^1.2.18 '@vue-macros/volar': ^3.1.2 '@vue/test-utils': ^2.4.6 cypress: ^15.10.0 cypress-vite: ^1.8.0 eslint: ^10.0.2 eslint-plugin-cypress: ^6.1.0 eslint-plugin-format: ^2.0.1 https-localhost: ^4.7.1 lint-staged: ^16.2.7 simple-git-hooks: ^2.13.1 taze: ^19.9.2 typescript: ^5.8.2 vitest: ^4.0.18 vue-tsc: ^3.2.5 frontend: '@unhead/vue': ^2.1.7 '@unocss/reset': ^66.6.1 '@vueuse/core': ^14.2.1 nprogress: ^0.2.0 pinia: ^3.0.4 vue: ^3.5.29 vue-i18n: ^11.2.8 vue-router: ^5.0.3 types: '@types/markdown-it-link-attributes': ^3.0.5 '@types/nprogress': ^0.2.3 onlyBuiltDependencies: - cypress - esbuild - simple-git-hooks ================================================ FILE: public/_headers ================================================ /assets/* cache-control: max-age=31536000 cache-control: immutable ================================================ FILE: src/App.vue ================================================ ================================================ FILE: src/auto-imports.d.ts ================================================ /* eslint-disable */ /* prettier-ignore */ // @ts-nocheck // noinspection JSUnusedGlobalSymbols // Generated by unplugin-auto-import // biome-ignore lint: disable export {} declare global { const EffectScope: typeof import('vue').EffectScope const asyncComputed: typeof import('@vueuse/core').asyncComputed const autoResetRef: typeof import('@vueuse/core').autoResetRef const computed: typeof import('vue').computed const computedAsync: typeof import('@vueuse/core').computedAsync const computedEager: typeof import('@vueuse/core').computedEager const computedInject: typeof import('@vueuse/core').computedInject const computedWithControl: typeof import('@vueuse/core').computedWithControl const controlledComputed: typeof import('@vueuse/core').controlledComputed const controlledRef: typeof import('@vueuse/core').controlledRef const createApp: typeof import('vue').createApp const createEventHook: typeof import('@vueuse/core').createEventHook const createGlobalState: typeof import('@vueuse/core').createGlobalState const createInjectionState: typeof import('@vueuse/core').createInjectionState const createReactiveFn: typeof import('@vueuse/core').createReactiveFn const createRef: typeof import('@vueuse/core').createRef const createReusableTemplate: typeof import('@vueuse/core').createReusableTemplate const createSharedComposable: typeof import('@vueuse/core').createSharedComposable const createTemplatePromise: typeof import('@vueuse/core').createTemplatePromise const createUnrefFn: typeof import('@vueuse/core').createUnrefFn const customRef: typeof import('vue').customRef const debouncedRef: typeof import('@vueuse/core').debouncedRef const debouncedWatch: typeof import('@vueuse/core').debouncedWatch const defineAsyncComponent: typeof import('vue').defineAsyncComponent const defineComponent: typeof import('vue').defineComponent const definePage: typeof import('vue-router/experimental').definePage const eagerComputed: typeof import('@vueuse/core').eagerComputed const effectScope: typeof import('vue').effectScope const extendRef: typeof import('@vueuse/core').extendRef const getCurrentInstance: typeof import('vue').getCurrentInstance const getCurrentScope: typeof import('vue').getCurrentScope const getCurrentWatcher: typeof import('vue').getCurrentWatcher const h: typeof import('vue').h const ignorableWatch: typeof import('@vueuse/core').ignorableWatch const inject: typeof import('vue').inject const injectHead: typeof import('@unhead/vue').injectHead const injectLocal: typeof import('@vueuse/core').injectLocal const isDark: typeof import('./composables/dark').isDark const isDefined: typeof import('@vueuse/core').isDefined const isProxy: typeof import('vue').isProxy const isReactive: typeof import('vue').isReactive const isReadonly: typeof import('vue').isReadonly const isRef: typeof import('vue').isRef const isShallow: typeof import('vue').isShallow const makeDestructurable: typeof import('@vueuse/core').makeDestructurable const markRaw: typeof import('vue').markRaw const nextTick: typeof import('vue').nextTick const onActivated: typeof import('vue').onActivated const onBeforeMount: typeof import('vue').onBeforeMount const onBeforeRouteLeave: typeof import('vue-router').onBeforeRouteLeave const onBeforeRouteUpdate: typeof import('vue-router').onBeforeRouteUpdate const onBeforeUnmount: typeof import('vue').onBeforeUnmount const onBeforeUpdate: typeof import('vue').onBeforeUpdate const onClickOutside: typeof import('@vueuse/core').onClickOutside const onDeactivated: typeof import('vue').onDeactivated const onElementRemoval: typeof import('@vueuse/core').onElementRemoval const onErrorCaptured: typeof import('vue').onErrorCaptured const onKeyStroke: typeof import('@vueuse/core').onKeyStroke const onLongPress: typeof import('@vueuse/core').onLongPress const onMounted: typeof import('vue').onMounted const onRenderTracked: typeof import('vue').onRenderTracked const onRenderTriggered: typeof import('vue').onRenderTriggered const onScopeDispose: typeof import('vue').onScopeDispose const onServerPrefetch: typeof import('vue').onServerPrefetch const onStartTyping: typeof import('@vueuse/core').onStartTyping const onUnmounted: typeof import('vue').onUnmounted const onUpdated: typeof import('vue').onUpdated const onWatcherCleanup: typeof import('vue').onWatcherCleanup const pausableWatch: typeof import('@vueuse/core').pausableWatch const preferredDark: typeof import('./composables/dark').preferredDark const provide: typeof import('vue').provide const provideLocal: typeof import('@vueuse/core').provideLocal const reactify: typeof import('@vueuse/core').reactify const reactifyObject: typeof import('@vueuse/core').reactifyObject const reactive: typeof import('vue').reactive const reactiveComputed: typeof import('@vueuse/core').reactiveComputed const reactiveOmit: typeof import('@vueuse/core').reactiveOmit const reactivePick: typeof import('@vueuse/core').reactivePick const readonly: typeof import('vue').readonly const ref: typeof import('vue').ref const refAutoReset: typeof import('@vueuse/core').refAutoReset const refDebounced: typeof import('@vueuse/core').refDebounced const refDefault: typeof import('@vueuse/core').refDefault const refManualReset: typeof import('@vueuse/core').refManualReset const refThrottled: typeof import('@vueuse/core').refThrottled const refWithControl: typeof import('@vueuse/core').refWithControl const resolveComponent: typeof import('vue').resolveComponent const resolveRef: typeof import('@vueuse/core').resolveRef const resolveUnref: typeof import('@vueuse/core')['resolveUnref'] const shallowReactive: typeof import('vue').shallowReactive const shallowReadonly: typeof import('vue').shallowReadonly const shallowRef: typeof import('vue').shallowRef const syncRef: typeof import('@vueuse/core').syncRef const syncRefs: typeof import('@vueuse/core').syncRefs const templateRef: typeof import('@vueuse/core').templateRef const throttledRef: typeof import('@vueuse/core').throttledRef const throttledWatch: typeof import('@vueuse/core').throttledWatch const toRaw: typeof import('vue').toRaw const toReactive: typeof import('@vueuse/core').toReactive const toRef: typeof import('vue').toRef const toRefs: typeof import('vue').toRefs const toValue: typeof import('vue').toValue const toggleDark: typeof import('./composables/dark').toggleDark const triggerRef: typeof import('vue').triggerRef const tryOnBeforeMount: typeof import('@vueuse/core').tryOnBeforeMount const tryOnBeforeUnmount: typeof import('@vueuse/core').tryOnBeforeUnmount const tryOnMounted: typeof import('@vueuse/core').tryOnMounted const tryOnScopeDispose: typeof import('@vueuse/core').tryOnScopeDispose const tryOnUnmounted: typeof import('@vueuse/core').tryOnUnmounted const unref: typeof import('vue').unref const unrefElement: typeof import('@vueuse/core').unrefElement const until: typeof import('@vueuse/core').until const useActiveElement: typeof import('@vueuse/core').useActiveElement const useAnimate: typeof import('@vueuse/core').useAnimate const useArrayDifference: typeof import('@vueuse/core').useArrayDifference const useArrayEvery: typeof import('@vueuse/core').useArrayEvery const useArrayFilter: typeof import('@vueuse/core').useArrayFilter const useArrayFind: typeof import('@vueuse/core').useArrayFind const useArrayFindIndex: typeof import('@vueuse/core').useArrayFindIndex const useArrayFindLast: typeof import('@vueuse/core').useArrayFindLast const useArrayIncludes: typeof import('@vueuse/core').useArrayIncludes const useArrayJoin: typeof import('@vueuse/core').useArrayJoin const useArrayMap: typeof import('@vueuse/core').useArrayMap const useArrayReduce: typeof import('@vueuse/core').useArrayReduce const useArraySome: typeof import('@vueuse/core').useArraySome const useArrayUnique: typeof import('@vueuse/core').useArrayUnique const useAsyncQueue: typeof import('@vueuse/core').useAsyncQueue const useAsyncState: typeof import('@vueuse/core').useAsyncState const useAttrs: typeof import('vue').useAttrs const useBase64: typeof import('@vueuse/core').useBase64 const useBattery: typeof import('@vueuse/core').useBattery const useBluetooth: typeof import('@vueuse/core').useBluetooth const useBreakpoints: typeof import('@vueuse/core').useBreakpoints const useBroadcastChannel: typeof import('@vueuse/core').useBroadcastChannel const useBrowserLocation: typeof import('@vueuse/core').useBrowserLocation const useCached: typeof import('@vueuse/core').useCached const useClipboard: typeof import('@vueuse/core').useClipboard const useClipboardItems: typeof import('@vueuse/core').useClipboardItems const useCloned: typeof import('@vueuse/core').useCloned const useColorMode: typeof import('@vueuse/core').useColorMode const useConfirmDialog: typeof import('@vueuse/core').useConfirmDialog const useCountdown: typeof import('@vueuse/core').useCountdown const useCounter: typeof import('@vueuse/core').useCounter const useCssModule: typeof import('vue').useCssModule const useCssSupports: typeof import('@vueuse/core').useCssSupports const useCssVar: typeof import('@vueuse/core').useCssVar const useCssVars: typeof import('vue').useCssVars const useCurrentElement: typeof import('@vueuse/core').useCurrentElement const useCycleList: typeof import('@vueuse/core').useCycleList const useDark: typeof import('@vueuse/core').useDark const useDateFormat: typeof import('@vueuse/core').useDateFormat const useDebounce: typeof import('@vueuse/core').useDebounce const useDebounceFn: typeof import('@vueuse/core').useDebounceFn const useDebouncedRefHistory: typeof import('@vueuse/core').useDebouncedRefHistory const useDeviceMotion: typeof import('@vueuse/core').useDeviceMotion const useDeviceOrientation: typeof import('@vueuse/core').useDeviceOrientation const useDevicePixelRatio: typeof import('@vueuse/core').useDevicePixelRatio const useDevicesList: typeof import('@vueuse/core').useDevicesList const useDisplayMedia: typeof import('@vueuse/core').useDisplayMedia const useDocumentVisibility: typeof import('@vueuse/core').useDocumentVisibility const useDraggable: typeof import('@vueuse/core').useDraggable const useDropZone: typeof import('@vueuse/core').useDropZone const useElementBounding: typeof import('@vueuse/core').useElementBounding const useElementByPoint: typeof import('@vueuse/core').useElementByPoint const useElementHover: typeof import('@vueuse/core').useElementHover const useElementSize: typeof import('@vueuse/core').useElementSize const useElementVisibility: typeof import('@vueuse/core').useElementVisibility const useEventBus: typeof import('@vueuse/core').useEventBus const useEventListener: typeof import('@vueuse/core').useEventListener const useEventSource: typeof import('@vueuse/core').useEventSource const useEyeDropper: typeof import('@vueuse/core').useEyeDropper const useFavicon: typeof import('@vueuse/core').useFavicon const useFetch: typeof import('@vueuse/core').useFetch const useFileDialog: typeof import('@vueuse/core').useFileDialog const useFileSystemAccess: typeof import('@vueuse/core').useFileSystemAccess const useFocus: typeof import('@vueuse/core').useFocus const useFocusWithin: typeof import('@vueuse/core').useFocusWithin const useFps: typeof import('@vueuse/core').useFps const useFullscreen: typeof import('@vueuse/core').useFullscreen const useGamepad: typeof import('@vueuse/core').useGamepad const useGeolocation: typeof import('@vueuse/core').useGeolocation const useHead: typeof import('@unhead/vue').useHead const useHeadSafe: typeof import('@unhead/vue').useHeadSafe const useI18n: typeof import('vue-i18n').useI18n const useId: typeof import('vue').useId const useIdle: typeof import('@vueuse/core').useIdle const useImage: typeof import('@vueuse/core').useImage const useInfiniteScroll: typeof import('@vueuse/core').useInfiniteScroll const useIntersectionObserver: typeof import('@vueuse/core').useIntersectionObserver const useInterval: typeof import('@vueuse/core').useInterval const useIntervalFn: typeof import('@vueuse/core').useIntervalFn const useKeyModifier: typeof import('@vueuse/core').useKeyModifier const useLastChanged: typeof import('@vueuse/core').useLastChanged const useLink: typeof import('vue-router/auto').useLink const useLocalStorage: typeof import('@vueuse/core').useLocalStorage const useMagicKeys: typeof import('@vueuse/core').useMagicKeys const useManualRefHistory: typeof import('@vueuse/core').useManualRefHistory const useMediaControls: typeof import('@vueuse/core').useMediaControls const useMediaQuery: typeof import('@vueuse/core').useMediaQuery const useMemoize: typeof import('@vueuse/core').useMemoize const useMemory: typeof import('@vueuse/core').useMemory const useModel: typeof import('vue').useModel const useMounted: typeof import('@vueuse/core').useMounted const useMouse: typeof import('@vueuse/core').useMouse const useMouseInElement: typeof import('@vueuse/core').useMouseInElement const useMousePressed: typeof import('@vueuse/core').useMousePressed const useMutationObserver: typeof import('@vueuse/core').useMutationObserver const useNavigatorLanguage: typeof import('@vueuse/core').useNavigatorLanguage const useNetwork: typeof import('@vueuse/core').useNetwork const useNow: typeof import('@vueuse/core').useNow const useObjectUrl: typeof import('@vueuse/core').useObjectUrl const useOffsetPagination: typeof import('@vueuse/core').useOffsetPagination const useOnline: typeof import('@vueuse/core').useOnline const usePageLeave: typeof import('@vueuse/core').usePageLeave const useParallax: typeof import('@vueuse/core').useParallax const useParentElement: typeof import('@vueuse/core').useParentElement const usePerformanceObserver: typeof import('@vueuse/core').usePerformanceObserver const usePermission: typeof import('@vueuse/core').usePermission const usePointer: typeof import('@vueuse/core').usePointer const usePointerLock: typeof import('@vueuse/core').usePointerLock const usePointerSwipe: typeof import('@vueuse/core').usePointerSwipe const usePreferredColorScheme: typeof import('@vueuse/core').usePreferredColorScheme const usePreferredContrast: typeof import('@vueuse/core').usePreferredContrast const usePreferredDark: typeof import('@vueuse/core').usePreferredDark const usePreferredLanguages: typeof import('@vueuse/core').usePreferredLanguages const usePreferredReducedMotion: typeof import('@vueuse/core').usePreferredReducedMotion const usePreferredReducedTransparency: typeof import('@vueuse/core').usePreferredReducedTransparency const usePrevious: typeof import('@vueuse/core').usePrevious const useRafFn: typeof import('@vueuse/core').useRafFn const useRefHistory: typeof import('@vueuse/core').useRefHistory const useResizeObserver: typeof import('@vueuse/core').useResizeObserver const useRoute: typeof import('vue-router').useRoute const useRouter: typeof import('vue-router').useRouter const useSSRWidth: typeof import('@vueuse/core').useSSRWidth const useScreenOrientation: typeof import('@vueuse/core').useScreenOrientation const useScreenSafeArea: typeof import('@vueuse/core').useScreenSafeArea const useScriptTag: typeof import('@vueuse/core').useScriptTag const useScroll: typeof import('@vueuse/core').useScroll const useScrollLock: typeof import('@vueuse/core').useScrollLock const useSeoMeta: typeof import('@unhead/vue').useSeoMeta const useServerHead: typeof import('@unhead/vue').useServerHead const useServerHeadSafe: typeof import('@unhead/vue').useServerHeadSafe const useServerSeoMeta: typeof import('@unhead/vue').useServerSeoMeta const useSessionStorage: typeof import('@vueuse/core').useSessionStorage const useShare: typeof import('@vueuse/core').useShare const useSlots: typeof import('vue').useSlots const useSorted: typeof import('@vueuse/core').useSorted const useSpeechRecognition: typeof import('@vueuse/core').useSpeechRecognition const useSpeechSynthesis: typeof import('@vueuse/core').useSpeechSynthesis const useStepper: typeof import('@vueuse/core').useStepper const useStorage: typeof import('@vueuse/core').useStorage const useStorageAsync: typeof import('@vueuse/core').useStorageAsync const useStyleTag: typeof import('@vueuse/core').useStyleTag const useSupported: typeof import('@vueuse/core').useSupported const useSwipe: typeof import('@vueuse/core').useSwipe const useTemplateRef: typeof import('vue').useTemplateRef const useTemplateRefsList: typeof import('@vueuse/core').useTemplateRefsList const useTextDirection: typeof import('@vueuse/core').useTextDirection const useTextSelection: typeof import('@vueuse/core').useTextSelection const useTextareaAutosize: typeof import('@vueuse/core').useTextareaAutosize const useThrottle: typeof import('@vueuse/core').useThrottle const useThrottleFn: typeof import('@vueuse/core').useThrottleFn const useThrottledRefHistory: typeof import('@vueuse/core').useThrottledRefHistory const useTimeAgo: typeof import('@vueuse/core').useTimeAgo const useTimeAgoIntl: typeof import('@vueuse/core').useTimeAgoIntl const useTimeout: typeof import('@vueuse/core').useTimeout const useTimeoutFn: typeof import('@vueuse/core').useTimeoutFn const useTimeoutPoll: typeof import('@vueuse/core').useTimeoutPoll const useTimestamp: typeof import('@vueuse/core').useTimestamp const useTitle: typeof import('@vueuse/core').useTitle const useToNumber: typeof import('@vueuse/core').useToNumber const useToString: typeof import('@vueuse/core').useToString const useToggle: typeof import('@vueuse/core').useToggle const useTransition: typeof import('@vueuse/core').useTransition const useUrlSearchParams: typeof import('@vueuse/core').useUrlSearchParams const useUserMedia: typeof import('@vueuse/core').useUserMedia const useUserStore: typeof import('./stores/user').useUserStore const useVModel: typeof import('@vueuse/core').useVModel const useVModels: typeof import('@vueuse/core').useVModels const useVibrate: typeof import('@vueuse/core').useVibrate const useVirtualList: typeof import('@vueuse/core').useVirtualList const useWakeLock: typeof import('@vueuse/core').useWakeLock const useWebNotification: typeof import('@vueuse/core').useWebNotification const useWebSocket: typeof import('@vueuse/core').useWebSocket const useWebWorker: typeof import('@vueuse/core').useWebWorker const useWebWorkerFn: typeof import('@vueuse/core').useWebWorkerFn const useWindowFocus: typeof import('@vueuse/core').useWindowFocus const useWindowScroll: typeof import('@vueuse/core').useWindowScroll const useWindowSize: typeof import('@vueuse/core').useWindowSize const watch: typeof import('vue').watch const watchArray: typeof import('@vueuse/core').watchArray const watchAtMost: typeof import('@vueuse/core').watchAtMost const watchDebounced: typeof import('@vueuse/core').watchDebounced const watchDeep: typeof import('@vueuse/core').watchDeep const watchEffect: typeof import('vue').watchEffect const watchIgnorable: typeof import('@vueuse/core').watchIgnorable const watchImmediate: typeof import('@vueuse/core').watchImmediate const watchOnce: typeof import('@vueuse/core').watchOnce const watchPausable: typeof import('@vueuse/core').watchPausable const watchPostEffect: typeof import('vue').watchPostEffect const watchSyncEffect: typeof import('vue').watchSyncEffect const watchThrottled: typeof import('@vueuse/core').watchThrottled const watchTriggerable: typeof import('@vueuse/core').watchTriggerable const watchWithFilter: typeof import('@vueuse/core').watchWithFilter const whenever: typeof import('@vueuse/core').whenever } // for type re-export declare global { // @ts-ignore export type { Component, Slot, Slots, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, ShallowRef, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue' import('vue') } // for vue template auto import import { UnwrapRef } from 'vue' declare module 'vue' { interface GlobalComponents {} interface ComponentCustomProperties { readonly EffectScope: UnwrapRef readonly asyncComputed: UnwrapRef readonly autoResetRef: UnwrapRef readonly computed: UnwrapRef readonly computedAsync: UnwrapRef readonly computedEager: UnwrapRef readonly computedInject: UnwrapRef readonly computedWithControl: UnwrapRef readonly controlledComputed: UnwrapRef readonly controlledRef: UnwrapRef readonly createApp: UnwrapRef readonly createEventHook: UnwrapRef readonly createGlobalState: UnwrapRef readonly createInjectionState: UnwrapRef readonly createReactiveFn: UnwrapRef readonly createRef: UnwrapRef readonly createReusableTemplate: UnwrapRef readonly createSharedComposable: UnwrapRef readonly createTemplatePromise: UnwrapRef readonly createUnrefFn: UnwrapRef readonly customRef: UnwrapRef readonly debouncedRef: UnwrapRef readonly debouncedWatch: UnwrapRef readonly defineAsyncComponent: UnwrapRef readonly defineComponent: UnwrapRef readonly definePage: UnwrapRef readonly eagerComputed: UnwrapRef readonly effectScope: UnwrapRef readonly extendRef: UnwrapRef readonly getCurrentInstance: UnwrapRef readonly getCurrentScope: UnwrapRef readonly getCurrentWatcher: UnwrapRef readonly h: UnwrapRef readonly ignorableWatch: UnwrapRef readonly inject: UnwrapRef readonly injectHead: UnwrapRef readonly injectLocal: UnwrapRef readonly isDark: UnwrapRef readonly isDefined: UnwrapRef readonly isProxy: UnwrapRef readonly isReactive: UnwrapRef readonly isReadonly: UnwrapRef readonly isRef: UnwrapRef readonly isShallow: UnwrapRef readonly makeDestructurable: UnwrapRef readonly markRaw: UnwrapRef readonly nextTick: UnwrapRef readonly onActivated: UnwrapRef readonly onBeforeMount: UnwrapRef readonly onBeforeRouteLeave: UnwrapRef readonly onBeforeRouteUpdate: UnwrapRef readonly onBeforeUnmount: UnwrapRef readonly onBeforeUpdate: UnwrapRef readonly onClickOutside: UnwrapRef readonly onDeactivated: UnwrapRef readonly onElementRemoval: UnwrapRef readonly onErrorCaptured: UnwrapRef readonly onKeyStroke: UnwrapRef readonly onLongPress: UnwrapRef readonly onMounted: UnwrapRef readonly onRenderTracked: UnwrapRef readonly onRenderTriggered: UnwrapRef readonly onScopeDispose: UnwrapRef readonly onServerPrefetch: UnwrapRef readonly onStartTyping: UnwrapRef readonly onUnmounted: UnwrapRef readonly onUpdated: UnwrapRef readonly onWatcherCleanup: UnwrapRef readonly pausableWatch: UnwrapRef readonly preferredDark: UnwrapRef readonly provide: UnwrapRef readonly provideLocal: UnwrapRef readonly reactify: UnwrapRef readonly reactifyObject: UnwrapRef readonly reactive: UnwrapRef readonly reactiveComputed: UnwrapRef readonly reactiveOmit: UnwrapRef readonly reactivePick: UnwrapRef readonly readonly: UnwrapRef readonly ref: UnwrapRef readonly refAutoReset: UnwrapRef readonly refDebounced: UnwrapRef readonly refDefault: UnwrapRef readonly refManualReset: UnwrapRef readonly refThrottled: UnwrapRef readonly refWithControl: UnwrapRef readonly resolveComponent: UnwrapRef readonly resolveRef: UnwrapRef readonly shallowReactive: UnwrapRef readonly shallowReadonly: UnwrapRef readonly shallowRef: UnwrapRef readonly syncRef: UnwrapRef readonly syncRefs: UnwrapRef readonly templateRef: UnwrapRef readonly throttledRef: UnwrapRef readonly throttledWatch: UnwrapRef readonly toRaw: UnwrapRef readonly toReactive: UnwrapRef readonly toRef: UnwrapRef readonly toRefs: UnwrapRef readonly toValue: UnwrapRef readonly toggleDark: UnwrapRef readonly triggerRef: UnwrapRef readonly tryOnBeforeMount: UnwrapRef readonly tryOnBeforeUnmount: UnwrapRef readonly tryOnMounted: UnwrapRef readonly tryOnScopeDispose: UnwrapRef readonly tryOnUnmounted: UnwrapRef readonly unref: UnwrapRef readonly unrefElement: UnwrapRef readonly until: UnwrapRef readonly useActiveElement: UnwrapRef readonly useAnimate: UnwrapRef readonly useArrayDifference: UnwrapRef readonly useArrayEvery: UnwrapRef readonly useArrayFilter: UnwrapRef readonly useArrayFind: UnwrapRef readonly useArrayFindIndex: UnwrapRef readonly useArrayFindLast: UnwrapRef readonly useArrayIncludes: UnwrapRef readonly useArrayJoin: UnwrapRef readonly useArrayMap: UnwrapRef readonly useArrayReduce: UnwrapRef readonly useArraySome: UnwrapRef readonly useArrayUnique: UnwrapRef readonly useAsyncQueue: UnwrapRef readonly useAsyncState: UnwrapRef readonly useAttrs: UnwrapRef readonly useBase64: UnwrapRef readonly useBattery: UnwrapRef readonly useBluetooth: UnwrapRef readonly useBreakpoints: UnwrapRef readonly useBroadcastChannel: UnwrapRef readonly useBrowserLocation: UnwrapRef readonly useCached: UnwrapRef readonly useClipboard: UnwrapRef readonly useClipboardItems: UnwrapRef readonly useCloned: UnwrapRef readonly useColorMode: UnwrapRef readonly useConfirmDialog: UnwrapRef readonly useCountdown: UnwrapRef readonly useCounter: UnwrapRef readonly useCssModule: UnwrapRef readonly useCssSupports: UnwrapRef readonly useCssVar: UnwrapRef readonly useCssVars: UnwrapRef readonly useCurrentElement: UnwrapRef readonly useCycleList: UnwrapRef readonly useDark: UnwrapRef readonly useDateFormat: UnwrapRef readonly useDebounce: UnwrapRef readonly useDebounceFn: UnwrapRef readonly useDebouncedRefHistory: UnwrapRef readonly useDeviceMotion: UnwrapRef readonly useDeviceOrientation: UnwrapRef readonly useDevicePixelRatio: UnwrapRef readonly useDevicesList: UnwrapRef readonly useDisplayMedia: UnwrapRef readonly useDocumentVisibility: UnwrapRef readonly useDraggable: UnwrapRef readonly useDropZone: UnwrapRef readonly useElementBounding: UnwrapRef readonly useElementByPoint: UnwrapRef readonly useElementHover: UnwrapRef readonly useElementSize: UnwrapRef readonly useElementVisibility: UnwrapRef readonly useEventBus: UnwrapRef readonly useEventListener: UnwrapRef readonly useEventSource: UnwrapRef readonly useEyeDropper: UnwrapRef readonly useFavicon: UnwrapRef readonly useFetch: UnwrapRef readonly useFileDialog: UnwrapRef readonly useFileSystemAccess: UnwrapRef readonly useFocus: UnwrapRef readonly useFocusWithin: UnwrapRef readonly useFps: UnwrapRef readonly useFullscreen: UnwrapRef readonly useGamepad: UnwrapRef readonly useGeolocation: UnwrapRef readonly useHead: UnwrapRef readonly useHeadSafe: UnwrapRef readonly useI18n: UnwrapRef readonly useId: UnwrapRef readonly useIdle: UnwrapRef readonly useImage: UnwrapRef readonly useInfiniteScroll: UnwrapRef readonly useIntersectionObserver: UnwrapRef readonly useInterval: UnwrapRef readonly useIntervalFn: UnwrapRef readonly useKeyModifier: UnwrapRef readonly useLastChanged: UnwrapRef readonly useLink: UnwrapRef readonly useLocalStorage: UnwrapRef readonly useMagicKeys: UnwrapRef readonly useManualRefHistory: UnwrapRef readonly useMediaControls: UnwrapRef readonly useMediaQuery: UnwrapRef readonly useMemoize: UnwrapRef readonly useMemory: UnwrapRef readonly useModel: UnwrapRef readonly useMounted: UnwrapRef readonly useMouse: UnwrapRef readonly useMouseInElement: UnwrapRef readonly useMousePressed: UnwrapRef readonly useMutationObserver: UnwrapRef readonly useNavigatorLanguage: UnwrapRef readonly useNetwork: UnwrapRef readonly useNow: UnwrapRef readonly useObjectUrl: UnwrapRef readonly useOffsetPagination: UnwrapRef readonly useOnline: UnwrapRef readonly usePageLeave: UnwrapRef readonly useParallax: UnwrapRef readonly useParentElement: UnwrapRef readonly usePerformanceObserver: UnwrapRef readonly usePermission: UnwrapRef readonly usePointer: UnwrapRef readonly usePointerLock: UnwrapRef readonly usePointerSwipe: UnwrapRef readonly usePreferredColorScheme: UnwrapRef readonly usePreferredContrast: UnwrapRef readonly usePreferredDark: UnwrapRef readonly usePreferredLanguages: UnwrapRef readonly usePreferredReducedMotion: UnwrapRef readonly usePreferredReducedTransparency: UnwrapRef readonly usePrevious: UnwrapRef readonly useRafFn: UnwrapRef readonly useRefHistory: UnwrapRef readonly useResizeObserver: UnwrapRef readonly useRoute: UnwrapRef readonly useRouter: UnwrapRef readonly useSSRWidth: UnwrapRef readonly useScreenOrientation: UnwrapRef readonly useScreenSafeArea: UnwrapRef readonly useScriptTag: UnwrapRef readonly useScroll: UnwrapRef readonly useScrollLock: UnwrapRef readonly useSeoMeta: UnwrapRef readonly useServerHead: UnwrapRef readonly useServerHeadSafe: UnwrapRef readonly useServerSeoMeta: UnwrapRef readonly useSessionStorage: UnwrapRef readonly useShare: UnwrapRef readonly useSlots: UnwrapRef readonly useSorted: UnwrapRef readonly useSpeechRecognition: UnwrapRef readonly useSpeechSynthesis: UnwrapRef readonly useStepper: UnwrapRef readonly useStorage: UnwrapRef readonly useStorageAsync: UnwrapRef readonly useStyleTag: UnwrapRef readonly useSupported: UnwrapRef readonly useSwipe: UnwrapRef readonly useTemplateRef: UnwrapRef readonly useTemplateRefsList: UnwrapRef readonly useTextDirection: UnwrapRef readonly useTextSelection: UnwrapRef readonly useTextareaAutosize: UnwrapRef readonly useThrottle: UnwrapRef readonly useThrottleFn: UnwrapRef readonly useThrottledRefHistory: UnwrapRef readonly useTimeAgo: UnwrapRef readonly useTimeAgoIntl: UnwrapRef readonly useTimeout: UnwrapRef readonly useTimeoutFn: UnwrapRef readonly useTimeoutPoll: UnwrapRef readonly useTimestamp: UnwrapRef readonly useTitle: UnwrapRef readonly useToNumber: UnwrapRef readonly useToString: UnwrapRef readonly useToggle: UnwrapRef readonly useTransition: UnwrapRef readonly useUrlSearchParams: UnwrapRef readonly useUserMedia: UnwrapRef readonly useUserStore: UnwrapRef readonly useVModel: UnwrapRef readonly useVModels: UnwrapRef readonly useVibrate: UnwrapRef readonly useVirtualList: UnwrapRef readonly useWakeLock: UnwrapRef readonly useWebNotification: UnwrapRef readonly useWebSocket: UnwrapRef readonly useWebWorker: UnwrapRef readonly useWebWorkerFn: UnwrapRef readonly useWindowFocus: UnwrapRef readonly useWindowScroll: UnwrapRef readonly useWindowSize: UnwrapRef readonly watch: UnwrapRef readonly watchArray: UnwrapRef readonly watchAtMost: UnwrapRef readonly watchDebounced: UnwrapRef readonly watchDeep: UnwrapRef readonly watchEffect: UnwrapRef readonly watchIgnorable: UnwrapRef readonly watchImmediate: UnwrapRef readonly watchOnce: UnwrapRef readonly watchPausable: UnwrapRef readonly watchPostEffect: UnwrapRef readonly watchSyncEffect: UnwrapRef readonly watchThrottled: UnwrapRef readonly watchTriggerable: UnwrapRef readonly watchWithFilter: UnwrapRef readonly whenever: UnwrapRef } } ================================================ FILE: src/components/README.md ================================================ ## Components Components in this dir will be auto-registered and on-demand, powered by [`unplugin-vue-components`](https://github.com/antfu/unplugin-vue-components). ### Icons You can use icons from almost any icon sets by the power of [Iconify](https://iconify.design/). It will only bundle the icons you use. Check out [`unplugin-icons`](https://github.com/antfu/unplugin-icons) for more details. ================================================ FILE: src/components/TheCounter.vue ================================================ ================================================ FILE: src/components/TheFooter.vue ================================================ ================================================ FILE: src/components/TheInput.vue ================================================ ================================================ FILE: src/components.d.ts ================================================ /* eslint-disable */ // @ts-nocheck // biome-ignore lint: disable // oxlint-disable // ------ // Generated by unplugin-vue-components // Read more: https://github.com/vuejs/core/pull/3399 export {} /* prettier-ignore */ declare module 'vue' { export interface GlobalComponents { README: typeof import('./components/README.md')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] TheCounter: typeof import('./components/TheCounter.vue')['default'] TheFooter: typeof import('./components/TheFooter.vue')['default'] TheInput: typeof import('./components/TheInput.vue')['default'] } } ================================================ FILE: src/composables/dark.ts ================================================ // these APIs are auto-imported from @vueuse/core export const isDark = useDark() export const toggleDark = useToggle(isDark) export const preferredDark = usePreferredDark() ================================================ FILE: src/layouts/404.vue ================================================ ================================================ FILE: src/layouts/README.md ================================================ ## Layouts Vue components in this dir are used as layouts. By default, `default.vue` will be used unless an alternative is specified in the route meta. With [`unplugin-vue-router`](https://github.com/posva/unplugin-vue-router) and [`vite-plugin-vue-layouts`](https://github.com/JohnCampionJr/vite-plugin-vue-layouts), you can specify the layout in the page's SFCs like this: ```vue meta: layout: home ``` ================================================ FILE: src/layouts/default.vue ================================================ ================================================ FILE: src/layouts/home.vue ================================================ ================================================ FILE: src/main.ts ================================================ import type { UserModule } from './types' import { setupLayouts } from 'virtual:generated-layouts' import { ViteSSG } from 'vite-ssg' import { routes } from 'vue-router/auto-routes' import App from './App.vue' import '@unocss/reset/tailwind.css' import './styles/main.css' import 'uno.css' // https://github.com/antfu/vite-ssg export const createApp = ViteSSG( App, { routes: setupLayouts([...routes]), base: import.meta.env.BASE_URL, }, (ctx) => { // install all modules under `modules/` Object.values(import.meta.glob<{ install: UserModule }>('./modules/*.ts', { eager: true })) .forEach(i => i.install?.(ctx)) // ctx.app.use(Previewer) }, ) ================================================ FILE: src/modules/README.md ================================================ ## Modules A custom user module system. Place a `.ts` file with the following template, it will be installed automatically. ```ts import type { UserModule } from '~/types' export const install: UserModule = ({ app, router, isClient }) => { // do something } ``` ================================================ FILE: src/modules/i18n.ts ================================================ import type { Locale } from 'vue-i18n' import type { UserModule } from '~/types' import { createI18n } from 'vue-i18n' // Import i18n resources // https://vitejs.dev/guide/features.html#glob-import // // Don't need this? Try vitesse-lite: https://github.com/antfu/vitesse-lite const i18n = createI18n({ legacy: false, locale: '', messages: {}, }) const localesMap = Object.fromEntries( Object.entries(import.meta.glob('../../locales/*.yml')) .map(([path, loadLocale]) => [path.match(/([\w-]*)\.yml$/)?.[1], loadLocale]), ) as Record Promise<{ default: Record }>> export const availableLocales = Object.keys(localesMap) const loadedLanguages: string[] = [] function setI18nLanguage(lang: Locale) { i18n.global.locale.value = lang as any if (typeof document !== 'undefined') document.querySelector('html')?.setAttribute('lang', lang) return lang } export async function loadLanguageAsync(lang: string): Promise { // If the same language if (i18n.global.locale.value === lang) return setI18nLanguage(lang) // If the language was already loaded if (loadedLanguages.includes(lang)) return setI18nLanguage(lang) // If the language hasn't been loaded yet const messages = await localesMap[lang]() i18n.global.setLocaleMessage(lang, messages.default) loadedLanguages.push(lang) return setI18nLanguage(lang) } export const install: UserModule = ({ app }) => { app.use(i18n) loadLanguageAsync('en') } ================================================ FILE: src/modules/nprogress.ts ================================================ import type { UserModule } from '~/types' import NProgress from 'nprogress' export const install: UserModule = ({ isClient, router }) => { if (isClient) { router.beforeEach((to, from) => { if (to.path !== from.path) NProgress.start() }) router.afterEach(() => { NProgress.done() }) } } ================================================ FILE: src/modules/pinia.ts ================================================ import type { UserModule } from '~/types' import { createPinia } from 'pinia' // Setup Pinia // https://pinia.vuejs.org/ export const install: UserModule = ({ isClient, initialState, app }) => { const pinia = createPinia() app.use(pinia) // Refer to // https://github.com/antfu/vite-ssg/blob/main/README.md#state-serialization // for other serialization strategies. if (isClient) pinia.state.value = (initialState.pinia) || {} else initialState.pinia = pinia.state.value } ================================================ FILE: src/modules/pwa.ts ================================================ import type { UserModule } from '~/types' // https://github.com/antfu/vite-plugin-pwa#automatic-reload-when-new-content-available export const install: UserModule = ({ isClient, router }) => { if (!isClient) return router.isReady() .then(async () => { const { registerSW } = await import('virtual:pwa-register') registerSW({ immediate: true }) }) .catch(() => {}) } ================================================ FILE: src/pages/README.md ================================================ ## File-based Routing Routes will be auto-generated for Vue files in this dir with the same file structure. Check out [`unplugin-vue-router`](https://github.com/posva/unplugin-vue-router) for more details. ### Path Aliasing `~/` is aliased to `./src/` folder. For example, instead of having ```ts import { isDark } from '../../../../composables' ``` now, you can use ```ts import { isDark } from '~/composables' ``` ================================================ FILE: src/pages/[...all].vue ================================================ meta: layout: 404 ================================================ FILE: src/pages/about.md ================================================ --- title: About ---

{{ t('button.about') }}

[Vitesse](https://github.com/antfu/vitesse) is an opinionated [Vite](https://github.com/vitejs/vite) starter template made by [@antfu](https://github.com/antfu) for mocking apps swiftly. With **file-based routing**, **components auto importing**, **markdown support**, I18n, PWA and uses **UnoCSS** for styling and icons. ```js // syntax highlighting example function vitesse() { const foo = 'bar' console.log(foo) } ``` Check out the [GitHub repo](https://github.com/antfu/vitesse) for more details. ================================================ FILE: src/pages/hi/[name].vue ================================================ ================================================ FILE: src/pages/index.vue ================================================ meta: layout: home ================================================ FILE: src/route-map.d.ts ================================================ /* eslint-disable */ /* prettier-ignore */ // oxfmt-ignore // @ts-nocheck // noinspection ES6UnusedImports // Generated by vue-router. !! DO NOT MODIFY THIS FILE !! // It's recommended to commit this file. // Make sure to add this file to your tsconfig.json file as an "includes" or "files" entry. import type { RouteRecordInfo, ParamValue, ParamValueOneOrMore, ParamValueZeroOrMore, ParamValueZeroOrOne, } from 'vue-router' declare module 'vue-router' { interface TypesConfig { ParamParsers: never } } declare module 'vue-router/auto-routes' { /** * Route name map generated by vue-router */ export interface RouteNamedMap { '/': RouteRecordInfo< '/', '/', Record, Record, | never >, '/[...all]': RouteRecordInfo< '/[...all]', '/:all(.*)', { all: ParamValue }, { all: ParamValue }, | never >, '/about': RouteRecordInfo< '/about', '/about', Record, Record, | never >, '/hi/[name]': RouteRecordInfo< '/hi/[name]', '/hi/:name', { name: ParamValue }, { name: ParamValue }, | never >, '/README': RouteRecordInfo< '/README', '/README', Record, Record, | never >, } /** * Route file to route info map by vue-router. * Used by the \`sfc-typed-router\` Volar plugin to automatically type \`useRoute()\`. * * Each key is a file path relative to the project root with 2 properties: * - routes: union of route names of the possible routes when in this page (passed to useRoute<...>()) * - views: names of nested views (can be passed to ) * * @internal */ export interface _RouteFileInfoMap { 'src/pages/index.vue': { routes: | '/' views: | never } 'src/pages/[...all].vue': { routes: | '/[...all]' views: | never } 'src/pages/about.md': { routes: | '/about' views: | never } 'src/pages/hi/[name].vue': { routes: | '/hi/[name]' views: | never } 'src/pages/README.md': { routes: | '/README' views: | never } } /** * Get a union of possible route names in a certain route component file. * Used by the \`sfc-typed-router\` Volar plugin to automatically type \`useRoute()\`. * * @internal */ export type _RouteNamesForFilePath = _RouteFileInfoMap extends Record ? Info['routes'] : keyof RouteNamedMap } export {} ================================================ FILE: src/shims.d.ts ================================================ declare interface Window { // extend the window } // with unplugin-vue-markdown, markdown files can be treated as Vue components declare module '*.md' { import type { DefineComponent } from 'vue' const component: DefineComponent export default component } declare module '*.vue' { import type { DefineComponent } from 'vue' const component: DefineComponent export default component } ================================================ FILE: src/stores/user.ts ================================================ import { acceptHMRUpdate, defineStore } from 'pinia' export const useUserStore = defineStore('user', () => { /** * Current name of the user. */ const savedName = ref('') const previousNames = ref(new Set()) const usedNames = computed(() => Array.from(previousNames.value)) const otherNames = computed(() => usedNames.value.filter(name => name !== savedName.value)) /** * Changes the current name of the user and saves the one that was used * before. * * @param name - new name to set */ function setNewName(name: string) { if (savedName.value) previousNames.value.add(savedName.value) savedName.value = name } return { setNewName, otherNames, savedName, } }) if (import.meta.hot) import.meta.hot.accept(acceptHMRUpdate(useUserStore as any, import.meta.hot)) ================================================ FILE: src/styles/main.css ================================================ @import './markdown.css'; html, body, #app { height: 100%; margin: 0; padding: 0; } html.dark { background: #121212; color-scheme: dark; } #nprogress { pointer-events: none; } #nprogress .bar { background: rgb(13, 148, 136); opacity: 0.75; position: fixed; z-index: 1031; top: 0; left: 0; width: 100%; height: 2px; } ================================================ FILE: src/styles/markdown.css ================================================ .prose pre:not(.shiki) { padding: 0; } .prose .shiki { font-family: 'DM Mono', monospace; font-size: 1.2em; line-height: 1.4; } .prose img { width: 100%; } .shiki, .shiki span { color: var(--shiki-light); background: var(--shiki-light-bg); } html.dark .shiki, html.dark .shiki span { color: var(--shiki-dark); background: var(--shiki-dark-bg); } ================================================ FILE: src/types.ts ================================================ import type { ViteSSGContext } from 'vite-ssg' export type UserModule = (ctx: ViteSSGContext) => void ================================================ FILE: test/__snapshots__/component.test.ts.snap ================================================ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`component TheCounter.vue > should render 1`] = `"
10
"`; ================================================ FILE: test/basic.test.ts ================================================ import { describe, expect, it } from 'vitest' describe('tests', () => { it('should works', () => { expect(1 + 1).toEqual(2) }) }) ================================================ FILE: test/component.test.ts ================================================ import { mount } from '@vue/test-utils' import { describe, expect, it } from 'vitest' import TheCounter from '../src/components/TheCounter.vue' describe('component TheCounter.vue', () => { it('should render', () => { const wrapper = mount(TheCounter, { props: { initial: 10 } }) expect(wrapper.text()).toContain('10') expect(wrapper.html()).toMatchSnapshot() }) it('should be interactive', async () => { const wrapper = mount(TheCounter, { props: { initial: 0 } }) expect(wrapper.text()).toContain('0') expect(wrapper.find('.inc').exists()).toBe(true) expect(wrapper.find('.dec').exists()).toBe(true) await wrapper.get('.inc').trigger('click') expect(wrapper.text()).toContain('1') await wrapper.get('.dec').trigger('click') expect(wrapper.text()).toContain('0') }) }) ================================================ FILE: tsconfig.json ================================================ { "compilerOptions": { "target": "ESNext", "jsx": "preserve", "lib": ["DOM", "ESNext"], "baseUrl": ".", "module": "ESNext", "moduleResolution": "Bundler", "paths": { "~/*": ["src/*"] }, "resolveJsonModule": true, "types": [ "vitest", "vite/client", "vite-plugin-vue-layouts/client", "vite-plugin-pwa/client", "unplugin-vue-macros/macros-global" ], "allowJs": true, "strict": true, "strictNullChecks": true, "noUnusedLocals": true, "noEmit": true, "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "isolatedModules": true, "skipLibCheck": true }, "vueCompilerOptions": { "plugins": [ "@vue-macros/volar/define-models", "@vue-macros/volar/define-slots" ] }, "exclude": ["dist", "node_modules", "cypress"] } ================================================ FILE: uno.config.ts ================================================ import { createLocalFontProcessor, } from '@unocss/preset-web-fonts/local' import { defineConfig, presetAttributify, presetIcons, presetTypography, presetUno, presetWebFonts, transformerDirectives, transformerVariantGroup, } from 'unocss' export default defineConfig({ shortcuts: [ ['btn', 'px-4 py-1 rounded inline-block bg-teal-700 text-white cursor-pointer !outline-none hover:bg-teal-800 disabled:cursor-default disabled:bg-gray-600 disabled:opacity-50'], ['icon-btn', 'inline-block cursor-pointer select-none opacity-75 transition duration-200 ease-in-out hover:opacity-100 hover:text-teal-600'], ], presets: [ presetUno(), presetAttributify(), presetIcons({ scale: 1.2, }), presetTypography(), presetWebFonts({ fonts: { sans: 'DM Sans', serif: 'DM Serif Display', mono: 'DM Mono', }, processors: createLocalFontProcessor(), }), ], transformers: [ transformerDirectives(), transformerVariantGroup(), ], safelist: 'prose prose-sm m-auto text-left'.split(' '), }) ================================================ FILE: vite.config.ts ================================================ import path from 'node:path' import VueI18n from '@intlify/unplugin-vue-i18n/vite' import Shiki from '@shikijs/markdown-it' import { unheadVueComposablesImports } from '@unhead/vue' import Vue from '@vitejs/plugin-vue' import LinkAttributes from 'markdown-it-link-attributes' import Unocss from 'unocss/vite' import AutoImport from 'unplugin-auto-import/vite' import Components from 'unplugin-vue-components/vite' import VueMacros from 'unplugin-vue-macros/vite' import Markdown from 'unplugin-vue-markdown/vite' import { defineConfig } from 'vite' import { VitePWA } from 'vite-plugin-pwa' import VueDevTools from 'vite-plugin-vue-devtools' import Layouts from 'vite-plugin-vue-layouts' import generateSitemap from 'vite-ssg-sitemap' import { VueRouterAutoImports } from 'vue-router/unplugin' import VueRouter from 'vue-router/vite' import 'vitest/config' export default defineConfig({ resolve: { alias: { '~/': `${path.resolve(__dirname, 'src')}/`, }, }, plugins: [ // https://github.com/vuejs/router VueRouter({ extensions: ['.vue', '.md'], dts: 'src/route-map.d.ts', }), VueMacros({ plugins: { vue: Vue({ include: [/\.vue$/, /\.md$/], }), }, }), // https://github.com/JohnCampionJr/vite-plugin-vue-layouts Layouts(), // https://github.com/antfu/unplugin-auto-import AutoImport({ include: [/\.[jt]sx?$/, /\.vue$/, /\.vue\?vue/, /\.md$/], imports: [ 'vue', 'vue-i18n', '@vueuse/core', unheadVueComposablesImports, VueRouterAutoImports, { // add any other imports you were relying on 'vue-router/auto': ['useLink'], }, ], dts: 'src/auto-imports.d.ts', dirs: [ 'src/composables', 'src/stores', ], vueTemplate: true, }), // https://github.com/antfu/unplugin-vue-components Components({ // allow auto load markdown components under `./src/components/` extensions: ['vue', 'md'], // allow auto import and register components used in markdown include: [/\.vue$/, /\.vue\?vue/, /\.md$/], dts: 'src/components.d.ts', }), // https://github.com/antfu/unocss // see uno.config.ts for config Unocss(), // https://github.com/unplugin/unplugin-vue-markdown // Don't need this? Try vitesse-lite: https://github.com/antfu/vitesse-lite Markdown({ wrapperClasses: 'prose prose-sm m-auto text-left', headEnabled: true, async markdownItSetup(md) { md.use(LinkAttributes, { matcher: (link: string) => /^https?:\/\//.test(link), attrs: { target: '_blank', rel: 'noopener', }, }) md.use(await Shiki({ defaultColor: false, themes: { light: 'vitesse-light', dark: 'vitesse-dark', }, })) }, }), // https://github.com/antfu/vite-plugin-pwa VitePWA({ registerType: 'autoUpdate', includeAssets: ['favicon.svg', 'safari-pinned-tab.svg'], manifest: { name: 'Vitesse', short_name: 'Vitesse', theme_color: '#ffffff', icons: [ { src: '/pwa-192x192.png', sizes: '192x192', type: 'image/png', }, { src: '/pwa-512x512.png', sizes: '512x512', type: 'image/png', }, { src: '/pwa-512x512.png', sizes: '512x512', type: 'image/png', purpose: 'any maskable', }, ], }, }), // https://github.com/intlify/bundle-tools/tree/main/packages/unplugin-vue-i18n VueI18n({ runtimeOnly: true, compositionOnly: true, fullInstall: true, include: [path.resolve(__dirname, 'locales/**')], }), // https://github.com/webfansplz/vite-plugin-vue-devtools VueDevTools(), ], // https://github.com/vitest-dev/vitest test: { include: ['test/**/*.test.ts'], environment: 'jsdom', }, // https://github.com/antfu/vite-ssg ssgOptions: { script: 'async', formatting: 'minify', beastiesOptions: { reduceInlineStyles: false, }, onFinished() { generateSitemap() }, }, ssr: { // TODO: workaround until they support native ESM noExternal: ['workbox-window', /vue-i18n/], }, })