@mantis-core/ui 0.5.0 → 0.7.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 (378) hide show
  1. package/CHANGELOG.md +155 -0
  2. package/COMPONENTS.md +71 -73
  3. package/README.md +19 -6
  4. package/bin/mantis-llm.mjs +242 -0
  5. package/catalog.json +3031 -0
  6. package/dist/components/Buttons/Button.d.ts +39 -9
  7. package/dist/components/Buttons/Button.d.ts.map +1 -1
  8. package/dist/components/Buttons/Button.js +21 -13
  9. package/dist/components/Buttons/Button.js.map +1 -1
  10. package/dist/components/Forms/AutoCompleteField.d.ts +60 -0
  11. package/dist/components/Forms/AutoCompleteField.d.ts.map +1 -0
  12. package/dist/components/Forms/AutoCompleteField.js +125 -0
  13. package/dist/components/Forms/AutoCompleteField.js.map +1 -0
  14. package/dist/components/Forms/CKEditorInput.d.ts +5 -2
  15. package/dist/components/Forms/CKEditorInput.d.ts.map +1 -1
  16. package/dist/components/Forms/CKEditorInput.js +5 -2
  17. package/dist/components/Forms/CKEditorInput.js.map +1 -1
  18. package/dist/components/Forms/CheckboxField.d.ts +14 -0
  19. package/dist/components/Forms/CheckboxField.d.ts.map +1 -0
  20. package/dist/components/Forms/CheckboxField.js +26 -0
  21. package/dist/components/Forms/CheckboxField.js.map +1 -0
  22. package/dist/components/Forms/ColorPickerInput.d.ts +27 -8
  23. package/dist/components/Forms/ColorPickerInput.d.ts.map +1 -1
  24. package/dist/components/Forms/ColorPickerInput.js +57 -11
  25. package/dist/components/Forms/ColorPickerInput.js.map +1 -1
  26. package/dist/components/Forms/DateField.d.ts +68 -0
  27. package/dist/components/Forms/DateField.d.ts.map +1 -0
  28. package/dist/components/Forms/DateField.js +108 -0
  29. package/dist/components/Forms/DateField.js.map +1 -0
  30. package/dist/components/Forms/DatePresets.d.ts.map +1 -1
  31. package/dist/components/Forms/DatePresets.js +6 -3
  32. package/dist/components/Forms/DatePresets.js.map +1 -1
  33. package/dist/components/Forms/FieldShell.d.ts +24 -0
  34. package/dist/components/Forms/FieldShell.d.ts.map +1 -0
  35. package/dist/components/Forms/FieldShell.js +39 -0
  36. package/dist/components/Forms/FieldShell.js.map +1 -0
  37. package/dist/components/Forms/FileDropzone.d.ts +4 -2
  38. package/dist/components/Forms/FileDropzone.d.ts.map +1 -1
  39. package/dist/components/Forms/FileDropzone.js.map +1 -1
  40. package/dist/components/Forms/FormActionsBar.js +2 -2
  41. package/dist/components/Forms/FormActionsBar.js.map +1 -1
  42. package/dist/components/Forms/FormWizard.d.ts +1 -1
  43. package/dist/components/Forms/FormWizard.d.ts.map +1 -1
  44. package/dist/components/Forms/FormWizard.js +4 -5
  45. package/dist/components/Forms/FormWizard.js.map +1 -1
  46. package/dist/components/Forms/HiddenField.d.ts +12 -6
  47. package/dist/components/Forms/HiddenField.d.ts.map +1 -1
  48. package/dist/components/Forms/HiddenField.js +14 -5
  49. package/dist/components/Forms/HiddenField.js.map +1 -1
  50. package/dist/components/Forms/MaskField.d.ts +28 -0
  51. package/dist/components/Forms/MaskField.d.ts.map +1 -0
  52. package/dist/components/Forms/MaskField.js +74 -0
  53. package/dist/components/Forms/MaskField.js.map +1 -0
  54. package/dist/components/Forms/NumberField.d.ts +14 -0
  55. package/dist/components/Forms/NumberField.d.ts.map +1 -0
  56. package/dist/components/Forms/NumberField.js +51 -0
  57. package/dist/components/Forms/NumberField.js.map +1 -0
  58. package/dist/components/Forms/OtpInput.d.ts +23 -8
  59. package/dist/components/Forms/OtpInput.d.ts.map +1 -1
  60. package/dist/components/Forms/OtpInput.js +37 -8
  61. package/dist/components/Forms/OtpInput.js.map +1 -1
  62. package/dist/components/Forms/PasswordInput.d.ts +22 -9
  63. package/dist/components/Forms/PasswordInput.d.ts.map +1 -1
  64. package/dist/components/Forms/PasswordInput.js +63 -28
  65. package/dist/components/Forms/PasswordInput.js.map +1 -1
  66. package/dist/components/Forms/PhoneInput.d.ts +16 -8
  67. package/dist/components/Forms/PhoneInput.d.ts.map +1 -1
  68. package/dist/components/Forms/PhoneInput.js +13 -6
  69. package/dist/components/Forms/PhoneInput.js.map +1 -1
  70. package/dist/components/Forms/RadioGroup.d.ts +34 -13
  71. package/dist/components/Forms/RadioGroup.d.ts.map +1 -1
  72. package/dist/components/Forms/RadioGroup.js +49 -6
  73. package/dist/components/Forms/RadioGroup.js.map +1 -1
  74. package/dist/components/Forms/RangeSlider.d.ts +26 -11
  75. package/dist/components/Forms/RangeSlider.d.ts.map +1 -1
  76. package/dist/components/Forms/RangeSlider.js +40 -7
  77. package/dist/components/Forms/RangeSlider.js.map +1 -1
  78. package/dist/components/Forms/RatingInput.d.ts +24 -8
  79. package/dist/components/Forms/RatingInput.d.ts.map +1 -1
  80. package/dist/components/Forms/RatingInput.js +41 -9
  81. package/dist/components/Forms/RatingInput.js.map +1 -1
  82. package/dist/components/Forms/SearchInput.d.ts +18 -10
  83. package/dist/components/Forms/SearchInput.d.ts.map +1 -1
  84. package/dist/components/Forms/SearchInput.js +44 -23
  85. package/dist/components/Forms/SearchInput.js.map +1 -1
  86. package/dist/components/Forms/SelectField.d.ts +41 -0
  87. package/dist/components/Forms/SelectField.d.ts.map +1 -0
  88. package/dist/components/Forms/SelectField.js +110 -0
  89. package/dist/components/Forms/SelectField.js.map +1 -0
  90. package/dist/components/Forms/SwitchField.d.ts +14 -0
  91. package/dist/components/Forms/SwitchField.d.ts.map +1 -0
  92. package/dist/components/Forms/SwitchField.js +26 -0
  93. package/dist/components/Forms/SwitchField.js.map +1 -0
  94. package/dist/components/Forms/TagsInput.d.ts +29 -8
  95. package/dist/components/Forms/TagsInput.d.ts.map +1 -1
  96. package/dist/components/Forms/TagsInput.js +53 -9
  97. package/dist/components/Forms/TagsInput.js.map +1 -1
  98. package/dist/components/Forms/TextArea.d.ts +13 -10
  99. package/dist/components/Forms/TextArea.d.ts.map +1 -1
  100. package/dist/components/Forms/TextArea.js +27 -9
  101. package/dist/components/Forms/TextArea.js.map +1 -1
  102. package/dist/components/Forms/TextField.d.ts +14 -0
  103. package/dist/components/Forms/TextField.d.ts.map +1 -0
  104. package/dist/components/Forms/TextField.js +29 -0
  105. package/dist/components/Forms/TextField.js.map +1 -0
  106. package/dist/components/Forms/ToggleInlineButton.d.ts +33 -12
  107. package/dist/components/Forms/ToggleInlineButton.d.ts.map +1 -1
  108. package/dist/components/Forms/ToggleInlineButton.js +56 -6
  109. package/dist/components/Forms/ToggleInlineButton.js.map +1 -1
  110. package/dist/components/Forms/UploadFilesPreview.js +3 -3
  111. package/dist/components/Forms/UploadFilesPreview.js.map +1 -1
  112. package/dist/components/Forms/field-typing.test-d.d.ts +2 -0
  113. package/dist/components/Forms/field-typing.test-d.d.ts.map +1 -0
  114. package/dist/components/Forms/field-typing.test-d.js +24 -0
  115. package/dist/components/Forms/field-typing.test-d.js.map +1 -0
  116. package/dist/components/Forms/useFieldController.d.ts +85 -0
  117. package/dist/components/Forms/useFieldController.d.ts.map +1 -0
  118. package/dist/components/Forms/useFieldController.js +54 -0
  119. package/dist/components/Forms/useFieldController.js.map +1 -0
  120. package/dist/components/Loaders/Loading.d.ts.map +1 -1
  121. package/dist/components/Loaders/Loading.js +3 -2
  122. package/dist/components/Loaders/Loading.js.map +1 -1
  123. package/dist/components/Tables/ActionColumn.d.ts +20 -4
  124. package/dist/components/Tables/ActionColumn.d.ts.map +1 -1
  125. package/dist/components/Tables/ActionColumn.js +24 -5
  126. package/dist/components/Tables/ActionColumn.js.map +1 -1
  127. package/dist/components/Tables/FilterPannel.d.ts +9 -2
  128. package/dist/components/Tables/FilterPannel.d.ts.map +1 -1
  129. package/dist/components/Tables/FilterPannel.js +15 -11
  130. package/dist/components/Tables/FilterPannel.js.map +1 -1
  131. package/dist/components/Tables/IndexColumn.d.ts +12 -3
  132. package/dist/components/Tables/IndexColumn.d.ts.map +1 -1
  133. package/dist/components/Tables/IndexColumn.js +21 -5
  134. package/dist/components/Tables/IndexColumn.js.map +1 -1
  135. package/dist/components/Tables/MantisDataTable.d.ts +45 -0
  136. package/dist/components/Tables/MantisDataTable.d.ts.map +1 -0
  137. package/dist/components/Tables/MantisDataTable.js +63 -0
  138. package/dist/components/Tables/MantisDataTable.js.map +1 -0
  139. package/dist/components/Tables/MenuButton.d.ts +28 -7
  140. package/dist/components/Tables/MenuButton.d.ts.map +1 -1
  141. package/dist/components/Tables/MenuButton.js +20 -10
  142. package/dist/components/Tables/MenuButton.js.map +1 -1
  143. package/dist/components/Tables/PaginatedTable.d.ts +26 -17
  144. package/dist/components/Tables/PaginatedTable.d.ts.map +1 -1
  145. package/dist/components/Tables/PaginatedTable.js +24 -22
  146. package/dist/components/Tables/PaginatedTable.js.map +1 -1
  147. package/dist/components/Tables/cell-presets.d.ts +35 -0
  148. package/dist/components/Tables/cell-presets.d.ts.map +1 -0
  149. package/dist/components/Tables/cell-presets.js +40 -0
  150. package/dist/components/Tables/cell-presets.js.map +1 -0
  151. package/dist/components/Tables/columns.d.ts +40 -0
  152. package/dist/components/Tables/columns.d.ts.map +1 -0
  153. package/dist/components/Tables/columns.js +2 -0
  154. package/dist/components/Tables/columns.js.map +1 -0
  155. package/dist/components/Tables/filters/MultiSelectFilter.d.ts +24 -6
  156. package/dist/components/Tables/filters/MultiSelectFilter.d.ts.map +1 -1
  157. package/dist/components/Tables/filters/MultiSelectFilter.js +19 -6
  158. package/dist/components/Tables/filters/MultiSelectFilter.js.map +1 -1
  159. package/dist/components/auth/ChangePasswordForm.d.ts.map +1 -1
  160. package/dist/components/auth/ChangePasswordForm.js +12 -12
  161. package/dist/components/auth/ChangePasswordForm.js.map +1 -1
  162. package/dist/components/auth/ForgotPasswordForm.d.ts.map +1 -1
  163. package/dist/components/auth/ForgotPasswordForm.js +7 -5
  164. package/dist/components/auth/ForgotPasswordForm.js.map +1 -1
  165. package/dist/components/auth/LoginForm.d.ts +2 -2
  166. package/dist/components/auth/LoginForm.d.ts.map +1 -1
  167. package/dist/components/auth/LoginForm.js +15 -15
  168. package/dist/components/auth/LoginForm.js.map +1 -1
  169. package/dist/components/auth/ResetPasswordForm.d.ts.map +1 -1
  170. package/dist/components/auth/ResetPasswordForm.js +11 -12
  171. package/dist/components/auth/ResetPasswordForm.js.map +1 -1
  172. package/dist/components/auth/UserMenu.d.ts +11 -1
  173. package/dist/components/auth/UserMenu.d.ts.map +1 -1
  174. package/dist/components/auth/UserMenu.js +30 -87
  175. package/dist/components/auth/UserMenu.js.map +1 -1
  176. package/dist/components/data/Timeline.d.ts +2 -2
  177. package/dist/components/data/Timeline.d.ts.map +1 -1
  178. package/dist/components/data/Timeline.js +17 -17
  179. package/dist/components/data/Timeline.js.map +1 -1
  180. package/dist/components/feedback/Avatar.d.ts +4 -2
  181. package/dist/components/feedback/Avatar.d.ts.map +1 -1
  182. package/dist/components/feedback/Avatar.js +4 -4
  183. package/dist/components/feedback/Avatar.js.map +1 -1
  184. package/dist/components/feedback/CardSkeleton.d.ts.map +1 -1
  185. package/dist/components/feedback/CardSkeleton.js +3 -3
  186. package/dist/components/feedback/CardSkeleton.js.map +1 -1
  187. package/dist/components/feedback/TableSkeleton.d.ts.map +1 -1
  188. package/dist/components/feedback/TableSkeleton.js +3 -3
  189. package/dist/components/feedback/TableSkeleton.js.map +1 -1
  190. package/dist/components/feedback/Tag.d.ts +4 -2
  191. package/dist/components/feedback/Tag.d.ts.map +1 -1
  192. package/dist/components/feedback/Tag.js +4 -4
  193. package/dist/components/feedback/Tag.js.map +1 -1
  194. package/dist/components/navigation/CommandPalette.d.ts.map +1 -1
  195. package/dist/components/navigation/CommandPalette.js +5 -2
  196. package/dist/components/navigation/CommandPalette.js.map +1 -1
  197. package/dist/components/navigation/PageTabs.d.ts +10 -8
  198. package/dist/components/navigation/PageTabs.d.ts.map +1 -1
  199. package/dist/components/navigation/PageTabs.js +17 -13
  200. package/dist/components/navigation/PageTabs.js.map +1 -1
  201. package/dist/components/overlays/Drawer.d.ts +16 -3
  202. package/dist/components/overlays/Drawer.d.ts.map +1 -1
  203. package/dist/components/overlays/Drawer.js +9 -5
  204. package/dist/components/overlays/Drawer.js.map +1 -1
  205. package/dist/components/overlays/Modal.d.ts +18 -3
  206. package/dist/components/overlays/Modal.d.ts.map +1 -1
  207. package/dist/components/overlays/Modal.js +13 -5
  208. package/dist/components/overlays/Modal.js.map +1 -1
  209. package/dist/components/pages/app-shell/AppShell.d.ts.map +1 -1
  210. package/dist/components/pages/app-shell/AppShell.js +6 -6
  211. package/dist/components/pages/app-shell/AppShell.js.map +1 -1
  212. package/dist/components/ui/ConfirmDialog.d.ts +1 -2
  213. package/dist/components/ui/ConfirmDialog.d.ts.map +1 -1
  214. package/dist/components/ui/ConfirmDialog.js +10 -4
  215. package/dist/components/ui/ConfirmDialog.js.map +1 -1
  216. package/dist/components/ui/DataState.js +2 -2
  217. package/dist/components/ui/DataState.js.map +1 -1
  218. package/dist/index.d.ts +71 -42
  219. package/dist/index.d.ts.map +1 -1
  220. package/dist/index.js +114 -22
  221. package/dist/index.js.map +1 -1
  222. package/docs/README.md +1 -1
  223. package/docs/components/action-column.md +33 -7
  224. package/docs/components/admin-page-configurator.md +24 -5
  225. package/docs/components/admin-page-header.md +21 -3
  226. package/docs/components/admin-page-layout-shell.md +18 -4
  227. package/docs/components/admin-page-layout.md +34 -5
  228. package/docs/components/app-shell.md +31 -6
  229. package/docs/components/auto-complete-field.md +60 -0
  230. package/docs/components/avatar.md +18 -8
  231. package/docs/components/bar-chart.md +25 -7
  232. package/docs/components/breadcrumbs.md +15 -2
  233. package/docs/components/button.md +34 -15
  234. package/docs/components/card-skeleton.md +9 -3
  235. package/docs/components/change-password-form.md +23 -4
  236. package/docs/components/checkbox-field.md +38 -0
  237. package/docs/components/ckeditor-input.md +40 -8
  238. package/docs/components/color-picker-input.md +19 -8
  239. package/docs/components/command-palette.md +23 -2
  240. package/docs/components/confirm-dialog.md +36 -9
  241. package/docs/components/data-state.md +31 -6
  242. package/docs/components/date-field.md +39 -0
  243. package/docs/components/date-presets.md +19 -5
  244. package/docs/components/description-list.md +20 -2
  245. package/docs/components/dirty-form-guard.md +16 -4
  246. package/docs/components/donut-chart.md +24 -7
  247. package/docs/components/drawer.md +27 -8
  248. package/docs/components/empty-state.md +12 -2
  249. package/docs/components/error-boundary.md +16 -2
  250. package/docs/components/error-message.md +22 -3
  251. package/docs/components/field-shell.md +47 -0
  252. package/docs/components/file-dropzone.md +22 -6
  253. package/docs/components/filter-pannel.md +34 -7
  254. package/docs/components/forgot-password-form.md +23 -5
  255. package/docs/components/form-actions-bar.md +21 -2
  256. package/docs/components/form-field-render.md +36 -8
  257. package/docs/components/form-section.md +13 -1
  258. package/docs/components/form-wizard.md +34 -5
  259. package/docs/components/hidden-field.md +22 -6
  260. package/docs/components/index-column.md +25 -5
  261. package/docs/components/line-chart.md +25 -7
  262. package/docs/components/loading.md +14 -5
  263. package/docs/components/login-form.md +31 -6
  264. package/docs/components/mantis-data-table.md +61 -0
  265. package/docs/components/map-picker-client.md +29 -8
  266. package/docs/components/map-picker-osm.md +27 -9
  267. package/docs/components/map-picker.md +25 -4
  268. package/docs/components/mask-field.md +31 -0
  269. package/docs/components/menu-button.md +22 -7
  270. package/docs/components/modal.md +34 -9
  271. package/docs/components/multi-select-filter.md +25 -7
  272. package/docs/components/number-field.md +40 -0
  273. package/docs/components/otp-input.md +20 -7
  274. package/docs/components/page-tabs.md +23 -4
  275. package/docs/components/page-title.md +6 -1
  276. package/docs/components/paginated-table.md +36 -13
  277. package/docs/components/pagination.md +20 -7
  278. package/docs/components/password-input.md +20 -8
  279. package/docs/components/phone-input.md +17 -7
  280. package/docs/components/radio-group.md +39 -9
  281. package/docs/components/range-slider.md +18 -6
  282. package/docs/components/rating-input.md +19 -8
  283. package/docs/components/render-field.md +31 -3
  284. package/docs/components/reset-password-form.md +24 -4
  285. package/docs/components/rich-text-preview.md +17 -5
  286. package/docs/components/search-input.md +18 -7
  287. package/docs/components/select-field.md +55 -0
  288. package/docs/components/stat-card.md +14 -3
  289. package/docs/components/status-badge.md +17 -7
  290. package/docs/components/switch-field.md +32 -0
  291. package/docs/components/table-filter-field.md +22 -4
  292. package/docs/components/table-skeleton.md +9 -3
  293. package/docs/components/table-toolbar.md +18 -5
  294. package/docs/components/tag.md +16 -7
  295. package/docs/components/tags-input.md +21 -8
  296. package/docs/components/text-area.md +18 -8
  297. package/docs/components/text-field.md +32 -0
  298. package/docs/components/timeline.md +19 -3
  299. package/docs/components/toggle-inline-button.md +42 -10
  300. package/docs/components/upload-files-preview.md +23 -2
  301. package/docs/components/use-field-controller.md +58 -0
  302. package/docs/components/user-menu.md +26 -6
  303. package/docs/contracts/dependency-map.md +50 -52
  304. package/docs/contracts/field-controller.md +138 -0
  305. package/docs/contracts/style-imports.md +1 -20
  306. package/llms.txt +70 -72
  307. package/package.json +48 -11
  308. package/dist/components/Forms/AsyncSelect.d.ts +0 -20
  309. package/dist/components/Forms/AsyncSelect.d.ts.map +0 -1
  310. package/dist/components/Forms/AsyncSelect.js +0 -77
  311. package/dist/components/Forms/AsyncSelect.js.map +0 -1
  312. package/dist/components/Forms/Combobox.d.ts +0 -10
  313. package/dist/components/Forms/Combobox.d.ts.map +0 -1
  314. package/dist/components/Forms/Combobox.js +0 -11
  315. package/dist/components/Forms/Combobox.js.map +0 -1
  316. package/dist/components/Forms/CurrencyInput.d.ts +0 -12
  317. package/dist/components/Forms/CurrencyInput.d.ts.map +0 -1
  318. package/dist/components/Forms/CurrencyInput.js +0 -9
  319. package/dist/components/Forms/CurrencyInput.js.map +0 -1
  320. package/dist/components/Forms/DateInput.d.ts +0 -10
  321. package/dist/components/Forms/DateInput.d.ts.map +0 -1
  322. package/dist/components/Forms/DateInput.js +0 -11
  323. package/dist/components/Forms/DateInput.js.map +0 -1
  324. package/dist/components/Forms/DateRangeInput.d.ts +0 -10
  325. package/dist/components/Forms/DateRangeInput.d.ts.map +0 -1
  326. package/dist/components/Forms/DateRangeInput.js +0 -13
  327. package/dist/components/Forms/DateRangeInput.js.map +0 -1
  328. package/dist/components/Forms/DropDown.d.ts +0 -10
  329. package/dist/components/Forms/DropDown.d.ts.map +0 -1
  330. package/dist/components/Forms/DropDown.js +0 -11
  331. package/dist/components/Forms/DropDown.js.map +0 -1
  332. package/dist/components/Forms/MultiSelect.d.ts +0 -10
  333. package/dist/components/Forms/MultiSelect.d.ts.map +0 -1
  334. package/dist/components/Forms/MultiSelect.js +0 -13
  335. package/dist/components/Forms/MultiSelect.js.map +0 -1
  336. package/dist/components/Forms/NumberInput.d.ts +0 -10
  337. package/dist/components/Forms/NumberInput.d.ts.map +0 -1
  338. package/dist/components/Forms/NumberInput.js +0 -16
  339. package/dist/components/Forms/NumberInput.js.map +0 -1
  340. package/dist/components/Forms/Select.d.ts +0 -15
  341. package/dist/components/Forms/Select.d.ts.map +0 -1
  342. package/dist/components/Forms/Select.js +0 -48
  343. package/dist/components/Forms/Select.js.map +0 -1
  344. package/dist/components/Forms/Switch.d.ts +0 -18
  345. package/dist/components/Forms/Switch.d.ts.map +0 -1
  346. package/dist/components/Forms/Switch.js +0 -30
  347. package/dist/components/Forms/Switch.js.map +0 -1
  348. package/dist/components/Forms/TextInput.d.ts +0 -11
  349. package/dist/components/Forms/TextInput.d.ts.map +0 -1
  350. package/dist/components/Forms/TextInput.js +0 -12
  351. package/dist/components/Forms/TextInput.js.map +0 -1
  352. package/dist/components/Forms/TimePicker.d.ts +0 -13
  353. package/dist/components/Forms/TimePicker.d.ts.map +0 -1
  354. package/dist/components/Forms/TimePicker.js +0 -19
  355. package/dist/components/Forms/TimePicker.js.map +0 -1
  356. package/dist/components/Forms/Toggle.d.ts +0 -14
  357. package/dist/components/Forms/Toggle.d.ts.map +0 -1
  358. package/dist/components/Forms/Toggle.js +0 -10
  359. package/dist/components/Forms/Toggle.js.map +0 -1
  360. package/dist/components/Forms/types.d.ts +0 -9
  361. package/dist/components/Forms/types.d.ts.map +0 -1
  362. package/dist/components/Forms/types.js +0 -2
  363. package/dist/components/Forms/types.js.map +0 -1
  364. package/docs/components/async-select.md +0 -27
  365. package/docs/components/combobox.md +0 -19
  366. package/docs/components/currency-input.md +0 -21
  367. package/docs/components/date-input.md +0 -21
  368. package/docs/components/date-range-input.md +0 -20
  369. package/docs/components/drop-down.md +0 -26
  370. package/docs/components/multi-select.md +0 -22
  371. package/docs/components/number-input.md +0 -21
  372. package/docs/components/select.md +0 -28
  373. package/docs/components/switch.md +0 -24
  374. package/docs/components/text-input.md +0 -24
  375. package/docs/components/time-picker.md +0 -25
  376. package/docs/components/toggle.md +0 -24
  377. package/docs/contracts/component-doc-schema.md +0 -78
  378. package/docs/contracts/controller-props.md +0 -28
