fulldev-ui 0.10.1 → 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 (248) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +7 -1
  3. package/package.json +6 -4
  4. package/public/r/accordion.json +7 -1
  5. package/public/r/alert-dialog.json +7 -1
  6. package/public/r/alert.json +6 -0
  7. package/public/r/article-1.json +7 -1
  8. package/public/r/article-2.json +7 -1
  9. package/public/r/articles-1.json +7 -1
  10. package/public/r/articles-2.json +7 -1
  11. package/public/r/articles-3.json +7 -1
  12. package/public/r/articles-4.json +7 -1
  13. package/public/r/avatar.json +6 -0
  14. package/public/r/badge.json +6 -0
  15. package/public/r/banner-1.json +7 -1
  16. package/public/r/banner-2.json +7 -1
  17. package/public/r/banner.json +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 +7 -1
  45. package/public/r/doc-1.json +7 -1
  46. package/public/r/dropdown-menu.json +7 -1
  47. package/public/r/empty.json +6 -0
  48. package/public/r/faqs-1.json +7 -1
  49. package/public/r/faqs-2.json +7 -1
  50. package/public/r/faqs-3.json +7 -1
  51. package/public/r/faqs-4.json +7 -1
  52. package/public/r/features-1.json +7 -1
  53. package/public/r/features-2.json +7 -1
  54. package/public/r/features-3.json +7 -1
  55. package/public/r/features-4.json +7 -1
  56. package/public/r/features-5.json +7 -1
  57. package/public/r/features-6.json +7 -1
  58. package/public/r/field.json +6 -0
  59. package/public/r/footer-1.json +7 -1
  60. package/public/r/footer-2.json +7 -1
  61. package/public/r/footer-3.json +7 -1
  62. package/public/r/form.json +6 -0
  63. package/public/r/header-1.json +7 -1
  64. package/public/r/header-2.json +7 -1
  65. package/public/r/header-3.json +7 -1
  66. package/public/r/header-4.json +7 -1
  67. package/public/r/header-5.json +7 -1
  68. package/public/r/header.json +6 -0
  69. package/public/r/hero-1.json +7 -1
  70. package/public/r/hero-10.json +7 -1
  71. package/public/r/hero-11.json +7 -1
  72. package/public/r/hero-12.json +7 -1
  73. package/public/r/hero-13.json +7 -1
  74. package/public/r/hero-2.json +7 -1
  75. package/public/r/hero-3.json +7 -1
  76. package/public/r/hero-4.json +7 -1
  77. package/public/r/hero-5.json +7 -1
  78. package/public/r/hero-6.json +7 -1
  79. package/public/r/hero-7.json +7 -1
  80. package/public/r/hero-8.json +7 -1
  81. package/public/r/hero-9.json +7 -1
  82. package/public/r/hover-card.json +7 -1
  83. package/public/r/icon.json +7 -1
  84. package/public/r/init.json +28 -0
  85. package/public/r/input-group.json +6 -0
  86. package/public/r/input.json +6 -0
  87. package/public/r/item.json +6 -0
  88. package/public/r/kbd.json +6 -0
  89. package/public/r/label.json +6 -0
  90. package/public/r/layout.json +6 -0
  91. package/public/r/links-2.json +7 -1
  92. package/public/r/logo.json +6 -0
  93. package/public/r/logos-1.json +7 -1
  94. package/public/r/logos-2.json +7 -1
  95. package/public/r/logos-3.json +7 -1
  96. package/public/r/marquee.json +6 -0
  97. package/public/r/native-select.json +6 -0
  98. package/public/r/navigation-menu.json +7 -1
  99. package/public/r/popover.json +7 -1
  100. package/public/r/price.json +6 -0
  101. package/public/r/pricing-1.json +7 -1
  102. package/public/r/pricing-2.json +7 -1
  103. package/public/r/pricing-3.json +7 -1
  104. package/public/r/product-1.json +7 -1
  105. package/public/r/products-1.json +7 -1
  106. package/public/r/products-2.json +7 -1
  107. package/public/r/products-3.json +7 -1
  108. package/public/r/products-4.json +7 -1
  109. package/public/r/products-5.json +7 -1
  110. package/public/r/radio-group.json +7 -1
  111. package/public/r/rating.json +6 -0
  112. package/public/r/registry.json +1645 -457
  113. package/public/r/reviews-1.json +7 -1
  114. package/public/r/reviews-2.json +7 -1
  115. package/public/r/reviews-3.json +7 -1
  116. package/public/r/reviews-4.json +7 -1
  117. package/public/r/reviews-5.json +7 -1
  118. package/public/r/section.json +18 -2
  119. package/public/r/select.json +6 -0
  120. package/public/r/separator.json +6 -0
  121. package/public/r/services-1.json +7 -1
  122. package/public/r/services-2.json +7 -1
  123. package/public/r/services-3.json +7 -1
  124. package/public/r/services-4.json +7 -1
  125. package/public/r/services-5.json +7 -1
  126. package/public/r/services-6.json +7 -1
  127. package/public/r/services-7.json +7 -1
  128. package/public/r/sheet.json +8 -2
  129. package/public/r/sidebar-1.json +5 -0
  130. package/public/r/sidebar.json +6 -0
  131. package/public/r/skeleton.json +6 -0
  132. package/public/r/slider.json +7 -1
  133. package/public/r/spinner.json +6 -0
  134. package/public/r/switch.json +7 -1
  135. package/public/r/table.json +6 -0
  136. package/public/r/tabs.json +7 -1
  137. package/public/r/textarea.json +6 -0
  138. package/public/r/theme-toggle.json +6 -0
  139. package/public/r/toc.json +6 -0
  140. package/public/r/toggle.json +7 -1
  141. package/public/r/tooltip.json +7 -1
  142. package/public/r/typography.json +6 -0
  143. package/public/r/video.json +6 -0
  144. package/registry/init/global.css +187 -0
  145. package/registry.json +1137 -454
  146. package/src/components/blocks/article-1.astro +4 -3
  147. package/src/components/blocks/article-2.astro +4 -3
  148. package/src/components/blocks/articles-1.astro +18 -9
  149. package/src/components/blocks/articles-2.astro +4 -3
  150. package/src/components/blocks/articles-3.astro +11 -9
  151. package/src/components/blocks/articles-4.astro +11 -4
  152. package/src/components/blocks/banner-1.astro +4 -3
  153. package/src/components/blocks/banner-2.astro +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.astro +1 -0
  228. package/src/components/ui/alert-dialog/alert-dialog.astro +1 -0
  229. package/src/components/ui/collapsible/collapsible.astro +1 -0
  230. package/src/components/ui/dialog/dialog.astro +1 -0
  231. package/src/components/ui/dropdown-menu/dropdown-menu.astro +1 -0
  232. package/src/components/ui/hover-card/hover-card.astro +7 -3
  233. package/src/components/ui/icon/icon.astro +46 -29
  234. package/src/components/ui/navigation-menu/navigation-menu.astro +1 -0
  235. package/src/components/ui/popover/popover.astro +1 -0
  236. package/src/components/ui/radio-group/radio-group.astro +1 -0
  237. package/src/components/ui/section/index.ts +2 -0
  238. package/src/components/ui/section/section-container.astro +1 -0
  239. package/src/components/ui/section/section-description.astro +20 -0
  240. package/src/components/ui/section/section-title.astro +20 -0
  241. package/src/components/ui/sheet/sheet-close.astro +4 -2
  242. package/src/components/ui/sheet/sheet.astro +1 -0
  243. package/src/components/ui/slider/slider.astro +1 -0
  244. package/src/components/ui/switch/switch.astro +1 -0
  245. package/src/components/ui/tabs/tabs.astro +1 -0
  246. package/src/components/ui/toggle/toggle.astro +1 -0
  247. package/src/components/ui/tooltip/tooltip.astro +1 -0
  248. 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": "hero-9",
