fulldev-ui 0.10.1 → 0.11.1

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 (252) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +7 -1
  3. package/package.json +6 -4
  4. package/public/r/accordion.json +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 +7 -1
  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 +6 -1
  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 +7 -1
  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 +16 -7
  154. package/src/components/blocks/blocks-1.astro +1 -1
  155. package/src/components/blocks/contact-1.astro +74 -40
  156. package/src/components/blocks/contact-2.astro +71 -36
  157. package/src/components/blocks/contact-3.astro +63 -35
  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/blocks/sidebar-1.astro +2 -2
  228. package/src/components/ui/accordion/accordion.astro +1 -0
  229. package/src/components/ui/alert-dialog/alert-dialog.astro +1 -0
  230. package/src/components/ui/banner/banner.astro +23 -41
  231. package/src/components/ui/collapsible/collapsible.astro +1 -0
  232. package/src/components/ui/dialog/dialog.astro +1 -0
  233. package/src/components/ui/dropdown-menu/dropdown-menu.astro +1 -0
  234. package/src/components/ui/hover-card/hover-card.astro +7 -3
  235. package/src/components/ui/icon/icon.astro +46 -29
  236. package/src/components/ui/navigation-menu/navigation-menu.astro +1 -0
  237. package/src/components/ui/popover/popover.astro +1 -0
  238. package/src/components/ui/radio-group/radio-group.astro +1 -0
  239. package/src/components/ui/section/index.ts +2 -0
  240. package/src/components/ui/section/section-container.astro +1 -0
  241. package/src/components/ui/section/section-description.astro +20 -0
  242. package/src/components/ui/section/section-title.astro +20 -0
  243. package/src/components/ui/sheet/sheet-close.astro +4 -2
  244. package/src/components/ui/sheet/sheet.astro +1 -0
  245. package/src/components/ui/slider/slider.astro +1 -0
  246. package/src/components/ui/switch/switch.astro +1 -0
  247. package/src/components/ui/tabs/tabs.astro +1 -0
  248. package/src/components/ui/toggle/toggle.astro +1 -0
  249. package/src/components/ui/tooltip/tooltip.astro +1 -0
  250. package/src/components/ui/typography/typography.astro +1 -1
  251. package/src/lib/pages.ts +12 -0
  252. package/src/styles/global.css +2 -2
@@ -0,0 +1,92 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "blocks",
4
+ "title": "All blocks",
5
+ "description": "Installs every Fulldev UI block.",
6
+ "registryDependencies": [
7
+ "@fulldev/article-1",
8
+ "@fulldev/article-2",
9
+ "@fulldev/articles-1",
10
+ "@fulldev/articles-2",
11
+ "@fulldev/articles-3",
12
+ "@fulldev/articles-4",
13
+ "@fulldev/banner-1",
14
+ "@fulldev/banner-2",
15
+ "@fulldev/blocks-1",
16
+ "@fulldev/contact-1",
17
+ "@fulldev/contact-2",
18
+ "@fulldev/contact-3",
19
+ "@fulldev/content-1",
20
+ "@fulldev/content-2",
21
+ "@fulldev/content-3",
22
+ "@fulldev/content-4",
23
+ "@fulldev/cta-1",
24
+ "@fulldev/cta-2",
25
+ "@fulldev/cta-3",
26
+ "@fulldev/cta-4",
27
+ "@fulldev/cta-5",
28
+ "@fulldev/cta-6",
29
+ "@fulldev/cta-7",
30
+ "@fulldev/cta-8",
31
+ "@fulldev/doc-1",
32
+ "@fulldev/faqs-1",
33
+ "@fulldev/faqs-2",
34
+ "@fulldev/faqs-3",
35
+ "@fulldev/faqs-4",
36
+ "@fulldev/features-1",
37
+ "@fulldev/features-2",
38
+ "@fulldev/features-3",
39
+ "@fulldev/features-4",
40
+ "@fulldev/features-5",
41
+ "@fulldev/features-6",
42
+ "@fulldev/footer-1",
43
+ "@fulldev/footer-2",
44
+ "@fulldev/footer-3",
45
+ "@fulldev/header-1",
46
+ "@fulldev/header-2",
47
+ "@fulldev/header-3",
48
+ "@fulldev/header-4",
49
+ "@fulldev/header-5",
50
+ "@fulldev/hero-1",
51
+ "@fulldev/hero-10",
52
+ "@fulldev/hero-11",
53
+ "@fulldev/hero-12",
54
+ "@fulldev/hero-13",
55
+ "@fulldev/hero-2",
56
+ "@fulldev/hero-3",
57
+ "@fulldev/hero-4",
58
+ "@fulldev/hero-5",
59
+ "@fulldev/hero-6",
60
+ "@fulldev/hero-7",
61
+ "@fulldev/hero-8",
62
+ "@fulldev/hero-9",
63
+ "@fulldev/links-2",
64
+ "@fulldev/logos-1",
65
+ "@fulldev/logos-2",
66
+ "@fulldev/logos-3",
67
+ "@fulldev/pricing-1",
68
+ "@fulldev/pricing-2",
69
+ "@fulldev/pricing-3",
70
+ "@fulldev/product-1",
71
+ "@fulldev/products-1",
72
+ "@fulldev/products-2",
73
+ "@fulldev/products-3",
74
+ "@fulldev/products-4",
75
+ "@fulldev/products-5",
76
+ "@fulldev/reviews-1",
77
+ "@fulldev/reviews-2",
78
+ "@fulldev/reviews-3",
79
+ "@fulldev/reviews-4",
80
+ "@fulldev/reviews-5",
81
+ "@fulldev/services-1",
82
+ "@fulldev/services-2",
83
+ "@fulldev/services-3",
84
+ "@fulldev/services-4",
85
+ "@fulldev/services-5",
86
+ "@fulldev/services-6",
87
+ "@fulldev/services-7",
88
+ "@fulldev/sidebar-1"
89
+ ],
90
+ "docs": "https://ui.full.dev/blocks/",
91
+ "type": "registry:item"
92
+ }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "breadcrumb",
4
+ "title": "Breadcrumb",
5
+ "description": "Displays the path to the current resource using a hierarchy of links.",
4
6
  "dependencies": [
5
7
  "@lucide/astro"
6
8
  ],
@@ -46,5 +48,9 @@
46
48
  "type": "registry:ui"
47
49
  }
48
50
  ],
