fulldev-ui 0.10.1 → 0.11.1

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 (252) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +7 -1
  3. package/package.json +6 -4
  4. package/public/r/accordion.json +7 -1
  5. package/public/r/alert-dialog.json +7 -1
  6. package/public/r/alert.json +6 -0
  7. package/public/r/article-1.json +7 -1
  8. package/public/r/article-2.json +7 -1
  9. package/public/r/articles-1.json +7 -1
  10. package/public/r/articles-2.json +7 -1
  11. package/public/r/articles-3.json +7 -1
  12. package/public/r/articles-4.json +7 -1
  13. package/public/r/avatar.json +6 -0
  14. package/public/r/badge.json +6 -0
  15. package/public/r/banner-1.json +7 -1
  16. package/public/r/banner-2.json +7 -1
  17. package/public/r/banner.json +7 -1
  18. package/public/r/blocks-1.json +6 -1
  19. package/public/r/blocks.json +92 -0
  20. package/public/r/breadcrumb.json +6 -0
  21. package/public/r/button.json +6 -0
  22. package/public/r/card.json +6 -0
  23. package/public/r/carousel.json +6 -0
  24. package/public/r/checkbox.json +6 -0
  25. package/public/r/collapsible.json +7 -1
  26. package/public/r/combobox.json +6 -0
  27. package/public/r/command.json +6 -0
  28. package/public/r/components.json +14 -3
  29. package/public/r/contact-1.json +10 -2
  30. package/public/r/contact-2.json +10 -2
  31. package/public/r/contact-3.json +10 -2
  32. package/public/r/content-1.json +7 -1
  33. package/public/r/content-2.json +7 -1
  34. package/public/r/content-3.json +7 -1
  35. package/public/r/content-4.json +7 -1
  36. package/public/r/cta-1.json +7 -1
  37. package/public/r/cta-2.json +7 -1
  38. package/public/r/cta-3.json +7 -1
  39. package/public/r/cta-4.json +7 -1
  40. package/public/r/cta-5.json +7 -1
  41. package/public/r/cta-6.json +7 -1
  42. package/public/r/cta-7.json +7 -1
  43. package/public/r/cta-8.json +7 -1
  44. package/public/r/dialog.json +7 -1
  45. package/public/r/doc-1.json +7 -1
  46. package/public/r/dropdown-menu.json +7 -1
  47. package/public/r/empty.json +6 -0
  48. package/public/r/faqs-1.json +7 -1
  49. package/public/r/faqs-2.json +7 -1
  50. package/public/r/faqs-3.json +7 -1
  51. package/public/r/faqs-4.json +7 -1
  52. package/public/r/features-1.json +7 -1
  53. package/public/r/features-2.json +7 -1
  54. package/public/r/features-3.json +7 -1
  55. package/public/r/features-4.json +7 -1
  56. package/public/r/features-5.json +7 -1
  57. package/public/r/features-6.json +7 -1
  58. package/public/r/field.json +6 -0
  59. package/public/r/footer-1.json +7 -1
  60. package/public/r/footer-2.json +7 -1
  61. package/public/r/footer-3.json +7 -1
  62. package/public/r/form.json +6 -0
  63. package/public/r/header-1.json +7 -1
  64. package/public/r/header-2.json +7 -1
  65. package/public/r/header-3.json +7 -1
  66. package/public/r/header-4.json +7 -1
  67. package/public/r/header-5.json +7 -1
  68. package/public/r/header.json +6 -0
  69. package/public/r/hero-1.json +7 -1
  70. package/public/r/hero-10.json +7 -1
  71. package/public/r/hero-11.json +7 -1
  72. package/public/r/hero-12.json +7 -1
  73. package/public/r/hero-13.json +7 -1
  74. package/public/r/hero-2.json +7 -1
  75. package/public/r/hero-3.json +7 -1
  76. package/public/r/hero-4.json +7 -1
  77. package/public/r/hero-5.json +7 -1
  78. package/public/r/hero-6.json +7 -1
  79. package/public/r/hero-7.json +7 -1
  80. package/public/r/hero-8.json +7 -1
  81. package/public/r/hero-9.json +7 -1
  82. package/public/r/hover-card.json +7 -1
  83. package/public/r/icon.json +7 -1
  84. package/public/r/init.json +28 -0
  85. package/public/r/input-group.json +6 -0
  86. package/public/r/input.json +6 -0
  87. package/public/r/item.json +6 -0
  88. package/public/r/kbd.json +6 -0
  89. package/public/r/label.json +6 -0
  90. package/public/r/layout.json +6 -0
  91. package/public/r/links-2.json +7 -1
  92. package/public/r/logo.json +6 -0
  93. package/public/r/logos-1.json +7 -1
  94. package/public/r/logos-2.json +7 -1
  95. package/public/r/logos-3.json +7 -1
  96. package/public/r/marquee.json +6 -0
  97. package/public/r/native-select.json +6 -0
  98. package/public/r/navigation-menu.json +7 -1
  99. package/public/r/popover.json +7 -1
  100. package/public/r/price.json +6 -0
  101. package/public/r/pricing-1.json +7 -1
  102. package/public/r/pricing-2.json +7 -1
  103. package/public/r/pricing-3.json +7 -1
  104. package/public/r/product-1.json +7 -1
  105. package/public/r/products-1.json +7 -1
  106. package/public/r/products-2.json +7 -1
  107. package/public/r/products-3.json +7 -1
  108. package/public/r/products-4.json +7 -1
  109. package/public/r/products-5.json +7 -1
  110. package/public/r/radio-group.json +7 -1
  111. package/public/r/rating.json +6 -0
  112. package/public/r/registry.json +1645 -457
  113. package/public/r/reviews-1.json +7 -1
  114. package/public/r/reviews-2.json +7 -1
  115. package/public/r/reviews-3.json +7 -1
  116. package/public/r/reviews-4.json +7 -1
  117. package/public/r/reviews-5.json +7 -1
  118. package/public/r/section.json +18 -2
  119. package/public/r/select.json +6 -0
  120. package/public/r/separator.json +6 -0
  121. package/public/r/services-1.json +7 -1
  122. package/public/r/services-2.json +7 -1
  123. package/public/r/services-3.json +7 -1
  124. package/public/r/services-4.json +7 -1
  125. package/public/r/services-5.json +7 -1
  126. package/public/r/services-6.json +7 -1
  127. package/public/r/services-7.json +7 -1
  128. package/public/r/sheet.json +8 -2
  129. package/public/r/sidebar-1.json +6 -1
  130. package/public/r/sidebar.json +6 -0
  131. package/public/r/skeleton.json +6 -0
  132. package/public/r/slider.json +7 -1
  133. package/public/r/spinner.json +6 -0
  134. package/public/r/switch.json +7 -1
  135. package/public/r/table.json +6 -0
  136. package/public/r/tabs.json +7 -1
  137. package/public/r/textarea.json +6 -0
  138. package/public/r/theme-toggle.json +6 -0
  139. package/public/r/toc.json +6 -0
  140. package/public/r/toggle.json +7 -1
  141. package/public/r/tooltip.json +7 -1
  142. package/public/r/typography.json +7 -1
  143. package/public/r/video.json +6 -0
  144. package/registry/init/global.css +187 -0
  145. package/registry.json +1137 -454
  146. package/src/components/blocks/article-1.astro +4 -3
  147. package/src/components/blocks/article-2.astro +4 -3
  148. package/src/components/blocks/articles-1.astro +18 -9
  149. package/src/components/blocks/articles-2.astro +4 -3
  150. package/src/components/blocks/articles-3.astro +11 -9
  151. package/src/components/blocks/articles-4.astro +11 -4
  152. package/src/components/blocks/banner-1.astro +4 -3
  153. package/src/components/blocks/banner-2.astro +16 -7
  154. package/src/components/blocks/blocks-1.astro +1 -1
  155. package/src/components/blocks/contact-1.astro +74 -40
  156. package/src/components/blocks/contact-2.astro +71 -36
  157. package/src/components/blocks/contact-3.astro +63 -35
  158. package/src/components/blocks/content-1.astro +15 -10
  159. package/src/components/blocks/content-2.astro +15 -10
  160. package/src/components/blocks/content-3.astro +14 -12
  161. package/src/components/blocks/content-4.astro +15 -10
  162. package/src/components/blocks/cta-1.astro +14 -10
  163. package/src/components/blocks/cta-2.astro +11 -8
  164. package/src/components/blocks/cta-3.astro +15 -8
  165. package/src/components/blocks/cta-4.astro +14 -9
  166. package/src/components/blocks/cta-5.astro +12 -8
  167. package/src/components/blocks/cta-6.astro +11 -8
  168. package/src/components/blocks/cta-7.astro +17 -10
  169. package/src/components/blocks/cta-8.astro +15 -10
  170. package/src/components/blocks/doc-1.astro +1 -1
  171. package/src/components/blocks/faqs-1.astro +22 -11
  172. package/src/components/blocks/faqs-2.astro +19 -9
  173. package/src/components/blocks/faqs-3.astro +19 -9
  174. package/src/components/blocks/faqs-4.astro +12 -9
  175. package/src/components/blocks/features-1.astro +21 -13
  176. package/src/components/blocks/features-2.astro +22 -13
  177. package/src/components/blocks/features-3.astro +14 -13
  178. package/src/components/blocks/features-4.astro +18 -9
  179. package/src/components/blocks/features-5.astro +22 -13
  180. package/src/components/blocks/features-6.astro +19 -9
  181. package/src/components/blocks/footer-1.astro +4 -3
  182. package/src/components/blocks/footer-2.astro +4 -3
  183. package/src/components/blocks/footer-3.astro +4 -3
  184. package/src/components/blocks/header-1.astro +13 -7
  185. package/src/components/blocks/header-2.astro +12 -6
  186. package/src/components/blocks/header-3.astro +12 -6
  187. package/src/components/blocks/header-4.astro +13 -6
  188. package/src/components/blocks/header-5.astro +16 -6
  189. package/src/components/blocks/hero-1.astro +11 -8
  190. package/src/components/blocks/hero-10.astro +7 -3
  191. package/src/components/blocks/hero-11.astro +4 -2
  192. package/src/components/blocks/hero-12.astro +11 -4
  193. package/src/components/blocks/hero-13.astro +11 -4
  194. package/src/components/blocks/hero-2.astro +11 -8
  195. package/src/components/blocks/hero-3.astro +11 -3
  196. package/src/components/blocks/hero-4.astro +4 -2
  197. package/src/components/blocks/hero-5.astro +4 -3
  198. package/src/components/blocks/hero-6.astro +4 -3
  199. package/src/components/blocks/hero-7.astro +4 -3
  200. package/src/components/blocks/hero-8.astro +11 -4
  201. package/src/components/blocks/hero-9.astro +4 -3
  202. package/src/components/blocks/links-2.astro +4 -4
  203. package/src/components/blocks/logos-1.astro +14 -16
  204. package/src/components/blocks/logos-2.astro +14 -12
  205. package/src/components/blocks/logos-3.astro +5 -4
  206. package/src/components/blocks/pricing-1.astro +13 -16
  207. package/src/components/blocks/pricing-2.astro +14 -13
  208. package/src/components/blocks/pricing-3.astro +20 -16
  209. package/src/components/blocks/product-1.astro +4 -3
  210. package/src/components/blocks/products-1.astro +11 -9
  211. package/src/components/blocks/products-2.astro +12 -9
  212. package/src/components/blocks/products-3.astro +12 -9
  213. package/src/components/blocks/products-4.astro +18 -9
  214. package/src/components/blocks/products-5.astro +18 -9
  215. package/src/components/blocks/reviews-1.astro +13 -12
  216. package/src/components/blocks/reviews-2.astro +4 -4
  217. package/src/components/blocks/reviews-3.astro +13 -12
  218. package/src/components/blocks/reviews-4.astro +13 -12
  219. package/src/components/blocks/reviews-5.astro +13 -12
  220. package/src/components/blocks/services-1.astro +19 -9
  221. package/src/components/blocks/services-2.astro +11 -8
  222. package/src/components/blocks/services-3.astro +11 -8
  223. package/src/components/blocks/services-4.astro +19 -9
  224. package/src/components/blocks/services-5.astro +11 -8
  225. package/src/components/blocks/services-6.astro +4 -3
  226. package/src/components/blocks/services-7.astro +12 -8
  227. package/src/components/blocks/sidebar-1.astro +2 -2
  228. package/src/components/ui/accordion/accordion.astro +1 -0
  229. package/src/components/ui/alert-dialog/alert-dialog.astro +1 -0
  230. package/src/components/ui/banner/banner.astro +23 -41
  231. package/src/components/ui/collapsible/collapsible.astro +1 -0
  232. package/src/components/ui/dialog/dialog.astro +1 -0
  233. package/src/components/ui/dropdown-menu/dropdown-menu.astro +1 -0
  234. package/src/components/ui/hover-card/hover-card.astro +7 -3
  235. package/src/components/ui/icon/icon.astro +46 -29
  236. package/src/components/ui/navigation-menu/navigation-menu.astro +1 -0
  237. package/src/components/ui/popover/popover.astro +1 -0
  238. package/src/components/ui/radio-group/radio-group.astro +1 -0
  239. package/src/components/ui/section/index.ts +2 -0
  240. package/src/components/ui/section/section-container.astro +1 -0
  241. package/src/components/ui/section/section-description.astro +20 -0
  242. package/src/components/ui/section/section-title.astro +20 -0
  243. package/src/components/ui/sheet/sheet-close.astro +4 -2
  244. package/src/components/ui/sheet/sheet.astro +1 -0
  245. package/src/components/ui/slider/slider.astro +1 -0
  246. package/src/components/ui/switch/switch.astro +1 -0
  247. package/src/components/ui/tabs/tabs.astro +1 -0
  248. package/src/components/ui/toggle/toggle.astro +1 -0
  249. package/src/components/ui/tooltip/tooltip.astro +1 -0
  250. package/src/components/ui/typography/typography.astro +1 -1
  251. package/src/lib/pages.ts +12 -0
  252. package/src/styles/global.css +2 -2
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  import type { ImageMetadata } from "astro"
3
3
  import { Image } from "astro:assets"