@@ -2,20 +2,52 @@
2
2
  name: ToggleInlineButton
3
3
  category: forms
4
4
  import: '@mantis-core/ui/components/Forms/ToggleInlineButton'
5
- whenToUse: Segmented button group (single or multi-select) wired to react-hook-form via a controller prop.
6
- baseLibrary: primereact/selectbutton
7
- formContract: ControllerProps
8
- requiredStyles: [scss/select-button.scss]
9
- relatedComponents: [FormFieldRender]
5
+ whenToUse: Segmented single- or multi-choice control over PR11's ToggleButtonGroup; pass `multiple` for array-value mode.
6
+ baseLibrary: '@primereact/ui/togglebutton'
7
+ formContract: ChoiceFieldControllerProps
8
+ relatedComponents: ['RadioGroup', 'SelectField']
10
9
  relatedNextCore: []
11
10
  props:
12
- - { name: controller, type: ControllerProps, required: true, description: 'react-hook-form controller config' }
13
- - { name: options, type: 'any[]', required: true, description: 'Options array passed to SelectButton' }
14
- - { name: variant, type: ButtonVariant, required: false, default: '''primary''', description: 'Design-system color variant' }
15
- - { name: multiple, type: boolean, required: false, default: 'false', description: 'Allow selecting multiple options' }
11
+ - { name: options, type: 'Record<string, unknown>[]', required: true, description: 'Option rows rendered as segments.' }
12
+ - { name: optionLabel, type: string, required: false, default: '''label''', description: 'Key read for each option''s display label.' }
13
+ - { name: optionValue, type: string, required: false, default: '''value''', description: 'Key read for each option''s bound value.' }
14
+ - { name: multiple, type: boolean, required: false, default: 'false', description: 'Array-value mode; toggles per-segment selection instead of single scalar selection.' }
15
+ - { name: renderOption, type: '(option: Record<string, unknown>, index: number) => ReactNode', required: false, description: 'Escape hatch: full custom per-segment render.' }
16
16
  ---