51
+ "docs": "https://ui.full.dev/components/breadcrumb/",
52
+ "categories": [
53
+ "ui"
54
+ ],
49
55
  "type": "registry:ui"
50
56
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "button",
4
+ "title": "Button",
5
+ "description": "Displays a button or a component that looks like a button.",
4
6
  "files": [
5
7
  {
6
8
  "path": "src/components/ui/button/button-variants.ts",
@@ -18,5 +20,9 @@
18
20
  "type": "registry:ui"
19
21
  }
20
22
  ],
23
+ "docs": "https://ui.full.dev/components/button/",
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": "card",
4
+ "title": "Card",
5
+ "description": "Displays a card with header, content, and footer.",
4
6
  "files": [
5
7
  {
6
8
  "path": "src/components/ui/card/card.astro",
@@ -43,5 +45,9 @@
43
45
  "type": "registry:ui"
44
46
  }
45
47
  ],
48
+ "docs": "https://ui.full.dev/components/card/",
49
+ "categories": [
50
+ "ui"
51
+ ],
46
52
  "type": "registry:ui"
47
53
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "carousel",
4
+ "title": "Carousel",
5
+ "description": "A carousel with motion and swipe built using Embla.",
4
6
  "dependencies": [
5
7
  "embla-carousel",
6
8
  "@lucide/astro"
@@ -40,5 +42,9 @@
40
42
  "type": "registry:ui"
41
43
  }
42
44
  ],
45
+ "docs": "https://ui.full.dev/components/carousel/",
46
+ "categories": [
47
+ "ui"
48
+ ],
43
49
  "type": "registry:ui"
44
50
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "checkbox",
4
+ "title": "Checkbox",
5
+ "description": "A control that allows the user to toggle between checked and not checked.",
4
6
  "files": [
5
7
  {
6
8
  "path": "src/components/ui/checkbox/checkbox.astro",
@@ -13,5 +15,9 @@
13
15
  "type": "registry:ui"
14
16
  }
15
17
  ],
18
+ "docs": "https://ui.full.dev/components/checkbox/",
19
+ "categories": [
20
+ "ui"
21
+ ],
16
22
  "type": "registry:ui"
17
23
  }
@@ -1,13 +1,15 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "collapsible",
4
+ "title": "Collapsible",
5
+ "description": "An interactive component which expands/collapses a panel.",
4
6
  "dependencies": [
5
7
  "@data-slot/collapsible"
6
8
  ],
7
9
  "files": [
8
10
  {
9
11
  "path": "src/components/ui/collapsible/collapsible.astro",
10
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n defaultOpen?: boolean\n hiddenUntilFound?: boolean\n}\n\nconst {\n class: className,\n defaultOpen,\n hiddenUntilFound,\n ...props\n} = Astro.props\n---\n\n<div\n data-slot=\"collapsible\"\n data-default-open={defaultOpen}\n data-hidden-until-found={hiddenUntilFound}\n class={cn(className)}\n {...props}\n>\n <slot />\n</div>\n\n<script>\n import { create } from \"@data-slot/collapsible\"\n\n create()\n</script>\n",
12
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n defaultOpen?: boolean\n hiddenUntilFound?: boolean\n}\n\nconst {\n class: className,\n defaultOpen,\n hiddenUntilFound,\n ...props\n} = Astro.props\n---\n\n<div\n data-slot=\"collapsible\"\n data-default-open={defaultOpen}\n data-hidden-until-found={hiddenUntilFound}\n class={cn(className)}\n {...props}\n>\n <slot />\n</div>\n\n<script>\n import { create } from \"@data-slot/collapsible\"\n\n create()\n document.addEventListener(\"astro:page-load\", () => create())\n</script>\n",
11
13
  "type": "registry:ui"
12
14
  },
13
15
  {
@@ -26,5 +28,9 @@
26
28
  "type": "registry:ui"
27
29
  }
28
30
  ],
31
+ "docs": "https://ui.full.dev/components/collapsible/",
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": "combobox",
4
+ "title": "Combobox",
5
+ "description": "Autocomplete input with a list of suggestions.",
4
6
  "dependencies": [
5
7
  "@data-slot/combobox",
6
8
  "@lucide/astro"
@@ -70,5 +72,9 @@
70
72
  "type": "registry:ui"
71
73
  }
72
74
  ],
75
+ "docs": "https://ui.full.dev/components/combobox/",
76
+ "categories": [
77
+ "ui"
78
+ ],
73
79
  "type": "registry:ui"
74
80
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "command",
4
+ "title": "Command",
5
+ "description": "Command menu for search and quick actions.",
4
6
  "dependencies": [
5
7
  "@data-slot/command",
6
8
  "@lucide/astro"
@@ -60,5 +62,9 @@
60
62
  "type": "registry:ui"
61
63
  }
62
64
  ],
65
+ "docs": "https://ui.full.dev/components/command/",
66
+ "categories": [
67
+ "ui"
68
+ ],
63
69
  "type": "registry:ui"
64
70
  }
@@ -1,16 +1,19 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "components",
4
+ "title": "All components",
5
+ "description": "Installs every Fulldev UI component.",
4
6
  "registryDependencies": [
5
7
  "@fulldev/accordion",
6
8
  "@fulldev/alert",
7
9
  "@fulldev/alert-dialog",
8
- "@fulldev/form",
9
10
  "@fulldev/avatar",
10
11
  "@fulldev/badge",
11
12
  "@fulldev/banner",
13
+ "@fulldev/breadcrumb",
12
14
  "@fulldev/button",
13
15
  "@fulldev/card",
16
+ "@fulldev/carousel",
14
17
  "@fulldev/checkbox",
15
18
  "@fulldev/collapsible",
16
19
  "@fulldev/combobox",
@@ -19,25 +22,31 @@
19
22
  "@fulldev/dropdown-menu",
20
23
  "@fulldev/empty",
21
24
  "@fulldev/field",
25
+ "@fulldev/form",
22
26
  "@fulldev/header",
27
+ "@fulldev/hover-card",
28
+ "@fulldev/icon",
23
29
  "@fulldev/input",
24
30
  "@fulldev/input-group",
25
31
  "@fulldev/item",
32
+ "@fulldev/kbd",
26
33
  "@fulldev/label",
34
+ "@fulldev/layout",
27
35
  "@fulldev/logo",
28
36
  "@fulldev/marquee",
29
37
  "@fulldev/native-select",
30
38
  "@fulldev/navigation-menu",
39
+ "@fulldev/popover",
31
40
  "@fulldev/price",
32
41
  "@fulldev/radio-group",
33
42
  "@fulldev/rating",
34
- "@fulldev/select",
35
43
  "@fulldev/section",
44
+ "@fulldev/select",
36
45
  "@fulldev/separator",
37
46
  "@fulldev/sheet",
38
47
  "@fulldev/sidebar",
39
- "@fulldev/slider",
40
48
  "@fulldev/skeleton",
49
+ "@fulldev/slider",
41
50
  "@fulldev/spinner",
42
51
  "@fulldev/switch",
43
52
  "@fulldev/table",
@@ -45,9 +54,11 @@
45
54
  "@fulldev/textarea",
46
55
  "@fulldev/theme-toggle",
47
56
  "@fulldev/toc",
57
+ "@fulldev/toggle",
48
58
  "@fulldev/tooltip",
49
59
  "@fulldev/typography",
50
60
  "@fulldev/video"
51
61
  ],
