Skip to content

Commit 077c841

Browse files
committed
Refactoring to use a poormans store for settings. Updating lint rules for type imports
1 parent 7c94c27 commit 077c841

File tree

8 files changed

+69
-147
lines changed

8 files changed

+69
-147
lines changed

eslint.config.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ export default antfu({
6767
},
6868
],
6969

70+
'import-x/consistent-type-specifier-style': ['error', 'prefer-top-level'],
71+
7072
'style/object-curly-newline': ['error', {
7173
ImportDeclaration: {
7274
multiline: true,

index.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@
77
<title>Vue live playground</title>
88

99
<script>
10-
const savedPreferDark = localStorage.getItem(
11-
'vue-sfc-playground-prefer-dark',
10+
const savedTheme = localStorage.getItem(
11+
'yehyecoa-vue-theme',
1212
)
1313
if (
14-
savedPreferDark === 'true' ||
15-
(!savedPreferDark &&
14+
savedTheme === 'dark' ||
15+
(!savedTheme &&
1616
window.matchMedia('(prefers-color-scheme: dark)').matches)
1717
) {
1818
document.documentElement.classList.add('dark')

src/App.vue

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,18 @@ import '@vue/repl/style.css';
33
44
import Monaco from '@vue/repl/monaco-editor';
55
import { Repl, useStore } from '@vue/repl';
6-
import { useStorage } from '@vueuse/core';
76
import { onMounted, ref } from 'vue';
87
98
import YVHeader from './YvHeader.vue';
9+
import { useSettingsStore } from './composables/settings';
1010
11-
const preferDark = useStorage('vue-sfc-playground-prefer-dark', true);
12-
const theme = ref<'dark' | 'light'>('dark');
13-
function setTheme(newTheme: 'dark' | 'light') {
14-
theme.value = newTheme;
15-
preferDark.value = newTheme === 'dark';
16-
}
17-
18-
const layout = useStorage<'horizontal' | 'vertical'>('yehyecoa-vue-layout', 'horizontal');
19-
function toggleLayout() {
20-
layout.value = layout.value === 'horizontal' ? 'vertical' : 'horizontal';
21-
}
11+
const { settings } = useSettingsStore();
2212
2313
function setVH() {
2414
document.documentElement.style.setProperty('--vh', `${window.innerHeight}px`);
2515
}
2616
window.addEventListener('resize', setVH);
17+
2718
setVH();
2819
2920
const store = useStore();
@@ -63,18 +54,14 @@ onMounted(async () => {
6354
>
6455
{{ errormessage }}
6556
</div>
66-
<YVHeader
67-
:theme="theme"
68-
@set-theme="setTheme"
69-
@toggle-layout="toggleLayout"
70-
/>
57+
<YVHeader />
7158
<Repl
7259
:editor="Monaco"
7360
:show-compile-output="false"
7461
:show-import-map="false"
7562
:show-ts-config="false"
76-
:theme
77-
:layout
63+
:theme="settings.theme"
64+
:layout="settings.layout"
7865
:editor-options="{
7966
autoSaveText: false,
8067
}"

src/YvHeader.vue

Lines changed: 6 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,8 @@
11
<script setup lang="ts">
2-
import { useStorage } from '@vueuse/core';
3-
import { onMounted } from 'vue';
2+
import { useSettingsStore } from './composables/settings';
43
5-
defineProps<{
6-
theme: 'dark' | 'light';
7-
}>();
4+
const { settings, toggleLayout, toggleTheme } = useSettingsStore();
85
9-
// TODO: implement the download functionality, just like the official playground
10-
const emit = defineEmits({
11-
'set-theme': (theme: 'dark' | 'light') => theme,
12-
'toggle-layout': () => true,
13-
});
14-
const cls = document.documentElement.classList;
15-
16-
function setTheme() {
17-
cls.toggle('dark');
18-
emit('set-theme', cls.contains('dark') ? 'dark' : 'light');
19-
}
20-
21-
const layout = useStorage<'horizontal' | 'vertical'>('yehyecoa-vue-layout', 'horizontal');
22-
function toggleLayout() {
23-
emit('toggle-layout');
24-
}
25-
26-
onMounted(() => {
27-
emit('set-theme', cls.contains('dark') ? 'dark' : 'light');
28-
});
296
</script>
307

318
<template>
@@ -41,16 +18,16 @@ onMounted(() => {
4118
<h1 text-lg font-500 inline-flex items-center>
4219
<!-- TODO: maybe a logo would be cool -->
4320
<!-- <img alt="logo" src="/logo.svg" /> -->
44-
<span uno-hidden sm:inline-block>yehyecoa-vue</span>
21+
<span>yehyecoa-vue</span>
4522
</h1>
4623
<div flex gap-2 text-neutral-500>
4724
<button toolbar-btn @click="toggleLayout">
48-
<div :class="layout === 'vertical' ? 'i-mynaui:rectangle' : 'i-mynaui:rectangle-vertical'" />
25+
<div :class="settings.layout === 'vertical' ? 'i-mynaui:rectangle' : 'i-mynaui:rectangle-vertical'" />
4926
</button>
5027
<button
5128
toolbar-btn
52-
:title="`Switch to ${theme === 'dark' ? 'light' : 'dark'} theme`"
53-
@click="setTheme"
29+
:title="`Switch to ${settings.theme === 'dark' ? 'light' : 'dark'} theme`"
30+
@click="toggleTheme"
5431
>
5532
<div class="i-carbon:sun dark:i-carbon:moon" />
5633
</button>

src/composables/settings.ts

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import { useStorage, type RemovableRef } from '@vueuse/core';
2+
import { nextTick, onMounted, ref } from 'vue';
3+
4+
type Theme = 'dark' | 'light';
5+
type Layout = 'horizontal' | 'vertical';
6+
7+
interface YVSettingsStore {
8+
settings: typeof settings;
9+
toggleLayout: () => void;
10+
toggleTheme: () => void;
11+
}
12+
13+
interface YVSettings {
14+
theme: RemovableRef<Theme>;
15+
layout: RemovableRef<Layout>;
16+
}
17+
18+
19+
console.log(window.matchMedia('(prefers-color-scheme: dark)').matches)
20+
21+
const settings = ref<YVSettings>({
22+
theme: useStorage<Theme>('yehyecoa-vue-theme', window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'),
23+
layout: useStorage<Layout>('yehyecoa-vue-layout', 'horizontal'),
24+
});
25+
26+
export function useSettingsStore(): YVSettingsStore {
27+
28+
function toggleLayout(): void {
29+
settings.value.layout = settings.value.layout === 'horizontal' ? 'vertical' : 'horizontal';
30+
}
31+
32+
const cls = document.documentElement.classList;
33+
34+
function toggleTheme(): void {
35+
settings.value.theme = settings.value.theme === 'dark' ? 'light' : 'dark';
36+
37+
nextTick(() => {
38+
if (settings.value.theme === 'dark') {
39+
cls.add('dark');
40+
}
41+
else {
42+
cls.remove('dark');
43+
}
44+
});
45+
}
46+
47+
onMounted(() => {
48+
})
49+
50+
return { settings, toggleLayout, toggleTheme };
51+
}

src/icons/DownloadIcon.vue

Lines changed: 0 additions & 41 deletions
This file was deleted.

src/icons/MoonIcon.vue

Lines changed: 0 additions & 11 deletions
This file was deleted.

src/icons/SunIcon.vue

Lines changed: 0 additions & 43 deletions
This file was deleted.

0 commit comments

Comments
 (0)