feat(ui): cloud folder zoom transition on path change
Re-key FileGrid on the current folder path and wrap it in a cloud-zoom Transition so the depth/zoom animation replays at every folder level; the header + breadcrumb nav stay fixed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
790da4bd0f
commit
d0ca53501c
@ -93,16 +93,23 @@
|
|||||||
@upload="handleUpload"
|
@upload="handleUpload"
|
||||||
@update:view-mode="viewMode = $event"
|
@update:view-mode="viewMode = $event"
|
||||||
/>
|
/>
|
||||||
<FileGrid
|
<!-- Re-key on the current folder path so the depth/zoom animation replays
|
||||||
:items="cloudStore.sortedItems"
|
at every level (folder → subfolder → …), not just on first entry.
|
||||||
:loading="cloudStore.loading"
|
Only the file content zooms; the header + breadcrumb nav above stay
|
||||||
:view-mode="viewMode"
|
fixed in place. -->
|
||||||
@navigate="navigateCloudPath"
|
<Transition name="cloud-zoom" mode="out-in">
|
||||||
@delete="handleDelete"
|
<FileGrid
|
||||||
@play="handlePlay"
|
:key="cloudStore.currentPath"
|
||||||
@share="handleShare"
|
:items="cloudStore.sortedItems"
|
||||||
@preview="handlePreview"
|
:loading="cloudStore.loading"
|
||||||
/>
|
:view-mode="viewMode"
|
||||||
|
@navigate="navigateCloudPath"
|
||||||
|
@delete="handleDelete"
|
||||||
|
@play="handlePlay"
|
||||||
|
@share="handleShare"
|
||||||
|
@preview="handlePreview"
|
||||||
|
/>
|
||||||
|
</Transition>
|
||||||
|
|
||||||
<!-- Audio player is now the global bottom bar (GlobalAudioPlayer in App.vue) -->
|
<!-- Audio player is now the global bottom bar (GlobalAudioPlayer in App.vue) -->
|
||||||
</div>
|
</div>
|
||||||
@ -386,3 +393,41 @@ function goBack() {
|
|||||||
router.push('/dashboard/cloud')
|
router.push('/dashboard/cloud')
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<!-- Not scoped: the transition classes are applied to the FileGrid child's root
|
||||||
|
element, which lives outside this component's style scope. Matches the
|
||||||
|
`depth-forward` route transition feel (zoom in from depth + blur). -->
|
||||||
|
<style>
|
||||||
|
.cloud-zoom-enter-active,
|
||||||
|
.cloud-zoom-leave-active {
|
||||||
|
transition:
|
||||||
|
opacity 0.38s cubic-bezier(0.25, 0.46, 0.45, 0.94),
|
||||||
|
transform 0.38s cubic-bezier(0.25, 0.46, 0.45, 0.94),
|
||||||
|
filter 0.38s cubic-bezier(0.25, 0.46, 0.45, 0.94);
|
||||||
|
transform-origin: center center;
|
||||||
|
will-change: opacity, transform, filter;
|
||||||
|
}
|
||||||
|
/* New folder zooms in from depth */
|
||||||
|
.cloud-zoom-enter-from {
|
||||||
|
opacity: 0;
|
||||||
|
transform: scale(0.82);
|
||||||
|
filter: blur(4px);
|
||||||
|
}
|
||||||
|
/* Previous folder recedes forward as it leaves */
|
||||||
|
.cloud-zoom-leave-to {
|
||||||
|
opacity: 0;
|
||||||
|
transform: scale(1.12);
|
||||||
|
filter: blur(6px);
|
||||||
|
}
|
||||||
|
@media (prefers-reduced-motion: reduce) {
|
||||||
|
.cloud-zoom-enter-active,
|
||||||
|
.cloud-zoom-leave-active {
|
||||||
|
transition: opacity 0.2s ease;
|
||||||
|
}
|
||||||
|
.cloud-zoom-enter-from,
|
||||||
|
.cloud-zoom-leave-to {
|
||||||
|
transform: none;
|
||||||
|
filter: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user