4
+ "title": "Hero 9",
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-9.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(\"dark bg-background\", className)}>\n <SectionContainer class=\"grid gap-12 lg:grid-cols-2 lg:items-center\">\n <div class=\"relative z-10 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-foreground/80 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 <div\n class=\"bg-background pointer-events-none absolute inset-0 lg:mask-l-from-30%\"\n >\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",
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(\"dark bg-background\", className)} {...props}>\n <SectionContainer class=\"grid gap-12 lg:grid-cols-2 lg:items-center\">\n <div class=\"relative z-10 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-foreground/80 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 <div\n class=\"bg-background pointer-events-none absolute inset-0 lg:mask-l-from-30%\"\n >\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",
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": "hover-card",
4
+ "title": "Hover Card",
5
+ "description": "For sighted users to preview content available behind a link.",
4
6
  "dependencies": [
5
7
  "@data-slot/hover-card",
6
8
  "@data-slot/core"
@@ -8,7 +10,7 @@
8
10
  "files": [
9
11
  {
10
12
  "path": "src/components/ui/hover-card/hover-card.astro",
11
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n defaultOpen?: boolean\n open?: boolean\n delay?: number\n skipDelayDuration?: number\n closeDelay?: number\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n align?: \"start\" | \"center\" | \"end\"\n sideOffset?: number\n alignOffset?: number\n avoidCollisions?: boolean\n collisionPadding?: number\n portal?: boolean\n closeOnClickOutside?: boolean\n closeOnEscape?: boolean\n}\n\nconst {\n class: className,\n defaultOpen,\n open,\n delay = 700,\n skipDelayDuration = 300,\n closeDelay = 300,\n side = \"bottom\",\n align = \"center\",\n sideOffset = 4,\n alignOffset = 0,\n avoidCollisions = true,\n collisionPadding = 8,\n portal = true,\n closeOnClickOutside = true,\n closeOnEscape = true,\n ...props\n} = Astro.props\n---\n\n<div\n data-slot=\"hover-card\"\n data-default-open={defaultOpen}\n data-controlled-open={open}\n data-delay={delay}\n data-skip-delay-duration={skipDelayDuration}\n data-close-delay={closeDelay}\n data-side={side}\n data-align={align}\n data-side-offset={sideOffset}\n data-align-offset={alignOffset}\n data-avoid-collisions={avoidCollisions}\n data-collision-padding={collisionPadding}\n data-portal={portal}\n data-close-on-click-outside={closeOnClickOutside}\n data-close-on-escape={closeOnEscape}\n class={cn(className)}\n {...props}\n>\n <slot />\n</div>\n\n<script>\n import { getDataBool } from \"@data-slot/core\"\n import { createHoverCard } from \"@data-slot/hover-card\"\n\n document.querySelectorAll('[data-slot=\"hover-card\"]').forEach((root) => {\n createHoverCard(root, { open: getDataBool(root, \"controlledOpen\") })\n })\n</script>\n",
13
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n defaultOpen?: boolean\n open?: boolean\n delay?: number\n skipDelayDuration?: number\n closeDelay?: number\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n align?: \"start\" | \"center\" | \"end\"\n sideOffset?: number\n alignOffset?: number\n avoidCollisions?: boolean\n collisionPadding?: number\n portal?: boolean\n closeOnClickOutside?: boolean\n closeOnEscape?: boolean\n}\n\nconst {\n class: className,\n defaultOpen,\n open,\n delay = 700,\n skipDelayDuration = 300,\n closeDelay = 300,\n side = \"bottom\",\n align = \"center\",\n sideOffset = 4,\n alignOffset = 0,\n avoidCollisions = true,\n collisionPadding = 8,\n portal = true,\n closeOnClickOutside = true,\n closeOnEscape = true,\n ...props\n} = Astro.props\n---\n\n<div\n data-slot=\"hover-card\"\n data-default-open={defaultOpen}\n data-controlled-open={open}\n data-delay={delay}\n data-skip-delay-duration={skipDelayDuration}\n data-close-delay={closeDelay}\n data-side={side}\n data-align={align}\n data-side-offset={sideOffset}\n data-align-offset={alignOffset}\n data-avoid-collisions={avoidCollisions}\n data-collision-padding={collisionPadding}\n data-portal={portal}\n data-close-on-click-outside={closeOnClickOutside}\n data-close-on-escape={closeOnEscape}\n class={cn(className)}\n {...props}\n>\n <slot />\n</div>\n\n<script>\n import { getDataBool } from \"@data-slot/core\"\n import { createHoverCard } from \"@data-slot/hover-card\"\n\n const initialize = () => {\n document.querySelectorAll('[data-slot=\"hover-card\"]').forEach((root) => {\n createHoverCard(root, { open: getDataBool(root, \"controlledOpen\") })\n })\n }\n initialize()\n document.addEventListener(\"astro:page-load\", initialize)\n</script>\n",
12
14
  "type": "registry:ui"
13
15
  },
14
16
  {
@@ -27,5 +29,9 @@
27
29
  "type": "registry:ui"
28
30
  }
29
31
  ],
32
+ "docs": "https://ui.full.dev/components/hover-card/",
33
+ "categories": [
34
+ "ui"
35
+ ],
30
36
  "type": "registry:ui"
31
37
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "icon",
4
+ "title": "Icon",
5
+ "description": "Render Fulldev content icons or use Lucide and Simple Icons directly in Astro.",
4
6
  "dependencies": [
5
7
  "lucide-static",
6
8
  "simple-icons"
@@ -8,7 +10,7 @@
8
10
  "files": [
9
11
  {
10
12
  "path": "src/components/ui/icon/icon.astro",
11
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\ntype Props = Omit<HTMLAttributes<\"svg\">, \"name\" | \"href\"> & {\n href?: HTMLAttributes<\"a\">[\"href\"]\n name?: string | number\n}\n\nconst { name, href, ...props } = Astro.props\n\nconst hrefMap = {\n \"x.com\": \"x\",\n twitter: \"twitter\",\n facebook: \"facebook\",\n instagram: \"instagram\",\n pinterest: \"pinterest\",\n youtube: \"youtube\",\n tiktok: \"tiktok\",\n snapchat: \"snapchat\",\n reddit: \"reddit\",\n tumblr: \"tumblr\",\n \"wa.me\": \"whatsapp\",\n telegram: \"telegram\",\n discord: \"discord\",\n vimeo: \"vimeo\",\n flickr: \"flickr\",\n yelp: \"yelp\",\n spotify: \"spotify\",\n behance: \"behance\",\n dribbble: \"dribbble\",\n soundcloud: \"soundcloud\",\n github: \"github\",\n twitch: \"twitch\",\n \"tel:\": \"phone\",\n \"mailto:\": \"mail\",\n \"maps.app.goo.gl\": \"map-pin\",\n linkedin: \"linkedin\",\n} as const\n\nconst icons = import.meta.glob([\n \"node_modules/lucide-static/icons/*.svg\",\n \"node_modules/simple-icons/icons/*.svg\",\n])\n\nconst foundPath = () => {\n let foundPath: string | undefined = undefined\n\n // For x.com, use the Simple Icons X instead of Lucide's X icon.\n if (name === \"x.com\") {\n foundPath = \"/node_modules/simple-icons/icons/x.svg\"\n } else if (name) {\n foundPath = Object.keys(icons).find((key) => key.includes(`/${name}.svg`))\n } else if (href) {\n const hrefKey = Object.keys(hrefMap).find((key) =>\n href.toString().includes(key)\n )\n const hrefValue = hrefMap[hrefKey as keyof typeof hrefMap]\n foundPath = Object.keys(icons)\n .reverse()\n .find((key) => key.includes(`/${hrefValue}.svg`))\n }\n\n return foundPath\n}\n\nconst foundModule = foundPath() && icons[foundPath() as keyof typeof icons]\nconst module = foundModule && ((await foundModule()) as any)\nconst Comp = module?.default\n---\n\n{\n Comp && foundPath()?.includes(\"simple-icons\") && (\n <Comp\n height={24}\n width={24}\n fill=\"currentColor\"\n class=\"size-[1em] text-base\"\n {...props}\n />\n )\n}\n\n{\n Comp && foundPath()?.includes(\"lucide-static\") && (\n <Comp height={24} width={24} class=\"size-[1em] text-base\" {...props} />\n )\n}\n",
13
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\ntype Props = Omit<HTMLAttributes<\"svg\">, \"name\" | \"href\"> & {\n href?: HTMLAttributes<\"a\">[\"href\"]\n name?: string | number\n}\n\nconst { name, href, ...props } = Astro.props\n\nconst hrefMap = {\n \"x.com\": \"x\",\n twitter: \"twitter\",\n facebook: \"facebook\",\n instagram: \"instagram\",\n pinterest: \"pinterest\",\n youtube: \"youtube\",\n tiktok: \"tiktok\",\n snapchat: \"snapchat\",\n reddit: \"reddit\",\n tumblr: \"tumblr\",\n \"wa.me\": \"whatsapp\",\n telegram: \"telegram\",\n discord: \"discord\",\n vimeo: \"vimeo\",\n flickr: \"flickr\",\n yelp: \"yelp\",\n spotify: \"spotify\",\n behance: \"behance\",\n dribbble: \"dribbble\",\n soundcloud: \"soundcloud\",\n github: \"github\",\n twitch: \"twitch\",\n \"tel:\": \"phone\",\n \"mailto:\": \"mail\",\n \"maps.app.goo.gl\": \"map-pin\",\n linkedin: \"linkedin\",\n} as const\n\ntype Source = \"lucide\" | \"simple\"\n\nconst icons: Record<Source, Record<string, () => Promise<unknown>>> = {\n lucide: import.meta.glob(\"/node_modules/lucide-static/icons/*.svg\"),\n simple: import.meta.glob(\"/node_modules/simple-icons/icons/*.svg\"),\n}\n\nconst pathFor = (source: Source, icon: string) =>\n source === \"lucide\"\n ? `/node_modules/lucide-static/icons/${icon}.svg`\n : `/node_modules/simple-icons/icons/${icon}.svg`\n\n// Resolve an icon by explicit name, or derive one from a link href.\n// Names may be prefixed with `lucide:` or `simple:` to pick a set when both\n// sets contain the same name (for example `github` or `figma`).\nconst resolve = () => {\n let key = name != null && name !== \"\" ? String(name) : undefined\n let order: Source[] = [\"lucide\", \"simple\"]\n\n if (!key && href) {\n const hrefKey = Object.keys(hrefMap).find((candidate) =>\n href.toString().includes(candidate)\n )\n if (hrefKey) {\n key = hrefMap[hrefKey as keyof typeof hrefMap]\n order = [\"simple\", \"lucide\"]\n }\n }\n\n if (!key) return undefined\n if (key === \"x.com\") key = \"simple:x\"\n\n const [prefix, icon] = key.includes(\":\") ? key.split(\":\") : [undefined, key]\n if (prefix === \"lucide\" || prefix === \"simple\") order = [prefix]\n\n for (const source of order) {\n const path = pathFor(source, icon)\n if (path in icons[source]) return { source, path }\n }\n\n return undefined\n}\n\nconst resolved = resolve()\nconst module = resolved\n ? ((await icons[resolved.source][resolved.path]()) as { default?: any })\n : undefined\nconst Comp = module?.default\n\nconst isLabelled =\n \"aria-label\" in props || \"aria-labelledby\" in props || \"role\" in props\n---\n\n{\n Comp && resolved && (\n <Comp\n height={24}\n width={24}\n fill={resolved.source === \"simple\" ? \"currentColor\" : \"none\"}\n class=\"size-[1em] text-base\"\n aria-hidden={isLabelled ? undefined : \"true\"}\n {...props}\n />\n )\n}\n",
12
14
  "type": "registry:ui"
13
15
  },
14
16
  {
@@ -17,5 +19,9 @@
17
19
  "type": "registry:ui"
18
20
  }
19
21
  ],
22
+ "docs": "https://ui.full.dev/components/icon/",
23
+ "categories": [
24
+ "ui"
25
+ ],
20
26
  "type": "registry:ui"
21
27
  }
@@ -0,0 +1,28 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "init",
4
+ "title": "Init",
5
+ "description": "Shared setup: class helper, Tailwind token layer, and dependencies.",
6
+ "dependencies": [
7
+ "class-variance-authority",
8
+ "clsx",
9
+ "shadcn",
10
+ "tailwind-merge",
11
+ "tw-animate-css"
12
+ ],
13
+ "files": [
14
+ {
15
+ "path": "src/lib/utils.ts",
16
+ "content": "import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n",
17
+ "type": "registry:lib"
18
+ },
19
+ {
20
+ "path": "registry/init/global.css",
21
+ "content": "@import \"tailwindcss\";\n@import \"tw-animate-css\";\n@import \"shadcn/tailwind.css\";\n\n@custom-variant dark (&:where(.dark, .dark *));\n\n:root {\n --background: oklch(1 0 0);\n --foreground: oklch(0.145 0 0);\n --card: oklch(1 0 0);\n --card-foreground: oklch(0.145 0 0);\n --popover: oklch(1 0 0);\n --popover-foreground: oklch(0.145 0 0);\n --primary: oklch(0.5488 0.2498 261.783);\n --primary-foreground: oklch(1 0 0);\n --secondary: oklch(0.97 0 0);\n --secondary-foreground: oklch(0.205 0 0);\n --muted: oklch(0.97 0 0);\n --muted-foreground: oklch(0.556 0 0);\n --accent: oklch(0.97 0 0);\n --accent-foreground: oklch(0.205 0 0);\n --destructive: oklch(0.577 0.245 27.325);\n --destructive-foreground: oklch(1 0 0);\n --border: oklch(0.922 0 0);\n --input: oklch(0.922 0 0);\n --ring: oklch(0.708 0 0);\n --chart-1: oklch(0.81 0.1 252);\n --chart-2: oklch(0.62 0.19 260);\n --chart-3: oklch(0.55 0.22 263);\n --chart-4: oklch(0.49 0.22 264);\n --chart-5: oklch(0.42 0.18 266);\n --sidebar: oklch(0.985 0 0);\n --sidebar-foreground: oklch(0.145 0 0);\n --sidebar-primary: oklch(0.5488 0.2498 261.783);\n --sidebar-primary-foreground: oklch(1 0 0);\n --sidebar-accent: oklch(0.97 0 0);\n --sidebar-accent-foreground: oklch(0.205 0 0);\n --sidebar-border: oklch(0.922 0 0);\n --sidebar-ring: oklch(0.708 0 0);\n --radius: 0.625rem;\n --shadow-x: 0;\n --shadow-y: 1px;\n --shadow-blur: 3px;\n --shadow-spread: 0px;\n --shadow-opacity: 0.1;\n --shadow-color: oklch(0 0 0);\n --shadow-2xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05);\n --shadow-xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05);\n --shadow-sm:\n 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);\n --shadow: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);\n --shadow-md:\n 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 2px 4px -1px hsl(0 0% 0% / 0.1);\n --shadow-lg:\n 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 4px 6px -1px hsl(0 0% 0% / 0.1);\n --shadow-xl:\n 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 8px 10px -1px hsl(0 0% 0% / 0.1);\n --shadow-2xl: 0 1px 3px 0px hsl(0 0% 0% / 0.25);\n --tracking-normal: 0em;\n --spacing: 0.25rem;\n}\n\n.dark {\n --background: oklch(0.145 0 0);\n --foreground: oklch(0.985 0 0);\n --card: oklch(0.205 0 0);\n --card-foreground: oklch(0.985 0 0);\n --popover: oklch(0.269 0 0);\n --popover-foreground: oklch(0.985 0 0);\n --primary: oklch(0.686 0.2105 41.139);\n --primary-foreground: oklch(1 0 0);\n --secondary: oklch(0.269 0 0);\n --secondary-foreground: oklch(0.985 0 0);\n --muted: oklch(0.269 0 0);\n --muted-foreground: oklch(0.708 0 0);\n --accent: oklch(0.371 0 0);\n --accent-foreground: oklch(0.985 0 0);\n --destructive: oklch(0.704 0.191 22.216);\n --destructive-foreground: oklch(0.985 0 0);\n --border: oklch(0.275 0 0);\n --input: oklch(0.325 0 0);\n --ring: oklch(0.556 0 0);\n --chart-1: oklch(0.81 0.1 252);\n --chart-2: oklch(0.62 0.19 260);\n --chart-3: oklch(0.55 0.22 263);\n --chart-4: oklch(0.49 0.22 264);\n --chart-5: oklch(0.42 0.18 266);\n --sidebar: oklch(0.205 0 0);\n --sidebar-foreground: oklch(0.985 0 0);\n --sidebar-primary: oklch(0.686 0.2105 41.139);\n --sidebar-primary-foreground: oklch(1 0 0);\n --sidebar-accent: oklch(0.269 0 0);\n --sidebar-accent-foreground: oklch(0.985 0 0);\n --sidebar-border: oklch(0.275 0 0);\n --sidebar-ring: oklch(0.439 0 0);\n --radius: 0.625rem;\n --shadow-x: 0;\n --shadow-y: 1px;\n --shadow-blur: 3px;\n --shadow-spread: 0px;\n --shadow-opacity: 0.1;\n --shadow-color: oklch(0 0 0);\n --shadow-2xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05);\n --shadow-xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05);\n --shadow-sm:\n 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);\n --shadow: 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 1px 2px -1px hsl(0 0% 0% / 0.1);\n --shadow-md:\n 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 2px 4px -1px hsl(0 0% 0% / 0.1);\n --shadow-lg:\n 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 4px 6px -1px hsl(0 0% 0% / 0.1);\n --shadow-xl:\n 0 1px 3px 0px hsl(0 0% 0% / 0.1), 0 8px 10px -1px hsl(0 0% 0% / 0.1);\n --shadow-2xl: 0 1px 3px 0px hsl(0 0% 0% / 0.25);\n}\n\n@theme inline {\n --color-background: var(--background);\n --color-foreground: var(--foreground);\n --color-card: var(--card);\n --color-card-foreground: var(--card-foreground);\n --color-popover: var(--popover);\n --color-popover-foreground: var(--popover-foreground);\n --color-primary: var(--primary);\n --color-primary-foreground: var(--primary-foreground);\n --color-secondary: var(--secondary);\n --color-secondary-foreground: var(--secondary-foreground);\n --color-muted: var(--muted);\n --color-muted-foreground: var(--muted-foreground);\n --color-accent: var(--accent);\n --color-accent-foreground: var(--accent-foreground);\n --color-destructive: var(--destructive);\n --color-destructive-foreground: var(--destructive-foreground);\n --color-border: var(--border);\n --color-input: var(--input);\n --color-ring: var(--ring);\n --color-chart-1: var(--chart-1);\n --color-chart-2: var(--chart-2);\n --color-chart-3: var(--chart-3);\n --color-chart-4: var(--chart-4);\n --color-chart-5: var(--chart-5);\n --color-sidebar: var(--sidebar);\n --color-sidebar-foreground: var(--sidebar-foreground);\n --color-sidebar-primary: var(--sidebar-primary);\n --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);\n --color-sidebar-accent: var(--sidebar-accent);\n --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);\n --color-sidebar-border: var(--sidebar-border);\n --color-sidebar-ring: var(--sidebar-ring);\n\n --radius-sm: calc(var(--radius) - 4px);\n --radius-md: calc(var(--radius) - 2px);\n --radius-lg: var(--radius);\n --radius-xl: calc(var(--radius) + 4px);\n\n --shadow-2xs: var(--shadow-2xs);\n --shadow-xs: var(--shadow-xs);\n --shadow-sm: var(--shadow-sm);\n --shadow: var(--shadow);\n --shadow-md: var(--shadow-md);\n --shadow-lg: var(--shadow-lg);\n --shadow-xl: var(--shadow-xl);\n --shadow-2xl: var(--shadow-2xl);\n}\n\n@layer base {\n * {\n @apply border-border outline-ring/50;\n }\n html {\n @apply font-sans;\n }\n body {\n @apply bg-background text-foreground font-sans;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n *,\n ::before,\n ::after {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.01ms !important;\n scroll-behavior: auto !important;\n }\n}\n",
22
+ "type": "registry:style",
23
+ "target": "src/styles/global.css"
24
+ }
25
+ ],
26
+ "docs": "https://ui.full.dev/docs/installation/",
27
+ "type": "registry:base"
28
+ }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "input-group",
4
+ "title": "Input Group",
5
+ "description": "Add addons, buttons, and helper content to inputs.",
4
6
  "registryDependencies": [
5
7
  "@fulldev/button",
6
8
  "@fulldev/dropdown-menu",
@@ -44,5 +46,9 @@
44
46
  "type": "registry:ui"
45
47
  }
46
48
  ],
49
+ "docs": "https://ui.full.dev/components/input-group/",
50
+ "categories": [
51
+ "ui"
52
+ ],
47
53
  "type": "registry:ui"
48
54
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "input",
4
+ "title": "Input",
5
+ "description": "Displays a form input field or a component that looks like an input field.",
4
6
  "files": [
5
7
  {
6
8
  "path": "src/components/ui/input/input.astro",
@@ -13,5 +15,9 @@
13
15
  "type": "registry:ui"
14
16
  }
15
17
  ],
18
+ "docs": "https://ui.full.dev/components/input/",
19
+ "categories": [
20
+ "ui"
21
+ ],
16
22
  "type": "registry:ui"
17
23
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "item",
4
+ "title": "Item",
5
+ "description": "A flexible container for displaying content items with various styles.",
4
6
  "files": [
5
7
  {
6
8
  "path": "src/components/ui/item/item.astro",
@@ -43,5 +45,9 @@
43
45
  "type": "registry:ui"
44
46
  }
45
47
  ],
48
+ "docs": "https://ui.full.dev/components/item/",
49
+ "categories": [
50
+ "ui"
51
+ ],
46
52
  "type": "registry:ui"
47
53
  }
