fulldev-ui 0.9.3 → 0.10.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 (258) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +100 -16
  3. package/package.json +3 -2
  4. package/public/r/accordion.json +3 -5
  5. package/public/r/alert-dialog.json +1 -1
  6. package/public/r/alert.json +0 -5
  7. package/public/r/article-1.json +1 -1
  8. package/public/r/article-2.json +1 -1
  9. package/public/r/articles-1.json +1 -1
  10. package/public/r/articles-2.json +1 -1
  11. package/public/r/articles-3.json +1 -1
  12. package/public/r/avatar.json +1 -16
  13. package/public/r/badge.json +1 -1
  14. package/public/r/banner-1.json +5 -3
  15. package/public/r/banner-2.json +1 -1
  16. package/public/r/banner.json +5 -3
  17. package/public/r/blocks-1.json +6 -3
  18. package/public/r/breadcrumb.json +4 -4
  19. package/public/r/button.json +1 -1
  20. package/public/r/card.json +4 -4
  21. package/public/r/carousel.json +5 -5
  22. package/public/r/checkbox.json +1 -1
  23. package/public/r/combobox.json +8 -8
  24. package/public/r/command.json +6 -6
  25. package/public/r/components.json +1 -7
  26. package/public/r/contact-1.json +4 -2
  27. package/public/r/contact-2.json +4 -2
  28. package/public/r/contact-3.json +11 -3
  29. package/public/r/content-1.json +11 -3
  30. package/public/r/content-2.json +11 -3
  31. package/public/r/content-3.json +7 -1
  32. package/public/r/content-4.json +11 -3
  33. package/public/r/cta-2.json +7 -1
  34. package/public/r/cta-4.json +7 -1
  35. package/public/r/cta-5.json +11 -3
  36. package/public/r/cta-6.json +7 -1
  37. package/public/r/dialog.json +6 -6
  38. package/public/r/doc-1.json +6 -3
  39. package/public/r/dropdown-menu.json +9 -11
  40. package/public/r/features-1.json +5 -3
  41. package/public/r/features-2.json +5 -3
  42. package/public/r/features-4.json +5 -3
  43. package/public/r/features-5.json +4 -2
  44. package/public/r/field.json +2 -7
  45. package/public/r/footer-1.json +5 -3
  46. package/public/r/footer-2.json +5 -3
  47. package/public/r/footer-3.json +5 -3
  48. package/public/r/header-1.json +1 -1
  49. package/public/r/header.json +3 -0
  50. package/public/r/hero-13.json +1 -1
  51. package/public/r/hero-4.json +5 -3
  52. package/public/r/hero-5.json +5 -3
  53. package/public/r/hero-6.json +5 -3
  54. package/public/r/hero-7.json +5 -3
  55. package/public/r/hero-8.json +1 -1
  56. package/public/r/hero-9.json +5 -3
  57. package/public/r/hover-card.json +2 -2
  58. package/public/r/icon.json +1 -1
  59. package/public/r/input-group.json +1 -1
  60. package/public/r/item.json +2 -20
  61. package/public/r/kbd.json +2 -2
  62. package/public/r/layout.json +4 -7
  63. package/public/r/links-2.json +5 -3
  64. package/public/r/marquee.json +1 -1
  65. package/public/r/native-select.json +3 -3
  66. package/public/r/navigation-menu.json +6 -8
  67. package/public/r/page.json +17 -0
  68. package/public/r/popover.json +1 -1
  69. package/public/r/pricing-1.json +5 -3
  70. package/public/r/pricing-2.json +5 -3
  71. package/public/r/pricing-3.json +5 -3
  72. package/public/r/products-1.json +1 -1
  73. package/public/r/products-4.json +1 -1
  74. package/public/r/products-5.json +1 -1
  75. package/public/r/radio-group.json +1 -1
  76. package/public/r/rating.json +3 -3
  77. package/public/r/registry.json +186 -450
  78. package/public/r/reviews-1.json +5 -3
  79. package/public/r/reviews-2.json +5 -3
  80. package/public/r/reviews-3.json +5 -3
  81. package/public/r/reviews-4.json +1 -1
  82. package/public/r/reviews-5.json +5 -3
  83. package/public/r/select.json +6 -8
  84. package/public/r/services-1.json +11 -3
  85. package/public/r/services-2.json +7 -1
  86. package/public/r/services-3.json +7 -1
  87. package/public/r/services-4.json +11 -3
  88. package/public/r/services-5.json +5 -3
  89. package/public/r/services-6.json +11 -3
  90. package/public/r/services-7.json +11 -3
  91. package/public/r/sheet.json +6 -3
  92. package/public/r/sidebar-1.json +4 -2
  93. package/public/r/sidebar.json +10 -7
  94. package/public/r/slider.json +1 -1
  95. package/public/r/spinner.json +3 -3
  96. package/public/r/switch.json +1 -1
  97. package/public/r/theme-toggle.json +5 -3
  98. package/public/r/tooltip.json +1 -1
  99. package/public/r/typography.json +16 -16
  100. package/public/r/video.json +1 -1
  101. package/registry.json +186 -450
  102. package/src/components/blocks/article-1.astro +1 -1
  103. package/src/components/blocks/article-2.astro +1 -1
  104. package/src/components/blocks/articles-1.astro +1 -1
  105. package/src/components/blocks/articles-2.astro +2 -2
  106. package/src/components/blocks/articles-3.astro +1 -1
  107. package/src/components/blocks/banner-1.astro +3 -5
  108. package/src/components/blocks/banner-2.astro +1 -1
  109. package/src/components/blocks/blocks-1.astro +25 -37
  110. package/src/components/blocks/contact-3.astro +4 -3
  111. package/src/components/blocks/content-1.astro +5 -4
  112. package/src/components/blocks/content-2.astro +6 -5
  113. package/src/components/blocks/content-3.astro +9 -2
  114. package/src/components/blocks/content-4.astro +6 -5
  115. package/src/components/blocks/cta-2.astro +4 -3
  116. package/src/components/blocks/cta-4.astro +3 -2
  117. package/src/components/blocks/cta-5.astro +6 -5
  118. package/src/components/blocks/cta-6.astro +4 -3
  119. package/src/components/blocks/doc-1.astro +28 -56
  120. package/src/components/blocks/features-1.astro +3 -1
  121. package/src/components/blocks/features-2.astro +4 -2
  122. package/src/components/blocks/features-4.astro +3 -1
  123. package/src/components/blocks/footer-1.astro +26 -12
  124. package/src/components/blocks/footer-2.astro +24 -12
  125. package/src/components/blocks/footer-3.astro +26 -12
  126. package/src/components/blocks/header-1.astro +2 -3
  127. package/src/components/blocks/hero-13.astro +1 -1
  128. package/src/components/blocks/hero-4.astro +2 -2
  129. package/src/components/blocks/hero-5.astro +3 -3
  130. package/src/components/blocks/hero-6.astro +3 -3
  131. package/src/components/blocks/hero-7.astro +3 -3
  132. package/src/components/blocks/hero-8.astro +1 -1
  133. package/src/components/blocks/hero-9.astro +2 -2
  134. package/src/components/blocks/links-2.astro +3 -5
  135. package/src/components/blocks/pricing-1.astro +3 -2
  136. package/src/components/blocks/pricing-2.astro +3 -2
  137. package/src/components/blocks/pricing-3.astro +3 -2
  138. package/src/components/blocks/products-1.astro +1 -1
  139. package/src/components/blocks/products-4.astro +2 -2
  140. package/src/components/blocks/products-5.astro +4 -4
  141. package/src/components/blocks/reviews-1.astro +2 -2
  142. package/src/components/blocks/reviews-2.astro +2 -2
  143. package/src/components/blocks/reviews-3.astro +2 -2
  144. package/src/components/blocks/reviews-4.astro +4 -4
  145. package/src/components/blocks/reviews-5.astro +16 -25
  146. package/src/components/blocks/services-1.astro +7 -9
  147. package/src/components/blocks/services-2.astro +5 -4
  148. package/src/components/blocks/services-3.astro +6 -5
  149. package/src/components/blocks/services-4.astro +7 -9
  150. package/src/components/blocks/services-5.astro +3 -4
  151. package/src/components/blocks/services-6.astro +7 -6
  152. package/src/components/blocks/services-7.astro +7 -9
  153. package/src/components/blocks/sidebar-1.astro +42 -97
  154. package/src/components/ui/accordion/accordion-trigger.astro +7 -8
  155. package/src/components/ui/alert-dialog/alert-dialog.astro +23 -3
  156. package/src/components/ui/avatar/avatar.astro +1 -1
  157. package/src/components/ui/badge/badge.astro +1 -0
  158. package/src/components/ui/banner/banner-container.astro +3 -3
  159. package/src/components/ui/breadcrumb/breadcrumb-ellipsis.astro +2 -2
  160. package/src/components/ui/breadcrumb/breadcrumb-separator.astro +2 -2
  161. package/src/components/ui/button/button-variants.ts +8 -7
  162. package/src/components/ui/card/card-content.astro +1 -1
  163. package/src/components/ui/card/card-footer.astro +1 -1
  164. package/src/components/ui/card/card-header.astro +1 -1
  165. package/src/components/ui/card/card.astro +1 -1
  166. package/src/components/ui/carousel/carousel-next.astro +3 -3
  167. package/src/components/ui/carousel/carousel-previous.astro +3 -3
  168. package/src/components/ui/checkbox/checkbox.astro +1 -1
  169. package/src/components/ui/combobox/combobox-input.astro +2 -2
  170. package/src/components/ui/combobox/combobox-item.astro +4 -4
  171. package/src/components/ui/combobox/combobox-list.astro +1 -1
  172. package/src/components/ui/combobox/combobox-trigger.astro +2 -5
  173. package/src/components/ui/combobox/combobox.astro +3 -0
  174. package/src/components/ui/command/command-dialog.astro +10 -10
  175. package/src/components/ui/command/command-input.astro +2 -2
  176. package/src/components/ui/command/command-item.astro +4 -5
  177. package/src/components/ui/dialog/dialog-close.astro +2 -2
  178. package/src/components/ui/dialog/dialog-content.astro +2 -2
  179. package/src/components/ui/dialog/dialog.astro +26 -3
  180. package/src/components/ui/dropdown-menu/dropdown-menu-checkbox-item.astro +4 -5
  181. package/src/components/ui/dropdown-menu/dropdown-menu-content.astro +4 -4
  182. package/src/components/ui/dropdown-menu/dropdown-menu-item.astro +1 -1
  183. package/src/components/ui/dropdown-menu/dropdown-menu-label.astro +1 -1
  184. package/src/components/ui/dropdown-menu/dropdown-menu-radio-item.astro +4 -5
  185. package/src/components/ui/dropdown-menu/dropdown-menu-shortcut.astro +1 -1
  186. package/src/components/ui/dropdown-menu/dropdown-menu.astro +3 -0
  187. package/src/components/ui/field/field-label.astro +1 -1
  188. package/src/components/ui/field/field-title.astro +1 -1
  189. package/src/components/ui/hover-card/hover-card-content.astro +4 -4
  190. package/src/components/ui/hover-card/hover-card.astro +2 -2
  191. package/src/components/ui/icon/icon.astro +8 -17
  192. package/src/components/ui/input-group/input-group-button.astro +0 -1
  193. package/src/components/ui/item/item-media.astro +1 -1
  194. package/src/components/ui/item/item.astro +0 -18
  195. package/src/components/ui/kbd/kbd-group.astro +1 -1
  196. package/src/components/ui/kbd/kbd.astro +1 -1
  197. package/src/components/ui/layout/layout-body.astro +1 -1
  198. package/src/components/ui/layout/layout-head.astro +3 -2
  199. package/src/components/ui/layout/layout-main.astro +1 -1
  200. package/src/components/ui/layout/layout.astro +4 -0
  201. package/src/components/ui/marquee/marquee.astro +50 -69
  202. package/src/components/ui/native-select/native-select.astro +2 -3
  203. package/src/components/ui/navigation-menu/navigation-menu-content.astro +1 -1
  204. package/src/components/ui/navigation-menu/navigation-menu-list.astro +1 -1
  205. package/src/components/ui/navigation-menu/navigation-menu-trigger.astro +2 -3
  206. package/src/components/ui/navigation-menu/navigation-menu.astro +1 -1
  207. package/src/components/ui/popover/popover-content.astro +1 -1
  208. package/src/components/ui/radio-group/radio-group-item.astro +3 -3
  209. package/src/components/ui/rating/rating.astro +3 -3
  210. package/src/components/ui/select/select-content.astro +1 -1
  211. package/src/components/ui/select/select-item.astro +4 -4
  212. package/src/components/ui/select/select-trigger.astro +3 -6
  213. package/src/components/ui/select/select.astro +6 -0
  214. package/src/components/ui/sheet/sheet-content.astro +4 -5
  215. package/src/components/ui/sidebar/sidebar-menu-button.astro +13 -10
  216. package/src/components/ui/sidebar/sidebar-menu-sub-button.astro +10 -8
  217. package/src/components/ui/sidebar/sidebar-provider.astro +1 -13
  218. package/src/components/ui/sidebar/sidebar-rail.astro +1 -1
  219. package/src/components/ui/sidebar/sidebar-trigger.astro +3 -3
  220. package/src/components/ui/sidebar/sidebar.astro +1 -1
  221. package/src/components/ui/slider/slider.astro +6 -4
  222. package/src/components/ui/spinner/spinner.astro +4 -4
  223. package/src/components/ui/switch/switch.astro +1 -1
  224. package/src/components/ui/theme-toggle/theme-toggle.astro +4 -3
  225. package/src/components/ui/tooltip/tooltip-content.astro +1 -1
  226. package/src/components/ui/typography/typography-a.astro +19 -4
  227. package/src/components/ui/typography/typography-blockquote.astro +26 -6
  228. package/src/components/ui/typography/typography-h1.astro +7 -9
  229. package/src/components/ui/typography/typography-h2.astro +12 -9
  230. package/src/components/ui/typography/typography-h3.astro +7 -9
  231. package/src/components/ui/typography/typography-h4.astro +7 -9
  232. package/src/components/ui/typography/typography-inline-code.astro +28 -12
  233. package/src/components/ui/typography/typography-lead.astro +29 -4
  234. package/src/components/ui/typography/typography-list-item.astro +25 -9
  235. package/src/components/ui/typography/typography-list.astro +29 -11
  236. package/src/components/ui/typography/typography-p.astro +26 -6
  237. package/src/components/ui/typography/typography-table-cell.astro +32 -13
  238. package/src/components/ui/typography/typography-table-head.astro +27 -13
  239. package/src/components/ui/typography/typography-table-row.astro +23 -13
  240. package/src/components/ui/typography/typography-table.astro +29 -20
  241. package/src/components/ui/typography/typography.astro +172 -46
  242. package/src/components/ui/video/video.astro +11 -27
  243. package/src/styles/global.css +2 -15
  244. package/public/r/beta-repo-setup.json +0 -125
  245. package/public/r/blocks.json +0 -91
  246. package/public/r/content-5.json +0 -17
  247. package/public/r/content-6.json +0 -17
  248. package/public/r/gradient.json +0 -17
  249. package/public/r/init.json +0 -23
  250. package/public/r/tile.json +0 -27
  251. package/src/components/blocks/content-5.astro +0 -115
  252. package/src/components/blocks/content-6.astro +0 -91
  253. package/src/components/ui/gradient/gradient.astro +0 -45
  254. package/src/components/ui/gradient/index.ts +0 -1
  255. package/src/components/ui/tile/index.ts +0 -3
  256. package/src/components/ui/tile/tile-content.astro +0 -17
  257. package/src/components/ui/tile/tile-group.astro +0 -76
  258. package/src/components/ui/tile/tile.astro +0 -46
