import type { Meta, StoryObj } from '@storybook/vue3-vite' import { onMounted, ref } from 'vue' import LoadingBar from '../../components/base/LoadingBar.vue' import ReadyTransition from '../../components/base/ReadyTransition.vue' import { createLoadingStateCore } from '../../composables/use-loading-state-core' import { provideLoadingState } from '../../providers/loading-state' const meta = { title: 'Base/ReadyTransition', component: ReadyTransition, } satisfies Meta export default meta type Story = StoryObj export const Idle: Story = { render: () => ({ components: { ReadyTransition, LoadingBar }, setup() { provideLoadingState(createLoadingStateCore()) return { pending: ref(false) } }, template: `
Slot content (already ready).
`, }), } /** Pending false from mount — no enter fade (cache-hit path). */ export const CacheHit: Story = { render: () => ({ components: { ReadyTransition, LoadingBar }, setup() { provideLoadingState(createLoadingStateCore()) return { pending: ref(false) } }, template: `

pending stays false — content should appear with no fade-in.

Cached content visible immediately.
`, }), } /** Cold load: pending true then false — fade-in runs. */ export const ColdLoad: Story = { render: () => ({ components: { ReadyTransition, LoadingBar }, setup() { provideLoadingState(createLoadingStateCore()) const pending = ref(true) onMounted(() => { setTimeout(() => (pending.value = false), 600) }) return { pending } }, template: `

Pending 600ms then ready — content fades in; bar runs while pending.

Content after cold load.
`, }), } export const PendingThenReady: Story = { render: () => ({ components: { ReadyTransition, LoadingBar }, setup() { provideLoadingState(createLoadingStateCore()) const pending = ref(true) onMounted(() => { setTimeout(() => (pending.value = false), 2000) }) return { pending } }, template: `

Pending for 2s, then content fades in. Bar runs at top.

Slot content revealed.
`, }), } export const StackedTwoTransitions: Story = { render: () => ({ components: { ReadyTransition, LoadingBar }, setup() { provideLoadingState(createLoadingStateCore()) const a = ref(true) const b = ref(true) onMounted(() => { setTimeout(() => (a.value = false), 1500) setTimeout(() => (b.value = false), 3000) }) return { a, b } }, template: `
Panel A (ready at 1.5s).
Panel B (ready at 3s).

Bar stays visible until BOTH panels resolve.

`, }), } export const Silent: Story = { render: () => ({ components: { ReadyTransition, LoadingBar }, setup() { provideLoadingState(createLoadingStateCore()) const pending = ref(true) onMounted(() => { setTimeout(() => (pending.value = false), 1500) }) return { pending } }, template: `

silent=true — fades locally but does NOT raise the loading bar.

Silent slot content.
`, }), }