fulldev-ui 0.9.3 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +100 -16
  3. package/package.json +3 -2
  4. package/public/r/accordion.json +3 -5
  5. package/public/r/alert-dialog.json +1 -1
  6. package/public/r/alert.json +0 -5
  7. package/public/r/article-1.json +1 -1
  8. package/public/r/article-2.json +1 -1
  9. package/public/r/articles-1.json +1 -1
  10. package/public/r/articles-2.json +1 -1
  11. package/public/r/articles-3.json +1 -1
  12. package/public/r/avatar.json +1 -16
  13. package/public/r/badge.json +1 -1
  14. package/public/r/banner-1.json +5 -3
  15. package/public/r/banner-2.json +1 -1
  16. package/public/r/banner.json +5 -3
  17. package/public/r/blocks-1.json +6 -3
  18. package/public/r/breadcrumb.json +4 -4
  19. package/public/r/button.json +1 -1
  20. package/public/r/card.json +4 -4
  21. package/public/r/carousel.json +5 -5
  22. package/public/r/checkbox.json +1 -1
  23. package/public/r/combobox.json +8 -8
  24. package/public/r/command.json +6 -6
  25. package/public/r/components.json +1 -7
  26. package/public/r/contact-1.json +4 -2
  27. package/public/r/contact-2.json +4 -2
  28. package/public/r/contact-3.json +11 -3
  29. package/public/r/content-1.json +11 -3
  30. package/public/r/content-2.json +11 -3
  31. package/public/r/content-3.json +7 -1
  32. package/public/r/content-4.json +11 -3
  33. package/public/r/cta-2.json +7 -1
  34. package/public/r/cta-4.json +7 -1
  35. package/public/r/cta-5.json +11 -3
  36. package/public/r/cta-6.json +7 -1
  37. package/public/r/dialog.json +6 -6
  38. package/public/r/doc-1.json +6 -3
  39. package/public/r/dropdown-menu.json +9 -11
  40. package/public/r/features-1.json +5 -3
  41. package/public/r/features-2.json +5 -3
  42. package/public/r/features-4.json +5 -3
  43. package/public/r/features-5.json +4 -2
  44. package/public/r/field.json +2 -7
  45. package/public/r/footer-1.json +5 -3
  46. package/public/r/footer-2.json +5 -3
  47. package/public/r/footer-3.json +5 -3
  48. package/public/r/header-1.json +1 -1
  49. package/public/r/header.json +3 -0
  50. package/public/r/hero-13.json +1 -1
  51. package/public/r/hero-4.json +5 -3
  52. package/public/r/hero-5.json +5 -3
  53. package/public/r/hero-6.json +5 -3
  54. package/public/r/hero-7.json +5 -3
  55. package/public/r/hero-8.json +1 -1
  56. package/public/r/hero-9.json +5 -3
  57. package/public/r/hover-card.json +2 -2
  58. package/public/r/icon.json +1 -1
  59. package/public/r/input-group.json +1 -1
  60. package/public/r/item.json +2 -20
  61. package/public/r/kbd.json +2 -2
  62. package/public/r/layout.json +4 -7
  63. package/public/r/links-2.json +5 -3
  64. package/public/r/marquee.json +1 -1
  65. package/public/r/native-select.json +3 -3
  66. package/public/r/navigation-menu.json +6 -8
  67. package/public/r/page.json +17 -0
  68. package/public/r/popover.json +1 -1
  69. package/public/r/pricing-1.json +5 -3
  70. package/public/r/pricing-2.json +5 -3
  71. package/public/r/pricing-3.json +5 -3
  72. package/public/r/products-1.json +1 -1
  73. package/public/r/products-4.json +1 -1
  74. package/public/r/products-5.json +1 -1
  75. package/public/r/radio-group.json +1 -1
  76. package/public/r/rating.json +3 -3
  77. package/public/r/registry.json +186 -450
  78. package/public/r/reviews-1.json +5 -3
  79. package/public/r/reviews-2.json +5 -3
  80. package/public/r/reviews-3.json +5 -3
  81. package/public/r/reviews-4.json +1 -1
  82. package/public/r/reviews-5.json +5 -3
  83. package/public/r/select.json +6 -8
  84. package/public/r/services-1.json +11 -3
  85. package/public/r/services-2.json +7 -1
  86. package/public/r/services-3.json +7 -1
  87. package/public/r/services-4.json +11 -3
  88. package/public/r/services-5.json +5 -3
  89. package/public/r/services-6.json +11 -3
  90. package/public/r/services-7.json +11 -3
  91. package/public/r/sheet.json +6 -3
  92. package/public/r/sidebar-1.json +4 -2
  93. package/public/r/sidebar.json +10 -7
  94. package/public/r/slider.json +1 -1
  95. package/public/r/spinner.json +3 -3
  96. package/public/r/switch.json +1 -1
  97. package/public/r/theme-toggle.json +5 -3
  98. package/public/r/tooltip.json +1 -1
  99. package/public/r/typography.json +16 -16
  100. package/public/r/video.json +1 -1
  101. package/registry.json +186 -450
  102. package/src/components/blocks/article-1.astro +1 -1
  103. package/src/components/blocks/article-2.astro +1 -1
  104. package/src/components/blocks/articles-1.astro +1 -1
  105. package/src/components/blocks/articles-2.astro +2 -2
  106. package/src/components/blocks/articles-3.astro +1 -1
  107. package/src/components/blocks/banner-1.astro +3 -5
  108. package/src/components/blocks/banner-2.astro +1 -1
  109. package/src/components/blocks/blocks-1.astro +25 -37
  110. package/src/components/blocks/contact-3.astro +4 -3
  111. package/src/components/blocks/content-1.astro +5 -4
  112. package/src/components/blocks/content-2.astro +6 -5
  113. package/src/components/blocks/content-3.astro +9 -2
  114. package/src/components/blocks/content-4.astro +6 -5
  115. package/src/components/blocks/cta-2.astro +4 -3
  116. package/src/components/blocks/cta-4.astro +3 -2
  117. package/src/components/blocks/cta-5.astro +6 -5
  118. package/src/components/blocks/cta-6.astro +4 -3
  119. package/src/components/blocks/doc-1.astro +28 -56
  120. package/src/components/blocks/features-1.astro +3 -1
  121. package/src/components/blocks/features-2.astro +4 -2
  122. package/src/components/blocks/features-4.astro +3 -1
  123. package/src/components/blocks/footer-1.astro +26 -12
  124. package/src/components/blocks/footer-2.astro +24 -12
  125. package/src/components/blocks/footer-3.astro +26 -12
  126. package/src/components/blocks/header-1.astro +2 -3
  127. package/src/components/blocks/hero-13.astro +1 -1
  128. package/src/components/blocks/hero-4.astro +2 -2
  129. package/src/components/blocks/hero-5.astro +3 -3
  130. package/src/components/blocks/hero-6.astro +3 -3
  131. package/src/components/blocks/hero-7.astro +3 -3
  132. package/src/components/blocks/hero-8.astro +1 -1
  133. package/src/components/blocks/hero-9.astro +2 -2
  134. package/src/components/blocks/links-2.astro +3 -5
  135. package/src/components/blocks/pricing-1.astro +3 -2
  136. package/src/components/blocks/pricing-2.astro +3 -2
  137. package/src/components/blocks/pricing-3.astro +3 -2
  138. package/src/components/blocks/products-1.astro +1 -1
  139. package/src/components/blocks/products-4.astro +2 -2
  140. package/src/components/blocks/products-5.astro +4 -4
  141. package/src/components/blocks/reviews-1.astro +2 -2
  142. package/src/components/blocks/reviews-2.astro +2 -2
  143. package/src/components/blocks/reviews-3.astro +2 -2
  144. package/src/components/blocks/reviews-4.astro +4 -4
  145. package/src/components/blocks/reviews-5.astro +16 -25
  146. package/src/components/blocks/services-1.astro +7 -9
  147. package/src/components/blocks/services-2.astro +5 -4
  148. package/src/components/blocks/services-3.astro +6 -5
  149. package/src/components/blocks/services-4.astro +7 -9
  150. package/src/components/blocks/services-5.astro +3 -4
  151. package/src/components/blocks/services-6.astro +7 -6
  152. package/src/components/blocks/services-7.astro +7 -9
  153. package/src/components/blocks/sidebar-1.astro +42 -97
  154. package/src/components/ui/accordion/accordion-trigger.astro +7 -8
  155. package/src/components/ui/alert-dialog/alert-dialog.astro +23 -3
  156. package/src/components/ui/avatar/avatar.astro +1 -1
  157. package/src/components/ui/badge/badge.astro +1 -0
  158. package/src/components/ui/banner/banner-container.astro +3 -3
  159. package/src/components/ui/breadcrumb/breadcrumb-ellipsis.astro +2 -2
  160. package/src/components/ui/breadcrumb/breadcrumb-separator.astro +2 -2
  161. package/src/components/ui/button/button-variants.ts +8 -7
  162. package/src/components/ui/card/card-content.astro +1 -1
  163. package/src/components/ui/card/card-footer.astro +1 -1
  164. package/src/components/ui/card/card-header.astro +1 -1
  165. package/src/components/ui/card/card.astro +1 -1
  166. package/src/components/ui/carousel/carousel-next.astro +3 -3
  167. package/src/components/ui/carousel/carousel-previous.astro +3 -3
  168. package/src/components/ui/checkbox/checkbox.astro +1 -1
  169. package/src/components/ui/combobox/combobox-input.astro +2 -2
  170. package/src/components/ui/combobox/combobox-item.astro +4 -4
  171. package/src/components/ui/combobox/combobox-list.astro +1 -1
  172. package/src/components/ui/combobox/combobox-trigger.astro +2 -5
  173. package/src/components/ui/combobox/combobox.astro +3 -0
  174. package/src/components/ui/command/command-dialog.astro +10 -10
  175. package/src/components/ui/command/command-input.astro +2 -2
  176. package/src/components/ui/command/command-item.astro +4 -5
  177. package/src/components/ui/dialog/dialog-close.astro +2 -2
  178. package/src/components/ui/dialog/dialog-content.astro +2 -2
  179. package/src/components/ui/dialog/dialog.astro +26 -3
  180. package/src/components/ui/dropdown-menu/dropdown-menu-checkbox-item.astro +4 -5
  181. package/src/components/ui/dropdown-menu/dropdown-menu-content.astro +4 -4
  182. package/src/components/ui/dropdown-menu/dropdown-menu-item.astro +1 -1
  183. package/src/components/ui/dropdown-menu/dropdown-menu-label.astro +1 -1
  184. package/src/components/ui/dropdown-menu/dropdown-menu-radio-item.astro +4 -5
  185. package/src/components/ui/dropdown-menu/dropdown-menu-shortcut.astro +1 -1
  186. package/src/components/ui/dropdown-menu/dropdown-menu.astro +3 -0
  187. package/src/components/ui/field/field-label.astro +1 -1
  188. package/src/components/ui/field/field-title.astro +1 -1
  189. package/src/components/ui/hover-card/hover-card-content.astro +4 -4
  190. package/src/components/ui/hover-card/hover-card.astro +2 -2
  191. package/src/components/ui/icon/icon.astro +8 -17
  192. package/src/components/ui/input-group/input-group-button.astro +0 -1
  193. package/src/components/ui/item/item-media.astro +1 -1
  194. package/src/components/ui/item/item.astro +0 -18
  195. package/src/components/ui/kbd/kbd-group.astro +1 -1
  196. package/src/components/ui/kbd/kbd.astro +1 -1
  197. package/src/components/ui/layout/layout-body.astro +1 -1
  198. package/src/components/ui/layout/layout-head.astro +3 -2
  199. package/src/components/ui/layout/layout-main.astro +1 -1
  200. package/src/components/ui/layout/layout.astro +4 -0
  201. package/src/components/ui/marquee/marquee.astro +50 -69
  202. package/src/components/ui/native-select/native-select.astro +2 -3
  203. package/src/components/ui/navigation-menu/navigation-menu-content.astro +1 -1
  204. package/src/components/ui/navigation-menu/navigation-menu-list.astro +1 -1
  205. package/src/components/ui/navigation-menu/navigation-menu-trigger.astro +2 -3
  206. package/src/components/ui/navigation-menu/navigation-menu.astro +1 -1
  207. package/src/components/ui/popover/popover-content.astro +1 -1
  208. package/src/components/ui/radio-group/radio-group-item.astro +3 -3
  209. package/src/components/ui/rating/rating.astro +3 -3
  210. package/src/components/ui/select/select-content.astro +1 -1
  211. package/src/components/ui/select/select-item.astro +4 -4
  212. package/src/components/ui/select/select-trigger.astro +3 -6
  213. package/src/components/ui/select/select.astro +6 -0
  214. package/src/components/ui/sheet/sheet-content.astro +4 -5
  215. package/src/components/ui/sidebar/sidebar-menu-button.astro +13 -10
  216. package/src/components/ui/sidebar/sidebar-menu-sub-button.astro +10 -8
  217. package/src/components/ui/sidebar/sidebar-provider.astro +1 -13
  218. package/src/components/ui/sidebar/sidebar-rail.astro +1 -1
  219. package/src/components/ui/sidebar/sidebar-trigger.astro +3 -3
  220. package/src/components/ui/sidebar/sidebar.astro +1 -1
  221. package/src/components/ui/slider/slider.astro +6 -4
  222. package/src/components/ui/spinner/spinner.astro +4 -4
  223. package/src/components/ui/switch/switch.astro +1 -1
  224. package/src/components/ui/theme-toggle/theme-toggle.astro +4 -3
  225. package/src/components/ui/tooltip/tooltip-content.astro +1 -1
  226. package/src/components/ui/typography/typography-a.astro +19 -4
  227. package/src/components/ui/typography/typography-blockquote.astro +26 -6
  228. package/src/components/ui/typography/typography-h1.astro +7 -9
  229. package/src/components/ui/typography/typography-h2.astro +12 -9
  230. package/src/components/ui/typography/typography-h3.astro +7 -9
  231. package/src/components/ui/typography/typography-h4.astro +7 -9
  232. package/src/components/ui/typography/typography-inline-code.astro +28 -12
  233. package/src/components/ui/typography/typography-lead.astro +29 -4
  234. package/src/components/ui/typography/typography-list-item.astro +25 -9
  235. package/src/components/ui/typography/typography-list.astro +29 -11
  236. package/src/components/ui/typography/typography-p.astro +26 -6
  237. package/src/components/ui/typography/typography-table-cell.astro +32 -13
  238. package/src/components/ui/typography/typography-table-head.astro +27 -13
  239. package/src/components/ui/typography/typography-table-row.astro +23 -13
  240. package/src/components/ui/typography/typography-table.astro +29 -20
  241. package/src/components/ui/typography/typography.astro +172 -46
  242. package/src/components/ui/video/video.astro +11 -27
  243. package/src/styles/global.css +2 -15
  244. package/public/r/beta-repo-setup.json +0 -125
  245. package/public/r/blocks.json +0 -91
  246. package/public/r/content-5.json +0 -17
  247. package/public/r/content-6.json +0 -17
  248. package/public/r/gradient.json +0 -17
  249. package/public/r/init.json +0 -23
  250. package/public/r/tile.json +0 -27
  251. package/src/components/blocks/content-5.astro +0 -115
  252. package/src/components/blocks/content-6.astro +0 -91
  253. package/src/components/ui/gradient/gradient.astro +0 -45
  254. package/src/components/ui/gradient/index.ts +0 -1
  255. package/src/components/ui/tile/index.ts +0 -3
  256. package/src/components/ui/tile/tile-content.astro +0 -17
  257. package/src/components/ui/tile/tile-group.astro +0 -76
  258. package/src/components/ui/tile/tile.astro +0 -46
