# Disclosure 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 `Checkbox` component. The content blocks can be specified as children inside a structure component (`View`, `InlineLayout`, `BlockStack`, `Grid`, etc.). The library takes care of applying the WAI-ARIA Accordion pattern automatically for the activator and the toggled content. ```tsx import { reactExtension, Disclosure, Button, View, } from '@shopify/ui-extensions-react/checkout'; export default reactExtension( 'purchase.checkout.block.render', () => , ); function Extension() { return ( Content ); } ``` ```js import { extension, Button, View, Disclosure, } from '@shopify/ui-extensions/checkout'; export default extension('purchase.checkout.block.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); }); ``` ## DisclosureProps ### DisclosureProps ### defaultOpen value: `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 ### open value: `DisclosureOpen` For controlled disclosure components, the open state. The `open` prop should be used along with `onToggle` to create a controlled disclosure component. ### onToggle value: `(open: string[]) => void` Callback fired when the open state of the disclosure changes. ### transition value: `"none"` Set to 'none' to disable the default transition animation. ### ConditionalStyle ### default value: `T` The default value applied when none of the conditional values specified in `conditionals` are met. ### conditionals value: `ConditionalValue[]` An array of conditional values. ### ConditionalValue ### conditions value: `AcceptedConditions` The conditions that must be met for the value to be applied. At least one condition must be specified. ### value value: `T` The value that will be applied if the conditions are met. ### ViewportSizeCondition ### viewportInlineSize value: `{ min: ViewportInlineSize; }` ## Examples 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 `Checkbox` component. The content blocks can be specified as children inside a structure component (`View`, `InlineLayout`, `BlockStack`, `Grid`, etc.). The library takes care of applying the WAI-ARIA Accordion pattern automatically for the activator and the toggled content. Use the Disclosure component to simplify the user experience and reveal interfaces only when the customer requests it. It also demonstrates how a combination of inline and block layout components can improve the readability of information. By employing these strategies, users can easily scan and comprehend the content, making for a better user experience overall. ```jsx 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
); }; ``` ```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); }, ); ``` ## Examples 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 `Checkbox` component. The content blocks can be specified as children inside a structure component (`View`, `InlineLayout`, `BlockStack`, `Grid`, etc.). The library takes care of applying the WAI-ARIA Accordion pattern automatically for the activator and the toggled content. Use the Disclosure component to simplify the user experience and reveal interfaces only when the customer requests it. It also demonstrates how a combination of inline and block layout components can improve the readability of information. By employing these strategies, users can easily scan and comprehend the content, making for a better user experience overall. ```jsx 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
); }; ``` ```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); }, ); ```