62
+ "docs": "https://ui.full.dev/components/",
52
63
  "type": "registry:item"
53
64
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "contact-1",
4
+ "title": "Contact 1",
5
+ "description": "Contact sections for project inquiries, support, and sales conversations.",
4
6
  "dependencies": [
5
7
  "@lucide/astro"
6
8
  ],
@@ -9,14 +11,20 @@
9
11
  "@fulldev/field",
10
12
  "@fulldev/input",
11
13
  "@fulldev/section",
12
- "@fulldev/textarea"
14
+ "@fulldev/textarea",
15
+ "@fulldev/form",
16
+ "@fulldev/icon"
13
17
  ],
14
18
  "files": [
15
19
  {
16
20
  "path": "src/components/blocks/contact-1.astro",
17
- "content": "---\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n Field,\n FieldDescription,\n FieldGroup,\n FieldLabel,\n FieldLegend,\n FieldSet,\n} from \"@/components/ui/field\"\nimport { Icon } from \"@/components/ui/icon\"\nimport { Input } from \"@/components/ui/input\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\nimport { Textarea } from \"@/components/ui/textarea\"\n\ntype Props = {\n class?: string\n title: string\n description: string\n contactItems: {\n icon: string\n title: string\n description: string\n href?: string\n }[]\n form: {\n legend: string\n nameLabel: string\n namePlaceholder: string\n emailLabel: string\n emailPlaceholder: string\n messageLabel: string\n messagePlaceholder: string\n messageDescription: string\n actionLabel: string\n }\n}\n\nconst { class: className, title, description, contactItems, form } = Astro.props\n---\n\n<Section class={cn(\"\", className)}>\n <SectionContainer class=\"items-center gap-6 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 <p\n class=\"text-muted-foreground max-w-2xl text-lg leading-relaxed text-balance\"\n >\n {description}\n </p>\n </div>\n </SectionContainer>\n <SectionContainer>\n <div class=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n {\n contactItems.map((item) => (\n <div class=\"flex flex-col gap-3 rounded-xl border p-5\">\n {item.href ? (\n <Button\n as=\"a\"\n href={item.href}\n variant=\"secondary\"\n size=\"icon\"\n class=\"text-primary\"\n aria-label={item.title}\n >\n <Icon name={item.icon} />\n </Button>\n ) : (\n <Button\n variant=\"secondary\"\n size=\"icon\"\n class=\"text-primary\"\n aria-label={item.title}\n >\n <Icon name={item.icon} />\n </Button>\n )}\n <h3 class=\"text-foreground text-sm font-medium\">{item.title}</h3>\n <p class=\"text-muted-foreground text-sm leading-relaxed\">\n {item.description}\n </p>\n </div>\n ))\n }\n </div>\n </SectionContainer>\n <SectionContainer>\n <div class=\"mx-auto w-full max-w-2xl rounded-xl border p-6 sm:p-8\">\n <FieldSet>\n <FieldLegend class=\"sr-only\">{form.legend}</FieldLegend>\n <FieldGroup>\n <div class=\"grid gap-4 md:grid-cols-2\">\n <Field>\n <FieldLabel for=\"contact-name-1\">{form.nameLabel}</FieldLabel>\n <Input id=\"contact-name-1\" placeholder={form.namePlaceholder} />\n </Field>\n <Field>\n <FieldLabel for=\"contact-email-1\">{form.emailLabel}</FieldLabel>\n <Input\n id=\"contact-email-1\"\n type=\"email\"\n placeholder={form.emailPlaceholder}\n />\n </Field>\n </div>\n <Field>\n <FieldLabel for=\"contact-message-1\">{form.messageLabel}</FieldLabel>\n <Textarea\n id=\"contact-message-1\"\n rows={5}\n placeholder={form.messagePlaceholder}\n />\n <FieldDescription>{form.messageDescription}</FieldDescription>\n </Field>\n <Button size=\"lg\" class=\"w-full\">{form.actionLabel}</Button>\n </FieldGroup>\n </FieldSet>\n </div>\n </SectionContainer>\n</Section>\n",
21
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n Field,\n FieldDescription,\n FieldGroup,\n FieldLabel,\n FieldLegend,\n FieldSet,\n} from \"@/components/ui/field\"\nimport { Form } from \"@/components/ui/form\"\nimport { Icon } from \"@/components/ui/icon\"\nimport { Input } from \"@/components/ui/input\"\nimport {\n Section,\n SectionContainer,\n SectionDescription,\n SectionTitle,\n} from \"@/components/ui/section\"\nimport { Textarea } from \"@/components/ui/textarea\"\n\ntype Props = HTMLAttributes<\"section\"> & {\n title: string\n description: string\n contactItems: {\n icon: string\n title: string\n description: string\n href?: string\n }[]\n form: {\n id?: string\n action?: string\n method?: \"get\" | \"post\"\n legend: string\n nameLabel: string\n namePlaceholder: string\n emailLabel: string\n emailPlaceholder: string\n messageLabel: string\n messagePlaceholder: string\n messageDescription: string\n actionLabel: string\n }\n}\n\nconst {\n class: className,\n title,\n description,\n contactItems,\n form,\n ...props\n} = Astro.props\nconst formId = form.id ?? `contact-${crypto.randomUUID()}`\n---\n\n<Section class={cn(\"\", className)} {...props}>\n <SectionContainer class=\"items-center gap-6 text-center\">\n <div class=\"flex max-w-2xl flex-col items-center gap-4\">\n <SectionTitle>\n {title}\n </SectionTitle>\n <SectionDescription class=\"max-w-2xl\">\n {description}\n </SectionDescription>\n </div>\n </SectionContainer>\n <SectionContainer>\n <div class=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n {\n contactItems.map((item) => (\n <div class=\"flex flex-col gap-3 rounded-xl border p-5\">\n {item.href ? (\n <Button\n as=\"a\"\n href={item.href}\n variant=\"secondary\"\n size=\"icon\"\n class=\"text-primary\"\n aria-label={item.title}\n >\n <Icon name={item.icon} />\n </Button>\n ) : (\n <Button\n as=\"span\"\n variant=\"secondary\"\n size=\"icon\"\n class=\"text-primary\"\n aria-hidden=\"true\"\n >\n <Icon name={item.icon} />\n </Button>\n )}\n <h3 class=\"text-foreground text-sm font-medium\">{item.title}</h3>\n <p class=\"text-muted-foreground text-sm leading-relaxed\">\n {item.description}\n </p>\n </div>\n ))\n }\n </div>\n </SectionContainer>\n <SectionContainer>\n <div class=\"mx-auto w-full max-w-2xl rounded-xl border p-6 sm:p-8\">\n <Form id={formId} action={form.action} method={form.method ?? \"post\"}>\n <FieldSet>\n <FieldLegend class=\"sr-only\">{form.legend}</FieldLegend>\n <FieldGroup>\n <div class=\"grid gap-4 md:grid-cols-2\">\n <Field>\n <FieldLabel for={`${formId}-name`}>{form.nameLabel}</FieldLabel>\n <Input\n id={`${formId}-name`}\n name=\"name\"\n autocomplete=\"name\"\n required\n placeholder={form.namePlaceholder}\n />\n </Field>\n <Field>\n <FieldLabel for={`${formId}-email`}\n >{form.emailLabel}</FieldLabel\n >\n <Input\n id={`${formId}-email`}\n name=\"email\"\n autocomplete=\"email\"\n required\n type=\"email\"\n placeholder={form.emailPlaceholder}\n />\n </Field>\n </div>\n <Field>\n <FieldLabel for={`${formId}-message`}\n >{form.messageLabel}</FieldLabel\n >\n <Textarea\n id={`${formId}-message`}\n name=\"message\"\n required\n rows={5}\n placeholder={form.messagePlaceholder}\n />\n <FieldDescription>{form.messageDescription}</FieldDescription>\n </Field>\n <Button type=\"submit\" size=\"lg\" class=\"w-full\"\n >{form.actionLabel}</Button\n >\n </FieldGroup>\n </FieldSet>\n </Form>\n </div>\n </SectionContainer>\n</Section>\n",
18
22
  "type": "registry:block"
19
23
  }