17
+
17
18
  ## Example
18
19
 
19
20
  ```tsx
20
- {/* TODO: add example */}
21
+ import { ToggleInlineButton } from '@mantis-core/ui/components/Forms/ToggleInlineButton';
22
+ import { useForm } from 'react-hook-form';
23
+
24
+ const VIEWS = [
25
+ { label: 'List', value: 'list' },
26
+ { label: 'Grid', value: 'grid' },
27
+ ];
28
+
29
+ function Example() {
30
+ const { control } = useForm({ defaultValues: { view: 'list' } });
31
+ return (
32
+ <ToggleInlineButton
33
+ name='view'
34
+ control={control}
35
+ label='View'
36
+ options={VIEWS}
37
+ optionLabel='label'
38
+ optionValue='value'
39
+ />
40
+ );
41
+ }
21
42
  ```
43
+
44
+ ## Notes
45
+
46
+ - Value shape: scalar (or `null`) by default; an ARRAY when `multiple` — selecting a segment
47
+ appends its value, deselecting filters it out.
48
+ - `labelMode` defaults to `'beside'` for this wrapper (not the global config default).
49
+ - PR11 `11.0.0-rc.1` gotcha (same as `RadioGroup`): the styled `ToggleButtonGroup` and
50
+ `ToggleButton.Root` are wired through two different React contexts in this rc, so the group's
51
+ `value`/`onValueChange` never reaches its children (verified in-browser). Until fixed upstream,
52
+ this wrapper binds each `ToggleButton.Root` individually via its documented `pressed`/
53
+ `onPressedChange` props; `ToggleButtonGroup` itself is used for layout/styling only.
@@ -2,7 +2,7 @@
2
2
  name: UploadFilesPreview
