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.
- package/CHANGELOG.md +12 -0
- package/README.md +7 -1
- package/package.json +6 -4
- package/public/r/accordion.json +8 -2
- package/public/r/alert-dialog.json +9 -3
- package/public/r/alert.json +6 -0
- package/public/r/article-1.json +7 -1
- package/public/r/article-2.json +7 -1
- package/public/r/articles-1.json +7 -1
- package/public/r/articles-2.json +7 -1
- package/public/r/articles-3.json +7 -1
- package/public/r/articles-4.json +7 -1
- package/public/r/avatar.json +6 -0
- package/public/r/badge.json +6 -0
- package/public/r/banner-1.json +7 -1
- package/public/r/banner-2.json +7 -1
- package/public/r/banner.json +6 -0
- package/public/r/blocks-1.json +6 -1
- package/public/r/blocks.json +92 -0
- package/public/r/breadcrumb.json +6 -0
- package/public/r/button.json +6 -0
- package/public/r/card.json +6 -0
- package/public/r/carousel.json +6 -0
- package/public/r/checkbox.json +6 -0
- package/public/r/collapsible.json +7 -1
- package/public/r/combobox.json +6 -0
- package/public/r/command.json +6 -0
- package/public/r/components.json +14 -3
- package/public/r/contact-1.json +10 -2
- package/public/r/contact-2.json +10 -2
- package/public/r/contact-3.json +10 -2
- package/public/r/content-1.json +7 -1
- package/public/r/content-2.json +7 -1
- package/public/r/content-3.json +7 -1
- package/public/r/content-4.json +7 -1
- package/public/r/cta-1.json +7 -1
- package/public/r/cta-2.json +7 -1
- package/public/r/cta-3.json +7 -1
- package/public/r/cta-4.json +7 -1
- package/public/r/cta-5.json +7 -1
- package/public/r/cta-6.json +7 -1
- package/public/r/cta-7.json +7 -1
- package/public/r/cta-8.json +7 -1
- package/public/r/dialog.json +9 -3
- package/public/r/doc-1.json +7 -1
- package/public/r/dropdown-menu.json +7 -1
- package/public/r/empty.json +6 -0
- package/public/r/faqs-1.json +7 -1
- package/public/r/faqs-2.json +7 -1
- package/public/r/faqs-3.json +7 -1
- package/public/r/faqs-4.json +7 -1
- package/public/r/features-1.json +7 -1
- package/public/r/features-2.json +7 -1
- package/public/r/features-3.json +7 -1
- package/public/r/features-4.json +7 -1
- package/public/r/features-5.json +7 -1
- package/public/r/features-6.json +7 -1
- package/public/r/field.json +6 -0
- package/public/r/footer-1.json +7 -1
- package/public/r/footer-2.json +7 -1
- package/public/r/footer-3.json +7 -1
- package/public/r/form.json +6 -0
- package/public/r/header-1.json +7 -1
- package/public/r/header-2.json +7 -1
- package/public/r/header-3.json +7 -1
- package/public/r/header-4.json +7 -1
- package/public/r/header-5.json +7 -1
- package/public/r/header.json +6 -0
- package/public/r/hero-1.json +7 -1
- package/public/r/hero-10.json +7 -1
- package/public/r/hero-11.json +7 -1
- package/public/r/hero-12.json +7 -1
- package/public/r/hero-13.json +7 -1
- package/public/r/hero-2.json +7 -1
- package/public/r/hero-3.json +7 -1
- package/public/r/hero-4.json +7 -1
- package/public/r/hero-5.json +7 -1
- package/public/r/hero-6.json +7 -1
- package/public/r/hero-7.json +7 -1
- package/public/r/hero-8.json +7 -1
- package/public/r/hero-9.json +7 -1
- package/public/r/hover-card.json +9 -2
- package/public/r/icon.json +7 -1
- package/public/r/init.json +28 -0
- package/public/r/input-group.json +6 -0
- package/public/r/input.json +6 -0
- package/public/r/item.json +6 -0
- package/public/r/kbd.json +6 -0
- package/public/r/label.json +6 -0
- package/public/r/layout.json +6 -0
- package/public/r/links-2.json +7 -1
- package/public/r/logo.json +6 -0
- package/public/r/logos-1.json +7 -1
- package/public/r/logos-2.json +7 -1
- package/public/r/logos-3.json +7 -1
- package/public/r/marquee.json +6 -0
- package/public/r/native-select.json +6 -0
- package/public/r/navigation-menu.json +11 -5
- package/public/r/popover.json +7 -1
- package/public/r/price.json +6 -0
- package/public/r/pricing-1.json +7 -1
- package/public/r/pricing-2.json +7 -1
- package/public/r/pricing-3.json +7 -1
- package/public/r/product-1.json +7 -1
- package/public/r/products-1.json +7 -1
- package/public/r/products-2.json +7 -1
- package/public/r/products-3.json +7 -1
- package/public/r/products-4.json +7 -1
- package/public/r/products-5.json +7 -1
- package/public/r/radio-group.json +7 -1
- package/public/r/rating.json +6 -0
- package/public/r/registry.json +1645 -457
- package/public/r/reviews-1.json +7 -1
- package/public/r/reviews-2.json +7 -1
- package/public/r/reviews-3.json +7 -1
- package/public/r/reviews-4.json +7 -1
- package/public/r/reviews-5.json +7 -1
- package/public/r/section.json +18 -2
- package/public/r/select.json +6 -0
- package/public/r/separator.json +6 -0
- package/public/r/services-1.json +7 -1
- package/public/r/services-2.json +7 -1
- package/public/r/services-3.json +7 -1
- package/public/r/services-4.json +7 -1
- package/public/r/services-5.json +7 -1
- package/public/r/services-6.json +7 -1
- package/public/r/services-7.json +7 -1
- package/public/r/sheet.json +9 -3
- package/public/r/sidebar-1.json +5 -0
- package/public/r/sidebar.json +9 -3
- package/public/r/skeleton.json +6 -0
- package/public/r/slider.json +7 -1
- package/public/r/spinner.json +6 -0
- package/public/r/switch.json +7 -1
- package/public/r/table.json +6 -0
- package/public/r/tabs.json +8 -2
- package/public/r/textarea.json +6 -0
- package/public/r/theme-toggle.json +6 -0
- package/public/r/toc.json +6 -0
- package/public/r/toggle.json +7 -1
- package/public/r/tooltip.json +7 -1
- package/public/r/typography.json +6 -0
- package/public/r/video.json +6 -0
- package/registry/init/global.css +187 -0
- package/registry.json +1138 -455
- package/src/components/blocks/article-1.astro +4 -3
- package/src/components/blocks/article-2.astro +4 -3
- package/src/components/blocks/articles-1.astro +18 -9
- package/src/components/blocks/articles-2.astro +4 -3
- package/src/components/blocks/articles-3.astro +11 -9
- package/src/components/blocks/articles-4.astro +11 -4
- package/src/components/blocks/banner-1.astro +4 -3
- package/src/components/blocks/banner-2.astro +10 -4
- package/src/components/blocks/blocks-1.astro +1 -1
- package/src/components/blocks/contact-1.astro +72 -39
- package/src/components/blocks/contact-2.astro +69 -35
- package/src/components/blocks/contact-3.astro +61 -34
- package/src/components/blocks/content-1.astro +15 -10
- package/src/components/blocks/content-2.astro +15 -10
- package/src/components/blocks/content-3.astro +14 -12
- package/src/components/blocks/content-4.astro +15 -10
- package/src/components/blocks/cta-1.astro +14 -10
- package/src/components/blocks/cta-2.astro +11 -8
- package/src/components/blocks/cta-3.astro +15 -8
- package/src/components/blocks/cta-4.astro +14 -9
- package/src/components/blocks/cta-5.astro +12 -8
- package/src/components/blocks/cta-6.astro +11 -8
- package/src/components/blocks/cta-7.astro +17 -10
- package/src/components/blocks/cta-8.astro +15 -10
- package/src/components/blocks/doc-1.astro +1 -1
- package/src/components/blocks/faqs-1.astro +22 -11
- package/src/components/blocks/faqs-2.astro +19 -9
- package/src/components/blocks/faqs-3.astro +19 -9
- package/src/components/blocks/faqs-4.astro +12 -9
- package/src/components/blocks/features-1.astro +21 -13
- package/src/components/blocks/features-2.astro +22 -13
- package/src/components/blocks/features-3.astro +14 -13
- package/src/components/blocks/features-4.astro +18 -9
- package/src/components/blocks/features-5.astro +22 -13
- package/src/components/blocks/features-6.astro +19 -9
- package/src/components/blocks/footer-1.astro +4 -3
- package/src/components/blocks/footer-2.astro +4 -3
- package/src/components/blocks/footer-3.astro +4 -3
- package/src/components/blocks/header-1.astro +13 -7
- package/src/components/blocks/header-2.astro +12 -6
- package/src/components/blocks/header-3.astro +12 -6
- package/src/components/blocks/header-4.astro +13 -6
- package/src/components/blocks/header-5.astro +16 -6
- package/src/components/blocks/hero-1.astro +11 -8
- package/src/components/blocks/hero-10.astro +7 -3
- package/src/components/blocks/hero-11.astro +4 -2
- package/src/components/blocks/hero-12.astro +11 -4
- package/src/components/blocks/hero-13.astro +11 -4
- package/src/components/blocks/hero-2.astro +11 -8
- package/src/components/blocks/hero-3.astro +11 -3
- package/src/components/blocks/hero-4.astro +4 -2
- package/src/components/blocks/hero-5.astro +4 -3
- package/src/components/blocks/hero-6.astro +4 -3
- package/src/components/blocks/hero-7.astro +4 -3
- package/src/components/blocks/hero-8.astro +11 -4
- package/src/components/blocks/hero-9.astro +4 -3
- package/src/components/blocks/links-2.astro +4 -4
- package/src/components/blocks/logos-1.astro +14 -16
- package/src/components/blocks/logos-2.astro +14 -12
- package/src/components/blocks/logos-3.astro +5 -4
- package/src/components/blocks/pricing-1.astro +13 -16
- package/src/components/blocks/pricing-2.astro +14 -13
- package/src/components/blocks/pricing-3.astro +20 -16
- package/src/components/blocks/product-1.astro +4 -3
- package/src/components/blocks/products-1.astro +11 -9
- package/src/components/blocks/products-2.astro +12 -9
- package/src/components/blocks/products-3.astro +12 -9
- package/src/components/blocks/products-4.astro +18 -9
- package/src/components/blocks/products-5.astro +18 -9
- package/src/components/blocks/reviews-1.astro +13 -12
- package/src/components/blocks/reviews-2.astro +4 -4
- package/src/components/blocks/reviews-3.astro +13 -12
- package/src/components/blocks/reviews-4.astro +13 -12
- package/src/components/blocks/reviews-5.astro +13 -12
- package/src/components/blocks/services-1.astro +19 -9
- package/src/components/blocks/services-2.astro +11 -8
- package/src/components/blocks/services-3.astro +11 -8
- package/src/components/blocks/services-4.astro +19 -9
- package/src/components/blocks/services-5.astro +11 -8
- package/src/components/blocks/services-6.astro +4 -3
- package/src/components/blocks/services-7.astro +12 -8
- package/src/components/ui/accordion/accordion-content.astro +2 -1
- package/src/components/ui/accordion/accordion.astro +1 -0
- package/src/components/ui/alert-dialog/alert-dialog-content.astro +1 -1
- package/src/components/ui/alert-dialog/alert-dialog-overlay.astro +1 -1
- package/src/components/ui/alert-dialog/alert-dialog.astro +1 -0
- package/src/components/ui/collapsible/collapsible.astro +1 -0
- package/src/components/ui/dialog/dialog-content.astro +1 -1
- package/src/components/ui/dialog/dialog-overlay.astro +1 -1
- package/src/components/ui/dialog/dialog.astro +1 -0
- package/src/components/ui/dropdown-menu/dropdown-menu.astro +1 -0
- package/src/components/ui/hover-card/hover-card.astro +10 -3
- package/src/components/ui/icon/icon.astro +46 -29
- package/src/components/ui/navigation-menu/navigation-menu-content.astro +2 -0
- package/src/components/ui/navigation-menu/navigation-menu-indicator.astro +2 -1
- package/src/components/ui/navigation-menu/navigation-menu-list.astro +1 -1
- package/src/components/ui/navigation-menu/navigation-menu-positioner.astro +2 -0
- package/src/components/ui/navigation-menu/navigation-menu.astro +1 -0
- package/src/components/ui/popover/popover.astro +1 -0
- package/src/components/ui/radio-group/radio-group.astro +1 -0
- package/src/components/ui/section/index.ts +2 -0
- package/src/components/ui/section/section-container.astro +1 -0
- package/src/components/ui/section/section-description.astro +20 -0
- package/src/components/ui/section/section-title.astro +20 -0
- package/src/components/ui/sheet/sheet-close.astro +4 -2
- package/src/components/ui/sheet/sheet-content.astro +2 -2
- package/src/components/ui/sheet/sheet.astro +2 -89
- package/src/components/ui/sidebar/sidebar-menu-button.astro +0 -1
- package/src/components/ui/sidebar/sidebar-provider.astro +36 -2
- package/src/components/ui/sidebar/sidebar.astro +0 -1
- package/src/components/ui/slider/slider.astro +4 -3
- package/src/components/ui/switch/switch.astro +5 -2
- package/src/components/ui/tabs/tabs-content.astro +2 -1
- package/src/components/ui/tabs/tabs.astro +1 -0
- package/src/components/ui/toggle/toggle.astro +3 -0
- package/src/components/ui/tooltip/tooltip.astro +1 -0
- package/src/lib/pages.ts +12 -0
package/public/r/reviews-1.json
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
|
|
3
3
|
"name": "reviews-1",
|
|
4
|
+
"title": "Reviews 1",
|
|
5
|
+
"description": "Testimonial and review sections for social proof, trust, and product validation.",
|
|
4
6
|
"dependencies": [
|
|
5
7
|
"@lucide/astro"
|
|
6
8
|
],
|
|
@@ -13,9 +15,13 @@
|
|
|
13
15
|
"files": [
|
|
14
16
|
{
|
|
15
17
|
"path": "src/components/blocks/reviews-1.astro",
|
|
16
|
-
"content": "---\nimport type { ImageMetadata } from \"astro\"\nimport QuoteIcon from \"@lucide/astro/icons/quote\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\"\nimport { Card, CardContent } from \"@/components/ui/card\"\nimport { Rating } from \"@/components/ui/rating\"\nimport {
|
|
18
|
+
"content": "---\nimport type { ImageMetadata } from \"astro\"\nimport type { HTMLAttributes } from \"astro/types\"\nimport QuoteIcon from \"@lucide/astro/icons/quote\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\"\nimport { Card, CardContent } from \"@/components/ui/card\"\nimport { Rating } from \"@/components/ui/rating\"\nimport {\n Section,\n SectionContainer,\n SectionDescription,\n SectionTitle,\n} from \"@/components/ui/section\"\n\ntype Props = HTMLAttributes<\"section\"> & {\n title?: string\n description?: string\n reviews: {\n rating: number\n quote: string\n image?: ImageMetadata\n initials: string\n name: string\n role: string\n }[]\n}\n\nconst { class: className, title, description, reviews, ...props } = Astro.props\n---\n\n<Section class={cn(\"\", className)} {...props}>\n {\n (title || description) && (\n <SectionContainer class=\"items-center gap-4 text-center\">\n {title && <SectionTitle>{title}</SectionTitle>}\n {description && (\n <SectionDescription class=\"max-w-2xl\">\n {description}\n </SectionDescription>\n )}\n </SectionContainer>\n )\n }\n <SectionContainer>\n <div class=\"grid gap-6 md:grid-cols-3\">\n {\n reviews.map((item) => (\n <Card>\n <CardContent class=\"flex flex-col gap-4\">\n <div class=\"flex items-center justify-between\">\n <Rating value={item.rating} />\n <QuoteIcon class=\"text-muted-foreground/20 size-6\" />\n </div>\n <p class=\"text-muted-foreground text-sm leading-relaxed\">\n {item.quote}\n </p>\n <div class=\"flex items-center gap-3 pt-2\">\n <Avatar size=\"lg\">\n <AvatarImage src={item.image} alt={item.name} />\n <AvatarFallback>{item.initials}</AvatarFallback>\n </Avatar>\n <div>\n <p class=\"text-foreground text-sm font-medium\">{item.name}</p>\n <p class=\"text-muted-foreground text-xs\">{item.role}</p>\n </div>\n </div>\n </CardContent>\n </Card>\n ))\n }\n </div>\n </SectionContainer>\n</Section>\n",
|
|
17
19
|
"type": "registry:block"
|
|
18
20
|
}
|
|
19
21
|
],
|
|
22
|
+
"docs": "https://ui.full.dev/blocks/reviews/",
|
|
23
|
+
"categories": [
|
|
24
|
+
"reviews"
|
|
25
|
+
],
|
|
20
26
|
"type": "registry:block"
|
|
21
27
|
}
|
package/public/r/reviews-2.json
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
|
|
3
3
|
"name": "reviews-2",
|
|
4
|
+
"title": "Reviews 2",
|
|
5
|
+
"description": "Testimonial and review sections for social proof, trust, and product validation.",
|
|
4
6
|
"dependencies": [
|
|
5
7
|
"@lucide/astro"
|
|
6
8
|
],
|
|
@@ -13,9 +15,13 @@
|
|
|
13
15
|
"files": [
|
|
14
16
|
{
|
|
15
17
|
"path": "src/components/blocks/reviews-2.astro",
|
|
16
|
-
"content": "---\nimport type { ImageMetadata } from \"astro\"\nimport QuoteIcon from \"@lucide/astro/icons/quote\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\"\nimport { Rating } from \"@/components/ui/rating\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\nimport { Separator } from \"@/components/ui/separator\"\n\ntype Props =
|
|
18
|
+
"content": "---\nimport type { ImageMetadata } from \"astro\"\nimport type { HTMLAttributes } from \"astro/types\"\nimport QuoteIcon from \"@lucide/astro/icons/quote\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\"\nimport { Rating } from \"@/components/ui/rating\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\nimport { Separator } from \"@/components/ui/separator\"\n\ntype Props = HTMLAttributes<\"section\"> & {\n featured: {\n quote: string\n image?: ImageMetadata\n initials: string\n name: string\n role: string\n }\n reviews: {\n rating: number\n quote: string\n image?: ImageMetadata\n initials: string\n name: string\n role: string\n }[]\n}\n\nconst { class: className, featured, reviews, ...props } = Astro.props\n---\n\n<Section class={cn(\"\", className)} {...props}>\n <SectionContainer\n class=\"grid gap-10 lg:grid-cols-[minmax(0,1.3fr)_minmax(0,1fr)] lg:items-start\"\n >\n <article class=\"flex flex-col gap-6 rounded-xl border p-8\">\n <QuoteIcon class=\"text-primary size-8\" />\n <blockquote\n class=\"text-foreground text-2xl leading-snug font-semibold text-balance sm:text-3xl\"\n >\n {featured.quote}\n </blockquote>\n <div class=\"flex items-center gap-3 pt-2\">\n <Avatar size=\"lg\">\n <AvatarImage src={featured.image} alt={featured.name} />\n <AvatarFallback>{featured.initials}</AvatarFallback>\n </Avatar>\n <div>\n <p class=\"text-foreground text-sm font-medium\">{featured.name}</p>\n <p class=\"text-muted-foreground text-xs\">{featured.role}</p>\n </div>\n </div>\n </article>\n <div class=\"grid gap-6\">\n {\n reviews.map((item) => (\n <article class=\"flex flex-col\">\n <Separator />\n <div class=\"flex flex-col gap-3 pt-6\">\n <Rating value={item.rating} />\n <p class=\"text-muted-foreground text-sm leading-relaxed\">\n {item.quote}\n </p>\n <div class=\"flex items-center gap-3 pt-1\">\n <Avatar>\n <AvatarImage src={item.image} alt={item.name} />\n <AvatarFallback>{item.initials}</AvatarFallback>\n </Avatar>\n <div>\n <p class=\"text-foreground text-sm font-medium\">{item.name}</p>\n <p class=\"text-muted-foreground text-xs\">{item.role}</p>\n </div>\n </div>\n </div>\n </article>\n ))\n }\n </div>\n </SectionContainer>\n</Section>\n",
|
|
17
19
|
"type": "registry:block"
|
|
18
20
|
}
|
|
19
21
|
],
|
|
22
|
+
"docs": "https://ui.full.dev/blocks/reviews/",
|
|
23
|
+
"categories": [
|
|
24
|
+
"reviews"
|
|
25
|
+
],
|
|
20
26
|
"type": "registry:block"
|
|
21
27
|
}
|
package/public/r/reviews-3.json
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
|
|
3
3
|
"name": "reviews-3",
|
|
4
|
+
"title": "Reviews 3",
|
|
5
|
+
"description": "Testimonial and review sections for social proof, trust, and product validation.",
|
|
4
6
|
"dependencies": [
|
|
5
7
|
"@lucide/astro"
|
|
6
8
|
],
|
|
@@ -13,9 +15,13 @@
|
|
|
13
15
|
"files": [
|
|
14
16
|
{
|
|
15
17
|
"path": "src/components/blocks/reviews-3.astro",
|
|
16
|
-
"content": "---\nimport type { ImageMetadata } from \"astro\"\nimport QuoteIcon from \"@lucide/astro/icons/quote\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\"\nimport {\n Carousel,\n CarouselContent,\n CarouselItem,\n CarouselNext,\n CarouselPrevious,\n} from \"@/components/ui/carousel\"\nimport { Rating } from \"@/components/ui/rating\"\nimport {
|
|
18
|
+
"content": "---\nimport type { ImageMetadata } from \"astro\"\nimport type { HTMLAttributes } from \"astro/types\"\nimport QuoteIcon from \"@lucide/astro/icons/quote\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\"\nimport {\n Carousel,\n CarouselContent,\n CarouselItem,\n CarouselNext,\n CarouselPrevious,\n} from \"@/components/ui/carousel\"\nimport { Rating } from \"@/components/ui/rating\"\nimport {\n Section,\n SectionContainer,\n SectionDescription,\n SectionTitle,\n} from \"@/components/ui/section\"\n\ntype Props = HTMLAttributes<\"section\"> & {\n title?: string\n description?: string\n reviews: {\n rating: number\n quote: string\n image?: ImageMetadata\n initials: string\n name: string\n role: string\n }[]\n}\n\nconst { class: className, title, description, reviews, ...props } = Astro.props\n---\n\n<Section class={cn(\"\", className)} {...props}>\n {\n (title || description) && (\n <SectionContainer class=\"items-center gap-4 text-center\">\n {title && <SectionTitle>{title}</SectionTitle>}\n {description && (\n <SectionDescription class=\"max-w-2xl\">\n {description}\n </SectionDescription>\n )}\n </SectionContainer>\n )\n }\n <SectionContainer>\n <Carousel opts={{ loop: true, align: \"center\" }} class=\"mx-auto max-w-3xl\">\n <CarouselContent>\n {\n reviews.map((item) => (\n <CarouselItem>\n <div class=\"flex flex-col items-center gap-6 px-4 py-8 text-center\">\n <QuoteIcon class=\"text-primary size-10\" />\n <Rating value={item.rating} />\n <blockquote class=\"text-foreground text-xl leading-relaxed font-medium text-balance sm:text-2xl\">\n {item.quote}\n </blockquote>\n <div class=\"flex items-center gap-3 pt-2\">\n <Avatar size=\"lg\">\n <AvatarImage src={item.image} alt={item.name} />\n <AvatarFallback>{item.initials}</AvatarFallback>\n </Avatar>\n <div class=\"text-left\">\n <p class=\"text-foreground text-sm font-medium\">\n {item.name}\n </p>\n <p class=\"text-muted-foreground text-xs\">{item.role}</p>\n </div>\n </div>\n </div>\n </CarouselItem>\n ))\n }\n </CarouselContent>\n <CarouselPrevious />\n <CarouselNext />\n </Carousel>\n </SectionContainer>\n</Section>\n",
|
|
17
19
|
"type": "registry:block"
|
|
18
20
|
}
|
|
19
21
|
],
|
|
22
|
+
"docs": "https://ui.full.dev/blocks/reviews/",
|
|
23
|
+
"categories": [
|
|
24
|
+
"reviews"
|
|
25
|
+
],
|
|
20
26
|
"type": "registry:block"
|
|
21
27
|
}
|
package/public/r/reviews-4.json
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
|
|
3
3
|
"name": "reviews-4",
|
|
4
|
+
"title": "Reviews 4",
|
|
5
|
+
"description": "Testimonial and review sections for social proof, trust, and product validation.",
|
|
4
6
|
"registryDependencies": [
|
|
5
7
|
"@fulldev/avatar",
|
|
6
8
|
"@fulldev/card",
|
|
@@ -11,9 +13,13 @@
|
|
|
11
13
|
"files": [
|
|
12
14
|
{
|
|
13
15
|
"path": "src/components/blocks/reviews-4.astro",
|
|
14
|
-
"content": "---\nimport type { ImageMetadata } from \"astro\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\"\nimport { Card, CardContent } from \"@/components/ui/card\"\nimport { Marquee } from \"@/components/ui/marquee\"\nimport { Rating } from \"@/components/ui/rating\"\nimport {
|
|
16
|
+
"content": "---\nimport type { ImageMetadata } from \"astro\"\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\"\nimport { Card, CardContent } from \"@/components/ui/card\"\nimport { Marquee } from \"@/components/ui/marquee\"\nimport { Rating } from \"@/components/ui/rating\"\nimport {\n Section,\n SectionContainer,\n SectionDescription,\n SectionTitle,\n} from \"@/components/ui/section\"\n\ntype Props = HTMLAttributes<\"section\"> & {\n title?: string\n description?: string\n reviews: {\n rating: number\n quote: string\n image?: ImageMetadata\n initials: string\n name: string\n role: string\n }[]\n}\n\nconst { class: className, title, description, reviews, ...props } = Astro.props\n\nconst half = Math.ceil(reviews.length / 2)\nconst topRow = reviews.slice(0, half)\nconst bottomRow = reviews.slice(half)\n---\n\n<Section class={cn(\"\", className)} {...props}>\n {\n (title || description) && (\n <SectionContainer class=\"items-center gap-4 text-center\">\n {title && <SectionTitle>{title}</SectionTitle>}\n {description && (\n <SectionDescription class=\"max-w-2xl\">\n {description}\n </SectionDescription>\n )}\n </SectionContainer>\n )\n }\n <div class=\"flex flex-col gap-6 overflow-x-hidden py-1\">\n <Marquee\n direction=\"left\"\n pauseOnHover\n infinite\n gap=\"1rem\"\n class=\"py-1 [&>div]:items-stretch\"\n >\n {\n topRow.map((item) => (\n <Card class=\"flex w-[22rem] shrink-0 self-stretch\">\n <CardContent class=\"flex flex-1 flex-col gap-3\">\n <Rating value={item.rating} />\n <p class=\"text-muted-foreground text-sm leading-relaxed\">\n {item.quote}\n </p>\n <div class=\"mt-auto flex items-center gap-3 pt-1\">\n <Avatar>\n <AvatarImage src={item.image} alt={item.name} />\n <AvatarFallback>{item.initials}</AvatarFallback>\n </Avatar>\n <div>\n <p class=\"text-foreground text-sm font-medium\">{item.name}</p>\n <p class=\"text-muted-foreground text-xs\">{item.role}</p>\n </div>\n </div>\n </CardContent>\n </Card>\n ))\n }\n </Marquee>\n <Marquee\n direction=\"right\"\n pauseOnHover\n infinite\n gap=\"1rem\"\n class=\"py-1 [&>div]:items-stretch\"\n >\n {\n bottomRow.map((item) => (\n <Card class=\"flex w-[22rem] shrink-0 self-stretch\">\n <CardContent class=\"flex flex-1 flex-col gap-3\">\n <Rating value={item.rating} />\n <p class=\"text-muted-foreground text-sm leading-relaxed\">\n {item.quote}\n </p>\n <div class=\"mt-auto flex items-center gap-3 pt-1\">\n <Avatar>\n <AvatarImage src={item.image} alt={item.name} />\n <AvatarFallback>{item.initials}</AvatarFallback>\n </Avatar>\n <div>\n <p class=\"text-foreground text-sm font-medium\">{item.name}</p>\n <p class=\"text-muted-foreground text-xs\">{item.role}</p>\n </div>\n </div>\n </CardContent>\n </Card>\n ))\n }\n </Marquee>\n </div>\n</Section>\n",
|
|
15
17
|
"type": "registry:block"
|
|
16
18
|
}
|
|
17
19
|
],
|
|
20
|
+
"docs": "https://ui.full.dev/blocks/reviews/",
|
|
21
|
+
"categories": [
|
|
22
|
+
"reviews"
|
|
23
|
+
],
|
|
18
24
|
"type": "registry:block"
|
|
19
25
|
}
|
package/public/r/reviews-5.json
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
|
|
3
3
|
"name": "reviews-5",
|
|
4
|
+
"title": "Reviews 5",
|
|
5
|
+
"description": "Testimonial and review sections for social proof, trust, and product validation.",
|
|
4
6
|
"dependencies": [
|
|
5
7
|
"@lucide/astro"
|
|
6
8
|
],
|
|
@@ -13,9 +15,13 @@
|
|
|
13
15
|
"files": [
|
|
14
16
|
{
|
|
15
17
|
"path": "src/components/blocks/reviews-5.astro",
|
|
16
|
-
"content": "---\nimport type { ImageMetadata } from \"astro\"\nimport QuoteIcon from \"@lucide/astro/icons/quote\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\"\nimport { Marquee } from \"@/components/ui/marquee\"\nimport { Rating } from \"@/components/ui/rating\"\nimport {
|
|
18
|
+
"content": "---\nimport type { ImageMetadata } from \"astro\"\nimport type { HTMLAttributes } from \"astro/types\"\nimport QuoteIcon from \"@lucide/astro/icons/quote\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"@/components/ui/avatar\"\nimport { Marquee } from \"@/components/ui/marquee\"\nimport { Rating } from \"@/components/ui/rating\"\nimport {\n Section,\n SectionContainer,\n SectionDescription,\n SectionTitle,\n} from \"@/components/ui/section\"\n\ntype Props = HTMLAttributes<\"section\"> & {\n title?: string\n description?: string\n reviews: {\n quote: string\n image?: ImageMetadata\n initials: string\n name: string\n role: string\n rating: number\n }[]\n}\n\nconst { class: className, title, description, reviews, ...props } = Astro.props\n\nconst third = Math.ceil(reviews.length / 3)\nconst row1 = reviews.slice(0, third)\nconst row2 = reviews.slice(third, third * 2)\nconst row3 = reviews.slice(third * 2)\n---\n\n<Section class={cn(\"\", className)} {...props}>\n {\n (title || description) && (\n <SectionContainer class=\"items-center gap-4 text-center\">\n {title && <SectionTitle>{title}</SectionTitle>}\n {description && (\n <SectionDescription class=\"max-w-2xl\">\n {description}\n </SectionDescription>\n )}\n </SectionContainer>\n )\n }\n <div class=\"flex flex-col gap-5\">\n <Marquee\n direction=\"left\"\n pauseOnHover\n infinite\n gap=\"1.25rem\"\n class=\"[&>div]:items-stretch\"\n >\n {\n row1.map((item) => (\n <div class=\"bg-muted/50 flex w-[26rem] shrink-0 rounded-2xl p-6\">\n <div class=\"flex flex-1 flex-col gap-4\">\n <div class=\"flex items-center justify-between\">\n <div class=\"flex items-center gap-3\">\n <Avatar size=\"lg\">\n <AvatarImage src={item.image} alt={item.name} />\n <AvatarFallback>{item.initials}</AvatarFallback>\n </Avatar>\n <div>\n <p class=\"text-foreground text-sm font-semibold\">\n {item.name}\n </p>\n <p class=\"text-muted-foreground text-xs\">{item.role}</p>\n </div>\n </div>\n <Rating value={item.rating} />\n </div>\n <div class=\"flex gap-2.5\">\n <QuoteIcon class=\"text-primary/30 mt-0.5 size-5 shrink-0\" />\n <p class=\"text-foreground/80 text-sm leading-relaxed\">\n {item.quote}\n </p>\n </div>\n </div>\n </div>\n ))\n }\n </Marquee>\n <Marquee\n direction=\"right\"\n pauseOnHover\n infinite\n gap=\"1.25rem\"\n class=\"[&>div]:items-stretch\"\n >\n {\n row2.map((item) => (\n <div class=\"bg-muted/50 flex w-[26rem] shrink-0 rounded-2xl p-6\">\n <div class=\"flex flex-1 flex-col gap-4\">\n <div class=\"flex items-center justify-between\">\n <div class=\"flex items-center gap-3\">\n <Avatar size=\"lg\">\n <AvatarImage src={item.image} alt={item.name} />\n <AvatarFallback>{item.initials}</AvatarFallback>\n </Avatar>\n <div>\n <p class=\"text-foreground text-sm font-semibold\">\n {item.name}\n </p>\n <p class=\"text-muted-foreground text-xs\">{item.role}</p>\n </div>\n </div>\n <Rating value={item.rating} />\n </div>\n <div class=\"flex gap-2.5\">\n <QuoteIcon class=\"text-primary/30 mt-0.5 size-5 shrink-0\" />\n <p class=\"text-foreground/80 text-sm leading-relaxed\">\n {item.quote}\n </p>\n </div>\n </div>\n </div>\n ))\n }\n </Marquee>\n <Marquee\n direction=\"left\"\n pauseOnHover\n infinite\n gap=\"1.25rem\"\n class=\"[&>div]:items-stretch\"\n >\n {\n row3.map((item) => (\n <div class=\"bg-muted/50 flex w-[26rem] shrink-0 rounded-2xl p-6\">\n <div class=\"flex flex-1 flex-col gap-4\">\n <div class=\"flex items-center justify-between\">\n <div class=\"flex items-center gap-3\">\n <Avatar size=\"lg\">\n <AvatarImage src={item.image} alt={item.name} />\n <AvatarFallback>{item.initials}</AvatarFallback>\n </Avatar>\n <div>\n <p class=\"text-foreground text-sm font-semibold\">\n {item.name}\n </p>\n <p class=\"text-muted-foreground text-xs\">{item.role}</p>\n </div>\n </div>\n <Rating value={item.rating} />\n </div>\n <div class=\"flex gap-2.5\">\n <QuoteIcon class=\"text-primary/30 mt-0.5 size-5 shrink-0\" />\n <p class=\"text-foreground/80 text-sm leading-relaxed\">\n {item.quote}\n </p>\n </div>\n </div>\n </div>\n ))\n }\n </Marquee>\n </div>\n</Section>\n",
|
|
17
19
|
"type": "registry:block"
|
|
18
20
|
}
|
|
19
21
|
],
|
|
22
|
+
"docs": "https://ui.full.dev/blocks/reviews/",
|
|
23
|
+
"categories": [
|
|
24
|
+
"reviews"
|
|
25
|
+
],
|
|
20
26
|
"type": "registry:block"
|
|
21
27
|
}
|
package/public/r/section.json
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
|
|
3
3
|
"name": "section",
|
|
4
|
+
"title": "Section",
|
|
5
|
+
"description": "A layout component for organizing page content into sections.",
|
|
4
6
|
"files": [
|
|
5
7
|
{
|
|
6
8
|
"path": "src/components/ui/section/section.astro",
|
|
@@ -9,14 +11,28 @@
|
|
|
9
11
|
},
|
|
10
12
|
{
|
|
11
13
|
"path": "src/components/ui/section/section-container.astro",
|
|
12
|
-
"content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<div\n class={cn(\n \"relative mx-auto flex w-full max-w-7xl flex-col gap-8 px-4\",\n className\n )}\n {...props}\n>\n <slot />\n</div>\n",
|
|
14
|
+
"content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<div\n data-slot=\"section-container\"\n class={cn(\n \"relative mx-auto flex w-full max-w-7xl flex-col gap-8 px-4\",\n className\n )}\n {...props}\n>\n <slot />\n</div>\n",
|
|
13
15
|
"type": "registry:ui"
|
|
14
16
|
},
|
|
15
17
|
{
|
|
16
18
|
"path": "src/components/ui/section/index.ts",
|
|
17
|
-
"content": "export { default as Section } from \"./section.astro\"\nexport { default as SectionContainer } from \"./section-container.astro\"\n",
|
|
19
|
+
"content": "export { default as Section } from \"./section.astro\"\nexport { default as SectionContainer } from \"./section-container.astro\"\nexport { default as SectionDescription } from \"./section-description.astro\"\nexport { default as SectionTitle } from \"./section-title.astro\"\n",
|
|
20
|
+
"type": "registry:ui"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"path": "src/components/ui/section/section-title.astro",
|
|
24
|
+
"content": "---\nimport type { HTMLTag, Polymorphic } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props<Tag extends HTMLTag = \"h2\"> = Polymorphic<{ as: Tag }>\n\nconst { as: Tag = \"h2\", class: className, ...props } = Astro.props\n---\n\n<Tag\n data-slot=\"section-title\"\n class={cn(\n \"text-foreground text-3xl font-semibold tracking-tight text-balance sm:text-4xl\",\n className\n )}\n {...props}\n>\n <slot />\n</Tag>\n",
|
|
25
|
+
"type": "registry:ui"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"path": "src/components/ui/section/section-description.astro",
|
|
29
|
+
"content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"p\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<p\n data-slot=\"section-description\"\n class={cn(\n \"text-muted-foreground text-lg leading-relaxed text-balance\",\n className\n )}\n {...props}\n>\n <slot />\n</p>\n",
|
|
18
30
|
"type": "registry:ui"
|
|
19
31
|
}
|
|
20
32
|
],
|
|
33
|
+
"docs": "https://ui.full.dev/components/section/",
|
|
34
|
+
"categories": [
|
|
35
|
+
"ui"
|
|
36
|
+
],
|
|
21
37
|
"type": "registry:ui"
|
|
22
38
|
}
|
package/public/r/select.json
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
|
|
3
3
|
"name": "select",
|
|
4
|
+
"title": "Select",
|
|
5
|
+
"description": "Displays a list of options for the user to pick from, triggered by a button.",
|
|
4
6
|
"dependencies": [
|
|
5
7
|
"@data-slot/select",
|
|
6
8
|
"@lucide/astro"
|
|
@@ -52,5 +54,9 @@
|
|
|
52
54
|
"type": "registry:ui"
|
|
53
55
|
}
|
|
54
56
|
],
|
|
57
|
+
"docs": "https://ui.full.dev/components/select/",
|
|
58
|
+
"categories": [
|
|
59
|
+
"ui"
|
|
60
|
+
],
|
|
55
61
|
"type": "registry:ui"
|
|
56
62
|
}
|
package/public/r/separator.json
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
|
|
3
3
|
"name": "separator",
|
|
4
|
+
"title": "Separator",
|
|
5
|
+
"description": "Visually or semantically separates content.",
|
|
4
6
|
"files": [
|
|
5
7
|
{
|
|
6
8
|
"path": "src/components/ui/separator/separator.astro",
|
|
@@ -13,5 +15,9 @@
|
|
|
13
15
|
"type": "registry:ui"
|
|
14
16
|
}
|
|
15
17
|
],
|
|
18
|
+
"docs": "https://ui.full.dev/components/separator/",
|
|
19
|
+
"categories": [
|
|
20
|
+
"ui"
|
|
21
|
+
],
|
|
16
22
|
"type": "registry:ui"
|
|
17
23
|
}
|
package/public/r/services-1.json
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
|
|
3
3
|
"name": "services-1",
|
|
4
|
+
"title": "Services 1",
|
|
5
|
+
"description": "Service section layouts for agencies, consultancies, and internal platform teams.",
|
|
4
6
|
"dependencies": [
|
|
5
7
|
"@lucide/astro"
|
|
6
8
|
],
|
|
@@ -12,7 +14,7 @@
|
|
|
12
14
|
"files": [
|
|
13
15
|
{
|
|
14
16
|
"path": "src/components/blocks/services-1.astro",
|
|
15
|
-
"content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\nimport ArrowRightIcon from \"@lucide/astro/icons/arrow-right\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Badge } from \"@/components/ui/badge\"\nimport { Button } from \"@/components/ui/button\"\nimport { Section
|
|
17
|
+
"content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\nimport type { HTMLAttributes } from \"astro/types\"\nimport ArrowRightIcon from \"@lucide/astro/icons/arrow-right\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Badge } from \"@/components/ui/badge\"\nimport { Button } from \"@/components/ui/button\"\nimport { Icon } from \"@/components/ui/icon\"\nimport {\n Section,\n SectionContainer,\n SectionTitle,\n} from \"@/components/ui/section\"\nimport PlaceholderImage from \"@/assets/placeholder.webp\"\n\ntype Props = HTMLAttributes<\"section\"> & {\n badge?: string\n title: string\n buttons?: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n services: {\n image?: {\n src: ImageMetadata\n alt: string\n }\n label?: string\n title: string\n description: string\n href?: string\n }[]\n}\n\nconst {\n class: className,\n badge,\n title,\n buttons,\n services,\n ...props\n} = Astro.props\n---\n\n<Section class={cn(\"\", className)} {...props}>\n <SectionContainer class=\"gap-8\">\n <div\n class=\"flex flex-col gap-4 md:flex-row md:items-end md:justify-between\"\n >\n <div class=\"max-w-2xl\">\n {badge && <Badge variant=\"secondary\">{badge}</Badge>}\n <SectionTitle class=\"mt-4\">\n {title}\n </SectionTitle>\n </div>\n {\n buttons?.length && (\n <div class=\"flex flex-wrap gap-3\">\n {buttons.map(({ href, label, ...button }) => (\n <Button as=\"a\" href={href} variant={button.variant}>\n {label}\n </Button>\n ))}\n </div>\n )\n }\n </div>\n <div class=\"grid gap-6 sm:grid-cols-2 lg:grid-cols-4\">\n {\n services.map((service) => {\n const Wrapper = service.href ? \"a\" : \"div\"\n return (\n <Wrapper\n href={service.href}\n class={cn(\n \"group/service flex flex-col gap-4 overflow-hidden rounded-xl border shadow-xs transition-shadow\",\n service.href && \"hover:shadow-md\"\n )}\n >\n <Image\n src={service.image?.src ?? PlaceholderImage}\n alt={service.image?.alt ?? service.title}\n class=\"aspect-[4/3] w-full object-cover\"\n widths={[320, 480, 640]}\n sizes=\"(min-width: 1024px) 25vw, (min-width: 640px) 50vw, 100vw\"\n />\n <div class=\"flex flex-1 flex-col gap-2 px-5 pb-5\">\n {service.label && (\n <span class=\"text-primary text-xs font-medium\">\n {service.label}\n </span>\n )}\n <h3 class=\"text-base font-medium\">{service.title}</h3>\n <p class=\"text-muted-foreground text-sm leading-relaxed\">\n {service.description}\n </p>\n {service.href && (\n <span class=\"mt-auto pt-2\">\n <ArrowRightIcon class=\"text-muted-foreground size-4 transition-transform group-hover/service:translate-x-1\" />\n </span>\n )}\n </div>\n </Wrapper>\n )\n })\n }\n </div>\n </SectionContainer>\n</Section>\n",
|
|
16
18
|
"type": "registry:block"
|
|
17
19
|
},
|
|
18
20
|
{
|
|
@@ -22,5 +24,9 @@
|
|
|
22
24
|
"target": "src/assets/placeholder.webp"
|
|
23
25
|
}
|
|
24
26
|
],
|
|
27
|
+
"docs": "https://ui.full.dev/blocks/services/",
|
|
28
|
+
"categories": [
|
|
29
|
+
"services"
|
|
30
|
+
],
|
|
25
31
|
"type": "registry:block"
|
|
26
32
|
}
|
package/public/r/services-2.json
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
|
|
3
3
|
"name": "services-2",
|
|
4
|
+
"title": "Services 2",
|
|
5
|
+
"description": "Service section layouts for agencies, consultancies, and internal platform teams.",
|
|
4
6
|
"registryDependencies": [
|
|
5
7
|
"@fulldev/badge",
|
|
6
8
|
"@fulldev/button",
|
|
@@ -9,7 +11,7 @@
|
|
|
9
11
|
"files": [
|
|
10
12
|
{
|
|
11
13
|
"path": "src/components/blocks/services-2.astro",
|
|
12
|
-
"content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Badge } from \"@/components/ui/badge\"\nimport { Button } from \"@/components/ui/button\"\nimport {
|
|
14
|
+
"content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Badge } from \"@/components/ui/badge\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n Section,\n SectionContainer,\n SectionTitle,\n} from \"@/components/ui/section\"\nimport PlaceholderImage from \"@/assets/placeholder.webp\"\n\ntype Props = HTMLAttributes<\"section\"> & {\n badge?: string\n title: string\n description?: string\n buttons?: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n services: {\n image?: {\n src: ImageMetadata\n alt: string\n }\n label?: string\n title: string\n description: string\n button?: {\n label: string\n href: string\n }\n }[]\n}\n\nconst {\n class: className,\n badge,\n title,\n description,\n buttons,\n services,\n ...props\n} = Astro.props\n---\n\n<Section class={cn(\"\", className)} {...props}>\n <SectionContainer class=\"gap-12\">\n <div class=\"mx-auto max-w-2xl text-center\">\n {badge && <Badge variant=\"secondary\">{badge}</Badge>}\n <SectionTitle class=\"mt-4\">\n {title}\n </SectionTitle>\n {\n description && (\n <p class=\"text-muted-foreground mt-4 text-base leading-relaxed text-balance\">\n {description}\n </p>\n )\n }\n {\n buttons?.length && (\n <div class=\"mt-6 flex flex-wrap justify-center gap-3\">\n {buttons.map(({ href, label, ...button }) => (\n <Button as=\"a\" href={href} variant={button.variant}>\n {label}\n </Button>\n ))}\n </div>\n )\n }\n </div>\n <div class=\"grid gap-6 lg:gap-8\">\n {\n services.map((service) => (\n <div class=\"group/service grid items-center gap-6 rounded-xl border p-4 shadow-xs transition-shadow hover:shadow-md md:grid-cols-[16rem_minmax(0,1fr)] md:p-0\">\n <Image\n src={service.image?.src ?? PlaceholderImage}\n alt={service.image?.alt ?? service.title}\n class=\"aspect-[4/3] w-full rounded-lg object-cover md:aspect-auto md:h-full md:rounded-l-xl md:rounded-r-none\"\n widths={[320, 480]}\n sizes=\"(min-width: 768px) 16rem, 100vw\"\n />\n <div class=\"flex flex-col gap-2 py-2 md:py-6 md:pr-6\">\n {service.label && (\n <span class=\"text-primary text-xs font-medium tracking-wider uppercase\">\n {service.label}\n </span>\n )}\n <h3 class=\"text-lg font-medium\">{service.title}</h3>\n <p class=\"text-muted-foreground text-sm leading-relaxed\">\n {service.description}\n </p>\n {service.button && (\n <Button\n as=\"a\"\n href={service.button.href}\n variant=\"secondary\"\n class=\"mt-1 w-fit\"\n >\n {service.button.label}\n </Button>\n )}\n </div>\n </div>\n ))\n }\n </div>\n </SectionContainer>\n</Section>\n",
|
|
13
15
|
"type": "registry:block"
|
|
14
16
|
},
|
|
15
17
|
{
|
|
@@ -19,5 +21,9 @@
|
|
|
19
21
|
"target": "src/assets/placeholder.webp"
|
|
20
22
|
}
|
|
21
23
|
],
|
|
24
|
+
"docs": "https://ui.full.dev/blocks/services/",
|
|
25
|
+
"categories": [
|
|
26
|
+
"services"
|
|
27
|
+
],
|
|
22
28
|
"type": "registry:block"
|
|
23
29
|
}
|
package/public/r/services-3.json
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
|
|
3
3
|
"name": "services-3",
|
|
4
|
+
"title": "Services 3",
|
|
5
|
+
"description": "Service section layouts for agencies, consultancies, and internal platform teams.",
|
|
4
6
|
"registryDependencies": [
|
|
5
7
|
"@fulldev/badge",
|
|
6
8
|
"@fulldev/button",
|
|
@@ -9,7 +11,7 @@
|
|
|
9
11
|
"files": [
|
|
10
12
|
{
|
|
11
13
|
"path": "src/components/blocks/services-3.astro",
|
|
12
|
-
"content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Badge } from \"@/components/ui/badge\"\nimport { Button } from \"@/components/ui/button\"\nimport {
|
|
14
|
+
"content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Badge } from \"@/components/ui/badge\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n Section,\n SectionContainer,\n SectionTitle,\n} from \"@/components/ui/section\"\nimport PlaceholderImage from \"@/assets/placeholder.webp\"\n\ntype Props = HTMLAttributes<\"section\"> & {\n badge?: string\n title: string\n description?: string\n buttons?: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n services: {\n image?: {\n src: ImageMetadata\n alt: string\n }\n title: string\n description: string\n button?: {\n label: string\n href: string\n }\n }[]\n}\n\nconst {\n class: className,\n badge,\n title,\n description,\n buttons,\n services,\n ...props\n} = Astro.props\n---\n\n<Section class={cn(\"\", className)} {...props}>\n <SectionContainer class=\"gap-8\">\n <div class=\"mx-auto max-w-2xl text-center\">\n {badge && <Badge variant=\"secondary\">{badge}</Badge>}\n <SectionTitle class=\"mt-4\">\n {title}\n </SectionTitle>\n {\n description && (\n <p class=\"text-muted-foreground mt-4 text-base leading-relaxed text-balance\">\n {description}\n </p>\n )\n }\n {\n buttons?.length && (\n <div class=\"mt-6 flex flex-wrap justify-center gap-3\">\n {buttons.map(({ href, label, ...button }) => (\n <Button as=\"a\" href={href} variant={button.variant}>\n {label}\n </Button>\n ))}\n </div>\n )\n }\n </div>\n <div class=\"grid gap-6 sm:grid-cols-2\">\n {\n services.map((service) => (\n <div class=\"group/service relative isolate flex aspect-[4/3] flex-col justify-end overflow-hidden rounded-xl\">\n <Image\n src={service.image?.src ?? PlaceholderImage}\n alt={service.image?.alt ?? service.title}\n class=\"absolute inset-0 -z-10 size-full object-cover transition-transform duration-500 group-hover/service:scale-105\"\n widths={[480, 640, 960]}\n sizes=\"(min-width: 640px) 50vw, 100vw\"\n />\n <div class=\"absolute inset-0 -z-10 bg-gradient-to-t from-black/80 via-black/40 to-transparent\" />\n <div class=\"flex flex-col gap-2 p-6 text-white\">\n <h3 class=\"text-xl font-semibold\">{service.title}</h3>\n <p class=\"text-sm leading-relaxed text-white/80\">\n {service.description}\n </p>\n {service.button && (\n <Button\n as=\"a\"\n href={service.button.href}\n variant=\"secondary\"\n class=\"mt-2 w-fit\"\n >\n {service.button.label}\n </Button>\n )}\n </div>\n </div>\n ))\n }\n </div>\n </SectionContainer>\n</Section>\n",
|
|
13
15
|
"type": "registry:block"
|
|
14
16
|
},
|
|
15
17
|
{
|
|
@@ -19,5 +21,9 @@
|
|
|
19
21
|
"target": "src/assets/placeholder.webp"
|
|
20
22
|
}
|
|
21
23
|
],
|
|
24
|
+
"docs": "https://ui.full.dev/blocks/services/",
|
|
25
|
+
"categories": [
|
|
26
|
+
"services"
|
|
27
|
+
],
|
|
22
28
|
"type": "registry:block"
|
|
23
29
|
}
|
package/public/r/services-4.json
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
|
|
3
3
|
"name": "services-4",
|
|
4
|
+
"title": "Services 4",
|
|
5
|
+
"description": "Service section layouts for agencies, consultancies, and internal platform teams.",
|
|
4
6
|
"dependencies": [
|
|
5
7
|
"@lucide/astro"
|
|
6
8
|
],
|
|
@@ -11,7 +13,7 @@
|
|
|
11
13
|
"files": [
|
|
12
14
|
{
|
|
13
15
|
"path": "src/components/blocks/services-4.astro",
|
|
14
|
-
"content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\nimport ArrowRightIcon from \"@lucide/astro/icons/arrow-right\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport { Section
|
|
16
|
+
"content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\nimport type { HTMLAttributes } from \"astro/types\"\nimport ArrowRightIcon from \"@lucide/astro/icons/arrow-right\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport { Icon } from \"@/components/ui/icon\"\nimport {\n Section,\n SectionContainer,\n SectionTitle,\n} from \"@/components/ui/section\"\nimport PlaceholderImage from \"@/assets/placeholder.webp\"\n\ntype Props = HTMLAttributes<\"section\"> & {\n title: string\n description?: string\n buttons?: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n services: {\n image?: {\n src: ImageMetadata\n alt: string\n }\n title: string\n description: string\n href?: string\n }[]\n}\n\nconst {\n class: className,\n title,\n description,\n buttons,\n services,\n ...props\n} = Astro.props\n---\n\n<Section class={cn(\"\", className)} {...props}>\n <SectionContainer class=\"gap-8\">\n <div\n class=\"flex flex-col gap-4 md:flex-row md:items-end md:justify-between\"\n >\n <div class=\"max-w-2xl\">\n <SectionTitle>\n {title}\n </SectionTitle>\n {\n description && (\n <p class=\"text-muted-foreground mt-4 text-base leading-relaxed text-balance\">\n {description}\n </p>\n )\n }\n </div>\n {\n buttons?.length && (\n <div class=\"flex flex-wrap gap-3\">\n {buttons.map(({ href, label, ...button }) => (\n <Button as=\"a\" href={href} variant={button.variant}>\n {label}\n </Button>\n ))}\n </div>\n )\n }\n </div>\n <div class=\"grid gap-6 sm:grid-cols-2 lg:grid-cols-4\">\n {\n services.map((service) => (\n <article class=\"group/service flex flex-col gap-4\">\n <Image\n src={service.image?.src ?? PlaceholderImage}\n alt={service.image?.alt ?? service.title}\n class=\"aspect-[16/10] w-full rounded-lg object-cover\"\n widths={[320, 480, 640]}\n sizes=\"(min-width: 1024px) 25vw, (min-width: 640px) 50vw, 100vw\"\n />\n <div class=\"flex flex-1 flex-col gap-1\">\n <h3 class=\"text-base font-medium\">{service.title}</h3>\n <p class=\"text-muted-foreground text-sm leading-relaxed\">\n {service.description}\n </p>\n </div>\n {service.href && (\n <a\n href={service.href}\n class=\"text-primary inline-flex items-center gap-1.5 text-sm font-medium\"\n >\n Learn more\n <ArrowRightIcon class=\"size-3.5 transition-transform group-hover/service:translate-x-1\" />\n </a>\n )}\n </article>\n ))\n }\n </div>\n </SectionContainer>\n</Section>\n",
|
|
15
17
|
"type": "registry:block"
|
|
16
18
|
},
|
|
17
19
|
{
|
|
@@ -21,5 +23,9 @@
|
|
|
21
23
|
"target": "src/assets/placeholder.webp"
|
|
22
24
|
}
|
|
23
25
|
],
|
|
26
|
+
"docs": "https://ui.full.dev/blocks/services/",
|
|
27
|
+
"categories": [
|
|
28
|
+
"services"
|
|
29
|
+
],
|
|
24
30
|
"type": "registry:block"
|
|
25
31
|
}
|
package/public/r/services-5.json
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
|
|
3
3
|
"name": "services-5",
|
|
4
|
+
"title": "Services 5",
|
|
5
|
+
"description": "Service section layouts for agencies, consultancies, and internal platform teams.",
|
|
4
6
|
"dependencies": [
|
|
5
7
|
"@lucide/astro"
|
|
6
8
|
],
|
|
@@ -12,9 +14,13 @@
|
|
|
12
14
|
"files": [
|
|
13
15
|
{
|
|
14
16
|
"path": "src/components/blocks/services-5.astro",
|
|
15
|
-
"content": "---\nimport ArrowRightIcon from \"@lucide/astro/icons/arrow-right\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Badge } from \"@/components/ui/badge\"\nimport { Button } from \"@/components/ui/button\"\nimport { Icon } from \"@/components/ui/icon\"\nimport {
|
|
17
|
+
"content": "---\nimport type { HTMLAttributes } from \"astro/types\"\nimport ArrowRightIcon from \"@lucide/astro/icons/arrow-right\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Badge } from \"@/components/ui/badge\"\nimport { Button } from \"@/components/ui/button\"\nimport { Icon } from \"@/components/ui/icon\"\nimport {\n Section,\n SectionContainer,\n SectionTitle,\n} from \"@/components/ui/section\"\n\ntype Props = HTMLAttributes<\"section\"> & {\n badge?: string\n title: string\n description?: string\n buttons?: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n services: {\n icon?: string\n title: string\n description: string\n href?: string\n }[]\n}\n\nconst {\n class: className,\n badge,\n title,\n description,\n buttons,\n services,\n ...props\n} = Astro.props\n---\n\n<Section class={cn(\"\", className)} {...props}>\n <SectionContainer class=\"gap-12\">\n <div class=\"mx-auto max-w-2xl text-center\">\n {badge && <Badge variant=\"secondary\">{badge}</Badge>}\n <SectionTitle class=\"mt-4\">\n {title}\n </SectionTitle>\n {\n description && (\n <p class=\"text-muted-foreground mt-4 text-base leading-relaxed text-balance\">\n {description}\n </p>\n )\n }\n {\n buttons?.length && (\n <div class=\"mt-6 flex flex-wrap justify-center gap-3\">\n {buttons.map(({ href, label, ...button }) => (\n <Button as=\"a\" href={href} variant={button.variant}>\n {label}\n </Button>\n ))}\n </div>\n )\n }\n </div>\n <div\n class=\"ring-foreground/10 bg-border grid gap-px overflow-hidden rounded-xl ring-1 ring-inset sm:grid-cols-2 lg:grid-cols-4\"\n >\n {\n services.map((service) => (\n <div class=\"bg-background group/service hover:bg-accent/30 relative flex flex-col gap-4 p-7 transition-colors\">\n <div class=\"bg-primary/10 text-primary ring-primary/15 flex size-10 items-center justify-center rounded-lg ring-1 transition-transform ring-inset group-hover/service:scale-105\">\n <Icon name={service.icon ?? \"layout-grid\"} class=\"size-5\" />\n </div>\n <h3 class=\"text-base font-medium tracking-tight\">\n {service.title}\n </h3>\n <p class=\"text-muted-foreground text-sm leading-relaxed\">\n {service.description}\n </p>\n {service.href && (\n <a\n href={service.href}\n class=\"text-primary mt-auto inline-flex items-center gap-1.5 text-sm font-medium\"\n >\n Learn more\n <ArrowRightIcon class=\"size-3.5 transition-transform group-hover/service:translate-x-1\" />\n </a>\n )}\n </div>\n ))\n }\n </div>\n </SectionContainer>\n</Section>\n",
|
|
16
18
|
"type": "registry:block"
|
|
17
19
|
}
|
|
18
20
|
],
|
|
21
|
+
"docs": "https://ui.full.dev/blocks/services/",
|
|
22
|
+
"categories": [
|
|
23
|
+
"services"
|
|
24
|
+
],
|
|
19
25
|
"type": "registry:block"
|
|
20
26
|
}
|
package/public/r/services-6.json
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
|
|
3
3
|
"name": "services-6",
|
|
4
|
+
"title": "Services 6",
|
|
5
|
+
"description": "Service section layouts for agencies, consultancies, and internal platform teams.",
|
|
4
6
|
"dependencies": [
|
|
5
7
|
"@lucide/astro"
|
|
6
8
|
],
|
|
@@ -12,7 +14,7 @@
|
|
|
12
14
|
"files": [
|
|
13
15
|
{
|
|
14
16
|
"path": "src/components/blocks/services-6.astro",
|
|
15
|
-
"content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\nimport ArrowRightIcon from \"@lucide/astro/icons/arrow-right\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Badge } from \"@/components/ui/badge\"\nimport { Button } from \"@/components/ui/button\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\nimport PlaceholderImage from \"@/assets/placeholder.webp\"\n\ntype Props =
|
|
17
|
+
"content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\nimport type { HTMLAttributes } from \"astro/types\"\nimport ArrowRightIcon from \"@lucide/astro/icons/arrow-right\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Badge } from \"@/components/ui/badge\"\nimport { Button } from \"@/components/ui/button\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\nimport PlaceholderImage from \"@/assets/placeholder.webp\"\n\ntype Props = HTMLAttributes<\"section\"> & {\n badge?: string\n title: string\n description?: string\n buttons?: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n services: {\n image?: {\n src: ImageMetadata\n alt: string\n }\n title: string\n description: string\n href?: string\n }[]\n}\n\nconst {\n class: className,\n badge,\n title,\n description,\n buttons,\n services,\n ...props\n} = Astro.props\n---\n\n<Section class={cn(\"\", className)} {...props}>\n <SectionContainer\n class=\"grid gap-8 lg:grid-cols-[20rem_minmax(0,1fr)] lg:items-start\"\n >\n <div class=\"lg:sticky lg:top-28\">\n {badge && <Badge variant=\"secondary\">{badge}</Badge>}\n <h2 class=\"mt-4 text-3xl font-semibold tracking-tight text-balance\">\n {title}\n </h2>\n {\n description && (\n <p class=\"text-muted-foreground mt-4 text-sm leading-relaxed\">\n {description}\n </p>\n )\n }\n {\n buttons?.length && (\n <div class=\"mt-6 flex flex-wrap gap-3\">\n {buttons.map(({ href, label, ...button }) => (\n <Button as=\"a\" href={href} variant={button.variant}>\n {label}\n </Button>\n ))}\n </div>\n )\n }\n </div>\n <div class=\"grid gap-6 sm:grid-cols-2\">\n {\n services.map((service) => (\n <div class=\"group/service relative isolate flex aspect-square flex-col justify-end overflow-hidden rounded-xl bg-black\">\n <Image\n src={service.image?.src ?? PlaceholderImage}\n alt={service.image?.alt ?? service.title}\n class=\"absolute inset-0 -z-10 size-full object-cover opacity-60 transition-transform duration-500 group-hover/service:scale-105\"\n widths={[320, 480, 640]}\n sizes=\"(min-width: 1024px) 30vw, (min-width: 640px) 50vw, 100vw\"\n />\n <div class=\"absolute inset-0 -z-10 bg-gradient-to-t from-black/70 to-transparent\" />\n <div class=\"flex items-end justify-between gap-4 p-5 text-white\">\n <div class=\"flex flex-col gap-1\">\n <h3 class=\"text-lg font-semibold\">{service.title}</h3>\n <p class=\"text-sm leading-relaxed text-white/75\">\n {service.description}\n </p>\n </div>\n {service.href && (\n <a\n href={service.href}\n class=\"shrink-0 rounded-full bg-white/15 p-2 backdrop-blur-sm transition-colors hover:bg-white/25\"\n >\n <ArrowRightIcon class=\"size-4 text-white\" />\n </a>\n )}\n </div>\n </div>\n ))\n }\n </div>\n </SectionContainer>\n</Section>\n",
|
|
16
18
|
"type": "registry:block"
|
|
17
19
|
},
|
|
18
20
|
{
|
|
@@ -22,5 +24,9 @@
|
|
|
22
24
|
"target": "src/assets/placeholder.webp"
|
|
23
25
|
}
|
|
24
26
|
],
|
|
27
|
+
"docs": "https://ui.full.dev/blocks/services/",
|
|
28
|
+
"categories": [
|
|
29
|
+
"services"
|
|
30
|
+
],
|
|
25
31
|
"type": "registry:block"
|
|
26
32
|
}
|
package/public/r/services-7.json
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
|
|
3
3
|
"name": "services-7",
|
|
4
|
+
"title": "Services 7",
|
|
5
|
+
"description": "Service section layouts for agencies, consultancies, and internal platform teams.",
|
|
4
6
|
"dependencies": [
|
|
5
7
|
"@lucide/astro"
|
|
6
8
|
],
|
|
@@ -12,7 +14,7 @@
|
|
|
12
14
|
"files": [
|
|
13
15
|
{
|
|
14
16
|
"path": "src/components/blocks/services-7.astro",
|
|
15
|
-
"content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\nimport ArrowRightIcon from \"@lucide/astro/icons/arrow-right\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Badge } from \"@/components/ui/badge\"\nimport { Button } from \"@/components/ui/button\"\nimport { Section
|
|
17
|
+
"content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\nimport type { HTMLAttributes } from \"astro/types\"\nimport ArrowRightIcon from \"@lucide/astro/icons/arrow-right\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Badge } from \"@/components/ui/badge\"\nimport { Button } from \"@/components/ui/button\"\nimport { Icon } from \"@/components/ui/icon\"\nimport {\n Section,\n SectionContainer,\n SectionTitle,\n} from \"@/components/ui/section\"\nimport PlaceholderImage from \"@/assets/placeholder.webp\"\n\ntype Props = HTMLAttributes<\"section\"> & {\n badge?: string\n title: string\n description?: string\n buttons?: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n services: {\n image?: {\n src: ImageMetadata\n alt: string\n }\n label?: string\n title: string\n description: string\n href?: string\n }[]\n}\n\nconst {\n class: className,\n badge,\n title,\n description,\n buttons,\n services,\n ...props\n} = Astro.props\n---\n\n<Section class={cn(\"\", className)} {...props}>\n <SectionContainer class=\"gap-8\">\n <div\n class=\"flex flex-col gap-4 md:flex-row md:items-end md:justify-between\"\n >\n <div class=\"max-w-2xl\">\n {badge && <Badge variant=\"secondary\">{badge}</Badge>}\n <SectionTitle class=\"mt-4\">\n {title}\n </SectionTitle>\n {\n description && (\n <p class=\"text-muted-foreground mt-4 text-base leading-relaxed text-balance\">\n {description}\n </p>\n )\n }\n </div>\n {\n buttons?.length && (\n <div class=\"flex flex-wrap gap-3\">\n {buttons.map(({ href, label, ...button }) => (\n <Button as=\"a\" href={href} variant={button.variant}>\n {label}\n </Button>\n ))}\n </div>\n )\n }\n </div>\n <div class=\"grid gap-6 lg:grid-cols-3\">\n {\n services.map((service, index) => (\n <a\n href={service.href ?? \"#\"}\n class={cn(\n \"group/service flex flex-col overflow-hidden rounded-xl border shadow-xs transition-shadow hover:shadow-md\",\n index === 0 && \"lg:col-span-2 lg:row-span-2\"\n )}\n >\n <Image\n src={service.image?.src ?? PlaceholderImage}\n alt={service.image?.alt ?? service.title}\n class={cn(\n \"w-full object-cover\",\n index === 0 ? \"aspect-[16/9]\" : \"aspect-[16/10]\"\n )}\n widths={[320, 480, 640, 960]}\n sizes={\n index === 0\n ? \"(min-width: 1024px) 66vw, 100vw\"\n : \"(min-width: 1024px) 33vw, 100vw\"\n }\n />\n <div class=\"flex flex-1 flex-col gap-2 p-5\">\n {service.label && (\n <Badge variant=\"secondary\" class=\"w-fit\">\n {service.label}\n </Badge>\n )}\n <h3\n class={cn(\"font-medium\", index === 0 ? \"text-xl\" : \"text-base\")}\n >\n {service.title}\n </h3>\n <p class=\"text-muted-foreground text-sm leading-relaxed\">\n {service.description}\n </p>\n <div\n class={cn(\n \"text-primary flex items-center gap-1.5 pt-2 text-sm font-medium\",\n index !== 0 && \"mt-auto\"\n )}\n >\n Learn more\n <ArrowRightIcon class=\"size-3.5 transition-transform group-hover/service:translate-x-1\" />\n </div>\n </div>\n </a>\n ))\n }\n </div>\n </SectionContainer>\n</Section>\n",
|
|
16
18
|
"type": "registry:block"
|
|
17
19
|
},
|
|
18
20
|
{
|
|
@@ -22,5 +24,9 @@
|
|
|
22
24
|
"target": "src/assets/placeholder.webp"
|
|
23
25
|
}
|
|
24
26
|
],
|
|
27
|
+
"docs": "https://ui.full.dev/blocks/services/",
|
|
28
|
+
"categories": [
|
|
29
|
+
"services"
|
|
30
|
+
],
|
|
25
31
|
"type": "registry:block"
|
|
26
32
|
}
|