@nuxt/ui 4.7.1 → 4.8.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 (359) hide show
  1. package/.nuxt/{ui.css → ui.static.css} +0 -10
  2. package/LICENSE.md +1 -1
  3. package/cli/commands/make/component.mjs +6 -2
  4. package/cli/templates.mjs +46 -20
  5. package/cli/utils.mjs +19 -0
  6. package/dist/module.json +1 -1
  7. package/dist/module.mjs +4 -4
  8. package/dist/runtime/components/Accordion.vue +15 -14
  9. package/dist/runtime/components/Alert.vue +20 -20
  10. package/dist/runtime/components/AuthForm.vue +37 -37
  11. package/dist/runtime/components/Avatar.d.vue.ts +4 -0
  12. package/dist/runtime/components/Avatar.vue +14 -12
  13. package/dist/runtime/components/Avatar.vue.d.ts +4 -0
  14. package/dist/runtime/components/AvatarGroup.d.vue.ts +4 -0
  15. package/dist/runtime/components/AvatarGroup.vue +11 -8
  16. package/dist/runtime/components/AvatarGroup.vue.d.ts +4 -0
  17. package/dist/runtime/components/Badge.vue +11 -11
  18. package/dist/runtime/components/Banner.vue +25 -23
  19. package/dist/runtime/components/BlogPost.d.vue.ts +1 -1
  20. package/dist/runtime/components/BlogPost.vue +30 -28
  21. package/dist/runtime/components/BlogPost.vue.d.ts +1 -1
  22. package/dist/runtime/components/BlogPosts.vue +6 -6
  23. package/dist/runtime/components/Breadcrumb.d.vue.ts +4 -0
  24. package/dist/runtime/components/Breadcrumb.vue +21 -18
  25. package/dist/runtime/components/Breadcrumb.vue.d.ts +4 -0
  26. package/dist/runtime/components/Button.vue +16 -16
  27. package/dist/runtime/components/Calendar.vue +21 -20
  28. package/dist/runtime/components/Card.vue +11 -11
  29. package/dist/runtime/components/Carousel.vue +23 -22
  30. package/dist/runtime/components/ChangelogVersion.vue +31 -29
  31. package/dist/runtime/components/ChangelogVersions.vue +8 -8
  32. package/dist/runtime/components/ChatMessage.d.vue.ts +6 -0
  33. package/dist/runtime/components/ChatMessage.vue +46 -36
  34. package/dist/runtime/components/ChatMessage.vue.d.ts +6 -0
  35. package/dist/runtime/components/ChatMessages.vue +14 -14
  36. package/dist/runtime/components/ChatPalette.vue +6 -6
  37. package/dist/runtime/components/ChatPrompt.d.vue.ts +7 -0
  38. package/dist/runtime/components/ChatPrompt.vue +22 -12
  39. package/dist/runtime/components/ChatPrompt.vue.d.ts +7 -0
  40. package/dist/runtime/components/ChatPromptSubmit.d.vue.ts +3 -3
  41. package/dist/runtime/components/ChatPromptSubmit.vue +6 -6
  42. package/dist/runtime/components/ChatPromptSubmit.vue.d.ts +3 -3
  43. package/dist/runtime/components/ChatReasoning.vue +20 -20
  44. package/dist/runtime/components/ChatShimmer.vue +7 -7
  45. package/dist/runtime/components/ChatTool.d.vue.ts +1 -1
  46. package/dist/runtime/components/ChatTool.vue +19 -19
  47. package/dist/runtime/components/ChatTool.vue.d.ts +1 -1
  48. package/dist/runtime/components/Checkbox.d.vue.ts +2 -0
  49. package/dist/runtime/components/Checkbox.vue +25 -24
  50. package/dist/runtime/components/Checkbox.vue.d.ts +2 -0
  51. package/dist/runtime/components/CheckboxGroup.d.vue.ts +1 -1
  52. package/dist/runtime/components/CheckboxGroup.vue +17 -14
  53. package/dist/runtime/components/CheckboxGroup.vue.d.ts +1 -1
  54. package/dist/runtime/components/Chip.vue +8 -8
  55. package/dist/runtime/components/Collapsible.vue +8 -7
  56. package/dist/runtime/components/ColorPicker.d.vue.ts +2 -0
  57. package/dist/runtime/components/ColorPicker.vue +10 -10
  58. package/dist/runtime/components/ColorPicker.vue.d.ts +2 -0
  59. package/dist/runtime/components/CommandPalette.d.vue.ts +5 -5
  60. package/dist/runtime/components/CommandPalette.vue +92 -69
  61. package/dist/runtime/components/CommandPalette.vue.d.ts +5 -5
  62. package/dist/runtime/components/Container.vue +4 -4
  63. package/dist/runtime/components/ContextMenu.vue +16 -15
  64. package/dist/runtime/components/DashboardGroup.d.vue.ts +1 -1
  65. package/dist/runtime/components/DashboardGroup.vue +6 -4
  66. package/dist/runtime/components/DashboardGroup.vue.d.ts +1 -1
  67. package/dist/runtime/components/DashboardNavbar.vue +16 -16
  68. package/dist/runtime/components/DashboardPanel.vue +7 -7
  69. package/dist/runtime/components/DashboardResizeHandle.vue +5 -5
  70. package/dist/runtime/components/DashboardSearch.d.vue.ts +16 -1
  71. package/dist/runtime/components/DashboardSearch.vue +25 -12
  72. package/dist/runtime/components/DashboardSearch.vue.d.ts +16 -1
  73. package/dist/runtime/components/DashboardSearchButton.d.vue.ts +2 -2
  74. package/dist/runtime/components/DashboardSearchButton.vue +15 -15
  75. package/dist/runtime/components/DashboardSearchButton.vue.d.ts +2 -2
  76. package/dist/runtime/components/DashboardSidebar.d.vue.ts +1 -1
  77. package/dist/runtime/components/DashboardSidebar.vue +22 -22
  78. package/dist/runtime/components/DashboardSidebar.vue.d.ts +1 -1
  79. package/dist/runtime/components/DashboardSidebarCollapse.d.vue.ts +1 -1
  80. package/dist/runtime/components/DashboardSidebarCollapse.vue +5 -5
  81. package/dist/runtime/components/DashboardSidebarCollapse.vue.d.ts +1 -1
  82. package/dist/runtime/components/DashboardSidebarToggle.d.vue.ts +1 -1
  83. package/dist/runtime/components/DashboardSidebarToggle.vue +5 -5
  84. package/dist/runtime/components/DashboardSidebarToggle.vue.d.ts +1 -1
  85. package/dist/runtime/components/DashboardToolbar.vue +6 -6
  86. package/dist/runtime/components/Drawer.d.vue.ts +1 -1
  87. package/dist/runtime/components/Drawer.vue +23 -22
  88. package/dist/runtime/components/Drawer.vue.d.ts +1 -1
  89. package/dist/runtime/components/DropdownMenu.vue +21 -20
  90. package/dist/runtime/components/Editor.vue +8 -7
  91. package/dist/runtime/components/EditorDragHandle.d.vue.ts +2 -2
  92. package/dist/runtime/components/EditorDragHandle.vue +9 -8
  93. package/dist/runtime/components/EditorDragHandle.vue.d.ts +2 -2
  94. package/dist/runtime/components/EditorToolbar.vue +10 -9
  95. package/dist/runtime/components/Empty.vue +14 -14
  96. package/dist/runtime/components/Error.d.vue.ts +9 -1
  97. package/dist/runtime/components/Error.vue +17 -10
  98. package/dist/runtime/components/Error.vue.d.ts +9 -1
  99. package/dist/runtime/components/FieldGroup.vue +4 -4
  100. package/dist/runtime/components/FileUpload.vue +36 -37
  101. package/dist/runtime/components/Footer.vue +10 -10
  102. package/dist/runtime/components/FooterColumns.vue +15 -15
  103. package/dist/runtime/components/Form.d.vue.ts +1 -1
  104. package/dist/runtime/components/Form.vue +6 -5
  105. package/dist/runtime/components/Form.vue.d.ts +1 -1
  106. package/dist/runtime/components/FormField.d.vue.ts +1 -0
  107. package/dist/runtime/components/FormField.vue +21 -21
  108. package/dist/runtime/components/FormField.vue.d.ts +1 -0
  109. package/dist/runtime/components/Header.vue +19 -19
  110. package/dist/runtime/components/Icon.vue +2 -1
  111. package/dist/runtime/components/Input.vue +19 -19
  112. package/dist/runtime/components/InputDate.vue +21 -20
  113. package/dist/runtime/components/InputMenu.d.vue.ts +52 -51
  114. package/dist/runtime/components/InputMenu.vue +66 -63
  115. package/dist/runtime/components/InputMenu.vue.d.ts +52 -51
  116. package/dist/runtime/components/InputNumber.vue +25 -24
  117. package/dist/runtime/components/InputTags.vue +26 -25
  118. package/dist/runtime/components/InputTime.vue +21 -20
  119. package/dist/runtime/components/Kbd.vue +5 -5
  120. package/dist/runtime/components/Link.d.vue.ts +2 -2
  121. package/dist/runtime/components/Link.vue.d.ts +2 -2
  122. package/dist/runtime/components/LinkBase.d.vue.ts +1 -1
  123. package/dist/runtime/components/LinkBase.vue.d.ts +1 -1
  124. package/dist/runtime/components/Listbox.d.vue.ts +13 -9
  125. package/dist/runtime/components/Listbox.vue +34 -32
  126. package/dist/runtime/components/Listbox.vue.d.ts +13 -9
  127. package/dist/runtime/components/Main.vue +4 -4
  128. package/dist/runtime/components/Marquee.vue +5 -5
  129. package/dist/runtime/components/Modal.d.vue.ts +2 -2
  130. package/dist/runtime/components/Modal.vue +25 -24
  131. package/dist/runtime/components/Modal.vue.d.ts +2 -2
  132. package/dist/runtime/components/NavigationMenu.vue +66 -65
  133. package/dist/runtime/components/Page.vue +7 -7
  134. package/dist/runtime/components/PageAnchors.vue +11 -11
  135. package/dist/runtime/components/PageAside.vue +9 -9
  136. package/dist/runtime/components/PageBody.vue +4 -4
  137. package/dist/runtime/components/PageCTA.vue +18 -16
  138. package/dist/runtime/components/PageCard.vue +25 -23
  139. package/dist/runtime/components/PageColumns.vue +4 -4
  140. package/dist/runtime/components/PageFeature.vue +17 -15
  141. package/dist/runtime/components/PageGrid.vue +4 -4
  142. package/dist/runtime/components/PageHeader.vue +14 -14
  143. package/dist/runtime/components/PageHero.vue +20 -18
  144. package/dist/runtime/components/PageLinks.vue +12 -12
  145. package/dist/runtime/components/PageList.vue +4 -4
  146. package/dist/runtime/components/PageLogos.vue +16 -16
  147. package/dist/runtime/components/PageSection.d.vue.ts +1 -1
  148. package/dist/runtime/components/PageSection.vue +24 -22
  149. package/dist/runtime/components/PageSection.vue.d.ts +1 -1
  150. package/dist/runtime/components/Pagination.d.vue.ts +2 -2
  151. package/dist/runtime/components/Pagination.vue +23 -22
  152. package/dist/runtime/components/Pagination.vue.d.ts +2 -2
  153. package/dist/runtime/components/PinInput.vue +15 -14
  154. package/dist/runtime/components/Popover.vue +9 -8
  155. package/dist/runtime/components/PricingPlan.vue +36 -36
  156. package/dist/runtime/components/PricingPlans.vue +6 -6
  157. package/dist/runtime/components/PricingTable.vue +44 -44
  158. package/dist/runtime/components/Progress.d.vue.ts +1 -1
  159. package/dist/runtime/components/Progress.vue +12 -11
  160. package/dist/runtime/components/Progress.vue.d.ts +1 -1
  161. package/dist/runtime/components/RadioGroup.d.vue.ts +2 -0
  162. package/dist/runtime/components/RadioGroup.vue +28 -27
  163. package/dist/runtime/components/RadioGroup.vue.d.ts +2 -0
  164. package/dist/runtime/components/ScrollArea.vue +13 -13
  165. package/dist/runtime/components/Select.vue +38 -40
  166. package/dist/runtime/components/SelectMenu.d.vue.ts +46 -46
  167. package/dist/runtime/components/SelectMenu.vue +49 -48
  168. package/dist/runtime/components/SelectMenu.vue.d.ts +46 -46
  169. package/dist/runtime/components/Separator.d.vue.ts +9 -3
  170. package/dist/runtime/components/Separator.vue +29 -16
  171. package/dist/runtime/components/Separator.vue.d.ts +9 -3
  172. package/dist/runtime/components/Sidebar.vue +28 -28
  173. package/dist/runtime/components/Skeleton.vue +5 -5
  174. package/dist/runtime/components/Slideover.d.vue.ts +3 -3
  175. package/dist/runtime/components/Slideover.vue +24 -23
  176. package/dist/runtime/components/Slideover.vue.d.ts +3 -3
  177. package/dist/runtime/components/Slider.vue +16 -15
  178. package/dist/runtime/components/Stepper.vue +19 -18
  179. package/dist/runtime/components/Switch.d.vue.ts +2 -0
  180. package/dist/runtime/components/Switch.vue +26 -23
  181. package/dist/runtime/components/Switch.vue.d.ts +2 -0
  182. package/dist/runtime/components/Table.vue +26 -25
  183. package/dist/runtime/components/Tabs.vue +22 -21
  184. package/dist/runtime/components/Textarea.vue +19 -18
  185. package/dist/runtime/components/Theme.d.vue.ts +13 -5
  186. package/dist/runtime/components/Theme.vue +32 -4
  187. package/dist/runtime/components/Theme.vue.d.ts +13 -5
  188. package/dist/runtime/components/Timeline.vue +15 -15
  189. package/dist/runtime/components/Toast.vue +35 -34
  190. package/dist/runtime/components/Toaster.d.vue.ts +1 -1
  191. package/dist/runtime/components/Toaster.vue +10 -9
  192. package/dist/runtime/components/Toaster.vue.d.ts +1 -1
  193. package/dist/runtime/components/Tooltip.vue +13 -12
  194. package/dist/runtime/components/Tree.vue +24 -23
  195. package/dist/runtime/components/User.vue +23 -21
  196. package/dist/runtime/components/color-mode/ColorModeAvatar.vue +5 -2
  197. package/dist/runtime/components/color-mode/ColorModeButton.d.vue.ts +1 -1
  198. package/dist/runtime/components/color-mode/ColorModeButton.vue +8 -6
  199. package/dist/runtime/components/color-mode/ColorModeButton.vue.d.ts +1 -1
  200. package/dist/runtime/components/color-mode/ColorModeImage.vue +4 -2
  201. package/dist/runtime/components/color-mode/ColorModeSwitch.vue +1 -0
  202. package/dist/runtime/components/content/ContentNavigation.vue +31 -30
  203. package/dist/runtime/components/content/ContentSearch.d.vue.ts +31 -4
  204. package/dist/runtime/components/content/ContentSearch.vue +78 -33
  205. package/dist/runtime/components/content/ContentSearch.vue.d.ts +31 -4
  206. package/dist/runtime/components/content/ContentSearchButton.d.vue.ts +2 -2
  207. package/dist/runtime/components/content/ContentSearchButton.vue +15 -15
  208. package/dist/runtime/components/content/ContentSearchButton.vue.d.ts +2 -2
  209. package/dist/runtime/components/content/ContentSurround.vue +14 -12
  210. package/dist/runtime/components/content/ContentToc.vue +34 -33
  211. package/dist/runtime/components/prose/A.vue +4 -4
  212. package/dist/runtime/components/prose/Accordion.vue +4 -4
  213. package/dist/runtime/components/prose/AccordionItem.vue +5 -5
  214. package/dist/runtime/components/prose/Badge.vue +4 -4
  215. package/dist/runtime/components/prose/Blockquote.vue +4 -4
  216. package/dist/runtime/components/prose/Callout.vue +8 -8
  217. package/dist/runtime/components/prose/Card.vue +12 -12
  218. package/dist/runtime/components/prose/CardGroup.vue +4 -4
  219. package/dist/runtime/components/prose/Code.vue +4 -4
  220. package/dist/runtime/components/prose/CodeCollapse.vue +8 -8
  221. package/dist/runtime/components/prose/CodeGroup.vue +9 -9
  222. package/dist/runtime/components/prose/CodePreview.vue +6 -6
  223. package/dist/runtime/components/prose/CodeTree.vue +14 -14
  224. package/dist/runtime/components/prose/Collapsible.vue +7 -7
  225. package/dist/runtime/components/prose/Em.vue +4 -4
  226. package/dist/runtime/components/prose/Field.vue +13 -13
  227. package/dist/runtime/components/prose/FieldGroup.vue +4 -4
  228. package/dist/runtime/components/prose/H1.vue +5 -5
  229. package/dist/runtime/components/prose/H2.vue +7 -7
  230. package/dist/runtime/components/prose/H3.vue +7 -7
  231. package/dist/runtime/components/prose/H4.vue +5 -5
  232. package/dist/runtime/components/prose/Hr.vue +4 -4
  233. package/dist/runtime/components/prose/Icon.vue +4 -4
  234. package/dist/runtime/components/prose/Img.vue +12 -12
  235. package/dist/runtime/components/prose/Kbd.d.vue.ts +10 -2
  236. package/dist/runtime/components/prose/Kbd.vue +8 -5
  237. package/dist/runtime/components/prose/Kbd.vue.d.ts +10 -2
  238. package/dist/runtime/components/prose/Li.vue +4 -4
  239. package/dist/runtime/components/prose/Ol.vue +4 -4
  240. package/dist/runtime/components/prose/P.vue +4 -4
  241. package/dist/runtime/components/prose/Pre.vue +9 -9
  242. package/dist/runtime/components/prose/Prompt.vue +12 -12
  243. package/dist/runtime/components/prose/Steps.vue +4 -4
  244. package/dist/runtime/components/prose/Strong.vue +4 -4
  245. package/dist/runtime/components/prose/Table.vue +5 -5
  246. package/dist/runtime/components/prose/Tabs.vue +4 -4
  247. package/dist/runtime/components/prose/TabsItem.vue +5 -5
  248. package/dist/runtime/components/prose/Tbody.vue +4 -4
  249. package/dist/runtime/components/prose/Td.vue +4 -4
  250. package/dist/runtime/components/prose/Th.vue +4 -4
  251. package/dist/runtime/components/prose/Thead.vue +4 -4
  252. package/dist/runtime/components/prose/Tr.vue +4 -4
  253. package/dist/runtime/components/prose/Ul.vue +4 -4
  254. package/dist/runtime/composables/defineShortcuts.js +7 -2
  255. package/dist/runtime/composables/index.d.ts +1 -2
  256. package/dist/runtime/composables/index.js +1 -2
  257. package/dist/runtime/composables/useAvatarGroup.d.ts +12 -1
  258. package/dist/runtime/composables/useAvatarGroup.js +4 -2
  259. package/dist/runtime/composables/useComponentIcons.js +1 -1
  260. package/dist/runtime/composables/useComponentProps.d.ts +180 -0
  261. package/dist/runtime/composables/useComponentProps.js +59 -0
  262. package/dist/runtime/composables/useContentSearch.d.ts +4 -2
  263. package/dist/runtime/composables/useContentSearch.js +64 -7
  264. package/dist/runtime/composables/useFieldGroup.d.ts +9 -1
  265. package/dist/runtime/composables/useFormField.d.ts +21 -1
  266. package/dist/runtime/composables/useForwardProps.d.ts +13 -0
  267. package/dist/runtime/composables/useForwardProps.js +14 -0
  268. package/dist/runtime/composables/usePrefix.d.ts +6 -0
  269. package/dist/runtime/composables/usePrefix.js +11 -0
  270. package/dist/runtime/composables/useResizable.d.ts +4 -0
  271. package/dist/runtime/composables/useResizable.js +1 -1
  272. package/dist/runtime/locale/ar.js +1 -0
  273. package/dist/runtime/locale/az.js +1 -0
  274. package/dist/runtime/locale/be.js +1 -0
  275. package/dist/runtime/locale/bg.js +1 -0
  276. package/dist/runtime/locale/bn.js +1 -0
  277. package/dist/runtime/locale/ca.js +1 -0
  278. package/dist/runtime/locale/ckb.js +1 -0
  279. package/dist/runtime/locale/cs.js +1 -0
  280. package/dist/runtime/locale/da.js +1 -0
  281. package/dist/runtime/locale/de.js +1 -0
  282. package/dist/runtime/locale/de_ch.js +1 -0
  283. package/dist/runtime/locale/el.js +1 -0
  284. package/dist/runtime/locale/en.js +1 -0
  285. package/dist/runtime/locale/es.js +1 -0
  286. package/dist/runtime/locale/et.js +1 -0
  287. package/dist/runtime/locale/eu.js +1 -0
  288. package/dist/runtime/locale/fa_ir.js +1 -0
  289. package/dist/runtime/locale/fi.js +1 -0
  290. package/dist/runtime/locale/fr.js +1 -0
  291. package/dist/runtime/locale/gl.js +1 -0
  292. package/dist/runtime/locale/he.js +1 -0
  293. package/dist/runtime/locale/hi.js +1 -0
  294. package/dist/runtime/locale/hr.js +1 -0
  295. package/dist/runtime/locale/hu.js +1 -0
  296. package/dist/runtime/locale/hy.js +1 -0
  297. package/dist/runtime/locale/id.js +1 -0
  298. package/dist/runtime/locale/is.js +1 -0
  299. package/dist/runtime/locale/it.js +1 -0
  300. package/dist/runtime/locale/ja.js +1 -0
  301. package/dist/runtime/locale/ka.js +1 -0
  302. package/dist/runtime/locale/kk.js +1 -0
  303. package/dist/runtime/locale/km.js +1 -0
  304. package/dist/runtime/locale/ko.js +1 -0
  305. package/dist/runtime/locale/ky.js +1 -0
  306. package/dist/runtime/locale/lb.js +1 -0
  307. package/dist/runtime/locale/lo.js +1 -0
  308. package/dist/runtime/locale/lt.js +1 -0
  309. package/dist/runtime/locale/mn.js +1 -0
  310. package/dist/runtime/locale/ms.js +1 -0
  311. package/dist/runtime/locale/nb_no.js +1 -0
  312. package/dist/runtime/locale/nl.js +1 -0
  313. package/dist/runtime/locale/pl.js +1 -0
  314. package/dist/runtime/locale/pt.js +1 -0
  315. package/dist/runtime/locale/pt_br.js +1 -0
  316. package/dist/runtime/locale/ro.js +1 -0
  317. package/dist/runtime/locale/ru.js +1 -0
  318. package/dist/runtime/locale/sk.js +1 -0
  319. package/dist/runtime/locale/sl.js +1 -0
  320. package/dist/runtime/locale/sq.js +1 -0
  321. package/dist/runtime/locale/sv.js +1 -0
  322. package/dist/runtime/locale/th.js +7 -6
  323. package/dist/runtime/locale/tj.js +1 -0
  324. package/dist/runtime/locale/tr.js +1 -0
  325. package/dist/runtime/locale/ug_cn.js +1 -0
  326. package/dist/runtime/locale/uk.js +1 -0
  327. package/dist/runtime/locale/ur.js +1 -0
  328. package/dist/runtime/locale/uz.js +1 -0
  329. package/dist/runtime/locale/vi.js +1 -0
  330. package/dist/runtime/locale/zh_cn.js +1 -0
  331. package/dist/runtime/locale/zh_tw.js +1 -0
  332. package/dist/runtime/plugins/colors.js +1 -1
  333. package/dist/runtime/types/content.d.ts +1 -0
  334. package/dist/runtime/types/content.js +1 -0
  335. package/dist/runtime/types/form.d.ts +2 -2
  336. package/dist/runtime/types/locale.d.ts +1 -0
  337. package/dist/runtime/types/tv.d.ts +13 -7
  338. package/dist/runtime/types/utils.d.ts +3 -0
  339. package/dist/runtime/utils/dashboard.d.ts +1 -1
  340. package/dist/runtime/utils/{fuse.d.ts → search.d.ts} +2 -1
  341. package/dist/runtime/utils/{fuse.js → search.js} +11 -2
  342. package/dist/runtime/vue/components/color-mode/ColorModeSwitch.vue +1 -0
  343. package/dist/runtime/vue/overrides/inertia/Link.d.vue.ts +2 -2
  344. package/dist/runtime/vue/overrides/inertia/Link.vue +5 -0
  345. package/dist/runtime/vue/overrides/inertia/Link.vue.d.ts +2 -2
  346. package/dist/runtime/vue/overrides/inertia/LinkBase.d.vue.ts +1 -1
  347. package/dist/runtime/vue/overrides/inertia/LinkBase.vue.d.ts +1 -1
  348. package/dist/runtime/vue/overrides/none/Link.d.vue.ts +2 -2
  349. package/dist/runtime/vue/overrides/none/Link.vue.d.ts +2 -2
  350. package/dist/runtime/vue/overrides/vue-router/Link.d.vue.ts +2 -2
  351. package/dist/runtime/vue/overrides/vue-router/Link.vue.d.ts +2 -2
  352. package/dist/shared/{ui.C6mn7iap.mjs → ui.BzjkAvk7.mjs} +244 -78
  353. package/dist/unplugin.mjs +1 -1
  354. package/dist/vite.mjs +1 -1
  355. package/package.json +46 -53
  356. package/dist/runtime/composables/useComponentUI.d.ts +0 -33
  357. package/dist/runtime/composables/useComponentUI.js +0 -13
  358. package/dist/runtime/composables/useResolvedVariants.d.ts +0 -21
  359. package/dist/runtime/composables/useResolvedVariants.js +0 -14