3
3
  category: forms
4
4
  import: '@mantis-core/ui/components/Forms/UploadFilesPreview'
5
- whenToUse: Drag-and-drop upload zone with live preview grid, drag-to-reorder, and async upload queue; designed for image galleries.
5
+ whenToUse: Drag-and-drop upload zone with live preview grid, drag-to-reorder, and async upload queue; designed for image galleries, not react-hook-form bound.
6
6
  baseLibrary: custom
7
7
  relatedComponents: [FileDropzone]
8
8
  relatedNextCore: []
@@ -17,8 +17,29 @@ props:
17
17
  - { name: disabledMessage, type: string, required: false, description: 'Message shown in the drop zone when disabled' }
18
18
  - { name: copy, type: 'Partial<UploadFilesPreviewCopy>', required: false, description: 'Override any UI text strings' }
19
19
  ---
20
+
20
21
  ## Example
21
22
 
22
23
  ```tsx
23
- {/* TODO: add example */}
24
+ import UploadFilesPreview from '@mantis-core/ui/components/Forms/UploadFilesPreview';
25
+
26
+ function Example() {
27
+ return (
28
+ <UploadFilesPreview
29
+ previews={[{ id: '1', fullUrl: 'https://example.com/photo.jpg' }]}
30
+ onUploadFile={async (file) => ({ id: file.name, fullUrl: URL.createObjectURL(file) })}
31
+ onFileUploaded={() => {}}
32
+ onRemoveFile={() => {}}
33
+ onReorder={() => {}}
34
+ />
35
+ );
36
+ }
24
37
  ```