4
+ import type { HTMLAttributes } from "astro/types"
4
5
 
5
6
  import { cn } from "@/lib/utils"
6
7
  import { Button } from "@/components/ui/button"
@@ -11,14 +12,18 @@ import {
11
12
  FieldLegend,
12
13
  FieldSet,
13
14
  } from "@/components/ui/field"
15
+ import { Form } from "@/components/ui/form"
14
16
  import { Icon } from "@/components/ui/icon"
15
17
  import { Input } from "@/components/ui/input"
16
- import { Section, SectionContainer } from "@/components/ui/section"
18
+ import {
19
+ Section,
20
+ SectionContainer,
21
+ SectionTitle,
22
+ } from "@/components/ui/section"
17
23
  import { Textarea } from "@/components/ui/textarea"
18
24
  import PlaceholderImage from "@/assets/placeholder.webp"
19
25
 
20
- type Props = {
21
- class?: string
26
+ type Props = HTMLAttributes<"section"> & {
22
27
  title: string
23
28
  description: string
24
29
  contactItems: {
@@ -28,6 +33,9 @@ type Props = {
28
33
  href?: string
29
34
  }[]
30
35
  form: {
36
+ id?: string
37
+ action?: string
38
+ method?: "get" | "post"
31
39
  legend: string
32
40
  nameLabel: string
33
41
  namePlaceholder: string
@@ -50,18 +58,18 @@ const {
50
58
  contactItems,
51
59
  form,
52
60
  image = { src: PlaceholderImage, alt: "Contact image" },
61
+ ...props
53
62
  } = Astro.props
63
+ const formId = form.id ?? `contact-${crypto.randomUUID()}`
54
64
  ---
55
65
 
56
- <Section class={cn("", className)}>
66
+ <Section class={cn("", className)} {...props}>
57
67
  <SectionContainer class="grid gap-12 lg:grid-cols-2 lg:items-start">
58
68
  <div class="flex flex-col gap-8">
59
69
  <div class="flex flex-col gap-4">
60
- <h2
61
- class="text-foreground text-3xl font-semibold tracking-tight text-balance sm:text-4xl"
62
- >
70
+ <SectionTitle>
63
71
  {title}
64
- </h2>
72
+ </SectionTitle>
65
73
  <p class="text-muted-foreground max-w-xl text-base leading-relaxed">
66
74
  {description}
67
75
  </p>
@@ -83,10 +91,11 @@ const {
83
91
  </Button>
84
92
  ) : (
85
93
  <Button
94
+ as="span"
86
95
  variant="secondary"
87
96
  size="icon"
88
97
  class="text-primary shrink-0"
89
- aria-label={item.title}
98
+ aria-hidden="true"
90
99
  >
91
100
  <Icon name={item.icon} />
92
101
  </Button>
@@ -102,36 +111,55 @@ const {
102
111
  }
103
112
  </div>
104
113
  <div class="rounded-xl border p-6">
105
- <FieldSet>
106
- <FieldLegend class="sr-only">{form.legend}</FieldLegend>
107
- <FieldGroup>
108
- <div class="grid gap-4 md:grid-cols-2">
109
- <Field>
110
- <FieldLabel for="contact-name-3">{form.nameLabel}</FieldLabel>
111
- <Input id="contact-name-3" placeholder={form.namePlaceholder} />
112
- </Field>
114
+ <Form id={formId} action={form.action} method={form.method ?? "post"}>
115
+ <FieldSet>
116
+ <FieldLegend class="sr-only">{form.legend}</FieldLegend>
117
+ <FieldGroup>
118
+ <div class="grid gap-4 md:grid-cols-2">
119
+ <Field>
120
+ <FieldLabel for={`${formId}-name`}
121
+ >{form.nameLabel}</FieldLabel
122
+ >
123
+ <Input
124
+ id={`${formId}-name`}
125
+ name="name"
126
+ autocomplete="name"
127
+ required
128
+ placeholder={form.namePlaceholder}
129
+ />
130
+ </Field>
131
+ <Field>
132
+ <FieldLabel for={`${formId}-email`}
133
+ >{form.emailLabel}</FieldLabel
134
+ >
135
+ <Input
136
+ id={`${formId}-email`}
137
+ name="email"
138
+ autocomplete="email"
139
+ required
140
+ type="email"
141
+ placeholder={form.emailPlaceholder}
142
+ />
143
+ </Field>
144
+ </div>
113
145
  <Field>
114
- <FieldLabel for="contact-email-3">{form.emailLabel}</FieldLabel>
115
- <Input
116
- id="contact-email-3"
117
- type="email"
118
- placeholder={form.emailPlaceholder}
146
+ <FieldLabel for={`${formId}-message`}
147
+ >{form.messageLabel}</FieldLabel
148
+ >
149
+ <Textarea
150
+ id={`${formId}-message`}
151
+ name="message"
152
+ required
153
+ rows={5}
154
+ placeholder={form.messagePlaceholder}
119
155
  />
120
156
  </Field>
121
- </div>
122
- <Field>
123
- <FieldLabel for="contact-message-3"
124
- >{form.messageLabel}</FieldLabel
157
+ <Button type="submit" size="lg" class="w-full"
158
+ >{form.actionLabel}</Button
125
159
  >
126
- <Textarea
127
- id="contact-message-3"
128
- rows={5}
129
- placeholder={form.messagePlaceholder}
130
- />
131
- </Field>
132
- <Button size="lg" class="w-full">{form.actionLabel}</Button>
133
- </FieldGroup>
134
- </FieldSet>
160
+ </FieldGroup>
161
+ </FieldSet>
162
+ </Form>
135
163
  </div>
136
164
  </div>
137
165
  <Image
@@ -1,15 +1,21 @@
1
1
  ---
2
2
  import type { ImageMetadata } from "astro"
3
3
  import { Image } from "astro:assets"
4
+ import type { HTMLAttributes } from "astro/types"
4
5
  import { CheckIcon } from "@lucide/astro"
5
6
 
6
7
  import { cn } from "@/lib/utils"
7
8
  import { Button } from "@/components/ui/button"
8
- import { Section, SectionContainer } from "@/components/ui/section"
9
+ import { Icon } from "@/components/ui/icon"
10
+ import {
11
+ Section,
12
+ SectionContainer,
13
+ SectionDescription,
14
+ SectionTitle,
15
+ } from "@/components/ui/section"
9
16
  import PlaceholderImage from "@/assets/placeholder.webp"
10
17
 
11
- type Props = {
12
- class?: string
18
+ type Props = HTMLAttributes<"section"> & {
13
19
  title: string
14
20
  description: string
15
21
  features?: string[]
@@ -31,20 +37,19 @@ const {
31
37
  features,
32
38
  buttons,
33
39
  image = { src: PlaceholderImage, alt: "Content image" },
40
+ ...props
34
41
  } = Astro.props
35
42
  ---
36
43
 
37
- <Section class={cn("", className)}>
44
+ <Section class={cn("", className)} {...props}>
38
45
  <SectionContainer class="gap-6">
39
46
  <div class="flex flex-col gap-4">
40
- <h2
41
- class="text-foreground text-3xl font-semibold tracking-tight text-balance sm:text-4xl"
42
- >
47
+ <SectionTitle>
43
48
  {title}
44
- </h2>
45
- <p class="text-muted-foreground text-lg leading-relaxed text-balance">
49
+ </SectionTitle>
50
+ <SectionDescription>
46
51
  {description}
47
- </p>
52
+ </SectionDescription>
48
53
  </div>
49
54
  {
50
55
  features?.length && (
@@ -1,15 +1,21 @@
1
1
  ---
2
2
  import type { ImageMetadata } from "astro"
3
3
  import { Image } from "astro:assets"
4
+ import type { HTMLAttributes } from "astro/types"
4
5
  import { CheckIcon } from "@lucide/astro"
5
6
 
6
7
  import { cn } from "@/lib/utils"
7
8
  import { Button } from "@/components/ui/button"
8
- import { Section, SectionContainer } from "@/components/ui/section"
9
+ import { Icon } from "@/components/ui/icon"
10
+ import {
11
+ Section,
12
+ SectionContainer,
13
+ SectionDescription,
14
+ SectionTitle,
15
+ } from "@/components/ui/section"
9
16
  import PlaceholderImage from "@/assets/placeholder.webp"
10
17
 
11
- type Props = {
12
- class?: string
18
+ type Props = HTMLAttributes<"section"> & {
13
19
  title: string
14
20
  description: string
15
21
  features?: string[]
@@ -31,21 +37,20 @@ const {
31
37
  features,
32
38
  buttons,
33
39
  image = { src: PlaceholderImage, alt: "Content image" },
40
+ ...props
34
41
  } = Astro.props
35
42
  ---
36
43
 
37
- <Section class={cn("", className)}>
44
+ <Section class={cn("", className)} {...props}>
38
45
  <SectionContainer class="grid gap-12 lg:grid-cols-2 lg:items-center">
39
46
  <div class="flex flex-col gap-6">
40
47
  <div class="flex flex-col gap-4">
41
- <h2
42
- class="text-foreground text-3xl font-semibold tracking-tight text-balance sm:text-4xl"
43
- >
48
+ <SectionTitle>
44
49
  {title}
45
- </h2>
46
- <p class="text-muted-foreground text-lg leading-relaxed text-balance">
50
+ </SectionTitle>
51
+ <SectionDescription>
47
52
  {description}
48
- </p>
53
+ </SectionDescription>
49
54
  </div>
50
55
  {
51
56
  features?.length && (
@@ -1,14 +1,19 @@
1
1
  ---
2
2
  import type { ImageMetadata } from "astro"
3
3
  import { Image } from "astro:assets"
4
+ import type { HTMLAttributes } from "astro/types"
4
5
 
5
6
  import { cn } from "@/lib/utils"
6
7
  import { Button } from "@/components/ui/button"
7
- import { Section, SectionContainer } from "@/components/ui/section"
8
+ import {
9
+ Section,
10
+ SectionContainer,
11
+ SectionDescription,
12
+ SectionTitle,
13
+ } from "@/components/ui/section"
8
14
  import PlaceholderImage from "@/assets/placeholder.webp"
9
15
 
10
- type Props = {
11
- class?: string
16
+ type Props = HTMLAttributes<"section"> & {
12
17
  title: string
13
18
  description: string
14
19
  buttons?: {
@@ -28,25 +33,22 @@ const {
28
33
  description,
29
34
  buttons,
30
35
  image = { src: PlaceholderImage, alt: "Content image" },
36
+ ...props
31
37
  } = Astro.props
32
38
  ---
33
39
 
34
- <Section class={cn("", className)}>
40
+ <Section class={cn("", className)} {...props}>
35
41
  <SectionContainer class="gap-8">
36
42
  <div
37
43
  class="flex flex-col gap-4 md:flex-row md:items-end md:justify-between"
38
44
  >
39
45
  <div class="max-w-2xl">
40
- <h2
41
- class="text-foreground text-3xl font-semibold tracking-tight text-balance sm:text-4xl"
42
- >
46
+ <SectionTitle>
43
47
  {title}
44
- </h2>
45
- <p
46
- class="text-muted-foreground mt-4 text-lg leading-relaxed text-balance"
47
- >
48
+ </SectionTitle>
49
+ <SectionDescription class="mt-4">
48
50
  {description}
49
- </p>
51
+ </SectionDescription>
50
52
  </div>
51
53
  {
52
54
  buttons?.length && (
@@ -1,15 +1,21 @@
1
1
  ---
2
2
  import type { ImageMetadata } from "astro"
3
3
  import { Image } from "astro:assets"
4
+ import type { HTMLAttributes } from "astro/types"
4
5
  import { CheckIcon } from "@lucide/astro"
5
6
 
6
7
  import { cn } from "@/lib/utils"
7
8
  import { Button } from "@/components/ui/button"
8
- import { Section, SectionContainer } from "@/components/ui/section"
9
+ import { Icon } from "@/components/ui/icon"
10
+ import {
11
+ Section,
12
+ SectionContainer,
13
+ SectionDescription,
14
+ SectionTitle,
15
+ } from "@/components/ui/section"
9
16
  import PlaceholderImage from "@/assets/placeholder.webp"
10
17
 
11
- type Props = {
12
- class?: string
18
+ type Props = HTMLAttributes<"section"> & {
13
19
  title: string
14
20
  description: string
15
21
  features?: string[]
@@ -31,22 +37,21 @@ const {
31
37
  features,
32
38
  buttons,
33
39
  image = { src: PlaceholderImage, alt: "Content image" },
40
+ ...props
34
41
  } = Astro.props
35
42
  ---
36
43
 
37
- <Section class={cn("", className)}>
44
+ <Section class={cn("", className)} {...props}>
38
45
  <SectionContainer>
39
46
  <div class="grid gap-12 lg:grid-cols-[1fr_2fr] lg:items-center">
40
47
  <div class="flex flex-col gap-6">
41
48
  <div class="flex flex-col gap-4">
42
- <h2
43
- class="text-foreground text-3xl font-semibold tracking-tight text-balance sm:text-4xl"
44
- >
49
+ <SectionTitle>
45
50
  {title}
46
- </h2>
47
- <p class="text-muted-foreground text-lg leading-relaxed text-balance">
51
+ </SectionTitle>
52
+ <SectionDescription>
48
53
  {description}
49
- </p>
54
+ </SectionDescription>
50
55
  </div>
51
56
  {
52
57
  features?.length && (
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  import type { ImageMetadata } from "astro"
3
+ import type { HTMLAttributes } from "astro/types"
3
4
 
4
5
  import { cn } from "@/lib/utils"
5
6
  import {
@@ -10,10 +11,14 @@ import {
10
11
  } from "@/components/ui/avatar"
11
12
  import { Button } from "@/components/ui/button"
12
13
  import { Rating } from "@/components/ui/rating"
13
- import { Section, SectionContainer } from "@/components/ui/section"
14
+ import {
15
+ Section,
16
+ SectionContainer,
17
+ SectionDescription,
18
+ SectionTitle,
19
+ } from "@/components/ui/section"
14
20
 
15
- type Props = {
16
- class?: string
21
+ type Props = HTMLAttributes<"section"> & {
17
22
  title: string
18
23
  description: string
19
24
  buttons?: {
@@ -38,10 +43,11 @@ const {
38
43
  description,
39
44
  buttons,
40
45
  socialProof,
46
+ ...props
41
47
  } = Astro.props
42
48
  ---
43
49
 
44
- <Section variant="floating" class={cn("", className)}>
50
+ <Section variant="floating" class={cn("", className)} {...props}>
45
51
  <SectionContainer class="items-center text-center">
46
52
  {
47
53
  socialProof && (
@@ -67,14 +73,12 @@ const {
67
73
  )
68
74
  }
69
75
  <div class="flex max-w-2xl flex-col items-center gap-5">
70
- <h2
71
- class="text-foreground text-3xl leading-[1.1] font-semibold tracking-tight text-balance sm:text-4xl"
72
- >
76
+ <SectionTitle class="leading-[1.1]">
73
77
  {title}
74
- </h2>
75
- <p class="text-muted-foreground text-lg leading-relaxed text-balance">
78
+ </SectionTitle>
79
+ <SectionDescription>
76
80
  {description}
77
- </p>
81
+ </SectionDescription>
78
82
  </div>
79
83
  {
80
84
  buttons?.length && (
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  import type { ImageMetadata } from "astro"
3
3
  import { Image } from "astro:assets"
4
+ import type { HTMLAttributes } from "astro/types"
4
5
 
5
6
  import { cn } from "@/lib/utils"
6
7
  import {
@@ -11,11 +12,14 @@ import {
11
12
  } from "@/components/ui/avatar"
12
13
  import { Button } from "@/components/ui/button"
13
14
  import { Rating } from "@/components/ui/rating"
14
- import { Section, SectionContainer } from "@/components/ui/section"
15
+ import {
16
+ Section,
17
+ SectionContainer,
18
+ SectionTitle,
19
+ } from "@/components/ui/section"
15
20
  import PlaceholderImage from "@/assets/placeholder.webp"
16
21
 
17
- type Props = {
18
- class?: string
22
+ type Props = HTMLAttributes<"section"> & {
19
23
  title: string
20
24
  description: string
21
25
  buttons?: {
@@ -45,18 +49,17 @@ const {
45
49
  buttons,
46
50
  socialProof,
47
51
  image = { src: PlaceholderImage, alt: "CTA image" },
52
+ ...props
48
53
  } = Astro.props
49
54
  ---
50
55
 
51
- <Section variant="floating" class={cn("", className)}>
56
+ <Section variant="floating" class={cn("", className)} {...props}>
52
57
  <SectionContainer class="grid gap-12 lg:grid-cols-2 lg:items-center">
53
58
  <div class="flex flex-col gap-6">
54
59
  <div class="flex flex-col gap-4">
55
- <h2
56
- class="text-foreground text-3xl leading-[1.1] font-semibold tracking-tight text-balance sm:text-4xl"
57
- >
60
+ <SectionTitle class="leading-[1.1]">
58
61
  {title}
59
- </h2>
62
+ </SectionTitle>
60
63
  <p class="text-muted-foreground text-lg leading-relaxed">
61
64
  {description}
62
65
  </p>
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  import type { ImageMetadata } from "astro"
3
+ import type { HTMLAttributes } from "astro/types"
3
4
 
4
5
  import { cn } from "@/lib/utils"
5
6
  import {
@@ -10,10 +11,13 @@ import {
10
11
  } from "@/components/ui/avatar"
11
12
  import { Button } from "@/components/ui/button"
12
13
  import { Rating } from "@/components/ui/rating"
13
- import { Section, SectionContainer } from "@/components/ui/section"
14
+ import {
15
+ Section,
16
+ SectionContainer,
17
+ SectionTitle,
18
+ } from "@/components/ui/section"
14
19
 
15
- type Props = {
16
- class?: string
20
+ type Props = HTMLAttributes<"section"> & {
17
21
  title: string
18
22
  description: string
19
23
  buttons?: {
@@ -38,19 +42,22 @@ const {
38
42
  description,
39
43
  buttons,
40
44
  socialProof,
45
+ ...props
41
46
  } = Astro.props
42
47
  ---
43
48
 
44
- <Section variant="floating" class={cn("bg-accent/50 shadow-none", className)}>
49
+ <Section
50
+ variant="floating"
51
+ class={cn("bg-accent/50 shadow-none", className)}
52
+ {...props}
53
+ >
45
54
  <SectionContainer
46
55
  class="grid gap-8 lg:grid-cols-[minmax(0,1fr)_auto] lg:items-center"
47
56
  >
48
57
  <div class="flex flex-col gap-5">
49
- <h2
50
- class="text-foreground text-3xl leading-[1.1] font-semibold tracking-tight text-balance sm:text-4xl"
51
- >
58
+ <SectionTitle class="leading-[1.1]">
52
59
  {title}
53
- </h2>
60
+ </SectionTitle>
54
61
  <p class="text-muted-foreground max-w-2xl text-lg leading-relaxed">
55
62
  {description}
56
63
  </p>
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  import type { ImageMetadata } from "astro"
3
3
  import { Image } from "astro:assets"
4
+ import type { HTMLAttributes } from "astro/types"
4
5
 
5
6
  import { cn } from "@/lib/utils"
6
7
  import {
@@ -11,11 +12,15 @@ import {
11
12
  } from "@/components/ui/avatar"
12
13
  import { Button } from "@/components/ui/button"
13
14
  import { Rating } from "@/components/ui/rating"
14
- import { Section, SectionContainer } from "@/components/ui/section"
15
+ import {
16
+ Section,
17
+ SectionContainer,
18
+ SectionDescription,
19
+ SectionTitle,
20
+ } from "@/components/ui/section"
15
21
  import PlaceholderImage from "@/assets/placeholder.webp"
16
22
 
17
- type Props = {
18
- class?: string
23
+ type Props = HTMLAttributes<"section"> & {
19
24
  title: string
20
25
  description: string
21
26
  buttons?: {
@@ -45,12 +50,14 @@ const {
45
50
  buttons,
46
51
  socialProof,
47
52
  image = { src: PlaceholderImage, alt: "CTA image" },
53
+ ...props
48
54
  } = Astro.props
49
55
  ---
50
56
 
51
57
  <Section
52
58
  variant="floating"
53
59
  class={cn("dark bg-background overflow-hidden", className)}
60
+ {...props}
54
61
  >
55
62
  <Image
56
63
  src={image.src}
@@ -61,14 +68,12 @@ const {
61
68
  />
62
69
  <SectionContainer class="items-center text-center">
63
70
  <div class="flex max-w-2xl flex-col items-center gap-5">
64
- <h2
65
- class="text-foreground text-3xl leading-[1.1] font-semibold tracking-tight text-balance sm:text-4xl"
66
- >
71
+ <SectionTitle class="leading-[1.1]">
67
72
  {title}
68
- </h2>
69
- <p class="text-muted-foreground text-lg leading-relaxed text-balance">
73
+ </SectionTitle>
74
+ <SectionDescription>
70
75
  {description}
71
- </p>
76
+ </SectionDescription>
72
77
  </div>
73
78
  {
74
79
  buttons?.length && (
@@ -1,15 +1,20 @@
1
1
  ---
2
2
  import type { ImageMetadata } from "astro"
3
3
  import { Image } from "astro:assets"
4
+ import type { HTMLAttributes } from "astro/types"
4
5
  import { CheckIcon } from "@lucide/astro"
5
6
 
6
7
  import { cn } from "@/lib/utils"
7
8
  import { Button } from "@/components/ui/button"
8
- import { Section, SectionContainer } from "@/components/ui/section"
9
+ import { Icon } from "@/components/ui/icon"
10
+ import {
11
+ Section,
12
+ SectionContainer,
13
+ SectionTitle,
14
+ } from "@/components/ui/section"
9
15
  import PlaceholderImage from "@/assets/placeholder.webp"
10
16
 
11
- type Props = {
12
- class?: string
17
+ type Props = HTMLAttributes<"section"> & {
13
18
  title: string
14
19
  description: string
15
20
  features?: string[]
@@ -31,18 +36,17 @@ const {
31
36
  features,
32
37
  buttons,
33
38
  image = { src: PlaceholderImage, alt: "CTA image" },
39
+ ...props
34
40
  } = Astro.props
35
41
  ---
36
42
 
37
- <Section class={cn("", className)}>
43
+ <Section class={cn("", className)} {...props}>
38
44
  <SectionContainer class="grid gap-12 lg:grid-cols-2 lg:items-center">
39
45
  <div class="flex flex-col gap-6">
40
46
  <div class="flex flex-col gap-4">
41
- <h2
42
- class="text-foreground text-3xl leading-[1.1] font-semibold tracking-tight text-balance sm:text-4xl"
43
- >
47
+ <SectionTitle class="leading-[1.1]">
44
48
  {title}
45
- </h2>
49
+ </SectionTitle>
46
50
  <p class="text-muted-foreground text-lg leading-relaxed">
47
51
  {description}
48
52
  </p>