--- title: Disclosure description: >- Disclosure is an optionally controlled component used to put long sections of information under content blocks that users can expand or collapse by pressing an activator. The activator can be specified as children using an action component (Button, Link or Pressable) or a form control (Checkbox or Switch) component. api_version: 2025-07 api_name: customer-account-ui-extensions source_url: html: >- https://shopify.dev/docs/api/customer-account-ui-extensions/2025-07/ui-components/typography-and-content/disclosure md: >- https://shopify.dev/docs/api/customer-account-ui-extensions/2025-07/ui-components/typography-and-content/disclosure.md --- Migrate to Polaris Version 2025-07 is the last API version to support React-based UI components. Later versions use [web components](https://shopify.dev/docs/api/customer-account-ui-extensions/latest/polaris-web-components), native UI elements with built-in accessibility, better performance, and consistent styling with [Shopify's design system](https://shopify.dev/docs/apps/design). Check out the [migration guide](https://shopify.dev/docs/apps/build/customer-accounts/migrate-to-web-components) to upgrade your extension. # Disclosure The disclosure component creates expandable content sections that customers can show or hide. Use disclosure to place long content blocks behind toggle controls like buttons, links, or switches. The component automatically applies the [WAI-ARIA Accordion pattern](https://www.w3.org/WAI/ARIA/apg/patterns/accordion/) for accessibility. ### Support Targets (25) ### Supported targets * Customer​Account::Kitchen​Sink * [customer-account.​footer.​render-after](https://shopify.dev/docs/api/customer-account-ui-extensions/2025-07/targets/footer#footer-render-after-) * [customer-account.​order-index.​announcement.​render](https://shopify.dev/docs/api/customer-account-ui-extensions/2025-07/targets/order-index#order-index-targets) * [customer-account.​order-index.​block.​render](https://shopify.dev/docs/api/customer-account-ui-extensions/2025-07/targets/order-index#order-index-block-) * [customer-account.​order-status.​announcement.​render](https://shopify.dev/docs/api/customer-account-ui-extensions/2025-07/targets/order-status#order-status-announcement-) * [customer-account.​order-status.​block.​render](https://shopify.dev/docs/api/customer-account-ui-extensions/2025-07/targets/order-status#order-status-block-) * [customer-account.​order-status.​cart-line-item.​render-after](https://shopify.dev/docs/api/customer-account-ui-extensions/2025-07/targets/order-status#cart-line-item-render-after-) * [customer-account.​order-status.​cart-line-list.​render-after](https://shopify.dev/docs/api/customer-account-ui-extensions/2025-07/targets/order-status#cart-line-list-render-after-) * [customer-account.​order-status.​customer-information.​render-after](https://shopify.dev/docs/api/customer-account-ui-extensions/2025-07/targets/order-status#customer-information-render-after-) * [customer-account.​order-status.​fulfillment-details.​render-after](https://shopify.dev/docs/api/customer-account-ui-extensions/2025-07/targets/fulfillment-status#fulfillment-status-targets) * [customer-account.​order-status.​payment-details.​render-after](https://shopify.dev/docs/api/customer-account-ui-extensions/2025-07/targets/payments-and-returns#payments-and-returns-targets) * [customer-account.​order-status.​return-details.​render-after](https://shopify.dev/docs/api/customer-account-ui-extensions/2025-07/targets/payments-and-returns#return-details-render-after-) * [customer-account.​order-status.​unfulfilled-items.​render-after](https://shopify.dev/docs/api/customer-account-ui-extensions/2025-07/targets/fulfillment-status#unfulfilled-items-render-after-) * [customer-account.​order.​action.​menu-item.​render](https://shopify.dev/docs/api/customer-account-ui-extensions/2025-07/targets/order-actions#order-action-menu-item-) * [customer-account.​order.​action.​render](https://shopify.dev/docs/api/customer-account-ui-extensions/2025-07/targets/order-actions#order-action-) * [customer-account.​order.​page.​render](https://shopify.dev/docs/api/customer-account-ui-extensions/2025-07/targets/full-page#order-specific-full-page-) * [customer-account.​page.​render](https://shopify.dev/docs/api/customer-account-ui-extensions/2025-07/targets/full-page#customer-account-full-page-) * [customer-account.​profile.​addresses.​render-after](https://shopify.dev/docs/api/customer-account-ui-extensions/2025-07/targets/profile-page-default#profile-page-default-targets-) * [customer-account.​profile.​announcement.​render](https://shopify.dev/docs/api/customer-account-ui-extensions/2025-07/targets/profile-page-default#announcement-) * [customer-account.​profile.​block.​render](https://shopify.dev/docs/api/customer-account-ui-extensions/2025-07/targets/profile-page-default#profile-block-) * [customer-account.​profile.​company-details.​render-after](https://shopify.dev/docs/api/customer-account-ui-extensions/2025-07/targets/profile-page-b2b#profile-page-b2b-targets-) * [customer-account.​profile.​company-location-addresses.​render-after](https://shopify.dev/docs/api/customer-account-ui-extensions/2025-07/targets/profile-page-b2b#company-location-addresses-render-after-) * [customer-account.​profile.​company-location-payment.​render-after](https://shopify.dev/docs/api/customer-account-ui-extensions/2025-07/targets/profile-page-b2b#company-location-payment-render-after-) * [customer-account.​profile.​company-location-staff.​render-after](https://shopify.dev/docs/api/customer-account-ui-extensions/2025-07/targets/profile-page-b2b#company-location-staff-render-after-) * customer-account.​profile.​payment.​render-after #### Use cases * **Expandable FAQs**: Let customers reveal answers to common questions without cluttering the page. * **Optional settings**: Hide advanced configuration behind a toggle for a cleaner interface. * **Additional order details**: Show extended order information only when requested. * **Terms and conditions**: Place lengthy legal text behind an expandable control. *** ## Properties Configure the following properties on the Disclosure component. * **defaultOpen** **MaybeResponsiveConditionalStyle\** For uncontrolled disclosure components, the default `open` state on the initial render. It's possible to specify a boolean value, a string value, or an array of string values: * `true` will expand all content * `false` will collapse all content * `string` will expand the content with the matching `id` * `string[]` will expand the content with the matching `id`s * **onToggle** **(open: string\[]) => void** A callback fired when the open state of the disclosure changes. * **open** **DisclosureOpen** For controlled disclosure components, the open state. The `open` prop should be used along with `onToggle` to create a controlled disclosure component. * **transition** **'none'** Set to 'none' to disable the default transition animation. ### MaybeResponsiveConditionalStyle A type that represents a value that can be a conditional style. The conditions are based on the viewport size. We highly recommend using the \`Style\` helper which simplifies the creation of conditional styles. ```ts T | ConditionalStyle ``` ### ConditionalStyle A conditional style definition that maps one or more conditions to different values. The \`default\` value is used as a fallback when none of the conditions in \`conditionals\` are satisfied. * conditionals An array of conditional values. ```ts ConditionalValue[] ``` * default The default value applied when none of the conditional values specified in \`conditionals\` are met. ```ts T ``` ### ConditionalValue A single conditional branch that pairs a set of conditions with the value to apply when those conditions are met. * conditions The conditions that must be met for the value to be applied. At least one condition must be specified. ```ts AcceptedConditions ``` * value The value that will be applied if the conditions are met. ```ts T ``` ### ViewportSizeCondition A condition that targets layouts based on the inline size (width in horizontal writing modes) of the viewport. * viewportInlineSize The minimum viewport inline size that the condition must match. ```ts { min: T; } ``` ### DisclosureOpen ```ts boolean | string | string[] ``` *** ## Examples ### Create an expandable section Hide content behind a toggle that customers can expand on demand. This example uses a button activator to reveal a hidden content block. ## Create an expandable section ![A disclosure component with a button activator that expands to show hidden content](https://shopify.dev/assets/assets/images/templated-apis-screenshots/checkout-ui-extensions/2025-07/disclosure-default-BIU1Onom.png) ## Create an expandable section ##### React ```tsx import { reactExtension, Disclosure, Button, View, } from '@shopify/ui-extensions-react/customer-account'; export default reactExtension( 'customer-account.page.render', () => , ); function Extension() { return ( Content ); } ``` ##### JS ```js import { extension, Button, View, Disclosure, } from '@shopify/ui-extensions/customer-account'; export default extension('customer-account.page.render', (root) => { const disclosure = root.createComponent(Disclosure, {}, [ root.createComponent(Button, {toggles: 'one'}, 'Toggle'), root.createComponent( View, {border: 'base', padding: 'base', id: 'one'}, 'Content', ), ]); root.appendChild(disclosure); }); ``` ### Combine disclosure with layout components Use disclosure with inline and block layout components to organize expandable content. This example shows how to reveal structured information when the customer requests it. ## Combine disclosure with layout components ![A disclosure component combined with inline and block layout components to organize expandable content](https://shopify.dev/assets/assets/images/templated-apis-screenshots/checkout-ui-extensions/2025-07/disclosure-and-alignment-B4MzyI19.gif) ## Combine disclosure with layout components ##### React ```tsx import { reactExtension, View, Image, Icon, Pressable, Disclosure, InlineLayout, BlockStack, Text, Form, TextField, Button, Divider, InlineStack, } from '@shopify/ui-extensions-react/checkout'; export default reactExtension( 'purchase.checkout.block.render', () => , ); export const DisclosureAndAlignment = () => { const openIds = ['one']; return ( console.log('onToggle event', open) } > Gift message
console.log('onSubmit event') } >
Verify with 15% savings for students and military
); }; ``` ##### JavaScript ```js import { extension, BlockStack, View, InlineLayout, InlineStack, Image, Pressable, Icon, Text, TextField, Form, Button, Disclosure, Divider, } from '@shopify/ui-extensions/checkout'; export default extension( 'purchase.checkout.block.render', (root) => { const openIds = ['one']; const pressable = root.createComponent( Pressable, { toggles: 'one', padding: 'base', }, [ root.createComponent( InlineLayout, { blockAlignment: 'center', spacing: 'base', columns: ['auto', 'fill', 'auto'], }, [ root.createComponent(Icon, { source: 'gift', appearance: 'subdued', }), 'Gift message', root.createComponent(Icon, { source: openIds.includes('one') ? 'chevronUp' : 'chevronDown', size: 'small', }), ], ), ], ); const disclosureView = root.createComponent( View, { id: 'one', padding: ['none', 'base', 'base', 'base'], }, [ root.createComponent( Form, { onSubmit: () => console.log('onSubmit event'), }, [ root.createComponent(BlockStack, {}, [ root.createComponent( InlineLayout, { columns: ['fill', 'fill'], spacing: 'base', }, [ root.createComponent( TextField, { label: 'From', name: 'from0', id: 'from0', }, ), root.createComponent( TextField, { label: 'To', name: 'to0', id: 'to0', }, ), ], ), root.createComponent(TextField, { label: 'Message', name: 'message0', id: 'message0', }), root.createComponent(View, {}, [ root.createComponent( Button, { accessibilityRole: 'submit', kind: 'secondary', }, 'Save', ), ]), ]), ], ), ], ); const disclosure = root.createComponent( Disclosure, { defaultOpen: 'one', onToggle: (open) => console.log('onToggle event', open), }, [pressable, disclosureView], ); const inlineLayout = root.createComponent( InlineLayout, { blockAlignment: 'baseline', spacing: 'base', columns: ['auto', 'fill', 'auto'], padding: 'base', }, [ root.createComponent(Icon, { source: 'profile', appearance: 'subdued', }), root.createComponent( BlockStack, { spacing: 'none', }, [ root.createComponent( InlineStack, { blockAlignment: 'center', }, [ root.createComponent( Text, {}, 'Verify with', ), root.createComponent(Image, { source: 'https://via.placeholder.com/50x15', }), ], ), root.createComponent( Text, { appearance: 'subdued', size: 'small', }, '15% savings for students and military', ), ], ), root.createComponent( Pressable, { to: 'https://www.shopify.com', }, [ root.createComponent(Icon, { source: 'external', appearance: 'subdued', }), ], ), ], ); const view = root.createComponent( View, { maxInlineSize: 400, cornerRadius: 'large', border: 'base', }, [ root.createComponent( BlockStack, { spacing: 'none', }, [ disclosure, root.createComponent(Divider), inlineLayout, ], ), ], ); root.appendChild(view); }, ); ``` *** ## Best practices * **Use clear toggle labels**: Make activator text describe what will be revealed. * **Default to collapsed**: Keep disclosure closed unless content is essential. * **Use appropriate activators**: Use buttons for actions, switches for settings, checkboxes for opt-ins. *** ## Limitations * The activator must be an action component (Button, Link, Pressable) or form control (Checkbox, Switch). * Content must be wrapped in a structure component (View, BlockStack, Grid, etc.). ***