Progressive disclosure
A button that shows and hides a panel of secondary content, such as advanced options. Keeps the default view short.
Code
demo.tsx
import {Button, ProgressiveDisclosure, Text} from '@earendil-works/elanor-react';
export default function ProgressiveDisclosureDemo() {
return (
<ProgressiveDisclosure.Root>
<ProgressiveDisclosure.Trigger render={<Button hierarchy="secondary" />}>
Show billing details
</ProgressiveDisclosure.Trigger>
<ProgressiveDisclosure.Panel>
<Text>Invoices are sent on the first day of each month to the billing contact.</Text>
</ProgressiveDisclosure.Panel>
</ProgressiveDisclosure.Root>
);
} Usage
import {ProgressiveDisclosure} from '@earendil-works/elanor-react';
<ProgressiveDisclosure.Root>
<ProgressiveDisclosure.Trigger />
<ProgressiveDisclosure.Panel />
</ProgressiveDisclosure.Root>;
defaultOpen starts the panel open; open and onOpenChange control it.
Keep content mounted
A closed panel unmounts its content, so unsaved input is lost. keepMounted keeps it: edit the field, close the panel, and reopen it.
Code
keep-mounted.tsx
import {Button, Field, Input, ProgressiveDisclosure} from '@earendil-works/elanor-react';
export default function ProgressiveDisclosureKeepMounted() {
return (
<ProgressiveDisclosure.Root defaultOpen>
<ProgressiveDisclosure.Trigger render={<Button hierarchy="secondary" />}>
Advanced options
</ProgressiveDisclosure.Trigger>
<ProgressiveDisclosure.Panel keepMounted>
<Field.Root name="deployment-region">
<Field.Label>Deployment region</Field.Label>
<Input defaultValue="eu-central-1" />
</Field.Root>
</ProgressiveDisclosure.Panel>
</ProgressiveDisclosure.Root>
);
} API
ProgressiveDisclosure.Root
Accepts Base UI Collapsible.Root props.
ProgressiveDisclosure.Trigger
Accepts Base UI Collapsible.Trigger props.
ProgressiveDisclosure.Panel
Accepts Base UI Collapsible.Panel props.