90686e6deb
AppSnackbar mounts once at the app root and exposes a window.__fcToast function the stores call from error paths. This avoids prop-drilling a toast emitter through every component while keeping the snackbar component itself testable in isolation. GalleryGrid renders shimmer-skeleton placeholders on initial load so the first paint isn't empty. Skeleton uses the same auto-fill grid columns as the real items so layout doesn't shift when content arrives. Modal arrow nav now ignores text-entry elements so typing in the tag autocomplete doesn't navigate prev/next. Small-screen breakpoint (<600px) tightens gallery thumbnails to 120px min. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
22 lines
484 B
Vue
22 lines
484 B
Vue
<template>
|
|
<v-app>
|
|
<AppShell>
|
|
<RouterView />
|
|
</AppShell>
|
|
<AppSnackbar ref="snackbar" />
|
|
</v-app>
|
|
</template>
|
|
|
|
<script setup>
|
|
import { onMounted, ref } from 'vue'
|
|
import AppShell from './components/AppShell.vue'
|
|
import AppSnackbar from './components/AppSnackbar.vue'
|
|
|
|
const snackbar = ref(null)
|
|
|
|
onMounted(() => {
|
|
// Expose snackbar via a simple global so stores can call it without props.
|
|
window.__fcToast = (opts) => snackbar.value?.open(opts)
|
|
})
|
|
</script>
|