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,16 +1,7 @@
|
|
|
1
|
-
import { useDevContext } from "../../dev/components/dev-context";
|
|
2
|
-
import {
|
|
3
|
-
DocsCode,
|
|
4
|
-
DocsH3,
|
|
5
|
-
DocsP,
|
|
6
|
-
ExampleGrid,
|
|
7
|
-
ExampleSection,
|
|
8
|
-
Showcase,
|
|
9
|
-
ShowcaseDocs,
|
|
10
|
-
} from "../../dev/components/showcase";
|
|
11
|
-
import { CheckCircle2Icon, LayersIcon, XIcon } from "lucide-react";
|
|
12
1
|
import { useState } from "react";
|
|
13
2
|
|
|
3
|
+
import { CheckCircle2Icon, LayersIcon, XIcon } from "lucide-react";
|
|
4
|
+
|
|
14
5
|
import { DialogPreset } from "../../components/macro/dialog-preset";
|
|
15
6
|
import { Button } from "../../components/micro/button";
|
|
16
7
|
import {
|
|
@@ -20,12 +11,22 @@ import {
|
|
|
20
11
|
DialogDescription,
|
|
21
12
|
DialogFooter,
|
|
22
13
|
DialogHeader,
|
|
14
|
+
DialogPortal,
|
|
23
15
|
DialogTitle,
|
|
24
16
|
DialogTrigger,
|
|
25
|
-
DialogPortal,
|
|
26
17
|
} from "../../components/micro/dialog";
|
|
27
18
|
import { Input } from "../../components/micro/input";
|
|
28
19
|
import { Label } from "../../components/micro/label";
|
|
20
|
+
import { useDevContext } from "../../dev/components/dev-context";
|
|
21
|
+
import {
|
|
22
|
+
DocsCode,
|
|
23
|
+
DocsH3,
|
|
24
|
+
DocsP,
|
|
25
|
+
ExampleGrid,
|
|
26
|
+
ExampleSection,
|
|
27
|
+
Showcase,
|
|
28
|
+
ShowcaseDocs,
|
|
29
|
+
} from "../../dev/components/showcase";
|
|
29
30
|
import { type Size } from "../../lib/types";
|
|
30
31
|
import { cn } from "../../lib/utils";
|
|
31
32
|
|
|
@@ -42,17 +43,18 @@ function DialogMacroShowcase({ globalSize }: { globalSize: Size }) {
|
|
|
42
43
|
label="Basic Usage"
|
|
43
44
|
description="DialogPreset với title, description và footer đơn giản."
|
|
44
45
|
codeString={`<DialogPreset
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
46
|
+
title="Update Subscription"
|
|
47
|
+
description="Are you sure you want to upgrade your plan to Pro? This will charge your card immediately."
|
|
48
|
+
trigger={
|
|
49
|
+
<Button variant="outline">Upgrade Plan</Button>
|
|
50
|
+
}
|
|
51
|
+
footer={
|
|
52
|
+
<>
|
|
53
|
+
<Button variant="ghost">Cancel</Button>
|
|
54
|
+
<Button color="primary">Confirm</Button>
|
|
55
|
+
</>
|
|
56
|
+
}
|
|
57
|
+
/>`}
|
|
56
58
|
>
|
|
57
59
|
<DialogPreset
|
|
58
60
|
size={globalSize}
|
|
@@ -80,35 +82,36 @@ function DialogMacroShowcase({ globalSize }: { globalSize: Size }) {
|
|
|
80
82
|
label="Forms & Custom Content"
|
|
81
83
|
description="Sử dụng children để render form hoặc nội dung phức tạp."
|
|
82
84
|
codeString={`<DialogPreset
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
85
|
+
title="Edit profile"
|
|
86
|
+
description="Make changes to your profile here. Click save when you're done."
|
|
87
|
+
trigger={
|
|
88
|
+
<Button variant="outline">Edit Profile</Button>
|
|
89
|
+
}
|
|
90
|
+
footer={<Button type="submit">Save changes</Button>}
|
|
91
|
+
>
|
|
92
|
+
<div className="grid gap-4 py-4">
|
|
93
|
+
<div className="grid grid-cols-4 items-center gap-4">
|
|
94
|
+
<Label htmlFor="name" className="text-right">
|
|
95
|
+
Name
|
|
96
|
+
</Label>
|
|
97
|
+
<Input
|
|
98
|
+
id="name"
|
|
99
|
+
defaultValue="Pedro Duarte"
|
|
100
|
+
className="col-span-3"
|
|
101
|
+
/>
|
|
102
|
+
</div>
|
|
103
|
+
<div className="grid grid-cols-4 items-center gap-4">
|
|
104
|
+
<Label htmlFor="username" className="text-right">
|
|
105
|
+
Username
|
|
106
|
+
</Label>
|
|
107
|
+
<Input
|
|
108
|
+
id="username"
|
|
109
|
+
defaultValue="@peduarte"
|
|
110
|
+
className="col-span-3"
|
|
111
|
+
/>
|
|
112
|
+
</div>
|
|
108
113
|
</div>
|
|
109
|
-
</
|
|
110
|
-
</DialogPreset>
|
|
111
|
-
`}
|
|
114
|
+
</DialogPreset>`}
|
|
112
115
|
>
|
|
113
116
|
<DialogPreset
|
|
114
117
|
size={globalSize}
|
|
@@ -156,22 +159,22 @@ function DialogMacroShowcase({ globalSize }: { globalSize: Size }) {
|
|
|
156
159
|
label="No Close Button"
|
|
157
160
|
description="Ẩn nút X ở góc trên bằng showCloseButton={false}."
|
|
158
161
|
codeString={`<DialogPreset
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
>
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
</
|
|
174
|
-
|
|
162
|
+
showCloseButton={false}
|
|
163
|
+
title="Terms of Service"
|
|
164
|
+
description="You must accept the new terms to continue using the application."
|
|
165
|
+
trigger={<Button variant="outline">View Terms</Button>}
|
|
166
|
+
footer={
|
|
167
|
+
<>
|
|
168
|
+
<Button variant="outline">Decline</Button>
|
|
169
|
+
<Button>Accept</Button>
|
|
170
|
+
</>
|
|
171
|
+
}
|
|
172
|
+
>
|
|
173
|
+
<p className="text-sm text-muted-foreground">
|
|
174
|
+
By clicking accept, you agree to our updated Terms of
|
|
175
|
+
Service and Privacy Policy.
|
|
176
|
+
</p>
|
|
177
|
+
</DialogPreset>`}
|
|
175
178
|
>
|
|
176
179
|
<DialogPreset
|
|
177
180
|
size={globalSize}
|
|
@@ -203,16 +206,17 @@ function DialogMacroShowcase({ globalSize }: { globalSize: Size }) {
|
|
|
203
206
|
label="Large Content Sizing"
|
|
204
207
|
description="Sử dụng size='lg' cho nội dung lớn hơn."
|
|
205
208
|
codeString={`<DialogPreset
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
>
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
</
|
|
215
|
-
|
|
209
|
+
title="Detailed Report"
|
|
210
|
+
description="Monthly analytics and performance overview."
|
|
211
|
+
trigger={<Button variant="outline">View Report</Button>}
|
|
212
|
+
footer={<Button>Download PDF</Button>}
|
|
213
|
+
>
|
|
214
|
+
<div className="h-[200px] flex items-center justify-center rounded-md border border-border border-dashed bg-muted/20">
|
|
215
|
+
<span className="text-muted-foreground text-sm">
|
|
216
|
+
Large Content Area
|
|
217
|
+
</span>
|
|
218
|
+
</div>
|
|
219
|
+
</DialogPreset>`}
|
|
216
220
|
>
|
|
217
221
|
<DialogPreset
|
|
218
222
|
size={globalSize}
|
|
@@ -239,30 +243,37 @@ function DialogMacroShowcase({ globalSize }: { globalSize: Size }) {
|
|
|
239
243
|
label="Controlled State"
|
|
240
244
|
description="Sử dụng open và onOpenChange để quản lý trạng thái đóng mở bằng React state."
|
|
241
245
|
codeString={`<div className="w-full flex flex-col gap-4 items-center justify-center">
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
</span>
|
|
249
|
-
</div>
|
|
250
|
-
|
|
251
|
-
<DialogPreset
|
|
252
|
-
open={controlledOpen}
|
|
253
|
-
onOpenChange={setControlledOpen}
|
|
254
|
-
title="Controlled Dialog"
|
|
255
|
-
description="Trạng thái của dialog này được quản lý hoàn toàn bởi React state bên ngoài."
|
|
256
|
-
footer={
|
|
257
|
-
<Button color="primary" onClick={() => setControlledOpen(false)}>
|
|
258
|
-
Close Manually
|
|
246
|
+
<div className="flex gap-4 items-center">
|
|
247
|
+
<Button
|
|
248
|
+
onClick={() => setControlledOpen(true)}
|
|
249
|
+
variant="outline"
|
|
250
|
+
>
|
|
251
|
+
Open Controlled Dialog
|
|
259
252
|
</Button>
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
253
|
+
<span className="text-sm text-muted-foreground font-mono">
|
|
254
|
+
State: {controlledOpen ? "true" : "false"}
|
|
255
|
+
</span>
|
|
256
|
+
</div>
|
|
257
|
+
|
|
258
|
+
<DialogPreset
|
|
259
|
+
open={controlledOpen}
|
|
260
|
+
onOpenChange={setControlledOpen}
|
|
261
|
+
title="Controlled Dialog"
|
|
262
|
+
description="Trạng thái của dialog này được quản lý hoàn toàn bởi React state bên ngoài."
|
|
263
|
+
footer={
|
|
264
|
+
<Button
|
|
265
|
+
color="primary"
|
|
266
|
+
onClick={() => setControlledOpen(false)}
|
|
267
|
+
>
|
|
268
|
+
Close Manually
|
|
269
|
+
</Button>
|
|
270
|
+
}
|
|
271
|
+
>
|
|
272
|
+
<p className="text-sm text-foreground">
|
|
273
|
+
Bạn có thể đóng bằng nút bên dưới hoặc dấu X.
|
|
274
|
+
</p>
|
|
275
|
+
</DialogPreset>
|
|
276
|
+
</div>`}
|
|
266
277
|
>
|
|
267
278
|
<div className="w-full flex flex-col gap-4 items-center justify-center">
|
|
268
279
|
<div className="flex gap-4 items-center">
|
|
@@ -305,38 +316,35 @@ function DialogMacroShowcase({ globalSize }: { globalSize: Size }) {
|
|
|
305
316
|
label="Sticky Footer (Long Content)"
|
|
306
317
|
description="Layout in-flow giúp footer luôn dính ở dưới cùng khi có thanh cuộn."
|
|
307
318
|
codeString={`<DialogPreset
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
>
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
>
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
<span className="text-sm text-muted-foreground">
|
|
319
|
+
trigger={
|
|
320
|
+
<Button variant="outline">View Long Content</Button>
|
|
321
|
+
}
|
|
322
|
+
title="Terms & Conditions"
|
|
323
|
+
description="Cuộn xuống dưới cùng để có thể đồng ý với điều khoản."
|
|
324
|
+
footer={
|
|
325
|
+
<div className="flex w-full sm:justify-end gap-2">
|
|
326
|
+
<DialogClose render={<Button variant="ghost" />}>
|
|
327
|
+
Cancel
|
|
328
|
+
</DialogClose>
|
|
329
|
+
<Button>I Agree</Button>
|
|
330
|
+
</div>
|
|
331
|
+
}
|
|
332
|
+
>
|
|
333
|
+
<div className="flex h-[800px] flex-col items-center justify-between rounded-md border border-border border-dashed bg-muted/20 py-8">
|
|
334
|
+
<span className="text-sm font-medium text-muted-foreground">
|
|
335
|
+
START OF CONTENT
|
|
336
|
+
</span>
|
|
337
|
+
<div className="flex flex-col items-center gap-2">
|
|
338
|
+
<span className="text-4xl">👇</span>
|
|
339
|
+
<span className="text-sm text-muted-foreground">
|
|
340
|
+
Keep scrolling
|
|
341
|
+
</span>
|
|
342
|
+
</div>
|
|
343
|
+
<span className="text-sm font-medium text-muted-foreground">
|
|
344
|
+
END OF CONTENT
|
|
345
|
+
</span>
|
|
333
346
|
</div>
|
|
334
|
-
|
|
335
|
-
END OF CONTENT
|
|
336
|
-
</span>
|
|
337
|
-
</div>
|
|
338
|
-
</DialogPreset>
|
|
339
|
-
`}
|
|
347
|
+
</DialogPreset>`}
|
|
340
348
|
>
|
|
341
349
|
<DialogPreset
|
|
342
350
|
trigger={
|
|
@@ -398,49 +406,43 @@ function DialogMicroShowcase({ globalSize }: { globalSize: Size }) {
|
|
|
398
406
|
label="Basic Usage"
|
|
399
407
|
description="Sử dụng các thành phần rời rạc để tạo dialog cơ bản."
|
|
400
408
|
codeString={`<Dialog>
|
|
401
|
-
|
|
402
|
-
render={
|
|
403
|
-
<Button variant="outline">
|
|
404
|
-
Upgrade Plan
|
|
405
|
-
</Button>
|
|
406
|
-
}
|
|
407
|
-
/>
|
|
408
|
-
|
|
409
|
-
<DialogPortal><DialogContent className={contentClass}>
|
|
410
|
-
<DialogHeader>
|
|
411
|
-
<DialogTitle>Update Subscription</DialogTitle>
|
|
412
|
-
<DialogDescription>
|
|
413
|
-
Are you sure you want to upgrade your plan to Pro? This will
|
|
414
|
-
charge your card immediately.
|
|
415
|
-
</DialogDescription>
|
|
416
|
-
</DialogHeader>
|
|
417
|
-
<DialogFooter className="-mx-4 -mb-4 mt-4 rounded-b-xl border-t border-t-border bg-muted/50 p-4">
|
|
418
|
-
<DialogClose
|
|
419
|
-
render={<Button variant="ghost" />}
|
|
420
|
-
>
|
|
421
|
-
Cancel
|
|
422
|
-
</DialogClose>
|
|
423
|
-
<Button color="primary">
|
|
424
|
-
Confirm
|
|
425
|
-
</Button>
|
|
426
|
-
</DialogFooter>
|
|
427
|
-
<DialogClose
|
|
409
|
+
<DialogTrigger
|
|
428
410
|
render={
|
|
429
|
-
<Button
|
|
430
|
-
variant="ghost"
|
|
431
|
-
className="absolute top-2 right-2"
|
|
432
|
-
size="sm"
|
|
433
|
-
iconOnly
|
|
434
|
-
/>
|
|
411
|
+
<Button variant="outline">Upgrade Plan</Button>
|
|
435
412
|
}
|
|
436
|
-
|
|
437
|
-
<XIcon />
|
|
438
|
-
<span className="sr-only">Close</span>
|
|
439
|
-
</DialogClose>
|
|
440
|
-
</DialogContent></DialogPortal>
|
|
413
|
+
/>
|
|
441
414
|
|
|
442
|
-
|
|
443
|
-
|
|
415
|
+
<DialogPortal>
|
|
416
|
+
<DialogContent className={contentClass}>
|
|
417
|
+
<DialogHeader>
|
|
418
|
+
<DialogTitle>Update Subscription</DialogTitle>
|
|
419
|
+
<DialogDescription>
|
|
420
|
+
Are you sure you want to upgrade your plan to
|
|
421
|
+
Pro? This will charge your card immediately.
|
|
422
|
+
</DialogDescription>
|
|
423
|
+
</DialogHeader>
|
|
424
|
+
<DialogFooter className="-mx-4 -mb-4 mt-4 rounded-b-xl border-t border-t-border bg-muted/50 p-4">
|
|
425
|
+
<DialogClose render={<Button variant="ghost" />}>
|
|
426
|
+
Cancel
|
|
427
|
+
</DialogClose>
|
|
428
|
+
<Button color="primary">Confirm</Button>
|
|
429
|
+
</DialogFooter>
|
|
430
|
+
<DialogClose
|
|
431
|
+
render={
|
|
432
|
+
<Button
|
|
433
|
+
variant="ghost"
|
|
434
|
+
className="absolute top-2 right-2"
|
|
435
|
+
size="sm"
|
|
436
|
+
iconOnly
|
|
437
|
+
/>
|
|
438
|
+
}
|
|
439
|
+
>
|
|
440
|
+
<XIcon />
|
|
441
|
+
<span className="sr-only">Close</span>
|
|
442
|
+
</DialogClose>
|
|
443
|
+
</DialogContent>
|
|
444
|
+
</DialogPortal>
|
|
445
|
+
</Dialog>`}
|
|
444
446
|
>
|
|
445
447
|
<Dialog>
|
|
446
448
|
<DialogTrigger
|
|
@@ -492,66 +494,65 @@ function DialogMicroShowcase({ globalSize }: { globalSize: Size }) {
|
|
|
492
494
|
label="Forms & Custom Content"
|
|
493
495
|
description="Sử dụng form bên trong DialogContent."
|
|
494
496
|
codeString={`<Dialog>
|
|
495
|
-
|
|
496
|
-
render={
|
|
497
|
-
<Button variant="outline">
|
|
498
|
-
Edit Profile
|
|
499
|
-
</Button>
|
|
500
|
-
}
|
|
501
|
-
/>
|
|
502
|
-
|
|
503
|
-
<DialogPortal><DialogContent className={contentClass}>
|
|
504
|
-
<DialogHeader>
|
|
505
|
-
<DialogTitle>Edit profile</DialogTitle>
|
|
506
|
-
<DialogDescription>
|
|
507
|
-
Make changes to your profile here. Click save when you're
|
|
508
|
-
done.
|
|
509
|
-
</DialogDescription>
|
|
510
|
-
</DialogHeader>
|
|
511
|
-
<div className="grid gap-4 py-4">
|
|
512
|
-
<div className="grid grid-cols-4 items-center gap-4">
|
|
513
|
-
<Label htmlFor="name" className="text-right">
|
|
514
|
-
Name
|
|
515
|
-
</Label>
|
|
516
|
-
<Input
|
|
517
|
-
id="name"
|
|
518
|
-
defaultValue="Pedro Duarte"
|
|
519
|
-
className="col-span-3"
|
|
520
|
-
/>
|
|
521
|
-
</div>
|
|
522
|
-
<div className="grid grid-cols-4 items-center gap-4">
|
|
523
|
-
<Label htmlFor="username" className="text-right">
|
|
524
|
-
Username
|
|
525
|
-
</Label>
|
|
526
|
-
<Input
|
|
527
|
-
id="username"
|
|
528
|
-
defaultValue="@peduarte"
|
|
529
|
-
className="col-span-3"
|
|
530
|
-
/>
|
|
531
|
-
</div>
|
|
532
|
-
</div>
|
|
533
|
-
<DialogFooter className="-mx-4 -mb-4 mt-4 rounded-b-xl border-t border-t-border bg-muted/50 p-4">
|
|
534
|
-
<Button type="submit">
|
|
535
|
-
Save changes
|
|
536
|
-
</Button>
|
|
537
|
-
</DialogFooter>
|
|
538
|
-
<DialogClose
|
|
497
|
+
<DialogTrigger
|
|
539
498
|
render={
|
|
540
|
-
<Button
|
|
541
|
-
variant="ghost"
|
|
542
|
-
className="absolute top-2 right-2"
|
|
543
|
-
size="sm"
|
|
544
|
-
iconOnly
|
|
545
|
-
/>
|
|
499
|
+
<Button variant="outline">Edit Profile</Button>
|
|
546
500
|
}
|
|
547
|
-
|
|
548
|
-
<XIcon />
|
|
549
|
-
<span className="sr-only">Close</span>
|
|
550
|
-
</DialogClose>
|
|
551
|
-
</DialogContent></DialogPortal>
|
|
501
|
+
/>
|
|
552
502
|
|
|
553
|
-
|
|
554
|
-
|
|
503
|
+
<DialogPortal>
|
|
504
|
+
<DialogContent className={contentClass}>
|
|
505
|
+
<DialogHeader>
|
|
506
|
+
<DialogTitle>Edit profile</DialogTitle>
|
|
507
|
+
<DialogDescription>
|
|
508
|
+
Make changes to your profile here. Click save
|
|
509
|
+
when you're done.
|
|
510
|
+
</DialogDescription>
|
|
511
|
+
</DialogHeader>
|
|
512
|
+
<div className="grid gap-4 py-4">
|
|
513
|
+
<div className="grid grid-cols-4 items-center gap-4">
|
|
514
|
+
<Label htmlFor="name" className="text-right">
|
|
515
|
+
Name
|
|
516
|
+
</Label>
|
|
517
|
+
<Input
|
|
518
|
+
id="name"
|
|
519
|
+
defaultValue="Pedro Duarte"
|
|
520
|
+
className="col-span-3"
|
|
521
|
+
/>
|
|
522
|
+
</div>
|
|
523
|
+
<div className="grid grid-cols-4 items-center gap-4">
|
|
524
|
+
<Label
|
|
525
|
+
htmlFor="username"
|
|
526
|
+
className="text-right"
|
|
527
|
+
>
|
|
528
|
+
Username
|
|
529
|
+
</Label>
|
|
530
|
+
<Input
|
|
531
|
+
id="username"
|
|
532
|
+
defaultValue="@peduarte"
|
|
533
|
+
className="col-span-3"
|
|
534
|
+
/>
|
|
535
|
+
</div>
|
|
536
|
+
</div>
|
|
537
|
+
<DialogFooter className="-mx-4 -mb-4 mt-4 rounded-b-xl border-t border-t-border bg-muted/50 p-4">
|
|
538
|
+
<Button type="submit">Save changes</Button>
|
|
539
|
+
</DialogFooter>
|
|
540
|
+
<DialogClose
|
|
541
|
+
render={
|
|
542
|
+
<Button
|
|
543
|
+
variant="ghost"
|
|
544
|
+
className="absolute top-2 right-2"
|
|
545
|
+
size="sm"
|
|
546
|
+
iconOnly
|
|
547
|
+
/>
|
|
548
|
+
}
|
|
549
|
+
>
|
|
550
|
+
<XIcon />
|
|
551
|
+
<span className="sr-only">Close</span>
|
|
552
|
+
</DialogClose>
|
|
553
|
+
</DialogContent>
|
|
554
|
+
</DialogPortal>
|
|
555
|
+
</Dialog>`}
|
|
555
556
|
>
|
|
556
557
|
<Dialog>
|
|
557
558
|
<DialogTrigger
|
|
@@ -622,38 +623,34 @@ function DialogMicroShowcase({ globalSize }: { globalSize: Size }) {
|
|
|
622
623
|
label="No Close Button"
|
|
623
624
|
description="Không render nút XIcon thủ công."
|
|
624
625
|
codeString={`<Dialog>
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
View Terms
|
|
629
|
-
</Button>
|
|
630
|
-
}
|
|
631
|
-
/>
|
|
632
|
-
|
|
633
|
-
<DialogPortal><DialogContent className={contentClass}>
|
|
634
|
-
<DialogHeader>
|
|
635
|
-
<DialogTitle>Terms of Service</DialogTitle>
|
|
636
|
-
<DialogDescription>
|
|
637
|
-
You must accept the new terms to continue using the
|
|
638
|
-
application.
|
|
639
|
-
</DialogDescription>
|
|
640
|
-
</DialogHeader>
|
|
641
|
-
<p className="text-sm text-muted-foreground">
|
|
642
|
-
By clicking accept, you agree to our updated Terms of Service
|
|
643
|
-
and Privacy Policy.
|
|
644
|
-
</p>
|
|
645
|
-
<DialogFooter className="-mx-4 -mb-4 mt-4 rounded-b-xl border-t border-t-border bg-muted/50 p-4">
|
|
646
|
-
<DialogClose
|
|
647
|
-
render={<Button variant="outline" />}
|
|
648
|
-
>
|
|
649
|
-
Decline
|
|
650
|
-
</DialogClose>
|
|
651
|
-
<Button>Accept</Button>
|
|
652
|
-
</DialogFooter>
|
|
653
|
-
</DialogContent></DialogPortal>
|
|
626
|
+
<DialogTrigger
|
|
627
|
+
render={<Button variant="outline">View Terms</Button>}
|
|
628
|
+
/>
|
|
654
629
|
|
|
655
|
-
|
|
656
|
-
|
|
630
|
+
<DialogPortal>
|
|
631
|
+
<DialogContent className={contentClass}>
|
|
632
|
+
<DialogHeader>
|
|
633
|
+
<DialogTitle>Terms of Service</DialogTitle>
|
|
634
|
+
<DialogDescription>
|
|
635
|
+
You must accept the new terms to continue using
|
|
636
|
+
the application.
|
|
637
|
+
</DialogDescription>
|
|
638
|
+
</DialogHeader>
|
|
639
|
+
<p className="text-sm text-muted-foreground">
|
|
640
|
+
By clicking accept, you agree to our updated Terms
|
|
641
|
+
of Service and Privacy Policy.
|
|
642
|
+
</p>
|
|
643
|
+
<DialogFooter className="-mx-4 -mb-4 mt-4 rounded-b-xl border-t border-t-border bg-muted/50 p-4">
|
|
644
|
+
<DialogClose
|
|
645
|
+
render={<Button variant="outline" />}
|
|
646
|
+
>
|
|
647
|
+
Decline
|
|
648
|
+
</DialogClose>
|
|
649
|
+
<Button>Accept</Button>
|
|
650
|
+
</DialogFooter>
|
|
651
|
+
</DialogContent>
|
|
652
|
+
</DialogPortal>
|
|
653
|
+
</Dialog>`}
|
|
657
654
|
>
|
|
658
655
|
<Dialog>
|
|
659
656
|
<DialogTrigger
|
|
@@ -694,46 +691,44 @@ function DialogMicroShowcase({ globalSize }: { globalSize: Size }) {
|
|
|
694
691
|
label="Large Content Sizing"
|
|
695
692
|
description="Sử dụng sm:max-w-lg cho nội dung lớn hơn."
|
|
696
693
|
codeString={`<Dialog>
|
|
697
|
-
|
|
698
|
-
render={
|
|
699
|
-
<Button variant="outline">
|
|
700
|
-
View Report
|
|
701
|
-
</Button>
|
|
702
|
-
}
|
|
703
|
-
/>
|
|
704
|
-
|
|
705
|
-
<DialogPortal><DialogContent className={contentClass}>
|
|
706
|
-
<DialogHeader>
|
|
707
|
-
<DialogTitle>Detailed Report</DialogTitle>
|
|
708
|
-
<DialogDescription>
|
|
709
|
-
Monthly analytics and performance overview.
|
|
710
|
-
</DialogDescription>
|
|
711
|
-
</DialogHeader>
|
|
712
|
-
<div className="flex h-[200px] items-center justify-center rounded-md border border-border border-dashed bg-muted/20">
|
|
713
|
-
<span className="text-sm text-muted-foreground">
|
|
714
|
-
Large Content Area
|
|
715
|
-
</span>
|
|
716
|
-
</div>
|
|
717
|
-
<DialogFooter className="-mx-4 -mb-4 mt-4 rounded-b-xl border-t border-t-border bg-muted/50 p-4">
|
|
718
|
-
<Button>Download PDF</Button>
|
|
719
|
-
</DialogFooter>
|
|
720
|
-
<DialogClose
|
|
694
|
+
<DialogTrigger
|
|
721
695
|
render={
|
|
722
|
-
<Button
|
|
723
|
-
variant="ghost"
|
|
724
|
-
className="absolute top-2 right-2"
|
|
725
|
-
size="sm"
|
|
726
|
-
iconOnly
|
|
727
|
-
/>
|
|
696
|
+
<Button variant="outline">View Report</Button>
|
|
728
697
|
}
|
|
729
|
-
|
|
730
|
-
<XIcon />
|
|
731
|
-
<span className="sr-only">Close</span>
|
|
732
|
-
</DialogClose>
|
|
733
|
-
</DialogContent></DialogPortal>
|
|
698
|
+
/>
|
|
734
699
|
|
|
735
|
-
|
|
736
|
-
|
|
700
|
+
<DialogPortal>
|
|
701
|
+
<DialogContent className={contentClass}>
|
|
702
|
+
<DialogHeader>
|
|
703
|
+
<DialogTitle>Detailed Report</DialogTitle>
|
|
704
|
+
<DialogDescription>
|
|
705
|
+
Monthly analytics and performance overview.
|
|
706
|
+
</DialogDescription>
|
|
707
|
+
</DialogHeader>
|
|
708
|
+
<div className="flex h-[200px] items-center justify-center rounded-md border border-border border-dashed bg-muted/20">
|
|
709
|
+
<span className="text-sm text-muted-foreground">
|
|
710
|
+
Large Content Area
|
|
711
|
+
</span>
|
|
712
|
+
</div>
|
|
713
|
+
<DialogFooter className="-mx-4 -mb-4 mt-4 rounded-b-xl border-t border-t-border bg-muted/50 p-4">
|
|
714
|
+
<Button>Download PDF</Button>
|
|
715
|
+
</DialogFooter>
|
|
716
|
+
<DialogClose
|
|
717
|
+
render={
|
|
718
|
+
<Button
|
|
719
|
+
variant="ghost"
|
|
720
|
+
className="absolute top-2 right-2"
|
|
721
|
+
size="sm"
|
|
722
|
+
iconOnly
|
|
723
|
+
/>
|
|
724
|
+
}
|
|
725
|
+
>
|
|
726
|
+
<XIcon />
|
|
727
|
+
<span className="sr-only">Close</span>
|
|
728
|
+
</DialogClose>
|
|
729
|
+
</DialogContent>
|
|
730
|
+
</DialogPortal>
|
|
731
|
+
</Dialog>`}
|
|
737
732
|
>
|
|
738
733
|
<Dialog>
|
|
739
734
|
<DialogTrigger
|
|
@@ -784,48 +779,59 @@ function DialogMicroShowcase({ globalSize }: { globalSize: Size }) {
|
|
|
784
779
|
label="Controlled State"
|
|
785
780
|
description="Sử dụng open và onOpenChange để quản lý trạng thái đóng mở bằng React state."
|
|
786
781
|
codeString={`<div className="w-full flex flex-col gap-4 items-center justify-center">
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
<span className="text-sm text-muted-foreground font-mono">
|
|
792
|
-
State: {controlledOpen ? "true" : "false"}
|
|
793
|
-
</span>
|
|
794
|
-
</div>
|
|
795
|
-
|
|
796
|
-
<Dialog open={controlledOpen} onOpenChange={setControlledOpen}>
|
|
797
|
-
|
|
798
|
-
<DialogPortal><DialogContent className={contentClass}>
|
|
799
|
-
<DialogHeader>
|
|
800
|
-
<DialogTitle>Controlled Dialog</DialogTitle>
|
|
801
|
-
<DialogDescription>
|
|
802
|
-
Trạng thái của dialog này được quản lý hoàn toàn bởi React state bên ngoài.
|
|
803
|
-
</DialogDescription>
|
|
804
|
-
</DialogHeader>
|
|
805
|
-
<p className="text-sm text-foreground">Bạn có thể đóng bằng nút bên dưới hoặc dấu X.</p>
|
|
806
|
-
<DialogFooter className="-mx-4 -mb-4 mt-4 rounded-b-xl border-t border-t-border bg-muted/50 p-4">
|
|
807
|
-
<Button color="primary" onClick={() => setControlledOpen(false)}>
|
|
808
|
-
Close Manually
|
|
809
|
-
</Button>
|
|
810
|
-
</DialogFooter>
|
|
811
|
-
<DialogClose
|
|
812
|
-
render={
|
|
813
|
-
<Button
|
|
814
|
-
variant="ghost"
|
|
815
|
-
className="absolute top-2 right-2"
|
|
816
|
-
size="sm"
|
|
817
|
-
iconOnly
|
|
818
|
-
/>
|
|
819
|
-
}
|
|
782
|
+
<div className="flex gap-4 items-center">
|
|
783
|
+
<Button
|
|
784
|
+
onClick={() => setControlledOpen(true)}
|
|
785
|
+
variant="outline"
|
|
820
786
|
>
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
787
|
+
Open Controlled Dialog
|
|
788
|
+
</Button>
|
|
789
|
+
<span className="text-sm text-muted-foreground font-mono">
|
|
790
|
+
State: {controlledOpen ? "true" : "false"}
|
|
791
|
+
</span>
|
|
792
|
+
</div>
|
|
825
793
|
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
794
|
+
<Dialog
|
|
795
|
+
open={controlledOpen}
|
|
796
|
+
onOpenChange={setControlledOpen}
|
|
797
|
+
>
|
|
798
|
+
<DialogPortal>
|
|
799
|
+
<DialogContent className={contentClass}>
|
|
800
|
+
<DialogHeader>
|
|
801
|
+
<DialogTitle>Controlled Dialog</DialogTitle>
|
|
802
|
+
<DialogDescription>
|
|
803
|
+
Trạng thái của dialog này được quản lý hoàn
|
|
804
|
+
toàn bởi React state bên ngoài.
|
|
805
|
+
</DialogDescription>
|
|
806
|
+
</DialogHeader>
|
|
807
|
+
<p className="text-sm text-foreground">
|
|
808
|
+
Bạn có thể đóng bằng nút bên dưới hoặc dấu X.
|
|
809
|
+
</p>
|
|
810
|
+
<DialogFooter className="-mx-4 -mb-4 mt-4 rounded-b-xl border-t border-t-border bg-muted/50 p-4">
|
|
811
|
+
<Button
|
|
812
|
+
color="primary"
|
|
813
|
+
onClick={() => setControlledOpen(false)}
|
|
814
|
+
>
|
|
815
|
+
Close Manually
|
|
816
|
+
</Button>
|
|
817
|
+
</DialogFooter>
|
|
818
|
+
<DialogClose
|
|
819
|
+
render={
|
|
820
|
+
<Button
|
|
821
|
+
variant="ghost"
|
|
822
|
+
className="absolute top-2 right-2"
|
|
823
|
+
size="sm"
|
|
824
|
+
iconOnly
|
|
825
|
+
/>
|
|
826
|
+
}
|
|
827
|
+
>
|
|
828
|
+
<XIcon />
|
|
829
|
+
<span className="sr-only">Close</span>
|
|
830
|
+
</DialogClose>
|
|
831
|
+
</DialogContent>
|
|
832
|
+
</DialogPortal>
|
|
833
|
+
</Dialog>
|
|
834
|
+
</div>`}
|
|
829
835
|
>
|
|
830
836
|
<div className="w-full flex flex-col gap-4 items-center justify-center">
|
|
831
837
|
<div className="flex gap-4 items-center">
|
|
@@ -847,8 +853,8 @@ function DialogMicroShowcase({ globalSize }: { globalSize: Size }) {
|
|
|
847
853
|
<DialogHeader>
|
|
848
854
|
<DialogTitle>Controlled Dialog</DialogTitle>
|
|
849
855
|
<DialogDescription>
|
|
850
|
-
Trạng thái của dialog này được quản lý hoàn toàn bởi
|
|
851
|
-
|
|
856
|
+
Trạng thái của dialog này được quản lý hoàn toàn bởi React
|
|
857
|
+
state bên ngoài.
|
|
852
858
|
</DialogDescription>
|
|
853
859
|
</DialogHeader>
|
|
854
860
|
<p className="text-sm text-foreground">
|
|
@@ -886,60 +892,64 @@ function DialogMicroShowcase({ globalSize }: { globalSize: Size }) {
|
|
|
886
892
|
label="Sticky Footer (Long Content)"
|
|
887
893
|
description="Ghi đè class của DialogContent thành flex-col để khóa scroll ở phần body."
|
|
888
894
|
codeString={`<Dialog>
|
|
889
|
-
|
|
890
|
-
render={
|
|
891
|
-
<Button variant="outline">
|
|
892
|
-
View Long Content
|
|
893
|
-
</Button>
|
|
894
|
-
}
|
|
895
|
-
/>
|
|
896
|
-
|
|
897
|
-
<DialogPortal><DialogContent className={cn(contentClass, "flex flex-col gap-0 p-0 overflow-hidden")}>
|
|
898
|
-
<DialogHeader className="shrink-0 p-4 pb-0">
|
|
899
|
-
<DialogTitle>Terms & Conditions</DialogTitle>
|
|
900
|
-
<DialogDescription>
|
|
901
|
-
Cuộn xuống dưới cùng để có thể đồng ý với điều khoản.
|
|
902
|
-
</DialogDescription>
|
|
903
|
-
</DialogHeader>
|
|
904
|
-
<div className="flex-1 min-h-0 overflow-y-auto p-4">
|
|
905
|
-
<div className="flex h-[800px] flex-col items-center justify-between rounded-md border border-border border-dashed bg-muted/20 py-8">
|
|
906
|
-
<span className="text-sm font-medium text-muted-foreground">
|
|
907
|
-
START OF CONTENT
|
|
908
|
-
</span>
|
|
909
|
-
<div className="flex flex-col items-center gap-2">
|
|
910
|
-
<span className="text-4xl">👇</span>
|
|
911
|
-
<span className="text-sm text-muted-foreground">Keep scrolling</span>
|
|
912
|
-
</div>
|
|
913
|
-
<span className="text-sm font-medium text-muted-foreground">
|
|
914
|
-
END OF CONTENT
|
|
915
|
-
</span>
|
|
916
|
-
</div>
|
|
917
|
-
</div>
|
|
918
|
-
<DialogFooter className="shrink-0 rounded-b-xl border-t border-t-border bg-muted/50 p-4">
|
|
919
|
-
<DialogClose
|
|
920
|
-
render={<Button variant="ghost" />}
|
|
921
|
-
>
|
|
922
|
-
Cancel
|
|
923
|
-
</DialogClose>
|
|
924
|
-
<Button>I Agree</Button>
|
|
925
|
-
</DialogFooter>
|
|
926
|
-
<DialogClose
|
|
895
|
+
<DialogTrigger
|
|
927
896
|
render={
|
|
928
|
-
<Button
|
|
929
|
-
variant="ghost"
|
|
930
|
-
className="absolute top-2 right-2"
|
|
931
|
-
size="sm"
|
|
932
|
-
iconOnly
|
|
933
|
-
/>
|
|
897
|
+
<Button variant="outline">View Long Content</Button>
|
|
934
898
|
}
|
|
935
|
-
|
|
936
|
-
<XIcon />
|
|
937
|
-
<span className="sr-only">Close</span>
|
|
938
|
-
</DialogClose>
|
|
939
|
-
</DialogContent></DialogPortal>
|
|
899
|
+
/>
|
|
940
900
|
|
|
941
|
-
|
|
942
|
-
|
|
901
|
+
<DialogPortal>
|
|
902
|
+
<DialogContent
|
|
903
|
+
className={cn(
|
|
904
|
+
contentClass,
|
|
905
|
+
"flex flex-col gap-0 p-0 overflow-hidden",
|
|
906
|
+
)}
|
|
907
|
+
>
|
|
908
|
+
<DialogHeader className="shrink-0 p-4 pb-0">
|
|
909
|
+
<DialogTitle>Terms & Conditions</DialogTitle>
|
|
910
|
+
<DialogDescription>
|
|
911
|
+
Cuộn xuống dưới cùng để có thể đồng ý với điều
|
|
912
|
+
khoản.
|
|
913
|
+
</DialogDescription>
|
|
914
|
+
</DialogHeader>
|
|
915
|
+
<div className="flex-1 min-h-0 overflow-y-auto p-4">
|
|
916
|
+
<div className="flex h-[800px] flex-col items-center justify-between rounded-md border border-border border-dashed bg-muted/20 py-8">
|
|
917
|
+
<span className="text-sm font-medium text-muted-foreground">
|
|
918
|
+
START OF CONTENT
|
|
919
|
+
</span>
|
|
920
|
+
<div className="flex flex-col items-center gap-2">
|
|
921
|
+
<span className="text-4xl">👇</span>
|
|
922
|
+
<span className="text-sm text-muted-foreground">
|
|
923
|
+
Keep scrolling
|
|
924
|
+
</span>
|
|
925
|
+
</div>
|
|
926
|
+
<span className="text-sm font-medium text-muted-foreground">
|
|
927
|
+
END OF CONTENT
|
|
928
|
+
</span>
|
|
929
|
+
</div>
|
|
930
|
+
</div>
|
|
931
|
+
<DialogFooter className="shrink-0 rounded-b-xl border-t border-t-border bg-muted/50 p-4">
|
|
932
|
+
<DialogClose render={<Button variant="ghost" />}>
|
|
933
|
+
Cancel
|
|
934
|
+
</DialogClose>
|
|
935
|
+
<Button>I Agree</Button>
|
|
936
|
+
</DialogFooter>
|
|
937
|
+
<DialogClose
|
|
938
|
+
render={
|
|
939
|
+
<Button
|
|
940
|
+
variant="ghost"
|
|
941
|
+
className="absolute top-2 right-2"
|
|
942
|
+
size="sm"
|
|
943
|
+
iconOnly
|
|
944
|
+
/>
|
|
945
|
+
}
|
|
946
|
+
>
|
|
947
|
+
<XIcon />
|
|
948
|
+
<span className="sr-only">Close</span>
|
|
949
|
+
</DialogClose>
|
|
950
|
+
</DialogContent>
|
|
951
|
+
</DialogPortal>
|
|
952
|
+
</Dialog>`}
|
|
943
953
|
>
|
|
944
954
|
<Dialog>
|
|
945
955
|
<DialogTrigger
|
|
@@ -1011,46 +1021,57 @@ function DialogMicroShowcase({ globalSize }: { globalSize: Size }) {
|
|
|
1011
1021
|
description="Các kịch bản thực tế giúp bạn quyết định nên dùng Micro hay Macro."
|
|
1012
1022
|
fullWidth
|
|
1013
1023
|
codeString={`<div className="grid grid-cols-1 gap-6 md:grid-cols-2">
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1024
|
+
{/* ── Story 1: Macro wins ── */}
|
|
1025
|
+
<div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
|
|
1026
|
+
<div className="flex items-start gap-3">
|
|
1027
|
+
<span className="mt-0.5 shrink-0 rounded-full bg-green-500/10 p-1.5 text-green-600">
|
|
1028
|
+
<CheckCircle2Icon
|
|
1029
|
+
className="size-4"
|
|
1030
|
+
aria-hidden="true"
|
|
1031
|
+
/>
|
|
1032
|
+
</span>
|
|
1033
|
+
<div>
|
|
1034
|
+
<p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
|
|
1035
|
+
Story 1 · Dùng Macro
|
|
1036
|
+
</p>
|
|
1037
|
+
<h3 className="mt-0.5 text-sm font-semibold text-foreground">
|
|
1038
|
+
Cảnh báo hoặc Form cơ bản
|
|
1039
|
+
</h3>
|
|
1040
|
+
</div>
|
|
1027
1041
|
</div>
|
|
1042
|
+
<p className="text-xs text-muted-foreground leading-relaxed">
|
|
1043
|
+
Khi bạn chỉ cần một tiêu đề, mô tả và vài nút bấm ở
|
|
1044
|
+
footer (hoặc 1 form ngắn), Macro giúp bạn không phải
|
|
1045
|
+
khai báo hàng loạt component con.
|
|
1046
|
+
</p>
|
|
1028
1047
|
</div>
|
|
1029
|
-
<p className="text-xs text-muted-foreground leading-relaxed">
|
|
1030
|
-
Khi bạn chỉ cần một tiêu đề, mô tả và vài nút bấm ở footer (hoặc 1 form ngắn), Macro giúp bạn không phải khai báo hàng loạt component con.
|
|
1031
|
-
</p>
|
|
1032
|
-
</div>
|
|
1033
1048
|
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1049
|
+
{/* ── Story 2: Micro wins ── */}
|
|
1050
|
+
<div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
|
|
1051
|
+
<div className="flex items-start gap-3">
|
|
1052
|
+
<span className="mt-0.5 shrink-0 rounded-full bg-blue-500/10 p-1.5 text-blue-600">
|
|
1053
|
+
<LayersIcon
|
|
1054
|
+
className="size-4"
|
|
1055
|
+
aria-hidden="true"
|
|
1056
|
+
/>
|
|
1057
|
+
</span>
|
|
1058
|
+
<div>
|
|
1059
|
+
<p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
|
|
1060
|
+
Story 2 · Dùng Micro
|
|
1061
|
+
</p>
|
|
1062
|
+
<h3 className="mt-0.5 text-sm font-semibold text-foreground">
|
|
1063
|
+
Layout tuỳ chỉnh phức tạp
|
|
1064
|
+
</h3>
|
|
1065
|
+
</div>
|
|
1047
1066
|
</div>
|
|
1067
|
+
<p className="text-xs text-muted-foreground leading-relaxed">
|
|
1068
|
+
Khi bạn muốn Header có hình ảnh/icon đặc biệt, bỏ
|
|
1069
|
+
qua Footer chuẩn, hoặc có layout split-pane phức tạp
|
|
1070
|
+
bên trong Dialog. Micro cho phép bạn tự do thay đổi
|
|
1071
|
+
từng phần.
|
|
1072
|
+
</p>
|
|
1048
1073
|
</div>
|
|
1049
|
-
|
|
1050
|
-
Khi bạn muốn Header có hình ảnh/icon đặc biệt, bỏ qua Footer chuẩn, hoặc có layout split-pane phức tạp bên trong Dialog. Micro cho phép bạn tự do thay đổi từng phần.
|
|
1051
|
-
</p>
|
|
1052
|
-
</div>
|
|
1053
|
-
</div>`}
|
|
1074
|
+
</div>`}
|
|
1054
1075
|
>
|
|
1055
1076
|
<div className="grid grid-cols-1 gap-6 md:grid-cols-2">
|
|
1056
1077
|
{/* ── Story 1: Macro wins ── */}
|