fulldev-ui 0.7.0 → 0.9.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 (813) hide show
  1. package/CHANGELOG.md +147 -2
  2. package/README.md +16 -86
  3. package/package.json +86 -40
  4. package/public/r/accordion.json +12 -6
  5. package/public/r/alert-dialog.json +78 -0
  6. package/public/r/alert.json +11 -6
  7. package/public/r/article-1.json +5 -6
  8. package/public/r/article-2.json +5 -6
  9. package/public/r/articles-1.json +6 -10
  10. package/public/r/articles-2.json +6 -10
  11. package/public/r/articles-3.json +6 -10
  12. package/public/r/articles-4.json +6 -10
  13. package/public/r/avatar.json +22 -8
  14. package/public/r/badge.json +9 -4
  15. package/public/r/banner-1.json +8 -5
  16. package/public/r/banner-2.json +8 -5
  17. package/public/r/banner.json +12 -23
  18. package/public/r/beta-repo-setup.json +131 -0
  19. package/public/r/blocks-1.json +19 -0
  20. package/public/r/blocks.json +18 -18
  21. package/public/r/breadcrumb.json +50 -0
  22. package/public/r/button.json +9 -4
  23. package/public/r/card.json +47 -0
  24. package/public/r/carousel.json +44 -0
  25. package/public/r/checkbox.json +3 -3
  26. package/public/r/collapsible.json +8 -5
  27. package/public/r/combobox.json +74 -0
  28. package/public/r/command.json +64 -0
  29. package/public/r/components.json +22 -10
  30. package/public/r/contact-1.json +10 -8
  31. package/public/r/contact-2.json +10 -8
  32. package/public/r/contact-3.json +10 -9
  33. package/public/r/content-1.json +6 -8
  34. package/public/r/content-2.json +6 -8
  35. package/public/r/content-3.json +4 -7
  36. package/public/r/content-4.json +6 -8
  37. package/public/r/content-5.json +17 -0
  38. package/public/r/content-6.json +17 -0
  39. package/public/r/cta-1.json +4 -6
  40. package/public/r/cta-2.json +4 -7
  41. package/public/r/cta-3.json +4 -6
  42. package/public/r/cta-4.json +4 -7
  43. package/public/r/cta-5.json +6 -10
  44. package/public/r/cta-6.json +4 -6
  45. package/public/r/cta-7.json +4 -8
  46. package/public/r/cta-8.json +4 -8
  47. package/public/r/dialog.json +69 -0
  48. package/public/r/doc-1.json +21 -0
  49. package/public/r/dropdown-menu.json +73 -0
  50. package/public/r/empty.json +8 -8
  51. package/public/r/faqs-1.json +4 -5
  52. package/public/r/faqs-2.json +4 -5
  53. package/public/r/faqs-3.json +5 -6
  54. package/public/r/faqs-4.json +4 -6
  55. package/public/r/features-1.json +5 -6
  56. package/public/r/features-2.json +5 -6
  57. package/public/r/features-3.json +5 -7
  58. package/public/r/features-4.json +5 -6
  59. package/public/r/features-5.json +5 -6
  60. package/public/r/features-6.json +5 -6
  61. package/public/r/field.json +18 -15
  62. package/public/r/footer-1.json +10 -5
  63. package/public/r/footer-2.json +10 -5
  64. package/public/r/footer-3.json +18 -0
  65. package/public/r/form.json +17 -0
  66. package/public/r/header-1.json +5 -8
  67. package/public/r/header-2.json +5 -8
  68. package/public/r/header-3.json +6 -8
  69. package/public/r/header-4.json +20 -0
  70. package/public/r/header-5.json +21 -0
  71. package/public/r/header.json +12 -8
  72. package/public/r/hero-1.json +4 -6
  73. package/public/r/hero-10.json +4 -7
  74. package/public/r/hero-11.json +4 -7
  75. package/public/r/hero-12.json +4 -6
  76. package/public/r/hero-13.json +4 -6
  77. package/public/r/hero-2.json +4 -7
  78. package/public/r/hero-3.json +4 -6
  79. package/public/r/hero-4.json +6 -7
  80. package/public/r/hero-5.json +6 -9
  81. package/public/r/hero-6.json +6 -9
  82. package/public/r/hero-7.json +6 -9
  83. package/public/r/hero-8.json +4 -6
  84. package/public/r/hero-9.json +6 -9
  85. package/public/r/hover-card.json +30 -0
  86. package/public/r/icon.json +3 -3
  87. package/public/r/init.json +23 -0
  88. package/public/r/input-group.json +48 -0
  89. package/public/r/input.json +3 -3
  90. package/public/r/item.json +28 -10
  91. package/public/r/kbd.json +22 -0
  92. package/public/r/label.json +3 -3
  93. package/public/r/layout.json +29 -7
  94. package/public/r/links-2.json +21 -0
  95. package/public/r/logo.json +6 -7
  96. package/public/r/logos-1.json +8 -5
  97. package/public/r/logos-2.json +4 -4
  98. package/public/r/logos-3.json +8 -5
  99. package/public/r/marquee.json +4 -9
  100. package/public/r/native-select.json +8 -5
  101. package/public/r/navigation-menu.json +22 -16
  102. package/public/r/popover.json +45 -0
  103. package/public/r/price.json +10 -5
  104. package/public/r/pricing-1.json +21 -0
  105. package/public/r/pricing-2.json +20 -0
  106. package/public/r/pricing-3.json +21 -0
  107. package/public/r/product-1.json +6 -8
  108. package/public/r/products-1.json +7 -9
  109. package/public/r/products-2.json +6 -7
  110. package/public/r/products-3.json +8 -8
  111. package/public/r/products-4.json +7 -7
  112. package/public/r/products-5.json +7 -8
  113. package/public/r/radio-group.json +7 -4
  114. package/public/r/rating.json +6 -3
  115. package/public/r/registry.json +1881 -1064
  116. package/public/r/reviews-1.json +6 -8
  117. package/public/r/reviews-2.json +6 -8
  118. package/public/r/reviews-3.json +7 -9
  119. package/public/r/reviews-4.json +6 -9
  120. package/public/r/reviews-5.json +5 -8
  121. package/public/r/section.json +6 -46
  122. package/public/r/select.json +58 -0
  123. package/public/r/separator.json +3 -3
  124. package/public/r/services-1.json +6 -7
  125. package/public/r/services-2.json +6 -8
  126. package/public/r/services-3.json +6 -7
  127. package/public/r/services-4.json +5 -7
  128. package/public/r/services-5.json +6 -7
  129. package/public/r/services-6.json +6 -6
  130. package/public/r/services-7.json +6 -7
  131. package/public/r/sheet.json +16 -12
  132. package/public/r/sidebar-1.json +28 -0
  133. package/public/r/sidebar.json +104 -9
  134. package/public/r/skeleton.json +3 -3
  135. package/public/r/slider.json +20 -0
  136. package/public/r/spinner.json +6 -3
  137. package/public/r/switch.json +20 -0
  138. package/public/r/table.json +11 -11
  139. package/public/r/tabs.json +15 -7
  140. package/public/r/textarea.json +3 -3
  141. package/public/r/theme-toggle.json +13 -5
  142. package/public/r/tile.json +7 -32
  143. package/public/r/toc.json +37 -0
  144. package/public/r/toggle.json +25 -0
  145. package/public/r/tooltip.json +30 -0
  146. package/public/r/typography.json +92 -0
  147. package/public/r/video.json +3 -3
  148. package/registry.json +1881 -1064
  149. package/src/components/blocks/article-1.astro +71 -52
  150. package/src/components/blocks/article-2.astro +71 -52
  151. package/src/components/blocks/articles-1.astro +87 -89
  152. package/src/components/blocks/articles-2.astro +142 -88
  153. package/src/components/blocks/articles-3.astro +85 -87
  154. package/src/components/blocks/articles-4.astro +72 -89
  155. package/src/components/blocks/banner-1.astro +36 -17
  156. package/src/components/blocks/banner-2.astro +39 -18
  157. package/src/components/blocks/blocks-1.astro +246 -50
  158. package/src/components/blocks/contact-1.astro +115 -44
  159. package/src/components/blocks/contact-2.astro +118 -48
  160. package/src/components/blocks/contact-3.astro +128 -53
  161. package/src/components/blocks/content-1.astro +76 -49
  162. package/src/components/blocks/content-2.astro +76 -55
  163. package/src/components/blocks/content-3.astro +62 -55
  164. package/src/components/blocks/content-4.astro +72 -49
  165. package/src/components/blocks/content-5.astro +98 -59
  166. package/src/components/blocks/content-6.astro +73 -58
  167. package/src/components/blocks/cta-1.astro +86 -65
  168. package/src/components/blocks/cta-2.astro +101 -75
  169. package/src/components/blocks/cta-3.astro +89 -68
  170. package/src/components/blocks/cta-4.astro +98 -68
  171. package/src/components/blocks/cta-5.astro +76 -75
  172. package/src/components/blocks/cta-6.astro +100 -64
  173. package/src/components/blocks/cta-7.astro +85 -73
  174. package/src/components/blocks/cta-8.astro +40 -76
  175. package/src/components/blocks/doc-1.astro +364 -0
  176. package/src/components/blocks/faqs-1.astro +58 -42
  177. package/src/components/blocks/faqs-2.astro +63 -45
  178. package/src/components/blocks/faqs-3.astro +40 -46
  179. package/src/components/blocks/faqs-4.astro +31 -46
  180. package/src/components/blocks/features-1.astro +73 -74
  181. package/src/components/blocks/features-2.astro +61 -75
  182. package/src/components/blocks/features-3.astro +54 -47
  183. package/src/components/blocks/features-4.astro +72 -76
  184. package/src/components/blocks/features-5.astro +60 -84
  185. package/src/components/blocks/features-6.astro +61 -58
  186. package/src/components/blocks/footer-1.astro +85 -83
  187. package/src/components/blocks/footer-2.astro +67 -48
  188. package/src/components/blocks/footer-3.astro +106 -91
  189. package/src/components/blocks/header-1.astro +102 -175
  190. package/src/components/blocks/header-2.astro +103 -169
  191. package/src/components/blocks/header-3.astro +108 -188
  192. package/src/components/blocks/header-4.astro +219 -0
  193. package/src/components/blocks/header-5.astro +223 -0
  194. package/src/components/blocks/hero-1.astro +63 -44
  195. package/src/components/blocks/hero-10.astro +87 -69
  196. package/src/components/blocks/hero-11.astro +89 -76
  197. package/src/components/blocks/hero-12.astro +53 -49
  198. package/src/components/blocks/hero-13.astro +49 -46
  199. package/src/components/blocks/hero-2.astro +81 -61
  200. package/src/components/blocks/hero-3.astro +46 -38
  201. package/src/components/blocks/hero-4.astro +61 -39
  202. package/src/components/blocks/hero-5.astro +103 -80
  203. package/src/components/blocks/hero-6.astro +91 -75
  204. package/src/components/blocks/hero-7.astro +93 -77
  205. package/src/components/blocks/hero-8.astro +50 -53
  206. package/src/components/blocks/hero-9.astro +94 -79
  207. package/src/components/blocks/links-2.astro +41 -34
  208. package/src/components/blocks/logos-1.astro +39 -23
  209. package/src/components/blocks/logos-2.astro +43 -29
  210. package/src/components/blocks/logos-3.astro +24 -23
  211. package/src/components/blocks/pricing-1.astro +106 -0
  212. package/src/components/blocks/pricing-2.astro +100 -0
  213. package/src/components/blocks/pricing-3.astro +92 -0
  214. package/src/components/blocks/product-1.astro +55 -82
  215. package/src/components/blocks/products-1.astro +61 -66
  216. package/src/components/blocks/products-2.astro +48 -63
  217. package/src/components/blocks/products-3.astro +49 -67
  218. package/src/components/blocks/products-4.astro +80 -65
  219. package/src/components/blocks/products-5.astro +76 -72
  220. package/src/components/blocks/reviews-1.astro +60 -84
  221. package/src/components/blocks/reviews-2.astro +66 -86
  222. package/src/components/blocks/reviews-3.astro +72 -90
  223. package/src/components/blocks/reviews-4.astro +97 -89
  224. package/src/components/blocks/reviews-5.astro +156 -87
  225. package/src/components/blocks/services-1.astro +87 -76
  226. package/src/components/blocks/services-2.astro +93 -83
  227. package/src/components/blocks/services-3.astro +89 -82
  228. package/src/components/blocks/services-4.astro +81 -77
  229. package/src/components/blocks/services-5.astro +77 -77
  230. package/src/components/blocks/services-6.astro +84 -68
  231. package/src/components/blocks/services-7.astro +114 -76
  232. package/src/components/blocks/sidebar-1.astro +429 -0
  233. package/src/components/ui/accordion/accordion-content.astro +16 -14
  234. package/src/components/ui/accordion/accordion-item.astro +13 -18
  235. package/src/components/ui/accordion/accordion-trigger.astro +26 -25
  236. package/src/components/ui/accordion/accordion.astro +43 -10
  237. package/src/components/ui/{native-carousel/native-carousel-item.astro → alert/alert-action.astro} +3 -3
  238. package/src/components/ui/alert/alert-description.astro +11 -17
  239. package/src/components/ui/alert/alert-title.astro +11 -17
  240. package/src/components/ui/alert/alert.astro +10 -16
  241. package/src/components/ui/alert/index.ts +1 -0
  242. package/src/components/ui/alert-dialog/alert-dialog-action.astro +13 -0
  243. package/src/components/ui/alert-dialog/alert-dialog-cancel.astro +13 -0
  244. package/src/components/ui/alert-dialog/alert-dialog-content.astro +30 -0
  245. package/src/components/ui/alert-dialog/alert-dialog-description.astro +20 -0
  246. package/src/components/ui/alert-dialog/alert-dialog-footer.astro +20 -0
  247. package/src/components/ui/alert-dialog/alert-dialog-header.astro +20 -0
  248. package/src/components/ui/alert-dialog/alert-dialog-media.astro +20 -0
  249. package/src/components/ui/alert-dialog/alert-dialog-overlay.astro +21 -0
  250. package/src/components/ui/alert-dialog/alert-dialog-portal.astro +13 -0
  251. package/src/components/ui/alert-dialog/alert-dialog-title.astro +20 -0
  252. package/src/components/ui/alert-dialog/alert-dialog-trigger.astro +13 -0
  253. package/src/components/ui/alert-dialog/alert-dialog.astro +17 -0
  254. package/src/components/ui/alert-dialog/index.ts +12 -0
  255. package/src/components/ui/avatar/avatar-badge.astro +23 -0
  256. package/src/components/ui/avatar/avatar-fallback.astro +11 -17
  257. package/src/components/ui/avatar/avatar-group-count.astro +20 -0
  258. package/src/components/ui/avatar/avatar-group.astro +20 -0
  259. package/src/components/ui/avatar/avatar-image.astro +5 -2
  260. package/src/components/ui/avatar/avatar.astro +15 -18
  261. package/src/components/ui/avatar/index.ts +3 -0
  262. package/src/components/ui/badge/badge-variants.ts +26 -0
  263. package/src/components/ui/badge/badge.astro +16 -46
  264. package/src/components/ui/badge/index.ts +2 -0
  265. package/src/components/ui/banner/banner-container.astro +36 -0
  266. package/src/components/ui/banner/banner.astro +66 -69
  267. package/src/components/ui/banner/index.ts +1 -4
  268. package/src/components/ui/breadcrumb/breadcrumb-ellipsis.astro +24 -0
  269. package/src/components/ui/breadcrumb/breadcrumb-item.astro +17 -0
  270. package/src/components/ui/breadcrumb/breadcrumb-link.astro +17 -0
  271. package/src/components/ui/breadcrumb/breadcrumb-list.astro +20 -0
  272. package/src/components/ui/breadcrumb/breadcrumb-page.astro +20 -0
  273. package/src/components/ui/breadcrumb/breadcrumb-separator.astro +20 -0
  274. package/src/components/ui/breadcrumb/breadcrumb.astro +18 -0
  275. package/src/components/ui/breadcrumb/index.ts +7 -0
  276. package/src/components/ui/button/button-variants.ts +39 -0
  277. package/src/components/ui/button/button.astro +12 -60
  278. package/src/components/ui/button/index.ts +2 -0
  279. package/src/components/ui/card/card-action.astro +20 -0
  280. package/src/components/ui/card/card-content.astro +17 -0
  281. package/src/components/ui/card/card-description.astro +17 -0
  282. package/src/components/ui/card/card-footer.astro +20 -0
  283. package/src/components/ui/card/card-header.astro +20 -0
  284. package/src/components/ui/card/card-title.astro +20 -0
  285. package/src/components/ui/card/card.astro +23 -0
  286. package/src/components/ui/card/index.ts +7 -0
  287. package/src/components/ui/carousel/carousel-content.astro +24 -0
  288. package/src/components/ui/carousel/carousel-item.astro +24 -0
  289. package/src/components/ui/carousel/carousel-next.astro +36 -0
  290. package/src/components/ui/carousel/carousel-previous.astro +36 -0
  291. package/src/components/ui/carousel/carousel.astro +246 -0
  292. package/src/components/ui/carousel/index.ts +11 -0
  293. package/src/components/ui/checkbox/checkbox.astro +46 -3
  294. package/src/components/ui/collapsible/collapsible-content.astro +5 -11
  295. package/src/components/ui/collapsible/collapsible-trigger.astro +10 -25
  296. package/src/components/ui/collapsible/collapsible.astro +24 -18
  297. package/src/components/ui/combobox/combobox-content.astro +61 -0
  298. package/src/components/ui/combobox/combobox-empty.astro +21 -0
  299. package/src/components/ui/combobox/combobox-group.astro +13 -0
  300. package/src/components/ui/combobox/combobox-input.astro +57 -0
  301. package/src/components/ui/combobox/combobox-item.astro +44 -0
  302. package/src/components/ui/combobox/combobox-label.astro +17 -0
  303. package/src/components/ui/combobox/combobox-list.astro +20 -0
  304. package/src/components/ui/combobox/combobox-separator.astro +16 -0
  305. package/src/components/ui/combobox/combobox-trigger.astro +37 -0
  306. package/src/components/ui/combobox/combobox-value.astro +20 -0
  307. package/src/components/ui/combobox/combobox.astro +85 -0
  308. package/src/components/ui/combobox/index.ts +11 -0
  309. package/src/components/ui/command/command-dialog.astro +23 -21
  310. package/src/components/ui/command/command-empty.astro +4 -6
  311. package/src/components/ui/command/command-group.astro +17 -24
  312. package/src/components/ui/command/command-input.astro +19 -17
  313. package/src/components/ui/command/command-item.astro +38 -21
  314. package/src/components/ui/command/command-list.astro +11 -18
  315. package/src/components/ui/command/command-separator.astro +3 -4
  316. package/src/components/ui/command/command-shortcut.astro +11 -18
  317. package/src/components/ui/command/command.astro +53 -143
  318. package/src/components/ui/command/index.ts +0 -1
  319. package/src/components/ui/dialog/dialog-close.astro +6 -10
  320. package/src/components/ui/dialog/dialog-content.astro +27 -19
  321. package/src/components/ui/dialog/dialog-description.astro +11 -14
  322. package/src/components/ui/dialog/dialog-footer.astro +16 -18
  323. package/src/components/ui/dialog/dialog-header.astro +8 -14
  324. package/src/components/ui/dialog/dialog-overlay.astro +22 -0
  325. package/src/components/ui/dialog/dialog-portal.astro +13 -0
  326. package/src/components/ui/dialog/dialog-title.astro +8 -14
  327. package/src/components/ui/dialog/dialog-trigger.astro +4 -10
  328. package/src/components/ui/dialog/dialog.astro +6 -35
  329. package/src/components/ui/dialog/index.ts +2 -0
  330. package/src/components/ui/dropdown-menu/dropdown-menu-checkbox-item.astro +52 -0
  331. package/src/components/ui/dropdown-menu/dropdown-menu-content.astro +58 -0
  332. package/src/components/ui/dropdown-menu/dropdown-menu-group.astro +13 -0
  333. package/src/components/ui/dropdown-menu/dropdown-menu-item.astro +36 -0
  334. package/src/components/ui/dropdown-menu/dropdown-menu-label.astro +23 -0
  335. package/src/components/ui/dropdown-menu/dropdown-menu-portal.astro +11 -0
  336. package/src/components/ui/dropdown-menu/dropdown-menu-radio-item.astro +52 -0
  337. package/src/components/ui/dropdown-menu/dropdown-menu-separator.astro +16 -0
  338. package/src/components/ui/dropdown-menu/dropdown-menu-shortcut.astro +20 -0
  339. package/src/components/ui/dropdown-menu/dropdown-menu-trigger.astro +16 -0
  340. package/src/components/ui/dropdown-menu/dropdown-menu.astro +68 -0
  341. package/src/components/ui/dropdown-menu/index.ts +11 -0
  342. package/src/components/ui/empty/empty-content.astro +11 -17
  343. package/src/components/ui/empty/empty-description.astro +11 -17
  344. package/src/components/ui/empty/empty-header.astro +8 -17
  345. package/src/components/ui/empty/empty-media.astro +8 -14
  346. package/src/components/ui/empty/empty-title.astro +8 -14
  347. package/src/components/ui/empty/empty.astro +11 -17
  348. package/src/components/ui/field/field-content.astro +11 -17
  349. package/src/components/ui/field/field-description.astro +13 -19
  350. package/src/components/ui/field/field-error.astro +44 -0
  351. package/src/components/ui/field/field-group.astro +11 -17
  352. package/src/components/ui/field/field-label.astro +14 -21
  353. package/src/components/ui/field/field-legend.astro +12 -20
  354. package/src/components/ui/field/field-separator.astro +6 -7
  355. package/src/components/ui/field/field-set.astro +11 -18
  356. package/src/components/ui/field/field-title.astro +11 -17
  357. package/src/components/ui/field/field.astro +17 -28
  358. package/src/components/ui/field/index.ts +1 -0
  359. package/src/components/ui/form/form.astro +13 -0
  360. package/src/components/ui/form/index.ts +1 -0
  361. package/src/components/ui/header/header-container.astro +17 -0
  362. package/src/components/ui/header/header-group.astro +17 -0
  363. package/src/components/ui/header/header.astro +21 -59
  364. package/src/components/ui/header/index.ts +2 -2
  365. package/src/components/ui/hover-card/hover-card-content.astro +51 -0
  366. package/src/components/ui/hover-card/hover-card-trigger.astro +26 -0
  367. package/src/components/ui/hover-card/hover-card.astro +69 -0
  368. package/src/components/ui/hover-card/index.ts +3 -0
  369. package/src/components/ui/icon/icon.astro +21 -19
  370. package/src/components/ui/input/input.astro +8 -8
  371. package/src/components/ui/input-group/index.ts +6 -0
  372. package/src/components/ui/input-group/input-group-addon.astro +41 -0
  373. package/src/components/ui/input-group/input-group-button.astro +49 -0
  374. package/src/components/ui/input-group/input-group-input.astro +23 -0
  375. package/src/components/ui/input-group/input-group-text.astro +20 -0
  376. package/src/components/ui/input-group/input-group-textarea.astro +19 -0
  377. package/src/components/ui/input-group/input-group.astro +51 -0
  378. package/src/components/ui/item/index.ts +4 -1
  379. package/src/components/ui/item/item-actions.astro +8 -14
  380. package/src/components/ui/item/item-content.astro +12 -18
  381. package/src/components/ui/item/item-description.astro +11 -18
  382. package/src/components/ui/item/item-footer.astro +17 -0
  383. package/src/components/ui/item/item-group.astro +12 -15
  384. package/src/components/ui/item/item-header.astro +17 -0
  385. package/src/components/ui/item/item-media.astro +12 -17
  386. package/src/components/ui/item/item-separator.astro +17 -0
  387. package/src/components/ui/item/item-title.astro +11 -17
  388. package/src/components/ui/item/item.astro +44 -24
  389. package/src/components/ui/kbd/index.ts +2 -0
  390. package/src/components/ui/kbd/kbd-group.astro +17 -0
  391. package/src/components/ui/kbd/kbd.astro +20 -0
  392. package/src/components/ui/label/label.astro +11 -17
  393. package/src/components/ui/layout/index.ts +4 -0
  394. package/src/components/ui/layout/layout-body.astro +26 -0
  395. package/src/components/ui/layout/layout-head.astro +100 -0
  396. package/src/components/ui/layout/layout-main.astro +20 -0
  397. package/src/components/ui/layout/layout.astro +34 -0
  398. package/src/components/ui/logo/logo-image.astro +33 -9
  399. package/src/components/ui/logo/logo-text.astro +4 -10
  400. package/src/components/ui/logo/logo.astro +10 -16
  401. package/src/components/ui/marquee/index.ts +0 -1
  402. package/src/components/ui/marquee/marquee.astro +92 -5
  403. package/src/components/ui/native-select/native-select-optgroup.astro +6 -2
  404. package/src/components/ui/native-select/native-select-option.astro +9 -4
  405. package/src/components/ui/native-select/native-select.astro +15 -13
  406. package/src/components/ui/navigation-menu/index.ts +3 -3
  407. package/src/components/ui/navigation-menu/navigation-menu-content.astro +29 -20
  408. package/src/components/ui/navigation-menu/navigation-menu-indicator.astro +23 -0
  409. package/src/components/ui/navigation-menu/navigation-menu-item.astro +28 -15
  410. package/src/components/ui/navigation-menu/navigation-menu-link.astro +13 -39
  411. package/src/components/ui/navigation-menu/navigation-menu-list.astro +11 -17
  412. package/src/components/ui/navigation-menu/navigation-menu-positioner.astro +47 -0
  413. package/src/components/ui/navigation-menu/navigation-menu-trigger-style.ts +7 -0
  414. package/src/components/ui/navigation-menu/navigation-menu-trigger.astro +18 -23
  415. package/src/components/ui/navigation-menu/navigation-menu.astro +54 -17
  416. package/src/components/ui/popover/index.ts +6 -0
  417. package/src/components/ui/popover/popover-content.astro +62 -0
  418. package/src/components/ui/popover/popover-description.astro +17 -0
  419. package/src/components/ui/popover/popover-header.astro +17 -0
  420. package/src/components/ui/popover/popover-title.astro +13 -0
  421. package/src/components/ui/popover/popover-trigger.astro +11 -0
  422. package/src/components/ui/popover/popover.astro +59 -0
  423. package/src/components/ui/price/format-price-value.ts +91 -0
  424. package/src/components/ui/price/price-unit.astro +7 -13
  425. package/src/components/ui/price/price-value.astro +50 -17
  426. package/src/components/ui/price/price.astro +4 -13
  427. package/src/components/ui/radio-group/radio-group-item.astro +30 -7
  428. package/src/components/ui/radio-group/radio-group.astro +28 -4
  429. package/src/components/ui/rating/rating.astro +30 -27
  430. package/src/components/ui/section/index.ts +1 -9
  431. package/src/components/ui/section/section-container.astro +19 -0
  432. package/src/components/ui/section/section.astro +22 -80
  433. package/src/components/ui/select/index.ts +8 -0
  434. package/src/components/ui/select/select-content.astro +69 -0
  435. package/src/components/ui/select/select-group.astro +17 -0
  436. package/src/components/ui/select/select-item.astro +39 -0
  437. package/src/components/ui/select/select-label.astro +17 -0
  438. package/src/components/ui/select/select-separator.astro +16 -0
  439. package/src/components/ui/select/select-trigger.astro +40 -0
  440. package/src/components/ui/select/select-value.astro +17 -0
  441. package/src/components/ui/select/select.astro +76 -0
  442. package/src/components/ui/separator/separator.astro +17 -16
  443. package/src/components/ui/sheet/sheet-close.astro +4 -12
  444. package/src/components/ui/sheet/sheet-content.astro +41 -64
  445. package/src/components/ui/sheet/sheet-description.astro +8 -14
  446. package/src/components/ui/sheet/sheet-footer.astro +8 -14
  447. package/src/components/ui/sheet/sheet-header.astro +8 -14
  448. package/src/components/ui/sheet/sheet-title.astro +8 -14
  449. package/src/components/ui/sheet/sheet-trigger.astro +4 -10
  450. package/src/components/ui/sheet/sheet.astro +110 -36
  451. package/src/components/ui/sidebar/index.ts +17 -0
  452. package/src/components/ui/sidebar/sidebar-content.astro +21 -0
  453. package/src/components/ui/sidebar/sidebar-footer.astro +18 -0
  454. package/src/components/ui/sidebar/sidebar-group-action.astro +31 -0
  455. package/src/components/ui/sidebar/sidebar-group-content.astro +18 -0
  456. package/src/components/ui/sidebar/sidebar-group-label.astro +26 -0
  457. package/src/components/ui/sidebar/sidebar-group.astro +18 -0
  458. package/src/components/ui/sidebar/sidebar-header.astro +18 -0
  459. package/src/components/ui/sidebar/sidebar-input.astro +19 -0
  460. package/src/components/ui/sidebar/sidebar-inset.astro +20 -0
  461. package/src/components/ui/sidebar/sidebar-menu-action.astro +40 -0
  462. package/src/components/ui/sidebar/sidebar-menu-badge.astro +21 -0
  463. package/src/components/ui/sidebar/sidebar-menu-button.astro +92 -23
  464. package/src/components/ui/sidebar/sidebar-menu-item.astro +9 -14
  465. package/src/components/ui/sidebar/sidebar-menu-skeleton.astro +31 -0
  466. package/src/components/ui/sidebar/sidebar-menu-sub-button.astro +31 -26
  467. package/src/components/ui/sidebar/sidebar-menu-sub-item.astro +9 -14
  468. package/src/components/ui/sidebar/sidebar-menu-sub.astro +12 -17
  469. package/src/components/ui/sidebar/sidebar-menu.astro +9 -17
  470. package/src/components/ui/sidebar/sidebar-provider.astro +192 -0
  471. package/src/components/ui/sidebar/sidebar-rail.astro +27 -0
  472. package/src/components/ui/sidebar/sidebar-separator.astro +17 -0
  473. package/src/components/ui/sidebar/sidebar-trigger.astro +26 -0
  474. package/src/components/ui/sidebar/sidebar.astro +118 -0
  475. package/src/components/ui/skeleton/skeleton.astro +8 -3
  476. package/src/components/ui/slider/index.ts +1 -0
  477. package/src/components/ui/slider/slider.astro +84 -0
  478. package/src/components/ui/spinner/spinner.astro +12 -6
  479. package/src/components/ui/switch/index.ts +1 -0
  480. package/src/components/ui/switch/switch.astro +71 -0
  481. package/src/components/ui/table/index.ts +0 -1
  482. package/src/components/ui/table/table-body.astro +1 -2
  483. package/src/components/ui/table/table-caption.astro +1 -2
  484. package/src/components/ui/table/table-cell.astro +2 -3
  485. package/src/components/ui/table/table-footer.astro +1 -2
  486. package/src/components/ui/table/table-head.astro +2 -3
  487. package/src/components/ui/table/table-header.astro +1 -1
  488. package/src/components/ui/table/table-row.astro +2 -3
  489. package/src/components/ui/table/table.astro +1 -1
  490. package/src/components/ui/tabs/index.ts +4 -1
  491. package/src/components/ui/tabs/tabs-content.astro +10 -20
  492. package/src/components/ui/tabs/tabs-list-variants.ts +18 -0
  493. package/src/components/ui/tabs/tabs-list.astro +21 -18
  494. package/src/components/ui/tabs/tabs-trigger.astro +17 -28
  495. package/src/components/ui/tabs/tabs.astro +24 -91
  496. package/src/components/ui/textarea/textarea.astro +11 -5
  497. package/src/components/ui/theme-toggle/theme-provider.astro +57 -22
  498. package/src/components/ui/theme-toggle/theme-toggle.astro +66 -37
  499. package/src/components/ui/tile/index.ts +1 -6
  500. package/src/components/ui/tile/tile-content.astro +8 -10
  501. package/src/components/ui/tile/tile-group.astro +76 -0
  502. package/src/components/ui/tile/tile.astro +19 -30
  503. package/src/components/ui/toc/index.ts +5 -0
  504. package/src/components/ui/toc/toc-menu-item.astro +13 -0
  505. package/src/components/ui/toc/toc-menu-link.astro +37 -0
  506. package/src/components/ui/toc/toc-menu.astro +17 -0
  507. package/src/components/ui/toc/toc-title.astro +21 -0
  508. package/src/components/ui/toc/toc.astro +13 -0
  509. package/src/components/ui/toggle/index.ts +3 -0
  510. package/src/components/ui/toggle/toggle-variants.ts +25 -0
  511. package/src/components/ui/toggle/toggle.astro +40 -0
  512. package/src/components/ui/tooltip/index.ts +3 -0
  513. package/src/components/ui/tooltip/tooltip-content.astro +64 -0
  514. package/src/components/ui/tooltip/tooltip-trigger.astro +26 -0
  515. package/src/components/ui/tooltip/tooltip.astro +55 -0
  516. package/src/components/ui/typography/index.ts +16 -0
  517. package/src/components/ui/typography/typography-a.astro +22 -0
  518. package/src/components/ui/typography/typography-blockquote.astro +23 -0
  519. package/src/components/ui/typography/typography-h1.astro +43 -0
  520. package/src/components/ui/typography/typography-h2.astro +43 -0
  521. package/src/components/ui/typography/typography-h3.astro +43 -0
  522. package/src/components/ui/typography/typography-h4.astro +43 -0
  523. package/src/components/ui/typography/typography-inline-code.astro +31 -0
  524. package/src/components/ui/typography/typography-lead.astro +21 -0
  525. package/src/components/ui/typography/typography-list-item.astro +28 -0
  526. package/src/components/ui/typography/typography-list.astro +45 -0
  527. package/src/components/ui/typography/typography-p.astro +23 -0
  528. package/src/components/ui/typography/typography-table-cell.astro +41 -0
  529. package/src/components/ui/typography/typography-table-head.astro +41 -0
  530. package/src/components/ui/typography/typography-table-row.astro +33 -0
  531. package/src/components/ui/typography/typography-table.astro +50 -0
  532. package/src/components/ui/typography/typography.astro +180 -0
  533. package/src/components/ui/video/video.astro +54 -20
  534. package/src/lib/integration.ts +66 -0
  535. package/src/lib/pages.ts +85 -0
  536. package/src/styles/global.css +119 -161
  537. package/.editorconfig +0 -10
  538. package/.github/CODEOWNERS +0 -2
  539. package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -12
  540. package/.github/ISSUE_TEMPLATE/config.yml +0 -8
  541. package/.github/ISSUE_TEMPLATE/documentation.yml +0 -12
  542. package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -12
  543. package/.github/ISSUE_TEMPLATE/support.yml +0 -12
  544. package/.nvmrc +0 -1
  545. package/.prettierignore +0 -21
  546. package/CODE_OF_CONDUCT.md +0 -7
  547. package/CONTRIBUTING.md +0 -142
  548. package/ai/website-quality-checklist.md +0 -33
  549. package/astro.config.example.ts +0 -90
  550. package/astro.config.ts +0 -183
  551. package/components.json +0 -24
  552. package/package.example.json +0 -41
  553. package/prettier.config.cjs +0 -44
  554. package/public/r/all.json +0 -41
  555. package/public/r/auto-form.json +0 -26
  556. package/public/r/block.json +0 -89
  557. package/public/r/footer.json +0 -77
  558. package/public/r/image.json +0 -17
  559. package/public/r/list.json +0 -22
  560. package/public/r/native-carousel.json +0 -37
  561. package/public/r/page.json +0 -18
  562. package/public/r/pricings-1.json +0 -20
  563. package/public/r/pricings-2.json +0 -20
  564. package/public/r/pricings-3.json +0 -20
  565. package/site.json +0 -12
  566. package/src/assets/avatar-sil-veltman.webp +0 -0
  567. package/src/assets/image-placeholder.webp +0 -0
  568. package/src/assets/logo-fulldev.svg +0 -4
  569. package/src/assets/my-accordion-code-example-homepage.astro.webp +0 -0
  570. package/src/assets/my-cta-code-example-homepage.astro.webp +0 -0
  571. package/src/assets/og-image-homepage-screenshot.png +0 -0
  572. package/src/components/_skeletons/split-grid.astro +0 -47
  573. package/src/components/_skeletons/split-masonry.astro +0 -57
  574. package/src/components/_skeletons/split-media.astro +0 -31
  575. package/src/components/_skeletons/spread-grid.astro +0 -49
  576. package/src/components/_skeletons/spread-masonry.astro +0 -59
  577. package/src/components/_skeletons/spread-media.astro +0 -33
  578. package/src/components/_skeletons/stack-grid.astro +0 -44
  579. package/src/components/_skeletons/stack-masonry.astro +0 -54
  580. package/src/components/_skeletons/stack-media.astro +0 -28
  581. package/src/components/block.astro +0 -125
  582. package/src/components/blocks/blocks-2.astro +0 -95
  583. package/src/components/blocks/blocks-3.astro +0 -93
  584. package/src/components/blocks/blocks-4.astro +0 -110
  585. package/src/components/blocks/hero-14.astro +0 -70
  586. package/src/components/blocks/images-1.astro +0 -70
  587. package/src/components/blocks/images-2.astro +0 -62
  588. package/src/components/blocks/links-1.astro +0 -46
  589. package/src/components/blocks/pricings-1.astro +0 -80
  590. package/src/components/blocks/pricings-2.astro +0 -83
  591. package/src/components/blocks/pricings-3.astro +0 -80
  592. package/src/components/blocks/skeletons-1.astro +0 -61
  593. package/src/components/blocks/stats-1.astro +0 -64
  594. package/src/components/blocks/stats-2.astro +0 -69
  595. package/src/components/blocks/stats-3.astro +0 -66
  596. package/src/components/blocks/steps-1.astro +0 -82
  597. package/src/components/blocks/steps-2.astro +0 -76
  598. package/src/components/blocks/steps-3.astro +0 -73
  599. package/src/components/blocks/table-1.astro +0 -89
  600. package/src/components/blocks/video-1.astro +0 -93
  601. package/src/components/blocks/video-2.astro +0 -96
  602. package/src/components/blocks/video-3.astro +0 -73
  603. package/src/components/blocks/videos-1.astro +0 -63
  604. package/src/components/blocks/videos-2.astro +0 -66
  605. package/src/components/blocks/videos-3.astro +0 -68
  606. package/src/components/blocks/videos-4.astro +0 -64
  607. package/src/components/layout.astro +0 -195
  608. package/src/components/live-code-layout.astro +0 -14
  609. package/src/components/starlight-head.astro +0 -65
  610. package/src/components/starlight-icons.astro +0 -36
  611. package/src/components/starlight-markdown-content.astro +0 -68
  612. package/src/components/starlight-title.astro +0 -37
  613. package/src/components/ui/auto-form/auto-form.astro +0 -135
  614. package/src/components/ui/auto-form/index.ts +0 -1
  615. package/src/components/ui/banner/banner-close.astro +0 -21
  616. package/src/components/ui/banner/banner-content.astro +0 -41
  617. package/src/components/ui/banner/banner-description.astro +0 -19
  618. package/src/components/ui/banner/banner-title.astro +0 -19
  619. package/src/components/ui/footer/footer-actions.astro +0 -19
  620. package/src/components/ui/footer/footer-content.astro +0 -19
  621. package/src/components/ui/footer/footer-copyright.astro +0 -24
  622. package/src/components/ui/footer/footer-description.astro +0 -37
  623. package/src/components/ui/footer/footer-grid.astro +0 -25
  624. package/src/components/ui/footer/footer-group-label.astro +0 -19
  625. package/src/components/ui/footer/footer-group.astro +0 -19
  626. package/src/components/ui/footer/footer-menu-item.astro +0 -19
  627. package/src/components/ui/footer/footer-menu-link.astro +0 -25
  628. package/src/components/ui/footer/footer-menu.astro +0 -32
  629. package/src/components/ui/footer/footer-split.astro +0 -26
  630. package/src/components/ui/footer/footer-spread.astro +0 -25
  631. package/src/components/ui/footer/footer.astro +0 -71
  632. package/src/components/ui/footer/index.ts +0 -12
  633. package/src/components/ui/header/header-actions.astro +0 -19
  634. package/src/components/ui/header/header-content.astro +0 -22
  635. package/src/components/ui/image/image.astro +0 -22
  636. package/src/components/ui/image/index.ts +0 -1
  637. package/src/components/ui/list/index.ts +0 -2
  638. package/src/components/ui/list/list-item.astro +0 -26
  639. package/src/components/ui/list/list.astro +0 -19
  640. package/src/components/ui/marquee/marquee-content.astro +0 -60
  641. package/src/components/ui/native-carousel/index.ts +0 -5
  642. package/src/components/ui/native-carousel/native-carousel-content.astro +0 -92
  643. package/src/components/ui/native-carousel/native-carousel-next.astro +0 -24
  644. package/src/components/ui/native-carousel/native-carousel-previous.astro +0 -24
  645. package/src/components/ui/native-carousel/native-carousel.astro +0 -20
  646. package/src/components/ui/navigation-menu/navigation-menu-sub-item.astro +0 -23
  647. package/src/components/ui/navigation-menu/navigation-menu-sub-link.astro +0 -27
  648. package/src/components/ui/navigation-menu/navigation-menu-sub.astro +0 -23
  649. package/src/components/ui/section/section-actions.astro +0 -19
  650. package/src/components/ui/section/section-content.astro +0 -22
  651. package/src/components/ui/section/section-grid.astro +0 -37
  652. package/src/components/ui/section/section-masonry.astro +0 -33
  653. package/src/components/ui/section/section-media.astro +0 -26
  654. package/src/components/ui/section/section-prose.astro +0 -49
  655. package/src/components/ui/section/section-provider.astro +0 -27
  656. package/src/components/ui/section/section-split.astro +0 -26
  657. package/src/components/ui/section/section-spread.astro +0 -25
  658. package/src/components/ui/tile/tile-actions.astro +0 -19
  659. package/src/components/ui/tile/tile-description.astro +0 -19
  660. package/src/components/ui/tile/tile-media.astro +0 -44
  661. package/src/components/ui/tile/tile-split.astro +0 -23
  662. package/src/components/ui/tile/tile-spread.astro +0 -25
  663. package/src/components/ui/tile/tile-title.astro +0 -19
  664. package/src/content/docs/docs/components/_command.mdx +0 -110
  665. package/src/content/docs/docs/components/_dialog.mdx +0 -84
  666. package/src/content/docs/docs/components/accordion.mdx +0 -90
  667. package/src/content/docs/docs/components/alert.mdx +0 -63
  668. package/src/content/docs/docs/components/auto-form.mdx +0 -42
  669. package/src/content/docs/docs/components/avatar.mdx +0 -60
  670. package/src/content/docs/docs/components/badge.mdx +0 -71
  671. package/src/content/docs/docs/components/banner.mdx +0 -42
  672. package/src/content/docs/docs/components/button.mdx +0 -188
  673. package/src/content/docs/docs/components/checkbox.mdx +0 -60
  674. package/src/content/docs/docs/components/collapsible.mdx +0 -67
  675. package/src/content/docs/docs/components/empty.mdx +0 -64
  676. package/src/content/docs/docs/components/field.mdx +0 -347
  677. package/src/content/docs/docs/components/footer.mdx +0 -27
  678. package/src/content/docs/docs/components/header.mdx +0 -77
  679. package/src/content/docs/docs/components/icon.mdx +0 -43
  680. package/src/content/docs/docs/components/image.mdx +0 -38
  681. package/src/content/docs/docs/components/input.mdx +0 -35
  682. package/src/content/docs/docs/components/item.mdx +0 -75
  683. package/src/content/docs/docs/components/label.mdx +0 -34
  684. package/src/content/docs/docs/components/list.mdx +0 -52
  685. package/src/content/docs/docs/components/logo.mdx +0 -44
  686. package/src/content/docs/docs/components/marquee.mdx +0 -110
  687. package/src/content/docs/docs/components/native-carousel.mdx +0 -83
  688. package/src/content/docs/docs/components/native-select.mdx +0 -141
  689. package/src/content/docs/docs/components/navigation-menu.mdx +0 -91
  690. package/src/content/docs/docs/components/price.mdx +0 -42
  691. package/src/content/docs/docs/components/radio-group.mdx +0 -47
  692. package/src/content/docs/docs/components/rating.mdx +0 -81
  693. package/src/content/docs/docs/components/section.mdx +0 -87
  694. package/src/content/docs/docs/components/separator.mdx +0 -39
  695. package/src/content/docs/docs/components/sheet.mdx +0 -73
  696. package/src/content/docs/docs/components/sidebar.mdx +0 -208
  697. package/src/content/docs/docs/components/skeleton.mdx +0 -24
  698. package/src/content/docs/docs/components/spinner.mdx +0 -37
  699. package/src/content/docs/docs/components/table.mdx +0 -100
  700. package/src/content/docs/docs/components/tabs.mdx +0 -59
  701. package/src/content/docs/docs/components/textarea.mdx +0 -35
  702. package/src/content/docs/docs/components/theme-toggle.mdx +0 -56
  703. package/src/content/docs/docs/components/tile.mdx +0 -198
  704. package/src/content/docs/docs/components/video.mdx +0 -36
  705. package/src/content/docs/docs/components.md +0 -4
  706. package/src/content/docs/docs/index.md +0 -9
  707. package/src/content/docs/docs/installation.md +0 -93
  708. package/src/content/docs/docs/theming.md +0 -6
  709. package/src/content/layouts/block.yaml +0 -276
  710. package/src/content/layouts/docs.yaml +0 -25
  711. package/src/content/layouts/hero.yaml +0 -256
  712. package/src/content/layouts/index.yaml +0 -23
  713. package/src/content/pages/blocks/article-1.md +0 -9
  714. package/src/content/pages/blocks/article-2.md +0 -9
  715. package/src/content/pages/blocks/article.md +0 -11
  716. package/src/content/pages/blocks/articles-1.md +0 -9
  717. package/src/content/pages/blocks/articles-2.md +0 -9
  718. package/src/content/pages/blocks/articles-3.md +0 -9
  719. package/src/content/pages/blocks/articles-4.md +0 -9
  720. package/src/content/pages/blocks/articles.md +0 -13
  721. package/src/content/pages/blocks/banner-1.md +0 -9
  722. package/src/content/pages/blocks/banner-2.md +0 -9
  723. package/src/content/pages/blocks/banner.md +0 -11
  724. package/src/content/pages/blocks/contact-1.md +0 -9
  725. package/src/content/pages/blocks/contact-2.md +0 -9
  726. package/src/content/pages/blocks/contact-3.md +0 -9
  727. package/src/content/pages/blocks/contact.md +0 -11
  728. package/src/content/pages/blocks/content-1.md +0 -9
  729. package/src/content/pages/blocks/content-2.md +0 -9
  730. package/src/content/pages/blocks/content-3.md +0 -9
  731. package/src/content/pages/blocks/content-4.md +0 -9
  732. package/src/content/pages/blocks/content.md +0 -13
  733. package/src/content/pages/blocks/cta-1.md +0 -9
  734. package/src/content/pages/blocks/cta-2.md +0 -9
  735. package/src/content/pages/blocks/cta-3.md +0 -9
  736. package/src/content/pages/blocks/cta-4.md +0 -9
  737. package/src/content/pages/blocks/cta-5.md +0 -9
  738. package/src/content/pages/blocks/cta-6.md +0 -9
  739. package/src/content/pages/blocks/cta-7.md +0 -9
  740. package/src/content/pages/blocks/cta-8.md +0 -9
  741. package/src/content/pages/blocks/cta.md +0 -17
  742. package/src/content/pages/blocks/faqs-1.md +0 -9
  743. package/src/content/pages/blocks/faqs-2.md +0 -9
  744. package/src/content/pages/blocks/faqs-3.md +0 -9
  745. package/src/content/pages/blocks/faqs-4.md +0 -9
  746. package/src/content/pages/blocks/faqs.md +0 -13
  747. package/src/content/pages/blocks/features-1.md +0 -9
  748. package/src/content/pages/blocks/features-2.md +0 -9
  749. package/src/content/pages/blocks/features-3.md +0 -9
  750. package/src/content/pages/blocks/features-4.md +0 -9
  751. package/src/content/pages/blocks/features-5.md +0 -9
  752. package/src/content/pages/blocks/features-6.md +0 -9
  753. package/src/content/pages/blocks/features.md +0 -15
  754. package/src/content/pages/blocks/footer-1.md +0 -9
  755. package/src/content/pages/blocks/footer-2.md +0 -9
  756. package/src/content/pages/blocks/footer.md +0 -11
  757. package/src/content/pages/blocks/header-1.md +0 -9
  758. package/src/content/pages/blocks/header-2.md +0 -9
  759. package/src/content/pages/blocks/header-3.md +0 -9
  760. package/src/content/pages/blocks/header.md +0 -12
  761. package/src/content/pages/blocks/hero-1.md +0 -9
  762. package/src/content/pages/blocks/hero-10.md +0 -9
  763. package/src/content/pages/blocks/hero-11.md +0 -9
  764. package/src/content/pages/blocks/hero-12.md +0 -9
  765. package/src/content/pages/blocks/hero-13.md +0 -9
  766. package/src/content/pages/blocks/hero-2.md +0 -9
  767. package/src/content/pages/blocks/hero-3.md +0 -9
  768. package/src/content/pages/blocks/hero-4.md +0 -9
  769. package/src/content/pages/blocks/hero-5.md +0 -9
  770. package/src/content/pages/blocks/hero-6.md +0 -9
  771. package/src/content/pages/blocks/hero-7.md +0 -9
  772. package/src/content/pages/blocks/hero-8.md +0 -9
  773. package/src/content/pages/blocks/hero-9.md +0 -9
  774. package/src/content/pages/blocks/hero.md +0 -22
  775. package/src/content/pages/blocks/logos-1.md +0 -9
  776. package/src/content/pages/blocks/logos-2.md +0 -9
  777. package/src/content/pages/blocks/logos-3.md +0 -9
  778. package/src/content/pages/blocks/logos.md +0 -12
  779. package/src/content/pages/blocks/pricings-1.md +0 -9
  780. package/src/content/pages/blocks/pricings-2.md +0 -9
  781. package/src/content/pages/blocks/pricings-3.md +0 -9
  782. package/src/content/pages/blocks/pricings.md +0 -12
  783. package/src/content/pages/blocks/product-1.md +0 -9
  784. package/src/content/pages/blocks/product.md +0 -10
  785. package/src/content/pages/blocks/products-1.md +0 -9
  786. package/src/content/pages/blocks/products-2.md +0 -9
  787. package/src/content/pages/blocks/products-3.md +0 -9
  788. package/src/content/pages/blocks/products-4.md +0 -9
  789. package/src/content/pages/blocks/products-5.md +0 -9
  790. package/src/content/pages/blocks/products.md +0 -14
  791. package/src/content/pages/blocks/reviews-1.md +0 -9
  792. package/src/content/pages/blocks/reviews-2.md +0 -9
  793. package/src/content/pages/blocks/reviews-3.md +0 -9
  794. package/src/content/pages/blocks/reviews-4.md +0 -9
  795. package/src/content/pages/blocks/reviews-5.md +0 -9
  796. package/src/content/pages/blocks/reviews.md +0 -14
  797. package/src/content/pages/blocks/services-1.md +0 -9
  798. package/src/content/pages/blocks/services-2.md +0 -9
  799. package/src/content/pages/blocks/services-3.md +0 -9
  800. package/src/content/pages/blocks/services-4.md +0 -9
  801. package/src/content/pages/blocks/services-5.md +0 -9
  802. package/src/content/pages/blocks/services-6.md +0 -9
  803. package/src/content/pages/blocks/services-7.md +0 -9
  804. package/src/content/pages/blocks/services.md +0 -16
  805. package/src/content/pages/blocks.md +0 -45
  806. package/src/content/pages/index.md +0 -73
  807. package/src/content.config.example.ts +0 -21
  808. package/src/content.config.ts +0 -28
  809. package/src/env.d.ts +0 -2
  810. package/src/lib/schemas.ts +0 -169
  811. package/src/pages/[...page].astro +0 -37
  812. package/src/styles/global.example.css +0 -144
  813. package/tsconfig.json +0 -26