@@ -1,4 +1,7 @@
1
1
  ---
2
+ import ChevronDownIcon from "@lucide/astro/icons/chevron-down"
3
+ import SearchIcon from "@lucide/astro/icons/search"
4
+
2
5
  import { cn } from "@/lib/utils"
3
6
  import {
4
7
  Breadcrumb,
@@ -29,11 +32,6 @@ import {
29
32
  } from "@/components/ui/dropdown-menu"
30
33
  import { Header, HeaderContainer, HeaderGroup } from "@/components/ui/header"
31
34
  import { Icon } from "@/components/ui/icon"
32
- import {
33
- InputGroup,
34
- InputGroupAddon,
35
- InputGroupInput,
36
- } from "@/components/ui/input-group"
37
35
  import { Kbd } from "@/components/ui/kbd"
38
36
  import { LogoImage, LogoText } from "@/components/ui/logo"
39
37
  import { Separator } from "@/components/ui/separator"
@@ -124,7 +122,18 @@ const searchGroups = search.items.reduce<
124
122
  return groups
125
123
  }, [])
126
124
 
127
- const githubStars = "560+"
125
+ let githubStars = "Stars"
126
+
127
+ try {
128
+ const response = await fetch(`https://api.github.com/repos/${githubRepo}`)
129
+ const data = await response.json()
130
+
131
+ if (response.ok && typeof data.stargazers_count === "number") {
132
+ githubStars = new Intl.NumberFormat().format(data.stargazers_count)
133
+ }
134
+ } catch {
135
+ // Keep the fallback label when GitHub is unavailable.
136
+ }
128
137
  ---