20
24
  ],
25
+ "docs": "https://ui.full.dev/blocks/contact/",
26
+ "categories": [
27
+ "contact"
28
+ ],
21
29
  "type": "registry:block"
22
30
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "contact-2",
4
+ "title": "Contact 2",
5
+ "description": "Contact sections for project inquiries, support, and sales conversations.",
4
6
  "dependencies": [
5
7
  "@lucide/astro"
6
8
  ],
@@ -9,14 +11,20 @@
9
11
  "@fulldev/field",
10
12
  "@fulldev/input",
11
13
  "@fulldev/section",
12
- "@fulldev/textarea"
14
+ "@fulldev/textarea",
15
+ "@fulldev/form",
16
+ "@fulldev/icon"
13
17
  ],
14
18
  "files": [
15
19
  {
16
20
  "path": "src/components/blocks/contact-2.astro",
17
- "content": "---\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n Field,\n FieldGroup,\n FieldLabel,\n FieldLegend,\n FieldSet,\n} from \"@/components/ui/field\"\nimport { Icon } from \"@/components/ui/icon\"\nimport { Input } from \"@/components/ui/input\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\nimport { Textarea } from \"@/components/ui/textarea\"\n\ntype Props = {\n class?: string\n title: string\n description: string\n contactItems: {\n icon: string\n title: string\n description: string\n href?: string\n }[]\n form: {\n title: string\n legend: string\n nameLabel: string\n namePlaceholder: string\n emailLabel: string\n emailPlaceholder: string\n messageLabel: string\n messagePlaceholder: string\n actionLabel: string\n }\n}\n\nconst { class: className, title, description, contactItems, form } = Astro.props\n---\n\n<Section class={cn(\"\", className)}>\n <SectionContainer\n class=\"grid gap-10 lg:grid-cols-[minmax(0,1fr)_22rem] lg:items-start\"\n >\n <div class=\"flex flex-col gap-6\">\n <div class=\"flex flex-col 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 <p class=\"text-muted-foreground max-w-xl text-base leading-relaxed\">\n {description}\n </p>\n </div>\n <div class=\"rounded-xl border p-6\">\n <div class=\"mb-6\">\n <h3 class=\"text-lg font-medium\">{form.title}</h3>\n </div>\n <FieldSet>\n <FieldLegend class=\"sr-only\">{form.legend}</FieldLegend>\n <FieldGroup>\n <div class=\"grid gap-4 md:grid-cols-2\">\n <Field>\n <FieldLabel for=\"contact-name-2\">{form.nameLabel}</FieldLabel>\n <Input id=\"contact-name-2\" placeholder={form.namePlaceholder} />\n </Field>\n <Field>\n <FieldLabel for=\"contact-email-2\">{form.emailLabel}</FieldLabel>\n <Input\n id=\"contact-email-2\"\n type=\"email\"\n placeholder={form.emailPlaceholder}\n />\n </Field>\n </div>\n <Field>\n <FieldLabel for=\"contact-message-2\"\n >{form.messageLabel}</FieldLabel\n >\n <Textarea\n id=\"contact-message-2\"\n rows={5}\n placeholder={form.messagePlaceholder}\n />\n </Field>\n <Button size=\"lg\" class=\"w-full\">{form.actionLabel}</Button>\n </FieldGroup>\n </FieldSet>\n </div>\n </div>\n\n <div class=\"flex flex-col gap-3\">\n {\n contactItems.map((item) => (\n <div class=\"flex gap-4 rounded-xl border p-4\">\n {item.href ? (\n <Button\n as=\"a\"\n href={item.href}\n variant=\"secondary\"\n size=\"icon\"\n class=\"text-primary shrink-0\"\n aria-label={item.title}\n >\n <Icon name={item.icon} />\n </Button>\n ) : (\n <Button\n variant=\"secondary\"\n size=\"icon\"\n class=\"text-primary shrink-0\"\n aria-label={item.title}\n >\n <Icon name={item.icon} />\n </Button>\n )}\n <div class=\"flex flex-col gap-1\">\n <p class=\"text-foreground text-sm font-medium\">{item.title}</p>\n <p class=\"text-muted-foreground text-sm leading-relaxed\">\n {item.description}\n </p>\n </div>\n </div>\n ))\n }\n </div>\n </SectionContainer>\n</Section>\n",
21
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n Field,\n FieldGroup,\n FieldLabel,\n FieldLegend,\n FieldSet,\n} from \"@/components/ui/field\"\nimport { Form } from \"@/components/ui/form\"\nimport { Icon } from \"@/components/ui/icon\"\nimport { Input } from \"@/components/ui/input\"\nimport {\n Section,\n SectionContainer,\n SectionTitle,\n} from \"@/components/ui/section\"\nimport { Textarea } from \"@/components/ui/textarea\"\n\ntype Props = HTMLAttributes<\"section\"> & {\n title: string\n description: string\n contactItems: {\n icon: string\n title: string\n description: string\n href?: string\n }[]\n form: {\n id?: string\n action?: string\n method?: \"get\" | \"post\"\n title: string\n legend: string\n nameLabel: string\n namePlaceholder: string\n emailLabel: string\n emailPlaceholder: string\n messageLabel: string\n messagePlaceholder: string\n actionLabel: string\n }\n}\n\nconst {\n class: className,\n title,\n description,\n contactItems,\n form,\n ...props\n} = Astro.props\nconst formId = form.id ?? `contact-${crypto.randomUUID()}`\n---\n\n<Section class={cn(\"\", className)} {...props}>\n <SectionContainer\n class=\"grid gap-10 lg:grid-cols-[minmax(0,1fr)_22rem] lg:items-start\"\n >\n <div class=\"flex flex-col gap-6\">\n <div class=\"flex flex-col gap-4\">\n <SectionTitle>\n {title}\n </SectionTitle>\n <p class=\"text-muted-foreground max-w-xl text-base leading-relaxed\">\n {description}\n </p>\n </div>\n <div class=\"rounded-xl border p-6\">\n <div class=\"mb-6\">\n <h3 class=\"text-lg font-medium\">{form.title}</h3>\n </div>\n <Form id={formId} action={form.action} method={form.method ?? \"post\"}>\n <FieldSet>\n <FieldLegend class=\"sr-only\">{form.legend}</FieldLegend>\n <FieldGroup>\n <div class=\"grid gap-4 md:grid-cols-2\">\n <Field>\n <FieldLabel for={`${formId}-name`}\n >{form.nameLabel}</FieldLabel\n >\n <Input\n id={`${formId}-name`}\n name=\"name\"\n autocomplete=\"name\"\n required\n placeholder={form.namePlaceholder}\n />\n </Field>\n <Field>\n <FieldLabel for={`${formId}-email`}\n >{form.emailLabel}</FieldLabel\n >\n <Input\n id={`${formId}-email`}\n name=\"email\"\n autocomplete=\"email\"\n required\n type=\"email\"\n placeholder={form.emailPlaceholder}\n />\n </Field>\n </div>\n <Field>\n <FieldLabel for={`${formId}-message`}\n >{form.messageLabel}</FieldLabel\n >\n <Textarea\n id={`${formId}-message`}\n name=\"message\"\n required\n rows={5}\n placeholder={form.messagePlaceholder}\n />\n </Field>\n <Button type=\"submit\" size=\"lg\" class=\"w-full\"\n >{form.actionLabel}</Button\n >\n </FieldGroup>\n </FieldSet>\n </Form>\n </div>\n </div>\n\n <div class=\"flex flex-col gap-3\">\n {\n contactItems.map((item) => (\n <div class=\"flex gap-4 rounded-xl border p-4\">\n {item.href ? (\n <Button\n as=\"a\"\n href={item.href}\n variant=\"secondary\"\n size=\"icon\"\n class=\"text-primary shrink-0\"\n aria-label={item.title}\n >\n <Icon name={item.icon} />\n </Button>\n ) : (\n <Button\n as=\"span\"\n variant=\"secondary\"\n size=\"icon\"\n class=\"text-primary shrink-0\"\n aria-hidden=\"true\"\n >\n <Icon name={item.icon} />\n </Button>\n )}\n <div class=\"flex flex-col gap-1\">\n <p class=\"text-foreground text-sm font-medium\">{item.title}</p>\n <p class=\"text-muted-foreground text-sm leading-relaxed\">\n {item.description}\n </p>\n </div>\n </div>\n ))\n }\n </div>\n </SectionContainer>\n</Section>\n",
18
22
  "type": "registry:block"
19
23
  }
