@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,470 @@
1
+ {
2
+ "meta": {
3
+ "id": "Patterns-NumberInputField",
4
+ "title": "Number input field",
5
+ "exportName": "NumberInputField",
6
+ "description": "This pattern component integrates the NumberInput within a FormField using a simple, consistent, and opinionated API.",
7
+ "order": 999,
8
+ "repoPath": "packages/nimbus/src/patterns/fields/number-input-field/number-input-field.mdx",
9
+ "menu": [
10
+ "Patterns",
11
+ "Fields",
12
+ "Number input field"
13
+ ],
14
+ "route": "patterns/fields/number-input-field",
15
+ "tags": [
16
+ "component",
17
+ "pattern",
18
+ "field",
19
+ "NumberInput",
20
+ "NumberInputField"
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\nNumberInputField is a pattern component that combines the FormField wrapper with the NumberInput 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 features increment and decrement buttons, keyboard navigation, locale-aware number formatting, and supports min/max constraints, step values, and custom format options for currency, percentages, and other numeric formats.\n\n### Resources\n\nFor detailed guidance on the individual components that make up this pattern, consult the component guidelines:\n\n- [NumberInput Guidelines](/components/inputs/number-input) - Numeric input patterns, formatting options, 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-numberinputfield--docs)\n",
60
+ "views": {
61
+ "overview": {
62
+ "mdx": "\n## Overview\n\nNumberInputField is a pattern component that combines the FormField wrapper with the NumberInput 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 features increment and decrement buttons, keyboard navigation, locale-aware number formatting, and supports min/max constraints, step values, and custom format options for currency, percentages, and other numeric formats.\n\n### Resources\n\nFor detailed guidance on the individual components that make up this pattern, consult the component guidelines:\n\n- [NumberInput Guidelines](/components/inputs/number-input) - Numeric input patterns, formatting options, 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-numberinputfield--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 NumberInputField:**\n```tsx\n<NumberInputField\n label=\"Quantity\"\n description=\"Enter the product quantity\"\n value={quantity}\n onChange={setQuantity}\n minValue={1}\n maxValue={100}\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>Quantity</FormField.Label>\n <FormField.Input>\n <NumberInput\n value={quantity}\n onChange={setQuantity}\n minValue={1}\n maxValue={100}\n width=\"full\"\n />\n </FormField.Input>\n <FormField.Description>\n Enter the product quantity\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 NumberInputField 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 NumberInput 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 { NumberInputField, type NumberInputFieldProps } 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<number>(0);\n\n return (\n <NumberInputField\n label=\"Quantity\"\n value={value}\n onChange={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<number>(0);\n const [valueMedium, setValueMedium] = useState<number>(0);\n\n return (\n <Stack direction=\"column\" gap=\"400\">\n <NumberInputField\n size=\"sm\"\n label=\"Small input\"\n value={valueSmall}\n onChange={setValueSmall}\n placeholder=\"0\"\n />\n <NumberInputField\n size=\"md\"\n label=\"Medium input\"\n value={valueMedium}\n onChange={setValueMedium}\n placeholder=\"0 (default)\"\n />\n </Stack>\n );\n}\n```\n\n### Visual variants\n\nChoose between `solid` and `ghost` variants to match your design context:\n\n```jsx live-dev\nconst App = () => {\n const [valueSolid, setValueSolid] = useState<number>(42);\n const [valueGhost, setValueGhost] = useState<number>(42);\n\n return (\n <Stack direction=\"column\" gap=\"400\">\n <NumberInputField\n variant=\"solid\"\n label=\"Solid variant\"\n value={valueSolid}\n onChange={setValueSolid}\n placeholder=\"0\"\n />\n <NumberInputField\n variant=\"ghost\"\n label=\"Ghost variant\"\n value={valueGhost}\n onChange={setValueGhost}\n placeholder=\"0\"\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<number>(10);\n\n return (\n <NumberInputField\n label=\"Product quantity\"\n description=\"Enter the number of items in stock\"\n value={value}\n onChange={setValue}\n minValue={0}\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<number | undefined>(undefined);\n const [touched, setTouched] = useState<boolean>(false);\n\n // Simulate validation: require a value and minimum of 1\n const errors = touched && (!value || value < 1) ? { missing: true } : undefined;\n\n return (\n <NumberInputField\n label=\"Quantity\"\n description=\"Enter at least 1 item\"\n value={value}\n onChange={setValue}\n onBlur={() => setTouched(true)}\n errors={errors}\n touched={touched}\n isRequired\n minValue={1}\n placeholder=\"0\"\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<number>(50);\n\n return (\n <NumberInputField\n label=\"Stock Level\"\n description=\"Current inventory count\"\n info=\"This represents the total quantity available in all warehouses. The value updates automatically when orders are placed or shipments are received.\"\n value={value}\n onChange={setValue}\n minValue={0}\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<number | undefined>(undefined);\n\n return (\n <NumberInputField\n label=\"Age\"\n description=\"Enter your age\"\n value={value}\n onChange={setValue}\n isRequired\n minValue={0}\n maxValue={120}\n placeholder=\"0\"\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<number>(999);\n\n return (\n <NumberInputField\n label=\"System-calculated total\"\n description=\"This field is automatically calculated\"\n value={value}\n onChange={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<number>(12345);\n\n return (\n <NumberInputField\n label=\"Order number\"\n description=\"This value is automatically generated\"\n value={value}\n onChange={setValue}\n isReadOnly\n />\n );\n}\n```\n\n### Min and max constraints\n\nEnforce value boundaries with `minValue` and `maxValue`:\n\n```jsx live-dev\nconst App = () => {\n const [percentage, setPercentage] = useState<number>(50);\n\n return (\n <NumberInputField\n label=\"Discount percentage\"\n description=\"Enter a value between 0 and 100\"\n value={percentage}\n onChange={setPercentage}\n minValue={0}\n maxValue={100}\n trailingElement=\"%\"\n />\n );\n}\n```\n\n### Custom step increments\n\nUse the `step` prop to control increment/decrement amounts:\n\n```jsx live-dev\nconst App = () => {\n const [price, setPrice] = useState<number>(5.00);\n\n return (\n <NumberInputField\n label=\"Price\"\n description=\"Increments of $0.25\"\n value={price}\n onChange={setPrice}\n step={0.25}\n minValue={0}\n formatOptions={{\n style: 'currency',\n currency: 'USD',\n }}\n />\n );\n}\n```\n\n### Currency formatting\n\nFormat values as currency using `formatOptions`:\n\n```jsx live-dev\nconst App = () => {\n const [amount, setAmount] = useState<number>(1234.56);\n\n return (\n <Stack direction=\"column\" gap=\"400\">\n <NumberInputField\n label=\"USD Amount\"\n value={amount}\n onChange={setAmount}\n formatOptions={{\n style: 'currency',\n currency: 'USD',\n }}\n />\n <NumberInputField\n label=\"EUR Amount\"\n value={amount}\n onChange={setAmount}\n formatOptions={{\n style: 'currency',\n currency: 'EUR',\n }}\n />\n <NumberInputField\n label=\"JPY Amount\"\n value={amount}\n onChange={setAmount}\n formatOptions={{\n style: 'currency',\n currency: 'JPY',\n }}\n />\n </Stack>\n );\n}\n```\n\n### Percentage formatting\n\nFormat values as percentages:\n\n```jsx live-dev\nconst App = () => {\n const [rate, setRate] = useState<number>(0.25);\n\n return (\n <NumberInputField\n label=\"Interest Rate\"\n description=\"Enter as a decimal (0.25 = 25%)\"\n value={rate}\n onChange={setRate}\n step={0.01}\n minValue={0}\n maxValue={1}\n formatOptions={{\n style: 'percent',\n }}\n />\n );\n}\n```\n\n### With leading element\n\nAdd icons or text before the input:\n\n```jsx live-dev\nconst App = () => {\n const [price, setPrice] = useState<number>(99.99);\n\n return (\n <NumberInputField\n label=\"Product price\"\n description=\"Enter the price in USD\"\n value={price}\n onChange={setPrice}\n leadingElement=\"$\"\n minValue={0}\n />\n );\n}\n```\n\n### With trailing element\n\nAdd units or symbols after the input:\n\n```jsx live-dev\nconst App = () => {\n const [weight, setWeight] = useState<number>(150);\n const [temperature, setTemperature] = useState<number>(72);\n\n return (\n <Stack direction=\"column\" gap=\"400\">\n <NumberInputField\n label=\"Weight\"\n value={weight}\n onChange={setWeight}\n trailingElement=\"lbs\"\n minValue={0}\n />\n <NumberInputField\n label=\"Temperature\"\n value={temperature}\n onChange={setTemperature}\n trailingElement=\"°F\"\n />\n </Stack>\n );\n}\n```\n\n### Decimal precision\n\nControl decimal places with format options:\n\n```jsx live-dev\nconst App = () => {\n const [value1, setValue1] = useState<number>(3.14159);\n const [value2, setValue2] = useState<number>(3.14159);\n\n return (\n <Stack direction=\"column\" gap=\"400\">\n <NumberInputField\n label=\"Two decimal places\"\n value={value1}\n onChange={setValue1}\n formatOptions={{\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }}\n />\n <NumberInputField\n label=\"Four decimal places\"\n value={value2}\n onChange={setValue2}\n formatOptions={{\n minimumFractionDigits: 4,\n maximumFractionDigits: 4,\n }}\n />\n </Stack>\n );\n}\n```\n\n## Component requirements\n\n### Error handling\n\nNumberInputField 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// Common numeric validation errors:\nconst errors = {\n missing: true, // \"This field is required\"\n negative: true, // \"Please enter a positive number\"\n belowMin: true, // \"Value is below minimum\"\n aboveMax: true, // \"Value is above maximum\"\n fractions: true, // \"Please enter a whole number\"\n custom: \"Must be even\" // Custom message\n};\n```\n\n## Accessibility\n\nNumberInputField provides comprehensive accessibility through [FormField](components/inputs/formfield) and [NumberInput](components/inputs/number-input):\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- Value bounds communicated via `aria-valuemin` and `aria-valuemax`\n- Current value communicated via `aria-valuenow`\n- Increment/decrement buttons with localized `aria-label`\n\nIf your use case requires tracking and analytics for this component, add a **persistent**, **unique** id:\n\n```tsx\nconst PERSISTENT_ID = \"example-number-input\";\n\nexport const Example = () => (\n <NumberInputField\n id={PERSISTENT_ID}\n label=\"Quantity\"\n value={value}\n onChange={setValue}\n />\n);\n```\n\n#### Keyboard navigation\n\nThe component supports standard numeric input keyboard interaction:\n- `Tab` / `Shift+Tab`: Move focus to/from the input\n- `Arrow Up` / `Arrow Down`: Increment/decrement value (when focused)\n- `Page Up` / `Page Down`: Increment/decrement by larger amount\n- `Home`: Set to minimum value (if `minValue` specified)\n- `End`: Set to maximum value (if `maxValue` specified)\n- Number keys: Enter numeric values\n- `-` (minus): Enter negative values (if allowed)\n- `.` (period): Enter decimal point\n\n## Form integration\n\nNumberInputField integrates seamlessly with Formik:\n\n```tsx\nimport { useFormik } from 'formik';\nimport { NumberInputField, Button, Stack } from '@commercetools/nimbus';\n\nconst MyForm = () => {\n const formik = useFormik({\n initialValues: {\n quantity: 1,\n price: 0,\n },\n validate: (values) => {\n const errors = {};\n\n if (!values.quantity) {\n errors.quantity = { missing: true };\n } else if (values.quantity < 1) {\n errors.quantity = { belowMin: true };\n } else if (values.quantity > 100) {\n errors.quantity = { aboveMax: true };\n }\n\n if (!values.price) {\n errors.price = { missing: true };\n } else if (values.price < 0) {\n errors.price = { negative: true };\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 <NumberInputField\n name=\"quantity\"\n label=\"Quantity\"\n description=\"Enter quantity (1-100)\"\n value={formik.values.quantity}\n onChange={(value) => formik.setFieldValue('quantity', value)}\n onBlur={() => formik.setFieldTouched('quantity', true)}\n errors={formik.errors.quantity}\n touched={formik.touched.quantity}\n minValue={1}\n maxValue={100}\n isRequired\n />\n <NumberInputField\n name=\"price\"\n label=\"Price\"\n description=\"Enter product price\"\n value={formik.values.price}\n onChange={(value) => formik.setFieldValue('price', value)}\n onBlur={() => formik.setFieldTouched('price', true)}\n errors={formik.errors.price}\n touched={formik.touched.price}\n minValue={0}\n formatOptions={{\n style: 'currency',\n currency: 'USD',\n }}\n isRequired\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- **Validation**: Use `minValue`/`maxValue` for client-side bounds checking\n\n## API reference\n\n<PropsTable id=\"NumberInputField\" />\n\n### Custom error rendering\n\nUse the `renderError` prop to customize how specific error keys are displayed:\n\n```tsx\n<NumberInputField\n label=\"Age\"\n value={value}\n onChange={setValue}\n errors={{ tooYoung: true, invalidAge: true }}\n touched={true}\n renderError={(key) => {\n switch (key) {\n case 'tooYoung':\n return 'You must be at least 18 years old';\n case 'invalidAge':\n return 'Please enter a valid age between 18 and 120';\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 NumberInputField 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 { NumberInputField } from '@commercetools/nimbus';\n\ndescribe('NumberInputField', () => {\n it('renders label and input', () => {\n render(\n <NumberInputField\n label=\"Quantity\"\n value={0}\n onChange={() => {}}\n />\n );\n\n // Verify label is rendered\n expect(screen.getByText('Quantity')).toBeInTheDocument();\n\n // Verify input is rendered with spinbutton role\n expect(screen.getByRole('spinbutton', { name: /quantity/i })).toBeInTheDocument();\n });\n\n it('renders description text', () => {\n render(\n <NumberInputField\n label=\"Quantity\"\n description=\"Enter product quantity\"\n value={0}\n onChange={() => {}}\n />\n );\n\n expect(screen.getByText('Enter product quantity')).toBeInTheDocument();\n });\n\n it('shows required indicator', () => {\n render(\n <NumberInputField\n label=\"Required field\"\n value={0}\n onChange={() => {}}\n isRequired\n />\n );\n\n const input = screen.getByRole('spinbutton');\n expect(input).toHaveAttribute('aria-required', 'true');\n });\n\n it('renders increment and decrement buttons', () => {\n render(\n <NumberInputField\n label=\"Quantity\"\n value={5}\n onChange={() => {}}\n />\n );\n\n expect(screen.getByLabelText('Increment')).toBeInTheDocument();\n expect(screen.getByLabelText('Decrement')).toBeInTheDocument();\n });\n});\n```\n\n### Interaction tests\n\nTest user interactions with the component:\n\n```tsx\nimport { render, screen, waitFor } from '@testing-library/react';\nimport userEvent from '@testing-library/user-event';\nimport { NumberInputField } from '@commercetools/nimbus';\n\ndescribe('NumberInputField interactions', () => {\n it('calls onChange when user types', async () => {\n const user = userEvent.setup();\n const handleChange = jest.fn();\n\n render(\n <NumberInputField\n label=\"Quantity\"\n value={0}\n onChange={handleChange}\n />\n );\n\n const input = screen.getByRole('spinbutton', { name: /quantity/i });\n await user.clear(input);\n await user.type(input, '42');\n\n expect(handleChange).toHaveBeenCalled();\n // Last call should be with 42\n expect(handleChange).toHaveBeenLastCalledWith(42);\n });\n\n it('increments value when increment button clicked', async () => {\n const user = userEvent.setup();\n const handleChange = jest.fn();\n\n render(\n <NumberInputField\n label=\"Quantity\"\n value={5}\n onChange={handleChange}\n />\n );\n\n const incrementButton = screen.getByLabelText('Increment');\n await user.click(incrementButton);\n\n expect(handleChange).toHaveBeenCalledWith(6);\n });\n\n it('decrements value when decrement button clicked', async () => {\n const user = userEvent.setup();\n const handleChange = jest.fn();\n\n render(\n <NumberInputField\n label=\"Quantity\"\n value={5}\n onChange={handleChange}\n />\n );\n\n const decrementButton = screen.getByLabelText('Decrement');\n await user.click(decrementButton);\n\n expect(handleChange).toHaveBeenCalledWith(4);\n });\n\n it('calls onBlur when input loses focus', async () => {\n const user = userEvent.setup();\n const handleBlur = jest.fn();\n\n render(\n <NumberInputField\n label=\"Quantity\"\n value={0}\n onChange={() => {}}\n onBlur={handleBlur}\n />\n );\n\n const input = screen.getByRole('spinbutton');\n await user.click(input);\n await user.tab(); // Move focus away\n\n expect(handleBlur).toHaveBeenCalledTimes(1);\n });\n\n it('does not call onChange when disabled', async () => {\n const user = userEvent.setup();\n const handleChange = jest.fn();\n\n render(\n <NumberInputField\n label=\"Quantity\"\n value={0}\n onChange={handleChange}\n isDisabled\n />\n );\n\n const input = screen.getByRole('spinbutton');\n expect(input).toBeDisabled();\n\n // Buttons should also be disabled\n expect(screen.getByLabelText('Increment')).toBeDisabled();\n expect(screen.getByLabelText('Decrement')).toBeDisabled();\n\n // Attempt to type (should not work)\n await user.type(input, '42');\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 { NumberInputField } from '@commercetools/nimbus';\n\ndescribe('NumberInputField validation', () => {\n it('does not show errors when untouched', () => {\n render(\n <NumberInputField\n label=\"Quantity\"\n value={0}\n onChange={() => {}}\n errors={{ missing: true }}\n touched={false}\n />\n );\n\n // Error should not be visible\n expect(screen.queryByText(/required/i)).not.toBeInTheDocument();\n });\n\n it('shows errors when touched', () => {\n render(\n <NumberInputField\n label=\"Quantity\"\n value={0}\n onChange={() => {}}\n errors={{ missing: true }}\n touched={true}\n />\n );\n\n // Error should be visible\n expect(screen.getByText(/required/i)).toBeInTheDocument();\n });\n\n it('shows custom error messages', () => {\n render(\n <NumberInputField\n label=\"Age\"\n value={10}\n onChange={() => {}}\n errors={{ tooYoung: true }}\n touched={true}\n renderError={(key) => {\n if (key === 'tooYoung') return 'Must be at least 18';\n return null;\n }}\n />\n );\n\n expect(screen.getByText('Must be at least 18')).toBeInTheDocument();\n });\n\n it('applies invalid styling when isInvalid is true', () => {\n render(\n <NumberInputField\n label=\"Quantity\"\n value={0}\n onChange={() => {}}\n isInvalid\n />\n );\n\n const input = screen.getByRole('spinbutton');\n expect(input).toHaveAttribute('data-invalid', 'true');\n });\n});\n```\n\n### Testing min/max constraints\n\nTest boundary validation:\n\n```tsx\nimport { render, screen } from '@testing-library/react';\nimport { NumberInputField } from '@commercetools/nimbus';\n\ndescribe('NumberInputField constraints', () => {\n it('applies min and max values', () => {\n render(\n <NumberInputField\n label=\"Percentage\"\n value={50}\n onChange={() => {}}\n minValue={0}\n maxValue={100}\n />\n );\n\n const input = screen.getByRole('spinbutton');\n expect(input).toHaveAttribute('aria-valuemin', '0');\n expect(input).toHaveAttribute('aria-valuemax', '100');\n });\n\n it('communicates current value via aria-valuenow', () => {\n render(\n <NumberInputField\n label=\"Quantity\"\n value={42}\n onChange={() => {}}\n />\n );\n\n const input = screen.getByRole('spinbutton');\n expect(input).toHaveAttribute('aria-valuenow', '42');\n });\n});\n```\n\n### Testing format options\n\nTest number formatting:\n\n```tsx\nimport { render, screen } from '@testing-library/react';\nimport { NumberInputField } from '@commercetools/nimbus';\n\ndescribe('NumberInputField formatting', () => {\n it('formats as currency', () => {\n render(\n <NumberInputField\n label=\"Price\"\n value={1234.56}\n onChange={() => {}}\n formatOptions={{\n style: 'currency',\n currency: 'USD',\n }}\n />\n );\n\n const input = screen.getByRole('spinbutton');\n expect(input).toHaveValue('$1,234.56');\n });\n\n it('formats as percentage', () => {\n render(\n <NumberInputField\n label=\"Rate\"\n value={0.25}\n onChange={() => {}}\n formatOptions={{\n style: 'percent',\n }}\n />\n );\n\n const input = screen.getByRole('spinbutton');\n expect(input).toHaveValue('25%');\n });\n});\n```\n\n## Resources\n\n- [Storybook](https://nimbus-storybook.vercel.app/?path=/docs/patterns-fields-numberinputfield--docs)\n- [NumberInput Component](/components/inputs/number-input)\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- [ARIA Spinbutton Pattern](https://www.w3.org/WAI/ARIA/apg/patterns/spinbutton/)\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": "Visual variants",
166
+ "href": "#visual-variants",
167
+ "depth": 3,
168
+ "numbering": [
169
+ 1,
170
+ 3,
171
+ 2
172
+ ],
173
+ "parent": "root"
174
+ },
175
+ {
176
+ "value": "With description",
177
+ "href": "#with-description",
178
+ "depth": 3,
179
+ "numbering": [
180
+ 1,
181
+ 3,
182
+ 3
183
+ ],
184
+ "parent": "root"
185
+ },
186
+ {
187
+ "value": "With validation errors",
188
+ "href": "#with-validation-errors",
189
+ "depth": 3,
190
+ "numbering": [
191
+ 1,
192
+ 3,
193
+ 4
194
+ ],
195
+ "parent": "root"
196
+ },
197
+ {
198
+ "value": "With info popover",
199
+ "href": "#with-info-popover",
200
+ "depth": 3,
201
+ "numbering": [
202
+ 1,
203
+ 3,
204
+ 5
205
+ ],
206
+ "parent": "root"
207
+ },
208
+ {
209
+ "value": "Required field",
210
+ "href": "#required-field",
211
+ "depth": 3,
212
+ "numbering": [
213
+ 1,
214
+ 3,
215
+ 6
216
+ ],
217
+ "parent": "root"
218
+ },
219
+ {
220
+ "value": "Disabled state",
221
+ "href": "#disabled-state",
222
+ "depth": 3,
223
+ "numbering": [
224
+ 1,
225
+ 3,
226
+ 7
227
+ ],
228
+ "parent": "root"
229
+ },
230
+ {
231
+ "value": "Read-only state",
232
+ "href": "#read-only-state",
233
+ "depth": 3,
234
+ "numbering": [
235
+ 1,
236
+ 3,
237
+ 8
238
+ ],
239
+ "parent": "root"
240
+ },
241
+ {
242
+ "value": "Min and max constraints",
243
+ "href": "#min-and-max-constraints",
244
+ "depth": 3,
245
+ "numbering": [
246
+ 1,
247
+ 3,
248
+ 9
249
+ ],
250
+ "parent": "root"
251
+ },
252
+ {
253
+ "value": "Custom step increments",
254
+ "href": "#custom-step-increments",
255
+ "depth": 3,
256
+ "numbering": [
257
+ 1,
258
+ 3,
259
+ 10
260
+ ],
261
+ "parent": "root"
262
+ },
263
+ {
264
+ "value": "Currency formatting",
265
+ "href": "#currency-formatting",
266
+ "depth": 3,
267
+ "numbering": [
268
+ 1,
269
+ 3,
270
+ 11
271
+ ],
272
+ "parent": "root"
273
+ },
274
+ {
275
+ "value": "Percentage formatting",
276
+ "href": "#percentage-formatting",
277
+ "depth": 3,
278
+ "numbering": [
279
+ 1,
280
+ 3,
281
+ 12
282
+ ],
283
+ "parent": "root"
284
+ },
285
+ {
286
+ "value": "With leading element",
287
+ "href": "#with-leading-element",
288
+ "depth": 3,
289
+ "numbering": [
290
+ 1,
291
+ 3,
292
+ 13
293
+ ],
294
+ "parent": "root"
295
+ },
296
+ {
297
+ "value": "With trailing element",
298
+ "href": "#with-trailing-element",
299
+ "depth": 3,
300
+ "numbering": [
301
+ 1,
302
+ 3,
303
+ 14
304
+ ],
305
+ "parent": "root"
306
+ },
307
+ {
308
+ "value": "Decimal precision",
309
+ "href": "#decimal-precision",
310
+ "depth": 3,
311
+ "numbering": [
312
+ 1,
313
+ 3,
314
+ 15
315
+ ],
316
+ "parent": "root"
317
+ },
318
+ {
319
+ "value": "Component requirements",
320
+ "href": "#component-requirements",
321
+ "depth": 2,
322
+ "numbering": [
323
+ 1,
324
+ 4
325
+ ],
326
+ "parent": "root"
327
+ },
328
+ {
329
+ "value": "Error handling",
330
+ "href": "#error-handling",
331
+ "depth": 3,
332
+ "numbering": [
333
+ 1,
334
+ 4,
335
+ 1
336
+ ],
337
+ "parent": "root"
338
+ },
339
+ {
340
+ "value": "Accessibility",
341
+ "href": "#accessibility",
342
+ "depth": 2,
343
+ "numbering": [
344
+ 1,
345
+ 5
346
+ ],
347
+ "parent": "root"
348
+ },
349
+ {
350
+ "value": "Keyboard navigation",
351
+ "href": "#keyboard-navigation",
352
+ "depth": 4,
353
+ "numbering": [
354
+ 1,
355
+ 5,
356
+ 1,
357
+ 1
358
+ ],
359
+ "parent": "root"
360
+ },
361
+ {
362
+ "value": "Form integration",
363
+ "href": "#form-integration",
364
+ "depth": 2,
365
+ "numbering": [
366
+ 1,
367
+ 6
368
+ ],
369
+ "parent": "root"
370
+ },
371
+ {
372
+ "value": "API reference",
373
+ "href": "#api-reference",
374
+ "depth": 2,
375
+ "numbering": [
376
+ 1,
377
+ 7
378
+ ],
379
+ "parent": "root"
380
+ },
381
+ {
382
+ "value": "Custom error rendering",
383
+ "href": "#custom-error-rendering",
384
+ "depth": 3,
385
+ "numbering": [
386
+ 1,
387
+ 7,
388
+ 1
389
+ ],
390
+ "parent": "root"
391
+ },
392
+ {
393
+ "value": "Testing your implementation",
394
+ "href": "#testing-your-implementation",
395
+ "depth": 2,
396
+ "numbering": [
397
+ 1,
398
+ 8
399
+ ],
400
+ "parent": "root"
401
+ },
402
+ {
403
+ "value": "Basic rendering tests",
404
+ "href": "#basic-rendering-tests",
405
+ "depth": 3,
406
+ "numbering": [
407
+ 1,
408
+ 8,
409
+ 1
410
+ ],
411
+ "parent": "root"
412
+ },
413
+ {
414
+ "value": "Interaction tests",
415
+ "href": "#interaction-tests",
416
+ "depth": 3,
417
+ "numbering": [
418
+ 1,
419
+ 8,
420
+ 2
421
+ ],
422
+ "parent": "root"
423
+ },
424
+ {
425
+ "value": "Testing validation and errors",
426
+ "href": "#testing-validation-and-errors",
427
+ "depth": 3,
428
+ "numbering": [
429
+ 1,
430
+ 8,
431
+ 3
432
+ ],
433
+ "parent": "root"
434
+ },
435
+ {
436
+ "value": "Testing min/max constraints",
437
+ "href": "#testing-minmax-constraints",
438
+ "depth": 3,
439
+ "numbering": [
440
+ 1,
441
+ 8,
442
+ 4
443
+ ],
444
+ "parent": "root"
445
+ },
446
+ {
447
+ "value": "Testing format options",
448
+ "href": "#testing-format-options",
449
+ "depth": 3,
450
+ "numbering": [
451
+ 1,
452
+ 8,
453
+ 5
454
+ ],
455
+ "parent": "root"
456
+ },
457
+ {
458
+ "value": "Resources",
459
+ "href": "#resources",
460
+ "depth": 2,
461
+ "numbering": [
462
+ 1,
463
+ 9
464
+ ],
465
+ "parent": "root"
466
+ }
467
+ ]
468
+ }
469
+ }
470
+ }