linguaielts-api / fronted /src /components /shadowing /ShadowingPlaybackControls.vue
AnhviNguyen
Forecast, dashboard, pronunciation, nginx fixes (exclude large ML weights)
3092643
Raw
History Blame Contribute Delete
2.67 kB
<template>
<div class="flex flex-wrap items-center gap-2" :class="compact ? 'justify-center' : ''">
<button type="button" class="sh-btn" :class="compact ? 'px-2 py-2' : ''" title="Câu trước" @click="$emit('prev')">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polygon points="19 20 9 12 19 4"/><line x1="5" y1="19" x2="5" y2="5"/></svg>
<span v-if="!compact">Câu trước</span>
</button>
<button type="button" class="sh-btn" :class="compact ? 'px-2 py-2' : ''" title="Phát lại" @click="$emit('replay')">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="23 4 23 10 17 10"/><path d="M20.49 15a9 9 0 1 1-2.12-9.36L23 10"/></svg>
<span v-if="!compact">Phát lại</span>
</button>
<button type="button" class="sh-btn sh-btn-primary" :class="compact ? 'px-3 py-2' : ''" title="Play/Pause" @click="$emit('toggle-play')">
<svg v-if="playing" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="6" y="4" width="4" height="16"/><rect x="14" y="4" width="4" height="16"/></svg>
<svg v-else width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polygon points="5 3 19 12 5 21 5 3"/></svg>
<span v-if="!compact">{{ playing ? 'Tạm dừng' : 'Phát' }}</span>
</button>
<button type="button" class="sh-btn" :class="compact ? 'px-2 py-2' : ''" title="Câu tiếp" @click="$emit('next')">
<span v-if="!compact">Câu tiếp</span>
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polygon points="5 4 15 12 5 20"/><line x1="19" y1="5" x2="19" y2="19"/></svg>
</button>
<div v-if="showSpeed" class="flex items-center gap-1 border-l border-[var(--border)] pl-2">
<button
v-for="r in rates"
:key="r"
type="button"
class="rounded-lg border px-2 py-1 text-[11px] font-bold"
:class="rate === r ? 'border-[var(--spotify-green)] bg-[var(--green-bg)] text-[var(--spotify-green)]' : 'border-[var(--border)] bg-[var(--bg-surface)] text-[var(--ink2)]'"
@click="$emit('update:rate', r)"
>
{{ r }}x
</button>
</div>
</div>
</template>
<script setup>
defineProps({
playing: { type: Boolean, default: false },
rate: { type: Number, default: 1 },
compact: { type: Boolean, default: false },
showSpeed: { type: Boolean, default: true },
})
defineEmits(['prev', 'replay', 'next', 'toggle-play', 'update:rate'])
const rates = [0.5, 0.75, 1]
</script>