@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.
Files changed (272) hide show
  1. package/dist/components/controls/Dropdown/types.d.ts +5 -0
  2. package/dist/components/controls/Dropdown/types.d.ts.map +1 -0
  3. package/dist/components/controls/Dropdown/types.js +1 -0
  4. package/dist/components/controls/SegmentedControl/types.d.ts +6 -0
  5. package/dist/components/controls/SegmentedControl/types.d.ts.map +1 -0
  6. package/dist/components/controls/SegmentedControl/types.js +1 -0
  7. package/dist/components/dialogs/Alert/types.d.ts +7 -0
  8. package/dist/components/dialogs/Alert/types.d.ts.map +1 -0
  9. package/dist/components/dialogs/Alert/types.js +1 -0
  10. package/dist/components/dialogs/Toast/types.d.ts +34 -0
  11. package/dist/components/dialogs/Toast/types.d.ts.map +1 -0
  12. package/dist/components/dialogs/Toast/types.js +10 -0
  13. package/dist/components/dialogs/Toast/useToast.d.ts +36 -0
  14. package/dist/components/dialogs/Toast/useToast.d.ts.map +1 -0
  15. package/dist/components/dialogs/Toast/useToast.js +90 -0
  16. package/dist/components/indicators/Tooltip/tooltip.d.ts +3 -0
  17. package/dist/components/indicators/Tooltip/tooltip.d.ts.map +1 -0
  18. package/dist/components/indicators/Tooltip/tooltip.js +33 -0
  19. package/dist/components/indicators/Tooltip/types.d.ts +14 -0
  20. package/dist/components/indicators/Tooltip/types.d.ts.map +1 -0
  21. package/dist/components/indicators/Tooltip/types.js +1 -0
  22. package/dist/components/indicators/Tooltip/useTooltip.d.ts +18 -0
  23. package/dist/components/indicators/Tooltip/useTooltip.d.ts.map +1 -0
  24. package/dist/components/indicators/Tooltip/useTooltip.js +57 -0
  25. package/dist/components/inputs/Tags/tag-bar-styles.d.ts +14 -0
  26. package/dist/components/inputs/Tags/tag-bar-styles.d.ts.map +1 -0
  27. package/dist/components/inputs/Tags/tag-bar-styles.js +313 -0
  28. package/dist/components/inputs/Tags/types.d.ts +93 -0
  29. package/dist/components/inputs/Tags/types.d.ts.map +1 -0
  30. package/dist/components/inputs/Tags/types.js +216 -0
  31. package/dist/components/inputs/search/types.d.ts +9 -0
  32. package/dist/components/inputs/search/types.d.ts.map +1 -0
  33. package/dist/components/inputs/search/types.js +1 -0
  34. package/dist/components/navigation/adaptive/types.d.ts +16 -0
  35. package/dist/components/navigation/adaptive/types.d.ts.map +1 -0
  36. package/dist/components/navigation/adaptive/types.js +1 -0
  37. package/dist/components/navigation/adaptive/useAdaptiveLayout.d.ts +27 -0
  38. package/dist/components/navigation/adaptive/useAdaptiveLayout.d.ts.map +1 -0
  39. package/dist/components/navigation/adaptive/useAdaptiveLayout.js +40 -0
  40. package/dist/components/navigation/adaptive/useBreakpoints.d.ts +6 -0
  41. package/dist/components/navigation/adaptive/useBreakpoints.d.ts.map +1 -0
  42. package/dist/components/navigation/adaptive/useBreakpoints.js +37 -0
  43. package/dist/components/navigation/adaptive/useContainerMonitor.d.ts +93 -0
  44. package/dist/components/navigation/adaptive/useContainerMonitor.d.ts.map +1 -0
  45. package/dist/components/navigation/adaptive/useContainerMonitor.js +145 -0
  46. package/dist/components/navigation/adaptive/useViewAnimation.d.ts +31 -0
  47. package/dist/components/navigation/adaptive/useViewAnimation.d.ts.map +1 -0
  48. package/dist/components/navigation/adaptive/useViewAnimation.js +591 -0
  49. package/dist/components/navigation/adaptive/useViewResize.d.ts +52 -0
  50. package/dist/components/navigation/adaptive/useViewResize.d.ts.map +1 -0
  51. package/dist/components/navigation/adaptive/useViewResize.js +146 -0
  52. package/dist/components/navigation/navstack/useNavigationStack.d.ts +25 -0
  53. package/dist/components/navigation/navstack/useNavigationStack.d.ts.map +1 -0
  54. package/dist/components/navigation/navstack/useNavigationStack.js +133 -0
  55. package/dist/components/navigation/slideover/useSlideoverController.d.ts +20 -0
  56. package/dist/components/navigation/slideover/useSlideoverController.d.ts.map +1 -0
  57. package/dist/components/navigation/slideover/useSlideoverController.js +267 -0
  58. package/dist/components/navigation/splitview/useSplitViewController.d.ts +20 -0
  59. package/dist/components/navigation/splitview/useSplitViewController.d.ts.map +1 -0
  60. package/dist/components/navigation/splitview/useSplitViewController.js +325 -0
  61. package/dist/components/navigation/tabcontroller/types.d.ts +21 -0
  62. package/dist/components/navigation/tabcontroller/types.d.ts.map +1 -0
  63. package/dist/components/navigation/tabcontroller/types.js +1 -0
  64. package/dist/components/navigation/tabcontroller/useTabController.d.ts +5 -0
  65. package/dist/components/navigation/tabcontroller/useTabController.d.ts.map +1 -0
  66. package/dist/components/navigation/tabcontroller/useTabController.js +10 -0
  67. package/dist/components/navigation/types.d.ts +8 -0
  68. package/dist/components/navigation/types.d.ts.map +1 -0
  69. package/dist/components/navigation/types.js +1 -0
  70. package/dist/components/pickers/CollectionPicker/types.d.ts +11 -0
  71. package/dist/components/pickers/CollectionPicker/types.d.ts.map +1 -0
  72. package/dist/components/pickers/CollectionPicker/types.js +1 -0
  73. package/dist/components/pickers/ColorPicker/colors.d.ts +13 -0
  74. package/dist/components/pickers/ColorPicker/colors.d.ts.map +1 -0
  75. package/dist/components/pickers/ColorPicker/colors.js +266 -0
  76. package/dist/components/pickers/FilePicker/types.d.ts +10 -0
  77. package/dist/components/pickers/FilePicker/types.d.ts.map +1 -0
  78. package/dist/components/pickers/FilePicker/types.js +1 -0
  79. package/dist/index.d.ts +91 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +196 -0
  82. package/dist/theme.d.ts +73 -0
  83. package/dist/theme.d.ts.map +1 -0
  84. package/dist/theme.js +279 -0
  85. package/dist/themes/blank.d.ts +7 -0
  86. package/dist/themes/blank.d.ts.map +1 -0
  87. package/dist/themes/blank.js +543 -0
  88. package/dist/themes/crimson-dark.d.ts +4 -0
  89. package/dist/themes/crimson-dark.d.ts.map +1 -0
  90. package/dist/themes/crimson-dark.js +552 -0
  91. package/dist/themes/cyan-light.d.ts +4 -0
  92. package/dist/themes/cyan-light.d.ts.map +1 -0
  93. package/dist/themes/cyan-light.js +552 -0
  94. package/dist/themes/dark.d.ts +4 -0
  95. package/dist/themes/dark.d.ts.map +1 -0
  96. package/dist/themes/dark.js +551 -0
  97. package/dist/themes/gold-dark.d.ts +4 -0
  98. package/dist/themes/gold-dark.d.ts.map +1 -0
  99. package/dist/themes/gold-dark.js +552 -0
  100. package/dist/themes/grass-dark.d.ts +4 -0
  101. package/dist/themes/grass-dark.d.ts.map +1 -0
  102. package/dist/themes/grass-dark.js +552 -0
  103. package/dist/themes/indigo.d.ts +4 -0
  104. package/dist/themes/indigo.d.ts.map +1 -0
  105. package/dist/themes/indigo.js +552 -0
  106. package/dist/themes/light.d.ts +4 -0
  107. package/dist/themes/light.d.ts.map +1 -0
  108. package/dist/themes/light.js +551 -0
  109. package/dist/themes/orange-dark.d.ts +4 -0
  110. package/dist/themes/orange-dark.d.ts.map +1 -0
  111. package/dist/themes/orange-dark.js +551 -0
  112. package/dist/themes/orange-light.d.ts +4 -0
  113. package/dist/themes/orange-light.d.ts.map +1 -0
  114. package/dist/themes/orange-light.js +551 -0
  115. package/package.json +62 -0
  116. package/src/components/controls/Button/Button.vue +417 -0
  117. package/src/components/controls/Button/README.md +348 -0
  118. package/src/components/controls/Button/theme.css +200 -0
  119. package/src/components/controls/Checkbox/Checkbox.vue +164 -0
  120. package/src/components/controls/Checkbox/README.md +441 -0
  121. package/src/components/controls/Checkbox/theme.css +36 -0
  122. package/src/components/controls/Dropdown/Dropdown.vue +476 -0
  123. package/src/components/controls/Dropdown/README.md +370 -0
  124. package/src/components/controls/Dropdown/theme.css +50 -0
  125. package/src/components/controls/Dropdown/types.ts +6 -0
  126. package/src/components/controls/IconButton/IconButton.vue +267 -0
  127. package/src/components/controls/IconButton/README.md +502 -0
  128. package/src/components/controls/IconButton/theme.css +89 -0
  129. package/src/components/controls/Radio/README.md +591 -0
  130. package/src/components/controls/Radio/Radio.vue +89 -0
  131. package/src/components/controls/Radio/theme.css +14 -0
  132. package/src/components/controls/RangeSlider/README.md +608 -0
  133. package/src/components/controls/RangeSlider/RangeSlider.vue +535 -0
  134. package/src/components/controls/RangeSlider/theme.css +80 -0
  135. package/src/components/controls/SegmentedControl/README.md +587 -0
  136. package/src/components/controls/SegmentedControl/SegmentedControl.vue +284 -0
  137. package/src/components/controls/SegmentedControl/theme.css +60 -0
  138. package/src/components/controls/SegmentedControl/types.ts +5 -0
  139. package/src/components/controls/Slider/README.md +627 -0
  140. package/src/components/controls/Slider/Slider.vue +260 -0
  141. package/src/components/controls/Slider/theme.css +74 -0
  142. package/src/components/controls/Stepper/README.md +601 -0
  143. package/src/components/controls/Stepper/Stepper.vue +103 -0
  144. package/src/components/controls/Stepper/theme.css +53 -0
  145. package/src/components/controls/Switch/README.md +667 -0
  146. package/src/components/controls/Switch/Switch.vue +127 -0
  147. package/src/components/controls/Switch/theme.css +42 -0
  148. package/src/components/dialogs/Alert/Alert.vue +218 -0
  149. package/src/components/dialogs/Alert/README.md +450 -0
  150. package/src/components/dialogs/Alert/theme.css +44 -0
  151. package/src/components/dialogs/Alert/types.ts +11 -0
  152. package/src/components/dialogs/Toast/README.md +522 -0
  153. package/src/components/dialogs/Toast/Toast.vue +296 -0
  154. package/src/components/dialogs/Toast/ToastContainer.vue +330 -0
  155. package/src/components/dialogs/Toast/theme.css +44 -0
  156. package/src/components/dialogs/Toast/types.ts +46 -0
  157. package/src/components/dialogs/Toast/useToast.ts +127 -0
  158. package/src/components/indicators/ProgressBar/ProgressBar.vue +98 -0
  159. package/src/components/indicators/ProgressBar/README.md +744 -0
  160. package/src/components/indicators/ProgressBar/theme.css +36 -0
  161. package/src/components/indicators/Tooltip/README.md +723 -0
  162. package/src/components/indicators/Tooltip/TooltipProvider.vue +142 -0
  163. package/src/components/indicators/Tooltip/theme.css +18 -0
  164. package/src/components/indicators/Tooltip/tooltip.ts +48 -0
  165. package/src/components/indicators/Tooltip/types.ts +15 -0
  166. package/src/components/indicators/Tooltip/useTooltip.ts +71 -0
  167. package/src/components/inputs/AutogrowTextView/AutogrowTextView.vue +110 -0
  168. package/src/components/inputs/AutogrowTextView/README.md +643 -0
  169. package/src/components/inputs/AutogrowTextView/theme.css +28 -0
  170. package/src/components/inputs/InputCard/InputCard.vue +600 -0
  171. package/src/components/inputs/InputCard/README.md +636 -0
  172. package/src/components/inputs/InputEmail/InputEmail.vue +698 -0
  173. package/src/components/inputs/InputEmail/README.md +764 -0
  174. package/src/components/inputs/InputNumber/InputNumber.vue +300 -0
  175. package/src/components/inputs/InputNumber/README.md +749 -0
  176. package/src/components/inputs/InputPhone/InputPhone.vue +645 -0
  177. package/src/components/inputs/InputPhone/README.md +636 -0
  178. package/src/components/inputs/InputSecure/InputSecure.vue +646 -0
  179. package/src/components/inputs/InputSecure/README.md +771 -0
  180. package/src/components/inputs/InputText/InputText.vue +225 -0
  181. package/src/components/inputs/InputText/README.md +844 -0
  182. package/src/components/inputs/OTP/OTP.vue +349 -0
  183. package/src/components/inputs/OTP/README.md +736 -0
  184. package/src/components/inputs/OTP/theme.css +50 -0
  185. package/src/components/inputs/StringCapture/README.md +718 -0
  186. package/src/components/inputs/StringCapture/StringCapture.vue +315 -0
  187. package/src/components/inputs/StringCapture/theme.css +86 -0
  188. package/src/components/inputs/Tags/README.md +897 -0
  189. package/src/components/inputs/Tags/TagBar.vue +793 -0
  190. package/src/components/inputs/Tags/TagCreation.vue +219 -0
  191. package/src/components/inputs/Tags/TagPicker.vue +380 -0
  192. package/src/components/inputs/Tags/tag-bar-styles.ts +354 -0
  193. package/src/components/inputs/Tags/theme.css +121 -0
  194. package/src/components/inputs/Tags/types.ts +346 -0
  195. package/src/components/inputs/search/README.md +759 -0
  196. package/src/components/inputs/search/SearchBar.vue +394 -0
  197. package/src/components/inputs/search/SearchResults.vue +310 -0
  198. package/src/components/inputs/search/theme.css +187 -0
  199. package/src/components/inputs/search/types.ts +8 -0
  200. package/src/components/inputs/theme.css +102 -0
  201. package/src/components/menus/ActionMenu/ActionMenu.vue +383 -0
  202. package/src/components/menus/ActionMenu/README.md +825 -0
  203. package/src/components/menus/ActionMenu/theme.css +93 -0
  204. package/src/components/models/Popover/Popover.vue +551 -0
  205. package/src/components/models/Popover/README.md +885 -0
  206. package/src/components/models/Popover/theme.css +52 -0
  207. package/src/components/models/Sheet/README.md +1159 -0
  208. package/src/components/models/Sheet/Sheet.vue +465 -0
  209. package/src/components/models/Sheet/theme.css +72 -0
  210. package/src/components/models/Sidebar/README.md +1228 -0
  211. package/src/components/models/Sidebar/Sidebar.vue +480 -0
  212. package/src/components/models/Sidebar/theme.css +90 -0
  213. package/src/components/navigation/adaptive/AdaptiveLayout.vue +779 -0
  214. package/src/components/navigation/adaptive/AdaptiveLayoutBreadcrumbs.vue +192 -0
  215. package/src/components/navigation/adaptive/AdaptiveLayoutMenuButton.vue +149 -0
  216. package/src/components/navigation/adaptive/README.md +768 -0
  217. package/src/components/navigation/adaptive/types.ts +19 -0
  218. package/src/components/navigation/adaptive/useAdaptiveLayout.ts +89 -0
  219. package/src/components/navigation/adaptive/useBreakpoints.ts +41 -0
  220. package/src/components/navigation/adaptive/useContainerMonitor.ts +214 -0
  221. package/src/components/navigation/adaptive/useViewAnimation.ts +721 -0
  222. package/src/components/navigation/adaptive/useViewResize.ts +211 -0
  223. package/src/components/navigation/navstack/NavigationStack.vue +180 -0
  224. package/src/components/navigation/navstack/README.md +994 -0
  225. package/src/components/navigation/navstack/useNavigationStack.ts +164 -0
  226. package/src/components/navigation/slideover/README.md +1275 -0
  227. package/src/components/navigation/slideover/SlideoverController.vue +287 -0
  228. package/src/components/navigation/slideover/useSlideoverController.ts +320 -0
  229. package/src/components/navigation/splitview/README.md +1115 -0
  230. package/src/components/navigation/splitview/SplitViewController.vue +176 -0
  231. package/src/components/navigation/splitview/useSplitViewController.ts +388 -0
  232. package/src/components/navigation/tabcontroller/README.md +919 -0
  233. package/src/components/navigation/tabcontroller/TabController.vue +307 -0
  234. package/src/components/navigation/tabcontroller/TabItem.vue +57 -0
  235. package/src/components/navigation/tabcontroller/types.ts +24 -0
  236. package/src/components/navigation/tabcontroller/useTabController.ts +18 -0
  237. package/src/components/navigation/theme.css +91 -0
  238. package/src/components/navigation/types.ts +7 -0
  239. package/src/components/pickers/CollectionPicker/CollectionPicker.vue +398 -0
  240. package/src/components/pickers/CollectionPicker/README.md +1115 -0
  241. package/src/components/pickers/CollectionPicker/theme.css +14 -0
  242. package/src/components/pickers/CollectionPicker/types.ts +11 -0
  243. package/src/components/pickers/ColorPicker/ColorPicker.vue +376 -0
  244. package/src/components/pickers/ColorPicker/README.md +1439 -0
  245. package/src/components/pickers/ColorPicker/colors.ts +299 -0
  246. package/src/components/pickers/ColorPicker/theme.css +32 -0
  247. package/src/components/pickers/DatePicker/DatePicker.vue +660 -0
  248. package/src/components/pickers/DatePicker/README.md +1195 -0
  249. package/src/components/pickers/DatePicker/theme.css +22 -0
  250. package/src/components/pickers/FilePicker/FilePicker.vue +534 -0
  251. package/src/components/pickers/FilePicker/README.md +1542 -0
  252. package/src/components/pickers/FilePicker/theme.css +48 -0
  253. package/src/components/pickers/FilePicker/types.ts +10 -0
  254. package/src/components/pickers/IconPicker/IconPicker.vue +327 -0
  255. package/src/components/pickers/IconPicker/README.md +1161 -0
  256. package/src/components/pickers/IconPicker/theme.css +28 -0
  257. package/src/components/pickers/theme.css +82 -0
  258. package/src/components/views/MarkdownViewer/MarkdownViewer.vue +442 -0
  259. package/src/components/views/MarkdownViewer/README.md +833 -0
  260. package/src/components/views/MarkdownViewer/theme.css +130 -0
  261. package/src/index.ts +263 -0
  262. package/src/theme.ts +378 -0
  263. package/src/themes/crimson-dark.ts +556 -0
  264. package/src/themes/cyan-light.ts +556 -0
  265. package/src/themes/dark.ts +557 -0
  266. package/src/themes/gold-dark.ts +556 -0
  267. package/src/themes/grass-dark.ts +556 -0
  268. package/src/themes/indigo.ts +556 -0
  269. package/src/themes/light.ts +557 -0
  270. package/src/themes/orange-dark.ts +557 -0
  271. package/src/themes/orange-light.ts +557 -0
  272. 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