package/public/r/kbd.json CHANGED
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "kbd",
4
+ "title": "Kbd",
5
+ "description": "Used to display textual user input from keyboard.",
4
6
  "files": [
5
7
  {
6
8
  "path": "src/components/ui/kbd/kbd.astro",
@@ -18,5 +20,9 @@
18
20
  "type": "registry:ui"
19
21
  }
20
22
  ],
23
+ "docs": "https://ui.full.dev/components/kbd/",
24
+ "categories": [
25
+ "ui"
26
+ ],
21
27
  "type": "registry:ui"
22
28
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "label",
4
+ "title": "Label",
5
+ "description": "Renders an accessible label associated with a control.",
4
6
  "files": [
5
7
  {
6
8
  "path": "src/components/ui/label/label.astro",
@@ -13,5 +15,9 @@
13
15
  "type": "registry:ui"
14
16
  }
15
17
  ],
18
+ "docs": "https://ui.full.dev/components/label/",
19
+ "categories": [
20
+ "ui"
21
+ ],
16
22
  "type": "registry:ui"
17
23
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "layout",
4
+ "title": "Layout",
5
+ "description": "Page-shell primitives for the root html, head, body, and main structure.",
4
6
  "files": [
5
7
  {
6
8
  "path": "src/components/ui/layout/layout.astro",
@@ -28,5 +30,9 @@
28
30
  "type": "registry:ui"
29
31
  }
30
32
  ],
