@commercetools/nimbus-mcp 2.11.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. package/data/docs/route-manifest.json +1421 -605
  2. package/data/docs/routes/components-data-display-card.json +71 -5
  3. package/data/docs/routes/components-data-display-data-table.json +66 -34
  4. package/data/docs/routes/components-data-display-draggable-list.json +62 -7
  5. package/data/docs/routes/components-feedback-toast.json +1 -1
  6. package/data/docs/routes/components-inputs-checkbox.json +2 -2
  7. package/data/docs/routes/components-layout-defaultpage.json +4 -4
  8. package/data/docs/routes/components-layout-modalpage.json +4 -4
  9. package/data/docs/routes/components-layout-scrollarea.json +3 -3
  10. package/data/docs/routes/components-layout-splitter.json +654 -0
  11. package/data/docs/routes/components-media-avatar.json +24 -2
  12. package/data/docs/routes/components-utilities-region.json +265 -0
  13. package/data/docs/routes/home-getting-started-bundler-plugins.json +248 -0
  14. package/data/docs/routes/hooks-usedraganddrop.json +310 -0
  15. package/data/docs/routes/patterns-actions-form-action-bar.json +412 -0
  16. package/data/docs/routes/patterns-actions.json +78 -0
  17. package/data/docs/routes/patterns-dialogs-confirmation-dialog.json +391 -0
  18. package/data/docs/routes/patterns-dialogs-form-dialog.json +358 -0
  19. package/data/docs/routes/patterns-dialogs-info-dialog.json +315 -0
  20. package/data/docs/routes/patterns-dialogs.json +78 -0
  21. package/data/docs/routes/patterns-pages-public-page-layout.json +371 -0
  22. package/data/docs/routes/patterns-pages.json +78 -0
  23. package/data/docs/search-index.json +1 -1
  24. package/data/docs/types/AccordionContent.json +32 -32
  25. package/data/docs/types/AccordionHeader.json +102 -102
  26. package/data/docs/types/AccordionItem.json +28 -28
  27. package/data/docs/types/AccordionRoot.json +15 -15
  28. package/data/docs/types/AlertDescription.json +8 -8
  29. package/data/docs/types/AlertDismissButton.json +89 -89
  30. package/data/docs/types/AlertTitle.json +8 -8
  31. package/data/docs/types/Avatar.json +8 -8
  32. package/data/docs/types/Badge.json +2 -2
  33. package/data/docs/types/Body.json +6 -6
  34. package/data/docs/types/Box.json +6 -6
  35. package/data/docs/types/Button.json +97 -97
  36. package/data/docs/types/Calendar.json +111 -65
  37. package/data/docs/types/Caption.json +6 -6
  38. package/data/docs/types/Card.json +1 -1
  39. package/data/docs/types/{CardContent.json → CardBody.json} +2 -2
  40. package/data/docs/types/CardFooter.json +27 -0
  41. package/data/docs/types/CardRoot.json +18 -48
  42. package/data/docs/types/Cell.json +20 -20
  43. package/data/docs/types/Checkbox.json +99 -99
  44. package/data/docs/types/Code.json +10 -10
  45. package/data/docs/types/CollapsibleMotionContent.json +2 -2
  46. package/data/docs/types/CollapsibleMotionRoot.json +2 -2
  47. package/data/docs/types/CollapsibleMotionTrigger.json +4 -4
  48. package/data/docs/types/Column.json +8 -8
  49. package/data/docs/types/ColumnGroup.json +8 -8
  50. package/data/docs/types/ColumnHeader.json +18 -18
  51. package/data/docs/types/ComboBoxListBox.json +80 -80
  52. package/data/docs/types/ComboBoxOption.json +77 -77
  53. package/data/docs/types/ComboBoxPopover.json +77 -77
  54. package/data/docs/types/ComboBoxRoot.json +8 -8
  55. package/data/docs/types/ComboBoxSection.json +29 -29
  56. package/data/docs/types/ComboBoxTrigger.json +6 -6
  57. package/data/docs/types/ConfirmationDialog.json +224 -0
  58. package/data/docs/types/Content.json +2 -2
  59. package/data/docs/types/DataTable.json +17 -2
  60. package/data/docs/types/DataTableBody.json +24 -24
  61. package/data/docs/types/DataTableHeader.json +31 -31
  62. package/data/docs/types/DataTableRoot.json +17 -2
  63. package/data/docs/types/DataTableTable.json +35 -20
  64. package/data/docs/types/DateInput.json +84 -84
  65. package/data/docs/types/DatePicker.json +65 -65
  66. package/data/docs/types/DateRangePicker.json +99 -99
  67. package/data/docs/types/DateRangePickerField.json +99 -99
  68. package/data/docs/types/DefaultPageBackLink.json +16 -16
  69. package/data/docs/types/DefaultPageRoot.json +2 -2
  70. package/data/docs/types/DialogCloseTrigger.json +87 -87
  71. package/data/docs/types/DialogTrigger.json +2 -2
  72. package/data/docs/types/DragAndDropItemData.json +9 -0
  73. package/data/docs/types/DragAndDropProps.json +9 -0
  74. package/data/docs/types/DraggableListField.json +159 -70
  75. package/data/docs/types/DraggableListItem.json +63 -63
  76. package/data/docs/types/DraggableListRoot.json +159 -70
  77. package/data/docs/types/DrawerCloseTrigger.json +87 -87
  78. package/data/docs/types/DrawerTrigger.json +2 -2
  79. package/data/docs/types/FieldErrors.json +2 -2
  80. package/data/docs/types/Flex.json +22 -22
  81. package/data/docs/types/Footer.json +6 -6
  82. package/data/docs/types/FormActionBar.json +200 -0
  83. package/data/docs/types/FormDialog.json +198 -0
  84. package/data/docs/types/FormFieldRoot.json +2 -2
  85. package/data/docs/types/Grid.json +24 -24
  86. package/data/docs/types/Group.json +12 -12
  87. package/data/docs/types/Header.json +6 -6
  88. package/data/docs/types/Heading.json +8 -8
  89. package/data/docs/types/Icon.json +4 -4
  90. package/data/docs/types/IconButton.json +97 -97
  91. package/data/docs/types/IconToggleButton.json +84 -84
  92. package/data/docs/types/Image.json +30 -30
  93. package/data/docs/types/Indicator.json +6 -6
  94. package/data/docs/types/InfoDialog.json +104 -0
  95. package/data/docs/types/InlineSvg.json +2 -2
  96. package/data/docs/types/Item.json +6 -6
  97. package/data/docs/types/Kbd.json +8 -8
  98. package/data/docs/types/Link.json +31 -31
  99. package/data/docs/types/ListIndicator.json +6 -6
  100. package/data/docs/types/ListItem.json +6 -6
  101. package/data/docs/types/ListRoot.json +10 -10
  102. package/data/docs/types/LoadingSpinner.json +2 -2
  103. package/data/docs/types/MakeElementFocusable.json +19 -19
  104. package/data/docs/types/MenuItem.json +75 -75
  105. package/data/docs/types/MenuRoot.json +63 -63
  106. package/data/docs/types/MenuSection.json +35 -54
  107. package/data/docs/types/MenuSubmenuTrigger.json +5 -5
  108. package/data/docs/types/MenuTrigger.json +102 -102
  109. package/data/docs/types/MultilineTextInput.json +134 -134
  110. package/data/docs/types/MultilineTextInputField.json +131 -131
  111. package/data/docs/types/NumberInput.json +100 -100
  112. package/data/docs/types/NumberInputField.json +95 -95
  113. package/data/docs/types/PageContentColumn.json +6 -6
  114. package/data/docs/types/PageContentRoot.json +6 -6
  115. package/data/docs/types/PasswordInput.json +129 -129
  116. package/data/docs/types/PasswordInputField.json +129 -129
  117. package/data/docs/types/ProgressBar.json +14 -14
  118. package/data/docs/types/PublicPageLayout.json +99 -0
  119. package/data/docs/types/RadioInputOption.json +64 -64
  120. package/data/docs/types/RadioInputRoot.json +55 -55
  121. package/data/docs/types/RangeCalendar.json +90 -71
  122. package/data/docs/types/Region.json +114 -0
  123. package/data/docs/types/RegionProvider.json +25 -0
  124. package/data/docs/types/RegionTarget.json +112 -0
  125. package/data/docs/types/RichTextInput.json +2 -2
  126. package/data/docs/types/Root.json +10 -10
  127. package/data/docs/types/Row.json +6 -6
  128. package/data/docs/types/SPLITTER_SIZE_TOKENS.json +9 -0
  129. package/data/docs/types/ScrollArea.json +6 -6
  130. package/data/docs/types/SearchInput.json +136 -136
  131. package/data/docs/types/SearchInputField.json +131 -131
  132. package/data/docs/types/SelectOption.json +66 -66
  133. package/data/docs/types/SelectOptionGroup.json +22 -22
  134. package/data/docs/types/SelectOptions.json +74 -74
  135. package/data/docs/types/SelectRoot.json +102 -102
  136. package/data/docs/types/Separator.json +4 -4
  137. package/data/docs/types/SimpleGrid.json +28 -28
  138. package/data/docs/types/SplitButton.json +12 -12
  139. package/data/docs/types/Splitter.json +12 -0
  140. package/data/docs/types/SplitterAside.json +27 -0
  141. package/data/docs/types/SplitterHandle.json +27 -0
  142. package/data/docs/types/SplitterMain.json +27 -0
  143. package/data/docs/types/SplitterRoot.json +271 -0
  144. package/data/docs/types/SplitterSizeToken.json +9 -0
  145. package/data/docs/types/Stack.json +2 -2
  146. package/data/docs/types/StepsNextTrigger.json +2 -2
  147. package/data/docs/types/StepsPrevTrigger.json +2 -2
  148. package/data/docs/types/StepsRoot.json +2 -2
  149. package/data/docs/types/StepsTrigger.json +2 -2
  150. package/data/docs/types/Switch.json +38 -38
  151. package/data/docs/types/TabNavItem.json +18 -18
  152. package/data/docs/types/TabNavRoot.json +2 -2
  153. package/data/docs/types/TableBody.json +6 -6
  154. package/data/docs/types/TableCaption.json +6 -6
  155. package/data/docs/types/TableCell.json +20 -20
  156. package/data/docs/types/TableColumn.json +8 -8
  157. package/data/docs/types/TableColumnGroup.json +8 -8
  158. package/data/docs/types/TableColumnHeader.json +18 -18
  159. package/data/docs/types/TableFooter.json +6 -6
  160. package/data/docs/types/TableHeader.json +6 -6
  161. package/data/docs/types/TableRoot.json +32 -32
  162. package/data/docs/types/TableRow.json +6 -6
  163. package/data/docs/types/TableScrollArea.json +6 -6
  164. package/data/docs/types/TabsTab.json +2 -2
  165. package/data/docs/types/TagGroupRoot.json +27 -27
  166. package/data/docs/types/TagGroupTag.json +68 -68
  167. package/data/docs/types/TagGroupTagList.json +18 -18
  168. package/data/docs/types/Text.json +8 -8
  169. package/data/docs/types/TextInput.json +132 -132
  170. package/data/docs/types/TextInputField.json +129 -129
  171. package/data/docs/types/TimeInput.json +78 -78
  172. package/data/docs/types/ToggleButton.json +86 -86
  173. package/data/docs/types/ToggleButtonGroupButton.json +33 -33
  174. package/data/docs/types/ToggleButtonGroupRoot.json +20 -20
  175. package/data/docs/types/Toolbar.json +12 -12
  176. package/data/docs/types/TooltipContent.json +31 -31
  177. package/data/docs/types/TooltipRoot.json +18 -18
  178. package/data/docs/types/Trigger.json +4 -4
  179. package/data/docs/types/UseDragAndDropOptions.json +9 -0
  180. package/data/docs/types/VisuallyHidden.json +7 -7
  181. package/data/docs/types/createArrayHandlers.json +12 -0
  182. package/data/docs/types/createItemsFromCsvDrop.json +833 -0
  183. package/data/docs/types/createItemsFromDirectoryDrop.json +833 -0
  184. package/data/docs/types/createItemsFromFileDrop.json +833 -0
  185. package/data/docs/types/createItemsFromImageDrop.json +833 -0
  186. package/data/docs/types/createItemsFromJsonDrop.json +833 -0
  187. package/data/docs/types/createItemsFromTextDrop.json +12 -0
  188. package/data/docs/types/createListDataHandlers.json +102 -0
  189. package/data/docs/types/manifest.json +32 -2
  190. package/data/docs/types/toast.json +0 -15
  191. package/data/docs/types/useDragAndDrop.json +174 -0
  192. package/data/docs/types/useRegion.json +1052 -0
  193. package/data/docs/types/useResponsiveSplitterSizes.json +143 -0
  194. package/package.json +7 -7
@@ -146,10 +146,10 @@
146
146
  }
147
147
  ]
148
148
  },
