@umbra.ui/core 0.1.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/dist/components/controls/Dropdown/types.d.ts +5 -0
- package/dist/components/controls/Dropdown/types.d.ts.map +1 -0
- package/dist/components/controls/Dropdown/types.js +1 -0
- package/dist/components/controls/SegmentedControl/types.d.ts +6 -0
- package/dist/components/controls/SegmentedControl/types.d.ts.map +1 -0
- package/dist/components/controls/SegmentedControl/types.js +1 -0
- package/dist/components/dialogs/Alert/types.d.ts +7 -0
- package/dist/components/dialogs/Alert/types.d.ts.map +1 -0
- package/dist/components/dialogs/Alert/types.js +1 -0
- package/dist/components/dialogs/Toast/types.d.ts +34 -0
- package/dist/components/dialogs/Toast/types.d.ts.map +1 -0
- package/dist/components/dialogs/Toast/types.js +10 -0
- package/dist/components/dialogs/Toast/useToast.d.ts +36 -0
- package/dist/components/dialogs/Toast/useToast.d.ts.map +1 -0
- package/dist/components/dialogs/Toast/useToast.js +90 -0
- package/dist/components/indicators/Tooltip/tooltip.d.ts +3 -0
- package/dist/components/indicators/Tooltip/tooltip.d.ts.map +1 -0
- package/dist/components/indicators/Tooltip/tooltip.js +33 -0
- package/dist/components/indicators/Tooltip/types.d.ts +14 -0
- package/dist/components/indicators/Tooltip/types.d.ts.map +1 -0
- package/dist/components/indicators/Tooltip/types.js +1 -0
- package/dist/components/indicators/Tooltip/useTooltip.d.ts +18 -0
- package/dist/components/indicators/Tooltip/useTooltip.d.ts.map +1 -0
- package/dist/components/indicators/Tooltip/useTooltip.js +57 -0
- package/dist/components/inputs/Tags/tag-bar-styles.d.ts +14 -0
- package/dist/components/inputs/Tags/tag-bar-styles.d.ts.map +1 -0
- package/dist/components/inputs/Tags/tag-bar-styles.js +313 -0
- package/dist/components/inputs/Tags/types.d.ts +93 -0
- package/dist/components/inputs/Tags/types.d.ts.map +1 -0
- package/dist/components/inputs/Tags/types.js +216 -0
- package/dist/components/inputs/search/types.d.ts +9 -0
- package/dist/components/inputs/search/types.d.ts.map +1 -0
- package/dist/components/inputs/search/types.js +1 -0
- package/dist/components/navigation/adaptive/types.d.ts +16 -0
- package/dist/components/navigation/adaptive/types.d.ts.map +1 -0
- package/dist/components/navigation/adaptive/types.js +1 -0
- package/dist/components/navigation/adaptive/useAdaptiveLayout.d.ts +27 -0
- package/dist/components/navigation/adaptive/useAdaptiveLayout.d.ts.map +1 -0
- package/dist/components/navigation/adaptive/useAdaptiveLayout.js +40 -0
- package/dist/components/navigation/adaptive/useBreakpoints.d.ts +6 -0
- package/dist/components/navigation/adaptive/useBreakpoints.d.ts.map +1 -0
- package/dist/components/navigation/adaptive/useBreakpoints.js +37 -0
- package/dist/components/navigation/adaptive/useContainerMonitor.d.ts +93 -0
- package/dist/components/navigation/adaptive/useContainerMonitor.d.ts.map +1 -0
- package/dist/components/navigation/adaptive/useContainerMonitor.js +145 -0
- package/dist/components/navigation/adaptive/useViewAnimation.d.ts +31 -0
- package/dist/components/navigation/adaptive/useViewAnimation.d.ts.map +1 -0
- package/dist/components/navigation/adaptive/useViewAnimation.js +591 -0
- package/dist/components/navigation/adaptive/useViewResize.d.ts +52 -0
- package/dist/components/navigation/adaptive/useViewResize.d.ts.map +1 -0
- package/dist/components/navigation/adaptive/useViewResize.js +146 -0
- package/dist/components/navigation/navstack/useNavigationStack.d.ts +25 -0
- package/dist/components/navigation/navstack/useNavigationStack.d.ts.map +1 -0
- package/dist/components/navigation/navstack/useNavigationStack.js +133 -0
- package/dist/components/navigation/slideover/useSlideoverController.d.ts +20 -0
- package/dist/components/navigation/slideover/useSlideoverController.d.ts.map +1 -0
- package/dist/components/navigation/slideover/useSlideoverController.js +267 -0
- package/dist/components/navigation/splitview/useSplitViewController.d.ts +20 -0
- package/dist/components/navigation/splitview/useSplitViewController.d.ts.map +1 -0
- package/dist/components/navigation/splitview/useSplitViewController.js +325 -0
- package/dist/components/navigation/tabcontroller/types.d.ts +21 -0
- package/dist/components/navigation/tabcontroller/types.d.ts.map +1 -0
- package/dist/components/navigation/tabcontroller/types.js +1 -0
- package/dist/components/navigation/tabcontroller/useTabController.d.ts +5 -0
- package/dist/components/navigation/tabcontroller/useTabController.d.ts.map +1 -0
- package/dist/components/navigation/tabcontroller/useTabController.js +10 -0
- package/dist/components/navigation/types.d.ts +8 -0
- package/dist/components/navigation/types.d.ts.map +1 -0
- package/dist/components/navigation/types.js +1 -0
- package/dist/components/pickers/CollectionPicker/types.d.ts +11 -0
- package/dist/components/pickers/CollectionPicker/types.d.ts.map +1 -0
- package/dist/components/pickers/CollectionPicker/types.js +1 -0
- package/dist/components/pickers/ColorPicker/colors.d.ts +13 -0
- package/dist/components/pickers/ColorPicker/colors.d.ts.map +1 -0
- package/dist/components/pickers/ColorPicker/colors.js +266 -0
- package/dist/components/pickers/FilePicker/types.d.ts +10 -0
- package/dist/components/pickers/FilePicker/types.d.ts.map +1 -0
- package/dist/components/pickers/FilePicker/types.js +1 -0
- package/dist/index.d.ts +91 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +196 -0
- package/dist/theme.d.ts +73 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +279 -0
- package/dist/themes/blank.d.ts +7 -0
- package/dist/themes/blank.d.ts.map +1 -0
- package/dist/themes/blank.js +543 -0
- package/dist/themes/crimson-dark.d.ts +4 -0
- package/dist/themes/crimson-dark.d.ts.map +1 -0
- package/dist/themes/crimson-dark.js +552 -0
- package/dist/themes/cyan-light.d.ts +4 -0
- package/dist/themes/cyan-light.d.ts.map +1 -0
- package/dist/themes/cyan-light.js +552 -0
- package/dist/themes/dark.d.ts +4 -0
- package/dist/themes/dark.d.ts.map +1 -0
- package/dist/themes/dark.js +551 -0
- package/dist/themes/gold-dark.d.ts +4 -0
- package/dist/themes/gold-dark.d.ts.map +1 -0
- package/dist/themes/gold-dark.js +552 -0
- package/dist/themes/grass-dark.d.ts +4 -0
- package/dist/themes/grass-dark.d.ts.map +1 -0
- package/dist/themes/grass-dark.js +552 -0
- package/dist/themes/indigo.d.ts +4 -0
- package/dist/themes/indigo.d.ts.map +1 -0
- package/dist/themes/indigo.js +552 -0
- package/dist/themes/light.d.ts +4 -0
- package/dist/themes/light.d.ts.map +1 -0
- package/dist/themes/light.js +551 -0
- package/dist/themes/orange-dark.d.ts +4 -0
- package/dist/themes/orange-dark.d.ts.map +1 -0
- package/dist/themes/orange-dark.js +551 -0
- package/dist/themes/orange-light.d.ts +4 -0
- package/dist/themes/orange-light.d.ts.map +1 -0
- package/dist/themes/orange-light.js +551 -0
- package/package.json +62 -0
- package/src/components/controls/Button/Button.vue +417 -0
- package/src/components/controls/Button/README.md +348 -0
- package/src/components/controls/Button/theme.css +200 -0
- package/src/components/controls/Checkbox/Checkbox.vue +164 -0
- package/src/components/controls/Checkbox/README.md +441 -0
- package/src/components/controls/Checkbox/theme.css +36 -0
- package/src/components/controls/Dropdown/Dropdown.vue +476 -0
- package/src/components/controls/Dropdown/README.md +370 -0
- package/src/components/controls/Dropdown/theme.css +50 -0
- package/src/components/controls/Dropdown/types.ts +6 -0
- package/src/components/controls/IconButton/IconButton.vue +267 -0
- package/src/components/controls/IconButton/README.md +502 -0
- package/src/components/controls/IconButton/theme.css +89 -0
- package/src/components/controls/Radio/README.md +591 -0
- package/src/components/controls/Radio/Radio.vue +89 -0
- package/src/components/controls/Radio/theme.css +14 -0
- package/src/components/controls/RangeSlider/README.md +608 -0
- package/src/components/controls/RangeSlider/RangeSlider.vue +535 -0
- package/src/components/controls/RangeSlider/theme.css +80 -0
- package/src/components/controls/SegmentedControl/README.md +587 -0
- package/src/components/controls/SegmentedControl/SegmentedControl.vue +284 -0
- package/src/components/controls/SegmentedControl/theme.css +60 -0
- package/src/components/controls/SegmentedControl/types.ts +5 -0
- package/src/components/controls/Slider/README.md +627 -0
- package/src/components/controls/Slider/Slider.vue +260 -0
- package/src/components/controls/Slider/theme.css +74 -0
- package/src/components/controls/Stepper/README.md +601 -0
- package/src/components/controls/Stepper/Stepper.vue +103 -0
- package/src/components/controls/Stepper/theme.css +53 -0
- package/src/components/controls/Switch/README.md +667 -0
- package/src/components/controls/Switch/Switch.vue +127 -0
- package/src/components/controls/Switch/theme.css +42 -0
- package/src/components/dialogs/Alert/Alert.vue +218 -0
- package/src/components/dialogs/Alert/README.md +450 -0
- package/src/components/dialogs/Alert/theme.css +44 -0
- package/src/components/dialogs/Alert/types.ts +11 -0
- package/src/components/dialogs/Toast/README.md +522 -0
- package/src/components/dialogs/Toast/Toast.vue +296 -0
- package/src/components/dialogs/Toast/ToastContainer.vue +330 -0
- package/src/components/dialogs/Toast/theme.css +44 -0
- package/src/components/dialogs/Toast/types.ts +46 -0
- package/src/components/dialogs/Toast/useToast.ts +127 -0
- package/src/components/indicators/ProgressBar/ProgressBar.vue +98 -0
- package/src/components/indicators/ProgressBar/README.md +744 -0
- package/src/components/indicators/ProgressBar/theme.css +36 -0
- package/src/components/indicators/Tooltip/README.md +723 -0
- package/src/components/indicators/Tooltip/TooltipProvider.vue +142 -0
- package/src/components/indicators/Tooltip/theme.css +18 -0
- package/src/components/indicators/Tooltip/tooltip.ts +48 -0
- package/src/components/indicators/Tooltip/types.ts +15 -0
- package/src/components/indicators/Tooltip/useTooltip.ts +71 -0
- package/src/components/inputs/AutogrowTextView/AutogrowTextView.vue +110 -0
- package/src/components/inputs/AutogrowTextView/README.md +643 -0
- package/src/components/inputs/AutogrowTextView/theme.css +28 -0
- package/src/components/inputs/InputCard/InputCard.vue +600 -0
- package/src/components/inputs/InputCard/README.md +636 -0
- package/src/components/inputs/InputEmail/InputEmail.vue +698 -0
- package/src/components/inputs/InputEmail/README.md +764 -0
- package/src/components/inputs/InputNumber/InputNumber.vue +300 -0
- package/src/components/inputs/InputNumber/README.md +749 -0
- package/src/components/inputs/InputPhone/InputPhone.vue +645 -0
- package/src/components/inputs/InputPhone/README.md +636 -0
- package/src/components/inputs/InputSecure/InputSecure.vue +646 -0
- package/src/components/inputs/InputSecure/README.md +771 -0
- package/src/components/inputs/InputText/InputText.vue +225 -0
- package/src/components/inputs/InputText/README.md +844 -0
- package/src/components/inputs/OTP/OTP.vue +349 -0
- package/src/components/inputs/OTP/README.md +736 -0
- package/src/components/inputs/OTP/theme.css +50 -0
- package/src/components/inputs/StringCapture/README.md +718 -0
- package/src/components/inputs/StringCapture/StringCapture.vue +315 -0
- package/src/components/inputs/StringCapture/theme.css +86 -0
- package/src/components/inputs/Tags/README.md +897 -0
- package/src/components/inputs/Tags/TagBar.vue +793 -0
- package/src/components/inputs/Tags/TagCreation.vue +219 -0
- package/src/components/inputs/Tags/TagPicker.vue +380 -0
- package/src/components/inputs/Tags/tag-bar-styles.ts +354 -0
- package/src/components/inputs/Tags/theme.css +121 -0
- package/src/components/inputs/Tags/types.ts +346 -0
- package/src/components/inputs/search/README.md +759 -0
- package/src/components/inputs/search/SearchBar.vue +394 -0
- package/src/components/inputs/search/SearchResults.vue +310 -0
- package/src/components/inputs/search/theme.css +187 -0
- package/src/components/inputs/search/types.ts +8 -0
- package/src/components/inputs/theme.css +102 -0
- package/src/components/menus/ActionMenu/ActionMenu.vue +383 -0
- package/src/components/menus/ActionMenu/README.md +825 -0
- package/src/components/menus/ActionMenu/theme.css +93 -0
- package/src/components/models/Popover/Popover.vue +551 -0
- package/src/components/models/Popover/README.md +885 -0
- package/src/components/models/Popover/theme.css +52 -0
- package/src/components/models/Sheet/README.md +1159 -0
- package/src/components/models/Sheet/Sheet.vue +465 -0
- package/src/components/models/Sheet/theme.css +72 -0
- package/src/components/models/Sidebar/README.md +1228 -0
- package/src/components/models/Sidebar/Sidebar.vue +480 -0
- package/src/components/models/Sidebar/theme.css +90 -0
- package/src/components/navigation/adaptive/AdaptiveLayout.vue +779 -0
- package/src/components/navigation/adaptive/AdaptiveLayoutBreadcrumbs.vue +192 -0
- package/src/components/navigation/adaptive/AdaptiveLayoutMenuButton.vue +149 -0
- package/src/components/navigation/adaptive/README.md +768 -0
- package/src/components/navigation/adaptive/types.ts +19 -0
- package/src/components/navigation/adaptive/useAdaptiveLayout.ts +89 -0
- package/src/components/navigation/adaptive/useBreakpoints.ts +41 -0
- package/src/components/navigation/adaptive/useContainerMonitor.ts +214 -0
- package/src/components/navigation/adaptive/useViewAnimation.ts +721 -0
- package/src/components/navigation/adaptive/useViewResize.ts +211 -0
- package/src/components/navigation/navstack/NavigationStack.vue +180 -0
- package/src/components/navigation/navstack/README.md +994 -0
- package/src/components/navigation/navstack/useNavigationStack.ts +164 -0
- package/src/components/navigation/slideover/README.md +1275 -0
- package/src/components/navigation/slideover/SlideoverController.vue +287 -0
- package/src/components/navigation/slideover/useSlideoverController.ts +320 -0
- package/src/components/navigation/splitview/README.md +1115 -0
- package/src/components/navigation/splitview/SplitViewController.vue +176 -0
- package/src/components/navigation/splitview/useSplitViewController.ts +388 -0
- package/src/components/navigation/tabcontroller/README.md +919 -0
- package/src/components/navigation/tabcontroller/TabController.vue +307 -0
- package/src/components/navigation/tabcontroller/TabItem.vue +57 -0
- package/src/components/navigation/tabcontroller/types.ts +24 -0
- package/src/components/navigation/tabcontroller/useTabController.ts +18 -0
- package/src/components/navigation/theme.css +91 -0
- package/src/components/navigation/types.ts +7 -0
- package/src/components/pickers/CollectionPicker/CollectionPicker.vue +398 -0
- package/src/components/pickers/CollectionPicker/README.md +1115 -0
- package/src/components/pickers/CollectionPicker/theme.css +14 -0
- package/src/components/pickers/CollectionPicker/types.ts +11 -0
- package/src/components/pickers/ColorPicker/ColorPicker.vue +376 -0
- package/src/components/pickers/ColorPicker/README.md +1439 -0
- package/src/components/pickers/ColorPicker/colors.ts +299 -0
- package/src/components/pickers/ColorPicker/theme.css +32 -0
- package/src/components/pickers/DatePicker/DatePicker.vue +660 -0
- package/src/components/pickers/DatePicker/README.md +1195 -0
- package/src/components/pickers/DatePicker/theme.css +22 -0
- package/src/components/pickers/FilePicker/FilePicker.vue +534 -0
- package/src/components/pickers/FilePicker/README.md +1542 -0
- package/src/components/pickers/FilePicker/theme.css +48 -0
- package/src/components/pickers/FilePicker/types.ts +10 -0
- package/src/components/pickers/IconPicker/IconPicker.vue +327 -0
- package/src/components/pickers/IconPicker/README.md +1161 -0
- package/src/components/pickers/IconPicker/theme.css +28 -0
- package/src/components/pickers/theme.css +82 -0
- package/src/components/views/MarkdownViewer/MarkdownViewer.vue +442 -0
- package/src/components/views/MarkdownViewer/README.md +833 -0
- package/src/components/views/MarkdownViewer/theme.css +130 -0
- package/src/index.ts +263 -0
- package/src/theme.ts +378 -0
- package/src/themes/crimson-dark.ts +556 -0
- package/src/themes/cyan-light.ts +556 -0
- package/src/themes/dark.ts +557 -0
- package/src/themes/gold-dark.ts +556 -0
- package/src/themes/grass-dark.ts +556 -0
- package/src/themes/indigo.ts +556 -0
- package/src/themes/light.ts +557 -0
- package/src/themes/orange-dark.ts +557 -0
- package/src/themes/orange-light.ts +557 -0
- package/src/vue.d.ts +45 -0
|
@@ -0,0 +1,723 @@
|
|
|
1
|
+
# Tooltip
|
|
2
|
+
|
|
3
|
+
A flexible tooltip system built with Vue 3 Composition API and TypeScript. The Tooltip component provides contextual information and help text that appears on hover with smart positioning, smooth animations, and global state management.
|
|
4
|
+
|
|
5
|
+
## Installation/Import
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
import { TooltipProvider, useTooltip, vTooltip } from "@umbra-ui/core";
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
**Dependencies:**
|
|
12
|
+
|
|
13
|
+
- Vue 3.x
|
|
14
|
+
- @floating-ui/vue (for positioning)
|
|
15
|
+
|
|
16
|
+
## Basic Usage
|
|
17
|
+
|
|
18
|
+
### Setup (App Level)
|
|
19
|
+
|
|
20
|
+
```vue
|
|
21
|
+
<script setup lang="ts">
|
|
22
|
+
import { createApp } from "vue";
|
|
23
|
+
import { TooltipProvider } from "@umbra-ui/core";
|
|
24
|
+
import App from "./App.vue";
|
|
25
|
+
|
|
26
|
+
const app = createApp(App);
|
|
27
|
+
app.mount("#app");
|
|
28
|
+
</script>
|
|
29
|
+
|
|
30
|
+
<template>
|
|
31
|
+
<div>
|
|
32
|
+
<!-- Your app content -->
|
|
33
|
+
<TooltipProvider />
|
|
34
|
+
</div>
|
|
35
|
+
</template>
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Using the Directive
|
|
39
|
+
|
|
40
|
+
```vue
|
|
41
|
+
<script setup lang="ts">
|
|
42
|
+
import { vTooltip } from "@umbra-ui/core";
|
|
43
|
+
</script>
|
|
44
|
+
|
|
45
|
+
<template>
|
|
46
|
+
<div>
|
|
47
|
+
<button v-tooltip="'This is a simple tooltip'">Hover me</button>
|
|
48
|
+
|
|
49
|
+
<button v-tooltip="{ content: 'Custom tooltip', placement: 'bottom' }">
|
|
50
|
+
Advanced tooltip
|
|
51
|
+
</button>
|
|
52
|
+
</div>
|
|
53
|
+
</template>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Using the Composable
|
|
57
|
+
|
|
58
|
+
```vue
|
|
59
|
+
<script setup lang="ts">
|
|
60
|
+
import { ref, onMounted } from "vue";
|
|
61
|
+
import { useTooltip } from "@umbra-ui/core";
|
|
62
|
+
|
|
63
|
+
const buttonRef = ref<HTMLElement>();
|
|
64
|
+
|
|
65
|
+
const { bindTooltip } = useTooltip({
|
|
66
|
+
content: "This tooltip was created with the composable",
|
|
67
|
+
placement: "top",
|
|
68
|
+
delay: 500,
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
onMounted(() => {
|
|
72
|
+
if (buttonRef.value) {
|
|
73
|
+
bindTooltip(buttonRef.value);
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
</script>
|
|
77
|
+
|
|
78
|
+
<template>
|
|
79
|
+
<button ref="buttonRef">Hover me</button>
|
|
80
|
+
</template>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Props
|
|
84
|
+
|
|
85
|
+
### TooltipProvider Component
|
|
86
|
+
|
|
87
|
+
This component does not accept props. It automatically manages all tooltips through the global tooltip state.
|
|
88
|
+
|
|
89
|
+
## Events
|
|
90
|
+
|
|
91
|
+
### TooltipProvider Component
|
|
92
|
+
|
|
93
|
+
This component does not emit events.
|
|
94
|
+
|
|
95
|
+
## Slots
|
|
96
|
+
|
|
97
|
+
### TooltipProvider Component
|
|
98
|
+
|
|
99
|
+
This component does not use slots.
|
|
100
|
+
|
|
101
|
+
## Exposed Methods/Refs
|
|
102
|
+
|
|
103
|
+
### useTooltip Composable
|
|
104
|
+
|
|
105
|
+
The `useTooltip` composable provides the following methods:
|
|
106
|
+
|
|
107
|
+
| Method Name | Parameters | Return Type | Description |
|
|
108
|
+
| ------------- | ------------------------ | ------------ | ----------------------------------------------------- |
|
|
109
|
+
| `bindTooltip` | `(element: HTMLElement)` | `() => void` | Binds tooltip to an element, returns cleanup function |
|
|
110
|
+
| `showTooltip` | `(element: HTMLElement)` | `void` | Manually show tooltip for an element |
|
|
111
|
+
| `hideTooltip` | `()` | `void` | Hide the currently visible tooltip |
|
|
112
|
+
|
|
113
|
+
### useTooltipProvider Composable
|
|
114
|
+
|
|
115
|
+
The `useTooltipProvider` composable provides the following:
|
|
116
|
+
|
|
117
|
+
| Property/Method | Type | Description |
|
|
118
|
+
| --------------- | ------------------- | ---------------------------------------------- |
|
|
119
|
+
| `tooltipState` | `TooltipState` | Reactive tooltip state object |
|
|
120
|
+
| `showTooltip` | `(element, config)` | Show tooltip for an element with configuration |
|
|
121
|
+
| `hideTooltip` | `()` | Hide the currently visible tooltip |
|
|
122
|
+
|
|
123
|
+
## Types
|
|
124
|
+
|
|
125
|
+
### TooltipConfig
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
interface TooltipConfig {
|
|
129
|
+
content: string;
|
|
130
|
+
placement?: "top" | "bottom" | "left" | "right";
|
|
131
|
+
delay?: number;
|
|
132
|
+
offset?: number;
|
|
133
|
+
}
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### TooltipState
|
|
137
|
+
|
|
138
|
+
```typescript
|
|
139
|
+
interface TooltipState {
|
|
140
|
+
isVisible: boolean;
|
|
141
|
+
content: string;
|
|
142
|
+
targetElement: HTMLElement | null;
|
|
143
|
+
placement: TooltipConfig["placement"];
|
|
144
|
+
offset: number;
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## CSS Customization
|
|
149
|
+
|
|
150
|
+
The Tooltip component uses CSS custom properties for easy theming and customization:
|
|
151
|
+
|
|
152
|
+
```css
|
|
153
|
+
/* Tooltip background colors */
|
|
154
|
+
--tooltip-bg: #f0f2f4;
|
|
155
|
+
|
|
156
|
+
/* Tooltip text colors */
|
|
157
|
+
--tooltip-text: #1a1d23;
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
## Examples
|
|
161
|
+
|
|
162
|
+
### Basic Tooltip Usage
|
|
163
|
+
|
|
164
|
+
```vue
|
|
165
|
+
<script setup lang="ts">
|
|
166
|
+
import { vTooltip } from "@umbra-ui/core";
|
|
167
|
+
</script>
|
|
168
|
+
|
|
169
|
+
<template>
|
|
170
|
+
<div class="tooltip-examples">
|
|
171
|
+
<button v-tooltip="'Simple tooltip text'">Simple Tooltip</button>
|
|
172
|
+
|
|
173
|
+
<button
|
|
174
|
+
v-tooltip="
|
|
175
|
+
'This is a longer tooltip that provides more detailed information about the button.'
|
|
176
|
+
"
|
|
177
|
+
>
|
|
178
|
+
Long Tooltip
|
|
179
|
+
</button>
|
|
180
|
+
</div>
|
|
181
|
+
</template>
|
|
182
|
+
|
|
183
|
+
<style module>
|
|
184
|
+
.tooltip-examples {
|
|
185
|
+
display: flex;
|
|
186
|
+
gap: 1rem;
|
|
187
|
+
padding: 2rem;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
button {
|
|
191
|
+
padding: 0.5rem 1rem;
|
|
192
|
+
background-color: #007bff;
|
|
193
|
+
color: white;
|
|
194
|
+
border: none;
|
|
195
|
+
border-radius: 4px;
|
|
196
|
+
cursor: pointer;
|
|
197
|
+
}
|
|
198
|
+
</style>
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### Different Placements
|
|
202
|
+
|
|
203
|
+
```vue
|
|
204
|
+
<script setup lang="ts">
|
|
205
|
+
import { vTooltip } from "@umbra-ui/core";
|
|
206
|
+
</script>
|
|
207
|
+
|
|
208
|
+
<template>
|
|
209
|
+
<div class="placement-examples">
|
|
210
|
+
<div class="placement-grid">
|
|
211
|
+
<button v-tooltip="{ content: 'Top placement', placement: 'top' }">
|
|
212
|
+
Top
|
|
213
|
+
</button>
|
|
214
|
+
|
|
215
|
+
<button v-tooltip="{ content: 'Bottom placement', placement: 'bottom' }">
|
|
216
|
+
Bottom
|
|
217
|
+
</button>
|
|
218
|
+
|
|
219
|
+
<button v-tooltip="{ content: 'Left placement', placement: 'left' }">
|
|
220
|
+
Left
|
|
221
|
+
</button>
|
|
222
|
+
|
|
223
|
+
<button v-tooltip="{ content: 'Right placement', placement: 'right' }">
|
|
224
|
+
Right
|
|
225
|
+
</button>
|
|
226
|
+
</div>
|
|
227
|
+
</div>
|
|
228
|
+
</template>
|
|
229
|
+
|
|
230
|
+
<style module>
|
|
231
|
+
.placement-examples {
|
|
232
|
+
padding: 2rem;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
.placement-grid {
|
|
236
|
+
display: grid;
|
|
237
|
+
grid-template-columns: 1fr 1fr;
|
|
238
|
+
gap: 2rem;
|
|
239
|
+
max-width: 300px;
|
|
240
|
+
margin: 0 auto;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
button {
|
|
244
|
+
padding: 1rem;
|
|
245
|
+
background-color: #6c757d;
|
|
246
|
+
color: white;
|
|
247
|
+
border: none;
|
|
248
|
+
border-radius: 4px;
|
|
249
|
+
cursor: pointer;
|
|
250
|
+
}
|
|
251
|
+
</style>
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### Custom Delay and Offset
|
|
255
|
+
|
|
256
|
+
```vue
|
|
257
|
+
<script setup lang="ts">
|
|
258
|
+
import { vTooltip } from "@umbra-ui/core";
|
|
259
|
+
</script>
|
|
260
|
+
|
|
261
|
+
<template>
|
|
262
|
+
<div class="custom-examples">
|
|
263
|
+
<button v-tooltip="{ content: 'Quick tooltip', delay: 200 }">
|
|
264
|
+
Quick (200ms)
|
|
265
|
+
</button>
|
|
266
|
+
|
|
267
|
+
<button v-tooltip="{ content: 'Slow tooltip', delay: 2000 }">
|
|
268
|
+
Slow (2s)
|
|
269
|
+
</button>
|
|
270
|
+
|
|
271
|
+
<button v-tooltip="{ content: 'Close tooltip', offset: 5 }">
|
|
272
|
+
Close (5px)
|
|
273
|
+
</button>
|
|
274
|
+
|
|
275
|
+
<button v-tooltip="{ content: 'Far tooltip', offset: 20 }">
|
|
276
|
+
Far (20px)
|
|
277
|
+
</button>
|
|
278
|
+
</div>
|
|
279
|
+
</template>
|
|
280
|
+
|
|
281
|
+
<style module>
|
|
282
|
+
.custom-examples {
|
|
283
|
+
display: flex;
|
|
284
|
+
gap: 1rem;
|
|
285
|
+
padding: 2rem;
|
|
286
|
+
flex-wrap: wrap;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
button {
|
|
290
|
+
padding: 0.5rem 1rem;
|
|
291
|
+
background-color: #28a745;
|
|
292
|
+
color: white;
|
|
293
|
+
border: none;
|
|
294
|
+
border-radius: 4px;
|
|
295
|
+
cursor: pointer;
|
|
296
|
+
}
|
|
297
|
+
</style>
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### Form Field Help
|
|
301
|
+
|
|
302
|
+
```vue
|
|
303
|
+
<script setup lang="ts">
|
|
304
|
+
import { ref } from "vue";
|
|
305
|
+
import { vTooltip } from "@umbra-ui/core";
|
|
306
|
+
|
|
307
|
+
const email = ref("");
|
|
308
|
+
const password = ref("");
|
|
309
|
+
</script>
|
|
310
|
+
|
|
311
|
+
<template>
|
|
312
|
+
<div class="form-example">
|
|
313
|
+
<h3>User Registration</h3>
|
|
314
|
+
|
|
315
|
+
<div class="form-group">
|
|
316
|
+
<label>
|
|
317
|
+
Email Address
|
|
318
|
+
<span
|
|
319
|
+
v-tooltip="'Enter a valid email address that you have access to'"
|
|
320
|
+
class="help-icon"
|
|
321
|
+
>
|
|
322
|
+
?
|
|
323
|
+
</span>
|
|
324
|
+
</label>
|
|
325
|
+
<input v-model="email" type="email" placeholder="Enter your email" />
|
|
326
|
+
</div>
|
|
327
|
+
|
|
328
|
+
<div class="form-group">
|
|
329
|
+
<label>
|
|
330
|
+
Password
|
|
331
|
+
<span
|
|
332
|
+
v-tooltip="
|
|
333
|
+
'Password must be at least 8 characters long and contain at least one number'
|
|
334
|
+
"
|
|
335
|
+
class="help-icon"
|
|
336
|
+
>
|
|
337
|
+
?
|
|
338
|
+
</span>
|
|
339
|
+
</label>
|
|
340
|
+
<input
|
|
341
|
+
v-model="password"
|
|
342
|
+
type="password"
|
|
343
|
+
placeholder="Enter your password"
|
|
344
|
+
/>
|
|
345
|
+
</div>
|
|
346
|
+
|
|
347
|
+
<button type="submit">Register</button>
|
|
348
|
+
</div>
|
|
349
|
+
</template>
|
|
350
|
+
|
|
351
|
+
<style module>
|
|
352
|
+
.form-example {
|
|
353
|
+
max-width: 400px;
|
|
354
|
+
padding: 2rem;
|
|
355
|
+
border: 1px solid #e0e0e0;
|
|
356
|
+
border-radius: 8px;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
.form-group {
|
|
360
|
+
margin-bottom: 1rem;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
label {
|
|
364
|
+
display: flex;
|
|
365
|
+
align-items: center;
|
|
366
|
+
gap: 0.5rem;
|
|
367
|
+
margin-bottom: 0.5rem;
|
|
368
|
+
font-weight: 500;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
.help-icon {
|
|
372
|
+
width: 16px;
|
|
373
|
+
height: 16px;
|
|
374
|
+
border-radius: 50%;
|
|
375
|
+
background-color: #6c757d;
|
|
376
|
+
color: white;
|
|
377
|
+
display: flex;
|
|
378
|
+
align-items: center;
|
|
379
|
+
justify-content: center;
|
|
380
|
+
font-size: 12px;
|
|
381
|
+
cursor: help;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
input {
|
|
385
|
+
width: 100%;
|
|
386
|
+
padding: 0.5rem;
|
|
387
|
+
border: 1px solid #ddd;
|
|
388
|
+
border-radius: 4px;
|
|
389
|
+
font-size: 1rem;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
button {
|
|
393
|
+
width: 100%;
|
|
394
|
+
padding: 0.75rem;
|
|
395
|
+
background-color: #007bff;
|
|
396
|
+
color: white;
|
|
397
|
+
border: none;
|
|
398
|
+
border-radius: 4px;
|
|
399
|
+
cursor: pointer;
|
|
400
|
+
font-size: 1rem;
|
|
401
|
+
}
|
|
402
|
+
</style>
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
### Icon Tooltips
|
|
406
|
+
|
|
407
|
+
```vue
|
|
408
|
+
<script setup lang="ts">
|
|
409
|
+
import { vTooltip } from "@umbra-ui/core";
|
|
410
|
+
</script>
|
|
411
|
+
|
|
412
|
+
<template>
|
|
413
|
+
<div class="icon-examples">
|
|
414
|
+
<h3>Action Buttons</h3>
|
|
415
|
+
|
|
416
|
+
<div class="icon-group">
|
|
417
|
+
<button
|
|
418
|
+
v-tooltip="{ content: 'Save your changes', placement: 'top' }"
|
|
419
|
+
class="icon-button"
|
|
420
|
+
>
|
|
421
|
+
💾
|
|
422
|
+
</button>
|
|
423
|
+
|
|
424
|
+
<button
|
|
425
|
+
v-tooltip="{ content: 'Delete this item', placement: 'top' }"
|
|
426
|
+
class="icon-button"
|
|
427
|
+
>
|
|
428
|
+
🗑️
|
|
429
|
+
</button>
|
|
430
|
+
|
|
431
|
+
<button
|
|
432
|
+
v-tooltip="{ content: 'Edit this item', placement: 'top' }"
|
|
433
|
+
class="icon-button"
|
|
434
|
+
>
|
|
435
|
+
✏️
|
|
436
|
+
</button>
|
|
437
|
+
|
|
438
|
+
<button
|
|
439
|
+
v-tooltip="{ content: 'Share this item', placement: 'top' }"
|
|
440
|
+
class="icon-button"
|
|
441
|
+
>
|
|
442
|
+
📤
|
|
443
|
+
</button>
|
|
444
|
+
</div>
|
|
445
|
+
</div>
|
|
446
|
+
</template>
|
|
447
|
+
|
|
448
|
+
<style module>
|
|
449
|
+
.icon-examples {
|
|
450
|
+
padding: 2rem;
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
.icon-group {
|
|
454
|
+
display: flex;
|
|
455
|
+
gap: 1rem;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
.icon-button {
|
|
459
|
+
width: 40px;
|
|
460
|
+
height: 40px;
|
|
461
|
+
border: none;
|
|
462
|
+
border-radius: 50%;
|
|
463
|
+
background-color: #f8f9fa;
|
|
464
|
+
cursor: pointer;
|
|
465
|
+
display: flex;
|
|
466
|
+
align-items: center;
|
|
467
|
+
justify-content: center;
|
|
468
|
+
font-size: 1.2rem;
|
|
469
|
+
transition: background-color 0.2s;
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
.icon-button:hover {
|
|
473
|
+
background-color: #e9ecef;
|
|
474
|
+
}
|
|
475
|
+
</style>
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
### Dynamic Tooltips
|
|
479
|
+
|
|
480
|
+
```vue
|
|
481
|
+
<script setup lang="ts">
|
|
482
|
+
import { ref, computed } from "vue";
|
|
483
|
+
import { vTooltip } from "@umbra-ui/core";
|
|
484
|
+
|
|
485
|
+
const user = ref({
|
|
486
|
+
name: "John Doe",
|
|
487
|
+
email: "john@example.com",
|
|
488
|
+
role: "Administrator",
|
|
489
|
+
});
|
|
490
|
+
|
|
491
|
+
const tooltipConfig = computed(() => ({
|
|
492
|
+
content: `Name: ${user.value.name}\nEmail: ${user.value.email}\nRole: ${user.value.role}`,
|
|
493
|
+
placement: "right" as const,
|
|
494
|
+
delay: 300,
|
|
495
|
+
}));
|
|
496
|
+
|
|
497
|
+
const updateUser = () => {
|
|
498
|
+
user.value.name = "Jane Smith";
|
|
499
|
+
user.value.email = "jane@example.com";
|
|
500
|
+
user.value.role = "Editor";
|
|
501
|
+
};
|
|
502
|
+
</script>
|
|
503
|
+
|
|
504
|
+
<template>
|
|
505
|
+
<div class="dynamic-example">
|
|
506
|
+
<h3>User Profile</h3>
|
|
507
|
+
|
|
508
|
+
<div class="user-card">
|
|
509
|
+
<div v-tooltip="tooltipConfig" class="user-avatar">
|
|
510
|
+
{{ user.name.charAt(0) }}
|
|
511
|
+
</div>
|
|
512
|
+
|
|
513
|
+
<div class="user-info">
|
|
514
|
+
<h4>{{ user.name }}</h4>
|
|
515
|
+
<p>{{ user.email }}</p>
|
|
516
|
+
<p>{{ user.role }}</p>
|
|
517
|
+
</div>
|
|
518
|
+
</div>
|
|
519
|
+
|
|
520
|
+
<button @click="updateUser">Update User</button>
|
|
521
|
+
</div>
|
|
522
|
+
</template>
|
|
523
|
+
|
|
524
|
+
<style module>
|
|
525
|
+
.dynamic-example {
|
|
526
|
+
padding: 2rem;
|
|
527
|
+
max-width: 400px;
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
.user-card {
|
|
531
|
+
display: flex;
|
|
532
|
+
align-items: center;
|
|
533
|
+
gap: 1rem;
|
|
534
|
+
padding: 1rem;
|
|
535
|
+
border: 1px solid #e0e0e0;
|
|
536
|
+
border-radius: 8px;
|
|
537
|
+
margin-bottom: 1rem;
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
.user-avatar {
|
|
541
|
+
width: 50px;
|
|
542
|
+
height: 50px;
|
|
543
|
+
border-radius: 50%;
|
|
544
|
+
background-color: #007bff;
|
|
545
|
+
color: white;
|
|
546
|
+
display: flex;
|
|
547
|
+
align-items: center;
|
|
548
|
+
justify-content: center;
|
|
549
|
+
font-size: 1.5rem;
|
|
550
|
+
font-weight: bold;
|
|
551
|
+
cursor: help;
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
.user-info h4 {
|
|
555
|
+
margin: 0 0 0.5rem 0;
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
.user-info p {
|
|
559
|
+
margin: 0 0 0.25rem 0;
|
|
560
|
+
color: #666;
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
button {
|
|
564
|
+
padding: 0.5rem 1rem;
|
|
565
|
+
background-color: #28a745;
|
|
566
|
+
color: white;
|
|
567
|
+
border: none;
|
|
568
|
+
border-radius: 4px;
|
|
569
|
+
cursor: pointer;
|
|
570
|
+
}
|
|
571
|
+
</style>
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
### Composable Usage
|
|
575
|
+
|
|
576
|
+
```vue
|
|
577
|
+
<script setup lang="ts">
|
|
578
|
+
import { ref, onMounted } from "vue";
|
|
579
|
+
import { useTooltip } from "@umbra-ui/core";
|
|
580
|
+
|
|
581
|
+
const buttonRef = ref<HTMLElement>();
|
|
582
|
+
const inputRef = ref<HTMLElement>();
|
|
583
|
+
|
|
584
|
+
const { bindTooltip: bindButtonTooltip } = useTooltip({
|
|
585
|
+
content: "This button was configured using the composable",
|
|
586
|
+
placement: "top",
|
|
587
|
+
delay: 500,
|
|
588
|
+
});
|
|
589
|
+
|
|
590
|
+
const { bindTooltip: bindInputTooltip } = useTooltip({
|
|
591
|
+
content: "Enter your search query here",
|
|
592
|
+
placement: "bottom",
|
|
593
|
+
delay: 200,
|
|
594
|
+
});
|
|
595
|
+
|
|
596
|
+
onMounted(() => {
|
|
597
|
+
if (buttonRef.value) {
|
|
598
|
+
bindButtonTooltip(buttonRef.value);
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
if (inputRef.value) {
|
|
602
|
+
bindInputTooltip(inputRef.value);
|
|
603
|
+
}
|
|
604
|
+
});
|
|
605
|
+
</script>
|
|
606
|
+
|
|
607
|
+
<template>
|
|
608
|
+
<div class="composable-example">
|
|
609
|
+
<h3>Composable Usage</h3>
|
|
610
|
+
|
|
611
|
+
<button ref="buttonRef">Composable Button</button>
|
|
612
|
+
|
|
613
|
+
<input ref="inputRef" placeholder="Search..." />
|
|
614
|
+
</div>
|
|
615
|
+
</template>
|
|
616
|
+
|
|
617
|
+
<style module>
|
|
618
|
+
.composable-example {
|
|
619
|
+
padding: 2rem;
|
|
620
|
+
display: flex;
|
|
621
|
+
flex-direction: column;
|
|
622
|
+
gap: 1rem;
|
|
623
|
+
max-width: 300px;
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
button {
|
|
627
|
+
padding: 0.5rem 1rem;
|
|
628
|
+
background-color: #dc3545;
|
|
629
|
+
color: white;
|
|
630
|
+
border: none;
|
|
631
|
+
border-radius: 4px;
|
|
632
|
+
cursor: pointer;
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
input {
|
|
636
|
+
padding: 0.5rem;
|
|
637
|
+
border: 1px solid #ddd;
|
|
638
|
+
border-radius: 4px;
|
|
639
|
+
font-size: 1rem;
|
|
640
|
+
}
|
|
641
|
+
</style>
|
|
642
|
+
```
|
|
643
|
+
|
|
644
|
+
### Disabled State Handling
|
|
645
|
+
|
|
646
|
+
```vue
|
|
647
|
+
<script setup lang="ts">
|
|
648
|
+
import { ref } from "vue";
|
|
649
|
+
import { vTooltip } from "@umbra-ui/core";
|
|
650
|
+
|
|
651
|
+
const isDisabled = ref(false);
|
|
652
|
+
|
|
653
|
+
const toggleDisabled = () => {
|
|
654
|
+
isDisabled.value = !isDisabled.value;
|
|
655
|
+
};
|
|
656
|
+
</script>
|
|
657
|
+
|
|
658
|
+
<template>
|
|
659
|
+
<div class="disabled-example">
|
|
660
|
+
<h3>Disabled State</h3>
|
|
661
|
+
|
|
662
|
+
<button
|
|
663
|
+
:disabled="isDisabled"
|
|
664
|
+
v-tooltip="
|
|
665
|
+
isDisabled
|
|
666
|
+
? 'This button is currently disabled'
|
|
667
|
+
: 'This button is enabled'
|
|
668
|
+
"
|
|
669
|
+
>
|
|
670
|
+
{{ isDisabled ? "Disabled" : "Enabled" }}
|
|
671
|
+
</button>
|
|
672
|
+
|
|
673
|
+
<button @click="toggleDisabled">Toggle State</button>
|
|
674
|
+
</div>
|
|
675
|
+
</template>
|
|
676
|
+
|
|
677
|
+
<style module>
|
|
678
|
+
.disabled-example {
|
|
679
|
+
padding: 2rem;
|
|
680
|
+
display: flex;
|
|
681
|
+
flex-direction: column;
|
|
682
|
+
gap: 1rem;
|
|
683
|
+
max-width: 200px;
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
button {
|
|
687
|
+
padding: 0.5rem 1rem;
|
|
688
|
+
border: none;
|
|
689
|
+
border-radius: 4px;
|
|
690
|
+
cursor: pointer;
|
|
691
|
+
font-size: 1rem;
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
button:first-child {
|
|
695
|
+
background-color: #007bff;
|
|
696
|
+
color: white;
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
button:first-child:disabled {
|
|
700
|
+
background-color: #6c757d;
|
|
701
|
+
cursor: not-allowed;
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
button:last-child {
|
|
705
|
+
background-color: #28a745;
|
|
706
|
+
color: white;
|
|
707
|
+
}
|
|
708
|
+
</style>
|
|
709
|
+
```
|
|
710
|
+
|
|
711
|
+
## Notes
|
|
712
|
+
|
|
713
|
+
- The tooltip system uses Vue's `Teleport` to render tooltips outside the component tree for proper z-index layering
|
|
714
|
+
- Tooltips include smooth fade transitions for a polished user experience
|
|
715
|
+
- The system uses Floating UI for smart positioning with automatic collision detection
|
|
716
|
+
- Tooltips automatically flip and shift to stay within viewport boundaries
|
|
717
|
+
- The system supports both directive and composable usage patterns
|
|
718
|
+
- Tooltips are fully accessible and support keyboard navigation
|
|
719
|
+
- The global tooltip state ensures only one tooltip is visible at a time
|
|
720
|
+
- The system includes proper cleanup to prevent memory leaks
|
|
721
|
+
- Tooltips support both light and dark themes through CSS custom properties
|
|
722
|
+
- The directive automatically handles element lifecycle and cleanup
|
|
723
|
+
- Custom delays and offsets provide fine-grained control over tooltip behavior
|