@@ -0,0 +1,131 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "beta-repo-setup",
4
+ "registryDependencies": [
5
+ "@fulldev/blocks",
6
+ "@fulldev/components"
7
+ ],
8
+ "files": [
9
+ {
10
+ "path": "src/content.config.ts",
11
+ "content": "import { defineCollection } from \"astro:content\"\nimport { glob } from \"astro/loaders\"\n\nimport { globalSchema } from \"@/schemas/global\"\nimport { pageSchema } from \"@/schemas/page\"\n\nexport const collections = {\n pages: defineCollection({\n loader: glob({\n pattern: \"**/[^_]*.{md,mdx}\",\n base: \"src/content/pages\",\n }),\n schema: pageSchema,\n }),\n globals: defineCollection({\n loader: glob({\n pattern: \"**/[^_]*.{yaml,yml,json}\",\n base: \"src/content/globals\",\n }),\n schema: globalSchema,\n }),\n}\n",
12
+ "type": "registry:file",
13
+ "target": "src/content.config.ts"
14
+ },
15
+ {
16
+ "path": "src/components/layout-renderer.astro",
17
+ "content": "---\n// Keep this renderer generic and stable. New page types should be wired by\n// adding a matching schema and src/layouts/<type>.astro file, not by adding\n// layout-specific branches here.\nimport { getEntry, render, type CollectionEntry } from \"astro:content\"\n\ntype Props = CollectionEntry<\"pages\">\n\nconst page = Astro.props\nconst pageData = page.data\nconst { Content, headings } = await render(page)\nconst global = await getEntry(\"globals\", Astro.currentLocale || \"en\")\nif (!global) throw new Error(\"Add a global to content/globals\")\nconst globalData = global.data\n\nconst layoutImports = import.meta.glob(\"../layouts/*.astro\", { eager: true })\nconst layoutPath = `../layouts/${pageData.type}.astro`\nconst layoutImport = layoutImports[layoutPath] as { default?: any } | undefined\nconst Layout = layoutImport?.default\n\nif (!Layout) throw new Error(`Add a layout for page type \"${pageData.type}\"`)\n---\n\n<Layout global={globalData} page={pageData} headings={headings}>\n <Content />\n</Layout>\n",
18
+ "type": "registry:file",
19
+ "target": "src/components/layout-renderer.astro"
20
+ },
21
+ {
22
+ "path": "src/lib/pages.ts",
23
+ "content": "import { getCollection, type CollectionEntry } from \"astro:content\"\n\ntype Page = CollectionEntry<\"pages\">\n\nexport type PageSearchItem = {\n label: string\n href: string\n title: string\n path: string\n description: string\n group: string\n}\n\nexport type PageBreadcrumbItem = {\n label: string\n href: string\n}\n\nexport const normalizePath = (path: string) => {\n if (path === \"/\") return path\n\n return path.replace(/\\/$/, \"\")\n}\n\nexport const getPageHref = (page: Page) =>\n page.id === \"index\" ? \"/\" : `/${page.id}/`\n\nexport const formatSlug = (slug: string) =>\n slug\n .split(\"-\")\n .filter(Boolean)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \")\n\nconst getPageSearchGroup = (href: string) => {\n const [slug] = href.split(\"/\").filter(Boolean)\n\n return slug ? formatSlug(slug) : \"Overview\"\n}\n\nexport const getPageSearchItems = async (): Promise<PageSearchItem[]> => {\n const pages = await getCollection(\"pages\")\n\n return pages\n .map((page) => ({\n label: page.data.title,\n href: getPageHref(page),\n title: page.data.title,\n path: getPageHref(page),\n description: page.data.description,\n group: getPageSearchGroup(getPageHref(page)),\n }))\n .sort((a, b) => a.label.localeCompare(b.label))\n}\n\nexport const getPageBreadcrumbItems = async (\n pathname: string\n): Promise<PageBreadcrumbItem[]> => {\n const currentPath = normalizePath(pathname)\n const pages = await getCollection(\"pages\")\n const pageTitlesByHref = new Map(\n pages.map((page) => [getPageHref(page), page.data.title])\n )\n const homeLink = {\n label: pageTitlesByHref.get(\"/\") ?? \"Home\",\n href: \"/\",\n }\n\n if (currentPath === \"/\") return [homeLink]\n\n return [\n homeLink,\n ...currentPath\n .split(\"/\")\n .filter(Boolean)\n .map((slug, index, slugs) => {\n const href = `/${slugs.slice(0, index + 1).join(\"/\")}/`\n\n return {\n label: pageTitlesByHref.get(href) ?? formatSlug(slug),\n href,\n }\n }),\n ]\n}\n",
24
+ "type": "registry:file",
25
+ "target": "src/lib/pages.ts"
26
+ },
27
+ {
28
+ "path": "src/pages/[...page].astro",
29
+ "content": "---\nimport { getCollection } from \"astro:content\"\n\nimport LayoutRenderer from \"@/components/layout-renderer.astro\"\n\nexport async function getStaticPaths() {\n const pages = await getCollection(\"pages\")\n return pages.map((page) => {\n return {\n params: {\n page: page.id === \"index\" ? undefined : page.id,\n },\n props: page,\n }\n })\n}\n---\n\n<LayoutRenderer {...Astro.props} />\n",
30
+ "type": "registry:file",
31
+ "target": "src/pages/[...page].astro"
32
+ },
33
+ {
34
+ "path": "src/pages/[...page].md.ts",
35
+ "content": "import { readFile } from \"node:fs/promises\"\nimport type { APIRoute } from \"astro\"\nimport { getCollection } from \"astro:content\"\n\nexport const prerender = true\n\nconst navigationPreamble = \"Navigation: [/sitemap.md](/sitemap.md)\\n\\n\"\n\nexport async function getStaticPaths() {\n const pages = await getCollection(\"pages\")\n return Promise.all(\n pages\n .filter((page) => page.id !== \"index\")\n .map(async (page) => ({\n params: {\n page: page.id,\n },\n props: {\n source: await readPageSource(page.filePath),\n },\n }))\n )\n}\n\nasync function readPageSource(filePath: string | undefined) {\n if (!filePath) {\n throw new Error(\"Expected content page entry to include a file path.\")\n }\n\n return readFile(filePath, \"utf-8\")\n}\n\nexport const GET: APIRoute = ({ props }) => {\n return new Response(`${navigationPreamble}${props.source}`, {\n headers: {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n },\n })\n}\n",
36
+ "type": "registry:file",
37
+ "target": "src/pages/[...page].md.ts"
38
+ },
39
+ {
40
+ "path": "src/pages/index.md.ts",
41
+ "content": "import { readFile } from \"node:fs/promises\"\nimport type { APIRoute } from \"astro\"\nimport { getEntry } from \"astro:content\"\n\nexport const prerender = true\n\nconst agentPreamble = `# Fulldev UI Agent Entry Point\n\nNavigation: [/sitemap.md](/sitemap.md)\n\nIf you are an AI agent, treat this page as the entry point for Fulldev UI. Install the Fulldev skill first if your environment supports skills, then read the relevant Markdown pages before editing a project.\n\n\\`\\`\\`bash\nnpx -y skills add fulldotdev/ui --skill fulldev -y\n\\`\\`\\`\n\nStart here:\n\n- Install Fulldev UI: [/docs/installation.md](/docs/installation.md)\n- Understand the project model: [/docs/introduction.md](/docs/introduction.md)\n- Customize theme tokens: [/docs/theming.md](/docs/theming.md)\n- Browse documentation sections: [/docs.md](/docs.md)\n- Browse installable components: [/components.md](/components.md)\n- Browse installable blocks: [/blocks.md](/blocks.md)\n- Discover all pages: [/sitemap.md](/sitemap.md)\n- Read registry metadata: [/r/registry.json](/r/registry.json)\n\nEvery documentation page has a Markdown version. Add \\`.md\\` to a page URL, for example \\`/components/button.md\\` or \\`/blocks/hero.md\\`.\n\nRecommended agent flow:\n\n1. Read \\`/docs/installation.md\\`.\n2. Install the Fulldev skill if your agent supports skills.\n3. Read the component or block page that matches the user's request.\n4. Install registry items with \\`npx shadcn@latest add @fulldev/<name>\\`.\n5. Use block and component examples as source references, not as hidden sidebar context.\n\n---\n\n## Homepage source\n\n`\n\nexport const GET: APIRoute = async () => {\n const page = await getEntry(\"pages\", \"index\")\n\n if (!page?.filePath) {\n return new Response(\n `${agentPreamble}No homepage content entry exists yet. Add \\`src/content/pages/index.mdx\\` to use this Markdown entry point.`,\n {\n headers: {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n },\n }\n )\n }\n\n return new Response(\n `${agentPreamble}${await readFile(page.filePath, \"utf-8\")}`,\n {\n headers: {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n },\n }\n )\n}\n",
42
+ "type": "registry:file",
43
+ "target": "src/pages/index.md.ts"
44
+ },
45
+ {
46
+ "path": "src/pages/sitemap.md.ts",
47
+ "content": "import type { APIRoute } from \"astro\"\nimport { getCollection } from \"astro:content\"\n\nimport { getPageHref } from \"@/lib/pages\"\n\nexport const prerender = true\n\nconst getMarkdownHref = (href: string) =>\n href === \"/\" ? \"/index.md\" : `${href.replace(/\\/$/, \"\")}.md`\n\nexport const GET: APIRoute = async () => {\n const pages = await getCollection(\"pages\")\n const pageLinks = pages\n .map((page) => ({\n title: page.data.title,\n href: getPageHref(page),\n markdownHref: getMarkdownHref(getPageHref(page)),\n description: page.data.description,\n }))\n .sort((a, b) => a.href.localeCompare(b.href))\n\n const body = `# Fulldev UI Sitemap\n\nUse the Markdown URLs when reading pages as an AI agent.\n\n## Core\n\n- [Agent entry point](/index.md)\n- [Registry metadata](/r/registry.json)\n\n## Pages\n\n${pageLinks\n .map(\n (page) =>\n `- [${page.title}](${page.href}) | [Markdown](${page.markdownHref})${\n page.description ? ` - ${page.description}` : \"\"\n }`\n )\n .join(\"\\n\")}\n`\n\n return new Response(body, {\n headers: {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n },\n })\n}\n",
48
+ "type": "registry:file",
49
+ "target": "src/pages/sitemap.md.ts"
50
+ },
51
+ {
52
+ "path": "src/schemas/shared.ts",
53
+ "content": "import { type SchemaContext } from \"astro:content\"\nimport { z } from \"astro/zod\"\n\nexport const linkSchema = z.object({\n label: z.string(),\n href: z.string(),\n})\n\nexport const buttonSchema = z.object({\n label: z.string(),\n href: z.string(),\n icon: z.string().optional(),\n variant: z.enum([\"default\", \"outline\", \"secondary\", \"ghost\"]).optional(),\n})\n\nexport const imageSchema = ({ image }: SchemaContext) =>\n z.object({\n src: image(),\n alt: z.string(),\n })\n\nexport const seoSchema = (ctx: SchemaContext) =>\n z.object({\n title: z.string(),\n description: z.string(),\n image: imageSchema(ctx).optional(),\n canonical: z.string().optional(),\n noindex: z.boolean().optional(),\n nofollow: z.boolean().optional(),\n })\n",
54
+ "type": "registry:file",
55
+ "target": "src/schemas/shared.ts"
56
+ },
57
+ {
58
+ "path": "src/schemas/global.ts",
59
+ "content": "import { type SchemaContext } from \"astro:content\"\nimport { z } from \"astro/zod\"\n\nimport { buttonSchema, linkSchema } from \"@/schemas/shared\"\n\nconst nestedLinkSchema = linkSchema.extend({\n links: linkSchema.array().optional(),\n})\n\nexport const globalSchema = ({ image }: SchemaContext) =>\n z.object({\n name: z.string(),\n logo: z\n .object({\n label: z.string(),\n href: z.string(),\n src: image().optional(),\n srcLight: image().optional(),\n srcDark: image().optional(),\n alt: z.string().optional(),\n })\n .refine((logo) => logo.src || (logo.srcLight && logo.srcDark), {\n message: \"Logo must define src or both srcLight and srcDark.\",\n }),\n header: z.object({\n navigation: nestedLinkSchema.array(),\n githubRepo: z.string(),\n }),\n sidebar: z.object({\n search: z.object({\n label: z.string(),\n empty: z.string(),\n }),\n navigation: nestedLinkSchema.array(),\n }),\n docs: z\n .object({\n callout: z.object({\n description: z.string(),\n button: buttonSchema,\n }),\n })\n .optional(),\n })\n\nexport type GlobalSchema = z.infer<ReturnType<typeof globalSchema>>\n",
60
+ "type": "registry:file",
61
+ "target": "src/schemas/global.ts"
62
+ },
63
+ {
64
+ "path": "src/schemas/page.ts",
65
+ "content": "import { type SchemaContext } from \"astro:content\"\nimport { z } from \"astro/zod\"\n\nimport { blockSchema } from \"@/schemas/layouts/block\"\nimport { docSchema } from \"@/schemas/layouts/doc\"\nimport { homeSchema } from \"@/schemas/layouts/home\"\nimport { overviewSchema } from \"@/schemas/layouts/overview\"\n\nexport const pageSchema = (ctx: SchemaContext) =>\n z.discriminatedUnion(\"type\", [\n blockSchema(ctx).extend({ type: z.literal(\"block\") }),\n docSchema(ctx).extend({ type: z.literal(\"doc\") }),\n homeSchema(ctx).extend({ type: z.literal(\"home\") }),\n overviewSchema(ctx).extend({ type: z.literal(\"overview\") }),\n ])\n",
66
+ "type": "registry:file",
67
+ "target": "src/schemas/page.ts"
68
+ },
69
+ {
70
+ "path": "src/schemas/layouts/base.ts",
71
+ "content": "import { type SchemaContext } from \"astro:content\"\nimport { z } from \"astro/zod\"\n\nimport { imageSchema, seoSchema } from \"@/schemas/shared\"\n\nexport const baseSchema = (ctx: SchemaContext) =>\n z.object({\n title: z.string(),\n description: z.string(),\n image: imageSchema(ctx).optional(),\n seo: seoSchema(ctx).optional(),\n })\n\nexport type BaseSchema = z.infer<ReturnType<typeof baseSchema>>\n",
72
+ "type": "registry:file",
73
+ "target": "src/schemas/layouts/base.ts"
74
+ },
75
+ {
76
+ "path": "src/schemas/layouts/block.ts",
77
+ "content": "import { type SchemaContext } from \"astro:content\"\nimport { z } from \"astro/zod\"\n\nimport { baseSchema } from \"@/schemas/layouts/base\"\n\nexport const blockSchema = (ctx: SchemaContext) =>\n baseSchema(ctx)\n .extend({\n category: z.string().optional(),\n })\n .strict()\n\nexport type BlockSchema = z.infer<ReturnType<typeof blockSchema>>\n",
78
+ "type": "registry:file",
79
+ "target": "src/schemas/layouts/block.ts"
80
+ },
81
+ {
82
+ "path": "src/schemas/layouts/doc.ts",
83
+ "content": "import { type SchemaContext } from \"astro:content\"\nimport { z } from \"astro/zod\"\n\nimport { baseSchema } from \"@/schemas/layouts/base\"\n\nexport const docSchema = (ctx: SchemaContext) => baseSchema(ctx).loose()\n\nexport type DocSchema = z.infer<ReturnType<typeof docSchema>>\n",
84
+ "type": "registry:file",
85
+ "target": "src/schemas/layouts/doc.ts"
86
+ },
87
+ {
88
+ "path": "src/schemas/layouts/home.ts",
89
+ "content": "import { type SchemaContext } from \"astro:content\"\nimport { z } from \"astro/zod\"\n\nimport { baseSchema } from \"@/schemas/layouts/base\"\n\nexport const homeSchema = (ctx: SchemaContext) =>\n baseSchema(ctx).extend({}).strict()\n\nexport type HomeSchema = z.infer<ReturnType<typeof homeSchema>>\n",
90
+ "type": "registry:file",
91
+ "target": "src/schemas/layouts/home.ts"
92
+ },
93
+ {
94
+ "path": "src/schemas/layouts/overview.ts",
95
+ "content": "import { type SchemaContext } from \"astro:content\"\nimport { z } from \"astro/zod\"\n\nimport { baseSchema } from \"@/schemas/layouts/base\"\n\nexport const overviewSchema = (ctx: SchemaContext) => baseSchema(ctx).strict()\n\nexport type OverviewSchema = z.infer<ReturnType<typeof overviewSchema>>\n",
96
+ "type": "registry:file",
97
+ "target": "src/schemas/layouts/overview.ts"
98
+ },
99
+ {
100
+ "path": "src/layouts/base.astro",
101
+ "content": "---\nimport { Font } from \"astro:assets\"\n\nimport type { GlobalSchema } from \"@/schemas/global\"\nimport type { BaseSchema } from \"@/schemas/layouts/base\"\nimport { getPageBreadcrumbItems, getPageSearchItems } from \"@/lib/pages\"\nimport Sidebar1 from \"@/components/blocks/sidebar-1.astro\"\nimport {\n Layout,\n LayoutBody,\n LayoutHead,\n LayoutMain,\n} from \"@/components/ui/layout\"\nimport { ThemeProvider } from \"@/components/ui/theme-toggle\"\n\ntype Props = {\n global: GlobalSchema\n page: BaseSchema\n}\n\nconst { global, page }: Props = Astro.props\n\nconst [searchItems, breadcrumbItems] = await Promise.all([\n getPageSearchItems(),\n getPageBreadcrumbItems(Astro.url.pathname),\n])\n---\n\n<Layout>\n <LayoutHead {...global} {...page} {...page.seo}>\n <Fragment slot=\"head\">\n <Font\n cssVariable=\"--font-geist-sans\"\n preload={[{ subset: \"latin\", weight: \"100 900\", style: \"normal\" }]}\n />\n <Font cssVariable=\"--font-geist-mono\" />\n </Fragment>\n <ThemeProvider />\n </LayoutHead>\n <LayoutBody>\n <Sidebar1\n logo={global.logo}\n search={{\n items: searchItems,\n ...global.sidebar.search,\n }}\n breadcrumb={{\n items: breadcrumbItems,\n menu: global.header.navigation,\n }}\n navigation={global.sidebar.navigation}\n githubRepo={global.header.githubRepo}\n >\n <LayoutMain>\n <slot />\n </LayoutMain>\n </Sidebar1>\n </LayoutBody>\n</Layout>\n",
102
+ "type": "registry:file",
103
+ "target": "src/layouts/base.astro"
104
+ },
105
+ {
106
+ "path": "src/layouts/block.astro",
107
+ "content": "---\nimport type { MarkdownHeading } from \"astro\"\nimport { getCollection } from \"astro:content\"\n\nimport type { GlobalSchema } from \"@/schemas/global\"\nimport type { BlockSchema } from \"@/schemas/layouts/block\"\nimport Base from \"@/layouts/base.astro\"\nimport BlocksBlock from \"@/components/blocks/blocks-1.astro\"\n\ntype Props = {\n global: GlobalSchema\n page: BlockSchema\n headings: MarkdownHeading[]\n}\n\nconst props: Props = Astro.props\nconst currentPath = Astro.url.pathname\nconst markdownPath =\n currentPath === \"/\" ? \"/index.md\" : `${currentPath.replace(/\\/$/, \"\")}.md`\n\nconst blocks = await getCollection(\"pages\", ({ data }) => {\n return data.type === \"block\"\n})\nconst currentBlock = blocks.find((entry) => `/${entry.id}/` === currentPath)\nconst isBlockCategory = !props.page.category\nconst orderedBlockCategoryLinks = blocks\n .filter((entry) => !(\"category\" in entry.data) || !entry.data.category)\n .map((entry) => ({\n href: `/${entry.id}/`,\n title: entry.data.title,\n }))\n .sort((a, b) => a.href.localeCompare(b.href))\nconst currentPageIndex = orderedBlockCategoryLinks.findIndex(\n (item) => item.href === currentPath\n)\nconst previousPage =\n isBlockCategory && currentPageIndex > 0\n ? orderedBlockCategoryLinks[currentPageIndex - 1]\n : undefined\nconst nextPage =\n isBlockCategory && currentPageIndex >= 0\n ? orderedBlockCategoryLinks[currentPageIndex + 1]\n : undefined\nconst copySource = blocks.find((entry) => `/${entry.id}/` === currentPath)?.body\nconst copyButton = copySource\n ? {\n id: `blocks-copy-page-${crypto.randomUUID()}`,\n source: currentBlock?.body ?? copySource,\n }\n : undefined\n---\n\n<Base global={props.global} page={props.page}>\n <BlocksBlock\n title={props.page.title}\n description={props.page.description}\n copyButton={copyButton}\n markdownUrl={markdownPath}\n previousPage={previousPage}\n nextPage={nextPage}\n labels={{\n copyMarkdown: \"Copy Markdown\",\n openIn: \"Open in\",\n openInMarkdown: \"Open in Markdown\",\n openInChatGPT: \"Open in ChatGPT\",\n openInClaude: \"Open in Claude\",\n openInCursor: \"Open in Cursor\",\n pagination: {\n previous: \"Previous\",\n next: \"Next\",\n ariaLabel: \"Blocks pagination\",\n },\n }}\n >\n <slot />\n </BlocksBlock>\n</Base>\n",
108
+ "type": "registry:file",
109
+ "target": "src/layouts/block.astro"
110
+ },
111
+ {
112
+ "path": "src/layouts/doc.astro",
113
+ "content": "---\nimport type { MarkdownHeading } from \"astro\"\nimport { getCollection } from \"astro:content\"\n\nimport type { GlobalSchema } from \"@/schemas/global\"\nimport type { DocSchema } from \"@/schemas/layouts/doc\"\nimport Base from \"@/layouts/base.astro\"\nimport DocBlock from \"@/components/blocks/doc-1.astro\"\n\ntype Props = {\n global: GlobalSchema\n page: DocSchema\n headings: MarkdownHeading[]\n}\n\nconst props: Props = Astro.props\nconst currentPath = Astro.url.pathname\nconst globalCallout = props.global.docs?.callout\nconst markdownPath =\n currentPath === \"/\" ? \"/index.md\" : `${currentPath.replace(/\\/$/, \"\")}.md`\n\nconst docsPages = await getCollection(\"pages\")\nconst orderedDocLinks = [\n \"docs/introduction\",\n \"docs/installation\",\n \"docs/theming\",\n \"docs/dark-mode\",\n \"docs/cli\",\n \"docs/mcp\",\n \"docs/skills\",\n \"components\",\n \"blocks\",\n \"docs/layouts\",\n]\n .map((id) => docsPages.find((entry) => entry.id === id))\n .filter((entry): entry is (typeof docsPages)[number] => Boolean(entry))\n .map((entry) => ({\n href: `/${entry.id}/`,\n title: entry.data.title,\n }))\nconst componentLinks = docsPages\n .filter(\n (entry) => entry.data.type === \"doc\" && entry.id.startsWith(\"components/\")\n )\n .map((entry) => ({\n href: `/${entry.id}/`,\n title: entry.data.title,\n description: entry.data.description,\n }))\n .sort((a, b) => a.title.localeCompare(b.title))\nconst paginationLinks = [...orderedDocLinks, ...componentLinks]\nconst currentPageIndex = paginationLinks.findIndex(\n (item) => item.href === currentPath\n)\nconst previousPage =\n currentPageIndex > 0 ? paginationLinks[currentPageIndex - 1] : undefined\nconst nextPage =\n currentPageIndex >= 0 ? paginationLinks[currentPageIndex + 1] : undefined\nconst currentDoc = await getCollection(\"pages\", ({ data, id }) => {\n return data.type === \"doc\" && `/${id}/` === currentPath\n})\nconst copySource = currentDoc[0]?.body\nconst copyButton = copySource\n ? {\n id: `docs-copy-page-${crypto.randomUUID()}`,\n source: copySource,\n }\n : undefined\n\nconst tocItems = props.headings\n .filter((heading) => heading.depth === 2 || heading.depth === 3)\n .map((heading) => ({\n depth: heading.depth,\n href: `#${heading.slug}`,\n label: heading.text,\n }))\n---\n\n<Base global={props.global} page={props.page}>\n <DocBlock\n title={props.page.title}\n description={props.page.description}\n copyButton={copyButton}\n markdownUrl={markdownPath}\n tocItems={tocItems}\n callout={globalCallout}\n previousPage={previousPage}\n nextPage={nextPage}\n labels={{\n copyMarkdown: \"Copy Markdown\",\n openIn: \"Open in\",\n openInMarkdown: \"Open in Markdown\",\n openInChatGPT: \"Open in ChatGPT\",\n openInClaude: \"Open in Claude\",\n openInCursor: \"Open in Cursor\",\n pagination: {\n previous: \"Previous\",\n next: \"Next\",\n ariaLabel: \"Document pagination\",\n },\n toc: \"On This Page\",\n }}\n >\n <slot />\n </DocBlock>\n</Base>\n",
114
+ "type": "registry:file",
115
+ "target": "src/layouts/doc.astro"
116
+ },
117
+ {
118
+ "path": "src/layouts/home.astro",
119
+ "content": "---\nimport type { GlobalSchema } from \"@/schemas/global\"\nimport type { HomeSchema } from \"@/schemas/layouts/home\"\nimport Base from \"@/layouts/base.astro\"\nimport { Typography } from \"@/components/ui/typography\"\n\ntype Props = {\n global: GlobalSchema\n page: HomeSchema\n}\n\nconst { global, page } = Astro.props\n---\n\n<Base global={global} page={page}>\n <Typography\n as=\"article\"\n size=\"lg\"\n class=\"mx-auto w-full max-w-7xl px-4 py-16 lg:px-6 [&>:is(p,ul,ol,blockquote,h1,h2)]:max-w-4xl [&>:is(p,ul,ol,blockquote,h3,h4)]:max-w-3xl [&>[data-slot='tabs']:not(:first-child)]:mt-10\"\n >\n <slot />\n </Typography>\n</Base>\n",
120
+ "type": "registry:file",
121
+ "target": "src/layouts/home.astro"
122
+ },
123
+ {
124
+ "path": "src/layouts/overview.astro",
125
+ "content": "---\nimport { getCollection } from \"astro:content\"\n\nimport type { GlobalSchema } from \"@/schemas/global\"\nimport type { OverviewSchema } from \"@/schemas/layouts/overview\"\nimport Base from \"@/layouts/base.astro\"\nimport { SectionContainer } from \"@/components/ui/section\"\nimport { TypographyH1, TypographyLead } from \"@/components/ui/typography\"\n\ntype Props = {\n global: GlobalSchema\n page: OverviewSchema\n}\n\nconst { global, page }: Props = Astro.props\nconst currentPath = Astro.url.pathname\nconst pages = await getCollection(\"pages\")\n\nconst docsIndexOrder = [\n \"docs/introduction\",\n \"docs/installation\",\n \"docs/theming\",\n \"docs/dark-mode\",\n \"docs/cli\",\n \"docs/mcp\",\n \"docs/skills\",\n \"components\",\n \"blocks\",\n \"docs/layouts\",\n]\n\nconst entries =\n currentPath === \"/docs/\"\n ? docsIndexOrder\n .map((id) => pages.find((entry) => entry.id === id))\n .filter((entry): entry is (typeof pages)[number] => Boolean(entry))\n : pages\n .filter(({ data, id }) => {\n if (currentPath === \"/blocks/\") {\n return (\n data.type === \"block\" &&\n (!(\"category\" in data) || !data.category) &&\n id.startsWith(\"blocks/\")\n )\n }\n\n if (currentPath === \"/components/\") {\n return data.type === \"doc\" && id.startsWith(\"components/\")\n }\n\n return false\n })\n .sort((a, b) => a.data.title.localeCompare(b.data.title))\n\nconst overviewLinks = entries.map((entry) => ({\n href: `/${entry.id}/`,\n title: entry.data.title,\n description: entry.data.description,\n}))\n---\n\n<Base global={global} page={page}>\n <SectionContainer class=\"gap-10 pt-10 pb-10 sm:pt-12 sm:pb-12\">\n <div class=\"mx-auto flex w-full max-w-336 flex-col gap-10\">\n <header class=\"flex min-w-0 flex-col gap-4 border-b pb-8\">\n <TypographyH1\n class=\"text-foreground text-left text-3xl tracking-tight sm:text-4xl\"\n >\n {page.title}\n </TypographyH1>\n {\n page.description && (\n <TypographyLead class=\"max-w-2xl text-base leading-7\">\n {page.description}\n </TypographyLead>\n )\n }\n </header>\n\n <section class=\"grid gap-2 md:grid-cols-2 xl:grid-cols-3\">\n {\n overviewLinks.map((item) => (\n <a\n href={item.href}\n class=\"bg-muted/40 hover:bg-muted/60 focus-visible:ring-ring/50 rounded-lg px-4 py-4 transition-colors focus-visible:ring-2 focus-visible:outline-none\"\n >\n <span class=\"text-sm font-medium\">{item.title}</span>\n {item.description && (\n <span class=\"text-muted-foreground mt-1 block text-sm leading-5\">\n {item.description}\n </span>\n )}\n </a>\n ))\n }\n </section>\n </div>\n </SectionContainer>\n</Base>\n",
126
+ "type": "registry:file",
127
+ "target": "src/layouts/overview.astro"
128
+ }
129
+ ],
130
+ "type": "registry:file"
131
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "blocks-1",
4
+ "registryDependencies": [
5
+ "@fulldev/button",
6
+ "@fulldev/dropdown-menu",
7
+ "@fulldev/section",
8
+ "@fulldev/typography",
9
+ "@fulldev/icon"
10
+ ],
11
+ "files": [
12
+ {
13
+ "path": "src/components/blocks/blocks-1.astro",
14
+ "content": "---\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport { buttonVariants } from \"@/components/ui/button/button-variants\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\"\nimport { Icon } from \"@/components/ui/icon\"\nimport { SectionContainer } from \"@/components/ui/section\"\nimport {\n Typography,\n TypographyH1,\n TypographyLead,\n} from \"@/components/ui/typography\"\n\ntype Props = {\n class?: string\n title: string\n description?: string\n copyButton?: {\n id: string\n source: string\n }\n markdownUrl?: string\n previousPage?: {\n href: string\n title: string\n }\n nextPage?: {\n href: string\n title: string\n }\n labels: {\n copyMarkdown: string\n openIn: string\n openInMarkdown: string\n openInChatGPT: string\n openInClaude: string\n openInCursor: string\n pagination: {\n previous: string\n next: string\n ariaLabel: string\n }\n }\n}\n\nconst {\n class: className,\n title,\n description,\n copyButton,\n markdownUrl,\n previousPage,\n nextPage,\n labels,\n} = Astro.props\nconst showCopyButton = Boolean(copyButton)\nconst showOpenButton = Boolean(markdownUrl)\nconst showPagination = Boolean(previousPage || nextPage)\nconst assistantPrompt = markdownUrl\n ? `Read ${markdownUrl}, I want to ask questions about it.`\n : \"\"\nconst openLinks = markdownUrl\n ? [\n {\n label: labels.openInMarkdown,\n href: markdownUrl,\n icon: \"markdown\",\n },\n {\n label: labels.openInChatGPT,\n href: `https://chatgpt.com/?hints=search&q=${encodeURIComponent(assistantPrompt)}`,\n icon: \"chatgpt\",\n },\n {\n label: labels.openInClaude,\n href: `https://claude.ai/new?q=${encodeURIComponent(assistantPrompt)}`,\n icon: \"claude\",\n },\n {\n label: labels.openInCursor,\n href: `https://cursor.com/link/prompt?text=${encodeURIComponent(assistantPrompt)}`,\n icon: \"cursor\",\n },\n ]\n : []\n---\n\n<SectionContainer\n data-slot=\"blocks-page\"\n class={cn(\"gap-10 pt-10 pb-10 sm:pt-12 sm:pb-12\", className)}\n>\n <div class=\"mx-auto flex w-full max-w-336 flex-col gap-10\">\n <header\n class=\"flex flex-col gap-4 border-b pb-8 sm:flex-row sm:items-start sm:justify-between\"\n >\n <div class=\"flex max-w-3xl min-w-0 flex-1 flex-col gap-2\">\n <TypographyH1\n class=\"text-foreground text-left text-3xl tracking-tight sm:text-4xl\"\n >\n {title}\n </TypographyH1>\n {\n description && (\n <TypographyLead class=\"max-w-2xl text-base leading-7\">\n {description}\n </TypographyLead>\n )\n }\n </div>\n <div class=\"flex shrink-0 items-center gap-2 self-start\">\n {\n showCopyButton && (\n <Button\n id={copyButton?.id}\n type=\"button\"\n variant=\"outline\"\n size=\"xs\"\n data-source={copyButton?.source}\n aria-label={labels.copyMarkdown}\n >\n <Icon name=\"copy\" class=\"blocks-copy-icon size-3.5\" />\n <Icon name=\"check\" class=\"blocks-check-icon hidden size-3.5\" />\n <span>{labels.copyMarkdown}</span>\n </Button>\n )\n }\n {\n showOpenButton && (\n <DropdownMenu>\n <DropdownMenuTrigger\n class={buttonVariants({ variant: \"outline\", size: \"xs\" })}\n >\n <span>{labels.openIn}</span>\n <Icon name=\"chevron-down\" class=\"size-3.5 opacity-70\" />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" sideOffset={6} class=\"w-56\">\n {openLinks.map((link) => (\n <a\n href={link.href}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n class=\"hover:bg-accent hover:text-accent-foreground flex items-center gap-2 rounded-sm px-2 py-1.5 text-sm transition-colors outline-none\"\n >\n {link.icon === \"markdown\" && (\n <Icon name=\"markdown\" class=\"size-4 fill-current\" />\n )}\n {link.icon === \"chatgpt\" && (\n <svg\n role=\"img\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n class=\"size-4\"\n aria-hidden=\"true\"\n >\n <path d=\"M22.282 9.821a5.985 5.985 0 0 0-.516-4.91 6.046 6.046 0 0 0-6.51-2.9A6.065 6.065 0 0 0 4.981 4.182a5.985 5.985 0 0 0-3.998 2.9 6.046 6.046 0 0 0 .743 7.097 5.98 5.98 0 0 0 .511 4.91 6.051 6.051 0 0 0 6.515 2.9A5.985 5.985 0 0 0 13.26 24a6.056 6.056 0 0 0 5.772-4.206 5.989 5.989 0 0 0 3.998-2.9 6.056 6.056 0 0 0-.748-7.073ZM13.26 22.43a4.476 4.476 0 0 1-2.876-1.04l.142-.081 4.778-2.758a.795.795 0 0 0 .393-.681v-6.737l2.02 1.169a.071.071 0 0 1 .038.052v5.583a4.504 4.504 0 0 1-4.495 4.494Zm-9.66-4.125a4.471 4.471 0 0 1-.535-3.014l.142.085 4.783 2.758a.771.771 0 0 0 .781 0l5.843-3.368v2.332a.08.08 0 0 1-.034.062L9.74 19.95a4.499 4.499 0 0 1-6.14-1.646ZM2.34 7.896a4.485 4.485 0 0 1 2.366-1.973V11.6a.766.766 0 0 0 .388.677l5.814 3.354-2.02 1.169a.076.076 0 0 1-.071 0l-4.83-2.787A4.504 4.504 0 0 1 2.34 7.872Zm16.596 3.856-5.833-3.388L15.12 7.2a.076.076 0 0 1 .071 0l4.83 2.791a4.494 4.494 0 0 1-.676 8.104v-5.677a.79.79 0 0 0-.407-.667Zm2.011-3.024-.142-.085-4.774-2.782a.776.776 0 0 0-.785 0L9.409 9.23V6.897a.066.066 0 0 1 .028-.061l4.83-2.787a4.499 4.499 0 0 1 6.68 4.66ZM8.307 12.863l-2.02-1.164a.08.08 0 0 1-.038-.057V6.074a4.499 4.499 0 0 1 7.376-3.453l-.142.08-4.778 2.758a.795.795 0 0 0-.393.681Zm1.097-2.365 2.602-1.5 2.607 1.5v2.999l-2.597 1.5-2.607-1.5Z\" />\n </svg>\n )}\n {link.icon === \"claude\" && (\n <Icon name=\"claude\" class=\"size-4 fill-current\" />\n )}\n {link.icon === \"cursor\" && (\n <Icon name=\"cursor\" class=\"size-4 fill-current\" />\n )}\n <span>{link.label}</span>\n <Icon\n name=\"external-link\"\n class=\"text-muted-foreground ml-auto size-3.5\"\n />\n </a>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n }\n </div>\n </header>\n\n <Typography as=\"article\" class=\"w-full max-w-none\" size=\"sm\">\n <slot />\n </Typography>\n\n {\n showPagination && (\n <nav\n class=\"flex items-center justify-between gap-3\"\n aria-label={labels.pagination.ariaLabel}\n >\n {previousPage ? (\n <Button\n as=\"a\"\n href={previousPage.href}\n variant=\"outline\"\n class=\"h-auto min-w-0 items-center justify-start gap-2 px-3 py-2 whitespace-normal\"\n >\n <Icon name=\"arrow-left\" class=\"size-4\" />\n <span class=\"truncate text-sm font-medium\">\n {previousPage.title}\n </span>\n </Button>\n ) : (\n <div aria-hidden=\"true\" />\n )}\n\n {nextPage ? (\n <Button\n as=\"a\"\n href={nextPage.href}\n variant=\"outline\"\n class=\"h-auto min-w-0 items-center justify-end gap-2 px-3 py-2 text-right whitespace-normal\"\n >\n <span class=\"truncate text-sm font-medium\">{nextPage.title}</span>\n <Icon name=\"arrow-right\" class=\"size-4\" />\n </Button>\n ) : (\n <div aria-hidden=\"true\" />\n )}\n </nav>\n )\n }\n </div>\n</SectionContainer>\n\n<script is:inline define:vars={{ copyButtonId: copyButton?.id }}>\n const button = copyButtonId ? document.getElementById(copyButtonId) : null\n\n if (button instanceof HTMLButtonElement) {\n const writeToClipboard = async (text) => {\n if (navigator.clipboard && window.isSecureContext) {\n try {\n await navigator.clipboard.writeText(text)\n return true\n } catch {\n return false\n }\n }\n\n return false\n }\n\n button.addEventListener(\"click\", async () => {\n const source = button.dataset.source\n\n if (!source) return\n\n const copied = await writeToClipboard(source)\n\n if (copied) {\n button.querySelector(\".blocks-copy-icon\")?.classList.add(\"hidden\")\n button.querySelector(\".blocks-check-icon\")?.classList.remove(\"hidden\")\n\n window.setTimeout(() => {\n button.querySelector(\".blocks-copy-icon\")?.classList.remove(\"hidden\")\n button.querySelector(\".blocks-check-icon\")?.classList.add(\"hidden\")\n }, 1200)\n }\n })\n }\n</script>\n",
15
+ "type": "registry:block"
16
+ }
17
+ ],
18
+ "type": "registry:block"
19
+ }
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "blocks",
4
- "type": "registry:component",
5
4
  "registryDependencies": [
6
5
  "@fulldev/article-1",
7
6
  "@fulldev/article-2",
@@ -11,6 +10,7 @@
11
10
  "@fulldev/articles-4",
12
11
  "@fulldev/banner-1",
13
12
  "@fulldev/banner-2",
13
+ "@fulldev/blocks-1",
14
14
  "@fulldev/contact-1",
15
15
  "@fulldev/contact-2",
16
16
  "@fulldev/contact-3",
@@ -18,6 +18,8 @@
18
18
  "@fulldev/content-2",
19
19
  "@fulldev/content-3",
20
20
  "@fulldev/content-4",
21
+ "@fulldev/content-5",
22
+ "@fulldev/content-6",
21
23
  "@fulldev/cta-1",
22
24
  "@fulldev/cta-2",
23
25
  "@fulldev/cta-3",
@@ -26,6 +28,7 @@
26
28
  "@fulldev/cta-6",
27
29
  "@fulldev/cta-7",
28
30
  "@fulldev/cta-8",
31
+ "@fulldev/doc-1",
29
32
  "@fulldev/faqs-1",
30
33
  "@fulldev/faqs-2",
31
34
  "@fulldev/faqs-3",
@@ -38,10 +41,17 @@
38
41
  "@fulldev/features-6",
39
42
  "@fulldev/footer-1",
40
43
  "@fulldev/footer-2",
44
+ "@fulldev/footer-3",
41
45
  "@fulldev/header-1",
42
46
  "@fulldev/header-2",
43
47
  "@fulldev/header-3",
48
+ "@fulldev/header-4",
49
+ "@fulldev/header-5",
44
50
  "@fulldev/hero-1",
51
+ "@fulldev/hero-10",
52
+ "@fulldev/hero-11",
53
+ "@fulldev/hero-12",
54
+ "@fulldev/hero-13",
45
55
  "@fulldev/hero-2",
46
56
  "@fulldev/hero-3",
47
57
  "@fulldev/hero-4",
@@ -50,16 +60,13 @@
50
60
  "@fulldev/hero-7",
51
61
  "@fulldev/hero-8",
52
62
  "@fulldev/hero-9",
53
- "@fulldev/hero-10",
54
- "@fulldev/hero-11",
55
- "@fulldev/hero-12",
56
- "@fulldev/hero-13",
63
+ "@fulldev/links-2",
57
64
  "@fulldev/logos-1",
58
65
  "@fulldev/logos-2",
59
66
  "@fulldev/logos-3",
60
- "@fulldev/pricings-1",
61
- "@fulldev/pricings-2",
62
- "@fulldev/pricings-3",
67
+ "@fulldev/pricing-1",
68
+ "@fulldev/pricing-2",
69
+ "@fulldev/pricing-3",
63
70
  "@fulldev/product-1",
64
71
  "@fulldev/products-1",
65
72
  "@fulldev/products-2",
@@ -78,14 +85,7 @@
78
85
  "@fulldev/services-5",
79
86
  "@fulldev/services-6",
80
87
  "@fulldev/services-7",
81
- "@fulldev/content-5",
82
- "@fulldev/content-6"
88
+ "@fulldev/sidebar-1"
83
89
  ],
