@commercetools/nimbus-mcp 2.10.0 → 3.0.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 (124) hide show
  1. package/data/docs/route-manifest.json +288 -0
  2. package/data/docs/routes/components-data-display-card.json +71 -5
  3. package/data/docs/routes/components-feedback-toast.json +1 -1
  4. package/data/docs/routes/components-layout-defaultpage.json +4 -4
  5. package/data/docs/routes/components-layout-modalpage.json +4 -4
  6. package/data/docs/routes/components-layout-scrollarea.json +428 -0
  7. package/data/docs/routes/components-media-avatar.json +24 -2
  8. package/data/docs/routes/patterns-actions-form-action-bar.json +412 -0
  9. package/data/docs/routes/patterns-dialogs-info-dialog.json +315 -0
  10. package/data/docs/routes/patterns-dialogs.json +78 -0
  11. package/data/docs/search-index.json +1 -1
  12. package/data/docs/types/AccordionHeader.json +33 -33
  13. package/data/docs/types/AccordionRoot.json +2 -2
  14. package/data/docs/types/AlertDescription.json +8 -8
  15. package/data/docs/types/AlertDismissButton.json +52 -52
  16. package/data/docs/types/AlertTitle.json +8 -8
  17. package/data/docs/types/Avatar.json +8 -8
  18. package/data/docs/types/Badge.json +2 -2
  19. package/data/docs/types/Body.json +6 -6
  20. package/data/docs/types/Box.json +6 -6
  21. package/data/docs/types/Button.json +24 -24
  22. package/data/docs/types/Caption.json +6 -6
  23. package/data/docs/types/Card.json +1 -1
  24. package/data/docs/types/{CardContent.json → CardBody.json} +2 -2
  25. package/data/docs/types/CardFooter.json +27 -0
  26. package/data/docs/types/CardRoot.json +18 -48
  27. package/data/docs/types/Cell.json +6 -6
  28. package/data/docs/types/Checkbox.json +2 -2
  29. package/data/docs/types/Code.json +10 -10
  30. package/data/docs/types/Column.json +6 -6
  31. package/data/docs/types/ColumnGroup.json +6 -6
  32. package/data/docs/types/ColumnHeader.json +6 -6
  33. package/data/docs/types/ComboBoxListBox.json +6 -6
  34. package/data/docs/types/ComboBoxPopover.json +8 -8
  35. package/data/docs/types/ComboBoxRoot.json +24 -24
  36. package/data/docs/types/ComboBoxSection.json +6 -6
  37. package/data/docs/types/ComboBoxTrigger.json +6 -6
  38. package/data/docs/types/DataTable.json +2 -2
  39. package/data/docs/types/DataTableBody.json +6 -6
  40. package/data/docs/types/DataTableHeader.json +7 -7
  41. package/data/docs/types/DataTableRoot.json +2 -2
  42. package/data/docs/types/DataTableTable.json +6 -6
  43. package/data/docs/types/DatePicker.json +16 -16
  44. package/data/docs/types/DateRangePickerField.json +17 -17
  45. package/data/docs/types/DefaultPageRoot.json +2 -2
  46. package/data/docs/types/DialogCloseTrigger.json +52 -52
  47. package/data/docs/types/DraggableListField.json +10 -10
  48. package/data/docs/types/DraggableListItem.json +6 -6
  49. package/data/docs/types/DraggableListRoot.json +8 -8
  50. package/data/docs/types/DrawerCloseTrigger.json +52 -52
  51. package/data/docs/types/FieldErrors.json +2 -2
  52. package/data/docs/types/Flex.json +22 -22
  53. package/data/docs/types/Footer.json +6 -6
  54. package/data/docs/types/FormActionBar.json +200 -0
  55. package/data/docs/types/FormFieldRoot.json +2 -2
  56. package/data/docs/types/Grid.json +24 -24
  57. package/data/docs/types/Group.json +2 -2
  58. package/data/docs/types/Header.json +6 -6
  59. package/data/docs/types/Heading.json +8 -8
  60. package/data/docs/types/Icon.json +4 -4
  61. package/data/docs/types/IconButton.json +24 -24
  62. package/data/docs/types/IconToggleButton.json +17 -17
  63. package/data/docs/types/Image.json +38 -38
  64. package/data/docs/types/Indicator.json +6 -6
  65. package/data/docs/types/InfoDialog.json +104 -0
  66. package/data/docs/types/InlineSvg.json +2 -2
  67. package/data/docs/types/Item.json +6 -6
  68. package/data/docs/types/Kbd.json +8 -8
  69. package/data/docs/types/Link.json +8 -8
  70. package/data/docs/types/ListIndicator.json +6 -6
  71. package/data/docs/types/ListItem.json +6 -6
  72. package/data/docs/types/ListRoot.json +10 -10
  73. package/data/docs/types/LoadingSpinner.json +2 -2
  74. package/data/docs/types/MenuTrigger.json +33 -33
  75. package/data/docs/types/MultilineTextInput.json +34 -34
  76. package/data/docs/types/MultilineTextInputField.json +19 -19
  77. package/data/docs/types/NumberInput.json +19 -19
  78. package/data/docs/types/NumberInputField.json +38 -38
  79. package/data/docs/types/PageContentColumn.json +6 -6
  80. package/data/docs/types/PageContentRoot.json +20 -20
  81. package/data/docs/types/PasswordInput.json +17 -17
  82. package/data/docs/types/PasswordInputField.json +17 -17
  83. package/data/docs/types/ProgressBar.json +21 -21
  84. package/data/docs/types/RichTextInput.json +2 -2
  85. package/data/docs/types/Root.json +10 -10
  86. package/data/docs/types/Row.json +6 -6
  87. package/data/docs/types/ScrollArea.json +129 -32
  88. package/data/docs/types/ScrollAreaElementIds.json +9 -0
  89. package/data/docs/types/ScrollAreaProps.json +9 -0
  90. package/data/docs/types/SearchInput.json +19 -19
  91. package/data/docs/types/SearchInputField.json +25 -25
  92. package/data/docs/types/SelectRoot.json +15 -15
  93. package/data/docs/types/Separator.json +4 -4
  94. package/data/docs/types/SimpleGrid.json +28 -28
  95. package/data/docs/types/SplitButton.json +2 -2
  96. package/data/docs/types/Stack.json +2 -2
  97. package/data/docs/types/StepsRoot.json +2 -2
  98. package/data/docs/types/Switch.json +2 -2
  99. package/data/docs/types/TabNavItem.json +19 -19
  100. package/data/docs/types/TabNavRoot.json +18 -18
  101. package/data/docs/types/TableBody.json +6 -6
  102. package/data/docs/types/TableCaption.json +6 -6
  103. package/data/docs/types/TableCell.json +6 -6
  104. package/data/docs/types/TableColumn.json +6 -6
  105. package/data/docs/types/TableColumnGroup.json +6 -6
  106. package/data/docs/types/TableColumnHeader.json +6 -6
  107. package/data/docs/types/TableFooter.json +6 -6
  108. package/data/docs/types/TableHeader.json +6 -6
  109. package/data/docs/types/TableRoot.json +18 -18
  110. package/data/docs/types/TableRow.json +6 -6
  111. package/data/docs/types/TableScrollArea.json +6 -6
  112. package/data/docs/types/TabsTab.json +17 -17
  113. package/data/docs/types/Text.json +8 -8
  114. package/data/docs/types/TextInput.json +16 -16
  115. package/data/docs/types/TextInputField.json +17 -17
  116. package/data/docs/types/ToggleButton.json +17 -17
  117. package/data/docs/types/ToggleButtonGroupButton.json +6 -6
  118. package/data/docs/types/ToggleButtonGroupRoot.json +6 -6
  119. package/data/docs/types/Toolbar.json +16 -16
  120. package/data/docs/types/TooltipContent.json +21 -21
  121. package/data/docs/types/TooltipRoot.json +3 -3
  122. package/data/docs/types/manifest.json +16 -11
  123. package/data/docs/types/toast.json +2 -17
  124. package/package.json +6 -6
