gladvn 0.2.17 → 0.2.19
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/bin/cli.js +9 -6
- package/dist/components/macro/accordion-preset.d.ts.map +1 -1
- package/dist/components/macro/alert-dialog-preset.d.ts.map +1 -1
- package/dist/components/macro/alert-preset.d.ts.map +1 -1
- package/dist/components/macro/avatar-preset.d.ts.map +1 -1
- package/dist/components/macro/breadcrumb-preset.d.ts.map +1 -1
- package/dist/components/macro/card-preset.d.ts.map +1 -1
- package/dist/components/macro/carousel-preset.d.ts.map +1 -1
- package/dist/components/macro/checkbox-preset.d.ts.map +1 -1
- package/dist/components/macro/combobox-preset.d.ts.map +1 -1
- package/dist/components/macro/command-preset.d.ts +1 -1
- package/dist/components/macro/command-preset.d.ts.map +1 -1
- package/dist/components/macro/date-picker.d.ts.map +1 -1
- package/dist/components/macro/dialog-preset.d.ts.map +1 -1
- package/dist/components/macro/empty-preset.d.ts.map +1 -1
- package/dist/components/macro/field-preset.d.ts.map +1 -1
- package/dist/components/macro/input-otp-preset.d.ts +6 -0
- package/dist/components/macro/input-otp-preset.d.ts.map +1 -1
- package/dist/components/macro/input-preset.d.ts +1 -1
- package/dist/components/macro/input-preset.d.ts.map +1 -1
- package/dist/components/macro/pagination-preset.d.ts.map +1 -1
- package/dist/components/macro/progress-preset.d.ts.map +1 -1
- package/dist/components/macro/radio-group-preset.d.ts.map +1 -1
- package/dist/components/macro/select-preset.d.ts.map +1 -1
- package/dist/components/macro/slider-preset.d.ts.map +1 -1
- package/dist/components/macro/switch-preset.d.ts.map +1 -1
- package/dist/components/macro/tabs-preset.d.ts +1 -1
- package/dist/components/macro/tabs-preset.d.ts.map +1 -1
- package/dist/components/macro/textarea-preset.d.ts +1 -1
- package/dist/components/macro/textarea-preset.d.ts.map +1 -1
- package/dist/components/micro/accordion.d.ts +7 -0
- package/dist/components/micro/accordion.d.ts.map +1 -1
- package/dist/components/micro/alert-dialog.d.ts.map +1 -1
- package/dist/components/micro/alert.d.ts +7 -0
- package/dist/components/micro/alert.d.ts.map +1 -1
- package/dist/components/micro/aspect-ratio.d.ts +7 -0
- package/dist/components/micro/aspect-ratio.d.ts.map +1 -1
- package/dist/components/micro/avatar.d.ts.map +1 -1
- package/dist/components/micro/badge.d.ts +8 -1
- package/dist/components/micro/badge.d.ts.map +1 -1
- package/dist/components/micro/breadcrumb.d.ts +7 -0
- package/dist/components/micro/breadcrumb.d.ts.map +1 -1
- package/dist/components/micro/button.d.ts +8 -1
- package/dist/components/micro/button.d.ts.map +1 -1
- package/dist/components/micro/calendar.d.ts +2 -2
- package/dist/components/micro/calendar.d.ts.map +1 -1
- package/dist/components/micro/carousel.d.ts.map +1 -1
- package/dist/components/micro/chart.d.ts.map +1 -1
- package/dist/components/micro/checkbox.d.ts.map +1 -1
- package/dist/components/micro/collapsible.d.ts.map +1 -1
- package/dist/components/micro/combobox.d.ts.map +1 -1
- package/dist/components/micro/command.d.ts.map +1 -1
- package/dist/components/micro/context-menu.d.ts.map +1 -1
- package/dist/components/micro/dialog.d.ts.map +1 -1
- package/dist/components/micro/drawer.d.ts.map +1 -1
- package/dist/components/micro/dropdown-menu.d.ts.map +1 -1
- package/dist/components/micro/empty.d.ts +7 -0
- package/dist/components/micro/empty.d.ts.map +1 -1
- package/dist/components/micro/field.d.ts.map +1 -1
- package/dist/components/micro/hover-card.d.ts +1 -1
- package/dist/components/micro/hover-card.d.ts.map +1 -1
- package/dist/components/micro/input-group.d.ts.map +1 -1
- package/dist/components/micro/input-otp.d.ts.map +1 -1
- package/dist/components/micro/input.d.ts +7 -0
- package/dist/components/micro/input.d.ts.map +1 -1
- package/dist/components/micro/item.d.ts.map +1 -1
- package/dist/components/micro/label.d.ts.map +1 -1
- package/dist/components/micro/menubar.d.ts.map +1 -1
- package/dist/components/micro/navigation-menu.d.ts +8 -1
- package/dist/components/micro/navigation-menu.d.ts.map +1 -1
- package/dist/components/micro/pagination.d.ts.map +1 -1
- package/dist/components/micro/popover.d.ts.map +1 -1
- package/dist/components/micro/progress.d.ts.map +1 -1
- package/dist/components/micro/radio-group.d.ts.map +1 -1
- package/dist/components/micro/select.d.ts +1 -1
- package/dist/components/micro/select.d.ts.map +1 -1
- package/dist/components/micro/sheet.d.ts.map +1 -1
- package/dist/components/micro/sidebar.d.ts.map +1 -1
- package/dist/components/micro/skeleton.d.ts +7 -0
- package/dist/components/micro/skeleton.d.ts.map +1 -1
- package/dist/components/micro/slider.d.ts +7 -0
- package/dist/components/micro/slider.d.ts.map +1 -1
- package/dist/components/micro/sonner.d.ts.map +1 -1
- package/dist/components/micro/spinner.d.ts.map +1 -1
- package/dist/components/micro/switch.d.ts.map +1 -1
- package/dist/components/micro/table.d.ts.map +1 -1
- package/dist/components/micro/tabs.d.ts +1 -1
- package/dist/components/micro/tabs.d.ts.map +1 -1
- package/dist/components/micro/textarea.d.ts +7 -0
- package/dist/components/micro/textarea.d.ts.map +1 -1
- package/dist/components/micro/toggle-group.d.ts.map +1 -1
- package/dist/components/micro/toggle.d.ts.map +1 -1
- package/dist/components/micro/tooltip.d.ts +1 -1
- package/dist/components/micro/tooltip.d.ts.map +1 -1
- package/dist/dev/App.d.ts.map +1 -1
- package/dist/dev/components/code-highlighter.d.ts.map +1 -1
- package/dist/dev/components/dev-context.d.ts.map +1 -1
- package/dist/dev/components/showcase.d.ts +1 -1
- package/dist/dev/components/showcase.d.ts.map +1 -1
- package/dist/dev/data.d.ts.map +1 -1
- package/dist/dev/main.d.ts.map +1 -1
- package/dist/dev/sections/buttons.d.ts.map +1 -1
- package/dist/dev/sections/feedback.d.ts.map +1 -1
- package/dist/dev/sections/overview.d.ts.map +1 -1
- package/dist/dev/showcase/accordion.d.ts.map +1 -1
- package/dist/dev/showcase/alert-dialog.d.ts.map +1 -1
- package/dist/dev/showcase/alert.d.ts.map +1 -1
- package/dist/dev/showcase/aspect-ratio.d.ts.map +1 -1
- package/dist/dev/showcase/avatar.d.ts.map +1 -1
- package/dist/dev/showcase/breadcrumb.d.ts.map +1 -1
- package/dist/dev/showcase/button.d.ts.map +1 -1
- package/dist/dev/showcase/calendar.d.ts.map +1 -1
- package/dist/dev/showcase/card.d.ts.map +1 -1
- package/dist/dev/showcase/carousel.d.ts.map +1 -1
- package/dist/dev/showcase/chart.d.ts.map +1 -1
- package/dist/dev/showcase/checkbox.d.ts.map +1 -1
- package/dist/dev/showcase/collapsible.d.ts.map +1 -1
- package/dist/dev/showcase/combobox.d.ts.map +1 -1
- package/dist/dev/showcase/command.d.ts.map +1 -1
- package/dist/dev/showcase/context-menu.d.ts.map +1 -1
- package/dist/dev/showcase/dialog.d.ts.map +1 -1
- package/dist/dev/showcase/drawer.d.ts.map +1 -1
- package/dist/dev/showcase/dropdown-menu.d.ts.map +1 -1
- package/dist/dev/showcase/empty.d.ts.map +1 -1
- package/dist/dev/showcase/hover-card.d.ts.map +1 -1
- package/dist/dev/showcase/input-group.d.ts.map +1 -1
- package/dist/dev/showcase/input-otp.d.ts.map +1 -1
- package/dist/dev/showcase/input.d.ts.map +1 -1
- package/dist/dev/showcase/item.d.ts.map +1 -1
- package/dist/dev/showcase/kbd.d.ts.map +1 -1
- package/dist/dev/showcase/label.d.ts.map +1 -1
- package/dist/dev/showcase/menubar.d.ts.map +1 -1
- package/dist/dev/showcase/navigation-menu.d.ts.map +1 -1
- package/dist/dev/showcase/overview.d.ts.map +1 -1
- package/dist/dev/showcase/pagination.d.ts.map +1 -1
- package/dist/dev/showcase/popover.d.ts.map +1 -1
- package/dist/dev/showcase/progress.d.ts.map +1 -1
- package/dist/dev/showcase/radio-group.d.ts.map +1 -1
- package/dist/dev/showcase/resizable.d.ts.map +1 -1
- package/dist/dev/showcase/scroll-area.d.ts.map +1 -1
- package/dist/dev/showcase/select.d.ts.map +1 -1
- package/dist/dev/showcase/separator.d.ts.map +1 -1
- package/dist/dev/showcase/sheet.d.ts.map +1 -1
- package/dist/dev/showcase/sidebar.d.ts.map +1 -1
- package/dist/dev/showcase/skeleton.d.ts.map +1 -1
- package/dist/dev/showcase/slider.d.ts.map +1 -1
- package/dist/dev/showcase/sonner.d.ts.map +1 -1
- package/dist/dev/showcase/spinner.d.ts.map +1 -1
- package/dist/dev/showcase/switch.d.ts.map +1 -1
- package/dist/dev/showcase/table.d.ts.map +1 -1
- package/dist/dev/showcase/tabs.d.ts.map +1 -1
- package/dist/dev/showcase/textarea.d.ts.map +1 -1
- package/dist/dev/showcase/theme-provider.d.ts.map +1 -1
- package/dist/dev/showcase/toast.d.ts.map +1 -1
- package/dist/dev/showcase/toggle-group.d.ts.map +1 -1
- package/dist/dev/showcase/toggle.d.ts.map +1 -1
- package/dist/dev/showcase/tooltip.d.ts.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/utils.d.ts.map +1 -1
- package/package.json +3 -1
- package/scripts/format-codestrings.ts +87 -0
- package/scripts/organize-imports.ts +21 -0
- package/scripts/regex-format.cjs +67 -0
- package/scripts/tmp.tsx +25 -0
- package/src/components/macro/accordion-preset.test.tsx +1 -0
- package/src/components/macro/accordion-preset.tsx +2 -1
- package/src/components/macro/alert-dialog-preset.tsx +44 -43
- package/src/components/macro/alert-preset.tsx +7 -3
- package/src/components/macro/avatar-preset.tsx +2 -1
- package/src/components/macro/breadcrumb-preset.tsx +2 -1
- package/src/components/macro/card-preset.tsx +2 -1
- package/src/components/macro/carousel-preset.tsx +5 -2
- package/src/components/macro/checkbox-preset.test.tsx +1 -0
- package/src/components/macro/checkbox-preset.tsx +6 -2
- package/src/components/macro/combobox-preset.tsx +6 -3
- package/src/components/macro/command-preset.tsx +7 -3
- package/src/components/macro/date-picker.tsx +77 -59
- package/src/components/macro/dialog-preset.tsx +42 -38
- package/src/components/macro/empty-preset.tsx +2 -1
- package/src/components/macro/field-preset.test.tsx +1 -0
- package/src/components/macro/field-preset.tsx +2 -1
- package/src/components/macro/input-otp-preset.tsx +6 -2
- package/src/components/macro/input-preset.test.tsx +1 -0
- package/src/components/macro/input-preset.tsx +4 -2
- package/src/components/macro/pagination-preset.tsx +3 -1
- package/src/components/macro/progress-preset.test.tsx +1 -0
- package/src/components/macro/progress-preset.tsx +2 -1
- package/src/components/macro/radio-group-preset.tsx +4 -1
- package/src/components/macro/select-preset.tsx +35 -30
- package/src/components/macro/slider-preset.test.tsx +1 -0
- package/src/components/macro/slider-preset.tsx +4 -1
- package/src/components/macro/switch-preset.test.tsx +1 -0
- package/src/components/macro/switch-preset.tsx +4 -1
- package/src/components/macro/tabs-preset.test.tsx +1 -0
- package/src/components/macro/tabs-preset.tsx +4 -2
- package/src/components/macro/textarea-preset.test.tsx +1 -0
- package/src/components/macro/textarea-preset.tsx +4 -1
- package/src/components/micro/accordion.tsx +3 -2
- package/src/components/micro/alert-dialog.tsx +2 -1
- package/src/components/micro/alert.tsx +3 -2
- package/src/components/micro/aspect-ratio.tsx +2 -1
- package/src/components/micro/avatar.tsx +2 -1
- package/src/components/micro/badge.tsx +3 -3
- package/src/components/micro/breadcrumb.tsx +3 -2
- package/src/components/micro/button.test.tsx +1 -0
- package/src/components/micro/button.tsx +3 -3
- package/src/components/micro/calendar.tsx +10 -9
- package/src/components/micro/carousel.tsx +3 -2
- package/src/components/micro/chart.tsx +1 -0
- package/src/components/micro/checkbox.tsx +2 -2
- package/src/components/micro/collapsible.tsx +4 -2
- package/src/components/micro/combobox.tsx +41 -29
- package/src/components/micro/command.tsx +23 -16
- package/src/components/micro/context-menu.tsx +3 -2
- package/src/components/micro/dialog.tsx +2 -1
- package/src/components/micro/drawer.tsx +2 -1
- package/src/components/micro/dropdown-menu.tsx +3 -2
- package/src/components/micro/empty.tsx +2 -1
- package/src/components/micro/field.tsx +4 -3
- package/src/components/micro/hover-card.tsx +20 -19
- package/src/components/micro/input-group.tsx +2 -1
- package/src/components/micro/input-otp.tsx +3 -2
- package/src/components/micro/input.tsx +3 -2
- package/src/components/micro/item.tsx +1 -0
- package/src/components/micro/label.tsx +2 -1
- package/src/components/micro/menubar.tsx +2 -1
- package/src/components/micro/navigation-menu.tsx +18 -17
- package/src/components/micro/pagination.tsx +2 -1
- package/src/components/micro/popover.tsx +2 -1
- package/src/components/micro/progress.tsx +2 -1
- package/src/components/micro/radio-group.tsx +3 -3
- package/src/components/micro/select.tsx +5 -4
- package/src/components/micro/sheet.tsx +2 -1
- package/src/components/micro/sidebar.tsx +4 -1
- package/src/components/micro/skeleton.tsx +2 -1
- package/src/components/micro/slider.tsx +4 -1
- package/src/components/micro/sonner.tsx +2 -1
- package/src/components/micro/spinner.tsx +1 -2
- package/src/components/micro/switch.tsx +2 -2
- package/src/components/micro/table.tsx +2 -1
- package/src/components/micro/tabs.tsx +4 -3
- package/src/components/micro/textarea.tsx +2 -1
- package/src/components/micro/toggle-group.tsx +1 -0
- package/src/components/micro/toggle.tsx +1 -3
- package/src/components/micro/tooltip.tsx +9 -3
- package/src/dev/App.tsx +66 -41
- package/src/dev/components/code-highlighter.tsx +2 -1
- package/src/dev/components/dev-context.tsx +1 -0
- package/src/dev/components/showcase.tsx +13 -14
- package/src/dev/data.ts +206 -52
- package/src/dev/main.tsx +4 -4
- package/src/dev/sections/buttons.tsx +14 -12
- package/src/dev/sections/feedback.tsx +7 -2
- package/src/dev/sections/forms.tsx +11 -11
- package/src/dev/sections/overview.tsx +2 -1
- package/src/dev/showcase/accordion.tsx +399 -314
- package/src/dev/showcase/alert-dialog.tsx +387 -384
- package/src/dev/showcase/alert.tsx +271 -258
- package/src/dev/showcase/aspect-ratio.tsx +102 -105
- package/src/dev/showcase/avatar.tsx +216 -145
- package/src/dev/showcase/badge.tsx +78 -50
- package/src/dev/showcase/breadcrumb.tsx +88 -85
- package/src/dev/showcase/button.tsx +72 -96
- package/src/dev/showcase/calendar.tsx +41 -39
- package/src/dev/showcase/card.tsx +170 -148
- package/src/dev/showcase/carousel.tsx +239 -77
- package/src/dev/showcase/chart.tsx +5 -4
- package/src/dev/showcase/checkbox.tsx +206 -140
- package/src/dev/showcase/collapsible.tsx +108 -84
- package/src/dev/showcase/combobox.tsx +272 -199
- package/src/dev/showcase/command.tsx +31 -28
- package/src/dev/showcase/context-menu.tsx +94 -77
- package/src/dev/showcase/dialog.tsx +445 -424
- package/src/dev/showcase/drawer.tsx +142 -135
- package/src/dev/showcase/dropdown-menu.tsx +165 -161
- package/src/dev/showcase/empty.tsx +173 -158
- package/src/dev/showcase/hover-card.tsx +92 -52
- package/src/dev/showcase/input-group.tsx +193 -160
- package/src/dev/showcase/input-otp.tsx +109 -99
- package/src/dev/showcase/input.tsx +78 -42
- package/src/dev/showcase/item.tsx +101 -98
- package/src/dev/showcase/kbd.tsx +78 -62
- package/src/dev/showcase/label.tsx +16 -23
- package/src/dev/showcase/menubar.tsx +274 -251
- package/src/dev/showcase/navigation-menu.tsx +175 -170
- package/src/dev/showcase/overview.tsx +164 -148
- package/src/dev/showcase/pagination.tsx +101 -69
- package/src/dev/showcase/popover.tsx +113 -86
- package/src/dev/showcase/progress.tsx +99 -69
- package/src/dev/showcase/radio-group.tsx +217 -134
- package/src/dev/showcase/resizable.tsx +65 -55
- package/src/dev/showcase/scroll-area.tsx +32 -22
- package/src/dev/showcase/select.tsx +192 -136
- package/src/dev/showcase/separator.tsx +28 -24
- package/src/dev/showcase/sheet.tsx +182 -134
- package/src/dev/showcase/sidebar.tsx +9 -5
- package/src/dev/showcase/skeleton.tsx +54 -59
- package/src/dev/showcase/slider.tsx +158 -129
- package/src/dev/showcase/sonner.tsx +3 -5
- package/src/dev/showcase/spinner.tsx +22 -18
- package/src/dev/showcase/switch.tsx +207 -110
- package/src/dev/showcase/table.tsx +44 -32
- package/src/dev/showcase/tabs.tsx +272 -267
- package/src/dev/showcase/textarea.tsx +162 -116
- package/src/dev/showcase/theme-provider.tsx +596 -534
- package/src/dev/showcase/toast.tsx +37 -38
- package/src/dev/showcase/toggle-group.tsx +87 -39
- package/src/dev/showcase/toggle.tsx +36 -27
- package/src/dev/showcase/tooltip.tsx +154 -119
- package/src/lib/utils.test.ts +1 -0
- package/src/lib/utils.ts +1 -1
- package/src/styles/gladvn.css +0 -1
|
@@ -1,11 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
DocsP,
|
|
3
|
-
ExampleGrid,
|
|
4
|
-
ExampleSection,
|
|
5
|
-
Showcase,
|
|
6
|
-
ShowcaseDocs,
|
|
7
|
-
} from "../../dev/components/showcase";
|
|
8
|
-
|
|
9
1
|
import {
|
|
10
2
|
CheckCircle2Icon,
|
|
11
3
|
FileTextIcon,
|
|
@@ -27,6 +19,13 @@ import {
|
|
|
27
19
|
EmptyMedia,
|
|
28
20
|
EmptyTitle,
|
|
29
21
|
} from "../../components/micro/empty";
|
|
22
|
+
import {
|
|
23
|
+
DocsP,
|
|
24
|
+
ExampleGrid,
|
|
25
|
+
ExampleSection,
|
|
26
|
+
Showcase,
|
|
27
|
+
ShowcaseDocs,
|
|
28
|
+
} from "../../dev/components/showcase";
|
|
30
29
|
|
|
31
30
|
// ──────────────────────────────────────────────────────────
|
|
32
31
|
// SECTION 1: Macro Content
|
|
@@ -39,12 +38,14 @@ function EmptyMacroShowcase() {
|
|
|
39
38
|
label="Tiêu chuẩn (Standard)"
|
|
40
39
|
description="Đầy đủ icon, title, description, action button."
|
|
41
40
|
codeString={`<EmptyPreset
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
41
|
+
icon={
|
|
42
|
+
<FolderOpenIcon className="size-4 text-muted-foreground" />
|
|
43
|
+
}
|
|
44
|
+
title="No projects yet"
|
|
45
|
+
description="Create your first project to get started."
|
|
46
|
+
action={<Button>New Project</Button>}
|
|
47
|
+
className="w-full min-h-[280px]"
|
|
48
|
+
/>`}
|
|
48
49
|
>
|
|
49
50
|
<EmptyPreset
|
|
50
51
|
icon={<FolderOpenIcon className="size-4 text-muted-foreground" />}
|
|
@@ -59,12 +60,11 @@ function EmptyMacroShowcase() {
|
|
|
59
60
|
label="Không có Icon (Without Icon)"
|
|
60
61
|
description="Bỏ prop icon — phù hợp khi không cần hình ảnh minh họa."
|
|
61
62
|
codeString={`<EmptyPreset
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
`}
|
|
63
|
+
title="No notifications"
|
|
64
|
+
description="You're all caught up. Check back later."
|
|
65
|
+
action={<Button variant="outline">Refresh</Button>}
|
|
66
|
+
className="w-full min-h-[280px]"
|
|
67
|
+
/>`}
|
|
68
68
|
>
|
|
69
69
|
<EmptyPreset
|
|
70
70
|
title="No notifications"
|
|
@@ -80,11 +80,13 @@ function EmptyMacroShowcase() {
|
|
|
80
80
|
label="Không có Nút (Without Action)"
|
|
81
81
|
description="Chỉ hiển thị trạng thái, không yêu cầu hành động."
|
|
82
82
|
codeString={`<EmptyPreset
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
83
|
+
icon={
|
|
84
|
+
<InboxIcon className="size-4 text-muted-foreground" />
|
|
85
|
+
}
|
|
86
|
+
title="No messages"
|
|
87
|
+
description="Messages from your team will appear here."
|
|
88
|
+
className="w-full min-h-[240px]"
|
|
89
|
+
/>`}
|
|
88
90
|
>
|
|
89
91
|
<EmptyPreset
|
|
90
92
|
icon={<InboxIcon className="size-4 text-muted-foreground" />}
|
|
@@ -98,10 +100,9 @@ function EmptyMacroShowcase() {
|
|
|
98
100
|
label="Tối giản (Minimal)"
|
|
99
101
|
description="Chỉ có tiêu đề."
|
|
100
102
|
codeString={`<EmptyPreset
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
`}
|
|
103
|
+
title="Nothing here yet"
|
|
104
|
+
className="w-full min-h-[240px]"
|
|
105
|
+
/>`}
|
|
105
106
|
>
|
|
106
107
|
<EmptyPreset
|
|
107
108
|
title="Nothing here yet"
|
|
@@ -116,17 +117,19 @@ function EmptyMacroShowcase() {
|
|
|
116
117
|
description="Pattern phổ biến khi tìm kiếm không ra kết quả."
|
|
117
118
|
fullWidth
|
|
118
119
|
codeString={`<EmptyPreset
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
<
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
120
|
+
icon={
|
|
121
|
+
<SearchIcon className="size-4 text-muted-foreground" />
|
|
122
|
+
}
|
|
123
|
+
title={'No results for "invoice"'}
|
|
124
|
+
description="Try a different search term or clear all active filters."
|
|
125
|
+
action={
|
|
126
|
+
<div className="flex gap-2">
|
|
127
|
+
<Button variant="outline">Clear filters</Button>
|
|
128
|
+
<Button>Browse all</Button>
|
|
129
|
+
</div>
|
|
130
|
+
}
|
|
131
|
+
className="w-full min-h-[240px]"
|
|
132
|
+
/>`}
|
|
130
133
|
>
|
|
131
134
|
<div className="w-full max-w-md">
|
|
132
135
|
<EmptyPreset
|
|
@@ -149,16 +152,19 @@ function EmptyMacroShowcase() {
|
|
|
149
152
|
description="Description chứa liên kết HTML."
|
|
150
153
|
fullWidth
|
|
151
154
|
codeString={`<EmptyPreset
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
155
|
+
icon={
|
|
156
|
+
<FileTextIcon className="size-4 text-muted-foreground" />
|
|
157
|
+
}
|
|
158
|
+
title="No documents"
|
|
159
|
+
description={
|
|
160
|
+
<>
|
|
161
|
+
Upload or create your first document.{" "}
|
|
162
|
+
<a href="#">Learn more</a>.
|
|
163
|
+
</>
|
|
164
|
+
}
|
|
165
|
+
action={<Button>Upload Document</Button>}
|
|
166
|
+
className="w-full min-h-[240px]"
|
|
167
|
+
/>`}
|
|
162
168
|
>
|
|
163
169
|
<div className="w-full max-w-md">
|
|
164
170
|
<EmptyPreset
|
|
@@ -191,22 +197,21 @@ function EmptyMicroShowcase() {
|
|
|
191
197
|
label="Cơ bản (Default)"
|
|
192
198
|
description="Trạng thái trống cơ bản với cấu trúc thủ công."
|
|
193
199
|
codeString={`<Empty className="w-full min-h-[280px]">
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
</Empty
|
|
209
|
-
`}
|
|
200
|
+
<EmptyHeader>
|
|
201
|
+
<EmptyTitle>No customers found</EmptyTitle>
|
|
202
|
+
<EmptyDescription>
|
|
203
|
+
Get started by adding your first customer.
|
|
204
|
+
</EmptyDescription>
|
|
205
|
+
</EmptyHeader>
|
|
206
|
+
<EmptyContent>
|
|
207
|
+
<EmptyAction>
|
|
208
|
+
<Button>
|
|
209
|
+
<PlusIcon className="mr-2" />
|
|
210
|
+
Add Customer
|
|
211
|
+
</Button>
|
|
212
|
+
</EmptyAction>
|
|
213
|
+
</EmptyContent>
|
|
214
|
+
</Empty>`}
|
|
210
215
|
>
|
|
211
216
|
<Empty className="w-full min-h-[280px]">
|
|
212
217
|
<EmptyHeader>
|
|
@@ -230,24 +235,24 @@ function EmptyMicroShowcase() {
|
|
|
230
235
|
label="Kèm Icon nền màu (Icon Variant)"
|
|
231
236
|
description="Dùng EmptyMedia variant='icon' để hiển thị background mờ cho Icon."
|
|
232
237
|
codeString={`<Empty className="w-full min-h-[280px]">
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
</Empty>`}
|
|
238
|
+
<EmptyHeader>
|
|
239
|
+
<EmptyMedia variant="icon">
|
|
240
|
+
<FolderOpenIcon className="size-4 text-muted-foreground" />
|
|
241
|
+
</EmptyMedia>
|
|
242
|
+
<EmptyTitle>No projects</EmptyTitle>
|
|
243
|
+
<EmptyDescription>
|
|
244
|
+
You don't have any active projects.
|
|
245
|
+
</EmptyDescription>
|
|
246
|
+
</EmptyHeader>
|
|
247
|
+
<EmptyContent>
|
|
248
|
+
<EmptyAction>
|
|
249
|
+
<Button>
|
|
250
|
+
<PlusIcon className="mr-2" />
|
|
251
|
+
New Project
|
|
252
|
+
</Button>
|
|
253
|
+
</EmptyAction>
|
|
254
|
+
</EmptyContent>
|
|
255
|
+
</Empty>`}
|
|
251
256
|
>
|
|
252
257
|
<Empty className="w-full min-h-[280px]">
|
|
253
258
|
<EmptyHeader>
|
|
@@ -276,14 +281,13 @@ function EmptyMicroShowcase() {
|
|
|
276
281
|
label="Chỉ văn bản (Text Only)"
|
|
277
282
|
description="Không icon, không action."
|
|
278
283
|
codeString={`<Empty className="w-full min-h-[200px]">
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
</Empty
|
|
286
|
-
`}
|
|
284
|
+
<EmptyHeader>
|
|
285
|
+
<EmptyTitle>No results</EmptyTitle>
|
|
286
|
+
<EmptyDescription>
|
|
287
|
+
Try adjusting your filters or search terms.
|
|
288
|
+
</EmptyDescription>
|
|
289
|
+
</EmptyHeader>
|
|
290
|
+
</Empty>`}
|
|
287
291
|
>
|
|
288
292
|
<Empty className="w-full min-h-[200px]">
|
|
289
293
|
<EmptyHeader>
|
|
@@ -299,17 +303,17 @@ function EmptyMicroShowcase() {
|
|
|
299
303
|
label="Link bên trong mô tả (Link in Description)"
|
|
300
304
|
description="EmptyDescription tự động style thẻ <a> bên trong."
|
|
301
305
|
codeString={`<Empty className="w-full min-h-[200px]">
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
</Empty>`}
|
|
306
|
+
<EmptyHeader>
|
|
307
|
+
<EmptyMedia variant="icon">
|
|
308
|
+
<InboxIcon className="size-4 text-muted-foreground" />
|
|
309
|
+
</EmptyMedia>
|
|
310
|
+
<EmptyTitle>No messages yet</EmptyTitle>
|
|
311
|
+
<EmptyDescription>
|
|
312
|
+
Messages from your team will appear here. Learn more
|
|
313
|
+
in our <a href="#">documentation</a>.
|
|
314
|
+
</EmptyDescription>
|
|
315
|
+
</EmptyHeader>
|
|
316
|
+
</Empty>`}
|
|
313
317
|
>
|
|
314
318
|
<Empty className="w-full min-h-[200px]">
|
|
315
319
|
<EmptyHeader>
|
|
@@ -331,24 +335,25 @@ function EmptyMicroShowcase() {
|
|
|
331
335
|
description="Nút xóa bộ lọc nằm tách biệt khỏi hành động chính."
|
|
332
336
|
fullWidth
|
|
333
337
|
codeString={`<div className="w-full max-w-md">
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
</
|
|
351
|
-
|
|
338
|
+
<Empty className="w-full min-h-[240px]">
|
|
339
|
+
<EmptyHeader>
|
|
340
|
+
<EmptyMedia variant="icon">
|
|
341
|
+
<SearchIcon className="size-4 text-muted-foreground" />
|
|
342
|
+
</EmptyMedia>
|
|
343
|
+
<EmptyTitle>
|
|
344
|
+
No results for "invoice"
|
|
345
|
+
</EmptyTitle>
|
|
346
|
+
<EmptyDescription>
|
|
347
|
+
Try a different search term or clear all filters.
|
|
348
|
+
</EmptyDescription>
|
|
349
|
+
</EmptyHeader>
|
|
350
|
+
<EmptyContent>
|
|
351
|
+
<EmptyAction>
|
|
352
|
+
<Button variant="outline">Clear filters</Button>
|
|
353
|
+
</EmptyAction>
|
|
354
|
+
</EmptyContent>
|
|
355
|
+
</Empty>
|
|
356
|
+
</div>`}
|
|
352
357
|
>
|
|
353
358
|
<div className="w-full max-w-md">
|
|
354
359
|
<Empty className="w-full min-h-[240px]">
|
|
@@ -376,46 +381,56 @@ function EmptyMicroShowcase() {
|
|
|
376
381
|
description="Các kịch bản thực tế giúp bạn quyết định nên dùng Micro hay Macro."
|
|
377
382
|
fullWidth
|
|
378
383
|
codeString={`<div className="grid grid-cols-1 gap-6 md:grid-cols-2">
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
384
|
+
{/* ── Story 1: Macro wins ── */}
|
|
385
|
+
<div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
|
|
386
|
+
<div className="flex items-start gap-3">
|
|
387
|
+
<span className="mt-0.5 shrink-0 rounded-full bg-green-500/10 p-1.5 text-green-600">
|
|
388
|
+
<CheckCircle2Icon
|
|
389
|
+
className="size-4"
|
|
390
|
+
aria-hidden="true"
|
|
391
|
+
/>
|
|
392
|
+
</span>
|
|
393
|
+
<div>
|
|
394
|
+
<p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
|
|
395
|
+
Story 1 · Dùng Macro
|
|
396
|
+
</p>
|
|
397
|
+
<h3 className="mt-0.5 text-sm font-semibold text-foreground">
|
|
398
|
+
Giao diện trống tiêu chuẩn
|
|
399
|
+
</h3>
|
|
400
|
+
</div>
|
|
392
401
|
</div>
|
|
402
|
+
<p className="text-xs text-muted-foreground leading-relaxed">
|
|
403
|
+
Dùng \`EmptyPreset\` khi bạn chỉ cần một cấu trúc
|
|
404
|
+
trạng thái trống mặc định, bao gồm icon, tiêu đề, mô
|
|
405
|
+
tả và nút hành động. Giúp rút ngắn code đáng kể.
|
|
406
|
+
</p>
|
|
393
407
|
</div>
|
|
394
|
-
<p className="text-xs text-muted-foreground leading-relaxed">
|
|
395
|
-
Dùng \`EmptyPreset\` khi bạn chỉ cần một cấu trúc trạng thái trống mặc định, bao gồm icon, tiêu đề, mô tả và nút hành động. Giúp rút ngắn code đáng kể.
|
|
396
|
-
</p>
|
|
397
|
-
</div>
|
|
398
408
|
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
409
|
+
{/* ── Story 2: Micro wins ── */}
|
|
410
|
+
<div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
|
|
411
|
+
<div className="flex items-start gap-3">
|
|
412
|
+
<span className="mt-0.5 shrink-0 rounded-full bg-blue-500/10 p-1.5 text-blue-600">
|
|
413
|
+
<LayersIcon
|
|
414
|
+
className="size-4"
|
|
415
|
+
aria-hidden="true"
|
|
416
|
+
/>
|
|
417
|
+
</span>
|
|
418
|
+
<div>
|
|
419
|
+
<p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
|
|
420
|
+
Story 2 · Dùng Micro
|
|
421
|
+
</p>
|
|
422
|
+
<h3 className="mt-0.5 text-sm font-semibold text-foreground">
|
|
423
|
+
Bố cục tuỳ biến phức tạp
|
|
424
|
+
</h3>
|
|
425
|
+
</div>
|
|
412
426
|
</div>
|
|
427
|
+
<p className="text-xs text-muted-foreground leading-relaxed">
|
|
428
|
+
Dùng các thành phần con khi cần render SVG animation
|
|
429
|
+
tuỳ chỉnh, hoán đổi vị trí của phần mô tả hoặc nút,
|
|
430
|
+
thêm nội dung phụ như danh sách liên kết.
|
|
431
|
+
</p>
|
|
413
432
|
</div>
|
|
414
|
-
|
|
415
|
-
Dùng các thành phần con khi cần render SVG animation tuỳ chỉnh, hoán đổi vị trí của phần mô tả hoặc nút, thêm nội dung phụ như danh sách liên kết.
|
|
416
|
-
</p>
|
|
417
|
-
</div>
|
|
418
|
-
</div>`}
|
|
433
|
+
</div>`}
|
|
419
434
|
>
|
|
420
435
|
<div className="grid grid-cols-1 gap-6 md:grid-cols-2">
|
|
421
436
|
{/* ── Story 1: Macro wins ── */}
|
|
@@ -479,8 +494,8 @@ export default function EmptyShowcase() {
|
|
|
479
494
|
<ShowcaseDocs>
|
|
480
495
|
<DocsP>
|
|
481
496
|
Dùng để thông báo cho người dùng rằng không có dữ liệu để hiển thị ở
|
|
482
|
-
đây. Nó thường đi kèm với hình ảnh hoặc icon minh họa
|
|
483
|
-
|
|
497
|
+
đây. Nó thường đi kèm với hình ảnh hoặc icon minh họa và một hành
|
|
498
|
+
động hướng dẫn để lấp đầy nội dung này (ví dụ: Tạo mới).
|
|
484
499
|
</DocsP>
|
|
485
500
|
</ShowcaseDocs>
|
|
486
501
|
}
|
|
@@ -1,14 +1,4 @@
|
|
|
1
|
-
import { useDevContext } from "../../dev/components/dev-context";
|
|
2
|
-
import {
|
|
3
|
-
DocsCode,
|
|
4
|
-
DocsP,
|
|
5
|
-
ExampleGrid,
|
|
6
|
-
ExampleSection,
|
|
7
|
-
Showcase,
|
|
8
|
-
ShowcaseDocs,
|
|
9
|
-
} from "../../dev/components/showcase";
|
|
10
1
|
import { CalendarIcon } from "lucide-react";
|
|
11
|
-
import { useState } from "react";
|
|
12
2
|
|
|
13
3
|
import {
|
|
14
4
|
Avatar,
|
|
@@ -19,9 +9,18 @@ import { Button } from "../../components/micro/button";
|
|
|
19
9
|
import {
|
|
20
10
|
HoverCard,
|
|
21
11
|
HoverCardContent,
|
|
22
|
-
HoverCardTrigger,
|
|
23
12
|
HoverCardPortal,
|
|
13
|
+
HoverCardTrigger,
|
|
24
14
|
} from "../../components/micro/hover-card";
|
|
15
|
+
import { useDevContext } from "../../dev/components/dev-context";
|
|
16
|
+
import {
|
|
17
|
+
DocsCode,
|
|
18
|
+
DocsP,
|
|
19
|
+
ExampleGrid,
|
|
20
|
+
ExampleSection,
|
|
21
|
+
Showcase,
|
|
22
|
+
ShowcaseDocs,
|
|
23
|
+
} from "../../dev/components/showcase";
|
|
25
24
|
import { type Size } from "../../lib/types";
|
|
26
25
|
|
|
27
26
|
// ──────────────────────────────────────────────────────────
|
|
@@ -65,28 +64,42 @@ function HoverCardMicroShowcase({ globalSize }: { globalSize: Size }) {
|
|
|
65
64
|
label="Default"
|
|
66
65
|
description="Di chuột qua liên kết để xem bản xem trước. Trigger render dưới dạng Button với variant link."
|
|
67
66
|
codeString={`<HoverCard>
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
67
|
+
<HoverCardTrigger render={<Button variant="link" />}>
|
|
68
|
+
@nextjs
|
|
69
|
+
</HoverCardTrigger>
|
|
70
|
+
<HoverCardPortal>
|
|
71
|
+
<HoverCardContent className="w-80">
|
|
72
|
+
<div className="flex justify-between space-x-4">
|
|
73
|
+
<Avatar>
|
|
74
|
+
<AvatarImage
|
|
75
|
+
src="https://github.com/vercel.png"
|
|
76
|
+
alt="Vercel avatar"
|
|
77
|
+
/>
|
|
78
|
+
<AvatarFallback>VC</AvatarFallback>
|
|
79
|
+
</Avatar>
|
|
80
|
+
<div className="space-y-1">
|
|
81
|
+
<h4 className="text-sm font-semibold">
|
|
82
|
+
@nextjs
|
|
83
|
+
</h4>
|
|
84
|
+
<p className="text-sm">
|
|
85
|
+
The React Framework – created and maintained
|
|
86
|
+
by @vercel.
|
|
87
|
+
</p>
|
|
88
|
+
<div className="flex items-center pt-2">
|
|
89
|
+
<CalendarIcon
|
|
90
|
+
aria-hidden="true"
|
|
91
|
+
focusable="false"
|
|
92
|
+
className="mr-2 h-4 w-4 opacity-70"
|
|
93
|
+
/>
|
|
94
|
+
<span className="text-xs text-muted-foreground">
|
|
95
|
+
Joined December 2021
|
|
96
|
+
</span>
|
|
97
|
+
</div>
|
|
98
|
+
</div>
|
|
85
99
|
</div>
|
|
86
|
-
</
|
|
87
|
-
</
|
|
88
|
-
</
|
|
89
|
-
</HoverCard>`}
|
|
100
|
+
</HoverCardContent>
|
|
101
|
+
</HoverCardPortal>
|
|
102
|
+
</HoverCard>`}
|
|
90
103
|
>
|
|
91
104
|
<HoverCard>
|
|
92
105
|
<HoverCardTrigger
|
|
@@ -108,9 +121,15 @@ function HoverCardMicroShowcase({ globalSize }: { globalSize: Size }) {
|
|
|
108
121
|
label="Vị trí (Side)"
|
|
109
122
|
description="HoverCard có thể xuất hiện ở bốn phía của trigger thông qua prop side."
|
|
110
123
|
codeString={`<HoverCard>
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
124
|
+
<HoverCardTrigger
|
|
125
|
+
render={<Button variant="outline">Top</Button>}
|
|
126
|
+
/>
|
|
127
|
+
<HoverCardPortal>
|
|
128
|
+
<HoverCardContent side="top" className="w-80">
|
|
129
|
+
...
|
|
130
|
+
</HoverCardContent>
|
|
131
|
+
</HoverCardPortal>
|
|
132
|
+
</HoverCard>`}
|
|
114
133
|
>
|
|
115
134
|
<div className="flex flex-wrap items-center justify-center gap-4 py-8">
|
|
116
135
|
{(["top", "right", "bottom", "left"] as const).map((side) => (
|
|
@@ -175,8 +194,8 @@ function HoverCardMicroShowcase({ globalSize }: { globalSize: Size }) {
|
|
|
175
194
|
label="Trigger: Button Link"
|
|
176
195
|
description="Trigger render như Button variant link — phù hợp cho text nội tuyến."
|
|
177
196
|
codeString={`<HoverCardTrigger render={<Button variant="link" />}>
|
|
178
|
-
|
|
179
|
-
</HoverCardTrigger>`}
|
|
197
|
+
@nextjs
|
|
198
|
+
</HoverCardTrigger>`}
|
|
180
199
|
>
|
|
181
200
|
<HoverCard>
|
|
182
201
|
<HoverCardTrigger
|
|
@@ -197,10 +216,15 @@ function HoverCardMicroShowcase({ globalSize }: { globalSize: Size }) {
|
|
|
197
216
|
label="Trigger: Thẻ anchor thuần"
|
|
198
217
|
description="Trigger render như thẻ <a> HTML thuần — phù hợp cho liên kết tự nhiên trong văn bản."
|
|
199
218
|
codeString={`<HoverCardTrigger
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
219
|
+
render={
|
|
220
|
+
<a
|
|
221
|
+
href="#"
|
|
222
|
+
className="text-primary underline underline-offset-4"
|
|
223
|
+
/>
|
|
224
|
+
}
|
|
225
|
+
>
|
|
226
|
+
@nextjs
|
|
227
|
+
</HoverCardTrigger>`}
|
|
204
228
|
>
|
|
205
229
|
<HoverCard>
|
|
206
230
|
<HoverCardTrigger
|
|
@@ -229,19 +253,35 @@ function HoverCardMicroShowcase({ globalSize }: { globalSize: Size }) {
|
|
|
229
253
|
description="Tuỳ chỉnh thời gian trễ trước khi card xuất hiện hoặc biến mất. Props delay và closeDelay đặt trên HoverCardTrigger."
|
|
230
254
|
fullWidth
|
|
231
255
|
codeString={`<HoverCard>
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
</
|
|
256
|
+
<HoverCardTrigger delay={0} render={<Button />}>
|
|
257
|
+
Tức thì
|
|
258
|
+
</HoverCardTrigger>
|
|
259
|
+
<HoverCardPortal>
|
|
260
|
+
<HoverCardContent>...</HoverCardContent>
|
|
261
|
+
</HoverCardPortal>
|
|
262
|
+
</HoverCard>
|
|
235
263
|
|
|
236
|
-
<HoverCard>
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
</
|
|
264
|
+
<HoverCard>
|
|
265
|
+
<HoverCardTrigger delay={500} render={<Button />}>
|
|
266
|
+
Mặc định (500ms)
|
|
267
|
+
</HoverCardTrigger>
|
|
268
|
+
<HoverCardPortal>
|
|
269
|
+
<HoverCardContent>...</HoverCardContent>
|
|
270
|
+
</HoverCardPortal>
|
|
271
|
+
</HoverCard>
|
|
240
272
|
|
|
241
|
-
<HoverCard>
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
273
|
+
<HoverCard>
|
|
274
|
+
<HoverCardTrigger
|
|
275
|
+
delay={1500}
|
|
276
|
+
closeDelay={500}
|
|
277
|
+
render={<Button />}
|
|
278
|
+
>
|
|
279
|
+
Chậm (1500ms)
|
|
280
|
+
</HoverCardTrigger>
|
|
281
|
+
<HoverCardPortal>
|
|
282
|
+
<HoverCardContent>...</HoverCardContent>
|
|
283
|
+
</HoverCardPortal>
|
|
284
|
+
</HoverCard>`}
|
|
245
285
|
>
|
|
246
286
|
<div className="grid grid-cols-1 md:grid-cols-3 gap-4 w-full">
|
|
247
287
|
<HoverCard>
|