84
- "files": [
85
- {
86
- "path": "src/components/block.astro",
87
- "content": "---\nimport { getCollection, getEntry, type CollectionEntry } from \"astro:content\"\n\nimport type { BlockSchema, PageSchema } from \"@/lib/schemas\"\n\ntype Props = BlockSchema & PageSchema\n\n// Helper functions\nfunction getHref(entry: CollectionEntry<\"pages\">) {\n // If there is no content, return undefined\n if (!entry.data.sections?.length && !entry.body?.length && !entry.data.block)\n return undefined\n // If the page is the index, return the root\n if (entry.id === \"index\") return \"/\"\n // else return href b yid\n return `/${entry.id}/`\n}\n\nconst pages = await getCollection(\"pages\")\n\n// Get a single reference by file path\nasync function getRef(value: string) {\n const entry = pages.find((page) => `/${page.filePath}` === value)\n const layout = entry?.data?.layout\n ? await getEntry(\"layouts\", entry?.data?.layout)\n : undefined\n if (!entry) return\n return {\n ...layout?.data,\n href: getHref(entry),\n ...entry.data,\n }\n}\n\n// Get multiple references by file paths\nasync function getRefs(values: string[]) {\n return (await Promise.all(values.map(getRef))).filter(\n (item) => item !== undefined\n )\n}\n\n// Get a glob of pages by folder path\nasync function getGlob(value: string) {\n return pages\n .filter((page) => page.filePath?.startsWith(`src/content/pages/${value}`))\n .map((page) => ({\n href: getHref(page),\n ...page.data,\n }))\n}\n\n// Recursively resolve references in items\nasync function resolveItem(item: any): Promise<any> {\n if (!item) return item\n\n const resolved = { ...item }\n\n // Resolve single reference\n if (resolved.ref) {\n const referencedItem = await getRef(resolved.ref)\n resolved.item = referencedItem\n delete resolved.ref\n }\n\n // Resolve multiple references\n if (resolved.refs) {\n resolved.items = await getRefs(resolved.refs)\n delete resolved.refs\n }\n\n // Resolve glob pattern\n if (resolved.glob) {\n resolved.items = await getGlob(resolved.glob)\n delete resolved.glob\n }\n\n // Recursively resolve nested items\n if (resolved.items) {\n resolved.items = await Promise.all(\n resolved.items.map((nestedItem: any) => resolveItem(nestedItem))\n )\n }\n\n // Recursively resolve single nested item\n if (resolved.item) {\n resolved.item = await resolveItem(resolved.item)\n }\n\n return resolved\n}\n\nconst { block, ref, refs, glob, ...props } = Astro.props\n\n// Populate references at top level\nif (ref) {\n props.item = await getRef(ref)\n}\nif (refs) {\n props.items = await getRefs(refs)\n}\nif (glob) {\n props.items = await getGlob(glob)\n}\n\n// Recursively resolve nested items\nif (props.items) {\n props.items = await Promise.all(\n props.items.map((item: any) => resolveItem(item))\n )\n}\n\nconst blockImports = import.meta.glob(\"./blocks/**/*.astro\")\nconst blockPath = `./blocks/${block}.astro`\nconst blockImport = (await blockImports[blockPath]?.()) as any\nconst BlockComponent = blockImport?.default as any\n---\n\n{\n BlockComponent && (\n <BlockComponent {...props}>\n <slot />\n {\"html\" in props && <Fragment set:html={props.html} />}\n </BlockComponent>\n )\n}\n",
88
- "type": "registry:component"
89
- }
90
- ]
91
- }
90
+ "type": "registry:item"
91
+ }
@@ -0,0 +1,50 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "breadcrumb",
4
+ "registryDependencies": [
5
+ "@fulldev/icon"
6
+ ],
7
+ "files": [
8
+ {
9
+ "path": "src/components/ui/breadcrumb/breadcrumb.astro",
10
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"nav\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<nav\n aria-label=\"breadcrumb\"\n data-slot=\"breadcrumb\"\n class={cn(className)}\n {...props}\n>\n <slot />\n</nav>\n",
11
+ "type": "registry:ui"
12
+ },
13
+ {
14
+ "path": "src/components/ui/breadcrumb/breadcrumb-list.astro",
15
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"ol\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<ol\n data-slot=\"breadcrumb-list\"\n class={cn(\n \"text-muted-foreground flex flex-wrap items-center gap-1.5 text-sm wrap-break-word sm:gap-2.5\",\n className\n )}\n {...props}\n>\n <slot />\n</ol>\n",
16
+ "type": "registry:ui"
17
+ },
18
+ {
19
+ "path": "src/components/ui/breadcrumb/breadcrumb-item.astro",
20
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"li\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<li\n data-slot=\"breadcrumb-item\"\n class={cn(\"inline-flex items-center gap-1.5\", className)}\n {...props}\n>\n <slot />\n</li>\n",
21
+ "type": "registry:ui"
22
+ },
23
+ {
24
+ "path": "src/components/ui/breadcrumb/breadcrumb-link.astro",
25
+ "content": "---\nimport type { HTMLTag, Polymorphic } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props<Tag extends HTMLTag = \"a\"> = Polymorphic<{ as: Tag }>\n\nconst { as: Tag = \"a\", class: className, ...props } = Astro.props\n---\n\n<Tag\n data-slot=\"breadcrumb-link\"\n class={cn(\"hover:text-foreground transition-colors\", className)}\n {...props}\n>\n <slot />\n</Tag>\n",
26
+ "type": "registry:ui"
27
+ },
28
+ {
29
+ "path": "src/components/ui/breadcrumb/breadcrumb-page.astro",
30
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"span\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<span\n data-slot=\"breadcrumb-page\"\n role=\"link\"\n aria-disabled=\"true\"\n aria-current=\"page\"\n class={cn(\"text-foreground font-normal\", className)}\n {...props}\n>\n <slot />\n</span>\n",
31
+ "type": "registry:ui"
32
+ },
33
+ {
34
+ "path": "src/components/ui/breadcrumb/breadcrumb-separator.astro",
35
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Icon } from \"@/components/ui/icon\"\n\ntype Props = HTMLAttributes<\"li\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<li\n data-slot=\"breadcrumb-separator\"\n role=\"presentation\"\n aria-hidden=\"true\"\n class={cn(\"[&>svg]:size-3.5\", className)}\n {...props}\n>\n {Astro.slots.has(\"default\") ? <slot /> : <Icon name=\"chevron-right\" />}\n</li>\n",
36
+ "type": "registry:ui"
37
+ },
38
+ {
39
+ "path": "src/components/ui/breadcrumb/breadcrumb-ellipsis.astro",
40
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Icon } from \"@/components/ui/icon\"\n\ntype Props = HTMLAttributes<\"span\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<span\n data-slot=\"breadcrumb-ellipsis\"\n role=\"presentation\"\n aria-hidden=\"true\"\n class={cn(\n \"flex size-5 items-center justify-center [&>svg]:size-4\",\n className\n )}\n {...props}\n>\n <Icon name=\"ellipsis\" />\n <span class=\"sr-only\">More</span>\n</span>\n",
41
+ "type": "registry:ui"
42
+ },
43
+ {
44
+ "path": "src/components/ui/breadcrumb/index.ts",
45
+ "content": "export { default as Breadcrumb } from \"./breadcrumb.astro\"\nexport { default as BreadcrumbEllipsis } from \"./breadcrumb-ellipsis.astro\"\nexport { default as BreadcrumbItem } from \"./breadcrumb-item.astro\"\nexport { default as BreadcrumbLink } from \"./breadcrumb-link.astro\"\nexport { default as BreadcrumbList } from \"./breadcrumb-list.astro\"\nexport { default as BreadcrumbPage } from \"./breadcrumb-page.astro\"\nexport { default as BreadcrumbSeparator } from \"./breadcrumb-separator.astro\"\n",
46
+ "type": "registry:ui"
47
+ }
48
+ ],
49
+ "type": "registry:ui"
50
+ }
@@ -1,17 +1,22 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "button",
4
- "type": "registry:ui",
5
4
  "files": [
5
+ {
6
+ "path": "src/components/ui/button/button-variants.ts",
7
+ "content": "import { cva, type VariantProps } from \"class-variance-authority\"\n\nexport const buttonVariants = cva(\n \"group/button focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 inline-flex shrink-0 items-center justify-center rounded-md border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:ring-3 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:ring-3 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/80\",\n outline:\n \"!border-border bg-background hover:bg-muted hover:text-foreground dark:!border-input dark:bg-input/30 dark:hover:bg-input/50 shadow-xs\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-muted hover:text-foreground dark:hover:bg-muted/50\",\n destructive:\n \"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default:\n \"h-9 gap-1.5 px-2.5 in-data-[slot=button-group]:rounded-md has-[>svg:first-child]:pl-2 has-[>svg:last-child]:pr-2\",\n xs: \"h-6 gap-1 rounded-[min(var(--radius-md),8px)] px-2 text-xs in-data-[slot=button-group]:rounded-md has-[>svg:first-child]:pl-1.5 has-[>svg:last-child]:pr-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-8 gap-1 rounded-[min(var(--radius-md),10px)] px-2.5 in-data-[slot=button-group]:rounded-md has-[>svg:first-child]:pl-1.5 has-[>svg:last-child]:pr-1.5\",\n lg: \"h-10 gap-1.5 px-2.5 has-[>svg:first-child]:pl-2 has-[>svg:last-child]:pr-2\",\n icon: \"size-9\",\n \"icon-xs\":\n \"size-6 rounded-[min(var(--radius-md),8px)] in-data-[slot=button-group]:rounded-md [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\":\n \"size-8 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-md\",\n \"icon-lg\": \"size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nexport type ButtonVariantProps = VariantProps<typeof buttonVariants>\n",
8
+ "type": "registry:ui"
9
+ },
6
10
  {
7
11
  "path": "src/components/ui/button/button.astro",
8
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = VariantProps<typeof variants> &\n HTMLAttributes<\"button\"> &\n HTMLAttributes<\"a\"> &\n HTMLAttributes<\"label\"> & {\n as?: \"button\" | \"a\" | \"label\"\n text?: string\n html?: string\n }\n\nconst variants = cva(\n \"focus-visible:border-ring text-foreground focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60 text-white\",\n outline:\n \"bg-background hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 border shadow-xs\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-8 gap-1.5 rounded-md px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9\",\n \"icon-sm\": \"size-8\",\n \"icon-lg\": \"size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nconst {\n class: className,\n variant,\n size,\n href,\n text,\n html,\n ...props\n} = Astro.props\n\nconst slot = await Astro.slots.render(\"default\")\n\nconst Comp = href ? \"a\" : \"button\"\n---\n\n{\n slot?.trim().length > 0 && (\n <Comp\n data-slot=\"button\"\n class={cn(variants({ variant, size }), className)}\n href={href}\n {...props}\n >\n <Fragment set:html={slot} />\n </Comp>\n )\n}\n",
12
+ "content": "---\nimport type { HTMLTag, Polymorphic } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\nimport { buttonVariants, type ButtonVariantProps } from \"./button-variants\"\n\ntype Props<Tag extends HTMLTag = \"button\"> = Polymorphic<{ as: Tag }> &\n ButtonVariantProps\n\nconst {\n as: Tag = \"href\" in Astro.props ? \"a\" : \"button\",\n class: className,\n variant,\n size,\n ...props\n} = Astro.props\n---\n\n<Tag\n data-slot=\"button\"\n class={cn(buttonVariants({ variant, size }), className)}\n {...props}\n>\n <slot />\n</Tag>\n",
9
13
  "type": "registry:ui"
10
14
  },
11
15
  {
12
16
  "path": "src/components/ui/button/index.ts",
13
- "content": "export { default as Button } from \"./button.astro\"\n",
17
+ "content": "export { buttonVariants, type ButtonVariantProps } from \"./button-variants\"\n\nexport { default as Button } from \"./button.astro\"\n",
14
18
  "type": "registry:ui"
15
19
  }
16
- ]
20
+ ],
21
+ "type": "registry:ui"
17
22
  }