38
+
39
+ ## Notes
40
+
41
+ - Generic over `TItem extends { id: string; fullUrl: string }` — pass richer item shapes for
42
+ gallery-specific metadata.
43
+ - Uploads run per-file via `Promise.allSettled`; a failed `onUploadFile` marks that item `error` in
44
+ the queue with a discard action, it does not throw or block the rest of the batch.
45
+ - Not react-hook-form bound — the parent owns `previews` state and persistence via the callbacks.
@@ -0,0 +1,58 @@
1
+ ---
2
+ name: useFieldController
3
+ category: forms
4
+ import: '@mantis-core/ui/components/Forms/useFieldController'
5
+ whenToUse: 'Hook every RHF field wrapper calls internally to wire useController + a stable id/aria/disabled/error-message resolution; call it directly only when hand-building a new field wrapper (see field-controller.md).'
6
+ baseLibrary: custom
7
+ formContract: FieldControllerProps
8
+ relatedComponents: ['FieldShell', 'TextField']
9
+ relatedNextCore: []
10
+ props: []
11
+ ---
12
+
13
+ ## Example
14
+
15
+ ```tsx
16
+ import { FieldShell } from '@mantis-core/ui/components/Forms/FieldShell';
17
+ import { useFieldController, type FieldControllerProps } from '@mantis-core/ui/components/Forms/useFieldController';
18
+ import { useForm, type FieldValues, type FieldPath } from 'react-hook-form';
19
+
20
+ function RatingField<TFieldValues extends FieldValues, TName extends FieldPath<TFieldValues>>(
21
+ props: FieldControllerProps<TFieldValues, TName>,
22
+ ) {
23
+ const f = useFieldController<TFieldValues, TName>(props);
24
+ return (
25
+ <FieldShell id={f.id} label={props.label} errorMessage={f.errorMessage}>
26
+ <input
27
+ id={f.id}
28
+ type='number'
29
+ value={(f.field.value as number) ?? 0}
30
+ onChange={(e) => f.field.onChange(Number(e.target.value))}
31
+ onBlur={f.field.onBlur}
32
+ disabled={f.disabled}
33
+ {...f.aria}
34
+ />
35
+ </FieldShell>
36
+ );
37
+ }
38
+
39
+ function Example() {
40
+ const { control } = useForm({ defaultValues: { rating: 0 } });
41
+ return <RatingField name='rating' control={control} label='Rating' />;
42
+ }
43
+ ```
44
+
45
+ ## Notes
46
+
47
+ - Takes `FieldControllerProps` verbatim (no extra params) — see
48
+ [`field-controller.md`](../contracts/field-controller.md) for the full prop list.
49
+ - Returns `{ field, fieldState, formState, id, errorId, helpId, variant, size, fluid, invalid,
50
+ disabled, errorMessage, aria }`. `disabled` is `props.disabled || formState.isSubmitting`;
51
+ `aria` is `{ 'aria-invalid', 'aria-describedby' }` (error id wins over help id) — PR11's own
52
+ `invalid` prop only drives styling, so this hook is the one place aria-invalid gets emitted.
53
+ - Portal-based compounds (e.g. `Select`) have no native blur — call `field.onBlur()` from the
54
+ compound's `onOpenChange` (fired on close) instead of relying on a bare blur event, and spread
55
+ `aria` onto the trigger element rather than a hidden input.
56
+ - `TFieldValues` defaults to `FieldValues` (untyped): if a caller omits both `control` and an
57
+ explicit generic, `name` silently accepts any string — pass `control` (or an explicit generic) to
58
+ keep full path-typing.
@@ -2,18 +2,38 @@
2
2
  name: UserMenu
