UNPKG

@oruga-ui/oruga-next

Version:

UI components for Vue.js and CSS framework agnostic

1 lines 28.2 kB
{"version":3,"file":"carousel.cjs","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":["useTemplateRef","computed","index","useProviderParent","_useModel","mod","isClient","watch","ref","nextTick","triggerRef","onMounted","onBeforeUnmount","breakpoint","settings","toRaw","readonly","bound","isDefined","sign","defineClasses","useProviderChild","registerComponent","Carousel","CarouselItem"],"mappings":"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"}