{"_id":"@archoleat/next-accordion","_rev":"4-6c55ce0b93b4355f7e5f5cbf7e209922","name":"@archoleat/next-accordion","dist-tags":{"latest":"1.2.0"},"versions":{"1.0.0":{"name":"@archoleat/next-accordion","version":"1.0.0","keywords":["accordion","animation","archoleat","details","html-accordion","nextjs","plugin","react-accordion","react","summary","typescript"],"author":{"url":"https://github.com/archoleat","name":"Archoleat","email":"nikkeyl.me@gmail.com"},"license":"MIT","_id":"@archoleat/next-accordion@1.0.0","maintainers":[{"name":"nikkeyl","email":"nikkeyl.me@icloud.com"}],"homepage":"https://github.com/archoleat/next-accordion#readme","bugs":{"url":"https://github.com/archoleat/next-accordion/issues"},"dist":{"shasum":"9e444ff2fa7d3177bf651d8829392e5b371d3836","tarball":"https://registry.npmjs.org/@archoleat/next-accordion/-/next-accordion-1.0.0.tgz","fileCount":5,"integrity":"sha512-bfQ7onEu9srI9WlDgB+N0rkExeBRE/uinUtqxWaVmguEBEQaHS7GdjXADMthFom8KhHCKekEVQXd463sJ/KQ9w==","signatures":[{"sig":"MEUCICEmlR+m0qNTtVFSpA5c6yszK/h60w9jpJ7+RX1yLY65AiEA4kaJdKOWm+PFzV7jZR25rMKlRQJJn81IfijtXSfvQo4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10462},"type":"module","types":"index.d.ts","engines":{"bun":">=1.0.0"},"exports":{".":"./index.js"},"gitHead":"4eb48414b30ed0fab080ede40d362b7609a6d57b","imports":{"#src/*":"./src/*","#utils/*":"./src/utils/*"},"scripts":{"init":"bun i && husky"},"_npmUser":{"name":"nikkeyl","email":"nikkeyl.me@icloud.com"},"repository":{"url":"git+https://github.com/archoleat/next-accordion.git","type":"git"},"_npmVersion":"11.16.0","description":"Animated React accordion using details and summary","directories":{},"_nodeVersion":"24.16.0","_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","react":"^19.2.7","tslib":"^2.8.1","eslint":"^10.6.0","remark":"15.0.1","rollup":"^4.62.2","globals":"^17.7.0","prettier":"^3.9.4","react-dom":"^19.2.7","@types/bun":"^1.3.14","remark-cli":"^12.0.1","lint-staged":"^17.0.8","@types/react":"^19.2.17","@eslint/compat":"^2.1.0","@commitlint/cli":"^21.2.0","@types/react-dom":"^19.2.3","semantic-release":"^25.0.5","@commitlint/types":"^21.2.0","rollup-plugin-dts":"^6.4.1","eslint-plugin-react":"^7.37.5","@rollup/plugin-alias":"^6.0.0","editorconfig-checker":"^6.1.1","eslint-define-config":"^2.1.0","eslint-plugin-import":"^2.32.0","@semantic-release/git":"^10.0.1","eslint-plugin-unicorn":"^70.0.0","rollup-plugin-esbuild":"^6.2.1","@testing-library/react":"^16.3.0","eslint-config-prettier":"^10.1.8","@rollup/plugin-typescript":"^12.3.0","@typescript-eslint/parser":"^8.62.1","eslint-plugin-react-hooks":"^7.1.1","@semantic-release/changelog":"^6.0.3","@happy-dom/global-registrator":"^18.0.1","remark-preset-lint-consistent":"^6.0.1","remark-preset-lint-recommended":"^7.0.1","@commitlint/config-conventional":"^21.2.0","@typescript-eslint/eslint-plugin":"^8.62.1","eslint-plugin-simple-import-sort":"^13.0.0","@archoleat/prettier-define-config":"^1.2.2","eslint-import-resolver-typescript":"^4.4.5","@archoleat/commitlint-define-config":"^1.1.2","remark-preset-lint-markdown-style-guide":"^6.0.1","@archoleat/semantic-release-define-config":"^1.3.2","conventional-changelog-conventionalcommits":"^10.2.0"},"peerDependencies":{"react":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/next-accordion_1.0.0_1783438281657_0.8281195297689954","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@archoleat/next-accordion","version":"1.0.1","keywords":["accordion","animation","archoleat","details","html-accordion","nextjs","plugin","react-accordion","react","summary","typescript"],"author":{"url":"https://github.com/archoleat","name":"Archoleat","email":"nikkeyl.me@gmail.com"},"license":"MIT","_id":"@archoleat/next-accordion@1.0.1","maintainers":[{"name":"nikkeyl","email":"nikkeyl.me@icloud.com"}],"homepage":"https://github.com/archoleat/next-accordion#readme","bugs":{"url":"https://github.com/archoleat/next-accordion/issues"},"dist":{"shasum":"f17893805b8cef89214527be9f0b97f75ae837ba","tarball":"https://registry.npmjs.org/@archoleat/next-accordion/-/next-accordion-1.0.1.tgz","fileCount":5,"integrity":"sha512-aF15Q1yhGlihJcQD1zD2JoQIOKOMUtQItyhKCUMw9sjz/RjbJQbU82q7Qa6vwF0bGFf4oNjBb9a1N/e6kXbhjw==","signatures":[{"sig":"MEUCIQCrBa31tpmRr3eM/Z441cin6CYnr6K3ETuUliRItwb1TAIgYFB3ZbNYucXseFP2AeyEykUL6PF5/d7gOOnleVoy8yo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@archoleat%2fnext-accordion@1.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":10615},"type":"module","types":"index.d.ts","engines":{"bun":">=1.0.0"},"exports":{".":"./index.js"},"gitHead":"5354ca4c168fbd626c9a730dcad31bbb2b26f91c","imports":{"#src/*":"./src/*","#utils/*":"./src/utils/*"},"scripts":{"init":"bun i && husky"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b66339eb-6e9c-4ee1-95a0-5ee9ae4546d8"}},"repository":{"url":"git+https://github.com/archoleat/next-accordion.git","type":"git"},"_npmVersion":"11.18.0","description":"Animated React accordion using details and summary","directories":{},"_nodeVersion":"26.5.0","_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","react":"^19.2.7","tslib":"^2.8.1","eslint":"^10.6.0","remark":"15.0.1","rollup":"^4.62.2","globals":"^17.7.0","prettier":"^3.9.4","react-dom":"^19.2.7","@types/bun":"^1.3.14","remark-cli":"^12.0.1","lint-staged":"^17.0.8","@types/react":"^19.2.17","@eslint/compat":"^2.1.0","@commitlint/cli":"^21.2.0","@types/react-dom":"^19.2.3","semantic-release":"^25.0.5","@commitlint/types":"^21.2.0","rollup-plugin-dts":"^6.4.1","eslint-plugin-react":"^7.37.5","@rollup/plugin-alias":"^6.0.0","editorconfig-checker":"^6.1.1","eslint-define-config":"^2.1.0","eslint-plugin-import":"^2.32.0","@semantic-release/git":"^10.0.1","eslint-plugin-unicorn":"^70.0.0","rollup-plugin-esbuild":"^6.2.1","@testing-library/react":"^16.3.0","eslint-config-prettier":"^10.1.8","@rollup/plugin-typescript":"^12.3.0","@typescript-eslint/parser":"^8.62.1","eslint-plugin-react-hooks":"^7.1.1","@semantic-release/changelog":"^6.0.3","@happy-dom/global-registrator":"^18.0.1","remark-preset-lint-consistent":"^6.0.1","remark-preset-lint-recommended":"^7.0.1","@commitlint/config-conventional":"^21.2.0","@typescript-eslint/eslint-plugin":"^8.62.1","eslint-plugin-simple-import-sort":"^13.0.0","@archoleat/prettier-define-config":"^1.2.2","eslint-import-resolver-typescript":"^4.4.5","@archoleat/commitlint-define-config":"^1.1.2","remark-preset-lint-markdown-style-guide":"^6.0.1","@archoleat/semantic-release-define-config":"^1.3.2","conventional-changelog-conventionalcommits":"^10.2.0"},"peerDependencies":{"react":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/next-accordion_1.0.1_1783521386554_0.2707873061446442","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@archoleat/next-accordion","version":"1.1.0","keywords":["accordion","animation","archoleat","details","html-accordion","nextjs","plugin","react-accordion","react","summary","typescript"],"author":{"url":"https://github.com/archoleat","name":"Archoleat","email":"nikkeyl.me@gmail.com"},"license":"MIT","_id":"@archoleat/next-accordion@1.1.0","maintainers":[{"name":"nikkeyl","email":"nikkeyl.me@icloud.com"}],"homepage":"https://github.com/archoleat/next-accordion#readme","bugs":{"url":"https://github.com/archoleat/next-accordion/issues"},"dist":{"shasum":"25499c688ee373953e664cc36f91ae4c800d6fa3","tarball":"https://registry.npmjs.org/@archoleat/next-accordion/-/next-accordion-1.1.0.tgz","fileCount":5,"integrity":"sha512-8v43/9gsLlvU8cHGBYI0cjuGblFBW2aAj/UHzqWE2sS5wIwZW2AARjkziemwVqjxKpl9jEwlCv+YkPknAQEI8Q==","signatures":[{"sig":"MEQCIDrHDDZlPyH84IEIhK/zp7xxlVw05TJuCbiSe2v8N5qEAiBUR+ESFG3u1mX4hL3xqPPZGHdy6LGOPhgUs8Kx9gwE1A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@archoleat%2fnext-accordion@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":20391},"type":"module","types":"index.d.ts","engines":{"bun":">=1.0.0"},"exports":{".":"./index.js"},"gitHead":"33a25aa5a11da1843f1b5c9cd6f784f42647bb67","imports":{"#src/*":"./src/*","#utils/*":"./src/utils/*"},"scripts":{"init":"bun i && husky"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b66339eb-6e9c-4ee1-95a0-5ee9ae4546d8"}},"repository":{"url":"git+https://github.com/archoleat/next-accordion.git","type":"git"},"_npmVersion":"11.18.0","description":"Animated React accordion using details and summary","directories":{},"_nodeVersion":"26.5.0","_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","react":"^19.2.7","tslib":"^2.8.1","eslint":"^10.6.0","remark":"15.0.1","rollup":"^4.62.2","globals":"^17.7.0","prettier":"^3.9.4","react-dom":"^19.2.7","@types/bun":"^1.3.14","remark-cli":"^12.0.1","lint-staged":"^17.0.8","@types/react":"^19.2.17","@eslint/compat":"^2.1.0","@commitlint/cli":"^21.2.0","@types/react-dom":"^19.2.3","semantic-release":"^25.0.5","@commitlint/types":"^21.2.0","rollup-plugin-dts":"^6.4.1","eslint-plugin-react":"^7.37.5","@rollup/plugin-alias":"^6.0.0","editorconfig-checker":"^6.1.1","eslint-define-config":"^2.1.0","eslint-plugin-import":"^2.32.0","@semantic-release/git":"^10.0.1","eslint-plugin-unicorn":"^70.0.0","rollup-plugin-esbuild":"^6.2.1","@testing-library/react":"^16.3.0","eslint-config-prettier":"^10.1.8","@rollup/plugin-typescript":"^12.3.0","@typescript-eslint/parser":"^8.62.1","eslint-plugin-react-hooks":"^7.1.1","@semantic-release/changelog":"^6.0.3","@happy-dom/global-registrator":"^18.0.1","remark-preset-lint-consistent":"^6.0.1","remark-preset-lint-recommended":"^7.0.1","@commitlint/config-conventional":"^21.2.0","@typescript-eslint/eslint-plugin":"^8.62.1","eslint-plugin-simple-import-sort":"^13.0.0","@archoleat/prettier-define-config":"^1.2.2","eslint-import-resolver-typescript":"^4.4.5","@archoleat/commitlint-define-config":"^1.1.2","remark-preset-lint-markdown-style-guide":"^6.0.1","@archoleat/semantic-release-define-config":"^1.3.2","conventional-changelog-conventionalcommits":"^10.2.0"},"peerDependencies":{"react":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/next-accordion_1.1.0_1783625596468_0.47289031109468627","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"_id":"@archoleat/next-accordion@1.2.0","bugs":{"url":"https://github.com/archoleat/next-accordion/issues"},"dist":{"shasum":"9a1c5bb66c6e771940ff04a4b1eacbbd48ef8736","tarball":"https://registry.npmjs.org/@archoleat/next-accordion/-/next-accordion-1.2.0.tgz","fileCount":5,"integrity":"sha512-83RYtw2PwrGqf5gWLbs3tnA1T8yeGIzPhdZZOFjG7qoCVzqQFD1QSPIlg7PP0djZaGCsflX0IOpBqRxQIhfbww==","signatures":[{"sig":"MEUCIQCVDDSegsivOaiD8UABTt3vQJ7cj/K/cOlaJMKn51TB8gIgco+3l+bjLO1ijs0Sl22OT12Dp67rYLjnxmdTA6Fs+Lk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDb/dh+xA1O7mwmeDmFSxXFpuNFrWNMXj95/DDNPU32/gIgPcmxSiAc7qcXAhf4mZRXr65mZrh9PjWiyARswZO5Vl4="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@archoleat%2fnext-accordion@1.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":20537},"name":"@archoleat/next-accordion","type":"module","types":"index.d.ts","author":{"url":"https://github.com/archoleat","name":"Archoleat","email":"nikkeyl.me@gmail.com"},"engines":{"bun":">=1.0.0"},"exports":{".":"./index.js"},"gitHead":"f788616c4ba1852e6e6e233b94121ff55f02aaf9","imports":{"#src/*":"./src/*","#utils/*":"./src/utils/*"},"license":"MIT","scripts":{"init":"bun i && husky"},"version":"1.2.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b66339eb-6e9c-4ee1-95a0-5ee9ae4546d8"}},"homepage":"https://github.com/archoleat/next-accordion#readme","keywords":["accordion","animation","archoleat","details","html-accordion","nextjs","plugin","react-accordion","react","summary","typescript","zero-deps"],"repository":{"url":"git+https://github.com/archoleat/next-accordion.git","type":"git"},"_npmVersion":"11.19.1","description":"Animated React accordion using details and summary","directories":{},"maintainers":[{"name":"nikkeyl","email":"nikkeyl.me@icloud.com"}],"_nodeVersion":"26.8.1","_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","react":"^19.2.7","tslib":"^2.8.1","eslint":"^10.6.0","remark":"15.0.1","rollup":"^4.62.2","globals":"^17.7.0","prettier":"^3.9.4","react-dom":"^19.2.7","@types/bun":"^1.3.14","remark-cli":"^12.0.1","typescript":"^6.0.2","lint-staged":"^17.0.8","@types/react":"^19.2.17","@eslint/compat":"^2.1.0","@commitlint/cli":"^21.2.0","@types/react-dom":"^19.2.3","semantic-release":"^25.0.5","@commitlint/types":"^21.2.0","rollup-plugin-dts":"^6.4.1","eslint-plugin-react":"^7.37.5","@rollup/plugin-alias":"^6.0.0","editorconfig-checker":"^6.1.1","eslint-define-config":"^2.1.0","eslint-plugin-import":"^2.32.0","@semantic-release/git":"^10.0.1","eslint-plugin-unicorn":"^70.0.0","rollup-plugin-esbuild":"^6.2.1","@testing-library/react":"^16.3.0","eslint-config-prettier":"^10.1.8","@rollup/plugin-typescript":"^12.3.0","@typescript-eslint/parser":"^8.62.1","eslint-plugin-react-hooks":"^7.1.1","@semantic-release/changelog":"^6.0.3","@happy-dom/global-registrator":"^18.0.1","remark-preset-lint-consistent":"^6.0.1","remark-preset-lint-recommended":"^7.0.1","@commitlint/config-conventional":"^21.2.0","@typescript-eslint/eslint-plugin":"^8.62.1","eslint-plugin-simple-import-sort":"^13.0.0","@archoleat/prettier-define-config":"^1.2.2","eslint-import-resolver-typescript":"^4.4.5","@archoleat/commitlint-define-config":"^1.1.2","remark-preset-lint-markdown-style-guide":"^6.0.1","@archoleat/semantic-release-define-config":"^1.3.2","conventional-changelog-conventionalcommits":"^9.3.1"},"peerDependencies":{"react":">=18.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/next-accordion_1.2.0_1788290223083_0.620879709948857"}}},"time":{"created":"2026-07-07T15:31:21.416Z","modified":"2026-09-01T19:17:03.600Z","1.0.0":"2026-07-07T15:31:21.803Z","1.0.1":"2026-07-08T14:36:26.702Z","1.1.0":"2026-07-09T19:33:16.658Z","1.2.0":"2026-09-01T19:17:03.182Z"},"bugs":{"url":"https://github.com/archoleat/next-accordion/issues"},"author":{"url":"https://github.com/archoleat","name":"Archoleat","email":"nikkeyl.me@gmail.com"},"license":"MIT","homepage":"https://github.com/archoleat/next-accordion#readme","keywords":["accordion","animation","archoleat","details","html-accordion","nextjs","plugin","react-accordion","react","summary","typescript","zero-deps"],"repository":{"url":"git+https://github.com/archoleat/next-accordion.git","type":"git"},"description":"Animated React accordion using details and summary","maintainers":[{"name":"nikkeyl","email":"nikkeyl.me@icloud.com"}],"readme":"# Next Accordion\n\n![NPM Version](https://img.shields.io/npm/v/%40archoleat%2Fnext-accordion)\n![NPM Downloads](https://img.shields.io/npm/dm/%40archoleat%2Fnext-accordion)\n![Specs](https://img.shields.io/github/actions/workflow/status/archoleat/next-accordion/spec.yaml?label=Specs)\n![Commitlint](https://img.shields.io/github/actions/workflow/status/archoleat/next-accordion/commitlint.yaml?label=Commitlint)\n![Editorconfig](https://img.shields.io/github/actions/workflow/status/archoleat/next-accordion/editorconfig.yaml?label=Editorconfig)\n![Prettier](https://img.shields.io/github/actions/workflow/status/archoleat/next-accordion/prettier.yaml?label=Prettier)\n![ESLint](https://img.shields.io/github/actions/workflow/status/archoleat/next-accordion/eslint.yaml?label=ESLint)\n![Remark](https://img.shields.io/github/actions/workflow/status/archoleat/next-accordion/remark.yaml?label=Remark)\n![Zero Deps](https://img.shields.io/badge/zero_dependencies-blue)\n![AI](https://img.shields.io/badge/AI-red)\n\n## Table of Contents\n\n- [Installation](#installation)\n- [Usage](#usage)\n- [Styling](#styling)\n- [Props](#props)\n- [Types](#types)\n- [Contributing](#contributing)\n- [License](#license)\n\nAnimated React accordion using details and summary\n\n## Installation\n\n```sh\nbun i -D @archoleat/next-accordion\n```\n\n## Usage\n\n### Single item\n\nRender a single collapsible panel:\n\n```tsx\nimport { AccordionItem } from '@archoleat/next-accordion';\n\nconst Example = () => (\n  <AccordionItem trigger=\"Trigger\">\n    <p>Content</p>\n  </AccordionItem>\n);\n\nexport { Example };\n```\n\n### List of items\n\nRender a list of panels from an array of data:\n\n```tsx\nimport { Accordion } from '@archoleat/next-accordion';\n\nconst items = [\n  { id: 1, trigger: 'First', content: <p>First content</p> },\n  { id: 2, trigger: 'Second', content: <p>Second content</p> },\n];\n\nconst Example = () => <Accordion exclusive items={items} />;\n\nexport { Example };\n```\n\n`Accordion` renders each item as an `<li>` inside a wrapping `<ul>` (with\n`className` applied to that `<ul>`), since a set of panels is semantically\na list. Browsers apply default list styling (markers, indent) to `<ul>`,\nso reset it yourself — see [Styling](#styling).\n\n### Compound components\n\nInstead of `items`, compose `AccordionItem`s directly as children.\n`Accordion` still coordinates the `exclusive` behavior between them:\n\n```tsx\nimport { Accordion, AccordionItem } from '@archoleat/next-accordion';\n\nconst Example = () => (\n  <Accordion exclusive>\n    <AccordionItem trigger=\"First\">\n      <p>First content</p>\n    </AccordionItem>\n    <AccordionItem trigger=\"Second\">\n      <p>Second content</p>\n    </AccordionItem>\n  </Accordion>\n);\n\nexport { Example };\n```\n\nGive each `AccordionItem` a `key` when the list can be reordered or\nfiltered; otherwise `Accordion` falls back to positional indexes to tell\nitems apart. `Accordion` accepts either `items` or `children`, not both.\n\n### Controlling the open item from outside\n\nIn `exclusive` mode, which item is open lives inside `Accordion` by\ndefault. Pass `openId` (paired with `onOpenIdChange`) to read or drive it\nfrom outside — the same controlled/uncontrolled split `AccordionItem`\nuses for `open`/`onOpenChange`:\n\n```tsx\nimport { useState } from 'react';\n\nimport type { AccordionOpenIdType } from '@archoleat/next-accordion';\nimport { Accordion } from '@archoleat/next-accordion';\n\nconst items = [\n  { id: 1, trigger: 'First', content: <p>First content</p> },\n  { id: 2, trigger: 'Second', content: <p>Second content</p> },\n];\n\nconst Example = () => {\n  const [openId, setOpenId] = useState<AccordionOpenIdType>(1);\n\n  return (\n    <Accordion\n      exclusive\n      items={items}\n      openId={openId}\n      onOpenIdChange={setOpenId}\n    />\n  );\n};\n\nexport { Example };\n```\n\nUncontrolled usage works the same way `defaultOpen` does on `AccordionItem`:\npass `defaultOpenId` for the initial open item and read subsequent changes\nthrough `onOpenIdChange`, without taking over the state yourself.\n\n## Styling\n\nThe library ships no CSS of its own beyond what's needed for the open/close\nanimation, so every visual aspect is yours to style. The rendered markup\ngives you the following hooks:\n\n- `Accordion`'s `className` targets the wrapping `<ul>`.\n\n- `AccordionItem`'s `className` (a forwarded native `details` attribute)\n  targets that item's `<details>`.\n\n- `AccordionItem`'s `triggerClassName` and `contentClassName` target\n  the `<summary>` and the panel wrapper `<div>` directly — no need to\n  reach for descendant selectors.\n\n- `trigger` is a `ReactNode`, so wrap it in your own elements to style\n  the label.\n\n- `<details open>` and a disabled item's `data-disabled` are both plain\n  attributes, so Tailwind's `open:` and `data-[disabled]:` variants apply\n  directly — no need for the `icon` function-of-`isOpen` form just to\n  rotate a chevron.\n\nThe example below uses [`cn`](https://ui.shadcn.com/docs/installation/manual#add-a-cn-helper),\nthe common `clsx` + `tailwind-merge` helper, to combine a shared base\nclass with any per-item override:\n\n```tsx\nimport { Accordion } from '@archoleat/next-accordion';\n\nimport { cn } from './lib/cn';\n\nconst ChevronIcon = () => (\n  <svg\n    aria-hidden\n    className=\"size-4 shrink-0 transition-transform duration-300 group-open:rotate-180\"\n    height=\"16\"\n    viewBox=\"0 0 16 16\"\n    width=\"16\"\n  >\n    <path d=\"M4 6l4 4 4-4\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" />\n  </svg>\n);\n\nconst items = [\n  { id: 1, trigger: 'First', content: <p>First content</p> },\n  { id: 2, trigger: 'Second', content: <p>Second content</p> },\n];\n\nconst Example = () => (\n  <Accordion\n    className=\"m-0 flex list-none flex-col gap-2 p-0\"\n    exclusive\n    items={items.map((item) => ({\n      ...item,\n      className: 'overflow-hidden rounded-lg border border-slate-200',\n      contentClassName: 'p-4 pt-0',\n      duration: 250,\n      easing: 'ease-in-out',\n      icon: <ChevronIcon />,\n      triggerClassName: cn(\n        'flex cursor-pointer items-center justify-between p-4',\n        'aria-disabled:pointer-events-none aria-disabled:opacity-50',\n      ),\n    }))}\n  />\n);\n\nexport { Example };\n```\n\n## Props\n\n<!-- lint disable maximum-line-length -->\n\n### `Accordion`\n\n| Prop        | Type                | Default | Description                                                                                                                                            |\n| ----------- | ------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `items`     | `AccordionItemDataType[]` | —       | Data rendered as a list of `AccordionItem`s. Each entry accepts `id` (`number`), `trigger`, `content`, plus every `AccordionItem` prop below (except `children`, which maps to `content`). Mutually exclusive with `children`. |\n| `children`  | `ReactNode`         | —       | `AccordionItem` elements composed directly (compound component pattern). Mutually exclusive with `items`.                                            |\n| `className` | `string`            | —       | Class applied to the wrapping `ul`. Each item is rendered inside its own `li`.                                                                        |\n| `exclusive` | `boolean`           | `false` | When `true`, opening one item closes the others.                                                                                                       |\n| `openId`    | `AccordionOpenIdType`   | —       | Id of the currently open item (controlled). Only meaningful when `exclusive` is `true`. Pair with `onOpenIdChange`.                                   |\n| `defaultOpenId` | `AccordionOpenIdType` | `null` | Initial open item id (uncontrolled). Only meaningful when `exclusive` is `true`.                                                                  |\n| `onOpenIdChange` | `(openId: AccordionOpenIdType) => void` | — | Called when the open item changes in `exclusive` mode.                                                                                     |\n\n### `AccordionItem`\n\n| Prop                      | Type                                          | Default        | Description                                                                                   |\n| ------------------------- | ---------------------------------------------- | -------------- | ----------------------------------------------------------------------------------------------- |\n| `trigger`                 | `ReactNode`                                    | —              | Content rendered inside the `summary` element. **Required.**                                    |\n| `children`                | `ReactNode`                                    | —              | Content rendered inside the accordion panel. **Required.**                                       |\n| `defaultOpen`              | `boolean`                                      | `false`        | Initial expanded state (uncontrolled).                                                          |\n| `open`                    | `boolean`                                      | —              | Expanded state (controlled). Pair with `onOpenChange`.                                          |\n| `onOpenChange`             | `(isOpen: boolean) => void`                    | —              | Called when the trigger is clicked.                                                             |\n| `disabled`                | `boolean`                                      | `false`        | Ignores clicks on the trigger.                                                                   |\n| `duration`                | `number`                                       | `300`          | Animation duration in milliseconds.                                                              |\n| `easing`                  | `string`                                       | `'ease-in-out'` | Animation easing, passed to the Web Animations API.                                            |\n| `icon`                    | `ReactNode \\| (isOpen: boolean) => ReactNode`  | —              | Rendered after `trigger`; the function form receives the open state.                            |\n| `disableTriggerSelection` | `boolean`                                      | `false`        | Prevents text selection on the trigger (e.g. on double-click).                                  |\n| `triggerClassName`        | `string`                                       | —              | Class applied to the `summary` element.                                                         |\n| `contentClassName`        | `string`                                       | —              | Class applied to the panel wrapper `div`.                                                        |\n\n<!-- lint enable maximum-line-length -->\n\nAll other native `details` attributes (`id`, `className`, and so on) are\nforwarded to the underlying `<details>` element. The animation is skipped\nin favor of an instant toggle when the user has `prefers-reduced-motion`\nenabled.\n\n## Types\n\n`@archoleat/next-accordion` exports the prop types for both components,\nplus the shape used by `items` and by the open-item id, so you can type\nyour own code around them without redeclaring the definitions.\n\n`AccordionOpenIdType` (`number | string | null`) is the type of `openId`,\n`defaultOpenId`, and the argument passed to `onOpenIdChange` — see\n[Controlling the open item from outside](#controlling-the-open-item-from-outside).\n\nType an `items` array built outside JSX with `AccordionItemDataType`:\n\n```tsx\nimport type { AccordionItemDataType } from '@archoleat/next-accordion';\n\nconst items: AccordionItemDataType[] = [\n  { id: 1, trigger: 'First', content: <p>First content</p> },\n  { id: 2, trigger: 'Second', content: <p>Second content</p> },\n];\n\nexport { items };\n```\n\nType a wrapper component with `AccordionProps` / `AccordionItemProps`:\n\n```tsx\nimport { Accordion, AccordionItem } from '@archoleat/next-accordion';\nimport type {\n  AccordionItemProps,\n  AccordionProps,\n} from '@archoleat/next-accordion';\n\nconst FaqAccordion = (props: AccordionProps) => (\n  <Accordion className=\"faq\" {...props} />\n);\n\nconst FaqItem = (props: AccordionItemProps) => (\n  <AccordionItem duration={300} {...props} />\n);\n\nexport { FaqAccordion, FaqItem };\n```\n\n## Contributing\n\nPlease read [**CONTRIBUTING**](https://github.com/archoleat/.github/blob/main/CONTRIBUTING.md)\nto start contributing.\n\n## License\n\nThis project is licensed under the [**MIT license**](LICENSE).\n","readmeFilename":"README.md"}