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,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "header-4",
4
+ "title": "Header 4",
5
+ "description": "Header layouts for brand, navigation, and high-level page actions.",
4
6
  "registryDependencies": [
5
7
  "@fulldev/button",
6
8
  "@fulldev/header",
@@ -12,9 +14,13 @@
12
14
  "files": [
13
15
  {
14
16
  "path": "src/components/blocks/header-4.astro",
15
- "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport { Header, HeaderContainer, HeaderGroup } from \"@/components/ui/header\"\nimport { Icon } from \"@/components/ui/icon\"\nimport { Logo, LogoImage, LogoText } from \"@/components/ui/logo\"\nimport {\n NavigationMenu,\n NavigationMenuContent,\n NavigationMenuItem,\n NavigationMenuLink,\n NavigationMenuList,\n NavigationMenuTrigger,\n navigationMenuTriggerStyle,\n} from \"@/components/ui/navigation-menu\"\nimport {\n Sheet,\n SheetClose,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n SheetTrigger,\n} from \"@/components/ui/sheet\"\n\ntype Props = {\n class?: string\n logo: {\n label: string\n href: string\n src?: any\n srcLight?: any\n srcDark?: any\n alt?: string\n }\n navigation: {\n label: string\n href: string\n description?: string\n active?: boolean\n image?: {\n src: ImageMetadata\n alt: string\n }\n links?: {\n label: string\n href: string\n description?: string\n icon?: string\n active?: boolean\n }[]\n }[]\n buttons: {\n label: string\n href: string\n icon?: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n}\n\nconst { class: className, logo, navigation, buttons } = Astro.props\n---\n\n<Header class={cn(\"border-b\", className)}>\n <HeaderContainer class=\"justify-between\">\n <HeaderGroup>\n <Logo href={logo.href}>\n <LogoImage\n src={logo.src}\n srcLight={logo.srcLight}\n srcDark={logo.srcDark}\n alt={logo.alt}\n />\n {logo.label && <LogoText>{logo.label}</LogoText>}\n </Logo>\n </HeaderGroup>\n <NavigationMenu\n class=\"absolute left-1/2 hidden max-w-none -translate-x-1/2 lg:flex\"\n align=\"center\"\n >\n <NavigationMenuList>\n {\n navigation.map((item, index) =>\n item.links?.length ? (\n <NavigationMenuItem value={`nav-${index}`}>\n <NavigationMenuTrigger>{item.label}</NavigationMenuTrigger>\n <NavigationMenuContent>\n <div class=\"grid w-[min(46rem,calc(100vw-2rem))] gap-2 p-1 lg:grid-cols-[1fr_1.1fr]\">\n <NavigationMenuLink\n href={item.href}\n active={item.active}\n class=\"bg-muted/50 hover:bg-muted focus:bg-muted flex min-h-40 flex-col items-start justify-end gap-3 p-4 text-left\"\n >\n {item.image && (\n <Image\n src={item.image.src}\n alt={item.image.alt}\n class=\"mb-auto aspect-[16/9] w-full rounded-md object-cover\"\n widths={[320, 480, 640]}\n sizes=\"(min-width: 1024px) 22rem, 100vw\"\n />\n )}\n <span class=\"text-base font-medium\">{item.label}</span>\n {item.description && (\n <span class=\"text-muted-foreground text-sm leading-relaxed\">\n {item.description}\n </span>\n )}\n </NavigationMenuLink>\n <div class=\"grid gap-1\">\n {item.links.map((link) => (\n <NavigationMenuLink\n href={link.href}\n active={link.active}\n class=\"items-start gap-3 p-3\"\n >\n {link.icon && (\n <Icon\n name={link.icon}\n class=\"text-muted-foreground mt-0.5\"\n />\n )}\n <span class=\"grid gap-1\">\n <span class=\"font-medium\">{link.label}</span>\n {link.description && (\n <span class=\"text-muted-foreground text-sm leading-relaxed\">\n {link.description}\n </span>\n )}\n </span>\n </NavigationMenuLink>\n ))}\n </div>\n </div>\n </NavigationMenuContent>\n </NavigationMenuItem>\n ) : (\n <NavigationMenuItem value={`nav-${index}`}>\n <NavigationMenuLink\n href={item.href}\n active={item.active}\n class={navigationMenuTriggerStyle()}\n >\n {item.label}\n </NavigationMenuLink>\n </NavigationMenuItem>\n )\n )\n }\n </NavigationMenuList>\n </NavigationMenu>\n <HeaderGroup class=\"ml-auto hidden justify-end lg:flex\">\n <slot />\n {\n buttons.map(({ label, icon, ...button }) => (\n <Button\n as=\"a\"\n size={icon && !label ? \"icon-sm\" : \"sm\"}\n aria-label={label}\n target={button.href.startsWith(\"http\") ? \"_blank\" : undefined}\n rel={button.href.startsWith(\"http\") ? \"noreferrer\" : undefined}\n {...button}\n >\n {icon && <Icon name={icon} />}\n {label}\n </Button>\n ))\n }\n </HeaderGroup>\n <Sheet class=\"lg:hidden\">\n <SheetTrigger\n variant=\"ghost\"\n size=\"icon-sm\"\n class=\"ml-auto\"\n aria-label=\"Open menu\"\n >\n <Icon name=\"menu\" />\n </SheetTrigger>\n <SheetContent side=\"right\" class=\"p-0\">\n <SheetHeader class=\"sr-only\">\n <SheetTitle>Menu</SheetTitle>\n <SheetDescription>Site navigation and actions.</SheetDescription>\n </SheetHeader>\n <div class=\"flex h-full flex-col gap-6 overflow-y-auto px-4 py-12\">\n <nav aria-label=\"Main navigation\" class=\"flex flex-col gap-4\">\n {\n navigation.map((item) => (\n <div class=\"grid gap-1\">\n <SheetClose variant=\"ghost\" class=\"justify-start font-medium\">\n {item.label}\n </SheetClose>\n {item.links?.length && (\n <div class=\"border-border ml-3 grid gap-1 border-l pl-3\">\n {item.links.map((link) => (\n <SheetClose\n variant=\"ghost\"\n class=\"text-muted-foreground justify-start\"\n >\n {link.icon && <Icon name={link.icon} />}\n {link.label}\n </SheetClose>\n ))}\n </div>\n )}\n </div>\n ))\n }\n </nav>\n <div class=\"mt-auto flex flex-col gap-2\">\n <slot />\n </div>\n </div>\n </SheetContent>\n </Sheet>\n </HeaderContainer>\n</Header>\n",
17
+ "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport { Header, HeaderContainer, HeaderGroup } from \"@/components/ui/header\"\nimport { Icon } from \"@/components/ui/icon\"\nimport { Logo, LogoImage, LogoText } from \"@/components/ui/logo\"\nimport {\n NavigationMenu,\n NavigationMenuContent,\n NavigationMenuItem,\n NavigationMenuLink,\n NavigationMenuList,\n NavigationMenuTrigger,\n navigationMenuTriggerStyle,\n} from \"@/components/ui/navigation-menu\"\nimport {\n Sheet,\n SheetClose,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n SheetTrigger,\n} from \"@/components/ui/sheet\"\n\ntype Props = HTMLAttributes<\"header\"> & {\n logo: {\n label: string\n href: string\n src?: any\n srcLight?: any\n srcDark?: any\n alt?: string\n }\n navigation: {\n label: string\n href: string\n description?: string\n active?: boolean\n image?: {\n src: ImageMetadata\n alt: string\n }\n links?: {\n label: string\n href: string\n description?: string\n icon?: string\n active?: boolean\n }[]\n }[]\n buttons: {\n label: string\n href: string\n icon?: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n}\n\nconst { class: className, logo, navigation, buttons, ...props } = Astro.props\n---\n\n<Header class={cn(\"border-b\", className)} {...props}>\n <HeaderContainer class=\"justify-between\">\n <HeaderGroup>\n <Logo href={logo.href}>\n <LogoImage\n src={logo.src}\n srcLight={logo.srcLight}\n srcDark={logo.srcDark}\n alt={logo.alt}\n />\n {logo.label && <LogoText>{logo.label}</LogoText>}\n </Logo>\n </HeaderGroup>\n <NavigationMenu\n class=\"absolute left-1/2 hidden max-w-none -translate-x-1/2 lg:flex\"\n align=\"center\"\n >\n <NavigationMenuList>\n {\n navigation.map((item, index) =>\n item.links?.length ? (\n <NavigationMenuItem value={`nav-${index}`}>\n <NavigationMenuTrigger>{item.label}</NavigationMenuTrigger>\n <NavigationMenuContent>\n <div class=\"grid w-[min(46rem,calc(100vw-2rem))] gap-2 p-1 lg:grid-cols-[1fr_1.1fr]\">\n <NavigationMenuLink\n href={item.href}\n active={item.active}\n class=\"bg-muted/50 hover:bg-muted focus:bg-muted flex min-h-40 flex-col items-start justify-end gap-3 p-4 text-left\"\n >\n {item.image && (\n <Image\n src={item.image.src}\n alt={item.image.alt}\n class=\"mb-auto aspect-[16/9] w-full rounded-md object-cover\"\n widths={[320, 480, 640]}\n sizes=\"(min-width: 1024px) 22rem, 100vw\"\n />\n )}\n <span class=\"text-base font-medium\">{item.label}</span>\n {item.description && (\n <span class=\"text-muted-foreground text-sm leading-relaxed\">\n {item.description}\n </span>\n )}\n </NavigationMenuLink>\n <div class=\"grid gap-1\">\n {item.links.map((link) => (\n <NavigationMenuLink\n href={link.href}\n active={link.active}\n class=\"items-start gap-3 p-3\"\n >\n {link.icon && (\n <Icon\n name={link.icon}\n class=\"text-muted-foreground mt-0.5\"\n />\n )}\n <span class=\"grid gap-1\">\n <span class=\"font-medium\">{link.label}</span>\n {link.description && (\n <span class=\"text-muted-foreground text-sm leading-relaxed\">\n {link.description}\n </span>\n )}\n </span>\n </NavigationMenuLink>\n ))}\n </div>\n </div>\n </NavigationMenuContent>\n </NavigationMenuItem>\n ) : (\n <NavigationMenuItem value={`nav-${index}`}>\n <NavigationMenuLink\n href={item.href}\n active={item.active}\n class={navigationMenuTriggerStyle()}\n >\n {item.label}\n </NavigationMenuLink>\n </NavigationMenuItem>\n )\n )\n }\n </NavigationMenuList>\n </NavigationMenu>\n <HeaderGroup class=\"ml-auto hidden justify-end lg:flex\">\n <slot />\n {\n buttons.map(({ label, icon, ...button }) => (\n <Button\n as=\"a\"\n size={icon && !label ? \"icon-sm\" : \"sm\"}\n aria-label={label}\n target={button.href.startsWith(\"http\") ? \"_blank\" : undefined}\n rel={button.href.startsWith(\"http\") ? \"noreferrer\" : undefined}\n {...button}\n >\n {icon && <Icon name={icon} />}\n {label}\n </Button>\n ))\n }\n </HeaderGroup>\n <Sheet class=\"lg:hidden\">\n <SheetTrigger\n variant=\"ghost\"\n size=\"icon-sm\"\n class=\"ml-auto\"\n aria-label=\"Open menu\"\n >\n <Icon name=\"menu\" />\n </SheetTrigger>\n <SheetContent side=\"right\" class=\"p-0\">\n <SheetHeader class=\"sr-only\">\n <SheetTitle>Menu</SheetTitle>\n <SheetDescription>Site navigation and actions.</SheetDescription>\n </SheetHeader>\n <div class=\"flex h-full flex-col gap-6 overflow-y-auto px-4 py-12\">\n <nav aria-label=\"Main navigation\" class=\"flex flex-col gap-4\">\n {\n navigation.map((item) => (\n <div class=\"grid gap-1\">\n <SheetClose\n as=\"a\"\n href={item.href}\n variant=\"ghost\"\n class=\"justify-start font-medium\"\n >\n {item.label}\n </SheetClose>\n {item.links?.length && (\n <div class=\"border-border ml-3 grid gap-1 border-l pl-3\">\n {item.links.map((link) => (\n <SheetClose\n as=\"a\"\n href={link.href}\n variant=\"ghost\"\n class=\"text-muted-foreground justify-start\"\n >\n {link.icon && <Icon name={link.icon} />}\n {link.label}\n </SheetClose>\n ))}\n </div>\n )}\n </div>\n ))\n }\n </nav>\n <div class=\"mt-auto flex flex-col gap-2\">\n <slot name=\"mobile\" />\n </div>\n </div>\n </SheetContent>\n </Sheet>\n </HeaderContainer>\n</Header>\n",
16
18
  "type": "registry:block"
17
19
  }
18
20
  ],
21
+ "docs": "https://ui.full.dev/blocks/header/",
22
+ "categories": [
23
+ "header"
24
+ ],
19
25
  "type": "registry:block"
20
26
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "header-5",
4
+ "title": "Header 5",
5
+ "description": "Header layouts for brand, navigation, and high-level page actions.",
4
6
  "registryDependencies": [
5
7
  "@fulldev/button",
6
8
  "@fulldev/header",
@@ -13,9 +15,13 @@
13
15
  "files": [
14
16
  {
15
17
  "path": "src/components/blocks/header-5.astro",
16
- "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport { Header, HeaderContainer, HeaderGroup } from \"@/components/ui/header\"\nimport { Icon } from \"@/components/ui/icon\"\nimport { Logo, LogoImage, LogoText } from \"@/components/ui/logo\"\nimport {\n NavigationMenu,\n NavigationMenuContent,\n NavigationMenuItem,\n NavigationMenuLink,\n NavigationMenuList,\n NavigationMenuTrigger,\n navigationMenuTriggerStyle,\n} from \"@/components/ui/navigation-menu\"\nimport { Separator } from \"@/components/ui/separator\"\nimport {\n Sheet,\n SheetClose,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n SheetTrigger,\n} from \"@/components/ui/sheet\"\n\ntype Props = {\n class?: string\n logo: {\n label: string\n href: string\n src?: any\n srcLight?: any\n srcDark?: any\n alt?: string\n }\n navigation: {\n label: string\n href: string\n description?: string\n active?: boolean\n image?: {\n src: ImageMetadata\n alt: string\n }\n links?: {\n label: string\n href: string\n description?: string\n icon?: string\n active?: boolean\n }[]\n }[]\n buttons: {\n label: string\n href: string\n icon?: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n}\n\nconst { class: className, logo, navigation, buttons } = Astro.props\n---\n\n<Header class={cn(\"flex-col items-stretch gap-0 border-b py-0\", className)}>\n <HeaderContainer class=\"min-h-14 justify-between\">\n <HeaderGroup>\n <Logo href={logo.href}>\n <LogoImage\n src={logo.src}\n srcLight={logo.srcLight}\n srcDark={logo.srcDark}\n alt={logo.alt}\n />\n {logo.label && <LogoText>{logo.label}</LogoText>}\n </Logo>\n </HeaderGroup>\n <HeaderGroup class=\"ml-auto hidden justify-end lg:flex\">\n <slot />\n {\n buttons.map(({ label, icon, ...button }) => (\n <Button\n as=\"a\"\n size={icon && !label ? \"icon-sm\" : \"sm\"}\n aria-label={label}\n target={button.href.startsWith(\"http\") ? \"_blank\" : undefined}\n rel={button.href.startsWith(\"http\") ? \"noreferrer\" : undefined}\n {...button}\n >\n {icon && <Icon name={icon} />}\n {label}\n </Button>\n ))\n }\n </HeaderGroup>\n <Sheet class=\"lg:hidden\">\n <SheetTrigger\n variant=\"ghost\"\n size=\"icon-sm\"\n class=\"ml-auto\"\n aria-label=\"Open menu\"\n >\n <Icon name=\"menu\" />\n </SheetTrigger>\n <SheetContent side=\"right\" class=\"p-0\">\n <SheetHeader class=\"sr-only\">\n <SheetTitle>Menu</SheetTitle>\n <SheetDescription>Site navigation and actions.</SheetDescription>\n </SheetHeader>\n <div class=\"flex h-full flex-col gap-6 overflow-y-auto px-4 py-12\">\n <nav aria-label=\"Main navigation\" class=\"flex flex-col gap-4\">\n {\n navigation.map((item) => (\n <div class=\"grid gap-1\">\n <SheetClose variant=\"ghost\" class=\"justify-start font-medium\">\n {item.label}\n </SheetClose>\n {item.links?.length && (\n <div class=\"border-border ml-3 grid gap-1 border-l pl-3\">\n {item.links.map((link) => (\n <SheetClose\n variant=\"ghost\"\n class=\"text-muted-foreground justify-start\"\n >\n {link.icon && <Icon name={link.icon} />}\n {link.label}\n </SheetClose>\n ))}\n </div>\n )}\n </div>\n ))\n }\n </nav>\n <Separator />\n <div class=\"mt-auto flex flex-col gap-2\">\n <slot />\n </div>\n </div>\n </SheetContent>\n </Sheet>\n </HeaderContainer>\n <Separator class=\"hidden lg:block\" />\n <HeaderContainer class=\"hidden min-h-11 lg:flex\">\n <NavigationMenu class=\"max-w-none justify-start\" align=\"start\">\n <NavigationMenuList class=\"justify-start\">\n {\n navigation.map((item, index) =>\n item.links?.length ? (\n <NavigationMenuItem value={`nav-${index}`}>\n <NavigationMenuTrigger>{item.label}</NavigationMenuTrigger>\n <NavigationMenuContent>\n <div class=\"grid w-[min(52rem,calc(100vw-2rem))] gap-2 p-2 lg:grid-cols-[1fr_1.2fr]\">\n <NavigationMenuLink\n href={item.href}\n active={item.active}\n class=\"bg-muted/50 hover:bg-muted focus:bg-muted items-start gap-3 p-3\"\n >\n {item.image && (\n <Image\n src={item.image.src}\n alt={item.image.alt}\n class=\"aspect-[16/9] w-full rounded-md object-cover\"\n widths={[320, 480, 640]}\n sizes=\"(min-width: 1024px) 22rem, 100vw\"\n />\n )}\n <span class=\"grid gap-1\">\n <span class=\"font-medium\">{item.label}</span>\n {item.description && (\n <span class=\"text-muted-foreground text-sm leading-relaxed\">\n {item.description}\n </span>\n )}\n </span>\n </NavigationMenuLink>\n <div class=\"grid gap-1 lg:grid-cols-2\">\n {item.links.map((link) => (\n <NavigationMenuLink\n href={link.href}\n active={link.active}\n class=\"items-start gap-3 p-3\"\n >\n {link.icon && (\n <Icon\n name={link.icon}\n class=\"text-muted-foreground mt-0.5\"\n />\n )}\n <span class=\"grid gap-1\">\n <span class=\"font-medium\">{link.label}</span>\n {link.description && (\n <span class=\"text-muted-foreground text-sm leading-relaxed\">\n {link.description}\n </span>\n )}\n </span>\n </NavigationMenuLink>\n ))}\n </div>\n </div>\n </NavigationMenuContent>\n </NavigationMenuItem>\n ) : (\n <NavigationMenuItem value={`nav-${index}`}>\n <NavigationMenuLink\n href={item.href}\n active={item.active}\n class={navigationMenuTriggerStyle()}\n >\n {item.label}\n </NavigationMenuLink>\n </NavigationMenuItem>\n )\n )\n }\n </NavigationMenuList>\n </NavigationMenu>\n </HeaderContainer>\n</Header>\n",
18
+ "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport { Header, HeaderContainer, HeaderGroup } from \"@/components/ui/header\"\nimport { Icon } from \"@/components/ui/icon\"\nimport { Logo, LogoImage, LogoText } from \"@/components/ui/logo\"\nimport {\n NavigationMenu,\n NavigationMenuContent,\n NavigationMenuItem,\n NavigationMenuLink,\n NavigationMenuList,\n NavigationMenuTrigger,\n navigationMenuTriggerStyle,\n} from \"@/components/ui/navigation-menu\"\nimport { Separator } from \"@/components/ui/separator\"\nimport {\n Sheet,\n SheetClose,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n SheetTrigger,\n} from \"@/components/ui/sheet\"\n\ntype Props = HTMLAttributes<\"header\"> & {\n logo: {\n label: string\n href: string\n src?: any\n srcLight?: any\n srcDark?: any\n alt?: string\n }\n navigation: {\n label: string\n href: string\n description?: string\n active?: boolean\n image?: {\n src: ImageMetadata\n alt: string\n }\n links?: {\n label: string\n href: string\n description?: string\n icon?: string\n active?: boolean\n }[]\n }[]\n buttons: {\n label: string\n href: string\n icon?: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n}\n\nconst { class: className, logo, navigation, buttons, ...props } = Astro.props\n---\n\n<Header\n class={cn(\"flex-col items-stretch gap-0 border-b py-0\", className)}\n {...props}\n>\n <HeaderContainer class=\"min-h-14 justify-between\">\n <HeaderGroup>\n <Logo href={logo.href}>\n <LogoImage\n src={logo.src}\n srcLight={logo.srcLight}\n srcDark={logo.srcDark}\n alt={logo.alt}\n />\n {logo.label && <LogoText>{logo.label}</LogoText>}\n </Logo>\n </HeaderGroup>\n <HeaderGroup class=\"ml-auto hidden justify-end lg:flex\">\n <slot />\n {\n buttons.map(({ label, icon, ...button }) => (\n <Button\n as=\"a\"\n size={icon && !label ? \"icon-sm\" : \"sm\"}\n aria-label={label}\n target={button.href.startsWith(\"http\") ? \"_blank\" : undefined}\n rel={button.href.startsWith(\"http\") ? \"noreferrer\" : undefined}\n {...button}\n >\n {icon && <Icon name={icon} />}\n {label}\n </Button>\n ))\n }\n </HeaderGroup>\n <Sheet class=\"lg:hidden\">\n <SheetTrigger\n variant=\"ghost\"\n size=\"icon-sm\"\n class=\"ml-auto\"\n aria-label=\"Open menu\"\n >\n <Icon name=\"menu\" />\n </SheetTrigger>\n <SheetContent side=\"right\" class=\"p-0\">\n <SheetHeader class=\"sr-only\">\n <SheetTitle>Menu</SheetTitle>\n <SheetDescription>Site navigation and actions.</SheetDescription>\n </SheetHeader>\n <div class=\"flex h-full flex-col gap-6 overflow-y-auto px-4 py-12\">\n <nav aria-label=\"Main navigation\" class=\"flex flex-col gap-4\">\n {\n navigation.map((item) => (\n <div class=\"grid gap-1\">\n <SheetClose\n as=\"a\"\n href={item.href}\n variant=\"ghost\"\n class=\"justify-start font-medium\"\n >\n {item.label}\n </SheetClose>\n {item.links?.length && (\n <div class=\"border-border ml-3 grid gap-1 border-l pl-3\">\n {item.links.map((link) => (\n <SheetClose\n as=\"a\"\n href={link.href}\n variant=\"ghost\"\n class=\"text-muted-foreground justify-start\"\n >\n {link.icon && <Icon name={link.icon} />}\n {link.label}\n </SheetClose>\n ))}\n </div>\n )}\n </div>\n ))\n }\n </nav>\n <Separator />\n <div class=\"mt-auto flex flex-col gap-2\">\n <slot name=\"mobile\" />\n </div>\n </div>\n </SheetContent>\n </Sheet>\n </HeaderContainer>\n <Separator class=\"hidden lg:block\" />\n <HeaderContainer class=\"hidden min-h-11 lg:flex\">\n <NavigationMenu class=\"max-w-none justify-start\" align=\"start\">\n <NavigationMenuList class=\"justify-start\">\n {\n navigation.map((item, index) =>\n item.links?.length ? (\n <NavigationMenuItem value={`nav-${index}`}>\n <NavigationMenuTrigger>{item.label}</NavigationMenuTrigger>\n <NavigationMenuContent>\n <div class=\"grid w-[min(52rem,calc(100vw-2rem))] gap-2 p-2 lg:grid-cols-[1fr_1.2fr]\">\n <NavigationMenuLink\n href={item.href}\n active={item.active}\n class=\"bg-muted/50 hover:bg-muted focus:bg-muted items-start gap-3 p-3\"\n >\n {item.image && (\n <Image\n src={item.image.src}\n alt={item.image.alt}\n class=\"aspect-[16/9] w-full rounded-md object-cover\"\n widths={[320, 480, 640]}\n sizes=\"(min-width: 1024px) 22rem, 100vw\"\n />\n )}\n <span class=\"grid gap-1\">\n <span class=\"font-medium\">{item.label}</span>\n {item.description && (\n <span class=\"text-muted-foreground text-sm leading-relaxed\">\n {item.description}\n </span>\n )}\n </span>\n </NavigationMenuLink>\n <div class=\"grid gap-1 lg:grid-cols-2\">\n {item.links.map((link) => (\n <NavigationMenuLink\n href={link.href}\n active={link.active}\n class=\"items-start gap-3 p-3\"\n >\n {link.icon && (\n <Icon\n name={link.icon}\n class=\"text-muted-foreground mt-0.5\"\n />\n )}\n <span class=\"grid gap-1\">\n <span class=\"font-medium\">{link.label}</span>\n {link.description && (\n <span class=\"text-muted-foreground text-sm leading-relaxed\">\n {link.description}\n </span>\n )}\n </span>\n </NavigationMenuLink>\n ))}\n </div>\n </div>\n </NavigationMenuContent>\n </NavigationMenuItem>\n ) : (\n <NavigationMenuItem value={`nav-${index}`}>\n <NavigationMenuLink\n href={item.href}\n active={item.active}\n class={navigationMenuTriggerStyle()}\n >\n {item.label}\n </NavigationMenuLink>\n </NavigationMenuItem>\n )\n )\n }\n </NavigationMenuList>\n </NavigationMenu>\n </HeaderContainer>\n</Header>\n",
17
19
  "type": "registry:block"
18
20
  }
19
21
  ],
22
+ "docs": "https://ui.full.dev/blocks/header/",
23
+ "categories": [
24
+ "header"
25
+ ],
20
26
  "type": "registry:block"
21
27
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "header",
4
+ "title": "Header",
5
+ "description": "A responsive site header with grouped content.",
4
6
  "dependencies": [
5
7
  "@lucide/astro"
6
8
  ],
@@ -30,5 +32,9 @@
30
32
  "type": "registry:ui"
31
33
  }
32
34
  ],