149
- "mdx": "\n## Overview\n\nDefaultPage is a unified compound component that structures both top-level and\ndetail views into three zones: a fixed header, a scrollable content area, and an\noptional footer.\n\nThe presence or absence of `DefaultPage.BackLink` determines which pattern is in\nuse: omit it for top-level main pages; include it for detail views that need\nback navigation.\n\n### Key features\n\n- **DefaultPage.Header** — Two-column grid that positions Title and Subtitle on\n the left and Actions on the right\n- **DefaultPage.BackLink** — Optional back navigation link that shifts the\n Actions area down to align with the title row; omit entirely for main pages\n- **DefaultPage.Title** — Styled `<h1>` element for the page heading\n- **DefaultPage.Subtitle** — Optional `<p>` element for secondary descriptive\n text below the title\n- **DefaultPage.Actions** — Flex container for action buttons, right-aligned in\n the header grid\n- **DefaultPage.TabNav** — Optional tab navigation wrapper for route-based page\n sections; place inside `DefaultPage.Header`\n- **DefaultPage.Content** — Scrollable main content area with spacing that\n preserves sticky positioning for child components\n- **DefaultPage.Footer** — Optional action bar for form pages; omit it and the\n grid row collapses automatically\n- **Composable** — Arrange sub-components freely to cover read-only, editable,\n creation, and tabbed patterns from the same primitives\n\n## Variables\n\nGet familiar with the sub-components.\n\n### Main page (no BackLink)\n\nA top-level page with title, subtitle, and header actions. Omit `BackLink` for\nany page that is not a subordinate detail view.\n\n```jsx live\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Products</DefaultPage.Title>\n <DefaultPage.Subtitle>Manage your product catalog</DefaultPage.Subtitle>\n <DefaultPage.Actions>\n <Button variant=\"ghost\">Export</Button>\n <Button variant=\"solid\" colorPalette=\"primary\">Add Product</Button>\n </DefaultPage.Actions>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Box bg=\"neutral.3\" padding=\"600\" borderRadius=\"200\">\n <Text>Content area</Text>\n </Box>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### Detail page (with BackLink)\n\nA detail view with back navigation. Adding `DefaultPage.BackLink` signals that\nthis is a subordinate page. The Actions area shifts down to align with the title\nrow automatically.\n\n```jsx live\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/products\">\n Back to products\n </DefaultPage.BackLink>\n <DefaultPage.Title>Wireless Headphones</DefaultPage.Title>\n <DefaultPage.Subtitle>SKU-WH-2024-001</DefaultPage.Subtitle>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Stack gap=\"400\">\n <Text>Product information is displayed here.</Text>\n <Text>Use this pattern for read-only resource views.</Text>\n </Stack>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### Form page with footer\n\nInclude `DefaultPage.Footer` for pages with save or submit actions. Omit it on\nread-only pages — the grid row collapses automatically.\n\n```jsx live\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/orders\">\n Back to orders\n </DefaultPage.BackLink>\n <DefaultPage.Title>Edit Order</DefaultPage.Title>\n <DefaultPage.Subtitle>Order #ORD-2024-001</DefaultPage.Subtitle>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Box bg=\"neutral.3\" padding=\"400\" borderRadius=\"200\">\n <Text>Form fields would go here.</Text>\n </Box>\n </DefaultPage.Content>\n <DefaultPage.Footer>\n <Stack direction=\"row\" gap=\"200\" justify=\"flex-end\" width=\"100%\">\n <Button variant=\"ghost\">Cancel</Button>\n <Button variant=\"solid\" colorPalette=\"primary\">Save</Button>\n </Stack>\n </DefaultPage.Footer>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### Header actions\n\nAction buttons placed alongside the title using `DefaultPage.Actions`. The\nheader grid positions Actions on the right, spanning all title rows.\n\n```jsx live\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/discounts\">\n Back to discounts\n </DefaultPage.BackLink>\n <DefaultPage.Title>Cart Discount Details</DefaultPage.Title>\n <DefaultPage.Actions>\n <Button size=\"sm\" variant=\"ghost\">Duplicate</Button>\n <Button size=\"sm\" variant=\"solid\" colorPalette=\"primary\">Save</Button>\n </DefaultPage.Actions>\n <DefaultPage.Subtitle>10% off all items</DefaultPage.Subtitle>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>Discount configuration form fields would go here.</Text>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### Tab navigation\n\nCompose with the `TabNav` component inside `DefaultPage.Header` for route-based\ntab navigation. In a real app, the router renders content for the current route.\n\n```jsx live\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/customers\">\n Back to customers\n </DefaultPage.BackLink>\n <DefaultPage.Title>Customer Details</DefaultPage.Title>\n <DefaultPage.Subtitle>customer@example.com</DefaultPage.Subtitle>\n <DefaultPage.TabNav>\n <TabNav.Root aria-label=\"Customer sections\">\n <TabNav.Item href=\"/customers/123/general\" isCurrent>General</TabNav.Item>\n <TabNav.Item href=\"/customers/123/addresses\">Addresses</TabNav.Item>\n <TabNav.Item href=\"/customers/123/orders\">Orders</TabNav.Item>\n </TabNav.Root>\n </DefaultPage.TabNav>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Box py=\"400\">\n <Text>General information content</Text>\n </Box>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### Flexible layout with sticky header and footer\n\nUse `layout=\"flexible\"` when the whole page should scroll. Add `stickyHeader`\nand/or `stickyFooter` to pin those zones while the page scrolls.\n\n```jsx live\nconst App = () => (\n <Box height=\"400px\" overflow=\"auto\" border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root layout=\"flexible\" stickyHeader stickyFooter>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/products\">\n Back to products\n </DefaultPage.BackLink>\n <DefaultPage.Title>Edit product</DefaultPage.Title>\n <DefaultPage.Subtitle>SKU-001</DefaultPage.Subtitle>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Stack gap=\"400\">\n <Text>With flexible layout the whole page scrolls.</Text>\n <Text>The header and footer stay pinned via sticky positioning.</Text>\n </Stack>\n </DefaultPage.Content>\n <DefaultPage.Footer>\n <Stack direction=\"row\" gap=\"200\" justify=\"flex-end\" width=\"100%\">\n <Button variant=\"ghost\">Cancel</Button>\n <Button variant=\"solid\" colorPalette=\"primary\">Save</Button>\n </Stack>\n </DefaultPage.Footer>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n## Accessibility\n\nDefaultPage uses semantic HTML landmarks to provide a clear document structure\nfor assistive technologies:\n\n- **Header** renders as `<header>` (banner landmark)\n- **Title** renders as `<h1>` for the page heading\n- **Content** renders as `<main>` (main landmark)\n- **Footer** renders as `<footer>` (contentinfo landmark)\n- **BackLink** renders as a semantic `<a>` element\n\nThese landmarks allow screen reader users to navigate directly between page\nsections. Because `<main>` must be unique per page, avoid nesting multiple\n`DefaultPage` components in a single view. When composing with `TabNav`, provide\nan `aria-label` on `TabNav.Root` to describe the navigation group for screen\nreaders.\n",
149
+ "mdx": "\n## Overview\n\nDefaultPage is a unified compound component that structures both top-level and\ndetail views into three zones: a fixed header, a scrollable content area, and an\noptional footer.\n\nThe presence or absence of `DefaultPage.BackLink` determines which pattern is in\nuse: omit it for top-level main pages; include it for detail views that need\nback navigation.\n\n### Key features\n\n- **DefaultPage.Header** — Two-column grid that positions Title and Subtitle on\n the left and Actions on the right\n- **DefaultPage.BackLink** — Optional back navigation link that shifts the\n Actions area down to align with the title row; omit entirely for main pages\n- **DefaultPage.Title** — Styled `<h1>` element for the page heading\n- **DefaultPage.Subtitle** — Optional `<p>` element for secondary descriptive\n text below the title\n- **DefaultPage.Actions** — Flex container for action buttons, right-aligned in\n the header grid\n- **DefaultPage.TabNav** — Optional tab navigation wrapper for route-based page\n sections; place inside `DefaultPage.Header`\n- **DefaultPage.Content** — Scrollable main content area with spacing that\n preserves sticky positioning for child components\n- **DefaultPage.Footer** — Optional action bar for form pages; omit it and the\n grid row collapses automatically\n- **Composable** — Arrange sub-components freely to cover read-only, editable,\n creation, and tabbed patterns from the same primitives\n\n## Variables\n\nGet familiar with the sub-components.\n\n### Main page (no BackLink)\n\nA top-level page with title, subtitle, and header actions. Omit `BackLink` for\nany page that is not a subordinate detail view.\n\n```jsx live\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Products</DefaultPage.Title>\n <DefaultPage.Subtitle>Manage your product catalog</DefaultPage.Subtitle>\n <DefaultPage.Actions>\n <Button variant=\"ghost\">Export</Button>\n <Button variant=\"solid\" colorPalette=\"primary\">Add Product</Button>\n </DefaultPage.Actions>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Box bg=\"neutral.3\" padding=\"600\" borderRadius=\"200\">\n <Text>Content area</Text>\n </Box>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### Detail page (with BackLink)\n\nA detail view with back navigation. Adding `DefaultPage.BackLink` signals that\nthis is a subordinate page. The Actions area shifts down to align with the title\nrow automatically.\n\n```jsx live\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/products\">\n Back to products\n </DefaultPage.BackLink>\n <DefaultPage.Title>Wireless Headphones</DefaultPage.Title>\n <DefaultPage.Subtitle>SKU-WH-2024-001</DefaultPage.Subtitle>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Stack gap=\"400\">\n <Text>Product information is displayed here.</Text>\n <Text>Use this pattern for read-only resource views.</Text>\n </Stack>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### Form page with footer\n\nInclude `DefaultPage.Footer` for pages with save or submit actions. Omit it on\nread-only pages — the grid row collapses automatically.\n\n```jsx live\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/orders\">\n Back to orders\n </DefaultPage.BackLink>\n <DefaultPage.Title>Edit Order</DefaultPage.Title>\n <DefaultPage.Subtitle>Order #ORD-2024-001</DefaultPage.Subtitle>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Box bg=\"neutral.3\" padding=\"400\" borderRadius=\"200\">\n <Text>Form fields would go here.</Text>\n </Box>\n </DefaultPage.Content>\n <DefaultPage.Footer>\n <FormActionBar onSave={() => {}} onCancel={() => {}} />\n </DefaultPage.Footer>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### Header actions\n\nAction buttons placed alongside the title using `DefaultPage.Actions`. The\nheader grid positions Actions on the right, spanning all title rows.\n\n```jsx live\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/discounts\">\n Back to discounts\n </DefaultPage.BackLink>\n <DefaultPage.Title>Cart Discount Details</DefaultPage.Title>\n <DefaultPage.Actions>\n <Button size=\"sm\" variant=\"ghost\">Duplicate</Button>\n <Button size=\"sm\" variant=\"solid\" colorPalette=\"primary\">Save</Button>\n </DefaultPage.Actions>\n <DefaultPage.Subtitle>10% off all items</DefaultPage.Subtitle>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>Discount configuration form fields would go here.</Text>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### Tab navigation\n\nCompose with the `TabNav` component inside `DefaultPage.Header` for route-based\ntab navigation. In a real app, the router renders content for the current route.\n\n```jsx live\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/customers\">\n Back to customers\n </DefaultPage.BackLink>\n <DefaultPage.Title>Customer Details</DefaultPage.Title>\n <DefaultPage.Subtitle>customer@example.com</DefaultPage.Subtitle>\n <DefaultPage.TabNav>\n <TabNav.Root aria-label=\"Customer sections\">\n <TabNav.Item href=\"/customers/123/general\" isCurrent>General</TabNav.Item>\n <TabNav.Item href=\"/customers/123/addresses\">Addresses</TabNav.Item>\n <TabNav.Item href=\"/customers/123/orders\">Orders</TabNav.Item>\n </TabNav.Root>\n </DefaultPage.TabNav>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Box py=\"400\">\n <Text>General information content</Text>\n </Box>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### Flexible layout with sticky header and footer\n\nUse `layout=\"flexible\"` when the whole page should scroll. Add `stickyHeader`\nand/or `stickyFooter` to pin those zones while the page scrolls.\n\n```jsx live\nconst App = () => (\n <Box height=\"400px\" overflow=\"auto\" border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root layout=\"flexible\" stickyHeader stickyFooter>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/products\">\n Back to products\n </DefaultPage.BackLink>\n <DefaultPage.Title>Edit product</DefaultPage.Title>\n <DefaultPage.Subtitle>SKU-001</DefaultPage.Subtitle>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Stack gap=\"400\">\n <Text>With flexible layout the whole page scrolls.</Text>\n <Text>The header and footer stay pinned via sticky positioning.</Text>\n </Stack>\n </DefaultPage.Content>\n <DefaultPage.Footer>\n <FormActionBar onSave={() => {}} onCancel={() => {}} />\n </DefaultPage.Footer>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n## Accessibility\n\nDefaultPage uses semantic HTML landmarks to provide a clear document structure\nfor assistive technologies:\n\n- **Header** renders as `<header>` (banner landmark)\n- **Title** renders as `<h1>` for the page heading\n- **Content** renders as `<main>` (main landmark)\n- **Footer** renders as `<footer>` (contentinfo landmark)\n- **BackLink** renders as a semantic `<a>` element\n\nThese landmarks allow screen reader users to navigate directly between page\nsections. Because `<main>` must be unique per page, avoid nesting multiple\n`DefaultPage` components in a single view. When composing with `TabNav`, provide\nan `aria-label` on `TabNav.Root` to describe the navigation group for screen\nreaders.\n",
150
150
  "views": {
151
151
  "overview": {
152
- "mdx": "\n## Overview\n\nDefaultPage is a unified compound component that structures both top-level and\ndetail views into three zones: a fixed header, a scrollable content area, and an\noptional footer.\n\nThe presence or absence of `DefaultPage.BackLink` determines which pattern is in\nuse: omit it for top-level main pages; include it for detail views that need\nback navigation.\n\n### Key features\n\n- **DefaultPage.Header** — Two-column grid that positions Title and Subtitle on\n the left and Actions on the right\n- **DefaultPage.BackLink** — Optional back navigation link that shifts the\n Actions area down to align with the title row; omit entirely for main pages\n- **DefaultPage.Title** — Styled `<h1>` element for the page heading\n- **DefaultPage.Subtitle** — Optional `<p>` element for secondary descriptive\n text below the title\n- **DefaultPage.Actions** — Flex container for action buttons, right-aligned in\n the header grid\n- **DefaultPage.TabNav** — Optional tab navigation wrapper for route-based page\n sections; place inside `DefaultPage.Header`\n- **DefaultPage.Content** — Scrollable main content area with spacing that\n preserves sticky positioning for child components\n- **DefaultPage.Footer** — Optional action bar for form pages; omit it and the\n grid row collapses automatically\n- **Composable** — Arrange sub-components freely to cover read-only, editable,\n creation, and tabbed patterns from the same primitives\n\n## Variables\n\nGet familiar with the sub-components.\n\n### Main page (no BackLink)\n\nA top-level page with title, subtitle, and header actions. Omit `BackLink` for\nany page that is not a subordinate detail view.\n\n```jsx live\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Products</DefaultPage.Title>\n <DefaultPage.Subtitle>Manage your product catalog</DefaultPage.Subtitle>\n <DefaultPage.Actions>\n <Button variant=\"ghost\">Export</Button>\n <Button variant=\"solid\" colorPalette=\"primary\">Add Product</Button>\n </DefaultPage.Actions>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Box bg=\"neutral.3\" padding=\"600\" borderRadius=\"200\">\n <Text>Content area</Text>\n </Box>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### Detail page (with BackLink)\n\nA detail view with back navigation. Adding `DefaultPage.BackLink` signals that\nthis is a subordinate page. The Actions area shifts down to align with the title\nrow automatically.\n\n```jsx live\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/products\">\n Back to products\n </DefaultPage.BackLink>\n <DefaultPage.Title>Wireless Headphones</DefaultPage.Title>\n <DefaultPage.Subtitle>SKU-WH-2024-001</DefaultPage.Subtitle>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Stack gap=\"400\">\n <Text>Product information is displayed here.</Text>\n <Text>Use this pattern for read-only resource views.</Text>\n </Stack>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### Form page with footer\n\nInclude `DefaultPage.Footer` for pages with save or submit actions. Omit it on\nread-only pages — the grid row collapses automatically.\n\n```jsx live\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/orders\">\n Back to orders\n </DefaultPage.BackLink>\n <DefaultPage.Title>Edit Order</DefaultPage.Title>\n <DefaultPage.Subtitle>Order #ORD-2024-001</DefaultPage.Subtitle>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Box bg=\"neutral.3\" padding=\"400\" borderRadius=\"200\">\n <Text>Form fields would go here.</Text>\n </Box>\n </DefaultPage.Content>\n <DefaultPage.Footer>\n <Stack direction=\"row\" gap=\"200\" justify=\"flex-end\" width=\"100%\">\n <Button variant=\"ghost\">Cancel</Button>\n <Button variant=\"solid\" colorPalette=\"primary\">Save</Button>\n </Stack>\n </DefaultPage.Footer>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### Header actions\n\nAction buttons placed alongside the title using `DefaultPage.Actions`. The\nheader grid positions Actions on the right, spanning all title rows.\n\n```jsx live\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/discounts\">\n Back to discounts\n </DefaultPage.BackLink>\n <DefaultPage.Title>Cart Discount Details</DefaultPage.Title>\n <DefaultPage.Actions>\n <Button size=\"sm\" variant=\"ghost\">Duplicate</Button>\n <Button size=\"sm\" variant=\"solid\" colorPalette=\"primary\">Save</Button>\n </DefaultPage.Actions>\n <DefaultPage.Subtitle>10% off all items</DefaultPage.Subtitle>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>Discount configuration form fields would go here.</Text>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### Tab navigation\n\nCompose with the `TabNav` component inside `DefaultPage.Header` for route-based\ntab navigation. In a real app, the router renders content for the current route.\n\n```jsx live\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/customers\">\n Back to customers\n </DefaultPage.BackLink>\n <DefaultPage.Title>Customer Details</DefaultPage.Title>\n <DefaultPage.Subtitle>customer@example.com</DefaultPage.Subtitle>\n <DefaultPage.TabNav>\n <TabNav.Root aria-label=\"Customer sections\">\n <TabNav.Item href=\"/customers/123/general\" isCurrent>General</TabNav.Item>\n <TabNav.Item href=\"/customers/123/addresses\">Addresses</TabNav.Item>\n <TabNav.Item href=\"/customers/123/orders\">Orders</TabNav.Item>\n </TabNav.Root>\n </DefaultPage.TabNav>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Box py=\"400\">\n <Text>General information content</Text>\n </Box>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### Flexible layout with sticky header and footer\n\nUse `layout=\"flexible\"` when the whole page should scroll. Add `stickyHeader`\nand/or `stickyFooter` to pin those zones while the page scrolls.\n\n```jsx live\nconst App = () => (\n <Box height=\"400px\" overflow=\"auto\" border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root layout=\"flexible\" stickyHeader stickyFooter>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/products\">\n Back to products\n </DefaultPage.BackLink>\n <DefaultPage.Title>Edit product</DefaultPage.Title>\n <DefaultPage.Subtitle>SKU-001</DefaultPage.Subtitle>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Stack gap=\"400\">\n <Text>With flexible layout the whole page scrolls.</Text>\n <Text>The header and footer stay pinned via sticky positioning.</Text>\n </Stack>\n </DefaultPage.Content>\n <DefaultPage.Footer>\n <Stack direction=\"row\" gap=\"200\" justify=\"flex-end\" width=\"100%\">\n <Button variant=\"ghost\">Cancel</Button>\n <Button variant=\"solid\" colorPalette=\"primary\">Save</Button>\n </Stack>\n </DefaultPage.Footer>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n## Accessibility\n\nDefaultPage uses semantic HTML landmarks to provide a clear document structure\nfor assistive technologies:\n\n- **Header** renders as `<header>` (banner landmark)\n- **Title** renders as `<h1>` for the page heading\n- **Content** renders as `<main>` (main landmark)\n- **Footer** renders as `<footer>` (contentinfo landmark)\n- **BackLink** renders as a semantic `<a>` element\n\nThese landmarks allow screen reader users to navigate directly between page\nsections. Because `<main>` must be unique per page, avoid nesting multiple\n`DefaultPage` components in a single view. When composing with `TabNav`, provide\nan `aria-label` on `TabNav.Root` to describe the navigation group for screen\nreaders.\n",
152
+ "mdx": "\n## Overview\n\nDefaultPage is a unified compound component that structures both top-level and\ndetail views into three zones: a fixed header, a scrollable content area, and an\noptional footer.\n\nThe presence or absence of `DefaultPage.BackLink` determines which pattern is in\nuse: omit it for top-level main pages; include it for detail views that need\nback navigation.\n\n### Key features\n\n- **DefaultPage.Header** — Two-column grid that positions Title and Subtitle on\n the left and Actions on the right\n- **DefaultPage.BackLink** — Optional back navigation link that shifts the\n Actions area down to align with the title row; omit entirely for main pages\n- **DefaultPage.Title** — Styled `<h1>` element for the page heading\n- **DefaultPage.Subtitle** — Optional `<p>` element for secondary descriptive\n text below the title\n- **DefaultPage.Actions** — Flex container for action buttons, right-aligned in\n the header grid\n- **DefaultPage.TabNav** — Optional tab navigation wrapper for route-based page\n sections; place inside `DefaultPage.Header`\n- **DefaultPage.Content** — Scrollable main content area with spacing that\n preserves sticky positioning for child components\n- **DefaultPage.Footer** — Optional action bar for form pages; omit it and the\n grid row collapses automatically\n- **Composable** — Arrange sub-components freely to cover read-only, editable,\n creation, and tabbed patterns from the same primitives\n\n## Variables\n\nGet familiar with the sub-components.\n\n### Main page (no BackLink)\n\nA top-level page with title, subtitle, and header actions. Omit `BackLink` for\nany page that is not a subordinate detail view.\n\n```jsx live\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Products</DefaultPage.Title>\n <DefaultPage.Subtitle>Manage your product catalog</DefaultPage.Subtitle>\n <DefaultPage.Actions>\n <Button variant=\"ghost\">Export</Button>\n <Button variant=\"solid\" colorPalette=\"primary\">Add Product</Button>\n </DefaultPage.Actions>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Box bg=\"neutral.3\" padding=\"600\" borderRadius=\"200\">\n <Text>Content area</Text>\n </Box>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### Detail page (with BackLink)\n\nA detail view with back navigation. Adding `DefaultPage.BackLink` signals that\nthis is a subordinate page. The Actions area shifts down to align with the title\nrow automatically.\n\n```jsx live\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/products\">\n Back to products\n </DefaultPage.BackLink>\n <DefaultPage.Title>Wireless Headphones</DefaultPage.Title>\n <DefaultPage.Subtitle>SKU-WH-2024-001</DefaultPage.Subtitle>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Stack gap=\"400\">\n <Text>Product information is displayed here.</Text>\n <Text>Use this pattern for read-only resource views.</Text>\n </Stack>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### Form page with footer\n\nInclude `DefaultPage.Footer` for pages with save or submit actions. Omit it on\nread-only pages — the grid row collapses automatically.\n\n```jsx live\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/orders\">\n Back to orders\n </DefaultPage.BackLink>\n <DefaultPage.Title>Edit Order</DefaultPage.Title>\n <DefaultPage.Subtitle>Order #ORD-2024-001</DefaultPage.Subtitle>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Box bg=\"neutral.3\" padding=\"400\" borderRadius=\"200\">\n <Text>Form fields would go here.</Text>\n </Box>\n </DefaultPage.Content>\n <DefaultPage.Footer>\n <FormActionBar onSave={() => {}} onCancel={() => {}} />\n </DefaultPage.Footer>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### Header actions\n\nAction buttons placed alongside the title using `DefaultPage.Actions`. The\nheader grid positions Actions on the right, spanning all title rows.\n\n```jsx live\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/discounts\">\n Back to discounts\n </DefaultPage.BackLink>\n <DefaultPage.Title>Cart Discount Details</DefaultPage.Title>\n <DefaultPage.Actions>\n <Button size=\"sm\" variant=\"ghost\">Duplicate</Button>\n <Button size=\"sm\" variant=\"solid\" colorPalette=\"primary\">Save</Button>\n </DefaultPage.Actions>\n <DefaultPage.Subtitle>10% off all items</DefaultPage.Subtitle>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>Discount configuration form fields would go here.</Text>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### Tab navigation\n\nCompose with the `TabNav` component inside `DefaultPage.Header` for route-based\ntab navigation. In a real app, the router renders content for the current route.\n\n```jsx live\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/customers\">\n Back to customers\n </DefaultPage.BackLink>\n <DefaultPage.Title>Customer Details</DefaultPage.Title>\n <DefaultPage.Subtitle>customer@example.com</DefaultPage.Subtitle>\n <DefaultPage.TabNav>\n <TabNav.Root aria-label=\"Customer sections\">\n <TabNav.Item href=\"/customers/123/general\" isCurrent>General</TabNav.Item>\n <TabNav.Item href=\"/customers/123/addresses\">Addresses</TabNav.Item>\n <TabNav.Item href=\"/customers/123/orders\">Orders</TabNav.Item>\n </TabNav.Root>\n </DefaultPage.TabNav>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Box py=\"400\">\n <Text>General information content</Text>\n </Box>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### Flexible layout with sticky header and footer\n\nUse `layout=\"flexible\"` when the whole page should scroll. Add `stickyHeader`\nand/or `stickyFooter` to pin those zones while the page scrolls.\n\n```jsx live\nconst App = () => (\n <Box height=\"400px\" overflow=\"auto\" border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root layout=\"flexible\" stickyHeader stickyFooter>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/products\">\n Back to products\n </DefaultPage.BackLink>\n <DefaultPage.Title>Edit product</DefaultPage.Title>\n <DefaultPage.Subtitle>SKU-001</DefaultPage.Subtitle>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Stack gap=\"400\">\n <Text>With flexible layout the whole page scrolls.</Text>\n <Text>The header and footer stay pinned via sticky positioning.</Text>\n </Stack>\n </DefaultPage.Content>\n <DefaultPage.Footer>\n <FormActionBar onSave={() => {}} onCancel={() => {}} />\n </DefaultPage.Footer>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n## Accessibility\n\nDefaultPage uses semantic HTML landmarks to provide a clear document structure\nfor assistive technologies:\n\n- **Header** renders as `<header>` (banner landmark)\n- **Title** renders as `<h1>` for the page heading\n- **Content** renders as `<main>` (main landmark)\n- **Footer** renders as `<footer>` (contentinfo landmark)\n- **BackLink** renders as a semantic `<a>` element\n\nThese landmarks allow screen reader users to navigate directly between page\nsections. Because `<main>` must be unique per page, avoid nesting multiple\n`DefaultPage` components in a single view. When composing with `TabNav`, provide\nan `aria-label` on `TabNav.Root` to describe the navigation group for screen\nreaders.\n",
153
153
  "toc": [
154
154
  {
155
155
  "value": "Overview",
@@ -261,7 +261,7 @@
261
261
  ]
262
262
  },
263
263
  "dev": {
264
- "mdx": "\n## Getting started\n\n### Import\n\n```tsx\nimport { DefaultPage, type DefaultPageProps } from '@commercetools/nimbus';\n```\n\n### Basic usage\n\nDefaultPage uses a compound pattern to structure both main and detail views.\nAt minimum, wrap `DefaultPage.Header` (with `DefaultPage.Title`) and\n`DefaultPage.Content` inside `DefaultPage.Root`.\n\n```jsx live-dev\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Products</DefaultPage.Title>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>Your page content goes here.</Text>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n## Layout modes\n\nDefaultPage supports two layout modes controlled by the `layout` prop on\n`DefaultPage.Root`.\n\n### Constrained layout (default)\n\nThe default mode. The page fills its parent container (`height: 100%`). Only\nthe content area scrolls — the header and footer are naturally pinned by the\nCSS grid and do not need sticky positioning. This is the recommended mode for\npages embedded inside an application shell.\n\n```jsx live-dev\nconst App = () => (\n <Box height=\"400px\" border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Products</DefaultPage.Title>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>Only this content area scrolls in constrained mode.</Text>\n </DefaultPage.Content>\n <DefaultPage.Footer>\n <Button variant=\"solid\" colorPalette=\"primary\">Save</Button>\n </DefaultPage.Footer>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### Flexible layout\n\nSet `layout=\"flexible\"` when the whole page should scroll rather than just\nthe content area. This is useful for long-form pages inside a full-page scroll\ncontainer. In this mode, you can optionally pin the header or footer with\n`stickyHeader` and `stickyFooter`.\n\n```jsx live-dev\nconst App = () => (\n <Box height=\"400px\" overflow=\"auto\" border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root layout=\"flexible\" stickyHeader stickyFooter>\n <DefaultPage.Header>\n <DefaultPage.Title>Edit product</DefaultPage.Title>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Stack gap=\"400\">\n <Text>With flexible layout the whole page scrolls.</Text>\n <Text>Use stickyHeader / stickyFooter to pin zones.</Text>\n </Stack>\n </DefaultPage.Content>\n <DefaultPage.Footer>\n <Button variant=\"solid\" colorPalette=\"primary\">Save changes</Button>\n </DefaultPage.Footer>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n| Prop combination | Behaviour |\n|---|---|\n| `layout=\"constrained\"` (default) | Parent height filled; only content scrolls; header and footer pinned by grid |\n| `layout=\"flexible\"` | Height auto; whole page scrolls; nothing pinned |\n| `layout=\"flexible\" stickyHeader` | Flexible scroll with header pinned at top |\n| `layout=\"flexible\" stickyFooter` | Flexible scroll with footer pinned at bottom |\n| `layout=\"flexible\" stickyHeader stickyFooter` | Flexible scroll with both zones pinned |\n\n> [!TIP]\\\n> In **constrained** mode, header and footer are always pinned — you don't need\n> to set any sticky props. Switch to **flexible** mode when you want the whole\n> page to scroll, then opt in to sticky positioning as needed.\n\n> [!NOTE]\\\n> `stickyHeader` and `stickyFooter` are only accepted when `layout=\"flexible\"`.\n> TypeScript will produce a compile error if you use them without it.\n\n### Flexible layout with sticky footer only\n\nUse `stickyFooter` without `stickyHeader` when save actions must stay visible\nbut the header context can scroll away — common for long detail forms.\n\n```jsx live-dev\nconst App = () => (\n <Box height=\"400px\" overflow=\"auto\" border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root layout=\"flexible\" stickyFooter>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/products\">Back to products</DefaultPage.BackLink>\n <DefaultPage.Title>Edit: Classic T-Shirt</DefaultPage.Title>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Stack gap=\"400\">\n <Text>Scroll down — the header scrolls away but the footer stays pinned.</Text>\n {Array.from({ length: 8 }, (_, i) => (\n <FormField.Root key={i}>\n <FormField.Label>{`Field ${i + 1}`}</FormField.Label>\n <FormField.Input>\n <TextInput placeholder={`Value for field ${i + 1}`} />\n </FormField.Input>\n </FormField.Root>\n ))}\n </Stack>\n </DefaultPage.Content>\n <DefaultPage.Footer>\n <Stack direction=\"row\" gap=\"200\">\n <Button variant=\"solid\" colorPalette=\"primary\">Save changes</Button>\n <Button variant=\"ghost\">Cancel</Button>\n </Stack>\n </DefaultPage.Footer>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n## Sub-components\n\n### DefaultPage.Header\n\nThe header section uses a two-column grid layout. `Title`, `Subtitle`, and any\ncustom content with `gridColumn=\"1\"` flow into the left column. `Actions` spans\nall rows on the right column and collapses when not present. When `BackLink` is\npresent, `Actions` automatically shifts down to align with the title row.\n\n```jsx live-dev\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Products</DefaultPage.Title>\n <DefaultPage.Actions>\n <Button variant=\"ghost\">Export</Button>\n <Button variant=\"solid\" colorPalette=\"primary\">Add Product</Button>\n </DefaultPage.Actions>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>Content area</Text>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### DefaultPage.Title\n\nRenders a styled `<h1>` element pinned to grid column 1. Accepts children for\nthe title text.\n\n```jsx live-dev\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Products</DefaultPage.Title>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>Content area</Text>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### DefaultPage.Subtitle\n\nOptional subtitle rendered as a `<p>` element pinned to grid column 1, below\nthe title. Place it as a sibling of `Title` inside the `Header`.\n\n```jsx live-dev\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Products</DefaultPage.Title>\n <DefaultPage.Subtitle>Manage your product catalog</DefaultPage.Subtitle>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>Content area</Text>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### DefaultPage.Actions\n\nA flex container with gap for action buttons. Pinned to grid column 2 (right),\nspanning all rows. When `BackLink` is present, the grid automatically shifts\n`Actions` to the title row.\n\n```jsx live-dev\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Products</DefaultPage.Title>\n <DefaultPage.Actions>\n <Button variant=\"ghost\">Export</Button>\n <Button variant=\"solid\" colorPalette=\"primary\">Add Product</Button>\n </DefaultPage.Actions>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>Content area</Text>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### DefaultPage.BackLink\n\nOptional back navigation link that renders as a semantic `<a>` element.\nRequires an `href` prop. Include it for detail views to signal the parent list\nor overview; omit it entirely for top-level main pages.\n\nAlways provide destination-specific text as children (e.g., \"Back to products\").\nA generic fallback label \"Go back\" is provided via i18n when children are\nomitted, but destination-specific text is strongly recommended for usability.\n\n```jsx live-dev\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/products\">\n Back to products\n </DefaultPage.BackLink>\n <DefaultPage.Title>Wireless Headphones</DefaultPage.Title>\n <DefaultPage.Subtitle>SKU-WH-2024-001</DefaultPage.Subtitle>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>Product detail content</Text>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### DefaultPage.TabNav\n\nLayout container for tab navigation in the header. Positions itself in the\nheader grid's last row at full width. Place it inside `DefaultPage.Header`,\nafter `Title` and `Subtitle`.\n\nWrap a `TabNav.Root` inside this component.\n\n```jsx live-dev\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Customer Details</DefaultPage.Title>\n <DefaultPage.Subtitle>customer@example.com</DefaultPage.Subtitle>\n <DefaultPage.TabNav>\n <TabNav.Root aria-label=\"Customer sections\">\n <TabNav.Item href=\"/customers/123/general\" isCurrent>General</TabNav.Item>\n <TabNav.Item href=\"/customers/123/addresses\">Addresses</TabNav.Item>\n <TabNav.Item href=\"/customers/123/orders\">Orders</TabNav.Item>\n </TabNav.Root>\n </DefaultPage.TabNav>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>General information content</Text>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### DefaultPage.Content\n\nThe main content area with scrollable overflow. Uses padding-based spacing to\npreserve sticky positioning for child components like `DataTable`.\n\n```jsx live-dev\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Page Title</DefaultPage.Title>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Box bg=\"neutral.3\" padding=\"400\" borderRadius=\"200\">\n <Text>Content area with automatic padding spacing</Text>\n </Box>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### DefaultPage.Footer\n\nOptional footer for page-level actions. Omit it entirely when the page has no\nform actions — the footer grid row collapses automatically when absent.\n\n```jsx live-dev\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Project Settings</DefaultPage.Title>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Box bg=\"neutral.3\" padding=\"400\" borderRadius=\"200\">\n <Text>Form content</Text>\n </Box>\n </DefaultPage.Content>\n <DefaultPage.Footer>\n <Stack direction=\"row\" gap=\"200\" justify=\"flex-end\" width=\"100%\">\n <Button variant=\"ghost\">Cancel</Button>\n <Button variant=\"solid\" colorPalette=\"primary\">Save</Button>\n </Stack>\n </DefaultPage.Footer>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n> [!TIP]\\\n> Place the primary action first, followed by secondary actions (e.g., Cancel).\n> Use the `Spacer` component to push buttons apart — for example, a destructive\n> action on the left and the primary action on the right:\n\n```jsx live-dev\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Edit product</DefaultPage.Title>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>Form content goes here.</Text>\n </DefaultPage.Content>\n <DefaultPage.Footer>\n <Stack direction=\"row\" gap=\"200\" width=\"100%\">\n <Button colorPalette=\"critical\" variant=\"ghost\">Delete</Button>\n <Spacer />\n <Button variant=\"solid\" colorPalette=\"primary\">Save</Button>\n <Button variant=\"ghost\">Cancel</Button>\n </Stack>\n </DefaultPage.Footer>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### Custom elements in the header\n\nAny additional children placed in the `Header` default to column 2 (right). To\nplace a custom element on the left side of the header grid, set\n`gridColumn=\"1\"`.\n\n```jsx live-dev\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title mb=\"100\">Page Title</DefaultPage.Title>\n <Badge\n gridColumn=\"1\"\n justifySelf=\"flex-start\"\n colorPalette=\"blue\"\n size=\"xs\"\n >\n Custom in column 1\n </Badge>\n <Badge\n colorPalette=\"mint\"\n justifySelf=\"flex-end\"\n size=\"xs\"\n >\n Custom in column 2\n </Badge>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>Content area</Text>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n## Usage examples\n\n### Info main page (no BackLink, no Footer)\n\nFor top-level pages that display information without form actions, omit both\n`DefaultPage.BackLink` and `DefaultPage.Footer`.\n\n```jsx live-dev\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Products</DefaultPage.Title>\n <DefaultPage.Subtitle>Manage your product catalog</DefaultPage.Subtitle>\n <DefaultPage.Actions>\n <Button variant=\"ghost\">Export</Button>\n <Button variant=\"solid\" colorPalette=\"primary\">Add Product</Button>\n </DefaultPage.Actions>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>Product list content goes here.</Text>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### Form main page (with Footer)\n\nFor top-level pages with form actions, add `DefaultPage.Footer` containing\naction buttons. Omit `DefaultPage.BackLink` since this is a main-level page.\n\n```jsx live-dev\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Project Settings</DefaultPage.Title>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Stack gap=\"400\">\n <FormField.Root>\n <FormField.Label>Project name</FormField.Label>\n <FormField.Input>\n <TextInput placeholder=\"e.g. My Store\" />\n </FormField.Input>\n </FormField.Root>\n <FormField.Root>\n <FormField.Label>Description</FormField.Label>\n <FormField.Input>\n <TextInput placeholder=\"Describe the project\" />\n </FormField.Input>\n </FormField.Root>\n </Stack>\n </DefaultPage.Content>\n <DefaultPage.Footer>\n <Stack direction=\"row\" gap=\"200\" justify=\"flex-end\" width=\"100%\">\n <Button variant=\"ghost\">Cancel</Button>\n <Button variant=\"solid\" colorPalette=\"primary\">Save</Button>\n </Stack>\n </DefaultPage.Footer>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### Info detail page (with BackLink, no Footer)\n\nFor detail pages that display information without form actions, include\n`DefaultPage.BackLink` and omit `DefaultPage.Footer`.\n\n```jsx live-dev\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/products\">Back to products</DefaultPage.BackLink>\n <DefaultPage.Title>Wireless Headphones</DefaultPage.Title>\n <DefaultPage.Subtitle>SKU-WH-2024-001</DefaultPage.Subtitle>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Stack gap=\"400\">\n <Text>This is a read-only detail page with product information.</Text>\n </Stack>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### Form detail page (with BackLink and Footer)\n\nFor detail pages with form actions, include both `DefaultPage.BackLink` and\n`DefaultPage.Footer`.\n\n```jsx live-dev\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/orders\">Back to orders</DefaultPage.BackLink>\n <DefaultPage.Title>Edit Order</DefaultPage.Title>\n <DefaultPage.Subtitle>Order #ORD-2024-001</DefaultPage.Subtitle>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Stack gap=\"400\">\n <Text>Form fields would go here.</Text>\n </Stack>\n </DefaultPage.Content>\n <DefaultPage.Footer>\n <Stack direction=\"row\" gap=\"200\" justify=\"flex-end\" width=\"100%\">\n <Button variant=\"ghost\">Cancel</Button>\n <Button variant=\"solid\" colorPalette=\"primary\">Save</Button>\n </Stack>\n </DefaultPage.Footer>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### Tab navigation\n\nFor pages with route-based tab navigation, compose `TabNav` inside\n`DefaultPage.Header`. Unlike `Tabs` (which switches content panels), `TabNav`\nrenders navigation links — in a real app, the router handles content rendering.\n\n```jsx live-dev\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/customers\">Back to customers</DefaultPage.BackLink>\n <DefaultPage.Title>Customer Details</DefaultPage.Title>\n <DefaultPage.Subtitle>customer@example.com</DefaultPage.Subtitle>\n <DefaultPage.TabNav>\n <TabNav.Root aria-label=\"Customer sections\">\n <TabNav.Item href=\"/customers/123/general\" isCurrent>General</TabNav.Item>\n <TabNav.Item href=\"/customers/123/addresses\">Addresses</TabNav.Item>\n <TabNav.Item href=\"/customers/123/orders\">Orders</TabNav.Item>\n </TabNav.Root>\n </DefaultPage.TabNav>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Box py=\"400\">\n <Text>General information content</Text>\n </Box>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n## Component parts\n\n| Part | Description |\n|------|-------------|\n| `DefaultPage.Root` | Page container providing layout context. Accepts `layout` (`\"constrained\"` \\| `\"flexible\"`), and `stickyHeader`/`stickyFooter` (flexible mode only) |\n| `DefaultPage.Header` | Header section; two-column grid for title area (left) and actions (right) |\n| `DefaultPage.BackLink` | Optional back navigation link (requires `href`); omit for main pages |\n| `DefaultPage.Title` | Page title (renders as `h1`) |\n| `DefaultPage.Subtitle` | Optional subtitle text (renders as `p`) |\n| `DefaultPage.Actions` | Flex container for action buttons, right-aligned in the header grid |\n| `DefaultPage.TabNav` | Layout container for tab navigation; place inside `Header` |\n| `DefaultPage.Content` | Scrollable main content area |\n| `DefaultPage.Footer` | Optional footer for form actions; omit for read-only pages |\n\n## Accessibility\n\nDefaultPage follows WCAG 2.1 AA guidelines using semantic HTML landmarks and a\nproper heading hierarchy.\n\n### Landmark roles\n\n- `DefaultPage.Header` uses the `<header>` element (banner landmark)\n- `DefaultPage.Content` uses the `<main>` element (main landmark)\n- `DefaultPage.Footer` uses the `<footer>` element (contentinfo landmark)\n- `DefaultPage.Title` renders as an `<h1>`, ensuring correct heading hierarchy\n- `DefaultPage.BackLink` renders as a semantic `<a>` element with a default\n `aria-label` of \"Go back\" via i18n\n\n### Keyboard navigation\n\n| Key | Action |\n|-----|--------|\n| `Tab` | Move focus between interactive elements (back link, actions, tabs, content, footer buttons) |\n| `Shift + Tab` | Move focus in reverse order |\n| `Enter` / `Space` | Activate the focused link or button |\n\n### Screen reader behavior\n\n| Element | Role | Announced as |\n|---------|------|--------------|\n| `DefaultPage.Header` | `banner` | \"banner\" landmark |\n| `DefaultPage.BackLink` | `link` | Link with aria-label (e.g. \"Go back\" or custom label) |\n| `DefaultPage.Title` | `heading` (level 1) | \"Products, heading level 1\" |\n| `DefaultPage.Content` | `main` | \"main\" landmark |\n| `DefaultPage.Footer` | `contentinfo` | \"contentinfo\" landmark |\n\n### Labeling best practices\n\n- Override `DefaultPage.BackLink`'s default `aria-label=\"Go back\"` with a\n destination-specific label (e.g. `aria-label=\"Back to products\"`) when the\n destination context is important.\n- When composing with `TabNav`, always provide an `aria-label` on `TabNav.Root`\n to describe the navigation group for screen readers.\n- Because `<main>` must be unique per page, avoid nesting multiple `DefaultPage`\n components in a single view.\n\n## API reference\n\n<PropsTable id=\"DefaultPage\" />\n\n## Testing your implementation\n\nThese examples demonstrate how to test your implementation when using DefaultPage\nwithin your application.\n\n### Main page (no back link)\n\n```tsx\nimport { describe, it, expect } from \"vitest\";\nimport { render, screen } from \"@testing-library/react\";\nimport {\n Box,\n Button,\n DefaultPage,\n NimbusProvider,\n Stack,\n TabNav,\n Text,\n} from \"@commercetools/nimbus\";\n\ndescribe(\"Main page (no back link)\", () => {\n it(\"renders an info page with title, actions, and content\", () => {\n render(\n <NimbusProvider>\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Product Catalog</DefaultPage.Title>\n <DefaultPage.Actions>\n <Button>Add Product</Button>\n </DefaultPage.Actions>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>Browse and manage your product catalog.</Text>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </NimbusProvider>\n );\n\n expect(screen.getByText(\"Product Catalog\")).toBeInTheDocument();\n expect(screen.getByText(\"Add Product\")).toBeInTheDocument();\n expect(\n screen.getByText(\"Browse and manage your product catalog.\")\n ).toBeInTheDocument();\n });\n\n it(\"renders a page with title and subtitle\", () => {\n render(\n <NimbusProvider>\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Orders</DefaultPage.Title>\n <DefaultPage.Subtitle>\n View and manage all customer orders\n </DefaultPage.Subtitle>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>Order list goes here.</Text>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </NimbusProvider>\n );\n\n expect(screen.getByText(\"Orders\")).toBeInTheDocument();\n expect(\n screen.getByText(\"View and manage all customer orders\")\n ).toBeInTheDocument();\n expect(screen.getByText(\"Order list goes here.\")).toBeInTheDocument();\n });\n\n it(\"renders a form page with footer\", () => {\n render(\n <NimbusProvider>\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Create Discount</DefaultPage.Title>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Stack gap=\"400\">\n <Text>Discount name</Text>\n <Text>Discount value</Text>\n </Stack>\n </DefaultPage.Content>\n <DefaultPage.Footer>\n <Button>Save Discount</Button>\n <Button variant=\"ghost\">Cancel</Button>\n </DefaultPage.Footer>\n </DefaultPage.Root>\n </NimbusProvider>\n );\n\n expect(screen.getByText(\"Create Discount\")).toBeInTheDocument();\n expect(screen.getByText(\"Save Discount\")).toBeInTheDocument();\n expect(screen.getByText(\"Cancel\")).toBeInTheDocument();\n });\n});\n```\n\n### Detail page (with back link)\n\n```tsx\nimport { describe, it, expect } from \"vitest\";\nimport { render, screen } from \"@testing-library/react\";\nimport {\n Box,\n Button,\n DefaultPage,\n NimbusProvider,\n Stack,\n TabNav,\n Text,\n} from \"@commercetools/nimbus\";\n\ndescribe(\"Detail page (with back link)\", () => {\n it(\"renders an info detail page with BackLink, title, subtitle, and content\", () => {\n render(\n <NimbusProvider>\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/products\">\n Back to Products\n </DefaultPage.BackLink>\n <DefaultPage.Title>Running Shoes XL</DefaultPage.Title>\n <DefaultPage.Subtitle>SKU: SHOES-XL-001</DefaultPage.Subtitle>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>Product details and attributes.</Text>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </NimbusProvider>\n );\n\n expect(screen.getByText(\"Back to Products\")).toBeInTheDocument();\n expect(screen.getByText(\"Running Shoes XL\")).toBeInTheDocument();\n expect(screen.getByText(\"SKU: SHOES-XL-001\")).toBeInTheDocument();\n expect(\n screen.getByText(\"Product details and attributes.\")\n ).toBeInTheDocument();\n });\n\n it(\"renders a form detail page with BackLink and footer with save/cancel\", () => {\n render(\n <NimbusProvider>\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/customers\">\n Back to Customers\n </DefaultPage.BackLink>\n <DefaultPage.Title>Edit Customer</DefaultPage.Title>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Stack gap=\"400\">\n <Text>First name</Text>\n <Text>Last name</Text>\n <Text>Email address</Text>\n </Stack>\n </DefaultPage.Content>\n <DefaultPage.Footer>\n <Button>Save Changes</Button>\n <Button variant=\"ghost\">Cancel</Button>\n </DefaultPage.Footer>\n </DefaultPage.Root>\n </NimbusProvider>\n );\n\n expect(screen.getByText(\"Back to Customers\")).toBeInTheDocument();\n expect(screen.getByText(\"Edit Customer\")).toBeInTheDocument();\n expect(screen.getByText(\"Save Changes\")).toBeInTheDocument();\n expect(screen.getByText(\"Cancel\")).toBeInTheDocument();\n });\n});\n```\n\n### With header actions\n\n```tsx\nimport { describe, it, expect } from \"vitest\";\nimport { render, screen } from \"@testing-library/react\";\nimport {\n Box,\n Button,\n DefaultPage,\n NimbusProvider,\n Stack,\n TabNav,\n Text,\n} from \"@commercetools/nimbus\";\n\ndescribe(\"With header actions\", () => {\n it(\"renders a page with BackLink, Title, Actions, and Subtitle\", () => {\n render(\n <NimbusProvider>\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/orders\">\n Back to Orders\n </DefaultPage.BackLink>\n <DefaultPage.Title>Order #12345</DefaultPage.Title>\n <DefaultPage.Actions>\n <Button variant=\"ghost\">Cancel Order</Button>\n <Button>Process Order</Button>\n </DefaultPage.Actions>\n <DefaultPage.Subtitle>\n Placed on March 15, 2026\n </DefaultPage.Subtitle>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Box>\n <Text>Order items and shipment details.</Text>\n </Box>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </NimbusProvider>\n );\n\n expect(screen.getByText(\"Back to Orders\")).toBeInTheDocument();\n expect(screen.getByText(\"Order #12345\")).toBeInTheDocument();\n expect(screen.getByText(\"Cancel Order\")).toBeInTheDocument();\n expect(screen.getByText(\"Process Order\")).toBeInTheDocument();\n expect(screen.getByText(\"Placed on March 15, 2026\")).toBeInTheDocument();\n });\n});\n```\n\n### Layout modes\n\n```tsx\nimport { describe, it, expect } from \"vitest\";\nimport { render, screen } from \"@testing-library/react\";\nimport {\n Box,\n Button,\n DefaultPage,\n NimbusProvider,\n Stack,\n TabNav,\n Text,\n} from \"@commercetools/nimbus\";\n\ndescribe(\"Layout modes\", () => {\n it(\"renders a constrained layout page (default, height: 100%)\", () => {\n render(\n <NimbusProvider>\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Product Catalog</DefaultPage.Title>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>\n Constrained layout: the page fills its parent and only the content\n area scrolls.\n </Text>\n </DefaultPage.Content>\n <DefaultPage.Footer>\n <Button>Save</Button>\n </DefaultPage.Footer>\n </DefaultPage.Root>\n </NimbusProvider>\n );\n\n expect(screen.getByText(\"Product Catalog\")).toBeInTheDocument();\n expect(\n screen.getByText(\n \"Constrained layout: the page fills its parent and only the content area scrolls.\"\n )\n ).toBeInTheDocument();\n });\n\n it(\"renders a flexible layout page that scrolls as a whole\", () => {\n render(\n <NimbusProvider>\n <DefaultPage.Root layout=\"flexible\">\n <DefaultPage.Header>\n <DefaultPage.Title>Long Form Page</DefaultPage.Title>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>\n Flexible layout: the whole page scrolls. Use stickyHeader or\n stickyFooter to pin zones.\n </Text>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </NimbusProvider>\n );\n\n expect(screen.getByText(\"Long Form Page\")).toBeInTheDocument();\n expect(\n screen.getByText(\n \"Flexible layout: the whole page scrolls. Use stickyHeader or stickyFooter to pin zones.\"\n )\n ).toBeInTheDocument();\n });\n\n it(\"renders a flexible layout page with sticky header and footer\", () => {\n render(\n <NimbusProvider>\n <DefaultPage.Root layout=\"flexible\" stickyHeader stickyFooter>\n <DefaultPage.Header>\n <DefaultPage.Title>Edit Customer</DefaultPage.Title>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Stack gap=\"400\">\n <Text>First name</Text>\n <Text>Last name</Text>\n </Stack>\n </DefaultPage.Content>\n <DefaultPage.Footer>\n <Button>Save Changes</Button>\n <Button variant=\"ghost\">Cancel</Button>\n </DefaultPage.Footer>\n </DefaultPage.Root>\n </NimbusProvider>\n );\n\n expect(screen.getByText(\"Edit Customer\")).toBeInTheDocument();\n expect(screen.getByText(\"Save Changes\")).toBeInTheDocument();\n });\n});\n```\n\n### With tab navigation\n\n```tsx\nimport { describe, it, expect } from \"vitest\";\nimport { render, screen } from \"@testing-library/react\";\nimport {\n Box,\n Button,\n DefaultPage,\n NimbusProvider,\n Stack,\n TabNav,\n Text,\n} from \"@commercetools/nimbus\";\n\ndescribe(\"With tab navigation\", () => {\n it(\"renders a detail page with TabNav containing TabNav.Root and TabNav.Items\", () => {\n render(\n <NimbusProvider>\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/products\">\n Back to Products\n </DefaultPage.BackLink>\n <DefaultPage.Title>Winter Jacket</DefaultPage.Title>\n <DefaultPage.TabNav>\n <TabNav.Root aria-label=\"Product sections\">\n <TabNav.Item href=\"#general\" aria-current=\"page\">\n General\n </TabNav.Item>\n <TabNav.Item href=\"#variants\">Variants</TabNav.Item>\n <TabNav.Item href=\"#prices\">Prices</TabNav.Item>\n <TabNav.Item href=\"#images\">Images</TabNav.Item>\n </TabNav.Root>\n </DefaultPage.TabNav>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>General product information.</Text>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </NimbusProvider>\n );\n\n expect(screen.getByText(\"Back to Products\")).toBeInTheDocument();\n expect(screen.getByText(\"Winter Jacket\")).toBeInTheDocument();\n expect(screen.getByText(\"General\")).toBeInTheDocument();\n expect(screen.getByText(\"Variants\")).toBeInTheDocument();\n expect(screen.getByText(\"Prices\")).toBeInTheDocument();\n expect(screen.getByText(\"Images\")).toBeInTheDocument();\n expect(\n screen.getByText(\"General product information.\")\n ).toBeInTheDocument();\n });\n});\n```\n\n\n## Resources\n\n- [Storybook](https://nimbus-storybook.vercel.app/?path=/docs/components-layout-defaultpage--docs)\n",
264
+ "mdx": "\n## Getting started\n\n### Import\n\n```tsx\nimport { DefaultPage, type DefaultPageProps } from '@commercetools/nimbus';\n```\n\n### Basic usage\n\nDefaultPage uses a compound pattern to structure both main and detail views.\nAt minimum, wrap `DefaultPage.Header` (with `DefaultPage.Title`) and\n`DefaultPage.Content` inside `DefaultPage.Root`.\n\n```jsx live-dev\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Products</DefaultPage.Title>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>Your page content goes here.</Text>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n## Layout modes\n\nDefaultPage supports two layout modes controlled by the `layout` prop on\n`DefaultPage.Root`.\n\n### Constrained layout (default)\n\nThe default mode. The page fills its parent container (`height: 100%`). Only\nthe content area scrolls — the header and footer are naturally pinned by the\nCSS grid and do not need sticky positioning. This is the recommended mode for\npages embedded inside an application shell.\n\n```jsx live-dev\nconst App = () => (\n <Box height=\"400px\" border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Products</DefaultPage.Title>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>Only this content area scrolls in constrained mode.</Text>\n </DefaultPage.Content>\n <DefaultPage.Footer>\n <Button variant=\"solid\" colorPalette=\"primary\">Save</Button>\n </DefaultPage.Footer>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### Flexible layout\n\nSet `layout=\"flexible\"` when the whole page should scroll rather than just\nthe content area. This is useful for long-form pages inside a full-page scroll\ncontainer. In this mode, you can optionally pin the header or footer with\n`stickyHeader` and `stickyFooter`.\n\n```jsx live-dev\nconst App = () => (\n <Box height=\"400px\" overflow=\"auto\" border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root layout=\"flexible\" stickyHeader stickyFooter>\n <DefaultPage.Header>\n <DefaultPage.Title>Edit product</DefaultPage.Title>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Stack gap=\"400\">\n <Text>With flexible layout the whole page scrolls.</Text>\n <Text>Use stickyHeader / stickyFooter to pin zones.</Text>\n </Stack>\n </DefaultPage.Content>\n <DefaultPage.Footer>\n <Button variant=\"solid\" colorPalette=\"primary\">Save changes</Button>\n </DefaultPage.Footer>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n| Prop combination | Behaviour |\n|---|---|\n| `layout=\"constrained\"` (default) | Parent height filled; only content scrolls; header and footer pinned by grid |\n| `layout=\"flexible\"` | Height auto; whole page scrolls; nothing pinned |\n| `layout=\"flexible\" stickyHeader` | Flexible scroll with header pinned at top |\n| `layout=\"flexible\" stickyFooter` | Flexible scroll with footer pinned at bottom |\n| `layout=\"flexible\" stickyHeader stickyFooter` | Flexible scroll with both zones pinned |\n\n> [!TIP]\\\n> In **constrained** mode, header and footer are always pinned — you don't need\n> to set any sticky props. Switch to **flexible** mode when you want the whole\n> page to scroll, then opt in to sticky positioning as needed.\n\n> [!NOTE]\\\n> `stickyHeader` and `stickyFooter` are only accepted when `layout=\"flexible\"`.\n> TypeScript will produce a compile error if you use them without it.\n\n### Flexible layout with sticky footer only\n\nUse `stickyFooter` without `stickyHeader` when save actions must stay visible\nbut the header context can scroll away — common for long detail forms.\n\n```jsx live-dev\nconst App = () => (\n <Box height=\"400px\" overflow=\"auto\" border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root layout=\"flexible\" stickyFooter>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/products\">Back to products</DefaultPage.BackLink>\n <DefaultPage.Title>Edit: Classic T-Shirt</DefaultPage.Title>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Stack gap=\"400\">\n <Text>Scroll down — the header scrolls away but the footer stays pinned.</Text>\n {Array.from({ length: 8 }, (_, i) => (\n <FormField.Root key={i}>\n <FormField.Label>{`Field ${i + 1}`}</FormField.Label>\n <FormField.Input>\n <TextInput placeholder={`Value for field ${i + 1}`} />\n </FormField.Input>\n </FormField.Root>\n ))}\n </Stack>\n </DefaultPage.Content>\n <DefaultPage.Footer>\n <FormActionBar\n saveLabel=\"Save changes\"\n onSave={() => {}}\n onCancel={() => {}}\n />\n </DefaultPage.Footer>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n## Sub-components\n\n### DefaultPage.Header\n\nThe header section uses a two-column grid layout. `Title`, `Subtitle`, and any\ncustom content with `gridColumn=\"1\"` flow into the left column. `Actions` spans\nall rows on the right column and collapses when not present. When `BackLink` is\npresent, `Actions` automatically shifts down to align with the title row.\n\n```jsx live-dev\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Products</DefaultPage.Title>\n <DefaultPage.Actions>\n <Button variant=\"ghost\">Export</Button>\n <Button variant=\"solid\" colorPalette=\"primary\">Add Product</Button>\n </DefaultPage.Actions>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>Content area</Text>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### DefaultPage.Title\n\nRenders a styled `<h1>` element pinned to grid column 1. Accepts children for\nthe title text.\n\n```jsx live-dev\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Products</DefaultPage.Title>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>Content area</Text>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### DefaultPage.Subtitle\n\nOptional subtitle rendered as a `<p>` element pinned to grid column 1, below\nthe title. Place it as a sibling of `Title` inside the `Header`.\n\n```jsx live-dev\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Products</DefaultPage.Title>\n <DefaultPage.Subtitle>Manage your product catalog</DefaultPage.Subtitle>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>Content area</Text>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### DefaultPage.Actions\n\nA flex container with gap for action buttons. Pinned to grid column 2 (right),\nspanning all rows. When `BackLink` is present, the grid automatically shifts\n`Actions` to the title row.\n\n```jsx live-dev\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Products</DefaultPage.Title>\n <DefaultPage.Actions>\n <Button variant=\"ghost\">Export</Button>\n <Button variant=\"solid\" colorPalette=\"primary\">Add Product</Button>\n </DefaultPage.Actions>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>Content area</Text>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### DefaultPage.BackLink\n\nOptional back navigation link that renders as a semantic `<a>` element.\nRequires an `href` prop. Include it for detail views to signal the parent list\nor overview; omit it entirely for top-level main pages.\n\nAlways provide destination-specific text as children (e.g., \"Back to products\").\nA generic fallback label \"Go back\" is provided via i18n when children are\nomitted, but destination-specific text is strongly recommended for usability.\n\n```jsx live-dev\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/products\">\n Back to products\n </DefaultPage.BackLink>\n <DefaultPage.Title>Wireless Headphones</DefaultPage.Title>\n <DefaultPage.Subtitle>SKU-WH-2024-001</DefaultPage.Subtitle>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>Product detail content</Text>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### DefaultPage.TabNav\n\nLayout container for tab navigation in the header. Positions itself in the\nheader grid's last row at full width. Place it inside `DefaultPage.Header`,\nafter `Title` and `Subtitle`.\n\nWrap a `TabNav.Root` inside this component.\n\n```jsx live-dev\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Customer Details</DefaultPage.Title>\n <DefaultPage.Subtitle>customer@example.com</DefaultPage.Subtitle>\n <DefaultPage.TabNav>\n <TabNav.Root aria-label=\"Customer sections\">\n <TabNav.Item href=\"/customers/123/general\" isCurrent>General</TabNav.Item>\n <TabNav.Item href=\"/customers/123/addresses\">Addresses</TabNav.Item>\n <TabNav.Item href=\"/customers/123/orders\">Orders</TabNav.Item>\n </TabNav.Root>\n </DefaultPage.TabNav>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>General information content</Text>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### DefaultPage.Content\n\nThe main content area with scrollable overflow. Uses padding-based spacing to\npreserve sticky positioning for child components like `DataTable`.\n\n```jsx live-dev\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Page Title</DefaultPage.Title>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Box bg=\"neutral.3\" padding=\"400\" borderRadius=\"200\">\n <Text>Content area with automatic padding spacing</Text>\n </Box>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### DefaultPage.Footer\n\nOptional footer for page-level actions. Omit it entirely when the page has no\nform actions — the footer grid row collapses automatically when absent.\n\n```jsx live-dev\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Project Settings</DefaultPage.Title>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Box bg=\"neutral.3\" padding=\"400\" borderRadius=\"200\">\n <Text>Form content</Text>\n </Box>\n </DefaultPage.Content>\n <DefaultPage.Footer>\n <FormActionBar onSave={() => {}} onCancel={() => {}} />\n </DefaultPage.Footer>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n> [!TIP]\\\n> For standard save/cancel/delete footers, use the [`FormActionBar`\n> pattern](/patterns/actions/form-action-bar) — it enforces the canonical\n> button order (delete → cancel → save), variants, and loading states so you\n> don't have to reassemble them each time.\n\n```jsx live-dev\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Edit product</DefaultPage.Title>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>Form content goes here.</Text>\n </DefaultPage.Content>\n <DefaultPage.Footer>\n <FormActionBar\n onSave={() => {}}\n onCancel={() => {}}\n onDelete={() => {}}\n />\n </DefaultPage.Footer>\n </DefaultPage.Root>\n </Box>\n)\n```\n\nDrop down to raw `Button` + `Group` / `Stack` only for non-standard layouts\nthat FormActionBar doesn't support (e.g., submit + reset + preview, or\nmulti-step wizard navigation).\n\n### Custom elements in the header\n\nAny additional children placed in the `Header` default to column 2 (right). To\nplace a custom element on the left side of the header grid, set\n`gridColumn=\"1\"`.\n\n```jsx live-dev\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title mb=\"100\">Page Title</DefaultPage.Title>\n <Badge\n gridColumn=\"1\"\n justifySelf=\"flex-start\"\n colorPalette=\"blue\"\n size=\"xs\"\n >\n Custom in column 1\n </Badge>\n <Badge\n colorPalette=\"mint\"\n justifySelf=\"flex-end\"\n size=\"xs\"\n >\n Custom in column 2\n </Badge>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>Content area</Text>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n## Usage examples\n\n### Info main page (no BackLink, no Footer)\n\nFor top-level pages that display information without form actions, omit both\n`DefaultPage.BackLink` and `DefaultPage.Footer`.\n\n```jsx live-dev\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Products</DefaultPage.Title>\n <DefaultPage.Subtitle>Manage your product catalog</DefaultPage.Subtitle>\n <DefaultPage.Actions>\n <Button variant=\"ghost\">Export</Button>\n <Button variant=\"solid\" colorPalette=\"primary\">Add Product</Button>\n </DefaultPage.Actions>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>Product list content goes here.</Text>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### Form main page (with Footer)\n\nFor top-level pages with form actions, add `DefaultPage.Footer` containing\naction buttons. Omit `DefaultPage.BackLink` since this is a main-level page.\n\n```jsx live-dev\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Project Settings</DefaultPage.Title>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Stack gap=\"400\">\n <FormField.Root>\n <FormField.Label>Project name</FormField.Label>\n <FormField.Input>\n <TextInput placeholder=\"e.g. My Store\" />\n </FormField.Input>\n </FormField.Root>\n <FormField.Root>\n <FormField.Label>Description</FormField.Label>\n <FormField.Input>\n <TextInput placeholder=\"Describe the project\" />\n </FormField.Input>\n </FormField.Root>\n </Stack>\n </DefaultPage.Content>\n <DefaultPage.Footer>\n <FormActionBar onSave={() => {}} onCancel={() => {}} />\n </DefaultPage.Footer>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### Info detail page (with BackLink, no Footer)\n\nFor detail pages that display information without form actions, include\n`DefaultPage.BackLink` and omit `DefaultPage.Footer`.\n\n```jsx live-dev\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/products\">Back to products</DefaultPage.BackLink>\n <DefaultPage.Title>Wireless Headphones</DefaultPage.Title>\n <DefaultPage.Subtitle>SKU-WH-2024-001</DefaultPage.Subtitle>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Stack gap=\"400\">\n <Text>This is a read-only detail page with product information.</Text>\n </Stack>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### Form detail page (with BackLink and Footer)\n\nFor detail pages with form actions, include both `DefaultPage.BackLink` and\n`DefaultPage.Footer`.\n\n```jsx live-dev\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/orders\">Back to orders</DefaultPage.BackLink>\n <DefaultPage.Title>Edit Order</DefaultPage.Title>\n <DefaultPage.Subtitle>Order #ORD-2024-001</DefaultPage.Subtitle>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Stack gap=\"400\">\n <Text>Form fields would go here.</Text>\n </Stack>\n </DefaultPage.Content>\n <DefaultPage.Footer>\n <FormActionBar onSave={() => {}} onCancel={() => {}} />\n </DefaultPage.Footer>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n### Tab navigation\n\nFor pages with route-based tab navigation, compose `TabNav` inside\n`DefaultPage.Header`. Unlike `Tabs` (which switches content panels), `TabNav`\nrenders navigation links — in a real app, the router handles content rendering.\n\n```jsx live-dev\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/customers\">Back to customers</DefaultPage.BackLink>\n <DefaultPage.Title>Customer Details</DefaultPage.Title>\n <DefaultPage.Subtitle>customer@example.com</DefaultPage.Subtitle>\n <DefaultPage.TabNav>\n <TabNav.Root aria-label=\"Customer sections\">\n <TabNav.Item href=\"/customers/123/general\" isCurrent>General</TabNav.Item>\n <TabNav.Item href=\"/customers/123/addresses\">Addresses</TabNav.Item>\n <TabNav.Item href=\"/customers/123/orders\">Orders</TabNav.Item>\n </TabNav.Root>\n </DefaultPage.TabNav>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Box py=\"400\">\n <Text>General information content</Text>\n </Box>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n## Component parts\n\n| Part | Description |\n|------|-------------|\n| `DefaultPage.Root` | Page container providing layout context. Accepts `layout` (`\"constrained\"` \\| `\"flexible\"`), and `stickyHeader`/`stickyFooter` (flexible mode only) |\n| `DefaultPage.Header` | Header section; two-column grid for title area (left) and actions (right) |\n| `DefaultPage.BackLink` | Optional back navigation link (requires `href`); omit for main pages |\n| `DefaultPage.Title` | Page title (renders as `h1`) |\n| `DefaultPage.Subtitle` | Optional subtitle text (renders as `p`) |\n| `DefaultPage.Actions` | Flex container for action buttons, right-aligned in the header grid |\n| `DefaultPage.TabNav` | Layout container for tab navigation; place inside `Header` |\n| `DefaultPage.Content` | Scrollable main content area |\n| `DefaultPage.Footer` | Optional footer for form actions; omit for read-only pages |\n\n## Accessibility\n\nDefaultPage follows WCAG 2.1 AA guidelines using semantic HTML landmarks and a\nproper heading hierarchy.\n\n### Landmark roles\n\n- `DefaultPage.Header` uses the `<header>` element (banner landmark)\n- `DefaultPage.Content` uses the `<main>` element (main landmark)\n- `DefaultPage.Footer` uses the `<footer>` element (contentinfo landmark)\n- `DefaultPage.Title` renders as an `<h1>`, ensuring correct heading hierarchy\n- `DefaultPage.BackLink` renders as a semantic `<a>` element with a default\n `aria-label` of \"Go back\" via i18n\n\n### Keyboard navigation\n\n| Key | Action |\n|-----|--------|\n| `Tab` | Move focus between interactive elements (back link, actions, tabs, content, footer buttons) |\n| `Shift + Tab` | Move focus in reverse order |\n| `Enter` / `Space` | Activate the focused link or button |\n\n### Screen reader behavior\n\n| Element | Role | Announced as |\n|---------|------|--------------|\n| `DefaultPage.Header` | `banner` | \"banner\" landmark |\n| `DefaultPage.BackLink` | `link` | Link with aria-label (e.g. \"Go back\" or custom label) |\n| `DefaultPage.Title` | `heading` (level 1) | \"Products, heading level 1\" |\n| `DefaultPage.Content` | `main` | \"main\" landmark |\n| `DefaultPage.Footer` | `contentinfo` | \"contentinfo\" landmark |\n\n### Labeling best practices\n\n- Override `DefaultPage.BackLink`'s default `aria-label=\"Go back\"` with a\n destination-specific label (e.g. `aria-label=\"Back to products\"`) when the\n destination context is important.\n- When composing with `TabNav`, always provide an `aria-label` on `TabNav.Root`\n to describe the navigation group for screen readers.\n- Because `<main>` must be unique per page, avoid nesting multiple `DefaultPage`\n components in a single view.\n\n## API reference\n\n<PropsTable id=\"DefaultPage\" />\n\n## Testing your implementation\n\nThese examples demonstrate how to test your implementation when using DefaultPage\nwithin your application.\n\n### Main page (no back link)\n\n```tsx\nimport { describe, it, expect } from \"vitest\";\nimport { render, screen } from \"@testing-library/react\";\nimport {\n Box,\n Button,\n DefaultPage,\n NimbusProvider,\n Stack,\n TabNav,\n Text,\n} from \"@commercetools/nimbus\";\n\ndescribe(\"Main page (no back link)\", () => {\n it(\"renders an info page with title, actions, and content\", () => {\n render(\n <NimbusProvider>\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Product Catalog</DefaultPage.Title>\n <DefaultPage.Actions>\n <Button>Add Product</Button>\n </DefaultPage.Actions>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>Browse and manage your product catalog.</Text>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </NimbusProvider>\n );\n\n expect(screen.getByText(\"Product Catalog\")).toBeInTheDocument();\n expect(screen.getByText(\"Add Product\")).toBeInTheDocument();\n expect(\n screen.getByText(\"Browse and manage your product catalog.\")\n ).toBeInTheDocument();\n });\n\n it(\"renders a page with title and subtitle\", () => {\n render(\n <NimbusProvider>\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Orders</DefaultPage.Title>\n <DefaultPage.Subtitle>\n View and manage all customer orders\n </DefaultPage.Subtitle>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>Order list goes here.</Text>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </NimbusProvider>\n );\n\n expect(screen.getByText(\"Orders\")).toBeInTheDocument();\n expect(\n screen.getByText(\"View and manage all customer orders\")\n ).toBeInTheDocument();\n expect(screen.getByText(\"Order list goes here.\")).toBeInTheDocument();\n });\n\n it(\"renders a form page with footer\", () => {\n render(\n <NimbusProvider>\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Create Discount</DefaultPage.Title>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Stack gap=\"400\">\n <Text>Discount name</Text>\n <Text>Discount value</Text>\n </Stack>\n </DefaultPage.Content>\n <DefaultPage.Footer>\n <Button>Save Discount</Button>\n <Button variant=\"ghost\">Cancel</Button>\n </DefaultPage.Footer>\n </DefaultPage.Root>\n </NimbusProvider>\n );\n\n expect(screen.getByText(\"Create Discount\")).toBeInTheDocument();\n expect(screen.getByText(\"Save Discount\")).toBeInTheDocument();\n expect(screen.getByText(\"Cancel\")).toBeInTheDocument();\n });\n});\n```\n\n### Detail page (with back link)\n\n```tsx\nimport { describe, it, expect } from \"vitest\";\nimport { render, screen } from \"@testing-library/react\";\nimport {\n Box,\n Button,\n DefaultPage,\n NimbusProvider,\n Stack,\n TabNav,\n Text,\n} from \"@commercetools/nimbus\";\n\ndescribe(\"Detail page (with back link)\", () => {\n it(\"renders an info detail page with BackLink, title, subtitle, and content\", () => {\n render(\n <NimbusProvider>\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/products\">\n Back to Products\n </DefaultPage.BackLink>\n <DefaultPage.Title>Running Shoes XL</DefaultPage.Title>\n <DefaultPage.Subtitle>SKU: SHOES-XL-001</DefaultPage.Subtitle>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>Product details and attributes.</Text>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </NimbusProvider>\n );\n\n expect(screen.getByText(\"Back to Products\")).toBeInTheDocument();\n expect(screen.getByText(\"Running Shoes XL\")).toBeInTheDocument();\n expect(screen.getByText(\"SKU: SHOES-XL-001\")).toBeInTheDocument();\n expect(\n screen.getByText(\"Product details and attributes.\")\n ).toBeInTheDocument();\n });\n\n it(\"renders a form detail page with BackLink and footer with save/cancel\", () => {\n render(\n <NimbusProvider>\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/customers\">\n Back to Customers\n </DefaultPage.BackLink>\n <DefaultPage.Title>Edit Customer</DefaultPage.Title>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Stack gap=\"400\">\n <Text>First name</Text>\n <Text>Last name</Text>\n <Text>Email address</Text>\n </Stack>\n </DefaultPage.Content>\n <DefaultPage.Footer>\n <Button>Save Changes</Button>\n <Button variant=\"ghost\">Cancel</Button>\n </DefaultPage.Footer>\n </DefaultPage.Root>\n </NimbusProvider>\n );\n\n expect(screen.getByText(\"Back to Customers\")).toBeInTheDocument();\n expect(screen.getByText(\"Edit Customer\")).toBeInTheDocument();\n expect(screen.getByText(\"Save Changes\")).toBeInTheDocument();\n expect(screen.getByText(\"Cancel\")).toBeInTheDocument();\n });\n});\n```\n\n### With header actions\n\n```tsx\nimport { describe, it, expect } from \"vitest\";\nimport { render, screen } from \"@testing-library/react\";\nimport {\n Box,\n Button,\n DefaultPage,\n NimbusProvider,\n Stack,\n TabNav,\n Text,\n} from \"@commercetools/nimbus\";\n\ndescribe(\"With header actions\", () => {\n it(\"renders a page with BackLink, Title, Actions, and Subtitle\", () => {\n render(\n <NimbusProvider>\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/orders\">\n Back to Orders\n </DefaultPage.BackLink>\n <DefaultPage.Title>Order #12345</DefaultPage.Title>\n <DefaultPage.Actions>\n <Button variant=\"ghost\">Cancel Order</Button>\n <Button>Process Order</Button>\n </DefaultPage.Actions>\n <DefaultPage.Subtitle>\n Placed on March 15, 2026\n </DefaultPage.Subtitle>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Box>\n <Text>Order items and shipment details.</Text>\n </Box>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </NimbusProvider>\n );\n\n expect(screen.getByText(\"Back to Orders\")).toBeInTheDocument();\n expect(screen.getByText(\"Order #12345\")).toBeInTheDocument();\n expect(screen.getByText(\"Cancel Order\")).toBeInTheDocument();\n expect(screen.getByText(\"Process Order\")).toBeInTheDocument();\n expect(screen.getByText(\"Placed on March 15, 2026\")).toBeInTheDocument();\n });\n});\n```\n\n### Layout modes\n\n```tsx\nimport { describe, it, expect } from \"vitest\";\nimport { render, screen } from \"@testing-library/react\";\nimport {\n Box,\n Button,\n DefaultPage,\n NimbusProvider,\n Stack,\n TabNav,\n Text,\n} from \"@commercetools/nimbus\";\n\ndescribe(\"Layout modes\", () => {\n it(\"renders a constrained layout page (default, height: 100%)\", () => {\n render(\n <NimbusProvider>\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.Title>Product Catalog</DefaultPage.Title>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>\n Constrained layout: the page fills its parent and only the content\n area scrolls.\n </Text>\n </DefaultPage.Content>\n <DefaultPage.Footer>\n <Button>Save</Button>\n </DefaultPage.Footer>\n </DefaultPage.Root>\n </NimbusProvider>\n );\n\n expect(screen.getByText(\"Product Catalog\")).toBeInTheDocument();\n expect(\n screen.getByText(\n \"Constrained layout: the page fills its parent and only the content area scrolls.\"\n )\n ).toBeInTheDocument();\n });\n\n it(\"renders a flexible layout page that scrolls as a whole\", () => {\n render(\n <NimbusProvider>\n <DefaultPage.Root layout=\"flexible\">\n <DefaultPage.Header>\n <DefaultPage.Title>Long Form Page</DefaultPage.Title>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>\n Flexible layout: the whole page scrolls. Use stickyHeader or\n stickyFooter to pin zones.\n </Text>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </NimbusProvider>\n );\n\n expect(screen.getByText(\"Long Form Page\")).toBeInTheDocument();\n expect(\n screen.getByText(\n \"Flexible layout: the whole page scrolls. Use stickyHeader or stickyFooter to pin zones.\"\n )\n ).toBeInTheDocument();\n });\n\n it(\"renders a flexible layout page with sticky header and footer\", () => {\n render(\n <NimbusProvider>\n <DefaultPage.Root layout=\"flexible\" stickyHeader stickyFooter>\n <DefaultPage.Header>\n <DefaultPage.Title>Edit Customer</DefaultPage.Title>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Stack gap=\"400\">\n <Text>First name</Text>\n <Text>Last name</Text>\n </Stack>\n </DefaultPage.Content>\n <DefaultPage.Footer>\n <Button>Save Changes</Button>\n <Button variant=\"ghost\">Cancel</Button>\n </DefaultPage.Footer>\n </DefaultPage.Root>\n </NimbusProvider>\n );\n\n expect(screen.getByText(\"Edit Customer\")).toBeInTheDocument();\n expect(screen.getByText(\"Save Changes\")).toBeInTheDocument();\n });\n});\n```\n\n### With tab navigation\n\n```tsx\nimport { describe, it, expect } from \"vitest\";\nimport { render, screen } from \"@testing-library/react\";\nimport {\n Box,\n Button,\n DefaultPage,\n NimbusProvider,\n Stack,\n TabNav,\n Text,\n} from \"@commercetools/nimbus\";\n\ndescribe(\"With tab navigation\", () => {\n it(\"renders a detail page with TabNav containing TabNav.Root and TabNav.Items\", () => {\n render(\n <NimbusProvider>\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/products\">\n Back to Products\n </DefaultPage.BackLink>\n <DefaultPage.Title>Winter Jacket</DefaultPage.Title>\n <DefaultPage.TabNav>\n <TabNav.Root aria-label=\"Product sections\">\n <TabNav.Item href=\"#general\" aria-current=\"page\">\n General\n </TabNav.Item>\n <TabNav.Item href=\"#variants\">Variants</TabNav.Item>\n <TabNav.Item href=\"#prices\">Prices</TabNav.Item>\n <TabNav.Item href=\"#images\">Images</TabNav.Item>\n </TabNav.Root>\n </DefaultPage.TabNav>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>General product information.</Text>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </NimbusProvider>\n );\n\n expect(screen.getByText(\"Back to Products\")).toBeInTheDocument();\n expect(screen.getByText(\"Winter Jacket\")).toBeInTheDocument();\n expect(screen.getByText(\"General\")).toBeInTheDocument();\n expect(screen.getByText(\"Variants\")).toBeInTheDocument();\n expect(screen.getByText(\"Prices\")).toBeInTheDocument();\n expect(screen.getByText(\"Images\")).toBeInTheDocument();\n expect(\n screen.getByText(\"General product information.\")\n ).toBeInTheDocument();\n });\n});\n```\n\n\n## Resources\n\n- [Storybook](https://nimbus-storybook.vercel.app/?path=/docs/components-layout-defaultpage--docs)\n",
265
265
  "toc": [
266
266
  {
267
267
  "value": "Getting started",
@@ -664,7 +664,7 @@
664
664
  ]
665
665
  },
666
666
  "guidelines": {
667
- "mdx": "\n## Guidelines\n\nDefaultPage guidelines help you choose the right layout configuration for both\ntop-level and detail views, ensuring consistent navigation patterns and content\nstructure across your application.\n\n### Best practices\n\n- **Start with the simplest composition:** Every page needs `Root`, `Header`\n with `Title`, and `Content`. Only add `BackLink`, `Actions`, `Subtitle`,\n `TabNav`, and `Footer` when the page requires them.\n- **Use BackLink to signal detail views:** Include `DefaultPage.BackLink` for\n any page that is subordinate to a parent list or overview. Omit it entirely\n for top-level main pages.\n- **Always label the back link with its destination:** The back link label\n should name where the user will go, not just say \"Back\".\n- **Keep the header concise:** Use the title for the resource name and the\n subtitle for a secondary identifier (SKU, email, order number). Don't overload\n the header with content that belongs in the body.\n- **Use Actions sparingly:** Limit header actions to 2–3 high-priority\n operations. Move secondary actions into a menu or into the content area.\n- **Place form actions in the footer:** Save, cancel, and submit buttons belong\n in `DefaultPage.Footer`, not the header. The footer stays anchored at the\n bottom, providing a consistent location for form actions.\n- **Omit the footer for read-only pages:** Pages that display data without\n editing don't need a footer. Removing it gives the content area more vertical\n space and avoids implying that user input is expected.\n- **Use TabNav for multi-section navigation:** When a page has distinct content\n sections reachable via routing, compose `TabNav` inside `DefaultPage.Header`\n rather than stacking all sections vertically.\n\n### Usage\n\nDefaultPage works for any full-page view in your application. The pattern you\nuse depends on whether the page is a top-level main view or a subordinate detail\nview, and whether it is read-only or editable.\n\n> [!TIP]\\\n> When to use\n\n- **Top-level read-only views:** Use DefaultPage without `BackLink` or `Footer`\n when displaying a list, table, or overview that the user cannot edit directly\n (e.g., product list, order overview).\n- **Top-level form views:** Use DefaultPage without `BackLink` but with\n `Footer` for top-level pages that include a form with save/cancel actions\n (e.g., project settings, global configuration).\n- **Detail read-only views:** Use DefaultPage with `BackLink` but without\n `Footer` when displaying information for a single resource the user cannot\n edit (e.g., order details, customer profile in read mode).\n- **Detail editable views:** Use DefaultPage with both `BackLink` and `Footer`\n for pages focused on editing a single resource (e.g., editing a product,\n updating an order).\n- **Tabbed views:** Use DefaultPage with `TabNav` inside the `Header` when a\n page (main or detail) has multiple logical sections reachable by route.\n- **Resource creation pages:** Use DefaultPage with `Footer` for \"create new\"\n flows where the user fills out a form and submits.\n\n> [!CAUTION]\\\n> When not to use\n\n- **Modals, dialogs, or drawers:** DefaultPage is designed for full-page views\n only. Use the appropriate overlay components for secondary workflows.\n- **Nested inside another DefaultPage:** Each view should have a single\n DefaultPage at its root. Nesting creates duplicate `<main>` landmarks, which\n violates WCAG.\n- **Dashboards with widget grids:** DefaultPage's single-column scrollable\n content area is not suited for dashboard layouts with multiple side-by-side\n widgets or summary cards.\n- **Wizards or multi-step flows:** Step-by-step creation flows need dedicated\n wizard patterns, not a default page layout.\n\n### Choosing between main page and detail page patterns\n\nThe distinction between a main page and a detail page is determined by a single\nprop: `DefaultPage.BackLink`.\n\n| Signal | Main page pattern | Detail page pattern |\n|--------|------------------|---------------------|\n| `DefaultPage.BackLink` | Omit | Include with destination `href` |\n| Typical content | Lists, tables, overviews | Single resource: view, edit, or create |\n| Typical header | Title + Subtitle + Actions | BackLink + Title + Subtitle (+ optional Actions) |\n| Footer | Optional (form pages only) | Optional (editable pages only) |\n\nWhen in doubt: if the user navigated *into* this page from a list, it is a\ndetail page and should have a back link.\n\n### Back link labeling\n\nThe back link is the primary navigation element on detail pages. Its label\nshould clearly communicate where the user will go.\n\n> [!TIP]\\\n> **Do**\n>\n> - Label the back link with the destination: \"Back to products\", \"Back to\n> orders\", \"Back to customers\".\n> - Keep the label short and scannable.\n> - Override the default `aria-label` with a destination-specific value when\n> the destination context is important.\n\n> [!CAUTION]\\\n> **Don't**\n>\n> - Don't use generic labels like \"Back\" or \"Go back\" — they don't tell the\n> user where they'll end up.\n> - Don't use the back link for unrelated navigation. It should always return\n> to the parent list or overview.\n\n### Header content structure\n\nThe header organizes the page identity. Keep it focused on identification and\nprimary actions.\n\n> [!TIP]\\\n> **Do**\n>\n> - Use the title for the resource's primary name or identifier.\n> - Use the subtitle for a secondary identifier (SKU, email, ID, or brief\n> description).\n> - Place 1–2 high-priority actions in `DefaultPage.Actions`.\n> - Use `gridColumn=\"1\"` for any custom element that should appear in the left\n> column alongside the title.\n\n```jsx live\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/products\">\n Back to products\n </DefaultPage.BackLink>\n <DefaultPage.Title>Wireless Headphones</DefaultPage.Title>\n <DefaultPage.Actions>\n <Button size=\"sm\" variant=\"ghost\">Duplicate</Button>\n </DefaultPage.Actions>\n <DefaultPage.Subtitle>SKU-WH-2024-001</DefaultPage.Subtitle>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>Page content goes here.</Text>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n> [!CAUTION]\\\n> **Don't**\n>\n> - Don't put descriptions, status badges, or metadata in the title or subtitle.\n> These belong in the content area.\n> - Don't add more than 3 actions to the header. Use a menu for overflow\n> actions.\n> - Don't put form submission buttons (Save, Cancel) in `Actions`. Those belong\n> in `Footer`.\n\n### Footer usage\n\nFooter is intended for page-level form actions. Omit it entirely for read-only\npages — the grid row collapses automatically.\n\n> [!TIP]\\\n> **Do**\n>\n> - Place the primary action button on the right and secondary actions to its\n> left.\n> - Use `variant=\"ghost\"` for secondary actions like Cancel to create visual\n> hierarchy.\n> - Omit `DefaultPage.Footer` entirely when the page has no form actions.\n\n```jsx live\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/orders\">\n Back to orders\n </DefaultPage.BackLink>\n <DefaultPage.Title>Edit Order</DefaultPage.Title>\n <DefaultPage.Subtitle>Order #ORD-2024-001</DefaultPage.Subtitle>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Box bg=\"neutral.3\" padding=\"400\" borderRadius=\"200\">\n <Text>Form fields</Text>\n </Box>\n </DefaultPage.Content>\n <DefaultPage.Footer>\n <Stack direction=\"row\" gap=\"200\" justify=\"flex-end\" width=\"100%\">\n <Button variant=\"ghost\">Cancel</Button>\n <Button variant=\"solid\" colorPalette=\"primary\">Save</Button>\n </Stack>\n </DefaultPage.Footer>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n> [!CAUTION]\\\n> **Don't**\n>\n> - Don't include a `Footer` on read-only pages. An empty footer creates\n> confusion about whether the page expects user input.\n> - Don't use `Footer` for navigation or informational content.\n\n",
667
+ "mdx": "\n## Guidelines\n\nDefaultPage guidelines help you choose the right layout configuration for both\ntop-level and detail views, ensuring consistent navigation patterns and content\nstructure across your application.\n\n### Best practices\n\n- **Start with the simplest composition:** Every page needs `Root`, `Header`\n with `Title`, and `Content`. Only add `BackLink`, `Actions`, `Subtitle`,\n `TabNav`, and `Footer` when the page requires them.\n- **Use BackLink to signal detail views:** Include `DefaultPage.BackLink` for\n any page that is subordinate to a parent list or overview. Omit it entirely\n for top-level main pages.\n- **Always label the back link with its destination:** The back link label\n should name where the user will go, not just say \"Back\".\n- **Keep the header concise:** Use the title for the resource name and the\n subtitle for a secondary identifier (SKU, email, order number). Don't overload\n the header with content that belongs in the body.\n- **Use Actions sparingly:** Limit header actions to 2–3 high-priority\n operations. Move secondary actions into a menu or into the content area.\n- **Place form actions in the footer:** Save, cancel, and submit buttons belong\n in `DefaultPage.Footer`, not the header. The footer stays anchored at the\n bottom, providing a consistent location for form actions.\n- **Omit the footer for read-only pages:** Pages that display data without\n editing don't need a footer. Removing it gives the content area more vertical\n space and avoids implying that user input is expected.\n- **Use TabNav for multi-section navigation:** When a page has distinct content\n sections reachable via routing, compose `TabNav` inside `DefaultPage.Header`\n rather than stacking all sections vertically.\n\n### Usage\n\nDefaultPage works for any full-page view in your application. The pattern you\nuse depends on whether the page is a top-level main view or a subordinate detail\nview, and whether it is read-only or editable.\n\n> [!TIP]\\\n> When to use\n\n- **Top-level read-only views:** Use DefaultPage without `BackLink` or `Footer`\n when displaying a list, table, or overview that the user cannot edit directly\n (e.g., product list, order overview).\n- **Top-level form views:** Use DefaultPage without `BackLink` but with\n `Footer` for top-level pages that include a form with save/cancel actions\n (e.g., project settings, global configuration).\n- **Detail read-only views:** Use DefaultPage with `BackLink` but without\n `Footer` when displaying information for a single resource the user cannot\n edit (e.g., order details, customer profile in read mode).\n- **Detail editable views:** Use DefaultPage with both `BackLink` and `Footer`\n for pages focused on editing a single resource (e.g., editing a product,\n updating an order).\n- **Tabbed views:** Use DefaultPage with `TabNav` inside the `Header` when a\n page (main or detail) has multiple logical sections reachable by route.\n- **Resource creation pages:** Use DefaultPage with `Footer` for \"create new\"\n flows where the user fills out a form and submits.\n\n> [!CAUTION]\\\n> When not to use\n\n- **Modals, dialogs, or drawers:** DefaultPage is designed for full-page views\n only. Use the appropriate overlay components for secondary workflows.\n- **Nested inside another DefaultPage:** Each view should have a single\n DefaultPage at its root. Nesting creates duplicate `<main>` landmarks, which\n violates WCAG.\n- **Dashboards with widget grids:** DefaultPage's single-column scrollable\n content area is not suited for dashboard layouts with multiple side-by-side\n widgets or summary cards.\n- **Wizards or multi-step flows:** Step-by-step creation flows need dedicated\n wizard patterns, not a default page layout.\n\n### Choosing between main page and detail page patterns\n\nThe distinction between a main page and a detail page is determined by a single\nprop: `DefaultPage.BackLink`.\n\n| Signal | Main page pattern | Detail page pattern |\n|--------|------------------|---------------------|\n| `DefaultPage.BackLink` | Omit | Include with destination `href` |\n| Typical content | Lists, tables, overviews | Single resource: view, edit, or create |\n| Typical header | Title + Subtitle + Actions | BackLink + Title + Subtitle (+ optional Actions) |\n| Footer | Optional (form pages only) | Optional (editable pages only) |\n\nWhen in doubt: if the user navigated *into* this page from a list, it is a\ndetail page and should have a back link.\n\n### Back link labeling\n\nThe back link is the primary navigation element on detail pages. Its label\nshould clearly communicate where the user will go.\n\n> [!TIP]\\\n> **Do**\n>\n> - Label the back link with the destination: \"Back to products\", \"Back to\n> orders\", \"Back to customers\".\n> - Keep the label short and scannable.\n> - Override the default `aria-label` with a destination-specific value when\n> the destination context is important.\n\n> [!CAUTION]\\\n> **Don't**\n>\n> - Don't use generic labels like \"Back\" or \"Go back\" — they don't tell the\n> user where they'll end up.\n> - Don't use the back link for unrelated navigation. It should always return\n> to the parent list or overview.\n\n### Header content structure\n\nThe header organizes the page identity. Keep it focused on identification and\nprimary actions.\n\n> [!TIP]\\\n> **Do**\n>\n> - Use the title for the resource's primary name or identifier.\n> - Use the subtitle for a secondary identifier (SKU, email, ID, or brief\n> description).\n> - Place 1–2 high-priority actions in `DefaultPage.Actions`.\n> - Use `gridColumn=\"1\"` for any custom element that should appear in the left\n> column alongside the title.\n\n```jsx live\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/products\">\n Back to products\n </DefaultPage.BackLink>\n <DefaultPage.Title>Wireless Headphones</DefaultPage.Title>\n <DefaultPage.Actions>\n <Button size=\"sm\" variant=\"ghost\">Duplicate</Button>\n </DefaultPage.Actions>\n <DefaultPage.Subtitle>SKU-WH-2024-001</DefaultPage.Subtitle>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Text>Page content goes here.</Text>\n </DefaultPage.Content>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n> [!CAUTION]\\\n> **Don't**\n>\n> - Don't put descriptions, status badges, or metadata in the title or subtitle.\n> These belong in the content area.\n> - Don't add more than 3 actions to the header. Use a menu for overflow\n> actions.\n> - Don't put form submission buttons (Save, Cancel) in `Actions`. Those belong\n> in `Footer`.\n\n### Footer usage\n\nFooter is intended for page-level form actions. Omit it entirely for read-only\npages — the grid row collapses automatically.\n\n> [!TIP]\\\n> **Do**\n>\n> - Place the primary action button on the right and secondary actions to its\n> left.\n> - Use `variant=\"ghost\"` for secondary actions like Cancel to create visual\n> hierarchy.\n> - Omit `DefaultPage.Footer` entirely when the page has no form actions.\n\n```jsx live\nconst App = () => (\n <Box border=\"solid-25\" borderColor=\"neutral.6\" borderRadius=\"200\">\n <DefaultPage.Root>\n <DefaultPage.Header>\n <DefaultPage.BackLink href=\"/orders\">\n Back to orders\n </DefaultPage.BackLink>\n <DefaultPage.Title>Edit Order</DefaultPage.Title>\n <DefaultPage.Subtitle>Order #ORD-2024-001</DefaultPage.Subtitle>\n </DefaultPage.Header>\n <DefaultPage.Content>\n <Box bg=\"neutral.3\" padding=\"400\" borderRadius=\"200\">\n <Text>Form fields</Text>\n </Box>\n </DefaultPage.Content>\n <DefaultPage.Footer>\n <FormActionBar onSave={() => {}} onCancel={() => {}} />\n </DefaultPage.Footer>\n </DefaultPage.Root>\n </Box>\n)\n```\n\n> [!CAUTION]\\\n> **Don't**\n>\n> - Don't include a `Footer` on read-only pages. An empty footer creates\n> confusion about whether the page expects user input.\n> - Don't use `Footer` for navigation or informational content.\n\n",
668
668
  "toc": [
669
669
  {
670
670
  "value": "Guidelines",