UNPKG

@oruga-ui/oruga-next

Version:

UI components for Vue.js and CSS framework agnostic

1 lines 31.2 kB
{"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","_createElementBlock","_unref","_createElementVNode","_renderSlot","autoplay","_createBlock","OIcon","iconPack","iconAutoplayPause","iconAutoplayResume","iconSize","ariaAutoplayPauseLabel","ariaAutoplayResumeLabel","arrows","_Fragment","_createVNode","iconPrev","ariaPreviousLabel","_vShow","iconNext","ariaNextLabel","indicators","_renderList","_withKeys","_normalizeClass","overlay","Carousel","CarouselItem"],"mappings":"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"}