35
+ "docs": "https://ui.full.dev/components/header/",
36
+ "categories": [
37
+ "ui"
38
+ ],
33
39
  "type": "registry:ui"
34
40
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "hero-1",
4
+ "title": "Hero 1",
5
+ "description": "Hero sections for launches, product storytelling, editorial pages, and social proof.",
4
6
  "registryDependencies": [
5
7
  "@fulldev/badge",
6
8
  "@fulldev/button",
@@ -9,9 +11,13 @@
9
11
  "files": [
10
12
  {
11
13
  "path": "src/components/blocks/hero-1.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 { Section, SectionContainer } from \"@/components/ui/section\"\n\ntype Props = {\n class?: string\n title: string\n description: string\n badge?: {\n label: string\n href: string\n }\n buttons: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n image: {\n src: ImageMetadata\n alt: string\n }\n}\n\nconst {\n class: className,\n title,\n description,\n badge,\n buttons,\n image,\n} = Astro.props\n---\n\n<Section class={cn(\"\", className)}>\n <SectionContainer class=\"items-center gap-8 text-center\">\n {\n badge && (\n <Badge as=\"a\" href={badge.href} variant=\"secondary\">\n {badge.label}\n </Badge>\n )\n }\n <h1\n class=\"text-foreground max-w-4xl text-4xl leading-[1.1] font-semibold tracking-tight text-balance sm:text-5xl lg:text-6xl\"\n >\n {title}\n </h1>\n <p\n class=\"text-muted-foreground max-w-2xl text-lg leading-relaxed text-balance\"\n >\n {description}\n </p>\n <div class=\"flex flex-wrap justify-center gap-3\">\n {\n buttons.map(({ href, label, ...button }, index) => (\n <Button\n as=\"a\"\n href={href}\n size=\"lg\"\n variant={button.variant ?? (index === 0 ? \"default\" : \"secondary\")}\n {...button}\n >\n {label}\n </Button>\n ))\n }\n </div>\n </SectionContainer>\n <SectionContainer>\n <Image\n src={image.src}\n alt={image.alt}\n class=\"aspect-video w-full rounded-xl border object-cover\"\n widths={[640, 960, 1280, 1536]}\n sizes=\"(min-width: 80rem) 80rem, 100vw\"\n loading=\"eager\"\n />\n </SectionContainer>\n</Section>\n",
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 SectionDescription,\n} from \"@/components/ui/section\"\n\ntype Props = HTMLAttributes<\"section\"> & {\n title: string\n description: string\n badge?: {\n label: string\n href: string\n }\n buttons: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n image: {\n src: ImageMetadata\n alt: string\n }\n}\n\nconst {\n class: className,\n title,\n description,\n badge,\n buttons,\n image,\n ...props\n} = Astro.props\n---\n\n<Section class={cn(\"\", className)} {...props}>\n <SectionContainer class=\"items-center gap-8 text-center\">\n {\n badge && (\n <Badge as=\"a\" href={badge.href} variant=\"secondary\">\n {badge.label}\n </Badge>\n )\n }\n <h1\n class=\"text-foreground max-w-4xl text-4xl leading-[1.1] font-semibold tracking-tight text-balance sm:text-5xl lg:text-6xl\"\n >\n {title}\n </h1>\n <SectionDescription class=\"max-w-2xl\">\n {description}\n </SectionDescription>\n <div class=\"flex flex-wrap justify-center gap-3\">\n {\n buttons.map(({ href, label, ...button }, index) => (\n <Button\n as=\"a\"\n href={href}\n size=\"lg\"\n variant={button.variant ?? (index === 0 ? \"default\" : \"secondary\")}\n {...button}\n >\n {label}\n </Button>\n ))\n }\n </div>\n </SectionContainer>\n <SectionContainer>\n <Image\n src={image.src}\n alt={image.alt}\n class=\"aspect-video w-full rounded-xl border object-cover\"\n widths={[640, 960, 1280, 1536]}\n sizes=\"(min-width: 80rem) 80rem, 100vw\"\n loading=\"eager\"\n />\n </SectionContainer>\n</Section>\n",
13
15
  "type": "registry:block"
14
16
  }
15
17
  ],
