Accordion
fluid-functionalism/accordionFreeComponent
Collapsible accordion with animated height transitions, spring-animated chevron, and proximity hover in grouped mode. Built on Radix UI Accordion.
Install it
npx shadcn@latest add https://fluidfunctionalism.com/r/accordion.jsonSource
1"use client";23import {4 useRef,5 useState,6 useEffect,7 useLayoutEffect,8 useCallback,9 useMemo,10 createContext,11 useContext,12 forwardRef,13 type ReactNode,14 type HTMLAttributes,15} from "react";16import { motion, AnimatePresence } from "framer-motion";17import * as AccordionPrimitive from "@radix-ui/react-accordion";1819// SSR-safe layout effect (client components still server-render in Next).20const useIsoLayoutEffect =21 typeof window !== "undefined" ? useLayoutEffect : useEffect;22import { cn } from "@/lib/utils";23import { useIcon } from "@/lib/icon-context";24import { spring } from "@/lib/springs";25import { fontWeights } from "@/lib/font-weight";26import { useProximityHover } from "@/hooks/use-proximity-hover";27import { useShape } from "@/lib/shape-context";2829// ─── Contexts ────────────────────────────────────────────────────────────────3031interface ItemRect {32 top: number;33 left: number;34 width: number;35 height: number;36}3738interface AccordionGroupContextValue {39 registerItem: (index: number, element: HTMLElement | null) => void;40 registerFullItem: (index: number, element: HTMLElement | null) => void;41 activeIndex: number | null;42 grouped: true;43 remeasure: () => void;44 openValues: Set<string>;45 openItemRects: Map<number, ItemRect>;46}4748const AccordionGroupContext =49 createContext<AccordionGroupContextValue | null>(null);5051function useAccordionGroup() {52 return useContext(AccordionGroupContext);53}5455interface AccordionItemContextValue {56 index?: number;57 value: string;58 isOpen: boolean;59 triggerRef: React.MutableRefObject<HTMLDivElement | null>;60}6162const AccordionItemContext =63 createContext<AccordionItemContextValue | null>(null);6465function useAccordionItemContext() {66 const ctx = useContext(AccordionItemContext);67 if (!ctx)68 throw new Error(69 "AccordionTrigger/AccordionContent must be used within an AccordionItem"70 );71 return ctx;72}7374// ─── AccordionGroup ──────────────────────────────────────────────────────────7576type AccordionGroupSingleProps = {77 type?: "single";78 value?: string;79 defaultValue?: string;80 onValueChange?: (value: string) => void;81 collapsible?: boolean;82};8384type AccordionGroupMultipleProps = {85 type: "multiple";86 value?: string[];87// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from fluid-functionalism
All 53 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Accordion (Base UI)accordion-base | fluid-functionalism | Components | Free | 3 deps | |
| Ask User Questionsask-user-questions | fluid-functionalism | Components | Free | 2 deps | |
| Badgebadge | fluid-functionalism | Components | Free | 1 dep | |
| Buttonbutton | fluid-functionalism | Components | Free | 4 deps | |
| Button (Base UI)button-base | fluid-functionalism | Components | Free | 4 deps | |
| Cardcard | fluid-functionalism | Components | Free | 1 dep | |
| Chat Messagechat-message | fluid-functionalism | Components | Free | 1 dep | |
| Checkbox Groupcheckbox-group | fluid-functionalism | Components | Free | 2 deps |
