@commercetools/nimbus-mcp 0.1.0 → 2.11.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 (453) hide show
  1. package/README.md +63 -14
  2. package/data/docs/route-manifest.json +10998 -0
  3. package/data/docs/routes/components-accessibility-visually-hidden.json +388 -0
  4. package/data/docs/routes/components-accessibility.json +34 -0
  5. package/data/docs/routes/components-buttons-button.json +715 -0
  6. package/data/docs/routes/components-buttons-icon-button.json +852 -0
  7. package/data/docs/routes/components-buttons-icon-toggle-button.json +594 -0
  8. package/data/docs/routes/components-buttons-split-button.json +670 -0
  9. package/data/docs/routes/components-buttons-toggle-button-group.json +722 -0
  10. package/data/docs/routes/components-buttons-toggle-button.json +689 -0
  11. package/data/docs/routes/components-buttons.json +36 -0
  12. package/data/docs/routes/components-data-display-badge.json +555 -0
  13. package/data/docs/routes/components-data-display-card.json +338 -0
  14. package/data/docs/routes/components-data-display-data-table.json +855 -0
  15. package/data/docs/routes/components-data-display-draggable-list.json +596 -0
  16. package/data/docs/routes/components-data-display-table.json +472 -0
  17. package/data/docs/routes/components-data-display-tag-group.json +535 -0
  18. package/data/docs/routes/components-data-display.json +34 -0
  19. package/data/docs/routes/components-feedback-alert.json +696 -0
  20. package/data/docs/routes/components-feedback-dialog.json +682 -0
  21. package/data/docs/routes/components-feedback-drawer.json +600 -0
  22. package/data/docs/routes/components-feedback-loading-spinner.json +415 -0
  23. package/data/docs/routes/components-feedback-progress-bar.json +661 -0
  24. package/data/docs/routes/components-feedback-toast.json +1040 -0
  25. package/data/docs/routes/components-feedback-tooltip.json +510 -0
  26. package/data/docs/routes/components-feedback.json +34 -0
  27. package/data/docs/routes/components-forms-field-errors.json +557 -0
  28. package/data/docs/routes/components-forms-form-field.json +848 -0
  29. package/data/docs/routes/components-forms-group.json +427 -0
  30. package/data/docs/routes/components-forms-localized-field.json +770 -0
  31. package/data/docs/routes/components-forms.json +37 -0
  32. package/data/docs/routes/components-inputs-calendar.json +611 -0
  33. package/data/docs/routes/components-inputs-checkbox.json +774 -0
  34. package/data/docs/routes/components-inputs-combo-box.json +761 -0
  35. package/data/docs/routes/components-inputs-date-input.json +628 -0
  36. package/data/docs/routes/components-inputs-date-picker.json +709 -0
  37. package/data/docs/routes/components-inputs-date-range-picker.json +599 -0
  38. package/data/docs/routes/components-inputs-money-input.json +721 -0
  39. package/data/docs/routes/components-inputs-multiline-text-input.json +611 -0
  40. package/data/docs/routes/components-inputs-number-input.json +647 -0
  41. package/data/docs/routes/components-inputs-password-input.json +576 -0
  42. package/data/docs/routes/components-inputs-radio-input.json +583 -0
  43. package/data/docs/routes/components-inputs-range-calendar.json +607 -0
  44. package/data/docs/routes/components-inputs-rich-text-input.json +599 -0
  45. package/data/docs/routes/components-inputs-scoped-search-input.json +570 -0
  46. package/data/docs/routes/components-inputs-search-input.json +588 -0
  47. package/data/docs/routes/components-inputs-select-input.json +960 -0
  48. package/data/docs/routes/components-inputs-switch.json +720 -0
  49. package/data/docs/routes/components-inputs-text-input.json +566 -0
  50. package/data/docs/routes/components-inputs-time-input.json +775 -0
  51. package/data/docs/routes/components-inputs.json +34 -0
  52. package/data/docs/routes/components-layout-box.json +501 -0
  53. package/data/docs/routes/components-layout-defaultpage.json +748 -0
  54. package/data/docs/routes/components-layout-flex.json +587 -0
  55. package/data/docs/routes/components-layout-grid.json +393 -0
  56. package/data/docs/routes/components-layout-modalpage.json +716 -0
  57. package/data/docs/routes/components-layout-pagecontent.json +673 -0
  58. package/data/docs/routes/components-layout-scrollarea.json +428 -0
  59. package/data/docs/routes/components-layout-separator.json +461 -0
  60. package/data/docs/routes/components-layout-simple-grid.json +519 -0
  61. package/data/docs/routes/components-layout-spacer.json +573 -0
  62. package/data/docs/routes/components-layout-stack.json +481 -0
  63. package/data/docs/routes/components-layout.json +34 -0
  64. package/data/docs/routes/components-media-avatar.json +427 -0
  65. package/data/docs/routes/components-media-icon.json +663 -0
  66. package/data/docs/routes/components-media-image.json +511 -0
  67. package/data/docs/routes/components-media-inline-svg.json +586 -0
  68. package/data/docs/routes/components-media.json +34 -0
  69. package/data/docs/routes/components-navigation-accordion.json +643 -0
  70. package/data/docs/routes/components-navigation-collapsible-motion.json +628 -0
  71. package/data/docs/routes/components-navigation-link.json +554 -0
  72. package/data/docs/routes/components-navigation-menu.json +546 -0
  73. package/data/docs/routes/components-navigation-pagination.json +502 -0
  74. package/data/docs/routes/components-navigation-steps.json +629 -0
  75. package/data/docs/routes/components-navigation-tabnav.json +546 -0
  76. package/data/docs/routes/components-navigation-tabs.json +635 -0
  77. package/data/docs/routes/components-navigation-toolbar.json +549 -0
  78. package/data/docs/routes/components-navigation.json +34 -0
  79. package/data/docs/routes/components-typography-code.json +39 -0
  80. package/data/docs/routes/components-typography-heading.json +402 -0
  81. package/data/docs/routes/components-typography-kbd.json +399 -0
  82. package/data/docs/routes/components-typography-list.json +593 -0
  83. package/data/docs/routes/components-typography-text.json +444 -0
  84. package/data/docs/routes/components-typography.json +34 -0
  85. package/data/docs/routes/components-utilities-nimbus-i18n-provider.json +295 -0
  86. package/data/docs/routes/components-utilities-nimbus-provider.json +663 -0
  87. package/data/docs/routes/components-utilities.json +34 -0
  88. package/data/docs/routes/components.json +33 -0
  89. package/data/docs/routes/home-contribute-adrs-adr0001-consumer-component-apis.json +314 -0
  90. package/data/docs/routes/home-contribute-adrs-adr0002-compound-component-extraction.json +160 -0
  91. package/data/docs/routes/home-contribute-adrs-adr0003-component-lifecycle-states.json +460 -0
  92. package/data/docs/routes/home-contribute-adrs.json +205 -0
  93. package/data/docs/routes/home-contribute-development-setup.json +213 -0
  94. package/data/docs/routes/home-contribute-stats.json +36 -0
  95. package/data/docs/routes/home-contribute.json +36 -0
  96. package/data/docs/routes/home-design-tokens-aspect-ratios.json +36 -0
  97. package/data/docs/routes/home-design-tokens-borders.json +35 -0
  98. package/data/docs/routes/home-design-tokens-colors.json +157 -0
  99. package/data/docs/routes/home-design-tokens-other-animations.json +119 -0
  100. package/data/docs/routes/home-design-tokens-other-blurs.json +36 -0
  101. package/data/docs/routes/home-design-tokens-other-breakpoints.json +61 -0
  102. package/data/docs/routes/home-design-tokens-other-cursors.json +36 -0
  103. package/data/docs/routes/home-design-tokens-other-z-indices.json +39 -0
  104. package/data/docs/routes/home-design-tokens-other.json +35 -0
  105. package/data/docs/routes/home-design-tokens-radii.json +59 -0
  106. package/data/docs/routes/home-design-tokens-shadows.json +57 -0
  107. package/data/docs/routes/home-design-tokens-sizes.json +137 -0
  108. package/data/docs/routes/home-design-tokens-spacing.json +36 -0
  109. package/data/docs/routes/home-design-tokens-typography.json +184 -0
  110. package/data/docs/routes/home-design-tokens.json +34 -0
  111. package/data/docs/routes/home-getting-started-core-concepts.json +301 -0
  112. package/data/docs/routes/home-getting-started-installation.json +621 -0
  113. package/data/docs/routes/home-getting-started-mcp-server-overview.json +139 -0
  114. package/data/docs/routes/home-getting-started-mcp-server-setup.json +316 -0
  115. package/data/docs/routes/home-getting-started-release-process.json +294 -0
  116. package/data/docs/routes/home-getting-started-testing-setup.json +296 -0
  117. package/data/docs/routes/home-playground-markdown.json +638 -0
  118. package/data/docs/routes/home-playground-toc.json +169 -0
  119. package/data/docs/routes/home-playground.json +34 -0
  120. package/data/docs/routes/home-style-props-background.json +236 -0
  121. package/data/docs/routes/home-style-props-border.json +310 -0
  122. package/data/docs/routes/home-style-props-display.json +120 -0
  123. package/data/docs/routes/home-style-props-effects.json +116 -0
  124. package/data/docs/routes/home-style-props-filters.json +396 -0
  125. package/data/docs/routes/home-style-props-flex-and-grid.json +496 -0
  126. package/data/docs/routes/home-style-props-interactivity.json +356 -0
  127. package/data/docs/routes/home-style-props-layout.json +422 -0
  128. package/data/docs/routes/home-style-props-list.json +116 -0
  129. package/data/docs/routes/home-style-props-sizing.json +244 -0
  130. package/data/docs/routes/home-style-props-spacing.json +228 -0
  131. package/data/docs/routes/home-style-props-svg.json +96 -0
  132. package/data/docs/routes/home-style-props-tables.json +116 -0
  133. package/data/docs/routes/home-style-props-transforms.json +216 -0
  134. package/data/docs/routes/home-style-props-transitions.json +216 -0
  135. package/data/docs/routes/home-style-props-typography.json +536 -0
  136. package/data/docs/routes/home-style-props.json +33 -0
  137. package/data/docs/routes/home.json +32 -0
  138. package/data/docs/routes/hooks-usecopytoclipboard.json +76 -0
  139. package/data/docs/routes/hooks-usehotkeys.json +117 -0
  140. package/data/docs/routes/hooks.json +33 -0
  141. package/data/docs/routes/icons.json +32 -0
  142. package/data/docs/routes/patterns-fields-date-range-picker-field.json +393 -0
  143. package/data/docs/routes/patterns-fields-money-input-field.json +415 -0
  144. package/data/docs/routes/patterns-fields-multiline-text-input-field.json +404 -0
  145. package/data/docs/routes/patterns-fields-number-input-field.json +470 -0
  146. package/data/docs/routes/patterns-fields-password-input-field.json +319 -0
  147. package/data/docs/routes/patterns-fields-search-input-field.json +382 -0
  148. package/data/docs/routes/patterns-fields-text-input-field.json +404 -0
  149. package/data/docs/routes/patterns-fields.json +78 -0
  150. package/data/docs/routes/patterns.json +34 -0
  151. package/data/docs/search-index.json +1 -0
  152. package/data/docs/types/Accordion.json +12 -0
  153. package/data/docs/types/AccordionContent.json +286 -0
  154. package/data/docs/types/AccordionHeader.json +891 -0
  155. package/data/docs/types/AccordionHeaderRightContent.json +27 -0
  156. package/data/docs/types/AccordionItem.json +242 -0
  157. package/data/docs/types/AccordionRoot.json +162 -0
  158. package/data/docs/types/Alert.json +12 -0
  159. package/data/docs/types/AlertActions.json +11 -0
  160. package/data/docs/types/AlertDescription.json +118 -0
  161. package/data/docs/types/AlertDismissButton.json +937 -0
  162. package/data/docs/types/AlertRoot.json +42 -0
  163. package/data/docs/types/AlertTitle.json +118 -0
  164. package/data/docs/types/Avatar.json +125 -0
  165. package/data/docs/types/Badge.json +64 -0
  166. package/data/docs/types/Body.json +67 -0
  167. package/data/docs/types/Box.json +85 -0
  168. package/data/docs/types/Button.json +1015 -0
  169. package/data/docs/types/Calendar.json +565 -0
  170. package/data/docs/types/Caption.json +67 -0
  171. package/data/docs/types/Card.json +12 -0
  172. package/data/docs/types/CardContent.json +27 -0
  173. package/data/docs/types/CardHeader.json +27 -0
  174. package/data/docs/types/CardRoot.json +106 -0
  175. package/data/docs/types/Cell.json +227 -0
  176. package/data/docs/types/Checkbox.json +897 -0
  177. package/data/docs/types/Code.json +112 -0
  178. package/data/docs/types/CollapsibleMotionContent.json +35 -0
  179. package/data/docs/types/CollapsibleMotionRoot.json +99 -0
  180. package/data/docs/types/CollapsibleMotionTrigger.json +71 -0
  181. package/data/docs/types/Column.json +101 -0
  182. package/data/docs/types/ColumnGroup.json +101 -0
  183. package/data/docs/types/ColumnHeader.json +193 -0
  184. package/data/docs/types/ComboBoxListBox.json +751 -0
  185. package/data/docs/types/ComboBoxOption.json +672 -0
  186. package/data/docs/types/ComboBoxPopover.json +786 -0
  187. package/data/docs/types/ComboBoxRoot.json +747 -0
  188. package/data/docs/types/ComboBoxSection.json +277 -0
  189. package/data/docs/types/ComboBoxTrigger.json +70 -0
  190. package/data/docs/types/Content.json +33 -0
  191. package/data/docs/types/DataTable.json +596 -0
  192. package/data/docs/types/DataTableBody.json +223 -0
  193. package/data/docs/types/DataTableFooter.json +27 -0
  194. package/data/docs/types/DataTableHeader.json +269 -0
  195. package/data/docs/types/DataTableManager.json +11 -0
  196. package/data/docs/types/DataTableRoot.json +590 -0
  197. package/data/docs/types/DataTableTable.json +271 -0
  198. package/data/docs/types/DateInput.json +792 -0
  199. package/data/docs/types/DatePicker.json +700 -0
  200. package/data/docs/types/DateRangePicker.json +936 -0
  201. package/data/docs/types/DateRangePickerField.json +1047 -0
  202. package/data/docs/types/DefaultPage.json +12 -0
  203. package/data/docs/types/DefaultPageActions.json +27 -0
  204. package/data/docs/types/DefaultPageBackLink.json +213 -0
  205. package/data/docs/types/DefaultPageContent.json +27 -0
  206. package/data/docs/types/DefaultPageFooter.json +27 -0
  207. package/data/docs/types/DefaultPageHeader.json +27 -0
  208. package/data/docs/types/DefaultPageRoot.json +106 -0
  209. package/data/docs/types/DefaultPageSubtitle.json +27 -0
  210. package/data/docs/types/DefaultPageTabNav.json +28 -0
  211. package/data/docs/types/DefaultPageTitle.json +27 -0
  212. package/data/docs/types/DialogBody.json +27 -0
  213. package/data/docs/types/DialogCloseTrigger.json +939 -0
  214. package/data/docs/types/DialogContent.json +27 -0
  215. package/data/docs/types/DialogFooter.json +27 -0
  216. package/data/docs/types/DialogHeader.json +27 -0
  217. package/data/docs/types/DialogRoot.json +138 -0
  218. package/data/docs/types/DialogTitle.json +27 -0
  219. package/data/docs/types/DialogTrigger.json +80 -0
  220. package/data/docs/types/DraggableList.json +12 -0
  221. package/data/docs/types/DraggableListField.json +894 -0
  222. package/data/docs/types/DraggableListItem.json +574 -0
  223. package/data/docs/types/DraggableListRoot.json +745 -0
  224. package/data/docs/types/Drawer.json +12 -0
  225. package/data/docs/types/DrawerBody.json +27 -0
  226. package/data/docs/types/DrawerCloseTrigger.json +939 -0
  227. package/data/docs/types/DrawerContent.json +27 -0
  228. package/data/docs/types/DrawerFooter.json +27 -0
  229. package/data/docs/types/DrawerHeader.json +27 -0
  230. package/data/docs/types/DrawerRoot.json +142 -0
  231. package/data/docs/types/DrawerTitle.json +27 -0
  232. package/data/docs/types/DrawerTrigger.json +80 -0
  233. package/data/docs/types/FieldErrors.getBuiltInMessage.json +11 -0
  234. package/data/docs/types/FieldErrors.getCustomMessage.json +9 -0
  235. package/data/docs/types/FieldErrors.json +109 -0
  236. package/data/docs/types/Flex.json +238 -0
  237. package/data/docs/types/Footer.json +67 -0
  238. package/data/docs/types/FormFieldDescription.json +11 -0
  239. package/data/docs/types/FormFieldError.json +11 -0
  240. package/data/docs/types/FormFieldInfoBox.json +27 -0
  241. package/data/docs/types/FormFieldInput.json +11 -0
  242. package/data/docs/types/FormFieldLabel.json +11 -0
  243. package/data/docs/types/FormFieldRoot.json +148 -0
  244. package/data/docs/types/Grid.json +253 -0
  245. package/data/docs/types/GridProps.json +11 -0
  246. package/data/docs/types/Group.json +143 -0
  247. package/data/docs/types/Header.json +67 -0
  248. package/data/docs/types/Heading.json +109 -0
  249. package/data/docs/types/Icon.json +112 -0
  250. package/data/docs/types/IconButton.json +1019 -0
  251. package/data/docs/types/IconToggleButton.json +787 -0
  252. package/data/docs/types/Image.json +373 -0
  253. package/data/docs/types/Indicator.json +67 -0
  254. package/data/docs/types/InlineSvg.json +98 -0
  255. package/data/docs/types/Item.json +67 -0
  256. package/data/docs/types/Kbd.json +118 -0
  257. package/data/docs/types/Link.json +380 -0
  258. package/data/docs/types/List.json +12 -0
  259. package/data/docs/types/ListIndicator.json +70 -0
  260. package/data/docs/types/ListItem.json +70 -0
  261. package/data/docs/types/ListRoot.json +124 -0
  262. package/data/docs/types/LoadingSpinner.json +87 -0
  263. package/data/docs/types/LocalizedField.json +460 -0
  264. package/data/docs/types/LocalizedStringFormatter.json +9 -0
  265. package/data/docs/types/MakeElementFocusable.json +196 -0
  266. package/data/docs/types/MenuContent.json +111 -0
  267. package/data/docs/types/MenuItem.json +671 -0
  268. package/data/docs/types/MenuRoot.json +670 -0
  269. package/data/docs/types/MenuSection.json +364 -0
  270. package/data/docs/types/MenuSubmenu.json +111 -0
  271. package/data/docs/types/MenuSubmenuTrigger.json +67 -0
  272. package/data/docs/types/MenuTrigger.json +906 -0
  273. package/data/docs/types/ModalPage.json +12 -0
  274. package/data/docs/types/ModalPageActions.json +27 -0
  275. package/data/docs/types/ModalPageContent.json +27 -0
  276. package/data/docs/types/ModalPageFooter.json +27 -0
  277. package/data/docs/types/ModalPageHeader.json +27 -0
  278. package/data/docs/types/ModalPageRoot.json +87 -0
  279. package/data/docs/types/ModalPageSubtitle.json +27 -0
  280. package/data/docs/types/ModalPageTabNav.json +28 -0
  281. package/data/docs/types/ModalPageTitle.json +27 -0
  282. package/data/docs/types/ModalPageTopBar.json +57 -0
  283. package/data/docs/types/MoneyInput.isEmpty.json +40 -0
  284. package/data/docs/types/MoneyInput.json +282 -0
  285. package/data/docs/types/MoneyInputField.json +379 -0
  286. package/data/docs/types/MoneyInputFieldProps.json +9 -0
  287. package/data/docs/types/MultilineTextInput.json +1194 -0
  288. package/data/docs/types/MultilineTextInputField.json +1269 -0
  289. package/data/docs/types/MultilineTextInputFieldProps.json +9 -0
  290. package/data/docs/types/NimbusI18nProvider.json +42 -0
  291. package/data/docs/types/NimbusI18nProviderProps.json +9 -0
  292. package/data/docs/types/NimbusProvider.json +270 -0
  293. package/data/docs/types/NumberInput.json +952 -0
  294. package/data/docs/types/NumberInputField.json +1004 -0
  295. package/data/docs/types/NumberInputFieldProps.json +9 -0
  296. package/data/docs/types/PageContent.json +11 -0
  297. package/data/docs/types/PageContentColumn.json +99 -0
  298. package/data/docs/types/PageContentRoot.json +114 -0
  299. package/data/docs/types/Pagination.json +159 -0
  300. package/data/docs/types/PasswordInput.json +1120 -0
  301. package/data/docs/types/PasswordInputField.json +1216 -0
  302. package/data/docs/types/PasswordInputFieldProps.json +9 -0
  303. package/data/docs/types/ProgressBar.json +280 -0
  304. package/data/docs/types/RadioInputOption.json +550 -0
  305. package/data/docs/types/RadioInputRoot.json +514 -0
  306. package/data/docs/types/RangeCalendar.json +618 -0
  307. package/data/docs/types/RichTextInput.json +134 -0
  308. package/data/docs/types/Root.json +122 -0
  309. package/data/docs/types/Row.json +67 -0
  310. package/data/docs/types/ScopedSearchInput.isEmpty.json +40 -0
  311. package/data/docs/types/ScopedSearchInput.json +253 -0
  312. package/data/docs/types/ScrollArea.json +179 -0
  313. package/data/docs/types/ScrollAreaElementIds.json +9 -0
  314. package/data/docs/types/ScrollAreaProps.json +9 -0
  315. package/data/docs/types/SearchInput.json +1165 -0
  316. package/data/docs/types/SearchInputField.json +1240 -0
  317. package/data/docs/types/Select.json +12 -0
  318. package/data/docs/types/SelectOption.json +572 -0
  319. package/data/docs/types/SelectOptionGroup.json +215 -0
  320. package/data/docs/types/SelectOptions.json +693 -0
  321. package/data/docs/types/SelectRoot.json +926 -0
  322. package/data/docs/types/Separator.json +65 -0
  323. package/data/docs/types/SimpleGrid.json +291 -0
  324. package/data/docs/types/Spacer.json +27 -0
  325. package/data/docs/types/SpacerProps.json +9 -0
  326. package/data/docs/types/SplitButton.json +203 -0
  327. package/data/docs/types/Stack.json +144 -0
  328. package/data/docs/types/Steps.json +12 -0
  329. package/data/docs/types/StepsChangeDetails.json +9 -0
  330. package/data/docs/types/StepsCompletedContent.json +28 -0
  331. package/data/docs/types/StepsCompletedContentProps.json +9 -0
  332. package/data/docs/types/StepsContent.json +43 -0
  333. package/data/docs/types/StepsContentProps.json +9 -0
  334. package/data/docs/types/StepsDescription.json +28 -0
  335. package/data/docs/types/StepsDescriptionProps.json +9 -0
  336. package/data/docs/types/StepsIndicator.json +28 -0
  337. package/data/docs/types/StepsIndicatorProps.json +9 -0
  338. package/data/docs/types/StepsItem.json +43 -0
  339. package/data/docs/types/StepsItemProps.json +9 -0
  340. package/data/docs/types/StepsList.json +28 -0
  341. package/data/docs/types/StepsListProps.json +9 -0
  342. package/data/docs/types/StepsNextTrigger.json +62 -0
  343. package/data/docs/types/StepsNextTriggerProps.json +9 -0
  344. package/data/docs/types/StepsNumber.json +28 -0
  345. package/data/docs/types/StepsNumberProps.json +9 -0
  346. package/data/docs/types/StepsPrevTrigger.json +62 -0
  347. package/data/docs/types/StepsPrevTriggerProps.json +9 -0
  348. package/data/docs/types/StepsRoot.json +183 -0
  349. package/data/docs/types/StepsRootProps.json +11 -0
  350. package/data/docs/types/StepsSeparator.json +28 -0
  351. package/data/docs/types/StepsSeparatorProps.json +9 -0
  352. package/data/docs/types/StepsStatus.json +57 -0
  353. package/data/docs/types/StepsStatusProps.json +9 -0
  354. package/data/docs/types/StepsTitle.json +28 -0
  355. package/data/docs/types/StepsTitleProps.json +9 -0
  356. package/data/docs/types/StepsTrigger.json +47 -0
  357. package/data/docs/types/StepsTriggerProps.json +9 -0
  358. package/data/docs/types/Switch.json +371 -0
  359. package/data/docs/types/TabListProps.json +9 -0
  360. package/data/docs/types/TabNav.json +12 -0
  361. package/data/docs/types/TabNavItem.json +300 -0
  362. package/data/docs/types/TabNavItemProps.json +9 -0
  363. package/data/docs/types/TabNavProps.json +9 -0
  364. package/data/docs/types/TabNavRoot.json +80 -0
  365. package/data/docs/types/TabPanelProps.json +9 -0
  366. package/data/docs/types/TabPanelsProps.json +9 -0
  367. package/data/docs/types/TabProps.json +9 -0
  368. package/data/docs/types/Table.json +9 -0
  369. package/data/docs/types/TableBody.json +67 -0
  370. package/data/docs/types/TableBodyProps.json +9 -0
  371. package/data/docs/types/TableCaption.json +67 -0
  372. package/data/docs/types/TableCaptionProps.json +9 -0
  373. package/data/docs/types/TableCell.json +227 -0
  374. package/data/docs/types/TableCellProps.json +9 -0
  375. package/data/docs/types/TableColumn.json +101 -0
  376. package/data/docs/types/TableColumnGroup.json +101 -0
  377. package/data/docs/types/TableColumnGroupProps.json +9 -0
  378. package/data/docs/types/TableColumnHeader.json +193 -0
  379. package/data/docs/types/TableColumnHeaderProps.json +9 -0
  380. package/data/docs/types/TableColumnProps.json +9 -0
  381. package/data/docs/types/TableFooter.json +67 -0
  382. package/data/docs/types/TableFooterProps.json +9 -0
  383. package/data/docs/types/TableHeader.json +67 -0
  384. package/data/docs/types/TableHeaderProps.json +9 -0
  385. package/data/docs/types/TableRoot.json +365 -0
  386. package/data/docs/types/TableRootProps.json +12 -0
  387. package/data/docs/types/TableRow.json +67 -0
  388. package/data/docs/types/TableRowProps.json +9 -0
  389. package/data/docs/types/TableScrollArea.json +82 -0
  390. package/data/docs/types/TableScrollAreaProps.json +9 -0
  391. package/data/docs/types/Tabs.json +12 -0
  392. package/data/docs/types/TabsList.json +110 -0
  393. package/data/docs/types/TabsPanel.json +112 -0
  394. package/data/docs/types/TabsPanels.json +108 -0
  395. package/data/docs/types/TabsRoot.json +211 -0
  396. package/data/docs/types/TabsTab.json +174 -0
  397. package/data/docs/types/TagGroup.json +12 -0
  398. package/data/docs/types/TagGroupRoot.json +306 -0
  399. package/data/docs/types/TagGroupTag.json +595 -0
  400. package/data/docs/types/TagGroupTagList.json +166 -0
  401. package/data/docs/types/Text.json +119 -0
  402. package/data/docs/types/TextInput.json +1156 -0
  403. package/data/docs/types/TextInputField.json +1263 -0
  404. package/data/docs/types/TimeInput.json +752 -0
  405. package/data/docs/types/ToastAction.json +9 -0
  406. package/data/docs/types/ToastManagerApi.json +9 -0
  407. package/data/docs/types/ToastOptions.json +9 -0
  408. package/data/docs/types/ToastOutlet.json +12 -0
  409. package/data/docs/types/ToastPlacement.json +9 -0
  410. package/data/docs/types/ToastPromiseOptions.json +9 -0
  411. package/data/docs/types/ToastType.json +9 -0
  412. package/data/docs/types/ToastVariant.json +9 -0
  413. package/data/docs/types/ToggleButton.json +789 -0
  414. package/data/docs/types/ToggleButtonGroup.json +9 -0
  415. package/data/docs/types/ToggleButtonGroupButton.json +331 -0
  416. package/data/docs/types/ToggleButtonGroupRoot.json +269 -0
  417. package/data/docs/types/Toolbar.json +176 -0
  418. package/data/docs/types/Tooltip.json +12 -0
  419. package/data/docs/types/TooltipContent.json +372 -0
  420. package/data/docs/types/TooltipRoot.json +179 -0
  421. package/data/docs/types/Trigger.json +69 -0
  422. package/data/docs/types/VisuallyHidden.json +93 -0
  423. package/data/docs/types/__object.json +12 -0
  424. package/data/docs/types/filters.json +11 -0
  425. package/data/docs/types/manifest.json +280 -0
  426. package/data/docs/types/toast.json +234 -0
  427. package/data/docs/types/useColorMode.json +13 -0
  428. package/data/docs/types/useColorModeValue.json +13 -0
  429. package/data/docs/types/useColorScheme.json +12 -0
  430. package/data/docs/types/useLocalizedStringFormatter.json +14 -0
  431. package/data/icons.json +21940 -0
  432. package/data/tokens.json +40061 -0
  433. package/dist/index.js +2516 -17
  434. package/package.json +25 -6
  435. package/dist/data-loader.d.ts +0 -102
  436. package/dist/data-loader.js +0 -104
  437. package/dist/index.d.ts +0 -13
  438. package/dist/server.d.ts +0 -9
  439. package/dist/server.js +0 -22
  440. package/dist/server.spec.d.ts +0 -1
  441. package/dist/server.spec.js +0 -69
  442. package/dist/tools/list-components.d.ts +0 -9
  443. package/dist/tools/list-components.js +0 -42
  444. package/dist/types.d.ts +0 -28
  445. package/dist/types.js +0 -4
  446. package/src/data-loader.ts +0 -226
  447. package/src/index.ts +0 -29
  448. package/src/server.spec.ts +0 -86
  449. package/src/server.ts +0 -28
  450. package/src/tools/list-components.ts +0 -49
  451. package/src/types.ts +0 -31
  452. package/tsconfig.json +0 -14
  453. package/vitest.config.ts +0 -9
