Skip to content

Commit 1978f69

Browse files
committed
refactor: reader mode font size
1 parent dd22f81 commit 1978f69

File tree

9 files changed

+106
-45
lines changed

9 files changed

+106
-45
lines changed

Diff for: .eslintrc-auto-import.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,6 @@
119119
"useClipboard": true,
120120
"useColorMode": true,
121121
"useConfirmDialog": true,
122-
"useCoreStore": true,
123122
"useCounter": true,
124123
"useCssModule": true,
125124
"useCssVar": true,
@@ -199,6 +198,7 @@
199198
"usePreferredLanguages": true,
200199
"usePreferredReducedMotion": true,
201200
"useRafFn": true,
201+
"useReaderStore": true,
202202
"useRefHistory": true,
203203
"useResizeObserver": true,
204204
"useRoute": true,

Diff for: src/auto-imports.d.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,6 @@ declare global {
120120
const useClipboard: typeof import('@vueuse/core')['useClipboard']
121121
const useColorMode: typeof import('@vueuse/core')['useColorMode']
122122
const useConfirmDialog: typeof import('@vueuse/core')['useConfirmDialog']
123-
const useCoreStore: typeof import('./store/core')['useCoreStore']
124123
const useCounter: typeof import('@vueuse/core')['useCounter']
125124
const useCssModule: typeof import('vue')['useCssModule']
126125
const useCssVar: typeof import('@vueuse/core')['useCssVar']
@@ -200,6 +199,7 @@ declare global {
200199
const usePreferredLanguages: typeof import('@vueuse/core')['usePreferredLanguages']
201200
const usePreferredReducedMotion: typeof import('@vueuse/core')['usePreferredReducedMotion']
202201
const useRafFn: typeof import('@vueuse/core')['useRafFn']
202+
const useReaderStore: typeof import('./store/reader')['useReaderStore']
203203
const useRefHistory: typeof import('@vueuse/core')['useRefHistory']
204204
const useResizeObserver: typeof import('@vueuse/core')['useResizeObserver']
205205
const useRoute: typeof import('vue-router')['useRoute']
@@ -391,7 +391,6 @@ declare module '@vue/runtime-core' {
391391
readonly useClipboard: UnwrapRef<typeof import('@vueuse/core')['useClipboard']>
392392
readonly useColorMode: UnwrapRef<typeof import('@vueuse/core')['useColorMode']>
393393
readonly useConfirmDialog: UnwrapRef<typeof import('@vueuse/core')['useConfirmDialog']>
394-
readonly useCoreStore: UnwrapRef<typeof import('./store/core')['useCoreStore']>
395394
readonly useCounter: UnwrapRef<typeof import('@vueuse/core')['useCounter']>
396395
readonly useCssModule: UnwrapRef<typeof import('vue')['useCssModule']>
397396
readonly useCssVar: UnwrapRef<typeof import('@vueuse/core')['useCssVar']>
@@ -471,6 +470,7 @@ declare module '@vue/runtime-core' {
471470
readonly usePreferredLanguages: UnwrapRef<typeof import('@vueuse/core')['usePreferredLanguages']>
472471
readonly usePreferredReducedMotion: UnwrapRef<typeof import('@vueuse/core')['usePreferredReducedMotion']>
473472
readonly useRafFn: UnwrapRef<typeof import('@vueuse/core')['useRafFn']>
473+
readonly useReaderStore: UnwrapRef<typeof import('./store/reader')['useReaderStore']>
474474
readonly useRefHistory: UnwrapRef<typeof import('@vueuse/core')['useRefHistory']>
475475
readonly useResizeObserver: UnwrapRef<typeof import('@vueuse/core')['useResizeObserver']>
476476
readonly useRoute: UnwrapRef<typeof import('vue-router')['useRoute']>

Diff for: src/components/Prose.vue

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script setup lang="ts">
2-
const core = useCoreStore()
2+
const reader = useReaderStore()
33
</script>
44

55
<template>
@@ -23,7 +23,7 @@ const core = useCoreStore()
2323
// code
2424
'prose-code:text-sky-500 prose-code:dark:text-sky-400',
2525
// reader
26-
core.reader ? 'prose-xl' : '',
26+
reader.isActive ? reader.fontSize : '',
2727
]"
2828
>
2929
<slot />

Diff for: src/components/Subscribe.vue

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,25 @@
11
<script setup lang="ts">
22
const showSubscription = import.meta.env.VITE_NEWSLETTER === 'true' || false
33
4-
const core = useCoreStore()
4+
const reader = useReaderStore()
55
const newsletter = useNewsletterStore()
6-
76
const email = ref('')
87
const loading = ref(false)
8+
99
const subscribe = async () => {
1010
loading.value = true
1111
await newsletter.subscribe(email.value)
1212
loading.value = false
1313
}
14+
1415
const response = computed(() => newsletter.getResponse)
16+
1517
const showNewsletterForm = useLocalStorage('showNewsletterForm', true)
1618
</script>
1719

1820
<template>
1921
<div
20-
v-if="showSubscription && !core.reader && showNewsletterForm"
22+
v-if="showSubscription && !reader.isActive && showNewsletterForm"
2123
class="mb-8 rounded-xl border border-slate-300/70 bg-slate-50 px-5 py-5 dark:border-transparent dark:bg-slate-800"
2224
>
2325
<div class="flex justify-end">

Diff for: src/components/layout/TheNavbarReader.vue

+52-8
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,63 @@
11
<script setup lang="ts">
2-
const core = useCoreStore()
2+
const reader = useReaderStore()
3+
4+
const fontIndex = computed(() => {
5+
return reader.fontSizes.findIndex((item) => item === reader.fontSize)
6+
})
7+
8+
const hasNext = computed(() => reader.fontSizes.length - 1 > fontIndex.value)
9+
const increaseFont = () => {
10+
if (hasNext.value) {
11+
reader.setFontSize(reader.fontSizes[fontIndex.value + 1])
12+
}
13+
}
14+
15+
const hasPrevious = computed(() => fontIndex.value !== 0)
16+
const decreaseFont = () => {
17+
if (hasPrevious.value) {
18+
reader.setFontSize(reader.fontSizes[fontIndex.value - 1])
19+
}
20+
}
321
</script>
422

523
<template>
624
<nav
7-
class="sticky top-0 z-40 w-full flex-none bg-white/25 backdrop-blur dark:border-slate-50/[0.06] dark:bg-transparent lg:z-50 lg:border-b lg:border-slate-900/10"
25+
class="sticky top-0 z-40 w-full flex-none bg-transparent backdrop-blur dark:border-slate-50/[0.06] lg:z-50 lg:border-b lg:border-slate-900/10"
826
>
9-
<div class="mx-auto max-w-4xl px-4 lg:pr-0 lg:pl-8 xl:px-16">
27+
<div class="mx-auto max-w-8xl px-4 xl:px-10">
1028
<div class="relative flex h-14 justify-between">
11-
<div class="flex flex-1 items-center justify-between sm:items-center">
29+
<div
30+
class="flex flex-1 items-center justify-end space-x-5 sm:items-center"
31+
>
32+
<div
33+
class="ml-6 space-x-6 border-r border-slate-200 dark:border-slate-800"
34+
>
35+
<button
36+
class="text-slate-400 transition duration-300 dark:text-slate-500"
37+
:class="
38+
hasNext ? 'hover:text-sky-500 dark:hover:text-sky-500' : ''
39+
"
40+
@click="increaseFont"
41+
>
42+
A+
43+
</button>
44+
<button
45+
class="text-slate-400 transition duration-300 dark:text-slate-500"
46+
:class="
47+
hasPrevious ? 'hover:text-sky-500 dark:hover:text-sky-500' : ''
48+
"
49+
@click="decreaseFont"
50+
>
51+
A-
52+
</button>
53+
<span class="text-white"> </span>
54+
</div>
55+
56+
<base-theme-toggle />
57+
1258
<button
13-
class="rounded text-slate-400 hover:bg-sky-100 hover:text-sky-600 dark:hover:bg-transparent"
14-
@click="core.toggle()"
59+
class="rounded text-slate-400 transition duration-300 hover:text-sky-500 dark:hover:bg-transparent"
60+
@click="reader.toggle()"
1561
>
1662
<span class="sr-only">close reader mode</span>
1763
<svg
@@ -29,8 +75,6 @@ const core = useCoreStore()
2975
/>
3076
</svg>
3177
</button>
32-
33-
<base-theme-toggle />
3478
</div>
3579
</div>
3680
</div>

Diff for: src/components/ui/BaseReaderMode.vue

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
<script setup lang="ts">
2-
const core = useCoreStore()
2+
const reader = useReaderStore()
33
</script>
44

55
<template>
66
<button
77
class="flex w-auto items-center rounded-full bg-sky-400/10 py-1 px-3 text-xs font-medium leading-5 text-sky-600 transition duration-300 hover:bg-sky-400/20 dark:text-sky-400"
8-
@click="core.toggle()"
8+
@click="reader.toggle()"
99
>
1010
<strong class="font-semibold"> Enter reader mode </strong>
1111
<svg

Diff for: src/layouts/default.vue

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
<script setup lang="ts">
2-
const core = useCoreStore()
2+
const reader = useReaderStore()
33
44
const rootRepositoryRoutes = ['contributing', 'changelog']
55
</script>
66

77
<template>
88
<div class="min-h-screen bg-white dark:bg-gray-900">
9-
<the-navbar v-show="!core.reader" />
10-
<the-navbar-reader v-show="core.reader" />
9+
<the-navbar v-show="!reader.isActive" />
10+
<the-navbar-reader v-show="reader.isActive" />
1111

1212
<div
1313
class="relative mx-auto flex min-h-screen max-w-8xl justify-center sm:px-2 lg:px-8 xl:px-12"
1414
>
1515
<!-- sidebar -->
1616
<div
17-
v-show="!core.reader"
17+
v-show="!reader.isActive"
1818
class="hidden lg:relative lg:block lg:flex-none"
1919
>
2020
<div class="absolute inset-y-0 right-0 w-[50vw] dark:hidden" />
@@ -36,7 +36,7 @@ const rootRepositoryRoutes = ['contributing', 'changelog']
3636
<!-- article -->
3737
<div
3838
class="min-w-0 flex-auto px-4 py-12 lg:pr-0 lg:pl-8 xl:px-16"
39-
:class="[core.reader ? 'max-w-2xl lg:max-w-4xl' : 'lg:max-w-none']"
39+
:class="[reader.isActive ? 'max-w-2xl lg:max-w-4xl' : 'lg:max-w-none']"
4040
>
4141
<article>
4242
<prose v-if="$route.name !== 'index'"><router-view /></prose>
@@ -58,7 +58,7 @@ const rootRepositoryRoutes = ['contributing', 'changelog']
5858

5959
<!-- table of content -->
6060
<div
61-
v-show="!core.reader"
61+
v-show="!reader.isActive"
6262
class="overflow-overlay hidden overflow-x-hidden xl:sticky xl:top-[3.6rem] xl:-mr-6 xl:block xl:h-[calc(100vh-3.6rem)] xl:flex-none xl:overflow-y-auto xl:py-10 xl:pr-6"
6363
>
6464
<the-toc />

Diff for: src/store/core.ts

-21
This file was deleted.

Diff for: src/store/reader.ts

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { acceptHMRUpdate, defineStore } from 'pinia'
2+
3+
export const useReaderStore = defineStore('reader', {
4+
state: () => ({
5+
readerMode: false,
6+
availableFontSizes: [
7+
'prose-sm',
8+
'prose-md',
9+
'prose-lg',
10+
'prose-xl',
11+
'prose-2xl',
12+
],
13+
currentFontSize: 'prose-xl',
14+
}),
15+
16+
getters: {
17+
isActive: (state) => state.readerMode,
18+
fontSize: (state) => state.currentFontSize,
19+
fontSizes: (state) => state.availableFontSizes,
20+
},
21+
22+
actions: {
23+
toggle() {
24+
this.currentFontSize = 'prose-xl'
25+
this.readerMode = !this.readerMode
26+
},
27+
28+
setFontSize(size: string) {
29+
this.currentFontSize = size
30+
},
31+
},
32+
})
33+
34+
if (import.meta.hot) {
35+
import.meta.hot.accept(acceptHMRUpdate(useReaderStore, import.meta.hot))
36+
}

0 commit comments

Comments
 (0)