@primereact/mcp 11.0.0-rc.2

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 (546) hide show
  1. package/LICENSE.md +45 -0
  2. package/README.md +94 -0
  3. package/data/llms/headless/add-ons/introduction.md +16 -0
  4. package/data/llms/headless/components/accordion/api.json +252 -0
  5. package/data/llms/headless/components/accordion.md +196 -0
  6. package/data/llms/headless/components/animateonscroll/api.json +88 -0
  7. package/data/llms/headless/components/animateonscroll.md +141 -0
  8. package/data/llms/headless/components/autocomplete/api.json +787 -0
  9. package/data/llms/headless/components/autocomplete.md +249 -0
  10. package/data/llms/headless/components/avatar/api.json +154 -0
  11. package/data/llms/headless/components/avatar.md +149 -0
  12. package/data/llms/headless/components/badge/api.json +68 -0
  13. package/data/llms/headless/components/badge.md +150 -0
  14. package/data/llms/headless/components/breadcrumb/api.json +142 -0
  15. package/data/llms/headless/components/breadcrumb.md +149 -0
  16. package/data/llms/headless/components/button/api.json +62 -0
  17. package/data/llms/headless/components/button.md +73 -0
  18. package/data/llms/headless/components/card/api.json +36 -0
  19. package/data/llms/headless/components/card.md +96 -0
  20. package/data/llms/headless/components/carousel/api.json +793 -0
  21. package/data/llms/headless/components/carousel.md +196 -0
  22. package/data/llms/headless/components/checkbox/api.json +593 -0
  23. package/data/llms/headless/components/checkbox.md +184 -0
  24. package/data/llms/headless/components/chip/api.json +107 -0
  25. package/data/llms/headless/components/chip.md +141 -0
  26. package/data/llms/headless/components/collapsible/api.json +301 -0
  27. package/data/llms/headless/components/collapsible.md +136 -0
  28. package/data/llms/headless/components/compare/api.json +533 -0
  29. package/data/llms/headless/components/compare.md +142 -0
  30. package/data/llms/headless/components/contextmenu/api.json +495 -0
  31. package/data/llms/headless/components/contextmenu.md +282 -0
  32. package/data/llms/headless/components/datatable/api.json +1680 -0
  33. package/data/llms/headless/components/datatable.md +258 -0
  34. package/data/llms/headless/components/dataview/api.json +199 -0
  35. package/data/llms/headless/components/dataview.md +147 -0
  36. package/data/llms/headless/components/datepicker/api.json +2796 -0
  37. package/data/llms/headless/components/datepicker.md +456 -0
  38. package/data/llms/headless/components/dialog/api.json +626 -0
  39. package/data/llms/headless/components/dialog.md +280 -0
  40. package/data/llms/headless/components/divider/api.json +130 -0
  41. package/data/llms/headless/components/divider.md +92 -0
  42. package/data/llms/headless/components/drawer/api.json +425 -0
  43. package/data/llms/headless/components/drawer.md +220 -0
  44. package/data/llms/headless/components/fieldset/api.json +195 -0
  45. package/data/llms/headless/components/fieldset.md +154 -0
  46. package/data/llms/headless/components/fileupload/api.json +905 -0
  47. package/data/llms/headless/components/fileupload.md +323 -0
  48. package/data/llms/headless/components/floatlabel/api.json +36 -0
  49. package/data/llms/headless/components/floatlabel.md +19 -0
  50. package/data/llms/headless/components/fluid/api.json +36 -0
  51. package/data/llms/headless/components/fluid.md +19 -0
  52. package/data/llms/headless/components/focustrap/api.json +135 -0
  53. package/data/llms/headless/components/focustrap.md +125 -0
  54. package/data/llms/headless/components/gallery/api.json +1349 -0
  55. package/data/llms/headless/components/gallery.md +355 -0
  56. package/data/llms/headless/components/iconfield/api.json +62 -0
  57. package/data/llms/headless/components/iconfield.md +19 -0
  58. package/data/llms/headless/components/iftalabel/api.json +62 -0
  59. package/data/llms/headless/components/iftalabel.md +19 -0
  60. package/data/llms/headless/components/inplace/api.json +340 -0
  61. package/data/llms/headless/components/inplace.md +153 -0
  62. package/data/llms/headless/components/inputcolor/api.json +469 -0
  63. package/data/llms/headless/components/inputcolor.md +253 -0
  64. package/data/llms/headless/components/inputgroup/api.json +62 -0
  65. package/data/llms/headless/components/inputgroup.md +19 -0
  66. package/data/llms/headless/components/inputnumber/api.json +554 -0
  67. package/data/llms/headless/components/inputnumber.md +167 -0
  68. package/data/llms/headless/components/inputotp/api.json +276 -0
  69. package/data/llms/headless/components/inputotp.md +130 -0
  70. package/data/llms/headless/components/inputpassword/api.json +180 -0
  71. package/data/llms/headless/components/inputpassword.md +117 -0
  72. package/data/llms/headless/components/inputtags/api.json +497 -0
  73. package/data/llms/headless/components/inputtags.md +298 -0
  74. package/data/llms/headless/components/inputtext/api.json +81 -0
  75. package/data/llms/headless/components/inputtext.md +109 -0
  76. package/data/llms/headless/components/knob/api.json +429 -0
  77. package/data/llms/headless/components/knob.md +151 -0
  78. package/data/llms/headless/components/label/api.json +62 -0
  79. package/data/llms/headless/components/label.md +19 -0
  80. package/data/llms/headless/components/listbox/api.json +814 -0
  81. package/data/llms/headless/components/listbox.md +194 -0
  82. package/data/llms/headless/components/menu/api.json +1247 -0
  83. package/data/llms/headless/components/menu.md +283 -0
  84. package/data/llms/headless/components/message/api.json +131 -0
  85. package/data/llms/headless/components/message.md +143 -0
  86. package/data/llms/headless/components/metergroup/api.json +266 -0
  87. package/data/llms/headless/components/metergroup.md +129 -0
  88. package/data/llms/headless/components/motion/api.json +237 -0
  89. package/data/llms/headless/components/motion.md +160 -0
  90. package/data/llms/headless/components/navigationmenu/api.json +220 -0
  91. package/data/llms/headless/components/navigationmenu.md +166 -0
  92. package/data/llms/headless/components/orderlist/api.json +196 -0
  93. package/data/llms/headless/components/orderlist.md +221 -0
  94. package/data/llms/headless/components/organizationchart/api.json +372 -0
  95. package/data/llms/headless/components/organizationchart.md +254 -0
  96. package/data/llms/headless/components/paginator/api.json +311 -0
  97. package/data/llms/headless/components/paginator.md +187 -0
  98. package/data/llms/headless/components/panel/api.json +195 -0
  99. package/data/llms/headless/components/panel.md +150 -0
  100. package/data/llms/headless/components/picklist/api.json +293 -0
  101. package/data/llms/headless/components/picklist.md +270 -0
  102. package/data/llms/headless/components/popover/api.json +405 -0
  103. package/data/llms/headless/components/popover.md +301 -0
  104. package/data/llms/headless/components/portal/api.json +56 -0
  105. package/data/llms/headless/components/portal.md +102 -0
  106. package/data/llms/headless/components/positioner/api.json +165 -0
  107. package/data/llms/headless/components/positioner.md +181 -0
  108. package/data/llms/headless/components/progressbar/api.json +87 -0
  109. package/data/llms/headless/components/progressbar.md +122 -0
  110. package/data/llms/headless/components/progressspinner/api.json +337 -0
  111. package/data/llms/headless/components/progressspinner.md +128 -0
  112. package/data/llms/headless/components/radiobutton/api.json +569 -0
  113. package/data/llms/headless/components/radiobutton.md +195 -0
  114. package/data/llms/headless/components/rating/api.json +347 -0
  115. package/data/llms/headless/components/rating.md +181 -0
  116. package/data/llms/headless/components/scrollarea/api.json +730 -0
  117. package/data/llms/headless/components/scrollarea.md +232 -0
  118. package/data/llms/headless/components/select/api.json +829 -0
  119. package/data/llms/headless/components/select.md +262 -0
  120. package/data/llms/headless/components/sidebar/api.json +433 -0
  121. package/data/llms/headless/components/sidebar.md +266 -0
  122. package/data/llms/headless/components/skeleton/api.json +68 -0
  123. package/data/llms/headless/components/skeleton.md +95 -0
  124. package/data/llms/headless/components/slider/api.json +559 -0
  125. package/data/llms/headless/components/slider.md +158 -0
  126. package/data/llms/headless/components/speeddial/api.json +459 -0
  127. package/data/llms/headless/components/speeddial.md +181 -0
  128. package/data/llms/headless/components/splitter/api.json +582 -0
  129. package/data/llms/headless/components/splitter.md +159 -0
  130. package/data/llms/headless/components/stepper/api.json +385 -0
  131. package/data/llms/headless/components/stepper.md +183 -0
  132. package/data/llms/headless/components/styleclass/api.json +134 -0
  133. package/data/llms/headless/components/styleclass.md +129 -0
  134. package/data/llms/headless/components/tabs/api.json +336 -0
  135. package/data/llms/headless/components/tabs.md +158 -0
  136. package/data/llms/headless/components/tag/api.json +62 -0
  137. package/data/llms/headless/components/tag.md +121 -0
  138. package/data/llms/headless/components/terminal/api.json +117 -0
  139. package/data/llms/headless/components/terminal.md +183 -0
  140. package/data/llms/headless/components/textarea/api.json +81 -0
  141. package/data/llms/headless/components/textarea.md +110 -0
  142. package/data/llms/headless/components/timeline/api.json +270 -0
  143. package/data/llms/headless/components/timeline.md +117 -0
  144. package/data/llms/headless/components/toast/api.json +455 -0
  145. package/data/llms/headless/components/toast.md +277 -0
  146. package/data/llms/headless/components/togglebutton/api.json +357 -0
  147. package/data/llms/headless/components/togglebutton.md +183 -0
  148. package/data/llms/headless/components/toggleswitch/api.json +326 -0
  149. package/data/llms/headless/components/toggleswitch.md +164 -0
  150. package/data/llms/headless/components/toolbar/api.json +68 -0
  151. package/data/llms/headless/components/toolbar.md +96 -0
  152. package/data/llms/headless/components/tooltip/api.json +478 -0
  153. package/data/llms/headless/components/tooltip.md +233 -0
  154. package/data/llms/headless/components/tree/api.json +1297 -0
  155. package/data/llms/headless/components/tree.md +297 -0
  156. package/data/llms/headless/components/treetable/api.json +1680 -0
  157. package/data/llms/headless/components/treetable.md +177 -0
  158. package/data/llms/headless/guides/ai/llms.md +25 -0
  159. package/data/llms/headless/guides/installation.md +126 -0
  160. package/data/llms/headless/guides/introduction.md +20 -0
  161. package/data/llms/headless/guides/misc/accessibility.md +228 -0
  162. package/data/llms/headless/llms.md +25 -0
  163. package/data/llms/headless/resources/introduction.md +15 -0
  164. package/data/llms/hooks/gettingstarted/introduction.md +34 -0
  165. package/data/llms/hooks/gettingstarted/setup.md +54 -0
  166. package/data/llms/hooks/use-attr-selector.md +25 -0
  167. package/data/llms/hooks/use-controlled-state.md +31 -0
  168. package/data/llms/hooks/use-event-listener.md +37 -0
  169. package/data/llms/hooks/use-filter.md +312 -0
  170. package/data/llms/hooks/use-hot-key.md +40 -0
  171. package/data/llms/hooks/use-id.md +24 -0
  172. package/data/llms/hooks/use-intersection-observer.md +42 -0
  173. package/data/llms/hooks/use-is-mobile.md +24 -0
  174. package/data/llms/hooks/use-key-filter.md +139 -0
  175. package/data/llms/hooks/use-local-storage.md +28 -0
  176. package/data/llms/hooks/use-mask.md +53 -0
  177. package/data/llms/hooks/use-match-media.md +28 -0
  178. package/data/llms/hooks/use-mount-effect.md +25 -0
  179. package/data/llms/hooks/use-mounted.md +36 -0
  180. package/data/llms/hooks/use-number-formatter.md +48 -0
  181. package/data/llms/hooks/use-presence.md +44 -0
  182. package/data/llms/hooks/use-previous.md +28 -0
  183. package/data/llms/hooks/use-props.md +37 -0
  184. package/data/llms/hooks/use-queue-task.md +29 -0
  185. package/data/llms/hooks/use-scrolltop.md +87 -0
  186. package/data/llms/hooks/use-sortable-list.md +226 -0
  187. package/data/llms/hooks/use-tree-filter.md +216 -0
  188. package/data/llms/hooks/use-unmount-effect.md +23 -0
  189. package/data/llms/hooks/use-update-effect.md +27 -0
  190. package/data/llms/hooks/use-view-transition.md +31 -0
  191. package/data/llms/hooks/use-visibility-change.md +30 -0
  192. package/data/llms/llms-full.txt +125291 -0
  193. package/data/llms/llms.txt +379 -0
  194. package/data/llms/manifest.json +12409 -0
  195. package/data/llms/mcp-data.json +14481 -0
  196. package/data/llms/primitive/add-ons/introduction.md +16 -0
  197. package/data/llms/primitive/components/accordion/api.json +1411 -0
  198. package/data/llms/primitive/components/accordion.md +231 -0
  199. package/data/llms/primitive/components/animateonscroll/api.json +193 -0
  200. package/data/llms/primitive/components/animateonscroll.md +91 -0
  201. package/data/llms/primitive/components/autocomplete/api.json +3167 -0
  202. package/data/llms/primitive/components/autocomplete.md +344 -0
  203. package/data/llms/primitive/components/avatar/api.json +703 -0
  204. package/data/llms/primitive/components/avatar.md +134 -0
  205. package/data/llms/primitive/components/badge/api.json +363 -0
  206. package/data/llms/primitive/components/badge.md +118 -0
  207. package/data/llms/primitive/components/breadcrumb/api.json +1162 -0
  208. package/data/llms/primitive/components/breadcrumb.md +196 -0
  209. package/data/llms/primitive/components/button/api.json +246 -0
  210. package/data/llms/primitive/components/button.md +114 -0
  211. package/data/llms/primitive/components/buttongroup/api.json +168 -0
  212. package/data/llms/primitive/components/buttongroup.md +43 -0
  213. package/data/llms/primitive/components/card/api.json +1252 -0
  214. package/data/llms/primitive/components/card.md +159 -0
  215. package/data/llms/primitive/components/carousel/api.json +1374 -0
  216. package/data/llms/primitive/components/carousel.md +220 -0
  217. package/data/llms/primitive/components/checkbox/api.json +697 -0
  218. package/data/llms/primitive/components/checkbox.md +160 -0
  219. package/data/llms/primitive/components/checkboxgroup/api.json +252 -0
  220. package/data/llms/primitive/components/checkboxgroup.md +58 -0
  221. package/data/llms/primitive/components/chip/api.json +853 -0
  222. package/data/llms/primitive/components/chip.md +135 -0
  223. package/data/llms/primitive/components/collapsible/api.json +581 -0
  224. package/data/llms/primitive/components/collapsible.md +133 -0
  225. package/data/llms/primitive/components/compare/api.json +909 -0
  226. package/data/llms/primitive/components/compare.md +156 -0
  227. package/data/llms/primitive/components/contextmenu/api.json +3454 -0
  228. package/data/llms/primitive/components/contextmenu.md +483 -0
  229. package/data/llms/primitive/components/datatable/api.json +7832 -0
  230. package/data/llms/primitive/components/datatable.md +561 -0
  231. package/data/llms/primitive/components/dataview/api.json +819 -0
  232. package/data/llms/primitive/components/dataview.md +163 -0
  233. package/data/llms/primitive/components/datepicker/api.json +9055 -0
  234. package/data/llms/primitive/components/datepicker.md +760 -0
  235. package/data/llms/primitive/components/dialog/api.json +2491 -0
  236. package/data/llms/primitive/components/dialog.md +276 -0
  237. package/data/llms/primitive/components/divider/api.json +214 -0
  238. package/data/llms/primitive/components/divider.md +96 -0
  239. package/data/llms/primitive/components/drawer/api.json +1879 -0
  240. package/data/llms/primitive/components/drawer.md +220 -0
  241. package/data/llms/primitive/components/fieldset/api.json +1116 -0
  242. package/data/llms/primitive/components/fieldset.md +183 -0
  243. package/data/llms/primitive/components/fileupload/api.json +2445 -0
  244. package/data/llms/primitive/components/fileupload.md +282 -0
  245. package/data/llms/primitive/components/floatlabel/api.json +176 -0
  246. package/data/llms/primitive/components/floatlabel.md +47 -0
  247. package/data/llms/primitive/components/focustrap/api.json +241 -0
  248. package/data/llms/primitive/components/focustrap.md +93 -0
  249. package/data/llms/primitive/components/gallery/api.json +3622 -0
  250. package/data/llms/primitive/components/gallery.md +387 -0
  251. package/data/llms/primitive/components/iconfield/api.json +322 -0
  252. package/data/llms/primitive/components/iconfield.md +53 -0
  253. package/data/llms/primitive/components/iftalabel/api.json +177 -0
  254. package/data/llms/primitive/components/iftalabel.md +47 -0
  255. package/data/llms/primitive/components/inplace/api.json +783 -0
  256. package/data/llms/primitive/components/inplace.md +141 -0
  257. package/data/llms/primitive/components/inputcolor/api.json +2211 -0
  258. package/data/llms/primitive/components/inputcolor.md +295 -0
  259. package/data/llms/primitive/components/inputnumber/api.json +469 -0
  260. package/data/llms/primitive/components/inputnumber.md +99 -0
  261. package/data/llms/primitive/components/inputotp/api.json +469 -0
  262. package/data/llms/primitive/components/inputotp.md +121 -0
  263. package/data/llms/primitive/components/inputpassword/api.json +278 -0
  264. package/data/llms/primitive/components/inputpassword.md +84 -0
  265. package/data/llms/primitive/components/inputtags/api.json +407 -0
  266. package/data/llms/primitive/components/inputtags.md +243 -0
  267. package/data/llms/primitive/components/inputtext/api.json +207 -0
  268. package/data/llms/primitive/components/inputtext.md +81 -0
  269. package/data/llms/primitive/components/knob/api.json +841 -0
  270. package/data/llms/primitive/components/knob.md +148 -0
  271. package/data/llms/primitive/components/label/api.json +177 -0
  272. package/data/llms/primitive/components/label.md +44 -0
  273. package/data/llms/primitive/components/listbox/api.json +1741 -0
  274. package/data/llms/primitive/components/listbox.md +206 -0
  275. package/data/llms/primitive/components/menu/api.json +3836 -0
  276. package/data/llms/primitive/components/menu.md +479 -0
  277. package/data/llms/primitive/components/message/api.json +863 -0
  278. package/data/llms/primitive/components/message.md +151 -0
  279. package/data/llms/primitive/components/metergroup/api.json +1222 -0
  280. package/data/llms/primitive/components/metergroup.md +209 -0
  281. package/data/llms/primitive/components/motion.md +112 -0
  282. package/data/llms/primitive/components/navigationmenu/api.json +298 -0
  283. package/data/llms/primitive/components/navigationmenu.md +184 -0
  284. package/data/llms/primitive/components/organizationchart.md +133 -0
  285. package/data/llms/primitive/components/paginator/api.json +1637 -0
  286. package/data/llms/primitive/components/paginator.md +223 -0
  287. package/data/llms/primitive/components/panel/api.json +1270 -0
  288. package/data/llms/primitive/components/panel.md +186 -0
  289. package/data/llms/primitive/components/popover/api.json +2281 -0
  290. package/data/llms/primitive/components/popover.md +277 -0
  291. package/data/llms/primitive/components/portal/api.json +176 -0
  292. package/data/llms/primitive/components/portal.md +79 -0
  293. package/data/llms/primitive/components/progressbar/api.json +857 -0
  294. package/data/llms/primitive/components/progressbar.md +153 -0
  295. package/data/llms/primitive/components/progressspinner/api.json +725 -0
  296. package/data/llms/primitive/components/progressspinner.md +133 -0
  297. package/data/llms/primitive/components/radiobutton/api.json +929 -0
  298. package/data/llms/primitive/components/radiobutton.md +201 -0
  299. package/data/llms/primitive/components/rating/api.json +878 -0
  300. package/data/llms/primitive/components/rating.md +160 -0
  301. package/data/llms/primitive/components/scrollarea/api.json +1187 -0
  302. package/data/llms/primitive/components/scrollarea.md +255 -0
  303. package/data/llms/primitive/components/select/api.json +3167 -0
  304. package/data/llms/primitive/components/select.md +351 -0
  305. package/data/llms/primitive/components/sidebar/api.json +3699 -0
  306. package/data/llms/primitive/components/sidebar.md +444 -0
  307. package/data/llms/primitive/components/skeleton/api.json +213 -0
  308. package/data/llms/primitive/components/skeleton.md +80 -0
  309. package/data/llms/primitive/components/slider/api.json +1066 -0
  310. package/data/llms/primitive/components/slider.md +161 -0
  311. package/data/llms/primitive/components/speeddial/api.json +1002 -0
  312. package/data/llms/primitive/components/speeddial.md +197 -0
  313. package/data/llms/primitive/components/splitter/api.json +901 -0
  314. package/data/llms/primitive/components/splitter.md +137 -0
  315. package/data/llms/primitive/components/stepper/api.json +2102 -0
  316. package/data/llms/primitive/components/stepper.md +253 -0
  317. package/data/llms/primitive/components/styleclass.md +399 -0
  318. package/data/llms/primitive/components/tabs/api.json +1705 -0
  319. package/data/llms/primitive/components/tabs.md +200 -0
  320. package/data/llms/primitive/components/tag/api.json +189 -0
  321. package/data/llms/primitive/components/tag.md +100 -0
  322. package/data/llms/primitive/components/terminal/api.json +1709 -0
  323. package/data/llms/primitive/components/terminal.md +227 -0
  324. package/data/llms/primitive/components/textarea/api.json +213 -0
  325. package/data/llms/primitive/components/textarea.md +83 -0
  326. package/data/llms/primitive/components/timeline/api.json +1180 -0
  327. package/data/llms/primitive/components/timeline.md +185 -0
  328. package/data/llms/primitive/components/toast/api.json +2102 -0
  329. package/data/llms/primitive/components/toast.md +291 -0
  330. package/data/llms/primitive/components/togglebutton/api.json +433 -0
  331. package/data/llms/primitive/components/togglebutton.md +161 -0
  332. package/data/llms/primitive/components/togglebuttongroup/api.json +276 -0
  333. package/data/llms/primitive/components/togglebuttongroup.md +61 -0
  334. package/data/llms/primitive/components/toggleswitch/api.json +681 -0
  335. package/data/llms/primitive/components/toggleswitch.md +149 -0
  336. package/data/llms/primitive/components/toolbar/api.json +646 -0
  337. package/data/llms/primitive/components/toolbar.md +126 -0
  338. package/data/llms/primitive/components/tooltip/api.json +1534 -0
  339. package/data/llms/primitive/components/tooltip.md +202 -0
  340. package/data/llms/primitive/components/tree/api.json +2952 -0
  341. package/data/llms/primitive/components/tree.md +292 -0
  342. package/data/llms/primitive/components/treetable.md +187 -0
  343. package/data/llms/primitive/components/visuallyhidden/api.json +186 -0
  344. package/data/llms/primitive/components/visuallyhidden.md +87 -0
  345. package/data/llms/primitive/guides/ai/llms.md +25 -0
  346. package/data/llms/primitive/guides/icons/customicons.md +47 -0
  347. package/data/llms/primitive/guides/icons/primeicons.md +112 -0
  348. package/data/llms/primitive/guides/installation.md +115 -0
  349. package/data/llms/primitive/guides/introduction.md +20 -0
  350. package/data/llms/primitive/guides/misc/accessibility.md +215 -0
  351. package/data/llms/primitive/guides/misc/passthrough.md +95 -0
  352. package/data/llms/primitive/guides/misc/rtl.md +27 -0
  353. package/data/llms/primitive/llms.md +25 -0
  354. package/data/llms/primitive/resources/introduction.md +15 -0
  355. package/data/llms/styled/add-ons/introduction.md +16 -0
  356. package/data/llms/styled/components/accordion.md +735 -0
  357. package/data/llms/styled/components/animateonscroll.md +264 -0
  358. package/data/llms/styled/components/autocomplete.md +1597 -0
  359. package/data/llms/styled/components/avatar.md +313 -0
  360. package/data/llms/styled/components/badge.md +213 -0
  361. package/data/llms/styled/components/breadcrumb.md +461 -0
  362. package/data/llms/styled/components/button/api.json +246 -0
  363. package/data/llms/styled/components/button.md +641 -0
  364. package/data/llms/styled/components/buttongroup.md +614 -0
  365. package/data/llms/styled/components/card.md +228 -0
  366. package/data/llms/styled/components/carousel.md +388 -0
  367. package/data/llms/styled/components/checkbox.md +329 -0
  368. package/data/llms/styled/components/checkboxgroup.md +619 -0
  369. package/data/llms/styled/components/chip.md +300 -0
  370. package/data/llms/styled/components/compare.md +271 -0
  371. package/data/llms/styled/components/contextmenu.md +550 -0
  372. package/data/llms/styled/components/datatable.md +8259 -0
  373. package/data/llms/styled/components/dataview.md +907 -0
  374. package/data/llms/styled/components/datepicker.md +2807 -0
  375. package/data/llms/styled/components/dialog.md +1047 -0
  376. package/data/llms/styled/components/divider.md +207 -0
  377. package/data/llms/styled/components/drawer.md +470 -0
  378. package/data/llms/styled/components/fieldset.md +334 -0
  379. package/data/llms/styled/components/fileupload.md +747 -0
  380. package/data/llms/styled/components/floatlabel/api.json +210 -0
  381. package/data/llms/styled/components/floatlabel.md +231 -0
  382. package/data/llms/styled/components/fluid/api.json +204 -0
  383. package/data/llms/styled/components/fluid.md +177 -0
  384. package/data/llms/styled/components/focustrap.md +203 -0
  385. package/data/llms/styled/components/gallery.md +553 -0
  386. package/data/llms/styled/components/iconfield/api.json +382 -0
  387. package/data/llms/styled/components/iconfield.md +385 -0
  388. package/data/llms/styled/components/iftalabel/api.json +237 -0
  389. package/data/llms/styled/components/iftalabel.md +158 -0
  390. package/data/llms/styled/components/inplace.md +312 -0
  391. package/data/llms/styled/components/inputcolor.md +674 -0
  392. package/data/llms/styled/components/inputgroup/api.json +399 -0
  393. package/data/llms/styled/components/inputgroup.md +604 -0
  394. package/data/llms/styled/components/inputmask.md +282 -0
  395. package/data/llms/styled/components/inputnumber.md +563 -0
  396. package/data/llms/styled/components/inputotp.md +335 -0
  397. package/data/llms/styled/components/inputpassword.md +630 -0
  398. package/data/llms/styled/components/inputtags.md +727 -0
  399. package/data/llms/styled/components/inputtext.md +190 -0
  400. package/data/llms/styled/components/keyfilter.md +289 -0
  401. package/data/llms/styled/components/knob.md +305 -0
  402. package/data/llms/styled/components/label/api.json +237 -0
  403. package/data/llms/styled/components/label.md +224 -0
  404. package/data/llms/styled/components/listbox.md +807 -0
  405. package/data/llms/styled/components/menu.md +1175 -0
  406. package/data/llms/styled/components/message.md +570 -0
  407. package/data/llms/styled/components/metergroup.md +449 -0
  408. package/data/llms/styled/components/navigationmenu.md +926 -0
  409. package/data/llms/styled/components/orderlist.md +519 -0
  410. package/data/llms/styled/components/organizationchart/api.json +1457 -0
  411. package/data/llms/styled/components/organizationchart.md +791 -0
  412. package/data/llms/styled/components/overlaymanager.md +519 -0
  413. package/data/llms/styled/components/paginator.md +506 -0
  414. package/data/llms/styled/components/panel.md +394 -0
  415. package/data/llms/styled/components/picklist.md +1004 -0
  416. package/data/llms/styled/components/popover.md +372 -0
  417. package/data/llms/styled/components/progressbar.md +438 -0
  418. package/data/llms/styled/components/progressspinner.md +128 -0
  419. package/data/llms/styled/components/radiobutton.md +488 -0
  420. package/data/llms/styled/components/rating/api.json +766 -0
  421. package/data/llms/styled/components/rating.md +518 -0
  422. package/data/llms/styled/components/scrollarea.md +627 -0
  423. package/data/llms/styled/components/select.md +2122 -0
  424. package/data/llms/styled/components/sidebar.md +1587 -0
  425. package/data/llms/styled/components/skeleton.md +226 -0
  426. package/data/llms/styled/components/slider.md +453 -0
  427. package/data/llms/styled/components/speeddial.md +723 -0
  428. package/data/llms/styled/components/splitter.md +536 -0
  429. package/data/llms/styled/components/stepper.md +614 -0
  430. package/data/llms/styled/components/tabs.md +543 -0
  431. package/data/llms/styled/components/tag.md +263 -0
  432. package/data/llms/styled/components/terminal.md +543 -0
  433. package/data/llms/styled/components/textarea.md +257 -0
  434. package/data/llms/styled/components/timeline.md +620 -0
  435. package/data/llms/styled/components/toast.md +1013 -0
  436. package/data/llms/styled/components/togglebutton.md +287 -0
  437. package/data/llms/styled/components/togglebuttongroup.md +328 -0
  438. package/data/llms/styled/components/toggleswitch.md +262 -0
  439. package/data/llms/styled/components/toolbar.md +187 -0
  440. package/data/llms/styled/components/tooltip.md +430 -0
  441. package/data/llms/styled/components/tree.md +1386 -0
  442. package/data/llms/styled/components/treetable.md +6842 -0
  443. package/data/llms/styled/guides/ai/llms.md +25 -0
  444. package/data/llms/styled/guides/configuration.md +151 -0
  445. package/data/llms/styled/guides/icons/customicons.md +47 -0
  446. package/data/llms/styled/guides/icons/primeicons.md +112 -0
  447. package/data/llms/styled/guides/installation/astro.md +97 -0
  448. package/data/llms/styled/guides/installation/manual.md +3 -0
  449. package/data/llms/styled/guides/installation/nextjs.md +129 -0
  450. package/data/llms/styled/guides/installation/react-router.md +88 -0
  451. package/data/llms/styled/guides/installation/tanstack.md +92 -0
  452. package/data/llms/styled/guides/installation/vite.md +91 -0
  453. package/data/llms/styled/guides/installation.md +42 -0
  454. package/data/llms/styled/guides/introduction.md +20 -0
  455. package/data/llms/styled/guides/misc/accessibility.md +211 -0
  456. package/data/llms/styled/guides/misc/animations.md +389 -0
  457. package/data/llms/styled/guides/misc/passthrough.md +95 -0
  458. package/data/llms/styled/guides/misc/rtl.md +27 -0
  459. package/data/llms/styled/guides/theming/styled.md +779 -0
  460. package/data/llms/styled/guides/theming/tailwind.md +473 -0
  461. package/data/llms/styled/guides/theming/unstyled.md +115 -0
  462. package/data/llms/styled/resources/introduction.md +15 -0
  463. package/data/llms/tailwind/add-ons/introduction.md +16 -0
  464. package/data/llms/tailwind/components/accordion.md +383 -0
  465. package/data/llms/tailwind/components/autocomplete.md +1346 -0
  466. package/data/llms/tailwind/components/avatar.md +305 -0
  467. package/data/llms/tailwind/components/badge.md +207 -0
  468. package/data/llms/tailwind/components/breadcrumb.md +387 -0
  469. package/data/llms/tailwind/components/button/api.json +246 -0
  470. package/data/llms/tailwind/components/button.md +617 -0
  471. package/data/llms/tailwind/components/buttongroup.md +599 -0
  472. package/data/llms/tailwind/components/card.md +224 -0
  473. package/data/llms/tailwind/components/carousel.md +329 -0
  474. package/data/llms/tailwind/components/checkbox.md +179 -0
  475. package/data/llms/tailwind/components/checkboxgroup.md +279 -0
  476. package/data/llms/tailwind/components/chip.md +304 -0
  477. package/data/llms/tailwind/components/compare.md +295 -0
  478. package/data/llms/tailwind/components/contextmenu.md +415 -0
  479. package/data/llms/tailwind/components/datatable.md +4062 -0
  480. package/data/llms/tailwind/components/dataview.md +864 -0
  481. package/data/llms/tailwind/components/datepicker.md +823 -0
  482. package/data/llms/tailwind/components/dialog.md +1216 -0
  483. package/data/llms/tailwind/components/divider.md +205 -0
  484. package/data/llms/tailwind/components/drawer.md +500 -0
  485. package/data/llms/tailwind/components/fieldset.md +326 -0
  486. package/data/llms/tailwind/components/fluid.md +117 -0
  487. package/data/llms/tailwind/components/iconfield.md +197 -0
  488. package/data/llms/tailwind/components/inplace.md +324 -0
  489. package/data/llms/tailwind/components/inputcolor.md +493 -0
  490. package/data/llms/tailwind/components/inputgroup.md +375 -0
  491. package/data/llms/tailwind/components/inputnumber.md +463 -0
  492. package/data/llms/tailwind/components/inputotp.md +255 -0
  493. package/data/llms/tailwind/components/inputpassword.md +543 -0
  494. package/data/llms/tailwind/components/inputtext.md +141 -0
  495. package/data/llms/tailwind/components/label.md +100 -0
  496. package/data/llms/tailwind/components/listbox.md +886 -0
  497. package/data/llms/tailwind/components/menu.md +1049 -0
  498. package/data/llms/tailwind/components/message.md +575 -0
  499. package/data/llms/tailwind/components/metergroup.md +510 -0
  500. package/data/llms/tailwind/components/navigationmenu.md +528 -0
  501. package/data/llms/tailwind/components/overlaymanager.md +567 -0
  502. package/data/llms/tailwind/components/paginator.md +306 -0
  503. package/data/llms/tailwind/components/panel.md +395 -0
  504. package/data/llms/tailwind/components/popover.md +424 -0
  505. package/data/llms/tailwind/components/progressbar.md +313 -0
  506. package/data/llms/tailwind/components/radiobutton.md +366 -0
  507. package/data/llms/tailwind/components/rating.md +300 -0
  508. package/data/llms/tailwind/components/scrollarea.md +638 -0
  509. package/data/llms/tailwind/components/select.md +1220 -0
  510. package/data/llms/tailwind/components/sidebar.md +1511 -0
  511. package/data/llms/tailwind/components/skeleton.md +236 -0
  512. package/data/llms/tailwind/components/slider.md +291 -0
  513. package/data/llms/tailwind/components/splitter.md +546 -0
  514. package/data/llms/tailwind/components/tabs.md +462 -0
  515. package/data/llms/tailwind/components/tag.md +255 -0
  516. package/data/llms/tailwind/components/textarea.md +170 -0
  517. package/data/llms/tailwind/components/timeline.md +656 -0
  518. package/data/llms/tailwind/components/toast.md +246 -0
  519. package/data/llms/tailwind/components/togglebutton.md +264 -0
  520. package/data/llms/tailwind/components/togglebuttongroup.md +262 -0
  521. package/data/llms/tailwind/components/toggleswitch.md +203 -0
  522. package/data/llms/tailwind/components/toolbar.md +192 -0
  523. package/data/llms/tailwind/components/tooltip.md +449 -0
  524. package/data/llms/tailwind/guides/ai/llms.md +25 -0
  525. package/data/llms/tailwind/guides/icons/customicons.md +47 -0
  526. package/data/llms/tailwind/guides/icons/primeicons.md +112 -0
  527. package/data/llms/tailwind/guides/installation/astro.md +165 -0
  528. package/data/llms/tailwind/guides/installation/manual.md +3 -0
  529. package/data/llms/tailwind/guides/installation/nextjs.md +169 -0
  530. package/data/llms/tailwind/guides/installation/react-router.md +157 -0
  531. package/data/llms/tailwind/guides/installation/tanstack.md +161 -0
  532. package/data/llms/tailwind/guides/installation/vite.md +160 -0
  533. package/data/llms/tailwind/guides/installation.md +42 -0
  534. package/data/llms/tailwind/guides/introduction.md +20 -0
  535. package/data/llms/tailwind/guides/misc/accessibility.md +205 -0
  536. package/data/llms/tailwind/guides/misc/passthrough.md +95 -0
  537. package/data/llms/tailwind/guides/misc/rtl.md +27 -0
  538. package/data/llms/tailwind/guides/theming/guide.md +179 -0
  539. package/data/llms/tailwind/guides/theming.md +191 -0
  540. package/data/llms/tailwind/llms.md +25 -0
  541. package/data/llms/tailwind/resources/introduction.md +15 -0
  542. package/data/manifest.json +12409 -0
  543. package/data/mcp-data.json +14481 -0
  544. package/dist/index.d.ts +9 -0
  545. package/dist/index.js +2 -0
  546. package/package.json +61 -0