20
24
  ],
25
+ "docs": "https://ui.full.dev/blocks/contact/",
26
+ "categories": [
27
+ "contact"
28
+ ],
21
29
  "type": "registry:block"
22
30
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "contact-3",
4
+ "title": "Contact 3",
5
+ "description": "Contact sections for project inquiries, support, and sales conversations.",
4
6
  "dependencies": [
5
7
  "@lucide/astro"
6
8
  ],
@@ -9,12 +11,14 @@
9
11
  "@fulldev/field",
10
12
  "@fulldev/input",
11
13
  "@fulldev/section",
12
- "@fulldev/textarea"
14
+ "@fulldev/textarea",
15
+ "@fulldev/form",
16
+ "@fulldev/icon"
13
17
  ],
14
18
  "files": [
15
19
  {
16
20
  "path": "src/components/blocks/contact-3.astro",
17
- "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 Field,\n FieldGroup,\n FieldLabel,\n FieldLegend,\n FieldSet,\n} from \"@/components/ui/field\"\nimport { Icon } from \"@/components/ui/icon\"\nimport { Input } from \"@/components/ui/input\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\nimport { Textarea } from \"@/components/ui/textarea\"\nimport PlaceholderImage from \"@/assets/placeholder.webp\"\n\ntype Props = {\n class?: string\n title: string\n description: string\n contactItems: {\n icon: string\n title: string\n description: string\n href?: string\n }[]\n form: {\n legend: string\n nameLabel: string\n namePlaceholder: string\n emailLabel: string\n emailPlaceholder: string\n messageLabel: string\n messagePlaceholder: string\n actionLabel: string\n }\n image?: {\n src: ImageMetadata\n alt: string\n }\n}\n\nconst {\n class: className,\n title,\n description,\n contactItems,\n form,\n image = { src: PlaceholderImage, alt: \"Contact image\" },\n} = Astro.props\n---\n\n<Section class={cn(\"\", className)}>\n <SectionContainer class=\"grid gap-12 lg:grid-cols-2 lg:items-start\">\n <div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col 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 <p class=\"text-muted-foreground max-w-xl text-base leading-relaxed\">\n {description}\n </p>\n </div>\n <div class=\"grid gap-4 sm:grid-cols-2\">\n {\n contactItems.map((item) => (\n <div class=\"flex gap-4\">\n {item.href ? (\n <Button\n as=\"a\"\n href={item.href}\n variant=\"secondary\"\n size=\"icon\"\n class=\"text-primary shrink-0\"\n aria-label={item.title}\n >\n <Icon name={item.icon} />\n </Button>\n ) : (\n <Button\n variant=\"secondary\"\n size=\"icon\"\n class=\"text-primary shrink-0\"\n aria-label={item.title}\n >\n <Icon name={item.icon} />\n </Button>\n )}\n <div class=\"flex flex-col gap-1\">\n <p class=\"text-foreground text-sm font-medium\">{item.title}</p>\n <p class=\"text-muted-foreground text-sm leading-relaxed\">\n {item.description}\n </p>\n </div>\n </div>\n ))\n }\n </div>\n <div class=\"rounded-xl border p-6\">\n <FieldSet>\n <FieldLegend class=\"sr-only\">{form.legend}</FieldLegend>\n <FieldGroup>\n <div class=\"grid gap-4 md:grid-cols-2\">\n <Field>\n <FieldLabel for=\"contact-name-3\">{form.nameLabel}</FieldLabel>\n <Input id=\"contact-name-3\" placeholder={form.namePlaceholder} />\n </Field>\n <Field>\n <FieldLabel for=\"contact-email-3\">{form.emailLabel}</FieldLabel>\n <Input\n id=\"contact-email-3\"\n type=\"email\"\n placeholder={form.emailPlaceholder}\n />\n </Field>\n </div>\n <Field>\n <FieldLabel for=\"contact-message-3\"\n >{form.messageLabel}</FieldLabel\n >\n <Textarea\n id=\"contact-message-3\"\n rows={5}\n placeholder={form.messagePlaceholder}\n />\n </Field>\n <Button size=\"lg\" class=\"w-full\">{form.actionLabel}</Button>\n </FieldGroup>\n </FieldSet>\n </div>\n </div>\n <Image\n src={image.src}\n alt={image.alt}\n class=\"aspect-[3/4] w-full rounded-xl border object-cover lg:sticky lg:top-24\"\n widths={[640, 960, 1280]}\n sizes=\"(min-width: 1024px) 50vw, 100vw\"\n />\n </SectionContainer>\n</Section>\n",
21
+ "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n Field,\n FieldGroup,\n FieldLabel,\n FieldLegend,\n FieldSet,\n} from \"@/components/ui/field\"\nimport { Form } from \"@/components/ui/form\"\nimport { Icon } from \"@/components/ui/icon\"\nimport { Input } from \"@/components/ui/input\"\nimport {\n Section,\n SectionContainer,\n SectionTitle,\n} from \"@/components/ui/section\"\nimport { Textarea } from \"@/components/ui/textarea\"\nimport PlaceholderImage from \"@/assets/placeholder.webp\"\n\ntype Props = HTMLAttributes<\"section\"> & {\n title: string\n description: string\n contactItems: {\n icon: string\n title: string\n description: string\n href?: string\n }[]\n form: {\n id?: string\n action?: string\n method?: \"get\" | \"post\"\n legend: string\n nameLabel: string\n namePlaceholder: string\n emailLabel: string\n emailPlaceholder: string\n messageLabel: string\n messagePlaceholder: string\n actionLabel: string\n }\n image?: {\n src: ImageMetadata\n alt: string\n }\n}\n\nconst {\n class: className,\n title,\n description,\n contactItems,\n form,\n image = { src: PlaceholderImage, alt: \"Contact image\" },\n ...props\n} = Astro.props\nconst formId = form.id ?? `contact-${crypto.randomUUID()}`\n---\n\n<Section class={cn(\"\", className)} {...props}>\n <SectionContainer class=\"grid gap-12 lg:grid-cols-2 lg:items-start\">\n <div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col gap-4\">\n <SectionTitle>\n {title}\n </SectionTitle>\n <p class=\"text-muted-foreground max-w-xl text-base leading-relaxed\">\n {description}\n </p>\n </div>\n <div class=\"grid gap-4 sm:grid-cols-2\">\n {\n contactItems.map((item) => (\n <div class=\"flex gap-4\">\n {item.href ? (\n <Button\n as=\"a\"\n href={item.href}\n variant=\"secondary\"\n size=\"icon\"\n class=\"text-primary shrink-0\"\n aria-label={item.title}\n >\n <Icon name={item.icon} />\n </Button>\n ) : (\n <Button\n as=\"span\"\n variant=\"secondary\"\n size=\"icon\"\n class=\"text-primary shrink-0\"\n aria-hidden=\"true\"\n >\n <Icon name={item.icon} />\n </Button>\n )}\n <div class=\"flex flex-col gap-1\">\n <p class=\"text-foreground text-sm font-medium\">{item.title}</p>\n <p class=\"text-muted-foreground text-sm leading-relaxed\">\n {item.description}\n </p>\n </div>\n </div>\n ))\n }\n </div>\n <div class=\"rounded-xl border p-6\">\n <Form id={formId} action={form.action} method={form.method ?? \"post\"}>\n <FieldSet>\n <FieldLegend class=\"sr-only\">{form.legend}</FieldLegend>\n <FieldGroup>\n <div class=\"grid gap-4 md:grid-cols-2\">\n <Field>\n <FieldLabel for={`${formId}-name`}\n >{form.nameLabel}</FieldLabel\n >\n <Input\n id={`${formId}-name`}\n name=\"name\"\n autocomplete=\"name\"\n required\n placeholder={form.namePlaceholder}\n />\n </Field>\n <Field>\n <FieldLabel for={`${formId}-email`}\n >{form.emailLabel}</FieldLabel\n >\n <Input\n id={`${formId}-email`}\n name=\"email\"\n autocomplete=\"email\"\n required\n type=\"email\"\n placeholder={form.emailPlaceholder}\n />\n </Field>\n </div>\n <Field>\n <FieldLabel for={`${formId}-message`}\n >{form.messageLabel}</FieldLabel\n >\n <Textarea\n id={`${formId}-message`}\n name=\"message\"\n required\n rows={5}\n placeholder={form.messagePlaceholder}\n />\n </Field>\n <Button type=\"submit\" size=\"lg\" class=\"w-full\"\n >{form.actionLabel}</Button\n >\n </FieldGroup>\n </FieldSet>\n </Form>\n </div>\n </div>\n <Image\n src={image.src}\n alt={image.alt}\n class=\"aspect-[3/4] w-full rounded-xl border object-cover lg:sticky lg:top-24\"\n widths={[640, 960, 1280]}\n sizes=\"(min-width: 1024px) 50vw, 100vw\"\n />\n </SectionContainer>\n</Section>\n",
18
22
  "type": "registry:block"
19
23
  },
20
24
  {
@@ -24,5 +28,9 @@
24
28
  "target": "src/assets/placeholder.webp"
25
29
  }
26
30
  ],
