gladvn 0.2.36 → 0.2.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -1
  3. package/scripts/strip-comments.ts +79 -0
  4. package/src/blocks/auth-form.tsx +34 -30
  5. package/src/blocks/auth-recovery.tsx +9 -13
  6. package/src/blocks/auth-split.tsx +46 -36
  7. package/src/blocks/settings.tsx +84 -117
  8. package/src/components/macro/alert-preset.tsx +3 -1
  9. package/src/components/macro/carousel-preset.tsx +0 -1
  10. package/src/components/macro/checkbox-preset.test.tsx +2 -2
  11. package/src/components/macro/checkbox-preset.tsx +1 -2
  12. package/src/components/macro/command-preset.tsx +1 -1
  13. package/src/components/macro/date-picker.tsx +5 -18
  14. package/src/components/macro/dialog-preset.tsx +5 -3
  15. package/src/components/macro/input-preset.tsx +0 -1
  16. package/src/components/macro/select-preset.tsx +1 -1
  17. package/src/components/macro/switch-preset.test.tsx +1 -1
  18. package/src/components/micro/accordion.test.tsx +6 -12
  19. package/src/components/micro/alert-dialog.tsx +0 -2
  20. package/src/components/micro/alert.test.tsx +5 -8
  21. package/src/components/micro/alert.tsx +0 -2
  22. package/src/components/micro/badge.test.tsx +5 -7
  23. package/src/components/micro/badge.tsx +1 -3
  24. package/src/components/micro/button.test.tsx +19 -26
  25. package/src/components/micro/button.tsx +3 -11
  26. package/src/components/micro/calendar.tsx +12 -13
  27. package/src/components/micro/card.test.tsx +3 -5
  28. package/src/components/micro/carousel.tsx +0 -1
  29. package/src/components/micro/chart.tsx +3 -2
  30. package/src/components/micro/checkbox.test.tsx +9 -18
  31. package/src/components/micro/combobox.tsx +1 -3
  32. package/src/components/micro/command.tsx +23 -11
  33. package/src/components/micro/context-menu.tsx +0 -2
  34. package/src/components/micro/dialog.test.tsx +6 -14
  35. package/src/components/micro/dialog.tsx +0 -2
  36. package/src/components/micro/drawer.tsx +0 -3
  37. package/src/components/micro/dropdown-menu.test.tsx +8 -14
  38. package/src/components/micro/dropdown-menu.tsx +0 -2
  39. package/src/components/micro/field.tsx +3 -3
  40. package/src/components/micro/hover-card.tsx +0 -2
  41. package/src/components/micro/input-group.tsx +9 -42
  42. package/src/components/micro/input.test.tsx +15 -24
  43. package/src/components/micro/navigation-menu.tsx +0 -2
  44. package/src/components/micro/popover.test.tsx +5 -9
  45. package/src/components/micro/progress.tsx +5 -1
  46. package/src/components/micro/select.test.tsx +5 -18
  47. package/src/components/micro/select.tsx +3 -5
  48. package/src/components/micro/separator.tsx +1 -1
  49. package/src/components/micro/sheet.test.tsx +6 -14
  50. package/src/components/micro/sheet.tsx +0 -2
  51. package/src/components/micro/sidebar.tsx +5 -6
  52. package/src/components/micro/sonner.tsx +0 -1
  53. package/src/components/micro/switch.test.tsx +9 -18
  54. package/src/components/micro/switch.tsx +1 -1
  55. package/src/components/micro/tabs.test.tsx +5 -11
  56. package/src/components/micro/theme-provider.tsx +0 -12
  57. package/src/components/micro/toggle-group.tsx +1 -12
  58. package/src/components/micro/tooltip.test.tsx +7 -12
  59. package/src/dev/App.tsx +6 -6
  60. package/src/dev/components/BlockViewer.tsx +15 -4
  61. package/src/dev/components/Container.tsx +20 -0
  62. package/src/dev/components/GladvnLogo.tsx +3 -9
  63. package/src/dev/components/code-highlighter.tsx +5 -3
  64. package/src/dev/components/showcase.tsx +116 -168
  65. package/src/dev/sections/buttons.tsx +4 -9
  66. package/src/dev/sections/display.tsx +68 -72
  67. package/src/dev/sections/feedback.tsx +304 -314
  68. package/src/dev/sections/forms.tsx +10 -14
  69. package/src/dev/sections/interactive.tsx +32 -32
  70. package/src/dev/sections/overview.tsx +2 -10
  71. package/src/dev/showcase/accordion.tsx +512 -554
  72. package/src/dev/showcase/alert-dialog.tsx +525 -565
  73. package/src/dev/showcase/alert.tsx +352 -402
  74. package/src/dev/showcase/aspect-ratio.tsx +167 -193
  75. package/src/dev/showcase/avatar.tsx +231 -269
  76. package/src/dev/showcase/badge.tsx +92 -140
  77. package/src/dev/showcase/breadcrumb.tsx +113 -135
  78. package/src/dev/showcase/button.tsx +140 -173
  79. package/src/dev/showcase/calendar.tsx +187 -237
  80. package/src/dev/showcase/card.tsx +229 -261
  81. package/src/dev/showcase/carousel.tsx +288 -315
  82. package/src/dev/showcase/chart.tsx +44 -50
  83. package/src/dev/showcase/checkbox.tsx +286 -330
  84. package/src/dev/showcase/collapsible.tsx +143 -160
  85. package/src/dev/showcase/combobox.tsx +327 -369
  86. package/src/dev/showcase/command.tsx +106 -120
  87. package/src/dev/showcase/context-menu.tsx +93 -107
  88. package/src/dev/showcase/dialog.tsx +585 -630
  89. package/src/dev/showcase/drawer.tsx +176 -196
  90. package/src/dev/showcase/dropdown-menu.tsx +183 -201
  91. package/src/dev/showcase/empty.tsx +232 -274
  92. package/src/dev/showcase/hover-card.tsx +153 -180
  93. package/src/dev/showcase/input-group.tsx +221 -253
  94. package/src/dev/showcase/input-otp.tsx +204 -250
  95. package/src/dev/showcase/input.tsx +246 -325
  96. package/src/dev/showcase/item.tsx +134 -152
  97. package/src/dev/showcase/kbd.tsx +149 -172
  98. package/src/dev/showcase/label.tsx +50 -68
  99. package/src/dev/showcase/menubar.tsx +194 -213
  100. package/src/dev/showcase/navigation-menu.tsx +119 -133
  101. package/src/dev/showcase/overview-components/ArchitectureSection.tsx +126 -0
  102. package/src/dev/showcase/overview-components/CodeBlock.tsx +50 -0
  103. package/src/dev/showcase/overview-components/ColorPaletteSection.tsx +44 -0
  104. package/src/dev/showcase/overview-components/DashboardPreview.tsx +159 -0
  105. package/src/dev/showcase/overview-components/FeatureGridSection.tsx +535 -0
  106. package/src/dev/showcase/overview-components/FooterCTA.tsx +137 -0
  107. package/src/dev/showcase/overview-components/HeroSection.tsx +65 -0
  108. package/src/dev/showcase/overview-components/PrinciplesSection.tsx +128 -0
  109. package/src/dev/showcase/overview.tsx +21 -1163
  110. package/src/dev/showcase/pagination.tsx +144 -190
  111. package/src/dev/showcase/popover.tsx +181 -196
  112. package/src/dev/showcase/progress.tsx +141 -189
  113. package/src/dev/showcase/radio-group.tsx +272 -332
  114. package/src/dev/showcase/resizable.tsx +119 -141
  115. package/src/dev/showcase/scroll-area.tsx +21 -36
  116. package/src/dev/showcase/select.tsx +262 -322
  117. package/src/dev/showcase/separator.tsx +75 -73
  118. package/src/dev/showcase/sheet.tsx +333 -361
  119. package/src/dev/showcase/sidebar.tsx +53 -59
  120. package/src/dev/showcase/skeleton.tsx +93 -112
  121. package/src/dev/showcase/slider.tsx +244 -296
  122. package/src/dev/showcase/sonner.tsx +251 -258
  123. package/src/dev/showcase/spinner.tsx +46 -67
  124. package/src/dev/showcase/switch.tsx +298 -362
  125. package/src/dev/showcase/table.tsx +76 -80
  126. package/src/dev/showcase/tabs.tsx +302 -355
  127. package/src/dev/showcase/textarea.tsx +240 -293
  128. package/src/dev/showcase/toast.tsx +48 -54
  129. package/src/dev/showcase/toggle-group.tsx +104 -129
  130. package/src/dev/showcase/toggle.tsx +82 -102
  131. package/src/dev/showcase/tooltip.tsx +173 -192
  132. package/src/dev/showcase/why.tsx +6 -12
  133. package/src/hooks/use-mobile.test.ts +3 -2
  134. package/src/lib/utils.test.ts +5 -4
