{"version":3,"file":"slide-deck.umd.cjs","sources":["../src/Slide.vue","../src/SlideDeck.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, onMounted, VNode } from 'vue';\n\nconst props = defineProps<{\n    node?: VNode\n}>();\n\nconst nodeRef = ref<VNode>();\n\nonMounted(() => {\n    nodeRef.value?.el?.dispatchEvent(new Event('enter'));\n});\n</script>\n\n<template>\n    <div class=\"slide-deck-slide\">\n        <Component\n            :is=\"props.node\"\n            ref=\"nodeRef\" />\n    </div>\n</template>","<script setup lang=\"ts\">\nimport { computed, ref, watch, nextTick, watchEffect, VNode, useSlots } from 'vue';\nimport Slide from './Slide.vue';\n\nexport type SlideDeckProps = {\n    attrs?: Record<string, unknown>;\n    active?: number;\n    autoResize?: boolean;\n    controls?: boolean;\n    props?: Record<string, unknown>;\n    modelValue?: number;\n};\n\nconst props = withDefaults(defineProps<SlideDeckProps>(), {\n    attrs: () => ({}),\n    active: 0,\n    autoResize: true,\n    controls: false,\n    props: () => ({}),\n    modelValue: 0\n});\n\nconst emit = defineEmits<{\n    'before-enter': [current: VNode | undefined, previous: VNode | undefined];\n    'enter': [current: VNode | undefined, previous: VNode | undefined];\n    'after-enter': [current: VNode | undefined, previous: VNode | undefined];\n    'before-leave': [current: VNode | undefined, previous: VNode | undefined];\n    'leave': [current: VNode | undefined, previous: VNode | undefined];\n    'after-leave': [current: VNode | undefined, previous: VNode | undefined];\n    'update:modelValue': [value: number];\n}>();\n\nconst slots = useSlots();\n\nconst currentActive = ref<number>(0);\nconst direction = ref<'forward' | 'backward'>('forward');\nconst maxHeight = ref<string | undefined>(undefined);\nconst mounted = ref<boolean>(false);\nconst lastSlide = ref<number | null>(null);\nconst sliding = ref<boolean>(false);\n\nwatchEffect(() => {\n    currentActive.value = props.active ?? props.modelValue;\n});\n\n\nwatch(currentActive, (value: number, oldValue: number) => {\n    lastSlide.value = oldValue;\n    direction.value = (\n        findIndex(oldValue) > findIndex(value)\n    ) ? 'backward' : 'forward';\n    emit('update:modelValue', value);\n});\n\n// Computed\nconst classes = computed(() => ({\n    sliding: sliding.value\n}));\n\nconst contentClasses = computed(() => ({\n    [direction.value]: true\n}));\n\nconst { isFirstSlide, isLastSlide, totalSlides } = computed(() => {\n    const currentIndex = findIndex(currentActive.value);\n    const total = vnodes().length;\n    \n    return {\n        isFirstSlide: currentIndex === 0,\n        isLastSlide: currentIndex === total - 1,\n        totalSlides: total\n    };\n}).value;\n\n// Methods\nfunction vnodes(): VNode[] {\n    const defaultSlot = slots.default?.({ next, prev, first, last, goto }) || [];\n    \n    return defaultSlot.map((slot: VNode, key: number) => {\n        slot.props = Object.assign(\n            {}, slot.props, props.props, props.attrs\n        );\n        \n        return Object.assign(slot, {\n            key: slot.key ?? key\n        });\n    });\n}\n\nfunction findIndex(key: string | number): number {\n    return vnodes().findIndex((vnode: VNode, i: number) => {\n        if(vnode.key === key) {\n            return true;\n        }\n        \n        if(i === key) {\n            return true;\n        }\n\n        return false;\n    });\n}\n\nfunction find(key: string | number): VNode | undefined {\n    const index = findIndex(key);\n    return index >= 0 ? vnodes()[index] : undefined;\n}\n\nfunction slot(): VNode | undefined {\n    return find(currentActive.value);\n}\n\nfunction first(): void {\n    goto(0);\n}\n\nfunction last(): void {\n    goto(vnodes().length - 1);\n}\n\nfunction goto(key: number): void {\n    if(!sliding.value) {\n        currentActive.value = Math.max(0, Math.min(key, vnodes().length - 1));\n    }\n}\n\nfunction next(): void {\n    if(!sliding.value) {\n        const nextIndex = findIndex(currentActive.value) + 1;\n        if(nextIndex < vnodes().length) {\n            currentActive.value = nextIndex;\n        }\n    }\n}\n\nfunction prev(): void {\n    if(!sliding.value) {\n        const prevIndex = findIndex(currentActive.value) - 1;\n        if(prevIndex >= 0) {\n            currentActive.value = prevIndex;\n        }\n    }\n}\n\nfunction resize(el: Element): void {\n    if(!(el instanceof HTMLElement)) return;\n    \n    const height = getComputedStyle(el).height;\n\n    maxHeight.value = height === '0px'\n        ? maxHeight.value\n        : height;\n}\n\nfunction onClickControl(_e: Event, vnode: VNode): void {\n    if(!sliding.value && typeof vnode.key === 'number') {\n        goto(vnode.key);\n    }\n}\n\nfunction onBeforeLeave(el: Element): void {\n    if(props.autoResize) {\n        resize(el);\n    }\n    const previous = lastSlide.value !== null ? find(lastSlide.value) : undefined;\n    emit('before-leave', slot(), previous);\n}\n\nfunction onBeforeEnter(): void {\n    sliding.value = true;\n    const previous = lastSlide.value !== null ? find(lastSlide.value) : undefined;\n    emit('before-enter', slot(), previous);\n}\n\nfunction onEnter(el: Element): void {\n    nextTick(() => {\n        if(props.autoResize) {\n            resize(el);\n        }\n        const previous = lastSlide.value !== null ? find(lastSlide.value) : undefined;\n        emit('enter', slot(), previous);\n    });\n}\n\nfunction onAfterEnter(): void {\n    const previous = lastSlide.value !== null ? find(lastSlide.value) : undefined;\n    emit('after-enter', slot(), previous);\n}\n\nfunction onLeave(): void {\n    nextTick(() => {\n        const previous = lastSlide.value !== null ? find(lastSlide.value) : undefined;\n        emit('leave', slot(), previous);\n    });\n}\n\nfunction onAfterLeave(): void {\n    sliding.value = false;\n\n    nextTick(() => {\n        maxHeight.value = undefined;\n        const previous = lastSlide.value !== null ? find(lastSlide.value) : undefined;\n        emit('after-leave', slot(), previous);\n    });\n}\n\nnextTick(() => {\n    mounted.value = true;\n    emit('enter', slot(), undefined);\n});\n\ndefineExpose({\n    currentActive,\n    direction,\n    maxHeight,\n    mounted,\n    lastSlide,\n    sliding,\n    isFirstSlide,\n    isLastSlide,\n    totalSlides,\n    findIndex,\n    find,\n    first,\n    last,\n    goto,\n    next,\n    prev,\n    resize,\n    slot,\n    vnodes,\n    onClickControl\n});\n</script>\n\n<template>\n    <div\n        class=\"slide-deck\"\n        :class=\"classes\">\n        <slot\n            name=\"top\"\n            :active=\"currentActive\" />\n        <div\n            ref=\"content\"\n            class=\"slide-deck-content\"\n            :class=\"contentClasses\"\n            :style=\"{ maxHeight }\">\n            <Transition\n                :name=\"`slide-${direction}`\"\n                @before-enter=\"onBeforeEnter\"\n                @enter=\"onEnter\"\n                @after-enter=\"onAfterEnter\"\n                @before-leave=\"onBeforeLeave\"\n                @leave=\"onLeave\"\n                @after-leave=\"onAfterLeave\">\n                <KeepAlive>\n                    <Slide\n                        ref=\"slide\"\n                        :key=\"currentActive\"\n                        :node=\"find(currentActive)\" />\n                </KeepAlive>\n            </Transition>\n        </div>\n        <slot\n            name=\"middle\"\n            :active=\"currentActive\" />\n        <slot\n            name=\"bottom\"\n            :active=\"currentActive\" />\n    </div>\n</template>"],"names":["props","__props","nodeRef","ref","onMounted","_openBlock","_createElementBlock","_hoisted_1","_createBlock","_resolveDynamicComponent","emit","__emit","slots","useSlots","currentActive","direction","maxHeight","mounted","lastSlide","sliding","watchEffect","watch","value","oldValue","findIndex","classes","computed","contentClasses","isFirstSlide","isLastSlide","totalSlides","currentIndex","total","vnodes","next","prev","first","last","goto","slot","key","vnode","i","find","index","nextIndex","prevIndex","resize","el","height","onClickControl","_e","onBeforeLeave","previous","onBeforeEnter","onEnter","nextTick","onAfterEnter","onLeave","onAfterLeave","__expose","_normalizeClass","_renderSlot","_ctx","_createElementVNode","_createVNode","_Transition","_KeepAlive","Slide"],"mappings":"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"}