31
+ "docs": "https://ui.full.dev/blocks/contact/",
32
+ "categories": [
33
+ "contact"
34
+ ],
27
35
  "type": "registry:block"
28
36
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "content-1",
4
+ "title": "Content 1",
5
+ "description": "Flexible narrative content sections for explainers, comparisons, and supporting context.",
4
6
  "dependencies": [
5
7
  "@lucide/astro"
6
8
  ],
@@ -11,7 +13,7 @@
11
13
  "files": [
12
14
  {
13
15
  "path": "src/components/blocks/content-1.astro",
14
- "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\nimport { CheckIcon } from \"@lucide/astro\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\nimport PlaceholderImage from \"@/assets/placeholder.webp\"\n\ntype Props = {\n class?: string\n title: string\n description: string\n features?: string[]\n buttons?: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n image?: {\n src: ImageMetadata\n alt: string\n }\n}\n\nconst {\n class: className,\n title,\n description,\n features,\n buttons,\n image = { src: PlaceholderImage, alt: \"Content image\" },\n} = Astro.props\n---\n\n<Section class={cn(\"\", className)}>\n <SectionContainer class=\"gap-6\">\n <div class=\"flex flex-col 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 <p class=\"text-muted-foreground text-lg leading-relaxed text-balance\">\n {description}\n </p>\n </div>\n {\n features?.length && (\n <ul class=\"flex flex-col gap-3\">\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 </ul>\n )\n }\n {\n buttons?.length && (\n <div class=\"flex flex-wrap gap-3\">\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 </div>\n )\n }\n </SectionContainer>\n <SectionContainer>\n <Image\n src={image.src}\n alt={image.alt}\n class=\"aspect-video w-full rounded-xl border object-cover\"\n widths={[640, 960, 1280, 1536]}\n sizes=\"(min-width: 80rem) 80rem, 100vw\"\n />\n </SectionContainer>\n</Section>\n",
16
+ "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\nimport type { HTMLAttributes } from \"astro/types\"\nimport { CheckIcon } from \"@lucide/astro\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport { Icon } from \"@/components/ui/icon\"\nimport {\n Section,\n SectionContainer,\n SectionDescription,\n SectionTitle,\n} from \"@/components/ui/section\"\nimport PlaceholderImage from \"@/assets/placeholder.webp\"\n\ntype Props = HTMLAttributes<\"section\"> & {\n title: string\n description: string\n features?: string[]\n buttons?: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n image?: {\n src: ImageMetadata\n alt: string\n }\n}\n\nconst {\n class: className,\n title,\n description,\n features,\n buttons,\n image = { src: PlaceholderImage, alt: \"Content image\" },\n ...props\n} = Astro.props\n---\n\n<Section class={cn(\"\", className)} {...props}>\n <SectionContainer class=\"gap-6\">\n <div class=\"flex flex-col gap-4\">\n <SectionTitle>\n {title}\n </SectionTitle>\n <SectionDescription>\n {description}\n </SectionDescription>\n </div>\n {\n features?.length && (\n <ul class=\"flex flex-col gap-3\">\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 </ul>\n )\n }\n {\n buttons?.length && (\n <div class=\"flex flex-wrap gap-3\">\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 </div>\n )\n }\n </SectionContainer>\n <SectionContainer>\n <Image\n src={image.src}\n alt={image.alt}\n class=\"aspect-video w-full rounded-xl border object-cover\"\n widths={[640, 960, 1280, 1536]}\n sizes=\"(min-width: 80rem) 80rem, 100vw\"\n />\n </SectionContainer>\n</Section>\n",
15
17
  "type": "registry:block"
16
18
  },
17
19
  {
@@ -21,5 +23,9 @@
21
23
  "target": "src/assets/placeholder.webp"
22
24
  }
23
25
  ],