18
+ "docs": "https://ui.full.dev/blocks/hero/",
19
+ "categories": [
20
+ "hero"
21
+ ],
16
22
  "type": "registry:block"
17
23
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "hero-10",
4
+ "title": "Hero 10",
5
+ "description": "Hero sections for launches, product storytelling, editorial pages, and social proof.",
4
6
  "registryDependencies": [
5
7
  "@fulldev/avatar",
6
8
  "@fulldev/button",
@@ -10,9 +12,13 @@
10
12
  "files": [
11
13
  {
12
14
  "path": "src/components/blocks/hero-10.astro",
13
- "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\n\nimport { cn } from \"@/lib/utils\"\nimport {\n Avatar,\n AvatarFallback,\n AvatarGroup,\n AvatarImage,\n} from \"@/components/ui/avatar\"\nimport { Button } from \"@/components/ui/button\"\nimport { Rating } from \"@/components/ui/rating\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\n\ntype Props = {\n class?: string\n title: string\n description: string\n buttons: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n socialProof: {\n avatars: {\n image?: ImageMetadata\n initials: string\n name?: string\n }[]\n rating: number\n text: string\n }\n image: {\n src: ImageMetadata\n alt: string\n }\n}\n\nconst {\n class: className,\n title,\n description,\n buttons,\n socialProof,\n image,\n} = Astro.props\n---\n\n<Section class={cn(\"dark bg-background min-h-screen justify-start\", className)}>\n <SectionContainer\n class=\"relative z-10 grid gap-8 lg:grid-cols-[minmax(0,1fr)_auto] lg:items-center\"\n >\n <div class=\"flex flex-col gap-5\">\n <h1\n class=\"text-foreground text-4xl leading-[1.1] font-semibold tracking-tight text-balance sm:text-5xl\"\n >\n {title}\n </h1>\n <p class=\"text-foreground/80 max-w-2xl text-lg leading-relaxed\">\n {description}\n </p>\n </div>\n <div class=\"flex shrink-0 flex-col gap-5\">\n <div class=\"flex flex-wrap gap-3\">\n {\n buttons.map(({ href, label, ...button }, index) => (\n <Button\n as=\"a\"\n href={href}\n size=\"lg\"\n class=\"w-full\"\n variant={\n button.variant ?? (index === 0 ? \"default\" : \"secondary\")\n }\n {...button}\n >\n {label}\n </Button>\n ))\n }\n </div>\n <div class=\"flex items-center gap-3\">\n <AvatarGroup>\n {\n socialProof.avatars.map((avatar) => (\n <Avatar class=\"ring-background size-11 ring\">\n <AvatarImage\n src={avatar.image}\n alt={avatar.name ?? avatar.initials}\n />\n <AvatarFallback>{avatar.initials}</AvatarFallback>\n </Avatar>\n ))\n }\n </AvatarGroup>\n <div class=\"flex flex-col gap-0.5\">\n <Rating value={socialProof.rating} />\n <span class=\"text-muted-foreground text-xs\">{socialProof.text}</span>\n </div>\n </div>\n </div>\n </SectionContainer>\n <div\n class=\"bg-background pointer-events-none absolute inset-0 mask-y-from-0% mask-y-to-100%\"\n >\n <Image\n src={image.src}\n alt={image.alt}\n class=\"size-full object-cover opacity-75\"\n widths={[640, 960, 1280, 1920]}\n sizes=\"100vw\"\n loading=\"eager\"\n />\n </div>\n</Section>\n",
15
+ "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\nimport {\n Avatar,\n AvatarFallback,\n AvatarGroup,\n AvatarImage,\n} from \"@/components/ui/avatar\"\nimport { Button } from \"@/components/ui/button\"\nimport { Rating } from \"@/components/ui/rating\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\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 socialProof: {\n avatars: {\n image?: ImageMetadata\n initials: string\n name?: string\n }[]\n rating: number\n text: string\n }\n image: {\n src: ImageMetadata\n alt: string\n }\n}\n\nconst {\n class: className,\n title,\n description,\n buttons,\n socialProof,\n image,\n ...props\n} = Astro.props\n---\n\n<Section\n class={cn(\"dark bg-background min-h-screen justify-start\", className)}\n {...props}\n>\n <SectionContainer\n class=\"relative z-10 grid gap-8 lg:grid-cols-[minmax(0,1fr)_auto] lg:items-center\"\n >\n <div class=\"flex flex-col gap-5\">\n <h1\n class=\"text-foreground text-4xl leading-[1.1] font-semibold tracking-tight text-balance sm:text-5xl\"\n >\n {title}\n </h1>\n <p class=\"text-foreground/80 max-w-2xl text-lg leading-relaxed\">\n {description}\n </p>\n </div>\n <div class=\"flex shrink-0 flex-col gap-5\">\n <div class=\"flex flex-wrap gap-3\">\n {\n buttons.map(({ href, label, ...button }, index) => (\n <Button\n as=\"a\"\n href={href}\n size=\"lg\"\n class=\"w-full\"\n variant={\n button.variant ?? (index === 0 ? \"default\" : \"secondary\")\n }\n {...button}\n >\n {label}\n </Button>\n ))\n }\n </div>\n <div class=\"flex items-center gap-3\">\n <AvatarGroup>\n {\n socialProof.avatars.map((avatar) => (\n <Avatar class=\"ring-background size-11 ring\">\n <AvatarImage\n src={avatar.image}\n alt={avatar.name ?? avatar.initials}\n />\n <AvatarFallback>{avatar.initials}</AvatarFallback>\n </Avatar>\n ))\n }\n </AvatarGroup>\n <div class=\"flex flex-col gap-0.5\">\n <Rating value={socialProof.rating} />\n <span class=\"text-muted-foreground text-xs\">{socialProof.text}</span>\n </div>\n </div>\n </div>\n </SectionContainer>\n <div\n class=\"bg-background pointer-events-none absolute inset-0 mask-y-from-0% mask-y-to-100%\"\n >\n <Image\n src={image.src}\n alt={image.alt}\n class=\"size-full object-cover opacity-75\"\n widths={[640, 960, 1280, 1920]}\n sizes=\"100vw\"\n loading=\"eager\"\n />\n </div>\n</Section>\n",
14
16
  "type": "registry:block"
15
17
  }
16
18
  ],
19
+ "docs": "https://ui.full.dev/blocks/hero/",
20
+ "categories": [
21
+ "hero"
22
+ ],
17
23
  "type": "registry:block"
18
24
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "hero-11",
4
+ "title": "Hero 11",
5
+ "description": "Hero sections for launches, product storytelling, editorial pages, and social proof.",
4
6
  "registryDependencies": [
5
7
  "@fulldev/avatar",
6
8
  "@fulldev/button",
@@ -10,9 +12,13 @@
10
12
  "files": [
11
13
  {
12
14
  "path": "src/components/blocks/hero-11.astro",
13
- "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\n\nimport { cn } from \"@/lib/utils\"\nimport {\n Avatar,\n AvatarFallback,\n AvatarGroup,\n AvatarImage,\n} from \"@/components/ui/avatar\"\nimport { Button } from \"@/components/ui/button\"\nimport { Rating } from \"@/components/ui/rating\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\n\ntype Props = {\n class?: string\n title: string\n description: string\n buttons: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n socialProof: {\n avatars: {\n image?: ImageMetadata\n initials: string\n name?: string\n }[]\n rating: number\n text: string\n }\n image: {\n src: ImageMetadata\n alt: string\n }\n}\n\nconst {\n class: className,\n title,\n description,\n buttons,\n socialProof,\n image,\n} = Astro.props\n---\n\n<Section\n class={cn(\"dark bg-background min-h-screen justify-center\", className)}\n>\n <SectionContainer class=\"relative z-10 items-center gap-8 text-center\">\n <h1\n class=\"text-foreground max-w-3xl text-4xl leading-[1.1] font-semibold tracking-tight text-balance sm:text-5xl lg:text-6xl\"\n >\n {title}\n </h1>\n <p\n class=\"text-foreground/80 max-w-2xl text-lg leading-relaxed text-balance\"\n >\n {description}\n </p>\n <div class=\"flex flex-wrap justify-center gap-3\">\n {\n buttons.map(({ href, label, ...button }, index) => (\n <Button\n as=\"a\"\n href={href}\n size=\"lg\"\n variant={button.variant ?? (index === 0 ? \"default\" : \"secondary\")}\n {...button}\n >\n {label}\n </Button>\n ))\n }\n </div>\n <div class=\"flex items-center gap-3\">\n <AvatarGroup>\n {\n socialProof.avatars.map((avatar) => (\n <Avatar class=\"ring-background size-11 ring\">\n <AvatarImage\n src={avatar.image}\n alt={avatar.name ?? avatar.initials}\n />\n <AvatarFallback>{avatar.initials}</AvatarFallback>\n </Avatar>\n ))\n }\n </AvatarGroup>\n <div class=\"flex flex-col gap-0.5\">\n <Rating value={socialProof.rating} />\n <span class=\"text-muted-foreground text-xs\">{socialProof.text}</span>\n </div>\n </div>\n </SectionContainer>\n <div\n class=\"bg-background pointer-events-none absolute inset-0 mask-y-from-0% mask-y-to-100%\"\n >\n <Image\n src={image.src}\n alt={image.alt}\n class=\"size-full object-cover opacity-75\"\n widths={[640, 960, 1280, 1920]}\n sizes=\"100vw\"\n loading=\"eager\"\n />\n </div>\n</Section>\n",
15
+ "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\nimport {\n Avatar,\n AvatarFallback,\n AvatarGroup,\n AvatarImage,\n} from \"@/components/ui/avatar\"\nimport { Button } from \"@/components/ui/button\"\nimport { Rating } from \"@/components/ui/rating\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\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 socialProof: {\n avatars: {\n image?: ImageMetadata\n initials: string\n name?: string\n }[]\n rating: number\n text: string\n }\n image: {\n src: ImageMetadata\n alt: string\n }\n}\n\nconst {\n class: className,\n title,\n description,\n buttons,\n socialProof,\n image,\n ...props\n} = Astro.props\n---\n\n<Section\n class={cn(\"dark bg-background min-h-screen justify-center\", className)}\n {...props}\n>\n <SectionContainer class=\"relative z-10 items-center gap-8 text-center\">\n <h1\n class=\"text-foreground max-w-3xl text-4xl leading-[1.1] font-semibold tracking-tight text-balance sm:text-5xl lg:text-6xl\"\n >\n {title}\n </h1>\n <p\n class=\"text-foreground/80 max-w-2xl text-lg leading-relaxed text-balance\"\n >\n {description}\n </p>\n <div class=\"flex flex-wrap justify-center gap-3\">\n {\n buttons.map(({ href, label, ...button }, index) => (\n <Button\n as=\"a\"\n href={href}\n size=\"lg\"\n variant={button.variant ?? (index === 0 ? \"default\" : \"secondary\")}\n {...button}\n >\n {label}\n </Button>\n ))\n }\n </div>\n <div class=\"flex items-center gap-3\">\n <AvatarGroup>\n {\n socialProof.avatars.map((avatar) => (\n <Avatar class=\"ring-background size-11 ring\">\n <AvatarImage\n src={avatar.image}\n alt={avatar.name ?? avatar.initials}\n />\n <AvatarFallback>{avatar.initials}</AvatarFallback>\n </Avatar>\n ))\n }\n </AvatarGroup>\n <div class=\"flex flex-col gap-0.5\">\n <Rating value={socialProof.rating} />\n <span class=\"text-muted-foreground text-xs\">{socialProof.text}</span>\n </div>\n </div>\n </SectionContainer>\n <div\n class=\"bg-background pointer-events-none absolute inset-0 mask-y-from-0% mask-y-to-100%\"\n >\n <Image\n src={image.src}\n alt={image.alt}\n class=\"size-full object-cover opacity-75\"\n widths={[640, 960, 1280, 1920]}\n sizes=\"100vw\"\n loading=\"eager\"\n />\n </div>\n</Section>\n",
14
16
  "type": "registry:block"
15
17
  }
16
18
  ],
19
+ "docs": "https://ui.full.dev/blocks/hero/",
20
+ "categories": [
21
+ "hero"
22
+ ],
17
23
  "type": "registry:block"
18
24
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "hero-12",
4
+ "title": "Hero 12",
5
+ "description": "Hero sections for launches, product storytelling, editorial pages, and social proof.",
4
6
  "registryDependencies": [
5
7
  "@fulldev/button",
6
8
  "@fulldev/section"
@@ -8,9 +10,13 @@
8
10
  "files": [
9
11
  {
10
12
  "path": "src/components/blocks/hero-12.astro",
11
- "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\n\ntype Props = {\n class?: string\n title: string\n description: string\n buttons: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n image: {\n src: ImageMetadata\n alt: string\n }\n}\n\nconst { class: className, title, description, buttons, image } = Astro.props\n---\n\n<Section class={cn(\"gap-8 pt-8\", className)}>\n <SectionContainer class=\"border-y py-8\">\n <div\n class=\"flex flex-col gap-6 lg:flex-row lg:items-end lg:justify-between\"\n >\n <h1\n class=\"text-foreground max-w-xl text-2xl leading-[1.2] font-semibold tracking-tight text-balance sm:text-3xl\"\n >\n {title}\n </h1>\n <p\n class=\"text-muted-foreground max-w-md text-base leading-relaxed text-balance\"\n >\n {description}\n </p>\n <div class=\"flex flex-wrap gap-3\">\n {\n buttons.map(({ href, label, ...button }, index) => (\n <Button\n as=\"a\"\n href={href}\n variant={\n button.variant ?? (index === 0 ? \"default\" : \"secondary\")\n }\n {...button}\n >\n {label}\n </Button>\n ))\n }\n </div>\n </div>\n </SectionContainer>\n <SectionContainer>\n <Image\n src={image.src}\n alt={image.alt}\n class=\"aspect-video w-full rounded-xl border object-cover\"\n widths={[640, 960, 1280, 1536]}\n sizes=\"(min-width: 80rem) 80rem, 100vw\"\n loading=\"eager\"\n />\n </SectionContainer>\n</Section>\n",
13
+ "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\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 image: {\n src: ImageMetadata\n alt: string\n }\n}\n\nconst {\n class: className,\n title,\n description,\n buttons,\n image,\n ...props\n} = Astro.props\n---\n\n<Section class={cn(\"gap-8 pt-8\", className)} {...props}>\n <SectionContainer class=\"border-y py-8\">\n <div\n class=\"flex flex-col gap-6 lg:flex-row lg:items-end lg:justify-between\"\n >\n <h1\n class=\"text-foreground max-w-xl text-2xl leading-[1.2] font-semibold tracking-tight text-balance sm:text-3xl\"\n >\n {title}\n </h1>\n <p\n class=\"text-muted-foreground max-w-md text-base leading-relaxed text-balance\"\n >\n {description}\n </p>\n <div class=\"flex flex-wrap gap-3\">\n {\n buttons.map(({ href, label, ...button }, index) => (\n <Button\n as=\"a\"\n href={href}\n variant={\n button.variant ?? (index === 0 ? \"default\" : \"secondary\")\n }\n {...button}\n >\n {label}\n </Button>\n ))\n }\n </div>\n </div>\n </SectionContainer>\n <SectionContainer>\n <Image\n src={image.src}\n alt={image.alt}\n class=\"aspect-video w-full rounded-xl border object-cover\"\n widths={[640, 960, 1280, 1536]}\n sizes=\"(min-width: 80rem) 80rem, 100vw\"\n loading=\"eager\"\n />\n </SectionContainer>\n</Section>\n",
12
14
  "type": "registry:block"
13
15
  }
14
16
  ],
17
+ "docs": "https://ui.full.dev/blocks/hero/",
18
+ "categories": [
19
+ "hero"
20
+ ],
15
21
  "type": "registry:block"
16
22
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "hero-13",
4
+ "title": "Hero 13",
5
+ "description": "Hero sections for launches, product storytelling, editorial pages, and social proof.",
4
6
  "registryDependencies": [
5
7
  "@fulldev/button",
6
8
  "@fulldev/section"
@@ -8,9 +10,13 @@
8
10
  "files": [
9
11
  {
10
12
  "path": "src/components/blocks/hero-13.astro",
11
- "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\n\ntype Props = {\n class?: string\n title: string\n description: string\n buttons: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n image: {\n src: ImageMetadata\n alt: string\n }\n}\n\nconst { class: className, title, description, buttons, image } = Astro.props\n---\n\n<Section class={cn(\"\", className)}>\n <SectionContainer class=\"grid gap-12 lg:grid-cols-[1fr_3fr] lg:items-start\">\n <div class=\"flex flex-col gap-6 pt-8\">\n <div class=\"flex flex-col gap-4\">\n <h1\n class=\"text-foreground text-2xl leading-[1.2] font-semibold tracking-tight text-balance sm:text-3xl\"\n >\n {title}\n </h1>\n <p class=\"text-muted-foreground text-base leading-relaxed\">\n {description}\n </p>\n </div>\n <div class=\"flex flex-wrap gap-3\">\n {\n buttons.map(({ href, label, ...button }, index) => (\n <Button\n as=\"a\"\n href={href}\n variant={\n button.variant ?? (index === 0 ? \"default\" : \"secondary\")\n }\n {...button}\n >\n {label}\n </Button>\n ))\n }\n </div>\n </div>\n <Image\n src={image.src}\n alt={image.alt}\n class=\"aspect-[4/3] w-full rounded-xl border object-cover\"\n widths={[640, 960, 1280]}\n sizes=\"(min-width: 1024px) 75vw, 100vw\"\n loading=\"eager\"\n />\n </SectionContainer>\n</Section>\n",
13
+ "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\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 image: {\n src: ImageMetadata\n alt: string\n }\n}\n\nconst {\n class: className,\n title,\n description,\n buttons,\n image,\n ...props\n} = Astro.props\n---\n\n<Section class={cn(\"\", className)} {...props}>\n <SectionContainer class=\"grid gap-12 lg:grid-cols-[1fr_3fr] lg:items-start\">\n <div class=\"flex flex-col gap-6 pt-8\">\n <div class=\"flex flex-col gap-4\">\n <h1\n class=\"text-foreground text-2xl leading-[1.2] font-semibold tracking-tight text-balance sm:text-3xl\"\n >\n {title}\n </h1>\n <p class=\"text-muted-foreground text-base leading-relaxed\">\n {description}\n </p>\n </div>\n <div class=\"flex flex-wrap gap-3\">\n {\n buttons.map(({ href, label, ...button }, index) => (\n <Button\n as=\"a\"\n href={href}\n variant={\n button.variant ?? (index === 0 ? \"default\" : \"secondary\")\n }\n {...button}\n >\n {label}\n </Button>\n ))\n }\n </div>\n </div>\n <Image\n src={image.src}\n alt={image.alt}\n class=\"aspect-[4/3] w-full rounded-xl border object-cover\"\n widths={[640, 960, 1280]}\n sizes=\"(min-width: 1024px) 75vw, 100vw\"\n loading=\"eager\"\n />\n </SectionContainer>\n</Section>\n",
12
14
  "type": "registry:block"
13
15
  }
14
16
  ],
17
+ "docs": "https://ui.full.dev/blocks/hero/",
18
+ "categories": [
19
+ "hero"
20
+ ],
15
21
  "type": "registry:block"
16
22
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "hero-2",
4
+ "title": "Hero 2",
5
+ "description": "Hero sections for launches, product storytelling, editorial pages, and social proof.",
4
6
  "registryDependencies": [
5
7
  "@fulldev/avatar",
6
8
  "@fulldev/button",
@@ -10,9 +12,13 @@
10
12
  "files": [
11
13
  {
12
14
  "path": "src/components/blocks/hero-2.astro",
13
- "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\n\nimport { cn } from \"@/lib/utils\"\nimport {\n Avatar,\n AvatarFallback,\n AvatarGroup,\n AvatarImage,\n} from \"@/components/ui/avatar\"\nimport { Button } from \"@/components/ui/button\"\nimport { Rating } from \"@/components/ui/rating\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\n\ntype Props = {\n class?: string\n title: string\n description: string\n buttons: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n socialProof: {\n avatars: {\n image?: ImageMetadata\n initials: string\n name?: string\n }[]\n rating: number\n text: string\n }\n image: {\n src: ImageMetadata\n alt: string\n }\n}\n\nconst {\n class: className,\n title,\n description,\n buttons,\n socialProof,\n image,\n} = Astro.props\n---\n\n<Section class={cn(\"\", className)}>\n <SectionContainer class=\"items-center gap-8 text-center\">\n <div class=\"flex flex-col items-center gap-3\">\n <AvatarGroup>\n {\n socialProof.avatars.map((avatar) => (\n <Avatar class=\"ring-background size-11 ring\">\n <AvatarImage\n src={avatar.image}\n alt={avatar.name ?? avatar.initials}\n />\n <AvatarFallback>{avatar.initials}</AvatarFallback>\n </Avatar>\n ))\n }\n </AvatarGroup>\n <div class=\"flex items-center gap-2\">\n <Rating value={socialProof.rating} />\n <span class=\"text-muted-foreground text-sm\">{socialProof.text}</span>\n </div>\n </div>\n <h1\n class=\"text-foreground max-w-4xl text-4xl leading-[1.1] font-semibold tracking-tight text-balance sm:text-5xl lg:text-6xl\"\n >\n {title}\n </h1>\n <p\n class=\"text-muted-foreground max-w-2xl text-lg leading-relaxed text-balance\"\n >\n {description}\n </p>\n <div class=\"flex flex-wrap justify-center gap-3\">\n {\n buttons.map(({ href, label, ...button }, index) => (\n <Button\n as=\"a\"\n href={href}\n size=\"lg\"\n variant={button.variant ?? (index === 0 ? \"default\" : \"secondary\")}\n {...button}\n >\n {label}\n </Button>\n ))\n }\n </div>\n </SectionContainer>\n <SectionContainer>\n <Image\n src={image.src}\n alt={image.alt}\n class=\"aspect-video w-full rounded-xl border object-cover\"\n widths={[640, 960, 1280, 1536]}\n sizes=\"(min-width: 80rem) 80rem, 100vw\"\n loading=\"eager\"\n />\n </SectionContainer>\n</Section>\n",
15
+ "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\nimport {\n Avatar,\n AvatarFallback,\n AvatarGroup,\n AvatarImage,\n} from \"@/components/ui/avatar\"\nimport { Button } from \"@/components/ui/button\"\nimport { Rating } from \"@/components/ui/rating\"\nimport {\n Section,\n SectionContainer,\n SectionDescription,\n} from \"@/components/ui/section\"\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 socialProof: {\n avatars: {\n image?: ImageMetadata\n initials: string\n name?: string\n }[]\n rating: number\n text: string\n }\n image: {\n src: ImageMetadata\n alt: string\n }\n}\n\nconst {\n class: className,\n title,\n description,\n buttons,\n socialProof,\n image,\n ...props\n} = Astro.props\n---\n\n<Section class={cn(\"\", className)} {...props}>\n <SectionContainer class=\"items-center gap-8 text-center\">\n <div class=\"flex flex-col items-center gap-3\">\n <AvatarGroup>\n {\n socialProof.avatars.map((avatar) => (\n <Avatar class=\"ring-background size-11 ring\">\n <AvatarImage\n src={avatar.image}\n alt={avatar.name ?? avatar.initials}\n />\n <AvatarFallback>{avatar.initials}</AvatarFallback>\n </Avatar>\n ))\n }\n </AvatarGroup>\n <div class=\"flex items-center gap-2\">\n <Rating value={socialProof.rating} />\n <span class=\"text-muted-foreground text-sm\">{socialProof.text}</span>\n </div>\n </div>\n <h1\n class=\"text-foreground max-w-4xl text-4xl leading-[1.1] font-semibold tracking-tight text-balance sm:text-5xl lg:text-6xl\"\n >\n {title}\n </h1>\n <SectionDescription class=\"max-w-2xl\">\n {description}\n </SectionDescription>\n <div class=\"flex flex-wrap justify-center gap-3\">\n {\n buttons.map(({ href, label, ...button }, index) => (\n <Button\n as=\"a\"\n href={href}\n size=\"lg\"\n variant={button.variant ?? (index === 0 ? \"default\" : \"secondary\")}\n {...button}\n >\n {label}\n </Button>\n ))\n }\n </div>\n </SectionContainer>\n <SectionContainer>\n <Image\n src={image.src}\n alt={image.alt}\n class=\"aspect-video w-full rounded-xl border object-cover\"\n widths={[640, 960, 1280, 1536]}\n sizes=\"(min-width: 80rem) 80rem, 100vw\"\n loading=\"eager\"\n />\n </SectionContainer>\n</Section>\n",
14
16
  "type": "registry:block"
15
17
  }
16
18
  ],
19
+ "docs": "https://ui.full.dev/blocks/hero/",
20
+ "categories": [
21
+ "hero"
22
+ ],
17
23
  "type": "registry:block"
18
24
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "hero-3",
4
+ "title": "Hero 3",
5
+ "description": "Hero sections for launches, product storytelling, editorial pages, and social proof.",
4
6
  "registryDependencies": [
5
7
  "@fulldev/button",
6
8
  "@fulldev/section"
@@ -8,9 +10,13 @@
8
10
  "files": [
9
11
  {
10
12
  "path": "src/components/blocks/hero-3.astro",
11
- "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\n\ntype Props = {\n class?: string\n title: string\n description: string\n buttons: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n image: {\n src: ImageMetadata\n alt: string\n }\n}\n\nconst { class: className, title, description, buttons, image } = Astro.props\n---\n\n<Section\n class={cn(\"dark bg-background min-h-[80vh] justify-center\", className)}\n>\n <SectionContainer class=\"relative z-10 items-center gap-8 text-center\">\n <h1\n class=\"text-foreground max-w-4xl text-4xl leading-[1.1] font-semibold tracking-tight text-balance sm:text-5xl lg:text-6xl\"\n >\n {title}\n </h1>\n <p\n class=\"text-foreground/80 max-w-2xl text-lg leading-relaxed text-balance\"\n >\n {description}\n </p>\n <div class=\"flex flex-wrap justify-center gap-3\">\n {\n buttons.map(({ href, label, ...button }, index) => (\n <Button\n as=\"a\"\n href={href}\n size=\"lg\"\n variant={button.variant ?? (index === 0 ? \"default\" : \"secondary\")}\n {...button}\n >\n {label}\n </Button>\n ))\n }\n </div>\n </SectionContainer>\n <div class=\"bg-background pointer-events-none absolute inset-0\">\n <Image\n src={image.src}\n alt={image.alt}\n class=\"size-full object-cover opacity-50\"\n widths={[640, 960, 1280, 1920]}\n sizes=\"100vw\"\n loading=\"eager\"\n />\n </div>\n</Section>\n",
13
+ "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\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 image: {\n src: ImageMetadata\n alt: string\n }\n}\n\nconst {\n class: className,\n title,\n description,\n buttons,\n image,\n ...props\n} = Astro.props\n---\n\n<Section\n class={cn(\"dark bg-background min-h-[80vh] justify-center\", className)}\n {...props}\n>\n <SectionContainer class=\"relative z-10 items-center gap-8 text-center\">\n <h1\n class=\"text-foreground max-w-4xl text-4xl leading-[1.1] font-semibold tracking-tight text-balance sm:text-5xl lg:text-6xl\"\n >\n {title}\n </h1>\n <p\n class=\"text-foreground/80 max-w-2xl text-lg leading-relaxed text-balance\"\n >\n {description}\n </p>\n <div class=\"flex flex-wrap justify-center gap-3\">\n {\n buttons.map(({ href, label, ...button }, index) => (\n <Button\n as=\"a\"\n href={href}\n size=\"lg\"\n variant={button.variant ?? (index === 0 ? \"default\" : \"secondary\")}\n {...button}\n >\n {label}\n </Button>\n ))\n }\n </div>\n </SectionContainer>\n <div class=\"bg-background pointer-events-none absolute inset-0\">\n <Image\n src={image.src}\n alt={image.alt}\n class=\"size-full object-cover opacity-50\"\n widths={[640, 960, 1280, 1920]}\n sizes=\"100vw\"\n loading=\"eager\"\n />\n </div>\n</Section>\n",
12
14
  "type": "registry:block"
13
15
  }
14
16
  ],
17
+ "docs": "https://ui.full.dev/blocks/hero/",
18
+ "categories": [
19
+ "hero"
20
+ ],
15
21
  "type": "registry:block"
16
22
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "hero-4",
4
+ "title": "Hero 4",
5
+ "description": "Hero sections for launches, product storytelling, editorial pages, and social proof.",
4
6
  "dependencies": [
5
7
  "@lucide/astro"
6
8
  ],
@@ -11,9 +13,13 @@
11
13
  "files": [
12
14
  {
13
15
  "path": "src/components/blocks/hero-4.astro",
14
- "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\nimport { CheckIcon } from \"@lucide/astro\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\n\ntype Props = {\n class?: string\n title: string\n description: string\n features: string[]\n buttons: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n image: {\n src: ImageMetadata\n alt: string\n }\n}\n\nconst {\n class: className,\n title,\n description,\n features,\n buttons,\n image,\n} = Astro.props\n---\n\n<Section\n class={cn(\"dark bg-background min-h-screen justify-center\", className)}\n>\n <SectionContainer class=\"relative z-10 items-center gap-8 text-center\">\n <h1\n class=\"text-foreground max-w-4xl text-4xl leading-[1.1] font-semibold tracking-tight text-balance sm:text-5xl lg:text-6xl\"\n >\n {title}\n </h1>\n <p\n class=\"text-foreground/80 max-w-2xl text-lg leading-relaxed text-balance\"\n >\n {description}\n </p>\n <ul class=\"flex flex-wrap justify-center gap-x-6 gap-y-2\">\n {\n features.map((feature) => (\n <li class=\"flex items-center gap-2 text-sm\">\n <CheckIcon class=\"text-primary size-4 shrink-0\" />\n {feature}\n </li>\n ))\n }\n </ul>\n <div class=\"flex flex-wrap justify-center gap-3\">\n {\n buttons.map(({ href, label, ...button }, index) => (\n <Button\n as=\"a\"\n href={href}\n size=\"lg\"\n variant={button.variant ?? (index === 0 ? \"default\" : \"secondary\")}\n {...button}\n >\n {label}\n </Button>\n ))\n }\n </div>\n </SectionContainer>\n <div class=\"bg-background pointer-events-none absolute inset-0\">\n <Image\n src={image.src}\n alt={image.alt}\n class=\"size-full object-cover opacity-50\"\n widths={[640, 960, 1280, 1920]}\n sizes=\"100vw\"\n loading=\"eager\"\n />\n </div>\n</Section>\n",
16
+ "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\nimport type { HTMLAttributes } from \"astro/types\"\nimport { CheckIcon } from \"@lucide/astro\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\n\ntype Props = HTMLAttributes<\"section\"> & {\n title: string\n description: string\n features: string[]\n buttons: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n image: {\n src: ImageMetadata\n alt: string\n }\n}\n\nconst {\n class: className,\n title,\n description,\n features,\n buttons,\n image,\n ...props\n} = Astro.props\n---\n\n<Section\n class={cn(\"dark bg-background min-h-screen justify-center\", className)}\n {...props}\n>\n <SectionContainer class=\"relative z-10 items-center gap-8 text-center\">\n <h1\n class=\"text-foreground max-w-4xl text-4xl leading-[1.1] font-semibold tracking-tight text-balance sm:text-5xl lg:text-6xl\"\n >\n {title}\n </h1>\n <p\n class=\"text-foreground/80 max-w-2xl text-lg leading-relaxed text-balance\"\n >\n {description}\n </p>\n <ul class=\"flex flex-wrap justify-center gap-x-6 gap-y-2\">\n {\n features.map((feature) => (\n <li class=\"flex items-center gap-2 text-sm\">\n <CheckIcon class=\"text-primary size-4 shrink-0\" />\n {feature}\n </li>\n ))\n }\n </ul>\n <div class=\"flex flex-wrap justify-center gap-3\">\n {\n buttons.map(({ href, label, ...button }, index) => (\n <Button\n as=\"a\"\n href={href}\n size=\"lg\"\n variant={button.variant ?? (index === 0 ? \"default\" : \"secondary\")}\n {...button}\n >\n {label}\n </Button>\n ))\n }\n </div>\n </SectionContainer>\n <div class=\"bg-background pointer-events-none absolute inset-0\">\n <Image\n src={image.src}\n alt={image.alt}\n class=\"size-full object-cover opacity-50\"\n widths={[640, 960, 1280, 1920]}\n sizes=\"100vw\"\n loading=\"eager\"\n />\n </div>\n</Section>\n",
15
17
  "type": "registry:block"
16
18
  }
17
19
  ],
20
+ "docs": "https://ui.full.dev/blocks/hero/",
21
+ "categories": [
22
+ "hero"
23
+ ],
18
24
  "type": "registry:block"
19
25
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "hero-5",
4
+ "title": "Hero 5",
5
+ "description": "Hero sections for launches, product storytelling, editorial pages, and social proof.",
4
6
  "dependencies": [
5
7
  "@lucide/astro"
6
8
  ],
@@ -13,9 +15,13 @@
13
15
  "files": [
14
16
  {
15
17
  "path": "src/components/blocks/hero-5.astro",
16
- "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\nimport { CheckIcon } from \"@lucide/astro\"\n\nimport { cn } from \"@/lib/utils\"\nimport {\n Avatar,\n AvatarFallback,\n AvatarGroup,\n AvatarImage,\n} from \"@/components/ui/avatar\"\nimport { Button } from \"@/components/ui/button\"\nimport { Rating } from \"@/components/ui/rating\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\n\ntype Props = {\n class?: string\n title: string\n description: string\n features: string[]\n buttons: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n socialProof: {\n avatars: {\n image?: ImageMetadata\n initials: string\n name?: string\n }[]\n rating: number\n text: string\n }\n image: {\n src: ImageMetadata\n alt: string\n }\n}\n\nconst {\n class: className,\n title,\n description,\n features,\n buttons,\n socialProof,\n image,\n} = Astro.props\n---\n\n<Section class={cn(\"\", className)}>\n <SectionContainer class=\"grid gap-12 lg:grid-cols-2 lg:items-center\">\n <div class=\"flex flex-col gap-6\">\n <div class=\"flex flex-col gap-4\">\n <h1\n class=\"text-foreground text-4xl leading-[1.1] font-semibold tracking-tight text-balance sm:text-5xl\"\n >\n {title}\n </h1>\n <p class=\"text-muted-foreground text-lg leading-relaxed\">\n {description}\n </p>\n </div>\n <ul class=\"flex flex-col gap-3\">\n {\n features.map((feature) => (\n <li class=\"flex items-center gap-3 text-sm\">\n <CheckIcon class=\"text-primary size-4 shrink-0\" />\n {feature}\n </li>\n ))\n }\n </ul>\n <div class=\"flex flex-wrap gap-3\">\n {\n buttons.map(({ href, label, ...button }, index) => (\n <Button\n as=\"a\"\n href={href}\n size=\"lg\"\n variant={\n button.variant ?? (index === 0 ? \"default\" : \"secondary\")\n }\n {...button}\n >\n {label}\n </Button>\n ))\n }\n </div>\n <div class=\"flex items-center gap-3\">\n <AvatarGroup>\n {\n socialProof.avatars.map((avatar) => (\n <Avatar class=\"ring-background size-11 ring\">\n <AvatarImage\n src={avatar.image}\n alt={avatar.name ?? avatar.initials}\n />\n <AvatarFallback>{avatar.initials}</AvatarFallback>\n </Avatar>\n ))\n }\n </AvatarGroup>\n <div class=\"flex flex-col gap-0.5\">\n <Rating value={socialProof.rating} />\n <span class=\"text-muted-foreground text-xs\">{socialProof.text}</span>\n </div>\n </div>\n </div>\n <Image\n src={image.src}\n alt={image.alt}\n class=\"aspect-[4/3] w-full rounded-xl border object-cover\"\n widths={[640, 960, 1280]}\n sizes=\"(min-width: 1024px) 50vw, 100vw\"\n loading=\"eager\"\n />\n </SectionContainer>\n</Section>\n",
18
+ "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\nimport type { HTMLAttributes } from \"astro/types\"\nimport { CheckIcon } from \"@lucide/astro\"\n\nimport { cn } from \"@/lib/utils\"\nimport {\n Avatar,\n AvatarFallback,\n AvatarGroup,\n AvatarImage,\n} from \"@/components/ui/avatar\"\nimport { Button } from \"@/components/ui/button\"\nimport { Rating } from \"@/components/ui/rating\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\n\ntype Props = HTMLAttributes<\"section\"> & {\n title: string\n description: string\n features: string[]\n buttons: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n socialProof: {\n avatars: {\n image?: ImageMetadata\n initials: string\n name?: string\n }[]\n rating: number\n text: string\n }\n image: {\n src: ImageMetadata\n alt: string\n }\n}\n\nconst {\n class: className,\n title,\n description,\n features,\n buttons,\n socialProof,\n image,\n ...props\n} = Astro.props\n---\n\n<Section class={cn(\"\", className)} {...props}>\n <SectionContainer class=\"grid gap-12 lg:grid-cols-2 lg:items-center\">\n <div class=\"flex flex-col gap-6\">\n <div class=\"flex flex-col gap-4\">\n <h1\n class=\"text-foreground text-4xl leading-[1.1] font-semibold tracking-tight text-balance sm:text-5xl\"\n >\n {title}\n </h1>\n <p class=\"text-muted-foreground text-lg leading-relaxed\">\n {description}\n </p>\n </div>\n <ul class=\"flex flex-col gap-3\">\n {\n features.map((feature) => (\n <li class=\"flex items-center gap-3 text-sm\">\n <CheckIcon class=\"text-primary size-4 shrink-0\" />\n {feature}\n </li>\n ))\n }\n </ul>\n <div class=\"flex flex-wrap gap-3\">\n {\n buttons.map(({ href, label, ...button }, index) => (\n <Button\n as=\"a\"\n href={href}\n size=\"lg\"\n variant={\n button.variant ?? (index === 0 ? \"default\" : \"secondary\")\n }\n {...button}\n >\n {label}\n </Button>\n ))\n }\n </div>\n <div class=\"flex items-center gap-3\">\n <AvatarGroup>\n {\n socialProof.avatars.map((avatar) => (\n <Avatar class=\"ring-background size-11 ring\">\n <AvatarImage\n src={avatar.image}\n alt={avatar.name ?? avatar.initials}\n />\n <AvatarFallback>{avatar.initials}</AvatarFallback>\n </Avatar>\n ))\n }\n </AvatarGroup>\n <div class=\"flex flex-col gap-0.5\">\n <Rating value={socialProof.rating} />\n <span class=\"text-muted-foreground text-xs\">{socialProof.text}</span>\n </div>\n </div>\n </div>\n <Image\n src={image.src}\n alt={image.alt}\n class=\"aspect-[4/3] w-full rounded-xl border object-cover\"\n widths={[640, 960, 1280]}\n sizes=\"(min-width: 1024px) 50vw, 100vw\"\n loading=\"eager\"\n />\n </SectionContainer>\n</Section>\n",
17
19
  "type": "registry:block"
18
20
  }
19
21
  ],
22
+ "docs": "https://ui.full.dev/blocks/hero/",
23
+ "categories": [
24
+ "hero"
25
+ ],
20
26
  "type": "registry:block"
21
27
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "hero-6",
4
+ "title": "Hero 6",
5
+ "description": "Hero sections for launches, product storytelling, editorial pages, and social proof.",
4
6
  "dependencies": [
5
7
  "@lucide/astro"
6
8
  ],
@@ -13,9 +15,13 @@
13
15
  "files": [
14
16
  {
15
17
  "path": "src/components/blocks/hero-6.astro",
16
- "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\nimport { CheckIcon } from \"@lucide/astro\"\n\nimport { cn } from \"@/lib/utils\"\nimport {\n Avatar,\n AvatarFallback,\n AvatarGroup,\n AvatarImage,\n} from \"@/components/ui/avatar\"\nimport { Button } from \"@/components/ui/button\"\nimport { Rating } from \"@/components/ui/rating\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\n\ntype Props = {\n class?: string\n title: string\n description: string\n features: string[]\n buttons: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n socialProof: {\n avatars: {\n image?: ImageMetadata\n initials: string\n name?: string\n }[]\n rating: number\n text: string\n }\n image: {\n src: ImageMetadata\n alt: string\n }\n}\n\nconst {\n class: className,\n title,\n description,\n features,\n buttons,\n socialProof,\n image,\n} = Astro.props\n---\n\n<Section class={cn(\"\", className)}>\n <SectionContainer class=\"grid gap-12 lg:grid-cols-2 lg:items-center\">\n <Image\n src={image.src}\n alt={image.alt}\n class=\"aspect-[4/3] w-full rounded-xl border object-cover\"\n widths={[640, 960, 1280]}\n sizes=\"(min-width: 1024px) 50vw, 100vw\"\n loading=\"eager\"\n />\n <div class=\"flex flex-col gap-6\">\n <div class=\"flex flex-col gap-4\">\n <h1\n class=\"text-foreground text-4xl leading-[1.1] font-semibold tracking-tight text-balance sm:text-5xl\"\n >\n {title}\n </h1>\n <p class=\"text-muted-foreground text-lg leading-relaxed\">\n {description}\n </p>\n </div>\n <ul class=\"flex flex-col gap-3\">\n {\n features.map((feature) => (\n <li class=\"flex items-center gap-3 text-sm\">\n <CheckIcon class=\"text-primary size-4 shrink-0\" />\n {feature}\n </li>\n ))\n }\n </ul>\n <div class=\"flex flex-wrap gap-3\">\n {\n buttons.map(({ href, label, ...button }, index) => (\n <Button\n as=\"a\"\n href={href}\n size=\"lg\"\n variant={\n button.variant ?? (index === 0 ? \"default\" : \"secondary\")\n }\n {...button}\n >\n {label}\n </Button>\n ))\n }\n </div>\n <div class=\"flex items-center gap-3\">\n <AvatarGroup>\n {\n socialProof.avatars.map((avatar) => (\n <Avatar class=\"ring-background size-11 ring\">\n <AvatarImage\n src={avatar.image}\n alt={avatar.name ?? avatar.initials}\n />\n <AvatarFallback>{avatar.initials}</AvatarFallback>\n </Avatar>\n ))\n }\n </AvatarGroup>\n <div class=\"flex flex-col gap-0.5\">\n <Rating value={socialProof.rating} />\n <span class=\"text-muted-foreground text-xs\">{socialProof.text}</span>\n </div>\n </div>\n </div>\n </SectionContainer>\n</Section>\n",
18
+ "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\nimport type { HTMLAttributes } from \"astro/types\"\nimport { CheckIcon } from \"@lucide/astro\"\n\nimport { cn } from \"@/lib/utils\"\nimport {\n Avatar,\n AvatarFallback,\n AvatarGroup,\n AvatarImage,\n} from \"@/components/ui/avatar\"\nimport { Button } from \"@/components/ui/button\"\nimport { Rating } from \"@/components/ui/rating\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\n\ntype Props = HTMLAttributes<\"section\"> & {\n title: string\n description: string\n features: string[]\n buttons: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n socialProof: {\n avatars: {\n image?: ImageMetadata\n initials: string\n name?: string\n }[]\n rating: number\n text: string\n }\n image: {\n src: ImageMetadata\n alt: string\n }\n}\n\nconst {\n class: className,\n title,\n description,\n features,\n buttons,\n socialProof,\n image,\n ...props\n} = Astro.props\n---\n\n<Section class={cn(\"\", className)} {...props}>\n <SectionContainer class=\"grid gap-12 lg:grid-cols-2 lg:items-center\">\n <Image\n src={image.src}\n alt={image.alt}\n class=\"aspect-[4/3] w-full rounded-xl border object-cover\"\n widths={[640, 960, 1280]}\n sizes=\"(min-width: 1024px) 50vw, 100vw\"\n loading=\"eager\"\n />\n <div class=\"flex flex-col gap-6\">\n <div class=\"flex flex-col gap-4\">\n <h1\n class=\"text-foreground text-4xl leading-[1.1] font-semibold tracking-tight text-balance sm:text-5xl\"\n >\n {title}\n </h1>\n <p class=\"text-muted-foreground text-lg leading-relaxed\">\n {description}\n </p>\n </div>\n <ul class=\"flex flex-col gap-3\">\n {\n features.map((feature) => (\n <li class=\"flex items-center gap-3 text-sm\">\n <CheckIcon class=\"text-primary size-4 shrink-0\" />\n {feature}\n </li>\n ))\n }\n </ul>\n <div class=\"flex flex-wrap gap-3\">\n {\n buttons.map(({ href, label, ...button }, index) => (\n <Button\n as=\"a\"\n href={href}\n size=\"lg\"\n variant={\n button.variant ?? (index === 0 ? \"default\" : \"secondary\")\n }\n {...button}\n >\n {label}\n </Button>\n ))\n }\n </div>\n <div class=\"flex items-center gap-3\">\n <AvatarGroup>\n {\n socialProof.avatars.map((avatar) => (\n <Avatar class=\"ring-background size-11 ring\">\n <AvatarImage\n src={avatar.image}\n alt={avatar.name ?? avatar.initials}\n />\n <AvatarFallback>{avatar.initials}</AvatarFallback>\n </Avatar>\n ))\n }\n </AvatarGroup>\n <div class=\"flex flex-col gap-0.5\">\n <Rating value={socialProof.rating} />\n <span class=\"text-muted-foreground text-xs\">{socialProof.text}</span>\n </div>\n </div>\n </div>\n </SectionContainer>\n</Section>\n",
17
19
  "type": "registry:block"
18
20
  }
19
21
  ],
22
+ "docs": "https://ui.full.dev/blocks/hero/",
23
+ "categories": [
24
+ "hero"
25
+ ],
20
26
  "type": "registry:block"
21
27
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "hero-7",
4
+ "title": "Hero 7",
5
+ "description": "Hero sections for launches, product storytelling, editorial pages, and social proof.",
4
6
  "dependencies": [
5
7
  "@lucide/astro"
6
8
  ],
@@ -13,9 +15,13 @@
13
15
  "files": [
14
16
  {
15
17
  "path": "src/components/blocks/hero-7.astro",
16
- "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\nimport { CheckIcon } from \"@lucide/astro\"\n\nimport { cn } from \"@/lib/utils\"\nimport {\n Avatar,\n AvatarFallback,\n AvatarGroup,\n AvatarImage,\n} from \"@/components/ui/avatar\"\nimport { Button } from \"@/components/ui/button\"\nimport { Rating } from \"@/components/ui/rating\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\n\ntype Props = {\n class?: string\n title: string\n description: string\n features: string[]\n buttons: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n socialProof: {\n avatars: {\n image?: ImageMetadata\n initials: string\n name?: string\n }[]\n rating: number\n text: string\n }\n image: {\n src: ImageMetadata\n alt: string\n }\n}\n\nconst {\n class: className,\n title,\n description,\n features,\n buttons,\n socialProof,\n image,\n} = Astro.props\n---\n\n<Section class={cn(\"\", className)}>\n <SectionContainer\n class=\"grid gap-12 lg:grid-cols-[2fr_3fr] lg:items-center lg:gap-0\"\n >\n <div class=\"flex flex-col gap-6 lg:pr-12\">\n <div class=\"flex flex-col gap-4\">\n <h1\n class=\"text-foreground text-4xl leading-[1.1] font-semibold tracking-tight text-balance sm:text-5xl\"\n >\n {title}\n </h1>\n <p class=\"text-muted-foreground text-lg leading-relaxed\">\n {description}\n </p>\n </div>\n <ul class=\"flex flex-col gap-3\">\n {\n features.map((feature) => (\n <li class=\"flex items-center gap-3 text-sm\">\n <CheckIcon class=\"text-primary size-4 shrink-0\" />\n {feature}\n </li>\n ))\n }\n </ul>\n <div class=\"flex flex-wrap gap-3\">\n {\n buttons.map(({ href, label, ...button }, index) => (\n <Button\n as=\"a\"\n href={href}\n size=\"lg\"\n variant={\n button.variant ?? (index === 0 ? \"default\" : \"secondary\")\n }\n {...button}\n >\n {label}\n </Button>\n ))\n }\n </div>\n <div class=\"flex items-center gap-3\">\n <AvatarGroup>\n {\n socialProof.avatars.map((avatar) => (\n <Avatar class=\"ring-background size-11 ring\">\n <AvatarImage\n src={avatar.image}\n alt={avatar.name ?? avatar.initials}\n />\n <AvatarFallback>{avatar.initials}</AvatarFallback>\n </Avatar>\n ))\n }\n </AvatarGroup>\n <div class=\"flex flex-col gap-0.5\">\n <Rating value={socialProof.rating} />\n <span class=\"text-muted-foreground text-xs\">{socialProof.text}</span>\n </div>\n </div>\n </div>\n <Image\n src={image.src}\n alt={image.alt}\n class=\"aspect-[4/3] w-full rounded-xl border object-cover\"\n widths={[640, 960, 1280]}\n sizes=\"(min-width: 1024px) 60vw, 100vw\"\n loading=\"eager\"\n />\n </SectionContainer>\n</Section>\n",
18
+ "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\nimport type { HTMLAttributes } from \"astro/types\"\nimport { CheckIcon } from \"@lucide/astro\"\n\nimport { cn } from \"@/lib/utils\"\nimport {\n Avatar,\n AvatarFallback,\n AvatarGroup,\n AvatarImage,\n} from \"@/components/ui/avatar\"\nimport { Button } from \"@/components/ui/button\"\nimport { Rating } from \"@/components/ui/rating\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\n\ntype Props = HTMLAttributes<\"section\"> & {\n title: string\n description: string\n features: string[]\n buttons: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n socialProof: {\n avatars: {\n image?: ImageMetadata\n initials: string\n name?: string\n }[]\n rating: number\n text: string\n }\n image: {\n src: ImageMetadata\n alt: string\n }\n}\n\nconst {\n class: className,\n title,\n description,\n features,\n buttons,\n socialProof,\n image,\n ...props\n} = Astro.props\n---\n\n<Section class={cn(\"\", className)} {...props}>\n <SectionContainer\n class=\"grid gap-12 lg:grid-cols-[2fr_3fr] lg:items-center lg:gap-0\"\n >\n <div class=\"flex flex-col gap-6 lg:pr-12\">\n <div class=\"flex flex-col gap-4\">\n <h1\n class=\"text-foreground text-4xl leading-[1.1] font-semibold tracking-tight text-balance sm:text-5xl\"\n >\n {title}\n </h1>\n <p class=\"text-muted-foreground text-lg leading-relaxed\">\n {description}\n </p>\n </div>\n <ul class=\"flex flex-col gap-3\">\n {\n features.map((feature) => (\n <li class=\"flex items-center gap-3 text-sm\">\n <CheckIcon class=\"text-primary size-4 shrink-0\" />\n {feature}\n </li>\n ))\n }\n </ul>\n <div class=\"flex flex-wrap gap-3\">\n {\n buttons.map(({ href, label, ...button }, index) => (\n <Button\n as=\"a\"\n href={href}\n size=\"lg\"\n variant={\n button.variant ?? (index === 0 ? \"default\" : \"secondary\")\n }\n {...button}\n >\n {label}\n </Button>\n ))\n }\n </div>\n <div class=\"flex items-center gap-3\">\n <AvatarGroup>\n {\n socialProof.avatars.map((avatar) => (\n <Avatar class=\"ring-background size-11 ring\">\n <AvatarImage\n src={avatar.image}\n alt={avatar.name ?? avatar.initials}\n />\n <AvatarFallback>{avatar.initials}</AvatarFallback>\n </Avatar>\n ))\n }\n </AvatarGroup>\n <div class=\"flex flex-col gap-0.5\">\n <Rating value={socialProof.rating} />\n <span class=\"text-muted-foreground text-xs\">{socialProof.text}</span>\n </div>\n </div>\n </div>\n <Image\n src={image.src}\n alt={image.alt}\n class=\"aspect-[4/3] w-full rounded-xl border object-cover\"\n widths={[640, 960, 1280]}\n sizes=\"(min-width: 1024px) 60vw, 100vw\"\n loading=\"eager\"\n />\n </SectionContainer>\n</Section>\n",
17
19
  "type": "registry:block"
18
20
  }
19
21
  ],
22
+ "docs": "https://ui.full.dev/blocks/hero/",
23
+ "categories": [
24
+ "hero"
25
+ ],
20
26
  "type": "registry:block"
21
27
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "hero-8",
4
+ "title": "Hero 8",
5
+ "description": "Hero sections for launches, product storytelling, editorial pages, and social proof.",
4
6
  "registryDependencies": [
5
7
  "@fulldev/button",
6
8
  "@fulldev/section"
@@ -8,9 +10,13 @@
8
10
  "files": [
9
11
  {
10
12
  "path": "src/components/blocks/hero-8.astro",
11
- "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\n\ntype Props = {\n class?: string\n title: string\n description: string\n buttons: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n image: {\n src: ImageMetadata\n alt: string\n }\n}\n\nconst { class: className, title, description, buttons, image } = Astro.props\n---\n\n<Section class={cn(\"\", className)}>\n <SectionContainer\n class=\"grid gap-12 lg:grid-cols-[1fr_3fr] lg:items-center lg:gap-0\"\n >\n <div class=\"flex flex-col gap-6 lg:pr-12\">\n <div class=\"flex flex-col gap-4\">\n <h1\n class=\"text-foreground text-4xl leading-[1.1] font-semibold tracking-tight text-balance sm:text-5xl\"\n >\n {title}\n </h1>\n <p class=\"text-muted-foreground text-lg leading-relaxed\">\n {description}\n </p>\n </div>\n <div class=\"flex flex-wrap gap-3\">\n {\n buttons.map(({ href, label, ...button }, index) => (\n <Button\n as=\"a\"\n href={href}\n size=\"lg\"\n variant={\n button.variant ?? (index === 0 ? \"default\" : \"secondary\")\n }\n {...button}\n >\n {label}\n </Button>\n ))\n }\n </div>\n </div>\n <Image\n src={image.src}\n alt={image.alt}\n class=\"aspect-[4/3] w-full rounded-xl border object-cover\"\n widths={[640, 960, 1280]}\n sizes=\"(min-width: 1024px) 75vw, 100vw\"\n loading=\"eager\"\n />\n </SectionContainer>\n</Section>\n",
13
+ "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\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 image: {\n src: ImageMetadata\n alt: string\n }\n}\n\nconst {\n class: className,\n title,\n description,\n buttons,\n image,\n ...props\n} = Astro.props\n---\n\n<Section class={cn(\"\", className)} {...props}>\n <SectionContainer\n class=\"grid gap-12 lg:grid-cols-[1fr_3fr] lg:items-center lg:gap-0\"\n >\n <div class=\"flex flex-col gap-6 lg:pr-12\">\n <div class=\"flex flex-col gap-4\">\n <h1\n class=\"text-foreground text-4xl leading-[1.1] font-semibold tracking-tight text-balance sm:text-5xl\"\n >\n {title}\n </h1>\n <p class=\"text-muted-foreground text-lg leading-relaxed\">\n {description}\n </p>\n </div>\n <div class=\"flex flex-wrap gap-3\">\n {\n buttons.map(({ href, label, ...button }, index) => (\n <Button\n as=\"a\"\n href={href}\n size=\"lg\"\n variant={\n button.variant ?? (index === 0 ? \"default\" : \"secondary\")\n }\n {...button}\n >\n {label}\n </Button>\n ))\n }\n </div>\n </div>\n <Image\n src={image.src}\n alt={image.alt}\n class=\"aspect-[4/3] w-full rounded-xl border object-cover\"\n widths={[640, 960, 1280]}\n sizes=\"(min-width: 1024px) 75vw, 100vw\"\n loading=\"eager\"\n />\n </SectionContainer>\n</Section>\n",
12
14
  "type": "registry:block"
13
15
  }
14
16
  ],
17
+ "docs": "https://ui.full.dev/blocks/hero/",
18
+ "categories": [
19
+ "hero"
20
+ ],
15
21
  "type": "registry:block"
16
22
  }