3
3
  category: auth
4
4
  import: '@mantis-core/ui/components/auth/UserMenu'
5
- whenToUse: Topbar user avatar + dropdown with custom nav items and sign-out; no auth lib coupling.
6
- baseLibrary: custom
5
+ whenToUse: Topbar avatar-triggered dropdown (custom nav items + sign-out); no auth-lib coupling.
6
+ baseLibrary: '@primereact/ui/menu'
7
+ requiredStyles: []
8
+ relatedComponents: [Avatar]
7
9
  relatedNextCore: []
8
10
  props:
9
- - { name: user, type: UserMenuUser, required: true }
10
- - { name: items, type: 'UserMenuItem[]', required: false }
11
- - { name: onSignOut, type: '() => void', required: false }
11
+ - { name: user, type: UserMenuUser, required: true, description: '{ name?, email?, avatarUrl? } — displayName falls back to email.' }
12
+ - { name: items, type: 'UserMenuItem[]', required: false, description: '{ label, icon?, href?, onClick? }; href navigates via next/navigation, otherwise onClick fires.' }
13
+ - { name: onSignOut, type: '() => void', required: false, description: 'When set, appends a separator + sign-out item.' }
12
14
  - { name: signOutLabel, type: string, required: false, default: '"Cerrar sesión"' }
13
15
  - { name: className, type: string, required: false }
14
16
  ---
17
+
15
18
  ## Example
16
19
 
17
20
  ```tsx
18
- <UserMenu user={{ name: session.user.name, email: session.user.email }} onSignOut={() => signOut({ callbackUrl: '/login' })} />
21
+ import UserMenu from '@mantis-core/ui/components/auth/UserMenu';
22
+
23
+ function Example() {
24
+ return (
25
+ <UserMenu
26
+ user={{ name: 'Diego Condo', email: 'diego@example.com' }}
27
+ items={[{ label: 'Perfil', icon: 'pi pi-user', href: '/perfil' }]}
28
+ onSignOut={() => console.log('sign out')}
29
+ />
30
+ );
31
+ }
19
32
  ```
33
+
34
+ ## Notes
35
+
36
+ - Migrated to PR11's compound `Menu`: `Menu.Root` owns open state; `Menu.Trigger` renders `as="button"`
37
+ wrapping the migrated `Avatar`. No manual outside-click listener or inline dropdown (PR10 shape) left.
38
+ - Each entry fires through `onSelect` — `href` items call `router.push` (next/navigation), `onClick`
39
+ items just run their handler. `icon` is a PrimeIcons class string (e.g. `pi pi-cog`), not a component.
@@ -6,34 +6,56 @@ Which base library each component wraps.
6
6
 
7
7
  ## PrimeReact wrappers
8
8
 
9
- - `ActionColumn`: `primereact/column`
10
- - `Button`: `primereact/button`
11
- - `ConfirmDialog`: `primereact/dialog`
12
- - `DateInput`: `primereact/calendar`
13
- - `DropDown`: `primereact/dropdown`
14
- - `FilterPannel`: `primereact/sidebar`
15
- - `IndexColumn`: `primereact/column`
16
- - `MenuButton`: `primereact/tieredmenu`
17
- - `MultiSelect`: `primereact/multiselect`
18
- - `MultiSelectFilter`: `primereact/multiselect`
19
- - `NumberInput`: `primereact/inputnumber`
20
- - `PaginatedTable`: `primereact/datatable`
21
- - `TextArea`: `primereact/inputtextarea`
22
- - `TextInput`: `primereact/inputtext`
23
- - `Toggle`: `primereact/checkbox`
24
- - `ToggleInlineButton`: `primereact/selectbutton`
9
+ - `ActionColumn`: `@primereact/ui/menu`
10
+ - `AutoCompleteField`: `@primereact/ui/autocomplete`
11
+ - `Avatar`: `@primereact/ui/avatar`
12
+ - `Button`: `@primereact/ui/button`
13
+ - `CardSkeleton`: `@primereact/ui/skeleton`
14
+ - `CheckboxField`: `@primereact/ui/checkbox`
15
+ - `ColorPickerInput`: `@primereact/ui/inputcolor`
16
+ - `DateField`: `@primereact/ui/datepicker`
17
+ - `DatePresets`: `@primereact/ui/button`
18
+ - `Drawer`: `@primereact/ui/drawer`
19
+ - `FormWizard`: `@primereact/ui/stepper`
20
+ - `IndexColumn`: `@primereact/ui/datatable`
21
+ - `Loading`: `@primereact/ui/progressspinner`
22
+ - `MantisDataTable`: `@primereact/ui/datatable`
23
+ - `MaskField`: `@primereact/ui/inputtext`
24
+ - `MenuButton`: `@primereact/ui/menu`
25
+ - `Modal`: `@primereact/ui/dialog`
26
+ - `MultiSelectFilter`: `@primereact/ui/select`
27
+ - `NumberField`: `@primereact/ui/inputnumber`
28
+ - `OtpInput`: `@primereact/ui/inputotp`
29
+ - `PageTabs`: `@primereact/ui/tabs`
30
+ - `PaginatedTable`: `@primereact/ui/datatable`
31
+ - `PasswordInput`: `@primereact/ui/inputpassword`
32
+ - `PhoneInput`: `@primereact/ui/inputtext`
33
+ - `RadioGroup`: `@primereact/ui/radiobutton`
34
+ - `RangeSlider`: `@primereact/ui/slider`
35
+ - `RatingInput`: `@primereact/ui/rating`
36
+ - `SearchInput`: `@primereact/ui/inputtext`
37
+ - `SelectField`: `@primereact/ui/select`
38
+ - `SwitchField`: `@primereact/ui/toggleswitch`
39
+ - `TableSkeleton`: `@primereact/ui/skeleton`
40
+ - `Tag`: `@primereact/ui/tag`
41
+ - `TagsInput`: `@primereact/ui/inputtags`
42
+ - `TextArea`: `@primereact/ui/textarea`
43
+ - `TextField`: `@primereact/ui/inputtext`
44
+ - `Timeline`: `@primereact/ui/timeline`
45
+ - `ToggleInlineButton`: `@primereact/ui/togglebutton`
46
+ - `UserMenu`: `@primereact/ui/menu`
25
47
 
26
48
  ## Non-PrimeReact wrappers
27
49
 
28
50
  - `AdminPageLayout`: `React context + custom shell`
29
- - `AsyncSelect`: `react-select/async`
30
- - `CKEditorInput`: `@ckeditor/ckeditor5-react`
51
+ - `BarChart`: `chart.js`
52
+ - `CKEditorInput`: `ckeditor`
53
+ - `DonutChart`: `chart.js`
31
54
  - `ErrorMessage`: `@hookform/error-message`