129
138
 
130
139
  <SidebarProvider>
@@ -141,28 +150,19 @@ const githubStars = "560+"
141
150
  </SidebarMenuButton>
142
151
  <Dialog class="w-full" data-search-dialog>
143
152
  <DialogTrigger
144
- as="div"
145
- role="button"
146
- tabindex="0"
147
- class="h-auto w-full cursor-pointer border-0 bg-transparent p-0 shadow-none hover:bg-transparent"
153
+ variant="outline"
154
+ size="sm"
155
+ class="w-full justify-start shadow-none"
148
156
  aria-keyshortcuts="Meta+K Control+K"
149
157
  >
150
- <InputGroup class="h-8 shadow-none">
151
- <InputGroupInput
152
- placeholder={search.label}
153
- readonly
154
- tabindex="-1"
155
- aria-label={search.label}
156
- class="cursor-pointer"
157
- />
158
- <InputGroupAddon>
159
- <Icon name="search" />
160
- </InputGroupAddon>
161
- <InputGroupAddon align="inline-end">
162
- <Kbd data-search-modifier>⌘</Kbd>
163
- <Kbd>K</Kbd>
164
- </InputGroupAddon>
165
- </InputGroup>
158
+ <SearchIcon data-icon="inline-start" />
159
+ <span class="truncate">{search.label}</span>
160
+ <Kbd
161
+ class="bg-background/80 ml-auto h-4 min-w-4 translate-y-0 px-1 text-[10px]"
162
+ data-search-shortcut
163
+ >
164
+ ⌘ + K
165
+ </Kbd>
166
166
  </DialogTrigger>
