@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.
- package/README.md +75 -0
- package/app.config.ts +73 -0
- package/components/tela/animated/animated-calculating-number.vue +16 -0
- package/components/tela/animated/animated-number.mdx +248 -0
- package/components/tela/animated/animated-number.stories.ts +52 -0
- package/components/tela/animated/animated-number.vue +23 -0
- package/components/tela/animated/animated-text.vue +124 -0
- package/components/tela/animated/animated-value.vue +68 -0
- package/components/tela/avatar/avatar.mdx +117 -0
- package/components/tela/avatar/avatar.stories.ts +62 -0
- package/components/tela/avatar/avatar.vue +71 -0
- package/components/tela/avatar/group/avatar-group.stories.ts +78 -0
- package/components/tela/avatar/group/avatar-group.vue +46 -0
- package/components/tela/badge/badge.mdx +154 -0
- package/components/tela/badge/badge.stories.ts +82 -0
- package/components/tela/badge/badge.vue +41 -0
- package/components/tela/button/button.mdx +155 -0
- package/components/tela/button/button.stories.ts +202 -0
- package/components/tela/button/button.vue +107 -0
- package/components/tela/card.vue +30 -0
- package/components/tela/chart/chart-bar.vue +58 -0
- package/components/tela/chat/chat.mdx +268 -0
- package/components/tela/chat/chat.stories.ts +253 -0
- package/components/tela/chat/command/index.vue +41 -0
- package/components/tela/chat/command/mention/index.vue +138 -0
- package/components/tela/chat/index.vue +112 -0
- package/components/tela/chat/pure-text-input/chat-text-input.vue +190 -0
- package/components/tela/chat/text-input/chat-text-input.stories.ts +128 -0
- package/components/tela/chat/text-input/index.vue +217 -0
- package/components/tela/chat/text-message/chat-text-message.stories.ts +138 -0
- package/components/tela/chat/text-message/index.vue +355 -0
- package/components/tela/chat/types.ts +19 -0
- package/components/tela/checkbox/checkbox-card.vue +30 -0
- package/components/tela/checkbox/checkbox.mdx +164 -0
- package/components/tela/checkbox/checkbox.stories.ts +104 -0
- package/components/tela/checkbox/checkbox.vue +43 -0
- package/components/tela/collapsible/Collapsible.vue +15 -0
- package/components/tela/collapsible/CollapsibleContent.vue +59 -0
- package/components/tela/collapsible/CollapsibleTrigger.vue +12 -0
- package/components/tela/collapsible/collapsible.mdx +157 -0
- package/components/tela/collapsible-section/collapsible-section.mdx +180 -0
- package/components/tela/collapsible-section/collapsible-section.stories.ts +53 -0
- package/components/tela/collapsible-section/collapsible-section.vue +51 -0
- package/components/tela/collapsible-section-with-actions.vue +98 -0
- package/components/tela/combobox/combobox-anchor.vue +24 -0
- package/components/tela/combobox/combobox-empty.vue +19 -0
- package/components/tela/combobox/combobox-group.vue +24 -0
- package/components/tela/combobox/combobox-indicator.vue +22 -0
- package/components/tela/combobox/combobox-input.vue +31 -0
- package/components/tela/combobox/combobox-item.vue +28 -0
- package/components/tela/combobox/combobox-label.vue +24 -0
- package/components/tela/combobox/combobox-list.vue +90 -0
- package/components/tela/combobox/combobox-module-selector.vue +366 -0
- package/components/tela/combobox/combobox-root.vue +15 -0
- package/components/tela/combobox/combobox-trigger.vue +12 -0
- package/components/tela/combobox/combobox.mdx +285 -0
- package/components/tela/combobox/combobox.stories.ts +232 -0
- package/components/tela/combobox/combobox.vue +497 -0
- package/components/tela/command/command-dialog.vue +22 -0
- package/components/tela/command/command-empty.vue +25 -0
- package/components/tela/command/command-group.vue +46 -0
- package/components/tela/command/command-input.vue +38 -0
- package/components/tela/command/command-item.vue +78 -0
- package/components/tela/command/command-list.vue +78 -0
- package/components/tela/command/command-separator.vue +23 -0
- package/components/tela/command/command-shortcut.vue +13 -0
- package/components/tela/command/command.vue +88 -0
- package/components/tela/command/dialog-base.vue +15 -0
- package/components/tela/command/dialog-content.vue +50 -0
- package/components/tela/command/utils.ts +15 -0
- package/components/tela/complex-table/complex-table-cell.stories.ts +145 -0
- package/components/tela/complex-table/complex-table-cell.vue +45 -0
- package/components/tela/complex-table/complex-table-header-cell.stories.ts +103 -0
- package/components/tela/complex-table/complex-table-header-cell.vue +48 -0
- package/components/tela/complex-table/complex-table-header.stories.ts +89 -0
- package/components/tela/complex-table/complex-table-header.vue +70 -0
- package/components/tela/complex-table/complex-table-row.vue +199 -0
- package/components/tela/complex-table/complex-table-virtualized.vue +326 -0
- package/components/tela/complex-table/complex-table.stories.ts +358 -0
- package/components/tela/complex-table/complex-table.vue +237 -0
- package/components/tela/complex-table/composables/table-common.ts +93 -0
- package/components/tela/complex-table/composables/table-selection.ts +87 -0
- package/components/tela/complex-table/composables/virtual-scroll.ts +252 -0
- package/components/tela/complex-table/styles/table-shared.css +170 -0
- package/components/tela/complex-table/types.ts +63 -0
- package/components/tela/complex-table/utils.ts +35 -0
- package/components/tela/confirm-button/confirm-button.vue +137 -0
- package/components/tela/confirmation-modal/confirmation-modal.vue +72 -0
- package/components/tela/copy-button.vue +86 -0
- package/components/tela/date-range-picker.vue +221 -0
- package/components/tela/dialog/dialog.mdx +170 -0
- package/components/tela/dialog/dialog.vue +182 -0
- package/components/tela/disabled-area.vue +16 -0
- package/components/tela/disclaimer/disclaimer.mdx +238 -0
- package/components/tela/disclaimer/disclaimer.stories.ts +196 -0
- package/components/tela/disclaimer/disclaimer.vue +125 -0
- package/components/tela/dropdown-menu/DropdownMenu.vue +121 -0
- package/components/tela/dropdown-menu/DropdownMenuCheckboxItem.vue +40 -0
- package/components/tela/dropdown-menu/DropdownMenuContent.vue +75 -0
- package/components/tela/dropdown-menu/DropdownMenuGroup.vue +12 -0
- package/components/tela/dropdown-menu/DropdownMenuItem.vue +137 -0
- package/components/tela/dropdown-menu/DropdownMenuLabel.vue +26 -0
- package/components/tela/dropdown-menu/DropdownMenuRadioGroup.vue +18 -0
- package/components/tela/dropdown-menu/DropdownMenuRadioItem.vue +40 -0
- package/components/tela/dropdown-menu/DropdownMenuRoot.vue +15 -0
- package/components/tela/dropdown-menu/DropdownMenuSeparator.vue +21 -0
- package/components/tela/dropdown-menu/DropdownMenuShortcut.vue +14 -0
- package/components/tela/dropdown-menu/DropdownMenuSub.vue +18 -0
- package/components/tela/dropdown-menu/DropdownMenuSubContent.vue +30 -0
- package/components/tela/dropdown-menu/DropdownMenuSubTrigger.vue +35 -0
- package/components/tela/dropdown-menu/DropdownMenuTrigger.vue +14 -0
- package/components/tela/dropdown-menu/dropdown-menu.mdx +265 -0
- package/components/tela/dropdown-menu/dropdown-menu.stories.ts +156 -0
- package/components/tela/expandable-input.vue +96 -0
- package/components/tela/file-drop.vue +37 -0
- package/components/tela/file-upload/file-upload.mdx +189 -0
- package/components/tela/file-upload/file-upload.stories.ts +48 -0
- package/components/tela/file-upload/file-upload.vue +205 -0
- package/components/tela/filters/checkbox-filter.stories.ts +218 -0
- package/components/tela/filters/checkbox-filter.vue +165 -0
- package/components/tela/filters/date-filter.stories.ts +258 -0
- package/components/tela/filters/date-filter.vue +200 -0
- package/components/tela/filters/user-filter.stories.ts +344 -0
- package/components/tela/filters/user-filter.vue +271 -0
- package/components/tela/hover-card/hover-card.mdx +221 -0
- package/components/tela/hover-card/hover-card.stories.ts +87 -0
- package/components/tela/hover-card/hover-card.vue +61 -0
- package/components/tela/icon/custom.vue +319 -0
- package/components/tela/icon/spinner.vue +12 -0
- package/components/tela/icon-button/icon-button.vue +114 -0
- package/components/tela/icon.vue +37 -0
- package/components/tela/initials.vue +28 -0
- package/components/tela/inline-input.vue +77 -0
- package/components/tela/input/input.mdx +182 -0
- package/components/tela/input/input.stories.ts +153 -0
- package/components/tela/input/tela-input.vue +240 -0
- package/components/tela/kbd/kbd-return.vue +6 -0
- package/components/tela/kbd/kbd.mdx +238 -0
- package/components/tela/kbd/kbd.vue +18 -0
- package/components/tela/label/label.mdx +121 -0
- package/components/tela/label/label.stories.ts +37 -0
- package/components/tela/label/label.vue +25 -0
- package/components/tela/link-decoration/link-decoration.vue +19 -0
- package/components/tela/live-label.vue +32 -0
- package/components/tela/long-press-button.vue +98 -0
- package/components/tela/menubar/menubar-content.vue +77 -0
- package/components/tela/menubar/menubar-item.vue +32 -0
- package/components/tela/menubar/menubar-label.vue +14 -0
- package/components/tela/menubar/menubar-menu.vue +12 -0
- package/components/tela/menubar/menubar-root.vue +30 -0
- package/components/tela/menubar/menubar-separator.vue +17 -0
- package/components/tela/menubar/menubar-shortcut.vue +14 -0
- package/components/tela/menubar/menubar-sub-content.vue +36 -0
- package/components/tela/menubar/menubar-sub-trigger.vue +28 -0
- package/components/tela/menubar/menubar-sub.vue +20 -0
- package/components/tela/menubar/menubar-trigger.vue +27 -0
- package/components/tela/menubar/menubar.vue +298 -0
- package/components/tela/modal/modal.mdx +145 -0
- package/components/tela/modal/modal.vue +242 -0
- package/components/tela/multiple-select/multiple-select.mdx +274 -0
- package/components/tela/multiple-select/multiple-select.stories.ts +325 -0
- package/components/tela/multiple-select/multiple-select.vue +666 -0
- package/components/tela/pane.vue +110 -0
- package/components/tela/popover/popover-content.vue +48 -0
- package/components/tela/popover/popover-trigger.vue +12 -0
- package/components/tela/popover/popover.mdx +239 -0
- package/components/tela/popover/popover.stories.ts +150 -0
- package/components/tela/popover/popover.vue +15 -0
- package/components/tela/popover-list/popover-list-nested.vue +104 -0
- package/components/tela/popover-list/popover-list.stories.ts +330 -0
- package/components/tela/popover-list/popover-list.vue +191 -0
- package/components/tela/radio-button.vue +66 -0
- package/components/tela/radio-group/radio-group-item.vue +40 -0
- package/components/tela/radio-group/radio-group-root.vue +26 -0
- package/components/tela/radio-group/radio-group.mdx +78 -0
- package/components/tela/radio-group/radio-group.stories.ts +106 -0
- package/components/tela/radio-group/radio-group.vue +23 -0
- package/components/tela/range-calendar.stories.ts +110 -0
- package/components/tela/range-calendar.vue +109 -0
- package/components/tela/scroll-area/scroll-area.mdx +183 -0
- package/components/tela/scroll-area/scroll-area.vue +30 -0
- package/components/tela/scroll-area/scroll-bar.vue +31 -0
- package/components/tela/segment-toggle.stories.ts +114 -0
- package/components/tela/segment-toggle.vue +66 -0
- package/components/tela/select-menu/select-menu-content.vue +106 -0
- package/components/tela/select-menu/select-menu-down-button.vue +20 -0
- package/components/tela/select-menu/select-menu-group.vue +16 -0
- package/components/tela/select-menu/select-menu-item.vue +40 -0
- package/components/tela/select-menu/select-menu-root.vue +15 -0
- package/components/tela/select-menu/select-menu-trigger.vue +34 -0
- package/components/tela/select-menu/select-menu-up-button.vue +20 -0
- package/components/tela/select-menu/select-menu-value.vue +12 -0
- package/components/tela/select-menu/select-menu.mdx +221 -0
- package/components/tela/select-menu/select-menu.stories.ts +91 -0
- package/components/tela/select-menu/select-menu.vue +165 -0
- package/components/tela/selector/selector.vue +47 -0
- package/components/tela/sheet/sheet-close.vue +12 -0
- package/components/tela/sheet/sheet-content.vue +57 -0
- package/components/tela/sheet/sheet-description.vue +23 -0
- package/components/tela/sheet/sheet-footer.vue +18 -0
- package/components/tela/sheet/sheet-header.vue +15 -0
- package/components/tela/sheet/sheet-root.vue +18 -0
- package/components/tela/sheet/sheet-title.vue +23 -0
- package/components/tela/sheet/sheet-trigger.vue +12 -0
- package/components/tela/sheet/sheet.client.vue +150 -0
- package/components/tela/sheet/sheet.mdx +176 -0
- package/components/tela/sheet/sheet.stories.ts +201 -0
- package/components/tela/sheet/variants.ts +22 -0
- package/components/tela/side-sheet/side-sheet.mdx +131 -0
- package/components/tela/side-sheet/side-sheet.stories.ts +134 -0
- package/components/tela/side-sheet/side-sheet.vue +106 -0
- package/components/tela/skeleton/skeleton.mdx +165 -0
- package/components/tela/skeleton/skeleton.stories.ts +35 -0
- package/components/tela/skeleton/skeleton.vue +45 -0
- package/components/tela/skeleton-icon.vue +24 -0
- package/components/tela/span.vue +24 -0
- package/components/tela/star-button.vue +70 -0
- package/components/tela/status/status-lean.vue +30 -0
- package/components/tela/status/status.mdx +187 -0
- package/components/tela/status/status.stories.ts +160 -0
- package/components/tela/status/status.vue +420 -0
- package/components/tela/status-bar/status-bar.mdx +178 -0
- package/components/tela/status-bar/status-bar.stories.ts +64 -0
- package/components/tela/status-bar/status-bar.vue +56 -0
- package/components/tela/status-bar/types.ts +5 -0
- package/components/tela/switch/switch.mdx +118 -0
- package/components/tela/switch/switch.stories.ts +80 -0
- package/components/tela/switch/switch.vue +56 -0
- package/components/tela/table/table-body.vue +13 -0
- package/components/tela/table/table-caption.vue +13 -0
- package/components/tela/table/table-cell.vue +20 -0
- package/components/tela/table/table-empty.vue +37 -0
- package/components/tela/table/table-footer.vue +13 -0
- package/components/tela/table/table-head.vue +13 -0
- package/components/tela/table/table-header.vue +13 -0
- package/components/tela/table/table-row.vue +13 -0
- package/components/tela/table/table.mdx +230 -0
- package/components/tela/table/table.stories.ts +384 -0
- package/components/tela/table/table.vue +15 -0
- package/components/tela/tabs/tabs-content.vue +20 -0
- package/components/tela/tabs/tabs-indicator.vue +22 -0
- package/components/tela/tabs/tabs-list.vue +23 -0
- package/components/tela/tabs/tabs-root.vue +15 -0
- package/components/tela/tabs/tabs-trigger.vue +27 -0
- package/components/tela/tabs/tabs.mdx +138 -0
- package/components/tela/tabs/tabs.stories.ts +72 -0
- package/components/tela/tabs/tabs.vue +61 -0
- package/components/tela/tags/tags-select.mdx +318 -0
- package/components/tela/tags/tags-select.stories.ts +47 -0
- package/components/tela/tags/tags-select.vue +637 -0
- package/components/tela/tags/tags.mdx +151 -0
- package/components/tela/tags/tags.stories.ts +118 -0
- package/components/tela/tags/tags.vue +112 -0
- package/components/tela/textarea/textarea.mdx +102 -0
- package/components/tela/textarea/textarea.stories.ts +50 -0
- package/components/tela/textarea/textarea.vue +34 -0
- package/components/tela/toggle-group.vue +91 -0
- package/components/tela/tooltip/tooltip-content.vue +45 -0
- package/components/tela/tooltip/tooltip-provider.vue +12 -0
- package/components/tela/tooltip/tooltip-root.vue +15 -0
- package/components/tela/tooltip/tooltip-trigger.vue +12 -0
- package/components/tela/tooltip/tooltip.mdx +196 -0
- package/components/tela/tooltip/tooltip.stories.ts +200 -0
- package/components/tela/tooltip/tooltip.vue +91 -0
- package/components/tela/tooltip-group/tooltip-group-trigger.vue +92 -0
- package/components/tela/tooltip-group/tooltip-group.mdx +236 -0
- package/components/tela/tooltip-group/tooltip-group.stories.ts +465 -0
- package/components/tela/tooltip-group/tooltip-group.vue +35 -0
- package/components/tela/transparent-input.vue +151 -0
- package/components/tela/variable-icon.vue +28 -0
- package/components/tela/variable-input.vue +77 -0
- package/components/tela/wide-button/wide-button.vue +40 -0
- package/components.json +18 -0
- package/composables/status-toast.ts +67 -0
- package/css/reset.css +386 -0
- package/css/text.css +22 -0
- package/lib/doc-generator.ts +903 -0
- package/lib/extractors/volar-extract.ts +186 -0
- package/lib/type-resolver.ts +402 -0
- package/lib/utils.ts +6 -0
- package/modules/tela-build-docs/index.ts +139 -0
- package/nuxt.config.ts +80 -0
- package/package.json +84 -0
- package/plugins/test-id.ts +7 -0
- package/tsconfig.json +7 -0
- package/types/custom-icon.ts +1 -0
- package/types/index.ts +2 -0
- package/types/status.ts +1 -0
- package/unocss.config.ts +89 -0
- package/utils/component-utils.ts +30 -0
- package/utils/design-tokens.ts +431 -0
- package/utils/fold.ts +8 -0
- package/utils/select-menu.ts +10 -0
- package/utils/status.ts +1 -0
- 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>
|