@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.
- package/CHANGELOG.md +155 -0
- package/COMPONENTS.md +71 -73
- package/README.md +19 -6
- package/bin/mantis-llm.mjs +242 -0
- package/catalog.json +3031 -0
- package/dist/components/Buttons/Button.d.ts +39 -9
- package/dist/components/Buttons/Button.d.ts.map +1 -1
- package/dist/components/Buttons/Button.js +21 -13
- package/dist/components/Buttons/Button.js.map +1 -1
- package/dist/components/Forms/AutoCompleteField.d.ts +60 -0
- package/dist/components/Forms/AutoCompleteField.d.ts.map +1 -0
- package/dist/components/Forms/AutoCompleteField.js +125 -0
- package/dist/components/Forms/AutoCompleteField.js.map +1 -0
- package/dist/components/Forms/CKEditorInput.d.ts +5 -2
- package/dist/components/Forms/CKEditorInput.d.ts.map +1 -1
- package/dist/components/Forms/CKEditorInput.js +5 -2
- package/dist/components/Forms/CKEditorInput.js.map +1 -1
- package/dist/components/Forms/CheckboxField.d.ts +14 -0
- package/dist/components/Forms/CheckboxField.d.ts.map +1 -0
- package/dist/components/Forms/CheckboxField.js +26 -0
- package/dist/components/Forms/CheckboxField.js.map +1 -0
- package/dist/components/Forms/ColorPickerInput.d.ts +27 -8
- package/dist/components/Forms/ColorPickerInput.d.ts.map +1 -1
- package/dist/components/Forms/ColorPickerInput.js +57 -11
- package/dist/components/Forms/ColorPickerInput.js.map +1 -1
- package/dist/components/Forms/DateField.d.ts +68 -0
- package/dist/components/Forms/DateField.d.ts.map +1 -0
- package/dist/components/Forms/DateField.js +108 -0
- package/dist/components/Forms/DateField.js.map +1 -0
- package/dist/components/Forms/DatePresets.d.ts.map +1 -1
- package/dist/components/Forms/DatePresets.js +6 -3
- package/dist/components/Forms/DatePresets.js.map +1 -1
- package/dist/components/Forms/FieldShell.d.ts +24 -0
- package/dist/components/Forms/FieldShell.d.ts.map +1 -0
- package/dist/components/Forms/FieldShell.js +39 -0
- package/dist/components/Forms/FieldShell.js.map +1 -0
- package/dist/components/Forms/FileDropzone.d.ts +4 -2
- package/dist/components/Forms/FileDropzone.d.ts.map +1 -1
- package/dist/components/Forms/FileDropzone.js.map +1 -1
- package/dist/components/Forms/FormActionsBar.js +2 -2
- package/dist/components/Forms/FormActionsBar.js.map +1 -1
- package/dist/components/Forms/FormWizard.d.ts +1 -1
- package/dist/components/Forms/FormWizard.d.ts.map +1 -1
- package/dist/components/Forms/FormWizard.js +4 -5
- package/dist/components/Forms/FormWizard.js.map +1 -1
- package/dist/components/Forms/HiddenField.d.ts +12 -6
- package/dist/components/Forms/HiddenField.d.ts.map +1 -1
- package/dist/components/Forms/HiddenField.js +14 -5
- package/dist/components/Forms/HiddenField.js.map +1 -1
- package/dist/components/Forms/MaskField.d.ts +28 -0
- package/dist/components/Forms/MaskField.d.ts.map +1 -0
- package/dist/components/Forms/MaskField.js +74 -0
- package/dist/components/Forms/MaskField.js.map +1 -0
- package/dist/components/Forms/NumberField.d.ts +14 -0
- package/dist/components/Forms/NumberField.d.ts.map +1 -0
- package/dist/components/Forms/NumberField.js +51 -0
- package/dist/components/Forms/NumberField.js.map +1 -0
- package/dist/components/Forms/OtpInput.d.ts +23 -8
- package/dist/components/Forms/OtpInput.d.ts.map +1 -1
- package/dist/components/Forms/OtpInput.js +37 -8
- package/dist/components/Forms/OtpInput.js.map +1 -1
- package/dist/components/Forms/PasswordInput.d.ts +22 -9
- package/dist/components/Forms/PasswordInput.d.ts.map +1 -1
- package/dist/components/Forms/PasswordInput.js +63 -28
- package/dist/components/Forms/PasswordInput.js.map +1 -1
- package/dist/components/Forms/PhoneInput.d.ts +16 -8
- package/dist/components/Forms/PhoneInput.d.ts.map +1 -1
- package/dist/components/Forms/PhoneInput.js +13 -6
- package/dist/components/Forms/PhoneInput.js.map +1 -1
- package/dist/components/Forms/RadioGroup.d.ts +34 -13
- package/dist/components/Forms/RadioGroup.d.ts.map +1 -1
- package/dist/components/Forms/RadioGroup.js +49 -6
- package/dist/components/Forms/RadioGroup.js.map +1 -1
- package/dist/components/Forms/RangeSlider.d.ts +26 -11
- package/dist/components/Forms/RangeSlider.d.ts.map +1 -1
- package/dist/components/Forms/RangeSlider.js +40 -7
- package/dist/components/Forms/RangeSlider.js.map +1 -1
- package/dist/components/Forms/RatingInput.d.ts +24 -8
- package/dist/components/Forms/RatingInput.d.ts.map +1 -1
- package/dist/components/Forms/RatingInput.js +41 -9
- package/dist/components/Forms/RatingInput.js.map +1 -1
- package/dist/components/Forms/SearchInput.d.ts +18 -10
- package/dist/components/Forms/SearchInput.d.ts.map +1 -1
- package/dist/components/Forms/SearchInput.js +44 -23
- package/dist/components/Forms/SearchInput.js.map +1 -1
- package/dist/components/Forms/SelectField.d.ts +41 -0
- package/dist/components/Forms/SelectField.d.ts.map +1 -0
- package/dist/components/Forms/SelectField.js +110 -0
- package/dist/components/Forms/SelectField.js.map +1 -0
- package/dist/components/Forms/SwitchField.d.ts +14 -0
- package/dist/components/Forms/SwitchField.d.ts.map +1 -0
- package/dist/components/Forms/SwitchField.js +26 -0
- package/dist/components/Forms/SwitchField.js.map +1 -0
- package/dist/components/Forms/TagsInput.d.ts +29 -8
- package/dist/components/Forms/TagsInput.d.ts.map +1 -1
- package/dist/components/Forms/TagsInput.js +53 -9
- package/dist/components/Forms/TagsInput.js.map +1 -1
- package/dist/components/Forms/TextArea.d.ts +13 -10
- package/dist/components/Forms/TextArea.d.ts.map +1 -1
- package/dist/components/Forms/TextArea.js +27 -9
- package/dist/components/Forms/TextArea.js.map +1 -1
- package/dist/components/Forms/TextField.d.ts +14 -0
- package/dist/components/Forms/TextField.d.ts.map +1 -0
- package/dist/components/Forms/TextField.js +29 -0
- package/dist/components/Forms/TextField.js.map +1 -0
- package/dist/components/Forms/ToggleInlineButton.d.ts +33 -12
- package/dist/components/Forms/ToggleInlineButton.d.ts.map +1 -1
- package/dist/components/Forms/ToggleInlineButton.js +56 -6
- package/dist/components/Forms/ToggleInlineButton.js.map +1 -1
- package/dist/components/Forms/UploadFilesPreview.js +3 -3
- package/dist/components/Forms/UploadFilesPreview.js.map +1 -1
- package/dist/components/Forms/field-typing.test-d.d.ts +2 -0
- package/dist/components/Forms/field-typing.test-d.d.ts.map +1 -0
- package/dist/components/Forms/field-typing.test-d.js +24 -0
- package/dist/components/Forms/field-typing.test-d.js.map +1 -0
- package/dist/components/Forms/useFieldController.d.ts +85 -0
- package/dist/components/Forms/useFieldController.d.ts.map +1 -0
- package/dist/components/Forms/useFieldController.js +54 -0
- package/dist/components/Forms/useFieldController.js.map +1 -0
- package/dist/components/Loaders/Loading.d.ts.map +1 -1
- package/dist/components/Loaders/Loading.js +3 -2
- package/dist/components/Loaders/Loading.js.map +1 -1
- package/dist/components/Tables/ActionColumn.d.ts +20 -4
- package/dist/components/Tables/ActionColumn.d.ts.map +1 -1
- package/dist/components/Tables/ActionColumn.js +24 -5
- package/dist/components/Tables/ActionColumn.js.map +1 -1
- package/dist/components/Tables/FilterPannel.d.ts +9 -2
- package/dist/components/Tables/FilterPannel.d.ts.map +1 -1
- package/dist/components/Tables/FilterPannel.js +15 -11
- package/dist/components/Tables/FilterPannel.js.map +1 -1
- package/dist/components/Tables/IndexColumn.d.ts +12 -3
- package/dist/components/Tables/IndexColumn.d.ts.map +1 -1
- package/dist/components/Tables/IndexColumn.js +21 -5
- package/dist/components/Tables/IndexColumn.js.map +1 -1
- package/dist/components/Tables/MantisDataTable.d.ts +45 -0
- package/dist/components/Tables/MantisDataTable.d.ts.map +1 -0
- package/dist/components/Tables/MantisDataTable.js +63 -0
- package/dist/components/Tables/MantisDataTable.js.map +1 -0
- package/dist/components/Tables/MenuButton.d.ts +28 -7
- package/dist/components/Tables/MenuButton.d.ts.map +1 -1
- package/dist/components/Tables/MenuButton.js +20 -10
- package/dist/components/Tables/MenuButton.js.map +1 -1
- package/dist/components/Tables/PaginatedTable.d.ts +26 -17
- package/dist/components/Tables/PaginatedTable.d.ts.map +1 -1
- package/dist/components/Tables/PaginatedTable.js +24 -22
- package/dist/components/Tables/PaginatedTable.js.map +1 -1
- package/dist/components/Tables/cell-presets.d.ts +35 -0
- package/dist/components/Tables/cell-presets.d.ts.map +1 -0
- package/dist/components/Tables/cell-presets.js +40 -0
- package/dist/components/Tables/cell-presets.js.map +1 -0
- package/dist/components/Tables/columns.d.ts +40 -0
- package/dist/components/Tables/columns.d.ts.map +1 -0
- package/dist/components/Tables/columns.js +2 -0
- package/dist/components/Tables/columns.js.map +1 -0
- package/dist/components/Tables/filters/MultiSelectFilter.d.ts +24 -6
- package/dist/components/Tables/filters/MultiSelectFilter.d.ts.map +1 -1
- package/dist/components/Tables/filters/MultiSelectFilter.js +19 -6
- package/dist/components/Tables/filters/MultiSelectFilter.js.map +1 -1
- package/dist/components/auth/ChangePasswordForm.d.ts.map +1 -1
- package/dist/components/auth/ChangePasswordForm.js +12 -12
- package/dist/components/auth/ChangePasswordForm.js.map +1 -1
- package/dist/components/auth/ForgotPasswordForm.d.ts.map +1 -1
- package/dist/components/auth/ForgotPasswordForm.js +7 -5
- package/dist/components/auth/ForgotPasswordForm.js.map +1 -1
- package/dist/components/auth/LoginForm.d.ts +2 -2
- package/dist/components/auth/LoginForm.d.ts.map +1 -1
- package/dist/components/auth/LoginForm.js +15 -15
- package/dist/components/auth/LoginForm.js.map +1 -1
- package/dist/components/auth/ResetPasswordForm.d.ts.map +1 -1
- package/dist/components/auth/ResetPasswordForm.js +11 -12
- package/dist/components/auth/ResetPasswordForm.js.map +1 -1
- package/dist/components/auth/UserMenu.d.ts +11 -1
- package/dist/components/auth/UserMenu.d.ts.map +1 -1
- package/dist/components/auth/UserMenu.js +30 -87
- package/dist/components/auth/UserMenu.js.map +1 -1
- package/dist/components/data/Timeline.d.ts +2 -2
- package/dist/components/data/Timeline.d.ts.map +1 -1
- package/dist/components/data/Timeline.js +17 -17
- package/dist/components/data/Timeline.js.map +1 -1
- package/dist/components/feedback/Avatar.d.ts +4 -2
- package/dist/components/feedback/Avatar.d.ts.map +1 -1
- package/dist/components/feedback/Avatar.js +4 -4
- package/dist/components/feedback/Avatar.js.map +1 -1
- package/dist/components/feedback/CardSkeleton.d.ts.map +1 -1
- package/dist/components/feedback/CardSkeleton.js +3 -3
- package/dist/components/feedback/CardSkeleton.js.map +1 -1
- package/dist/components/feedback/TableSkeleton.d.ts.map +1 -1
- package/dist/components/feedback/TableSkeleton.js +3 -3
- package/dist/components/feedback/TableSkeleton.js.map +1 -1
- package/dist/components/feedback/Tag.d.ts +4 -2
- package/dist/components/feedback/Tag.d.ts.map +1 -1
- package/dist/components/feedback/Tag.js +4 -4
- package/dist/components/feedback/Tag.js.map +1 -1
- package/dist/components/navigation/CommandPalette.d.ts.map +1 -1
- package/dist/components/navigation/CommandPalette.js +5 -2
- package/dist/components/navigation/CommandPalette.js.map +1 -1
- package/dist/components/navigation/PageTabs.d.ts +10 -8
- package/dist/components/navigation/PageTabs.d.ts.map +1 -1
- package/dist/components/navigation/PageTabs.js +17 -13
- package/dist/components/navigation/PageTabs.js.map +1 -1
- package/dist/components/overlays/Drawer.d.ts +16 -3
- package/dist/components/overlays/Drawer.d.ts.map +1 -1
- package/dist/components/overlays/Drawer.js +9 -5
- package/dist/components/overlays/Drawer.js.map +1 -1
- package/dist/components/overlays/Modal.d.ts +18 -3
- package/dist/components/overlays/Modal.d.ts.map +1 -1
- package/dist/components/overlays/Modal.js +13 -5
- package/dist/components/overlays/Modal.js.map +1 -1
- package/dist/components/pages/app-shell/AppShell.d.ts.map +1 -1
- package/dist/components/pages/app-shell/AppShell.js +6 -6
- package/dist/components/pages/app-shell/AppShell.js.map +1 -1
- package/dist/components/ui/ConfirmDialog.d.ts +1 -2
- package/dist/components/ui/ConfirmDialog.d.ts.map +1 -1
- package/dist/components/ui/ConfirmDialog.js +10 -4
- package/dist/components/ui/ConfirmDialog.js.map +1 -1
- package/dist/components/ui/DataState.js +2 -2
- package/dist/components/ui/DataState.js.map +1 -1
- package/dist/index.d.ts +71 -42
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +114 -22
- package/dist/index.js.map +1 -1
- package/docs/README.md +1 -1
- package/docs/components/action-column.md +33 -7
- package/docs/components/admin-page-configurator.md +24 -5
- package/docs/components/admin-page-header.md +21 -3
- package/docs/components/admin-page-layout-shell.md +18 -4
- package/docs/components/admin-page-layout.md +34 -5
- package/docs/components/app-shell.md +31 -6
- package/docs/components/auto-complete-field.md +60 -0
- package/docs/components/avatar.md +18 -8
- package/docs/components/bar-chart.md +25 -7
- package/docs/components/breadcrumbs.md +15 -2
- package/docs/components/button.md +34 -15
- package/docs/components/card-skeleton.md +9 -3
- package/docs/components/change-password-form.md +23 -4
- package/docs/components/checkbox-field.md +38 -0
- package/docs/components/ckeditor-input.md +40 -8
- package/docs/components/color-picker-input.md +19 -8
- package/docs/components/command-palette.md +23 -2
- package/docs/components/confirm-dialog.md +36 -9
- package/docs/components/data-state.md +31 -6
- package/docs/components/date-field.md +39 -0
- package/docs/components/date-presets.md +19 -5
- package/docs/components/description-list.md +20 -2
- package/docs/components/dirty-form-guard.md +16 -4
- package/docs/components/donut-chart.md +24 -7
- package/docs/components/drawer.md +27 -8
- package/docs/components/empty-state.md +12 -2
- package/docs/components/error-boundary.md +16 -2
- package/docs/components/error-message.md +22 -3
- package/docs/components/field-shell.md +47 -0
- package/docs/components/file-dropzone.md +22 -6
- package/docs/components/filter-pannel.md +34 -7
- package/docs/components/forgot-password-form.md +23 -5
- package/docs/components/form-actions-bar.md +21 -2
- package/docs/components/form-field-render.md +36 -8
- package/docs/components/form-section.md +13 -1
- package/docs/components/form-wizard.md +34 -5
- package/docs/components/hidden-field.md +22 -6
- package/docs/components/index-column.md +25 -5
- package/docs/components/line-chart.md +25 -7
- package/docs/components/loading.md +14 -5
- package/docs/components/login-form.md +31 -6
- package/docs/components/mantis-data-table.md +61 -0
- package/docs/components/map-picker-client.md +29 -8
- package/docs/components/map-picker-osm.md +27 -9
- package/docs/components/map-picker.md +25 -4
- package/docs/components/mask-field.md +31 -0
- package/docs/components/menu-button.md +22 -7
- package/docs/components/modal.md +34 -9
- package/docs/components/multi-select-filter.md +25 -7
- package/docs/components/number-field.md +40 -0
- package/docs/components/otp-input.md +20 -7
- package/docs/components/page-tabs.md +23 -4
- package/docs/components/page-title.md +6 -1
- package/docs/components/paginated-table.md +36 -13
- package/docs/components/pagination.md +20 -7
- package/docs/components/password-input.md +20 -8
- package/docs/components/phone-input.md +17 -7
- package/docs/components/radio-group.md +39 -9
- package/docs/components/range-slider.md +18 -6
- package/docs/components/rating-input.md +19 -8
- package/docs/components/render-field.md +31 -3
- package/docs/components/reset-password-form.md +24 -4
- package/docs/components/rich-text-preview.md +17 -5
- package/docs/components/search-input.md +18 -7
- package/docs/components/select-field.md +55 -0
- package/docs/components/stat-card.md +14 -3
- package/docs/components/status-badge.md +17 -7
- package/docs/components/switch-field.md +32 -0
- package/docs/components/table-filter-field.md +22 -4
- package/docs/components/table-skeleton.md +9 -3
- package/docs/components/table-toolbar.md +18 -5
- package/docs/components/tag.md +16 -7
- package/docs/components/tags-input.md +21 -8
- package/docs/components/text-area.md +18 -8
- package/docs/components/text-field.md +32 -0
- package/docs/components/timeline.md +19 -3
- package/docs/components/toggle-inline-button.md +42 -10
- package/docs/components/upload-files-preview.md +23 -2
- package/docs/components/use-field-controller.md +58 -0
- package/docs/components/user-menu.md +26 -6
- package/docs/contracts/dependency-map.md +50 -52
- package/docs/contracts/field-controller.md +138 -0
- package/docs/contracts/style-imports.md +1 -20
- package/llms.txt +70 -72
- package/package.json +48 -11
- package/dist/components/Forms/AsyncSelect.d.ts +0 -20
- package/dist/components/Forms/AsyncSelect.d.ts.map +0 -1
- package/dist/components/Forms/AsyncSelect.js +0 -77
- package/dist/components/Forms/AsyncSelect.js.map +0 -1
- package/dist/components/Forms/Combobox.d.ts +0 -10
- package/dist/components/Forms/Combobox.d.ts.map +0 -1
- package/dist/components/Forms/Combobox.js +0 -11
- package/dist/components/Forms/Combobox.js.map +0 -1
- package/dist/components/Forms/CurrencyInput.d.ts +0 -12
- package/dist/components/Forms/CurrencyInput.d.ts.map +0 -1
- package/dist/components/Forms/CurrencyInput.js +0 -9
- package/dist/components/Forms/CurrencyInput.js.map +0 -1
- package/dist/components/Forms/DateInput.d.ts +0 -10
- package/dist/components/Forms/DateInput.d.ts.map +0 -1
- package/dist/components/Forms/DateInput.js +0 -11
- package/dist/components/Forms/DateInput.js.map +0 -1
- package/dist/components/Forms/DateRangeInput.d.ts +0 -10
- package/dist/components/Forms/DateRangeInput.d.ts.map +0 -1
- package/dist/components/Forms/DateRangeInput.js +0 -13
- package/dist/components/Forms/DateRangeInput.js.map +0 -1
- package/dist/components/Forms/DropDown.d.ts +0 -10
- package/dist/components/Forms/DropDown.d.ts.map +0 -1
- package/dist/components/Forms/DropDown.js +0 -11
- package/dist/components/Forms/DropDown.js.map +0 -1
- package/dist/components/Forms/MultiSelect.d.ts +0 -10
- package/dist/components/Forms/MultiSelect.d.ts.map +0 -1
- package/dist/components/Forms/MultiSelect.js +0 -13
- package/dist/components/Forms/MultiSelect.js.map +0 -1
- package/dist/components/Forms/NumberInput.d.ts +0 -10
- package/dist/components/Forms/NumberInput.d.ts.map +0 -1
- package/dist/components/Forms/NumberInput.js +0 -16
- package/dist/components/Forms/NumberInput.js.map +0 -1
- package/dist/components/Forms/Select.d.ts +0 -15
- package/dist/components/Forms/Select.d.ts.map +0 -1
- package/dist/components/Forms/Select.js +0 -48
- package/dist/components/Forms/Select.js.map +0 -1
- package/dist/components/Forms/Switch.d.ts +0 -18
- package/dist/components/Forms/Switch.d.ts.map +0 -1
- package/dist/components/Forms/Switch.js +0 -30
- package/dist/components/Forms/Switch.js.map +0 -1
- package/dist/components/Forms/TextInput.d.ts +0 -11
- package/dist/components/Forms/TextInput.d.ts.map +0 -1
- package/dist/components/Forms/TextInput.js +0 -12
- package/dist/components/Forms/TextInput.js.map +0 -1
- package/dist/components/Forms/TimePicker.d.ts +0 -13
- package/dist/components/Forms/TimePicker.d.ts.map +0 -1
- package/dist/components/Forms/TimePicker.js +0 -19
- package/dist/components/Forms/TimePicker.js.map +0 -1
- package/dist/components/Forms/Toggle.d.ts +0 -14
- package/dist/components/Forms/Toggle.d.ts.map +0 -1
- package/dist/components/Forms/Toggle.js +0 -10
- package/dist/components/Forms/Toggle.js.map +0 -1
- package/dist/components/Forms/types.d.ts +0 -9
- package/dist/components/Forms/types.d.ts.map +0 -1
- package/dist/components/Forms/types.js +0 -2
- package/dist/components/Forms/types.js.map +0 -1
- package/docs/components/async-select.md +0 -27
- package/docs/components/combobox.md +0 -19
- package/docs/components/currency-input.md +0 -21
- package/docs/components/date-input.md +0 -21
- package/docs/components/date-range-input.md +0 -20
- package/docs/components/drop-down.md +0 -26
- package/docs/components/multi-select.md +0 -22
- package/docs/components/number-input.md +0 -21
- package/docs/components/select.md +0 -28
- package/docs/components/switch.md +0 -24
- package/docs/components/text-input.md +0 -24
- package/docs/components/time-picker.md +0 -25
- package/docs/components/toggle.md +0 -24
- package/docs/contracts/component-doc-schema.md +0 -78
- 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
|
|
6
|
-
baseLibrary: primereact/
|
|
7
|
-
formContract:
|
|
8
|
-
|
|
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:
|
|
13
|
-
- { name:
|
|
14
|
-
- { name:
|
|
15
|
-
- { name: multiple, type: boolean, required: false, default: 'false', description: '
|
|
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
|
-
{
|
|
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
|
-
|
|
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
|
|
6
|
-
baseLibrary:
|
|
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
|
-
|
|
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`:
|
|
10
|
-
- `
|
|
11
|
-
- `
|
|
12
|
-
- `
|
|
13
|
-
- `
|
|
14
|
-
- `
|
|
15
|
-
- `
|
|
16
|
-
- `
|
|
17
|
-
- `
|
|
18
|
-
- `
|
|
19
|
-
- `
|
|
20
|
-
- `
|
|
21
|
-
- `
|
|
22
|
-
- `
|
|
23
|
-
- `
|
|
24
|
-
- `
|
|
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
|
-
- `
|
|
30
|
-
- `CKEditorInput`:
|
|
51
|
+
- `BarChart`: `chart.js`
|
|
52
|
+
- `CKEditorInput`: `ckeditor`
|
|
53
|
+
- `DonutChart`: `chart.js`
|
|
31
54
|
- `ErrorMessage`: `@hookform/error-message`
|
|
32
|
-
- `
|
|
33
|
-
- `MapPicker`: `
|
|
34
|
-
- `MapPickerClient`: `
|
|
35
|
-
- `
|
|
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
|
-
- `
|
|
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
|
-
- `
|
|
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
|
-
- `
|
|
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
|
-
- `
|
|
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
|
|