fulldev-ui 0.10.1 → 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +7 -1
  3. package/package.json +6 -4
  4. package/public/r/accordion.json +7 -1
  5. package/public/r/alert-dialog.json +7 -1
  6. package/public/r/alert.json +6 -0
  7. package/public/r/article-1.json +7 -1
  8. package/public/r/article-2.json +7 -1
  9. package/public/r/articles-1.json +7 -1
  10. package/public/r/articles-2.json +7 -1
  11. package/public/r/articles-3.json +7 -1
  12. package/public/r/articles-4.json +7 -1
  13. package/public/r/avatar.json +6 -0
  14. package/public/r/badge.json +6 -0
  15. package/public/r/banner-1.json +7 -1
  16. package/public/r/banner-2.json +7 -1
  17. package/public/r/banner.json +7 -1
  18. package/public/r/blocks-1.json +6 -1
  19. package/public/r/blocks.json +92 -0
  20. package/public/r/breadcrumb.json +6 -0
  21. package/public/r/button.json +6 -0
  22. package/public/r/card.json +6 -0
  23. package/public/r/carousel.json +6 -0
  24. package/public/r/checkbox.json +6 -0
  25. package/public/r/collapsible.json +7 -1
  26. package/public/r/combobox.json +6 -0
  27. package/public/r/command.json +6 -0
  28. package/public/r/components.json +14 -3
  29. package/public/r/contact-1.json +10 -2
  30. package/public/r/contact-2.json +10 -2
  31. package/public/r/contact-3.json +10 -2
  32. package/public/r/content-1.json +7 -1
  33. package/public/r/content-2.json +7 -1
  34. package/public/r/content-3.json +7 -1
  35. package/public/r/content-4.json +7 -1
  36. package/public/r/cta-1.json +7 -1
  37. package/public/r/cta-2.json +7 -1
  38. package/public/r/cta-3.json +7 -1
  39. package/public/r/cta-4.json +7 -1
  40. package/public/r/cta-5.json +7 -1
  41. package/public/r/cta-6.json +7 -1
  42. package/public/r/cta-7.json +7 -1
  43. package/public/r/cta-8.json +7 -1
  44. package/public/r/dialog.json +7 -1
  45. package/public/r/doc-1.json +7 -1
  46. package/public/r/dropdown-menu.json +7 -1
  47. package/public/r/empty.json +6 -0
  48. package/public/r/faqs-1.json +7 -1
  49. package/public/r/faqs-2.json +7 -1
  50. package/public/r/faqs-3.json +7 -1
  51. package/public/r/faqs-4.json +7 -1
  52. package/public/r/features-1.json +7 -1
  53. package/public/r/features-2.json +7 -1
  54. package/public/r/features-3.json +7 -1
  55. package/public/r/features-4.json +7 -1
  56. package/public/r/features-5.json +7 -1
  57. package/public/r/features-6.json +7 -1
  58. package/public/r/field.json +6 -0
  59. package/public/r/footer-1.json +7 -1
  60. package/public/r/footer-2.json +7 -1
  61. package/public/r/footer-3.json +7 -1
  62. package/public/r/form.json +6 -0
  63. package/public/r/header-1.json +7 -1
  64. package/public/r/header-2.json +7 -1
  65. package/public/r/header-3.json +7 -1
  66. package/public/r/header-4.json +7 -1
  67. package/public/r/header-5.json +7 -1
  68. package/public/r/header.json +6 -0
  69. package/public/r/hero-1.json +7 -1
  70. package/public/r/hero-10.json +7 -1
  71. package/public/r/hero-11.json +7 -1
  72. package/public/r/hero-12.json +7 -1
  73. package/public/r/hero-13.json +7 -1
  74. package/public/r/hero-2.json +7 -1
  75. package/public/r/hero-3.json +7 -1
  76. package/public/r/hero-4.json +7 -1
  77. package/public/r/hero-5.json +7 -1
  78. package/public/r/hero-6.json +7 -1
  79. package/public/r/hero-7.json +7 -1
  80. package/public/r/hero-8.json +7 -1
  81. package/public/r/hero-9.json +7 -1
  82. package/public/r/hover-card.json +7 -1
  83. package/public/r/icon.json +7 -1
  84. package/public/r/init.json +28 -0
  85. package/public/r/input-group.json +6 -0
  86. package/public/r/input.json +6 -0
  87. package/public/r/item.json +6 -0
  88. package/public/r/kbd.json +6 -0
  89. package/public/r/label.json +6 -0
  90. package/public/r/layout.json +6 -0
  91. package/public/r/links-2.json +7 -1
  92. package/public/r/logo.json +6 -0
  93. package/public/r/logos-1.json +7 -1
  94. package/public/r/logos-2.json +7 -1
  95. package/public/r/logos-3.json +7 -1
  96. package/public/r/marquee.json +6 -0
  97. package/public/r/native-select.json +6 -0
  98. package/public/r/navigation-menu.json +7 -1
  99. package/public/r/popover.json +7 -1
  100. package/public/r/price.json +6 -0
  101. package/public/r/pricing-1.json +7 -1
  102. package/public/r/pricing-2.json +7 -1
  103. package/public/r/pricing-3.json +7 -1
  104. package/public/r/product-1.json +7 -1
  105. package/public/r/products-1.json +7 -1
  106. package/public/r/products-2.json +7 -1
  107. package/public/r/products-3.json +7 -1
  108. package/public/r/products-4.json +7 -1
  109. package/public/r/products-5.json +7 -1
  110. package/public/r/radio-group.json +7 -1
  111. package/public/r/rating.json +6 -0
  112. package/public/r/registry.json +1645 -457
  113. package/public/r/reviews-1.json +7 -1
  114. package/public/r/reviews-2.json +7 -1
  115. package/public/r/reviews-3.json +7 -1
  116. package/public/r/reviews-4.json +7 -1
  117. package/public/r/reviews-5.json +7 -1
  118. package/public/r/section.json +18 -2
  119. package/public/r/select.json +6 -0
  120. package/public/r/separator.json +6 -0
  121. package/public/r/services-1.json +7 -1
  122. package/public/r/services-2.json +7 -1
  123. package/public/r/services-3.json +7 -1
  124. package/public/r/services-4.json +7 -1
  125. package/public/r/services-5.json +7 -1
  126. package/public/r/services-6.json +7 -1
  127. package/public/r/services-7.json +7 -1
  128. package/public/r/sheet.json +8 -2
  129. package/public/r/sidebar-1.json +6 -1
  130. package/public/r/sidebar.json +6 -0
  131. package/public/r/skeleton.json +6 -0
  132. package/public/r/slider.json +7 -1
  133. package/public/r/spinner.json +6 -0
  134. package/public/r/switch.json +7 -1
  135. package/public/r/table.json +6 -0
  136. package/public/r/tabs.json +7 -1
  137. package/public/r/textarea.json +6 -0
  138. package/public/r/theme-toggle.json +6 -0
  139. package/public/r/toc.json +6 -0
  140. package/public/r/toggle.json +7 -1
  141. package/public/r/tooltip.json +7 -1
  142. package/public/r/typography.json +7 -1
  143. package/public/r/video.json +6 -0
  144. package/registry/init/global.css +187 -0
  145. package/registry.json +1137 -454
  146. package/src/components/blocks/article-1.astro +4 -3
  147. package/src/components/blocks/article-2.astro +4 -3
  148. package/src/components/blocks/articles-1.astro +18 -9
  149. package/src/components/blocks/articles-2.astro +4 -3
  150. package/src/components/blocks/articles-3.astro +11 -9
  151. package/src/components/blocks/articles-4.astro +11 -4
  152. package/src/components/blocks/banner-1.astro +4 -3
  153. package/src/components/blocks/banner-2.astro +16 -7
  154. package/src/components/blocks/blocks-1.astro +1 -1
  155. package/src/components/blocks/contact-1.astro +74 -40
  156. package/src/components/blocks/contact-2.astro +71 -36
  157. package/src/components/blocks/contact-3.astro +63 -35
  158. package/src/components/blocks/content-1.astro +15 -10
  159. package/src/components/blocks/content-2.astro +15 -10
  160. package/src/components/blocks/content-3.astro +14 -12
  161. package/src/components/blocks/content-4.astro +15 -10
  162. package/src/components/blocks/cta-1.astro +14 -10
  163. package/src/components/blocks/cta-2.astro +11 -8
  164. package/src/components/blocks/cta-3.astro +15 -8
  165. package/src/components/blocks/cta-4.astro +14 -9
  166. package/src/components/blocks/cta-5.astro +12 -8
  167. package/src/components/blocks/cta-6.astro +11 -8
  168. package/src/components/blocks/cta-7.astro +17 -10
  169. package/src/components/blocks/cta-8.astro +15 -10
  170. package/src/components/blocks/doc-1.astro +1 -1
  171. package/src/components/blocks/faqs-1.astro +22 -11
  172. package/src/components/blocks/faqs-2.astro +19 -9
  173. package/src/components/blocks/faqs-3.astro +19 -9
  174. package/src/components/blocks/faqs-4.astro +12 -9
  175. package/src/components/blocks/features-1.astro +21 -13
  176. package/src/components/blocks/features-2.astro +22 -13
  177. package/src/components/blocks/features-3.astro +14 -13
  178. package/src/components/blocks/features-4.astro +18 -9
  179. package/src/components/blocks/features-5.astro +22 -13
  180. package/src/components/blocks/features-6.astro +19 -9
  181. package/src/components/blocks/footer-1.astro +4 -3
  182. package/src/components/blocks/footer-2.astro +4 -3
  183. package/src/components/blocks/footer-3.astro +4 -3
  184. package/src/components/blocks/header-1.astro +13 -7
  185. package/src/components/blocks/header-2.astro +12 -6
  186. package/src/components/blocks/header-3.astro +12 -6
  187. package/src/components/blocks/header-4.astro +13 -6
  188. package/src/components/blocks/header-5.astro +16 -6
  189. package/src/components/blocks/hero-1.astro +11 -8
  190. package/src/components/blocks/hero-10.astro +7 -3
  191. package/src/components/blocks/hero-11.astro +4 -2
  192. package/src/components/blocks/hero-12.astro +11 -4
  193. package/src/components/blocks/hero-13.astro +11 -4
  194. package/src/components/blocks/hero-2.astro +11 -8
  195. package/src/components/blocks/hero-3.astro +11 -3
  196. package/src/components/blocks/hero-4.astro +4 -2
  197. package/src/components/blocks/hero-5.astro +4 -3
  198. package/src/components/blocks/hero-6.astro +4 -3
  199. package/src/components/blocks/hero-7.astro +4 -3
  200. package/src/components/blocks/hero-8.astro +11 -4
  201. package/src/components/blocks/hero-9.astro +4 -3
  202. package/src/components/blocks/links-2.astro +4 -4
  203. package/src/components/blocks/logos-1.astro +14 -16
  204. package/src/components/blocks/logos-2.astro +14 -12
  205. package/src/components/blocks/logos-3.astro +5 -4
  206. package/src/components/blocks/pricing-1.astro +13 -16
  207. package/src/components/blocks/pricing-2.astro +14 -13
  208. package/src/components/blocks/pricing-3.astro +20 -16
  209. package/src/components/blocks/product-1.astro +4 -3
  210. package/src/components/blocks/products-1.astro +11 -9
  211. package/src/components/blocks/products-2.astro +12 -9
  212. package/src/components/blocks/products-3.astro +12 -9
  213. package/src/components/blocks/products-4.astro +18 -9
  214. package/src/components/blocks/products-5.astro +18 -9
  215. package/src/components/blocks/reviews-1.astro +13 -12
  216. package/src/components/blocks/reviews-2.astro +4 -4
  217. package/src/components/blocks/reviews-3.astro +13 -12
  218. package/src/components/blocks/reviews-4.astro +13 -12
  219. package/src/components/blocks/reviews-5.astro +13 -12
  220. package/src/components/blocks/services-1.astro +19 -9
  221. package/src/components/blocks/services-2.astro +11 -8
  222. package/src/components/blocks/services-3.astro +11 -8
  223. package/src/components/blocks/services-4.astro +19 -9
  224. package/src/components/blocks/services-5.astro +11 -8
  225. package/src/components/blocks/services-6.astro +4 -3
  226. package/src/components/blocks/services-7.astro +12 -8
  227. package/src/components/blocks/sidebar-1.astro +2 -2
  228. package/src/components/ui/accordion/accordion.astro +1 -0
  229. package/src/components/ui/alert-dialog/alert-dialog.astro +1 -0
  230. package/src/components/ui/banner/banner.astro +23 -41
  231. package/src/components/ui/collapsible/collapsible.astro +1 -0
  232. package/src/components/ui/dialog/dialog.astro +1 -0
  233. package/src/components/ui/dropdown-menu/dropdown-menu.astro +1 -0
  234. package/src/components/ui/hover-card/hover-card.astro +7 -3
  235. package/src/components/ui/icon/icon.astro +46 -29
  236. package/src/components/ui/navigation-menu/navigation-menu.astro +1 -0
  237. package/src/components/ui/popover/popover.astro +1 -0
  238. package/src/components/ui/radio-group/radio-group.astro +1 -0
  239. package/src/components/ui/section/index.ts +2 -0
  240. package/src/components/ui/section/section-container.astro +1 -0
  241. package/src/components/ui/section/section-description.astro +20 -0
  242. package/src/components/ui/section/section-title.astro +20 -0
  243. package/src/components/ui/sheet/sheet-close.astro +4 -2
  244. package/src/components/ui/sheet/sheet.astro +1 -0
  245. package/src/components/ui/slider/slider.astro +1 -0
  246. package/src/components/ui/switch/switch.astro +1 -0
  247. package/src/components/ui/tabs/tabs.astro +1 -0
  248. package/src/components/ui/toggle/toggle.astro +1 -0
  249. package/src/components/ui/tooltip/tooltip.astro +1 -0
  250. package/src/components/ui/typography/typography.astro +1 -1
  251. package/src/lib/pages.ts +12 -0
  252. package/src/styles/global.css +2 -2
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  import type { ImageMetadata } from "astro"
3
3
  import { Image } from "astro:assets"
