@commercetools/nimbus-mcp 0.1.0 → 2.10.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 (450) hide show
  1. package/README.md +63 -14
  2. package/data/docs/route-manifest.json +10913 -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-separator.json +461 -0
  59. package/data/docs/routes/components-layout-simple-grid.json +519 -0
  60. package/data/docs/routes/components-layout-spacer.json +573 -0
  61. package/data/docs/routes/components-layout-stack.json +481 -0
  62. package/data/docs/routes/components-layout.json +34 -0
  63. package/data/docs/routes/components-media-avatar.json +427 -0
  64. package/data/docs/routes/components-media-icon.json +663 -0
  65. package/data/docs/routes/components-media-image.json +511 -0
  66. package/data/docs/routes/components-media-inline-svg.json +586 -0
  67. package/data/docs/routes/components-media.json +34 -0
  68. package/data/docs/routes/components-navigation-accordion.json +643 -0
  69. package/data/docs/routes/components-navigation-collapsible-motion.json +628 -0
  70. package/data/docs/routes/components-navigation-link.json +554 -0
  71. package/data/docs/routes/components-navigation-menu.json +546 -0
  72. package/data/docs/routes/components-navigation-pagination.json +502 -0
  73. package/data/docs/routes/components-navigation-steps.json +629 -0
  74. package/data/docs/routes/components-navigation-tabnav.json +546 -0
  75. package/data/docs/routes/components-navigation-tabs.json +635 -0
  76. package/data/docs/routes/components-navigation-toolbar.json +549 -0
  77. package/data/docs/routes/components-navigation.json +34 -0
  78. package/data/docs/routes/components-typography-code.json +39 -0
  79. package/data/docs/routes/components-typography-heading.json +402 -0
  80. package/data/docs/routes/components-typography-kbd.json +399 -0
  81. package/data/docs/routes/components-typography-list.json +593 -0
  82. package/data/docs/routes/components-typography-text.json +444 -0
  83. package/data/docs/routes/components-typography.json +34 -0
  84. package/data/docs/routes/components-utilities-nimbus-i18n-provider.json +295 -0
  85. package/data/docs/routes/components-utilities-nimbus-provider.json +663 -0
  86. package/data/docs/routes/components-utilities.json +34 -0
  87. package/data/docs/routes/components.json +33 -0
  88. package/data/docs/routes/home-contribute-adrs-adr0001-consumer-component-apis.json +314 -0
  89. package/data/docs/routes/home-contribute-adrs-adr0002-compound-component-extraction.json +160 -0
  90. package/data/docs/routes/home-contribute-adrs-adr0003-component-lifecycle-states.json +460 -0
  91. package/data/docs/routes/home-contribute-adrs.json +205 -0
  92. package/data/docs/routes/home-contribute-development-setup.json +213 -0
  93. package/data/docs/routes/home-contribute-stats.json +36 -0
  94. package/data/docs/routes/home-contribute.json +36 -0
  95. package/data/docs/routes/home-design-tokens-aspect-ratios.json +36 -0
  96. package/data/docs/routes/home-design-tokens-borders.json +35 -0
  97. package/data/docs/routes/home-design-tokens-colors.json +157 -0
  98. package/data/docs/routes/home-design-tokens-other-animations.json +119 -0
  99. package/data/docs/routes/home-design-tokens-other-blurs.json +36 -0
  100. package/data/docs/routes/home-design-tokens-other-breakpoints.json +61 -0
  101. package/data/docs/routes/home-design-tokens-other-cursors.json +36 -0
  102. package/data/docs/routes/home-design-tokens-other-z-indices.json +39 -0
  103. package/data/docs/routes/home-design-tokens-other.json +35 -0
  104. package/data/docs/routes/home-design-tokens-radii.json +59 -0
  105. package/data/docs/routes/home-design-tokens-shadows.json +57 -0
  106. package/data/docs/routes/home-design-tokens-sizes.json +137 -0
  107. package/data/docs/routes/home-design-tokens-spacing.json +36 -0
  108. package/data/docs/routes/home-design-tokens-typography.json +184 -0
  109. package/data/docs/routes/home-design-tokens.json +34 -0
  110. package/data/docs/routes/home-getting-started-core-concepts.json +301 -0
  111. package/data/docs/routes/home-getting-started-installation.json +621 -0
  112. package/data/docs/routes/home-getting-started-mcp-server-overview.json +139 -0
  113. package/data/docs/routes/home-getting-started-mcp-server-setup.json +316 -0
  114. package/data/docs/routes/home-getting-started-release-process.json +294 -0
  115. package/data/docs/routes/home-getting-started-testing-setup.json +296 -0
  116. package/data/docs/routes/home-playground-markdown.json +638 -0
  117. package/data/docs/routes/home-playground-toc.json +169 -0
  118. package/data/docs/routes/home-playground.json +34 -0
  119. package/data/docs/routes/home-style-props-background.json +236 -0
  120. package/data/docs/routes/home-style-props-border.json +310 -0
  121. package/data/docs/routes/home-style-props-display.json +120 -0
  122. package/data/docs/routes/home-style-props-effects.json +116 -0
  123. package/data/docs/routes/home-style-props-filters.json +396 -0
  124. package/data/docs/routes/home-style-props-flex-and-grid.json +496 -0
  125. package/data/docs/routes/home-style-props-interactivity.json +356 -0
  126. package/data/docs/routes/home-style-props-layout.json +422 -0
  127. package/data/docs/routes/home-style-props-list.json +116 -0
  128. package/data/docs/routes/home-style-props-sizing.json +244 -0
  129. package/data/docs/routes/home-style-props-spacing.json +228 -0
  130. package/data/docs/routes/home-style-props-svg.json +96 -0
  131. package/data/docs/routes/home-style-props-tables.json +116 -0
  132. package/data/docs/routes/home-style-props-transforms.json +216 -0
  133. package/data/docs/routes/home-style-props-transitions.json +216 -0
  134. package/data/docs/routes/home-style-props-typography.json +536 -0
  135. package/data/docs/routes/home-style-props.json +33 -0
  136. package/data/docs/routes/home.json +32 -0
  137. package/data/docs/routes/hooks-usecopytoclipboard.json +76 -0
  138. package/data/docs/routes/hooks-usehotkeys.json +117 -0
  139. package/data/docs/routes/hooks.json +33 -0
  140. package/data/docs/routes/icons.json +32 -0
  141. package/data/docs/routes/patterns-fields-date-range-picker-field.json +393 -0
  142. package/data/docs/routes/patterns-fields-money-input-field.json +415 -0
  143. package/data/docs/routes/patterns-fields-multiline-text-input-field.json +404 -0
  144. package/data/docs/routes/patterns-fields-number-input-field.json +470 -0
  145. package/data/docs/routes/patterns-fields-password-input-field.json +319 -0
  146. package/data/docs/routes/patterns-fields-search-input-field.json +382 -0
  147. package/data/docs/routes/patterns-fields-text-input-field.json +404 -0
  148. package/data/docs/routes/patterns-fields.json +78 -0
  149. package/data/docs/routes/patterns.json +34 -0
  150. package/data/docs/search-index.json +1 -0
  151. package/data/docs/types/Accordion.json +12 -0
  152. package/data/docs/types/AccordionContent.json +286 -0
  153. package/data/docs/types/AccordionHeader.json +891 -0
  154. package/data/docs/types/AccordionHeaderRightContent.json +27 -0
  155. package/data/docs/types/AccordionItem.json +242 -0
  156. package/data/docs/types/AccordionRoot.json +162 -0
  157. package/data/docs/types/Alert.json +12 -0
  158. package/data/docs/types/AlertActions.json +11 -0
  159. package/data/docs/types/AlertDescription.json +118 -0
  160. package/data/docs/types/AlertDismissButton.json +937 -0
  161. package/data/docs/types/AlertRoot.json +42 -0
  162. package/data/docs/types/AlertTitle.json +118 -0
  163. package/data/docs/types/Avatar.json +125 -0
  164. package/data/docs/types/Badge.json +64 -0
  165. package/data/docs/types/Body.json +67 -0
  166. package/data/docs/types/Box.json +85 -0
  167. package/data/docs/types/Button.json +1015 -0
  168. package/data/docs/types/Calendar.json +565 -0
  169. package/data/docs/types/Caption.json +67 -0
  170. package/data/docs/types/Card.json +12 -0
  171. package/data/docs/types/CardContent.json +27 -0
  172. package/data/docs/types/CardHeader.json +27 -0
  173. package/data/docs/types/CardRoot.json +106 -0
  174. package/data/docs/types/Cell.json +227 -0
  175. package/data/docs/types/Checkbox.json +897 -0
  176. package/data/docs/types/Code.json +112 -0
  177. package/data/docs/types/CollapsibleMotionContent.json +35 -0
  178. package/data/docs/types/CollapsibleMotionRoot.json +99 -0
  179. package/data/docs/types/CollapsibleMotionTrigger.json +71 -0
  180. package/data/docs/types/Column.json +101 -0
  181. package/data/docs/types/ColumnGroup.json +101 -0
  182. package/data/docs/types/ColumnHeader.json +193 -0
  183. package/data/docs/types/ComboBoxListBox.json +751 -0
  184. package/data/docs/types/ComboBoxOption.json +672 -0
  185. package/data/docs/types/ComboBoxPopover.json +786 -0
  186. package/data/docs/types/ComboBoxRoot.json +747 -0
  187. package/data/docs/types/ComboBoxSection.json +277 -0
  188. package/data/docs/types/ComboBoxTrigger.json +70 -0
  189. package/data/docs/types/Content.json +33 -0
  190. package/data/docs/types/DataTable.json +596 -0
  191. package/data/docs/types/DataTableBody.json +223 -0
  192. package/data/docs/types/DataTableFooter.json +27 -0
  193. package/data/docs/types/DataTableHeader.json +269 -0
  194. package/data/docs/types/DataTableManager.json +11 -0
  195. package/data/docs/types/DataTableRoot.json +590 -0
  196. package/data/docs/types/DataTableTable.json +271 -0
  197. package/data/docs/types/DateInput.json +792 -0
  198. package/data/docs/types/DatePicker.json +700 -0
  199. package/data/docs/types/DateRangePicker.json +936 -0
  200. package/data/docs/types/DateRangePickerField.json +1047 -0
  201. package/data/docs/types/DefaultPage.json +12 -0
  202. package/data/docs/types/DefaultPageActions.json +27 -0
  203. package/data/docs/types/DefaultPageBackLink.json +213 -0
  204. package/data/docs/types/DefaultPageContent.json +27 -0
  205. package/data/docs/types/DefaultPageFooter.json +27 -0
  206. package/data/docs/types/DefaultPageHeader.json +27 -0
  207. package/data/docs/types/DefaultPageRoot.json +106 -0
  208. package/data/docs/types/DefaultPageSubtitle.json +27 -0
  209. package/data/docs/types/DefaultPageTabNav.json +28 -0
  210. package/data/docs/types/DefaultPageTitle.json +27 -0
  211. package/data/docs/types/DialogBody.json +27 -0
  212. package/data/docs/types/DialogCloseTrigger.json +939 -0
  213. package/data/docs/types/DialogContent.json +27 -0
  214. package/data/docs/types/DialogFooter.json +27 -0
  215. package/data/docs/types/DialogHeader.json +27 -0
  216. package/data/docs/types/DialogRoot.json +138 -0
  217. package/data/docs/types/DialogTitle.json +27 -0
  218. package/data/docs/types/DialogTrigger.json +80 -0
  219. package/data/docs/types/DraggableList.json +12 -0
  220. package/data/docs/types/DraggableListField.json +894 -0
  221. package/data/docs/types/DraggableListItem.json +574 -0
  222. package/data/docs/types/DraggableListRoot.json +745 -0
  223. package/data/docs/types/Drawer.json +12 -0
  224. package/data/docs/types/DrawerBody.json +27 -0
  225. package/data/docs/types/DrawerCloseTrigger.json +939 -0
  226. package/data/docs/types/DrawerContent.json +27 -0
  227. package/data/docs/types/DrawerFooter.json +27 -0
  228. package/data/docs/types/DrawerHeader.json +27 -0
  229. package/data/docs/types/DrawerRoot.json +142 -0
  230. package/data/docs/types/DrawerTitle.json +27 -0
  231. package/data/docs/types/DrawerTrigger.json +80 -0
  232. package/data/docs/types/FieldErrors.getBuiltInMessage.json +11 -0
  233. package/data/docs/types/FieldErrors.getCustomMessage.json +9 -0
  234. package/data/docs/types/FieldErrors.json +109 -0
  235. package/data/docs/types/Flex.json +238 -0
  236. package/data/docs/types/Footer.json +67 -0
  237. package/data/docs/types/FormFieldDescription.json +11 -0
  238. package/data/docs/types/FormFieldError.json +11 -0
  239. package/data/docs/types/FormFieldInfoBox.json +27 -0
  240. package/data/docs/types/FormFieldInput.json +11 -0
  241. package/data/docs/types/FormFieldLabel.json +11 -0
  242. package/data/docs/types/FormFieldRoot.json +148 -0
  243. package/data/docs/types/Grid.json +253 -0
  244. package/data/docs/types/GridProps.json +11 -0
  245. package/data/docs/types/Group.json +143 -0
  246. package/data/docs/types/Header.json +67 -0
  247. package/data/docs/types/Heading.json +109 -0
  248. package/data/docs/types/Icon.json +112 -0
  249. package/data/docs/types/IconButton.json +1019 -0
  250. package/data/docs/types/IconToggleButton.json +787 -0
  251. package/data/docs/types/Image.json +373 -0
  252. package/data/docs/types/Indicator.json +67 -0
  253. package/data/docs/types/InlineSvg.json +98 -0
  254. package/data/docs/types/Item.json +67 -0
  255. package/data/docs/types/Kbd.json +118 -0
  256. package/data/docs/types/Link.json +380 -0
  257. package/data/docs/types/List.json +12 -0
  258. package/data/docs/types/ListIndicator.json +70 -0
  259. package/data/docs/types/ListItem.json +70 -0
  260. package/data/docs/types/ListRoot.json +124 -0
  261. package/data/docs/types/LoadingSpinner.json +87 -0
  262. package/data/docs/types/LocalizedField.json +460 -0
  263. package/data/docs/types/LocalizedStringFormatter.json +9 -0
  264. package/data/docs/types/MakeElementFocusable.json +196 -0
  265. package/data/docs/types/MenuContent.json +111 -0
  266. package/data/docs/types/MenuItem.json +671 -0
  267. package/data/docs/types/MenuRoot.json +670 -0
  268. package/data/docs/types/MenuSection.json +364 -0
  269. package/data/docs/types/MenuSubmenu.json +111 -0
  270. package/data/docs/types/MenuSubmenuTrigger.json +67 -0
  271. package/data/docs/types/MenuTrigger.json +906 -0
  272. package/data/docs/types/ModalPage.json +12 -0
  273. package/data/docs/types/ModalPageActions.json +27 -0
  274. package/data/docs/types/ModalPageContent.json +27 -0
  275. package/data/docs/types/ModalPageFooter.json +27 -0
  276. package/data/docs/types/ModalPageHeader.json +27 -0
  277. package/data/docs/types/ModalPageRoot.json +87 -0
  278. package/data/docs/types/ModalPageSubtitle.json +27 -0
  279. package/data/docs/types/ModalPageTabNav.json +28 -0
  280. package/data/docs/types/ModalPageTitle.json +27 -0
  281. package/data/docs/types/ModalPageTopBar.json +57 -0
  282. package/data/docs/types/MoneyInput.isEmpty.json +40 -0
  283. package/data/docs/types/MoneyInput.json +282 -0
  284. package/data/docs/types/MoneyInputField.json +379 -0
  285. package/data/docs/types/MoneyInputFieldProps.json +9 -0
  286. package/data/docs/types/MultilineTextInput.json +1194 -0
  287. package/data/docs/types/MultilineTextInputField.json +1269 -0
  288. package/data/docs/types/MultilineTextInputFieldProps.json +9 -0
  289. package/data/docs/types/NimbusI18nProvider.json +42 -0
  290. package/data/docs/types/NimbusI18nProviderProps.json +9 -0
  291. package/data/docs/types/NimbusProvider.json +270 -0
  292. package/data/docs/types/NumberInput.json +952 -0
  293. package/data/docs/types/NumberInputField.json +1004 -0
  294. package/data/docs/types/NumberInputFieldProps.json +9 -0
  295. package/data/docs/types/PageContent.json +11 -0
  296. package/data/docs/types/PageContentColumn.json +99 -0
  297. package/data/docs/types/PageContentRoot.json +114 -0
  298. package/data/docs/types/Pagination.json +159 -0
  299. package/data/docs/types/PasswordInput.json +1120 -0
  300. package/data/docs/types/PasswordInputField.json +1216 -0
  301. package/data/docs/types/PasswordInputFieldProps.json +9 -0
  302. package/data/docs/types/ProgressBar.json +280 -0
  303. package/data/docs/types/RadioInputOption.json +550 -0
  304. package/data/docs/types/RadioInputRoot.json +514 -0
  305. package/data/docs/types/RangeCalendar.json +618 -0
  306. package/data/docs/types/RichTextInput.json +134 -0
  307. package/data/docs/types/Root.json +122 -0
  308. package/data/docs/types/Row.json +67 -0
  309. package/data/docs/types/ScopedSearchInput.isEmpty.json +40 -0
  310. package/data/docs/types/ScopedSearchInput.json +253 -0
  311. package/data/docs/types/ScrollArea.json +82 -0
  312. package/data/docs/types/SearchInput.json +1165 -0
  313. package/data/docs/types/SearchInputField.json +1240 -0
  314. package/data/docs/types/Select.json +12 -0
  315. package/data/docs/types/SelectOption.json +572 -0
  316. package/data/docs/types/SelectOptionGroup.json +215 -0
  317. package/data/docs/types/SelectOptions.json +693 -0
  318. package/data/docs/types/SelectRoot.json +926 -0
  319. package/data/docs/types/Separator.json +65 -0
  320. package/data/docs/types/SimpleGrid.json +291 -0
  321. package/data/docs/types/Spacer.json +27 -0
  322. package/data/docs/types/SpacerProps.json +9 -0
  323. package/data/docs/types/SplitButton.json +203 -0
  324. package/data/docs/types/Stack.json +144 -0
  325. package/data/docs/types/Steps.json +12 -0
  326. package/data/docs/types/StepsChangeDetails.json +9 -0
  327. package/data/docs/types/StepsCompletedContent.json +28 -0
  328. package/data/docs/types/StepsCompletedContentProps.json +9 -0
  329. package/data/docs/types/StepsContent.json +43 -0
  330. package/data/docs/types/StepsContentProps.json +9 -0
  331. package/data/docs/types/StepsDescription.json +28 -0
  332. package/data/docs/types/StepsDescriptionProps.json +9 -0
  333. package/data/docs/types/StepsIndicator.json +28 -0
  334. package/data/docs/types/StepsIndicatorProps.json +9 -0
  335. package/data/docs/types/StepsItem.json +43 -0
  336. package/data/docs/types/StepsItemProps.json +9 -0
  337. package/data/docs/types/StepsList.json +28 -0
  338. package/data/docs/types/StepsListProps.json +9 -0
  339. package/data/docs/types/StepsNextTrigger.json +62 -0
  340. package/data/docs/types/StepsNextTriggerProps.json +9 -0
  341. package/data/docs/types/StepsNumber.json +28 -0
  342. package/data/docs/types/StepsNumberProps.json +9 -0
  343. package/data/docs/types/StepsPrevTrigger.json +62 -0
  344. package/data/docs/types/StepsPrevTriggerProps.json +9 -0
  345. package/data/docs/types/StepsRoot.json +183 -0
  346. package/data/docs/types/StepsRootProps.json +11 -0
  347. package/data/docs/types/StepsSeparator.json +28 -0
  348. package/data/docs/types/StepsSeparatorProps.json +9 -0
  349. package/data/docs/types/StepsStatus.json +57 -0
  350. package/data/docs/types/StepsStatusProps.json +9 -0
  351. package/data/docs/types/StepsTitle.json +28 -0
  352. package/data/docs/types/StepsTitleProps.json +9 -0
  353. package/data/docs/types/StepsTrigger.json +47 -0
  354. package/data/docs/types/StepsTriggerProps.json +9 -0
  355. package/data/docs/types/Switch.json +371 -0
  356. package/data/docs/types/TabListProps.json +9 -0
  357. package/data/docs/types/TabNav.json +12 -0
  358. package/data/docs/types/TabNavItem.json +300 -0
  359. package/data/docs/types/TabNavItemProps.json +9 -0
  360. package/data/docs/types/TabNavProps.json +9 -0
  361. package/data/docs/types/TabNavRoot.json +80 -0
  362. package/data/docs/types/TabPanelProps.json +9 -0
  363. package/data/docs/types/TabPanelsProps.json +9 -0
  364. package/data/docs/types/TabProps.json +9 -0
  365. package/data/docs/types/Table.json +9 -0
  366. package/data/docs/types/TableBody.json +67 -0
  367. package/data/docs/types/TableBodyProps.json +9 -0
  368. package/data/docs/types/TableCaption.json +67 -0
  369. package/data/docs/types/TableCaptionProps.json +9 -0
  370. package/data/docs/types/TableCell.json +227 -0
  371. package/data/docs/types/TableCellProps.json +9 -0
  372. package/data/docs/types/TableColumn.json +101 -0
  373. package/data/docs/types/TableColumnGroup.json +101 -0
  374. package/data/docs/types/TableColumnGroupProps.json +9 -0
  375. package/data/docs/types/TableColumnHeader.json +193 -0
  376. package/data/docs/types/TableColumnHeaderProps.json +9 -0
  377. package/data/docs/types/TableColumnProps.json +9 -0
  378. package/data/docs/types/TableFooter.json +67 -0
  379. package/data/docs/types/TableFooterProps.json +9 -0
  380. package/data/docs/types/TableHeader.json +67 -0
  381. package/data/docs/types/TableHeaderProps.json +9 -0
  382. package/data/docs/types/TableRoot.json +365 -0
  383. package/data/docs/types/TableRootProps.json +12 -0
  384. package/data/docs/types/TableRow.json +67 -0
  385. package/data/docs/types/TableRowProps.json +9 -0
  386. package/data/docs/types/TableScrollArea.json +82 -0
  387. package/data/docs/types/TableScrollAreaProps.json +9 -0
  388. package/data/docs/types/Tabs.json +12 -0
  389. package/data/docs/types/TabsList.json +110 -0
  390. package/data/docs/types/TabsPanel.json +112 -0
  391. package/data/docs/types/TabsPanels.json +108 -0
  392. package/data/docs/types/TabsRoot.json +211 -0
  393. package/data/docs/types/TabsTab.json +174 -0
  394. package/data/docs/types/TagGroup.json +12 -0
  395. package/data/docs/types/TagGroupRoot.json +306 -0
  396. package/data/docs/types/TagGroupTag.json +595 -0
  397. package/data/docs/types/TagGroupTagList.json +166 -0
  398. package/data/docs/types/Text.json +119 -0
  399. package/data/docs/types/TextInput.json +1156 -0
  400. package/data/docs/types/TextInputField.json +1263 -0
  401. package/data/docs/types/TimeInput.json +752 -0
  402. package/data/docs/types/ToastAction.json +9 -0
  403. package/data/docs/types/ToastManagerApi.json +9 -0
  404. package/data/docs/types/ToastOptions.json +9 -0
  405. package/data/docs/types/ToastOutlet.json +12 -0
  406. package/data/docs/types/ToastPlacement.json +9 -0
  407. package/data/docs/types/ToastPromiseOptions.json +9 -0
  408. package/data/docs/types/ToastType.json +9 -0
  409. package/data/docs/types/ToastVariant.json +9 -0
  410. package/data/docs/types/ToggleButton.json +789 -0
  411. package/data/docs/types/ToggleButtonGroup.json +9 -0
  412. package/data/docs/types/ToggleButtonGroupButton.json +331 -0
  413. package/data/docs/types/ToggleButtonGroupRoot.json +269 -0
  414. package/data/docs/types/Toolbar.json +176 -0
  415. package/data/docs/types/Tooltip.json +12 -0
  416. package/data/docs/types/TooltipContent.json +372 -0
  417. package/data/docs/types/TooltipRoot.json +179 -0
  418. package/data/docs/types/Trigger.json +69 -0
  419. package/data/docs/types/VisuallyHidden.json +93 -0
  420. package/data/docs/types/__object.json +12 -0
  421. package/data/docs/types/filters.json +11 -0
  422. package/data/docs/types/manifest.json +278 -0
  423. package/data/docs/types/toast.json +234 -0
  424. package/data/docs/types/useColorMode.json +13 -0
  425. package/data/docs/types/useColorModeValue.json +13 -0
  426. package/data/docs/types/useColorScheme.json +12 -0
  427. package/data/docs/types/useLocalizedStringFormatter.json +14 -0
  428. package/data/icons.json +21940 -0
  429. package/data/tokens.json +40061 -0
  430. package/dist/index.js +2516 -17
  431. package/package.json +25 -6
  432. package/dist/data-loader.d.ts +0 -102
  433. package/dist/data-loader.js +0 -104
  434. package/dist/index.d.ts +0 -13
  435. package/dist/server.d.ts +0 -9
  436. package/dist/server.js +0 -22
  437. package/dist/server.spec.d.ts +0 -1
  438. package/dist/server.spec.js +0 -69
  439. package/dist/tools/list-components.d.ts +0 -9
  440. package/dist/tools/list-components.js +0 -42
  441. package/dist/types.d.ts +0 -28
  442. package/dist/types.js +0 -4
  443. package/src/data-loader.ts +0 -226
  444. package/src/index.ts +0 -29
  445. package/src/server.spec.ts +0 -86
  446. package/src/server.ts +0 -28
  447. package/src/tools/list-components.ts +0 -49
  448. package/src/types.ts +0 -31
  449. package/tsconfig.json +0 -14
  450. package/vitest.config.ts +0 -9
