{"version":3,"file":"carousel.mjs","sources":["../../src/components/carousel/Carousel.vue","../../src/components/carousel/CarouselItem.vue","../../src/components/carousel/index.ts"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n    computed,\n    watch,\n    onBeforeUnmount,\n    onMounted,\n    ref,\n    nextTick,\n    readonly,\n    toRaw,\n    useTemplateRef,\n    triggerRef,\n} from \"vue\";\n\nimport OIcon from \"../icon/Icon.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { sign, mod, bound, isDefined } from \"@/utils/helpers\";\nimport { isClient } from \"@/utils/ssr\";\nimport {\n    defineClasses,\n    useProviderParent,\n    type ProviderItem,\n} from \"@/composables\";\n\nimport type { CarouselComponent } from \"./types\";\nimport type { ClassBind } from \"@/types\";\nimport type { CarouselProps } from \"./props\";\n\n/**\n * A Slideshow for cycling images in confined spaces.\n * @displayName Carousel\n * @requires ./CarouselItem.vue\n * @style _carousel.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OCarousel\",\n    configField: \"carousel\",\n});\n\nconst props = withDefaults(defineProps<CarouselProps>(), {\n    override: undefined,\n    modelValue: 0,\n    dragable: true,\n    autoplay: false,\n    interval: () => getDefault(\"carousel.interval\", 3500),\n    pauseHover: false,\n    repeat: false,\n    overlay: false,\n    indicators: true,\n    indicatorInside: false,\n    indicatorPosition: () => getDefault(\"carousel.indicatorPosition\", \"bottom\"),\n    indicatorStyle: () => getDefault(\"carousel.indicatorStyle\", \"dots\"),\n    itemsToShow: () => getDefault(\"carousel.itemsToShow\", 1),\n    itemsToList: () => getDefault(\"carousel.itemsToList\", 1),\n    arrows: () => getDefault(\"carousel.arrows\", true),\n    arrowsHover: () => getDefault(\"carousel.arrowsHover\", true),\n    iconPack: () => getDefault(\"carousel.iconPack\"),\n    iconSize: () => getDefault(\"carousel.iconSize\"),\n    iconPrev: () => getDefault(\"carousel.iconPrev\", \"chevron-left\"),\n    iconNext: () => getDefault(\"carousel.iconNext\", \"chevron-right\"),\n    iconAutoplayPause: () => getDefault(\"carousel.iconAutoplayPause\", \"pause\"),\n    iconAutoplayResume: () => getDefault(\"carousel.iconAutoplayResume\", \"play\"),\n    breakpoints: () => ({}),\n    ariaAutoplayPauseLabel: () =>\n        getDefault(\n            \"carousel.ariaAutoplayPauseLabel\",\n            \"Stop Automatic Slide Show\",\n        ),\n    ariaAutoplayResumeLabel: () =>\n        getDefault(\n            \"carousel.ariaAutoplayResumeLabel\",\n            \"Start Automatic Slide Show\",\n        ),\n    ariaNextLabel: () => getDefault(\"carousel.ariaNextLabel\", \"Next Slide\"),\n    ariaPreviousLabel: () =>\n        getDefault(\"carousel.ariaPreviousLabel\", \"Previous Slide\"),\n});\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {number} updated modelValue prop\n     */\n    \"update:model-value\": [value: number];\n    /**\n     * on carousel slide change event\n     * @param value {number} active index\n     */\n    change: [value: number];\n    /**\n     * on item click event\n     * @param event {event} native event\n     */\n    click: [event: Event];\n}>();\n\nconst rootRef = useTemplateRef(\"rootElement\");\n\n// provided data is a computed ref to ensure reactivity\nconst provideData = computed<CarouselComponent>(() => ({\n    activeIndex: activeIndex.value,\n    indicators: props.indicators,\n    total: total.value,\n    itemWidth: itemWidth.value,\n    onDrag: onDragStart,\n    onClick: (event: Event): void => emits(\"click\", event),\n    setActive: (index: number): void => switchTo(index),\n}));\n\n/** provide functionalities and data to child item components */\nconst { childItems } = useProviderParent({ rootRef, data: provideData });\n\n// the real index of the active item, use v-model to make it two-way binding\nconst activeIndex = defineModel<number>({ default: 0 });\n\nconst total = computed(() => childItems.value.length);\n\nconst indicatorItems = computed(() =>\n    childItems.value.filter(\n        (el, i) => mod(i, settings.value.itemsToList) === 0,\n    ),\n);\n\nlet resizeObserver: ResizeObserver | undefined;\nif (isClient && window.ResizeObserver) {\n    resizeObserver = new window.ResizeObserver(onRefresh);\n}\n\n/** watch specific props which need to refresh the component */\nwatch(\n    [\n        () => props.itemsToList,\n        () => props.itemsToShow,\n        () => props.arrowsHover,\n        () => props.repeat,\n    ],\n    () => onRefresh(),\n);\n\nconst windowWidth = ref(0);\n\nfunction onRefresh(): void {\n    activeIndex.value = 0;\n    // set HTML element with\n    windowWidth.value = window.innerWidth;\n    // trigger re creation of settings based on props\n    nextTick(() => triggerRef(settings));\n}\n\nonMounted(() => {\n    if (isClient) {\n        if (window.ResizeObserver && resizeObserver && rootRef.value)\n            resizeObserver.observe(rootRef.value);\n\n        // set HTML element with\n        windowWidth.value = window.innerWidth;\n\n        // a prefers-reduced-motion user setting must always override autoplay\n        const hasReducedMotion = window.matchMedia(\n            \"(prefers-reduced-motion: reduce)\",\n        );\n        if (!hasReducedMotion?.matches) startTimer();\n    }\n});\n\nonBeforeUnmount(() => {\n    if (isClient) {\n        if (window.ResizeObserver && resizeObserver)\n            resizeObserver.disconnect();\n\n        onDragEnd();\n        pauseTimer();\n    }\n});\n\nconst settings = computed<typeof props>(() => {\n    const breakpoints = Object.keys(props.breakpoints)\n        .map(Number)\n        .sort((a, b) => b - a);\n\n    const breakpoint = breakpoints.find(\n        (breakpoint) => windowWidth.value >= breakpoint,\n    );\n\n    const settings = toRaw(\n        breakpoint ? { ...props, ...props.breakpoints[breakpoint] } : props,\n    );\n\n    // prevent empty values\n    if (!settings.itemsToList) settings.itemsToList = 1;\n    if (!settings.itemsToShow) settings.itemsToShow = 1;\n    return readonly(settings);\n});\n\nconst itemWidth = computed(() => {\n    // Ensure component is mounted\n    if (!windowWidth.value || !rootRef.value) return 0;\n\n    const rect = rootRef.value.getBoundingClientRect();\n    return rect.width / settings.value.itemsToShow;\n});\n\n// #region --- Switch Events ---\n\nconst hasArrows = computed(\n    () =>\n        (settings.value.arrowsHover && isHovered.value) ||\n        !settings.value.arrowsHover,\n);\n\nconst hasPrev = computed(() => settings.value.repeat || activeIndex.value > 0);\n\nfunction onPrev(): void {\n    switchTo(activeIndex.value - settings.value.itemsToList);\n}\n\nconst hasNext = computed(\n    () =>\n        settings.value.repeat ||\n        activeIndex.value < total.value - settings.value.itemsToList,\n);\n\nfunction onNext(): void {\n    switchTo(activeIndex.value + settings.value.itemsToList);\n}\n\n/** Go to the first viable item */\nfunction onHomePressed(): void {\n    switchTo(0);\n}\n\n/** Go to the last viable item */\nfunction onEndPressed(): void {\n    switchTo(total.value - settings.value.itemsToList);\n}\n\n/**\n * Show the slide by index\n * @param index the real index of the slide\n */\nfunction switchTo(index: number = 0): void {\n    if (settings.value.repeat) index = mod(index, total.value);\n    index = bound(index, 0, total.value - 1);\n\n    activeIndex.value = index;\n    emits(\"change\", index);\n}\n\n/** Set focus on a tab item. */\nfunction onChange(item: ProviderItem): void {\n    switchTo(item.index);\n}\n\n// #endregion --- Switch Events ---\n\n// #region --- Autoplay Feature ---\n\nconst isHovered = ref(false);\nlet timer: ReturnType<typeof setTimeout> | undefined;\n/** deactive autoplay feature */\nconst isAutoplayPaused = ref(false);\n\nfunction onMouseEnter(): void {\n    isHovered.value = true;\n    if (props.autoplay && props.pauseHover) pauseTimer();\n}\n\nfunction onMouseLeave(): void {\n    isHovered.value = false;\n    if (props.autoplay && props.pauseHover) startTimer();\n}\n\n/** When autoplay is changed, start or pause timer accordingly */\nwatch(\n    () => props.autoplay,\n    (status) => {\n        if (status) startTimer();\n        else pauseTimer();\n    },\n);\n\n/** Since the timer can get paused at the end, if repeat is changed we need to restart it */\nwatch(\n    () => props.repeat,\n    (status) => {\n        if (status) startTimer();\n    },\n);\n\nfunction onToggleAutoplay(): void {\n    if (!isAutoplayPaused.value) {\n        isAutoplayPaused.value = true;\n        pauseTimer();\n    } else {\n        isAutoplayPaused.value = false;\n        startTimer();\n    }\n}\n\nfunction startTimer(): void {\n    if (!props.autoplay || timer) return;\n    if (isAutoplayPaused.value) return;\n    timer = setInterval(() => {\n        if (!props.repeat && !hasNext.value) pauseTimer();\n        else onNext();\n    }, props.interval);\n}\n\nfunction pauseTimer(): void {\n    if (timer) {\n        clearInterval(timer);\n        timer = undefined;\n    }\n}\n\n// #endregion --- Autoplay Feature ---\n\n// #region --- Drag & Drop Feature ---\n\nconst dragX = ref();\nconst delta = ref(0);\n\nconst isDragging = computed(() => isDefined(dragX.value));\n\nconst translation = computed(\n    () =>\n        -bound(\n            delta.value + activeIndex.value * itemWidth.value,\n            0,\n            (childItems.value.length - settings.value.itemsToShow) *\n                itemWidth.value,\n        ),\n);\n\n/** handle drag event */\nfunction onDragStart(event: TouchEvent | MouseEvent): void {\n    if (\n        isDragging.value ||\n        !settings.value.dragable ||\n        ((event as MouseEvent).button !== 0 && event.type !== \"touchstart\")\n    )\n        return;\n\n    delta.value = 0;\n    // get dragging start x value\n    dragX.value = !!(event as TouchEvent).touches\n        ? (event as TouchEvent).touches[0].clientX\n        : (event as MouseEvent).clientX;\n\n    // stop timer when dragging starts\n    pauseTimer();\n}\n\nfunction onDragOver(event: TouchEvent | MouseEvent): void {\n    if (!isDragging.value) return;\n\n    const dragEndX = !!(event as TouchEvent).touches\n        ? (\n              (event as TouchEvent).changedTouches[0] ||\n              (event as TouchEvent).touches[0]\n          ).clientX\n        : (event as MouseEvent).clientX;\n    // calc transition delta value\n    delta.value = dragX.value - dragEndX;\n}\n\nfunction onDragEnd(): void {\n    if (!isDragging.value) return;\n    // switch slide\n    const signCheck = sign(delta.value);\n    const results = Math.round(Math.abs(delta.value / itemWidth.value) + 0.15); // Hack\n    switchTo(activeIndex.value + signCheck * results);\n\n    // cleanup\n    delta.value = 0;\n    dragX.value = undefined;\n\n    // atart timer after dragging ends\n    startTimer();\n}\n\n// #endregion --- Drag & Drop Feature ---\n\n// --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-carousel\"],\n    [\n        \"overlayClass\",\n        \"o-carousel__overlay\",\n        null,\n        computed(() => props.overlay),\n    ],\n);\n\nconst wrapperClasses = defineClasses([\"wrapperClass\", \"o-carousel__wrapper\"]);\n\nconst itemsClasses = defineClasses(\n    [\"itemsClass\", \"o-carousel__items\"],\n    [\"itemsDraggingClass\", \"o-carousel__items--dragging\", null, isDragging],\n);\n\nconst prevIconClasses = defineClasses(\n    [\"iconClass\", \"o-carousel__icon\"],\n    [\"iconPrevClass\", \"o-carousel__icon-prev\"],\n);\n\nconst nextIconClasses = defineClasses(\n    [\"iconClass\", \"o-carousel__icon\"],\n    [\"iconNextClass\", \"o-carousel__icon-next\"],\n);\n\nconst autoplayIconClasses = defineClasses(\n    [\"iconClass\", \"o-carousel__icon\"],\n    [\"iconAutoplayClass\", \"o-carousel__icon-autoplay\"],\n);\n\nconst indicatorsClasses = defineClasses(\n    [\"indicatorsClass\", \"o-carousel__indicators\"],\n    [\n        \"indicatorsInsideClass\",\n        \"o-carousel__indicators--inside\",\n        null,\n        computed(() => !!props.indicatorInside),\n    ],\n    [\n        \"indicatorsPositionClass\",\n        \"o-carousel__indicators--\",\n        computed(() => props.indicatorPosition),\n        computed(() => !!props.indicatorPosition),\n    ],\n);\n\nconst indicatorClasses = defineClasses([\n    \"indicatorClass\",\n    \"o-carousel__indicator\",\n]);\n\nconst indicatorItemClasses = defineClasses(\n    [\"indicatorItemClass\", \"o-carousel__indicator__item\"],\n    [\n        \"indicatorItemStyleClass\",\n        \"o-carousel__indicator__item--\",\n        computed(() => props.indicatorStyle),\n        computed(() => !!props.indicatorStyle),\n    ],\n);\n\nconst indicatorItemActiveClasses = defineClasses([\n    \"indicatorItemActiveClass\",\n    \"o-carousel__indicator__item--active\",\n]);\n\nfunction indicatorItemAppliedClasses(item: ProviderItem): ClassBind[] {\n    const activeClasses =\n        activeIndex.value === item.index\n            ? indicatorItemActiveClasses.value\n            : [];\n\n    return [...indicatorItemClasses.value, ...activeClasses];\n}\n</script>\n\n<template>\n    <div\n        ref=\"rootElement\"\n        data-oruga=\"carousel\"\n        :class=\"rootClasses\"\n        role=\"region\"\n        aria-roledescription=\"carousel\"\n        @mouseover=\"onMouseEnter\"\n        @mouseleave=\"onMouseLeave\"\n        @focusin=\"onMouseEnter\"\n        @focusout=\"onMouseLeave\"\n        @keydown.left=\"onPrev\"\n        @keydown.right=\"onNext\"\n        @keydown.home.prevent=\"onHomePressed\"\n        @keydown.end.prevent=\"onEndPressed\">\n        <div :class=\"wrapperClasses\">\n            <!--\n                @slot Override the pause/resume button\n                @binding {boolean} autoplay if autoplay is active\n                @binding {(): void} toggle toggle autoplay\n            -->\n            <slot\n                name=\"pause\"\n                :autoplay=\"!isAutoplayPaused\"\n                :toggle=\"onToggleAutoplay\">\n                <template v-if=\"autoplay\">\n                    <o-icon\n                        :class=\"autoplayIconClasses\"\n                        :pack=\"iconPack\"\n                        :icon=\"\n                            !isAutoplayPaused\n                                ? iconAutoplayPause\n                                : iconAutoplayResume\n                        \"\n                        :size=\"iconSize\"\n                        clickable\n                        :aria-label=\"\n                            !isAutoplayPaused\n                                ? ariaAutoplayPauseLabel\n                                : ariaAutoplayResumeLabel\n                        \"\n                        @click=\"onToggleAutoplay\" />\n                </template>\n            </slot>\n\n            <!--\n                @slot Override the arrows\n                @binding {boolean} has-prev has prev arrow button \n                @binding {boolean} has-next has next arrow button \n                @binding {(): void} prev switch to prev item function\n                @binding {(): void} next switch to next item function\n            -->\n            <slot\n                name=\"arrow\"\n                :has-prev=\"hasPrev\"\n                :prev=\"onPrev\"\n                :has-next=\"hasNext\"\n                :next=\"onNext\">\n                <template v-if=\"arrows\">\n                    <o-icon\n                        v-show=\"hasArrows && hasPrev\"\n                        :class=\"prevIconClasses\"\n                        :pack=\"iconPack\"\n                        :icon=\"iconPrev\"\n                        :size=\"iconSize\"\n                        clickable\n                        :aria-label=\"ariaPreviousLabel\"\n                        @click=\"onPrev\" />\n                    <o-icon\n                        v-show=\"hasArrows && hasNext\"\n                        :class=\"nextIconClasses\"\n                        :pack=\"iconPack\"\n                        :icon=\"iconNext\"\n                        :size=\"iconSize\"\n                        clickable\n                        :aria-label=\"ariaNextLabel\"\n                        @click=\"onNext\" />\n                </template>\n            </slot>\n\n            <div\n                :class=\"itemsClasses\"\n                :style=\"'transform:translateX(' + translation + 'px)'\"\n                aria-roledescription=\"carousel-slide\"\n                aria-atomic=\"false\"\n                :aria-live=\"autoplay ? 'off' : 'polite'\"\n                @dragend=\"onDragEnd\"\n                @dragover=\"onDragOver\"\n                @touchmove=\"onDragOver\"\n                @touchend=\"onDragEnd\">\n                <!--\n                    @slot Display carousel item\n                -->\n                <slot />\n            </div>\n        </div>\n\n        <!--\n            @slot Override the indicators\n            @binding {number} active active index \n            @binding {(idx: number): void} switch-to switch to item function\n        -->\n        <slot name=\"indicators\" :active=\"activeIndex\" :switch-to=\"switchTo\">\n            <div\n                v-if=\"indicators\"\n                :class=\"indicatorsClasses\"\n                role=\"tablist\"\n                aria-label=\"Slides\">\n                <div\n                    v-for=\"item in indicatorItems\"\n                    :id=\"`carousel-${item.identifier}`\"\n                    :key=\"item.index\"\n                    :class=\"indicatorClasses\"\n                    role=\"tab\"\n                    :tabindex=\"modelValue === item.index ? '0' : '-1'\"\n                    :aria-label=\"`Slide ${item.identifier}`\"\n                    :aria-controls=\"`carouselpanel-${item.identifier}`\"\n                    :aria-selected=\"modelValue === item.index\"\n                    @click=\"onChange(item)\"\n                    @keydown.enter=\"onChange(item)\"\n                    @keydown.space=\"onChange(item)\">\n                    <!--\n                            @slot Override the indicator elements\n                            @binding {index} index indicator index \n                        -->\n                    <slot :index=\"item.index\" name=\"indicator\">\n                        <span :class=\"indicatorItemAppliedClasses(item)\" />\n                    </slot>\n                </div>\n            </div>\n        </slot>\n\n        <template v-if=\"overlay\">\n            <!-- @slot Overlay element -->\n            <slot name=\"overlay\" />\n        </template>\n    </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { defineClasses, useProviderChild } from \"@/composables\";\n\nimport type { CarouselComponent } from \"./types\";\nimport type { CarouselItemProps } from \"./props\";\n\n/**\n * A Slideshow item used by the carousel.\n * @displayName Carousel Item\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OCarouselItem\",\n    configField: \"carousel\",\n});\n\nconst props = withDefaults(defineProps<CarouselItemProps>(), {\n    override: undefined,\n    clickable: false,\n});\n\n/** inject functionalities and data from the parent component */\nconst { parent, item } = useProviderChild<CarouselComponent>();\n\nconst isActive = computed(() => parent.value.activeIndex === item.value.index);\n\nconst itemStyle = computed(() => ({ width: `${parent.value.itemWidth}px` }));\n\nfunction onClick(event: Event): void {\n    if (isActive.value) parent.value.onClick(event);\n    if (props.clickable) parent.value.setActive(item.value.index);\n}\n\n// --- Computed Component Classes ---\n\nconst itemClasses = defineClasses(\n    [\"itemClass\", \"o-carousel__item\"],\n    [\"itemActiveClass\", \"o-carousel__item--active\", null, isActive],\n    [\n        \"itemClickableClass\",\n        \"o-carousel__item--clickable\",\n        null,\n        computed(() => props.clickable),\n    ],\n);\n</script>\n\n<template>\n    <div\n        :id=\"`carouselpanel-${item.identifier}`\"\n        data-oruga=\"carousel-item\"\n        :data-id=\"`carousel-${item.identifier}`\"\n        :class=\"itemClasses\"\n        :style=\"itemStyle\"\n        :role=\"parent.indicators ? 'tabpanel' : 'group'\"\n        :aria-labelledby=\"`carousel-${item.identifier}`\"\n        aria-roledescription=\"slide\"\n        :aria-label=\"`${item.index + 1} of ${parent.total}`\"\n        draggable=\"true\"\n        @click=\"onClick\"\n        @keydown.enter=\"onClick\"\n        @keydown.space=\"onClick\"\n        @dragstart=\"parent.onDrag\"\n        @touchstart=\"parent.onDrag\">\n        <!--\n            @slot Default content\n        -->\n        <slot />\n    </div>\n</template>\n","import type { App, Plugin } from \"vue\";\n\nimport Carousel from \"./Carousel.vue\";\nimport CarouselItem from \"./CarouselItem.vue\";\n\nimport { registerComponent } from \"@/utils/plugins\";\n\n/** export carousel plugin */\nexport default {\n    install(app: App) {\n        registerComponent(app, Carousel);\n        registerComponent(app, CarouselItem);\n    },\n} as Plugin;\n\n/** export carousel components */\nexport { Carousel as OCarousel, CarouselItem as OCarouselItem };\n"],"names":["index","_useModel","breakpoint","settings","Carousel","CarouselItem"],"mappings":"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"}