33
+ "docs": "https://ui.full.dev/components/layout/",
34
+ "categories": [
35
+ "ui"
36
+ ],
31
37
  "type": "registry:ui"
32
38
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "links-2",
4
+ "title": "Links 2",
5
+ "description": "Link carousel blocks for presenting related pages, components, or resources.",
4
6
  "dependencies": [
5
7
  "@lucide/astro"
6
8
  ],
@@ -15,9 +17,13 @@
15
17
  "files": [
16
18
  {
17
19
  "path": "src/components/blocks/links-2.astro",
18
- "content": "---\nimport ArrowRightIcon from \"@lucide/astro/icons/arrow-right\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\n\ntype Props = {\n class?: string\n title: string\n description: string\n links: {\n href: string\n title: string\n description: string\n preview?: string\n }[]\n}\n\nconst { class: className, title, description, links } = Astro.props\n---\n\n<Section class={cn(\"\", className)}>\n <SectionContainer class=\"gap-10\">\n <div class=\"flex min-w-0 flex-col gap-4 border-b pb-8\">\n <h2\n class=\"text-foreground text-2xl font-semibold tracking-tight text-balance sm:text-3xl\"\n >\n {title}\n </h2>\n <p class=\"text-muted-foreground max-w-2xl text-base leading-7\">\n {description}\n </p>\n </div>\n\n <div class=\"grid gap-2 md:grid-cols-2 xl:grid-cols-3\">\n {\n links.map((item) => (\n <a\n href={item.href}\n class=\"bg-muted/40 hover:bg-muted/60 focus-visible:ring-ring/50 group/link rounded-lg px-4 py-4 transition-colors focus-visible:ring-2 focus-visible:outline-none\"\n >\n <span class=\"flex min-w-0 items-center justify-between gap-3\">\n <span class=\"text-sm font-medium\">{item.title}</span>\n <ArrowRightIcon class=\"text-muted-foreground size-3.5 shrink-0 transition-transform group-hover/link:translate-x-0.5\" />\n </span>\n <span class=\"text-muted-foreground mt-1 block text-sm leading-6\">\n {item.description}\n </span>\n </a>\n ))\n }\n </div>\n </SectionContainer>\n</Section>\n",
20
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\nimport ArrowRightIcon from \"@lucide/astro/icons/arrow-right\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\n\ntype Props = HTMLAttributes<\"section\"> & {\n title: string\n description: string\n links: {\n href: string\n title: string\n description: string\n preview?: string\n }[]\n}\n\nconst { class: className, title, description, links, ...props } = Astro.props\n---\n\n<Section class={cn(\"\", className)} {...props}>\n <SectionContainer class=\"gap-10\">\n <div class=\"flex min-w-0 flex-col gap-4 border-b pb-8\">\n <h2\n class=\"text-foreground text-2xl font-semibold tracking-tight text-balance sm:text-3xl\"\n >\n {title}\n </h2>\n <p class=\"text-muted-foreground max-w-2xl text-base leading-7\">\n {description}\n </p>\n </div>\n\n <div class=\"grid gap-2 md:grid-cols-2 xl:grid-cols-3\">\n {\n links.map((item) => (\n <a\n href={item.href}\n class=\"bg-muted/40 hover:bg-muted/60 focus-visible:ring-ring/50 group/link rounded-lg px-4 py-4 transition-colors focus-visible:ring-2 focus-visible:outline-none\"\n >\n <span class=\"flex min-w-0 items-center justify-between gap-3\">\n <span class=\"text-sm font-medium\">{item.title}</span>\n <ArrowRightIcon class=\"text-muted-foreground size-3.5 shrink-0 transition-transform group-hover/link:translate-x-0.5\" />\n </span>\n <span class=\"text-muted-foreground mt-1 block text-sm leading-6\">\n {item.description}\n </span>\n </a>\n ))\n }\n </div>\n </SectionContainer>\n</Section>\n",
19
21
  "type": "registry:block"
20
22
  }
21
23
  ],