@@ -0,0 +1,47 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "card",
4
+ "files": [
5
+ {
6
+ "path": "src/components/ui/card/card.astro",
7
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n size?: \"default\" | \"sm\"\n}\n\nconst { class: className, size = \"default\", ...props } = Astro.props\n---\n\n<div\n data-slot=\"card\"\n data-size={size}\n class={cn(\n \"ring-foreground/10 bg-card text-card-foreground group/card flex flex-col gap-6 overflow-hidden rounded-xl py-6 text-sm shadow-xs ring-1 has-[>img:first-child]:pt-0 data-[size=sm]:gap-4 data-[size=sm]:py-4 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl\",\n className\n )}\n {...props}\n>\n <slot />\n</div>\n",
8
+ "type": "registry:ui"
9
+ },
10
+ {
11
+ "path": "src/components/ui/card/card-header.astro",
12
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<div\n data-slot=\"card-header\"\n class={cn(\n \"group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-6 group-data-[size=sm]/card:px-4 has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-6 group-data-[size=sm]/card:[.border-b]:pb-4\",\n className\n )}\n {...props}\n>\n <slot />\n</div>\n",
13
+ "type": "registry:ui"
14
+ },
15
+ {
16
+ "path": "src/components/ui/card/card-action.astro",
17
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<div\n data-slot=\"card-action\"\n class={cn(\n \"col-start-2 row-span-2 row-start-1 self-start justify-self-end\",\n className\n )}\n {...props}\n>\n <slot />\n</div>\n",
18
+ "type": "registry:ui"
19
+ },
20
+ {
21
+ "path": "src/components/ui/card/card-title.astro",
22
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<div\n data-slot=\"card-title\"\n class={cn(\n \"text-base leading-normal font-medium group-data-[size=sm]/card:text-sm\",\n className\n )}\n {...props}\n>\n <slot />\n</div>\n",
23
+ "type": "registry:ui"
24
+ },
25
+ {
26
+ "path": "src/components/ui/card/card-description.astro",
27
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<div\n data-slot=\"card-description\"\n class={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n>\n <slot />\n</div>\n",
28
+ "type": "registry:ui"
29
+ },
30
+ {
31
+ "path": "src/components/ui/card/card-content.astro",
32
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<div\n data-slot=\"card-content\"\n class={cn(\"px-6 group-data-[size=sm]/card:px-4\", className)}\n {...props}\n>\n <slot />\n</div>\n",
33
+ "type": "registry:ui"
34
+ },
35
+ {
36
+ "path": "src/components/ui/card/card-footer.astro",
37
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<div\n data-slot=\"card-footer\"\n class={cn(\n \"flex items-center rounded-b-xl px-6 group-data-[size=sm]/card:px-4 [.border-t]:pt-6 group-data-[size=sm]/card:[.border-t]:pt-4\",\n className\n )}\n {...props}\n>\n <slot />\n</div>\n",
38
+ "type": "registry:ui"
39
+ },
40
+ {
41
+ "path": "src/components/ui/card/index.ts",
42
+ "content": "export { default as Card } from \"./card.astro\"\nexport { default as CardAction } from \"./card-action.astro\"\nexport { default as CardContent } from \"./card-content.astro\"\nexport { default as CardDescription } from \"./card-description.astro\"\nexport { default as CardFooter } from \"./card-footer.astro\"\nexport { default as CardHeader } from \"./card-header.astro\"\nexport { default as CardTitle } from \"./card-title.astro\"\n",
43
+ "type": "registry:ui"
44
+ }
45
+ ],
46
+ "type": "registry:ui"
47
+ }
@@ -0,0 +1,44 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "carousel",
4
+ "dependencies": [
5
+ "embla-carousel"
6
+ ],
7
+ "registryDependencies": [
8
+ "@fulldev/button",
9
+ "@fulldev/icon"
10
+ ],
11
+ "files": [
12
+ {
13
+ "path": "src/components/ui/carousel/carousel.astro",
14
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\nimport type { EmblaOptionsType } from \"embla-carousel\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\"> & {\n opts?: EmblaOptionsType\n orientation?: \"horizontal\" | \"vertical\"\n}\n\nconst {\n class: className,\n opts,\n orientation = \"horizontal\",\n ...props\n} = Astro.props\n\nconst resolvedOpts: EmblaOptionsType = {\n ...opts,\n axis: orientation === \"horizontal\" ? \"x\" : \"y\",\n}\n---\n\n<div\n data-slot=\"carousel\"\n data-orientation={orientation}\n data-carousel-options={JSON.stringify(resolvedOpts)}\n class={cn(\"group/carousel relative\", className)}\n role=\"region\"\n aria-roledescription=\"carousel\"\n {...props}\n>\n <slot />\n</div>\n\n<script>\n import EmblaCarousel, {\n type EmblaCarouselType,\n type EmblaOptionsType,\n } from \"embla-carousel\"\n\n type CarouselRoot = HTMLElement & {\n __fulldevCarouselApi?: EmblaCarouselType\n }\n\n type CarouselInstance = {\n cleanup: () => void\n }\n\n type CarouselStore = Map<CarouselRoot, CarouselInstance>\n\n declare global {\n interface Window {\n __fulldevCarouselInitialized?: boolean\n __fulldevCarouselStore?: CarouselStore\n }\n }\n\n if (!window.__fulldevCarouselInitialized) {\n window.__fulldevCarouselInitialized = true\n window.__fulldevCarouselStore ??= new Map<CarouselRoot, CarouselInstance>()\n\n const store = window.__fulldevCarouselStore\n\n const getDetails = (api: EmblaCarouselType) => ({\n api,\n canScrollPrev: api.canScrollPrev(),\n canScrollNext: api.canScrollNext(),\n selectedScrollSnap: api.selectedScrollSnap(),\n scrollSnapList: api.scrollSnapList(),\n })\n\n const emit = (\n root: CarouselRoot,\n type: \"carousel:init\" | \"carousel:select\",\n api: EmblaCarouselType\n ) => {\n root.dispatchEvent(\n new CustomEvent(type, {\n detail: getDetails(api),\n })\n )\n }\n\n const parseOptions = (root: CarouselRoot): EmblaOptionsType => {\n const rawOptions = root.getAttribute(\"data-carousel-options\")\n\n if (!rawOptions) {\n return {}\n }\n\n try {\n return JSON.parse(rawOptions) as EmblaOptionsType\n } catch {\n return {}\n }\n }\n\n const syncButton = (button: Element | null, enabled: boolean) => {\n if (!(button instanceof HTMLButtonElement)) {\n return\n }\n\n if (button.dataset.manualDisabled === \"true\") {\n button.disabled = true\n return\n }\n\n button.disabled = !enabled\n }\n\n const cleanupDisconnectedCarousels = () => {\n for (const [root, instance] of store.entries()) {\n if (document.contains(root)) {\n continue\n }\n\n instance.cleanup()\n store.delete(root)\n }\n }\n\n const initCarousel = (root: Element) => {\n if (!(root instanceof HTMLElement) || store.has(root)) {\n return\n }\n\n const carouselRoot = root as CarouselRoot\n const viewport = carouselRoot.querySelector(\n '[data-slot=\"carousel-content\"]'\n )\n const prevButton = carouselRoot.querySelector(\n '[data-slot=\"carousel-previous\"]'\n )\n const nextButton = carouselRoot.querySelector(\n '[data-slot=\"carousel-next\"]'\n )\n\n if (!(viewport instanceof HTMLElement)) {\n return\n }\n\n const api = EmblaCarousel(viewport, parseOptions(carouselRoot))\n\n const sync = () => {\n const details = getDetails(api)\n\n carouselRoot.dataset.canScrollPrev = details.canScrollPrev\n ? \"true\"\n : \"false\"\n carouselRoot.dataset.canScrollNext = details.canScrollNext\n ? \"true\"\n : \"false\"\n carouselRoot.dataset.selectedScrollSnap = String(\n details.selectedScrollSnap\n )\n\n syncButton(prevButton, details.canScrollPrev)\n syncButton(nextButton, details.canScrollNext)\n\n emit(carouselRoot, \"carousel:select\", api)\n }\n\n const onPrevClick = () => {\n api.scrollPrev()\n }\n\n const onNextClick = () => {\n api.scrollNext()\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n const isVertical = carouselRoot.dataset.orientation === \"vertical\"\n\n if (!isVertical && event.key === \"ArrowLeft\") {\n event.preventDefault()\n api.scrollPrev()\n }\n\n if (!isVertical && event.key === \"ArrowRight\") {\n event.preventDefault()\n api.scrollNext()\n }\n\n if (isVertical && event.key === \"ArrowUp\") {\n event.preventDefault()\n api.scrollPrev()\n }\n\n if (isVertical && event.key === \"ArrowDown\") {\n event.preventDefault()\n api.scrollNext()\n }\n }\n\n if (prevButton instanceof HTMLElement) {\n prevButton.addEventListener(\"click\", onPrevClick)\n }\n\n if (nextButton instanceof HTMLElement) {\n nextButton.addEventListener(\"click\", onNextClick)\n }\n\n carouselRoot.addEventListener(\"keydown\", onKeyDown, true)\n\n api.on(\"reInit\", sync)\n api.on(\"select\", sync)\n\n carouselRoot.__fulldevCarouselApi = api\n\n sync()\n requestAnimationFrame(() => emit(carouselRoot, \"carousel:init\", api))\n\n store.set(carouselRoot, {\n cleanup: () => {\n api.off(\"reInit\", sync)\n api.off(\"select\", sync)\n\n if (prevButton instanceof HTMLElement) {\n prevButton.removeEventListener(\"click\", onPrevClick)\n }\n\n if (nextButton instanceof HTMLElement) {\n nextButton.removeEventListener(\"click\", onNextClick)\n }\n\n carouselRoot.removeEventListener(\"keydown\", onKeyDown, true)\n delete carouselRoot.__fulldevCarouselApi\n api.destroy()\n },\n })\n }\n\n const initCarousels = () => {\n cleanupDisconnectedCarousels()\n\n document\n .querySelectorAll('[data-slot=\"carousel\"]')\n .forEach((root) => initCarousel(root))\n }\n\n initCarousels()\n document.addEventListener(\"astro:page-load\", initCarousels)\n }\n</script>\n",
15
+ "type": "registry:ui"
16
+ },
17
+ {
18
+ "path": "src/components/ui/carousel/carousel-content.astro",
19
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<div class=\"overflow-hidden\" data-slot=\"carousel-content\">\n <div\n data-slot=\"carousel-container\"\n class={cn(\n \"flex [touch-action:pan-y_pinch-zoom]\",\n \"group-data-[orientation=vertical]/carousel:-mt-4 group-data-[orientation=vertical]/carousel:[touch-action:pan-x_pinch-zoom] group-data-[orientation=vertical]/carousel:flex-col\",\n \"group-data-[orientation=horizontal]/carousel:-ml-4\",\n className\n )}\n {...props}\n >\n <slot />\n </div>\n</div>\n",
20
+ "type": "registry:ui"
21
+ },
22
+ {
23
+ "path": "src/components/ui/carousel/carousel-item.astro",
24
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<div\n data-slot=\"carousel-item\"\n role=\"group\"\n aria-roledescription=\"slide\"\n class={cn(\n \"min-w-0 shrink-0 grow-0 basis-full\",\n \"group-data-[orientation=horizontal]/carousel:pl-4\",\n \"group-data-[orientation=vertical]/carousel:pt-4\",\n className\n )}\n {...props}\n>\n <slot />\n</div>\n",
25
+ "type": "registry:ui"
26
+ },
27
+ {
28
+ "path": "src/components/ui/carousel/carousel-next.astro",
29
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\nimport { buttonVariants, type ButtonVariantProps } from \"@/components/ui/button\"\nimport { Icon } from \"@/components/ui/icon\"\n\ntype Props = Omit<HTMLAttributes<\"button\">, \"type\"> & ButtonVariantProps\n\nconst {\n class: className,\n variant = \"outline\",\n size = \"icon-sm\",\n disabled,\n ...props\n} = Astro.props\n---\n\n<button\n type=\"button\"\n data-slot=\"carousel-next\"\n data-manual-disabled={disabled ? \"true\" : undefined}\n disabled={disabled}\n class={cn(\n buttonVariants({ variant, size }),\n \"absolute top-1/2 -right-12 z-10 -translate-y-1/2 touch-manipulation rounded-full\",\n \"group-data-[orientation=vertical]/carousel:right-auto group-data-[orientation=vertical]/carousel:-bottom-12 group-data-[orientation=vertical]/carousel:left-1/2 group-data-[orientation=vertical]/carousel:-translate-x-1/2 group-data-[orientation=vertical]/carousel:translate-y-0 group-data-[orientation=vertical]/carousel:rotate-90\",\n className\n )}\n {...props}\n>\n <slot>\n <Icon name=\"chevron-right\" class=\"size-4\" aria-hidden=\"true\" />\n <span class=\"sr-only\">Next slide</span>\n </slot>\n</button>\n",
30
+ "type": "registry:ui"
31
+ },
32
+ {
33
+ "path": "src/components/ui/carousel/carousel-previous.astro",
34
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\nimport { buttonVariants, type ButtonVariantProps } from \"@/components/ui/button\"\nimport { Icon } from \"@/components/ui/icon\"\n\ntype Props = Omit<HTMLAttributes<\"button\">, \"type\"> & ButtonVariantProps\n\nconst {\n class: className,\n variant = \"outline\",\n size = \"icon-sm\",\n disabled,\n ...props\n} = Astro.props\n---\n\n<button\n type=\"button\"\n data-slot=\"carousel-previous\"\n data-manual-disabled={disabled ? \"true\" : undefined}\n disabled={disabled}\n class={cn(\n buttonVariants({ variant, size }),\n \"absolute top-1/2 -left-12 z-10 -translate-y-1/2 touch-manipulation rounded-full\",\n \"group-data-[orientation=vertical]/carousel:-top-12 group-data-[orientation=vertical]/carousel:left-1/2 group-data-[orientation=vertical]/carousel:-translate-x-1/2 group-data-[orientation=vertical]/carousel:translate-y-0 group-data-[orientation=vertical]/carousel:rotate-90\",\n className\n )}\n {...props}\n>\n <slot>\n <Icon name=\"chevron-left\" class=\"size-4\" aria-hidden=\"true\" />\n <span class=\"sr-only\">Previous slide</span>\n </slot>\n</button>\n",
35
+ "type": "registry:ui"
36
+ },
37
+ {
38
+ "path": "src/components/ui/carousel/index.ts",
39
+ "content": "export type {\n EmblaCarouselType as CarouselApi,\n EmblaOptionsType as CarouselOptions,\n EmblaPluginType as CarouselPlugin,\n} from \"embla-carousel\"\n\nexport { default as Carousel } from \"./carousel.astro\"\nexport { default as CarouselContent } from \"./carousel-content.astro\"\nexport { default as CarouselItem } from \"./carousel-item.astro\"\nexport { default as CarouselPrevious } from \"./carousel-previous.astro\"\nexport { default as CarouselNext } from \"./carousel-next.astro\"\n",
40
+ "type": "registry:ui"
41
+ }
42
+ ],
43
+ "type": "registry:ui"
44
+ }
@@ -1,11 +1,10 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "checkbox",
4
- "type": "registry:ui",
5
4
  "files": [
6
5
  {
7
6
  "path": "src/components/ui/checkbox/checkbox.astro",
8
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface Props extends Omit<HTMLAttributes<\"input\">, \"type\"> {}\n\nconst { class: className, ...props } = Astro.props\n---\n\n<input\n type=\"checkbox\"\n data-slot=\"checkbox\"\n class={cn(\n \"peer border-input dark:bg-input/30 checked:bg-primary checked:text-primary-foreground checked:border-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive size-4 shrink-0 rounded-[4px] border shadow-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50\",\n \"accent-primary\",\n className\n )}\n {...props}\n/>\n",
7
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = Omit<HTMLAttributes<\"input\">, \"type\">\n\nconst { class: className, ...props } = Astro.props\n---\n\n<input\n type=\"checkbox\"\n role=\"checkbox\"\n data-slot=\"checkbox\"\n class={cn(\n \"border-input dark:bg-input/30 checked:bg-primary dark:checked:bg-primary checked:border-primary indeterminate:bg-primary indeterminate:border-primary aria-invalid:checked:border-primary aria-invalid:indeterminate:border-primary aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 peer relative flex size-4 shrink-0 appearance-none items-center justify-center rounded-[4px] border shadow-xs transition-shadow outline-none group-has-disabled/field:opacity-50 after:absolute after:-inset-x-3 after:-inset-y-2 checked:[color:var(--color-primary-foreground)] indeterminate:[color:var(--color-primary-foreground)] focus-visible:ring-3 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:ring-3\",\n className\n )}\n {...props}\n/>\n\n<style>\n [data-slot=\"checkbox\"] {\n color: inherit;\n }\n\n [data-slot=\"checkbox\"]::before {\n content: \"\";\n position: absolute;\n inset: 0;\n margin: auto;\n width: 14px;\n height: 14px;\n opacity: 0;\n background-color: currentColor;\n background-repeat: no-repeat;\n background-position: center;\n background-size: 14px 14px;\n -webkit-mask-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3.5 8.5l3 3 6-6'/%3E%3C/svg%3E\");\n -webkit-mask-repeat: no-repeat;\n -webkit-mask-position: center;\n -webkit-mask-size: 14px 14px;\n mask-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3.5 8.5l3 3 6-6'/%3E%3C/svg%3E\");\n mask-repeat: no-repeat;\n mask-position: center;\n mask-size: 14px 14px;\n }\n\n [data-slot=\"checkbox\"]:checked,\n [data-slot=\"checkbox\"]:indeterminate {\n color: var(--color-primary-foreground);\n }\n\n [data-slot=\"checkbox\"]:checked::before {\n opacity: 1;\n }\n\n [data-slot=\"checkbox\"]:indeterminate::before {\n opacity: 1;\n -webkit-mask-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none'%3E%3Cpath d='M3.5 8h9' stroke='black' stroke-width='2.5' stroke-linecap='round'/%3E%3C/svg%3E\");\n mask-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none'%3E%3Cpath d='M3.5 8h9' stroke='black' stroke-width='2.5' stroke-linecap='round'/%3E%3C/svg%3E\");\n }\n</style>\n",
9
8
  "type": "registry:ui"
10
9
  },
11
10
  {
@@ -13,5 +12,6 @@
13
12
  "content": "export { default as Checkbox } from \"./checkbox.astro\"\n",
14
13
  "type": "registry:ui"
15
14
  }
16
- ]
15
+ ],
16
+ "type": "registry:ui"
17
17
  }