@@ -0,0 +1,1597 @@
1
+ # AutoComplete
2
+
3
+ AutoComplete is an input component that provides real-time suggestions when being typed.
4
+
5
+ ```tsx
6
+ 'use client';
7
+ import { AutoComplete, type AutoCompleteCompleteEvent } from '@primereact/ui/autocomplete';
8
+ import { InputText } from '@primereact/ui/inputtext';
9
+ import { Label } from '@primereact/ui/label';
10
+ import * as React from 'react';
11
+
12
+ export default function Preview() {
13
+ const [filtered, setFiltered] = React.useState<string[]>([]);
14
+
15
+ const search = (event: AutoCompleteCompleteEvent) => {
16
+ const query = event.query.toLowerCase();
17
+
18
+ setFiltered(query ? options.filter((item) => item.toLowerCase().includes(query)) : [...options]);
19
+ };
20
+
21
+ return (
22
+ <div className="flex justify-center">
23
+ <div className="flex flex-col">
24
+ <Label>Search tutorials</Label>
25
+ <AutoComplete.Root options={filtered} onComplete={search} className="w-full md:w-72 mt-2">
26
+ <AutoComplete.Input as={InputText} placeholder="Search..." className="w-full" />
27
+ <AutoComplete.Portal>
28
+ <AutoComplete.Positioner>
29
+ <AutoComplete.Popup>
30
+ <AutoComplete.List style={{ maxHeight: '14rem' }}>
31
+ {filtered.map((item, index) => (
32
+ <AutoComplete.Option key={item} index={index} uKey={item}>
33
+ {item}
34
+ </AutoComplete.Option>
35
+ ))}
36
+ <AutoComplete.Empty className="text-sm">No results found</AutoComplete.Empty>
37
+ </AutoComplete.List>
38
+ </AutoComplete.Popup>
39
+ </AutoComplete.Positioner>
40
+ </AutoComplete.Portal>
41
+ </AutoComplete.Root>
42
+ <small className="text-surface-500 mt-1.5 opacity-75">
43
+ Type <em className="underline">react</em> to see suggestions
44
+ </small>
45
+ </div>
46
+ </div>
47
+ );
48
+ }
49
+
50
+ const options: string[] = [
51
+ 'responsive design fundamentals',
52
+ 'redux toolkit crash course',
53
+ 'real-time chat app tutorial',
54
+ 'reading json files in node',
55
+ 'react hooks tutorial',
56
+ 'react server components explained',
57
+ 'react vs vue 2024',
58
+ 'react native crash course',
59
+ 'react 19 new features',
60
+ 'react context api best practices',
61
+ 'react testing library guide',
62
+ 'react router v7 tutorial',
63
+ 'react performance optimization',
64
+ 'react suspense and lazy loading',
65
+ 'react state management comparison',
66
+ 'react form validation',
67
+ 'react design patterns',
68
+ 'react authentication tutorial',
69
+ 'react with typescript beginner',
70
+ 'react animation libraries',
71
+ 'react deploy to production'
72
+ ];
73
+ ```
74
+
75
+ ## Usage
76
+
77
+ ```tsx
78
+ import { AutoComplete } from '@primereact/ui/autocomplete';
79
+ ```
80
+
81
+ ```tsx
82
+ <AutoComplete.Root>
83
+ <AutoComplete.Input />
84
+ <AutoComplete.Clear />
85
+ <AutoComplete.Trigger>
86
+ <AutoComplete.Value />
87
+ <AutoComplete.Indicator />
88
+ </AutoComplete.Trigger>
89
+ <AutoComplete.Portal>
90
+ <AutoComplete.Positioner>
91
+ <AutoComplete.Popup>
92
+ <AutoComplete.Header />
93
+ <AutoComplete.List>
94
+ <AutoComplete.Option>
95
+ <AutoComplete.OptionIndicator />
96
+ </AutoComplete.Option>
97
+ </AutoComplete.List>
98
+ <AutoComplete.Empty />
99
+ <AutoComplete.Footer />
100
+ </AutoComplete.Popup>
101
+ </AutoComplete.Positioner>
102
+ </AutoComplete.Portal>
103
+ </AutoComplete.Root>
104
+ ```
105
+
106
+ ## Examples
107
+
108
+ ### Basic
109
+
110
+ An input that filters and suggests options as the user types.
111
+
112
+ ```tsx
113
+ 'use client';
114
+ import { AutoComplete, type AutoCompleteCompleteEvent } from '@primereact/ui/autocomplete';
115
+ import { InputText } from '@primereact/ui/inputtext';
116
+ import * as React from 'react';
117
+
118
+ interface Command {
119
+ label: string;
120
+ shortcut: string;
121
+ }
122
+
123
+ const commands: Command[] = [
124
+ { label: 'New File', shortcut: '⌘N' },
125
+ { label: 'Open File', shortcut: '⌘O' },
126
+ { label: 'Save', shortcut: '⌘S' },
127
+ { label: 'Save As', shortcut: '⇧⌘S' },
128
+ { label: 'Find', shortcut: '⌘F' },
129
+ { label: 'Replace', shortcut: '⌘H' },
130
+ { label: 'Go to Line', shortcut: '⌘G' },
131
+ { label: 'Toggle Sidebar', shortcut: '⌘B' },
132
+ { label: 'Split Editor', shortcut: '⌘\\' },
133
+ { label: 'Close Tab', shortcut: '⌘W' }
134
+ ];
135
+
136
+ export default function BasicDemo() {
137
+ const [filteredCommands, setFilteredCommands] = React.useState<Command[]>([]);
138
+
139
+ const search = (event: AutoCompleteCompleteEvent) => {
140
+ const query = event.query.toLowerCase();
141
+
142
+ setFilteredCommands(query ? commands.filter((cmd) => cmd.label.toLowerCase().includes(query)) : [...commands]);
143
+ };
144
+
145
+ return (
146
+ <div className="flex justify-center">
147
+ <AutoComplete.Root options={filteredCommands} optionLabel="label" onComplete={search} className="w-full md:w-56">
148
+ <AutoComplete.Input as={InputText} placeholder="Type a command..." className="w-full" />
149
+
150
+ <AutoComplete.Portal>
151
+ <AutoComplete.Positioner>
152
+ <AutoComplete.Popup>
153
+ <AutoComplete.List style={{ maxHeight: '14rem' }}>
154
+ {filteredCommands.map((cmd, index) => (
155
+ <AutoComplete.Option key={cmd.label} index={index} uKey={cmd.label}>
156
+ <div className="flex items-center justify-between w-full">
157
+ <span>{cmd.label}</span>
158
+ <kbd className="inline-flex items-center justify-center min-w-8 px-1.5 py-0.5 text-xs font-medium rounded bg-surface-100 dark:bg-surface-700 text-surface-600 dark:text-surface-300 border border-surface-200 dark:border-surface-600">
159
+ {cmd.shortcut}
160
+ </kbd>
161
+ </div>
162
+ </AutoComplete.Option>
163
+ ))}
164
+ <AutoComplete.Empty className="text-sm">No commands found</AutoComplete.Empty>
165
+ </AutoComplete.List>
166
+ </AutoComplete.Popup>
167
+ </AutoComplete.Positioner>
168
+ </AutoComplete.Portal>
169
+ </AutoComplete.Root>
170
+ </div>
171
+ );
172
+ }
173
+ ```
174
+
175
+ ### Trigger
176
+
177
+ Use `AutoComplete.Trigger` inside the root to display a trigger toggle button that opens the suggestion list.
178
+
179
+ ```tsx
180
+ 'use client';
181
+ import { ChevronDown } from '@primeicons/react/chevron-down';
182
+ import { AutoComplete, type AutoCompleteCompleteEvent } from '@primereact/ui/autocomplete';
183
+ import { InputGroup } from '@primereact/ui/inputgroup';
184
+ import { InputText } from '@primereact/ui/inputtext';
185
+ import * as React from 'react';
186
+
187
+ export default function TriggerDemo() {
188
+ const [items, setItems] = React.useState<string[] | number[]>([...Array(10).keys()]);
189
+
190
+ const search = (event: AutoCompleteCompleteEvent) => {
191
+ setItems(event.query ? [...Array(10).keys()].map((item) => event.query + '-' + item) : [...Array(10).keys()]);
192
+ };
193
+
194
+ return (
195
+ <div className="flex justify-center">
196
+ <AutoComplete.Root options={items} onComplete={search}>
197
+ <InputGroup.Root>
198
+ <AutoComplete.Input as={InputText} />
199
+ <InputGroup.Addon className="p-0">
200
+ <AutoComplete.Trigger className="w-full h-full flex items-center justify-center">
201
+ <ChevronDown />
202
+ </AutoComplete.Trigger>
203
+ </InputGroup.Addon>
204
+ </InputGroup.Root>
205
+
206
+ <AutoComplete.Portal>
207
+ <AutoComplete.Positioner>
208
+ <AutoComplete.Popup>
209
+ <AutoComplete.List style={{ maxHeight: '14rem' }} />
210
+ </AutoComplete.Popup>
211
+ </AutoComplete.Positioner>
212
+ </AutoComplete.Portal>
213
+ </AutoComplete.Root>
214
+ </div>
215
+ );
216
+ }
217
+ ```
218
+
219
+ ### Chips
220
+
221
+ Use `AutoComplete.Input` with `AutoComplete.Value` inside `AutoComplete.Trigger` to compose a chip-based tag input. Selected items are displayed as removable chips inside the value area while the input remains editable for searching.
222
+
223
+ ```tsx
224
+ 'use client';
225
+ import { Times } from '@primeicons/react/times';
226
+ import {
227
+ AutoComplete,
228
+ type AutoCompleteCompleteEvent,
229
+ type AutoCompleteInputValueChangeEvent,
230
+ type AutoCompleteRootInstance,
231
+ type AutoCompleteValueChangeEvent
232
+ } from '@primereact/ui/autocomplete';
233
+ import { Chip, type ChipRootRemoveEvent } from '@primereact/ui/chip';
234
+ import * as React from 'react';
235
+
236
+ const allTags = [
237
+ 'JavaScript',
238
+ 'TypeScript',
239
+ 'React',
240
+ 'Vue',
241
+ 'Angular',
242
+ 'Svelte',
243
+ 'Next.js',
244
+ 'Nuxt',
245
+ 'Node.js',
246
+ 'Deno',
247
+ 'Python',
248
+ 'Go',
249
+ 'Rust',
250
+ 'Java',
251
+ 'GraphQL',
252
+ 'REST',
253
+ 'Docker',
254
+ 'Kubernetes'
255
+ ];
256
+
257
+ export default function ChipDemo() {
258
+ const [items, setItems] = React.useState<string[]>([]);
259
+ const [selectedTags, setSelectedTags] = React.useState<string[]>(['React', 'TypeScript']);
260
+ const [inputValue, setInputValue] = React.useState('');
261
+ const justSelectedRef = React.useRef(false);
262
+ const autoCompleteRef = React.useRef<AutoCompleteRootInstance>(null);
263
+
264
+ React.useEffect(() => {
265
+ setItems(allTags.filter((tag) => !selectedTags.includes(tag)));
266
+ }, [selectedTags]);
267
+
268
+ const search = (event: AutoCompleteCompleteEvent) => {
269
+ const query = (event.query || '').toLowerCase();
270
+
271
+ setItems(allTags.filter((tag) => tag.toLowerCase().includes(query) && !selectedTags.includes(tag)));
272
+ };
273
+
274
+ const onValueChange = (event: AutoCompleteValueChangeEvent) => {
275
+ const value = event.value as string;
276
+
277
+ if (value) {
278
+ setSelectedTags((prev) => (prev.includes(value) ? prev : [...prev, value]));
279
+ justSelectedRef.current = true;
280
+ }
281
+ };
282
+
283
+ const onInputValueChange = (event: AutoCompleteInputValueChangeEvent) => {
284
+ if (justSelectedRef.current) {
285
+ justSelectedRef.current = false;
286
+ setInputValue('');
287
+
288
+ return;
289
+ }
290
+
291
+ setInputValue(event.query);
292
+ };
293
+
294
+ const removeTag = (e: ChipRootRemoveEvent, tag: string) => {
295
+ e.originalEvent.stopPropagation();
296
+ const currentIndex = selectedTags.indexOf(tag);
297
+ const next = selectedTags.filter((t) => t !== tag);
298
+
299
+ setSelectedTags(next);
300
+
301
+ requestAnimationFrame(() => {
302
+ if (currentIndex > 0) {
303
+ const rootElement = autoCompleteRef.current?.elementRef.current;
304
+ const removeButtons = rootElement?.querySelectorAll<HTMLElement>('[data-scope="chip"][data-part="remove"]');
305
+
306
+ removeButtons?.[currentIndex - 1]?.focus();
307
+ } else {
308
+ autoCompleteRef.current?.focus();
309
+ }
310
+ });
311
+ };
312
+
313
+ const onInputKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {
314
+ if (e.code === 'Backspace' && !inputValue && selectedTags.length > 0) {
315
+ setSelectedTags((prev) => prev.slice(0, -1));
316
+ }
317
+ };
318
+
319
+ return (
320
+ <div className="flex justify-center">
321
+ <AutoComplete.Root
322
+ ref={autoCompleteRef}
323
+ options={items}
324
+ onComplete={search}
325
+ value={null}
326
+ inputValue={inputValue}
327
+ onValueChange={onValueChange}
328
+ onInputValueChange={onInputValueChange}
329
+ className="w-full max-w-sm p-inputtext focus-within:border-primary"
330
+ >
331
+ <AutoComplete.Trigger as="div" className="flex-wrap gap-1">
332
+ <AutoComplete.Value placeholder="Add a tag...">
333
+ <div className="flex flex-wrap gap-1">
334
+ {selectedTags?.map((tag) => (
335
+ <Chip.Root key={tag} className="py-0.5" onRemove={(e: ChipRootRemoveEvent) => removeTag(e, tag)}>
336
+ <Chip.Label className="text-xs">{tag}</Chip.Label>
337
+ <Chip.Remove>
338
+ <Times className="text-[0.5rem]!" />
339
+ </Chip.Remove>
340
+ </Chip.Root>
341
+ ))}
342
+
343
+ <AutoComplete.Input placeholder="Search..." className="text-sm px-2 py-0.5 outline-none" onKeyDown={onInputKeyDown} />
344
+ </div>
345
+ </AutoComplete.Value>
346
+ </AutoComplete.Trigger>
347
+
348
+ <AutoComplete.Portal>
349
+ <AutoComplete.Positioner>
350
+ <AutoComplete.Popup>
351
+ <AutoComplete.List style={{ maxHeight: '14rem' }} />
352
+ <AutoComplete.Empty className="text-sm">No commands found</AutoComplete.Empty>
353
+ </AutoComplete.Popup>
354
+ </AutoComplete.Positioner>
355
+ </AutoComplete.Portal>
356
+ </AutoComplete.Root>
357
+ </div>
358
+ );
359
+ }
360
+ ```
361
+
362
+ ### Custom Option
363
+
364
+ Customize option content using a render function inside `AutoComplete.Option` that receives the option instance including the `selected` state.
365
+
366
+ ```tsx
367
+ 'use client';
368
+ import { AutoComplete, type AutoCompleteCompleteEvent, type AutoCompleteOptionInstance } from '@primereact/ui/autocomplete';
369
+ import { Avatar } from '@primereact/ui/avatar';
370
+ import { InputText } from '@primereact/ui/inputtext';
371
+ import * as React from 'react';
372
+
373
+ interface TeamMember {
374
+ id: number;
375
+ name: string;
376
+ role: string;
377
+ avatar: string;
378
+ status: 'online' | 'away' | 'offline';
379
+ statusClass: string;
380
+ }
381
+
382
+ const teamMembers: TeamMember[] = [
383
+ { id: 1, name: 'Sarah Chen', role: 'Engineering Lead', avatar: 'SC', status: 'online', statusClass: 'bg-green-400' },
384
+ { id: 2, name: 'Alex Rivera', role: 'Senior Developer', avatar: 'AR', status: 'online', statusClass: 'bg-green-400' },
385
+ { id: 3, name: 'Jordan Kim', role: 'UX Designer', avatar: 'JK', status: 'away', statusClass: 'bg-amber-400' },
386
+ { id: 4, name: 'Taylor Morgan', role: 'Product Manager', avatar: 'TM', status: 'offline', statusClass: 'bg-zinc-400' },
387
+ { id: 5, name: 'Morgan Lee', role: 'DevOps Engineer', avatar: 'ML', status: 'online', statusClass: 'bg-green-400' },
388
+ { id: 6, name: 'Casey Jones', role: 'QA Engineer', avatar: 'CJ', status: 'away', statusClass: 'bg-amber-400' }
389
+ ];
390
+
391
+ export default function OptionDemo() {
392
+ const [filteredMembers, setFilteredMembers] = React.useState<TeamMember[]>([]);
393
+
394
+ const search = (event: AutoCompleteCompleteEvent) => {
395
+ const query = event.query.toLowerCase();
396
+
397
+ setFilteredMembers(
398
+ query ? teamMembers.filter((m) => m.name.toLowerCase().includes(query) || m.role.toLowerCase().includes(query)) : [...teamMembers]
399
+ );
400
+ };
401
+
402
+ return (
403
+ <div className="flex justify-center">
404
+ <AutoComplete.Root options={filteredMembers} optionLabel="name" onComplete={search} className="w-full md:w-56">
405
+ <AutoComplete.Input as={InputText} placeholder="Search team members..." className="w-full" />
406
+
407
+ <AutoComplete.Portal>
408
+ <AutoComplete.Positioner>
409
+ <AutoComplete.Popup>
410
+ <AutoComplete.List style={{ maxHeight: '16rem' }}>
411
+ {filteredMembers.map((member, index) => (
412
+ <AutoComplete.Option key={member.id} index={index} uKey={String(member.id)}>
413
+ {(instance: AutoCompleteOptionInstance) => {
414
+ const { selected } = instance;
415
+
416
+ return (
417
+ <div className="flex items-center gap-3 py-1">
418
+ <div className="relative">
419
+ <Avatar.Root shape="circle" className="w-8 h-8">
420
+ <Avatar.Fallback>{member.avatar}</Avatar.Fallback>
421
+ </Avatar.Root>
422
+ <span
423
+ className={`absolute -bottom-0.5 -right-0.5 w-3 h-3 rounded-full border-2 ${selected ? 'border-primary-emphasis' : 'border-surface-0 dark:border-surface-900'} ${member.statusClass}`}
424
+ />
425
+ </div>
426
+ <div className="flex flex-col">
427
+ <span
428
+ className={`font-medium ${selected ? 'text-primary-contrast' : 'text-surface-900 dark:text-surface-0'}`}
429
+ >
430
+ {member.name}
431
+ </span>
432
+ <span
433
+ className={`text-xs ${selected ? 'text-primary-contrast/70' : 'text-surface-500 dark:text-surface-400'}`}
434
+ >
435
+ {member.role}
436
+ </span>
437
+ </div>
438
+ </div>
439
+ );
440
+ }}
441
+ </AutoComplete.Option>
442
+ ))}
443
+ <AutoComplete.Empty className="text-sm">No members found</AutoComplete.Empty>
444
+ </AutoComplete.List>
445
+ </AutoComplete.Popup>
446
+ </AutoComplete.Positioner>
447
+ </AutoComplete.Portal>
448
+ </AutoComplete.Root>
449
+ </div>
450
+ );
451
+ }
452
+ ```
453
+
454
+ ### Group
455
+
456
+ #### Simple
457
+
458
+ Options can be grouped using the `optionGroupLabel` and `optionGroupChildren` properties.
459
+
460
+ ```tsx
461
+ 'use client';
462
+ import { AutoComplete, type AutoCompleteCompleteEvent } from '@primereact/ui/autocomplete';
463
+ import { InputText } from '@primereact/ui/inputtext';
464
+ import * as React from 'react';
465
+
466
+ interface Technology {
467
+ label: string;
468
+ value: string;
469
+ }
470
+
471
+ interface TechCategory {
472
+ label: string;
473
+ code: string;
474
+ items: Technology[];
475
+ }
476
+
477
+ const techStack: TechCategory[] = [
478
+ {
479
+ label: 'Frontend',
480
+ code: 'FE',
481
+ items: [
482
+ { label: 'React', value: 'react' },
483
+ { label: 'Vue', value: 'vue' },
484
+ { label: 'Angular', value: 'angular' },
485
+ { label: 'Svelte', value: 'svelte' }
486
+ ]
487
+ },
488
+ {
489
+ label: 'Backend',
490
+ code: 'BE',
491
+ items: [
492
+ { label: 'Node.js', value: 'nodejs' },
493
+ { label: 'Python', value: 'python' },
494
+ { label: 'Java', value: 'java' },
495
+ { label: 'Go', value: 'go' }
496
+ ]
497
+ },
498
+ {
499
+ label: 'Database',
500
+ code: 'DB',
501
+ items: [
502
+ { label: 'PostgreSQL', value: 'postgresql' },
503
+ { label: 'MongoDB', value: 'mongodb' },
504
+ { label: 'Redis', value: 'redis' },
505
+ { label: 'MySQL', value: 'mysql' }
506
+ ]
507
+ }
508
+ ];
509
+
510
+ const filterItems = (items: Technology[], query: string): Technology[] => {
511
+ if (!query) return items;
512
+
513
+ const normalizedQuery = query.toLowerCase();
514
+
515
+ return items.filter((item) => item.label.toLowerCase().includes(normalizedQuery));
516
+ };
517
+
518
+ export default function GroupDemo() {
519
+ const [filteredTech, setFilteredTech] = React.useState<TechCategory[]>([]);
520
+
521
+ const search = (event: AutoCompleteCompleteEvent) => {
522
+ const query = event.query;
523
+ const _filteredTech: TechCategory[] = [];
524
+
525
+ for (const category of techStack) {
526
+ const filteredItems = filterItems(category.items, query);
527
+
528
+ if (filteredItems.length) {
529
+ _filteredTech.push({ ...category, items: filteredItems });
530
+ }
531
+ }
532
+
533
+ setFilteredTech(_filteredTech);
534
+ };
535
+
536
+ return (
537
+ <div className="flex justify-center">
538
+ <AutoComplete.Root
539
+ options={filteredTech}
540
+ optionLabel="label"
541
+ optionGroupLabel="label"
542
+ optionGroupChildren="items"
543
+ onComplete={search}
544
+ className="w-full md:w-56"
545
+ >
546
+ <AutoComplete.Input as={InputText} placeholder="Search technologies..." className="w-full" />
547
+
548
+ <AutoComplete.Portal>
549
+ <AutoComplete.Positioner>
550
+ <AutoComplete.Popup>
551
+ <AutoComplete.List style={{ maxHeight: '14rem' }} />
552
+ <AutoComplete.Empty className="text-sm">No option found</AutoComplete.Empty>
553
+ </AutoComplete.Popup>
554
+ </AutoComplete.Positioner>
555
+ </AutoComplete.Portal>
556
+ </AutoComplete.Root>
557
+ </div>
558
+ );
559
+ }
560
+ ```
561
+
562
+ #### Custom
563
+
564
+ Customize group headers with custom rendering by accessing the list instance inside `AutoComplete.List`.
565
+
566
+ ```tsx
567
+ 'use client';
568
+ import { AutoComplete, type AutoCompleteCompleteEvent } from '@primereact/ui/autocomplete';
569
+ import { InputText } from '@primereact/ui/inputtext';
570
+ import type { ListboxListInstance } from '@primereact/ui/listbox';
571
+ import * as React from 'react';
572
+
573
+ interface City {
574
+ label: string;
575
+ value: string;
576
+ }
577
+
578
+ interface CityGroup {
579
+ label: string;
580
+ code: string;
581
+ items: City[];
582
+ }
583
+
584
+ const groupedCities: CityGroup[] = [
585
+ {
586
+ label: 'Germany',
587
+ code: 'DE',
588
+ items: [
589
+ { label: 'Berlin', value: 'Berlin' },
590
+ { label: 'Frankfurt', value: 'Frankfurt' },
591
+ { label: 'Hamburg', value: 'Hamburg' }
592
+ ]
593
+ },
594
+ {
595
+ label: 'USA',
596
+ code: 'US',
597
+ items: [
598
+ { label: 'Chicago', value: 'Chicago' },
599
+ { label: 'Los Angeles', value: 'Los Angeles' },
600
+ { label: 'New York', value: 'New York' }
601
+ ]
602
+ },
603
+ {
604
+ label: 'Japan',
605
+ code: 'JP',
606
+ items: [
607
+ { label: 'Kyoto', value: 'Kyoto' },
608
+ { label: 'Osaka', value: 'Osaka' },
609
+ { label: 'Tokyo', value: 'Tokyo' }
610
+ ]
611
+ }
612
+ ];
613
+
614
+ const countryFlags: Record<string, string> = {
615
+ DE: '\uD83C\uDDE9\uD83C\uDDEA',
616
+ US: '\uD83C\uDDFA\uD83C\uDDF8',
617
+ JP: '\uD83C\uDDEF\uD83C\uDDF5'
618
+ };
619
+
620
+ export default function CustomGroupDemo() {
621
+ const [filteredCities, setFilteredCities] = React.useState<CityGroup[]>([]);
622
+
623
+ const search = (event: AutoCompleteCompleteEvent) => {
624
+ const query = event.query.toLowerCase();
625
+ const filtered: CityGroup[] = [];
626
+
627
+ for (const group of groupedCities) {
628
+ const filteredItems = query ? group.items.filter((item) => item.label.toLowerCase().includes(query)) : group.items;
629
+
630
+ if (filteredItems.length) {
631
+ filtered.push({ ...group, items: filteredItems });
632
+ }
633
+ }
634
+
635
+ setFilteredCities(filtered);
636
+ };
637
+
638
+ return (
639
+ <div className="flex justify-center">
640
+ <AutoComplete.Root
641
+ options={filteredCities}
642
+ optionLabel="label"
643
+ optionGroupLabel="label"
644
+ optionGroupChildren="items"
645
+ onComplete={search}
646
+ className="w-full md:w-56"
647
+ >
648
+ <AutoComplete.Input as={InputText} placeholder="Search a city..." className="w-full" />
649
+
650
+ <AutoComplete.Portal>
651
+ <AutoComplete.Positioner>
652
+ <AutoComplete.Popup>
653
+ <AutoComplete.List style={{ maxHeight: '18rem' }} className="p-0">
654
+ {(instance: ListboxListInstance) => {
655
+ const { listbox, options } = instance;
656
+
657
+ return (options as unknown[])?.map((option: unknown, index: number) => {
658
+ const isGroup = listbox?.isOptionGroup(option);
659
+
660
+ if (isGroup) {
661
+ const optionGroup = (option as Record<string, unknown>).optionGroup as Record<string, string>;
662
+ const code = optionGroup?.code;
663
+
664
+ return (
665
+ <AutoComplete.Option
666
+ key={index}
667
+ index={index}
668
+ group
669
+ className="flex items-center gap-2 sticky top-0 z-1 bg-surface-0 dark:bg-surface-900 border-b border-surface"
670
+ >
671
+ <span>{countryFlags[code]}</span>
672
+ <span>{optionGroup?.label}</span>
673
+ </AutoComplete.Option>
674
+ );
675
+ }
676
+
677
+ const label = listbox?.getOptionLabel(option);
678
+
679
+ return (
680
+ <AutoComplete.Option key={index} index={index}>
681
+ {label}
682
+ </AutoComplete.Option>
683
+ );
684
+ });
685
+ }}
686
+ </AutoComplete.List>
687
+ <AutoComplete.Empty className="text-sm">No cities found</AutoComplete.Empty>
688
+ </AutoComplete.Popup>
689
+ </AutoComplete.Positioner>
690
+ </AutoComplete.Portal>
691
+ </AutoComplete.Root>
692
+ </div>
693
+ );
694
+ }
695
+ ```
696
+
697
+ ### Command Menu
698
+
699
+ Combine `AutoComplete` with `Dialog` to build a searchable command palette. Grouped options are rendered through the list instance with custom group headers, and selecting an option closes the dialog.
700
+
701
+ ```tsx
702
+ 'use client';
703
+ import { ArrowDown, ArrowUp } from '@primeicons/react';
704
+ import { useHotKey } from '@primereact/hooks';
705
+ import { AutoComplete, type AutoCompleteCompleteEvent, type AutoCompleteListInstance } from '@primereact/ui/autocomplete';
706
+ import { Button } from '@primereact/ui/button';
707
+ import type { DialogRootChangeEvent } from '@primereact/ui/dialog';
708
+ import { Dialog } from '@primereact/ui/dialog';
709
+ import { ScrollArea } from '@primereact/ui/scrollarea';
710
+ import * as React from 'react';
711
+
712
+ interface CommandItem {
713
+ label: string;
714
+ value: string;
715
+ keywords?: string[];
716
+ }
717
+
718
+ interface CommandGroup {
719
+ group: string;
720
+ items: CommandItem[];
721
+ }
722
+
723
+ const filterCommands = (query: string): CommandGroup[] => {
724
+ const q = query.toLowerCase().trim();
725
+
726
+ if (!q) return [...commands];
727
+
728
+ const result: CommandGroup[] = [];
729
+
730
+ for (const group of commands) {
731
+ const items = group.items.filter((item) => {
732
+ const inLabel = item.label.toLowerCase().includes(q);
733
+ const inKeywords = item.keywords?.some((kw) => kw.toLowerCase().includes(q));
734
+
735
+ return inLabel || inKeywords;
736
+ });
737
+
738
+ if (items.length) {
739
+ result.push({ ...group, items });
740
+ }
741
+ }
742
+
743
+ return result;
744
+ };
745
+
746
+ export default function CommandMenuDemo() {
747
+ const [filtered, setFiltered] = React.useState<CommandGroup[]>([...commands]);
748
+ const [open, setOpen] = React.useState(false);
749
+
750
+ const search = (event: AutoCompleteCompleteEvent) => {
751
+ setFiltered(filterCommands(event.query));
752
+ };
753
+
754
+ useHotKey(['ctrl+k', 'meta+k'], (event) => {
755
+ event.preventDefault();
756
+ setOpen((prev) => !prev);
757
+ });
758
+
759
+ return (
760
+ <div className="flex flex-col items-center gap-2">
761
+ <Dialog.Root
762
+ open={open}
763
+ onOpenChange={(e: DialogRootChangeEvent) => {
764
+ const next = e.value as boolean;
765
+
766
+ setOpen(next);
767
+
768
+ if (!next) {
769
+ setFiltered([...commands]);
770
+ }
771
+ }}
772
+ >
773
+ <Dialog.Trigger as={Button} severity="secondary">
774
+ Open Command Menu
775
+ </Dialog.Trigger>
776
+ <Dialog.Portal>
777
+ <Dialog.Backdrop />
778
+ <Dialog.Positioner>
779
+ <Dialog.Popup className="max-w-sm w-full p-0! rounded-lg!">
780
+ <AutoComplete.Root
781
+ open
782
+ as={React.Fragment}
783
+ autoOptionFocus
784
+ options={filtered}
785
+ optionLabel="label"
786
+ optionValue="value"
787
+ optionGroupLabel="group"
788
+ optionGroupChildren="items"
789
+ onComplete={search}
790
+ onValueChange={(e) => {
791
+ if (e.value != null) {
792
+ setOpen(false);
793
+ }
794
+ }}
795
+ className="w-full! h-full! flex flex-col"
796
+ >
797
+ <Dialog.Header className="py-2.5! px-4! border-b border-surface">
798
+ <AutoComplete.Input autoFocus placeholder="Search commands..." className="w-full outline-none text-sm" />
799
+ </Dialog.Header>
800
+
801
+ <Dialog.Content as={ScrollArea.Root} className="p-0! border-none! h-72 overflow-hidden!">
802
+ <ScrollArea.Viewport className="pt-0! px-1!">
803
+ <ScrollArea.Content>
804
+ <AutoComplete.List>
805
+ {({ autocomplete }: AutoCompleteListInstance) => {
806
+ const listbox = autocomplete?.listbox;
807
+ const options = (listbox?.getOptions() ?? []) as unknown[];
808
+
809
+ return (
810
+ <>
811
+ {options.map((option, index) => {
812
+ const isGroup = listbox?.isOptionGroup(option);
813
+
814
+ if (isGroup) {
815
+ const optionGroup = (option as Record<string, unknown>)
816
+ .optionGroup as CommandGroup;
817
+
818
+ return (
819
+ <AutoComplete.Option
820
+ key={index}
821
+ index={index}
822
+ group
823
+ className="capitalize text-xs text-surface-500"
824
+ >
825
+ {optionGroup.group}
826
+ </AutoComplete.Option>
827
+ );
828
+ }
829
+
830
+ const item = option as CommandItem;
831
+
832
+ return (
833
+ <AutoComplete.Option key={index} index={index} uKey={item.value}>
834
+ {item.label}
835
+ </AutoComplete.Option>
836
+ );
837
+ })}
838
+ <AutoComplete.Empty className="text-sm text-center text-surface-500 py-4! px-2!">
839
+ No results found.
840
+ </AutoComplete.Empty>
841
+ </>
842
+ );
843
+ }}
844
+ </AutoComplete.List>
845
+ </ScrollArea.Content>
846
+ </ScrollArea.Viewport>
847
+ <ScrollArea.Scrollbar orientation="vertical">
848
+ <ScrollArea.Handle />
849
+ </ScrollArea.Scrollbar>
850
+ </Dialog.Content>
851
+ <Dialog.Footer className="justify-end gap-4 py-2! px-4! border-t border-surface">
852
+ <span className="flex items-center gap-1 text-surface-500 text-xs">
853
+ <kbd className="bg-surface-100 dark:bg-surface-800 size-5 inline-flex items-center justify-center rounded border border-surface-200 dark:border-surface-700">
854
+ <ArrowUp />
855
+ </kbd>
856
+ <kbd className="bg-surface-100 dark:bg-surface-800 size-5 inline-flex items-center justify-center rounded border border-surface-200 dark:border-surface-700">
857
+ <ArrowDown />
858
+ </kbd>
859
+ Navigate
860
+ </span>
861
+ <span className="flex items-center gap-1 text-surface-500 text-xs">
862
+ <kbd className="bg-surface-100 dark:bg-surface-800 size-5 inline-flex items-center justify-center rounded border border-surface-200 dark:border-surface-700">
863
+ ↵
864
+ </kbd>
865
+ Select
866
+ </span>
867
+ </Dialog.Footer>
868
+ </AutoComplete.Root>
869
+ </Dialog.Popup>
870
+ </Dialog.Positioner>
871
+ </Dialog.Portal>
872
+ </Dialog.Root>
873
+ <span className="text-surface-500 text-xs">
874
+ (Press <kbd>⌘</kbd>/<kbd>Ctrl</kbd> + <kbd>K</kbd>)
875
+ </span>
876
+ </div>
877
+ );
878
+ }
879
+
880
+ const commands: CommandGroup[] = [
881
+ {
882
+ group: 'recents',
883
+ items: [
884
+ { label: 'Check For Updates', value: 'check for updates', keywords: ['check', 'updates'] },
885
+ { label: 'Open Settings', value: 'open settings' },
886
+ { label: 'Search Files', value: 'search files' },
887
+ { label: 'Open Terminal', value: 'open terminal' },
888
+ { label: 'View History', value: 'view history', keywords: ['history', 'recent'] },
889
+ { label: 'Open Chat', value: 'open chat' }
890
+ ]
891
+ },
892
+ {
893
+ group: 'files',
894
+ items: [
895
+ { label: 'New File', value: 'new file' },
896
+ { label: 'New Folder', value: 'new folder' },
897
+ { label: 'Save All', value: 'save-all' },
898
+ { label: 'Change Theme', value: 'change theme' },
899
+ { label: 'Run Task', value: 'run-task' },
900
+ { label: 'Stop Task', value: 'stop task' },
901
+ { label: 'Export Project', value: 'export project' },
902
+ { label: 'Import Project', value: 'import project' },
903
+ { label: 'Delete File', value: 'delete file' },
904
+ { label: 'Duplicate File', value: 'duplicate file' }
905
+ ]
906
+ },
907
+ {
908
+ group: 'source',
909
+ items: [
910
+ { label: 'Git: Commit', value: 'git commit' },
911
+ { label: 'Git: Push', value: 'git push' },
912
+ { label: 'Git: Pull', value: 'git pull' },
913
+ { label: 'Switch Account', value: 'switch account' },
914
+ { label: 'Open Documentation', value: 'open documentation' },
915
+ { label: 'Git: Sync', value: 'git sync' },
916
+ { label: 'Git: Create Branch', value: 'git create branch' },
917
+ { label: 'Git: Create Tag', value: 'git create tag' }
918
+ ]
919
+ },
920
+ {
921
+ group: 'editor',
922
+ items: [
923
+ { label: 'Align Left', value: 'align left' },
924
+ { label: 'Align Center', value: 'align center' },
925
+ { label: 'Align Right', value: 'align right' },
926
+ { label: 'Toggle Bold', value: 'toggle bold' },
927
+ { label: 'Toggle Italic', value: 'toggle italic' },
928
+ { label: 'Insert Link', value: 'insert link' },
929
+ { label: 'Insert Image', value: 'insert image' },
930
+ { label: 'Insert List', value: 'insert list' }
931
+ ]
932
+ },
933
+ {
934
+ group: 'navigation',
935
+ items: [
936
+ { label: 'Go to Home', value: 'go to home' },
937
+ { label: 'Go Back', value: 'go back' },
938
+ { label: 'Go Forward', value: 'go forward' },
939
+ { label: 'Open Explorer', value: 'open explorer' },
940
+ { label: 'View Bookmarks', value: 'view bookmarks' },
941
+ { label: 'Open Minimap', value: 'open minimap' }
942
+ ]
943
+ },
944
+ {
945
+ group: 'view',
946
+ items: [
947
+ { label: 'Toggle Preview', value: 'toggle preview' },
948
+ { label: 'Maximize Window', value: 'maximize window' },
949
+ { label: 'Minimize Window', value: 'minimize window' },
950
+ { label: 'Grid View', value: 'grid view' },
951
+ { label: 'List View', value: 'list view' },
952
+ { label: 'Light Mode', value: 'light mode' },
953
+ { label: 'Dark Mode', value: 'dark mode' }
954
+ ]
955
+ },
956
+ {
957
+ group: 'tools',
958
+ items: [
959
+ { label: 'Open Calculator', value: 'open calculator' },
960
+ { label: 'Open Calendar', value: 'open calendar' },
961
+ { label: 'Open Timer', value: 'open timer' },
962
+ { label: 'View Analytics', value: 'view analytics' },
963
+ { label: 'View Trends', value: 'view trends' },
964
+ { label: 'Open Database', value: 'open database' }
965
+ ]
966
+ }
967
+ ];
968
+ ```
969
+
970
+ ### Force Selection
971
+
972
+ Use the `forceSelection` property to validate manual input against the suggestions list. If no match is found, the input value is cleared to ensure the value is always from the suggestion list.
973
+
974
+ ```tsx
975
+ 'use client';
976
+ import { CountryService } from '@/shared/services/country.service';
977
+ import { AutoComplete, type AutoCompleteCompleteEvent } from '@primereact/ui/autocomplete';
978
+ import { InputText } from '@primereact/ui/inputtext';
979
+ import * as React from 'react';
980
+
981
+ interface Country {
982
+ name: string;
983
+ code: string;
984
+ }
985
+
986
+ export default function ForceSelectionDemo() {
987
+ const [countries, setCountries] = React.useState<Country[]>([]);
988
+ const [filteredCountries, setFilteredCountries] = React.useState<Country[]>([]);
989
+
990
+ React.useEffect(() => {
991
+ CountryService.getCountries().then((data) => setCountries(data));
992
+ }, []);
993
+
994
+ const search = (event: AutoCompleteCompleteEvent) => {
995
+ if (!event.query.trim().length) {
996
+ setFilteredCountries(countries);
997
+ } else {
998
+ setFilteredCountries(
999
+ countries.filter((country) => {
1000
+ return country.name.toLowerCase().startsWith(event.query.toLowerCase());
1001
+ })
1002
+ );
1003
+ }
1004
+ };
1005
+
1006
+ return (
1007
+ <div className="flex justify-center">
1008
+ <AutoComplete.Root
1009
+ options={filteredCountries}
1010
+ optionKey="code"
1011
+ optionLabel="name"
1012
+ forceSelection
1013
+ onComplete={search}
1014
+ className="w-full md:w-56"
1015
+ >
1016
+ <AutoComplete.Input as={InputText} className="w-full" />
1017
+
1018
+ <AutoComplete.Portal>
1019
+ <AutoComplete.Positioner>
1020
+ <AutoComplete.Popup>
1021
+ <AutoComplete.List style={{ maxHeight: '14rem' }} />
1022
+ <AutoComplete.Empty className="text-sm">No countries found</AutoComplete.Empty>
1023
+ </AutoComplete.Popup>
1024
+ </AutoComplete.Positioner>
1025
+ </AutoComplete.Portal>
1026
+ </AutoComplete.Root>
1027
+ </div>
1028
+ );
1029
+ }
1030
+ ```
1031
+
1032
+ ### Float Label
1033
+
1034
+ Integrate with `FloatLabel` for animated label behavior with three variants: over, in, and on.
1035
+
1036
+ ```tsx
1037
+ 'use client';
1038
+ import { AutoComplete, type AutoCompleteCompleteEvent } from '@primereact/ui/autocomplete';
1039
+ import { FloatLabel } from '@primereact/ui/floatlabel';
1040
+ import { InputText } from '@primereact/ui/inputtext';
1041
+ import { Label } from '@primereact/ui/label';
1042
+ import * as React from 'react';
1043
+
1044
+ export default function FloatLabelDemo() {
1045
+ const [items, setItems] = React.useState<string[]>([]);
1046
+
1047
+ const search = (event: AutoCompleteCompleteEvent) => {
1048
+ setItems([...Array(10).keys()].map((item) => event.query + '-' + item));
1049
+ };
1050
+
1051
+ return (
1052
+ <div className="flex flex-wrap justify-center items-end gap-4">
1053
+ <FloatLabel>
1054
+ <AutoComplete.Root options={items} onComplete={search}>
1055
+ <AutoComplete.Input as={InputText} id="over_label" />
1056
+
1057
+ <AutoComplete.Portal>
1058
+ <AutoComplete.Positioner>
1059
+ <AutoComplete.Popup>
1060
+ <AutoComplete.List style={{ maxHeight: '14rem' }} />
1061
+ </AutoComplete.Popup>
1062
+ </AutoComplete.Positioner>
1063
+ </AutoComplete.Portal>
1064
+ </AutoComplete.Root>
1065
+
1066
+ <Label htmlFor="over_label">Over Label</Label>
1067
+ </FloatLabel>
1068
+
1069
+ <FloatLabel variant="in">
1070
+ <AutoComplete.Root options={items} onComplete={search}>
1071
+ <AutoComplete.Input as={InputText} id="in_label" />
1072
+
1073
+ <AutoComplete.Portal>
1074
+ <AutoComplete.Positioner>
1075
+ <AutoComplete.Popup>
1076
+ <AutoComplete.List style={{ maxHeight: '14rem' }} />
1077
+ </AutoComplete.Popup>
1078
+ </AutoComplete.Positioner>
1079
+ </AutoComplete.Portal>
1080
+ </AutoComplete.Root>
1081
+
1082
+ <Label htmlFor="in_label">In Label</Label>
1083
+ </FloatLabel>
1084
+
1085
+ <FloatLabel variant="on">
1086
+ <AutoComplete.Root options={items} onComplete={search}>
1087
+ <AutoComplete.Input as={InputText} id="on_label" />
1088
+
1089
+ <AutoComplete.Portal>
1090
+ <AutoComplete.Positioner>
1091
+ <AutoComplete.Popup>
1092
+ <AutoComplete.List style={{ maxHeight: '14rem' }} />
1093
+ </AutoComplete.Popup>
1094
+ </AutoComplete.Positioner>
1095
+ </AutoComplete.Portal>
1096
+ </AutoComplete.Root>
1097
+
1098
+ <Label htmlFor="on_label">On Label</Label>
1099
+ </FloatLabel>
1100
+ </div>
1101
+ );
1102
+ }
1103
+ ```
1104
+
1105
+ ### Ifta Label
1106
+
1107
+ Use `IftaLabel` for an infield top-aligned label pattern.
1108
+
1109
+ ```tsx
1110
+ 'use client';
1111
+ import { AutoComplete, type AutoCompleteCompleteEvent } from '@primereact/ui/autocomplete';
1112
+ import { IftaLabel } from '@primereact/ui/iftalabel';
1113
+ import { InputText } from '@primereact/ui/inputtext';
1114
+ import { Label } from '@primereact/ui/label';
1115
+ import * as React from 'react';
1116
+
1117
+ export default function IftaLabelDemo() {
1118
+ const [items, setItems] = React.useState<string[]>([]);
1119
+
1120
+ const search = (event: AutoCompleteCompleteEvent) => {
1121
+ setItems([...Array(10).keys()].map((item) => event.query + '-' + item));
1122
+ };
1123
+
1124
+ return (
1125
+ <div className="flex justify-center">
1126
+ <IftaLabel>
1127
+ <AutoComplete.Root options={items} variant="filled" onComplete={search} className="w-full md:w-56">
1128
+ <AutoComplete.Input as={InputText} id="autocomplete" className="w-full" />
1129
+
1130
+ <AutoComplete.Portal>
1131
+ <AutoComplete.Positioner>
1132
+ <AutoComplete.Popup>
1133
+ <AutoComplete.List style={{ maxHeight: '14rem' }} />
1134
+ </AutoComplete.Popup>
1135
+ </AutoComplete.Positioner>
1136
+ </AutoComplete.Portal>
1137
+ </AutoComplete.Root>
1138
+
1139
+ <Label htmlFor="autocomplete" className="mb-2">
1140
+ Search
1141
+ </Label>
1142
+ </IftaLabel>
1143
+ </div>
1144
+ );
1145
+ }
1146
+ ```
1147
+
1148
+ ### Arrow
1149
+
1150
+ Use `AutoComplete.Arrow` inside the popup to display an arrow pointing to the trigger element. Set `sideOffset` on `AutoComplete.Positioner` for spacing.
1151
+
1152
+ ```tsx
1153
+ 'use client';
1154
+ import { AutoComplete, type AutoCompleteCompleteEvent } from '@primereact/ui/autocomplete';
1155
+ import { InputText } from '@primereact/ui/inputtext';
1156
+ import * as React from 'react';
1157
+
1158
+ export default function ArrowDemo() {
1159
+ const [items, setItems] = React.useState<string[]>([]);
1160
+
1161
+ const search = (event: AutoCompleteCompleteEvent) => {
1162
+ setItems([...Array(10).keys()].map((item) => event.query + '-' + item));
1163
+ };
1164
+
1165
+ return (
1166
+ <div className="flex justify-center">
1167
+ <AutoComplete.Root options={items} onComplete={search} className="w-full md:w-56">
1168
+ <AutoComplete.Input as={InputText} placeholder="Search" className="w-full" />
1169
+
1170
+ <AutoComplete.Portal>
1171
+ <AutoComplete.Positioner sideOffset={12}>
1172
+ <AutoComplete.Popup>
1173
+ <AutoComplete.Arrow />
1174
+ <AutoComplete.List style={{ maxHeight: '14rem' }} />
1175
+ </AutoComplete.Popup>
1176
+ </AutoComplete.Positioner>
1177
+ </AutoComplete.Portal>
1178
+ </AutoComplete.Root>
1179
+ </div>
1180
+ );
1181
+ }
1182
+ ```
1183
+
1184
+ ### Clear
1185
+
1186
+ Use `AutoComplete.Clear` inside the root to display a clear button that resets the input value.
1187
+
1188
+ ```tsx
1189
+ 'use client';
1190
+ import { Times } from '@primeicons/react/times';
1191
+ import { AutoComplete, type AutoCompleteCompleteEvent } from '@primereact/ui/autocomplete';
1192
+ import { IconField } from '@primereact/ui/iconfield';
1193
+ import { InputText } from '@primereact/ui/inputtext';
1194
+ import { Tag } from '@primereact/ui/tag';
1195
+ import * as React from 'react';
1196
+
1197
+ const productCategories = [
1198
+ { label: 'Electronics', value: 'electronics', count: 1247 },
1199
+ { label: 'Clothing', value: 'clothing', count: 856 },
1200
+ { label: 'Garden', value: 'home', count: 634 },
1201
+ { label: 'Sports', value: 'sports', count: 421 },
1202
+ { label: 'Books', value: 'books', count: 2103 },
1203
+ { label: 'Toys', value: 'toys', count: 312 }
1204
+ ];
1205
+
1206
+ export default function ClearIconDemo() {
1207
+ const [filteredCategories, setFilteredCategories] = React.useState<typeof productCategories>([]);
1208
+
1209
+ const search = (event: AutoCompleteCompleteEvent) => {
1210
+ const query = event.query.toLowerCase();
1211
+
1212
+ setFilteredCategories(query ? productCategories.filter((cat) => cat.label.toLowerCase().includes(query)) : [...productCategories]);
1213
+ };
1214
+
1215
+ return (
1216
+ <div className="flex justify-center">
1217
+ <AutoComplete.Root options={filteredCategories} optionLabel="label" onComplete={search} className="w-full md:w-56">
1218
+ <IconField.Root className="w-full">
1219
+ <AutoComplete.Input as={InputText} fluid placeholder="Search categories..." />
1220
+ <IconField.Inset>
1221
+ <AutoComplete.Clear>
1222
+ <Times />
1223
+ </AutoComplete.Clear>
1224
+ </IconField.Inset>
1225
+ </IconField.Root>
1226
+
1227
+ <AutoComplete.Portal>
1228
+ <AutoComplete.Positioner>
1229
+ <AutoComplete.Popup>
1230
+ <AutoComplete.List style={{ maxHeight: '14rem' }}>
1231
+ {filteredCategories.map((cat, index) => (
1232
+ <AutoComplete.Option key={cat.value} index={index} uKey={cat.value}>
1233
+ <div className="flex items-center justify-between w-full">
1234
+ <span>{cat.label}</span>
1235
+ <Tag severity="secondary" rounded>
1236
+ {cat.count}
1237
+ </Tag>
1238
+ </div>
1239
+ </AutoComplete.Option>
1240
+ ))}
1241
+ <AutoComplete.Empty className="text-sm">No categories found</AutoComplete.Empty>
1242
+ </AutoComplete.List>
1243
+ </AutoComplete.Popup>
1244
+ </AutoComplete.Positioner>
1245
+ </AutoComplete.Portal>
1246
+ </AutoComplete.Root>
1247
+ </div>
1248
+ );
1249
+ }
1250
+ ```
1251
+
1252
+ ### Fluid
1253
+
1254
+ Use the `fluid` property to make the autocomplete take up the full width of its container.
1255
+
1256
+ ```tsx
1257
+ 'use client';
1258
+ import { AutoComplete, type AutoCompleteCompleteEvent } from '@primereact/ui/autocomplete';
1259
+ import { InputText } from '@primereact/ui/inputtext';
1260
+ import * as React from 'react';
1261
+
1262
+ export default function FluidDemo() {
1263
+ const [items, setItems] = React.useState<string[]>([]);
1264
+
1265
+ const search = (event: AutoCompleteCompleteEvent) => {
1266
+ setItems([...Array(10).keys()].map((item) => event.query + '-' + item));
1267
+ };
1268
+
1269
+ return (
1270
+ <div>
1271
+ <AutoComplete.Root options={items} onComplete={search} fluid>
1272
+ <AutoComplete.Input as={InputText} fluid />
1273
+
1274
+ <AutoComplete.Portal>
1275
+ <AutoComplete.Positioner>
1276
+ <AutoComplete.Popup>
1277
+ <AutoComplete.List style={{ maxHeight: '14rem' }} />
1278
+ </AutoComplete.Popup>
1279
+ </AutoComplete.Positioner>
1280
+ </AutoComplete.Portal>
1281
+ </AutoComplete.Root>
1282
+ </div>
1283
+ );
1284
+ }
1285
+ ```
1286
+
1287
+ ### Loading
1288
+
1289
+ Compose a loading indicator alongside the autocomplete input using `InputGroup` to display an async loading state.
1290
+
1291
+ ```tsx
1292
+ 'use client';
1293
+ import { Spinner } from '@primeicons/react/spinner';
1294
+ import { AutoComplete, type AutoCompleteCompleteEvent } from '@primereact/ui/autocomplete';
1295
+ import { InputGroup } from '@primereact/ui/inputgroup';
1296
+ import { InputText } from '@primereact/ui/inputtext';
1297
+ import * as React from 'react';
1298
+
1299
+ export default function LoadingDemo() {
1300
+ const [items, setItems] = React.useState<string[]>([]);
1301
+
1302
+ const search = (event: AutoCompleteCompleteEvent) => {
1303
+ setItems([...Array(10).keys()].map((item) => event.query + '-' + item));
1304
+ };
1305
+
1306
+ return (
1307
+ <div className="flex justify-center">
1308
+ <AutoComplete.Root options={items} onComplete={search} className="w-full md:w-56">
1309
+ <InputGroup.Root>
1310
+ <AutoComplete.Input as={InputText} className="w-full" />
1311
+ <InputGroup.Addon>
1312
+ <Spinner className="animate-spin" />
1313
+ </InputGroup.Addon>
1314
+ </InputGroup.Root>
1315
+
1316
+ <AutoComplete.Portal>
1317
+ <AutoComplete.Positioner>
1318
+ <AutoComplete.Popup>
1319
+ <AutoComplete.List style={{ maxHeight: '14rem' }} />
1320
+ </AutoComplete.Popup>
1321
+ </AutoComplete.Positioner>
1322
+ </AutoComplete.Portal>
1323
+ </AutoComplete.Root>
1324
+ </div>
1325
+ );
1326
+ }
1327
+ ```
1328
+
1329
+ ### Sizes
1330
+
1331
+ Use the `size` property to change the size of an autocomplete.
1332
+
1333
+ ```tsx
1334
+ 'use client';
1335
+ import { AutoComplete, type AutoCompleteCompleteEvent } from '@primereact/ui/autocomplete';
1336
+ import { InputText } from '@primereact/ui/inputtext';
1337
+ import * as React from 'react';
1338
+
1339
+ export default function SizesDemo() {
1340
+ const [items, setItems] = React.useState<string[]>([]);
1341
+
1342
+ const search = (event: AutoCompleteCompleteEvent) => {
1343
+ setItems([...Array(10).keys()].map((item) => event.query + '-' + item));
1344
+ };
1345
+
1346
+ return (
1347
+ <div className="flex flex-col items-center gap-4">
1348
+ <AutoComplete.Root options={items} onComplete={search}>
1349
+ <AutoComplete.Input as={InputText} size="small" placeholder="Small" />
1350
+
1351
+ <AutoComplete.Portal>
1352
+ <AutoComplete.Positioner>
1353
+ <AutoComplete.Popup>
1354
+ <AutoComplete.List style={{ maxHeight: '14rem' }} />
1355
+ </AutoComplete.Popup>
1356
+ </AutoComplete.Positioner>
1357
+ </AutoComplete.Portal>
1358
+ </AutoComplete.Root>
1359
+
1360
+ <AutoComplete.Root options={items} onComplete={search}>
1361
+ <AutoComplete.Input as={InputText} placeholder="Normal" />
1362
+
1363
+ <AutoComplete.Portal>
1364
+ <AutoComplete.Positioner>
1365
+ <AutoComplete.Popup>
1366
+ <AutoComplete.List style={{ maxHeight: '14rem' }} />
1367
+ </AutoComplete.Popup>
1368
+ </AutoComplete.Positioner>
1369
+ </AutoComplete.Portal>
1370
+ </AutoComplete.Root>
1371
+
1372
+ <AutoComplete.Root options={items} onComplete={search}>
1373
+ <AutoComplete.Input as={InputText} size="large" placeholder="Large" />
1374
+
1375
+ <AutoComplete.Portal>
1376
+ <AutoComplete.Positioner>
1377
+ <AutoComplete.Popup>
1378
+ <AutoComplete.List style={{ maxHeight: '14rem' }} />
1379
+ </AutoComplete.Popup>
1380
+ </AutoComplete.Positioner>
1381
+ </AutoComplete.Portal>
1382
+ </AutoComplete.Root>
1383
+ </div>
1384
+ );
1385
+ }
1386
+ ```
1387
+
1388
+ ### Filled
1389
+
1390
+ Specify the `variant="filled"` property to display the component with a higher visual emphasis than the default outlined style.
1391
+
1392
+ ```tsx
1393
+ 'use client';
1394
+ import { AutoComplete, type AutoCompleteCompleteEvent } from '@primereact/ui/autocomplete';
1395
+ import { InputText } from '@primereact/ui/inputtext';
1396
+ import * as React from 'react';
1397
+
1398
+ export default function FilledDemo() {
1399
+ const [items, setItems] = React.useState<string[]>([]);
1400
+
1401
+ const search = (event: AutoCompleteCompleteEvent) => {
1402
+ setItems([...Array(10).keys()].map((item) => event.query + '-' + item));
1403
+ };
1404
+
1405
+ return (
1406
+ <div className="flex justify-center">
1407
+ <AutoComplete.Root options={items} onComplete={search} className="w-full md:w-56">
1408
+ <AutoComplete.Input as={InputText} variant="filled" className="w-full" />
1409
+
1410
+ <AutoComplete.Portal>
1411
+ <AutoComplete.Positioner>
1412
+ <AutoComplete.Popup>
1413
+ <AutoComplete.List style={{ maxHeight: '14rem' }} />
1414
+ </AutoComplete.Popup>
1415
+ </AutoComplete.Positioner>
1416
+ </AutoComplete.Portal>
1417
+ </AutoComplete.Root>
1418
+ </div>
1419
+ );
1420
+ }
1421
+ ```
1422
+
1423
+ ### Disabled
1424
+
1425
+ Use the `disabled` property to disable an autocomplete.
1426
+
1427
+ ```tsx
1428
+ import { AutoComplete } from '@primereact/ui/autocomplete';
1429
+ import { InputText } from '@primereact/ui/inputtext';
1430
+
1431
+ export default function DisabledDemo() {
1432
+ return (
1433
+ <div className="flex justify-center">
1434
+ <AutoComplete.Root options={[]} disabled className="w-full md:w-56">
1435
+ <AutoComplete.Input as={InputText} className="w-full" />
1436
+
1437
+ <AutoComplete.Portal>
1438
+ <AutoComplete.Positioner>
1439
+ <AutoComplete.Popup>
1440
+ <AutoComplete.List style={{ maxHeight: '14rem' }} />
1441
+ </AutoComplete.Popup>
1442
+ </AutoComplete.Positioner>
1443
+ </AutoComplete.Portal>
1444
+ </AutoComplete.Root>
1445
+ </div>
1446
+ );
1447
+ }
1448
+ ```
1449
+
1450
+ ### Invalid
1451
+
1452
+ Specify the `invalid` property to display the component with a red border for validation errors.
1453
+
1454
+ ```tsx
1455
+ 'use client';
1456
+ import { AutoComplete, type AutoCompleteCompleteEvent, type AutoCompleteValueChangeEvent } from '@primereact/ui/autocomplete';
1457
+ import { InputText } from '@primereact/ui/inputtext';
1458
+ import * as React from 'react';
1459
+
1460
+ export default function InvalidDemo() {
1461
+ const [items, setItems] = React.useState<string[]>([]);
1462
+ const [value, setValue] = React.useState<string | null>(null);
1463
+ const [value2, setValue2] = React.useState<string | null>(null);
1464
+
1465
+ const search = (event: AutoCompleteCompleteEvent) => {
1466
+ setItems([...Array(10).keys()].map((item) => event.query + '-' + item));
1467
+ };
1468
+
1469
+ return (
1470
+ <div className="flex flex-wrap justify-center gap-4">
1471
+ <AutoComplete.Root
1472
+ options={items}
1473
+ onComplete={search}
1474
+ onValueChange={(e: AutoCompleteValueChangeEvent) => setValue(e.value as string)}
1475
+ className="w-full md:w-56"
1476
+ >
1477
+ <AutoComplete.Input as={InputText} invalid={!value} placeholder="Search" className="w-full" />
1478
+
1479
+ <AutoComplete.Portal>
1480
+ <AutoComplete.Positioner>
1481
+ <AutoComplete.Popup>
1482
+ <AutoComplete.List style={{ maxHeight: '14rem' }} />
1483
+ </AutoComplete.Popup>
1484
+ </AutoComplete.Positioner>
1485
+ </AutoComplete.Portal>
1486
+ </AutoComplete.Root>
1487
+
1488
+ <AutoComplete.Root
1489
+ options={items}
1490
+ onComplete={search}
1491
+ onValueChange={(e: AutoCompleteValueChangeEvent) => setValue2(e.value as string)}
1492
+ className="w-full md:w-56"
1493
+ >
1494
+ <AutoComplete.Input as={InputText} invalid={!value2} variant="filled" placeholder="Search" className="w-full" />
1495
+
1496
+ <AutoComplete.Portal>
1497
+ <AutoComplete.Positioner>
1498
+ <AutoComplete.Popup>
1499
+ <AutoComplete.List style={{ maxHeight: '14rem' }} />
1500
+ </AutoComplete.Popup>
1501
+ </AutoComplete.Positioner>
1502
+ </AutoComplete.Portal>
1503
+ </AutoComplete.Root>
1504
+ </div>
1505
+ );
1506
+ }
1507
+ ```
1508
+
1509
+ ### Focus Behavior
1510
+
1511
+ Customize keyboard and mouse focus behavior with `autoOptionFocus`, `selectOnFocus`, and `focusOnHover` props.
1512
+
1513
+ ```tsx
1514
+ 'use client';
1515
+ import { AutoComplete, type AutoCompleteCompleteEvent } from '@primereact/ui/autocomplete';
1516
+ import { Button } from '@primereact/ui/button';
1517
+ import { InputText } from '@primereact/ui/inputtext';
1518
+ import * as React from 'react';
1519
+
1520
+ export default function FocusBehaviorDemo() {
1521
+ const [items, setItems] = React.useState<string[]>([]);
1522
+ const [autoOptionFocus, setAutoOptionFocus] = React.useState(true);
1523
+ const [selectOnFocus, setSelectOnFocus] = React.useState(false);
1524
+ const [focusOnHover, setFocusOnHover] = React.useState(true);
1525
+
1526
+ const search = (event: AutoCompleteCompleteEvent) => {
1527
+ setItems([...Array(10).keys()].map((item) => event.query + '-' + item));
1528
+ };
1529
+
1530
+ return (
1531
+ <div className="space-y-4">
1532
+ <div className="flex flex-wrap gap-2 justify-center">
1533
+ <Button size="small" severity={autoOptionFocus ? 'primary' : 'secondary'} onClick={() => setAutoOptionFocus((prev) => !prev)}>
1534
+ autoOptionFocus: {String(autoOptionFocus)}
1535
+ </Button>
1536
+ <Button size="small" severity={selectOnFocus ? 'primary' : 'secondary'} onClick={() => setSelectOnFocus((prev) => !prev)}>
1537
+ selectOnFocus: {String(selectOnFocus)}
1538
+ </Button>
1539
+ <Button size="small" severity={focusOnHover ? 'primary' : 'secondary'} onClick={() => setFocusOnHover((prev) => !prev)}>
1540
+ focusOnHover: {String(focusOnHover)}
1541
+ </Button>
1542
+ </div>
1543
+
1544
+ <div className="flex justify-center">
1545
+ <AutoComplete.Root
1546
+ options={items}
1547
+ onComplete={search}
1548
+ autoOptionFocus={autoOptionFocus}
1549
+ selectOnFocus={selectOnFocus}
1550
+ focusOnHover={focusOnHover}
1551
+ className="w-full md:w-56"
1552
+ >
1553
+ <AutoComplete.Input as={InputText} placeholder="Search a city..." className="w-full" />
1554
+
1555
+ <AutoComplete.Portal>
1556
+ <AutoComplete.Positioner>
1557
+ <AutoComplete.Popup>
1558
+ <AutoComplete.List style={{ maxHeight: '14rem' }} />
1559
+ <AutoComplete.Empty className="text-sm">No cities found</AutoComplete.Empty>
1560
+ </AutoComplete.Popup>
1561
+ </AutoComplete.Positioner>
1562
+ </AutoComplete.Portal>
1563
+ </AutoComplete.Root>
1564
+ </div>
1565
+ </div>
1566
+ );
1567
+ }
1568
+ ```
1569
+
1570
+ ## Related
1571
+
1572
+ ### Sub-Components
1573
+
1574
+ See [Primitive API](/docs/primitive/components/autocomplete#api) for `AutoCompleteRoot`, `AutoCompleteInput`, `AutoCompleteTrigger`, `AutoCompleteList`, `AutoCompleteOption`, and other component documentation.
1575
+
1576
+ ### Hooks
1577
+
1578
+ See [Headless API](/docs/headless/components/autocomplete#api) for `useAutoComplete` hook documentation.
1579
+
1580
+ ### Accessibility
1581
+
1582
+ See [AutoComplete Primitive](/docs/primitive/components/autocomplete#accessibility) for WAI-ARIA compliance details and keyboard support.
1583
+
1584
+
1585
+ ## Theming
1586
+
1587
+ ### CSS Classes
1588
+
1589
+ List of class names used in the styled mode.
1590
+
1591
+ <DocTable name="AutoComplete" category="style" />
1592
+
1593
+ ### Design Tokens
1594
+
1595
+ List of design tokens.
1596
+
1597
+ <DocTable name="AutoComplete" category="token" />