32
- - `HiddenField`: `react-hook-form`
33
- - `MapPicker`: `next/dynamic`
34
- - `MapPickerClient`: `react-leaflet`
35
- - `Select`: `react-select`
36
- - `TimePicker`: `react-datepicker`
55
+ - `LineChart`: `chart.js`
56
+ - `MapPicker`: `leaflet`
57
+ - `MapPickerClient`: `leaflet`
58
+ - `MapPickerOSM`: `leaflet`
37
59
 
38
60
  ## Custom components
39
61
 
@@ -41,56 +63,32 @@ Which base library each component wraps.
41
63
  - `AdminPageHeader`
42
64
  - `AdminPageLayoutShell`
43
65
  - `AppShell`
44
- - `Avatar`
45
- - `BarChart`
46
66
  - `Breadcrumbs`
47
- - `CardSkeleton`
48
67
  - `ChangePasswordForm`
49
- - `ColorPickerInput`
50
- - `Combobox`
51
68
  - `CommandPalette`
52
- - `CurrencyInput`
69
+ - `ConfirmDialog`
53
70
  - `DataState`
54
- - `DatePresets`
55
- - `DateRangeInput`
56
71
  - `DescriptionList`
57
72
  - `DirtyFormGuard`
58
- - `DonutChart`
59
- - `Drawer`
60
73
  - `EmptyState`
61
74
  - `ErrorBoundary`
75
+ - `FieldShell`
62
76
  - `FileDropzone`
77
+ - `FilterPannel`
63
78
  - `ForgotPasswordForm`
64
79
  - `FormActionsBar`
65
80
  - `FormFieldRender`
66
81
  - `FormSection`
67
- - `FormWizard`
68
- - `LineChart`
69
- - `Loading`
82
+ - `HiddenField`
70
83
  - `LoginForm`
71
- - `MapPickerOSM`
72
- - `Modal`
73
- - `OtpInput`
74
- - `PageTabs`
75
84
  - `PageTitle`
76
85
  - `Pagination`
77
- - `PasswordInput`
78
- - `PhoneInput`
79
- - `RadioGroup`
80
- - `RangeSlider`
81
- - `RatingInput`
82
86
  - `RenderField`
83
87
  - `ResetPasswordForm`
84
88
  - `RichTextPreview`
85
- - `SearchInput`
86
89
  - `StatCard`
87
90
  - `StatusBadge`
88
- - `Switch`
89
91
  - `TableFilterField`
90
- - `TableSkeleton`
91
92
  - `TableToolbar`
92
- - `Tag`
93
- - `TagsInput`
94
- - `Timeline`
95
93
  - `UploadFilesPreview`
