Carousel
neobrutalism-components/carouselFreeComponent
Neobrutalism Components publishes no description for this item.
Live preview
live · rendered by the registry
Rendered by Neobrutalism Components on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://www.neobrutalism.dev/r/carousel.jsonSource
1"use client"23import useEmblaCarousel, {4 type UseEmblaCarouselType,5} from "embla-carousel-react"6import { ArrowLeft, ArrowRight } from "lucide-react"78import * as React from "react"910import { Button } from "@/components/ui/button"1112import { cn } from "@/lib/utils"1314type CarouselApi = UseEmblaCarouselType[1]15type UseCarouselParameters = Parameters<typeof useEmblaCarousel>16type CarouselOptions = UseCarouselParameters[0]17type CarouselPlugin = UseCarouselParameters[1]1819type CarouselProps = {20 opts?: CarouselOptions21 plugins?: CarouselPlugin22 orientation?: "horizontal" | "vertical"23 setApi?: (api: CarouselApi) => void24}2526type CarouselContextProps = {27 carouselRef: ReturnType<typeof useEmblaCarousel>[0]28 api: ReturnType<typeof useEmblaCarousel>[1]29 scrollPrev: () => void30 scrollNext: () => void31 canScrollPrev: boolean32 canScrollNext: boolean33 plugins?: CarouselPlugin34} & CarouselProps3536const CarouselContext = React.createContext<CarouselContextProps | null>(null)3738function useCarousel() {39 const context = React.useContext(CarouselContext)4041 if (!context) {42 throw new Error("useCarousel must be used within a <Carousel />")43 }4445 return context46}4748function Carousel({49 orientation = "horizontal",50 opts,51 setApi,52 plugins,53 className,54 children,55 ...props56}: React.ComponentProps<"div"> & CarouselProps) {57 const [carouselRef, api] = useEmblaCarousel(58 {59 ...opts,60 axis: orientation === "horizontal" ? "x" : "y",61 },62 plugins,63 )64 const [canScrollPrev, setCanScrollPrev] = React.useState(false)65 const [canScrollNext, setCanScrollNext] = React.useState(false)6667 const onSelect = React.useCallback((api: CarouselApi) => {68 if (!api) {69 return70 }7172 setCanScrollPrev(api.canScrollPrev())73 setCanScrollNext(api.canScrollNext())74 }, [])7576 const scrollPrev = React.useCallback(() => {77 api?.scrollPrev()78 }, [api])7980 const scrollNext = React.useCallback(() => {81 api?.scrollNext()82 }, [api])8384 const handleKeyDown = React.useCallback(85 (event: React.KeyboardEvent<HTMLDivElement>) => {86 if (event.key === "ArrowLeft") {87 event.preventDefault()88 scrollPrev()89 } else if (event.key === "ArrowRight") {90 event.preventDefault()91 scrollNext()92 }93 },94 [scrollPrev, scrollNext],95 )9697 React.useEffect(() => {98 if (!api || !setApi) {99 return100 }101102// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from Neobrutalism Components
All 92 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Accordionaccordion | Neobrutalism Components | Components | Free | 1 dep | |
| Alertalert | Neobrutalism Components | Components | Free | no deps | |
| Alert dialogalert-dialog | Neobrutalism Components | Components | Free | 1 dep | |
| Avataravatar | Neobrutalism Components | Components | Free | 1 dep | |
| Badgebadge | Neobrutalism Components | Components | Free | no deps | |
| Breadcrumbbreadcrumb | Neobrutalism Components | Components | Free | 1 dep | |
| Buttonbutton | Neobrutalism Components | Components | Free | 1 dep | |
| Calendarcalendar | Neobrutalism Components | Components | Free | 2 deps |
