Files
DSMMG/packages/react/src/Accordion.tsx
T
Dinawo 62317f2ad7
Release / Release / open changeset PR (push) Has been cancelled
CI / Build, typecheck, test, a11y (push) Has been cancelled
chore: initial DSMMG v0.2 — refonte architecturale complète
Mise en place du Design System ManageMate Group v0.2 — refonte du
système de tokens (préfixe --mmg-color-*), 9 presets accent
user-themable validés WCAG AA, overlays Radix UI + Floating UI,
Storybook 8 + Vitest + axe-core en CI, doc Astro Starlight,
DESIGN.md (format google-labs-code) et exports tokens DTCG/CSS/
TS/Figma/Tailwind v3 et v4.

- 4 packages monorepo pnpm : @managemate/{tokens,css,react,icons}
- 62 composants React headless-first (Sheet, HoverCard, ContextMenu,
  Slider, ToggleGroup, AvatarGroup, UserCard, ProfileHeader,
  MetricCard, PricingCard, FeatureCard, Text/Display/Eyebrow/Lead…)
- Lint contraste WCAG : 37/37 paires AA, branché CI
- Toast pile Sonner-style avec ResizeObserver
- Theming user (9 presets) sans casser sémantique fixe
- Identité Synapse (rose #D12B6A) préservée

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-04 22:08:38 +02:00

33 lines
912 B
TypeScript

import { useId, useState, type ReactNode } from "react";
import { cx } from "./utils";
import { Icon } from "./Icon";
export type AccordionProps = {
label: ReactNode;
defaultOpen?: boolean;
children: ReactNode;
className?: string;
};
export function Accordion({ label, defaultOpen = false, children, className }: AccordionProps) {
const [open, setOpen] = useState(defaultOpen);
const id = useId();
return (
<div className={cx("mmg-accordion", className)} data-open={open}>
<button
type="button"
className="mmg-accordion__btn"
aria-expanded={open}
aria-controls={id}
onClick={() => setOpen((v) => !v)}
>
<span>{label}</span>
<Icon name="arrow-down-line" className="mmg-accordion__chevron" />
</button>
<div id={id} role="region" className="mmg-accordion__panel">
{children}
</div>
</div>
);
}