24
+ "docs": "https://ui.full.dev/blocks/links/",
25
+ "categories": [
26
+ "links"
27
+ ],
22
28
  "type": "registry:block"
23
29
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "logo",
4
+ "title": "Logo",
5
+ "description": "A component for displaying a brand logo.",
4
6
  "files": [
5
7
  {
6
8
  "path": "src/components/ui/logo/logo.astro",
@@ -23,5 +25,9 @@
23
25
  "type": "registry:ui"
24
26
  }
25
27
  ],
28
+ "docs": "https://ui.full.dev/components/logo/",
29
+ "categories": [
30
+ "ui"
31
+ ],
26
32
  "type": "registry:ui"
27
33
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "logos-1",
4
+ "title": "Logos 1",
5
+ "description": "Logo sections for trust, partner strips, and quiet social proof.",
4
6
  "registryDependencies": [
5
7
  "@fulldev/logo",
6
8
  "@fulldev/section"
@@ -8,9 +10,13 @@
8
10
  "files": [
9
11
  {
10
12
  "path": "src/components/blocks/logos-1.astro",
11
- "content": "---\nimport { cn } from \"@/lib/utils\"\nimport { Logo, LogoText } from \"@/components/ui/logo\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\n\ntype Props = {\n class?: string\n title: string\n description?: string\n brands: {\n name: string\n href?: string\n }[]\n}\n\nconst { class: className, title, description, brands } = Astro.props\n---\n\n<Section class={cn(\"\", className)}>\n <SectionContainer class=\"items-center gap-10 text-center\">\n <div class=\"flex max-w-2xl flex-col items-center gap-4\">\n <h2\n class=\"text-foreground text-3xl font-semibold tracking-tight text-balance sm:text-4xl\"\n >\n {title}\n </h2>\n {\n description && (\n <p class=\"text-muted-foreground text-lg leading-relaxed text-balance\">\n {description}\n </p>\n )\n }\n </div>\n <div\n class=\"text-muted-foreground flex w-full flex-wrap items-center justify-center gap-x-12 gap-y-6\"\n >\n {\n brands.map((brand) => (\n <Logo\n class=\"hover:text-foreground grayscale transition-all hover:grayscale-0\"\n href={brand.href}\n >\n <LogoText>{brand.name}</LogoText>\n </Logo>\n ))\n }\n </div>\n </SectionContainer>\n</Section>\n",
13
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Logo, LogoText } from \"@/components/ui/logo\"\nimport {\n Section,\n SectionContainer,\n SectionDescription,\n SectionTitle,\n} from \"@/components/ui/section\"\n\ntype Props = HTMLAttributes<\"section\"> & {\n title: string\n description?: string\n brands: {\n name: string\n href?: string\n }[]\n}\n\nconst { class: className, title, description, brands, ...props } = Astro.props\n---\n\n<Section class={cn(\"\", className)} {...props}>\n <SectionContainer class=\"items-center gap-10 text-center\">\n <div class=\"flex max-w-2xl flex-col items-center gap-4\">\n <SectionTitle>\n {title}\n </SectionTitle>\n {description && <SectionDescription>{description}</SectionDescription>}\n </div>\n <div\n class=\"text-muted-foreground flex w-full flex-wrap items-center justify-center gap-x-12 gap-y-6\"\n >\n {\n brands.map((brand) => (\n <Logo\n class=\"hover:text-foreground grayscale transition-all hover:grayscale-0\"\n href={brand.href}\n >\n <LogoText>{brand.name}</LogoText>\n </Logo>\n ))\n }\n </div>\n </SectionContainer>\n</Section>\n",
12
14
  "type": "registry:block"
13
15
  }
14
16
  ],