@@ -0,0 +1,137 @@
1
+ import React, { useState } from "react";
2
+ import { ArrowRightIcon, CheckIcon, CopyIcon } from "lucide-react";
3
+ import { Button } from "../../../components/micro/button";
4
+ import {
5
+ Avatar,
6
+ AvatarFallback,
7
+ AvatarImage
8
+ } from "../../../components/micro/avatar";
9
+ import { cn } from "../../../lib/utils";
10
+ import { Container } from "../../components/Container";
11
+
12
+ export function FooterCTA({ className }: { className?: string }) {
13
+ const [copied, setCopied] = useState(false);
14
+
15
+ const handleCopy = () => {
16
+ navigator.clipboard.writeText("npx gladvn init");
17
+ setCopied(true);
18
+ setTimeout(() => setCopied(false), 2000);
19
+ };
20
+
21
+ return (
22
+ <div className={className}>
23
+ {/* 🤝 CONTRIBUTORS */}
24
+ <Container as="section" className="mb-24">
25
+ <div className="flex flex-col items-center text-center space-y-8">
26
+ <div className="space-y-4 max-w-2xl">
27
+ <h2 className="text-3xl font-extrabold tracking-tight">
28
+ Contributors
29
+ </h2>
30
+ </div>
31
+
32
+ <div className="flex flex-wrap justify-center gap-6">
33
+ {[
34
+ {
35
+ name: "Ý Le",
36
+ role: "Creator & Maintainer",
37
+ avatar: "https://github.com/duongacy.png",
38
+ url: "https://github.com/duongacy"
39
+ },
40
+ ].map((user) => (
41
+ <a
42
+ key={user.name}
43
+ href={user.url}
44
+ target="_blank"
45
+ rel="noreferrer"
46
+ className="group flex flex-col items-center gap-3 p-4 rounded-2xl hover:bg-muted/50 transition-colors"
47
+ >
48
+ <Avatar className="size-16 border-2 border-transparent group-hover:border-primary/20 transition-all duration-300 group-hover:scale-105">
49
+ <AvatarImage src={user.avatar} alt={user.name} />
50
+ <AvatarFallback className="text-lg bg-primary/5 text-primary">
51
+ {user.name.substring(0, 2).toUpperCase()}
52
+ </AvatarFallback>
53
+ </Avatar>
54
+ <div className="text-center">
55
+ <div className="font-semibold text-sm group-hover:text-primary transition-colors">
56
+ {user.name}
57
+ </div>
58
+ <div className="text-xs text-muted-foreground mt-0.5">
59
+ {user.role}
60
+ </div>
61
+ </div>
62
+ </a>
63
+ ))}
64
+ </div>
65
+
66
+ <Button
67
+ variant="outline"
68
+ className="mt-4 rounded-full"
69
+ render={
70
+ <a
71
+ href="https://github.com/duongacy/gladvn"
72
+ target="_blank"
73
+ rel="noreferrer"
74
+ />
75
+ }
76
+ nativeButton={false}
77
+ >
78
+ Đóng góp cùng chúng tôi
79
+ </Button>
80
+ </div>
81
+ </Container>
82
+
83
+ {/* 🚀 FINAL CTA */}
84
+ <Container as="section">
85
+ <div className="rounded-[2.5rem] border-2 border-primary/40 bg-gradient-to-br from-primary/10 via-background to-info/5 p-10 md:p-16 shadow-2xl shadow-primary/5 text-center relative overflow-hidden">
86
+ <div className="absolute inset-0 bg-[radial-gradient(ellipse_60%_60%_at_50%_0%,rgba(var(--primary-rgb),0.15),transparent)] pointer-events-none" />
87
+ <div className="relative z-10 space-y-6 max-w-2xl mx-auto">
88
+ <h2 className="text-3xl md:text-5xl font-extrabold tracking-tight">
89
+ 30 giây là có đồ chơi.
90
+ </h2>
91
+ <p className="text-muted-foreground text-lg leading-relaxed">
92
+ Quẳng hết code vào{" "}
93
+ <code className="text-sm bg-primary/20 text-primary px-1.5 py-0.5 rounded">
94
+ src/
95
+ </code>{" "}
96
+ rồi xài thôi. Không config rườm rà nhức đầu làm gì.
97
+ </p>
98
+ <div className="flex flex-col sm:flex-row items-center justify-center gap-4 pt-2">
99
+ <button
100
+ onClick={handleCopy}
101
+ className="bg-primary text-primary-foreground hover:bg-primary/90 px-8 py-4 rounded-2xl font-mono text-sm shadow-lg shadow-primary/20 flex items-center gap-4 cursor-pointer transition-all hover:scale-105 active:scale-95"
102
+ >
103
+ <span className="font-bold opacity-70">~</span>
104
+ <span>npx gladvn init</span>
105
+ <div className="ml-2">
106
+ {copied ? (
107
+ <CheckIcon className="size-4" />
108
+ ) : (
109
+ <CopyIcon className="size-4" />
110
+ )}
111
+ </div>
112
+ </button>
113
+ <Button
114
+ render={
115
+ <a
116
+ href="https://github.com/duongacy/gladvn"
117
+ target="_blank"
118
+ rel="noreferrer"
119
+ />
120
+ }
121
+ nativeButton={false}
122
+ variant="ghost"
123
+ className="text-muted-foreground hover:text-foreground"
124
+ >
125
+ Xem trên GitHub
126
+ <ArrowRightIcon className="size-4 ml-1" />
127
+ </Button>
128
+ </div>
129
+ <p className="text-xs text-muted-foreground pt-2">
130
+ Tương thích với npm, yarn, pnpm và bun. Hỗ trợ React 18+.
131
+ </p>
132
+ </div>
133
+ </div>
134
+ </Container>
135
+ </div>
136
+ );
137
+ }
@@ -0,0 +1,65 @@
1
+ import { CodeIcon } from "lucide-react";
2
+ import { cn } from "../../../lib/utils";
3
+ import { Container } from "../../components/Container";
4
+
5
+ export function HeroSection({ className }: { className?: string }) {
6
+ return (
7
+ <section className={cn("relative pt-20 pb-32", className)}>
8
+ <div className="absolute inset-0 -z-10 h-full w-full bg-background bg-[radial-gradient(ellipse_80%_80%_at_50%_-20%,rgba(var(--primary-rgb),0.2),rgba(255,255,255,0))] dark:bg-[radial-gradient(ellipse_80%_80%_at_50%_-20%,rgba(var(--primary-rgb),0.15),rgba(255,255,255,0))]" />
9
+
10
+ <div className="absolute top-0 inset-x-0 flex justify-center -z-10 pointer-events-none opacity-50 dark:opacity-40 blur-[100px]">
11
+ <div
12
+ className="w-[30rem] h-[20rem] bg-primary/40 rounded-full mix-blend-multiply animate-pulse"
13
+ style={{ animationDuration: "8s" }}
14
+ />
15
+ <div
16
+ className="w-[20rem] h-[15rem] bg-info/30 rounded-full mix-blend-multiply animate-pulse absolute top-10"
17
+ style={{ animationDuration: "10s" }}
18
+ />
19
+ </div>
20
+
21
+ <Container className="relative z-10 flex flex-col items-center text-center">
22
+ <div className="inline-flex items-center gap-2 px-4 py-1.5 mb-8 text-sm font-medium rounded-full border border-primary/20 bg-background/50 backdrop-blur-md shadow-sm animate-fade-up">
23
+ <CodeIcon className="w-3.5 h-3.5 text-primary" />
24
+ <span className="text-muted-foreground">
25
+ Copy mã · Tuỳ biến tự do · Không lock-in
26
+ </span>
27
+ </div>
28
+
29
+ <h1
30
+ className="max-w-4xl text-5xl md:text-7xl font-extrabold tracking-tighter mb-8 animate-fade-up"
31
+ style={{ animationDelay: "100ms", animationFillMode: "both" }}
32
+ >
33
+ <span className="block text-foreground drop-shadow-sm">
34
+ Tinh tế. Đẳng cấp.
35
+ </span>
36
+ <span className="block mt-2 bg-gradient-to-r leading-[1.2] from-primary via-info to-primary bg-[length:200%_auto] bg-clip-text text-transparent animate-[spin_8s_linear_infinite] [animation-name:gradient] [animation-duration:8s] [animation-timing-function:linear] [animation-iteration-count:infinite]">
37
+ Không giới hạn.
38
+ </span>
39
+ </h1>
40
+
41
+ <p
42
+ className="max-w-2xl text-lg md:text-xl text-muted-foreground leading-relaxed mb-10 animate-fade-up"
43
+ style={{ animationDelay: "200ms", animationFillMode: "both" }}
44
+ >
45
+ Phần lớn component library giữ code trong node_modules — bạn dùng
46
+ được nhưng không sửa được. gladvn copy thẳng vào{" "}
47
+ <code className="text-sm bg-primary/20 text-primary px-1.5 py-0.5 rounded">
48
+ src/
49
+ </code>{" "}
50
+ của bạn.{" "}
51
+ <strong className="text-foreground">
52
+ Đọc được, sửa được, xóa được.
53
+ </strong>
54
+ </p>
55
+
56
+ <div
57
+ className="max-w-2xl text-lg md:text-xl font-medium text-foreground/90 italic mt-2 p-5 border-l-4 border-primary bg-primary/5 rounded-r-xl shadow-sm animate-fade-up"
58
+ style={{ animationDelay: "300ms", animationFillMode: "both" }}
59
+ >
60
+ "Thư viện này sinh ra để giúp bạn code nhanh hơn, sống nhàn hơn, đừng tự làm khó mình."
61
+ </div>
62
+ </Container>
63
+ </section>
64
+ );
65
+ }
@@ -0,0 +1,128 @@
1
+ import React, { useState } from "react";
2
+ import { SparklesIcon, CheckIcon, CopyIcon } from "lucide-react";
3
+ import { STATS } from "../../data";
4
+ import { cn } from "../../../lib/utils";
5
+ import { Container } from "../../components/Container";
6
+
7
+ export function PrinciplesSection({ className }: { className?: string }) {
8
+ const [copied, setCopied] = useState(false);
9
+
10
+ const handleCopy = () => {
11
+ navigator.clipboard.writeText("npx gladvn init");
12
+ setCopied(true);
13
+ setTimeout(() => setCopied(false), 2000);
14
+ };
15
+
16
+ return (
17
+ <div className={className}>
18
+ <Container as="section" className="border-y border-y-border bg-muted/5 py-12 relative overflow-hidden">
19
+ <div className="absolute inset-0 bg-gradient-to-r from-transparent via-primary/5 to-transparent animate-[pulse_4s_ease-in-out_infinite]" />
20
+ <div className="grid grid-cols-2 md:grid-cols-4 gap-8 md:gap-4 divide-x-0 md:divide-x relative z-10">
21
+ {STATS.map((s) => (
22
+ <div
23
+ key={s.label}
24
+ className="flex flex-col items-center justify-center text-center space-y-2 group"
25
+ >
26
+ <div className="text-4xl md:text-5xl font-black tracking-tighter text-foreground group-hover:text-primary group-hover:scale-110 transition-all duration-300">
27
+ {s.value}
28
+ </div>
29
+ <div className="text-xs md:text-sm font-bold uppercase tracking-[0.2em] text-muted-foreground">
30
+ {s.label}
31
+ </div>
32
+ </div>
33
+ ))}
34
+ </div>
35
+ </Container>
36
+
37
+ <Container as="section" className="space-y-12 mt-24">
38
+ <div className="text-center max-w-2xl mx-auto space-y-4">
39
+ <h2 className="text-3xl md:text-4xl font-extrabold tracking-tight">
40
+ Kiến trúc rành mạch. Sửa code không "đổ mồ hôi".
41
+ </h2>
42
+ <p className="text-muted-foreground text-lg">
43
+ Nhiều dự án thường bắt đầu "bốc mùi" sau một thời gian — đụng vào đâu cũng sợ gãy, muốn sửa mà rén. gladvn chia code thành{" "}
44
+ <strong className="text-foreground">các tầng rạch ròi</strong>
45
+ {", "}giúp bạn luôn biết chính xác mình đang sửa cái gì, ảnh hưởng tới đâu. Tâm an, code mới nhàn!
46
+ </p>
47
+ </div>
48
+
49
+ <div
50
+ id="ownership-section"
51
+ className="mb-12 rounded-[2.5rem] border-2 border-primary/50 bg-primary/5 p-4 sm:p-6 md:p-12 flex flex-col gap-10 group overflow-hidden relative hover:bg-primary/10 transition-colors duration-500 shadow-2xl shadow-primary/10"
52
+ >
53
+ <div className="flex flex-col md:flex-row items-start gap-6 md:gap-8">
54
+ <div className="relative z-10 flex-1 space-y-6">
55
+ <div className="inline-flex items-center gap-2 px-4 py-1.5 rounded-full bg-primary text-primary-foreground text-sm font-bold uppercase tracking-wider shadow-lg shadow-primary/20">
56
+ <SparklesIcon className="size-4" /> Cốt lõi
57
+ </div>
58
+ <h3 className="text-3xl md:text-5xl font-extrabold tracking-tight">
59
+ Code là của bạn, 100%
60
+ </h3>
61
+ <p className="text-muted-foreground text-lg leading-relaxed max-w-2xl">
62
+ Chạy một lệnh — toàn bộ components, hooks, styles, contexts được
63
+ copy thẳng vào thư mục{" "}
64
+ <code className="text-sm bg-primary/20 text-primary px-1.5 py-0.5 rounded">
65
+ src/
66
+ </code>{" "}
67
+ của bạn.{" "}
68
+ <strong className="text-foreground">
69
+ Không qua node_modules. Không phụ thuộc vào ai.
70
+ </strong>{" "}
71
+ Đọc được, sửa được, xoá được từng dòng.
72
+ </p>
73
+
74
+ <div className="flex items-center gap-4 pt-2">
75
+ <button
76
+ onClick={handleCopy}
77
+ className="bg-background/80 hover:bg-background border-border backdrop-blur-md px-6 py-4 rounded-2xl border hover:border-primary/50 transition-colors font-mono text-sm shadow-inner flex items-center gap-4 cursor-pointer group/copy"
78
+ >
79
+ <span className="text-primary font-bold">~</span>
80
+ <span>npx gladvn init</span>
81
+ <div className="ml-4 text-muted-foreground group-hover/copy:text-primary transition-colors">
82
+ {copied ? (
83
+ <CheckIcon className="size-4 text-success" />
84
+ ) : (
85
+ <CopyIcon className="size-4" />
86
+ )}
87
+ </div>
88
+ </button>
89
+ </div>
90
+ </div>
91
+
92
+ <div className="relative z-10 w-full md:w-1/3 flex flex-col gap-4">
93
+ <div className="p-3 sm:p-5 rounded-2xl border border-success/30 bg-success/10 shadow-sm flex items-start gap-4 transform group-hover:-translate-x-2 transition-transform">
94
+ <div className="bg-success text-success-foreground p-2 rounded-full mt-1">
95
+ <CheckIcon className="size-4" />
96
+ </div>
97
+ <div>
98
+ <h4 className="font-bold text-success text-lg">
99
+ Toàn bộ Component & Hook
100
+ </h4>
101
+ <p className="text-xs text-success/80 mt-1">
102
+ Nằm gọn trong{" "}
103
+ <code className="opacity-80">
104
+ src/components/micro/ & macro/
105
+ </code>
106
+ </p>
107
+ </div>
108
+ </div>
109
+ <div className="p-3 sm:p-5 rounded-2xl border border-success/30 bg-success/10 shadow-sm flex items-start gap-4 transform group-hover:translate-x-2 transition-transform">
110
+ <div className="bg-success text-success-foreground p-2 rounded-full mt-1">
111
+ <CheckIcon className="size-4" />
112
+ </div>
113
+ <div>
114
+ <h4 className="font-bold text-success text-lg">
115
+ CSS Token & Theme Config
116
+ </h4>
117
+ <p className="text-xs text-success/80 mt-1">
118
+ OKLCH color tokens, dark/light mode — đẹp ngay từ đầu
119
+ </p>
120
+ </div>
121
+ </div>
122
+ </div>
123
+ </div>
124
+ </div>
125
+ </Container>
126
+ </div>
127
+ );
128
+ }