fulldev-ui 0.10.0 → 0.11.0

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 (262) 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 +8 -2
  5. package/public/r/alert-dialog.json +9 -3
  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 +6 -0
  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 +9 -3
  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 +9 -2
  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 +11 -5
  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 +9 -3
  129. package/public/r/sidebar-1.json +5 -0
  130. package/public/r/sidebar.json +9 -3
  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 +8 -2
  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 +6 -0
  143. package/public/r/video.json +6 -0
  144. package/registry/init/global.css +187 -0
  145. package/registry.json +1138 -455
  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 +10 -4
  154. package/src/components/blocks/blocks-1.astro +1 -1
  155. package/src/components/blocks/contact-1.astro +72 -39
  156. package/src/components/blocks/contact-2.astro +69 -35
  157. package/src/components/blocks/contact-3.astro +61 -34
  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/ui/accordion/accordion-content.astro +2 -1
  228. package/src/components/ui/accordion/accordion.astro +1 -0
  229. package/src/components/ui/alert-dialog/alert-dialog-content.astro +1 -1
  230. package/src/components/ui/alert-dialog/alert-dialog-overlay.astro +1 -1
  231. package/src/components/ui/alert-dialog/alert-dialog.astro +1 -0
  232. package/src/components/ui/collapsible/collapsible.astro +1 -0
  233. package/src/components/ui/dialog/dialog-content.astro +1 -1
  234. package/src/components/ui/dialog/dialog-overlay.astro +1 -1
  235. package/src/components/ui/dialog/dialog.astro +1 -0
  236. package/src/components/ui/dropdown-menu/dropdown-menu.astro +1 -0
  237. package/src/components/ui/hover-card/hover-card.astro +10 -3
  238. package/src/components/ui/icon/icon.astro +46 -29
  239. package/src/components/ui/navigation-menu/navigation-menu-content.astro +2 -0
  240. package/src/components/ui/navigation-menu/navigation-menu-indicator.astro +2 -1
  241. package/src/components/ui/navigation-menu/navigation-menu-list.astro +1 -1
  242. package/src/components/ui/navigation-menu/navigation-menu-positioner.astro +2 -0
  243. package/src/components/ui/navigation-menu/navigation-menu.astro +1 -0
  244. package/src/components/ui/popover/popover.astro +1 -0
  245. package/src/components/ui/radio-group/radio-group.astro +1 -0
  246. package/src/components/ui/section/index.ts +2 -0
  247. package/src/components/ui/section/section-container.astro +1 -0
  248. package/src/components/ui/section/section-description.astro +20 -0
  249. package/src/components/ui/section/section-title.astro +20 -0
  250. package/src/components/ui/sheet/sheet-close.astro +4 -2
  251. package/src/components/ui/sheet/sheet-content.astro +2 -2
  252. package/src/components/ui/sheet/sheet.astro +2 -89
  253. package/src/components/ui/sidebar/sidebar-menu-button.astro +0 -1
  254. package/src/components/ui/sidebar/sidebar-provider.astro +36 -2
  255. package/src/components/ui/sidebar/sidebar.astro +0 -1
  256. package/src/components/ui/slider/slider.astro +4 -3
  257. package/src/components/ui/switch/switch.astro +5 -2
  258. package/src/components/ui/tabs/tabs-content.astro +2 -1
  259. package/src/components/ui/tabs/tabs.astro +1 -0
  260. package/src/components/ui/toggle/toggle.astro +3 -0
  261. package/src/components/ui/tooltip/tooltip.astro +1 -0
  262. package/src/lib/pages.ts +12 -0
@@ -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>
@@ -102,36 +110,55 @@ const {
102
110
  }
103
111
  </div>
104
112
  <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>
113
+ <Form id={formId} action={form.action} method={form.method ?? "post"}>
114
+ <FieldSet>
115
+ <FieldLegend class="sr-only">{form.legend}</FieldLegend>
116
+ <FieldGroup>
117
+ <div class="grid gap-4 md:grid-cols-2">
118
+ <Field>
119
+ <FieldLabel for={`${formId}-name`}
120
+ >{form.nameLabel}</FieldLabel
121
+ >
122
+ <Input
123
+ id={`${formId}-name`}
124
+ name="name"
125
+ autocomplete="name"
126
+ required
127
+ placeholder={form.namePlaceholder}
128
+ />
129
+ </Field>
130
+ <Field>
131
+ <FieldLabel for={`${formId}-email`}
132
+ >{form.emailLabel}</FieldLabel
133
+ >
134
+ <Input
135
+ id={`${formId}-email`}
136
+ name="email"
137
+ autocomplete="email"
138
+ required
139
+ type="email"
140
+ placeholder={form.emailPlaceholder}
141
+ />
142
+ </Field>
143
+ </div>
113
144
  <Field>
114
- <FieldLabel for="contact-email-3">{form.emailLabel}</FieldLabel>
115
- <Input
116
- id="contact-email-3"
117
- type="email"
118
- placeholder={form.emailPlaceholder}
145
+ <FieldLabel for={`${formId}-message`}
146
+ >{form.messageLabel}</FieldLabel
147
+ >
148
+ <Textarea
149
+ id={`${formId}-message`}
150
+ name="message"
151
+ required
152
+ rows={5}
153
+ placeholder={form.messagePlaceholder}
119
154
  />
120
155
  </Field>
121
- </div>
122
- <Field>
123
- <FieldLabel for="contact-message-3"
124
- >{form.messageLabel}</FieldLabel
156
+ <Button type="submit" size="lg" class="w-full"
157
+ >{form.actionLabel}</Button
125
158
  >
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>
159
+ </FieldGroup>
160
+ </FieldSet>
161
+ </Form>
135
162
  </div>
136
163
  </div>
137
164
  <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>
@@ -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,10 +49,11 @@ 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 class={cn("", className)}>
56
+ <Section class={cn("", className)} {...props}>
52
57
  <SectionContainer class="grid gap-12 lg:grid-cols-2 lg:items-center">
53
58
  <Image
54
59
  src={image.src}
@@ -59,11 +64,9 @@ const {
59
64
  />
60
65
  <div class="flex flex-col gap-6">
61
66
  <div class="flex flex-col gap-4">
62
- <h2
63
- class="text-foreground text-3xl leading-[1.1] font-semibold tracking-tight text-balance sm:text-4xl"
64
- >
67
+ <SectionTitle class="leading-[1.1]">
65
68
  {title}
66
- </h2>
69
+ </SectionTitle>
67
70
  <p class="text-muted-foreground text-lg leading-relaxed">
68
71
  {description}
69
72
  </p>