@meistrari/tela-build 1.0.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 (295) hide show
  1. package/README.md +75 -0
  2. package/app.config.ts +73 -0
  3. package/components/tela/animated/animated-calculating-number.vue +16 -0
  4. package/components/tela/animated/animated-number.mdx +248 -0
  5. package/components/tela/animated/animated-number.stories.ts +52 -0
  6. package/components/tela/animated/animated-number.vue +23 -0
  7. package/components/tela/animated/animated-text.vue +124 -0
  8. package/components/tela/animated/animated-value.vue +68 -0
  9. package/components/tela/avatar/avatar.mdx +117 -0
  10. package/components/tela/avatar/avatar.stories.ts +62 -0
  11. package/components/tela/avatar/avatar.vue +71 -0
  12. package/components/tela/avatar/group/avatar-group.stories.ts +78 -0
  13. package/components/tela/avatar/group/avatar-group.vue +46 -0
  14. package/components/tela/badge/badge.mdx +154 -0
  15. package/components/tela/badge/badge.stories.ts +82 -0
  16. package/components/tela/badge/badge.vue +41 -0
  17. package/components/tela/button/button.mdx +155 -0
  18. package/components/tela/button/button.stories.ts +202 -0
  19. package/components/tela/button/button.vue +107 -0
  20. package/components/tela/card.vue +30 -0
  21. package/components/tela/chart/chart-bar.vue +58 -0
  22. package/components/tela/chat/chat.mdx +268 -0
  23. package/components/tela/chat/chat.stories.ts +253 -0
  24. package/components/tela/chat/command/index.vue +41 -0
  25. package/components/tela/chat/command/mention/index.vue +138 -0
  26. package/components/tela/chat/index.vue +112 -0
  27. package/components/tela/chat/pure-text-input/chat-text-input.vue +190 -0
  28. package/components/tela/chat/text-input/chat-text-input.stories.ts +128 -0
  29. package/components/tela/chat/text-input/index.vue +217 -0
  30. package/components/tela/chat/text-message/chat-text-message.stories.ts +138 -0
  31. package/components/tela/chat/text-message/index.vue +355 -0
  32. package/components/tela/chat/types.ts +19 -0
  33. package/components/tela/checkbox/checkbox-card.vue +30 -0
  34. package/components/tela/checkbox/checkbox.mdx +164 -0
  35. package/components/tela/checkbox/checkbox.stories.ts +104 -0
  36. package/components/tela/checkbox/checkbox.vue +43 -0
  37. package/components/tela/collapsible/Collapsible.vue +15 -0
  38. package/components/tela/collapsible/CollapsibleContent.vue +59 -0
  39. package/components/tela/collapsible/CollapsibleTrigger.vue +12 -0
  40. package/components/tela/collapsible/collapsible.mdx +157 -0
  41. package/components/tela/collapsible-section/collapsible-section.mdx +180 -0
  42. package/components/tela/collapsible-section/collapsible-section.stories.ts +53 -0
  43. package/components/tela/collapsible-section/collapsible-section.vue +51 -0
  44. package/components/tela/collapsible-section-with-actions.vue +98 -0
  45. package/components/tela/combobox/combobox-anchor.vue +24 -0
  46. package/components/tela/combobox/combobox-empty.vue +19 -0
  47. package/components/tela/combobox/combobox-group.vue +24 -0
  48. package/components/tela/combobox/combobox-indicator.vue +22 -0
  49. package/components/tela/combobox/combobox-input.vue +31 -0
  50. package/components/tela/combobox/combobox-item.vue +28 -0
  51. package/components/tela/combobox/combobox-label.vue +24 -0
  52. package/components/tela/combobox/combobox-list.vue +90 -0
  53. package/components/tela/combobox/combobox-module-selector.vue +366 -0
  54. package/components/tela/combobox/combobox-root.vue +15 -0
  55. package/components/tela/combobox/combobox-trigger.vue +12 -0
  56. package/components/tela/combobox/combobox.mdx +285 -0
  57. package/components/tela/combobox/combobox.stories.ts +232 -0
  58. package/components/tela/combobox/combobox.vue +497 -0
  59. package/components/tela/command/command-dialog.vue +22 -0
  60. package/components/tela/command/command-empty.vue +25 -0
  61. package/components/tela/command/command-group.vue +46 -0
  62. package/components/tela/command/command-input.vue +38 -0
  63. package/components/tela/command/command-item.vue +78 -0
  64. package/components/tela/command/command-list.vue +78 -0
  65. package/components/tela/command/command-separator.vue +23 -0
  66. package/components/tela/command/command-shortcut.vue +13 -0
  67. package/components/tela/command/command.vue +88 -0
  68. package/components/tela/command/dialog-base.vue +15 -0
  69. package/components/tela/command/dialog-content.vue +50 -0
  70. package/components/tela/command/utils.ts +15 -0
  71. package/components/tela/complex-table/complex-table-cell.stories.ts +145 -0
  72. package/components/tela/complex-table/complex-table-cell.vue +45 -0
  73. package/components/tela/complex-table/complex-table-header-cell.stories.ts +103 -0
  74. package/components/tela/complex-table/complex-table-header-cell.vue +48 -0
  75. package/components/tela/complex-table/complex-table-header.stories.ts +89 -0
  76. package/components/tela/complex-table/complex-table-header.vue +70 -0
  77. package/components/tela/complex-table/complex-table-row.vue +199 -0
  78. package/components/tela/complex-table/complex-table-virtualized.vue +326 -0
  79. package/components/tela/complex-table/complex-table.stories.ts +358 -0
  80. package/components/tela/complex-table/complex-table.vue +237 -0
  81. package/components/tela/complex-table/composables/table-common.ts +93 -0
  82. package/components/tela/complex-table/composables/table-selection.ts +87 -0
  83. package/components/tela/complex-table/composables/virtual-scroll.ts +252 -0
  84. package/components/tela/complex-table/styles/table-shared.css +170 -0
  85. package/components/tela/complex-table/types.ts +63 -0
  86. package/components/tela/complex-table/utils.ts +35 -0
  87. package/components/tela/confirm-button/confirm-button.vue +137 -0
  88. package/components/tela/confirmation-modal/confirmation-modal.vue +72 -0
  89. package/components/tela/copy-button.vue +86 -0
  90. package/components/tela/date-range-picker.vue +221 -0
  91. package/components/tela/dialog/dialog.mdx +170 -0
  92. package/components/tela/dialog/dialog.vue +182 -0
  93. package/components/tela/disabled-area.vue +16 -0
  94. package/components/tela/disclaimer/disclaimer.mdx +238 -0
  95. package/components/tela/disclaimer/disclaimer.stories.ts +196 -0
  96. package/components/tela/disclaimer/disclaimer.vue +125 -0
  97. package/components/tela/dropdown-menu/DropdownMenu.vue +121 -0
  98. package/components/tela/dropdown-menu/DropdownMenuCheckboxItem.vue +40 -0
  99. package/components/tela/dropdown-menu/DropdownMenuContent.vue +75 -0
  100. package/components/tela/dropdown-menu/DropdownMenuGroup.vue +12 -0
  101. package/components/tela/dropdown-menu/DropdownMenuItem.vue +137 -0
  102. package/components/tela/dropdown-menu/DropdownMenuLabel.vue +26 -0
  103. package/components/tela/dropdown-menu/DropdownMenuRadioGroup.vue +18 -0
  104. package/components/tela/dropdown-menu/DropdownMenuRadioItem.vue +40 -0
  105. package/components/tela/dropdown-menu/DropdownMenuRoot.vue +15 -0
  106. package/components/tela/dropdown-menu/DropdownMenuSeparator.vue +21 -0
  107. package/components/tela/dropdown-menu/DropdownMenuShortcut.vue +14 -0
  108. package/components/tela/dropdown-menu/DropdownMenuSub.vue +18 -0
  109. package/components/tela/dropdown-menu/DropdownMenuSubContent.vue +30 -0
  110. package/components/tela/dropdown-menu/DropdownMenuSubTrigger.vue +35 -0
  111. package/components/tela/dropdown-menu/DropdownMenuTrigger.vue +14 -0
  112. package/components/tela/dropdown-menu/dropdown-menu.mdx +265 -0
  113. package/components/tela/dropdown-menu/dropdown-menu.stories.ts +156 -0
  114. package/components/tela/expandable-input.vue +96 -0
  115. package/components/tela/file-drop.vue +37 -0
  116. package/components/tela/file-upload/file-upload.mdx +189 -0
  117. package/components/tela/file-upload/file-upload.stories.ts +48 -0
  118. package/components/tela/file-upload/file-upload.vue +205 -0
  119. package/components/tela/filters/checkbox-filter.stories.ts +218 -0
  120. package/components/tela/filters/checkbox-filter.vue +165 -0
  121. package/components/tela/filters/date-filter.stories.ts +258 -0
  122. package/components/tela/filters/date-filter.vue +200 -0
  123. package/components/tela/filters/user-filter.stories.ts +344 -0
  124. package/components/tela/filters/user-filter.vue +271 -0
  125. package/components/tela/hover-card/hover-card.mdx +221 -0
  126. package/components/tela/hover-card/hover-card.stories.ts +87 -0
  127. package/components/tela/hover-card/hover-card.vue +61 -0
  128. package/components/tela/icon/custom.vue +319 -0
  129. package/components/tela/icon/spinner.vue +12 -0
  130. package/components/tela/icon-button/icon-button.vue +114 -0
  131. package/components/tela/icon.vue +37 -0
  132. package/components/tela/initials.vue +28 -0
  133. package/components/tela/inline-input.vue +77 -0
  134. package/components/tela/input/input.mdx +182 -0
  135. package/components/tela/input/input.stories.ts +153 -0
  136. package/components/tela/input/tela-input.vue +240 -0
  137. package/components/tela/kbd/kbd-return.vue +6 -0
  138. package/components/tela/kbd/kbd.mdx +238 -0
  139. package/components/tela/kbd/kbd.vue +18 -0
  140. package/components/tela/label/label.mdx +121 -0
  141. package/components/tela/label/label.stories.ts +37 -0
  142. package/components/tela/label/label.vue +25 -0
  143. package/components/tela/link-decoration/link-decoration.vue +19 -0
  144. package/components/tela/live-label.vue +32 -0
  145. package/components/tela/long-press-button.vue +98 -0
  146. package/components/tela/menubar/menubar-content.vue +77 -0
  147. package/components/tela/menubar/menubar-item.vue +32 -0
  148. package/components/tela/menubar/menubar-label.vue +14 -0
  149. package/components/tela/menubar/menubar-menu.vue +12 -0
  150. package/components/tela/menubar/menubar-root.vue +30 -0
  151. package/components/tela/menubar/menubar-separator.vue +17 -0
  152. package/components/tela/menubar/menubar-shortcut.vue +14 -0
  153. package/components/tela/menubar/menubar-sub-content.vue +36 -0
  154. package/components/tela/menubar/menubar-sub-trigger.vue +28 -0
  155. package/components/tela/menubar/menubar-sub.vue +20 -0
  156. package/components/tela/menubar/menubar-trigger.vue +27 -0
  157. package/components/tela/menubar/menubar.vue +298 -0
  158. package/components/tela/modal/modal.mdx +145 -0
  159. package/components/tela/modal/modal.vue +242 -0
  160. package/components/tela/multiple-select/multiple-select.mdx +274 -0
  161. package/components/tela/multiple-select/multiple-select.stories.ts +325 -0
  162. package/components/tela/multiple-select/multiple-select.vue +666 -0
  163. package/components/tela/pane.vue +110 -0
  164. package/components/tela/popover/popover-content.vue +48 -0
  165. package/components/tela/popover/popover-trigger.vue +12 -0
  166. package/components/tela/popover/popover.mdx +239 -0
  167. package/components/tela/popover/popover.stories.ts +150 -0
  168. package/components/tela/popover/popover.vue +15 -0
  169. package/components/tela/popover-list/popover-list-nested.vue +104 -0
  170. package/components/tela/popover-list/popover-list.stories.ts +330 -0
  171. package/components/tela/popover-list/popover-list.vue +191 -0
  172. package/components/tela/radio-button.vue +66 -0
  173. package/components/tela/radio-group/radio-group-item.vue +40 -0
  174. package/components/tela/radio-group/radio-group-root.vue +26 -0
  175. package/components/tela/radio-group/radio-group.mdx +78 -0
  176. package/components/tela/radio-group/radio-group.stories.ts +106 -0
  177. package/components/tela/radio-group/radio-group.vue +23 -0
  178. package/components/tela/range-calendar.stories.ts +110 -0
  179. package/components/tela/range-calendar.vue +109 -0
  180. package/components/tela/scroll-area/scroll-area.mdx +183 -0
  181. package/components/tela/scroll-area/scroll-area.vue +30 -0
  182. package/components/tela/scroll-area/scroll-bar.vue +31 -0
  183. package/components/tela/segment-toggle.stories.ts +114 -0
  184. package/components/tela/segment-toggle.vue +66 -0
  185. package/components/tela/select-menu/select-menu-content.vue +106 -0
  186. package/components/tela/select-menu/select-menu-down-button.vue +20 -0
  187. package/components/tela/select-menu/select-menu-group.vue +16 -0
  188. package/components/tela/select-menu/select-menu-item.vue +40 -0
  189. package/components/tela/select-menu/select-menu-root.vue +15 -0
  190. package/components/tela/select-menu/select-menu-trigger.vue +34 -0
  191. package/components/tela/select-menu/select-menu-up-button.vue +20 -0
  192. package/components/tela/select-menu/select-menu-value.vue +12 -0
  193. package/components/tela/select-menu/select-menu.mdx +221 -0
  194. package/components/tela/select-menu/select-menu.stories.ts +91 -0
  195. package/components/tela/select-menu/select-menu.vue +165 -0
  196. package/components/tela/selector/selector.vue +47 -0
  197. package/components/tela/sheet/sheet-close.vue +12 -0
  198. package/components/tela/sheet/sheet-content.vue +57 -0
  199. package/components/tela/sheet/sheet-description.vue +23 -0
  200. package/components/tela/sheet/sheet-footer.vue +18 -0
  201. package/components/tela/sheet/sheet-header.vue +15 -0
  202. package/components/tela/sheet/sheet-root.vue +18 -0
  203. package/components/tela/sheet/sheet-title.vue +23 -0
  204. package/components/tela/sheet/sheet-trigger.vue +12 -0
  205. package/components/tela/sheet/sheet.client.vue +150 -0
  206. package/components/tela/sheet/sheet.mdx +176 -0
  207. package/components/tela/sheet/sheet.stories.ts +201 -0
  208. package/components/tela/sheet/variants.ts +22 -0
  209. package/components/tela/side-sheet/side-sheet.mdx +131 -0
  210. package/components/tela/side-sheet/side-sheet.stories.ts +134 -0
  211. package/components/tela/side-sheet/side-sheet.vue +106 -0
  212. package/components/tela/skeleton/skeleton.mdx +165 -0
  213. package/components/tela/skeleton/skeleton.stories.ts +35 -0
  214. package/components/tela/skeleton/skeleton.vue +45 -0
  215. package/components/tela/skeleton-icon.vue +24 -0
  216. package/components/tela/span.vue +24 -0
  217. package/components/tela/star-button.vue +70 -0
  218. package/components/tela/status/status-lean.vue +30 -0
  219. package/components/tela/status/status.mdx +187 -0
  220. package/components/tela/status/status.stories.ts +160 -0
  221. package/components/tela/status/status.vue +420 -0
  222. package/components/tela/status-bar/status-bar.mdx +178 -0
  223. package/components/tela/status-bar/status-bar.stories.ts +64 -0
  224. package/components/tela/status-bar/status-bar.vue +56 -0
  225. package/components/tela/status-bar/types.ts +5 -0
  226. package/components/tela/switch/switch.mdx +118 -0
  227. package/components/tela/switch/switch.stories.ts +80 -0
  228. package/components/tela/switch/switch.vue +56 -0
  229. package/components/tela/table/table-body.vue +13 -0
  230. package/components/tela/table/table-caption.vue +13 -0
  231. package/components/tela/table/table-cell.vue +20 -0
  232. package/components/tela/table/table-empty.vue +37 -0
  233. package/components/tela/table/table-footer.vue +13 -0
  234. package/components/tela/table/table-head.vue +13 -0
  235. package/components/tela/table/table-header.vue +13 -0
  236. package/components/tela/table/table-row.vue +13 -0
  237. package/components/tela/table/table.mdx +230 -0
  238. package/components/tela/table/table.stories.ts +384 -0
  239. package/components/tela/table/table.vue +15 -0
  240. package/components/tela/tabs/tabs-content.vue +20 -0
  241. package/components/tela/tabs/tabs-indicator.vue +22 -0
  242. package/components/tela/tabs/tabs-list.vue +23 -0
  243. package/components/tela/tabs/tabs-root.vue +15 -0
  244. package/components/tela/tabs/tabs-trigger.vue +27 -0
  245. package/components/tela/tabs/tabs.mdx +138 -0
  246. package/components/tela/tabs/tabs.stories.ts +72 -0
  247. package/components/tela/tabs/tabs.vue +61 -0
  248. package/components/tela/tags/tags-select.mdx +318 -0
  249. package/components/tela/tags/tags-select.stories.ts +47 -0
  250. package/components/tela/tags/tags-select.vue +637 -0
  251. package/components/tela/tags/tags.mdx +151 -0
  252. package/components/tela/tags/tags.stories.ts +118 -0
  253. package/components/tela/tags/tags.vue +112 -0
  254. package/components/tela/textarea/textarea.mdx +102 -0
  255. package/components/tela/textarea/textarea.stories.ts +50 -0
  256. package/components/tela/textarea/textarea.vue +34 -0
  257. package/components/tela/toggle-group.vue +91 -0
  258. package/components/tela/tooltip/tooltip-content.vue +45 -0
  259. package/components/tela/tooltip/tooltip-provider.vue +12 -0
  260. package/components/tela/tooltip/tooltip-root.vue +15 -0
  261. package/components/tela/tooltip/tooltip-trigger.vue +12 -0
  262. package/components/tela/tooltip/tooltip.mdx +196 -0
  263. package/components/tela/tooltip/tooltip.stories.ts +200 -0
  264. package/components/tela/tooltip/tooltip.vue +91 -0
  265. package/components/tela/tooltip-group/tooltip-group-trigger.vue +92 -0
  266. package/components/tela/tooltip-group/tooltip-group.mdx +236 -0
  267. package/components/tela/tooltip-group/tooltip-group.stories.ts +465 -0
  268. package/components/tela/tooltip-group/tooltip-group.vue +35 -0
  269. package/components/tela/transparent-input.vue +151 -0
  270. package/components/tela/variable-icon.vue +28 -0
  271. package/components/tela/variable-input.vue +77 -0
  272. package/components/tela/wide-button/wide-button.vue +40 -0
  273. package/components.json +18 -0
  274. package/composables/status-toast.ts +67 -0
  275. package/css/reset.css +386 -0
  276. package/css/text.css +22 -0
  277. package/lib/doc-generator.ts +903 -0
  278. package/lib/extractors/volar-extract.ts +186 -0
  279. package/lib/type-resolver.ts +402 -0
  280. package/lib/utils.ts +6 -0
  281. package/modules/tela-build-docs/index.ts +139 -0
  282. package/nuxt.config.ts +80 -0
  283. package/package.json +84 -0
  284. package/plugins/test-id.ts +7 -0
  285. package/tsconfig.json +7 -0
  286. package/types/custom-icon.ts +1 -0
  287. package/types/index.ts +2 -0
  288. package/types/status.ts +1 -0
  289. package/unocss.config.ts +89 -0
  290. package/utils/component-utils.ts +30 -0
  291. package/utils/design-tokens.ts +431 -0
  292. package/utils/fold.ts +8 -0
  293. package/utils/select-menu.ts +10 -0
  294. package/utils/status.ts +1 -0
  295. package/utils/without-keys.ts +34 -0
