diff --git a/components/Nav/Navbar.vue b/components/Nav/Navbar.vue index dfba24b532f877e39028914025d7f0c9257b4ec6..6330ceadef453c05b36c5b423cbfb27de72ecb65 100644 --- a/components/Nav/Navbar.vue +++ b/components/Nav/Navbar.vue @@ -1,11 +1,8 @@ <template> <v-app-bar> - <v-app-bar-nav-icon - variant="text" - @click.stop="drawer = !drawer" - ></v-app-bar-nav-icon> + <v-app-bar-nav-icon variant="text" @click.stop="drawer = !drawer"></v-app-bar-nav-icon> <v-toolbar-title>DefenseFinder Wiki</v-toolbar-title> - <v-btn @click="toggleTheme">toggle theme</v-btn> + <v-btn @click="toggle()">toggle theme</v-btn> </v-app-bar> <v-navigation-drawer v-model="drawer" :border="0"> <v-card flat> @@ -16,13 +13,12 @@ </v-navigation-drawer> </template> <script setup lang="ts"> -import { useTheme } from "vuetify"; +import { useCustomTheme } from '~/composables/useCustomTheme' + +const { toggle } = useCustomTheme() + const { navigation, page, surround, globals } = useContent(); -console.log(page.value); -const theme = useTheme(); -function toggleTheme() { - theme.global.name.value = theme.global.current.value.dark ? "light" : "dark"; -} + const drawer = ref(true); </script> diff --git a/composables/useCustomTheme.ts b/composables/useCustomTheme.ts new file mode 100644 index 0000000000000000000000000000000000000000..9d7fc03b1715d3a26701ea982266ee64918d6e1b --- /dev/null +++ b/composables/useCustomTheme.ts @@ -0,0 +1,17 @@ +// composables/useCustomTheme.ts +export function useCustomTheme() { + const { $vuetify } = useNuxtApp() + + const isDark = useDark({ + valueDark: 'dark', + valueLight: 'light', + initialValue: 'light', + onChanged: (dark: boolean) => { + $vuetify.theme.global.name.value = dark ? 'dark' : 'light' + }, + }) + + const toggle = useToggle(isDark) + + return { isDark, toggle } + } \ No newline at end of file diff --git a/layouts/article.vue b/layouts/article.vue index 62cd1ded1f86b7f97b96e52bc3ca0a5cf4133506..4f93ec839a31fa9f63c30baa0829a6423e1ae413 100644 --- a/layouts/article.vue +++ b/layouts/article.vue @@ -1,10 +1,12 @@ <script setup lang="ts"> const { page, surround } = useContent(); +import { useCustomTheme } from '~/composables/useCustomTheme' +const { isDark } = useCustomTheme() </script> <template> <v-card> - <v-app> + <VApp :theme="isDark ? 'dark' : 'light'"> <v-main style="min-height: 300px"> <!-- <v-container class="fill-height w-auto" > --> <!-- <v-card flat max-width="1000" min-height="300" color="transparent"> @@ -27,7 +29,7 @@ const { page, surround } = useContent(); </v-main> <NavNavbar /> <NavTableOfContent :links="page.body.toc.links" /> - </v-app> + </VApp> </v-card> </template> diff --git a/layouts/custom.vue b/layouts/custom.vue index 8e67eac306f116c582dd8cae95e614b073d23b5b..d608a56fc267b2a7fa56b132363da7da8422df61 100644 --- a/layouts/custom.vue +++ b/layouts/custom.vue @@ -1,18 +1,20 @@ <template> <v-card> - <v-app> + <VApp :theme="isDark ? 'dark' : 'light'"> <NavNavbar /> <v-main style="min-height: 300px"> <v-container> <slot /> <v-footer app>footer</v-footer> - </v-container></v-main - > - </v-app> + </v-container></v-main> + </VApp> </v-card> </template> <script setup lang="ts"> +import { useCustomTheme } from '~/composables/useCustomTheme' + +const { isDark } = useCustomTheme() const { navigation } = useContent(); const drawer = ref(true); diff --git a/nuxt.config.ts b/nuxt.config.ts index e9d8d8168006f34ed40dc4c4ac5fd9063ae8a967..04c36373a8d957ae6b54ade61a5151997c1cd29f 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -1,6 +1,6 @@ // https://v3.nuxtjs.org/api/configuration/nuxt.config export default defineNuxtConfig({ - modules: ['@nuxt/content', 'vuetify-nuxt-module'], + modules: ['@nuxt/content', 'vuetify-nuxt-module', '@vueuse/nuxt'], content: { documentDriven: { injectPage: false, diff --git a/package-lock.json b/package-lock.json index 469d9622d444e48647f296a232a5a200985824bf..93b3338c0780394d031a50bc1228ffc8ded93688 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,12 +4,11 @@ "requires": true, "packages": { "": { - "dependencies": { - "@vueuse/core": "^10.1.0" - }, "devDependencies": { "@nuxt/content": "^2.7.2", "@types/node": "^18.15.12", + "@vueuse/core": "^10.4.1", + "@vueuse/nuxt": "^10.4.1", "nuxt": "^3.7.0", "vuetify-nuxt-module": "^0.5.7" } @@ -472,6 +471,7 @@ }, "node_modules/@babel/parser": { "version": "7.22.15", + "dev": true, "license": "MIT", "bin": { "parser": "bin/babel-parser.js" @@ -647,6 +647,7 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", + "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { @@ -1394,6 +1395,7 @@ }, "node_modules/@types/web-bluetooth": { "version": "0.0.17", + "dev": true, "license": "MIT" }, "node_modules/@ungap/structured-clone": { @@ -1619,6 +1621,7 @@ }, "node_modules/@vue/compiler-core": { "version": "3.3.4", + "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.21.3", @@ -1629,6 +1632,7 @@ }, "node_modules/@vue/compiler-dom": { "version": "3.3.4", + "dev": true, "license": "MIT", "dependencies": { "@vue/compiler-core": "3.3.4", @@ -1637,6 +1641,7 @@ }, "node_modules/@vue/compiler-sfc": { "version": "3.3.4", + "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.20.15", @@ -1653,6 +1658,7 @@ }, "node_modules/@vue/compiler-ssr": { "version": "3.3.4", + "dev": true, "license": "MIT", "dependencies": { "@vue/compiler-dom": "3.3.4", @@ -1666,6 +1672,7 @@ }, "node_modules/@vue/reactivity": { "version": "3.3.4", + "dev": true, "license": "MIT", "dependencies": { "@vue/shared": "3.3.4" @@ -1673,6 +1680,7 @@ }, "node_modules/@vue/reactivity-transform": { "version": "3.3.4", + "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.20.15", @@ -1684,6 +1692,7 @@ }, "node_modules/@vue/runtime-core": { "version": "3.3.4", + "dev": true, "license": "MIT", "dependencies": { "@vue/reactivity": "3.3.4", @@ -1692,6 +1701,7 @@ }, "node_modules/@vue/runtime-dom": { "version": "3.3.4", + "dev": true, "license": "MIT", "dependencies": { "@vue/runtime-core": "3.3.4", @@ -1701,6 +1711,7 @@ }, "node_modules/@vue/server-renderer": { "version": "3.3.4", + "dev": true, "license": "MIT", "dependencies": { "@vue/compiler-ssr": "3.3.4", @@ -1712,6 +1723,7 @@ }, "node_modules/@vue/shared": { "version": "3.3.4", + "dev": true, "license": "MIT" }, "node_modules/@vuetify/loader-shared": { @@ -1729,7 +1741,9 @@ }, "node_modules/@vueuse/core": { "version": "10.4.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.4.1.tgz", + "integrity": "sha512-DkHIfMIoSIBjMgRRvdIvxsyboRZQmImofLyOHADqiVbQVilP8VVHDhBX2ZqoItOgu7dWa8oXiNnScOdPLhdEXg==", + "dev": true, "dependencies": { "@types/web-bluetooth": "^0.0.17", "@vueuse/metadata": "10.4.1", @@ -1742,6 +1756,7 @@ }, "node_modules/@vueuse/core/node_modules/vue-demi": { "version": "0.14.6", + "dev": true, "hasInstallScript": true, "license": "MIT", "bin": { @@ -1780,13 +1795,61 @@ }, "node_modules/@vueuse/metadata": { "version": "10.4.1", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/antfu" } }, + "node_modules/@vueuse/nuxt": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@vueuse/nuxt/-/nuxt-10.4.1.tgz", + "integrity": "sha512-tJ25KCkozZaQEy0qli4Ta8WXlbMIjSD7gPnVfLScZ2DpSSgImMB5R66PQEkrbSg4GfFj0OuoYc4+vCHQ/FqTsw==", + "dev": true, + "dependencies": { + "@nuxt/kit": "^3.6.5", + "@vueuse/core": "10.4.1", + "@vueuse/metadata": "10.4.1", + "local-pkg": "^0.4.3", + "nuxt": "^3.6.5", + "vue-demi": ">=0.14.5" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "nuxt": "^3.0.0" + } + }, + "node_modules/@vueuse/nuxt/node_modules/vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, "node_modules/@vueuse/shared": { "version": "10.4.1", + "dev": true, "license": "MIT", "dependencies": { "vue-demi": ">=0.14.5" @@ -1797,6 +1860,7 @@ }, "node_modules/@vueuse/shared/node_modules/vue-demi": { "version": "0.14.6", + "dev": true, "hasInstallScript": true, "license": "MIT", "bin": { @@ -2721,6 +2785,7 @@ }, "node_modules/csstype": { "version": "3.1.2", + "dev": true, "license": "MIT" }, "node_modules/cuint": { @@ -3138,6 +3203,7 @@ }, "node_modules/estree-walker": { "version": "2.0.2", + "dev": true, "license": "MIT" }, "node_modules/etag": { @@ -4457,6 +4523,7 @@ }, "node_modules/magic-string": { "version": "0.30.3", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" @@ -7677,6 +7744,7 @@ }, "node_modules/picocolors": { "version": "1.0.0", + "dev": true, "license": "ISC" }, "node_modules/picomatch": { @@ -7721,6 +7789,7 @@ }, "node_modules/postcss": { "version": "8.4.29", + "dev": true, "funding": [ { "type": "opencollective", @@ -8236,6 +8305,7 @@ }, "node_modules/postcss/node_modules/nanoid": { "version": "3.3.6", + "dev": true, "funding": [ { "type": "github", @@ -9538,6 +9608,7 @@ }, "node_modules/source-map-js": { "version": "1.0.2", + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -10728,6 +10799,7 @@ }, "node_modules/vue": { "version": "3.3.4", + "dev": true, "license": "MIT", "dependencies": { "@vue/compiler-dom": "3.3.4", diff --git a/package.json b/package.json index 08224774a82f5af6cf9a637bb4e67851f17a2a5d..f5c158570865359cfd669eb2d189de01d1ea6adc 100644 --- a/package.json +++ b/package.json @@ -9,10 +9,9 @@ "devDependencies": { "@nuxt/content": "^2.7.2", "@types/node": "^18.15.12", + "@vueuse/core": "^10.4.1", + "@vueuse/nuxt": "^10.4.1", "nuxt": "^3.7.0", "vuetify-nuxt-module": "^0.5.7" - }, - "dependencies": { - "@vueuse/core": "^10.1.0" } }