gladvn 0.2.17 → 0.2.18
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 +1 -1
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
|
|
3
|
+
import { BoxIcon, SettingsIcon, SlidersHorizontalIcon } from "lucide-react";
|
|
4
|
+
|
|
1
5
|
import { AccordionPreset } from "../../components/macro/accordion-preset";
|
|
2
6
|
import {
|
|
3
7
|
Accordion,
|
|
@@ -12,8 +16,6 @@ import {
|
|
|
12
16
|
Showcase,
|
|
13
17
|
ShowcaseDocs,
|
|
14
18
|
} from "../../dev/components/showcase";
|
|
15
|
-
import { BoxIcon, SettingsIcon, SlidersHorizontalIcon } from "lucide-react";
|
|
16
|
-
import { useState } from "react";
|
|
17
19
|
|
|
18
20
|
// ──────────────────────────────────────────────────────────
|
|
19
21
|
// Shared Data
|
|
@@ -70,27 +72,29 @@ function AccordionMacroShowcase() {
|
|
|
70
72
|
label="Tiêu Chuẩn (Standard)"
|
|
71
73
|
description="Accordion mở đơn cơ bản."
|
|
72
74
|
codeString={`<AccordionPreset
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
75
|
+
className="w-full"
|
|
76
|
+
defaultValue={["item-1"]}
|
|
77
|
+
items={[
|
|
78
|
+
{
|
|
79
|
+
value: "item-1",
|
|
80
|
+
title: "Is it accessible?",
|
|
81
|
+
content:
|
|
82
|
+
"Yes. It adheres to the WAI-ARIA design pattern. Keyboard navigation and screen readers are fully supported.",
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
value: "item-2",
|
|
86
|
+
title: "Is it styled?",
|
|
87
|
+
content:
|
|
88
|
+
"Yes. It comes with default styles that match the other components' aesthetic.",
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
value: "item-3",
|
|
92
|
+
title: "Is it animated?",
|
|
93
|
+
content:
|
|
94
|
+
"Yes. It's animated by default with smooth transitions.",
|
|
95
|
+
},
|
|
96
|
+
]}
|
|
97
|
+
/>`}
|
|
94
98
|
>
|
|
95
99
|
<AccordionPreset
|
|
96
100
|
className="w-full"
|
|
@@ -122,28 +126,30 @@ function AccordionMacroShowcase() {
|
|
|
122
126
|
label="Mở Nhiều (Multiple Expansion)"
|
|
123
127
|
description="Cho phép mở nhiều mục cùng một lúc."
|
|
124
128
|
codeString={`<AccordionPreset
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
129
|
+
className="w-full"
|
|
130
|
+
multiple
|
|
131
|
+
defaultValue={["item-1", "item-2"]}
|
|
132
|
+
items={[
|
|
133
|
+
{
|
|
134
|
+
value: "item-1",
|
|
135
|
+
title: "Is it accessible?",
|
|
136
|
+
content:
|
|
137
|
+
"Yes. It adheres to the WAI-ARIA design pattern. Keyboard navigation and screen readers are fully supported.",
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
value: "item-2",
|
|
141
|
+
title: "Is it styled?",
|
|
142
|
+
content:
|
|
143
|
+
"Yes. It comes with default styles that match the other components' aesthetic.",
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
value: "item-3",
|
|
147
|
+
title: "Is it animated?",
|
|
148
|
+
content:
|
|
149
|
+
"Yes. It's animated by default with smooth transitions.",
|
|
150
|
+
},
|
|
151
|
+
]}
|
|
152
|
+
/>`}
|
|
147
153
|
>
|
|
148
154
|
<AccordionPreset
|
|
149
155
|
className="w-full"
|
|
@@ -246,29 +252,29 @@ return (
|
|
|
246
252
|
label="Disabled (Vô hiệu hoá)"
|
|
247
253
|
description="Từng mục riêng lẻ có thể bị vô hiệu hóa trong khi các mục khác vẫn tương tác bình thường."
|
|
248
254
|
codeString={`<AccordionPreset
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
255
|
+
className="w-full"
|
|
256
|
+
items={[
|
|
257
|
+
{
|
|
258
|
+
value: "enabled-1",
|
|
259
|
+
title: "Available Feature",
|
|
260
|
+
content:
|
|
261
|
+
"This feature is available and can be expanded normally.",
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
value: "disabled-1",
|
|
265
|
+
title: "Premium Feature (Locked)",
|
|
266
|
+
content:
|
|
267
|
+
"This content is hidden behind a premium plan.",
|
|
268
|
+
disabled: true,
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
value: "enabled-2",
|
|
272
|
+
title: "Another Feature",
|
|
273
|
+
content:
|
|
274
|
+
"This is another available feature you can interact with freely.",
|
|
275
|
+
},
|
|
276
|
+
]}
|
|
277
|
+
/>`}
|
|
272
278
|
>
|
|
273
279
|
<AccordionPreset
|
|
274
280
|
className="w-full"
|
|
@@ -301,25 +307,25 @@ return (
|
|
|
301
307
|
label="Nội Dung Phức Tạp"
|
|
302
308
|
description="Render các React Node bên trong nội dung."
|
|
303
309
|
codeString={`<AccordionPreset
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
310
|
+
className="w-full"
|
|
311
|
+
items={[
|
|
312
|
+
{
|
|
313
|
+
value: "profile",
|
|
314
|
+
title: "User Profile Settings",
|
|
315
|
+
content: (
|
|
316
|
+
<div className="flex flex-col items-start gap-3">
|
|
317
|
+
<p className="text-sm">
|
|
318
|
+
Update your personal information and
|
|
319
|
+
preferences.
|
|
320
|
+
</p>
|
|
321
|
+
<button className="rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground">
|
|
322
|
+
Edit Profile
|
|
323
|
+
</button>
|
|
324
|
+
</div>
|
|
325
|
+
),
|
|
326
|
+
},
|
|
327
|
+
]}
|
|
328
|
+
/>`}
|
|
323
329
|
>
|
|
324
330
|
<AccordionPreset
|
|
325
331
|
className="w-full"
|
|
@@ -346,45 +352,44 @@ return (
|
|
|
346
352
|
label="Lồng Nhau (Nested Accordions)"
|
|
347
353
|
description="Nội dung bên trong có thể chứa một Accordion khác."
|
|
348
354
|
codeString={`<AccordionPreset
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
`}
|
|
355
|
+
className="w-full"
|
|
356
|
+
items={[
|
|
357
|
+
{
|
|
358
|
+
value: "getting-started",
|
|
359
|
+
title: "Getting Started",
|
|
360
|
+
content: (
|
|
361
|
+
<AccordionPreset
|
|
362
|
+
className="w-full"
|
|
363
|
+
items={[
|
|
364
|
+
{
|
|
365
|
+
value: "installation",
|
|
366
|
+
title: "Installation",
|
|
367
|
+
content:
|
|
368
|
+
"Run npm install to add the component to your project.",
|
|
369
|
+
},
|
|
370
|
+
]}
|
|
371
|
+
/>
|
|
372
|
+
),
|
|
373
|
+
},
|
|
374
|
+
{
|
|
375
|
+
value: "advanced",
|
|
376
|
+
title: "Advanced Usage",
|
|
377
|
+
content: (
|
|
378
|
+
<AccordionPreset
|
|
379
|
+
className="w-full"
|
|
380
|
+
items={[
|
|
381
|
+
{
|
|
382
|
+
value: "controlled",
|
|
383
|
+
title: "Controlled Mode",
|
|
384
|
+
content:
|
|
385
|
+
"Use the value and onValueChange props to control which items are open.",
|
|
386
|
+
},
|
|
387
|
+
]}
|
|
388
|
+
/>
|
|
389
|
+
),
|
|
390
|
+
},
|
|
391
|
+
]}
|
|
392
|
+
/>`}
|
|
388
393
|
>
|
|
389
394
|
<AccordionPreset
|
|
390
395
|
className="w-full"
|
|
@@ -441,20 +446,35 @@ function AccordionMicroShowcase() {
|
|
|
441
446
|
<ExampleSection
|
|
442
447
|
label="Mở Đơn (Single Expand)"
|
|
443
448
|
description="Chỉ một mục được phép mở tại một thời điểm (mặc định)."
|
|
444
|
-
codeString={`<Accordion
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
449
|
+
codeString={`<Accordion
|
|
450
|
+
className="w-full"
|
|
451
|
+
defaultValue={["Is it accessible?"]}
|
|
452
|
+
>
|
|
453
|
+
<AccordionItem value="Is it accessible?">
|
|
454
|
+
<AccordionTrigger>Is it accessible?</AccordionTrigger>
|
|
455
|
+
<AccordionContent>
|
|
456
|
+
Yes. It adheres to the WAI-ARIA design pattern.
|
|
457
|
+
Keyboard navigation and screen readers are fully
|
|
458
|
+
supported.
|
|
459
|
+
</AccordionContent>
|
|
460
|
+
</AccordionItem>
|
|
461
|
+
<AccordionItem value="Is it styled?">
|
|
462
|
+
<AccordionTrigger>Is it styled?</AccordionTrigger>
|
|
463
|
+
<AccordionContent>
|
|
464
|
+
Yes. It comes with default styles that match the
|
|
465
|
+
other components' aesthetic. You can override every
|
|
466
|
+
token via CSS variables.
|
|
467
|
+
</AccordionContent>
|
|
468
|
+
</AccordionItem>
|
|
469
|
+
<AccordionItem value="Is it animated?">
|
|
470
|
+
<AccordionTrigger>Is it animated?</AccordionTrigger>
|
|
471
|
+
<AccordionContent>
|
|
472
|
+
Yes. It's animated by default with smooth
|
|
473
|
+
expand/collapse transitions, but you can disable
|
|
474
|
+
animation if you prefer.
|
|
475
|
+
</AccordionContent>
|
|
476
|
+
</AccordionItem>
|
|
477
|
+
</Accordion>`}
|
|
458
478
|
>
|
|
459
479
|
<Accordion className="w-full" defaultValue={["Is it accessible?"]}>
|
|
460
480
|
<AccordionItem value="Is it accessible?">
|
|
@@ -482,20 +502,36 @@ function AccordionMicroShowcase() {
|
|
|
482
502
|
<ExampleSection
|
|
483
503
|
label="Mở Nhiều (Multiple Expand)"
|
|
484
504
|
description="Cho phép mở nhiều mục cùng lúc."
|
|
485
|
-
codeString={`<Accordion
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
505
|
+
codeString={`<Accordion
|
|
506
|
+
className="w-full"
|
|
507
|
+
multiple
|
|
508
|
+
defaultValue={["Is it accessible?", "Is it styled?"]}
|
|
509
|
+
>
|
|
510
|
+
<AccordionItem value="Is it accessible?">
|
|
511
|
+
<AccordionTrigger>Is it accessible?</AccordionTrigger>
|
|
512
|
+
<AccordionContent>
|
|
513
|
+
Yes. It adheres to the WAI-ARIA design pattern.
|
|
514
|
+
Keyboard navigation and screen readers are fully
|
|
515
|
+
supported.
|
|
516
|
+
</AccordionContent>
|
|
517
|
+
</AccordionItem>
|
|
518
|
+
<AccordionItem value="Is it styled?">
|
|
519
|
+
<AccordionTrigger>Is it styled?</AccordionTrigger>
|
|
520
|
+
<AccordionContent>
|
|
521
|
+
Yes. It comes with default styles that match the
|
|
522
|
+
other components' aesthetic. You can override every
|
|
523
|
+
token via CSS variables.
|
|
524
|
+
</AccordionContent>
|
|
525
|
+
</AccordionItem>
|
|
526
|
+
<AccordionItem value="Is it animated?">
|
|
527
|
+
<AccordionTrigger>Is it animated?</AccordionTrigger>
|
|
528
|
+
<AccordionContent>
|
|
529
|
+
Yes. It's animated by default with smooth
|
|
530
|
+
expand/collapse transitions, but you can disable
|
|
531
|
+
animation if you prefer.
|
|
532
|
+
</AccordionContent>
|
|
533
|
+
</AccordionItem>
|
|
534
|
+
</Accordion>`}
|
|
499
535
|
>
|
|
500
536
|
<Accordion
|
|
501
537
|
className="w-full"
|
|
@@ -530,27 +566,29 @@ function AccordionMicroShowcase() {
|
|
|
530
566
|
label="Disabled (Vô hiệu hoá)"
|
|
531
567
|
description="Từng mục riêng lẻ có thể bị vô hiệu hóa trong khi các mục khác vẫn tương tác bình thường."
|
|
532
568
|
codeString={`<Accordion className="w-full">
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
<
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
569
|
+
<AccordionItem value="enabled-1">
|
|
570
|
+
<AccordionTrigger>Available Feature</AccordionTrigger>
|
|
571
|
+
<AccordionContent>
|
|
572
|
+
This feature is available and can be expanded
|
|
573
|
+
normally. Click to see the details.
|
|
574
|
+
</AccordionContent>
|
|
575
|
+
</AccordionItem>
|
|
576
|
+
<AccordionItem value="disabled-1" disabled>
|
|
577
|
+
<AccordionTrigger>
|
|
578
|
+
Premium Feature (Locked)
|
|
579
|
+
</AccordionTrigger>
|
|
580
|
+
<AccordionContent>
|
|
581
|
+
This content is hidden behind a premium plan.
|
|
582
|
+
</AccordionContent>
|
|
583
|
+
</AccordionItem>
|
|
584
|
+
<AccordionItem value="enabled-2">
|
|
585
|
+
<AccordionTrigger>Another Feature</AccordionTrigger>
|
|
586
|
+
<AccordionContent>
|
|
587
|
+
This is another available feature you can interact
|
|
588
|
+
with freely.
|
|
589
|
+
</AccordionContent>
|
|
590
|
+
</AccordionItem>
|
|
591
|
+
</Accordion>`}
|
|
554
592
|
>
|
|
555
593
|
<Accordion className="w-full">
|
|
556
594
|
<AccordionItem value="enabled-1">
|
|
@@ -579,47 +617,57 @@ function AccordionMicroShowcase() {
|
|
|
579
617
|
label="Lồng Nhau (Nested Accordions)"
|
|
580
618
|
description="Nội dung bên trong có thể chứa một Accordion khác để tạo cấu trúc nhiều cấp."
|
|
581
619
|
codeString={`<Accordion className="w-full max-w-lg">
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
620
|
+
<AccordionItem value="getting-started">
|
|
621
|
+
<AccordionTrigger>Getting Started</AccordionTrigger>
|
|
622
|
+
<AccordionContent>
|
|
623
|
+
<Accordion>
|
|
624
|
+
<AccordionItem value="installation">
|
|
625
|
+
<AccordionTrigger>
|
|
626
|
+
Installation
|
|
627
|
+
</AccordionTrigger>
|
|
628
|
+
<AccordionContent>
|
|
629
|
+
Run npm install to add the component to your
|
|
630
|
+
project.
|
|
631
|
+
</AccordionContent>
|
|
632
|
+
</AccordionItem>
|
|
633
|
+
<AccordionItem value="configuration">
|
|
634
|
+
<AccordionTrigger>
|
|
635
|
+
Configuration
|
|
636
|
+
</AccordionTrigger>
|
|
637
|
+
<AccordionContent>
|
|
638
|
+
Import and wrap your content with the
|
|
639
|
+
Accordion component.
|
|
640
|
+
</AccordionContent>
|
|
641
|
+
</AccordionItem>
|
|
642
|
+
</Accordion>
|
|
643
|
+
</AccordionContent>
|
|
644
|
+
</AccordionItem>
|
|
645
|
+
<AccordionItem value="advanced">
|
|
646
|
+
<AccordionTrigger>Advanced Usage</AccordionTrigger>
|
|
647
|
+
<AccordionContent>
|
|
648
|
+
<Accordion>
|
|
649
|
+
<AccordionItem value="controlled">
|
|
650
|
+
<AccordionTrigger>
|
|
651
|
+
Controlled Mode
|
|
652
|
+
</AccordionTrigger>
|
|
653
|
+
<AccordionContent>
|
|
654
|
+
Use the value and onValueChange props to
|
|
655
|
+
control which items are open.
|
|
656
|
+
</AccordionContent>
|
|
657
|
+
</AccordionItem>
|
|
658
|
+
<AccordionItem value="animation">
|
|
659
|
+
<AccordionTrigger>
|
|
660
|
+
Custom Animation
|
|
661
|
+
</AccordionTrigger>
|
|
662
|
+
<AccordionContent>
|
|
663
|
+
Override transition duration and easing via
|
|
664
|
+
className.
|
|
665
|
+
</AccordionContent>
|
|
666
|
+
</AccordionItem>
|
|
667
|
+
</Accordion>
|
|
668
|
+
</AccordionContent>
|
|
669
|
+
</AccordionItem>
|
|
670
|
+
</Accordion>`}
|
|
623
671
|
>
|
|
624
672
|
<Accordion className="w-full max-w-lg">
|
|
625
673
|
<AccordionItem value="getting-started">
|
|
@@ -669,23 +717,40 @@ function AccordionMicroShowcase() {
|
|
|
669
717
|
label="FAQ Hoàn Chỉnh"
|
|
670
718
|
description="Ví dụ một phần hỏi đáp FAQ hoàn chỉnh."
|
|
671
719
|
codeString={`<Accordion className="w-full max-w-lg">
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
720
|
+
<AccordionItem value="Is it accessible?">
|
|
721
|
+
<AccordionTrigger>Is it accessible?</AccordionTrigger>
|
|
722
|
+
<AccordionContent>
|
|
723
|
+
Yes. It adheres to the WAI-ARIA design pattern.
|
|
724
|
+
Keyboard navigation and screen readers are fully
|
|
725
|
+
supported.
|
|
726
|
+
</AccordionContent>
|
|
727
|
+
</AccordionItem>
|
|
728
|
+
<AccordionItem value="Is it styled?">
|
|
729
|
+
<AccordionTrigger>Is it styled?</AccordionTrigger>
|
|
730
|
+
<AccordionContent>
|
|
731
|
+
Yes. It comes with default styles that match the
|
|
732
|
+
other components' aesthetic. You can override every
|
|
733
|
+
token via CSS variables.
|
|
734
|
+
</AccordionContent>
|
|
735
|
+
</AccordionItem>
|
|
736
|
+
<AccordionItem value="Is it animated?">
|
|
737
|
+
<AccordionTrigger>Is it animated?</AccordionTrigger>
|
|
738
|
+
<AccordionContent>
|
|
739
|
+
Yes. It's animated by default with smooth
|
|
740
|
+
expand/collapse transitions, but you can disable
|
|
741
|
+
animation if you prefer.
|
|
742
|
+
</AccordionContent>
|
|
743
|
+
</AccordionItem>
|
|
744
|
+
<AccordionItem value="Can I nest accordions?">
|
|
745
|
+
<AccordionTrigger>
|
|
746
|
+
Can I nest accordions?
|
|
747
|
+
</AccordionTrigger>
|
|
748
|
+
<AccordionContent>
|
|
749
|
+
Yes. You can nest accordion components inside each
|
|
750
|
+
other to create multi-level collapsible sections.
|
|
751
|
+
</AccordionContent>
|
|
752
|
+
</AccordionItem>
|
|
753
|
+
</Accordion>`}
|
|
689
754
|
>
|
|
690
755
|
<Accordion className="w-full max-w-lg">
|
|
691
756
|
<AccordionItem value="Is it accessible?">
|
|
@@ -723,97 +788,117 @@ function AccordionMicroShowcase() {
|
|
|
723
788
|
description="Các kịch bản thực tế giúp bạn quyết định nên dùng Micro (Accordion) hay Macro (AccordionPreset)."
|
|
724
789
|
fullWidth
|
|
725
790
|
codeString={`<div className="grid grid-cols-1 gap-6 md:grid-cols-2">
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
791
|
+
{/* ── Story 1: Macro wins ── */}
|
|
792
|
+
<div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
|
|
793
|
+
<div className="flex items-start gap-3">
|
|
794
|
+
<span className="mt-0.5 shrink-0 rounded-full bg-green-500/10 p-1.5 text-green-600">
|
|
795
|
+
<SettingsIcon
|
|
796
|
+
className="size-4"
|
|
797
|
+
aria-hidden="true"
|
|
798
|
+
/>
|
|
799
|
+
</span>
|
|
800
|
+
<div>
|
|
801
|
+
<p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
|
|
802
|
+
Story 1 · Dùng Macro
|
|
803
|
+
</p>
|
|
804
|
+
<h3 className="mt-0.5 text-sm font-semibold text-foreground">
|
|
805
|
+
Render danh sách FAQ từ API
|
|
806
|
+
</h3>
|
|
807
|
+
</div>
|
|
739
808
|
</div>
|
|
740
|
-
</div>
|
|
741
809
|
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
<div className="rounded-lg bg-muted/50 p-3">
|
|
748
|
-
<AccordionPreset
|
|
749
|
-
className="w-full"
|
|
750
|
-
items={[
|
|
751
|
-
{ value: "Is it accessible?", title: "Is it accessible?", content: "Yes. It adheres to the WAI-ARIA design pattern." },
|
|
752
|
-
{ value: "Is it styled?", title: "Is it styled?", content: "Yes. It comes with default styles that match the other components' aesthetic." },
|
|
753
|
-
]}
|
|
754
|
-
/>
|
|
755
|
-
</div>
|
|
756
|
-
|
|
757
|
-
<div className="rounded-md border border-border border-green-500/20 bg-green-500/5 px-3 py-2">
|
|
758
|
-
<p className="text-xs font-medium text-green-700 dark:text-green-400">
|
|
759
|
-
✅ Dùng <code className="font-mono">AccordionPreset</code> — Tự
|
|
760
|
-
động lặp qua array, không cần viết lại JSX cho từng thẻ Item.
|
|
810
|
+
<p className="text-xs text-muted-foreground leading-relaxed">
|
|
811
|
+
Bạn nhận được một mảng dữ liệu FAQ (hỏi đáp) từ
|
|
812
|
+
server. Nội dung đơn giản chỉ là text. Dùng Macro để
|
|
813
|
+
tiết kiệm code.
|
|
761
814
|
</p>
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
815
|
+
|
|
816
|
+
<div className="rounded-lg bg-muted/50 p-3">
|
|
817
|
+
<AccordionPreset
|
|
818
|
+
className="w-full"
|
|
819
|
+
items={[
|
|
820
|
+
{
|
|
821
|
+
value: "Is it accessible?",
|
|
822
|
+
title: "Is it accessible?",
|
|
823
|
+
content:
|
|
824
|
+
"Yes. It adheres to the WAI-ARIA design pattern.",
|
|
825
|
+
},
|
|
826
|
+
{
|
|
827
|
+
value: "Is it styled?",
|
|
828
|
+
title: "Is it styled?",
|
|
829
|
+
content:
|
|
830
|
+
"Yes. It comes with default styles that match the other components' aesthetic.",
|
|
831
|
+
},
|
|
832
|
+
]}
|
|
833
|
+
/>
|
|
834
|
+
</div>
|
|
835
|
+
|
|
836
|
+
<div className="rounded-md border border-border border-green-500/20 bg-green-500/5 px-3 py-2">
|
|
837
|
+
<p className="text-xs font-medium text-green-700 dark:text-green-400">
|
|
838
|
+
✅ Dùng{" "}
|
|
839
|
+
<code className="font-mono">AccordionPreset</code>{" "}
|
|
840
|
+
— Tự động lặp qua array, không cần viết lại JSX
|
|
841
|
+
cho từng thẻ Item.
|
|
774
842
|
</p>
|
|
775
|
-
<h3 className="mt-0.5 text-sm font-semibold text-foreground">
|
|
776
|
-
Tuỳ biến Trigger / Form phức tạp
|
|
777
|
-
</h3>
|
|
778
843
|
</div>
|
|
779
844
|
</div>
|
|
780
845
|
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
</AccordionTrigger>
|
|
797
|
-
<AccordionContent>
|
|
798
|
-
<div className="flex items-center gap-3 rounded border border-border p-3 text-xs text-muted-foreground">
|
|
799
|
-
<span>
|
|
800
|
-
Nội dung tuỳ biến hoàn toàn, ví dụ: Form, Toggle, v.v.
|
|
801
|
-
</span>
|
|
802
|
-
</div>
|
|
803
|
-
</AccordionContent>
|
|
804
|
-
</AccordionItem>
|
|
805
|
-
</Accordion>
|
|
806
|
-
</div>
|
|
846
|
+
{/* ── Story 2: Micro wins ── */}
|
|
847
|
+
<div className="rounded-xl border border-border bg-card p-5 flex flex-col gap-4">
|
|
848
|
+
<div className="flex items-start gap-3">
|
|
849
|
+
<span className="mt-0.5 shrink-0 rounded-full bg-blue-500/10 p-1.5 text-blue-600">
|
|
850
|
+
<BoxIcon className="size-4" aria-hidden="true" />
|
|
851
|
+
</span>
|
|
852
|
+
<div>
|
|
853
|
+
<p className="text-xs font-semibold uppercase tracking-wider text-muted-foreground">
|
|
854
|
+
Story 2 · Dùng Micro
|
|
855
|
+
</p>
|
|
856
|
+
<h3 className="mt-0.5 text-sm font-semibold text-foreground">
|
|
857
|
+
Tuỳ biến Trigger / Form phức tạp
|
|
858
|
+
</h3>
|
|
859
|
+
</div>
|
|
860
|
+
</div>
|
|
807
861
|
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
862
|
+
<p className="text-xs text-muted-foreground leading-relaxed">
|
|
863
|
+
Trigger cần hiển thị Icon hoặc Badge. Nội dung bên
|
|
864
|
+
trong là một Form phức tạp (chứ không phải text đơn
|
|
865
|
+
thuần). Macro không thể làm được việc này.
|
|
812
866
|
</p>
|
|
867
|
+
|
|
868
|
+
<div className="rounded-lg bg-muted/50 p-3">
|
|
869
|
+
<Accordion className="w-full">
|
|
870
|
+
<AccordionItem value="settings">
|
|
871
|
+
<AccordionTrigger className="gap-3">
|
|
872
|
+
<SlidersHorizontalIcon className="size-4 text-primary" />
|
|
873
|
+
<span className="flex-1 text-left">
|
|
874
|
+
Advanced Settings
|
|
875
|
+
</span>
|
|
876
|
+
<span className="mr-2 rounded bg-primary/10 px-2 py-0.5 text-[10px] uppercase tracking-wider text-primary">
|
|
877
|
+
New
|
|
878
|
+
</span>
|
|
879
|
+
</AccordionTrigger>
|
|
880
|
+
<AccordionContent>
|
|
881
|
+
<div className="flex items-center gap-3 rounded border border-border p-3 text-xs text-muted-foreground">
|
|
882
|
+
<span>
|
|
883
|
+
Nội dung tuỳ biến hoàn toàn, ví dụ: Form,
|
|
884
|
+
Toggle, v.v.
|
|
885
|
+
</span>
|
|
886
|
+
</div>
|
|
887
|
+
</AccordionContent>
|
|
888
|
+
</AccordionItem>
|
|
889
|
+
</Accordion>
|
|
890
|
+
</div>
|
|
891
|
+
|
|
892
|
+
<div className="rounded-md border border-border border-blue-500/20 bg-blue-500/5 px-3 py-2">
|
|
893
|
+
<p className="text-xs font-medium text-blue-700 dark:text-blue-400">
|
|
894
|
+
✅ Dùng{" "}
|
|
895
|
+
<code className="font-mono">Accordion</code>{" "}
|
|
896
|
+
(Micro) — Toàn quyền kiểm soát cấu trúc HTML của
|
|
897
|
+
Trigger và Content.
|
|
898
|
+
</p>
|
|
899
|
+
</div>
|
|
813
900
|
</div>
|
|
814
|
-
</div
|
|
815
|
-
</div>
|
|
816
|
-
`}
|
|
901
|
+
</div>`}
|
|
817
902
|
>
|
|
818
903
|
<div className="grid grid-cols-1 gap-6 md:grid-cols-2">
|
|
819
904
|
{/* ── Story 1: Macro wins ── */}
|