@@ -0,0 +1,596 @@
1
+ {
2
+ "meta": {
3
+ "id": "Components-DraggableList",
4
+ "title": "Draggable list",
5
+ "exportName": "DraggableList",
6
+ "description": "The draggable list allows users to easily reorder or manage a sequence of items via a direct drag-and-drop interaction.",
7
+ "lifecycleState": "Stable",
8
+ "order": 999,
9
+ "repoPath": "packages/nimbus/src/components/draggable-list/draggable-list.mdx",
10
+ "menu": [
11
+ "Components",
12
+ "Data Display",
13
+ "Draggable list"
14
+ ],
15
+ "route": "components/data-display/draggable-list",
16
+ "tags": [
17
+ "component",
18
+ "lists",
19
+ "drag and drop",
20
+ "interactive"
21
+ ],
22
+ "toc": [
23
+ {
24
+ "value": "Overview",
25
+ "href": "#overview",
26
+ "depth": 2,
27
+ "numbering": [
28
+ 1,
29
+ 1
30
+ ],
31
+ "parent": "root"
32
+ },
33
+ {
34
+ "value": "Resources",
35
+ "href": "#resources",
36
+ "depth": 3,
37
+ "numbering": [
38
+ 1,
39
+ 1,
40
+ 1
41
+ ],
42
+ "parent": "root"
43
+ },
44
+ {
45
+ "value": "Variables",
46
+ "href": "#variables",
47
+ "depth": 2,
48
+ "numbering": [
49
+ 1,
50
+ 2
51
+ ],
52
+ "parent": "root"
53
+ },
54
+ {
55
+ "value": "Interactions",
56
+ "href": "#interactions",
57
+ "depth": 3,
58
+ "numbering": [
59
+ 1,
60
+ 2,
61
+ 1
62
+ ],
63
+ "parent": "root"
64
+ },
65
+ {
66
+ "value": "Size",
67
+ "href": "#size",
68
+ "depth": 3,
69
+ "numbering": [
70
+ 1,
71
+ 2,
72
+ 2
73
+ ],
74
+ "parent": "root"
75
+ }
76
+ ],
77
+ "layout": "app-frame",
78
+ "tabs": [
79
+ {
80
+ "key": "overview",
81
+ "title": "Overview",
82
+ "order": 0
83
+ },
84
+ {
85
+ "key": "guidelines",
86
+ "title": "Guidelines",
87
+ "order": 2
88
+ },
89
+ {
90
+ "key": "dev",
91
+ "title": "Implementation",
92
+ "order": 3
93
+ },
94
+ {
95
+ "key": "a11y",
96
+ "title": "Accessibility",
97
+ "order": 4
98
+ }
99
+ ]
100
+ },
101
+ "mdx": "\n## Overview\n\nThe draggable list component presents structured, ordered content where the\nsequence itself is meaningful. It uses visual and functional cues to enable\nusers to physically manipulate the list order by dragging an item to a new\ninsertion point, providing immediate visual feedback throughout the process.\n\n### Resources\n\nDeep dive into implementation details and access the Nimbus design library.\n\n[Figma library](https://www.figma.com/design/AvtPX6g7OGGCRvNlatGOIY/NIMBUS-design-system?m=auto&node-id=8571-40126)\n[Storybook](https://nimbus-storybook.vercel.app/?path=/docs/components-draggablelist--docs)\n[React Aria Docs](https://react-spectrum.adobe.com/react-aria/dnd.html)\n\n## Variables\n\nGet familiar with the features.\n\n### Interactions\n\n**Drag, drop and remove**\n\nItems within draggable lists can be lifted and reordered, with an option to have\nitems removable or disabled.\n\n```jsx live\nconst App = () => {\n const items = [\n { key: \"1\", label: \"Food\" },\n { key: \"2\", label: \"Cosmetics\" },\n { key: \"3\", label: \"Furniture\" },\n { key: \"4\", label: \"Electronics\" },\n { key: \"5\", label: \"Clothing\" },\n ];\n\n return (\n <DraggableList.Root\n aria-label=\"Task list\"\n items={items}\n removableItems\n />\n );\n}\n```\n\n**Cross list drag and drop**\n\nWith two sections allowing users to pass items between and allowing for\nreordering. While dragging the new location will highlight conveying to the user\nthat they can drop this item in that section.\n\n```jsx live\nconst App = () => {\n const [leftItems, setLeftItems] = useState([\n { key: \"1\", label: \"Food\" },\n { key: \"2\", label: \"Cosmetics\" },\n { key: \"3\", label: \"Furniture\" },\n { key: \"4\", label: \"Electronics\" },\n { key: \"5\", label: \"Clothing\" },\n ]);\n\n const [rightItems, setRightItems] = useState([\n { key: \"6\", label: \"Sport\" },\n { key: \"7\", label: \"Home\" },\n ]);\n\n return (\n <Flex gap=\"400\">\n <DraggableList.Root\n aria-label=\"Left column\"\n items={leftItems}\n removableItems\n onUpdateItems={setLeftItems}\n />\n <DraggableList.Root\n aria-label=\"Right column\"\n items={rightItems}\n removableItems\n onUpdateItems={setRightItems}\n />\n </Flex>\n );\n}\n```\n\n### Size\n\n**Size variants**\n\nDraggable list supports two sizes. Use the smaller size to show a more compact\nexperience.\n\n```jsx live\nconst App = () => {\n const items = [\n { key: \"1\", label: \"Small food\" },\n ];\n\n const mediumItems = [\n { key: \"1\", label: \"Medium food\" },\n ];\n\n return (\n <Stack direction=\"horizontal\" gap=\"800\">\n <DraggableList.Root\n aria-label=\"Small food list\"\n items={items}\n size=\"sm\"\n />\n <DraggableList.Root\n aria-label=\"Medium food list\"\n items={mediumItems}\n size=\"md\"\n />\n </Stack>\n );\n}\n```\n\n",
102
+ "views": {
103
+ "overview": {
104
+ "mdx": "\n## Overview\n\nThe draggable list component presents structured, ordered content where the\nsequence itself is meaningful. It uses visual and functional cues to enable\nusers to physically manipulate the list order by dragging an item to a new\ninsertion point, providing immediate visual feedback throughout the process.\n\n### Resources\n\nDeep dive into implementation details and access the Nimbus design library.\n\n[Figma library](https://www.figma.com/design/AvtPX6g7OGGCRvNlatGOIY/NIMBUS-design-system?m=auto&node-id=8571-40126)\n[Storybook](https://nimbus-storybook.vercel.app/?path=/docs/components-draggablelist--docs)\n[React Aria Docs](https://react-spectrum.adobe.com/react-aria/dnd.html)\n\n## Variables\n\nGet familiar with the features.\n\n### Interactions\n\n**Drag, drop and remove**\n\nItems within draggable lists can be lifted and reordered, with an option to have\nitems removable or disabled.\n\n```jsx live\nconst App = () => {\n const items = [\n { key: \"1\", label: \"Food\" },\n { key: \"2\", label: \"Cosmetics\" },\n { key: \"3\", label: \"Furniture\" },\n { key: \"4\", label: \"Electronics\" },\n { key: \"5\", label: \"Clothing\" },\n ];\n\n return (\n <DraggableList.Root\n aria-label=\"Task list\"\n items={items}\n removableItems\n />\n );\n}\n```\n\n**Cross list drag and drop**\n\nWith two sections allowing users to pass items between and allowing for\nreordering. While dragging the new location will highlight conveying to the user\nthat they can drop this item in that section.\n\n```jsx live\nconst App = () => {\n const [leftItems, setLeftItems] = useState([\n { key: \"1\", label: \"Food\" },\n { key: \"2\", label: \"Cosmetics\" },\n { key: \"3\", label: \"Furniture\" },\n { key: \"4\", label: \"Electronics\" },\n { key: \"5\", label: \"Clothing\" },\n ]);\n\n const [rightItems, setRightItems] = useState([\n { key: \"6\", label: \"Sport\" },\n { key: \"7\", label: \"Home\" },\n ]);\n\n return (\n <Flex gap=\"400\">\n <DraggableList.Root\n aria-label=\"Left column\"\n items={leftItems}\n removableItems\n onUpdateItems={setLeftItems}\n />\n <DraggableList.Root\n aria-label=\"Right column\"\n items={rightItems}\n removableItems\n onUpdateItems={setRightItems}\n />\n </Flex>\n );\n}\n```\n\n### Size\n\n**Size variants**\n\nDraggable list supports two sizes. Use the smaller size to show a more compact\nexperience.\n\n```jsx live\nconst App = () => {\n const items = [\n { key: \"1\", label: \"Small food\" },\n ];\n\n const mediumItems = [\n { key: \"1\", label: \"Medium food\" },\n ];\n\n return (\n <Stack direction=\"horizontal\" gap=\"800\">\n <DraggableList.Root\n aria-label=\"Small food list\"\n items={items}\n size=\"sm\"\n />\n <DraggableList.Root\n aria-label=\"Medium food list\"\n items={mediumItems}\n size=\"md\"\n />\n </Stack>\n );\n}\n```\n\n",
105
+ "toc": [
106
+ {
107
+ "value": "Overview",
108
+ "href": "#overview",
109
+ "depth": 2,
110
+ "numbering": [
111
+ 1,
112
+ 1
113
+ ],
114
+ "parent": "root"
115
+ },
116
+ {
117
+ "value": "Resources",
118
+ "href": "#resources",
119
+ "depth": 3,
120
+ "numbering": [
121
+ 1,
122
+ 1,
123
+ 1
124
+ ],
125
+ "parent": "root"
126
+ },
127
+ {
128
+ "value": "Variables",
129
+ "href": "#variables",
130
+ "depth": 2,
131
+ "numbering": [
132
+ 1,
133
+ 2
134
+ ],
135
+ "parent": "root"
136
+ },
137
+ {
138
+ "value": "Interactions",
139
+ "href": "#interactions",
140
+ "depth": 3,
141
+ "numbering": [
142
+ 1,
143
+ 2,
144
+ 1
145
+ ],
146
+ "parent": "root"
147
+ },
148
+ {
149
+ "value": "Size",
150
+ "href": "#size",
151
+ "depth": 3,
152
+ "numbering": [
153
+ 1,
154
+ 2,
155
+ 2
156
+ ],
157
+ "parent": "root"
158
+ }
159
+ ]
160
+ },
161
+ "a11y": {
162
+ "mdx": "\n## Accessibility\n\nAccessibility ensures that digital content and functionality are usable by\neveryone, including people with disabilities, by addressing visual, auditory,\ncognitive, and physical limitations.\n\n```jsx live\nconst App = () => {\n const [leftItems, setLeftItems] = useState([\n { key: \"1\", label: \"Food\" },\n { key: \"2\", label: \"Cosmetics\" },\n { key: \"3\", label: \"Furniture\" },\n { key: \"4\", label: \"Electronics\" },\n { key: \"5\", label: \"Clothing\" },\n ]);\n\n const [rightItems, setRightItems] = useState([\n { key: \"6\", label: \"Sport\" },\n { key: \"7\", label: \"Home\" },\n ]);\n\n return (\n <Flex gap=\"400\">\n <DraggableList.Root\n aria-label=\"Left column\"\n items={leftItems}\n onUpdateItems={setLeftItems}\n />\n <DraggableList.Root\n aria-label=\"Right column\"\n items={rightItems}\n onUpdateItems={setRightItems}\n />\n </Flex>\n );\n}\n```\n\n### Accessibility standards\n\n- **Keyboard reordering is essential:** Since drag-and-drop is a complex pointer\n gesture, a keyboard-accessible method for reordering is mandatory (WCAG 2.5.1\n Pointer Gestures). This usually involves providing \"Move Up\" and \"Move Down\"\n buttons or a position input field next to the list item.\n- **ARIA roles:** Use appropriate ARIA roles to convey the list and item\n structure to screen readers. For interactive lists, `role=\"listbox\"` for the\n container and `role=\"option\"` for items might be suitable, or use standard\n semantic lists (`<ul>`, `<li>`) enhanced with ARIA attributes.\n- **Focus management:** Ensure the drag handle or the dedicated keyboard buttons\n are included in the Tab order and have clear focus indicators.\n- **Status updates:** Announce the result of the reordering to screen reader\n users using an `aria-live` region (e.g., \"Item moved to position 4\").\n",
163
+ "toc": [
164
+ {
165
+ "value": "Accessibility",
166
+ "href": "#accessibility",
167
+ "depth": 2,
168
+ "numbering": [
169
+ 1,
170
+ 1
171
+ ],
172
+ "parent": "root"
173
+ },
174
+ {
175
+ "value": "Accessibility standards",
176
+ "href": "#accessibility-standards",
177
+ "depth": 3,
178
+ "numbering": [
179
+ 1,
180
+ 1,
181
+ 1
182
+ ],
183
+ "parent": "root"
184
+ }
185
+ ]
186
+ },
187
+ "dev": {
188
+ "mdx": "\n## Getting started\n\n### Import\n\n```tsx\nimport { DraggableList, type DraggableListRootProps } from '@commercetools/nimbus';\n```\n\n### Basic usage\n\nThe simplest implementation uses an array of items with `key` and `label` properties. The component automatically handles drag-and-drop reordering:\n\n```jsx live-dev\nconst App = () => {\n const items = [\n { key: '1', label: 'First item' },\n { key: '2', label: 'Second item' },\n { key: '3', label: 'Third item' },\n ];\n\n return (\n <DraggableList.Root\n items={items}\n aria-label=\"Task list\"\n />\n );\n}\n```\n\n**Important:** You must provide either an `aria-label` or `aria-labelledby` prop for accessibility. The drag-and-drop functionality requires an accessible label.\n\n## Working with React Aria drag-and-drop\n\nThe DraggableList relies on React Aria Components' GridList and drag-and-drop hooks for accessible drag-and-drop functionality. This integration provides keyboard navigation, screen reader support, and touch-friendly interactions.\n\n### Drag-and-drop behavior\n\nReact Aria's drag-and-drop system provides:\n- **Visual feedback**: Items show grab cursors and drag previews during interactions\n- **Drop indicators**: Visual cues show where items will be placed\n- **Move operations**: Items are moved (not copied) between lists\n- **Keyboard support**: Full keyboard navigation for drag-and-drop\n\n### Data format\n\nItems being dragged use a custom format (`nimbus-draggable-list-item`) that allows items to be dragged between multiple DraggableList instances while preventing drops from external sources.\n\n### State management\n\nThe component uses React Stately's `useListData` hook internally to manage item state and reordering operations. This provides:\n- Efficient list operations (insert, remove, move)\n- Selection state management\n- Synchronization with external state via `onUpdateItems`\n\n> [!TIP]\\\n> See [React Aria Drag and Drop](https://react-spectrum.adobe.com/react-aria/dnd.html) for complete API reference and advanced usage.\n\n## Usage examples\n\n### Size options\n\nThe `sm` and `md` size variants are available to match your interface density:\n\n```jsx live-dev\nconst App = () => {\n const [smallItems, setSmallItems] = useState([\n { key: '1', label: 'Task 1' },\n { key: '2', label: 'Task 2' },\n ]);\n\n const [mediumItems, setMediumItems] = useState([\n { key: '3', label: 'Task 3' },\n { key: '4', label: 'Task 4' },\n ]);\n\n return (\n <Stack direction=\"row\" gap=\"400\">\n <DraggableList.Root\n items={smallItems}\n onUpdateItems={setSmallItems}\n size=\"sm\"\n aria-label=\"Small list\"\n />\n <DraggableList.Root\n items={mediumItems}\n onUpdateItems={setMediumItems}\n size=\"md\"\n aria-label=\"Medium list\"\n />\n </Stack>\n );\n}\n```\n\n### Item removal\n\nEnable item removal by setting `removableItems={true}`. When items are removed, the `onUpdateItems` callback receives the updated list:\n\n```jsx live-dev\nconst App = () => {\n const [items, setItems] = useState([\n { key: '1', label: 'Item 1' },\n { key: '2', label: 'Item 2' },\n { key: '3', label: 'Item 3' },\n ]);\n\n return (\n <Stack direction=\"column\" gap=\"400\">\n <DraggableList.Root\n items={items}\n removableItems\n onUpdateItems={setItems}\n aria-label=\"Removable items\"\n />\n <Text fontSize=\"sm\">Items: {items.length}</Text>\n </Stack>\n );\n}\n```\n\n### Custom item rendering\n\nFor items without `key` and `label` properties, or when you need custom rendering, provide a render function as children:\n\n```jsx live-dev\nconst App = () => {\n const items = [\n { id: 'task-1', title: 'Design mockups', priority: 'High' },\n { id: 'task-2', title: 'Write tests', priority: 'Medium' },\n { id: 'task-3', title: 'Review PR', priority: 'Low' },\n ];\n\n return (\n <DraggableList.Root\n items={items}\n getKey={(item) => item.id}\n aria-label=\"Task priorities\"\n >\n {(item) => (\n <DraggableList.Item id={item.id}>\n <Stack direction=\"column\" gap=\"100\" padding=\"200\">\n <Text fontWeight=\"500\">{item.title}</Text>\n <Text fontSize=\"sm\" color=\"fg.muted\">\n Priority: {item.priority}\n </Text>\n </Stack>\n </DraggableList.Item>\n )}\n </DraggableList.Root>\n );\n}\n```\n\n**Note:** When using custom rendering, you must provide a `getKey` function to extract unique keys from your items. Wrap this function in `useCallback` to prevent unnecessary re-synchronization:\n\n```tsx\nconst getKey = useCallback((item) => item.id, []);\n```\n\n### Controlled updates\n\nUse the `onUpdateItems` callback to track changes when items are reordered or removed:\n\n```jsx live-dev\nconst App = () => {\n const [items, setItems] = useState([\n { key: '1', label: 'High priority' },\n { key: '2', label: 'Medium priority' },\n { key: '3', label: 'Low priority' },\n ]);\n\n const [updateCount, setUpdateCount] = useState(0);\n\n const handleUpdateItems = useCallback((updatedItems) => {\n setItems(updatedItems);\n setUpdateCount(prev => prev + 1);\n }, []);\n\n return (\n <Stack direction=\"column\" gap=\"400\">\n <DraggableList.Root\n items={items}\n onUpdateItems={handleUpdateItems}\n aria-label=\"Priority list\"\n />\n <Text fontSize=\"sm\">\n Order: {items.map(item => item.label).join(', ')}\n </Text>\n <Text fontSize=\"sm\">Updates: {updateCount}</Text>\n </Stack>\n );\n}\n```\n\n### Custom empty state\n\nCustomize the message displayed when the list is empty:\n\n```jsx live-dev\nconst App = () => {\n const [items, setItems] = useState([]);\n\n return (\n <Stack direction=\"column\" gap=\"400\">\n <DraggableList.Root\n items={items}\n onUpdateItems={setItems}\n renderEmptyState=\"No tasks yet. Add some items!\"\n aria-label=\"Empty task list\"\n />\n <Button\n size=\"md\"\n onClick={() => {\n const newItem = {\n key: Date.now().toString(),\n label: `Task ${items.length + 1}`,\n };\n setItems([...items, newItem]);\n }}\n >\n Add Task\n </Button>\n </Stack>\n );\n}\n```\n\n### Multiple lists\n\nItems can be dragged between multiple DraggableList instances:\n\n```jsx live-dev\nconst App = () => {\n const [todoItems, setTodoItems] = useState([\n { key: '1', label: 'Design homepage' },\n { key: '2', label: 'Write docs' },\n ]);\n\n const [doneItems, setDoneItems] = useState([\n { key: '3', label: 'Setup project' },\n ]);\n\n return (\n <Stack direction=\"row\" gap=\"400\">\n <Stack direction=\"column\" gap=\"200\">\n <Text fontWeight=\"500\">To Do</Text>\n <DraggableList.Root\n items={todoItems}\n onUpdateItems={setTodoItems}\n aria-label=\"Todo list\"\n />\n </Stack>\n <Stack direction=\"column\" gap=\"200\">\n <Text fontWeight=\"500\">Done</Text>\n <DraggableList.Root\n items={doneItems}\n onUpdateItems={setDoneItems}\n aria-label=\"Done list\"\n />\n </Stack>\n </Stack>\n );\n}\n```\n\n### TypeScript generics\n\nUse TypeScript generics to ensure type safety with your custom item data:\n\n```jsx live-dev\nconst App = () => {\n type TaskItem = {\n key: string;\n label: string;\n assignee: string;\n status: 'pending' | 'active' | 'done';\n };\n\n const [tasks, setTasks] = useState<TaskItem[]>([\n { key: '1', label: 'Review code', assignee: 'Alice', status: 'active' },\n { key: '2', label: 'Write tests', assignee: 'Bob', status: 'pending' },\n ]);\n\n return (\n <DraggableList.Root<TaskItem>\n items={tasks}\n onUpdateItems={setTasks}\n aria-label=\"Team tasks\"\n >\n {(item) => (\n <DraggableList.Item id={item.key}>\n <Stack direction=\"column\" gap=\"100\" padding=\"200\">\n <Text fontWeight=\"500\">{item.label}</Text>\n <Text fontSize=\"sm\" color=\"fg.muted\">\n {item.assignee} • {item.status}\n </Text>\n </Stack>\n </DraggableList.Item>\n )}\n </DraggableList.Root>\n );\n}\n```\n\n## Component requirements\n\n## Accessibility\n\nThe DraggableList handles most accessibility requirements internally through React Aria's GridList component. However, you must always provide an accessible label using one of these methods:\n\n**Using DraggableList.Field (recommended):**\n\n```tsx\n<DraggableList.Field\n label={msg.format(labelMessage)}\n items={items}\n/>\n```\n\n**Using aria-labelledby:**\n\n```tsx\n<label id=\"list-label\">\n {msg.format(labelMessage)}\n</label>\n<DraggableList.Root\n aria-labelledby=\"list-label\"\n items={items}\n/>\n```\n\n**Using aria-label:**\n\n```tsx\n<DraggableList.Root\n aria-label={msg.format(labelMessage)}\n items={items}\n/>\n```\n\nIf your use case requires tracking and analytics for this component, it is good practice to add a **persistent**, **unique** id to the component:\n\n```tsx\nconst PERSISTENT_ID = \"example-draggable-list\";\n\nexport const Example = () => (\n <DraggableList.Root\n id={PERSISTENT_ID}\n aria-label=\"Task list\"\n items={items}\n />\n);\n```\n\n#### Keyboard navigation\n\nThe component supports full keyboard interaction:\n- `Tab` / `Shift+Tab`: Move focus between items and drag handles\n- `Arrow keys`: Navigate between items in the list\n- `Enter` / `Space`: Activate drag mode for the focused item\n- `Arrow keys` (during drag): Move the item up or down in the list\n- `Enter` / `Space` (during drag): Drop the item at the current position\n- `Escape` (during drag): Cancel the drag operation\n\n## API reference\n\n<PropsTable id=\"DraggableList\" />\n\n## Common patterns\n\n### Form integration with validation\n\nIntegrate DraggableList with form libraries like Formik for validated priority lists:\n\n```jsx live-dev\nconst App = () => {\n const [items, setItems] = useState([\n { key: '1', label: 'Critical bug' },\n { key: '2', label: 'Feature request' },\n { key: '3', label: 'Documentation' },\n ]);\n\n const [touched, setTouched] = useState(false);\n const hasMinimumItems = items.length >= 2;\n\n const handleUpdateItems = useCallback((updated) => {\n setItems(updated);\n setTouched(true);\n }, []);\n\n return (\n <Stack direction=\"column\" gap=\"400\">\n <DraggableList.Field\n label=\"Priority Order\"\n description=\"Drag to reorder by priority\"\n items={items}\n onUpdateItems={handleUpdateItems}\n error={touched && !hasMinimumItems ? 'At least 2 items required' : undefined}\n isInvalid={touched && !hasMinimumItems}\n aria-label=\"Priority list\"\n />\n <Text fontSize=\"sm\" color={hasMinimumItems ? 'positive.11' : 'critical.11'}>\n {hasMinimumItems ? '✓ Valid' : '✗ Invalid: Add more items'}\n </Text>\n </Stack>\n );\n}\n```\n\n### Dynamic item management\n\nAllow users to add, remove, and reorder items dynamically:\n\n```jsx live-dev\nconst App = () => {\n const [items, setItems] = useState([\n { key: '1', label: 'Task 1' },\n { key: '2', label: 'Task 2' },\n ]);\n const [nextId, setNextId] = useState(3);\n\n const addItem = () => {\n const newItem = {\n key: nextId.toString(),\n label: `Task ${nextId}`,\n };\n setItems([...items, newItem]);\n setNextId(nextId + 1);\n };\n\n return (\n <Stack direction=\"column\" gap=\"400\">\n <DraggableList.Root\n items={items}\n removableItems\n onUpdateItems={setItems}\n aria-label=\"Task manager\"\n />\n <Button size=\"md\" onClick={addItem}>\n Add Task\n </Button>\n </Stack>\n );\n}\n```\n\n### Synchronized state with external storage\n\nSync list order with external state management or API:\n\n```jsx live-dev\nconst App = () => {\n const [items, setItems] = useState([\n { key: '1', label: 'Design system' },\n { key: '2', label: 'API integration' },\n { key: '3', label: 'Testing' },\n ]);\n\n const [lastSaved, setLastSaved] = useState('Not saved');\n\n const handleUpdateItems = useCallback((updatedItems) => {\n setItems(updatedItems);\n\n // Simulate API save\n setTimeout(() => {\n setLastSaved(new Date().toLocaleTimeString());\n }, 500);\n }, []);\n\n return (\n <Stack direction=\"column\" gap=\"400\">\n <DraggableList.Root\n items={items}\n onUpdateItems={handleUpdateItems}\n aria-label=\"Project phases\"\n />\n <Text fontSize=\"sm\" color=\"fg.muted\">\n Last saved: {lastSaved}\n </Text>\n </Stack>\n );\n}\n```\n\n## Testing your implementation\n\nThese examples demonstrate how to test your implementation when using DraggableList within your application. As the component's internal functionality is already tested by Nimbus, these patterns help you verify your integration and application-specific logic.\n\n### Basic Rendering Tests\n\nVerify the component renders with expected elements and items\n\n```tsx\nimport { describe, it, expect, vi } from \"vitest\";\nimport { render, screen } from \"@testing-library/react\";\nimport userEvent from \"@testing-library/user-event\";\nimport { DraggableList, NimbusProvider } from \"@commercetools/nimbus\";\n\ndescribe(\"DraggableList - Basic rendering\", () => {\n it(\"renders list with items\", () => {\n render(\n <NimbusProvider>\n <DraggableList.Root items={mockItems} aria-label=\"Task list\" />\n </NimbusProvider>\n );\n\n // Verify list renders with grid role\n expect(\n screen.getByRole(\"grid\", { name: /task list/i })\n ).toBeInTheDocument();\n\n // Verify all items are rendered\n expect(screen.getAllByRole(\"row\")).toHaveLength(mockItems.length);\n });\n\n it(\"renders items with accessible labels\", () => {\n render(\n <NimbusProvider>\n <DraggableList.Root items={mockItems} aria-label=\"Test list\" />\n </NimbusProvider>\n );\n\n mockItems.forEach((item) => {\n expect(screen.getByLabelText(item.label)).toBeInTheDocument();\n });\n });\n});\n```\n\n### Size Variant Tests\n\nVerify different size variants render correctly\n\n```tsx\nimport { describe, it, expect, vi } from \"vitest\";\nimport { render, screen } from \"@testing-library/react\";\nimport userEvent from \"@testing-library/user-event\";\nimport { DraggableList, NimbusProvider } from \"@commercetools/nimbus\";\n\ndescribe(\"DraggableList - Size variants\", () => {\n it(\"renders with small size\", () => {\n const items = [{ key: \"1\", label: \"Item 1\" }];\n\n render(\n <NimbusProvider>\n <DraggableList.Root items={items} size=\"sm\" aria-label=\"Small list\" />\n </NimbusProvider>\n );\n\n const grid = screen.getByRole(\"grid\", { name: /small list/i });\n expect(grid).toBeInTheDocument();\n });\n\n it(\"renders with medium size\", () => {\n const items = [{ key: \"1\", label: \"Item 1\" }];\n\n render(\n <NimbusProvider>\n <DraggableList.Root items={items} size=\"md\" aria-label=\"Medium list\" />\n </NimbusProvider>\n );\n\n expect(screen.getByRole(\"grid\")).toBeInTheDocument();\n });\n});\n```\n\n### Item Removal Tests\n\nTest removable items functionality\n\n```tsx\nimport { describe, it, expect, vi } from \"vitest\";\nimport { render, screen } from \"@testing-library/react\";\nimport userEvent from \"@testing-library/user-event\";\nimport { DraggableList, NimbusProvider } from \"@commercetools/nimbus\";\n\ndescribe(\"DraggableList - Item removal\", () => {\n it(\"calls onUpdateItems when item is removed\", async () => {\n const user = userEvent.setup();\n const handleUpdateItems = vi.fn();\n const items = [\n { key: \"1\", label: \"Item 1\" },\n { key: \"2\", label: \"Item 2\" },\n { key: \"3\", label: \"Item 3\" },\n ];\n\n render(\n <NimbusProvider>\n <DraggableList.Root\n items={items}\n removableItems\n onUpdateItems={handleUpdateItems}\n aria-label=\"Test list\"\n />\n </NimbusProvider>\n );\n\n // Find and click remove button for first item\n const removeButtons = screen.getAllByRole(\"button\", {\n name: /remove/i,\n });\n await user.click(removeButtons[0]);\n\n // Verify callback was called with updated list\n // Note: The callback receives the updated items array\n expect(handleUpdateItems).toHaveBeenCalled();\n const lastCall =\n handleUpdateItems.mock.calls[handleUpdateItems.mock.calls.length - 1][0];\n expect(lastCall.length).toBeLessThan(items.length);\n });\n});\n```\n\n### Controlled Mode Tests\n\nTest controlled state management with onUpdateItems\n\n```tsx\nimport { describe, it, expect, vi } from \"vitest\";\nimport { render, screen } from \"@testing-library/react\";\nimport userEvent from \"@testing-library/user-event\";\nimport { DraggableList, NimbusProvider } from \"@commercetools/nimbus\";\n\ndescribe(\"DraggableList - Controlled mode\", () => {\n it(\"calls onUpdateItems when items are reordered\", () => {\n const handleUpdateItems = vi.fn();\n const items = [\n { key: \"1\", label: \"Item 1\" },\n { key: \"2\", label: \"Item 2\" },\n ];\n\n render(\n <NimbusProvider>\n <DraggableList.Root\n items={items}\n onUpdateItems={handleUpdateItems}\n aria-label=\"Test list\"\n />\n </NimbusProvider>\n );\n\n // Test that the callback is provided\n expect(handleUpdateItems).toBeDefined();\n });\n\n it(\"calls onUpdateItems when items change\", () => {\n const handleUpdate = vi.fn();\n const items = [\n { key: \"1\", label: \"Item 1\" },\n { key: \"2\", label: \"Item 2\" },\n ];\n\n render(\n <NimbusProvider>\n <DraggableList.Root\n items={items}\n onUpdateItems={handleUpdate}\n aria-label=\"Test list\"\n />\n </NimbusProvider>\n );\n\n // Note: Testing actual drag-and-drop interactions requires browser-based testing\n // (like Storybook tests). These tests verify your integration patterns.\n expect(screen.getByRole(\"grid\")).toBeInTheDocument();\n });\n});\n```\n\n### Custom Rendering Tests\n\nTest custom item rendering with render functions\n\n```tsx\nimport { describe, it, expect, vi } from \"vitest\";\nimport { render, screen } from \"@testing-library/react\";\nimport userEvent from \"@testing-library/user-event\";\nimport { DraggableList, NimbusProvider } from \"@commercetools/nimbus\";\n\ndescribe(\"DraggableList - Custom rendering\", () => {\n it(\"renders items using custom render function\", () => {\n const items = [\n { id: \"1\", title: \"Task 1\", priority: \"High\" },\n { id: \"2\", title: \"Task 2\", priority: \"Low\" },\n ];\n\n render(\n <NimbusProvider>\n <DraggableList.Root\n items={items}\n getKey={(item) => item.id}\n aria-label=\"Custom rendered list\"\n >\n {(item) => (\n <DraggableList.Item id={item.id} textValue={item.title}>\n <div>\n <div>{item.title}</div>\n <div>Priority: {item.priority}</div>\n </div>\n </DraggableList.Item>\n )}\n </DraggableList.Root>\n </NimbusProvider>\n );\n\n expect(screen.getByText(\"Task 1\")).toBeInTheDocument();\n expect(screen.getByText(\"Priority: High\")).toBeInTheDocument();\n expect(screen.getByText(\"Task 2\")).toBeInTheDocument();\n });\n});\n```\n\n### Controlled Mode Tests\n\nTest controlled updates with onUpdateItems callback\n\n```tsx\nimport { describe, it, expect, vi } from \"vitest\";\nimport { render, screen } from \"@testing-library/react\";\nimport userEvent from \"@testing-library/user-event\";\nimport { DraggableList, NimbusProvider } from \"@commercetools/nimbus\";\n\ndescribe(\"DraggableList - Controlled updates\", () => {\n it(\"calls onUpdateItems when items are reordered\", async () => {\n const items = [\n { key: \"1\", label: \"Item 1\" },\n { key: \"2\", label: \"Item 2\" },\n ];\n const handleUpdate = vi.fn();\n\n render(\n <NimbusProvider>\n <DraggableList.Root\n items={items}\n onUpdateItems={handleUpdate}\n aria-label=\"Controlled list\"\n />\n </NimbusProvider>\n );\n\n // Note: Full drag-and-drop testing requires complex keyboard/mouse simulation\n // This test verifies the callback is properly connected\n // The callback may be called on mount for internal state synchronization\n expect(screen.getByRole(\"grid\")).toBeInTheDocument();\n });\n\n it(\"syncs external state changes to list\", () => {\n const { rerender } = render(\n <NimbusProvider>\n <DraggableList.Root\n items={[{ key: \"1\", label: \"Item 1\" }]}\n aria-label=\"Synced list\"\n />\n </NimbusProvider>\n );\n\n expect(screen.getByText(\"Item 1\")).toBeInTheDocument();\n\n // Update items prop\n rerender(\n <NimbusProvider>\n <DraggableList.Root\n items={[\n { key: \"1\", label: \"Item 1\" },\n { key: \"2\", label: \"Item 2\" },\n ]}\n aria-label=\"Synced list\"\n />\n </NimbusProvider>\n );\n\n expect(screen.getByText(\"Item 2\")).toBeInTheDocument();\n });\n});\n```\n\n### Empty State Tests\n\nTest empty state rendering and customization\n\n```tsx\nimport { describe, it, expect, vi } from \"vitest\";\nimport { render, screen } from \"@testing-library/react\";\nimport userEvent from \"@testing-library/user-event\";\nimport { DraggableList, NimbusProvider } from \"@commercetools/nimbus\";\n\ndescribe(\"DraggableList - Empty state\", () => {\n it(\"displays default empty state when list has no items\", () => {\n render(\n <NimbusProvider>\n <DraggableList.Root items={[]} aria-label=\"Empty list\" />\n </NimbusProvider>\n );\n\n expect(screen.getByText(/drop items here/i)).toBeInTheDocument();\n });\n\n it(\"displays custom empty state message\", () => {\n render(\n <NimbusProvider>\n <DraggableList.Root\n items={[]}\n renderEmptyState=\"No tasks available\"\n aria-label=\"Empty list\"\n />\n </NimbusProvider>\n );\n\n expect(screen.getByText(\"No tasks available\")).toBeInTheDocument();\n });\n});\n```\n\n### Field Pattern Tests\n\nTest DraggableList.Field form integration\n\n```tsx\nimport { describe, it, expect, vi } from \"vitest\";\nimport { render, screen } from \"@testing-library/react\";\nimport userEvent from \"@testing-library/user-event\";\nimport { DraggableList, NimbusProvider } from \"@commercetools/nimbus\";\n\ndescribe(\"DraggableList.Field - Form integration\", () => {\n it(\"renders field with label and description\", () => {\n const items = [\n { key: \"1\", label: \"Task 1\" },\n { key: \"2\", label: \"Task 2\" },\n ];\n\n render(\n <NimbusProvider>\n <DraggableList.Field\n label=\"Task Priority\"\n description=\"Drag to reorder\"\n items={items}\n aria-label=\"Priority field\"\n />\n </NimbusProvider>\n );\n\n expect(screen.getByText(\"Task Priority\")).toBeInTheDocument();\n expect(screen.getByText(\"Drag to reorder\")).toBeInTheDocument();\n });\n\n it(\"displays error message when validation fails\", () => {\n render(\n <NimbusProvider>\n <DraggableList.Field\n label=\"Required List\"\n items={[]}\n error=\"This field is required\"\n isInvalid={true}\n aria-label=\"Required field\"\n />\n </NimbusProvider>\n );\n\n // The error is wrapped in FormField.Error component\n expect(screen.getByText(\"This field is required\")).toBeInTheDocument();\n });\n});\n```\n\n\n## Resources\n\n- [Storybook](https://nimbus-storybook.vercel.app/?path=/docs/components-draggablelist--docs)\n- [React Aria Drag and Drop](https://react-spectrum.adobe.com/react-aria/dnd.html)\n",
189
+ "toc": [
190
+ {
191
+ "value": "Getting started",
192
+ "href": "#getting-started",
193
+ "depth": 2,
194
+ "numbering": [
195
+ 1,
196
+ 1
197
+ ],
198
+ "parent": "root"
199
+ },
200
+ {
201
+ "value": "Import",
202
+ "href": "#import",
203
+ "depth": 3,
204
+ "numbering": [
205
+ 1,
206
+ 1,
207
+ 1
208
+ ],
209
+ "parent": "root"
210
+ },
211
+ {
212
+ "value": "Basic usage",
213
+ "href": "#basic-usage",
214
+ "depth": 3,
215
+ "numbering": [
216
+ 1,
217
+ 1,
218
+ 2
219
+ ],
220
+ "parent": "root"
221
+ },
222
+ {
223
+ "value": "Working with React Aria drag-and-drop",
224
+ "href": "#working-with-react-aria-drag-and-drop",
225
+ "depth": 2,
226
+ "numbering": [
227
+ 1,
228
+ 2
229
+ ],
230
+ "parent": "root"
231
+ },
232
+ {
233
+ "value": "Drag-and-drop behavior",
234
+ "href": "#drag-and-drop-behavior",
235
+ "depth": 3,
236
+ "numbering": [
237
+ 1,
238
+ 2,
239
+ 1
240
+ ],
241
+ "parent": "root"
242
+ },
243
+ {
244
+ "value": "Data format",
245
+ "href": "#data-format",
246
+ "depth": 3,
247
+ "numbering": [
248
+ 1,
249
+ 2,
250
+ 2
251
+ ],
252
+ "parent": "root"
253
+ },
254
+ {
255
+ "value": "State management",
256
+ "href": "#state-management",
257
+ "depth": 3,
258
+ "numbering": [
259
+ 1,
260
+ 2,
261
+ 3
262
+ ],
263
+ "parent": "root"
264
+ },
265
+ {
266
+ "value": "Usage examples",
267
+ "href": "#usage-examples",
268
+ "depth": 2,
269
+ "numbering": [
270
+ 1,
271
+ 3
272
+ ],
273
+ "parent": "root"
274
+ },
275
+ {
276
+ "value": "Size options",
277
+ "href": "#size-options",
278
+ "depth": 3,
279
+ "numbering": [
280
+ 1,
281
+ 3,
282
+ 1
283
+ ],
284
+ "parent": "root"
285
+ },
286
+ {
287
+ "value": "Item removal",
288
+ "href": "#item-removal",
289
+ "depth": 3,
290
+ "numbering": [
291
+ 1,
292
+ 3,
293
+ 2
294
+ ],
295
+ "parent": "root"
296
+ },
297
+ {
298
+ "value": "Custom item rendering",
299
+ "href": "#custom-item-rendering",
300
+ "depth": 3,
301
+ "numbering": [
302
+ 1,
303
+ 3,
304
+ 3
305
+ ],
306
+ "parent": "root"
307
+ },
308
+ {
309
+ "value": "Controlled updates",
310
+ "href": "#controlled-updates",
311
+ "depth": 3,
312
+ "numbering": [
313
+ 1,
314
+ 3,
315
+ 4
316
+ ],
317
+ "parent": "root"
318
+ },
319
+ {
320
+ "value": "Custom empty state",
321
+ "href": "#custom-empty-state",
322
+ "depth": 3,
323
+ "numbering": [
324
+ 1,
325
+ 3,
326
+ 5
327
+ ],
328
+ "parent": "root"
329
+ },
330
+ {
331
+ "value": "Multiple lists",
332
+ "href": "#multiple-lists",
333
+ "depth": 3,
334
+ "numbering": [
335
+ 1,
336
+ 3,
337
+ 6
338
+ ],
339
+ "parent": "root"
340
+ },
341
+ {
342
+ "value": "TypeScript generics",
343
+ "href": "#typescript-generics",
344
+ "depth": 3,
345
+ "numbering": [
346
+ 1,
347
+ 3,
348
+ 7
349
+ ],
350
+ "parent": "root"
351
+ },
352
+ {
353
+ "value": "Component requirements",
354
+ "href": "#component-requirements",
355
+ "depth": 2,
356
+ "numbering": [
357
+ 1,
358
+ 4
359
+ ],
360
+ "parent": "root"
361
+ },
362
+ {
363
+ "value": "Accessibility",
364
+ "href": "#accessibility",
365
+ "depth": 2,
366
+ "numbering": [
367
+ 1,
368
+ 5
369
+ ],
370
+ "parent": "root"
371
+ },
372
+ {
373
+ "value": "Keyboard navigation",
374
+ "href": "#keyboard-navigation",
375
+ "depth": 4,
376
+ "numbering": [
377
+ 1,
378
+ 5,
379
+ 1,
380
+ 1
381
+ ],
382
+ "parent": "root"
383
+ },
384
+ {
385
+ "value": "API reference",
386
+ "href": "#api-reference",
387
+ "depth": 2,
388
+ "numbering": [
389
+ 1,
390
+ 6
391
+ ],
392
+ "parent": "root"
393
+ },
394
+ {
395
+ "value": "Common patterns",
396
+ "href": "#common-patterns",
397
+ "depth": 2,
398
+ "numbering": [
399
+ 1,
400
+ 7
401
+ ],
402
+ "parent": "root"
403
+ },
404
+ {
405
+ "value": "Form integration with validation",
406
+ "href": "#form-integration-with-validation",
407
+ "depth": 3,
408
+ "numbering": [
409
+ 1,
410
+ 7,
411
+ 1
412
+ ],
413
+ "parent": "root"
414
+ },
415
+ {
416
+ "value": "Dynamic item management",
417
+ "href": "#dynamic-item-management",
418
+ "depth": 3,
419
+ "numbering": [
420
+ 1,
421
+ 7,
422
+ 2
423
+ ],
424
+ "parent": "root"
425
+ },
426
+ {
427
+ "value": "Synchronized state with external storage",
428
+ "href": "#synchronized-state-with-external-storage",
429
+ "depth": 3,
430
+ "numbering": [
431
+ 1,
432
+ 7,
433
+ 3
434
+ ],
435
+ "parent": "root"
436
+ },
437
+ {
438
+ "value": "Testing your implementation",
439
+ "href": "#testing-your-implementation",
440
+ "depth": 2,
441
+ "numbering": [
442
+ 1,
443
+ 8
444
+ ],
445
+ "parent": "root"
446
+ },
447
+ {
448
+ "value": "Basic Rendering Tests",
449
+ "href": "#basic-rendering-tests",
450
+ "depth": 3,
451
+ "numbering": [
452
+ 1,
453
+ 8,
454
+ 1
455
+ ],
456
+ "parent": "root"
457
+ },
458
+ {
459
+ "value": "Size Variant Tests",
460
+ "href": "#size-variant-tests",
461
+ "depth": 3,
462
+ "numbering": [
463
+ 1,
464
+ 8,
465
+ 2
466
+ ],
467
+ "parent": "root"
468
+ },
469
+ {
470
+ "value": "Item Removal Tests",
471
+ "href": "#item-removal-tests",
472
+ "depth": 3,
473
+ "numbering": [
474
+ 1,
475
+ 8,
476
+ 3
477
+ ],
478
+ "parent": "root"
479
+ },
480
+ {
481
+ "value": "Controlled Mode Tests",
482
+ "href": "#controlled-mode-tests",
483
+ "depth": 3,
484
+ "numbering": [
485
+ 1,
486
+ 8,
487
+ 4
488
+ ],
489
+ "parent": "root"
490
+ },
491
+ {
492
+ "value": "Custom Rendering Tests",
493
+ "href": "#custom-rendering-tests",
494
+ "depth": 3,
495
+ "numbering": [
496
+ 1,
497
+ 8,
498
+ 5
499
+ ],
500
+ "parent": "root"
501
+ },
502
+ {
503
+ "value": "Controlled Mode Tests",
504
+ "href": "#controlled-mode-tests-1",
505
+ "depth": 3,
506
+ "numbering": [
507
+ 1,
508
+ 8,
509
+ 6
510
+ ],
511
+ "parent": "root"
512
+ },
513
+ {
514
+ "value": "Empty State Tests",
515
+ "href": "#empty-state-tests",
516
+ "depth": 3,
517
+ "numbering": [
518
+ 1,
519
+ 8,
520
+ 7
521
+ ],
522
+ "parent": "root"
523
+ },
524
+ {
525
+ "value": "Field Pattern Tests",
526
+ "href": "#field-pattern-tests",
527
+ "depth": 3,
528
+ "numbering": [
529
+ 1,
530
+ 8,
531
+ 8
532
+ ],
533
+ "parent": "root"
534
+ },
535
+ {
536
+ "value": "Resources",
537
+ "href": "#resources",
538
+ "depth": 2,
539
+ "numbering": [
540
+ 1,
541
+ 9
542
+ ],
543
+ "parent": "root"
544
+ }
545
+ ]
546
+ },
547
+ "guidelines": {
548
+ "mdx": "\n## Guidelines\n\nDraggable list guidelines ensure that reordering is intuitive and accessible by\nproviding a clear drag handle, visual feedback on the insertion point, and a\nnecessary keyboard alternative for manipulation.\n\n### Best practices\n\n- **Clear drag handle:** the distinct drag handle icon on each list item will\n explicitly communicate that the item is movable and defines the primary target\n for the drag action.\n- **Show insertion point:** As the user drags the item, clearly indicate the\n exact target position where the item will be dropped. This is often done by\n visually highlighting the gap or line where the item will be inserted.\n- **Maintain performance:** Ensure the drag-and-drop animation is smooth and\n responsive without lag, especially in long lists.\n- **Limited scope:** Only allow items to be dragged within the confines of the\n current list; do not allow dragging to other unrelated sections unless\n explicitly necessary for the application's core function.\n- **Use the right cursor:** The mouse cursor will change to a hand or grab\n cursor when hovering over the drag handle to visually reinforce interactivity.\n- **Lift the item (visual pickup):** When the user clicks the handle to start\n dragging, the appearance will immediately change to separate it visually from\n the rest of the list.\n- **Maintain stability:** Keep the other list items stable while one is being\n dragged. Do not introduce excessive animations or visual clutter that makes it\n hard to see the remaining order.\n- **Provide an accessible alternative:** Always include keyboard-operable \"Move\n Up\" and \"Move Down\" buttons for each list item, as drag-and-drop actions are\n inaccessible to many keyboard-only and assistive technology users.\n\n### Usage\n\nThe draggable list component is used when the explicit, user-defined order of\nitems directly impacts the application's logic or user outcome, such as\nsequencing workflow steps or organizing a custom list.\n\n> [!TIP]\\\n> When to use\n\n- **User-defined order:** When the order of items directly impacts the\n application's logic or user outcome.\n- **Short to medium lists:** For lists that are manageable without extensive\n scrolling where dragging is quick.\n- **Spatial relationship is key:** When the user benefits from seeing the new\n sequence immediately take effect visually.\n\n> [!CAUTION]\\\n> When not to use\n\n- **Simple filtering/sorting:** If the only goal is to change the list's view\n (e.g., sort alphabetically, filter by date), use standard sort/filter controls\n instead.\n- **Very long lists:** Dragging items across many screen heights or dozens of\n items is tedious and inefficient.\n- **Actions are primary:** If the main interaction is performing an action on\n the item (e.g., edit, delete) rather than changing its position. Use a\n standard list component with action buttons.\n\n### Draggable list in use\n\n> [!TIP]\\\n> **Do**\n>\n> - Do save the new order instantly or provide a clear \"Save Order\" button after\n> the drop action is completed.\n> - Do ensure all relevant metadata (e.g., numbering) updates automatically\n> after a successful drop.\n\n```jsx live\nconst App = () => {\n const [leftItems, setLeftItems] = useState([\n { key: \"1\", label: \"Food\" },\n { key: \"2\", label: \"Cosmetics\" },\n { key: \"3\", label: \"Furniture\" },\n { key: \"4\", label: \"Electronics\" },\n { key: \"5\", label: \"Clothing\" },\n ]);\n\n const [rightItems, setRightItems] = useState([\n { key: \"6\", label: \"Sport\" },\n { key: \"7\", label: \"Home\" },\n ]);\n\n return (\n <Flex gap=\"400\">\n <DraggableList.Root\n aria-label=\"Left column\"\n items={leftItems}\n onUpdateItems={setLeftItems}\n />\n <DraggableList.Root\n aria-label=\"Right column\"\n items={rightItems}\n onUpdateItems={setRightItems}\n />\n </Flex>\n );\n}\n```\n\n> [!CAUTION]\\\n> **Don't**\n>\n> - Don't make the entire list item the draggable area; this interferes with\n> clicking links, checkboxes, or actions within the item.\n> - Don't interrupt the drag action with tooltips, modals, or sudden page\n> refreshes.\n> - Don't forget to provide accessible alternatives for reordering (see\n> Accessibility).\n\n```jsx live\nconst App = () => {\n const initialLeft = [\n { key: \"1\", label: \"Food\" },\n { key: \"2\", label: \"Cosmetics\" },\n { key: \"3\", label: \"Furniture\" },\n { key: \"4\", label: \"Electronics\" },\n { key: \"5\", label: \"Clothing\" },\n ];\n\n const initialRight = [\n { key: \"6\", label: \"Sport\" },\n { key: \"7\", label: \"Home\" },\n ];\n\n const [leftItems, setLeftItems] = useState(initialLeft);\n const [rightItems, setRightItems] = useState(initialRight);\n\n const handleLeftUpdate = (items) => {\n setLeftItems(items);\n setTimeout(() => {\n setLeftItems(initialLeft);\n setRightItems(initialRight);\n }, 500);\n };\n\n const handleRightUpdate = (items) => {\n setRightItems(items);\n setTimeout(() => {\n setLeftItems(initialLeft);\n setRightItems(initialRight);\n }, 500);\n };\n\n return (\n <Flex gap=\"400\">\n <DraggableList.Root\n aria-label=\"Left column\"\n items={leftItems}\n onUpdateItems={handleLeftUpdate}\n />\n <DraggableList.Root\n aria-label=\"Right column\"\n items={rightItems}\n onUpdateItems={handleRightUpdate}\n />\n </Flex>\n );\n}\n```\n",
549
+ "toc": [
550
+ {
551
+ "value": "Guidelines",
552
+ "href": "#guidelines",
553
+ "depth": 2,
554
+ "numbering": [
555
+ 1,
556
+ 1
557
+ ],
558
+ "parent": "root"
559
+ },
560
+ {
561
+ "value": "Best practices",
562
+ "href": "#best-practices",
563
+ "depth": 3,
564
+ "numbering": [
565
+ 1,
566
+ 1,
567
+ 1
568
+ ],
569
+ "parent": "root"
570
+ },
571
+ {
572
+ "value": "Usage",
573
+ "href": "#usage",
574
+ "depth": 3,
575
+ "numbering": [
576
+ 1,
577
+ 1,
578
+ 2
579
+ ],
580
+ "parent": "root"
581
+ },
582
+ {
583
+ "value": "Draggable list in use",
584
+ "href": "#draggable-list-in-use",
585
+ "depth": 3,
586
+ "numbering": [
587
+ 1,
588
+ 1,
589
+ 3
590
+ ],
591
+ "parent": "root"
592
+ }
593
+ ]
594
+ }
595
+ }
596
+ }