{
"name": "carousel",
"type": "registry:ui",
"dependencies": [
"embla-carousel-vue",
"@vueuse/core"
],
"registryDependencies": [
"utils",
"button"
],
"files": [
{
"path": "ui/carousel/Carousel.vue",
"content": "\n\n\n \n \n
\n\n",
"type": "registry:ui",
"target": "carousel/Carousel.vue"
},
{
"path": "ui/carousel/CarouselContent.vue",
"content": "\n\n\n \n\n",
"type": "registry:ui",
"target": "carousel/CarouselContent.vue"
},
{
"path": "ui/carousel/CarouselItem.vue",
"content": "\n\n\n \n \n
\n\n",
"type": "registry:ui",
"target": "carousel/CarouselItem.vue"
},
{
"path": "ui/carousel/CarouselNext.vue",
"content": "\n\n\n \n\n",
"type": "registry:ui",
"target": "carousel/CarouselNext.vue"
},
{
"path": "ui/carousel/CarouselPrevious.vue",
"content": "\n\n\n \n\n",
"type": "registry:ui",
"target": "carousel/CarouselPrevious.vue"
},
{
"path": "ui/carousel/index.ts",
"content": "export { default as Carousel } from './Carousel.vue'\nexport { default as CarouselContent } from './CarouselContent.vue'\nexport { default as CarouselItem } from './CarouselItem.vue'\nexport { default as CarouselNext } from './CarouselNext.vue'\nexport { default as CarouselPrevious } from './CarouselPrevious.vue'\nexport type {\n UnwrapRefCarouselApi as CarouselApi,\n} from './interface'\n\nexport { useCarousel } from './useCarousel'\n",
"type": "registry:ui",
"target": "carousel/index.ts"
},
{
"path": "ui/carousel/interface.ts",
"content": "import type useEmblaCarousel from 'embla-carousel-vue'\nimport type {\n EmblaCarouselVueType,\n} from 'embla-carousel-vue'\nimport type { HTMLAttributes, UnwrapRef } from 'vue'\n\ntype CarouselApi = EmblaCarouselVueType[1]\ntype UseCarouselParameters = Parameters\ntype CarouselOptions = UseCarouselParameters[0]\ntype CarouselPlugin = UseCarouselParameters[1]\n\nexport type UnwrapRefCarouselApi = UnwrapRef\n\nexport interface CarouselProps {\n opts?: CarouselOptions\n plugins?: CarouselPlugin\n orientation?: 'horizontal' | 'vertical'\n}\n\nexport interface CarouselEmits {\n (e: 'init-api', payload: UnwrapRefCarouselApi): void\n}\n\nexport interface WithClassAsProps {\n class?: HTMLAttributes['class']\n}\n",
"type": "registry:ui",
"target": "carousel/interface.ts"
},
{
"path": "ui/carousel/useCarousel.ts",
"content": "import type { UnwrapRefCarouselApi as CarouselApi, CarouselEmits, CarouselProps } from './interface'\nimport { createInjectionState } from '@vueuse/core'\nimport emblaCarouselVue from 'embla-carousel-vue'\nimport { onMounted, ref } from 'vue'\n\nconst [useProvideCarousel, useInjectCarousel] = createInjectionState(\n ({\n opts,\n orientation,\n plugins,\n }: CarouselProps, emits: CarouselEmits) => {\n const [emblaNode, emblaApi] = emblaCarouselVue({\n ...opts,\n axis: orientation === 'horizontal' ? 'x' : 'y',\n }, plugins)\n\n function scrollPrev() {\n emblaApi.value?.scrollPrev()\n }\n function scrollNext() {\n emblaApi.value?.scrollNext()\n }\n\n const canScrollNext = ref(false)\n const canScrollPrev = ref(false)\n\n function onSelect(api: CarouselApi) {\n canScrollNext.value = api?.canScrollNext() || false\n canScrollPrev.value = api?.canScrollPrev() || false\n }\n\n onMounted(() => {\n if (!emblaApi.value)\n return\n\n emblaApi.value?.on('init', onSelect)\n emblaApi.value?.on('reInit', onSelect)\n emblaApi.value?.on('select', onSelect)\n\n emits('init-api', emblaApi.value)\n })\n\n return { carouselRef: emblaNode, carouselApi: emblaApi, canScrollPrev, canScrollNext, scrollPrev, scrollNext, orientation }\n },\n)\n\nfunction useCarousel() {\n const carouselState = useInjectCarousel()\n\n if (!carouselState)\n throw new Error('useCarousel must be used within a ')\n\n return carouselState\n}\n\nexport { useCarousel, useProvideCarousel }\n",
"type": "registry:ui",
"target": "carousel/useCarousel.ts"
}
]
}