Disclosure

A disclosure is a collapsible section with a header containing a heading and a trigger button, and a panel that wraps the content.

Import

import {
  Disclosure,
  DisclosureTrigger,
  DisclosurePanel
} from '@heroui/react';

Usage

Scan this QR code with your camera app to preview the HeroUI native components.

Expo Go QR Code

Expo must be installed on your device.

"use client";

import {
  Button,
  Disclosure,
  DisclosureBody,
  DisclosureContent,
  DisclosureHeading,
  DisclosureIndicator,
} from "@heroui/react";
import {Icon} from "@iconify/react";
import React from "react";

export function Basic() {
  const [isExpanded, setIsExpanded] = React.useState(true);

  return (
    <div className="w-full max-w-md text-center">
      <Disclosure isExpanded={isExpanded} onExpandedChange={setIsExpanded}>
        <DisclosureHeading>
          <Button slot="trigger" variant="secondary">
            <Icon icon="gravity-ui:qr-code" />
            Preview HeroUI Native
            <DisclosureIndicator />
          </Button>
        </DisclosureHeading>
        <DisclosureContent>
          <DisclosureBody className="bg-panel shadow-panel rounded-panel flex flex-col items-center p-4 text-center">
            <p className="text-muted text-sm">
              Scan this QR code with your camera app to preview the HeroUI native components.
            </p>
            <img
              alt="Expo Go QR Code"
              className="max-w-54 aspect-square w-full object-cover"
              src="https://raw.githubusercontent.com/heroui-inc/heroui-native/refs/heads/alpha/expo-go-qr.png"
            />
            <p className="text-muted text-sm">Expo must be installed on your device.</p>
            <Button className="mt-4" variant="primary">
              <Icon icon="tabler:brand-apple-filled" />
              Download on App Store
            </Button>
          </DisclosureBody>
        </DisclosureContent>
      </Disclosure>
    </div>
  );
}

Anatomy

Import all parts and piece them together.

import {
  Disclosure,
  DisclosureTrigger,
  DisclosurePanel
} from '@heroui/react';

export default () => (
  <Disclosure>
    <DisclosureTrigger>Toggle</DisclosureTrigger>
    <DisclosurePanel>Content</DisclosurePanel>
  </Disclosure>
)

Styling

Passing Tailwind CSS classes

import {
  Disclosure,
  DisclosureTrigger,
  DisclosurePanel
} from '@heroui/react';

function CustomDisclosure() {
  return (
    <Disclosure className="border rounded-lg p-4">
      <DisclosureTrigger className="text-lg font-semibold">
        Click to expand
      </DisclosureTrigger>
      <DisclosurePanel className="mt-4 text-gray-600">
        Hidden content
      </DisclosurePanel>
    </Disclosure>
  );
}

Customizing the component classes

To customize the Disclosure component classes, you can use the @layer components directive.
Learn more.

@layer components {
  .disclosure {
    @apply relative;
  }
  
  .disclosure__trigger {
    @apply cursor-pointer;
  }
  
  .disclosure__indicator {
    @apply transition-transform duration-300;
  }
  
  .disclosure__content {
    @apply overflow-hidden transition-all;
  }
}

HeroUI follows the BEM methodology to ensure component variants and states are reusable and easy to customize.

CSS Classes

The Disclosure component uses these CSS classes (View source styles):

Base Classes

  • .disclosure - Base container styles
  • .disclosure__heading - Heading wrapper
  • .disclosure__trigger - Trigger button styles
  • .disclosure__indicator - Chevron indicator styles
  • .disclosure__content - Content container with animations

Interactive States

The component supports both CSS pseudo-classes and data attributes for flexibility:

  • Expanded: [data-expanded="true"] on indicator for rotation
  • Focus: :focus-visible or [data-focus-visible="true"] on trigger
  • Disabled: :disabled or [aria-disabled="true"] on trigger
  • Hidden: [aria-hidden="false"] on content for visibility

API Reference

Disclosure Props

PropTypeDefaultDescription
isExpandedbooleanfalseControls the expanded state
onExpandedChange(isExpanded: boolean) => void-Callback when expanded state changes
isDisabledbooleanfalseWhether the disclosure is disabled
childrenReactNode | RenderFunction-Content to render
classNamestring-Additional CSS classes

DisclosureTrigger Props

PropTypeDefaultDescription
childrenReactNode | RenderFunction-Trigger content
classNamestring-Additional CSS classes

DisclosurePanel Props

PropTypeDefaultDescription
childrenReactNode-Content to show/hide
classNamestring-Additional CSS classes

RenderProps

When using the render prop pattern, these values are provided:

PropTypeDescription
isExpandedbooleanCurrent expanded state
isDisabledbooleanWhether disclosure is disabled