feat: tailwind 2 + script setup!
This commit is contained in:
parent
f179e3e40b
commit
14b6a74360
2
LICENSE
2
LICENSE
@ -1,6 +1,6 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2020 Anthony Fu // free feel to change it 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
|
||||
|
14
README.md
14
README.md
@ -24,12 +24,14 @@
|
||||
|
||||
- 📲 [PWA](https://github.com/antfu/vite-plugin-pwa)
|
||||
|
||||
- 🎨 TailwindCSS with dark mode out-of-box
|
||||
- 🎨 [TailwindCSS **v2.0**](https://blog.tailwindcss.com/tailwindcss-v2) with dark mode out-of-box
|
||||
|
||||
- 😃 [Use icons from any icon sets, with no compromise](./src/components)
|
||||
|
||||
- 🌍 [i18n ready](./locales)
|
||||
|
||||
- 🔥 Use the [new `<script setup>` style](https://github.com/vuejs/rfcs/pull/227)
|
||||
|
||||
- 🦾 TypeScript, of course
|
||||
|
||||
- ☁️ Deploy on Netlify, zero-config
|
||||
@ -58,7 +60,7 @@
|
||||
|
||||
### Coding Style
|
||||
|
||||
- Use Composition API with [`<script setup>` SFC](https://github.com/vuejs/rfcs/blob/sfc-improvements/active-rfcs/0000-sfc-script-setup.md)
|
||||
- Use Composition API with [`<script setup>` SFC](https://github.com/vuejs/rfcs/pull/227)
|
||||
- [ESLint](https://eslint.org/) with [@antfu/eslint-config-vue](https://github.com/antfu/eslint-config), single colons, no semi.
|
||||
|
||||
### Dev tools
|
||||
@ -76,7 +78,7 @@
|
||||
|
||||
## Variations
|
||||
|
||||
As this is template is strongly opinionated, the following provides a curated list for community maintained variations with different preference and feature set. Check them out as well. PR to add yours are also welcome!
|
||||
As this is template is strongly opinionated, the following provides a curated list for community maintained variations with different preferences and feature sets. Check them out as well. PR to add yours are also welcome!
|
||||
|
||||
- [vitesse-lite](https://github.com/kn0wn/vitesse-lite) by [@kn0wn](https://github.com/kn0wn)
|
||||
|
||||
@ -88,7 +90,7 @@ As this is template is strongly opinionated, the following provides a curated li
|
||||
|
||||
### Clone to local
|
||||
|
||||
If you prefer do to it manually with cleaner git history
|
||||
If you prefer to do it manually with cleaner git history
|
||||
|
||||
```bash
|
||||
npx degit antfu/vitesse my-vitesse-app
|
||||
@ -127,11 +129,11 @@ To build the App, run
|
||||
pnpm build
|
||||
```
|
||||
|
||||
And you will see the genrated file in `dist` that ready to be served.
|
||||
And you will see the generated file in `dist` that ready to be served.
|
||||
|
||||
### Deploy on Netlify
|
||||
|
||||
Go to [Netlify](https://app.netlify.com/start) and select you clone, `OK` along the way, and your App will be live in a minute.
|
||||
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.
|
||||
|
||||
## Why
|
||||
|
||||
|
41
package.json
41
package.json
@ -1,37 +1,46 @@
|
||||
{
|
||||
"name": "@vitesse/template",
|
||||
"version": "0.0.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "vite --port 3333 --open",
|
||||
"build": "cross-env NODE_ENV=production vite build"
|
||||
},
|
||||
"dependencies": {
|
||||
"@iconify/iconify": "^2.0.0-rc.1",
|
||||
"@vueuse/core": "^4.0.0-beta.37",
|
||||
"vue": "^3.0.2",
|
||||
"vue-i18n": "9.0.0-beta.6",
|
||||
"vue-router": "^4.0.0-rc.1"
|
||||
"@iconify/iconify": "^2.0.0-rc.2",
|
||||
"@vueuse/core": "^4.0.0-rc.4",
|
||||
"vue": "^3.0.3",
|
||||
"vue-i18n": "9.0.0-beta.8",
|
||||
"vue-router": "^4.0.0-rc.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@antfu/eslint-config-vue": "^0.4.3",
|
||||
"@iconify/json": "^1.1.251",
|
||||
"@iconify/json": "^1.1.265",
|
||||
"@purge-icons/generated": "^0.4.1",
|
||||
"@typescript-eslint/eslint-plugin": "^4.6.1",
|
||||
"@vue/compiler-sfc": "^3.0.2",
|
||||
"@typescript-eslint/eslint-plugin": "^4.8.2",
|
||||
"@vue/compiler-sfc": "^3.0.3",
|
||||
"@vuedx/typescript-plugin-vue": "^0.2.3",
|
||||
"autoprefixer": "^10.0.4",
|
||||
"cross-env": "^7.0.2",
|
||||
"eslint": "^7.12.1",
|
||||
"tailwindcss": "^1.9.6",
|
||||
"typescript": "^4.0.5",
|
||||
"vite": "^1.0.0-rc.9",
|
||||
"eslint": "^7.14.0",
|
||||
"tailwindcss": "^2.0.1",
|
||||
"typescript": "^4.1.2",
|
||||
"vite": "^1.0.0-rc.13",
|
||||
"vite-plugin-components": "^0.3.0",
|
||||
"vite-plugin-purge-icons": "^0.4.4",
|
||||
"vite-plugin-purge-icons": "^0.4.5",
|
||||
"vite-plugin-pwa": "^0.1.5",
|
||||
"vite-plugin-voie": "^0.4.0",
|
||||
"voie-pages": "^0.4.0"
|
||||
},
|
||||
"pnpm": {
|
||||
"overrides": {
|
||||
"postcss": "8",
|
||||
"vue-router": "next"
|
||||
}
|
||||
},
|
||||
"eslintConfig": {
|
||||
"extends": "@antfu/eslint-config-vue"
|
||||
"extends": "@antfu/eslint-config-vue",
|
||||
"rules": {
|
||||
"no-unused-vars": "off",
|
||||
"@typescript-eslint/no-unused-vars": "off"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
796
pnpm-lock.yaml
generated
796
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@ -17,11 +17,11 @@
|
||||
<script setup lang='ts'>
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import { locales } from '/~/messages'
|
||||
export { isDark } from '/~/utils'
|
||||
import { isDark } from '/~/logics'
|
||||
|
||||
const i18n = useI18n()
|
||||
|
||||
export const toggleLocales = () => {
|
||||
const toggleLocales = () => {
|
||||
// change to some real logic
|
||||
i18n.locale.value = locales[(locales.indexOf(i18n.locale.value) + 1) % locales.length]
|
||||
}
|
||||
|
@ -3,14 +3,17 @@
|
||||
</template>
|
||||
|
||||
<script setup="props" lang="ts">
|
||||
import { watch, ref, onMounted, nextTick } from 'vue'
|
||||
import { watch, ref, onMounted, nextTick, defineProps } from 'vue'
|
||||
import Iconify from '@purge-icons/generated'
|
||||
|
||||
declare const props: {
|
||||
icon: string
|
||||
}
|
||||
const props = defineProps({
|
||||
icon: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
})
|
||||
|
||||
export const el = ref<HTMLElement | null>(null)
|
||||
const el = ref<HTMLElement | null>(null)
|
||||
|
||||
const update = async() => {
|
||||
if (el.value) {
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { watch, computed } from 'vue'
|
||||
import { usePreferredDark } from '@vueuse/core'
|
||||
import { colorSchema } from '../store'
|
||||
import { colorSchema } from './store'
|
||||
|
||||
const preferredDark = usePreferredDark()
|
||||
|
2
src/logics/index.ts
Normal file
2
src/logics/index.ts
Normal file
@ -0,0 +1,2 @@
|
||||
export * from './dark'
|
||||
export * from './store'
|
4
src/logics/store.ts
Normal file
4
src/logics/store.ts
Normal file
@ -0,0 +1,4 @@
|
||||
import { Ref } from 'vue'
|
||||
import { useStorage } from '@vueuse/core'
|
||||
|
||||
export const colorSchema = useStorage('color-schema', 'auto') as Ref<'auto' | 'dark' | 'light'>
|
21
src/main.ts
21
src/main.ts
@ -1,28 +1,11 @@
|
||||
import './main.postcss'
|
||||
import { createApp } from 'vue'
|
||||
import { createRouter, createWebHistory } from 'vue-router'
|
||||
import { createI18n } from 'vue-i18n'
|
||||
|
||||
// import routes generated by Voie
|
||||
import routes from 'voie-pages'
|
||||
// import icons data generated by PurgeIcons
|
||||
import '@purge-icons/generated'
|
||||
import installPlugins from './plugins'
|
||||
|
||||
import App from './App.vue'
|
||||
import { messages } from './messages'
|
||||
|
||||
const app = createApp(App)
|
||||
const router = createRouter({
|
||||
history: createWebHistory(),
|
||||
routes,
|
||||
})
|
||||
|
||||
const i18n = createI18n({
|
||||
locale: 'en',
|
||||
messages,
|
||||
})
|
||||
|
||||
app.use(i18n)
|
||||
app.use(router)
|
||||
installPlugins(app)
|
||||
|
||||
app.mount('#app')
|
||||
|
@ -8,5 +8,4 @@
|
||||
import { useI18n } from 'vue-i18n'
|
||||
|
||||
const { t } = useI18n()
|
||||
export { t }
|
||||
</script>
|
||||
|
@ -14,7 +14,7 @@
|
||||
<div>
|
||||
<button
|
||||
class="btn m-3 text-sm mt-8"
|
||||
@click="back"
|
||||
@click="router.back()"
|
||||
>
|
||||
{{ t('button.back') }}
|
||||
</button>
|
||||
@ -22,17 +22,18 @@
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup='props' lang='ts'>
|
||||
<script setup lang='ts'>
|
||||
import { useRouter } from 'vue-router'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import { defineProps } from 'vue'
|
||||
|
||||
declare const props: {
|
||||
name: string
|
||||
}
|
||||
const props = defineProps({
|
||||
name: {
|
||||
type: String,
|
||||
require: true,
|
||||
},
|
||||
})
|
||||
|
||||
const router = useRouter()
|
||||
export const back = () => router.push('/')
|
||||
|
||||
const { t } = useI18n()
|
||||
export { t }
|
||||
</script>
|
||||
|
@ -39,14 +39,13 @@ import { ref } from 'vue'
|
||||
import { useRouter } from 'vue-router'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
|
||||
export const name = ref('')
|
||||
const name = ref('')
|
||||
|
||||
const router = useRouter()
|
||||
export const go = () => {
|
||||
const go = () => {
|
||||
if (name.value)
|
||||
router.push(`/hi/${name.value}`)
|
||||
}
|
||||
|
||||
const { t } = useI18n()
|
||||
export { t }
|
||||
</script>
|
||||
|
12
src/plugins/i18n.ts
Normal file
12
src/plugins/i18n.ts
Normal file
@ -0,0 +1,12 @@
|
||||
import { App } from 'vue'
|
||||
import { createI18n } from 'vue-i18n'
|
||||
import { messages } from '../messages'
|
||||
|
||||
export default (app: App) => {
|
||||
const i18n = createI18n({
|
||||
locale: 'en',
|
||||
messages,
|
||||
})
|
||||
|
||||
app.use(i18n)
|
||||
}
|
2
src/plugins/icons.ts
Normal file
2
src/plugins/icons.ts
Normal file
@ -0,0 +1,2 @@
|
||||
// import icons data generated by PurgeIcons
|
||||
import '@purge-icons/generated'
|
8
src/plugins/index.ts
Normal file
8
src/plugins/index.ts
Normal file
@ -0,0 +1,8 @@
|
||||
import { App } from 'vue'
|
||||
import installRouter from './router'
|
||||
import installI18n from './i18n'
|
||||
|
||||
export default (app: App) => {
|
||||
installRouter(app)
|
||||
installI18n(app)
|
||||
}
|
13
src/plugins/router.ts
Normal file
13
src/plugins/router.ts
Normal file
@ -0,0 +1,13 @@
|
||||
import { App } from 'vue'
|
||||
// import routes generated by Voie
|
||||
import { createRouter, createWebHistory } from 'vue-router'
|
||||
import routes from 'voie-pages'
|
||||
|
||||
export default (app: App) => {
|
||||
const router = createRouter({
|
||||
history: createWebHistory(),
|
||||
routes,
|
||||
})
|
||||
|
||||
app.use(router)
|
||||
}
|
@ -1 +0,0 @@
|
||||
export * from './local'
|
@ -1,4 +0,0 @@
|
||||
import { Ref } from 'vue'
|
||||
import { useStorage } from '@vueuse/core'
|
||||
|
||||
export const colorSchema = useStorage('vitesse-schema', 'auto') as Ref<'auto' | 'dark' | 'light'>
|
@ -1 +0,0 @@
|
||||
export * from './dark'
|
@ -1,4 +1,5 @@
|
||||
/* eslint-disable @typescript-eslint/no-var-requires */
|
||||
const colors = require('tailwindcss/colors')
|
||||
|
||||
module.exports = {
|
||||
purge: {
|
||||
@ -12,6 +13,9 @@ module.exports = {
|
||||
},
|
||||
theme: {
|
||||
extend: {
|
||||
colors: {
|
||||
teal: colors.teal,
|
||||
},
|
||||
opacity: {
|
||||
10: '0.1',
|
||||
85: '0.85',
|
||||
@ -25,17 +29,5 @@ module.exports = {
|
||||
textColor: ['dark', 'hover', 'active', 'disabled'],
|
||||
opacity: ['dark', 'hover', 'active', 'focus', 'disabled'],
|
||||
},
|
||||
future: {
|
||||
purgeLayersByDefault: true,
|
||||
removeDeprecatedGapUtilities: true,
|
||||
},
|
||||
experimental: {
|
||||
darkModeVariant: true,
|
||||
applyComplexClasses: true,
|
||||
uniformColorPalette: true,
|
||||
extendedSpacingScale: true,
|
||||
defaultLineHeights: true,
|
||||
extendedFontSizeScale: true,
|
||||
},
|
||||
dark: 'class',
|
||||
darkMode: 'class',
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user