Accordion
trovecn/accordionFreeComponent
Collapsible accordion with spring-animated height and chevron, and proximity hover across every row.
Install it
npx shadcn@latest add https://trovecn.dev/r/accordion.jsonSource
1"use client";23import {4 Children,5 isValidElement,6 cloneElement,7 useRef,8 useState,9 useEffect,10 useLayoutEffect,11 useCallback,12 useMemo,13 createContext,14 useContext,15 forwardRef,16 type ReactElement,17 type ReactNode,18 type HTMLAttributes,19} from "react";20import { motion, AnimatePresence, useReducedMotion } from "motion/react";21import { Accordion as AccordionPrimitive } from "@base-ui/react/accordion";22import { ChevronRight } from "lucide-react";2324import { cn } from "@/lib/utils";25import { spring } from "@/lib/springs";26import { fontWeights } from "@/lib/font-weight";27import { ProximityHoverPill } from "@/components/ui/proximity-hover-pill";28import { useProximityHover, type ItemRect } from "@/hooks/use-proximity-hover";2930// SSR-safe layout effect (client components still server-render in Next).31const useIsoLayoutEffect = typeof window !== "undefined" ? useLayoutEffect : useEffect;3233// ─── Contexts ────────────────────────────────────────────────────────────────3435interface AccordionContextValue {36 registerItem: (index: number, element: HTMLElement | null) => void;37 registerFullItem: (index: number, element: HTMLElement | null) => void;38 activeIndex: number | null;39 remeasure: () => void;40 openValues: Set<string>;41 openItemRects: Map<number, ItemRect>;42}4344const AccordionContext = createContext<AccordionContextValue | null>(null);4546function useAccordionContext() {47 const ctx = useContext(AccordionContext);48 if (!ctx) throw new Error("AccordionItem must be used within an Accordion");49 return ctx;50}5152interface AccordionItemContextValue {53 index?: number;54 value: string;55 isOpen: boolean;56 triggerRef: React.MutableRefObject<HTMLDivElement | null>;57}5859const AccordionItemContext = createContext<AccordionItemContextValue | null>(null);6061function useAccordionItemContext() {62 const ctx = useContext(AccordionItemContext);63 if (!ctx)64 throw new Error("AccordionTrigger/AccordionContent must be used within an AccordionItem");65 return ctx;66}6768// ─── Accordion ───────────────────────────────────────────────────────────────69// Every item shares one container: a background pill morphs between the item70// nearest the cursor and the currently open item(s) — "proximity hover"71// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from trovecn
All 26 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Agent Activityagent-activity | trovecn | Components | Free | 2 deps | |
| Approval Requestapproval-request | trovecn | Components | Free | 2 deps | |
| Buttonbutton | trovecn | Components | Free | 2 deps | |
| Checkboxcheckbox | trovecn | Components | Free | 2 deps | |
| Checkbox Groupcheckbox-group | trovecn | Components | Free | 2 deps | |
| Comboboxcombobox | trovecn | Components | Free | 3 deps | |
| Comparison Slidercomparison-slider | trovecn | Components | Free | 1 dep | |
| Context Menucontext-menu | trovecn | Components | Free | 3 deps |