26
+ "docs": "https://ui.full.dev/blocks/content/",
27
+ "categories": [
28
+ "content"
29
+ ],
24
30
  "type": "registry:block"
25
31
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "content-2",
4
+ "title": "Content 2",
5
+ "description": "Flexible narrative content sections for explainers, comparisons, and supporting context.",
4
6
  "dependencies": [
5
7
  "@lucide/astro"
6
8
  ],
@@ -11,7 +13,7 @@
11
13
  "files": [
12
14
  {
13
15
  "path": "src/components/blocks/content-2.astro",
14
- "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\nimport { CheckIcon } from \"@lucide/astro\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\nimport PlaceholderImage from \"@/assets/placeholder.webp\"\n\ntype Props = {\n class?: string\n title: string\n description: string\n features?: string[]\n buttons?: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n image?: {\n src: ImageMetadata\n alt: string\n }\n}\n\nconst {\n class: className,\n title,\n description,\n features,\n buttons,\n image = { src: PlaceholderImage, alt: \"Content image\" },\n} = Astro.props\n---\n\n<Section class={cn(\"\", className)}>\n <SectionContainer class=\"grid gap-12 lg:grid-cols-2 lg:items-center\">\n <div class=\"flex flex-col gap-6\">\n <div class=\"flex flex-col gap-4\">\n <h2\n class=\"text-foreground text-3xl font-semibold tracking-tight text-balance sm:text-4xl\"\n >\n {title}\n </h2>\n <p class=\"text-muted-foreground text-lg leading-relaxed text-balance\">\n {description}\n </p>\n </div>\n {\n features?.length && (\n <ul class=\"flex flex-col gap-3\">\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 </ul>\n )\n }\n {\n buttons?.length && (\n <div class=\"flex flex-wrap gap-3\">\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 </div>\n )\n }\n </div>\n <Image\n src={image.src}\n alt={image.alt}\n class=\"aspect-[4/3] w-full rounded-xl border object-cover\"\n widths={[640, 960, 1280]}\n sizes=\"(min-width: 1024px) 50vw, 100vw\"\n />\n </SectionContainer>\n</Section>\n",
16
+ "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\nimport type { HTMLAttributes } from \"astro/types\"\nimport { CheckIcon } from \"@lucide/astro\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport { Icon } from \"@/components/ui/icon\"\nimport {\n Section,\n SectionContainer,\n SectionDescription,\n SectionTitle,\n} from \"@/components/ui/section\"\nimport PlaceholderImage from \"@/assets/placeholder.webp\"\n\ntype Props = HTMLAttributes<\"section\"> & {\n title: string\n description: string\n features?: string[]\n buttons?: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n image?: {\n src: ImageMetadata\n alt: string\n }\n}\n\nconst {\n class: className,\n title,\n description,\n features,\n buttons,\n image = { src: PlaceholderImage, alt: \"Content image\" },\n ...props\n} = Astro.props\n---\n\n<Section class={cn(\"\", className)} {...props}>\n <SectionContainer class=\"grid gap-12 lg:grid-cols-2 lg:items-center\">\n <div class=\"flex flex-col gap-6\">\n <div class=\"flex flex-col gap-4\">\n <SectionTitle>\n {title}\n </SectionTitle>\n <SectionDescription>\n {description}\n </SectionDescription>\n </div>\n {\n features?.length && (\n <ul class=\"flex flex-col gap-3\">\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 </ul>\n )\n }\n {\n buttons?.length && (\n <div class=\"flex flex-wrap gap-3\">\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 </div>\n )\n }\n </div>\n <Image\n src={image.src}\n alt={image.alt}\n class=\"aspect-[4/3] w-full rounded-xl border object-cover\"\n widths={[640, 960, 1280]}\n sizes=\"(min-width: 1024px) 50vw, 100vw\"\n />\n </SectionContainer>\n</Section>\n",
15
17
  "type": "registry:block"
16
18
  },
17
19
  {
@@ -21,5 +23,9 @@
21
23
  "target": "src/assets/placeholder.webp"
22
24
  }
23
25
  ],