@@ -0,0 +1,415 @@
1
+ {
2
+ "meta": {
3
+ "id": "Patterns-MoneyInputField",
4
+ "title": "Money input field",
5
+ "exportName": "MoneyInputField",
6
+ "description": "This pattern component integrates the MoneyInput within a FormField using a simple, consistent, and opinionated API.",
7
+ "order": 999,
8
+ "repoPath": "packages/nimbus/src/patterns/fields/money-input-field/money-input-field.mdx",
9
+ "menu": [
10
+ "Patterns",
11
+ "Fields",
12
+ "Money input field"
13
+ ],
14
+ "route": "patterns/fields/money-input-field",
15
+ "tags": [
16
+ "component",
17
+ "pattern",
18
+ "field",
19
+ "MoneyInput",
20
+ "MoneyInputField"
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
+ "layout": "app-frame",
46
+ "tabs": [
47
+ {
48
+ "key": "overview",
49
+ "title": "Overview",
50
+ "order": 0
51
+ },
52
+ {
53
+ "key": "dev",
54
+ "title": "Implementation",
55
+ "order": 3
56
+ }
57
+ ]
58
+ },
59
+ "mdx": "\n## Overview\n\nMoneyInputField is a pattern component that combines the FormField wrapper with the MoneyInput component. This integration provides a complete form field experience including accessible labels, helper text descriptions, info popovers for supplementary information, and comprehensive validation and error handling, all through a simplified, opinionated API.\n\nThe component contains two focusable inputs: a currency selector and an amount input field, providing an intuitive interface for monetary value entry with automatic formatting based on the selected currency.\n\n### Resources\n\nFor detailed guidance on the individual components that make up this pattern, consult the component guidelines:\n\n- [MoneyInput Guidelines](/components/inputs/moneyinput) - Monetary input patterns, currency handling, and interaction guidelines\n- [FormField Guidelines](/components/inputs/formfield) - Label options, helper text, validation patterns, and form field accessibility\n- [Storybook](https://nimbus-storybook.vercel.app/?path=/docs/patterns-fields-moneyinputfield--docs)\n",
60
+ "views": {
61
+ "overview": {
62
+ "mdx": "\n## Overview\n\nMoneyInputField is a pattern component that combines the FormField wrapper with the MoneyInput component. This integration provides a complete form field experience including accessible labels, helper text descriptions, info popovers for supplementary information, and comprehensive validation and error handling, all through a simplified, opinionated API.\n\nThe component contains two focusable inputs: a currency selector and an amount input field, providing an intuitive interface for monetary value entry with automatic formatting based on the selected currency.\n\n### Resources\n\nFor detailed guidance on the individual components that make up this pattern, consult the component guidelines:\n\n- [MoneyInput Guidelines](/components/inputs/moneyinput) - Monetary input patterns, currency handling, and interaction guidelines\n- [FormField Guidelines](/components/inputs/formfield) - Label options, helper text, validation patterns, and form field accessibility\n- [Storybook](https://nimbus-storybook.vercel.app/?path=/docs/patterns-fields-moneyinputfield--docs)\n",
63
+ "toc": [
64
+ {
65
+ "value": "Overview",
66
+ "href": "#overview",
67
+ "depth": 2,
68
+ "numbering": [
69
+ 1,
70
+ 1
71
+ ],
72
+ "parent": "root"
73
+ },
74
+ {
75
+ "value": "Resources",
76
+ "href": "#resources",
77
+ "depth": 3,
78
+ "numbering": [
79
+ 1,
80
+ 1,
81
+ 1
82
+ ],
83
+ "parent": "root"
84
+ }
85
+ ]
86
+ },
87
+ "dev": {
88
+ "mdx": "\n## Comparison: field pattern vs manual composition\n\n**With MoneyInputField:**\n```tsx\n<MoneyInputField\n label=\"Product Price\"\n description=\"Enter price with currency\"\n currencies={[\"USD\", \"EUR\", \"GBP\"]}\n value={{ amount: \"99.99\", currencyCode: \"USD\" }}\n onValueChange={setValue}\n errors={errors}\n touched={touched}\n isRequired\n/>\n```\n\n**Manual composition:**\n```tsx\n<FormField.Root isInvalid={!!(errors && touched)} isRequired>\n <FormField.Label>Product Price</FormField.Label>\n <FormField.Input>\n <MoneyInput\n currencies={[\"USD\", \"EUR\", \"GBP\"]}\n value={{ amount: \"99.99\", currencyCode: \"USD\" }}\n onValueChange={setValue}\n />\n </FormField.Input>\n <FormField.Description>\n Enter price with currency\n </FormField.Description>\n {touched && errors && (\n <FormField.Error>\n <FieldErrors errors={errors} />\n </FormField.Error>\n )}\n</FormField.Root>\n```\n\n### When to use which\n\n**Use MoneyInputField when:**\n- Building standard forms with typical field layouts\n- You want consistent field patterns across your app\n- You need built-in error handling with FieldErrors\n- You want to minimize boilerplate code\n\n**Use MoneyInput with manual FormField composition when:**\n- You need custom field layouts\n- You're building complex, non-standard forms\n- You need granular control over FormField sub-components\n- You require a different error handling implementation\n\n## Getting started\n\n### Import\n\n```tsx\nimport { MoneyInputField, type MoneyInputFieldProps, type MoneyInputValue } from '@commercetools/nimbus';\n```\n\n### Basic usage\n\nThe simplest implementation with a label and controlled state:\n\n```jsx live-dev\nconst App = () => {\n const [value, setValue] = useState<MoneyInputValue>({\n amount: \"\",\n currencyCode: \"USD\"\n });\n\n return (\n <MoneyInputField\n label=\"Product Price\"\n currencies={[\"USD\", \"EUR\", \"GBP\"]}\n value={value}\n onValueChange={setValue}\n />\n );\n}\n```\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 [valueSmall, setValueSmall] = useState<MoneyInputValue>({\n amount: \"\",\n currencyCode: \"USD\"\n });\n const [valueMedium, setValueMedium] = useState<MoneyInputValue>({\n amount: \"\",\n currencyCode: \"USD\"\n });\n\n return (\n <Stack direction=\"column\" gap=\"400\">\n <MoneyInputField\n size=\"sm\"\n label=\"Small input\"\n currencies={[\"USD\", \"EUR\", \"GBP\"]}\n value={valueSmall}\n onValueChange={setValueSmall}\n placeholder=\"0.00\"\n />\n <MoneyInputField\n size=\"md\"\n label=\"Medium input (default)\"\n currencies={[\"USD\", \"EUR\", \"GBP\"]}\n value={valueMedium}\n onValueChange={setValueMedium}\n placeholder=\"0.00\"\n />\n </Stack>\n );\n}\n```\n\n### With description\n\nAdd helper text below the input to provide context:\n\n```jsx live-dev\nconst App = () => {\n const [value, setValue] = useState<MoneyInputValue>({\n amount: \"\",\n currencyCode: \"USD\"\n });\n\n return (\n <MoneyInputField\n label=\"Product Price\"\n description=\"Enter the price including the appropriate currency\"\n currencies={[\"USD\", \"EUR\", \"GBP\", \"JPY\"]}\n value={value}\n onValueChange={setValue}\n placeholder=\"0.00\"\n />\n );\n}\n```\n\n### With validation errors\n\nShow error messages when the field is touched and has validation errors:\n\n```jsx live-dev\nconst App = () => {\n const [value, setValue] = useState<MoneyInputValue>({\n amount: \"\",\n currencyCode: \"USD\"\n });\n const [touched, setTouched] = useState<boolean>(false);\n\n // Simulate validation: require amount\n const errors = touched && !value.amount ? { missing: true } : undefined;\n\n return (\n <MoneyInputField\n label=\"Product Price\"\n description=\"Enter a valid price\"\n currencies={[\"USD\", \"EUR\", \"GBP\"]}\n value={value}\n onValueChange={setValue}\n onBlur={() => setTouched(true)}\n errors={errors}\n touched={touched}\n isRequired\n placeholder=\"0.00\"\n />\n );\n}\n```\n\n**Note**: Errors only display when both `touched={true}` and `errors` exist. This prevents showing errors before the user interacts with the field.\n\n### With info popover\n\nProvide additional context through an info button and popover:\n\n```jsx live-dev\nconst App = () => {\n const [value, setValue] = useState<MoneyInputValue>({\n amount: \"\",\n currencyCode: \"USD\"\n });\n\n return (\n <MoneyInputField\n label=\"Product Price\"\n description=\"Enter the retail price\"\n info=\"Prices should be competitive and reflect current market rates. Consider including any applicable taxes.\"\n currencies={[\"USD\", \"EUR\", \"GBP\"]}\n value={value}\n onValueChange={setValue}\n placeholder=\"0.00\"\n />\n );\n}\n```\n\n### Required field\n\nMark fields as required with the `isRequired` prop:\n\n```jsx live-dev\nconst App = () => {\n const [value, setValue] = useState<MoneyInputValue>({\n amount: \"\",\n currencyCode: \"USD\"\n });\n\n return (\n <MoneyInputField\n label=\"Product Price\"\n description=\"This field is required\"\n currencies={[\"USD\", \"EUR\", \"GBP\"]}\n value={value}\n onValueChange={setValue}\n isRequired\n placeholder=\"0.00\"\n />\n );\n}\n```\n\n### Disabled state\n\nPrevent user interaction with the `isDisabled` prop:\n\n```jsx live-dev\nconst App = () => {\n const [value, setValue] = useState<MoneyInputValue>({\n amount: \"99.99\",\n currencyCode: \"USD\"\n });\n\n return (\n <MoneyInputField\n label=\"Default Price\"\n description=\"This field cannot be modified\"\n currencies={[\"USD\", \"EUR\", \"GBP\"]}\n value={value}\n onValueChange={setValue}\n isDisabled\n />\n );\n}\n```\n\n### Read-only state\n\nDisplay a non-editable value with the `isReadOnly` prop:\n\n```jsx live-dev\nconst App = () => {\n const [value, setValue] = useState<MoneyInputValue>({\n amount: \"199.99\",\n currencyCode: \"EUR\"\n });\n\n return (\n <MoneyInputField\n label=\"System Price\"\n description=\"This value is automatically calculated\"\n currencies={[\"USD\", \"EUR\", \"GBP\"]}\n value={value}\n onValueChange={setValue}\n isReadOnly\n />\n );\n}\n```\n\n### With high precision amounts\n\nMoneyInput automatically detects when an amount has more decimal places than the currency standard and displays a badge. The badge is shown by default but can be disabled:\n\n```jsx live-dev\nconst App = () => {\n const [value, setValue] = useState<MoneyInputValue>({\n amount: \"99.99999\",\n currencyCode: \"USD\"\n });\n\n return (\n <MoneyInputField\n label=\"Wholesale Price\"\n description=\"High precision price with 5 decimal places\"\n currencies={[\"USD\", \"EUR\", \"GBP\"]}\n value={value}\n onValueChange={setValue}\n />\n );\n}\n```\n\nThe high precision badge appears automatically when the amount has more decimal places than the currency standard (e.g., USD typically uses 2 decimals, so \"99.999\" triggers the badge). Use `hasHighPrecisionBadge={false}` to disable the badge if needed.\n\n### With currency selector disabled\n\nKeep the currency fixed while allowing amount changes:\n\n```jsx live-dev\nconst App = () => {\n const [value, setValue] = useState<MoneyInputValue>({\n amount: \"\",\n currencyCode: \"USD\"\n });\n\n return (\n <MoneyInputField\n label=\"Price (USD only)\"\n description=\"Currency is fixed to USD\"\n currencies={[\"USD\", \"EUR\", \"GBP\"]}\n value={value}\n onValueChange={setValue}\n isCurrencyInputDisabled\n placeholder=\"0.00\"\n />\n );\n}\n```\n\n### Different currency standards\n\nMoneyInput automatically formats amounts based on the selected currency:\n\n```jsx live-dev\nconst App = () => {\n const [usd, setUsd] = useState<MoneyInputValue>({\n amount: \"99.99\",\n currencyCode: \"USD\"\n });\n const [jpy, setJpy] = useState<MoneyInputValue>({\n amount: \"9999\",\n currencyCode: \"JPY\"\n });\n const [kwd, setKwd] = useState<MoneyInputValue>({\n amount: \"99.999\",\n currencyCode: \"KWD\"\n });\n\n return (\n <Stack direction=\"column\" gap=\"400\">\n <MoneyInputField\n label=\"US Dollars (2 decimals)\"\n description=\"Standard 2 decimal places\"\n currencies={[\"USD\"]}\n value={usd}\n onValueChange={setUsd}\n />\n <MoneyInputField\n label=\"Japanese Yen (0 decimals)\"\n description=\"Whole numbers only\"\n currencies={[\"JPY\"]}\n value={jpy}\n onValueChange={setJpy}\n />\n <MoneyInputField\n label=\"Kuwaiti Dinar (3 decimals)\"\n description=\"High precision with 3 decimal places\"\n currencies={[\"KWD\"]}\n value={kwd}\n onValueChange={setKwd}\n />\n </Stack>\n );\n}\n```\n\n## Component requirements\n\n### Value type\n\nMoneyInputField uses the `MoneyInputValue` type:\n\n```tsx\ntype MoneyInputValue = {\n amount: string; // String representation with decimal (e.g., \"123.45\")\n currencyCode: CurrencyCode | \"\"; // ISO currency code or empty string\n}\n\n// CurrencyCode supports 221 ISO 4217 currency codes including:\n// \"USD\", \"EUR\", \"GBP\", \"JPY\", \"CNY\", \"INR\", \"AUD\", \"CAD\", \"CHF\", \"KWD\", etc.\ntype CurrencyCode = keyof typeof currencies;\n```\n\n**Important**:\n- The `amount` is always a string, not a number\n- Use a dot (`.`) as the decimal separator\n- Empty amount should be `\"\"` (empty string)\n- The component handles currency-specific formatting automatically\n- Supported currencies are defined in `@commercetools/nimbus/src/components/money-input/utils/currencies.ts`\n\n### Dual input nature\n\nMoneyInputField contains **two focusable inputs**:\n1. **Currency selector** (combobox) - For choosing the currency\n2. **Amount input** (spinbutton) - For entering the monetary value\n\nBoth inputs receive separate IDs based on the field's `id` or `name` prop:\n- Amount: `${id}.amount` or `${name}.amount`\n- Currency: `${id}.currencyCode` or `${name}.currencyCode`\n\n### Error handling\n\nMoneyInputField uses the `FieldErrors` component to display validation errors with built-in localized messages. For custom error messages, use the `renderError` prop (see [Custom error rendering](#custom-error-rendering) below).\n\n**Error object format** (`FieldErrorsData`):\n```tsx\ntype FieldErrorsData = {\n [key: string]: boolean | string | ReactNode;\n};\n\n// Examples:\nconst errors = {\n missing: true, // Built-in message: \"This field is required\"\n invalidFormat: true, // Built-in message: \"Please enter a valid format\"\n custom: \"Custom error text\" // Custom message\n};\n```\n\n## Accessibility\n\nMoneyInputField provides comprehensive accessibility through [FormField](components/inputs/formfield):\n\n**Automatic ARIA relationships:**\n- Labels connected via `aria-labelledby`\n- Descriptions connected via `aria-describedby`\n- Error messages connected via `aria-describedby`\n- Required fields indicated with `aria-required`\n- Invalid state indicated with `aria-invalid`\n\nIf your use case requires tracking and analytics for this component, add a **persistent**, **unique** id:\n\n```tsx\nconst PERSISTENT_ID = \"product-price-input\";\n\nexport const Example = () => (\n <MoneyInputField\n id={PERSISTENT_ID}\n label=\"Product Price\"\n currencies={[\"USD\", \"EUR\", \"GBP\"]}\n value={value}\n onValueChange={setValue}\n />\n);\n```\n\n#### Keyboard navigation\n\nThe component supports keyboard interaction for both inputs:\n- `Tab` / `Shift+Tab`: Move focus between currency selector and amount input\n- **Currency selector**: Arrow keys navigate options, Enter/Space to select\n- **Amount input**: Arrow up/down to increment/decrement, number keys to type\n- `Home` / `End`: Move to start/end of amount\n- `Escape`: Close currency dropdown\n\n## Form integration\n\nMoneyInputField integrates seamlessly with Formik:\n\n```tsx\nimport { useFormik } from 'formik';\nimport { MoneyInputField, Button, Stack } from '@commercetools/nimbus';\nimport type { MoneyInputValue } from '@commercetools/nimbus';\n\nconst MyForm = () => {\n const formik = useFormik({\n initialValues: {\n price: { amount: \"\", currencyCode: \"USD\" } as MoneyInputValue,\n },\n validate: (values) => {\n const errors: Record<string, any> = {};\n\n if (!values.price.amount) {\n errors.price = { missing: true };\n } else {\n const amount = parseFloat(values.price.amount);\n if (isNaN(amount) || amount <= 0) {\n errors.price = { invalidAmount: true };\n }\n }\n\n return errors;\n },\n onSubmit: (values) => {\n console.log('Submitted:', values);\n },\n });\n\n return (\n <form onSubmit={formik.handleSubmit}>\n <Stack direction=\"column\" gap=\"400\">\n <MoneyInputField\n name=\"price\"\n label=\"Product Price\"\n description=\"Enter the product price with currency\"\n currencies={[\"USD\", \"EUR\", \"GBP\", \"JPY\"]}\n value={formik.values.price}\n onValueChange={(value) => formik.setFieldValue('price', value)}\n onBlur={() => formik.setFieldTouched('price', true)}\n errors={formik.errors.price}\n touched={formik.touched.price}\n isRequired\n placeholder=\"0.00\"\n />\n <Button type=\"submit\">Submit</Button>\n </Stack>\n </form>\n );\n};\n```\n\n**Key integration points:**\n- **Value/OnChange**: Connect Formik values with `value` and `setFieldValue`\n- **OnBlur**: Mark field as touched on blur\n- **Errors**: Pass `errors.fieldName` (supports `FieldErrorsData` format or strings)\n- **Touched**: Pass `touched.fieldName` to control error visibility\n\n## API reference\n\n<PropsTable id=\"MoneyInputField\" />\n\n### Custom error rendering\n\nUse the `renderError` prop to customize how specific error keys are displayed:\n\n```tsx\n<MoneyInputField\n label=\"Product Price\"\n currencies={[\"USD\", \"EUR\", \"GBP\"]}\n value={value}\n onValueChange={setValue}\n errors={{ tooLow: true, invalidAmount: true }}\n touched={true}\n renderError={(key) => {\n switch (key) {\n case 'tooLow':\n return 'Price must be at least $10.00';\n case 'invalidAmount':\n return 'Please enter a valid monetary amount';\n default:\n return null; // Fall back to FieldErrors built-in messages\n }\n }}\n/>\n```\n\n## Testing your implementation\n\nThese examples demonstrate how to test your implementation when using MoneyInputField 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:\n\n```tsx\nimport { render, screen } from '@testing-library/react';\nimport { MoneyInputField } from '@commercetools/nimbus';\n\ndescribe('MoneyInputField', () => {\n it('renders label and both inputs', () => {\n render(\n <MoneyInputField\n label=\"Product Price\"\n currencies={[\"USD\", \"EUR\", \"GBP\"]}\n value={{ amount: \"\", currencyCode: \"USD\" }}\n onValueChange={() => {}}\n />\n );\n\n // Verify label is rendered\n expect(screen.getByText('Product Price')).toBeInTheDocument();\n\n // Verify currency selector is rendered\n expect(screen.getByRole('combobox')).toBeInTheDocument();\n\n // Verify amount input is rendered\n expect(screen.getByRole('spinbutton')).toBeInTheDocument();\n });\n\n it('renders description text', () => {\n render(\n <MoneyInputField\n label=\"Price\"\n description=\"Enter product price\"\n currencies={[\"USD\"]}\n value={{ amount: \"\", currencyCode: \"USD\" }}\n onValueChange={() => {}}\n />\n );\n\n expect(screen.getByText('Enter product price')).toBeInTheDocument();\n });\n\n it('shows required indicator', () => {\n render(\n <MoneyInputField\n label=\"Required price\"\n currencies={[\"USD\"]}\n value={{ amount: \"\", currencyCode: \"USD\" }}\n onValueChange={() => {}}\n isRequired\n />\n );\n\n const amountInput = screen.getByRole('spinbutton');\n expect(amountInput).toHaveAttribute('aria-required', 'true');\n });\n});\n```\n\n### Interaction tests\n\nTest user interactions with both inputs:\n\n```tsx\nimport { render, screen, waitFor } from '@testing-library/react';\nimport userEvent from '@testing-library/user-event';\nimport { MoneyInputField } from '@commercetools/nimbus';\n\ndescribe('MoneyInputField interactions', () => {\n it('calls onValueChange when user types amount', async () => {\n const user = userEvent.setup();\n const handleChange = jest.fn();\n\n render(\n <MoneyInputField\n label=\"Price\"\n currencies={[\"USD\", \"EUR\"]}\n value={{ amount: \"\", currencyCode: \"USD\" }}\n onValueChange={handleChange}\n />\n );\n\n const amountInput = screen.getByRole('spinbutton');\n await user.type(amountInput, '99.99');\n\n expect(handleChange).toHaveBeenCalled();\n expect(handleChange).toHaveBeenLastCalledWith(\n expect.objectContaining({ amount: expect.stringContaining('99.99') })\n );\n });\n\n it('calls onValueChange when user changes currency', async () => {\n const user = userEvent.setup();\n const handleChange = jest.fn();\n\n render(\n <MoneyInputField\n label=\"Price\"\n currencies={[\"USD\", \"EUR\", \"GBP\"]}\n value={{ amount: \"99.99\", currencyCode: \"USD\" }}\n onValueChange={handleChange}\n />\n );\n\n const currencySelect = screen.getByRole('combobox');\n await user.click(currencySelect);\n\n // Wait for listbox and select EUR\n await waitFor(() => {\n expect(screen.getByRole('listbox')).toBeInTheDocument();\n });\n\n const eurOption = screen.getByRole('option', { name: /EUR/ });\n await user.click(eurOption);\n\n expect(handleChange).toHaveBeenCalledWith(\n expect.objectContaining({ currencyCode: 'EUR' })\n );\n });\n\n it('does not call onValueChange when disabled', async () => {\n const user = userEvent.setup();\n const handleChange = jest.fn();\n\n render(\n <MoneyInputField\n label=\"Price\"\n currencies={[\"USD\"]}\n value={{ amount: \"\", currencyCode: \"USD\" }}\n onValueChange={handleChange}\n isDisabled\n />\n );\n\n const amountInput = screen.getByRole('spinbutton');\n expect(amountInput).toBeDisabled();\n\n await user.type(amountInput, '99.99');\n expect(handleChange).not.toHaveBeenCalled();\n });\n});\n```\n\n### Testing validation and errors\n\nTest error handling and validation behavior:\n\n```tsx\nimport { render, screen } from '@testing-library/react';\nimport { MoneyInputField } from '@commercetools/nimbus';\n\ndescribe('MoneyInputField validation', () => {\n it('does not show errors when untouched', () => {\n render(\n <MoneyInputField\n label=\"Price\"\n currencies={[\"USD\"]}\n value={{ amount: \"\", currencyCode: \"USD\" }}\n onValueChange={() => {}}\n errors={{ missing: true }}\n touched={false}\n />\n );\n\n expect(screen.queryByText(/required/i)).not.toBeInTheDocument();\n });\n\n it('shows errors when touched', () => {\n render(\n <MoneyInputField\n label=\"Price\"\n currencies={[\"USD\"]}\n value={{ amount: \"\", currencyCode: \"USD\" }}\n onValueChange={() => {}}\n errors={{ missing: true }}\n touched={true}\n />\n );\n\n expect(screen.getByText(/required/i)).toBeInTheDocument();\n });\n\n it('applies invalid styling when isInvalid is true', () => {\n render(\n <MoneyInputField\n label=\"Price\"\n currencies={[\"USD\"]}\n value={{ amount: \"\", currencyCode: \"USD\" }}\n onValueChange={() => {}}\n isInvalid\n />\n );\n\n const amountInput = screen.getByRole('spinbutton');\n expect(amountInput).toHaveAttribute('data-invalid', 'true');\n });\n});\n```\n\n## Resources\n\n- [Storybook](https://nimbus-storybook.vercel.app/?path=/docs/patterns-fields-moneyinputfield--docs)\n- [MoneyInput Component](/components/inputs/moneyinput)\n- [FormField Component](/components/inputs/formfield)\n- [FieldErrors Component](/components/forms/fielderrors)\n- [React Aria NumberField](https://react-spectrum.adobe.com/react-aria/NumberField.html)\n",
89
+ "toc": [
90
+ {
91
+ "value": "Comparison: field pattern vs manual composition",
92
+ "href": "#comparison-field-pattern-vs-manual-composition",
93
+ "depth": 2,
94
+ "numbering": [
95
+ 1,
96
+ 1
97
+ ],
98
+ "parent": "root"
99
+ },
100
+ {
101
+ "value": "When to use which",
102
+ "href": "#when-to-use-which",
103
+ "depth": 3,
104
+ "numbering": [
105
+ 1,
106
+ 1,
107
+ 1
108
+ ],
109
+ "parent": "root"
110
+ },
111
+ {
112
+ "value": "Getting started",
113
+ "href": "#getting-started",
114
+ "depth": 2,
115
+ "numbering": [
116
+ 1,
117
+ 2
118
+ ],
119
+ "parent": "root"
120
+ },
121
+ {
122
+ "value": "Import",
123
+ "href": "#import",
124
+ "depth": 3,
125
+ "numbering": [
126
+ 1,
127
+ 2,
128
+ 1
129
+ ],
130
+ "parent": "root"
131
+ },
132
+ {
133
+ "value": "Basic usage",
134
+ "href": "#basic-usage",
135
+ "depth": 3,
136
+ "numbering": [
137
+ 1,
138
+ 2,
139
+ 2
140
+ ],
141
+ "parent": "root"
142
+ },
143
+ {
144
+ "value": "Usage examples",
145
+ "href": "#usage-examples",
146
+ "depth": 2,
147
+ "numbering": [
148
+ 1,
149
+ 3
150
+ ],
151
+ "parent": "root"
152
+ },
153
+ {
154
+ "value": "Size options",
155
+ "href": "#size-options",
156
+ "depth": 3,
157
+ "numbering": [
158
+ 1,
159
+ 3,
160
+ 1
161
+ ],
162
+ "parent": "root"
163
+ },
164
+ {
165
+ "value": "With description",
166
+ "href": "#with-description",
167
+ "depth": 3,
168
+ "numbering": [
169
+ 1,
170
+ 3,
171
+ 2
172
+ ],
173
+ "parent": "root"
174
+ },
175
+ {
176
+ "value": "With validation errors",
177
+ "href": "#with-validation-errors",
178
+ "depth": 3,
179
+ "numbering": [
180
+ 1,
181
+ 3,
182
+ 3
183
+ ],
184
+ "parent": "root"
185
+ },
186
+ {
187
+ "value": "With info popover",
188
+ "href": "#with-info-popover",
189
+ "depth": 3,
190
+ "numbering": [
191
+ 1,
192
+ 3,
193
+ 4
194
+ ],
195
+ "parent": "root"
196
+ },
197
+ {
198
+ "value": "Required field",
199
+ "href": "#required-field",
200
+ "depth": 3,
201
+ "numbering": [
202
+ 1,
203
+ 3,
204
+ 5
205
+ ],
206
+ "parent": "root"
207
+ },
208
+ {
209
+ "value": "Disabled state",
210
+ "href": "#disabled-state",
211
+ "depth": 3,
212
+ "numbering": [
213
+ 1,
214
+ 3,
215
+ 6
216
+ ],
217
+ "parent": "root"
218
+ },
219
+ {
220
+ "value": "Read-only state",
221
+ "href": "#read-only-state",
222
+ "depth": 3,
223
+ "numbering": [
224
+ 1,
225
+ 3,
226
+ 7
227
+ ],
228
+ "parent": "root"
229
+ },
230
+ {
231
+ "value": "With high precision amounts",
232
+ "href": "#with-high-precision-amounts",
233
+ "depth": 3,
234
+ "numbering": [
235
+ 1,
236
+ 3,
237
+ 8
238
+ ],
239
+ "parent": "root"
240
+ },
241
+ {
242
+ "value": "With currency selector disabled",
243
+ "href": "#with-currency-selector-disabled",
244
+ "depth": 3,
245
+ "numbering": [
246
+ 1,
247
+ 3,
248
+ 9
249
+ ],
250
+ "parent": "root"
251
+ },
252
+ {
253
+ "value": "Different currency standards",
254
+ "href": "#different-currency-standards",
255
+ "depth": 3,
256
+ "numbering": [
257
+ 1,
258
+ 3,
259
+ 10
260
+ ],
261
+ "parent": "root"
262
+ },
263
+ {
264
+ "value": "Component requirements",
265
+ "href": "#component-requirements",
266
+ "depth": 2,
267
+ "numbering": [
268
+ 1,
269
+ 4
270
+ ],
271
+ "parent": "root"
272
+ },
273
+ {
274
+ "value": "Value type",
275
+ "href": "#value-type",
276
+ "depth": 3,
277
+ "numbering": [
278
+ 1,
279
+ 4,
280
+ 1
281
+ ],
282
+ "parent": "root"
283
+ },
284
+ {
285
+ "value": "Dual input nature",
286
+ "href": "#dual-input-nature",
287
+ "depth": 3,
288
+ "numbering": [
289
+ 1,
290
+ 4,
291
+ 2
292
+ ],
293
+ "parent": "root"
294
+ },
295
+ {
296
+ "value": "Error handling",
297
+ "href": "#error-handling",
298
+ "depth": 3,
299
+ "numbering": [
300
+ 1,
301
+ 4,
302
+ 3
303
+ ],
304
+ "parent": "root"
305
+ },
306
+ {
307
+ "value": "Accessibility",
308
+ "href": "#accessibility",
309
+ "depth": 2,
310
+ "numbering": [
311
+ 1,
312
+ 5
313
+ ],
314
+ "parent": "root"
315
+ },
316
+ {
317
+ "value": "Keyboard navigation",
318
+ "href": "#keyboard-navigation",
319
+ "depth": 4,
320
+ "numbering": [
321
+ 1,
322
+ 5,
323
+ 1,
324
+ 1
325
+ ],
326
+ "parent": "root"
327
+ },
328
+ {
329
+ "value": "Form integration",
330
+ "href": "#form-integration",
331
+ "depth": 2,
332
+ "numbering": [
333
+ 1,
334
+ 6
335
+ ],
336
+ "parent": "root"
337
+ },
338
+ {
339
+ "value": "API reference",
340
+ "href": "#api-reference",
341
+ "depth": 2,
342
+ "numbering": [
343
+ 1,
344
+ 7
345
+ ],
346
+ "parent": "root"
347
+ },
348
+ {
349
+ "value": "Custom error rendering",
350
+ "href": "#custom-error-rendering",
351
+ "depth": 3,
352
+ "numbering": [
353
+ 1,
354
+ 7,
355
+ 1
356
+ ],
357
+ "parent": "root"
358
+ },
359
+ {
360
+ "value": "Testing your implementation",
361
+ "href": "#testing-your-implementation",
362
+ "depth": 2,
363
+ "numbering": [
364
+ 1,
365
+ 8
366
+ ],
367
+ "parent": "root"
368
+ },
369
+ {
370
+ "value": "Basic rendering tests",
371
+ "href": "#basic-rendering-tests",
372
+ "depth": 3,
373
+ "numbering": [
374
+ 1,
375
+ 8,
376
+ 1
377
+ ],
378
+ "parent": "root"
379
+ },
380
+ {
381
+ "value": "Interaction tests",
382
+ "href": "#interaction-tests",
383
+ "depth": 3,
384
+ "numbering": [
385
+ 1,
386
+ 8,
387
+ 2
388
+ ],
389
+ "parent": "root"
390
+ },
391
+ {
392
+ "value": "Testing validation and errors",
393
+ "href": "#testing-validation-and-errors",
394
+ "depth": 3,
395
+ "numbering": [
396
+ 1,
397
+ 8,
398
+ 3
399
+ ],
400
+ "parent": "root"
401
+ },
402
+ {
403
+ "value": "Resources",
404
+ "href": "#resources",
405
+ "depth": 2,
406
+ "numbering": [
407
+ 1,
408
+ 9
409
+ ],
410
+ "parent": "root"
411
+ }
412
+ ]
413
+ }
414
+ }
415
+ }