├── .eslintignore
├── .prettierignore
├── src
├── assets
│ └── css
│ │ ├── main.css
│ │ └── tailwind.css
├── composables
│ └── dark.ts
├── layouts
│ ├── .eslintrc
│ ├── 404.vue
│ └── default.vue
├── pages
│ ├── .eslintrc
│ ├── [...all].vue
│ └── index.vue
├── components
│ ├── .eslintrc
│ └── Base
│ │ └── Card
│ │ ├── index.test.ts
│ │ └── index.vue
├── App.vue
├── types
│ └── module.ts
├── apis
│ └── index.ts
├── env.d.ts
├── modules
│ └── pinia.ts
├── main.ts
└── auto-imports.d.ts
├── .env.example
├── .eslintrc
├── .npmrc
├── .lintstagedrc
├── .husky
└── pre-commit
├── public
└── favicon.ico
├── .prettierrc
├── postcss.config.cjs
├── .gitignore
├── index.html
├── .versionrc
├── tailwind.config.cjs
├── .vscode
├── extensions.json
└── settings.json
├── netlify.toml
├── components.d.ts
├── tsconfig.json
├── LICENSE
├── vite.config.ts
├── package.json
├── README.md
└── CHANGELOG.md
/.eslintignore:
--------------------------------------------------------------------------------
1 | dist
2 | public
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | dist
2 | public
3 | *.d.ts
--------------------------------------------------------------------------------
/src/assets/css/main.css:
--------------------------------------------------------------------------------
1 | @import 'tailwind.css';
2 |
--------------------------------------------------------------------------------
/.env.example:
--------------------------------------------------------------------------------
1 | VITE_API_URL=https://jsonplaceholder.typicode.com
--------------------------------------------------------------------------------
/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "extends": ["@hasan-almujtaba"]
3 | }
4 |
--------------------------------------------------------------------------------
/.npmrc:
--------------------------------------------------------------------------------
1 | shamefully-hoist=true
2 | strict-peer-dependencies=false
--------------------------------------------------------------------------------
/.lintstagedrc:
--------------------------------------------------------------------------------
1 | {
2 | "**/*.{vue,ts}": ["eslint --fix", "prettier --write"]
3 | }
--------------------------------------------------------------------------------
/src/assets/css/tailwind.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
--------------------------------------------------------------------------------
/.husky/pre-commit:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 | . "$(dirname -- "$0")/_/husky.sh"
3 |
4 | pnpm lint-staged
5 |
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hasan-almujtaba/vue-starter/HEAD/public/favicon.ico
--------------------------------------------------------------------------------
/src/composables/dark.ts:
--------------------------------------------------------------------------------
1 | export const isDark = useDark()
2 | export const toggleDark = useToggle(isDark)
3 |
--------------------------------------------------------------------------------
/src/layouts/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "rules": {
3 | "vue/multi-word-component-names": "off"
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/src/pages/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "rules": {
3 | "vue/multi-word-component-names": "off"
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/src/components/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "rules": {
3 | "vue/multi-word-component-names": "off"
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/src/layouts/404.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/src/App.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/src/types/module.ts:
--------------------------------------------------------------------------------
1 | import type { ViteSSGContext } from 'vite-ssg'
2 |
3 | export type Module = (ctx: ViteSSGContext) => void
4 |
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "tabWidth": 2,
3 | "useTabs": false,
4 | "singleQuote": true,
5 | "singleAttributePerLine": true,
6 | "semi": false
7 | }
8 |
--------------------------------------------------------------------------------
/postcss.config.cjs:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | plugins: {
3 | 'tailwindcss/nesting': {},
4 | tailwindcss: {},
5 | autoprefixer: {},
6 | },
7 | }
8 |
--------------------------------------------------------------------------------
/src/layouts/default.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/src/apis/index.ts:
--------------------------------------------------------------------------------
1 | import axios from 'axios'
2 |
3 | /**
4 | * Create axios instances
5 | */
6 | const api = axios.create({
7 | baseURL: import.meta.env.VITE_API_URL,
8 | })
9 |
10 | export default api
11 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | .DS_Store
3 | dist
4 | dist-ssr
5 | *.local
6 | dist
7 | .vite-ssg-temp
8 | .pnp.*
9 | .yarn/*
10 | !.yarn/patches
11 | !.yarn/plugins
12 | !.yarn/releases
13 | !.yarn/sdks
14 | !.yarn/versions
15 | .env
16 |
--------------------------------------------------------------------------------
/src/env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
3 | declare module '*.vue' {
4 | import { DefineComponent } from 'vue'
5 | // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types
6 | const component: DefineComponent<{}, {}, any>
7 | export default component
8 | }
9 |
--------------------------------------------------------------------------------
/src/modules/pinia.ts:
--------------------------------------------------------------------------------
1 | import { createPinia } from 'pinia'
2 | import type { Module } from '~/types/module'
3 |
4 | export const install: Module = ({ isClient, initialState, app }) => {
5 | const pinia = createPinia()
6 | app.use(pinia)
7 | if (isClient) pinia.state.value = initialState.pinia || {}
8 | else initialState.pinia = pinia.state.value
9 | }
10 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Vue Starter
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/.versionrc:
--------------------------------------------------------------------------------
1 | {
2 | "types": [
3 | {"type": "feat", "section": "Features"},
4 | {"type": "fix", "section": "Bug Fixes"},
5 | {"type": "refactor", "section": "Code Refactoring"},
6 | {"type": "chore", "hidden": true},
7 | {"type": "docs", "hidden": true},
8 | {"type": "style", "hidden": true},
9 | {"type": "perf", "hidden": true},
10 | {"type": "test", "hidden": true}
11 | ]
12 | }
--------------------------------------------------------------------------------
/tailwind.config.cjs:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | module.exports = {
3 | darkMode: 'class',
4 | content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'],
5 | theme: {
6 | container: {
7 | center: true,
8 | padding: '2rem',
9 | },
10 | },
11 | plugins: [
12 | require('@tailwindcss/typography'),
13 | require('@tailwindcss/forms'),
14 | require('@tailwindcss/line-clamp'),
15 | ],
16 | }
17 |
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | "recommendations": [
3 | "vue.volar",
4 | "dbaeumer.vscode-eslint",
5 | "esbenp.prettier-vscode",
6 | "redhat.vscode-yaml",
7 | "streetsidesoftware.code-spell-checker",
8 | "bungcip.better-toml",
9 | "bradlc.vscode-tailwindcss",
10 | "wayou.vscode-todo-highlight",
11 | "csstools.postcss",
12 | "vue.vscode-typescript-vue-plugin",
13 | "vivaxy.vscode-conventional-commits"
14 | ]
15 | }
16 |
--------------------------------------------------------------------------------
/netlify.toml:
--------------------------------------------------------------------------------
1 | [build.environment]
2 | # bypass npm auto install
3 | NPM_FLAGS = "--version"
4 | NODE_VERSION = "16"
5 |
6 | [build]
7 | publish = "dist"
8 | command = "npx pnpm i --store=node_modules/.pnpm-store && npx pnpm run build"
9 |
10 | [[redirects]]
11 | from = "/*"
12 | to = "/index.html"
13 | status = 200
14 |
15 | [[headers]]
16 | for = "/manifest.webmanifest"
17 | [headers.values]
18 | Content-Type = "application/manifest+json"
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "typescript.tsdk": "node_modules/typescript/lib",
3 | "cSpell.words": [
4 | "composables",
5 | "fontsource",
6 | "headlessui",
7 | "pinia",
8 | "roboto",
9 | "semibold",
10 | "tailwindcss"
11 | ],
12 | "todohighlight.keywords": [
13 | {
14 | "text": "WARNING:",
15 | "backgroundColor": "#e74c3c",
16 | "color": "#fff"
17 | }
18 | ],
19 | "css.lint.unknownAtRules": "ignore"
20 | }
21 |
--------------------------------------------------------------------------------
/components.d.ts:
--------------------------------------------------------------------------------
1 | // generated by unplugin-vue-components
2 | // We suggest you to commit this file into source control
3 | // Read more: https://github.com/vuejs/core/pull/3399
4 | import '@vue/runtime-core'
5 |
6 | export {}
7 |
8 | declare module '@vue/runtime-core' {
9 | export interface GlobalComponents {
10 | Card: typeof import('./src/components/Base/Card/index.vue')['default']
11 | RouterLink: typeof import('vue-router')['RouterLink']
12 | RouterView: typeof import('vue-router')['RouterView']
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/pages/[...all].vue:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
10 |
11 | 404
12 |
13 |
Page Not Found
14 |
15 |
16 |
17 |
18 |
19 | meta:
20 | layout: 404
21 |
22 |
--------------------------------------------------------------------------------
/src/components/Base/Card/index.test.ts:
--------------------------------------------------------------------------------
1 | import { mount } from '@vue/test-utils'
2 | import Card from './index.vue'
3 |
4 | describe('Card', () => {
5 | test('component is rendered as link', () => {
6 | const wrapper = mount(Card, {
7 | props: {
8 | href: 'http://example.com',
9 | },
10 | })
11 |
12 | expect(wrapper.element.tagName).toBe('A')
13 | })
14 |
15 | test('component is rendered as div', () => {
16 | const wrapper = mount(Card)
17 |
18 | expect(wrapper.element.tagName).toBe('DIV')
19 | })
20 | })
21 |
--------------------------------------------------------------------------------
/src/main.ts:
--------------------------------------------------------------------------------
1 | import { setupLayouts } from 'virtual:generated-layouts'
2 | import generatedRoutes from 'virtual:generated-pages'
3 | import { ViteSSG } from 'vite-ssg'
4 | import App from './App.vue'
5 | import '~/assets/css/main.css'
6 | import { Module } from '~/types/module'
7 |
8 | const routes = setupLayouts(generatedRoutes)
9 |
10 | export const createApp = ViteSSG(
11 | // the root component
12 | App,
13 | // vue-router options
14 | { routes },
15 | (ctx) => {
16 | // install all modules under `modules/`
17 | Object.values(
18 | import.meta.glob<{ install: Module }>('./modules/*.ts', { eager: true })
19 | ).forEach((i) => i.install?.(ctx))
20 | }
21 | )
22 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "jsx": "preserve",
4 | "baseUrl": ".",
5 | "module": "ESNext",
6 | "target": "es2016",
7 | "lib": ["DOM", "ESNext"],
8 | "strict": true,
9 | "esModuleInterop": true,
10 | "incremental": false,
11 | "skipLibCheck": true,
12 | "moduleResolution": "node",
13 | "resolveJsonModule": true,
14 | "noUnusedLocals": true,
15 | "strictNullChecks": true,
16 | "forceConsistentCasingInFileNames": true,
17 | "types": [
18 | "vite/client",
19 | "vite-plugin-pages/client",
20 | "vite-plugin-vue-layouts/client",
21 | "unplugin-icons/types/vue",
22 | "vitest/globals"
23 | ],
24 | "paths": {
25 | "~/*": ["src/*"]
26 | }
27 | },
28 | "exclude": ["dist", "node_modules"]
29 | }
30 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 Hasan Al Mujtaba
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 |
--------------------------------------------------------------------------------
/vite.config.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
3 | import path from 'path'
4 | import { defineConfig } from 'vite'
5 | import vue from '@vitejs/plugin-vue'
6 | import Pages from 'vite-plugin-pages'
7 | import Layouts from 'vite-plugin-vue-layouts'
8 | import AutoImport from 'unplugin-auto-import/vite'
9 | import Components from 'unplugin-vue-components/vite'
10 | import Icons from 'unplugin-icons/vite'
11 | import IconsResolver from 'unplugin-icons/resolver'
12 | import { HeadlessUiResolver } from 'unplugin-vue-components/resolvers'
13 |
14 | export default defineConfig({
15 | resolve: {
16 | alias: {
17 | '~/': `${path.resolve(__dirname, 'src')}/`,
18 | },
19 | },
20 | plugins: [
21 | vue(),
22 | Pages(),
23 | Layouts(),
24 | AutoImport({
25 | imports: ['vue', 'vue-router', '@vueuse/head', '@vueuse/core'],
26 | dts: 'src/auto-imports.d.ts',
27 | }),
28 | Components({
29 | dts: true,
30 | resolvers: [IconsResolver(), HeadlessUiResolver()],
31 | }),
32 | Icons(),
33 | ],
34 | ssgOptions: {
35 | script: 'async',
36 | formatting: 'minify',
37 | /**
38 | * Generate dynamic path based on resources on api
39 | */
40 | // async includedRoutes(paths) {
41 | // const { data: post } = await api.get('posts')
42 | // const staticPaths = paths.filter(path => !path.includes(':'))
43 |
44 | // const dynamicPosts = post.map((item: any) => `/example/${item.id}`)
45 |
46 | // return [...staticPaths, ...dynamicPosts]
47 | // },
48 | },
49 | test: {
50 | globals: true,
51 | environment: 'jsdom',
52 | },
53 | })
54 |
--------------------------------------------------------------------------------
/src/components/Base/Card/index.vue:
--------------------------------------------------------------------------------
1 |
4 |
5 |
12 |
13 |
14 |
19 |
22 |
23 |
24 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
40 |
43 |
44 |
45 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@hasan-almujtaba/vue-starter",
3 | "type": "module",
4 | "private": true,
5 | "version": "2.0.0",
6 | "scripts": {
7 | "dev": "vite",
8 | "build": "vite-ssg build",
9 | "preview": "vite preview",
10 | "lint": "eslint \"**/*.{vue,ts,js}\"",
11 | "format": "prettier --write \"**/*.{vue,ts,js}\"",
12 | "prepare": "husky install",
13 | "type:check": "vue-tsc --noEmit",
14 | "test": "vitest",
15 | "release": "standard-version"
16 | },
17 | "dependencies": {
18 | "@fontsource/roboto": "^4.5.8",
19 | "@headlessui/vue": "^1.7.4",
20 | "@vueuse/core": "^9.5.0",
21 | "@vueuse/head": "^1.0.16",
22 | "axios": "^1.1.3",
23 | "pinia": "^2.0.24",
24 | "vue": "^3.2.45",
25 | "vue-router": "^4.1.6"
26 | },
27 | "devDependencies": {
28 | "@hasan-almujtaba/eslint-config": "^0.0.1",
29 | "@iconify/json": "^2.1.140",
30 | "@tailwindcss/forms": "^0.5.3",
31 | "@tailwindcss/line-clamp": "^0.4.2",
32 | "@tailwindcss/typography": "^0.5.8",
33 | "@testing-library/jest-dom": "^5.16.5",
34 | "@types/node": "^18.11.9",
35 | "@vitejs/plugin-vue": "^3.2.0",
36 | "@vue/test-utils": "^2.2.4",
37 | "autoprefixer": "^10.4.13",
38 | "eslint": "^8.28.0",
39 | "husky": "^8.0.0",
40 | "lint-staged": "^13.0.3",
41 | "postcss": "^8.4.19",
42 | "sass": "^1.56.1",
43 | "standard-version": "^9.5.0",
44 | "tailwindcss": "^3.2.4",
45 | "typescript": "^4.9.3",
46 | "unplugin-auto-import": "^0.11.4",
47 | "unplugin-icons": "^0.14.13",
48 | "unplugin-vue-components": "^0.22.9",
49 | "vite": "^3.2.4",
50 | "vite-plugin-pages": "^0.27.1",
51 | "vite-plugin-vue-layouts": "^0.7.0",
52 | "vite-ssg": "^0.22.0",
53 | "vitest": "^0.25.3",
54 | "vue-tsc": "^1.0.9"
55 | },
56 | "packageManager": "pnpm@7.1.9"
57 | }
58 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | [](https://github.com/tterb/atomic-design-ui/blob/master/LICENSEs)
2 | 
3 | 
4 |
5 | # Vue 3 Starter
6 |
7 | Vue 3 starter with typescript and vite for building any type of website with clean code and better developer experience
8 |
9 | ## Live Demo
10 |
11 | [Live Demo](https://vue3-start.netlify.app)
12 |
13 | ## Features
14 |
15 | - 🛠️ Vue 3 with vite configured out of the box
16 | - 📁 File based routing with vite-plugin-pages
17 | - 📚 Layout system with vite-plugin-vue-layouts
18 | - 🍍 State management using pinia
19 | - 📥 Auto import composition api
20 | - 📥 Auto import component
21 | - 🎨 Easily create custom ui component with tailwind and headless ui
22 | - 💯 Produce clean code with eslint and prettier
23 | - ⌨️ Safe typing with typescript
24 | - 📃 Generate static site on deployment
25 |
26 | ## VSCode Extension
27 |
28 | - Volar for vue typescript support
29 | - Eslint for linting code
30 | - Prettier for code formatting
31 | - Yaml for yaml language support
32 | - Code spell checker to avoid misspell or typo in code
33 | - Tailwind intellisense
34 | - TODO Highlight in comment
35 |
36 | ## Try it now!
37 |
38 | ### Github Template
39 |
40 | [Create repo from this template](https://github.com/hasan-almujtaba/vue-starter/generate)
41 |
42 | ### Clone to local
43 |
44 | ```bash
45 | pnpm dlx degit hasan-almujtaba/vue-starter my-app
46 | cd my-app
47 | pnpm i
48 | ```
49 |
50 | ## Usage
51 |
52 | ### Development
53 |
54 | Start local environment
55 |
56 | ```bash
57 | pnpm dev
58 | ```
59 |
60 | ### Build
61 |
62 | To build the App, run
63 |
64 | ```bash
65 | pnpm build
66 | ```
67 |
68 | See [Vite SSG Initial State](https://github.com/antfu/vite-ssg#initial-state) for configuring initial state and [how to fetch data](https://github.com/antfu/vite-ssg/issues/10#issuecomment-907692311)
69 |
70 | ### Deploy to Netlify
71 |
72 | Go to [Netlify](https://app.netlify.com/start) and select your clone, OK along the way, and your App will be live in a minute.
73 |
--------------------------------------------------------------------------------
/src/pages/index.vue:
--------------------------------------------------------------------------------
1 |
39 |
40 |
41 |
42 |
52 |
53 |
54 | Vue starter is a simple, fast, and easy to use starter template for
55 | developing static and SPA websites with Vue.js.
56 |
57 |
58 |
59 |
64 | {{ item.title }}
65 |
66 | {{ item.text }}
67 |
68 |
69 |
70 |
71 | Get started by editing
72 | src/pages/index.vue
73 |
74 |
75 |
76 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Changelog
2 |
3 | All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4 |
5 | ## [2.0.0](https://github.com/hasan-almujtaba/vue-starter/compare/v1.0.0...v2.0.0) (2022-11-24)
6 |
7 |
8 | ### Features
9 |
10 | * add .prettierignore ([ab073d5](https://github.com/hasan-almujtaba/vue-starter/commit/ab073d5fc793228097587ff110e11ed6aa2bca7a))
11 | * add git hooks ([fad41a6](https://github.com/hasan-almujtaba/vue-starter/commit/fad41a6bdc5ac222fc447f1a9ed9a4a2b376a44e))
12 | * add new card component ([c298043](https://github.com/hasan-almujtaba/vue-starter/commit/c298043a154610617b038b403eabeb9bd26a992c))
13 | * add new extensions recommendation ([9f9d6ca](https://github.com/hasan-almujtaba/vue-starter/commit/9f9d6ca97215b2c6609ae4b8df84ca397d7c5fb4))
14 | * add standard-version for automatically generate changelog ([08c5de1](https://github.com/hasan-almujtaba/vue-starter/commit/08c5de1e6cc852c32feaa5718e22450bd2ec9552))
15 | * add tailwind nesting to postcss config ([5844a74](https://github.com/hasan-almujtaba/vue-starter/commit/5844a74b518f7c86a163a1a598ff5b20b5732959))
16 | * add tailwind plugins ([203c556](https://github.com/hasan-almujtaba/vue-starter/commit/203c556c3141cc201cecc3b93ee595b2052464c9))
17 | * add unit test to Card component ([e665cbf](https://github.com/hasan-almujtaba/vue-starter/commit/e665cbfef4ee3f4c59683a181fb7f9da2d3d0f03))
18 | * add vitest configuration ([7d66053](https://github.com/hasan-almujtaba/vue-starter/commit/7d66053ac267dd3bf554f45e9d0b9a4af751ee8c))
19 |
20 |
21 | ### Bug Fixes
22 |
23 | * fix Unknown at rule [@tailwindcss](https://github.com/tailwindcss)(unknownAtRules) ([a9e4f16](https://github.com/hasan-almujtaba/vue-starter/commit/a9e4f161960d1849da9f67018a319f0529d03f41))
24 |
25 |
26 | ### Code Refactoring
27 |
28 | * change vite config file format ([5ce55cd](https://github.com/hasan-almujtaba/vue-starter/commit/5ce55cd9fb22d28180c8aa912499e6ff3d329758))
29 | * **dependencies:** update dependencies to latest version ([f5c8f6f](https://github.com/hasan-almujtaba/vue-starter/commit/f5c8f6f877c1fc2cd34c4c0c5457169981343d5c))
30 | * refactor code formatting ([f121ea1](https://github.com/hasan-almujtaba/vue-starter/commit/f121ea11aaa8738befc9a304785eeea09cf6280f))
31 | * remove unused components ([4b6c6d7](https://github.com/hasan-almujtaba/vue-starter/commit/4b6c6d7799b2c4dd9b128822b8a3e90ef480b578))
32 | * remove unused css ([0c316e5](https://github.com/hasan-almujtaba/vue-starter/commit/0c316e55f6ee05666725023d3f75b19caac7679f))
33 | * remove unused pages ([46c5759](https://github.com/hasan-almujtaba/vue-starter/commit/46c57596101e7b328a7df88a0bceb16e63277a18))
34 | * remove unused pinia store ([e248532](https://github.com/hasan-almujtaba/vue-starter/commit/e2485322418dfd380d448f4e353a4e13251c458d))
35 | * update auto component import ([51086bc](https://github.com/hasan-almujtaba/vue-starter/commit/51086bc0c6d731f8c933d2715b1482d237d8b43b))
36 | * update default layout ([91fcb03](https://github.com/hasan-almujtaba/vue-starter/commit/91fcb0355f728eb28bb98a82dd0edc108c30af13))
37 | * update default title tag ([d0983c0](https://github.com/hasan-almujtaba/vue-starter/commit/d0983c0b1fb7beda3e2af0790ba8443d889fc034))
38 | * update home page ui ([fabcf83](https://github.com/hasan-almujtaba/vue-starter/commit/fabcf83ec541e74fd7fc0968bd154b8b4988df14))
39 |
--------------------------------------------------------------------------------
/src/auto-imports.d.ts:
--------------------------------------------------------------------------------
1 | // Generated by 'unplugin-auto-import'
2 | export {}
3 | declare global {
4 | const EffectScope: typeof import('vue')['EffectScope']
5 | const asyncComputed: typeof import('@vueuse/core')['asyncComputed']
6 | const autoResetRef: typeof import('@vueuse/core')['autoResetRef']
7 | const computed: typeof import('vue')['computed']
8 | const computedAsync: typeof import('@vueuse/core')['computedAsync']
9 | const computedEager: typeof import('@vueuse/core')['computedEager']
10 | const computedInject: typeof import('@vueuse/core')['computedInject']
11 | const computedWithControl: typeof import('@vueuse/core')['computedWithControl']
12 | const controlledComputed: typeof import('@vueuse/core')['controlledComputed']
13 | const controlledRef: typeof import('@vueuse/core')['controlledRef']
14 | const createApp: typeof import('vue')['createApp']
15 | const createEventHook: typeof import('@vueuse/core')['createEventHook']
16 | const createGlobalState: typeof import('@vueuse/core')['createGlobalState']
17 | const createInjectionState: typeof import('@vueuse/core')['createInjectionState']
18 | const createReactiveFn: typeof import('@vueuse/core')['createReactiveFn']
19 | const createSharedComposable: typeof import('@vueuse/core')['createSharedComposable']
20 | const createUnrefFn: typeof import('@vueuse/core')['createUnrefFn']
21 | const customRef: typeof import('vue')['customRef']
22 | const debouncedRef: typeof import('@vueuse/core')['debouncedRef']
23 | const debouncedWatch: typeof import('@vueuse/core')['debouncedWatch']
24 | const defineAsyncComponent: typeof import('vue')['defineAsyncComponent']
25 | const defineComponent: typeof import('vue')['defineComponent']
26 | const eagerComputed: typeof import('@vueuse/core')['eagerComputed']
27 | const effectScope: typeof import('vue')['effectScope']
28 | const extendRef: typeof import('@vueuse/core')['extendRef']
29 | const getCurrentInstance: typeof import('vue')['getCurrentInstance']
30 | const getCurrentScope: typeof import('vue')['getCurrentScope']
31 | const h: typeof import('vue')['h']
32 | const ignorableWatch: typeof import('@vueuse/core')['ignorableWatch']
33 | const inject: typeof import('vue')['inject']
34 | const isDefined: typeof import('@vueuse/core')['isDefined']
35 | const isProxy: typeof import('vue')['isProxy']
36 | const isReactive: typeof import('vue')['isReactive']
37 | const isReadonly: typeof import('vue')['isReadonly']
38 | const isRef: typeof import('vue')['isRef']
39 | const makeDestructurable: typeof import('@vueuse/core')['makeDestructurable']
40 | const markRaw: typeof import('vue')['markRaw']
41 | const nextTick: typeof import('vue')['nextTick']
42 | const onActivated: typeof import('vue')['onActivated']
43 | const onBeforeMount: typeof import('vue')['onBeforeMount']
44 | const onBeforeRouteLeave: typeof import('vue-router')['onBeforeRouteLeave']
45 | const onBeforeRouteUpdate: typeof import('vue-router')['onBeforeRouteUpdate']
46 | const onBeforeUnmount: typeof import('vue')['onBeforeUnmount']
47 | const onBeforeUpdate: typeof import('vue')['onBeforeUpdate']
48 | const onClickOutside: typeof import('@vueuse/core')['onClickOutside']
49 | const onDeactivated: typeof import('vue')['onDeactivated']
50 | const onErrorCaptured: typeof import('vue')['onErrorCaptured']
51 | const onKeyStroke: typeof import('@vueuse/core')['onKeyStroke']
52 | const onLongPress: typeof import('@vueuse/core')['onLongPress']
53 | const onMounted: typeof import('vue')['onMounted']
54 | const onRenderTracked: typeof import('vue')['onRenderTracked']
55 | const onRenderTriggered: typeof import('vue')['onRenderTriggered']
56 | const onScopeDispose: typeof import('vue')['onScopeDispose']
57 | const onServerPrefetch: typeof import('vue')['onServerPrefetch']
58 | const onStartTyping: typeof import('@vueuse/core')['onStartTyping']
59 | const onUnmounted: typeof import('vue')['onUnmounted']
60 | const onUpdated: typeof import('vue')['onUpdated']
61 | const pausableWatch: typeof import('@vueuse/core')['pausableWatch']
62 | const provide: typeof import('vue')['provide']
63 | const reactify: typeof import('@vueuse/core')['reactify']
64 | const reactifyObject: typeof import('@vueuse/core')['reactifyObject']
65 | const reactive: typeof import('vue')['reactive']
66 | const reactiveComputed: typeof import('@vueuse/core')['reactiveComputed']
67 | const reactiveOmit: typeof import('@vueuse/core')['reactiveOmit']
68 | const reactivePick: typeof import('@vueuse/core')['reactivePick']
69 | const readonly: typeof import('vue')['readonly']
70 | const ref: typeof import('vue')['ref']
71 | const refAutoReset: typeof import('@vueuse/core')['refAutoReset']
72 | const refDebounced: typeof import('@vueuse/core')['refDebounced']
73 | const refDefault: typeof import('@vueuse/core')['refDefault']
74 | const refThrottled: typeof import('@vueuse/core')['refThrottled']
75 | const refWithControl: typeof import('@vueuse/core')['refWithControl']
76 | const resolveComponent: typeof import('vue')['resolveComponent']
77 | const resolveDirective: typeof import('vue')['resolveDirective']
78 | const resolveRef: typeof import('@vueuse/core')['resolveRef']
79 | const resolveUnref: typeof import('@vueuse/core')['resolveUnref']
80 | const shallowReactive: typeof import('vue')['shallowReactive']
81 | const shallowReadonly: typeof import('vue')['shallowReadonly']
82 | const shallowRef: typeof import('vue')['shallowRef']
83 | const syncRef: typeof import('@vueuse/core')['syncRef']
84 | const syncRefs: typeof import('@vueuse/core')['syncRefs']
85 | const templateRef: typeof import('@vueuse/core')['templateRef']
86 | const throttledRef: typeof import('@vueuse/core')['throttledRef']
87 | const throttledWatch: typeof import('@vueuse/core')['throttledWatch']
88 | const toRaw: typeof import('vue')['toRaw']
89 | const toReactive: typeof import('@vueuse/core')['toReactive']
90 | const toRef: typeof import('vue')['toRef']
91 | const toRefs: typeof import('vue')['toRefs']
92 | const triggerRef: typeof import('vue')['triggerRef']
93 | const tryOnBeforeMount: typeof import('@vueuse/core')['tryOnBeforeMount']
94 | const tryOnBeforeUnmount: typeof import('@vueuse/core')['tryOnBeforeUnmount']
95 | const tryOnMounted: typeof import('@vueuse/core')['tryOnMounted']
96 | const tryOnScopeDispose: typeof import('@vueuse/core')['tryOnScopeDispose']
97 | const tryOnUnmounted: typeof import('@vueuse/core')['tryOnUnmounted']
98 | const unref: typeof import('vue')['unref']
99 | const unrefElement: typeof import('@vueuse/core')['unrefElement']
100 | const until: typeof import('@vueuse/core')['until']
101 | const useActiveElement: typeof import('@vueuse/core')['useActiveElement']
102 | const useArrayEvery: typeof import('@vueuse/core')['useArrayEvery']
103 | const useArrayFilter: typeof import('@vueuse/core')['useArrayFilter']
104 | const useArrayFind: typeof import('@vueuse/core')['useArrayFind']
105 | const useArrayFindIndex: typeof import('@vueuse/core')['useArrayFindIndex']
106 | const useArrayJoin: typeof import('@vueuse/core')['useArrayJoin']
107 | const useArrayMap: typeof import('@vueuse/core')['useArrayMap']
108 | const useArrayReduce: typeof import('@vueuse/core')['useArrayReduce']
109 | const useArraySome: typeof import('@vueuse/core')['useArraySome']
110 | const useAsyncQueue: typeof import('@vueuse/core')['useAsyncQueue']
111 | const useAsyncState: typeof import('@vueuse/core')['useAsyncState']
112 | const useAttrs: typeof import('vue')['useAttrs']
113 | const useBase64: typeof import('@vueuse/core')['useBase64']
114 | const useBattery: typeof import('@vueuse/core')['useBattery']
115 | const useBluetooth: typeof import('@vueuse/core')['useBluetooth']
116 | const useBreakpoints: typeof import('@vueuse/core')['useBreakpoints']
117 | const useBroadcastChannel: typeof import('@vueuse/core')['useBroadcastChannel']
118 | const useBrowserLocation: typeof import('@vueuse/core')['useBrowserLocation']
119 | const useCached: typeof import('@vueuse/core')['useCached']
120 | const useClipboard: typeof import('@vueuse/core')['useClipboard']
121 | const useCloned: typeof import('@vueuse/core')['useCloned']
122 | const useColorMode: typeof import('@vueuse/core')['useColorMode']
123 | const useConfirmDialog: typeof import('@vueuse/core')['useConfirmDialog']
124 | const useCounter: typeof import('@vueuse/core')['useCounter']
125 | const useCssModule: typeof import('vue')['useCssModule']
126 | const useCssVar: typeof import('@vueuse/core')['useCssVar']
127 | const useCssVars: typeof import('vue')['useCssVars']
128 | const useCurrentElement: typeof import('@vueuse/core')['useCurrentElement']
129 | const useCycleList: typeof import('@vueuse/core')['useCycleList']
130 | const useDark: typeof import('@vueuse/core')['useDark']
131 | const useDateFormat: typeof import('@vueuse/core')['useDateFormat']
132 | const useDebounce: typeof import('@vueuse/core')['useDebounce']
133 | const useDebounceFn: typeof import('@vueuse/core')['useDebounceFn']
134 | const useDebouncedRefHistory: typeof import('@vueuse/core')['useDebouncedRefHistory']
135 | const useDeviceMotion: typeof import('@vueuse/core')['useDeviceMotion']
136 | const useDeviceOrientation: typeof import('@vueuse/core')['useDeviceOrientation']
137 | const useDevicePixelRatio: typeof import('@vueuse/core')['useDevicePixelRatio']
138 | const useDevicesList: typeof import('@vueuse/core')['useDevicesList']
139 | const useDisplayMedia: typeof import('@vueuse/core')['useDisplayMedia']
140 | const useDocumentVisibility: typeof import('@vueuse/core')['useDocumentVisibility']
141 | const useDraggable: typeof import('@vueuse/core')['useDraggable']
142 | const useDropZone: typeof import('@vueuse/core')['useDropZone']
143 | const useElementBounding: typeof import('@vueuse/core')['useElementBounding']
144 | const useElementByPoint: typeof import('@vueuse/core')['useElementByPoint']
145 | const useElementHover: typeof import('@vueuse/core')['useElementHover']
146 | const useElementSize: typeof import('@vueuse/core')['useElementSize']
147 | const useElementVisibility: typeof import('@vueuse/core')['useElementVisibility']
148 | const useEventBus: typeof import('@vueuse/core')['useEventBus']
149 | const useEventListener: typeof import('@vueuse/core')['useEventListener']
150 | const useEventSource: typeof import('@vueuse/core')['useEventSource']
151 | const useEyeDropper: typeof import('@vueuse/core')['useEyeDropper']
152 | const useFavicon: typeof import('@vueuse/core')['useFavicon']
153 | const useFetch: typeof import('@vueuse/core')['useFetch']
154 | const useFileDialog: typeof import('@vueuse/core')['useFileDialog']
155 | const useFileSystemAccess: typeof import('@vueuse/core')['useFileSystemAccess']
156 | const useFocus: typeof import('@vueuse/core')['useFocus']
157 | const useFocusWithin: typeof import('@vueuse/core')['useFocusWithin']
158 | const useFps: typeof import('@vueuse/core')['useFps']
159 | const useFullscreen: typeof import('@vueuse/core')['useFullscreen']
160 | const useGamepad: typeof import('@vueuse/core')['useGamepad']
161 | const useGeolocation: typeof import('@vueuse/core')['useGeolocation']
162 | const useHead: typeof import('@vueuse/head')['useHead']
163 | const useIdle: typeof import('@vueuse/core')['useIdle']
164 | const useImage: typeof import('@vueuse/core')['useImage']
165 | const useInfiniteScroll: typeof import('@vueuse/core')['useInfiniteScroll']
166 | const useIntersectionObserver: typeof import('@vueuse/core')['useIntersectionObserver']
167 | const useInterval: typeof import('@vueuse/core')['useInterval']
168 | const useIntervalFn: typeof import('@vueuse/core')['useIntervalFn']
169 | const useKeyModifier: typeof import('@vueuse/core')['useKeyModifier']
170 | const useLastChanged: typeof import('@vueuse/core')['useLastChanged']
171 | const useLink: typeof import('vue-router')['useLink']
172 | const useLocalStorage: typeof import('@vueuse/core')['useLocalStorage']
173 | const useMagicKeys: typeof import('@vueuse/core')['useMagicKeys']
174 | const useManualRefHistory: typeof import('@vueuse/core')['useManualRefHistory']
175 | const useMediaControls: typeof import('@vueuse/core')['useMediaControls']
176 | const useMediaQuery: typeof import('@vueuse/core')['useMediaQuery']
177 | const useMemoize: typeof import('@vueuse/core')['useMemoize']
178 | const useMemory: typeof import('@vueuse/core')['useMemory']
179 | const useMounted: typeof import('@vueuse/core')['useMounted']
180 | const useMouse: typeof import('@vueuse/core')['useMouse']
181 | const useMouseInElement: typeof import('@vueuse/core')['useMouseInElement']
182 | const useMousePressed: typeof import('@vueuse/core')['useMousePressed']
183 | const useMutationObserver: typeof import('@vueuse/core')['useMutationObserver']
184 | const useNavigatorLanguage: typeof import('@vueuse/core')['useNavigatorLanguage']
185 | const useNetwork: typeof import('@vueuse/core')['useNetwork']
186 | const useNow: typeof import('@vueuse/core')['useNow']
187 | const useObjectUrl: typeof import('@vueuse/core')['useObjectUrl']
188 | const useOffsetPagination: typeof import('@vueuse/core')['useOffsetPagination']
189 | const useOnline: typeof import('@vueuse/core')['useOnline']
190 | const usePageLeave: typeof import('@vueuse/core')['usePageLeave']
191 | const useParallax: typeof import('@vueuse/core')['useParallax']
192 | const usePermission: typeof import('@vueuse/core')['usePermission']
193 | const usePointer: typeof import('@vueuse/core')['usePointer']
194 | const usePointerSwipe: typeof import('@vueuse/core')['usePointerSwipe']
195 | const usePreferredColorScheme: typeof import('@vueuse/core')['usePreferredColorScheme']
196 | const usePreferredContrast: typeof import('@vueuse/core')['usePreferredContrast']
197 | const usePreferredDark: typeof import('@vueuse/core')['usePreferredDark']
198 | const usePreferredLanguages: typeof import('@vueuse/core')['usePreferredLanguages']
199 | const usePreferredReducedMotion: typeof import('@vueuse/core')['usePreferredReducedMotion']
200 | const useRafFn: typeof import('@vueuse/core')['useRafFn']
201 | const useRefHistory: typeof import('@vueuse/core')['useRefHistory']
202 | const useResizeObserver: typeof import('@vueuse/core')['useResizeObserver']
203 | const useRoute: typeof import('vue-router')['useRoute']
204 | const useRouter: typeof import('vue-router')['useRouter']
205 | const useScreenOrientation: typeof import('@vueuse/core')['useScreenOrientation']
206 | const useScreenSafeArea: typeof import('@vueuse/core')['useScreenSafeArea']
207 | const useScriptTag: typeof import('@vueuse/core')['useScriptTag']
208 | const useScroll: typeof import('@vueuse/core')['useScroll']
209 | const useScrollLock: typeof import('@vueuse/core')['useScrollLock']
210 | const useSessionStorage: typeof import('@vueuse/core')['useSessionStorage']
211 | const useShare: typeof import('@vueuse/core')['useShare']
212 | const useSlots: typeof import('vue')['useSlots']
213 | const useSorted: typeof import('@vueuse/core')['useSorted']
214 | const useSpeechRecognition: typeof import('@vueuse/core')['useSpeechRecognition']
215 | const useSpeechSynthesis: typeof import('@vueuse/core')['useSpeechSynthesis']
216 | const useStepper: typeof import('@vueuse/core')['useStepper']
217 | const useStorage: typeof import('@vueuse/core')['useStorage']
218 | const useStorageAsync: typeof import('@vueuse/core')['useStorageAsync']
219 | const useStyleTag: typeof import('@vueuse/core')['useStyleTag']
220 | const useSupported: typeof import('@vueuse/core')['useSupported']
221 | const useSwipe: typeof import('@vueuse/core')['useSwipe']
222 | const useTemplateRefsList: typeof import('@vueuse/core')['useTemplateRefsList']
223 | const useTextDirection: typeof import('@vueuse/core')['useTextDirection']
224 | const useTextSelection: typeof import('@vueuse/core')['useTextSelection']
225 | const useTextareaAutosize: typeof import('@vueuse/core')['useTextareaAutosize']
226 | const useThrottle: typeof import('@vueuse/core')['useThrottle']
227 | const useThrottleFn: typeof import('@vueuse/core')['useThrottleFn']
228 | const useThrottledRefHistory: typeof import('@vueuse/core')['useThrottledRefHistory']
229 | const useTimeAgo: typeof import('@vueuse/core')['useTimeAgo']
230 | const useTimeout: typeof import('@vueuse/core')['useTimeout']
231 | const useTimeoutFn: typeof import('@vueuse/core')['useTimeoutFn']
232 | const useTimeoutPoll: typeof import('@vueuse/core')['useTimeoutPoll']
233 | const useTimestamp: typeof import('@vueuse/core')['useTimestamp']
234 | const useTitle: typeof import('@vueuse/core')['useTitle']
235 | const useToNumber: typeof import('@vueuse/core')['useToNumber']
236 | const useToString: typeof import('@vueuse/core')['useToString']
237 | const useToggle: typeof import('@vueuse/core')['useToggle']
238 | const useTransition: typeof import('@vueuse/core')['useTransition']
239 | const useUrlSearchParams: typeof import('@vueuse/core')['useUrlSearchParams']
240 | const useUserMedia: typeof import('@vueuse/core')['useUserMedia']
241 | const useVModel: typeof import('@vueuse/core')['useVModel']
242 | const useVModels: typeof import('@vueuse/core')['useVModels']
243 | const useVibrate: typeof import('@vueuse/core')['useVibrate']
244 | const useVirtualList: typeof import('@vueuse/core')['useVirtualList']
245 | const useWakeLock: typeof import('@vueuse/core')['useWakeLock']
246 | const useWebNotification: typeof import('@vueuse/core')['useWebNotification']
247 | const useWebSocket: typeof import('@vueuse/core')['useWebSocket']
248 | const useWebWorker: typeof import('@vueuse/core')['useWebWorker']
249 | const useWebWorkerFn: typeof import('@vueuse/core')['useWebWorkerFn']
250 | const useWindowFocus: typeof import('@vueuse/core')['useWindowFocus']
251 | const useWindowScroll: typeof import('@vueuse/core')['useWindowScroll']
252 | const useWindowSize: typeof import('@vueuse/core')['useWindowSize']
253 | const watch: typeof import('vue')['watch']
254 | const watchArray: typeof import('@vueuse/core')['watchArray']
255 | const watchAtMost: typeof import('@vueuse/core')['watchAtMost']
256 | const watchDebounced: typeof import('@vueuse/core')['watchDebounced']
257 | const watchEffect: typeof import('vue')['watchEffect']
258 | const watchIgnorable: typeof import('@vueuse/core')['watchIgnorable']
259 | const watchOnce: typeof import('@vueuse/core')['watchOnce']
260 | const watchPausable: typeof import('@vueuse/core')['watchPausable']
261 | const watchPostEffect: typeof import('vue')['watchPostEffect']
262 | const watchSyncEffect: typeof import('vue')['watchSyncEffect']
263 | const watchThrottled: typeof import('@vueuse/core')['watchThrottled']
264 | const watchTriggerable: typeof import('@vueuse/core')['watchTriggerable']
265 | const watchWithFilter: typeof import('@vueuse/core')['watchWithFilter']
266 | const whenever: typeof import('@vueuse/core')['whenever']
267 | }
268 |
--------------------------------------------------------------------------------