]> git.ipfire.org Git - thirdparty/vuejs/pinia.git/commitdiff
docs: proper useDark
authorEduardo San Martin Morote <posva13@gmail.com>
Mon, 17 May 2021 13:56:57 +0000 (15:56 +0200)
committerEduardo San Martin Morote <posva13@gmail.com>
Mon, 17 May 2021 13:56:57 +0000 (15:56 +0200)
12 files changed:
docs/.vitepress/components/HomeSponsorsGroup.vue
docs/.vitepress/components/ThemeToggle.vue
docs/.vitepress/components/sponsors.json
docs/.vitepress/theme/Layout.ts [new file with mode: 0644]
docs/.vitepress/theme/dark-theme.ts [new file with mode: 0644]
docs/.vitepress/theme/index.js
docs/.vitepress/theme/sponsors.css [new file with mode: 0644]
docs/public/sponsors/passionate-people-dark.png [new file with mode: 0644]
docs/public/sponsors/passionate-people-light.png [new file with mode: 0644]
docs/vite.config.js
package.json
yarn.lock

index 753c96df1d130d08d8add72814687abe2e33024c..ab8724d987cb57a0a63fb920c59f5eea429edb35 100644 (file)
@@ -13,7 +13,8 @@
       class="sponsor_wrapper"
     >
       <img
-        :src="sponsor.imgSrcLight"
+        :src="sponsor.imgSrc"
+        :class="sponsor.imgSrcLight === imgSrcDark && 'invert-colors'"
         :alt="sponsor.alt"
         :style="{ width: size + 'px' }"
       />
   </p>
 </template>
 
-<script>
+<script setup lang="ts">
 import sponsors from './sponsors.json'
+import { isDark } from '../theme/dark-theme'
+import { computed, defineProps } from 'vue'
+import type { PropType } from 'vue'
 