26
+ "docs": "https://ui.full.dev/blocks/content/",
27
+ "categories": [
28
+ "content"
29
+ ],
24
30
  "type": "registry:block"
25
31
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "content-3",
4
+ "title": "Content 3",
5
+ "description": "Flexible narrative content sections for explainers, comparisons, and supporting context.",
4
6
  "registryDependencies": [
5
7
  "@fulldev/button",
6
8
  "@fulldev/section"
@@ -8,7 +10,7 @@
8
10
  "files": [
9
11
  {
10
12
  "path": "src/components/blocks/content-3.astro",
11
- "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport { Section, SectionContainer } from \"@/components/ui/section\"\nimport PlaceholderImage from \"@/assets/placeholder.webp\"\n\ntype Props = {\n class?: string\n title: string\n description: string\n buttons?: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n image?: {\n src: ImageMetadata\n alt: string\n }\n}\n\nconst {\n class: className,\n title,\n description,\n buttons,\n image = { src: PlaceholderImage, alt: \"Content image\" },\n} = 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-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 {\n buttons?.length && (\n <div class=\"flex flex-wrap gap-3\">\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 </div>\n )\n }\n </div>\n </SectionContainer>\n <SectionContainer>\n <Image\n src={image.src}\n alt={image.alt}\n class=\"aspect-video w-full rounded-xl border object-cover\"\n widths={[640, 960, 1280, 1536]}\n sizes=\"(min-width: 80rem) 80rem, 100vw\"\n />\n </SectionContainer>\n</Section>\n",
13
+ "content": "---\nimport type { ImageMetadata } from \"astro\"\nimport { Image } from \"astro:assets\"\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport {\n Section,\n SectionContainer,\n SectionDescription,\n SectionTitle,\n} from \"@/components/ui/section\"\nimport PlaceholderImage from \"@/assets/placeholder.webp\"\n\ntype Props = HTMLAttributes<\"section\"> & {\n title: string\n description: string\n buttons?: {\n label: string\n href: string\n variant?: \"default\" | \"outline\" | \"secondary\" | \"ghost\"\n }[]\n image?: {\n src: ImageMetadata\n alt: string\n }\n}\n\nconst {\n class: className,\n title,\n description,\n buttons,\n image = { src: PlaceholderImage, alt: \"Content image\" },\n ...props\n} = Astro.props\n---\n\n<Section class={cn(\"\", className)} {...props}>\n <SectionContainer class=\"gap-8\">\n <div\n class=\"flex flex-col gap-4 md:flex-row md:items-end md:justify-between\"\n >\n <div class=\"max-w-2xl\">\n <SectionTitle>\n {title}\n </SectionTitle>\n <SectionDescription class=\"mt-4\">\n {description}\n </SectionDescription>\n </div>\n {\n buttons?.length && (\n <div class=\"flex flex-wrap gap-3\">\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 </div>\n )\n }\n </div>\n </SectionContainer>\n <SectionContainer>\n <Image\n src={image.src}\n alt={image.alt}\n class=\"aspect-video w-full rounded-xl border object-cover\"\n widths={[640, 960, 1280, 1536]}\n sizes=\"(min-width: 80rem) 80rem, 100vw\"\n />\n </SectionContainer>\n</Section>\n",
12
14
  "type": "registry:block"
13
15
  },
14
16
  {
@@ -18,5 +20,9 @@
18
20
  "target": "src/assets/placeholder.webp"
19
21
  }
20
22
  ],
23
+ "docs": "https://ui.full.dev/blocks/content/",
24
+ "categories": [
25
+ "content"
26
+ ],
21
27
  "type": "registry:block"
22
28
  }