@@ -0,0 +1,412 @@
1
+ {
2
+ "meta": {
3
+ "id": "Patterns-FormActionBar",
4
+ "title": "Form action bar",
5
+ "exportName": "FormActionBar",
6
+ "description": "This pattern component provides standard save/cancel/delete action buttons for form footers, working inside any footer slot.",
7
+ "lifecycleState": "Beta",
8
+ "order": 999,
9
+ "repoPath": "packages/nimbus/src/patterns/actions/form-action-bar/form-action-bar.mdx",
10
+ "menu": [
11
+ "Patterns",
12
+ "Actions",
13
+ "Form action bar"
14
+ ],
15
+ "route": "patterns/actions/form-action-bar",
16
+ "tags": [
17
+ "component",
18
+ "pattern",
19
+ "actions",
20
+ "Button",
21
+ "Group"
22
+ ],
23
+ "toc": [
24
+ {
25
+ "value": "Overview",
26
+ "href": "#overview",
27
+ "depth": 2,
28
+ "numbering": [
29
+ 1,
30
+ 1
31
+ ],
32
+ "parent": "root"
33
+ },
34
+ {
35
+ "value": "Anatomy",
36
+ "href": "#anatomy",
37
+ "depth": 2,
38
+ "numbering": [
39
+ 1,
40
+ 2
41
+ ],
42
+ "parent": "root"
43
+ },
44
+ {
45
+ "value": "Usage",
46
+ "href": "#usage",
47
+ "depth": 2,
48
+ "numbering": [
49
+ 1,
50
+ 3
51
+ ],
52
+ "parent": "root"
53
+ },
54
+ {
55
+ "value": "When to use",
56
+ "href": "#when-to-use",
57
+ "depth": 3,
58
+ "numbering": [
59
+ 1,
60
+ 3,
61
+ 1
62
+ ],
63
+ "parent": "root"
64
+ },
65
+ {
66
+ "value": "When not to use",
67
+ "href": "#when-not-to-use",
68
+ "depth": 3,
69
+ "numbering": [
70
+ 1,
71
+ 3,
72
+ 2
73
+ ],
74
+ "parent": "root"
75
+ },
76
+ {
77
+ "value": "Do",
78
+ "href": "#do",
79
+ "depth": 3,
80
+ "numbering": [
81
+ 1,
82
+ 3,
83
+ 3
84
+ ],
85
+ "parent": "root"
86
+ },
87
+ {
88
+ "value": "Don't",
89
+ "href": "#dont",
90
+ "depth": 3,
91
+ "numbering": [
92
+ 1,
93
+ 3,
94
+ 4
95
+ ],
96
+ "parent": "root"
97
+ },
98
+ {
99
+ "value": "Resources",
100
+ "href": "#resources",
101
+ "depth": 3,
102
+ "numbering": [
103
+ 1,
104
+ 3,
105
+ 5
106
+ ],
107
+ "parent": "root"
108
+ }
109
+ ],
110
+ "layout": "app-frame",
111
+ "tabs": [
112
+ {
113
+ "key": "overview",
114
+ "title": "Overview",
115
+ "order": 0
116
+ },
117
+ {
118
+ "key": "dev",
119
+ "title": "Implementation",
120
+ "order": 3
121
+ }
122
+ ]
123
+ },
124
+ "mdx": "\n## Overview\n\nFormActionBar is a pattern component that composes a `Group` of action\n`Button`s for form footers. It replaces the need for separate form-page\nwrappers — one `FormActionBar` works in any footer slot:\n`DefaultPage.Footer`, `ModalPage.Footer`, `Drawer.Footer`, `Dialog.Footer`.\n\n## Anatomy\n\n- An accessible group wrapper labelled \"Form actions\" (override via\n `aria-label`).\n- Optional destructive delete button on the leading edge — only rendered when\n `onDelete` is provided.\n- Cancel button (outline) that reverts pending changes.\n- Primary save button (solid) on the trailing edge.\n\nButton order is fixed: delete → cancel → save. This keeps the primary action\nanchored to the same spot across every form and places destructive actions\nfurthest from the primary action to reduce mis-clicks.\n\n## Usage\n\n### When to use\n\n- Any form footer where the user commits or discards pending edits.\n- Detail and full-page create/edit flows (`DefaultPage.Footer`).\n- Modal and drawer forms (`ModalPage.Footer`, `Dialog.Footer`,\n `Drawer.Footer`).\n\n### When not to use\n\n- For a single action (e.g., \"Close\") use a standalone `Button`.\n- For toolbar-style actions unrelated to saving a form, use `Group` directly\n with the buttons you need.\n- For destructive actions that require a separate confirmation step beyond the\n in-place delete button, pair with an `AlertDialog`.\n\n### Do\n\n- Disable save (`isSaveDisabled`) when the form is pristine or has validation\n errors.\n- Drive `isSaveLoading` / `isDeleteLoading` from your async submit flow so all\n actions lock during the mutation.\n- Override labels (`saveLabel`, `cancelLabel`, `deleteLabel`) to match domain\n vocabulary when \"Save\"/\"Cancel\"/\"Delete\" are not precise (e.g., \"Publish\",\n \"Discard\", \"Archive\").\n\n### Don't\n\n- Don't render custom action buttons alongside FormActionBar in the same\n footer — keep the action set predictable.\n- Don't reorder the buttons; delete → cancel → save is load-bearing for muscle\n memory and accessibility.\n- Don't drive `isSaveDisabled` and `isSaveLoading` from the same piece of\n state — they are independent flags representing different UX intents (form\n is invalid / pristine vs. submit is in-flight). Both can be `true`\n simultaneously, but they should come from distinct sources.\n\n### Resources\n\nFor detailed guidance on the individual components that make up this pattern,\nconsult the component guidelines:\n\n- [Button Guidelines](/components/inputs/button) - Button variants, sizes, and\n accessibility\n- [Group Guidelines](/components/layout/group) - Grouping related controls\n- [Storybook](https://nimbus-storybook.vercel.app/?path=/docs/patterns-actions-formactionbar--docs)\n",
125
+ "views": {
126
+ "overview": {
127
+ "mdx": "\n## Overview\n\nFormActionBar is a pattern component that composes a `Group` of action\n`Button`s for form footers. It replaces the need for separate form-page\nwrappers — one `FormActionBar` works in any footer slot:\n`DefaultPage.Footer`, `ModalPage.Footer`, `Drawer.Footer`, `Dialog.Footer`.\n\n## Anatomy\n\n- An accessible group wrapper labelled \"Form actions\" (override via\n `aria-label`).\n- Optional destructive delete button on the leading edge — only rendered when\n `onDelete` is provided.\n- Cancel button (outline) that reverts pending changes.\n- Primary save button (solid) on the trailing edge.\n\nButton order is fixed: delete → cancel → save. This keeps the primary action\nanchored to the same spot across every form and places destructive actions\nfurthest from the primary action to reduce mis-clicks.\n\n## Usage\n\n### When to use\n\n- Any form footer where the user commits or discards pending edits.\n- Detail and full-page create/edit flows (`DefaultPage.Footer`).\n- Modal and drawer forms (`ModalPage.Footer`, `Dialog.Footer`,\n `Drawer.Footer`).\n\n### When not to use\n\n- For a single action (e.g., \"Close\") use a standalone `Button`.\n- For toolbar-style actions unrelated to saving a form, use `Group` directly\n with the buttons you need.\n- For destructive actions that require a separate confirmation step beyond the\n in-place delete button, pair with an `AlertDialog`.\n\n### Do\n\n- Disable save (`isSaveDisabled`) when the form is pristine or has validation\n errors.\n- Drive `isSaveLoading` / `isDeleteLoading` from your async submit flow so all\n actions lock during the mutation.\n- Override labels (`saveLabel`, `cancelLabel`, `deleteLabel`) to match domain\n vocabulary when \"Save\"/\"Cancel\"/\"Delete\" are not precise (e.g., \"Publish\",\n \"Discard\", \"Archive\").\n\n### Don't\n\n- Don't render custom action buttons alongside FormActionBar in the same\n footer — keep the action set predictable.\n- Don't reorder the buttons; delete → cancel → save is load-bearing for muscle\n memory and accessibility.\n- Don't drive `isSaveDisabled` and `isSaveLoading` from the same piece of\n state — they are independent flags representing different UX intents (form\n is invalid / pristine vs. submit is in-flight). Both can be `true`\n simultaneously, but they should come from distinct sources.\n\n### Resources\n\nFor detailed guidance on the individual components that make up this pattern,\nconsult the component guidelines:\n\n- [Button Guidelines](/components/inputs/button) - Button variants, sizes, and\n accessibility\n- [Group Guidelines](/components/layout/group) - Grouping related controls\n- [Storybook](https://nimbus-storybook.vercel.app/?path=/docs/patterns-actions-formactionbar--docs)\n",
128
+ "toc": [
129
+ {
130
+ "value": "Overview",
131
+ "href": "#overview",
132
+ "depth": 2,
133
+ "numbering": [
134
+ 1,
135
+ 1
136
+ ],
137
+ "parent": "root"
138
+ },
139
+ {
140
+ "value": "Anatomy",
141
+ "href": "#anatomy",
142
+ "depth": 2,
143
+ "numbering": [
144
+ 1,
145
+ 2
146
+ ],
147
+ "parent": "root"
148
+ },
149
+ {
150
+ "value": "Usage",
151
+ "href": "#usage",
152
+ "depth": 2,
153
+ "numbering": [
154
+ 1,
155
+ 3
156
+ ],
157
+ "parent": "root"
158
+ },
159
+ {
160
+ "value": "When to use",
161
+ "href": "#when-to-use",
162
+ "depth": 3,
163
+ "numbering": [
164
+ 1,
165
+ 3,
166
+ 1
167
+ ],
168
+ "parent": "root"
169
+ },
170
+ {
171
+ "value": "When not to use",
172
+ "href": "#when-not-to-use",
173
+ "depth": 3,
174
+ "numbering": [
175
+ 1,
176
+ 3,
177
+ 2
178
+ ],
179
+ "parent": "root"
180
+ },
181
+ {
182
+ "value": "Do",
183
+ "href": "#do",
184
+ "depth": 3,
185
+ "numbering": [
186
+ 1,
187
+ 3,
188
+ 3
189
+ ],
190
+ "parent": "root"
191
+ },
192
+ {
193
+ "value": "Don't",
194
+ "href": "#dont",
195
+ "depth": 3,
196
+ "numbering": [
197
+ 1,
198
+ 3,
199
+ 4
200
+ ],
201
+ "parent": "root"
202
+ },
203
+ {
204
+ "value": "Resources",
205
+ "href": "#resources",
206
+ "depth": 3,
207
+ "numbering": [
208
+ 1,
209
+ 3,
210
+ 5
211
+ ],
212
+ "parent": "root"
213
+ }
214
+ ]
215
+ },
216
+ "dev": {
217
+ "mdx": "\n## Comparison: pattern vs manual composition\n\n**With FormActionBar:**\n\n```tsx\n<FormActionBar\n onSave={handleSave}\n onCancel={handleCancel}\n onDelete={handleDelete}\n isSaveDisabled={!isDirty}\n isSaveLoading={isSaving}\n/>\n```\n\n**Manual composition (escape hatch):**\n\n```tsx\n<Group aria-label=\"Form actions\" gap=\"300\">\n <Button\n variant=\"solid\"\n colorPalette=\"critical\"\n isDisabled={isSaving || isDeleting}\n onPress={handleDelete}\n >\n {isDeleting ? <LoadingSpinner /> : \"Delete\"}\n </Button>\n <Button\n variant=\"outline\"\n isDisabled={isSaving || isDeleting}\n onPress={handleCancel}\n >\n Cancel\n </Button>\n <Button\n variant=\"solid\"\n colorPalette=\"primary\"\n isDisabled={!isDirty || isSaving || isDeleting}\n onPress={handleSave}\n >\n {isSaving ? <LoadingSpinner /> : \"Save\"}\n </Button>\n</Group>\n```\n\n### When to use which\n\n**Use FormActionBar when:**\n\n- Building standard forms with save/cancel/delete actions\n- You want consistent button variants and ordering across your app\n- You need built-in i18n defaults for button labels\n- You want to minimize boilerplate\n\n**Use manual composition with Button + Group when:**\n\n- You need a different action set (e.g., submit + reset + preview)\n- You need custom button layouts or non-standard variants\n- You're building highly specialized forms\n\n## Getting started\n\n### Import\n\n```tsx\nimport { FormActionBar, type FormActionBarProps } from \"@commercetools/nimbus\";\n```\n\n### Basic usage\n\nProvide `onSave` and `onCancel` handlers — labels come from i18n defaults.\n\n```jsx live-dev\nconst App = () => (\n <FormActionBar\n onSave={() => console.log(\"Save pressed\")}\n onCancel={() => console.log(\"Cancel pressed\")}\n />\n);\n```\n\n## Usage examples\n\n### With delete action\n\nProvide `onDelete` to render a destructive delete button at the start of the\ngroup.\n\n```jsx live-dev\nconst App = () => (\n <FormActionBar\n onSave={() => console.log(\"Save\")}\n onCancel={() => console.log(\"Cancel\")}\n onDelete={() => console.log(\"Delete\")}\n />\n);\n```\n\n### Disabled save\n\nDisable the save button while the form has validation errors or no pending\nchanges.\n\n```jsx live-dev\nconst App = () => (\n <FormActionBar\n onSave={() => console.log(\"Save\")}\n onCancel={() => console.log(\"Cancel\")}\n isSaveDisabled\n />\n);\n```\n\n### Saving state\n\nShow a loading indicator inside the save button and disable all buttons while\nthe save is in flight.\n\n```jsx live-dev\nconst App = () => (\n <FormActionBar\n onSave={() => {}}\n onCancel={() => {}}\n onDelete={() => {}}\n isSaveLoading\n />\n);\n```\n\n### Deleting state\n\nThe delete button has its own loading state for destructive operations.\n\n```jsx live-dev\nconst App = () => (\n <FormActionBar\n onSave={() => {}}\n onCancel={() => {}}\n onDelete={() => {}}\n isDeleteLoading\n />\n);\n```\n\n### Custom labels\n\nOverride any of the default labels with `saveLabel`, `cancelLabel`,\n`deleteLabel`. When provided, these bypass the i18n defaults.\n\n```jsx live-dev\nconst App = () => (\n <FormActionBar\n onSave={() => {}}\n onCancel={() => {}}\n onDelete={() => {}}\n saveLabel=\"Publish\"\n cancelLabel=\"Discard\"\n deleteLabel=\"Archive\"\n />\n);\n```\n\n## Use inside footers\n\nFormActionBar is designed to drop into any footer slot.\n\n```tsx\n<DefaultPage.Footer>\n <FormActionBar onSave={...} onCancel={...} />\n</DefaultPage.Footer>\n\n<ModalPage.Footer>\n <FormActionBar onSave={...} onCancel={...} cancelSlot=\"close\" />\n</ModalPage.Footer>\n\n<Drawer.Footer>\n <FormActionBar onSave={...} onCancel={...} onDelete={...} />\n</Drawer.Footer>\n\n<Dialog.Footer>\n <FormActionBar onSave={...} onCancel={...} />\n</Dialog.Footer>\n```\n\n## Accessibility\n\n- The `Group` wrapping the buttons has an `aria-label` (defaults to \"Form\n actions\", overridable via the `aria-label` prop)\n- All buttons are fully keyboard accessible via `Tab` / `Shift+Tab`\n- Buttons are disabled (not just visually) while a loading state is active, so\n keyboard and screen-reader users get the same signal as sighted users\n- Button order follows a left-to-right reading order: destructive on the\n start, dismissive in the middle, confirming on the end\n\n## API reference\n\n<PropsTable id=\"FormActionBar\" />\n\n## Testing your implementation\n\nThese examples demonstrate how to test your integration of FormActionBar\ninside a form. The component's own behavior is already tested by Nimbus.\n\n### Verify callbacks\n\n```tsx\nimport { render, screen } from \"@testing-library/react\";\nimport userEvent from \"@testing-library/user-event\";\nimport { FormActionBar } from \"@commercetools/nimbus\";\n\nit(\"submits the form when save is pressed\", async () => {\n const user = userEvent.setup();\n const handleSave = vi.fn();\n\n render(<FormActionBar onSave={handleSave} onCancel={() => {}} />);\n\n await user.click(screen.getByRole(\"button\", { name: /save/i }));\n expect(handleSave).toHaveBeenCalledTimes(1);\n});\n```\n\n### Verify delete button visibility\n\n```tsx\nit(\"hides the delete button when onDelete is not provided\", () => {\n render(<FormActionBar onSave={() => {}} onCancel={() => {}} />);\n\n expect(\n screen.queryByRole(\"button\", { name: /delete/i })\n ).not.toBeInTheDocument();\n});\n```\n\n## Resources\n\n- [Storybook](https://nimbus-storybook.vercel.app/?path=/docs/patterns-actions-formactionbar--docs)\n- [Button Component](/components/inputs/button)\n- [Group Component](/components/layout/group)\n",
218
+ "toc": [
219
+ {
220
+ "value": "Comparison: pattern vs manual composition",
221
+ "href": "#comparison-pattern-vs-manual-composition",
222
+ "depth": 2,
223
+ "numbering": [
224
+ 1,
225
+ 1
226
+ ],
227
+ "parent": "root"
228
+ },
229
+ {
230
+ "value": "When to use which",
231
+ "href": "#when-to-use-which",
232
+ "depth": 3,
233
+ "numbering": [
234
+ 1,
235
+ 1,
236
+ 1
237
+ ],
238
+ "parent": "root"
239
+ },
240
+ {
241
+ "value": "Getting started",
242
+ "href": "#getting-started",
243
+ "depth": 2,
244
+ "numbering": [
245
+ 1,
246
+ 2
247
+ ],
248
+ "parent": "root"
249
+ },
250
+ {
251
+ "value": "Import",
252
+ "href": "#import",
253
+ "depth": 3,
254
+ "numbering": [
255
+ 1,
256
+ 2,
257
+ 1
258
+ ],
259
+ "parent": "root"
260
+ },
261
+ {
262
+ "value": "Basic usage",
263
+ "href": "#basic-usage",
264
+ "depth": 3,
265
+ "numbering": [
266
+ 1,
267
+ 2,
268
+ 2
269
+ ],
270
+ "parent": "root"
271
+ },
272
+ {
273
+ "value": "Usage examples",
274
+ "href": "#usage-examples",
275
+ "depth": 2,
276
+ "numbering": [
277
+ 1,
278
+ 3
279
+ ],
280
+ "parent": "root"
281
+ },
282
+ {
283
+ "value": "With delete action",
284
+ "href": "#with-delete-action",
285
+ "depth": 3,
286
+ "numbering": [
287
+ 1,
288
+ 3,
289
+ 1
290
+ ],
291
+ "parent": "root"
292
+ },
293
+ {
294
+ "value": "Disabled save",
295
+ "href": "#disabled-save",
296
+ "depth": 3,
297
+ "numbering": [
298
+ 1,
299
+ 3,
300
+ 2
301
+ ],
302
+ "parent": "root"
303
+ },
304
+ {
305
+ "value": "Saving state",
306
+ "href": "#saving-state",
307
+ "depth": 3,
308
+ "numbering": [
309
+ 1,
310
+ 3,
311
+ 3
312
+ ],
313
+ "parent": "root"
314
+ },
315
+ {
316
+ "value": "Deleting state",
317
+ "href": "#deleting-state",
318
+ "depth": 3,
319
+ "numbering": [
320
+ 1,
321
+ 3,
322
+ 4
323
+ ],
324
+ "parent": "root"
325
+ },
326
+ {
327
+ "value": "Custom labels",
328
+ "href": "#custom-labels",
329
+ "depth": 3,
330
+ "numbering": [
331
+ 1,
332
+ 3,
333
+ 5
334
+ ],
335
+ "parent": "root"
336
+ },
337
+ {
338
+ "value": "Use inside footers",
339
+ "href": "#use-inside-footers",
340
+ "depth": 2,
341
+ "numbering": [
342
+ 1,
343
+ 4
344
+ ],
345
+ "parent": "root"
346
+ },
347
+ {
348
+ "value": "Accessibility",
349
+ "href": "#accessibility",
350
+ "depth": 2,
351
+ "numbering": [
352
+ 1,
353
+ 5
354
+ ],
355
+ "parent": "root"
356
+ },
357
+ {
358
+ "value": "API reference",
359
+ "href": "#api-reference",
360
+ "depth": 2,
361
+ "numbering": [
362
+ 1,
363
+ 6
364
+ ],
365
+ "parent": "root"
366
+ },
367
+ {
368
+ "value": "Testing your implementation",
369
+ "href": "#testing-your-implementation",
370
+ "depth": 2,
371
+ "numbering": [
372
+ 1,
373
+ 7
374
+ ],
375
+ "parent": "root"
376
+ },
377
+ {
378
+ "value": "Verify callbacks",
379
+ "href": "#verify-callbacks",
380
+ "depth": 3,
381
+ "numbering": [
382
+ 1,
383
+ 7,
384
+ 1
385
+ ],
386
+ "parent": "root"
387
+ },
388
+ {
389
+ "value": "Verify delete button visibility",
390
+ "href": "#verify-delete-button-visibility",
391
+ "depth": 3,
392
+ "numbering": [
393
+ 1,
394
+ 7,
395
+ 2
396
+ ],
397
+ "parent": "root"
398
+ },
399
+ {
400
+ "value": "Resources",
401
+ "href": "#resources",
402
+ "depth": 2,
403
+ "numbering": [
404
+ 1,
405
+ 8
406
+ ],
407
+ "parent": "root"
408
+ }
409
+ ]
410
+ }
411
+ }
412
+ }