4
+ import type { HTMLAttributes } from "astro/types"
4
5
  import ArrowRightIcon from "@lucide/astro/icons/arrow-right"
5
6
 
6
7
  import { cn } from "@/lib/utils"
@@ -9,8 +10,7 @@ import { Button } from "@/components/ui/button"
9
10
  import { Section, SectionContainer } from "@/components/ui/section"
10
11
  import PlaceholderImage from "@/assets/placeholder.webp"
11
12
 
12
- type Props = {
13
- class?: string
13
+ type Props = HTMLAttributes<"section"> & {
14
14
  badge?: string
15
15
  title: string
16
16
  description?: string
@@ -37,10 +37,11 @@ const {
37
37
  description,
38
38
  buttons,
39
39
  services,
40
+ ...props
40
41
  } = Astro.props
41
42
  ---
42
43
 
43
- <Section class={cn("", className)}>
44
+ <Section class={cn("", className)} {...props}>
44
45
  <SectionContainer
45
46
  class="grid gap-8 lg:grid-cols-[20rem_minmax(0,1fr)] lg:items-start"
46
47
  >
@@ -1,16 +1,21 @@
1
1
  ---
2
2
  import type { ImageMetadata } from "astro"
3
3
  import { Image } from "astro:assets"
4
+ import type { HTMLAttributes } from "astro/types"
4
5
  import ArrowRightIcon from "@lucide/astro/icons/arrow-right"
5
6
 
6
7
  import { cn } from "@/lib/utils"
7
8
  import { Badge } from "@/components/ui/badge"
8
9
  import { Button } from "@/components/ui/button"
9
- import { Section, SectionContainer } from "@/components/ui/section"
10
+ import { Icon } from "@/components/ui/icon"
11
+ import {
12
+ Section,
13
+ SectionContainer,
14
+ SectionTitle,
15
+ } from "@/components/ui/section"
10
16
  import PlaceholderImage from "@/assets/placeholder.webp"
11
17
 
12
- type Props = {
13
- class?: string
18
+ type Props = HTMLAttributes<"section"> & {
14
19
  badge?: string
15
20
  title: string
16
21
  description?: string
@@ -38,21 +43,20 @@ const {
38
43
  description,
39
44
  buttons,
40
45
  services,
46
+ ...props
41
47
  } = Astro.props
42
48
  ---
43
49
 
44
- <Section class={cn("", className)}>
50
+ <Section class={cn("", className)} {...props}>
45
51
  <SectionContainer class="gap-8">
46
52
  <div
47
53
  class="flex flex-col gap-4 md:flex-row md:items-end md:justify-between"
48
54
  >
49
55
  <div class="max-w-2xl">
50
56
  {badge && <Badge variant="secondary">{badge}</Badge>}
51
- <h2
52
- class="mt-4 text-3xl font-semibold tracking-tight text-balance sm:text-4xl"
53
- >
57
+ <SectionTitle class="mt-4">
54
58
  {title}
55
- </h2>
59
+ </SectionTitle>
56
60
  {
57
61
  description && (
58
62
  <p class="text-muted-foreground mt-4 text-base leading-relaxed text-balance">
@@ -325,7 +325,7 @@ try {
325
325
  </BreadcrumbList>
326
326
  </Breadcrumb>
327
327
  </HeaderGroup>
328
- <HeaderGroup>
328
+ <HeaderGroup class="shrink-0">
329
329
  <Button
330
330
  as="a"
331
331
  href={`https://github.com/${githubRepo}`}
@@ -336,7 +336,7 @@ try {
336
336
  aria-label={`View ${githubRepo} on GitHub`}
337
337
  >
338
338
  <Icon name="github" />
339
- <span>{githubStars}</span>
339
+ <span class="hidden sm:inline">{githubStars}</span>
340
340
  </Button>
341
341
  <ThemeToggle />
342
342
  </HeaderGroup>
@@ -49,4 +49,5 @@ const serializedDefaultValue = Array.isArray(defaultValue)
49
49
  import { create } from "@data-slot/accordion"
50
50
 
51
51
  create()
52
+ document.addEventListener("astro:page-load", () => create())
52
53
  </script>
@@ -34,4 +34,5 @@ const {
34
34
  import { create } from "@data-slot/alert-dialog"
35
35
 
36
36
  create()
37
+ document.addEventListener("astro:page-load", () => create())
37
38
  </script>
@@ -35,51 +35,33 @@ const { class: className, variant, storageKey, ...props } = Astro.props
35
35
  <slot />
36
36
  </aside>
37
37
 
38
- <script is:inline>
39
- const initializedKey = "fulldevBannerInitialized"
40
-
41
- if (!document.documentElement.dataset[initializedKey]) {
42
- document.documentElement.dataset[initializedKey] = "true"
43
-
44
- const getStorageToken = (key) => `banner:${key}`
45
-
46
- const syncBanners = () => {
47
- document.querySelectorAll("[data-slot='banner']").forEach((banner) => {
48
- if (!(banner instanceof HTMLElement)) return
49
-
50
- const storageKey = banner.dataset.bannerStorageKey
51
-
52
- if (
53
- storageKey &&
54
- sessionStorage.getItem(getStorageToken(storageKey)) === "hidden"
55
- ) {
56
- banner.hidden = true
57
- }
58
- })
59
- }
60
-
61
- syncBanners()
62
-
63
- document.addEventListener("click", (event) => {
64
- const target = event.target
65
-
66
- if (!(target instanceof Element)) return
67
-
68
- const closeButton = target.closest("[data-slot='banner-close']")
69
-
70
- if (!(closeButton instanceof HTMLElement)) return
71
-
72
- const banner = closeButton.closest("[data-slot='banner']")
38
+ <script>
39
+ const getStorageToken = (key: string) => `banner:${key}`
73
40
 
41
+ const syncBanners = () => {
42
+ document.querySelectorAll("[data-slot='banner']").forEach((banner) => {
74
43
  if (!(banner instanceof HTMLElement)) return
75
-
76
- banner.hidden = true
77
-
78
44
  const storageKey = banner.dataset.bannerStorageKey
79
-
80
- if (storageKey) {
81
- sessionStorage.setItem(getStorageToken(storageKey), "hidden")
45
+ if (
46
+ storageKey &&
47
+ sessionStorage.getItem(getStorageToken(storageKey)) === "hidden"
48
+ ) {
49
+ banner.hidden = true
82
50
  }
83
51
  })
84
52
  }
53
+
54
+ syncBanners()
55
+ document.addEventListener("astro:page-load", syncBanners)
56
+
57
+ document.addEventListener("click", (event) => {
58
+ if (!(event.target instanceof Element)) return
59
+ const closeButton = event.target.closest("[data-slot='banner-close']")
60
+ const banner = closeButton?.closest("[data-slot='banner']")
61
+ if (!(banner instanceof HTMLElement)) return
62
+ banner.hidden = true
63
+ const storageKey = banner.dataset.bannerStorageKey
64
+ if (storageKey)
65
+ sessionStorage.setItem(getStorageToken(storageKey), "hidden")
66
+ })
85
67
  </script>
@@ -30,4 +30,5 @@ const {
30
30
  import { create } from "@data-slot/collapsible"
31
31
 
32
32
  create()
33
+ document.addEventListener("astro:page-load", () => create())
33
34
  </script>
@@ -37,4 +37,5 @@ const {
37
37
  import { create } from "@data-slot/dialog"
38
38
 
39
39
  create()
40
+ document.addEventListener("astro:page-load", () => create())
40
41
  </script>
@@ -68,4 +68,5 @@ const defaultValuesAttr =
68
68
  import { create } from "@data-slot/dropdown-menu"
69
69
 
70
70
  create()
71
+ document.addEventListener("astro:page-load", () => create())
71
72
  </script>
@@ -66,7 +66,11 @@ const {
66
66
  import { getDataBool } from "@data-slot/core"
67
67
  import { createHoverCard } from "@data-slot/hover-card"
68
68
 
69
- document.querySelectorAll('[data-slot="hover-card"]').forEach((root) => {
70
- createHoverCard(root, { open: getDataBool(root, "controlledOpen") })
71
- })
69
+ const initialize = () => {
70
+ document.querySelectorAll('[data-slot="hover-card"]').forEach((root) => {
71
+ createHoverCard(root, { open: getDataBool(root, "controlledOpen") })
72
+ })
73
+ }
74
+ initialize()
75
+ document.addEventListener("astro:page-load", initialize)
72
76
  </script>
@@ -37,51 +37,68 @@ const hrefMap = {
37
37
  linkedin: "linkedin",
38
38
  } as const
39
39
 
40
- const icons = import.meta.glob([
41
- "node_modules/lucide-static/icons/*.svg",
42
- "node_modules/simple-icons/icons/*.svg",
43
- ])
40
+ type Source = "lucide" | "simple"
44
41
 
45
- const foundPath = () => {
46
- let foundPath: string | undefined = undefined
42
+ const icons: Record<Source, Record<string, () => Promise<unknown>>> = {
43
+ lucide: import.meta.glob("/node_modules/lucide-static/icons/*.svg"),
44
+ simple: import.meta.glob("/node_modules/simple-icons/icons/*.svg"),
45
+ }
46
+
47
+ const pathFor = (source: Source, icon: string) =>
48
+ source === "lucide"
49
+ ? `/node_modules/lucide-static/icons/${icon}.svg`
50
+ : `/node_modules/simple-icons/icons/${icon}.svg`
51
+
52
+ // Resolve an icon by explicit name, or derive one from a link href.
53
+ // Names may be prefixed with `lucide:` or `simple:` to pick a set when both
54
+ // sets contain the same name (for example `github` or `figma`).
55
+ const resolve = () => {
56
+ let key = name != null && name !== "" ? String(name) : undefined
57
+ let order: Source[] = ["lucide", "simple"]
47
58
 
48
- // For x.com, use the Simple Icons X instead of Lucide's X icon.
49
- if (name === "x.com") {
50
- foundPath = "/node_modules/simple-icons/icons/x.svg"
51
- } else if (name) {
52
- foundPath = Object.keys(icons).find((key) => key.includes(`/${name}.svg`))
53
- } else if (href) {
54
- const hrefKey = Object.keys(hrefMap).find((key) =>
55
- href.toString().includes(key)
59
+ if (!key && href) {
60
+ const hrefKey = Object.keys(hrefMap).find((candidate) =>
61
+ href.toString().includes(candidate)
56
62
  )
57
- const hrefValue = hrefMap[hrefKey as keyof typeof hrefMap]
58
- foundPath = Object.keys(icons)
59
- .reverse()
60
- .find((key) => key.includes(`/${hrefValue}.svg`))
63
+ if (hrefKey) {
64
+ key = hrefMap[hrefKey as keyof typeof hrefMap]
65
+ order = ["simple", "lucide"]
66
+ }
67
+ }
68
+
69
+ if (!key) return undefined
70
+ if (key === "x.com") key = "simple:x"
71
+
72
+ const [prefix, icon] = key.includes(":") ? key.split(":") : [undefined, key]
73
+ if (prefix === "lucide" || prefix === "simple") order = [prefix]
74
+
75
+ for (const source of order) {
76
+ const path = pathFor(source, icon)
77
+ if (path in icons[source]) return { source, path }
61
78
  }
62
79
 
63
- return foundPath
80
+ return undefined
64
81
  }
65
82
 
66
- const foundModule = foundPath() && icons[foundPath() as keyof typeof icons]
67
- const module = foundModule && ((await foundModule()) as any)
83
+ const resolved = resolve()
84
+ const module = resolved
85
+ ? ((await icons[resolved.source][resolved.path]()) as { default?: any })
86
+ : undefined
68
87
  const Comp = module?.default
88
+
89
+ const isLabelled =
90
+ "aria-label" in props || "aria-labelledby" in props || "role" in props
69
91
  ---
70
92
 
71
93
  {
72
- Comp && foundPath()?.includes("simple-icons") && (
94
+ Comp && resolved && (
73
95
  <Comp
74
96
  height={24}
75
97
  width={24}
76
- fill="currentColor"
98
+ fill={resolved.source === "simple" ? "currentColor" : "none"}
77
99
  class="size-[1em] text-base"
100
+ aria-hidden={isLabelled ? undefined : "true"}
78
101
  {...props}
79
102
  />
80
103
  )
81
104
  }
82
-
83
- {
84
- Comp && foundPath()?.includes("lucide-static") && (
85
- <Comp height={24} width={24} class="size-[1em] text-base" {...props} />
86
- )
87
- }
@@ -60,4 +60,5 @@ const {
60
60
  import { create } from "@data-slot/navigation-menu"
61
61
 
62
62
  create()
63
+ document.addEventListener("astro:page-load", () => create())
63
64
  </script>
@@ -56,4 +56,5 @@ const {
56
56
  import { create } from "@data-slot/popover"
57
57
 
58
58
  create()
59
+ document.addEventListener("astro:page-load", () => create())
59
60
  </script>
@@ -39,4 +39,5 @@ const {
39
39
  import { create } from "@data-slot/radio-group"
40
40
 
41
41
  create()
42
+ document.addEventListener("astro:page-load", () => create())
42
43
  </script>
@@ -1,2 +1,4 @@
1
1
  export { default as Section } from "./section.astro"
2
2
  export { default as SectionContainer } from "./section-container.astro"
3
+ export { default as SectionDescription } from "./section-description.astro"
4
+ export { default as SectionTitle } from "./section-title.astro"
@@ -9,6 +9,7 @@ const { class: className, ...props } = Astro.props
9
9
  ---
10
10
 
11
11
  <div
12
+ data-slot="section-container"
12
13
  class={cn(
13
14
  "relative mx-auto flex w-full max-w-7xl flex-col gap-8 px-4",
14
15
  className
@@ -0,0 +1,20 @@
1
+ ---
2
+ import type { HTMLAttributes } from "astro/types"
3
+
4
+ import { cn } from "@/lib/utils"
5
+
6
+ type Props = HTMLAttributes<"p">
7
+
8
+ const { class: className, ...props } = Astro.props
9
+ ---
10
+
11
+ <p
12
+ data-slot="section-description"
13
+ class={cn(
14
+ "text-muted-foreground text-lg leading-relaxed text-balance",
15
+ className
16
+ )}
17
+ {...props}
18
+ >
19
+ <slot />
20
+ </p>
@@ -0,0 +1,20 @@
1
+ ---
2
+ import type { HTMLTag, Polymorphic } from "astro/types"
3
+
4
+ import { cn } from "@/lib/utils"
5
+
6
+ type Props<Tag extends HTMLTag = "h2"> = Polymorphic<{ as: Tag }>
7
+
8
+ const { as: Tag = "h2", class: className, ...props } = Astro.props
9
+ ---
10
+
11
+ <Tag
12
+ data-slot="section-title"
13
+ class={cn(
14
+ "text-foreground text-3xl font-semibold tracking-tight text-balance sm:text-4xl",
15
+ className
16
+ )}
17
+ {...props}
18
+ >
19
+ <slot />
20
+ </Tag>
@@ -1,9 +1,11 @@
1
1
  ---
2
- import type { ComponentProps } from "astro/types"
2
+ import type { HTMLTag, Polymorphic } from "astro/types"
3
3
 
4
4
  import { Button } from "@/components/ui/button"
5
+ import type { ButtonVariantProps } from "@/components/ui/button/button-variants"
5
6
 
6
- type Props = ComponentProps<typeof Button>
7
+ type Props<Tag extends HTMLTag = "button"> = Polymorphic<{ as: Tag }> &
8
+ ButtonVariantProps
7
9
 
8
10
  const { ...props } = Astro.props
9
11
  ---
@@ -34,4 +34,5 @@ const {
34
34
  import { create } from "@data-slot/dialog"
35
35
 
36
36
  create()
37
+ document.addEventListener("astro:page-load", () => create())
37
38
  </script>
@@ -83,4 +83,5 @@ const thumbCount = String(serializedDefaultValue ?? "").includes(",") ? 2 : 1
83
83
  import { create } from "@data-slot/slider"
84
84
 
85
85
  create()
86
+ document.addEventListener("astro:page-load", () => create())
86
87
  </script>
@@ -70,4 +70,5 @@ const switchSizeStyle = {
70
70
  import { create } from "@data-slot/switch"
71
71
 
72
72
  create()
73
+ document.addEventListener("astro:page-load", () => create())
73
74
  </script>
@@ -35,4 +35,5 @@ const {
35
35
  import { create } from "@data-slot/tabs"
36
36
 
37
37
  create()
38
+ document.addEventListener("astro:page-load", () => create())
38
39
  </script>
@@ -39,4 +39,5 @@ const {
39
39
  import { create } from "@data-slot/toggle"
40
40
 
41
41
  create()
42
+ document.addEventListener("astro:page-load", () => create())
42
43
  </script>
@@ -52,4 +52,5 @@ const {
52
52
  import { create } from "@data-slot/tooltip"
53
53
 
54
54
  create()
55
+ document.addEventListener("astro:page-load", () => create())
55
56
  </script>
@@ -126,7 +126,7 @@ const {
126
126
  [data-slot="typography"]
127
127
  > :is(p, blockquote, ul, ol, dl, table)
128
128
  a:not([data-slot]) {
129
- @apply text-primary font-medium underline underline-offset-4;
129
+ @apply text-foreground font-medium underline underline-offset-4;
130
130
  }
131
131
 
132
132
  [data-slot="typography"] > blockquote {
package/src/lib/pages.ts CHANGED
@@ -83,3 +83,15 @@ export const getPageBreadcrumbItems = async (
83
83
  }),
84
84
  ]
85
85
  }
86
+
87
+ export const getMarkdownHref = (href: string) =>
88
+ href === "/" ? "/index.md" : `${href.replace(/\/$/, "")}.md`
89
+
90
+ export const getInstallCommand = (source: string) => {
91
+ const names = [
92
+ ...source.matchAll(/props=\{\{\s*name:\s*['"]([^'"]+)['"]/g),
93
+ ].map((match) => `@fulldev/${match[1]}`)
94
+ return names.length
95
+ ? `npx shadcn@latest add ${[...new Set(names)].join(" ")}`
96
+ : undefined
97
+ }
@@ -68,7 +68,7 @@
68
68
  --popover: oklch(0.269 0 0);
69
69
  --popover-foreground: oklch(0.985 0 0);
70
70
  --primary: oklch(0.686 0.2105 41.139);
71
- --primary-foreground: oklch(1 0 0);
71
+ --primary-foreground: oklch(0.145 0 0);
72
72
  --secondary: oklch(0.269 0 0);
73
73
  --secondary-foreground: oklch(0.985 0 0);
74
74
  --muted: oklch(0.269 0 0);
@@ -88,7 +88,7 @@
88
88
  --sidebar: oklch(0.205 0 0);
89
89
  --sidebar-foreground: oklch(0.985 0 0);
90
90
  --sidebar-primary: oklch(0.686 0.2105 41.139);
91
- --sidebar-primary-foreground: oklch(1 0 0);
91
+ --sidebar-primary-foreground: oklch(0.145 0 0);
92
92
  --sidebar-accent: oklch(0.269 0 0);
93
93
  --sidebar-accent-foreground: oklch(0.985 0 0);
94
94
  --sidebar-border: oklch(0.275 0 0);