carousel
fulldev-ui/carouselFreeComponent
fulldev/ui publishes no description for this item.
Live preview
live · rendered by the registry
Rendered by fulldev/ui on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://ui.full.dev/r/carousel.jsonSource
1---2import type { HTMLAttributes } from "astro/types"3import type { EmblaOptionsType } from "embla-carousel"45import { cn } from "@/lib/utils"67type Props = HTMLAttributes<"div"> & {8 opts?: EmblaOptionsType9 orientation?: "horizontal" | "vertical"10}1112const {13 class: className,14 opts,15 orientation = "horizontal",16 ...props17} = Astro.props1819const resolvedOpts: EmblaOptionsType = {20 ...opts,21 axis: orientation === "horizontal" ? "x" : "y",22}23---2425<div26 data-slot="carousel"27 data-orientation={orientation}28 data-carousel-options={JSON.stringify(resolvedOpts)}29 class={cn("group/carousel relative", className)}30 role="region"31 aria-roledescription="carousel"32 {...props}33>34 <slot />35</div>3637<script>38 import EmblaCarousel, {39 type EmblaCarouselType,40 type EmblaOptionsType,41 } from "embla-carousel"4243 type CarouselRoot = HTMLElement & {44 __fulldevCarouselApi?: EmblaCarouselType45 }4647 type CarouselInstance = {48 cleanup: () => void49 }5051 type CarouselStore = Map<CarouselRoot, CarouselInstance>5253 declare global {54 interface Window {55 __fulldevCarouselInitialized?: boolean56 __fulldevCarouselStore?: CarouselStore57 }58 }5960 if (!window.__fulldevCarouselInitialized) {61 window.__fulldevCarouselInitialized = true62 window.__fulldevCarouselStore ??= new Map<CarouselRoot, CarouselInstance>()6364 const store = window.__fulldevCarouselStore6566 const getDetails = (api: EmblaCarouselType) => ({67 api,68 canScrollPrev: api.canScrollPrev(),69 canScrollNext: api.canScrollNext(),70 selectedScrollSnap: api.selectedScrollSnap(),71 scrollSnapList: api.scrollSnapList(),72 })7374 const emit = (75 root: CarouselRoot,76 type: "carousel:init" | "carousel:select",77 api: EmblaCarouselType78 ) => {79 root.dispatchEvent(80 new CustomEvent(type, {81 detail: getDetails(api),82 })83 )84 }8586 const parseOptions = (root: CarouselRoot): EmblaOptionsType => {87 const rawOptions = root.getAttribute("data-carousel-options")8889 if (!rawOptions) {90 return {}91 }9293 try {94 return JSON.parse(rawOptions) as EmblaOptionsType95 } catch {96 return {}97 }98 }99100 const syncButton = (button: Element | null, enabled: boolean) => {101 if (!(button instanceof HTMLButtonElement)) {102 return103 }104105 if (button.dataset.manualDisabled === "true") {106 button.disabled = true107 return108 }109110 button.disabled = !enabled111// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from fulldev/ui
All 144 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| accordionaccordion | fulldev/ui | Components | Free | 1 dep · 5 files | |
| alertalert | fulldev/ui | Components | Free | no deps · 5 files | |
| alert-dialogalert-dialog | fulldev/ui | Components | Free | 1 dep · 13 files | |
| avataravatar | fulldev/ui | Components | Free | no deps · 7 files | |
| badgebadge | fulldev/ui | Components | Free | no deps · 3 files | |
| bannerbanner | fulldev/ui | Components | Free | no deps · 3 files | |
| breadcrumbbreadcrumb | fulldev/ui | Components | Free | no deps · 8 files | |
| buttonbutton | fulldev/ui | Components | Free | no deps · 3 files |