@@ -17,7 +17,7 @@
17
17
  },
18
18
  {
19
19
  "path": "src/components/ui/popover/popover-content.astro",
20
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\nimport type { PopoverAlign, PopoverSide } from \"@data-slot/popover\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n side?: PopoverSide\n align?: PopoverAlign\n sideOffset?: number\n alignOffset?: number\n avoidCollisions?: boolean\n collisionPadding?: number\n position?: PopoverSide\n}\n\nconst {\n class: className,\n hidden = true,\n side,\n align,\n sideOffset,\n alignOffset,\n avoidCollisions,\n collisionPadding,\n position,\n ...props\n} = Astro.props\n---\n\n<div data-slot=\"popover-portal\">\n <div\n data-slot=\"popover-positioner\"\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-position={position}\n class=\"isolate z-50\"\n >\n <div\n data-slot=\"popover-content\"\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-position={position}\n hidden={hidden}\n class={cn(\n \"bg-popover text-popover-foreground ring-foreground/10 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 flex w-72 origin-(--transform-origin) flex-col gap-4 rounded-md p-4 text-sm shadow-md ring-1 duration-100 outline-none\",\n className\n )}\n {...props}\n >\n <slot />\n </div>\n </div>\n</div>\n",
20
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\nimport type { PopoverAlign, PopoverSide } from \"@data-slot/popover\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n side?: PopoverSide\n align?: PopoverAlign\n sideOffset?: number\n alignOffset?: number\n avoidCollisions?: boolean\n collisionPadding?: number\n position?: PopoverSide\n}\n\nconst {\n class: className,\n hidden = true,\n side,\n align,\n sideOffset,\n alignOffset,\n avoidCollisions,\n collisionPadding,\n position,\n ...props\n} = Astro.props\n---\n\n<div data-slot=\"popover-portal\">\n <div\n data-slot=\"popover-positioner\"\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-position={position}\n class=\"isolate z-50\"\n >\n <div\n data-slot=\"popover-content\"\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-position={position}\n hidden={hidden}\n class={cn(\n \"bg-popover text-popover-foreground ring-foreground/10 data-[closed]:animate-out data-[closed]:fade-out-0 data-[closed]:zoom-out-95 data-[open]:animate-in data-[open]:fade-in-0 data-[open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 flex w-72 origin-(--transform-origin) flex-col gap-4 rounded-md p-4 text-sm shadow-md ring-1 outline-hidden duration-100\",\n className\n )}\n {...props}\n >\n <slot />\n </div>\n </div>\n</div>\n",
21
21
  "type": "registry:ui"
22
22
  },
