chore: init
This commit is contained in:
commit
76fb0845ec
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
node_modules
|
||||||
|
.DS_Store
|
||||||
|
dist
|
||||||
|
*.local
|
22
LICENSE
Normal file
22
LICENSE
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
// as this is a project template, free feel to it change to your name.
|
||||||
|
Copyright (c) 2020 Anthony Fu
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
56
README.md
Normal file
56
README.md
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
<h1 align='center'><samp>Vitesse</samp></h1>
|
||||||
|
|
||||||
|
<p align='center'>
|
||||||
|
<samp>Opinionated <a href="https://github.com/vitejs/vite">Vite</a> Starter Template</samp>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align='center'>
|
||||||
|
<sup><em>Mocking up web app with <b>⚡️vitesse</b></em></sup>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<p align='center'>
|
||||||
|
<a href="https://vitesse.netilfy.app">Live Example</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
## Pre-packed
|
||||||
|
|
||||||
|
### UI Frameworks
|
||||||
|
|
||||||
|
- [Tailwind CSS](https://tailwindcss.com/)
|
||||||
|
- [tailwindcss-dark-mode](https://github.com/ChanceArthur/tailwindcss-dark-mode)
|
||||||
|
- [Iconify](https://iconify.design) - use icons from your favorite sets. [🔍Icônes](https://icones.netlify.app/)
|
||||||
|
<!-- - [variantwind](https://github.com/sibbngheid/variantwind) -->
|
||||||
|
|
||||||
|
### Router
|
||||||
|
|
||||||
|
- [Vue Router](https://github.com/vuejs/vue-router)
|
||||||
|
- [Voie](https://github.com/vamplate/vite-plugin-voie) - file based routing
|
||||||
|
|
||||||
|
### Utils
|
||||||
|
|
||||||
|
- [VueUse](https://github.com/antfu/vueuse)
|
||||||
|
|
||||||
|
### Misc
|
||||||
|
|
||||||
|
- Use Composition API with [`<script setup>` SFC](https://github.com/vuejs/rfcs/blob/sfc-improvements/active-rfcs/0000-sfc-script-setup.md)
|
||||||
|
|
||||||
|
### Dev tools
|
||||||
|
|
||||||
|
- [Typescript](https://www.typescriptlang.org/)
|
||||||
|
- [pnpm](https://pnpm.js.org/)
|
||||||
|
- [Netlify](https://www.netlify.com/)
|
||||||
|
- [ESLint](https://eslint.org/) with [@antfu/eslint-config-vue](https://github.com/antfu/eslint-config)
|
||||||
|
|
||||||
|
## Use It!
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/antfu/vite-starter && cd vite-starter && rm -rf .git && git init && pnpm i
|
||||||
|
```
|
||||||
|
|
||||||
|
## Why
|
||||||
|
|
||||||
|
I have created several Vite apps recently. Setting the configs up is kinda the bottleneck for me to make the idea simply comes true in very a short time. So I made this starter template for myself to create apps more easily, along with some good practices that I have learned during making those apps. It's strongly opinionated, but feel free to tweak it or even maintains your own forks.
|
14
index.html
Normal file
14
index.html
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<link rel="icon" href="/favicon.svg" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Vitesse</title>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/@iconify/iconify@1.0.7/dist/iconify.min.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="app"></div>
|
||||||
|
<script type="module" src="/src/main.ts"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
12
netlify.toml
Executable file
12
netlify.toml
Executable file
@ -0,0 +1,12 @@
|
|||||||
|
[build.environment]
|
||||||
|
# to disable npm auto install. see https://community.netlify.com/t/using-pnpm-and-pnpm-workspaces/2759
|
||||||
|
NPM_FLAGS="--prefix=/"
|
||||||
|
|
||||||
|
[build]
|
||||||
|
publish = "dist"
|
||||||
|
command = "npx pnpm i && npm run build"
|
||||||
|
|
||||||
|
[[redirects]]
|
||||||
|
from = "/*"
|
||||||
|
to = "/index.html"
|
||||||
|
status = 200
|
34
package.json
Normal file
34
package.json
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
{
|
||||||
|
"name": "@vitesse/template",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"dev": "vite",
|
||||||
|
"build": "vite build"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@iconify/core": "^1.0.0-beta.3",
|
||||||
|
"@vueuse/core": "^4.0.0-beta.4",
|
||||||
|
"variantwind": "^0.3.4",
|
||||||
|
"vue": "^3.0.0-rc.1",
|
||||||
|
"vue-router": "^4.0.0-beta.6"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@antfu/eslint-config-vue": "^0.2.14",
|
||||||
|
"@typescript-eslint/eslint-plugin": "^3.8.0",
|
||||||
|
"@vue/compiler-sfc": "^3.0.0-rc.5",
|
||||||
|
"eslint": "^7.6.0",
|
||||||
|
"pnpm": "^5.4.12",
|
||||||
|
"tailwindcss": "^1.6.2",
|
||||||
|
"tailwindcss-dark-mode": "^1.1.6",
|
||||||
|
"typescript": "^3.9.7",
|
||||||
|
"vite": "^1.0.0-rc.1",
|
||||||
|
"vite-plugin-voie": "^0.2.0"
|
||||||
|
},
|
||||||
|
"eslintConfig": {
|
||||||
|
"extends": "@antfu/eslint-config-vue",
|
||||||
|
"rules": {
|
||||||
|
"import/no-absolute-path": "off"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
3913
pnpm-lock.yaml
generated
Normal file
3913
pnpm-lock.yaml
generated
Normal file
File diff suppressed because it is too large
Load Diff
6
postcss.config.js
Normal file
6
postcss.config.js
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
module.exports = {
|
||||||
|
plugins: [
|
||||||
|
require('tailwindcss'),
|
||||||
|
require('autoprefixer'),
|
||||||
|
],
|
||||||
|
}
|
6
public/favicon.svg
Normal file
6
public/favicon.svg
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32"
|
||||||
|
preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32">
|
||||||
|
<path
|
||||||
|
d="M27.562 26L17.17 8.928l2.366-3.888L17.828 4L16 7.005L14.17 4l-1.708 1.04l2.366 3.888L4.438 26H2v2h28v-2zM16 10.85L25.22 26H17v-8h-2v8H6.78z"
|
||||||
|
fill="#fff" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 346 B |
6
src/App.vue
Normal file
6
src/App.vue
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<template>
|
||||||
|
<div class="px-4 py-10 text-center text-gray-700 dark:text-gray-200">
|
||||||
|
<router-view />
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
</template>
|
31
src/components/Footer.vue
Normal file
31
src/components/Footer.vue
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
|
||||||
|
<template>
|
||||||
|
<div
|
||||||
|
class="text-xl mt-4"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="inline-block mx-2 cursor-pointer select-none"
|
||||||
|
@click="isDark = !isDark"
|
||||||
|
>
|
||||||
|
<Icon
|
||||||
|
class="inline-block"
|
||||||
|
:icon="isDark ? 'carbon:moon' : 'carbon:sun'"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<a
|
||||||
|
class="mx-2"
|
||||||
|
href="https://github.com/antfu/vitesse"
|
||||||
|
target="_blank"
|
||||||
|
>
|
||||||
|
<Icon
|
||||||
|
class="inline-block"
|
||||||
|
icon="carbon:code"
|
||||||
|
/>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang='ts'>
|
||||||
|
export { isDark } from '../utils/dark'
|
||||||
|
</script>
|
49
src/components/Icon.vue
Normal file
49
src/components/Icon.vue
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
<template>
|
||||||
|
<div ref="el" :class="$attrs.class" style="vertical-align: text-bottom" />
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup="props" lang="ts">
|
||||||
|
import { watch, ref, onMounted, nextTick } from 'vue'
|
||||||
|
|
||||||
|
declare const props: {
|
||||||
|
icon: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export const el = ref<HTMLElement | null>(null)
|
||||||
|
|
||||||
|
const update = async() => {
|
||||||
|
if (el.value) {
|
||||||
|
await nextTick()
|
||||||
|
// @ts-ignore
|
||||||
|
const data = window.Iconify.getSVGObject(props.icon)
|
||||||
|
if (data) {
|
||||||
|
const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')
|
||||||
|
for (const key of Object.keys(data.attributes))
|
||||||
|
svg.setAttribute(key, data.attributes[key])
|
||||||
|
svg.innerHTML = data ? data.body : null
|
||||||
|
el.value.textContent = ''
|
||||||
|
el.value.appendChild(svg)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const span = document.createElement('span')
|
||||||
|
span.className = 'iconify'
|
||||||
|
span.dataset.icon = props.icon
|
||||||
|
el.value.textContent = ''
|
||||||
|
el.value.appendChild(span)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
watch(() => props.icon, update, { flush: 'post' })
|
||||||
|
|
||||||
|
onMounted(update)
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
span.iconify {
|
||||||
|
background: #5551;
|
||||||
|
border-radius: 100%;
|
||||||
|
min-width: 10px;
|
||||||
|
min-height: 1em;
|
||||||
|
}
|
||||||
|
</style>
|
56
src/components/Modal.vue
Normal file
56
src/components/Modal.vue
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
<template>
|
||||||
|
<div
|
||||||
|
class="fixed top-0 bottom-0 left-0 right-0 z-40"
|
||||||
|
:class="value ? '': 'pointer-events-none'"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="bg-white bg-opacity-85 bottom-0 left-0 right-0 top-0 absolute transition-opacity duration-500 ease-out"
|
||||||
|
:class="value ? '': 'opacity-0'"
|
||||||
|
@click="$emit('update:value', false)"
|
||||||
|
/>
|
||||||
|
<div
|
||||||
|
class="bg-white absolute transition-all duration-200 ease-out border-gray-200"
|
||||||
|
:class="positionClass"
|
||||||
|
:style="value ? {}: {transform}"
|
||||||
|
>
|
||||||
|
<slot />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup="props" lang="ts">
|
||||||
|
import { computed } from 'vue'
|
||||||
|
|
||||||
|
declare const props: {
|
||||||
|
value?: boolean
|
||||||
|
direction?: 'bottom' | 'top' | 'left' | 'right'
|
||||||
|
}
|
||||||
|
|
||||||
|
const defaultDirection = 'bottom'
|
||||||
|
|
||||||
|
export const positionClass = computed(() => {
|
||||||
|
switch (props.direction || defaultDirection) {
|
||||||
|
case 'bottom':
|
||||||
|
return 'bottom-0 left-0 right-0 border-t'
|
||||||
|
case 'top':
|
||||||
|
return 'top-0 left-0 right-0 border-b'
|
||||||
|
case 'left':
|
||||||
|
return 'bottom-0 left-0 top-0 border-r'
|
||||||
|
case 'right':
|
||||||
|
return 'bottom-0 top-0 right-0 border-l'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
export const transform = computed(() => {
|
||||||
|
switch (props.direction || defaultDirection) {
|
||||||
|
case 'bottom':
|
||||||
|
return 'translateY(100%)'
|
||||||
|
case 'top':
|
||||||
|
return 'translateY(-100%)'
|
||||||
|
case 'left':
|
||||||
|
return 'translateX(-100%)'
|
||||||
|
case 'right':
|
||||||
|
return 'translateX(100%)'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
12
src/components/index.ts
Normal file
12
src/components/index.ts
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
import { Plugin } from 'vue'
|
||||||
|
import Modal from './Modal.vue'
|
||||||
|
import Icon from './Icon.vue'
|
||||||
|
import Footer from './Footer.vue'
|
||||||
|
|
||||||
|
export const registerComponents: Plugin = {
|
||||||
|
install(app) {
|
||||||
|
app.component('Modal', Modal)
|
||||||
|
app.component('Icon', Icon)
|
||||||
|
app.component('Footer', Footer)
|
||||||
|
},
|
||||||
|
}
|
26
src/main.postcss
Executable file
26
src/main.postcss
Executable file
@ -0,0 +1,26 @@
|
|||||||
|
@import 'tailwindcss/base';
|
||||||
|
@import 'tailwindcss/components';
|
||||||
|
@import 'tailwindcss/utilities';
|
||||||
|
|
||||||
|
html, body, #app {
|
||||||
|
height: 100vh;
|
||||||
|
width: 100vw;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.schema-dark {
|
||||||
|
background: #222;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn {
|
||||||
|
@apply px-4 py-1 rounded bg-teal-600 inline-block text-white cursor-pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn:hover {
|
||||||
|
@apply bg-teal-700;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn[disabled] {
|
||||||
|
@apply cursor-default bg-gray-600 opacity-50;
|
||||||
|
}
|
18
src/main.ts
Normal file
18
src/main.ts
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import './main.postcss'
|
||||||
|
import { createApp } from 'vue'
|
||||||
|
import { createRouter, createWebHistory } from 'vue-router'
|
||||||
|
// @ts-ignore
|
||||||
|
import routes from '/@voie/pages'
|
||||||
|
import { registerComponents } from './components'
|
||||||
|
import App from './App.vue'
|
||||||
|
|
||||||
|
const app = createApp(App)
|
||||||
|
const router = createRouter({
|
||||||
|
history: createWebHistory(),
|
||||||
|
routes,
|
||||||
|
})
|
||||||
|
|
||||||
|
app.use(router)
|
||||||
|
app.use(registerComponents)
|
||||||
|
|
||||||
|
app.mount('#app')
|
31
src/pages/hi/[name].vue
Normal file
31
src/pages/hi/[name].vue
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<p class="text-4xl">
|
||||||
|
<Icon class="iconify inline-block" icon="carbon:pedestrian" />
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Hi, {{ name }}!
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<button
|
||||||
|
class="btn m-3 text-sm mt-8"
|
||||||
|
@click="back"
|
||||||
|
>
|
||||||
|
Back
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup='props' lang='ts'>
|
||||||
|
import { useRouter } from 'vue-router'
|
||||||
|
|
||||||
|
declare const props: {
|
||||||
|
name: string
|
||||||
|
}
|
||||||
|
|
||||||
|
const router = useRouter()
|
||||||
|
export const back = () => router.push('/')
|
||||||
|
</script>
|
43
src/pages/index.vue
Normal file
43
src/pages/index.vue
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<p class="text-4xl">
|
||||||
|
<Icon class="iconify inline-block" icon="carbon:campsite" />
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Vitesse
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="py-4" />
|
||||||
|
|
||||||
|
<input
|
||||||
|
v-model="name"
|
||||||
|
placeholder="What's your name?"
|
||||||
|
class="px-4 py-2 border border-gray-200 rounded text-center outline-none active:outline-none bg-transparent dark:border-gray-700"
|
||||||
|
@keydown.enter="go"
|
||||||
|
>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<button
|
||||||
|
class="btn m-3 text-sm"
|
||||||
|
:disabled="!name"
|
||||||
|
@click="go"
|
||||||
|
>
|
||||||
|
GO
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup='props' lang='ts'>
|
||||||
|
import { ref } from 'vue'
|
||||||
|
import { useRouter } from 'vue-router'
|
||||||
|
|
||||||
|
export const name = ref('')
|
||||||
|
|
||||||
|
const router = useRouter()
|
||||||
|
export const go = () => {
|
||||||
|
if (name.value)
|
||||||
|
router.push(`/hi/${name.value}`)
|
||||||
|
}
|
||||||
|
</script>
|
5
src/shims-vue.d.ts
vendored
Normal file
5
src/shims-vue.d.ts
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
declare module '*.vue' {
|
||||||
|
import { defineComponent } from 'vue'
|
||||||
|
const Component: ReturnType<typeof defineComponent>
|
||||||
|
export default Component
|
||||||
|
}
|
26
src/utils/dark.ts
Normal file
26
src/utils/dark.ts
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
import { watch, computed, Ref } from 'vue'
|
||||||
|
import { useStorage, usePreferredDark } from '@vueuse/core'
|
||||||
|
|
||||||
|
const preferredDark = usePreferredDark()
|
||||||
|
const schema = useStorage('vitesse-schema', 'auto') as Ref<'auto' | 'dark' | 'light'>
|
||||||
|
|
||||||
|
export const isDark = computed({
|
||||||
|
get() {
|
||||||
|
return schema.value === 'auto' ? preferredDark.value : schema.value === 'dark'
|
||||||
|
},
|
||||||
|
set(v: boolean) {
|
||||||
|
if (v === preferredDark.value)
|
||||||
|
schema.value = 'auto'
|
||||||
|
else
|
||||||
|
schema.value = v ? 'dark' : 'light'
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
watch(
|
||||||
|
isDark,
|
||||||
|
(v) => {
|
||||||
|
const html = document.getElementsByTagName('html')[0]
|
||||||
|
html.classList.toggle('schema-dark', v)
|
||||||
|
},
|
||||||
|
{ immediate: true },
|
||||||
|
)
|
3
src/window.d.ts
vendored
Normal file
3
src/window.d.ts
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
declare interface Window {
|
||||||
|
// extend the window
|
||||||
|
}
|
32
tailwind.config.js
Normal file
32
tailwind.config.js
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/* eslint-disable @typescript-eslint/no-var-requires */
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
purge: {
|
||||||
|
content: [
|
||||||
|
'./index.html',
|
||||||
|
'./src/**/*.vue',
|
||||||
|
'./src/**/*.js',
|
||||||
|
'./src/**/*.ts',
|
||||||
|
],
|
||||||
|
whitelist: [
|
||||||
|
'schema-dark',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
theme: {
|
||||||
|
darkSelector: '.schema-dark',
|
||||||
|
extend: {
|
||||||
|
opacity: {
|
||||||
|
10: '0.1',
|
||||||
|
85: '0.85',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
variants: {
|
||||||
|
backgroundColor: ['dark', 'dark-hover', 'dark-group-hover', 'hover'],
|
||||||
|
borderColor: ['dark', 'dark-disabled', 'dark-focus', 'dark-active'],
|
||||||
|
textColor: ['dark', 'dark-hover', 'dark-active', 'hover', 'active'],
|
||||||
|
},
|
||||||
|
plugins: [
|
||||||
|
require('tailwindcss-dark-mode')(),
|
||||||
|
],
|
||||||
|
}
|
18
tsconfig.json
Normal file
18
tsconfig.json
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"module": "ESNext",
|
||||||
|
"target": "es2016",
|
||||||
|
"lib": ["DOM", "ESNext"],
|
||||||
|
"strict": true,
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"incremental": true,
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"moduleResolution": "node",
|
||||||
|
"resolveJsonModule": true,
|
||||||
|
"forceConsistentCasingInFileNames": true
|
||||||
|
},
|
||||||
|
"exclude": [
|
||||||
|
"dist",
|
||||||
|
"node_modules"
|
||||||
|
]
|
||||||
|
}
|
10
vite.config.js
Normal file
10
vite.config.js
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import voie from 'vite-plugin-voie'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
plugins: [
|
||||||
|
voie({
|
||||||
|
pagesDir: 'src/pages',
|
||||||
|
extensions: ['vue', 'ts'],
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user