@@ -6,6 +6,7 @@
6
6
  import { computed } from "vue";
7
7
  import { useRuntimeConfig } from "#imports";
8
8
  import ImageComponent from "#build/ui-image-component";
9
+ import { usePrefix } from "../../composables/usePrefix";
9
10
  import { resolveBaseURL } from "../../utils";
10
11
  defineOptions({ inheritAttrs: false });
11
12
  const props = defineProps({
@@ -14,9 +15,10 @@ const props = defineProps({
14
15
  });
15
16
  const refinedLight = computed(() => resolveBaseURL(props.light, useRuntimeConfig().app.baseURL));
16
17
  const refinedDark = computed(() => resolveBaseURL(props.dark, useRuntimeConfig().app.baseURL));
18
+ const prefix = usePrefix();
17
19
  </script>
18
20
 
19
21
  <template>
20
- <component :is="ImageComponent" :src="refinedLight" class="dark:hidden" v-bind="$attrs" />
21
- <component :is="ImageComponent" :src="refinedDark" class="hidden dark:block" v-bind="$attrs" />
22
+ <component :is="ImageComponent" :src="refinedLight" :class="prefix('dark:hidden')" v-bind="$attrs" />
23
+ <component :is="ImageComponent" :src="refinedDark" :class="prefix('hidden dark:block')" v-bind="$attrs" />
22
24
  </template>
@@ -13,6 +13,7 @@ const props = defineProps({
13
13
  as: { type: null, required: false },
14
14
  color: { type: null, required: false },
15
15
  size: { type: null, required: false },
16
+ highlight: { type: Boolean, required: false },
16
17
  loading: { type: Boolean, required: false },
17
18
  loadingIcon: { type: null, required: false },
18
19
  label: { type: String, required: false },
@@ -4,10 +4,11 @@ import theme from "#build/ui/content/content-navigation";
4
4
 
5
5
  <script setup>
6
6
  import { computed } from "vue";
7
- import { Primitive, AccordionRoot, AccordionItem, AccordionTrigger, AccordionContent, useForwardPropsEmits } from "reka-ui";
7
+ import { Primitive, AccordionRoot, AccordionItem, AccordionTrigger, AccordionContent } from "reka-ui";
8
+ import { useForwardProps } from "../../composables/useForwardProps";
8
9
  import { reactivePick, createReusableTemplate } from "@vueuse/core";
9
10
  import { useRoute, useAppConfig } from "#imports";
10
- import { useComponentUI } from "../../composables/useComponentUI";
11
+ import { useComponentProps } from "../../composables/useComponentProps";
11
12
  import { pickLinkProps } from "../../utils/link";
12
13
  import { tv } from "../../utils/tv";
13
14
  import { mapContentNavigationItem } from "../../utils/content";
@@ -17,7 +18,7 @@ import ULinkBase from "../LinkBase.vue";
17
18
  import UBadge from "../Badge.vue";
18
19
  import UIcon from "../Icon.vue";
19
20
  defineOptions({ inheritAttrs: false });
20
- const props = defineProps({
21
+ const _props = defineProps({
21
22
  as: { type: null, required: false, default: "nav" },
22
23
  defaultOpen: { type: Boolean, required: false, default: void 0 },
23
24
  trailingIcon: { type: null, required: false },
@@ -36,10 +37,10 @@ const props = defineProps({
36
37
  });
37
38
  const emits = defineEmits(["update:modelValue"]);
38
39
  const slots = defineSlots();
39
- const rootProps = useForwardPropsEmits(reactivePick(props, "collapsible", "type", "unmountOnHide"), emits);
40
+ const props = useComponentProps("contentNavigation", _props);
41
+ const rootProps = useForwardProps(reactivePick(props, "collapsible", "type", "unmountOnHide"), emits);
40
42
  const route = useRoute();
41
43
  const appConfig = useAppConfig();
42
- const uiProp = useComponentUI("contentNavigation", props);
43
44
  const [DefineLinkTemplate, ReuseLinkTemplate] = createReusableTemplate();
44
45
  const ui = computed(() => tv({ extend: tv(theme), ...appConfig.ui?.contentNavigation || {} })({
45
46
  color: props.color,
@@ -75,68 +76,68 @@ const defaultValue = computed(() => {
75
76
  <DefineLinkTemplate v-slot="{ link, active }">
76
77
  <slot name="link" :link="link" :active="active" :ui="ui">
77
78
  <slot name="link-leading" :link="link" :active="active" :ui="ui">
78
- <UIcon v-if="link.icon" :name="link.icon" data-slot="linkLeadingIcon" :class="ui.linkLeadingIcon({ class: [uiProp?.linkLeadingIcon, link.ui?.linkLeadingIcon], active })" />
79
+ <UIcon v-if="link.icon" :name="link.icon" data-slot="linkLeadingIcon" :class="ui.linkLeadingIcon({ class: [props.ui?.linkLeadingIcon, link.ui?.linkLeadingIcon], active })" />
79
80
  </slot>
80
81
 
81
- <span v-if="link.title || !!slots['link-title']" data-slot="linkTitle" :class="ui.linkTitle({ class: [uiProp?.linkTitle, link.ui?.linkTitle], active })">
82
+ <span v-if="link.title || !!slots['link-title']" data-slot="linkTitle" :class="ui.linkTitle({ class: [props.ui?.linkTitle, link.ui?.linkTitle], active })">
82
83
  <slot name="link-title" :link="link" :active="active" :ui="ui">
83
84
  {{ link.title }}
84
85
  </slot>
85
86
 
86
- <UIcon v-if="link.target === '_blank'" :name="appConfig.ui.icons.external" data-slot="linkTitleExternalIcon" :class="ui.linkTitleExternalIcon({ class: [uiProp?.linkTitleExternalIcon, link.ui?.linkTitleExternalIcon], active })" />
87
+ <UIcon v-if="link.target === '_blank'" :name="appConfig.ui.icons.external" data-slot="linkTitleExternalIcon" :class="ui.linkTitleExternalIcon({ class: [props.ui?.linkTitleExternalIcon, link.ui?.linkTitleExternalIcon], active })" />
87
88
  </span>
88
89
 
89
- <span v-if="link.badge || link.badge === 0 || link.children?.length && !disabled || link.trailingIcon || !!slots['link-trailing']" data-slot="linkTrailing" :class="ui.linkTrailing({ class: [uiProp?.linkTrailing, link.ui?.linkTrailing] })">
90
+ <span v-if="link.badge || link.badge === 0 || link.children?.length && !disabled || link.trailingIcon || !!slots['link-trailing']" data-slot="linkTrailing" :class="ui.linkTrailing({ class: [props.ui?.linkTrailing, link.ui?.linkTrailing] })">
90
91
  <slot name="link-trailing" :link="link" :active="active" :ui="ui">
91
92
  <UBadge
92
93
  v-if="link.badge || link.badge === 0"
93
94
  color="neutral"
94
95
  variant="outline"
95
- :size="uiProp?.linkTrailingBadgeSize || ui.linkTrailingBadgeSize()"
96
+ :size="props.ui?.linkTrailingBadgeSize || ui.linkTrailingBadgeSize()"
96
97
  v-bind="typeof link.badge === 'string' || typeof link.badge === 'number' ? { label: link.badge } : link.badge"
97
98
  data-slot="linkTrailingBadge"
98
- :class="ui.linkTrailingBadge({ class: uiProp?.linkTrailingBadge })"
99
+ :class="ui.linkTrailingBadge({ class: props.ui?.linkTrailingBadge })"
99
100
  />
100
- <UIcon v-if="link.children?.length && !disabled" :name="link.trailingIcon || trailingIcon || appConfig.ui.icons.chevronDown" data-slot="linkTrailingIcon" :class="ui.linkTrailingIcon({ class: [uiProp?.linkTrailingIcon, link.ui?.linkTrailingIcon] })" />
101
- <UIcon v-else-if="link.trailingIcon" :name="link.trailingIcon" data-slot="linkTrailingIcon" :class="ui.linkTrailingIcon({ class: [uiProp?.linkTrailingIcon, link.ui?.linkTrailingIcon] })" />
101
+ <UIcon v-if="link.children?.length && !disabled" :name="link.trailingIcon || props.trailingIcon || appConfig.ui.icons.chevronDown" data-slot="linkTrailingIcon" :class="ui.linkTrailingIcon({ class: [props.ui?.linkTrailingIcon, link.ui?.linkTrailingIcon] })" />
102
+ <UIcon v-else-if="link.trailingIcon" :name="link.trailingIcon" data-slot="linkTrailingIcon" :class="ui.linkTrailingIcon({ class: [props.ui?.linkTrailingIcon, link.ui?.linkTrailingIcon] })" />
102
103
  </slot>
103
104
  </span>
104
105
  </slot>
105
106
  </DefineLinkTemplate>
106
107
 
107
- <Primitive :as="as" v-bind="$attrs" :as-child="level > 0" data-slot="root" :class="ui.root({ class: [uiProp?.root, props.class] })">
108
- <AccordionRoot as="ul" :disabled="disabled" v-bind="rootProps" :default-value="defaultValue" :class="level > 0 ? ui.listWithChildren({ class: uiProp?.listWithChildren }) : ui.list({ class: uiProp?.list })">
109
- <template v-for="(link, index) in navigation" :key="index">
108
+ <Primitive :as="props.as" v-bind="$attrs" :as-child="props.level > 0" data-slot="root" :class="ui.root({ class: [props.ui?.root, props.class] })">
109
+ <AccordionRoot as="ul" :disabled="disabled" v-bind="rootProps" :default-value="defaultValue" :class="props.level > 0 ? ui.listWithChildren({ class: props.ui?.listWithChildren }) : ui.list({ class: props.ui?.list })">
110
+ <template v-for="(link, index) in props.navigation" :key="index">
110
111
  <AccordionItem
111
112
  v-if="link.children?.length"
112
113
  as="li"
113
114
  :disabled="!!link.disabled"
114
115
  data-slot="itemWithChildren"
115
- :class="ui.itemWithChildren({ class: [uiProp?.itemWithChildren, link.ui?.itemWithChildren], level: level > 0 })"
116
+ :class="ui.itemWithChildren({ class: [props.ui?.itemWithChildren, link.ui?.itemWithChildren], level: props.level > 0 })"
116
117
  :value="String(index)"
117
118
  >
118
119
  <AccordionTrigger
119
120
  as="button"
120
121
  :class="[
121
- ui.link({ class: [uiProp?.link, link.ui?.link, link.class], active: link.active, disabled: !!link.disabled || disabled }),
122
- ui.trigger({ class: [uiProp?.trigger, link.ui?.trigger], disabled: !!link.disabled || disabled })
122
+ ui.link({ class: [props.ui?.link, link.ui?.link, link.class], active: link.active, disabled: !!link.disabled || disabled }),
123
+ ui.trigger({ class: [props.ui?.trigger, link.ui?.trigger], disabled: !!link.disabled || disabled })
123
124
  ]"
124
125
  >
125
126
  <ReuseLinkTemplate :link="link" :active="link.active || false" />
126
127
  </AccordionTrigger>
127
128
 
128
- <AccordionContent data-slot="content" :class="ui.content({ class: [uiProp?.content, link.ui?.content] })">
129
+ <AccordionContent data-slot="content" :class="ui.content({ class: [props.ui?.content, link.ui?.content] })">
129
130
  <UContentNavigation
130
131
  v-bind="rootProps"
131
132
  :navigation="link.children"
132
- :default-open="defaultOpen"
133
- :level="level + 1"
134
- :trailing-icon="trailingIcon"
135
- :color="color"
136
- :variant="variant"
137
- :highlight="highlight"
138
- :highlight-color="highlightColor"
139
- :ui="uiProp"
133
+ :default-open="props.defaultOpen"
134
+ :level="props.level + 1"
135
+ :trailing-icon="props.trailingIcon"
136
+ :color="props.color"
137
+ :variant="props.variant"
138
+ :highlight="props.highlight"
139
+ :highlight-color="props.highlightColor"
140
+ :ui="props.ui"
140
141
  >
141
142
  <template v-for="(_, name) in slots" #[name]="slotData">
142
143
  <slot :name="name" v-bind="{ ...slotData, link: slotData.link }" />
@@ -145,9 +146,9 @@ const defaultValue = computed(() => {
145
146
  </AccordionContent>
146
147
  </AccordionItem>
147
148
 
148
- <li v-else data-slot="item" :class="ui.item({ class: [uiProp?.item, link.ui?.item], level: level > 0 })">
149
+ <li v-else data-slot="item" :class="ui.item({ class: [props.ui?.item, link.ui?.item], level: props.level > 0 })">
149
150
  <ULink v-slot="{ active, ...slotProps }" v-bind="pickLinkProps(mapContentNavigationItem(link))" custom>
150
- <ULinkBase v-bind="slotProps" data-slot="link" :class="ui.link({ class: [uiProp?.link, link.ui?.link, link.class], active, disabled: !!link.disabled, level: level > 0 })">
151
+ <ULinkBase v-bind="slotProps" data-slot="link" :class="ui.link({ class: [props.ui?.link, link.ui?.link, link.class], active, disabled: !!link.disabled, level: props.level > 0 })">
151
152
  <ReuseLinkTemplate :link="link" :active="active" />
152
153
  </ULinkBase>
153
154
  </ULink>
@@ -22,6 +22,21 @@ export interface ContentSearchFile {
22
22
  level: number;
23
23
  content: string;
24
24
  }
25
+ export interface ContentSearchResult extends ContentSearchFile {
26
+ snippets?: {
27
+ title?: string;
28
+ content?: string;
29
+ };
30
+ }
31
+ export interface ContentSearchOptions {
32
+ limit?: number;
33
+ snippet?: {
34
+ columns?: ('title' | 'content')[];
35
+ around?: number;
36
+ };
37
+ }
38
+ export type ContentSearchStatus = 'idle' | 'loading' | 'ready' | 'error';
39
+ export type ContentSearchFn = (query: string, opts?: ContentSearchOptions) => Promise<ContentSearchResult[]>;
25
40
  export interface ContentSearchItem extends Omit<LinkProps, 'custom'>, CommandPaletteItem {
26
41
  level?: number;
27
42
  /**
@@ -29,7 +44,7 @@ export interface ContentSearchItem extends Omit<LinkProps, 'custom'>, CommandPal
29
44
  */
30
45
  icon?: IconProps['name'];
31
46
  }
32
- export interface ContentSearchProps<T extends ContentSearchLink = ContentSearchLink> extends Pick<ModalProps, 'title' | 'description' | 'overlay' | 'transition' | 'content' | 'dismissible' | 'fullscreen' | 'modal' | 'portal'>, Pick<CommandPaletteProps<CommandPaletteGroup<ContentSearchItem>, ContentSearchItem>, 'icon' | 'placeholder' | 'autofocus' | 'loading' | 'loadingIcon' | 'closeIcon' | 'groups'> {
47
+ export interface ContentSearchProps<T extends ContentSearchLink = ContentSearchLink> extends Pick<ModalProps, 'title' | 'description' | 'overlay' | 'transition' | 'content' | 'dismissible' | 'fullscreen' | 'modal' | 'portal'>, Pick<CommandPaletteProps<CommandPaletteGroup<ContentSearchItem>, ContentSearchItem>, 'icon' | 'trailingIcon' | 'selectedIcon' | 'childrenIcon' | 'placeholder' | 'autofocus' | 'loading' | 'loadingIcon' | 'closeIcon' | 'back' | 'backIcon' | 'disabled' | 'highlightOnHover' | 'labelKey' | 'descriptionKey' | 'preserveGroupOrder' | 'virtualize' | 'groups'> {
33
48
  /**
34
49
  * @defaultValue 'md'
35
50
  */
@@ -56,8 +71,9 @@ export interface ContentSearchProps<T extends ContentSearchLink = ContentSearchL
56
71
  fuseOptions: {
57
72
  ignoreLocation: true,
58
73
  includeMatches: true,
74
+ useTokenSearch: true,
59
75
  threshold: 0.1,
60
- keys: ['label', 'suffix']
76
+ keys: ['label', 'description', 'suffix']
61
77
  },
62
78
  resultLimit: 12,
63
79
  matchAllWhenSearchEmpty: true
@@ -65,8 +81,19 @@ export interface ContentSearchProps<T extends ContentSearchLink = ContentSearchL
65
81
  */
66
82
  fuse?: UseFuseOptions<T>;
67
83
  /**
68
- * Delay (in milliseconds) before the search term is passed to Fuse (debounced).
69
- * Useful for large doc sets where running fuzzy search on every keystroke is the bottleneck — the input stays responsive while Fuse only re-runs after typing settles.
84
+ * Async search function (e.g. from [`useSearchCollection`](https://content.nuxt.com/docs/utils/use-search-collection)).
85
+ * When provided, ContentSearch calls it on each keystroke and uses the results instead of Fuse.
86
+ * Results are mapped, sanitized, and grouped by navigation internally.
87
+ */
88
+ search?: ContentSearchFn;
89
+ /**
90
+ * Status of the async search index (e.g. from `useSearchCollection`).
91
+ * When the status transitions to `'ready'`, the search is automatically re-triggered if there's a pending term.
92
+ */
93
+ searchStatus?: ContentSearchStatus;
94
+ /**
95
+ * Delay (in milliseconds) before the search is triggered (debounced).
96
+ * Keeps the input responsive by only running the search after typing settles.
70
97
  * Set to `0` to disable.
71
98
  * @defaultValue 100
72
99
  */
@@ -3,19 +3,19 @@ import theme from "#build/ui/content/content-search";
3
3
  </script>
4
4
 
5
5
  <script setup>
6
- import { computed, useTemplateRef } from "vue";
7
- import { useForwardProps } from "reka-ui";
6
+ import { computed, shallowRef, useTemplateRef, watch } from "vue";
8
7
  import { defu } from "defu";
9
- import { reactivePick } from "@vueuse/core";
8
+ import { reactivePick, refDebounced } from "@vueuse/core";
10
9
  import { useAppConfig, useColorMode, defineShortcuts } from "#imports";
11
- import { useComponentUI } from "../../composables/useComponentUI";
10
+ import { useComponentProps } from "../../composables/useComponentProps";
11
+ import { useForwardProps } from "../../composables/useForwardProps";
12
12
  import { useContentSearch } from "../../composables/useContentSearch";
13
13
  import { useLocale } from "../../composables/useLocale";
14
14
  import { omit, transformUI } from "../../utils";
15
15
  import { tv } from "../../utils/tv";
16
16
  import UModal from "../Modal.vue";
17
17
  import UCommandPalette from "../CommandPalette.vue";
18
- const props = defineProps({
18
+ const _props = defineProps({
19
19
  size: { type: null, required: false },
20
20
  close: { type: [Boolean, Object], required: false, default: true },
21
21
  shortcut: { type: String, required: false, default: "meta_k" },
@@ -23,6 +23,8 @@ const props = defineProps({
23
23
  navigation: { type: Array, required: false },
24
24
  files: { type: Array, required: false },
25
25
  fuse: { type: Object, required: false },
26
+ search: { type: Function, required: false },
27
+ searchStatus: { type: String, required: false },
26
28
  searchDelay: { type: Number, required: false, default: 100 },
27
29
  colorMode: { type: Boolean, required: false, default: true },
28
30
  class: { type: null, required: false },
@@ -37,52 +39,91 @@ const props = defineProps({
37
39
  modal: { type: Boolean, required: false },
38
40
  portal: { type: [Boolean, String], required: false, skipCheck: true },
39
41
  icon: { type: null, required: false },
42
+ trailingIcon: { type: null, required: false },
43
+ selectedIcon: { type: null, required: false },
44
+ childrenIcon: { type: null, required: false },
40
45
  placeholder: { type: String, required: false },
41
46
  autofocus: { type: Boolean, required: false },
42
47
  loading: { type: Boolean, required: false },
43
48
  loadingIcon: { type: null, required: false },
44
49
  closeIcon: { type: null, required: false },
50
+ back: { type: [Boolean, Object], required: false },
51
+ backIcon: { type: null, required: false },
52
+ disabled: { type: Boolean, required: false },
53
+ highlightOnHover: { type: Boolean, required: false },
54
+ labelKey: { type: null, required: false },
55
+ descriptionKey: { type: null, required: false },
56
+ preserveGroupOrder: { type: Boolean, required: false },
57
+ virtualize: { type: [Boolean, Object], required: false },
45
58
  groups: { type: Array, required: false }
46
59
  });
47
60
  const slots = defineSlots();
61
+ const props = useComponentProps("contentSearch", _props);
48
62
  const searchTerm = defineModel("searchTerm", { type: String, ...{ default: "" } });
49
63
  const { t } = useLocale();
50
- const { open, mapNavigationItems, postFilter } = useContentSearch();
64
+ const { open, mapNavigationItems, mapLinks, mapSearchResults, postFilter } = useContentSearch();
51
65
  const colorMode = useColorMode();
52
66
  const appConfig = useAppConfig();
53
- const uiProp = useComponentUI("contentSearch", props);
54
- const commandPaletteProps = useForwardProps(reactivePick(props, "size", "icon", "placeholder", "autofocus", "loading", "loadingIcon", "close", "closeIcon", "searchDelay"));
67
+ const commandPaletteProps = useForwardProps(reactivePick(props, "size", "icon", "trailingIcon", "selectedIcon", "childrenIcon", "placeholder", "autofocus", "loading", "loadingIcon", "close", "closeIcon", "back", "backIcon", "disabled", "highlightOnHover", "labelKey", "descriptionKey", "preserveGroupOrder", "virtualize", "searchDelay"));
55
68
  const modalProps = useForwardProps(reactivePick(props, "overlay", "transition", "content", "dismissible", "fullscreen", "modal", "portal"));
56
69
  const getProxySlots = () => omit(slots, ["content"]);
57
70
  const fuse = computed(() => defu({}, props.fuse, {
58
71
  fuseOptions: {
59
- includeMatches: true
60
- }
72
+ includeMatches: true,
73
+ useTokenSearch: true
74
+ },
75
+ resultLimit: 12
61
76
  }));
62
77
  const ui = computed(() => tv({ extend: tv(theme), ...appConfig.ui?.contentSearch || {} })({
63
78
  size: props.size,
64
79
  fullscreen: props.fullscreen
65
80
  }));
66
81
  const commandPaletteRef = useTemplateRef("commandPaletteRef");
67
- const mappedLinksItems = computed(() => {
82
+ const debouncedSearchTerm = refDebounced(searchTerm, () => props.searchDelay);
83
+ const rawSearchResults = shallowRef([]);
84
+ const searchResults = computed(() => mapSearchResults(rawSearchResults.value, props.navigation));
85
+ let searchRequestId = 0;
86
+ async function runSearch(term) {
87
+ const requestId = ++searchRequestId;
88
+ if (!props.search || !term) {
89
+ rawSearchResults.value = [];
90
+ return;
91
+ }
92
+ try {
93
+ const results = await props.search(term, {
94
+ limit: fuse.value.resultLimit,
95
+ snippet: { columns: ["title", "content"], around: 20 }
96
+ });
97
+ if (requestId !== searchRequestId) return;
98
+ rawSearchResults.value = results;
99
+ } catch (err) {
100
+ if (requestId !== searchRequestId) return;
101
+ console.error("[ContentSearch] search failed:", err);
102
+ rawSearchResults.value = [];
103
+ }
104
+ }
105
+ watch(debouncedSearchTerm, runSearch);
106
+ watch(() => props.search, () => {
107
+ if (debouncedSearchTerm.value) {
108
+ runSearch(debouncedSearchTerm.value);
109
+ }
110
+ });
111
+ watch(() => props.searchStatus, (status) => {
112
+ if (status === "ready" && debouncedSearchTerm.value) {
113
+ runSearch(debouncedSearchTerm.value);
114
+ }
115
+ });
116
+ const linksGroup = computed(() => {
68
117
  if (!props.links?.length) {
69
- return [];
118
+ return null;
70
119
  }
71
- return props.links.flatMap((link) => [{
72
- ...link,
73
- suffix: link.description,
74
- description: void 0,
75
- icon: link.icon || appConfig.ui.icons.file,
76
- children: void 0
77
- }, ...link.children?.map((child) => ({
78
- ...child,
79
- prefix: link.label + " >",
80
- suffix: child.description,
81
- description: void 0,
82
- icon: child.icon || link.icon || appConfig.ui.icons.file
83
- })) || []]);
120
+ return { id: "links", label: t("contentSearch.links"), items: mapLinks(props.links) };
84
121
  });
85
- const mappedNavigationGroups = computed(() => {
122
+ const searchGroups = computed(() => {
123
+ if (!searchTerm.value || !searchResults.value.length) return [];
124
+ return [{ id: "search", label: t("contentSearch.search"), items: searchResults.value, ignoreFilter: true }];
125
+ });
126
+ const navigationGroups = computed(() => {
86
127
  if (!props.navigation?.length) {
87
128
  return [];
88
129
  }
@@ -130,10 +171,14 @@ const themeGroup = computed(() => {
130
171
  });
131
172
  const groups = computed(() => {
132
173
  const groups2 = [];
133
- if (mappedLinksItems.value.length) {
134
- groups2.push({ id: "links", label: t("contentSearch.links"), items: mappedLinksItems.value });
174
+ if (linksGroup.value) {
175
+ groups2.push(linksGroup.value);
176
+ }
177
+ if (props.search) {
178
+ groups2.push(...searchGroups.value);
179
+ } else {
180
+ groups2.push(...navigationGroups.value);
135
181
  }
136
- groups2.push(...mappedNavigationGroups.value);
137
182
  groups2.push(...props.groups || []);
138
183
  if (themeGroup.value) {
139
184
  groups2.push(themeGroup.value);
@@ -161,11 +206,11 @@ defineExpose({
161
206
  <template>
162
207
  <UModal
163
208
  v-model:open="open"
164
- :title="title || t('contentSearch.title')"
165
- :description="description || t('contentSearch.description')"
209
+ :title="props.title || t('contentSearch.title')"
210
+ :description="props.description || t('contentSearch.description')"
166
211
  v-bind="modalProps"
167
212
  data-slot="modal"
168
- :class="ui.modal({ class: [uiProp?.modal, props.class] })"
213
+ :class="ui.modal({ class: [props.ui?.modal, props.class] })"
169
214
  >
170
215
  <template #content="contentData">
171
216
  <slot name="content" v-bind="contentData">
@@ -176,7 +221,7 @@ defineExpose({
176
221
  :groups="groups"
177
222
  :fuse="fuse"
178
223
  :input="{ fixed: true }"
179
- :ui="transformUI(omit(ui, ['modal']), uiProp)"
224
+ :ui="transformUI(omit(ui, ['modal']), props.ui)"
180
225
  @update:model-value="onSelect"
181
226
  @update:open="open = $event"
182
227
  >
@@ -22,6 +22,21 @@ export interface ContentSearchFile {
22
22
  level: number;
23
23
  content: string;
24
24
  }
25
+ export interface ContentSearchResult extends ContentSearchFile {
26
+ snippets?: {
27
+ title?: string;
28
+ content?: string;
29
+ };
30
+ }
31
+ export interface ContentSearchOptions {
32
+ limit?: number;
33
+ snippet?: {
34
+ columns?: ('title' | 'content')[];
35
+ around?: number;
36
+ };
37
+ }
38
+ export type ContentSearchStatus = 'idle' | 'loading' | 'ready' | 'error';
39
+ export type ContentSearchFn = (query: string, opts?: ContentSearchOptions) => Promise<ContentSearchResult[]>;
25
40
  export interface ContentSearchItem extends Omit<LinkProps, 'custom'>, CommandPaletteItem {
26
41
  level?: number;
27
42
  /**
@@ -29,7 +44,7 @@ export interface ContentSearchItem extends Omit<LinkProps, 'custom'>, CommandPal
29
44
  */
30
45
  icon?: IconProps['name'];
31
46
  }
32
- export interface ContentSearchProps<T extends ContentSearchLink = ContentSearchLink> extends Pick<ModalProps, 'title' | 'description' | 'overlay' | 'transition' | 'content' | 'dismissible' | 'fullscreen' | 'modal' | 'portal'>, Pick<CommandPaletteProps<CommandPaletteGroup<ContentSearchItem>, ContentSearchItem>, 'icon' | 'placeholder' | 'autofocus' | 'loading' | 'loadingIcon' | 'closeIcon' | 'groups'> {
47
+ export interface ContentSearchProps<T extends ContentSearchLink = ContentSearchLink> extends Pick<ModalProps, 'title' | 'description' | 'overlay' | 'transition' | 'content' | 'dismissible' | 'fullscreen' | 'modal' | 'portal'>, Pick<CommandPaletteProps<CommandPaletteGroup<ContentSearchItem>, ContentSearchItem>, 'icon' | 'trailingIcon' | 'selectedIcon' | 'childrenIcon' | 'placeholder' | 'autofocus' | 'loading' | 'loadingIcon' | 'closeIcon' | 'back' | 'backIcon' | 'disabled' | 'highlightOnHover' | 'labelKey' | 'descriptionKey' | 'preserveGroupOrder' | 'virtualize' | 'groups'> {
33
48
  /**
34
49
  * @defaultValue 'md'
35
50
  */
@@ -56,8 +71,9 @@ export interface ContentSearchProps<T extends ContentSearchLink = ContentSearchL
56
71
  fuseOptions: {
57
72
  ignoreLocation: true,
58
73
  includeMatches: true,
74
+ useTokenSearch: true,
59
75
  threshold: 0.1,
60
- keys: ['label', 'suffix']
76
+ keys: ['label', 'description', 'suffix']
61
77
  },
62
78
  resultLimit: 12,
63
79
  matchAllWhenSearchEmpty: true
@@ -65,8 +81,19 @@ export interface ContentSearchProps<T extends ContentSearchLink = ContentSearchL
65
81
  */
66
82
  fuse?: UseFuseOptions<T>;
67
83
  /**
68
- * Delay (in milliseconds) before the search term is passed to Fuse (debounced).
69
- * Useful for large doc sets where running fuzzy search on every keystroke is the bottleneck — the input stays responsive while Fuse only re-runs after typing settles.
84
+ * Async search function (e.g. from [`useSearchCollection`](https://content.nuxt.com/docs/utils/use-search-collection)).
85
+ * When provided, ContentSearch calls it on each keystroke and uses the results instead of Fuse.
86
+ * Results are mapped, sanitized, and grouped by navigation internally.
87
+ */
88
+ search?: ContentSearchFn;
89
+ /**
90
+ * Status of the async search index (e.g. from `useSearchCollection`).
91
+ * When the status transitions to `'ready'`, the search is automatically re-triggered if there's a pending term.
92
+ */
93
+ searchStatus?: ContentSearchStatus;
94
+ /**
95
+ * Delay (in milliseconds) before the search is triggered (debounced).
96
+ * Keeps the input responsive by only running the search after typing settles.
70
97
  * Set to `0` to disable.
71
98
  * @defaultValue 100
72
99
  */
@@ -47,10 +47,10 @@ export interface ContentSearchButtonProps extends Omit<ButtonProps, LinkPropsKey
47
47
  declare const _default: typeof __VLS_export;
48
48
  export default _default;
49
49
  declare const __VLS_export: __VLS_WithSlots<import("vue").DefineComponent<ContentSearchButtonProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<ContentSearchButtonProps> & Readonly<{}>, {
50
- color: "error" | "primary" | "secondary" | "success" | "info" | "warning" | "neutral";
51
- collapsed: boolean;
50
+ color: "error" | "neutral" | "primary" | "secondary" | "success" | "info" | "warning";
52
51
  tooltip: boolean | TooltipProps;
53
52
  kbds: KbdProps["value"][] | KbdProps[];
53
+ collapsed: boolean;
54
54
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, ButtonSlots>;
55
55
  type __VLS_WithSlots<T, S> = T & {
56
56
  new (): {
@@ -4,11 +4,11 @@ import theme from "#build/ui/content/content-search-button";
4
4
 
5
5
  <script setup>
6
6
  import { computed, toRef } from "vue";
7
- import { useForwardProps } from "reka-ui";
8
7
  import { defu } from "defu";
9
8
  import { reactiveOmit, createReusableTemplate } from "@vueuse/core";
10
9
  import { useAppConfig } from "#imports";
11
- import { useComponentUI } from "../../composables/useComponentUI";
10
+ import { useComponentProps } from "../../composables/useComponentProps";
11
+ import { useForwardProps } from "../../composables/useForwardProps";
12
12
  import { useContentSearch } from "../../composables/useContentSearch";
13
13
  import { useLocale } from "../../composables/useLocale";
14
14
  import { omit, transformUI } from "../../utils";
@@ -17,7 +17,7 @@ import UButton from "../Button.vue";
17
17
  import UKbd from "../Kbd.vue";
18
18
  import UTooltip from "../Tooltip.vue";
19
19
  defineOptions({ inheritAttrs: false });
20
- const props = defineProps({
20
+ const _props = defineProps({
21
21
  icon: { type: null, required: false },
22
22
  label: { type: String, required: false },
23
23
  color: { type: null, required: false, default: "neutral" },
@@ -48,6 +48,7 @@ const props = defineProps({
48
48
  viewTransition: { type: Boolean, required: false }
49
49
  });
50
50
  const slots = defineSlots();
51
+ const props = useComponentProps("contentSearchButton", _props);
51
52
  const [DefineButtonTemplate, ReuseButtonTemplate] = createReusableTemplate();
52
53
  const getProxySlots = () => omit(slots, ["trailing"]);
53
54
  const buttonProps = useForwardProps(reactiveOmit(props, "icon", "label", "variant", "collapsed", "tooltip", "kbds", "class", "ui"));
@@ -55,7 +56,6 @@ const tooltipProps = toRef(() => defu(typeof props.tooltip === "boolean" ? {} :
55
56
  const { t } = useLocale();
56
57
  const { open } = useContentSearch();
57
58
  const appConfig = useAppConfig();
58
- const uiProp = useComponentUI("contentSearchButton", props);
59
59
  const ui = computed(() => tv({ extend: tv(theme), ...appConfig.ui?.contentSearchButton || {} })({
60
60
  collapsed: props.collapsed
61
61
  }));
@@ -64,19 +64,19 @@ const ui = computed(() => tv({ extend: tv(theme), ...appConfig.ui?.contentSearch
64
64
  <template>
65
65
  <DefineButtonTemplate>
66
66
  <UButton
67
- :icon="icon || appConfig.ui.icons.search"
68
- :label="label || t('contentSearchButton.label')"
69
- :variant="variant || (collapsed ? 'ghost' : 'outline')"
67
+ :icon="props.icon || appConfig.ui.icons.search"
68
+ :label="props.label || t('contentSearchButton.label')"
69
+ :variant="props.variant || (props.collapsed ? 'ghost' : 'outline')"
70
70
  v-bind="{
71
71
  ...buttonProps,
72
- ...collapsed ? {
72
+ ...props.collapsed ? {
73
73
  'square': true,
74
- 'aria-label': label || t('contentSearchButton.label')
74
+ 'aria-label': props.label || t('contentSearchButton.label')
75
75
  } : {},
76
76
  ...$attrs
77
77
  }"
78
- :class="ui.base({ class: [uiProp?.base, props.class] })"
79
- :ui="transformUI(ui, uiProp)"
78
+ :class="ui.base({ class: [props.ui?.base, props.class] })"
79
+ :ui="transformUI(ui, props.ui)"
80
80
  @click="open = true"
81
81
  >
82
82
  <template v-for="(_, name) in getProxySlots()" #[name]="slotData">
@@ -84,10 +84,10 @@ const ui = computed(() => tv({ extend: tv(theme), ...appConfig.ui?.contentSearch
84
84
  </template>
85
85
 
86
86
  <template #trailing="{ ui: uiProxy }">
87
- <div data-slot="trailing" :class="ui.trailing({ class: uiProp?.trailing })">
87
+ <div data-slot="trailing" :class="ui.trailing({ class: props.ui?.trailing })">
88
88
  <slot name="trailing" :ui="uiProxy">
89
- <template v-if="kbds?.length">
90
- <UKbd v-for="(kbd, index) in kbds" :key="index" variant="subtle" v-bind="typeof kbd === 'string' ? { value: kbd } : kbd" />
89
+ <template v-if="props.kbds?.length">
90
+ <UKbd v-for="(kbd, index) in props.kbds" :key="index" variant="subtle" v-bind="typeof kbd === 'string' ? { value: kbd } : kbd" />
91
91
  </template>
92
92
  </slot>
93
93
  </div>
@@ -95,7 +95,7 @@ const ui = computed(() => tv({ extend: tv(theme), ...appConfig.ui?.contentSearch
95
95
  </UButton>
96
96
  </DefineButtonTemplate>
97
97
 
98
- <UTooltip v-if="collapsed && tooltip" :text="label || t('contentSearchButton.label')" v-bind="tooltipProps">
98
+ <UTooltip v-if="props.collapsed && props.tooltip" :text="props.label || t('contentSearchButton.label')" v-bind="tooltipProps">
99
99
  <ReuseButtonTemplate />
100
100
  </UTooltip>
101
101
  <ReuseButtonTemplate v-else />
@@ -47,10 +47,10 @@ export interface ContentSearchButtonProps extends Omit<ButtonProps, LinkPropsKey
47
47
  declare const _default: typeof __VLS_export;
48
48
  export default _default;
49
49
  declare const __VLS_export: __VLS_WithSlots<import("vue").DefineComponent<ContentSearchButtonProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<ContentSearchButtonProps> & Readonly<{}>, {
50
- color: "error" | "primary" | "secondary" | "success" | "info" | "warning" | "neutral";
51
- collapsed: boolean;
50
+ color: "error" | "neutral" | "primary" | "secondary" | "success" | "info" | "warning";
52
51
  tooltip: boolean | TooltipProps;
53
52
  kbds: KbdProps["value"][] | KbdProps[];
53
+ collapsed: boolean;
54
54
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, ButtonSlots>;
55
55
  type __VLS_WithSlots<T, S> = T & {
56
56
  new (): {