--- title: Page description: >- The outer wrapper of the page—including the page title, subtitle, and page-level actions—displayed in a familiar and consistent style that sets expectations about the purpose of the page. 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/layout-and-structure/page md: >- https://shopify.dev/docs/api/customer-account-ui-extensions/2025-07/ui-components/layout-and-structure/page.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/api/customer-account-ui-extensions/2025-10/upgrading-to-2025-10) to upgrade your extension. # Page The outer wrapper of the page—including the page title, subtitle, and page-level actions—displayed in a familiar and consistent style that sets expectations about the purpose of the page. ### Support Targets (25) ### Supported targets * Customer​Account::Kitchen​Sink * customer-account.​footer.​render-after * customer-account.​order-index.​announcement.​render * customer-account.​order-index.​block.​render * customer-account.​order-status.​announcement.​render * customer-account.​order-status.​block.​render * customer-account.​order-status.​cart-line-item.​render-after * customer-account.​order-status.​cart-line-list.​render-after * customer-account.​order-status.​customer-information.​render-after * customer-account.​order-status.​fulfillment-details.​render-after * customer-account.​order-status.​payment-details.​render-after * customer-account.​order-status.​return-details.​render-after * customer-account.​order-status.​unfulfilled-items.​render-after * customer-account.​order.​action.​menu-item.​render * customer-account.​order.​action.​render * customer-account.​order.​page.​render * customer-account.​page.​render * customer-account.​profile.​addresses.​render-after * customer-account.​profile.​announcement.​render * customer-account.​profile.​block.​render * customer-account.​profile.​company-details.​render-after * customer-account.​profile.​company-location-addresses.​render-after * customer-account.​profile.​company-location-payment.​render-after * customer-account.​profile.​company-location-staff.​render-after * customer-account.​profile.​payment.​render-after ## PageProps * **title** **string** **required** The text to be used as title. * **loading** **boolean** **Default: false** Indicates that the page is in a loading state. When `true`, the page shows loading indicators for the UI elements that it is owns. The page is not responsible for the loading indicators of any content that is passed as `children`. * **primaryAction** **RemoteFragment** The action grouping, provided as button(s), that is placed in the primary position of the page. * **primaryActionAccessibilityLabel** **string** **Default: "More actions"** Accessibility label for the primary action grouping. If an accessibility label is not provided, default text is used. * **primaryActionLabel** **string** **Default: "More actions"** Label for the primary action grouping. If a label is not provided, default text is used. * **secondaryAction** **RemoteFragment** The action grouping, provided as button(s), that is placed in the secondary position of the page. * **subtitle** **string** The text to be used as subtitle. ## ButtonProps primaryAction Supported props for Buttons used inside Page `primaryAction` prop.\ \ `children` only support text. * **accessibilityLabel** **string** A label used for buyers using assistive technologies. When set, any `children` supplied to this component will not be announced to screen reader users. * **disabled** **boolean** **Default: false** Disables the button, disallowing any interaction. * **loading** **boolean** **Default: false** Replaces content with a loading indicator. * **loadingLabel** **string** Accessible label for the loading indicator when user prefers reduced motion. This value is only used if `loading` is true. * **onPress** **() => void** Callback that is run when the button is pressed. * **overlay** **RemoteFragment** An overlay component to render when the user interacts with the component. * **to** **string** Destination URL to link to. ## ButtonProps secondaryAction Supported props for Button used inside Page `secondaryAction` prop.\ \ `children` are not supported.\ Use `accessibilityLabel` instead. * **accessibilityLabel** **string** **required** A label used for buyers using assistive technologies. Needed because `children` passed to this component will be discarded. * **onPress** **() => void** Callback that is run when the button is pressed. * **to** **string** Destination URL to link to. Examples ## Preview ![An example of how the Page component is used to structure the page title, description, order action buttons on the Order status page.](https://cdn.shopify.com/shopifycloud/shopify-dev/development/assets/assets/images/templated-apis-screenshots/customer-account-ui-extensions/2025-07/page-preview-DkLs8RmG.png) ### Examples * #### Basic Page ##### React ```tsx import { Page, Button, reactExtension, } from '@shopify/ui-extensions-react/customer-account'; import React from 'react'; export default reactExtension('customer-account.page.render', () => ); function App() { return ( {}}/>} primaryActionLabel="Manage" primaryAction={ <> } > Content ); } ``` ##### JS ```js import { Page, Button, extension } from '@shopify/ui-extensions/customer-account'; export default extension( 'customer-account.page.render', (root, api) => { renderApp(root, api); }, ) async function renderApp(root, api) { const primaryAction = root.createFragment(); await primaryAction.append(root.createComponent(Button, {onPress: () => {console.log("primary action 1")}}, 'Buy again primary 1')); await primaryAction.append(root.createComponent(Button, {onPress: () => {console.log("primary action 2")}}, 'Buy again primary 2')); await primaryAction.append(root.createComponent(Button, {onPress: () => {console.log("primary action 3")}}, 'Buy again primary 3')); const secondaryAction = root.createFragment(); await secondaryAction.append(root.createComponent(Button, {accessibilityLabel: 'Button', onPress: () => {}})) const page = root.createComponent( Page, { title: "Order #1411", subtitle: "Confirmed Oct 5", primaryAction, primaryActionLabel: "Manage", secondaryAction, }, root.createComponent('View', {}, "Content") ) root.append(page); } ``` ## Best Practices **Title** * Set clear expectations about the purpose and main topic of the page. * Aim for 1-3 words. * Use sentence case. **Subtitle** * Use to provide additional context or information that enhances the customer’s understanding of the page. * Use subtitles sparingly and only when they add useful information that is distinct from the title. **Buttons** * Use for page-level actions only. * If there is a single primary action for the page, display it as a primary button. Display all other page-level actions as secondary buttons. * See [UX guidelines](https://shopify.dev/docs/apps/customer-accounts/order-action-menu-extensions/ux-guidelines) to learn more about the button logic for order actions.