@@ -0,0 +1,221 @@
1
+ import { Meta, Canvas, ArgTypes } from '@storybook/blocks';
2
+ import * as HoverCardStories from './hover-card.stories.ts';
3
+
4
+ <Meta of={HoverCardStories} />
5
+
6
+ # TelaHoverCard
7
+
8
+ A hover card component that displays content in a floating panel when hovering over a trigger element. Similar to tooltips but supports richer content. Useful for showing previews, user profiles, or additional information on hover.
9
+
10
+ ## Examples
11
+
12
+ ### With Custom Content
13
+
14
+ <Canvas of={HoverCardStories.WithCustomContent} />
15
+
16
+ ### Basic Usage
17
+
18
+ ```vue
19
+ <TelaHoverCard>
20
+ <span>Hover over me</span>
21
+ <template #content>
22
+ <div class="p-4">
23
+ <h3>Hover Card Content</h3>
24
+ <p>Additional information appears here</p>
25
+ </div>
26
+ </template>
27
+ </TelaHoverCard>
28
+ ```
29
+
30
+ ### User Profile Card
31
+
32
+ ```vue
33
+ <TelaHoverCard side="right">
34
+ <a href="/user/john">@johndoe</a>
35
+ <template #content>
36
+ <div class="p-4 w-300px">
37
+ <div class="flex items-center gap-3 mb-3">
38
+ <TelaAvatar
39
+ image="https://example.com/avatar.jpg"
40
+ alt="John Doe"
41
+ size="md"
42
+ />
43
+ <div>
44
+ <div class="font-semibold">John Doe</div>
45
+ <div class="text-sm text-gray-600">@johndoe</div>
46
+ </div>
47
+ </div>
48
+ <p class="text-sm text-gray-700">
49
+ Full-stack developer passionate about building great UIs.
50
+ </p>
51
+ <div class="flex gap-4 mt-3 text-sm">
52
+ <span><strong>234</strong> followers</span>
53
+ <span><strong>89</strong> following</span>
54
+ </div>
55
+ </div>
56
+ </template>
57
+ </TelaHoverCard>
58
+ ```
59
+
60
+ ### Link Preview
61
+
62
+ ```vue
63
+ <TelaHoverCard>
64
+ <a href="https://example.com">example.com</a>
65
+ <template #content>
66
+ <div class="p-4 w-320px">
67
+ <img
68
+ src="https://example.com/preview.jpg"
69
+ alt="Preview"
70
+ class="w-full h-160px object-cover rounded mb-3"
71
+ />
72
+ <h4 class="font-semibold mb-1">Example Website</h4>
73
+ <p class="text-sm text-gray-600">
74
+ A brief description of the linked content
75
+ </p>
76
+ </div>
77
+ </template>
78
+ </TelaHoverCard>
79
+ ```
80
+
81
+ ```vue
82
+ <TelaHoverCard>
83
+ <TelaButton variant="ghost">Product Details</TelaButton>
84
+ <template #content>
85
+ <div class="p-4 w-280px">
86
+ <img
87
+ src="/product.jpg"
88
+ class="w-full h-140px object-cover rounded mb-3"
89
+ />
90
+ <h3 class="font-semibold mb-2">Premium Headphones</h3>
91
+ <div class="flex items-center justify-between mb-2">
92
+ <span class="text-2xl font-bold">$299</span>
93
+ <TelaBadge variant="filled">In Stock</TelaBadge>
94
+ </div>
95
+ <p class="text-sm text-gray-600 mb-3">
96
+ High-quality wireless headphones with noise cancellation
97
+ </p>
98
+ <TelaButton variant="primary" class="w-full">
99
+ Add to Cart
100
+ </TelaButton>
101
+ </div>
102
+ </template>
103
+ </TelaHoverCard>
104
+ ```
105
+
106
+ ### Definition Card
107
+
108
+ ```vue
109
+ <TelaHoverCard>
110
+ <span class="underline decoration-dotted cursor-help">
111
+ React
112
+ </span>
113
+ <template #content>
114
+ <div class="p-4 w-300px">
115
+ <h4 class="font-semibold mb-2">React</h4>
116
+ <p class="text-sm text-gray-700">
117
+ A JavaScript library for building user interfaces.
118
+ Developed by Meta (formerly Facebook).
119
+ </p>
120
+ </div>
121
+ </template>
122
+ </TelaHoverCard>
123
+ ```
124
+
125
+ ### Different Positions
126
+
127
+ ```vue
128
+ <!-- Bottom (default) -->
129
+ <TelaHoverCard side="bottom">
130
+ <span>Bottom</span>
131
+ <template #content>
132
+ <div class="p-3">Content below</div>
133
+ </template>
134
+ </TelaHoverCard>
135
+
136
+ <!-- Top -->
137
+ <TelaHoverCard side="top">
138
+ <span>Top</span>
139
+ <template #content>
140
+ <div class="p-3">Content above</div>
141
+ </template>
142
+ </TelaHoverCard>
143
+
144
+ <!-- Left -->
145
+ <TelaHoverCard side="left">
146
+ <span>Left</span>
147
+ <template #content>
148
+ <div class="p-3">Content on left</div>
149
+ </template>
150
+ </TelaHoverCard>
151
+
152
+ <!-- Right -->
153
+ <TelaHoverCard side="right">
154
+ <span>Right</span>
155
+ <template #content>
156
+ <div class="p-3">Content on right</div>
157
+ </template>
158
+ </TelaHoverCard>
159
+ ```
160
+
161
+ ## Props
162
+
163
+ <ArgTypes />
164
+
165
+ ```typescript
166
+ type HoverCardSide = 'top' | 'right' | 'bottom' | 'left'
167
+ type HoverCardAlign = 'start' | 'center' | 'end'
168
+
169
+ type HoverCardProps = {
170
+ align?: HoverCardAlign
171
+ side?: HoverCardSide
172
+ open?: boolean
173
+ sideOffset?: number
174
+ }
175
+ ```
176
+
177
+ ## Slots
178
+
179
+ - `default` - Trigger element
180
+ - `content` - Card content (required)
181
+
182
+ ## Features
183
+
184
+ - **Rich Content**: Supports complex HTML content
185
+ - **Hover Trigger**: Shows on hover, hides on mouse leave
186
+ - **Flexible Positioning**: All sides and alignments
187
+ - **Custom Styling**: Full control over content appearance
188
+ - **Delay Control**: Configurable show/hide delays
189
+ - **Accessible**: Built on reka-ui with proper ARIA
190
+ - **Portal Rendering**: Avoids z-index issues
191
+
192
+ ## HoverCard vs Tooltip
193
+
194
+ - **HoverCard**: Rich content, longer descriptions, images
195
+ - **Tooltip**: Brief text, simple information
196
+
197
+ ## Use Cases
198
+
199
+ - **User Profiles**: Show user info on username hover
200
+ - **Link Previews**: Display page preview on link hover
201
+ - **Definitions**: Explain terms or concepts
202
+ - **Product Cards**: Show product details on hover
203
+ - **Help Text**: Provide contextual help information
204
+ - **Image Previews**: Show larger version on thumbnail hover
205
+
206
+ ## Best Practices
207
+
208
+ 1. **Use for Rich Content**: Choose hover card when content is complex
209
+ 2. **Keep It Relevant**: Show information related to trigger
210
+ 3. **Responsive Design**: Consider mobile experience (no hover)
211
+ 4. **Loading States**: Show skeleton while loading async content
212
+ 5. **Don't Overuse**: Too many hover cards can overwhelm users
213
+
214
+ ## Accessibility
215
+
216
+ - Built on reka-ui primitives
217
+ - Proper ARIA attributes
218
+ - Keyboard navigation support (focus shows card)
219
+ - Hover and focus both trigger display
220
+ - Screen reader friendly
221
+ - Escape key to close
@@ -0,0 +1,87 @@
1
+ import type { Meta, StoryObj } from '@storybook-vue/vue3'
2
+
3
+ import HoverCard from './hover-card.vue'
4
+
5
+ const meta: Meta<typeof HoverCard> = {
6
+ title: 'Core/HoverCard',
7
+ component: HoverCard,
8
+ parameters: {
9
+ layout: 'centered',
10
+ docs: {
11
+ description: {
12
+ component: 'A hover card component that displays content in a floating panel when hovering over a trigger element. Similar to tooltips but supports richer content. Useful for showing previews, user profiles, or additional information on hover.',
13
+ },
14
+ },
15
+ },
16
+ argTypes: {
17
+ align: {
18
+ control: 'select',
19
+ options: ['start', 'center', 'end'],
20
+ description: 'Alignment of the hover card relative to the trigger element.',
21
+ },
22
+ side: {
23
+ control: 'select',
24
+ options: ['top', 'right', 'bottom', 'left'],
25
+ description: 'Side of the trigger element where the hover card should appear.',
26
+ },
27
+ open: {
28
+ control: 'boolean',
29
+ description: 'Controls the open state of the hover card. Use v-model:open for two-way binding.',
30
+ },
31
+ sideOffset: {
32
+ control: 'number',
33
+ description: 'Distance in pixels from the trigger element to the hover card content.',
34
+ },
35
+ },
36
+ args: {
37
+ align: 'center',
38
+ side: 'bottom',
39
+ } as any,
40
+ }
41
+
42
+ export default meta
43
+
44
+ type Story = StoryObj<typeof meta>
45
+
46
+ export const Simple: Story = {
47
+ render: args => ({
48
+ components: { HoverCard },
49
+ setup() {
50
+ return { args }
51
+ },
52
+ template: `
53
+ <div style="width: 100%; height: 300px; display: flex; align-items: center; justify-content: center;">
54
+ <HoverCard v-bind="args">
55
+ <button>Hover me</button>
56
+ <template #content>
57
+ <div style="padding: 16px; background: white; border-radius: 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.1);">
58
+ Hover card content
59
+ </div>
60
+ </template>
61
+ </HoverCard>
62
+ </div>`,
63
+ }),
64
+ }
65
+
66
+ export const WithCustomContent: Story = {
67
+ render: args => ({
68
+ components: { HoverCard },
69
+ setup() {
70
+ return { args }
71
+ },
72
+ template: `
73
+ <div style="width: 100%; height: 300px; display: flex; align-items: center; justify-content: center;">
74
+ <HoverCard v-bind="args">
75
+ <button>Hover for details</button>
76
+ <template #content>
77
+ <div style="padding: 20px; background: white; border-radius: 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); max-width: 300px;">
78
+ <h3 style="margin: 0 0 8px 0; font-size: 16px; font-weight: 500;">Custom Content</h3>
79
+ <p style="margin: 0; color: #666;">
80
+ This is a more complex hover card with custom styled content. You can put any content here.
81
+ </p>
82
+ </div>
83
+ </template>
84
+ </HoverCard>
85
+ </div>`,
86
+ }),
87
+ }
@@ -0,0 +1,61 @@
1
+ <script setup lang="ts">
2
+ import {
3
+ HoverCardContent,
4
+ HoverCardPortal,
5
+ HoverCardRoot,
6
+ HoverCardTrigger,
7
+ useForwardPropsEmits,
8
+ } from 'radix-vue'
9
+ import type { HoverCardContentProps, HoverCardRootEmits, HoverCardRootProps } from 'radix-vue'
10
+
11
+ const props = defineProps<HoverCardRootProps & {
12
+ class?: string
13
+ align?: HoverCardContentProps['align']
14
+ side?: HoverCardContentProps['side']
15
+ sideOffset?: HoverCardContentProps['sideOffset']
16
+ }>()
17
+ const emits = defineEmits<HoverCardRootEmits>()
18
+
19
+ const forwarded = useForwardPropsEmits(withoutKeys(props, ['class', 'align', 'side']), emits)
20
+ const isOpen = defineModel<boolean>()
21
+ </script>
22
+
23
+ <template>
24
+ <HoverCardRoot v-bind="forwarded" v-model:open="isOpen">
25
+ <HoverCardTrigger as-child>
26
+ <slot />
27
+ </HoverCardTrigger>
28
+ <HoverCardPortal>
29
+ <HoverCardContent
30
+ :class="
31
+ cn(
32
+ 'translate-z-0 z600 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
33
+ props.class,
34
+ )
35
+ "
36
+ :align="props.align"
37
+ :side="props.side"
38
+ :side-offset="props.sideOffset"
39
+ >
40
+ <slot name="content" />
41
+ </HoverCardContent>
42
+ </HoverCardPortal>
43
+ </HoverCardRoot>
44
+ </template>
45
+
46
+ <style lang="css" scoped>
47
+ .hover-card-enter-active,
48
+ .hover-card-leave-active {
49
+ transition: opacity 150ms ease-in-out;
50
+ }
51
+
52
+ .hover-card-enter-from,
53
+ .hover-card-leave-to {
54
+ opacity: 0;
55
+ }
56
+
57
+ .hover-card-enter-to,
58
+ .hover-card-leave-from {
59
+ opacity: 1;
60
+ }
61
+ </style>