17
+ "docs": "https://ui.full.dev/blocks/logos/",
18
+ "categories": [
19
+ "logos"
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": "logos-2",
4
+ "title": "Logos 2",
5
+ "description": "Logo sections for trust, partner strips, and quiet social proof.",
4
6
  "registryDependencies": [
5
7
  "@fulldev/logo",
6
8
  "@fulldev/marquee",
@@ -9,9 +11,13 @@
9
11
  "files": [
10
12
  {
11
13
  "path": "src/components/blocks/logos-2.astro",
12
- "content": "---\nimport { cn } from \"@/lib/utils\"\nimport { Logo, LogoText } from \"@/components/ui/logo\"\nimport { Marquee } from \"@/components/ui/marquee\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\n\ntype Props = {\n class?: string\n title?: string\n description?: string\n brands: {\n name: string\n href?: string\n }[]\n}\n\nconst { class: className, title, description, brands } = Astro.props\n---\n\n<Section class={cn(\"\", className)}>\n {\n (title || description) && (\n <SectionContainer class=\"items-center gap-4 text-center\">\n {title && (\n <h2 class=\"text-foreground text-3xl font-semibold tracking-tight text-balance sm:text-4xl\">\n {title}\n </h2>\n )}\n {description && (\n <p class=\"text-muted-foreground max-w-2xl text-lg leading-relaxed text-balance\">\n {description}\n </p>\n )}\n </SectionContainer>\n )\n }\n <Marquee\n class=\"text-muted-foreground mask-x-from-90%\"\n gap=\"3rem\"\n duration=\"30s\"\n pauseOnHover\n infinite\n >\n {\n brands.map((brand) => (\n <Logo\n class=\"hover:text-foreground grayscale transition-all hover:grayscale-0\"\n href={brand.href}\n >\n <LogoText>{brand.name}</LogoText>\n </Logo>\n ))\n }\n </Marquee>\n</Section>\n",
14
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Logo, LogoText } from \"@/components/ui/logo\"\nimport { Marquee } from \"@/components/ui/marquee\"\nimport {\n Section,\n SectionContainer,\n SectionDescription,\n SectionTitle,\n} from \"@/components/ui/section\"\n\ntype Props = HTMLAttributes<\"section\"> & {\n title?: string\n description?: string\n brands: {\n name: string\n href?: string\n }[]\n}\n\nconst { class: className, title, description, brands, ...props } = Astro.props\n---\n\n<Section class={cn(\"\", className)} {...props}>\n {\n (title || description) && (\n <SectionContainer class=\"items-center gap-4 text-center\">\n {title && <SectionTitle>{title}</SectionTitle>}\n {description && (\n <SectionDescription class=\"max-w-2xl\">\n {description}\n </SectionDescription>\n )}\n </SectionContainer>\n )\n }\n <Marquee\n class=\"text-muted-foreground mask-x-from-90%\"\n gap=\"3rem\"\n duration=\"30s\"\n pauseOnHover\n infinite\n >\n {\n brands.map((brand) => (\n <Logo\n class=\"hover:text-foreground grayscale transition-all hover:grayscale-0\"\n href={brand.href}\n >\n <LogoText>{brand.name}</LogoText>\n </Logo>\n ))\n }\n </Marquee>\n</Section>\n",
13
15
  "type": "registry:block"
14
16
  }
15
17
  ],
18
+ "docs": "https://ui.full.dev/blocks/logos/",
19
+ "categories": [
20
+ "logos"
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": "logos-3",
4
+ "title": "Logos 3",
5
+ "description": "Logo sections for trust, partner strips, and quiet social proof.",
4
6
  "registryDependencies": [
5
7
  "@fulldev/logo",
6
8
  "@fulldev/section"
@@ -8,9 +10,13 @@
8
10
  "files": [
9
11
  {
10
12
  "path": "src/components/blocks/logos-3.astro",
11
- "content": "---\nimport { cn } from \"@/lib/utils\"\nimport { Logo, LogoText } from \"@/components/ui/logo\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\n\ntype Props = {\n class?: string\n brands: {\n name: string\n href?: string\n }[]\n}\n\nconst { class: className, brands } = Astro.props\n---\n\n<Section class={cn(\"py-12 lg:py-16\", className)}>\n <SectionContainer>\n <div\n class=\"text-muted-foreground flex flex-wrap items-center justify-center gap-x-12 gap-y-6\"\n >\n {\n brands.map((brand) => (\n <Logo\n class=\"hover:text-foreground grayscale transition-all hover:grayscale-0\"\n href={brand.href}\n >\n <LogoText>{brand.name}</LogoText>\n </Logo>\n ))\n }\n </div>\n </SectionContainer>\n</Section>\n",
13
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Logo, LogoText } from \"@/components/ui/logo\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\n\ntype Props = HTMLAttributes<\"section\"> & {\n brands: {\n name: string\n href?: string\n }[]\n}\n\nconst { class: className, brands, ...props } = Astro.props\n---\n\n<Section class={cn(\"py-12 lg:py-16\", className)} {...props}>\n <SectionContainer>\n <div\n class=\"text-muted-foreground flex flex-wrap items-center justify-center gap-x-12 gap-y-6\"\n >\n {\n brands.map((brand) => (\n <Logo\n class=\"hover:text-foreground grayscale transition-all hover:grayscale-0\"\n href={brand.href}\n >\n <LogoText>{brand.name}</LogoText>\n </Logo>\n ))\n }\n </div>\n </SectionContainer>\n</Section>\n",
12
14
  "type": "registry:block"
13
15
  }
14
16
  ],
17
+ "docs": "https://ui.full.dev/blocks/logos/",
18
+ "categories": [
19
+ "logos"
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": "marquee",
4
+ "title": "Marquee",
5
+ "description": "A continuous scrolling animation component for displaying content in a loop.",
4
6
  "files": [
5
7
  {
6
8
  "path": "src/components/ui/marquee/marquee.astro",
@@ -13,5 +15,9 @@
13
15
  "type": "registry:ui"
14
16
  }
15
17
  ],
18
+ "docs": "https://ui.full.dev/components/marquee/",
19
+ "categories": [
20
+ "ui"
21
+ ],
16
22
  "type": "registry:ui"
17
23
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "native-select",
4
+ "title": "Native Select",
5
+ "description": "A styled native HTML select element with consistent design system integration.",
4
6
  "dependencies": [
5
7
  "@lucide/astro"
6
8
  ],
@@ -26,5 +28,9 @@
26
28
  "type": "registry:ui"
27
29
  }
28
30
  ],
31
+ "docs": "https://ui.full.dev/components/native-select/",
32
+ "categories": [
33
+ "ui"
34
+ ],
29
35
  "type": "registry:ui"
30
36
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "navigation-menu",
4
+ "title": "Navigation Menu",
5
+ "description": "A collection of links for navigating websites.",
4
6
  "dependencies": [
5
7
  "@data-slot/navigation-menu",
6
8
  "@lucide/astro"
@@ -8,7 +10,7 @@
8
10
  "files": [
9
11
  {
10
12
  "path": "src/components/ui/navigation-menu/navigation-menu.astro",
11
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\nimport NavigationMenuPositioner from \"./navigation-menu-positioner.astro\"\n\ntype Props = HTMLAttributes<\"nav\"> & {\n delayOpen?: number\n delayClose?: number\n openOnFocus?: boolean\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n align?: \"start\" | \"center\" | \"end\"\n sideOffset?: number\n alignOffset?: number\n positionMethod?: \"absolute\" | \"fixed\"\n safeTriangle?: boolean\n debugSafeTriangle?: boolean\n}\n\nconst {\n class: className = \"\",\n delayOpen = 0,\n delayClose = 0,\n openOnFocus,\n side = \"bottom\",\n align = \"start\",\n sideOffset = 0,\n alignOffset = 0,\n positionMethod = \"absolute\",\n safeTriangle,\n debugSafeTriangle,\n ...props\n} = Astro.props\n---\n\n<nav\n {...props}\n data-slot=\"navigation-menu\"\n data-delay-open={delayOpen}\n data-delay-close={delayClose}\n data-open-on-focus={openOnFocus}\n data-side={side}\n data-align={align}\n data-side-offset={sideOffset}\n data-align-offset={alignOffset}\n data-position-method={positionMethod}\n data-safe-triangle={safeTriangle}\n data-debug-safe-triangle={debugSafeTriangle}\n class={cn(\n \"group/navigation-menu relative flex max-w-max flex-1 items-center justify-center\",\n className\n )}\n>\n <slot />\n <NavigationMenuPositioner align={align} />\n</nav>\n\n<script>\n import { create } from \"@data-slot/navigation-menu\"\n\n create()\n</script>\n",
13
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\nimport NavigationMenuPositioner from \"./navigation-menu-positioner.astro\"\n\ntype Props = HTMLAttributes<\"nav\"> & {\n delayOpen?: number\n delayClose?: number\n openOnFocus?: boolean\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n align?: \"start\" | \"center\" | \"end\"\n sideOffset?: number\n alignOffset?: number\n positionMethod?: \"absolute\" | \"fixed\"\n safeTriangle?: boolean\n debugSafeTriangle?: boolean\n}\n\nconst {\n class: className = \"\",\n delayOpen = 0,\n delayClose = 0,\n openOnFocus,\n side = \"bottom\",\n align = \"start\",\n sideOffset = 0,\n alignOffset = 0,\n positionMethod = \"absolute\",\n safeTriangle,\n debugSafeTriangle,\n ...props\n} = Astro.props\n---\n\n<nav\n {...props}\n data-slot=\"navigation-menu\"\n data-delay-open={delayOpen}\n data-delay-close={delayClose}\n data-open-on-focus={openOnFocus}\n data-side={side}\n data-align={align}\n data-side-offset={sideOffset}\n data-align-offset={alignOffset}\n data-position-method={positionMethod}\n data-safe-triangle={safeTriangle}\n data-debug-safe-triangle={debugSafeTriangle}\n class={cn(\n \"group/navigation-menu relative flex max-w-max flex-1 items-center justify-center\",\n className\n )}\n>\n <slot />\n <NavigationMenuPositioner align={align} />\n</nav>\n\n<script>\n import { create } from \"@data-slot/navigation-menu\"\n\n create()\n document.addEventListener(\"astro:page-load\", () => create())\n</script>\n",
12
14
  "type": "registry:ui"
13
15
  },
14
16
  {
@@ -57,5 +59,9 @@
57
59
  "type": "registry:ui"
58
60
  }
59
61
  ],
62
+ "docs": "https://ui.full.dev/components/navigation-menu/",
63
+ "categories": [
64
+ "ui"
65
+ ],
60
66
  "type": "registry:ui"
61
67
  }
@@ -1,13 +1,15 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "popover",
4
+ "title": "Popover",
5
+ "description": "Displays rich content in a floating layer, triggered by a button.",
4
6
  "dependencies": [
5
7
  "@data-slot/popover"
6
8
  ],
7
9
  "files": [
8
10
  {
9
11
  "path": "src/components/ui/popover/popover.astro",
10
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\nimport type { PopoverAlign, PopoverSide } from \"@data-slot/popover\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n defaultOpen?: boolean\n side?: PopoverSide\n align?: PopoverAlign\n sideOffset?: number\n alignOffset?: number\n avoidCollisions?: boolean\n collisionPadding?: number\n portal?: boolean\n position?: PopoverSide\n closeOnClickOutside?: boolean\n closeOnEscape?: boolean\n}\n\nconst {\n class: className,\n defaultOpen,\n side,\n align,\n sideOffset,\n alignOffset,\n avoidCollisions,\n collisionPadding,\n portal,\n position,\n closeOnClickOutside,\n closeOnEscape,\n ...props\n} = Astro.props\n---\n\n<div\n data-slot=\"popover\"\n data-default-open={defaultOpen}\n data-side={side}\n data-align={align}\n data-side-offset={sideOffset}\n data-align-offset={alignOffset}\n data-avoid-collisions={avoidCollisions}\n data-collision-padding={collisionPadding}\n data-portal={portal}\n data-position={position}\n data-close-on-click-outside={closeOnClickOutside}\n data-close-on-escape={closeOnEscape}\n class={className}\n {...props}\n>\n <slot />\n</div>\n\n<script>\n import { create } from \"@data-slot/popover\"\n\n create()\n</script>\n",
12
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\nimport type { PopoverAlign, PopoverSide } from \"@data-slot/popover\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n defaultOpen?: boolean\n side?: PopoverSide\n align?: PopoverAlign\n sideOffset?: number\n alignOffset?: number\n avoidCollisions?: boolean\n collisionPadding?: number\n portal?: boolean\n position?: PopoverSide\n closeOnClickOutside?: boolean\n closeOnEscape?: boolean\n}\n\nconst {\n class: className,\n defaultOpen,\n side,\n align,\n sideOffset,\n alignOffset,\n avoidCollisions,\n collisionPadding,\n portal,\n position,\n closeOnClickOutside,\n closeOnEscape,\n ...props\n} = Astro.props\n---\n\n<div\n data-slot=\"popover\"\n data-default-open={defaultOpen}\n data-side={side}\n data-align={align}\n data-side-offset={sideOffset}\n data-align-offset={alignOffset}\n data-avoid-collisions={avoidCollisions}\n data-collision-padding={collisionPadding}\n data-portal={portal}\n data-position={position}\n data-close-on-click-outside={closeOnClickOutside}\n data-close-on-escape={closeOnEscape}\n class={className}\n {...props}\n>\n <slot />\n</div>\n\n<script>\n import { create } from \"@data-slot/popover\"\n\n create()\n document.addEventListener(\"astro:page-load\", () => create())\n</script>\n",
11
13
  "type": "registry:ui"
12
14
  },
13
15
  {
@@ -41,5 +43,9 @@
41
43
  "type": "registry:ui"
42
44
  }
43
45
  ],
46
+ "docs": "https://ui.full.dev/components/popover/",
47
+ "categories": [
48
+ "ui"
49
+ ],
44
50
  "type": "registry:ui"
45
51
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "price",
4
+ "title": "Price",
5
+ "description": "A flexible price display component for showing pricing information.",
4
6
  "files": [
5
7
  {
6
8
  "path": "src/components/ui/price/price.astro",
@@ -28,5 +30,9 @@
28
30
  "type": "registry:ui"
29
31
  }
30
32
  ],
33
+ "docs": "https://ui.full.dev/components/price/",
34
+ "categories": [
35
+ "ui"
36
+ ],
31
37
  "type": "registry:ui"
32
38
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "pricing-1",
4
+ "title": "Pricing 1",
5
+ "description": "Pricing sections for plan grids, featured offers, and concise offer presentation.",
4
6
  "dependencies": [
5
7
  "@lucide/astro"
6
8
  ],
@@ -15,9 +17,13 @@
15
17
  "files": [
16
18
  {
17
19
  "path": "src/components/blocks/pricing-1.astro",
18
- "content": "---\nimport { CheckIcon } from \"@lucide/astro\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Badge } from \"@/components/ui/badge\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n Card,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n} from \"@/components/ui/card\"\nimport { Price, PriceUnit, PriceValue } from \"@/components/ui/price\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\nimport { Separator } from \"@/components/ui/separator\"\n\ntype Props = {\n class?: string\n title: string\n description?: string\n plans: {\n name: string\n description: string\n price: number\n currency: string\n unit: string\n featured?: boolean\n features: string[]\n button: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }\n }[]\n}\n\nconst { class: className, title, description, plans } = Astro.props\n---\n\n<Section class={cn(\"\", className)}>\n <SectionContainer class=\"items-center gap-8 text-center\">\n <div class=\"flex max-w-2xl flex-col items-center gap-4\">\n <h2\n class=\"text-foreground text-3xl font-semibold tracking-tight text-balance sm:text-4xl\"\n >\n {title}\n </h2>\n {\n description && (\n <p class=\"text-muted-foreground text-lg leading-relaxed text-balance\">\n {description}\n </p>\n )\n }\n </div>\n </SectionContainer>\n <SectionContainer>\n <div\n class=\"mx-auto grid w-full justify-center gap-6 sm:grid-cols-2 lg:grid-cols-[repeat(auto-fit,minmax(16rem,18rem))]\"\n >\n {\n plans.map((plan) => (\n <Card\n class={cn(\"flex flex-col\", plan.featured && \"ring-primary ring-2\")}\n >\n <CardHeader>\n <div class=\"flex items-center gap-2\">\n <CardTitle>{plan.name}</CardTitle>\n {plan.featured && <Badge>Popular</Badge>}\n </div>\n <CardDescription>{plan.description}</CardDescription>\n </CardHeader>\n <CardContent class=\"flex flex-col gap-6\">\n <Price>\n <PriceValue price={plan.price} currency={plan.currency} />\n <PriceUnit>{plan.unit}</PriceUnit>\n </Price>\n <Separator />\n <ul class=\"flex flex-col gap-3\">\n {plan.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 </ul>\n </CardContent>\n <CardFooter class=\"mt-auto\">\n <Button\n as=\"a\"\n href={plan.button.href}\n variant={\n plan.button.variant ?? (plan.featured ? \"default\" : \"outline\")\n }\n class=\"w-full\"\n >\n {plan.button.label}\n </Button>\n </CardFooter>\n </Card>\n ))\n }\n </div>\n </SectionContainer>\n</Section>\n",
20
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\nimport { CheckIcon } from \"@lucide/astro\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Badge } from \"@/components/ui/badge\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n Card,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n} from \"@/components/ui/card\"\nimport { Price, PriceUnit, PriceValue } from \"@/components/ui/price\"\nimport {\n Section,\n SectionContainer,\n SectionDescription,\n SectionTitle,\n} from \"@/components/ui/section\"\nimport { Separator } from \"@/components/ui/separator\"\n\ntype Props = HTMLAttributes<\"section\"> & {\n title: string\n description?: string\n plans: {\n name: string\n description: string\n price: number\n currency: string\n unit: string\n featured?: boolean\n features: string[]\n button: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }\n }[]\n}\n\nconst { class: className, title, description, plans, ...props } = Astro.props\n---\n\n<Section class={cn(\"\", className)} {...props}>\n <SectionContainer class=\"items-center gap-8 text-center\">\n <div class=\"flex max-w-2xl flex-col items-center gap-4\">\n <SectionTitle>\n {title}\n </SectionTitle>\n {description && <SectionDescription>{description}</SectionDescription>}\n </div>\n </SectionContainer>\n <SectionContainer>\n <div\n class=\"mx-auto grid w-full justify-center gap-6 sm:grid-cols-2 lg:grid-cols-[repeat(auto-fit,minmax(16rem,18rem))]\"\n >\n {\n plans.map((plan) => (\n <Card\n class={cn(\"flex flex-col\", plan.featured && \"ring-primary ring-2\")}\n >\n <CardHeader>\n <div class=\"flex items-center gap-2\">\n <CardTitle>{plan.name}</CardTitle>\n {plan.featured && <Badge>Popular</Badge>}\n </div>\n <CardDescription>{plan.description}</CardDescription>\n </CardHeader>\n <CardContent class=\"flex flex-col gap-6\">\n <Price>\n <PriceValue price={plan.price} currency={plan.currency} />\n <PriceUnit>{plan.unit}</PriceUnit>\n </Price>\n <Separator />\n <ul class=\"flex flex-col gap-3\">\n {plan.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 </ul>\n </CardContent>\n <CardFooter class=\"mt-auto\">\n <Button\n as=\"a\"\n href={plan.button.href}\n variant={\n plan.button.variant ?? (plan.featured ? \"default\" : \"outline\")\n }\n class=\"w-full\"\n >\n {plan.button.label}\n </Button>\n </CardFooter>\n </Card>\n ))\n }\n </div>\n </SectionContainer>\n</Section>\n",
19
21
  "type": "registry:block"
20
22
  }
21
23
  ],
24
+ "docs": "https://ui.full.dev/blocks/pricing/",
25
+ "categories": [
26
+ "pricing"
27
+ ],
22
28
  "type": "registry:block"
23
29
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "pricing-2",
4
+ "title": "Pricing 2",
5
+ "description": "Pricing sections for plan grids, featured offers, and concise offer presentation.",
4
6
  "dependencies": [
5
7
  "@lucide/astro"
6
8
  ],
@@ -14,9 +16,13 @@
14
16
  "files": [
15
17
  {
16
18
  "path": "src/components/blocks/pricing-2.astro",
17
- "content": "---\nimport { CheckIcon } from \"@lucide/astro\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n Card,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n} from \"@/components/ui/card\"\nimport { Price, PriceUnit, PriceValue } from \"@/components/ui/price\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\nimport { Separator } from \"@/components/ui/separator\"\n\ntype Props = {\n class?: string\n title: string\n description: string\n plans: {\n name: string\n description: string\n price: number\n compareAt?: number\n currency: string\n unit: string\n features: string[]\n button: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }\n }[]\n}\n\nconst { class: className, title, description, plans } = Astro.props\n---\n\n<Section class={cn(\"\", className)}>\n <SectionContainer class=\"gap-8\">\n <div class=\"mx-auto max-w-2xl text-center\">\n <h2\n class=\"text-foreground text-3xl font-semibold tracking-tight text-balance sm:text-4xl\"\n >\n {title}\n </h2>\n <p\n class=\"text-muted-foreground mt-4 text-lg leading-relaxed text-balance\"\n >\n {description}\n </p>\n </div>\n <div\n class=\"mx-auto grid w-full justify-center gap-6 sm:grid-cols-2 lg:grid-cols-[repeat(auto-fit,minmax(16rem,18rem))]\"\n >\n {\n plans.map((plan, index) => (\n <Card class=\"flex flex-col border-none shadow-none\">\n <CardHeader>\n <CardTitle>{plan.name}</CardTitle>\n <CardDescription>{plan.description}</CardDescription>\n </CardHeader>\n <CardContent class=\"flex flex-col gap-6\">\n <Price>\n <PriceValue\n price={plan.price}\n compareAt={plan.compareAt}\n currency={plan.currency}\n />\n <PriceUnit>{plan.unit}</PriceUnit>\n </Price>\n <Separator />\n <ul class=\"flex flex-col gap-3\">\n {plan.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 </ul>\n </CardContent>\n <CardFooter class=\"mt-auto\">\n <Button\n as=\"a\"\n href={plan.button.href}\n variant={\n plan.button.variant ?? (index === 0 ? \"outline\" : \"default\")\n }\n class=\"w-full\"\n >\n {plan.button.label}\n </Button>\n </CardFooter>\n </Card>\n ))\n }\n </div>\n </SectionContainer>\n</Section>\n",
19
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\nimport { CheckIcon } from \"@lucide/astro\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n Card,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n} from \"@/components/ui/card\"\nimport { Price, PriceUnit, PriceValue } from \"@/components/ui/price\"\nimport {\n Section,\n SectionContainer,\n SectionDescription,\n SectionTitle,\n} from \"@/components/ui/section\"\nimport { Separator } from \"@/components/ui/separator\"\n\ntype Props = HTMLAttributes<\"section\"> & {\n title: string\n description: string\n plans: {\n name: string\n description: string\n price: number\n compareAt?: number\n currency: string\n unit: string\n features: string[]\n button: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }\n }[]\n}\n\nconst { class: className, title, description, plans, ...props } = Astro.props\n---\n\n<Section class={cn(\"\", className)} {...props}>\n <SectionContainer class=\"gap-8\">\n <div class=\"mx-auto max-w-2xl text-center\">\n <SectionTitle>\n {title}\n </SectionTitle>\n <SectionDescription class=\"mt-4\">\n {description}\n </SectionDescription>\n </div>\n <div\n class=\"mx-auto grid w-full justify-center gap-6 sm:grid-cols-2 lg:grid-cols-[repeat(auto-fit,minmax(16rem,18rem))]\"\n >\n {\n plans.map((plan, index) => (\n <Card class=\"flex flex-col border-none shadow-none\">\n <CardHeader>\n <CardTitle>{plan.name}</CardTitle>\n <CardDescription>{plan.description}</CardDescription>\n </CardHeader>\n <CardContent class=\"flex flex-col gap-6\">\n <Price>\n <PriceValue\n price={plan.price}\n compareAt={plan.compareAt}\n currency={plan.currency}\n />\n <PriceUnit>{plan.unit}</PriceUnit>\n </Price>\n <Separator />\n <ul class=\"flex flex-col gap-3\">\n {plan.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 </ul>\n </CardContent>\n <CardFooter class=\"mt-auto\">\n <Button\n as=\"a\"\n href={plan.button.href}\n variant={\n plan.button.variant ?? (index === 0 ? \"outline\" : \"default\")\n }\n class=\"w-full\"\n >\n {plan.button.label}\n </Button>\n </CardFooter>\n </Card>\n ))\n }\n </div>\n </SectionContainer>\n</Section>\n",
18
20
  "type": "registry:block"
19
21
  }
20
22
  ],
23
+ "docs": "https://ui.full.dev/blocks/pricing/",
24
+ "categories": [
25
+ "pricing"
26
+ ],
21
27
  "type": "registry:block"
22
28
  }