torch-glare 2.5.5 → 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 -338
- package/apps/lib/components/Breadcrumb.tsx +0 -280
- package/apps/lib/components/Button.tsx +0 -317
- 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 -383
- 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 -84
- 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 -63
- package/apps/lib/components/DataViews/states.tsx +0 -38
- 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 -420
- package/apps/lib/components/DropdownMenu.tsx +0 -540
- package/apps/lib/components/FieldHint.tsx +0 -69
- package/apps/lib/components/Form.tsx +0 -182
- package/apps/lib/components/FormBuilder/context.ts +0 -73
- 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 -163
- 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 -91
- 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 -47
- package/apps/lib/components/FormBuilder/types.ts +0 -311
- package/apps/lib/components/FormRenderer/FormDrawer.tsx +0 -128
- package/apps/lib/components/FormRenderer/detail.tsx +0 -207
- package/apps/lib/components/FormRenderer/form-renderer.tsx +0 -297
- package/apps/lib/components/FormRenderer/header.tsx +0 -88
- package/apps/lib/components/FormRenderer/index.ts +0 -15
- package/apps/lib/components/FormRenderer/section.tsx +0 -39
- package/apps/lib/components/FormRenderer/stepper.tsx +0 -339
- package/apps/lib/components/FormRenderer/types.ts +0 -78
- 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 -147
- 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 -253
- 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 -610
- 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 -58
- package/apps/lib/hooks/useClickOutside.ts +0 -27
- package/apps/lib/hooks/useDragDrop.tsx +0 -365
- 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 -214
- 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 -1201
- 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/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 -712
- 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 -1495
- package/docs/components/data-views/migration.md +0 -79
- 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 -276
- package/docs/components/form-renderer.md +0 -326
- 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 -477
- 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 -54
- 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 -1500
- 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 -704
- 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,513 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Tooltip
|
|
3
|
-
description: Contextual tooltip component for displaying helpful information on hover or focus
|
|
4
|
-
group: Overlays & Dialogs
|
|
5
|
-
keywords: [tooltip, hint, popover, radix-ui, hover, help]
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Tooltip
|
|
9
|
-
|
|
10
|
-
> A contextual tooltip component that displays helpful information when users hover over or focus on an element. Features positioning control, delay customization, and optional arrow indicator.
|
|
11
|
-
|
|
12
|
-
## Installation
|
|
13
|
-
|
|
14
|
-
TORCH Glare is a copy-in library: the CLI copies this component's source into your project
|
|
15
|
-
(you do **not** install it from the npm package). Run `init` once, then `add`:
|
|
16
|
-
|
|
17
|
-
```bash
|
|
18
|
-
npx torch-glare@latest init
|
|
19
|
-
npx torch-glare@latest add Tooltip
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
`add` also copies any components, hooks, and utilities that `Tooltip` depends on.
|
|
23
|
-
|
|
24
|
-
## Import
|
|
25
|
-
|
|
26
|
-
Import from your project's local path — the alias configured in `glare.json` (e.g. `@/*`):
|
|
27
|
-
|
|
28
|
-
```tsx
|
|
29
|
-
import { Tooltip } from "@/components/Tooltip";
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
## Quick Examples
|
|
33
|
-
|
|
34
|
-
### Basic Usage
|
|
35
|
-
|
|
36
|
-
```typescript
|
|
37
|
-
import { Tooltip } from "@/components/Tooltip";
|
|
38
|
-
import { Button } from "@/components/Button";
|
|
39
|
-
|
|
40
|
-
function Example() {
|
|
41
|
-
return (
|
|
42
|
-
<Tooltip text="Click to save your changes">
|
|
43
|
-
<Button>Save</Button>
|
|
44
|
-
</Tooltip>
|
|
45
|
-
)
|
|
46
|
-
}
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
### Icon with Tooltip
|
|
50
|
-
|
|
51
|
-
```typescript
|
|
52
|
-
import { Tooltip } from "@/components/Tooltip";
|
|
53
|
-
import { ActionButton } from "@/components/ActionButton";
|
|
54
|
-
|
|
55
|
-
function IconTooltip() {
|
|
56
|
-
return (
|
|
57
|
-
<Tooltip text="Delete item">
|
|
58
|
-
<ActionButton size="XS">
|
|
59
|
-
<i className="ri-delete-bin-line" />
|
|
60
|
-
</ActionButton>
|
|
61
|
-
</Tooltip>
|
|
62
|
-
)
|
|
63
|
-
}
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
### Different Positions
|
|
67
|
-
|
|
68
|
-
```typescript
|
|
69
|
-
import { Tooltip } from "@/components/Tooltip";
|
|
70
|
-
|
|
71
|
-
function PositionedTooltips() {
|
|
72
|
-
return (
|
|
73
|
-
<div className="flex gap-4">
|
|
74
|
-
<Tooltip text="Top tooltip" toolTipSide="top">
|
|
75
|
-
<button>Top</button>
|
|
76
|
-
</Tooltip>
|
|
77
|
-
|
|
78
|
-
<Tooltip text="Right tooltip" toolTipSide="right">
|
|
79
|
-
<button>Right</button>
|
|
80
|
-
</Tooltip>
|
|
81
|
-
|
|
82
|
-
<Tooltip text="Bottom tooltip" toolTipSide="bottom">
|
|
83
|
-
<button>Bottom</button>
|
|
84
|
-
</Tooltip>
|
|
85
|
-
|
|
86
|
-
<Tooltip text="Left tooltip" toolTipSide="left">
|
|
87
|
-
<button>Left</button>
|
|
88
|
-
</Tooltip>
|
|
89
|
-
</div>
|
|
90
|
-
)
|
|
91
|
-
}
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
### Highlight Variant
|
|
95
|
-
|
|
96
|
-
```typescript
|
|
97
|
-
import { Tooltip } from "@/components/Tooltip";
|
|
98
|
-
|
|
99
|
-
function HighlightTooltip() {
|
|
100
|
-
return (
|
|
101
|
-
<Tooltip
|
|
102
|
-
text="This is important information!"
|
|
103
|
-
variant="highlight"
|
|
104
|
-
>
|
|
105
|
-
<button>Hover me</button>
|
|
106
|
-
</Tooltip>
|
|
107
|
-
)
|
|
108
|
-
}
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
### Without Arrow
|
|
112
|
-
|
|
113
|
-
```typescript
|
|
114
|
-
import { Tooltip } from "@/components/Tooltip";
|
|
115
|
-
|
|
116
|
-
function NoArrowTooltip() {
|
|
117
|
-
return (
|
|
118
|
-
<Tooltip text="No arrow tooltip" tip={false}>
|
|
119
|
-
<button>No Arrow</button>
|
|
120
|
-
</Tooltip>
|
|
121
|
-
)
|
|
122
|
-
}
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
### Custom Delay
|
|
126
|
-
|
|
127
|
-
```typescript
|
|
128
|
-
import { Tooltip } from "@/components/Tooltip";
|
|
129
|
-
|
|
130
|
-
function CustomDelayTooltip() {
|
|
131
|
-
return (
|
|
132
|
-
<Tooltip
|
|
133
|
-
text="This appears quickly"
|
|
134
|
-
delay={100} // Show after 100ms
|
|
135
|
-
>
|
|
136
|
-
<button>Quick Tooltip</button>
|
|
137
|
-
</Tooltip>
|
|
138
|
-
)
|
|
139
|
-
}
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
### Rich Content Tooltip
|
|
143
|
-
|
|
144
|
-
```typescript
|
|
145
|
-
import { Tooltip } from "@/components/Tooltip";
|
|
146
|
-
|
|
147
|
-
function RichTooltip() {
|
|
148
|
-
return (
|
|
149
|
-
<Tooltip
|
|
150
|
-
text={
|
|
151
|
-
<div className="space-y-1">
|
|
152
|
-
<p className="font-semibold">Keyboard Shortcut</p>
|
|
153
|
-
<p className="text-xs">Press Ctrl+S to save</p>
|
|
154
|
-
</div>
|
|
155
|
-
}
|
|
156
|
-
>
|
|
157
|
-
<button>Save</button>
|
|
158
|
-
</Tooltip>
|
|
159
|
-
)
|
|
160
|
-
}
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
### Controlled Tooltip
|
|
164
|
-
|
|
165
|
-
```typescript
|
|
166
|
-
import { Tooltip } from "@/components/Tooltip";
|
|
167
|
-
import { useState } from 'react'
|
|
168
|
-
|
|
169
|
-
function ControlledTooltip() {
|
|
170
|
-
const [open, setOpen] = useState(false)
|
|
171
|
-
|
|
172
|
-
return (
|
|
173
|
-
<>
|
|
174
|
-
<button onClick={() => setOpen(!open)}>Toggle Tooltip</button>
|
|
175
|
-
<Tooltip
|
|
176
|
-
text="Controlled tooltip"
|
|
177
|
-
open={open}
|
|
178
|
-
onOpenChange={setOpen}
|
|
179
|
-
>
|
|
180
|
-
<span>Target element</span>
|
|
181
|
-
</Tooltip>
|
|
182
|
-
</>
|
|
183
|
-
)
|
|
184
|
-
}
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
### Conditionally Suppressing a Tooltip
|
|
188
|
-
|
|
189
|
-
> **Note:** The `disabled` prop is accepted by the type but is **not implemented** — passing
|
|
190
|
-
> `disabled` has no effect and will not hide the tooltip. To conditionally suppress a tooltip,
|
|
191
|
-
> render the wrapped element with or without the `Tooltip` wrapper instead.
|
|
192
|
-
|
|
193
|
-
```typescript
|
|
194
|
-
import { Tooltip } from "@/components/Tooltip";
|
|
195
|
-
|
|
196
|
-
function MaybeTooltip({ disabled }: { disabled: boolean }) {
|
|
197
|
-
const button = <button>Hover me</button>
|
|
198
|
-
|
|
199
|
-
// Render without the Tooltip wrapper when you don't want a tooltip.
|
|
200
|
-
if (disabled) return button
|
|
201
|
-
|
|
202
|
-
return (
|
|
203
|
-
<Tooltip text="Helpful information">
|
|
204
|
-
{button}
|
|
205
|
-
</Tooltip>
|
|
206
|
-
)
|
|
207
|
-
}
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
### Form Field Tooltip
|
|
211
|
-
|
|
212
|
-
```typescript
|
|
213
|
-
import { Tooltip } from "@/components/Tooltip";
|
|
214
|
-
import { Input } from "@/components/Input";
|
|
215
|
-
|
|
216
|
-
function FormTooltip() {
|
|
217
|
-
return (
|
|
218
|
-
<div className="flex items-center gap-2">
|
|
219
|
-
<Input placeholder="Enter username" />
|
|
220
|
-
<Tooltip text="Username must be 3-20 characters, letters and numbers only">
|
|
221
|
-
<i className="ri-information-line text-gray-500 cursor-help" />
|
|
222
|
-
</Tooltip>
|
|
223
|
-
</div>
|
|
224
|
-
)
|
|
225
|
-
}
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
## API Reference
|
|
229
|
-
|
|
230
|
-
### Tooltip Props
|
|
231
|
-
|
|
232
|
-
| Prop | Type | Default | Description |
|
|
233
|
-
|------|------|---------|-------------|
|
|
234
|
-
| `text` | `ReactNode` | Required | Tooltip content |
|
|
235
|
-
| `children` | `ReactNode` | Required | Element to attach tooltip to |
|
|
236
|
-
| `variant` | `'primary' \| 'highlight'` | `'primary'` | Visual style variant |
|
|
237
|
-
| `toolTipSide` | `'top' \| 'right' \| 'bottom' \| 'left'` | - | Preferred side to display |
|
|
238
|
-
| `contentAlign` | `'start' \| 'center' \| 'end'` | `'center'` | Alignment relative to trigger |
|
|
239
|
-
| `delay` | `number` | `400` | Delay before showing (ms) |
|
|
240
|
-
| `tip` | `boolean` | `true` | Show arrow indicator |
|
|
241
|
-
| `open` | `boolean` | - | Controlled open state |
|
|
242
|
-
| `onOpenChange` | `(open: boolean) => void` | - | Callback when state changes |
|
|
243
|
-
| `disabled` | `boolean` | `false` | **Not supported.** Accepted by the type but has no effect — the current implementation does not disable the tooltip. To conditionally suppress a tooltip, render it conditionally instead. |
|
|
244
|
-
| `avoidCollisions` | `boolean` | `true` | Adjust position to stay in viewport |
|
|
245
|
-
| `theme` | `'dark' \| 'light' \| 'default'` | `'dark'` | Theme variant |
|
|
246
|
-
| `className` | `string` | - | Additional CSS classes |
|
|
247
|
-
|
|
248
|
-
## TypeScript
|
|
249
|
-
|
|
250
|
-
### Full Type Definitions
|
|
251
|
-
|
|
252
|
-
```typescript
|
|
253
|
-
import { ReactNode } from 'react'
|
|
254
|
-
|
|
255
|
-
export enum ContentAlign {
|
|
256
|
-
START = 'start',
|
|
257
|
-
CENTER = 'center',
|
|
258
|
-
END = 'end',
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
export type ToolTipSide = 'top' | 'right' | 'bottom' | 'left'
|
|
262
|
-
|
|
263
|
-
interface TooltipProps {
|
|
264
|
-
text: ReactNode
|
|
265
|
-
children: ReactNode
|
|
266
|
-
variant?: 'primary' | 'highlight'
|
|
267
|
-
toolTipSide?: ToolTipSide
|
|
268
|
-
contentAlign?: ContentAlign | 'start' | 'center' | 'end'
|
|
269
|
-
avoidCollisions?: boolean
|
|
270
|
-
delay?: number
|
|
271
|
-
tip?: boolean
|
|
272
|
-
open?: boolean
|
|
273
|
-
onOpenChange?: (open: boolean) => void
|
|
274
|
-
disabled?: boolean // Accepted but not implemented — has no effect
|
|
275
|
-
theme?: 'dark' | 'light' | 'default'
|
|
276
|
-
className?: string
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
export const Tooltip: React.FC<TooltipProps>
|
|
280
|
-
```
|
|
281
|
-
|
|
282
|
-
## Variants
|
|
283
|
-
|
|
284
|
-
### Primary Variant
|
|
285
|
-
- Gray background
|
|
286
|
-
- Light text
|
|
287
|
-
- Subtle appearance
|
|
288
|
-
- Default variant
|
|
289
|
-
|
|
290
|
-
### Highlight Variant
|
|
291
|
-
- Gradient background (navy to blue)
|
|
292
|
-
- White text
|
|
293
|
-
- Eye-catching
|
|
294
|
-
- For important information
|
|
295
|
-
|
|
296
|
-
## Common Patterns
|
|
297
|
-
|
|
298
|
-
### Tooltip for Disabled Elements
|
|
299
|
-
|
|
300
|
-
```typescript
|
|
301
|
-
// Disabled elements don't trigger pointer events
|
|
302
|
-
// Wrap in a span to enable tooltip
|
|
303
|
-
<Tooltip text="This action is not available">
|
|
304
|
-
<span className="inline-block">
|
|
305
|
-
<Button disabled>Save</Button>
|
|
306
|
-
</span>
|
|
307
|
-
</Tooltip>
|
|
308
|
-
```
|
|
309
|
-
|
|
310
|
-
### Conditional Tooltips
|
|
311
|
-
|
|
312
|
-
```typescript
|
|
313
|
-
function ConditionalTooltip({ showTooltip, children }) {
|
|
314
|
-
if (!showTooltip) return children
|
|
315
|
-
|
|
316
|
-
return (
|
|
317
|
-
<Tooltip text="Additional information">
|
|
318
|
-
{children}
|
|
319
|
-
</Tooltip>
|
|
320
|
-
)
|
|
321
|
-
}
|
|
322
|
-
```
|
|
323
|
-
|
|
324
|
-
### Multi-Line Tooltips
|
|
325
|
-
|
|
326
|
-
```typescript
|
|
327
|
-
<Tooltip
|
|
328
|
-
text={
|
|
329
|
-
<>
|
|
330
|
-
<div>Line 1: Description</div>
|
|
331
|
-
<div>Line 2: More details</div>
|
|
332
|
-
<div>Line 3: Extra info</div>
|
|
333
|
-
</>
|
|
334
|
-
}
|
|
335
|
-
>
|
|
336
|
-
<button>Hover for details</button>
|
|
337
|
-
</Tooltip>
|
|
338
|
-
```
|
|
339
|
-
|
|
340
|
-
## Testing
|
|
341
|
-
|
|
342
|
-
### Unit Test Example
|
|
343
|
-
|
|
344
|
-
```typescript
|
|
345
|
-
import { render, screen, waitFor } from '@testing-library/react'
|
|
346
|
-
import userEvent from '@testing-library/user-event'
|
|
347
|
-
import { Tooltip } from "@/components/Tooltip";
|
|
348
|
-
|
|
349
|
-
describe('Tooltip', () => {
|
|
350
|
-
it('shows tooltip on hover', async () => {
|
|
351
|
-
render(
|
|
352
|
-
<Tooltip text="Tooltip content">
|
|
353
|
-
<button>Hover me</button>
|
|
354
|
-
</Tooltip>
|
|
355
|
-
)
|
|
356
|
-
|
|
357
|
-
await userEvent.hover(screen.getByRole('button'))
|
|
358
|
-
|
|
359
|
-
await waitFor(() => {
|
|
360
|
-
expect(screen.getByText('Tooltip content')).toBeInTheDocument()
|
|
361
|
-
})
|
|
362
|
-
})
|
|
363
|
-
|
|
364
|
-
it('respects delay prop', async () => {
|
|
365
|
-
jest.useFakeTimers()
|
|
366
|
-
|
|
367
|
-
render(
|
|
368
|
-
<Tooltip text="Delayed" delay={1000}>
|
|
369
|
-
<button>Hover</button>
|
|
370
|
-
</Tooltip>
|
|
371
|
-
)
|
|
372
|
-
|
|
373
|
-
await userEvent.hover(screen.getByRole('button'))
|
|
374
|
-
|
|
375
|
-
// Not visible immediately
|
|
376
|
-
expect(screen.queryByText('Delayed')).not.toBeInTheDocument()
|
|
377
|
-
|
|
378
|
-
// Visible after delay
|
|
379
|
-
jest.advanceTimersByTime(1000)
|
|
380
|
-
await waitFor(() => {
|
|
381
|
-
expect(screen.getByText('Delayed')).toBeInTheDocument()
|
|
382
|
-
})
|
|
383
|
-
|
|
384
|
-
jest.useRealTimers()
|
|
385
|
-
})
|
|
386
|
-
})
|
|
387
|
-
```
|
|
388
|
-
|
|
389
|
-
## Accessibility
|
|
390
|
-
|
|
391
|
-
- **Keyboard Support**:
|
|
392
|
-
- Focus trigger: Show tooltip
|
|
393
|
-
- Blur trigger: Hide tooltip
|
|
394
|
-
- Escape: Hide tooltip (when focused)
|
|
395
|
-
- **ARIA Attributes**:
|
|
396
|
-
- `role="tooltip"` automatically applied
|
|
397
|
-
- Tooltip linked to trigger via ARIA
|
|
398
|
-
- **Screen Readers**: Tooltip content announced when trigger is focused
|
|
399
|
-
- **Pointer/Touch**: Shows on hover/long-press
|
|
400
|
-
|
|
401
|
-
### Accessibility Best Practices
|
|
402
|
-
|
|
403
|
-
```typescript
|
|
404
|
-
// Ensure trigger is keyboard accessible
|
|
405
|
-
<Tooltip text="Help text">
|
|
406
|
-
<button tabIndex={0}>Accessible Button</button>
|
|
407
|
-
</Tooltip>
|
|
408
|
-
|
|
409
|
-
// Don't hide critical information in tooltips
|
|
410
|
-
// (tooltips may not be accessible to all users)
|
|
411
|
-
|
|
412
|
-
// For icon-only buttons, always use aria-label
|
|
413
|
-
<Tooltip text="Delete item">
|
|
414
|
-
<button aria-label="Delete item">
|
|
415
|
-
<i className="ri-delete-bin-line" />
|
|
416
|
-
</button>
|
|
417
|
-
</Tooltip>
|
|
418
|
-
```
|
|
419
|
-
|
|
420
|
-
## Performance
|
|
421
|
-
|
|
422
|
-
| Metric | Value |
|
|
423
|
-
|--------|-------|
|
|
424
|
-
| Bundle size (minified) | ~3kb |
|
|
425
|
-
| Bundle size (gzipped) | ~1.2kb |
|
|
426
|
-
| Dependencies | @radix-ui/react-tooltip (~8kb) |
|
|
427
|
-
| Show delay | Configurable (default 400ms) |
|
|
428
|
-
| Animation duration | ~200ms |
|
|
429
|
-
| Tree-shakeable | ✅ |
|
|
430
|
-
|
|
431
|
-
### Performance Tips
|
|
432
|
-
|
|
433
|
-
1. **Use appropriate delay**: Balance UX with performance
|
|
434
|
-
```typescript
|
|
435
|
-
<Tooltip delay={400}> {/* Default - good balance */}
|
|
436
|
-
```
|
|
437
|
-
|
|
438
|
-
2. **Avoid tooltips on rapidly changing elements**
|
|
439
|
-
3. **Keep content concise**: Large tooltips impact performance
|
|
440
|
-
|
|
441
|
-
## Migration from Other Libraries
|
|
442
|
-
|
|
443
|
-
### From Material-UI Tooltip
|
|
444
|
-
|
|
445
|
-
```diff
|
|
446
|
-
- import { Tooltip } from '@mui/material'
|
|
447
|
-
+ import { Tooltip } from "@/components/Tooltip";
|
|
448
|
-
|
|
449
|
-
- <Tooltip title="Help text">
|
|
450
|
-
+ <Tooltip text="Help text">
|
|
451
|
-
<button>Hover</button>
|
|
452
|
-
- </Tooltip>
|
|
453
|
-
+ </Tooltip>
|
|
454
|
-
```
|
|
455
|
-
|
|
456
|
-
### From Radix UI Tooltip
|
|
457
|
-
|
|
458
|
-
```diff
|
|
459
|
-
- import * as Tooltip from '@radix-ui/react-tooltip'
|
|
460
|
-
+ import { Tooltip } from "@/components/Tooltip";
|
|
461
|
-
|
|
462
|
-
- <Tooltip.Provider>
|
|
463
|
-
- <Tooltip.Root>
|
|
464
|
-
- <Tooltip.Trigger>Hover</Tooltip.Trigger>
|
|
465
|
-
- <Tooltip.Content>Text</Tooltip.Content>
|
|
466
|
-
- </Tooltip.Root>
|
|
467
|
-
- </Tooltip.Provider>
|
|
468
|
-
|
|
469
|
-
+ <Tooltip text="Text">
|
|
470
|
-
+ <button>Hover</button>
|
|
471
|
-
+ </Tooltip>
|
|
472
|
-
```
|
|
473
|
-
|
|
474
|
-
## Best Practices
|
|
475
|
-
|
|
476
|
-
1. **Keep tooltips brief**: One or two short sentences max
|
|
477
|
-
```typescript
|
|
478
|
-
<Tooltip text="Brief, helpful text">
|
|
479
|
-
```
|
|
480
|
-
|
|
481
|
-
2. **Don't repeat visible information**: Add context, don't duplicate
|
|
482
|
-
```typescript
|
|
483
|
-
// Good
|
|
484
|
-
<Tooltip text="Ctrl+S"><button>Save</button></Tooltip>
|
|
485
|
-
|
|
486
|
-
// Avoid
|
|
487
|
-
<Tooltip text="Save"><button>Save</button></Tooltip>
|
|
488
|
-
```
|
|
489
|
-
|
|
490
|
-
3. **Position appropriately**: Choose side based on layout
|
|
491
|
-
```typescript
|
|
492
|
-
<Tooltip toolTipSide="top"> {/* For bottom elements */}
|
|
493
|
-
```
|
|
494
|
-
|
|
495
|
-
4. **Use highlight variant sparingly**: Reserve for important info
|
|
496
|
-
```typescript
|
|
497
|
-
<Tooltip variant="highlight" text="Critical information">
|
|
498
|
-
```
|
|
499
|
-
|
|
500
|
-
5. **Don't nest interactive elements**: Tooltips should contain text only
|
|
501
|
-
```typescript
|
|
502
|
-
// Avoid
|
|
503
|
-
<Tooltip text={<button>Click</button>}>
|
|
504
|
-
```
|
|
505
|
-
|
|
506
|
-
6. **Test on touch devices**: Ensure long-press works
|
|
507
|
-
7. **Provide alternative access**: Don't hide critical info in tooltips
|
|
508
|
-
|
|
509
|
-
## Related Components
|
|
510
|
-
|
|
511
|
-
- [Popover](./popover.md) - For interactive content
|
|
512
|
-
- [DropdownMenu](./dropdown-menu.md) - For menus and actions
|
|
513
|
-
- [Dialog](./dialog.md) - For complex interactions
|