-export default {
-  name: 'HomeSponsorsGroup',
-
-  props: {
-    name: {
-      type: String,
-      required: true,
-    },
-    size: {
-      type: [Number, String],
-      default: 140,
-    },
+const props = defineProps({
+  name: {
+    type: String as PropType<'gold' | 'platinum' | 'silver' | 'bronze'>,
+    required: true,
   },
-
-  computed: {
-    list() {
-      return sponsors[this.name.toLowerCase()]
-    },
+  size: {
+    type: [Number, String],
+    default: 140,
   },
-}
+})
+
+const list = computed(() =>
+  sponsors[props.name.toLowerCase()].map((sponsor) => ({
+    ...sponsor,
+    imgSrc: isDark.value ? sponsor.imgSrcDark : sponsor.imgSrcLight,
+  }))
+)
 </script>
 
 <style scoped>
@@ -73,7 +74,7 @@ img {
   opacity: 0.66;
 }
 
-html:not(.light) img {
+html:not(.light) img.invert-colors {
   filter: invert(1) grayscale(100%);
 }
 
index a8e85466e170cd6553ea0f0072308ebea837a546..434702a60bea08773be7b1d9a6273f57504597c9 100644 (file)
   </button>
 </template>
 
-<script setup lang="ts">
-import { computed, onMounted, ref, watchEffect } from 'vue'
-
-const isBrowser = typeof window !== 'undefined'
-
-const PREFERS_LIGHT = '(prefers-color-scheme: light)'
-
-function isDarkMode() {
-  if (!isBrowser) return true
-
-  const storedTheme = localStorage.getItem(storageKey)
-  if (storedTheme != null) return storedTheme !== 'light'
-
-  return !window.matchMedia(PREFERS_LIGHT).matches
-}
-
-const storageKey = 'pinia-color-scheme'
-
-const localIsDark = ref(isDarkMode())
-
-const isDark = computed<boolean>({
-  get() {
-    return localIsDark.value
-  },
-  set(isDark) {
-    localStorage.setItem(storageKey, isDark ? 'dark' : 'light')
-    localIsDark.value = isDark
-  },
-})
+<script lang="ts" setup>
+import { computed } from 'vue'
+import { isDark } from '../theme/dark-theme'
 
 const label = computed(() =>
   isDark.value ? 'Switch to light mode' : 'Switch to dark mode'
 )
-
-onMounted(() => {
-  window.addEventListener('storage', () => {
-    const storedScheme = localStorage.getItem(storageKey)
-    localIsDark.value = storedScheme !== 'light'
-  })
-
-  const mediaQuery = window.matchMedia(PREFERS_LIGHT)
-
-  if ('addEventListener' in mediaQuery) {
-    mediaQuery.addEventListener('change', (event) => {
-      localIsDark.value = !event.matches
-    })
-  }
-
-  watchEffect(() => {
-    const htmlElement = document.body.parentElement!
-    if (isDark.value) {
-      htmlElement.classList.remove('light')
-    } else {
-      htmlElement.classList.add('light')
-    }
-  })
-})
 </script>
 
 <style scoped>
index c4c83408249514541ea05c9957d34e20c7fdf07e..b780af4e0ca2c209e644cfa3df1c2cdb728ae728 100644 (file)
@@ -3,8 +3,8 @@
     {
       "href": "https://passionatepeople.io/",
       "alt": "Passionate People",
-      "imgSrcLight": "https://img2.storyblok.com/672x0/filters::format(webp)/f/86387/x/21aa32ed18/logo-normal.svg",
-      "imgSrcDark": "https://img2.storyblok.com/0x200/filters::format(webp)/f/86387/x/4cf6a70a8c/logo-white-text.svg"
+      "imgSrcLight": "/sponsors/passionate-people-light.png",
+      "imgSrcDark": "/sponsors/passionate-people-dark.png"
     },
     {
       "href": "https://vuejobs.com/?utm_source=vuerouter&utm_campaign=sponsor",
diff --git a/docs/.vitepress/theme/Layout.ts b/docs/.vitepress/theme/Layout.ts
new file mode 100644 (file)
index 0000000..0da48b3
--- /dev/null
@@ -0,0 +1,35 @@
+import Theme from 'vitepress/theme'
+import { h } from 'vue'
+import type { FunctionalComponent } from 'vue'
+import sponsors from '../components/sponsors.json'
+import './sponsors.css'
+import { isDark } from './dark-theme'
+
+export const Layout: FunctionalComponent = () =>
+  h(Theme.Layout, null, {
+    'sidebar-bottom': () =>
+      h('div', { class: 'sponsors' }, [
+        h(
+          'a',
+          {
+            href: 'https://github.com/sponsors/posva',
+            target: '_blank',
+            rel: 'noopener',
+          },
+          [h('span', 'Sponsors')]
+        ),
+        ...sponsors.gold.map(({ href, imgSrcDark, imgSrcLight, alt }) =>
+          h(
+            'a',
+            {
+              href,
+              target: '_blank',
+              rel: 'noopener',
+            },
+            [h('img', { src: isDark.value ? imgSrcDark : imgSrcLight, alt })]
+          )
+        ),
+      ]),
+  })
+
+Layout.displayName = 'CustomLayout'
diff --git a/docs/.vitepress/theme/dark-theme.ts b/docs/.vitepress/theme/dark-theme.ts
new file mode 100644 (file)
index 0000000..ddb8112
--- /dev/null
@@ -0,0 +1,6 @@
+import { useDark } from '@vueuse/core'
+
+export const isDark = useDark({
+  storageKey: 'pinia-color-scheme',
+  valueLight: 'light',
+})
index d7d54012907b9550352ecb7122d7d93743cc7185..4a1d56ee121e0e45d5cfd80a38adc71dc0f6b650 100644 (file)
@@ -1,27 +1,15 @@
 import Theme from 'vitepress/theme'
+import { Layout } from './Layout'
 import './custom.css'
 import './code-theme.css'
 // import { createPinia } from '../../../src'
 
-const { Layout } = Theme
-
-const existingMounted = Layout.mounted || (() => {})
-
-Layout.mounted = function () {
-  existingMounted.call(this)
-
-  const storedTheme = localStorage.getItem('pinia-color-scheme')
-  const mediaQuery = window.matchMedia('(prefers-color-scheme: light)')
-
-  if (mediaQuery.matches || storedTheme === 'light') {
-    const htmlElement = document.body.parentElement
-    htmlElement.classList.add('light')
-  }
-}
-
 /** @type {import('vitepress').Theme} */
 const config = {
   ...Theme,
+
+  Layout,
+
   enhanceApp({ app }) {
     // app.use(createPinia())
   },
diff --git a/docs/.vitepress/theme/sponsors.css b/docs/.vitepress/theme/sponsors.css
new file mode 100644 (file)
index 0000000..b241002
--- /dev/null
@@ -0,0 +1,31 @@
+.sponsors {
+  padding: 0 1.5rem 2rem;
+  font-size: 0.8rem;
+}
+
+.sponsors a {
+  color: #999;
+}
+
+.sponsors img {
+  max-width: 200px;
+  max-height: 40px;
+  display: block;
+  margin: 1.25rem 0;
+}
+
+.sponsors.frontpage {
+  text-align: center;
+}
+
+.sponsors.frontpage img {
+  display: inline-block;
+  vertical-align: middle;
+  margin: 0 1rem 1.25rem 1rem;
+}
+
+.sponsors.frontpage h2 {
+  color: #999;
+  font-size: 1.2rem;
+  border: none;
+}
diff --git a/docs/public/sponsors/passionate-people-dark.png b/docs/public/sponsors/passionate-people-dark.png
new file mode 100644 (file)
index 0000000..028baf6
Binary files /dev/null and b/docs/public/sponsors/passionate-people-dark.png differ
diff --git a/docs/public/sponsors/passionate-people-light.png b/docs/public/sponsors/passionate-people-light.png
new file mode 100644 (file)
index 0000000..61ac71a
Binary files /dev/null and b/docs/public/sponsors/passionate-people-light.png differ
index 54d5fe8520822340837cacaa7b4e6b4ba08caf8d..f23e4ec9755bd24b7325ec7cf0e8eb2d68779097 100644 (file)
@@ -7,4 +7,7 @@ export default defineConfig({
     __DEV__: 'true',
     __BROWSER__: 'true',
   },
+  optimizeDeps: {
+    exclude: ['@vueuse/shared', '@vueuse/core'],
+  },
 })
index 5e381b240a34dfa4a00d597bb9894bcc0e90659c..18aca84b6b1a36e57ffd1f0c91ddc3e03cd350ce 100644 (file)
@@ -72,6 +72,7 @@
     "@types/node": "^15.3.0",
     "@vue/server-renderer": "^3.0.11",
     "@vue/test-utils": "^2.0.0-rc.6",
+    "@vueuse/core": "^4.11.0",
     "brotli": "^1.3.2",
     "codecov": "^3.8.2",
     "conventional-changelog-cli": "^2.1.1",
index 44875370e6ead496aeb24e245f4f20808d23f7ac..86068cddf504e6d820c07c45ce3a893add1998d7 100644 (file)
--- a/yarn.lock
+++ b/yarn.lock
   resolved "https://registry.yarnpkg.com/@vue/test-utils/-/test-utils-2.0.0-rc.6.tgz#d0aac24d20450d379e183f70542c0822670b8783"
   integrity sha512-0cnQBVH589PwgqWpyv1fgCAz+9Ram/MsvN3ZEAEVXi1aPuhUa22EudGc0WezQ9PKwR+L40NrBmt3JBXE2tSRRQ==
 
+"@vueuse/core@^4.11.0":
+  version "4.11.0"
+  resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-4.11.0.tgz#2fbfdbeafe7d0a975a901cb56de76226fc4bdf10"
+  integrity sha512-a2/NHE3LjZ73LKGU1Ef2mz11ilIxs4pRIv1OUf98Sfvg6+GqA3R2VzIExswVlU3555GYIErmmJDywEHLsyii6w==
+  dependencies:
+    "@vueuse/shared" "4.11.0"
+    vue-demi "*"
+
+"@vueuse/shared@4.11.0":
+  version "4.11.0"
+  resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-4.11.0.tgz#d5c453ac1c15e513d625f8035ec22c7562fd8441"
+  integrity sha512-WKyOxTWuAiOLTp9Eg6RYabtZBSiJyt9EgFZEMD8fSlZ1FAckg0Ntya3HLfTDkPBjOqVe3pMdOsAbLwsU+7Fwyw==
+  dependencies:
+    vue-demi "*"
+
 JSONStream@^1.0.4:
   version "1.3.5"
   resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0"
@@ -6277,6 +6292,11 @@ vitepress@^0.13.2:
     vite "^2.0.5"
     vue "^3.0.5"
 
+vue-demi@*:
+  version "0.9.0"
+  resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.9.0.tgz#b30da61450079d60a132d7aaf9e86d1949e8445e"
+  integrity sha512-f8vVUpC726YXv99fF/3zHaw5CUYbP5H/DVWBN+pncXM8P2Uz88kkffwj9yD7MukuVzPICDHNrgS3VC2ursaP7g==
+
 vue@^3.0.11, vue@^3.0.5:
   version "3.0.11"
   resolved "https://registry.yarnpkg.com/vue/-/vue-3.0.11.tgz#c82f9594cbf4dcc869241d4c8dd3e08d9a8f4b5f"