Skip to content
Page

Accordion

Stacked sections that expand one or many at a time.

Run bun add @pelagornis/page and register the plugin in Starlight.
import {
Accordion,
AccordionItem,
AccordionTrigger,
AccordionContent,
} from "@pelagornis/page/components";

The preview above renders this file. Copy it into src/components/ to start from it.

src/components/AccordionExample.tsx
import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from "@pelagornis/page/components";
export default function AccordionDemo() {
return (
<Accordion type="single" collapsible defaultValue="install" className="w-full">
<AccordionItem value="install">
<AccordionTrigger>How do I install the theme?</AccordionTrigger>
<AccordionContent>Run bun add @pelagornis/page and register the plugin in Starlight.</AccordionContent>
</AccordionItem>
<AccordionItem value="css">
<AccordionTrigger>Do I import any CSS?</AccordionTrigger>
<AccordionContent>No. The plugin injects the RefineUI stylesheets.</AccordionContent>
</AccordionItem>
<AccordionItem value="components">
<AccordionTrigger>Where do components come from?</AccordionTrigger>
<AccordionContent>@pelagornis/page/components re-exports @refineui/react.</AccordionContent>
</AccordionItem>
</Accordion>
);
}

Accordion is composed from parts that share React state. Children written in MDX are rendered as separate islands, so the parts can’t reach each other. Put the composition in a .tsx file, like the example above, and import that file instead.

src/content/docs/example.mdx
---
title: Example
---
import AccordionExample from "../../components/AccordionExample";
<AccordionExample client:load />

client:load hydrates the island on page load. Use client:visible for content far down the page.

Markdoc tags render Astro components, and this one needs client state. Wrap the example in an .astro file that hydrates it, then register that file as a tag.

src/components/markdoc/AccordionExample.astro
---
import AccordionExample from "../AccordionExample";
---
<AccordionExample client:load />
markdoc.config.mjs
import { component, defineMarkdocConfig } from "@astrojs/markdoc/config";
import starlightMarkdoc from "@astrojs/starlight-markdoc";
import pageMarkdoc from "@pelagornis/page/markdoc";
export default defineMarkdocConfig({
extends: [starlightMarkdoc(), pageMarkdoc()],
tags: {
"accordion-example": {
render: component("./src/components/markdoc/AccordionExample.astro"),
selfClosing: true,
},
},
});
src/content/docs/example.mdoc
{% accordion-example /%}

Values the component accepts for each variant prop.

PropValues
sizesm md lg
typesingle multiple

Parts of the component and the data-refineui role each one renders.

PartRole
rootaccordion
itemaccordion-item
triggeraccordion-trigger
panelaccordion-panel
contentaccordion-content

States the component styles. Component states are exposed as data attributes.

KindStates
Pseudofocus-visible
data-stateopen closed

Keys the component handles when it has focus.

KeyAction
ArrowDownnext-trigger
ArrowUpprevious-trigger
Homefirst-trigger
Endlast-trigger