quiz EN-KO

This commit is contained in:
polv committed 2026-07-06 12:20:26 +07:00
1 parent 2b62c9b9e0
commit cfb455d6ad
1 file changed
+93 -13
+93 -13
View File
@@ -14,19 +14,21 @@
</div> </div>
<div> <div>
<span v-if="v.audio"> <span :class="isKoFirst ? '' : 'spoiler'">
{{ v.ko }} <span v-if="v.audio">
<AudioButton :src="v.audio" /> {{ v.ko }}
<AudioButton :src="v.audio" />
</span>
<TTS v-else>
{{ v.ko }}
</TTS>
</span> </span>
<TTS v-else>
{{ v.ko }}
</TTS>
<span>{{ " = " }}</span> <span>{{ " = " }}</span>
<span class="spoiler"> {{ v.en }} </span> <span :class="isKoFirst ? 'spoiler' : ''"> {{ v.en }} </span>
</div> </div>
<details v-if="example" ref="sdetails"> <details v-if="example" ref="sdetails">
<summary> <summary :class="isKoFirst ? '' : 'spoiler'">
<span v-if="example.audio"> <span v-if="example.audio">
{{ example.ko }} {{ example.ko }}
<AudioButton :src="example.audio" /> <AudioButton :src="example.audio" />
@@ -36,6 +38,10 @@
</TTS> </TTS>
</summary> </summary>
<span>{{ example.en }}</span> <span>{{ example.en }}</span>
<blockquote v-if="v.notes">
{{ v.notes }}
</blockquote>
</details> </details>
</nav> </nav>
<details :class="$style.options"> <details :class="$style.options">
@@ -47,11 +53,25 @@
</label> </label>
</nav> </nav>
<nav> <nav>
<span>
<label role="switch">
<span>KR</span>
<input
type="checkbox"
name="front"
role="switch"
v-model="isKoFirst"
/>
<span role="slider"></span>
<span>EN</span>
</label>
</span>
<label> <label>
<input <input
type="checkbox" type="checkbox"
name="autoplay-audio" name="autoplay-audio"
v-model="vSentAutoplayAudio" v-model="isSentAutoplayAudio"
/> />
autoplay sentence audio autoplay sentence audio
</label> </label>
@@ -62,14 +82,16 @@
<script setup lang="ts"> <script setup lang="ts">
import { useData } from "vitepress"; import { useData } from "vitepress";
import { computed, nextTick, ref, useTemplateRef } from "vue"; import { computed, nextTick, ref, useTemplateRef, watch } from "vue";
import TTS from "./TTS.vue"; import TTS from "./TTS.vue";
const vCats = ref<string[]>([]); const vCats = ref<string[]>([]);
const vChosenCats = ref<string[]>([]); const vChosenCats = ref<string[]>([]);
const vList = ref<IVoc[]>([]); const vList = ref<IVoc[]>([]);
const vIndex = ref(-1); const vIndex = ref(-1);
const vSentAutoplayAudio = ref(true);
const isSentAutoplayAudio = ref(true);
const isKoFirst = ref(true);
const sentenceDetails = useTemplateRef("sdetails"); const sentenceDetails = useTemplateRef("sdetails");
const stts = useTemplateRef<InstanceType<typeof TTS>>("stts"); const stts = useTemplateRef<InstanceType<typeof TTS>>("stts");
@@ -101,6 +123,10 @@ vCats.value = Object.keys(vocabulary);
vChosenCats.value = [...vCats.value]; vChosenCats.value = [...vCats.value];
makeVList(); makeVList();
watch(isKoFirst, () => {
makeVList();
});
function makeVList() { function makeVList() {
nextTick(() => { nextTick(() => {
if (sentenceDetails.value) { if (sentenceDetails.value) {
@@ -127,7 +153,7 @@ function mark(isRight: boolean) {
sentenceDetails.value.open = false; sentenceDetails.value.open = false;
} }
if (vSentAutoplayAudio.value) { if (isSentAutoplayAudio.value) {
if (stts.value) { if (stts.value) {
stts.value.playAudio(); stts.value.playAudio();
} else if (example.value?.audio) { } else if (example.value?.audio) {
@@ -179,8 +205,62 @@ function updateCats(cat: string) {
} }
.options { .options {
label + label { * + label {
margin-inline-start: 0.5em; margin-inline-start: 0.5em;
} }
label[role="switch"] {
--slider-width: 50px;
position: relative;
display: inline-block;
width: calc(var(--slider-width) + 4em);
height: 24px;
input[role="switch"] {
opacity: 0;
width: 0;
height: 0;
}
/* The track */
[role="slider"] {
position: absolute;
cursor: pointer;
background-color: #ccc;
border-radius: 24px;
width: var(--slider-width);
height: 100%;
transition: background-color 0.3s;
+ span {
margin-left: calc(var(--slider-width) + 0.5em);
}
}
/* The circular slider */
[role="slider"]::before {
content: "";
position: absolute;
height: 20px;
width: 20px;
left: 4px;
bottom: 2px;
background-color: rgb(87, 87, 87);
border-radius: 50%;
transition: transform 0.3s;
}
/* Toggled state */
input:not(:checked) {
+ [role="slider"] {
/* background-color: #4caf50; */
background-color: gainsboro;
}
+ [role="slider"]::before {
transform: translateX(23px);
}
}
}
} }
</style> </style>