torch-glare 2.5.6 → 2.6.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/README.md +4 -3
- package/dist/bin/index.js +9 -24
- package/dist/bin/index.js.map +1 -1
- package/dist/src/commands/add.d.ts +2 -2
- package/dist/src/commands/add.d.ts.map +1 -1
- package/dist/src/commands/add.js +4 -70
- package/dist/src/commands/add.js.map +1 -1
- package/dist/src/commands/hook.d.ts +5 -4
- package/dist/src/commands/hook.d.ts.map +1 -1
- package/dist/src/commands/hook.js +7 -75
- package/dist/src/commands/hook.js.map +1 -1
- package/dist/src/commands/init.js +1 -1
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/layout.d.ts +5 -4
- package/dist/src/commands/layout.d.ts.map +1 -1
- package/dist/src/commands/layout.js +7 -75
- package/dist/src/commands/layout.js.map +1 -1
- package/dist/src/commands/provider.d.ts +5 -4
- package/dist/src/commands/provider.d.ts.map +1 -1
- package/dist/src/commands/provider.js +7 -75
- package/dist/src/commands/provider.js.map +1 -1
- package/dist/src/commands/update.d.ts.map +1 -1
- package/dist/src/commands/update.js +78 -43
- package/dist/src/commands/update.js.map +1 -1
- package/dist/src/commands/utils.d.ts +5 -4
- package/dist/src/commands/utils.d.ts.map +1 -1
- package/dist/src/commands/utils.js +7 -80
- package/dist/src/commands/utils.js.map +1 -1
- package/dist/src/shared/addFromRegistry.d.ts +16 -0
- package/dist/src/shared/addFromRegistry.d.ts.map +1 -0
- package/dist/src/shared/addFromRegistry.js +88 -0
- package/dist/src/shared/addFromRegistry.js.map +1 -0
- package/dist/src/shared/getInstallCommand.d.ts.map +1 -1
- package/dist/src/shared/getInstallCommand.js +5 -0
- package/dist/src/shared/getInstallCommand.js.map +1 -1
- package/dist/src/shared/installDependencies.d.ts +0 -10
- package/dist/src/shared/installDependencies.d.ts.map +1 -1
- package/dist/src/shared/installDependencies.js +0 -17
- package/dist/src/shared/installDependencies.js.map +1 -1
- package/dist/src/shared/installFromPlan.d.ts +7 -5
- package/dist/src/shared/installFromPlan.d.ts.map +1 -1
- package/dist/src/shared/installFromPlan.js +103 -36
- package/dist/src/shared/installFromPlan.js.map +1 -1
- package/dist/src/shared/loadRegistry.d.ts +12 -3
- package/dist/src/shared/loadRegistry.d.ts.map +1 -1
- package/dist/src/shared/loadRegistry.js +19 -20
- package/dist/src/shared/loadRegistry.js.map +1 -1
- package/dist/src/shared/registryClient.d.ts +19 -0
- package/dist/src/shared/registryClient.d.ts.map +1 -0
- package/dist/src/shared/registryClient.js +128 -0
- package/dist/src/shared/registryClient.js.map +1 -0
- package/dist/src/shared/resolveEntry.d.ts +10 -7
- package/dist/src/shared/resolveEntry.d.ts.map +1 -1
- package/dist/src/shared/resolveEntry.js +18 -13
- package/dist/src/shared/resolveEntry.js.map +1 -1
- package/dist/src/shared/suggestOtherCommand.d.ts +7 -1
- package/dist/src/shared/suggestOtherCommand.d.ts.map +1 -1
- package/dist/src/shared/suggestOtherCommand.js +29 -23
- package/dist/src/shared/suggestOtherCommand.js.map +1 -1
- package/dist/src/types/main.d.ts +31 -2
- package/dist/src/types/main.d.ts.map +1 -1
- package/package.json +6 -11
- package/apps/lib/components/ActionButton.tsx +0 -93
- package/apps/lib/components/ActionsGroup.tsx +0 -27
- package/apps/lib/components/AlertDialog.tsx +0 -204
- package/apps/lib/components/Avatar.tsx +0 -46
- package/apps/lib/components/Badge.tsx +0 -250
- package/apps/lib/components/BadgeField.tsx +0 -403
- package/apps/lib/components/Breadcrumb.tsx +0 -280
- package/apps/lib/components/Button.tsx +0 -325
- package/apps/lib/components/ButtonGroup.tsx +0 -190
- package/apps/lib/components/Calendar.tsx +0 -115
- package/apps/lib/components/Card.tsx +0 -95
- package/apps/lib/components/Checkbox.tsx +0 -42
- package/apps/lib/components/ColorPicker.tsx +0 -441
- package/apps/lib/components/ConclusionHeader.tsx +0 -148
- package/apps/lib/components/ContextMenu.tsx +0 -571
- package/apps/lib/components/CountBadge.tsx +0 -52
- package/apps/lib/components/DataTable.tsx +0 -213
- package/apps/lib/components/DataViews/badge.ts +0 -49
- package/apps/lib/components/DataViews/cell.tsx +0 -324
- package/apps/lib/components/DataViews/context.ts +0 -144
- package/apps/lib/components/DataViews/data-views.tsx +0 -395
- package/apps/lib/components/DataViews/filters/children.tsx +0 -98
- package/apps/lib/components/DataViews/filters/custom.tsx +0 -34
- package/apps/lib/components/DataViews/filters/filters.tsx +0 -157
- package/apps/lib/components/DataViews/filters/index.ts +0 -4
- package/apps/lib/components/DataViews/filters/labelled.tsx +0 -20
- package/apps/lib/components/DataViews/filters/presets.tsx +0 -65
- package/apps/lib/components/DataViews/filters/sync.tsx +0 -35
- package/apps/lib/components/DataViews/filters/values.ts +0 -173
- package/apps/lib/components/DataViews/header.tsx +0 -220
- package/apps/lib/components/DataViews/hooks/index.ts +0 -5
- package/apps/lib/components/DataViews/hooks/useActiveRow.ts +0 -22
- package/apps/lib/components/DataViews/hooks/useControllable.ts +0 -52
- package/apps/lib/components/DataViews/index.ts +0 -88
- package/apps/lib/components/DataViews/panel/columns.tsx +0 -153
- package/apps/lib/components/DataViews/panel/controls.tsx +0 -106
- package/apps/lib/components/DataViews/panel/index.ts +0 -3
- package/apps/lib/components/DataViews/panel/panel.tsx +0 -164
- package/apps/lib/components/DataViews/panel/saved-views.tsx +0 -67
- package/apps/lib/components/DataViews/panel/section.tsx +0 -81
- package/apps/lib/components/DataViews/panel/sort.tsx +0 -42
- package/apps/lib/components/DataViews/panel/tab.tsx +0 -31
- package/apps/lib/components/DataViews/slots.ts +0 -72
- package/apps/lib/components/DataViews/states.tsx +0 -73
- package/apps/lib/components/DataViews/types.ts +0 -510
- package/apps/lib/components/DataViews/views/board-view.tsx +0 -381
- package/apps/lib/components/DataViews/views/card-rows.tsx +0 -36
- package/apps/lib/components/DataViews/views/inbox-view.tsx +0 -260
- package/apps/lib/components/DataViews/views/pane-views.tsx +0 -196
- package/apps/lib/components/DataViews/views/table-view.tsx +0 -493
- package/apps/lib/components/DataViews/views/tree-view.tsx +0 -367
- package/apps/lib/components/DatePicker.tsx +0 -232
- package/apps/lib/components/Dialog.tsx +0 -116
- package/apps/lib/components/Divider.tsx +0 -28
- package/apps/lib/components/Drawer.tsx +0 -451
- package/apps/lib/components/DropdownMenu.tsx +0 -554
- package/apps/lib/components/FieldHint.tsx +0 -69
- package/apps/lib/components/Form.tsx +0 -182
- package/apps/lib/components/FormBuilder/context.ts +0 -85
- package/apps/lib/components/FormBuilder/field-kind.ts +0 -28
- package/apps/lib/components/FormBuilder/fields/ChoiceFields.tsx +0 -60
- package/apps/lib/components/FormBuilder/fields/ColorField.tsx +0 -59
- package/apps/lib/components/FormBuilder/fields/CustomField.tsx +0 -11
- package/apps/lib/components/FormBuilder/fields/DateField.tsx +0 -32
- package/apps/lib/components/FormBuilder/fields/FieldArray.tsx +0 -74
- package/apps/lib/components/FormBuilder/fields/FieldShell.tsx +0 -168
- package/apps/lib/components/FormBuilder/fields/FileField.tsx +0 -39
- package/apps/lib/components/FormBuilder/fields/OptionListFields.tsx +0 -132
- package/apps/lib/components/FormBuilder/fields/OtpField.tsx +0 -31
- package/apps/lib/components/FormBuilder/fields/PhoneField.tsx +0 -109
- package/apps/lib/components/FormBuilder/fields/RichTextEditorField.tsx +0 -31
- package/apps/lib/components/FormBuilder/fields/SelectField.tsx +0 -114
- package/apps/lib/components/FormBuilder/fields/SignatureField.tsx +0 -157
- package/apps/lib/components/FormBuilder/fields/SliderField.tsx +0 -67
- package/apps/lib/components/FormBuilder/fields/SwitchBoxField.tsx +0 -41
- package/apps/lib/components/FormBuilder/fields/TableField.tsx +0 -336
- package/apps/lib/components/FormBuilder/fields/TextField.tsx +0 -213
- package/apps/lib/components/FormBuilder/fields/TreeSelectField.tsx +0 -43
- package/apps/lib/components/FormBuilder/fields/countries.ts +0 -303
- package/apps/lib/components/FormBuilder/fields/index.ts +0 -25
- package/apps/lib/components/FormBuilder/form-builder.tsx +0 -198
- package/apps/lib/components/FormBuilder/index.ts +0 -31
- package/apps/lib/components/FormBuilder/numberFormat.ts +0 -16
- package/apps/lib/components/FormBuilder/submit.tsx +0 -67
- package/apps/lib/components/FormBuilder/types.ts +0 -316
- package/apps/lib/components/FormRenderer/FormDrawer.tsx +0 -250
- package/apps/lib/components/FormRenderer/detail.tsx +0 -256
- package/apps/lib/components/FormRenderer/form-renderer.tsx +0 -358
- package/apps/lib/components/FormRenderer/header.tsx +0 -88
- package/apps/lib/components/FormRenderer/index.ts +0 -17
- package/apps/lib/components/FormRenderer/notch-action.tsx +0 -64
- package/apps/lib/components/FormRenderer/section.tsx +0 -39
- package/apps/lib/components/FormRenderer/stepper.tsx +0 -393
- package/apps/lib/components/FormRenderer/types.ts +0 -115
- package/apps/lib/components/FormSummary.tsx +0 -282
- package/apps/lib/components/HeaderBar.tsx +0 -117
- package/apps/lib/components/ImageAttachment.tsx +0 -209
- package/apps/lib/components/InnerLabelField.tsx +0 -154
- package/apps/lib/components/Input.tsx +0 -224
- package/apps/lib/components/InputField.tsx +0 -147
- package/apps/lib/components/InputOTP.tsx +0 -84
- package/apps/lib/components/Label.tsx +0 -129
- package/apps/lib/components/LabelField.tsx +0 -76
- package/apps/lib/components/LabeledCheckBox.tsx +0 -51
- package/apps/lib/components/LabeledRadio.tsx +0 -51
- package/apps/lib/components/LinkButton.tsx +0 -94
- package/apps/lib/components/LoginButton.tsx +0 -51
- package/apps/lib/components/PasswordLevel.tsx +0 -58
- package/apps/lib/components/Popover.tsx +0 -312
- package/apps/lib/components/ProfileMenu.tsx +0 -85
- package/apps/lib/components/Radio.tsx +0 -59
- package/apps/lib/components/RadioCard.tsx +0 -50
- package/apps/lib/components/ScrollArea.tsx +0 -54
- package/apps/lib/components/SearchField.tsx +0 -62
- package/apps/lib/components/SearchableSelect.tsx +0 -318
- package/apps/lib/components/SearchableTable.tsx +0 -344
- package/apps/lib/components/SearchableTree.tsx +0 -485
- package/apps/lib/components/SearchableTreeDialog.tsx +0 -502
- package/apps/lib/components/SectionBlock.tsx +0 -168
- package/apps/lib/components/Select.tsx +0 -347
- package/apps/lib/components/SimpleSelect.tsx +0 -225
- package/apps/lib/components/Skeleton.tsx +0 -12
- package/apps/lib/components/SlideDatePicker.tsx +0 -255
- package/apps/lib/components/SpinLoading.tsx +0 -174
- package/apps/lib/components/Stepper.tsx +0 -480
- package/apps/lib/components/Switch.tsx +0 -82
- package/apps/lib/components/TabFormItem.tsx +0 -153
- package/apps/lib/components/TabSwitch.tsx +0 -172
- package/apps/lib/components/Table.tsx +0 -597
- package/apps/lib/components/TextEditor/ChartBlockTool.ts +0 -676
- package/apps/lib/components/TextEditor/RichTextField.tsx +0 -46
- package/apps/lib/components/TextEditor/TableDnDWrapper.ts +0 -462
- package/apps/lib/components/TextEditor/TextEditor.tsx +0 -1164
- package/apps/lib/components/TextEditor/TextEditorToolbar.tsx +0 -429
- package/apps/lib/components/TextEditor/editor-tools/AlignmentTune.ts +0 -70
- package/apps/lib/components/TextEditor/editor-tools/ColorInlineTool.ts +0 -50
- package/apps/lib/components/TextEditor/editor-tools/StrikethroughInlineTool.ts +0 -48
- package/apps/lib/components/TextEditor/editor-tools/inlineFormat.ts +0 -98
- package/apps/lib/components/TextEditor/editorjs.d.ts +0 -60
- package/apps/lib/components/TextEditor/index.ts +0 -7
- package/apps/lib/components/TextEditor/markdownParser.ts +0 -346
- package/apps/lib/components/Textarea.tsx +0 -117
- package/apps/lib/components/Timeline.tsx +0 -263
- package/apps/lib/components/Toast.tsx +0 -87
- package/apps/lib/components/Toggle.tsx +0 -125
- package/apps/lib/components/ToggleButton.tsx +0 -140
- package/apps/lib/components/Tooltip.tsx +0 -116
- package/apps/lib/components/TransparentLabel.tsx +0 -71
- package/apps/lib/components/TreeDropDown.tsx +0 -115
- package/apps/lib/components/TreeFolder/TreeFolder.tsx +0 -380
- package/apps/lib/components/TreeFolder/TreeFolderBreadcrumb.tsx +0 -75
- package/apps/lib/components/TreeFolder/TreeFolderRow.tsx +0 -354
- package/apps/lib/components/TreeFolder/TreeFolderStyles.tsx +0 -60
- package/apps/lib/components/TreeFolder/icons.tsx +0 -60
- package/apps/lib/components/TreeFolder/index.ts +0 -24
- package/apps/lib/components/TreeFolder/treeFolderUtils.ts +0 -109
- package/apps/lib/components/TreeFolder/types.ts +0 -77
- package/apps/lib/components/TreeFolder/useTreeFolderDnD.ts +0 -118
- package/apps/lib/hooks/useActiveTreeItem.ts +0 -61
- package/apps/lib/hooks/useClickOutside.ts +0 -27
- package/apps/lib/hooks/useDragDrop.tsx +0 -365
- package/apps/lib/hooks/useHtmlDir.ts +0 -31
- package/apps/lib/hooks/useInfiniteScroll.ts +0 -108
- package/apps/lib/hooks/useIsMobile.ts +0 -21
- package/apps/lib/hooks/useResize.ts +0 -67
- package/apps/lib/hooks/useTagSelection.ts +0 -300
- package/apps/lib/layouts/CNLayout.tsx +0 -372
- package/apps/lib/layouts/DataViewCard.tsx +0 -62
- package/apps/lib/layouts/FieldSection.tsx +0 -91
- package/apps/lib/layouts/TreeSubLayout.tsx +0 -173
- package/apps/lib/providers/ThemeProvider.tsx +0 -84
- package/apps/lib/registry.json +0 -1217
- package/apps/lib/tsconfig.json +0 -9
- package/apps/lib/tsconfig.tsbuildinfo +0 -1
- package/apps/lib/utils/cn.ts +0 -6
- package/apps/lib/utils/color.ts +0 -175
- package/apps/lib/utils/dataViews/path.ts +0 -67
- package/apps/lib/utils/dataViews/query.ts +0 -73
- package/apps/lib/utils/dataViews/types.ts +0 -187
- package/apps/lib/utils/dateFormat.ts +0 -108
- package/apps/lib/utils/resize.ts +0 -31
- package/apps/lib/utils/scroller.ts +0 -26
- package/apps/lib/utils/types.ts +0 -16
- package/docs/BLOCKS.md +0 -129
- package/docs/CHANGELOG-1.1.16.md +0 -108
- package/docs/Cover.png +0 -0
- package/docs/README.md +0 -215
- package/docs/components/action-button.md +0 -638
- package/docs/components/actions-group.md +0 -708
- package/docs/components/alert-dialog.md +0 -920
- package/docs/components/avatar.md +0 -709
- package/docs/components/badge-field.md +0 -738
- package/docs/components/badge.md +0 -301
- package/docs/components/breadcrumb.md +0 -930
- package/docs/components/button-group.md +0 -650
- package/docs/components/button.md +0 -639
- package/docs/components/calendar.md +0 -555
- package/docs/components/card.md +0 -622
- package/docs/components/chart-block-tool.md +0 -129
- package/docs/components/checkbox.md +0 -699
- package/docs/components/cn-layout.md +0 -854
- package/docs/components/color-picker.md +0 -101
- package/docs/components/conclusion-header.md +0 -80
- package/docs/components/context-menu.md +0 -483
- package/docs/components/count-badge.md +0 -560
- package/docs/components/data-table.md +0 -854
- package/docs/components/data-views/backend-response.md +0 -324
- package/docs/components/data-views/examples/a11y-rtl.md +0 -250
- package/docs/components/data-views/examples/api-orders-route.md +0 -130
- package/docs/components/data-views/examples/fields.md +0 -362
- package/docs/components/data-views/examples/filters.md +0 -307
- package/docs/components/data-views/examples/inbox-routing.md +0 -218
- package/docs/components/data-views/examples/index.md +0 -29
- package/docs/components/data-views/examples/overview.md +0 -244
- package/docs/components/data-views/examples/panel.md +0 -212
- package/docs/components/data-views/examples/scale.md +0 -231
- package/docs/components/data-views/examples/server-side.md +0 -210
- package/docs/components/data-views/examples/state.md +0 -250
- package/docs/components/data-views/examples/tree-custom.md +0 -388
- package/docs/components/data-views/examples/view-registry.md +0 -313
- package/docs/components/data-views/examples/views.md +0 -534
- package/docs/components/data-views/guide.md +0 -405
- package/docs/components/data-views/index.md +0 -1521
- package/docs/components/data-views/migration.md +0 -81
- package/docs/components/date-picker.md +0 -857
- package/docs/components/dialog.md +0 -929
- package/docs/components/divider.md +0 -766
- package/docs/components/drawer.md +0 -654
- package/docs/components/dropdown-menu.md +0 -668
- package/docs/components/field-hint.md +0 -898
- package/docs/components/field-section.md +0 -781
- package/docs/components/form-builder.md +0 -284
- package/docs/components/form-renderer.md +0 -396
- package/docs/components/form-summary.md +0 -138
- package/docs/components/form.md +0 -785
- package/docs/components/header-bar.md +0 -188
- package/docs/components/image-attachment.md +0 -906
- package/docs/components/inner-label-field.md +0 -819
- package/docs/components/input-field.md +0 -623
- package/docs/components/input-otp.md +0 -756
- package/docs/components/input.md +0 -634
- package/docs/components/label-field.md +0 -770
- package/docs/components/label.md +0 -761
- package/docs/components/labeled-check-box.md +0 -642
- package/docs/components/labeled-radio.md +0 -796
- package/docs/components/link-button.md +0 -685
- package/docs/components/login-button.md +0 -872
- package/docs/components/password-level.md +0 -803
- package/docs/components/popover.md +0 -649
- package/docs/components/profile-menu.md +0 -656
- package/docs/components/radio-card.md +0 -801
- package/docs/components/radio.md +0 -735
- package/docs/components/scroll-area.md +0 -691
- package/docs/components/search-field.md +0 -702
- package/docs/components/searchable-select.md +0 -368
- package/docs/components/searchable-table.md +0 -438
- package/docs/components/searchable-tree-dialog.md +0 -190
- package/docs/components/searchable-tree.md +0 -200
- package/docs/components/section-block.md +0 -483
- package/docs/components/select.md +0 -709
- package/docs/components/simple-select.md +0 -741
- package/docs/components/skeleton.md +0 -706
- package/docs/components/slide-date-picker.md +0 -837
- package/docs/components/spin-loading.md +0 -696
- package/docs/components/stepper.md +0 -316
- package/docs/components/switch.md +0 -770
- package/docs/components/tab-form-item.md +0 -773
- package/docs/components/tab-switch.md +0 -170
- package/docs/components/table-dnd-wrapper.md +0 -107
- package/docs/components/table.md +0 -1088
- package/docs/components/text-editor.md +0 -735
- package/docs/components/textarea.md +0 -681
- package/docs/components/timeline.md +0 -254
- package/docs/components/toast.md +0 -773
- package/docs/components/toggle-button.md +0 -643
- package/docs/components/toggle.md +0 -882
- package/docs/components/tooltip.md +0 -513
- package/docs/components/transparent-label.md +0 -721
- package/docs/components/tree-drop-down.md +0 -740
- package/docs/components/tree-folder.md +0 -110
- package/docs/components/tree-sub-layout.md +0 -707
- package/docs/explanation/architecture.md +0 -54
- package/docs/explanation/design-system.md +0 -52
- package/docs/how-to/form-and-list-recipes.md +0 -386
- package/docs/how-to/forms-with-form-builder.md +0 -472
- package/docs/how-to/guides.md +0 -1027
- package/docs/migration/changelog.md +0 -60
- package/docs/migration/form-builder-2.5.2.md +0 -113
- package/docs/reference/cli.md +0 -112
- package/docs/reference/components.md +0 -572
- package/docs/reference/hooks.md +0 -1523
- package/docs/reference/providers.md +0 -866
- package/docs/reference/tailwind-plugins.md +0 -942
- package/docs/reference/theme.md +0 -85
- package/docs/reference/types.md +0 -1016
- package/docs/reference/utilities.md +0 -726
- package/docs/tutorials/building-first-form.md +0 -846
- package/docs/tutorials/component-composition.md +0 -882
- package/docs/tutorials/getting-started.md +0 -302
- package/docs/tutorials/theming-basics.md +0 -785
|
@@ -1,623 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: InputField
|
|
3
|
-
version: 2.4.5
|
|
4
|
-
status: stable
|
|
5
|
-
category: components/forms
|
|
6
|
-
tags: [form, input, field, popover, tooltip, compound, accessible]
|
|
7
|
-
last-reviewed: 2024-11-05
|
|
8
|
-
bundle-size: 3.1kb
|
|
9
|
-
dependencies:
|
|
10
|
-
- "@/components/Input": "internal"
|
|
11
|
-
- "@/components/Tooltip": "internal"
|
|
12
|
-
- "@/components/Popover": "internal"
|
|
13
|
-
- "@/components/ActionButton": "internal"
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
# InputField
|
|
17
|
-
|
|
18
|
-
> An enhanced input component that combines Input with integrated popover dropdowns, error styling, icons, and trailing actions. Perfect for complex form fields requiring additional UI elements.
|
|
19
|
-
|
|
20
|
-
## Installation
|
|
21
|
-
|
|
22
|
-
TORCH Glare is a copy-in library: the CLI copies this component's source into your project
|
|
23
|
-
(you do **not** install it from the npm package). Run `init` once, then `add`:
|
|
24
|
-
|
|
25
|
-
```bash
|
|
26
|
-
npx torch-glare@latest init
|
|
27
|
-
npx torch-glare@latest add InputField
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
`add` also copies any components, hooks, and utilities that `InputField` depends on.
|
|
31
|
-
|
|
32
|
-
## Import
|
|
33
|
-
|
|
34
|
-
Import from your project's local path — the alias configured in `glare.json` (e.g. `@/*`):
|
|
35
|
-
|
|
36
|
-
```tsx
|
|
37
|
-
import { InputField } from "@/components/InputField";
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
## Quick Examples
|
|
41
|
-
|
|
42
|
-
### Basic Usage
|
|
43
|
-
|
|
44
|
-
```typescript
|
|
45
|
-
import { InputField } from '@/components/InputField'
|
|
46
|
-
|
|
47
|
-
function Example() {
|
|
48
|
-
const [value, setValue] = useState('')
|
|
49
|
-
|
|
50
|
-
return (
|
|
51
|
-
<InputField
|
|
52
|
-
value={value}
|
|
53
|
-
onChange={(e) => setValue(e.target.value)}
|
|
54
|
-
placeholder="Enter text..."
|
|
55
|
-
/>
|
|
56
|
-
)
|
|
57
|
-
}
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
### With Icon
|
|
61
|
-
|
|
62
|
-
```typescript
|
|
63
|
-
import { SearchIcon } from '@heroicons/react/24/outline'
|
|
64
|
-
|
|
65
|
-
function SearchField() {
|
|
66
|
-
return (
|
|
67
|
-
<InputField
|
|
68
|
-
icon={<SearchIcon className="w-5 h-5" />}
|
|
69
|
-
placeholder="Search..."
|
|
70
|
-
/>
|
|
71
|
-
)
|
|
72
|
-
}
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
### With Error Message
|
|
76
|
-
|
|
77
|
-
```typescript
|
|
78
|
-
function ValidatedField() {
|
|
79
|
-
const [value, setValue] = useState('')
|
|
80
|
-
const [error, setError] = useState<string>()
|
|
81
|
-
|
|
82
|
-
const validate = (val: string) => {
|
|
83
|
-
if (!val) {
|
|
84
|
-
setError('This field is required')
|
|
85
|
-
} else if (val.length < 3) {
|
|
86
|
-
setError('Minimum 3 characters')
|
|
87
|
-
} else {
|
|
88
|
-
setError(undefined)
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
return (
|
|
93
|
-
<InputField
|
|
94
|
-
value={value}
|
|
95
|
-
onChange={(e) => {
|
|
96
|
-
setValue(e.target.value)
|
|
97
|
-
validate(e.target.value)
|
|
98
|
-
}}
|
|
99
|
-
errorMessage={error}
|
|
100
|
-
toolTipSide="top"
|
|
101
|
-
placeholder="Enter username..."
|
|
102
|
-
/>
|
|
103
|
-
)
|
|
104
|
-
}
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
### With Popover Dropdown
|
|
108
|
-
|
|
109
|
-
```typescript
|
|
110
|
-
function AutocompleteField() {
|
|
111
|
-
const [value, setValue] = useState('')
|
|
112
|
-
const [suggestions] = useState(['Apple', 'Banana', 'Cherry', 'Date'])
|
|
113
|
-
|
|
114
|
-
const filtered = suggestions.filter(s =>
|
|
115
|
-
s.toLowerCase().includes(value.toLowerCase())
|
|
116
|
-
)
|
|
117
|
-
|
|
118
|
-
return (
|
|
119
|
-
<InputField
|
|
120
|
-
value={value}
|
|
121
|
-
onChange={(e) => setValue(e.target.value)}
|
|
122
|
-
placeholder="Select fruit..."
|
|
123
|
-
popoverChildren={
|
|
124
|
-
<div className="py-2">
|
|
125
|
-
{filtered.map((item) => (
|
|
126
|
-
<button
|
|
127
|
-
key={item}
|
|
128
|
-
className="w-full px-3 py-2 text-left hover:bg-gray-100"
|
|
129
|
-
onClick={() => setValue(item)}
|
|
130
|
-
>
|
|
131
|
-
{item}
|
|
132
|
-
</button>
|
|
133
|
-
))}
|
|
134
|
-
</div>
|
|
135
|
-
}
|
|
136
|
-
/>
|
|
137
|
-
)
|
|
138
|
-
}
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
### With Trailing Actions
|
|
142
|
-
|
|
143
|
-
```typescript
|
|
144
|
-
import { Button } from '@/components/Button'
|
|
145
|
-
|
|
146
|
-
function PasswordField() {
|
|
147
|
-
const [showPassword, setShowPassword] = useState(false)
|
|
148
|
-
const [value, setValue] = useState('')
|
|
149
|
-
|
|
150
|
-
return (
|
|
151
|
-
<InputField
|
|
152
|
-
type={showPassword ? 'text' : 'password'}
|
|
153
|
-
value={value}
|
|
154
|
-
onChange={(e) => setValue(e.target.value)}
|
|
155
|
-
placeholder="Enter password..."
|
|
156
|
-
childrenSide={
|
|
157
|
-
<button
|
|
158
|
-
onClick={() => setShowPassword(!showPassword)}
|
|
159
|
-
className="p-1"
|
|
160
|
-
>
|
|
161
|
-
{showPassword ? '🙈' : '👁️'}
|
|
162
|
-
</button>
|
|
163
|
-
}
|
|
164
|
-
/>
|
|
165
|
-
)
|
|
166
|
-
}
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
### Different Sizes and Variants
|
|
170
|
-
|
|
171
|
-
```typescript
|
|
172
|
-
// Small size with system style
|
|
173
|
-
<InputField
|
|
174
|
-
size="S"
|
|
175
|
-
variant="SystemStyle"
|
|
176
|
-
placeholder="Small system input"
|
|
177
|
-
/>
|
|
178
|
-
|
|
179
|
-
// Medium size with presentation style (default)
|
|
180
|
-
<InputField
|
|
181
|
-
size="M"
|
|
182
|
-
variant="PresentationStyle"
|
|
183
|
-
placeholder="Medium presentation input"
|
|
184
|
-
/>
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
### Table Context
|
|
188
|
-
|
|
189
|
-
```typescript
|
|
190
|
-
// Optimized for table usage
|
|
191
|
-
<InputField
|
|
192
|
-
onTable={true}
|
|
193
|
-
placeholder="Table input..."
|
|
194
|
-
size="S"
|
|
195
|
-
/>
|
|
196
|
-
```
|
|
197
|
-
|
|
198
|
-
## API Reference
|
|
199
|
-
|
|
200
|
-
### InputField Props
|
|
201
|
-
|
|
202
|
-
| Prop | Type | Default | Description |
|
|
203
|
-
|------|------|---------|-------------|
|
|
204
|
-
| `size` | `'S' \| 'M'` | `'M'` | Size of the input field |
|
|
205
|
-
| `variant` | `'SystemStyle' \| 'PresentationStyle'` | `'PresentationStyle'` | Visual style variant |
|
|
206
|
-
| `icon` | `ReactNode` | - | Icon to display on the left side |
|
|
207
|
-
| `childrenSide` | `ReactNode` | - | Content to display on the right side |
|
|
208
|
-
| `popoverChildren` | `ReactNode` | - | Content for the dropdown popover |
|
|
209
|
-
| `errorMessage` | `string` | - | Marks the field invalid — any non-undefined value turns on the negative border |
|
|
210
|
-
| `onTable` | `boolean` | `false` | Optimized styling for table context |
|
|
211
|
-
| `toolTipSide` | `'top' \| 'right' \| 'bottom' \| 'left'` | - | **Deprecated, ignored.** The error tooltip was removed; an invalid field is shown by its border alone |
|
|
212
|
-
| `theme` | `'dark' \| 'light' \| 'default'` | - | Theme variant |
|
|
213
|
-
| `className` | `string` | - | Additional CSS classes |
|
|
214
|
-
| `disabled` | `boolean` | `false` | Disables the input |
|
|
215
|
-
| `placeholder` | `string` | - | Placeholder text |
|
|
216
|
-
| `value` | `string \| number` | - | Input value |
|
|
217
|
-
| `onChange` | `(e: ChangeEvent) => void` | - | Change event handler |
|
|
218
|
-
|
|
219
|
-
Plus all standard HTML input attributes.
|
|
220
|
-
|
|
221
|
-
### TypeScript
|
|
222
|
-
|
|
223
|
-
```typescript
|
|
224
|
-
interface InputFieldProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'variant'> {
|
|
225
|
-
size?: 'S' | 'M'
|
|
226
|
-
variant?: 'SystemStyle' | 'PresentationStyle'
|
|
227
|
-
icon?: ReactNode
|
|
228
|
-
childrenSide?: ReactNode
|
|
229
|
-
popoverChildren?: ReactNode
|
|
230
|
-
errorMessage?: string
|
|
231
|
-
onTable?: boolean
|
|
232
|
-
toolTipSide?: 'top' | 'right' | 'bottom' | 'left'
|
|
233
|
-
theme?: 'dark' | 'light' | 'default'
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
export const InputField: React.ForwardRefExoticComponent<InputFieldProps>
|
|
237
|
-
```
|
|
238
|
-
|
|
239
|
-
## Common Patterns
|
|
240
|
-
|
|
241
|
-
### Search with Suggestions
|
|
242
|
-
|
|
243
|
-
```typescript
|
|
244
|
-
function SearchWithSuggestions() {
|
|
245
|
-
const [query, setQuery] = useState('')
|
|
246
|
-
const [results, setResults] = useState<string[]>([])
|
|
247
|
-
const [loading, setLoading] = useState(false)
|
|
248
|
-
|
|
249
|
-
useEffect(() => {
|
|
250
|
-
if (!query) {
|
|
251
|
-
setResults([])
|
|
252
|
-
return
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
setLoading(true)
|
|
256
|
-
// Simulate API call
|
|
257
|
-
const timer = setTimeout(() => {
|
|
258
|
-
setResults([
|
|
259
|
-
`${query} result 1`,
|
|
260
|
-
`${query} result 2`,
|
|
261
|
-
`${query} result 3`,
|
|
262
|
-
])
|
|
263
|
-
setLoading(false)
|
|
264
|
-
}, 300)
|
|
265
|
-
|
|
266
|
-
return () => clearTimeout(timer)
|
|
267
|
-
}, [query])
|
|
268
|
-
|
|
269
|
-
return (
|
|
270
|
-
<InputField
|
|
271
|
-
icon={<SearchIcon className="w-5 h-5" />}
|
|
272
|
-
value={query}
|
|
273
|
-
onChange={(e) => setQuery(e.target.value)}
|
|
274
|
-
placeholder="Search..."
|
|
275
|
-
popoverChildren={
|
|
276
|
-
loading ? (
|
|
277
|
-
<div className="p-3">Loading...</div>
|
|
278
|
-
) : results.length > 0 ? (
|
|
279
|
-
<div>
|
|
280
|
-
{results.map((result, i) => (
|
|
281
|
-
<button
|
|
282
|
-
key={i}
|
|
283
|
-
className="w-full px-3 py-2 text-left hover:bg-gray-100"
|
|
284
|
-
onClick={() => setQuery(result)}
|
|
285
|
-
>
|
|
286
|
-
{result}
|
|
287
|
-
</button>
|
|
288
|
-
))}
|
|
289
|
-
</div>
|
|
290
|
-
) : null
|
|
291
|
-
}
|
|
292
|
-
/>
|
|
293
|
-
)
|
|
294
|
-
}
|
|
295
|
-
```
|
|
296
|
-
|
|
297
|
-
### Email Validation
|
|
298
|
-
|
|
299
|
-
```typescript
|
|
300
|
-
function EmailField() {
|
|
301
|
-
const [email, setEmail] = useState('')
|
|
302
|
-
const [error, setError] = useState<string>()
|
|
303
|
-
|
|
304
|
-
const validateEmail = (value: string) => {
|
|
305
|
-
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
|
|
306
|
-
if (!value) {
|
|
307
|
-
setError('Email is required')
|
|
308
|
-
} else if (!emailRegex.test(value)) {
|
|
309
|
-
setError('Invalid email format')
|
|
310
|
-
} else {
|
|
311
|
-
setError(undefined)
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
return (
|
|
316
|
-
<InputField
|
|
317
|
-
type="email"
|
|
318
|
-
icon={<MailIcon className="w-5 h-5" />}
|
|
319
|
-
value={email}
|
|
320
|
-
onChange={(e) => {
|
|
321
|
-
setEmail(e.target.value)
|
|
322
|
-
validateEmail(e.target.value)
|
|
323
|
-
}}
|
|
324
|
-
onBlur={() => validateEmail(email)}
|
|
325
|
-
errorMessage={error}
|
|
326
|
-
placeholder="email@example.com"
|
|
327
|
-
/>
|
|
328
|
-
)
|
|
329
|
-
}
|
|
330
|
-
```
|
|
331
|
-
|
|
332
|
-
### Date Input with Calendar
|
|
333
|
-
|
|
334
|
-
```typescript
|
|
335
|
-
import { Calendar } from '@/components/Calendar'
|
|
336
|
-
|
|
337
|
-
function DateField() {
|
|
338
|
-
const [date, setDate] = useState('')
|
|
339
|
-
const [showCalendar, setShowCalendar] = useState(false)
|
|
340
|
-
|
|
341
|
-
return (
|
|
342
|
-
<InputField
|
|
343
|
-
icon={<CalendarIcon className="w-5 h-5" />}
|
|
344
|
-
value={date}
|
|
345
|
-
onChange={(e) => setDate(e.target.value)}
|
|
346
|
-
placeholder="Select date..."
|
|
347
|
-
childrenSide={
|
|
348
|
-
<button onClick={() => setShowCalendar(!showCalendar)}>
|
|
349
|
-
📅
|
|
350
|
-
</button>
|
|
351
|
-
}
|
|
352
|
-
popoverChildren={
|
|
353
|
-
showCalendar && (
|
|
354
|
-
<Calendar
|
|
355
|
-
onSelect={(date) => {
|
|
356
|
-
setDate(date.toISOString().split('T')[0])
|
|
357
|
-
setShowCalendar(false)
|
|
358
|
-
}}
|
|
359
|
-
/>
|
|
360
|
-
)
|
|
361
|
-
}
|
|
362
|
-
/>
|
|
363
|
-
)
|
|
364
|
-
}
|
|
365
|
-
```
|
|
366
|
-
|
|
367
|
-
## Testing
|
|
368
|
-
|
|
369
|
-
### Unit Test Example
|
|
370
|
-
|
|
371
|
-
```typescript
|
|
372
|
-
import { render, screen, fireEvent } from '@testing-library/react'
|
|
373
|
-
import { InputField } from '@/components/InputField'
|
|
374
|
-
|
|
375
|
-
describe('InputField', () => {
|
|
376
|
-
it('displays error message in tooltip', () => {
|
|
377
|
-
const { rerender } = render(
|
|
378
|
-
<InputField
|
|
379
|
-
placeholder="Test input"
|
|
380
|
-
errorMessage="Error message"
|
|
381
|
-
/>
|
|
382
|
-
)
|
|
383
|
-
|
|
384
|
-
expect(screen.getByText('Error message')).toBeInTheDocument()
|
|
385
|
-
})
|
|
386
|
-
|
|
387
|
-
it('shows popover content on focus', async () => {
|
|
388
|
-
render(
|
|
389
|
-
<InputField
|
|
390
|
-
placeholder="Test"
|
|
391
|
-
popoverChildren={<div>Dropdown content</div>}
|
|
392
|
-
/>
|
|
393
|
-
)
|
|
394
|
-
|
|
395
|
-
const input = screen.getByPlaceholderText('Test')
|
|
396
|
-
fireEvent.focus(input)
|
|
397
|
-
|
|
398
|
-
expect(await screen.findByText('Dropdown content')).toBeInTheDocument()
|
|
399
|
-
})
|
|
400
|
-
|
|
401
|
-
it('renders icon and trailing content', () => {
|
|
402
|
-
render(
|
|
403
|
-
<InputField
|
|
404
|
-
icon={<span>Icon</span>}
|
|
405
|
-
childrenSide={<span>Action</span>}
|
|
406
|
-
/>
|
|
407
|
-
)
|
|
408
|
-
|
|
409
|
-
expect(screen.getByText('Icon')).toBeInTheDocument()
|
|
410
|
-
expect(screen.getByText('Action')).toBeInTheDocument()
|
|
411
|
-
})
|
|
412
|
-
})
|
|
413
|
-
```
|
|
414
|
-
|
|
415
|
-
### Accessibility Test
|
|
416
|
-
|
|
417
|
-
```typescript
|
|
418
|
-
import { axe } from '@axe-core/react'
|
|
419
|
-
|
|
420
|
-
test('InputField meets WCAG standards', async () => {
|
|
421
|
-
const { container } = render(
|
|
422
|
-
<div>
|
|
423
|
-
<label htmlFor="test-input">Label</label>
|
|
424
|
-
<InputField
|
|
425
|
-
id="test-input"
|
|
426
|
-
placeholder="Enter value..."
|
|
427
|
-
errorMessage="Error"
|
|
428
|
-
/>
|
|
429
|
-
</div>
|
|
430
|
-
)
|
|
431
|
-
|
|
432
|
-
const results = await axe(container)
|
|
433
|
-
expect(results).toHaveNoViolations()
|
|
434
|
-
})
|
|
435
|
-
```
|
|
436
|
-
|
|
437
|
-
## Known Limitations & Frontend Patterns
|
|
438
|
-
|
|
439
|
-
### Form-row alignment (h-10)
|
|
440
|
-
|
|
441
|
-
When mixing `InputField` with `Select`, `<input type="date">`, or other form controls in a multi-column row, default heights don't always match. The shipped pattern that keeps everything on a 40 px baseline:
|
|
442
|
-
|
|
443
|
-
```tsx
|
|
444
|
-
<InputField
|
|
445
|
-
className="h-10"
|
|
446
|
-
icon={<i className="ri-hashtag text-base" />}
|
|
447
|
-
placeholder="e.g. JV-001"
|
|
448
|
-
errorMessage={errors.code?.message}
|
|
449
|
-
toolTipSide="top"
|
|
450
|
-
{...register("code")}
|
|
451
|
-
/>
|
|
452
|
-
```
|
|
453
|
-
|
|
454
|
-
Recommendations:
|
|
455
|
-
|
|
456
|
-
- Pass `className="h-10"` on every form-context `InputField`. Pair with `Select` set to `className="w-full h-10"` so the row aligns.
|
|
457
|
-
- Use `errorMessage` + `toolTipSide` instead of rendering a separate `<p>` below the field — the built-in tooltip is less visually noisy and is what the component is designed for.
|
|
458
|
-
- Add an `icon` prop (`<i className="ri-* text-base" />`) for visual scannability; this is standard across most form fields in production apps.
|
|
459
|
-
|
|
460
|
-
> ⚠️ **Do not use `variant="SystemStyle"`** to "fix" the form look — `SystemStyle` is reserved for internal library system surfaces. Use the default `PresentationStyle` plus `className="h-10"`. See the rules banner at the top of every doc response.
|
|
461
|
-
|
|
462
|
-
### Field wrapper for forms
|
|
463
|
-
|
|
464
|
-
Wrap each labeled field in `flex flex-col gap-1.5` (not `space-y-1.5`) so labels align cleanly at the top of multi-column rows:
|
|
465
|
-
|
|
466
|
-
```tsx
|
|
467
|
-
<div className="flex flex-col gap-1.5">
|
|
468
|
-
<Label>Voucher Number *</Label>
|
|
469
|
-
<InputField className="h-10" icon={...} {...register("number")} />
|
|
470
|
-
</div>
|
|
471
|
-
```
|
|
472
|
-
|
|
473
|
-
## Accessibility
|
|
474
|
-
|
|
475
|
-
### Keyboard Support
|
|
476
|
-
|
|
477
|
-
- **Tab**: Move focus to/from input
|
|
478
|
-
- **Escape**: Close popover when open
|
|
479
|
-
- **Arrow Down**: Open popover (when configured)
|
|
480
|
-
- **Enter**: Select popover item
|
|
481
|
-
|
|
482
|
-
### ARIA Attributes
|
|
483
|
-
|
|
484
|
-
```typescript
|
|
485
|
-
// With error
|
|
486
|
-
<InputField
|
|
487
|
-
aria-invalid={!!error}
|
|
488
|
-
aria-describedby={error ? "error-msg" : undefined}
|
|
489
|
-
errorMessage={error}
|
|
490
|
-
/>
|
|
491
|
-
|
|
492
|
-
// With popover
|
|
493
|
-
<InputField
|
|
494
|
-
aria-expanded={popoverOpen}
|
|
495
|
-
aria-haspopup="listbox"
|
|
496
|
-
aria-controls="suggestions"
|
|
497
|
-
/>
|
|
498
|
-
```
|
|
499
|
-
|
|
500
|
-
### Screen Reader Support
|
|
501
|
-
|
|
502
|
-
- Announces error messages via tooltip
|
|
503
|
-
- Popover state changes are announced
|
|
504
|
-
- Icon content should include aria-label
|
|
505
|
-
|
|
506
|
-
## Styling
|
|
507
|
-
|
|
508
|
-
### Custom Styles
|
|
509
|
-
|
|
510
|
-
```typescript
|
|
511
|
-
<InputField
|
|
512
|
-
className="custom-input"
|
|
513
|
-
size="M"
|
|
514
|
-
theme="dark"
|
|
515
|
-
/>
|
|
516
|
-
```
|
|
517
|
-
|
|
518
|
-
### CSS Variables
|
|
519
|
-
|
|
520
|
-
```css
|
|
521
|
-
[data-theme="custom"] {
|
|
522
|
-
--input-field-bg: #your-background;
|
|
523
|
-
--input-field-border: #your-border;
|
|
524
|
-
--input-field-hover: #your-hover;
|
|
525
|
-
--input-field-focus: #your-focus;
|
|
526
|
-
}
|
|
527
|
-
```
|
|
528
|
-
|
|
529
|
-
## Performance
|
|
530
|
-
|
|
531
|
-
| Metric | Value |
|
|
532
|
-
|--------|-------|
|
|
533
|
-
| Bundle size (gzip) | 3.1kb |
|
|
534
|
-
| First render | <10ms |
|
|
535
|
-
| Re-render | <3ms |
|
|
536
|
-
| Popover open | <5ms |
|
|
537
|
-
| Tree-shakeable | ✅ |
|
|
538
|
-
|
|
539
|
-
### Optimization Tips
|
|
540
|
-
|
|
541
|
-
1. Memoize popover content for complex dropdowns
|
|
542
|
-
2. Debounce onChange for API calls
|
|
543
|
-
3. Use virtualization for long suggestion lists
|
|
544
|
-
4. Lazy load calendar/date picker components
|
|
545
|
-
|
|
546
|
-
## Migration
|
|
547
|
-
|
|
548
|
-
### From Input Component
|
|
549
|
-
|
|
550
|
-
```diff
|
|
551
|
-
// Migrating from Input to InputField
|
|
552
|
-
- import { Input } from '@/components/Input'
|
|
553
|
-
+ import { InputField } from '@/components/InputField'
|
|
554
|
-
|
|
555
|
-
- <Input.Group error={!!error}>
|
|
556
|
-
- <Input.Icon>{icon}</Input.Icon>
|
|
557
|
-
- <Input {...props} />
|
|
558
|
-
- <Input.Trilling>{actions}</Input.Trilling>
|
|
559
|
-
- </Input.Group>
|
|
560
|
-
- {error && <span>{error}</span>}
|
|
561
|
-
+ <InputField
|
|
562
|
-
+ icon={icon}
|
|
563
|
-
+ childrenSide={actions}
|
|
564
|
-
+ errorMessage={error}
|
|
565
|
-
+ {...props}
|
|
566
|
-
+ />
|
|
567
|
-
```
|
|
568
|
-
|
|
569
|
-
## Troubleshooting
|
|
570
|
-
|
|
571
|
-
### Popover not showing
|
|
572
|
-
|
|
573
|
-
**Solution:** Check that popoverChildren is provided and not disabled
|
|
574
|
-
|
|
575
|
-
```typescript
|
|
576
|
-
// ❌ Wrong - popover won't show when disabled
|
|
577
|
-
<InputField disabled popoverChildren={<div>...</div>} />
|
|
578
|
-
|
|
579
|
-
// ✅ Correct
|
|
580
|
-
<InputField popoverChildren={<div>...</div>} />
|
|
581
|
-
```
|
|
582
|
-
|
|
583
|
-
### Error tooltip position
|
|
584
|
-
|
|
585
|
-
**Solution:** Set appropriate toolTipSide
|
|
586
|
-
|
|
587
|
-
```typescript
|
|
588
|
-
<InputField
|
|
589
|
-
errorMessage="Error"
|
|
590
|
-
toolTipSide="top" // or "right", "bottom", "left"
|
|
591
|
-
/>
|
|
592
|
-
```
|
|
593
|
-
|
|
594
|
-
## Related Components
|
|
595
|
-
|
|
596
|
-
- [Input](/docs/components/input.md) - Base input component
|
|
597
|
-
- [Select](/docs/components/select.md) - Dropdown selection
|
|
598
|
-
- [Textarea](/docs/components/textarea.md) - Multi-line input
|
|
599
|
-
- [SearchField](/docs/components/search-field.md) - Specialized search
|
|
600
|
-
- [Tooltip](/docs/components/tooltip.md) - Error message display
|
|
601
|
-
- [Popover](/docs/components/popover.md) - Dropdown container
|
|
602
|
-
|
|
603
|
-
## Browser Support
|
|
604
|
-
|
|
605
|
-
- Chrome 90+ ✅
|
|
606
|
-
- Firefox 88+ ✅
|
|
607
|
-
- Safari 14+ ✅
|
|
608
|
-
- Edge 90+ ✅
|
|
609
|
-
- Mobile browsers ✅
|
|
610
|
-
|
|
611
|
-
## Changelog
|
|
612
|
-
|
|
613
|
-
### v1.1.15
|
|
614
|
-
- Added popover integration
|
|
615
|
-
- Enhanced error tooltip support
|
|
616
|
-
- Improved TypeScript types
|
|
617
|
-
|
|
618
|
-
### v1.1.14
|
|
619
|
-
- Added table context optimization
|
|
620
|
-
- Fixed popover width calculation
|
|
621
|
-
|
|
622
|
-
### v1.1.0
|
|
623
|
-
- Initial stable release
|