23
23
  {
@@ -1,19 +1,21 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "pricing-1",
4
+ "dependencies": [
5
+ "@lucide/astro"
6
+ ],
4
7
  "registryDependencies": [
5
8
  "@fulldev/badge",
6
9
  "@fulldev/button",
7
10
  "@fulldev/card",
8
11
  "@fulldev/price",
9
12
  "@fulldev/section",
10
- "@fulldev/separator",
11
- "@fulldev/icon"
13
+ "@fulldev/separator"
12
14
  ],
13
15
  "files": [
14
16
  {
15
17
  "path": "src/components/blocks/pricing-1.astro",
16
- "content": "---\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 { Icon } from \"@/components/ui/icon\"\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 <Icon name=\"check\" 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",
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",
17
19
  "type": "registry:block"
18
20
  }
19
21
  ],
@@ -1,18 +1,20 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "pricing-2",
4
+ "dependencies": [
5
+ "@lucide/astro"
6
+ ],
4
7
  "registryDependencies": [
5
8
  "@fulldev/button",
6
9
  "@fulldev/card",
7
10
  "@fulldev/price",
8
11
  "@fulldev/section",
9
- "@fulldev/separator",
10
- "@fulldev/icon"
12
+ "@fulldev/separator"
11
13
  ],
12
14
  "files": [
13
15
  {
14
16
  "path": "src/components/blocks/pricing-2.astro",
15
- "content": "---\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 { Icon } from \"@/components/ui/icon\"\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 <Icon name=\"check\" 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",
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",
16
18
  "type": "registry:block"
17
19
  }
18
20
  ],
@@ -1,19 +1,21 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "pricing-3",
4
+ "dependencies": [
5
+ "@lucide/astro"
6
+ ],
4
7
  "registryDependencies": [
5
8
  "@fulldev/badge",
6
9
  "@fulldev/button",
7
10
  "@fulldev/card",
8
11
  "@fulldev/price",
9
12
  "@fulldev/section",
10
- "@fulldev/separator",
11
- "@fulldev/icon"
13
+ "@fulldev/separator"
12
14
  ],
13
15
  "files": [
14
16
  {
15
17
  "path": "src/components/blocks/pricing-3.astro",
16
- "content": "---\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 { Icon } from \"@/components/ui/icon\"\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 badge?: string\n title: string\n description?: string\n offer: {\n name: string\n description: string\n price: 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, badge, title, description, offer } = 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 {badge && <Badge variant=\"secondary\">{badge}</Badge>}\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 <Card class=\"ring-primary w-full max-w-md ring-2\">\n <CardHeader class=\"text-left\">\n <CardTitle>{offer.name}</CardTitle>\n <CardDescription>{offer.description}</CardDescription>\n </CardHeader>\n <CardContent class=\"flex flex-col gap-6 text-left\">\n <Price>\n <PriceValue price={offer.price} currency={offer.currency} />\n <PriceUnit>{offer.unit}</PriceUnit>\n </Price>\n <Separator />\n <ul class=\"flex flex-col gap-3\">\n {\n offer.features.map((feature) => (\n <li class=\"flex items-center gap-3 text-sm\">\n <Icon name=\"check\" class=\"text-primary size-4 shrink-0\" />\n {feature}\n </li>\n ))\n }\n </ul>\n </CardContent>\n <CardFooter>\n <Button\n as=\"a\"\n href={offer.button.href}\n variant={offer.button.variant ?? \"default\"}\n class=\"w-full\"\n >\n {offer.button.label}\n </Button>\n </CardFooter>\n </Card>\n </SectionContainer>\n</Section>\n",
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 badge?: string\n title: string\n description?: string\n offer: {\n name: string\n description: string\n price: 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, badge, title, description, offer } = 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 {badge && <Badge variant=\"secondary\">{badge}</Badge>}\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 <Card class=\"ring-primary w-full max-w-md ring-2\">\n <CardHeader class=\"text-left\">\n <CardTitle>{offer.name}</CardTitle>\n <CardDescription>{offer.description}</CardDescription>\n </CardHeader>\n <CardContent class=\"flex flex-col gap-6 text-left\">\n <Price>\n <PriceValue price={offer.price} currency={offer.currency} />\n <PriceUnit>{offer.unit}</PriceUnit>\n </Price>\n <Separator />\n <ul class=\"flex flex-col gap-3\">\n {\n offer.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 </CardContent>\n <CardFooter>\n <Button\n as=\"a\"\n href={offer.button.href}\n variant={offer.button.variant ?? \"default\"}\n class=\"w-full\"\n >\n {offer.button.label}\n </Button>\n </CardFooter>\n </Card>\n </SectionContainer>\n</Section>\n",
17
19
  "type": "registry:block"
18
20
  }
19
21
  ],
@@ -10,7 +10,7 @@
10
10
  "files": [
11
11
  {
12
12
  "path": "src/components/blocks/products-1.astro",
13
- "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Badge } from \"@/components/ui/badge\"\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from \"@/components/ui/card\"\nimport { Price, PriceUnit, PriceValue } from \"@/components/ui/price\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\n\ntype Props = {\n class?: string\n badge: string\n title: string\n products: {\n image: {\n src: ImageMetadata\n alt: string\n }\n title: string\n description: string\n price: {\n value: number\n currency: string\n unit: string\n }\n }[]\n}\n\nconst { class: className, badge, title, products } = 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 <Badge variant=\"secondary\">{badge}</Badge>\n <h2\n class=\"mt-4 text-3xl font-semibold tracking-tight text-balance sm:text-4xl\"\n >\n {title}\n </h2>\n </div>\n <div class=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n {\n products.map((product) => (\n <Card>\n <Image\n src={product.image.src}\n alt={product.image.alt}\n class=\"aspect-4/3 w-full object-cover\"\n />\n <CardHeader>\n <CardTitle>{product.title}</CardTitle>\n <CardDescription>{product.description}</CardDescription>\n </CardHeader>\n <CardContent>\n <Price>\n <PriceValue\n price={product.price.value}\n currency={product.price.currency}\n />\n <PriceUnit>{product.price.unit}</PriceUnit>\n </Price>\n </CardContent>\n </Card>\n ))\n }\n </div>\n </SectionContainer>\n</Section>\n",
13
+ "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Badge } from \"@/components/ui/badge\"\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from \"@/components/ui/card\"\nimport { Price, PriceUnit, PriceValue } from \"@/components/ui/price\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\n\ntype Props = {\n class?: string\n badge: string\n title: string\n products: {\n image: {\n src: ImageMetadata\n alt: string\n }\n title: string\n description: string\n price: {\n value: number\n currency: string\n unit: string\n }\n }[]\n}\n\nconst { class: className, badge, title, products } = 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 <Badge variant=\"secondary\">{badge}</Badge>\n <h2\n class=\"mt-4 text-3xl font-semibold tracking-tight text-balance sm:text-4xl\"\n >\n {title}\n </h2>\n </div>\n <div class=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n {\n products.map((product) => (\n <Card>\n <Image\n src={product.image.src}\n alt={product.image.alt}\n class=\"aspect-[4/3] w-full object-cover\"\n />\n <CardHeader>\n <CardTitle>{product.title}</CardTitle>\n <CardDescription>{product.description}</CardDescription>\n </CardHeader>\n <CardContent>\n <Price>\n <PriceValue\n price={product.price.value}\n currency={product.price.currency}\n />\n <PriceUnit>{product.price.unit}</PriceUnit>\n </Price>\n </CardContent>\n </Card>\n ))\n }\n </div>\n </SectionContainer>\n</Section>\n",
14
14
  "type": "registry:block"
15
15
  }
16
16
  ],
@@ -10,7 +10,7 @@
10
10
  "files": [
11
11
  {
12
12
  "path": "src/components/blocks/products-4.astro",
13
- "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from \"@/components/ui/card\"\nimport { Price, PriceUnit, PriceValue } from \"@/components/ui/price\"\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 products: {\n image: {\n src: ImageMetadata\n alt: string\n }\n title: string\n description: string\n price: {\n value: number\n currency: string\n unit: string\n }\n }[]\n}\n\nconst { class: className, title, description, buttons, products } = Astro.props\n---\n\n<Section class={cn(\"\", className)}>\n <SectionContainer class=\"gap-8\">\n <div\n class=\"flex flex-col gap-4 md:flex-row md:items-end md:justify-between\"\n >\n <div class=\"max-w-2xl\">\n <h2\n class=\"text-3xl font-semibold tracking-tight text-balance sm:text-4xl\"\n >\n {title}\n </h2>\n <p class=\"text-muted-foreground mt-3 text-lg leading-8\">\n {description}\n </p>\n </div>\n <div class=\"flex shrink-0 flex-wrap gap-3\">\n {\n buttons.map(({ href, label, ...button }) => (\n <Button as=\"a\" href={href} variant={button.variant}>\n {label}\n </Button>\n ))\n }\n </div>\n </div>\n <div class=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {\n products.map((product) => (\n <Card>\n <Image\n src={product.image.src}\n alt={product.image.alt}\n class=\"aspect-4/3 w-full object-cover\"\n />\n <CardHeader>\n <CardTitle>{product.title}</CardTitle>\n <CardDescription>{product.description}</CardDescription>\n </CardHeader>\n <CardContent>\n <Price>\n <PriceValue\n price={product.price.value}\n currency={product.price.currency}\n />\n <PriceUnit>{product.price.unit}</PriceUnit>\n </Price>\n </CardContent>\n </Card>\n ))\n }\n </div>\n </SectionContainer>\n</Section>\n",
13
+ "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from \"@/components/ui/card\"\nimport { Price, PriceUnit, PriceValue } from \"@/components/ui/price\"\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 products: {\n image: {\n src: ImageMetadata\n alt: string\n }\n title: string\n description: string\n price: {\n value: number\n currency: string\n unit: string\n }\n }[]\n}\n\nconst { class: className, title, description, buttons, products } = Astro.props\n---\n\n<Section class={cn(\"\", className)}>\n <SectionContainer class=\"gap-8\">\n <div\n class=\"flex flex-col gap-4 md:flex-row md:items-end md:justify-between\"\n >\n <div class=\"max-w-2xl\">\n <h2\n class=\"text-3xl font-semibold tracking-tight text-balance sm:text-4xl\"\n >\n {title}\n </h2>\n <p class=\"text-muted-foreground mt-3 text-lg leading-8\">\n {description}\n </p>\n </div>\n <div class=\"flex flex-shrink-0 flex-wrap gap-3\">\n {\n buttons.map(({ href, label, ...button }) => (\n <Button as=\"a\" href={href} variant={button.variant}>\n {label}\n </Button>\n ))\n }\n </div>\n </div>\n <div class=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {\n products.map((product) => (\n <Card>\n <Image\n src={product.image.src}\n alt={product.image.alt}\n class=\"aspect-[4/3] w-full object-cover\"\n />\n <CardHeader>\n <CardTitle>{product.title}</CardTitle>\n <CardDescription>{product.description}</CardDescription>\n </CardHeader>\n <CardContent>\n <Price>\n <PriceValue\n price={product.price.value}\n currency={product.price.currency}\n />\n <PriceUnit>{product.price.unit}</PriceUnit>\n </Price>\n </CardContent>\n </Card>\n ))\n }\n </div>\n </SectionContainer>\n</Section>\n",
14
14
  "type": "registry:block"
15
15
  }
16
16
  ],
@@ -11,7 +11,7 @@
11
11
  "files": [
12
12
  {
13
13
  "path": "src/components/blocks/products-5.astro",
14
- "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 {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from \"@/components/ui/card\"\nimport { Price, PriceUnit, PriceValue } from \"@/components/ui/price\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\n\ntype Props = {\n class?: string\n badge: string\n title: string\n buttons: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n products: {\n image: {\n src: ImageMetadata\n alt: string\n }\n title: string\n description: string\n price: {\n value: number\n currency: string\n unit: string\n }\n }[]\n}\n\nconst { class: className, badge, title, buttons, products } = 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 <Badge variant=\"secondary\">{badge}</Badge>\n <h2\n class=\"mt-4 text-3xl font-semibold tracking-tight text-balance sm:text-4xl\"\n >\n {title}\n </h2>\n <div class=\"mt-4 flex flex-wrap justify-center gap-3\">\n {\n buttons.map(({ href, label, ...button }) => (\n <Button as=\"a\" href={href} variant={button.variant}>\n {label}\n </Button>\n ))\n }\n </div>\n </div>\n <div class=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n {\n products.map((product) => (\n <Card class=\"group/product gap-0 overflow-hidden py-0\">\n <div class=\"overflow-hidden\">\n <Image\n src={product.image.src}\n alt={product.image.alt}\n class=\"aspect-3/4 w-full object-cover transition-transform duration-300 group-hover/product:scale-105\"\n />\n </div>\n <CardHeader class=\"pt-6\">\n <CardTitle>{product.title}</CardTitle>\n <CardDescription>{product.description}</CardDescription>\n </CardHeader>\n <CardContent class=\"pt-4 pb-6\">\n <Price>\n <PriceValue\n price={product.price.value}\n currency={product.price.currency}\n />\n <PriceUnit>{product.price.unit}</PriceUnit>\n </Price>\n </CardContent>\n </Card>\n ))\n }\n </div>\n </SectionContainer>\n</Section>\n",
14
+ "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 {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from \"@/components/ui/card\"\nimport { Price, PriceUnit, PriceValue } from \"@/components/ui/price\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\n\ntype Props = {\n class?: string\n badge: string\n title: string\n buttons: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n products: {\n image: {\n src: ImageMetadata\n alt: string\n }\n title: string\n description: string\n price: {\n value: number\n currency: string\n unit: string\n }\n }[]\n}\n\nconst { class: className, badge, title, buttons, products } = 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 <Badge variant=\"secondary\">{badge}</Badge>\n <h2\n class=\"mt-4 text-3xl font-semibold tracking-tight text-balance sm:text-4xl\"\n >\n {title}\n </h2>\n <div class=\"mt-4 flex flex-wrap justify-center gap-3\">\n {\n buttons.map(({ href, label, ...button }) => (\n <Button as=\"a\" href={href} variant={button.variant}>\n {label}\n </Button>\n ))\n }\n </div>\n </div>\n <div class=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n {\n products.map((product) => (\n <Card class=\"group/product gap-0 overflow-hidden\">\n <div class=\"overflow-hidden\">\n <Image\n src={product.image.src}\n alt={product.image.alt}\n class=\"aspect-[3/4] w-full object-cover transition-transform duration-300 group-hover/product:scale-105\"\n />\n </div>\n <CardHeader>\n <CardTitle>{product.title}</CardTitle>\n <CardDescription>{product.description}</CardDescription>\n </CardHeader>\n <CardContent>\n <Price>\n <PriceValue\n price={product.price.value}\n currency={product.price.currency}\n />\n <PriceUnit>{product.price.unit}</PriceUnit>\n </Price>\n </CardContent>\n </Card>\n ))\n }\n </div>\n </SectionContainer>\n</Section>\n",
15
15
  "type": "registry:block"
16
16
  }
17
17
  ],
@@ -12,7 +12,7 @@
12
12
  },
13
13
  {
14
14
  "path": "src/components/ui/radio-group/radio-group-item.astro",
15
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"span\"> & {\n value: string\n disabled?: boolean\n indicatorClass?: string\n}\n\nconst {\n class: className,\n value,\n disabled,\n indicatorClass,\n ...props\n} = Astro.props\n---\n\n<span\n data-slot=\"radio-group-item\"\n data-value={value}\n data-disabled={disabled ? \"\" : undefined}\n class={cn(\n \"group/radio-group-item peer border-input focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-[checked]:border-primary data-[checked]:bg-primary data-[checked]:text-primary-foreground dark:data-[checked]:bg-primary relative flex aspect-square size-4 shrink-0 rounded-full border outline-none after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:ring-3 aria-invalid:ring-3 data-disabled:cursor-not-allowed data-disabled:opacity-50\",\n className\n )}\n {...props}\n>\n <span\n aria-hidden=\"true\"\n data-slot=\"radio-group-indicator\"\n class={cn(\n \"flex size-4 items-center justify-center opacity-0 group-data-checked/radio-group-item:opacity-100\",\n indicatorClass\n )}\n >\n <span\n class=\"bg-background absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2 rounded-full\"\n ></span>\n </span>\n</span>\n",
15
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"span\"> & {\n value: string\n disabled?: boolean\n indicatorClass?: string\n}\n\nconst {\n class: className,\n value,\n disabled,\n indicatorClass,\n ...props\n} = Astro.props\n---\n\n<span\n data-slot=\"radio-group-item\"\n data-value={value}\n data-disabled={disabled ? \"\" : undefined}\n class={cn(\n \"group/radio-group-item peer border-input focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-[checked]:border-primary data-[checked]:bg-primary data-[checked]:text-primary-foreground dark:data-[checked]:bg-primary group-has-[:focus-visible]/field-label:not-data-[checked]:border-input group-has-[:focus-visible]/field-label:data-[checked]:border-primary relative flex aspect-square size-4 shrink-0 rounded-full border outline-none group-has-[:focus-visible]/field-label:ring-0 after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:ring-3 aria-invalid:ring-3 data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n>\n <span\n aria-hidden=\"true\"\n data-slot=\"radio-group-indicator\"\n class={cn(\n \"flex size-4 items-center justify-center opacity-0 group-data-[checked]/radio-group-item:opacity-100\",\n indicatorClass\n )}\n >\n <span\n class=\"bg-primary-foreground absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2 rounded-full\"\n ></span>\n </span>\n</span>\n",
16
16
  "type": "registry:ui"
17
17
  },
18
18
  {
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "rating",
4
- "registryDependencies": [
5
- "@fulldev/icon"
4
+ "dependencies": [
5
+ "@lucide/astro"
6
6
  ],
7
7
  "files": [
8
8
  {
9
9
  "path": "src/components/ui/rating/rating.astro",
10
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Icon } from \"@/components/ui/icon\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n value?: number\n}\n\nconst { value = 5, class: className, ...props } = Astro.props\n---\n\n<div class={cn(\"flex items-center gap-1 text-base\", className)} {...props}>\n {\n Array.from({ length: 5 }).map((_, index) => {\n const fillPercentage =\n index < Math.floor(value)\n ? 100\n : index === Math.floor(value)\n ? (value % 1) * 100\n : 0\n\n return (\n <span class=\"text-muted-foreground/25 relative inline-flex size-[1em]\">\n <Icon name=\"star\" class=\"size-[1em] fill-current\" />\n {fillPercentage > 0 && (\n <span\n class=\"text-primary absolute inset-0 overflow-hidden\"\n style={{ width: `${fillPercentage}%` }}\n >\n <Icon name=\"star\" class=\"size-[1em] fill-current\" />\n </span>\n )}\n </span>\n )\n })\n }\n</div>\n",
10
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\nimport Star from \"@lucide/astro/icons/star\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n value?: number\n}\n\nconst { value = 5, class: className, ...props } = Astro.props\n---\n\n<div class={cn(\"flex items-center gap-1 text-base\", className)} {...props}>\n {\n Array.from({ length: 5 }).map((_, index) => {\n const fillPercentage =\n index < Math.floor(value)\n ? 100\n : index === Math.floor(value)\n ? (value % 1) * 100\n : 0\n\n return (\n <span class=\"text-muted-foreground/25 relative inline-flex size-[1em]\">\n <Star class=\"size-[1em] fill-current\" />\n {fillPercentage > 0 && (\n <span\n class=\"text-primary absolute inset-0 overflow-hidden\"\n style={{ width: `${fillPercentage}%` }}\n >\n <Star class=\"size-[1em] fill-current\" />\n </span>\n )}\n </span>\n )\n })\n }\n</div>\n",
11
11
  "type": "registry:ui"
12
12
  },
13
13
  {