├── env.d.ts ├── .vscode └── extensions.json ├── tsconfig.json ├── src ├── assets │ ├── main.css │ ├── logo.svg │ ├── plus.svg │ ├── vite.svg │ └── base.css ├── main.ts ├── views │ ├── AboutView.vue │ └── HomeView.vue ├── router │ └── index.ts ├── App.vue └── components │ └── Card.vue ├── tsconfig.node.json ├── tsconfig.app.json ├── index.html ├── .gitignore ├── vite.config.ts ├── package.json ├── public └── favicon.ico └── README.md /env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"] 3 | } 4 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [ 4 | { 5 | "path": "./tsconfig.node.json" 6 | }, 7 | { 8 | "path": "./tsconfig.app.json" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /src/assets/main.css: -------------------------------------------------------------------------------- 1 | @import './base.css'; 2 | 3 | #app { 4 | max-width: 1280px; 5 | margin: 0 auto; 6 | padding: 2rem; 7 | font-weight: normal; 8 | display: flex; 9 | flex-direction: column; 10 | gap: 2rem; 11 | } 12 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import './assets/main.css' 2 | 3 | import { createApp } from 'vue' 4 | import App from './App.vue' 5 | import router from './router' 6 | 7 | const app = createApp(App) 8 | 9 | app.use(router) 10 | 11 | app.mount('#app') 12 | -------------------------------------------------------------------------------- /src/assets/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@tsconfig/node18/tsconfig.json", 3 | "include": ["vite.config.*", "vitest.config.*", "cypress.config.*", "playwright.config.*"], 4 | "compilerOptions": { 5 | "composite": true, 6 | "module": "ESNext", 7 | "types": ["node"] 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/views/AboutView.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 16 | -------------------------------------------------------------------------------- /tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@vue/tsconfig/tsconfig.dom.json", 3 | "include": ["env.d.ts", "src/**/*", "src/**/*.vue"], 4 | "exclude": ["src/**/__tests__/*"], 5 | "compilerOptions": { 6 | "composite": true, 7 | "baseUrl": ".", 8 | "paths": { 9 | "@/*": ["./src/*"] 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite App 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | .DS_Store 12 | dist 13 | dist-ssr 14 | coverage 15 | *.local 16 | 17 | /cypress/videos/ 18 | /cypress/screenshots/ 19 | 20 | # Editor directories and files 21 | .vscode/* 22 | !.vscode/extensions.json 23 | .idea 24 | *.suo 25 | *.ntvs* 26 | *.njsproj 27 | *.sln 28 | *.sw? 29 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { fileURLToPath, URL } from 'node:url' 2 | 3 | import { defineConfig } from 'vite' 4 | import vue from '@vitejs/plugin-vue' 5 | import vueJsx from '@vitejs/plugin-vue-jsx' 6 | 7 | // https://vitejs.dev/config/ 8 | export default defineConfig({ 9 | plugins: [vue(), vueJsx()], 10 | resolve: { 11 | alias: { 12 | '@': fileURLToPath(new URL('./src', import.meta.url)) 13 | } 14 | }, 15 | base: './', 16 | }) 17 | -------------------------------------------------------------------------------- /src/assets/plus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/router/index.ts: -------------------------------------------------------------------------------- 1 | import { createRouter, createWebHashHistory } from 'vue-router' 2 | import HomeView from '../views/HomeView.vue' 3 | 4 | const router = createRouter({ 5 | history: createWebHashHistory(import.meta.env.BASE_URL), 6 | routes: [ 7 | { 8 | path: '/', 9 | name: 'home', 10 | component: HomeView 11 | }, 12 | { 13 | path: '/about', 14 | name: 'about', 15 | // route level code-splitting 16 | // this generates a separate chunk (About.[hash].js) for this route 17 | // which is lazy-loaded when the route is visited. 18 | component: () => import('../views/AboutView.vue') 19 | } 20 | ] 21 | }) 22 | 23 | export default router 24 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-template", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "vite", 7 | "build": "run-p type-check build-only", 8 | "preview": "vite preview", 9 | "build-only": "vite build", 10 | "type-check": "vue-tsc --noEmit -p tsconfig.app.json --composite false" 11 | }, 12 | "dependencies": { 13 | "vue": "^3.3.2", 14 | "vue-router": "^4.2.0" 15 | }, 16 | "devDependencies": { 17 | "@tsconfig/node18": "^2.0.1", 18 | "@types/node": "^18.16.8", 19 | "@vitejs/plugin-vue": "^4.2.3", 20 | "@vitejs/plugin-vue-jsx": "^3.0.1", 21 | "@vue/tsconfig": "^0.4.0", 22 | "npm-run-all": "^4.1.5", 23 | "typescript": "~5.0.4", 24 | "vite": "^4.3.5", 25 | "vue-tsc": "^1.6.4" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 20 | 21 | 48 | -------------------------------------------------------------------------------- /src/components/Card.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 28 | 29 | 69 | -------------------------------------------------------------------------------- /src/assets/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/views/HomeView.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 28 | 29 | 46 | -------------------------------------------------------------------------------- /src/assets/base.css: -------------------------------------------------------------------------------- 1 | /* color palette from */ 2 | :root { 3 | --vt-c-white: #ffffff; 4 | --vt-c-white-soft: #f8f8f8; 5 | --vt-c-white-mute: #f2f2f2; 6 | 7 | --vt-c-black: #181818; 8 | --vt-c-black-soft: #222222; 9 | --vt-c-black-mute: #282828; 10 | 11 | --vt-c-indigo: #2c3e50; 12 | 13 | --vt-c-divider-light-1: rgba(60, 60, 60, 0.29); 14 | --vt-c-divider-light-2: rgba(60, 60, 60, 0.12); 15 | --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65); 16 | --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48); 17 | 18 | --vt-c-text-light-1: var(--vt-c-indigo); 19 | --vt-c-text-light-2: rgba(60, 60, 60, 0.66); 20 | --vt-c-text-dark-1: var(--vt-c-white); 21 | --vt-c-text-dark-2: rgba(235, 235, 235, 0.64); 22 | } 23 | 24 | /* semantic color variables for this project */ 25 | :root { 26 | --color-background: var(--vt-c-white); 27 | --color-background-soft: var(--vt-c-white-soft); 28 | --color-background-mute: var(--vt-c-white-mute); 29 | 30 | --color-border: var(--vt-c-divider-light-2); 31 | --color-border-hover: var(--vt-c-divider-light-1); 32 | 33 | --color-heading: var(--vt-c-text-light-1); 34 | --color-text: var(--vt-c-text-light-1); 35 | 36 | --section-gap: 160px; 37 | } 38 | 39 | @media (prefers-color-scheme: dark) { 40 | :root { 41 | --color-background: var(--vt-c-black); 42 | --color-background-soft: var(--vt-c-black-soft); 43 | --color-background-mute: var(--vt-c-black-mute); 44 | 45 | --color-border: var(--vt-c-divider-dark-2); 46 | --color-border-hover: var(--vt-c-divider-dark-1); 47 | 48 | --color-heading: var(--vt-c-text-dark-1); 49 | --color-text: var(--vt-c-text-dark-2); 50 | } 51 | } 52 | 53 | *, 54 | *::before, 55 | *::after { 56 | box-sizing: border-box; 57 | margin: 0; 58 | font-weight: normal; 59 | } 60 | 61 | body { 62 | min-height: 100vh; 63 | color: var(--color-text); 64 | background: var(--color-background); 65 | transition: color 0.5s, background-color 0.5s; 66 | line-height: 1.6; 67 | font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, 68 | Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; 69 | font-size: 15px; 70 | text-rendering: optimizeLegibility; 71 | -webkit-font-smoothing: antialiased; 72 | -moz-osx-font-smoothing: grayscale; 73 | } 74 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- 1 |   �( @ ��A��A��A��A��A��A��A3��A3��A��A��A��A ��A���A���A ��A��A��A��AZ��A���A���AZ��A��A��A��A��AɃ�A���A���AɃ�A��A��A��A��Az��A���A���A���A���Az��A��A��A��A��A.��A߃�A���A���A���A���A߃�A.��A��A��A��A��A���A���A���A���A���A���A���A���A��A��A��A��AH��A���A���A���A���A���A���A���A���AH��A��A��A��A��A���A���A���A���A���A���A���A���A���A���A��A��A��A��Af��A���A���A���A���A���A���A���A���A���A���Af��A��A��A��A ��A҃�A���A���A���A���A���A���A���A���A���A���A҃�A ��A��A��A��A���A���A���A���A���A�|�?�|�?���A���A���A���A���A���A���A��A��A��A��A7��A惸A���A���A���A���A�jl9�jl9���A���A���A���A���A���A惸A7��A��A��A��A ��A���A���A���A���A���A�w�=�_L5�_L5�w�=���A���A���A���A���A���A���A ��A��A��A��AR��A���A���A���A���A���@�fa8�^H5�^H5�fa8���@���A���A���A���A���A���AR��A��A��A��A��Aƒ�A���A���A���A���A�r�<�^I5�^I5�^I5�^I5�r�<���A���A���A���A���A���Aƒ�A��A��A��A��Aq��A���A���A���A���A�}�?�cW7�^H5�^I5�^I5�^H5�cW7�}�?���A���A���A���A���A���Aq��A��A��A��A(��Aڃ�A���A���A���A���A�mv:�^H5�^I5�^I5�^I5�^I5�^H5�mv:���A���A���A���A���A���Aڃ�A(��A��A��A��A���A���A���A���A���A�y�>�`P6�^H5�^I5�^I5�^I5�^I5�^H5�`P6�y�>���A���A���A���A���A���A���A��A��A��A��A@��A샸A���A���A���A���@�ii9�]G5�^I5�^I5�^I5�^I5�^I5�^I5�]G5�ii9���@���A���A���A���A���A샸A@��A��A��A��A ��A���A���A���A���A���A�u�=�_K5�^I5�^I5�^I5�^I5�^I5�^I5�^I5�^I5�_K5�u�=���A���A���A���A���A���A���A ��A��A��A��A]��A���A���A���A���A��@�e]7�^H5�^I5�^I5�^I5�^J5�^J5�^I5�^I5�^I5�^H5�e]7��@���A���A���A���A���A���A]��A��A��A��A��Ã�A���A���A���A���A�p;�^I5�^I5�^I5�^I5�^I5�_L5n_L5n^I5�^I5�^I5�^I5�^I5�p;���A���A���A���A���A���Ã�A��A��A��A��A}��A���A���A���A���A�|�?�bT6�^H5�^I5�^I5�^I5�_J5�aP6aP6_J5�^I5�^I5�^I5�^H5�bT6�|�?���A���A���A���A���A���A}��A��A��A��A/��AჸA���A���A���A���A�lq9�^H5�^I5�^I5�^I5�^I5�_L5P^H5^H5_L5P^I5�^I5�^I5�^I5�^H5�lq9���A���A���A���A���A���AჸA/��A��A��A���A���A���A���A���A�x�=�`N6�^I5�^I5�^I5�^I5�_K5�bT7aQ6aQ6bT7_K5�^I5�^I5�^I5�^I5�`N6�x�=���A���A���A���A���A���A���A��AW��A���A���A���A���A���@�gd8�^H5�^I5�^I5�^I5�^J5�`M65_K5jf9jf9_K5`M65^J5�^I5�^I5�^I5�^H5�gd8���@���A���A���A���A���A���AW��A���Aȃ�Aƃ�Aƃ�AƄ�A�v�=�_K5�^I5�^I5�^I5�^I5�_K5uha9bS7bS7ha9_K5u^I5�^I5�^I5�^I5�_K5�v�=Ƅ�Aƃ�Aƃ�Aƃ�Aƃ�Aȃ�A���A��A ��A ��A ��A ��A lr: \D4 ^I5 ^I5 ^I5 ^I5 `M6^H5^H5`M6^I5 ^I5 ^I5 ^I5 \D4 lr9 ��A ��A ��A ��A ��A ��A�������������?���?��������������������������������?�?����������������� -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Vue + Fleek Starter Kit 2 | 3 | ![image](https://github.com/fleekxyz/vue-template/assets/55561695/aae35d6b-7c60-4e55-a6dc-987cb24df978) 4 | 5 | ## 🚀 Project Structure 6 | 7 | Inside of your Vue project, you'll see the following folders and files: 8 | 9 | ``` 10 | / 11 | ├── public/ 12 | │ └── favicon.svg 13 | ├── src/ 14 | │ ├── assets/ 15 | │ ├── components/ 16 | │ ├── router/ 17 | │ ├── views/ 18 | │ ├── App.vue 19 | │ └── main.ts 20 | ├── index.html 21 | ├── env.d.ts 22 | ├── tsconfig.json 23 | ├── vite.config.ts 24 | └── package.json 25 | ``` 26 | 27 | If you want to lern more about `vue` you can checkout the official [Vue Documentation](https://vuejs.org/guide/introduction.html). 28 | 29 | 30 | ## 🧞 Commands 31 | 32 | All commands are run from the root of the project, from a terminal: 33 | 34 | | Command | Action | 35 | | :--------------------- | :----------------------------------------------- | 36 | | `pnpm install` | Installs dependencies | 37 | | `pnpm run dev` | Starts local dev server at `localhost:5173` | 38 | | `pnpm run build` | Build your production site to `./dist/` | 39 | | `pnpm run preview` | Preview your build locally, before deploying | 40 | | `pnpm run build-only` | Build your production site without running typechecks | 41 | | `pnpm run type-check` | Run the typecheck | 42 | 43 | ## ⚡ How to deploy to Fleek 44 | 45 | ### 1. Create a `fleek.json` config file: 46 | You can configure this site deployment using [Fleek CLI]() and running: 47 | ``` 48 | > fleek sites init 49 | WARN! Fleek CLI is in beta phase, use it under your own responsibility 50 | ? Choose one of the existing sites or create a new one. › 51 | ❯ Create a new site 52 | ``` 53 | It will prompt you for a `name`, `dist` directory location & `build command` 54 | - `name`: How you want to name the site 55 | - `dist`: The output directory where the site is located, for this template it's `dist` 56 | - `build command`: Command to build your site, this will be used to deploy the latest version either by CLI or Github Actions 57 | 58 | ### 2. Deploy the site 59 | After configuiring your `fleek.json` file, you can deployt the site by running 60 | 61 | ``` 62 | fleek sites deploy 63 | ``` 64 | After running it you will get an output like this: 65 | ``` 66 | WARN! Fleek CLI is in beta, use it at your own discretion 67 | > Success! Deployed! 68 | > Site IPFS CID: Qmbv2NT91iPkXaoim5CSwdR8MLEoquRPcsdZncZ5QaxAqn 69 | 70 | > You can visit through the gateway: 71 | > https://ipfs.io/ipfs/Qmbv2NT91iPkXaoim5CSwdR8MLEoquRPcsdZncZ5QaxAqn 72 | ``` 73 | 74 | ### Extra features 75 | - **Continuous Integration (CI):** `fleek sites ci` [Documentation.](https://docs.fleek.xyz/services/sites/#continuous-integration-ci) 76 | - **Adding custom domains:** `fleek domains create` [Documentation.](https://docs.fleek.xyz/services/domains/) 77 | 78 | 79 | ### Keep in mind: 80 | 81 | This template has been configured to produce a static output. 82 | 83 | ```js 84 | // vite.config.ts 85 | 86 | import { fileURLToPath, URL } from 'node:url' 87 | 88 | import { defineConfig } from 'vite' 89 | import vue from '@vitejs/plugin-vue' 90 | import vueJsx from '@vitejs/plugin-vue-jsx' 91 | 92 | // https://vitejs.dev/config/ 93 | export default defineConfig({ 94 | plugins: [vue(), vueJsx()], 95 | resolve: { 96 | alias: { 97 | '@': fileURLToPath(new URL('./src', import.meta.url)) 98 | } 99 | }, 100 | base: './', 101 | }) 102 | ``` 103 | 104 | This means that assets will be pre-fixed with `./`, you can learn more about it in [Vite Documentation](https://vitejs.dev/config/shared-options.html#base) 105 | 106 | To avoid routing issues when we deploy our site to IPFS, we'll use `Hash routing` 107 | ```js 108 | import { createRouter, createWebHashHistory } from 'vue-router' 109 | import HomeView from '../views/HomeView.vue' 110 | 111 | const router = createRouter({ 112 | history: createWebHashHistory(import.meta.env.BASE_URL), 113 | routes: [ 114 | { 115 | path: '/', 116 | name: 'home', 117 | component: HomeView 118 | }, 119 | { 120 | path: '/about', 121 | name: 'about', 122 | // route level code-splitting 123 | // this generates a separate chunk (About.[hash].js) for this route 124 | // which is lazy-loaded when the route is visited. 125 | component: () => import('../views/AboutView.vue') 126 | } 127 | ] 128 | }) 129 | 130 | export default router 131 | ``` 132 | 133 | 134 | 135 | ## 👀 Want to learn more? 136 | 137 | Feel free to check [Fleek Documentation](https://docs.fleek.xyz/) & [Vue Documentation](https://vuejs.org/guide/introduction.html). 138 | --------------------------------------------------------------------------------