accordion
ui-layouts-aiveilix/accordionFreeComponent
ui-layouts publishes no description for this item.
Install it
npx shadcn@latest add https://raw.githubusercontent.com/jutt313/AIVEILIX-old/main/for ui/apps/ui-layout/public/r/accordion.jsonSource
1'use client';2import React, { ReactNode, ReactElement, isValidElement } from 'react';3import { AnimatePresence, motion } from 'motion/react';4import { ChevronDown } from 'lucide-react';5import { cn } from '@/lib/utils';67type AccordionContextType = {8 isActive: boolean;9 value: string;10 onChangeIndex: (value: string) => void;11};1213const AccordionContext = React.createContext<AccordionContextType>({14 isActive: false,15 value: '',16 onChangeIndex: () => {},17});1819const useAccordion = () => React.useContext(AccordionContext);2021export function AccordionContainer({22 children,23 className,24}: {25 children: ReactNode;26 className?: string;27}) {28 return (29 <div className={cn('grid grid-cols-2 gap-1', className)}>{children}</div>30 );31}3233export function AccordionWrapper({ children }: { children: ReactNode }) {34 return <div>{children}</div>;35}3637export function Accordion({38 children,39 multiple,40 defaultValue,41}: {42 children: ReactNode;43 multiple?: boolean;44 defaultValue?: string | string[];45}) {46 const [activeIndex, setActiveIndex] = React.useState<string[]>(47 multiple48 ? defaultValue49 ? Array.isArray(defaultValue)50 ? defaultValue51 : [defaultValue]52 : []53 : defaultValue54 ? Array.isArray(defaultValue)55 ? [defaultValue[0]]56 : [defaultValue]57 : []58 );5960 function onChangeIndex(value: string) {61 setActiveIndex((currentActiveIndex) => {62 if (!multiple) {63 return value === currentActiveIndex[0] ? [] : [value];64 }6566 if (currentActiveIndex.includes(value)) {67 return currentActiveIndex.filter((i) => i !== value);68 }6970 return [...currentActiveIndex, value];71 });72 }7374 return React.Children.map(children, (child) => {75 if (!isValidElement<{ value?: string }>(child)) return null;7677 const value = child.props.value ?? '';78 const isActive = multiple79 ? activeIndex.includes(value)80 : activeIndex[0] === value;8182 return (83 <AccordionContext.Provider value={{ isActive, value, onChangeIndex }}>84 {React.cloneElement(child)}85 </AccordionContext.Provider>86 );87 });88}8990export function AccordionItem({91 children,92 value,93 className,94}: {95 children: ReactNode;96 value: string;97 className?: string;98}) {99 const { isActive } = useAccordion();100101 return (102 <div103 data-active={isActive || undefined}104// … truncated
Files it writes
More from ui-layouts
All 230 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| 3d-marquee3d-marquee | ui-layouts | Components | Free | no deps · 2 files | |
| align-slideralign-slider | ui-layouts | Components | Free | 6 deps · 2 files | |
| animal-imagemaskinganimal-imagemasking | ui-layouts | Components | Free | 1 dep | |
| animated-beamanimated-beam | ui-layouts | Components | Free | no deps | |
| animated-beam-bidirectionalanimated-beam-bidirectional | ui-layouts | Components | Free | no deps | |
| animated-beam-defaultanimated-beam-default | ui-layouts | Components | Free | no deps | |
| animated-beam-multiple-inputanimated-beam-multiple-input | ui-layouts | Components | Free | no deps | |
| animated-beam-multiple-outputanimated-beam-multiple-output | ui-layouts | Components | Free | no deps |