@@ -1,21 +1,23 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "collapsible",
4
- "type": "registry:ui",
4
+ "dependencies": [
5
+ "@data-slot/collapsible"
6
+ ],
5
7
  "files": [
6
8
  {
7
9
  "path": "src/components/ui/collapsible/collapsible.astro",
8
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface Props extends Omit<HTMLAttributes<\"details\">, \"class\"> {\n class?: string\n open?: boolean\n}\n\nconst { class: className, open = false, ...props } = Astro.props\n\nconst slot = await Astro.slots.render(\"default\")\n---\n\n{\n slot?.trim().length > 0 && (\n <details\n data-slot=\"collapsible\"\n class={cn(\"group/collapsible\", className)}\n open={open}\n {...props}\n >\n <Fragment set:html={slot} />\n </details>\n )\n}\n",
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",
9
11
  "type": "registry:ui"
10
12
  },
11
13
  {
12
14
  "path": "src/components/ui/collapsible/collapsible-content.astro",
13
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface Props extends HTMLAttributes<\"div\"> {}\n\nconst { class: className, ...props } = Astro.props\n\nconst slot = await Astro.slots.render(\"default\")\n---\n\n{\n slot?.trim().length > 0 && (\n <div data-slot=\"collapsible-content\" class={cn(className)} {...props}>\n <Fragment set:html={slot} />\n </div>\n )\n}\n",
15
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"div\">\n\nconst { class: className, hidden: _hidden, ...props } = Astro.props\n---\n\n<div data-slot=\"collapsible-content\" hidden class={cn(className)} {...props}>\n <slot />\n</div>\n",
14
16
  "type": "registry:ui"
15
17
  },
16
18
  {
17
19
  "path": "src/components/ui/collapsible/collapsible-trigger.astro",
18
- "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\nimport ChevronDownIcon from \"lucide-static/icons/chevron-down.svg\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface Props extends Omit<HTMLAttributes<\"summary\">, \"class\"> {\n class?: string\n showChevron?: boolean\n}\n\nconst { class: className, showChevron = true, ...props } = Astro.props\n\nconst slot = await Astro.slots.render(\"default\")\n---\n\n{\n slot?.trim().length > 0 && (\n <summary\n data-slot=\"collapsible-trigger\"\n class={cn(\n \"flex cursor-pointer list-none items-center gap-2 [&::-webkit-details-marker]:hidden\",\n className\n )}\n {...props}\n >\n <Fragment set:html={slot} />\n {showChevron && (\n <ChevronDownIcon class=\"ml-auto size-4 shrink-0 transition-transform duration-200 group-open/collapsible:rotate-180\" />\n )}\n </summary>\n )\n}\n",
20
+ "content": "---\nimport type { HTMLAttributes } from \"astro/types\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype Props = HTMLAttributes<\"button\">\n\nconst { class: className, type = \"button\", ...props } = Astro.props\n---\n\n<button\n data-slot=\"collapsible-trigger\"\n type={type}\n class={cn(className)}\n {...props}\n>\n <slot />\n</button>\n",
19
21
  "type": "registry:ui"
20
22
  },
21
23
  {
@@ -23,5 +25,6 @@
23
25
  "content": "export { default as Collapsible } from \"./collapsible.astro\"\nexport { default as CollapsibleContent } from \"./collapsible-content.astro\"\nexport { default as CollapsibleTrigger } from \"./collapsible-trigger.astro\"\n",
24
26
  "type": "registry:ui"
25
27
  }
26
- ]
28
+ ],
29
+ "type": "registry:ui"
27
30
  }