import { useMultiplePicker, useUniqueId, useVisibilityGroup, } from "@charcuterie/logic" import type { ReactNode } from "react" import { toClassName } from "../toClassName.ts" import { AccordionSection } from "./AccordionSection.tsx" export type AccordionHeadingLevel = 2 | 3 | 4 | 5 | 6 export type AccordionItem = { content: ReactNode isDisabled?: boolean key: string label: ReactNode } export type AccordionProps = { className?: string /** **Initial** only. Charcuterie owns it from then on. */ expandedKeys?: string[] /** * The heading level the triggers sit at. An accordion inside a * `Card` that already has an `

` needs `3`, and getting this * wrong is a document-outline break that no gate here can see — * it depends entirely on the page. */ headingLevel?: AccordionHeadingLevel /** * Several sections open at once. The default is **exclusive**, * because that is what every one of the fleet's disclosure groups * does today. */ isMultiple?: boolean items: AccordionItem[] onChange?: (expandedKeys: string[]) => void } /** * Eleven sites in the fleet, and the plan called it "nearly free * once `Tabs` exists". It is — the exclusive mode is * `VisibilityGroup` and nothing else — but the reason it is worth * shipping is not the saving. * * ### The two-owners bug, live, in the app this milestone migrates * * mux-magic's `JobStepsDisclosure` is built on `
`, and * `
` **owns `open`**. It also wants the state in a Jotai * atom so a job can be expanded from elsewhere. Reconciling the two * takes three separate mechanisms: * * ```tsx * const detailsRef = useRef(null) * const skipNextToggleRef = useRef(isOpen) * * useEffect(() => { * if (detailsRef.current) detailsRef.current.open = isOpen * }, [isOpen]) * * const handleToggle = (event) => { * if (skipNextToggleRef.current) { * skipNextToggleRef.current = false * return // ← swallow the toggle our own write just fired * } * setStepsOpen(…) * } * ``` * * That is the Radix argument from `Popover` pointed at the platform: * a ref to reach past React, an effect to push state into the DOM, * and a guard to stop the DOM's echo coming back. Every one of the * three exists only because two things hold one fact. * * So this is a `