├── .dockerignore ├── .editorconfig ├── .github ├── FUNDING.yml └── workflows │ └── ci.yml ├── .gitignore ├── .npmrc ├── .vscode ├── extensions.json └── settings.json ├── Dockerfile ├── LICENSE ├── README.md ├── README.zh-CN.md ├── cypress.config.ts ├── cypress ├── e2e │ └── basic.spec.ts └── tsconfig.json ├── 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-lock.yaml ├── pnpm-workspace.yaml ├── public ├── _headers ├── favicon-dark.svg ├── favicon.svg ├── pwa-192x192.png ├── pwa-512x512.png └── safari-pinned-tab.svg ├── src ├── App.vue ├── auto-imports.d.ts ├── components.d.ts ├── components │ ├── README.md │ ├── TheCounter.vue │ ├── TheFooter.vue │ └── TheInput.vue ├── 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 ├── shims.d.ts ├── stores │ └── user.ts ├── styles │ ├── main.css │ └── markdown.css ├── typed-router.d.ts └── types.ts ├── test ├── __snapshots__ │ └── component.test.ts.snap ├── basic.test.ts └── component.test.ts ├── tsconfig.json ├── uno.config.ts └── vite.config.ts /.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | open_collective: antfu 2 | github: [antfu] 3 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | pull_request: 9 | branches: 10 | - main 11 | 12 | jobs: 13 | lint: 14 | runs-on: ubuntu-latest 15 | steps: 16 | - uses: actions/checkout@v4 17 | - uses: pnpm/action-setup@v3 18 | - uses: actions/setup-node@v4 19 | with: 20 | node-version: lts/* 21 | cache: pnpm 22 | 23 | - name: Install 24 | run: pnpm install 25 | 26 | - name: Lint 27 | run: pnpm run lint 28 | 29 | typecheck: 30 | runs-on: ubuntu-latest 31 | steps: 32 | - uses: actions/checkout@v4 33 | - uses: pnpm/action-setup@v3 34 | - uses: actions/setup-node@v4 35 | with: 36 | node-version: lts/* 37 | cache: pnpm 38 | 39 | - name: Install 40 | run: pnpm install 41 | 42 | - name: Typecheck 43 | run: pnpm run typecheck 44 | 45 | test: 46 | runs-on: ${{ matrix.os }} 47 | 48 | strategy: 49 | matrix: 50 | node-version: [18.x, 20.x] 51 | os: [ubuntu-latest] 52 | fail-fast: false 53 | 54 | steps: 55 | - uses: actions/checkout@v4 56 | - uses: pnpm/action-setup@v3 57 | - name: Use Node.js ${{ matrix.node-version }} 58 | uses: actions/setup-node@v4 59 | with: 60 | node-version: ${{ matrix.node-version }} 61 | registry-url: https://registry.npmjs.org/ 62 | cache: pnpm 63 | 64 | - run: pnpm install 65 | - run: pnpm run test:unit 66 | 67 | test-e2e: 68 | runs-on: ubuntu-latest 69 | steps: 70 | - uses: actions/checkout@v4 71 | - uses: actions/cache@v4 72 | with: 73 | path: | 74 | ~/.cache 75 | key: cypress-cache-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }} 76 | 77 | - uses: pnpm/action-setup@v3 78 | 79 | - name: Use Node.js 80 | uses: actions/setup-node@v4 81 | with: 82 | node-version: lts/* 83 | registry-url: https://registry.npmjs.org/ 84 | cache: pnpm 85 | 86 | - run: pnpm install 87 | 88 | - name: Cypress PNPM Patch 89 | run: cp pnpm-lock.yaml package-lock.json 90 | 91 | - name: Cypress 92 | uses: cypress-io/github-action@v6 93 | with: 94 | install-command: echo 95 | build: pnpm run build 96 | start: npx vite preview --port 3333 97 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .vite-ssg-dist 3 | .vite-ssg-temp 4 | *.local 5 | dist 6 | dist-ssr 7 | node_modules 8 | .idea/ 9 | *.log 10 | cypress/downloads 11 | public/assets/fonts 12 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | shamefully-hoist=true 2 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "antfu.iconify", 4 | "antfu.unocss", 5 | "antfu.vite", 6 | "antfu.goto-alias", 7 | "csstools.postcss", 8 | "dbaeumer.vscode-eslint", 9 | "vue.volar", 10 | "lokalise.i18n-ally", 11 | "streetsidesoftware.code-spell-checker" 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "cSpell.words": ["Vitesse", "Vite", "unocss", "vitest", "vueuse", "pinia", "demi", "antfu", "iconify", "intlify", "vitejs", "unplugin", "pnpm"], 3 | "i18n-ally.sourceLanguage": "en", 4 | "i18n-ally.keystyle": "nested", 5 | "i18n-ally.localesPaths": "locales", 6 | "i18n-ally.sortKeys": true, 7 | 8 | // Disable the default formatter 9 | "prettier.enable": false, 10 | "editor.formatOnSave": false, 11 | 12 | // Auto fix 13 | "editor.codeActionsOnSave": { 14 | "source.fixAll.eslint": "explicit", 15 | "source.organizeImports": "never" 16 | }, 17 | 18 | // Silent the stylistic rules in you IDE, but still auto fix them 19 | "eslint.rules.customizations": [ 20 | { "rule": "style/*", "severity": "off" }, 21 | { "rule": "format/*", "severity": "off" }, 22 | { "rule": "*-indent", "severity": "off" }, 23 | { "rule": "*-spacing", "severity": "off" }, 24 | { "rule": "*-spaces", "severity": "off" }, 25 | { "rule": "*-order", "severity": "off" }, 26 | { "rule": "*-dangle", "severity": "off" }, 27 | { "rule": "*-newline", "severity": "off" }, 28 | { "rule": "*quotes", "severity": "off" }, 29 | { "rule": "*semi", "severity": "off" } 30 | ], 31 | 32 | // The following is optional. 33 | // It's better to put under project setting `.vscode/settings.json` 34 | // to avoid conflicts with working with different eslint configs 35 | // that does not support all formats. 36 | "eslint.validate": [ 37 | "javascript", 38 | "javascriptreact", 39 | "typescript", 40 | "typescriptreact", 41 | "vue", 42 | "html", 43 | "markdown", 44 | "json", 45 | "jsonc", 46 | "yaml" 47 | ] 48 | } 49 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:20-alpine AS build-stage 2 | 3 | WORKDIR /app 4 | RUN corepack enable 5 | 6 | COPY .npmrc package.json pnpm-lock.yaml pnpm-workspace.yaml ./ 7 | RUN --mount=type=cache,id=pnpm-store,target=/root/.pnpm-store \ 8 | pnpm install --frozen-lockfile 9 | 10 | COPY . . 11 | RUN pnpm build 12 | 13 | FROM nginx:stable-alpine AS production-stage 14 | 15 | COPY --from=build-stage /app/dist /usr/share/nginx/html 16 | EXPOSE 80 17 | 18 | CMD ["nginx", "-g", "daemon off;"] 19 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020-PRESENT Anthony Fu 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 |
3 |
6 | Mocking up web app with Vitesse(speed)
7 |
12 | Live Demo 13 |
14 | 15 |22 | English | 简体中文 23 | 24 |
25 | 26 |