167
167
 
168
168
  <CommandDialog title={search.label} description={search.label}>
@@ -179,9 +179,14 @@ const githubStars = "560+"
179
179
  {group.items.map((item) => (
180
180
  <CommandItem
181
181
  href={item.href}
182
- value={item.path}
182
+ value={`${item.group} ${item.label}`}
183
183
  label={item.label}
184
- keywords={[item.title, item.path]}
184
+ keywords={[
185
+ item.group,
186
+ item.title,
187
+ item.path,
188
+ item.description,
189
+ ]}
185
190
  >
186
191
  {item.label}
187
192
  <CommandShortcut>{item.href}</CommandShortcut>
@@ -196,7 +201,7 @@ const githubStars = "560+"
196
201
  </Dialog>
197
202
  </SidebarHeader>
198
203
  <SidebarContent
199
- class="mask-[linear-gradient(to_bottom,transparent,black_1rem,black_calc(100%-1rem),transparent)] [-webkit-mask-image:linear-gradient(to_bottom,transparent,black_1rem,black_calc(100%-1rem),transparent)] group-data-[collapsible=icon]:mask-none group-data-[collapsible=icon]:[-webkit-mask-image:none]"
204
+ class="[mask-image:linear-gradient(to_bottom,transparent,black_1rem,black_calc(100%_-_1rem),transparent)] [-webkit-mask-image:linear-gradient(to_bottom,transparent,black_1rem,black_calc(100%_-_1rem),transparent)] group-data-[collapsible=icon]:[mask-image:none] group-data-[collapsible=icon]:[-webkit-mask-image:none]"
200
205
  >
201
206
  {
202
207
  navigation.map((group) => (
@@ -222,61 +227,10 @@ const githubStars = "560+"
222
227
  <SidebarInset>
223
228
  <Header class="h-16">
224
229
  <HeaderContainer class="max-w-none justify-between">
225
- <HeaderGroup class="flex-1 md:flex-none">
230
+ <HeaderGroup>
226
231
  <SidebarTrigger />
227
232
  <Separator orientation="vertical" class="my-auto mr-2 h-4" />
228
- <Dialog class="block min-w-0 flex-1 md:hidden" data-search-dialog>
229
- <DialogTrigger
230
- as="div"
231
- role="button"
232
- tabindex="0"
233
- class="h-auto w-full cursor-pointer border-0 bg-transparent p-0 shadow-none hover:bg-transparent"
234
- aria-keyshortcuts="Meta+K Control+K"
235
- >
236
- <InputGroup class="h-8 shadow-none">
237
- <InputGroupInput
238
- placeholder={search.label}
239
- readonly
240
- tabindex="-1"
241
- aria-label={search.label}
242
- class="cursor-pointer"
243
- />
244
- <InputGroupAddon>
245
- <Icon name="search" />
246
- </InputGroupAddon>
247
- </InputGroup>
248
- </DialogTrigger>
249
-
250
- <CommandDialog title={search.label} description={search.label}>
251
- <Command
252
- class="[&_[data-slot=command-item][data-selected]]:bg-accent [&_[data-slot=command-item][data-selected]]:text-accent-foreground"
253
- >
254
- <CommandInput placeholder={search.label} />
255
- <CommandList>
256
- <CommandEmpty>{search.empty}</CommandEmpty>
257
-
258
- {
259
- searchGroups.map((group) => (
260
- <CommandGroup heading={group.label}>
261
- {group.items.map((item) => (
262
- <CommandItem
263
- href={item.href}
264
- value={item.path}
265
- label={item.label}
266
- keywords={[item.title, item.path]}
267
- >
268
- {item.label}
269
- <CommandShortcut>{item.href}</CommandShortcut>
270
- </CommandItem>
271
- ))}
272
- </CommandGroup>
273
- ))
274
- }
275
- </CommandList>
276
- </Command>
277
- </CommandDialog>
278
- </Dialog>
279
- <Breadcrumb class="hidden md:block">
233
+ <Breadcrumb>
280
234
  <BreadcrumbList>
281
235
  {
282
236
  breadcrumb.items.map((item, index) => {
@@ -299,7 +253,6 @@ const githubStars = "560+"
299
253
  {hasMenu ? (
300
254
  <DropdownMenu>
301
255
  <DropdownMenuTrigger
302
- aria-label={`${item.label} pages`}
303
256
  aria-current={isLast ? "page" : undefined}
304
257
  class={cn(
305
258
  "hover:text-foreground inline-flex items-center gap-1 transition-colors",
@@ -307,8 +260,7 @@ const githubStars = "560+"
307
260
  )}
308
261
  >
309
262
  {item.label}
310
- <Icon
311
- name="chevron-down"
263
+ <ChevronDownIcon
312
264
  class="size-3.5 opacity-70"
313
265
  aria-hidden="true"
314
266
  />
@@ -350,10 +302,7 @@ const githubStars = "560+"
350
302
  <BreadcrumbSeparator>/</BreadcrumbSeparator>
351
303
  <BreadcrumbItem>
352
304
  <DropdownMenu>
353
- <DropdownMenuTrigger
354
- aria-label="Open page menu"
355
- class="hover:text-foreground inline-flex items-center leading-none transition-colors"
356
- >
305
+ <DropdownMenuTrigger class="hover:text-foreground inline-flex items-center leading-none transition-colors">
357
306
  <BreadcrumbEllipsis />
358
307
  </DropdownMenuTrigger>
359
308
  <DropdownMenuContent align="start">
@@ -384,7 +333,7 @@ const githubStars = "560+"
384
333
  variant="ghost"
385
334
  target="_blank"
386
335
  rel="noreferrer"
387
- aria-label={`View ${githubRepo} on GitHub, ${githubStars}`}
336
+ aria-label={`View ${githubRepo} on GitHub`}
388
337
  >
389
338
  <Icon name="github" />
390
339
  <span>{githubStars}</span>
@@ -402,19 +351,15 @@ const githubStars = "560+"
402
351
  navigator.platform || navigator.userAgent
403
352
  )
404
353
 
405
- document.querySelectorAll("[data-search-modifier]").forEach((shortcut) => {
406
- shortcut.textContent = isMac ? "⌘" : "Ctrl"
354
+ document.querySelectorAll("[data-search-shortcut]").forEach((shortcut) => {
355
+ shortcut.textContent = isMac ? "⌘ + K" : "Ctrl + K"
407
356
  })
408
357
 
409
358
  document.addEventListener("keydown", (event) => {
410
359
  if (event.key.toLowerCase() !== "k") return
411
360
  if (event.shiftKey || event.altKey) return
412
361
 
413
- const dialogs = Array.from(
414
- document.querySelectorAll("[data-search-dialog]")
415
- )
416
- const dialog =
417
- dialogs.find((dialog) => dialog.getClientRects().length > 0) ?? dialogs[0]
362
+ const dialog = document.querySelector("[data-search-dialog]")
418
363
  const isSearchShortcut = isMac
419
364
  ? event.metaKey && !event.ctrlKey
420
365
  : event.ctrlKey && !event.metaKey
@@ -1,8 +1,9 @@
1
1
  ---
2
2
  import type { HTMLAttributes } from "astro/types"
3
+ import ChevronDownIcon from "@lucide/astro/icons/chevron-down"
4
+ import ChevronUpIcon from "@lucide/astro/icons/chevron-up"
3
5
 
4
6
  import { cn } from "@/lib/utils"
5
- import { Icon } from "@/components/ui/icon"
6
7
 
7
8
  type Props = HTMLAttributes<"button">
8
9
 
@@ -13,22 +14,20 @@ const { class: className, type = "button", ...props } = Astro.props
13
14
  data-slot="accordion-trigger"
14
15
  type={type}
15
16
  class={cn(
16
- "group/accordion-trigger focus-visible:border-ring focus-visible:ring-ring/50 relative flex w-full flex-1 items-center justify-between gap-4 rounded-md border border-transparent bg-transparent py-4 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:ring-3 aria-disabled:pointer-events-none aria-disabled:opacity-50",
17
+ "group/accordion-trigger focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:after:border-ring **:data-[slot=accordion-trigger-icon]:text-muted-foreground relative flex w-full flex-1 items-start justify-between rounded-md border border-transparent bg-transparent py-4 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:ring-3 aria-disabled:pointer-events-none aria-disabled:opacity-50 **:data-[slot=accordion-trigger-icon]:ml-auto **:data-[slot=accordion-trigger-icon]:size-4",
17
18
  className
18
19
  )}
19
20
  {...props}
20
21
  >
21
22
  <slot />
22
- <Icon
23
- name="chevron-down"
23
+ <ChevronDownIcon
24
24
  data-slot="accordion-trigger-icon"
25
25
  aria-hidden="true"
26
- class="text-muted-foreground pointer-events-none ml-auto size-4 shrink-0 group-aria-expanded/accordion-trigger:hidden"
26
+ class="pointer-events-none shrink-0 group-aria-expanded/accordion-trigger:hidden"
27
27
  />
28
- <Icon
29
- name="chevron-up"
28
+ <ChevronUpIcon
30
29
  data-slot="accordion-trigger-icon"
31
30
  aria-hidden="true"
32
- class="text-muted-foreground pointer-events-none ml-auto hidden size-4 shrink-0 group-aria-expanded/accordion-trigger:inline"
31
+ class="pointer-events-none hidden shrink-0 group-aria-expanded/accordion-trigger:inline"
33
32
  />
34
33
  </button>
@@ -1,12 +1,32 @@
1
1
  ---
2
2
  import type { HTMLAttributes } from "astro/types"
3
3
 
4
- type Props = HTMLAttributes<"div">
4
+ type Props = HTMLAttributes<"div"> & {
5
+ defaultOpen?: boolean
6
+ closeOnClickOutside?: boolean
7
+ closeOnEscape?: boolean
8
+ lockScroll?: boolean
9
+ }
5
10
 
6
- const { class: className, ...props } = Astro.props
11
+ const {
12
+ class: className,
13
+ defaultOpen,
14
+ closeOnClickOutside,
15
+ closeOnEscape,
16
+ lockScroll,
17
+ ...props
18
+ } = Astro.props
7
19
  ---
8
20
 
9
- <div data-slot="alert-dialog" class={className} {...props}>
21
+ <div
22
+ data-slot="alert-dialog"
23
+ data-default-open={defaultOpen}
24
+ data-close-on-click-outside={closeOnClickOutside}
25
+ data-close-on-escape={closeOnEscape}
26
+ data-lock-scroll={lockScroll}
27
+ class={className}
28
+ {...props}
29
+ >
10
30
  <slot />
11
31
  </div>
12
32
 
@@ -14,7 +14,7 @@ const { class: className, size = "default", ...props } = Astro.props
14
14
  data-slot="avatar"
15
15
  data-size={size}
16
16
  class={cn(
17
- "after:border-border group/avatar relative flex size-8 shrink-0 overflow-hidden rounded-full select-none after:absolute after:inset-0 after:rounded-full after:border after:mix-blend-darken data-[size=lg]:size-10 data-[size=sm]:size-6 dark:after:mix-blend-lighten",
17
+ "after:border-border group/avatar relative flex size-8 shrink-0 rounded-full select-none after:absolute after:inset-0 after:rounded-full after:border after:mix-blend-darken data-[size=lg]:size-10 data-[size=sm]:size-6 dark:after:mix-blend-lighten",
18
18
  className
19
19
  )}
20
20
  {...props}
@@ -17,6 +17,7 @@ const {
17
17
 
18
18
  <Tag
19
19
  data-slot="badge"
20
+ data-variant={variant}
20
21
  class={cn(badgeVariants({ variant }), className)}
21
22
  {...props}
22
23
  >
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  import type { HTMLAttributes } from "astro/types"
3
+ import XIcon from "@lucide/astro/icons/x"
3
4
 
4
5
  import { cn } from "@/lib/utils"
5
- import { Icon } from "@/components/ui/icon"
6
6
 
7
7
  type Props = HTMLAttributes<"div"> & {
8
8
  showClose?: boolean
@@ -24,11 +24,11 @@ const { class: className, showClose = true, ...props } = Astro.props
24
24
  showClose && (
25
25
  <button
26
26
  type="button"
27
- class="focus-visible:ring-ring/50 absolute top-1/2 right-4 z-20 inline-flex shrink-0 -translate-y-1/2 items-center justify-center rounded-sm text-current/65 transition-colors outline-none hover:text-current focus-visible:text-current focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 in-data-[variant=floating]:right-5"
27
+ class="focus-visible:ring-ring/50 absolute top-1/2 right-4 z-20 inline-flex shrink-0 -translate-y-1/2 items-center justify-center rounded-sm text-current/65 transition-colors outline-none hover:text-current focus-visible:text-current focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 in-[[data-variant=floating]]:right-5"
28
28
  aria-label="Close"
29
29
  data-slot="banner-close"
30
30
  >
31
- <Icon name="x" class="size-4" />
31
+ <XIcon class="size-4" />
32
32
  <span class="sr-only">Close</span>
33
33
  </button>
34
34
  )
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  import type { HTMLAttributes } from "astro/types"
3
+ import Ellipsis from "@lucide/astro/icons/ellipsis"
3
4
 
4
5
  import { cn } from "@/lib/utils"
5
- import { Icon } from "@/components/ui/icon"
6
6
 
7
7
  type Props = HTMLAttributes<"span">
8
8
 
@@ -19,6 +19,6 @@ const { class: className, ...props } = Astro.props
19
19
  )}
20
20
  {...props}
21
21
  >
22
- <Icon name="ellipsis" />
22
+ <Ellipsis />
23
23
  <span class="sr-only">More</span>
24
24
  </span>
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  import type { HTMLAttributes } from "astro/types"
3
+ import ChevronRight from "@lucide/astro/icons/chevron-right"
3
4
 
4
5
  import { cn } from "@/lib/utils"
5
- import { Icon } from "@/components/ui/icon"
6
6
 
7
7
  type Props = HTMLAttributes<"li">
8
8
 
@@ -16,5 +16,5 @@ const { class: className, ...props } = Astro.props
16
16
  class={cn("[&>svg]:size-3.5", className)}
17
17
  {...props}
18
18
  >
19
- {Astro.slots.has("default") ? <slot /> : <Icon name="chevron-right" />}
19
+ {Astro.slots.has("default") ? <slot /> : <ChevronRight />}
20
20
  </li>
@@ -7,20 +7,21 @@ export const buttonVariants = cva(
7
7
  variant: {
8
8
  default: "bg-primary text-primary-foreground hover:bg-primary/80",
9
9
  outline:
10
- "!border-border bg-background hover:bg-muted hover:text-foreground dark:!border-input dark:bg-input/30 dark:hover:bg-input/50 shadow-xs",
10
+ "border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50 shadow-xs",
11
11
  secondary:
12
- "bg-secondary text-secondary-foreground hover:bg-secondary/80",
13
- ghost: "hover:bg-muted hover:text-foreground dark:hover:bg-muted/50",
12
+ "bg-secondary text-secondary-foreground aria-expanded:bg-secondary aria-expanded:text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)]",
13
+ ghost:
14
+ "hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",
14
15
  destructive:
15
16
  "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",
16
17
  link: "text-primary underline-offset-4 hover:underline",
17
18
  },
18
19
  size: {
19
20
  default:
20
- "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",
21
- 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",
22
- 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",
23
- lg: "h-10 gap-1.5 px-2.5 has-[>svg:first-child]:pl-2 has-[>svg:last-child]:pr-2",
21
+ "h-9 gap-1.5 px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
22
+ xs: "h-6 gap-1 rounded-[min(var(--radius-md),8px)] px-2 text-xs in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",
23
+ sm: "h-8 gap-1 rounded-[min(var(--radius-md),10px)] px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5",
24
+ lg: "h-10 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
24
25
  icon: "size-9",
25
26
  "icon-xs":
26
27
  "size-6 rounded-[min(var(--radius-md),8px)] in-data-[slot=button-group]:rounded-md [&_svg:not([class*='size-'])]:size-3",
@@ -10,7 +10,7 @@ const { class: className, ...props } = Astro.props
10
10
 
11
11
  <div
12
12
  data-slot="card-content"
13
- class={cn("px-6 group-data-[size=sm]/card:px-4", className)}
13
+ class={cn("flex flex-col gap-3 px-(--card-spacing)", className)}
14
14
  {...props}
15
15
  >
16
16
  <slot />
@@ -11,7 +11,7 @@ const { class: className, ...props } = Astro.props
11
11
  <div
12
12
  data-slot="card-footer"
13
13
  class={cn(
14
- "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",
14
+ "flex items-center rounded-b-xl px-(--card-spacing) [.border-t]:pt-(--card-spacing)",
15
15
  className
16
16
  )}
17
17
  {...props}
@@ -11,7 +11,7 @@ const { class: className, ...props } = Astro.props
11
11
  <div
12
12
  data-slot="card-header"
13
13
  class={cn(
14
- "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",
14
+ "group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-(--card-spacing) has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-(--card-spacing)",
15
15
  className
16
16
  )}
17
17
  {...props}
@@ -14,7 +14,7 @@ const { class: className, size = "default", ...props } = Astro.props
14
14
  data-slot="card"
15
15
  data-size={size}
16
16
  class={cn(
17
- "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",
17
+ "ring-foreground/10 bg-card text-card-foreground group/card flex flex-col gap-(--card-spacing) overflow-hidden rounded-xl py-(--card-spacing) text-sm shadow-xs ring-1 [--card-spacing:--spacing(6)] has-[>img:first-child]:pt-0 data-[size=sm]:[--card-spacing:--spacing(4)] *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl",
18
18
  className
19
19
  )}
20
20
  {...props}
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  import type { HTMLAttributes } from "astro/types"
3
+ import ChevronRightIcon from "@lucide/astro/icons/chevron-right"
3
4
 
4
5
  import { cn } from "@/lib/utils"
5
6
  import { buttonVariants, type ButtonVariantProps } from "@/components/ui/button"
6
- import { Icon } from "@/components/ui/icon"
7
7
 
8
8
  type Props = Omit<HTMLAttributes<"button">, "type"> & ButtonVariantProps
9
9
 
@@ -23,14 +23,14 @@ const {
23
23
  disabled={disabled}
24
24
  class={cn(
25
25
  buttonVariants({ variant, size }),
26
- "absolute top-1/2 -right-12 z-10 -translate-y-1/2 touch-manipulation rounded-full",
26
+ "absolute touch-manipulation rounded-full group-data-[orientation=horizontal]/carousel:inset-y-0 group-data-[orientation=horizontal]/carousel:-right-12 group-data-[orientation=horizontal]/carousel:my-auto",
27
27
  "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",
28
28
  className
29
29
  )}
30
30
  {...props}
31
31
  >
32
32
  <slot>
33
- <Icon name="chevron-right" class="size-4" aria-hidden="true" />
33
+ <ChevronRightIcon aria-hidden="true" />
34
34
  <span class="sr-only">Next slide</span>
35
35
  </slot>
36
36
  </button>
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  import type { HTMLAttributes } from "astro/types"
3
+ import ChevronLeftIcon from "@lucide/astro/icons/chevron-left"
3
4
 
4
5
  import { cn } from "@/lib/utils"
5
6
  import { buttonVariants, type ButtonVariantProps } from "@/components/ui/button"
6
- import { Icon } from "@/components/ui/icon"
7
7
 
8
8
  type Props = Omit<HTMLAttributes<"button">, "type"> & ButtonVariantProps
9
9
 
@@ -23,14 +23,14 @@ const {
23
23
  disabled={disabled}
24
24
  class={cn(
25
25
  buttonVariants({ variant, size }),
26
- "absolute top-1/2 -left-12 z-10 -translate-y-1/2 touch-manipulation rounded-full",
26
+ "absolute touch-manipulation rounded-full group-data-[orientation=horizontal]/carousel:inset-y-0 group-data-[orientation=horizontal]/carousel:-left-12 group-data-[orientation=horizontal]/carousel:my-auto",
27
27
  "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",
28
28
  className
29
29
  )}
30
30
  {...props}
31
31
  >
32
32
  <slot>
33
- <Icon name="chevron-left" class="size-4" aria-hidden="true" />
33
+ <ChevronLeftIcon aria-hidden="true" />
34
34
  <span class="sr-only">Previous slide</span>
35
35
  </slot>
36
36
  </button>
@@ -13,7 +13,7 @@ const { class: className, ...props } = Astro.props
13
13
  role="checkbox"
14
14
  data-slot="checkbox"
15
15
  class={cn(
16
- "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",
16
+ "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 group-has-[:focus-visible]/field-label:not-checked:border-input 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 group-has-[:focus-visible]/field-label:ring-0 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",
17
17
  className
18
18
  )}
19
19
  {...props}
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  import type { HTMLAttributes } from "astro/types"
3
+ import XIcon from "@lucide/astro/icons/x"
3
4
 
4
5
  import { cn } from "@/lib/utils"
5
- import { Icon } from "@/components/ui/icon"
6
6
  import InputGroupAddon from "@/components/ui/input-group/input-group-addon.astro"
7
7
  import InputGroupInput from "@/components/ui/input-group/input-group-input.astro"
8
8
  import InputGroup from "@/components/ui/input-group/input-group.astro"
@@ -48,7 +48,7 @@ const {
48
48
  class="inline-flex size-6 shrink-0 items-center justify-center rounded-[calc(var(--radius)-5px)] p-0 text-sm shadow-none outline-none disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4"
49
49
  disabled={disabled}
50
50
  >
51
- <Icon name="x" class="pointer-events-none" />
51
+ <XIcon class="pointer-events-none" />
52
52
  </button>
53
53
  )
54
54
  }
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  import type { HTMLAttributes } from "astro/types"
3
+ import CheckIcon from "@lucide/astro/icons/check"
3
4
 
4
5
  import { cn } from "@/lib/utils"
5
- import { Icon } from "@/components/ui/icon"
6
6
 
7
7
  type Props = HTMLAttributes<"div"> & {
8
8
  value?: string
@@ -24,7 +24,7 @@ const {
24
24
  data-value={value}
25
25
  data-disabled={disabled ? "" : undefined}
26
26
  class={cn(
27
- "data-highlighted:bg-accent data-highlighted:text-accent-foreground data-highlighted:**:[svg]:text-accent-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
27
+ "group/combobox-item data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground data-[highlighted]:**:[svg]:text-accent-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
28
28
  className
29
29
  )}
30
30
  {...props}
@@ -35,9 +35,9 @@ const {
35
35
  <span
36
36
  data-slot="combobox-item-indicator"
37
37
  hidden={false}
38
- class="pointer-events-none absolute right-2 flex size-4 items-center justify-center opacity-0 group-data-[checked=true]/combobox-item:opacity-100"
38
+ class="pointer-events-none absolute right-2 flex size-4 items-center justify-center opacity-0 group-data-selected/combobox-item:opacity-100"
39
39
  >
40
- <Icon name="check" class="pointer-events-none" />
40
+ <CheckIcon class="pointer-events-none" />
41
41
  </span>
42
42
  )
43
43
  }
@@ -11,7 +11,7 @@ const { class: className, ...props } = Astro.props
11
11
  <div
12
12
  data-slot="combobox-list"
13
13
  class={cn(
14
- "no-scrollbar max-h-[min(18rem,var(--available-height))] scroll-py-1 overflow-x-hidden overflow-y-auto overscroll-contain p-1 group-data-empty/combobox-content:p-0",
14
+ "no-scrollbar max-h-[min(calc(--spacing(72)---spacing(9)),calc(var(--available-height)---spacing(9)))] scroll-py-1 overflow-y-auto overscroll-contain p-1 group-data-empty/combobox-content:p-0",
15
15
  className
16
16
  )}
17
17
  {...props}
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  import type { HTMLAttributes } from "astro/types"
3
+ import ChevronDownIcon from "@lucide/astro/icons/chevron-down"
3
4
 
4
5
  import { cn } from "@/lib/utils"
5
- import { Icon } from "@/components/ui/icon"
6
6
 
7
7
  type Props = HTMLAttributes<"button"> & {
8
8
  showIcon?: boolean
@@ -28,10 +28,7 @@ const {
28
28
  <slot />
29
29
  {
30
30
  showIcon && (
31
- <Icon
32
- name="chevron-down"
33
- class="text-muted-foreground pointer-events-none size-4"
34
- />
31
+ <ChevronDownIcon class="text-muted-foreground pointer-events-none size-4" />
35
32
  )
36
33
  }
37
34
  </button>
@@ -9,6 +9,7 @@ import { cn } from "@/lib/utils"
9
9
 
10
10
  type Props = HTMLAttributes<"div"> & {
11
11
  defaultValue?: string
12
+ defaultOpen?: boolean
12
13
  placeholder?: string
13
14
  disabled?: boolean
14
15
  required?: boolean
@@ -26,6 +27,7 @@ type Props = HTMLAttributes<"div"> & {
26
27
  const {
27
28
  class: className,
28
29
  defaultValue,
30
+ defaultOpen,
29
31
  placeholder,
30
32
  disabled,
31
33
  required,
@@ -45,6 +47,7 @@ const {
45
47
  <div
46
48
  data-slot="combobox"
47
49
  data-default-value={defaultValue}
50
+ data-default-open={defaultOpen}
48
51
  data-placeholder={placeholder}
49
52
  data-disabled={disabled}
50
53
  data-required={required}