96
- - `UserMenu`
94
+ - `useFieldController`
@@ -0,0 +1,138 @@
1
+ # Field Controller
2
+
3
+ Shared react-hook-form contract for every form wrapper in `@mantis-core/ui` (PR11). One hook —
4
+ `useFieldController` — wires RHF's `useController` and the field's presentation shell so each
5
+ wrapper only maps `field.value`/`field.onChange` into its own component's shape.
6
+
7
+ Source: `packages/mantis-core-ui/src/components/Forms/useFieldController.ts` and `FieldShell.tsx`.
8
+
9
+ ## `FieldControllerProps`
10
+
11
+ Form wrappers extend this directly as their own props — there is **no** `controller={{ ... }}`
12
+ object prop. `TFieldValues`/`TName` are generic over the caller's form so `name` is
13
+ autocompleted/validated against real fields, and `defaultValue`/`rules` are typed by path.
14
+
15
+ ```ts
16
+ interface FieldControllerProps<TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>> {
17
+ name: TName;
18
+ control?: Control<TFieldValues>;
19
+ rules?: Omit<RegisterOptions<TFieldValues, TName>, 'valueAsNumber' | 'valueAsDate' | 'setValueAs' | 'disabled'>;
20
+ defaultValue?: FieldPathValue<TFieldValues, TName>;
21
+ shouldUnregister?: boolean;
22
+ disabled?: boolean; // OR-ed with the form's isSubmitting state
23
+ label?: string;
24
+ labelMode?: LabelMode; // 'ifta' | 'float' | 'beside' | 'top' | 'none' — defaults to MantisThemeProvider (ifta)
25
+ floatVariant?: FloatVariant; // 'over' | 'in' | 'on' — only used when labelMode='float'
26
+ addonBefore?: ReactNode;
27
+ addonAfter?: ReactNode;
28
+ variant?: InputVariant; // 'outlined' | 'filled' — defaults to MantisThemeProvider
29
+ size?: FieldSize; // 'small' | 'large' — defaults to MantisThemeProvider
30
+ fluid?: boolean; // full-width override for this field
31
+ required?: boolean; // presentational only — validation is `rules`
32
+ helpText?: string;
33
+ id?: string; // override the generated id used to wire input <-> label <-> aria
34
+ }
35
+ ```
36
+
37
+ Usage — no `controller` wrapper, props are flat:
38
+
39
+ ```tsx
40
+ <TextField name='email' control={control} label='Email' rules={{ required: 'Required' }} />
41
+ ```
42
+
43
+ ### `ChoiceFieldControllerProps` (bucket B: toggles, groups, ranges)
44
+
45
+ For non-text-box controls (checkboxes, radio groups, rating, range), text-box-only affordances are
46
+ removed **at the type level** so passing them fails to compile, not just render wrong:
47
+
48
+ ```ts
49
+ type ChoiceFieldControllerProps<TFieldValues, TName> = Omit<
50
+ FieldControllerProps<TFieldValues, TName>,
51
+ 'labelMode' | 'floatVariant' | 'addonBefore' | 'addonAfter' | 'variant'
52
+ > & {
53
+ labelMode?: 'beside' | 'top' | 'none'; // 'beside' default for toggles, 'top' for groups
54
+ };
55
+ ```
56
+
57
+ A `<CheckboxField labelMode='float'>` or an addon on a `<RatingInput>` does not compile — `ifta` /
58
+ `float` / `InputGroup` / `variant` don't apply to these controls.
59
+
60
+ ## `FieldShell` anatomy
61
+
62
+ `FieldShell` owns label + addon + help + error composition; every wrapper supplies only its input
63
+ node as `children`.
64
+
65
+ ```ts
66
+ interface FieldShellProps {
67
+ id: string;
68
+ label?: string;
69
+ required?: boolean;
70
+ helpText?: string;
71
+ errorMessage?: string;
72
+ labelMode?: LabelMode;
73
+ floatVariant?: FloatVariant;
74
+ addonBefore?: ReactNode;
75
+ addonAfter?: ReactNode;
76
+ children: ReactNode;
77
+ }
78
+ ```
79
+
80
+ - **Label modes** (`LabelMode = 'ifta' | 'float' | 'beside' | 'top' | 'none'`):
81
+ - `ifta` — wraps input + label in PR11 `IftaLabel`.
82
+ - `float` — wraps input + label in PR11 `FloatLabel` (position per `floatVariant`: `over` / `in` / `on`).
83
+ - `beside` — label renders next to the control (row layout).
84
+ - `top` — label renders above the control.
85
+ - `none` — no label rendered even if `label` text is provided elsewhere.
86
+ - **Addons** — `addonBefore`/`addonAfter` wrap the (already labeled) control in PR11's
87
+ `InputGroup.Root`, addons outer, labeled control inner.
88
+ - **Fluid** — resolved from the `useFieldConfig()` context (not a per-shell prop); when on, wraps
89
+ the composed control in PR11's `<Fluid>`.
90
+ - **Help/error** — rendered below the control as `<small id="${id}-help">` /
91
+ `<small id="${id}-error">`. Both render independently — if `helpText` and `errorMessage` are both
92
+ truthy, both `<small>` elements show at once; there is no suppression. The only precedence is in
93
+ `aria-describedby`, which prefers the error (see Aria wiring below).
94
+ - **Required marker** — a presentational ` *` appended to the label, `aria-hidden`.
95
+
96
+ ### Aria wiring
97
+
98
+ `useFieldController` owns aria, not `FieldShell`: PR11's `invalid` prop drives styling only, it does
99
+ **not** emit `aria-invalid`. The hook returns an `aria` object —
100
+ `{ 'aria-invalid': fieldState.invalid || undefined, 'aria-describedby': errorId | helpId | undefined }`
101
+ (error id wins over help id when both are present) — spread onto the actual input/trigger element.
102
+
103
+ ## `useFieldController` return shape
104
+
105
+ ```ts
106
+ const f = useFieldController({ name, control, rules, defaultValue, shouldUnregister, disabled, helpText, id, variant, size, fluid });
107
+ // f.field, f.fieldState, f.formState — raw RHF controller result
108
+ // f.id, f.errorId, f.helpId — stable ids for FieldShell + aria
109
+ // f.variant, f.size, f.fluid — resolved (prop ?? MantisThemeProvider config)
110
+ // f.invalid — fieldState.invalid
111
+ // f.disabled — disabled || formState.isSubmitting
112
+ // f.errorMessage — fieldState.error?.message
113
+ // f.aria — { 'aria-invalid', 'aria-describedby' }
114
+ ```
115
+
116
+ ## How to build a new form wrapper
117
+
118
+ Canonical pattern (from `TextField.tsx`):
119
+
120
+ 1. Accept `FieldControllerProps<TFieldValues, TName>` (or `ChoiceFieldControllerProps` for bucket B)
121
+ intersected with the underlying PR11 primitive's own extra props (Omit the primitive's
122
+ controlled/state props — `value`, `onChange`, `invalid`, `disabled`, etc. — since the hook owns
123
+ those).
124
+ 2. Destructure the controller/presentation props out of `props`; call `useFieldController` with
125
+ `name, control, rules, defaultValue, shouldUnregister, disabled, helpText, id, variant, size, fluid`.
126
+ 3. Render `<FieldShell id={f.id} label={label} labelMode={labelMode} floatVariant={floatVariant}
127
+ addonBefore={addonBefore} addonAfter={addonAfter} required={required} helpText={helpText}
128
+ errorMessage={f.errorMessage}>` around the actual PR11 input.
129
+ 4. Wire the PR11 primitive to `f.field` (`name`, `value`, `onChange`/`onValueChange`, `onBlur`,
130
+ `ref`) and `f.id` (`id`), plus `invalid={f.invalid}`, `disabled={f.disabled}`,
131
+ `variant={f.variant}`, `size={f.size}`, `fluid={f.fluid}`, and spread `{...f.aria}` onto the
132
+ element that owns focus (native input, or the trigger button for portal-based compounds like
133
+ `Select`).
134
+ 5. Spread any remaining `...rest` primitive props straight onto the PR11 element as an escape hatch.
135
+
136
+ Portal-based compounds (e.g. `Select`) have no native blur — call `f.field.onBlur()` from the
137
+ compound's `onOpenChange` (fired on close) instead, and put id/aria on the trigger element rather
138
+ than a bare `<input>`.
@@ -7,46 +7,27 @@
7
7
  ## All partials
8
8
 
9
9
  ```scss
10
- @use "@mantis-core/styles/scss/buttons.scss";
11
10
  @use "@mantis-core/styles/scss/ckeditor.scss";
12
11
  @use "@mantis-core/styles/scss/confirm-dialog.scss";
13
12
  @use "@mantis-core/styles/scss/data-state.scss";
14
13
  @use "@mantis-core/styles/scss/file-dropzone.scss";
15
14
  @use "@mantis-core/styles/scss/form-actions.scss";
16
- @use "@mantis-core/styles/scss/inputs.scss";
17
15
  @use "@mantis-core/styles/scss/rich-text-preview.scss";
18
- @use "@mantis-core/styles/scss/select-button.scss";
19
- @use "@mantis-core/styles/scss/select.scss";
20
16
  @use "@mantis-core/styles/scss/status-badge.scss";
21
- @use "@mantis-core/styles/scss/switch.scss";
22
17
  @use "@mantis-core/styles/scss/table.scss";
23
18
  ```
24
19
 
25
20
  ## Per component
26
21
 
27
- - `AsyncSelect`: `scss/select.scss`
28
- - `Button`: `scss/buttons.scss`
29
22
  - `CKEditorInput`: `scss/ckeditor.scss`
30
23
  - `ConfirmDialog`: `scss/confirm-dialog.scss`
31
- - `CurrencyInput`: `scss/inputs.scss`
32
24
  - `DataState`: `scss/data-state.scss`
33
- - `DateInput`: `scss/inputs.scss`
34
- - `DateRangeInput`: `scss/inputs.scss`
35
- - `DropDown`: `scss/inputs.scss`
36
25
  - `FileDropzone`: `scss/file-dropzone.scss`
37
26
  - `FormActionsBar`: `scss/form-actions.scss`
38
- - `MultiSelect`: `scss/inputs.scss`
39
- - `NumberInput`: `scss/inputs.scss`
27
+ - `MantisDataTable`: `scss/table.scss`
40
28
  - `PaginatedTable`: `scss/table.scss`
41
- - `PasswordInput`: `scss/inputs.scss`
42
29
  - `RichTextPreview`: `scss/rich-text-preview.scss`
43
- - `Select`: `scss/select.scss`
44
30
  - `StatusBadge`: `scss/status-badge.scss`
45
- - `Switch`: `scss/switch.scss`
46
- - `TextArea`: `scss/inputs.scss`
47
- - `TextInput`: `scss/inputs.scss`
48
- - `TimePicker`: `scss/inputs.scss`
49
- - `ToggleInlineButton`: `scss/select-button.scss`
50
31
 
51
32
  ## Notes
52
33