feat(Playroom): implement toggle functionality for more options dialog with animations
This commit is contained in:
parent
3df5b1527d
commit
1cecf52dfd
|
@ -44,6 +44,7 @@ const controllerRef = useTemplateRef('controllerRef')
|
||||||
const lyricsSection = useTemplateRef('lyricsSection')
|
const lyricsSection = useTemplateRef('lyricsSection')
|
||||||
const albumCover = useTemplateRef('albumCover')
|
const albumCover = useTemplateRef('albumCover')
|
||||||
const songInfo = useTemplateRef('songInfo')
|
const songInfo = useTemplateRef('songInfo')
|
||||||
|
const moreOptionsDialog = useTemplateRef('moreOptionsDialog')
|
||||||
|
|
||||||
const playButton = useTemplateRef('playButton')
|
const playButton = useTemplateRef('playButton')
|
||||||
|
|
||||||
|
@ -229,6 +230,47 @@ function getCurrentTrack() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function toggleMoreOptions() {
|
||||||
|
if (!showMoreOptions.value) {
|
||||||
|
showMoreOptions.value = true
|
||||||
|
nextTick(() => {
|
||||||
|
if (moreOptionsDialog.value) {
|
||||||
|
const tl = gsap.timeline()
|
||||||
|
tl.fromTo(moreOptionsDialog.value,
|
||||||
|
{ opacity: 0, scale: 0.9, y: 10 },
|
||||||
|
{ opacity: 1, scale: 1, y: 0, duration: 0.2, ease: "power2.out" }
|
||||||
|
)
|
||||||
|
if (moreOptionsDialog.value.children[0]?.children) {
|
||||||
|
tl.fromTo(moreOptionsDialog.value.children[0].children,
|
||||||
|
{ opacity: 0, x: -10 },
|
||||||
|
{ opacity: 1, x: 0, duration: 0.15, ease: "power2.out", stagger: 0.05 },
|
||||||
|
"<0.1"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
if (moreOptionsDialog.value) {
|
||||||
|
const tl = gsap.timeline({
|
||||||
|
onComplete: () => {
|
||||||
|
showMoreOptions.value = false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (moreOptionsDialog.value.children[0]?.children) {
|
||||||
|
tl.to(moreOptionsDialog.value.children[0].children,
|
||||||
|
{ opacity: 0, x: -10, duration: 0.1, ease: "power2.in", stagger: 0.02 }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
tl.to(moreOptionsDialog.value,
|
||||||
|
{ opacity: 0, scale: 0.9, y: 10, duration: 0.15, ease: "power2.in" },
|
||||||
|
moreOptionsDialog.value.children[0]?.children ? "<0.05" : "0"
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
showMoreOptions.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
watch(() => [preferences.presentLyrics, getCurrentTrack().song.lyricUrl], (newValue, oldValue) => {
|
watch(() => [preferences.presentLyrics, getCurrentTrack().song.lyricUrl], (newValue, oldValue) => {
|
||||||
const [showLyrics, hasLyricUrl] = newValue
|
const [showLyrics, hasLyricUrl] = newValue
|
||||||
const [prevShowLyrics, _prevHasLyricUrl] = oldValue || [false, null]
|
const [prevShowLyrics, _prevHasLyricUrl] = oldValue || [false, null]
|
||||||
|
@ -525,7 +567,7 @@ watch(() => playQueueStore.currentIndex, () => {
|
||||||
</div>
|
</div>
|
||||||
<button
|
<button
|
||||||
class="text-white h-8 w-8 flex justify-center items-center rounded-full hover:bg-white/25 transition-all"
|
class="text-white h-8 w-8 flex justify-center items-center rounded-full hover:bg-white/25 transition-all"
|
||||||
@click="showMoreOptions = !showMoreOptions">
|
@click="toggleMoreOptions">
|
||||||
<div class="w-6 h-6 relative">
|
<div class="w-6 h-6 relative">
|
||||||
<span class="text-black blur-sm absolute top-0 left-0 hover:scale-110 transition-all">
|
<span class="text-black blur-sm absolute top-0 left-0 hover:scale-110 transition-all">
|
||||||
<EllipsisHorizontalIcon :size="6" />
|
<EllipsisHorizontalIcon :size="6" />
|
||||||
|
@ -534,12 +576,12 @@ watch(() => playQueueStore.currentIndex, () => {
|
||||||
<EllipsisHorizontalIcon :size="6" />
|
<EllipsisHorizontalIcon :size="6" />
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<dialog :open="showMoreOptions" @click.self="showMoreOptions = false"
|
<dialog :open="showMoreOptions" @click.self="toggleMoreOptions" ref="moreOptionsDialog"
|
||||||
class="bottom-8 left-[-13.3rem] w-60 rounded-md overflow-hidden bg-black/60 backdrop-blur-3xl shadow-2xl border border-[#ffffff39]">
|
class="bottom-8 left-[-13.3rem] w-60 rounded-md overflow-hidden bg-black/60 backdrop-blur-3xl shadow-2xl border border-[#ffffff39]">
|
||||||
<ul class="my-2 flex flex-col gap-1">
|
<ul class="my-2 flex flex-col gap-1">
|
||||||
<li>
|
<li>
|
||||||
<button
|
<button
|
||||||
class="flex px-2 py-1 hover:bg-white/10 w-full text-left disabled:opacity-70 cursor-not-allowed"
|
class="flex px-2 py-1 hover:bg-white/10 w-full text-left disabled:opacity-70 cursor-not-allowed transition-colors duration-150"
|
||||||
disabled>
|
disabled>
|
||||||
<MuscialNoteSparklingIcon :size="4" class="text-white mr-2" />
|
<MuscialNoteSparklingIcon :size="4" class="text-white mr-2" />
|
||||||
<div class="flex-col">
|
<div class="flex-col">
|
||||||
|
@ -551,7 +593,7 @@ watch(() => playQueueStore.currentIndex, () => {
|
||||||
|
|
||||||
<li>
|
<li>
|
||||||
<button
|
<button
|
||||||
class="flex px-2 py-1 hover:bg-white/10 w-full text-left disabled:opacity-70 cursor-not-allowed"
|
class="flex px-2 py-1 hover:bg-white/10 w-full text-left disabled:opacity-70 cursor-not-allowed transition-colors duration-150"
|
||||||
disabled>
|
disabled>
|
||||||
<CastEmptyIcon :size="4" class="text-white mr-2" />
|
<CastEmptyIcon :size="4" class="text-white mr-2" />
|
||||||
<div class="flex-col">
|
<div class="flex-col">
|
||||||
|
|
Loading…
Reference in New Issue
Block a user