├── .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 | 6 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 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 | 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 | 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 | 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 | [![MIT License](https://img.shields.io/apm/l/atomic-design-ui.svg?)](https://github.com/tterb/atomic-design-ui/blob/master/LICENSEs) 2 | ![GitHub Repo stars](https://img.shields.io/github/stars/hasan-almujtaba/vue-starter) 3 | ![GitHub forks](https://img.shields.io/github/forks/hasan-almujtaba/vue-starter) 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 | 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 | --------------------------------------------------------------------------------