@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,2122 @@
1
+ # Select
2
+
3
+ Select is used to choose an item from a collection of options.
4
+
5
+ ```tsx
6
+ 'use client';
7
+ import { Check } from '@primeicons/react/check';
8
+ import { ChevronDown } from '@primeicons/react/chevron-down';
9
+ import { Search } from '@primeicons/react/search';
10
+ import { IconField } from '@primereact/ui/iconfield';
11
+ import { InputText } from '@primereact/ui/inputtext';
12
+ import { Select, type SelectValueChangeEvent } from '@primereact/ui/select';
13
+ import Image from 'next/image';
14
+ import * as React from 'react';
15
+
16
+ type Language = {
17
+ label: string;
18
+ value: string;
19
+ code: string;
20
+ };
21
+
22
+ const languages: Language[] = [
23
+ { label: 'English', value: 'en', code: 'us' },
24
+ { label: 'Deutsch', value: 'de', code: 'de' },
25
+ { label: 'Español', value: 'es', code: 'es' },
26
+ { label: 'Français', value: 'fr', code: 'fr' },
27
+ { label: 'Italiano', value: 'it', code: 'it' },
28
+ { label: 'Português', value: 'pt', code: 'pt' },
29
+ { label: 'Polski', value: 'pl', code: 'pl' },
30
+ { label: 'Türkçe', value: 'tr', code: 'tr' },
31
+ { label: 'Русский', value: 'ru', code: 'ru' },
32
+ { label: '한국어', value: 'ko', code: 'kr' },
33
+ { label: '日本語', value: 'ja', code: 'jp' },
34
+ { label: '中文', value: 'zh', code: 'cn' }
35
+ ];
36
+
37
+ export default function Preview() {
38
+ const [language, setLanguage] = React.useState<Language | null>(null);
39
+ const [filterValue, setFilterValue] = React.useState<string>('');
40
+ const filteredLanguages = React.useMemo(() => languages.filter((l) => l.label.toLowerCase().includes(filterValue.toLowerCase())), [filterValue]);
41
+
42
+ return (
43
+ <div className="flex justify-center">
44
+ <Select.Root
45
+ value={language}
46
+ onValueChange={(e: SelectValueChangeEvent) => setLanguage(e.value as Language | null)}
47
+ options={filteredLanguages}
48
+ optionLabel="label"
49
+ className="w-full md:w-56"
50
+ >
51
+ <Select.Trigger>
52
+ <Select.Value placeholder="Select a language">
53
+ {language && (
54
+ <span className="flex items-center gap-2">
55
+ <Image
56
+ alt={language.label}
57
+ src="https://primefaces.org/cdn/primevue/images/flag/flag_placeholder.png"
58
+ className={`flag flag-${language.code}`}
59
+ width={18}
60
+ height={12}
61
+ style={{ width: '18px', height: '12px' }}
62
+ />
63
+ <span>{language.label}</span>
64
+ </span>
65
+ )}
66
+ </Select.Value>
67
+ <Select.Indicator>
68
+ <ChevronDown />
69
+ </Select.Indicator>
70
+ </Select.Trigger>
71
+
72
+ <Select.Portal>
73
+ <Select.Positioner>
74
+ <Select.Popup>
75
+ <Select.Header>
76
+ <IconField.Root>
77
+ <Select.Filter
78
+ size="small"
79
+ as={InputText}
80
+ value={filterValue}
81
+ onChange={(e: React.ChangeEvent<HTMLInputElement>) => setFilterValue(e.target.value)}
82
+ />
83
+ <IconField.Inset>
84
+ <Search />
85
+ </IconField.Inset>
86
+ </IconField.Root>
87
+ </Select.Header>
88
+ <Select.List style={{ maxHeight: '14rem' }}>
89
+ {filteredLanguages.map((l, index) => (
90
+ <Select.Option key={l.value} index={index} uKey={l.value} className="justify-between">
91
+ <div className="flex items-center gap-2">
92
+ <Image
93
+ alt={l.label}
94
+ src="https://primefaces.org/cdn/primevue/images/flag/flag_placeholder.png"
95
+ className={`flag flag-${l.code}`}
96
+ width={18}
97
+ height={12}
98
+ style={{ width: '18px', height: '12px' }}
99
+ />
100
+ <span>{l.label}</span>
101
+ </div>
102
+ <Select.OptionIndicator className="ml-4 data-unselected:invisible">
103
+ <Check />
104
+ </Select.OptionIndicator>
105
+ </Select.Option>
106
+ ))}
107
+ </Select.List>
108
+ <Select.Empty className="text-sm">No languages found</Select.Empty>
109
+ </Select.Popup>
110
+ </Select.Positioner>
111
+ </Select.Portal>
112
+ </Select.Root>
113
+ </div>
114
+ );
115
+ }
116
+ ```
117
+
118
+ ## Usage
119
+
120
+ ```tsx
121
+ import { Select } from '@primereact/ui/select';
122
+ ```
123
+
124
+ ```tsx
125
+ <Select.Root>
126
+ <Select.Trigger>
127
+ <Select.Value />
128
+ <Select.Clear />
129
+ <Select.Indicator />
130
+ </Select.Trigger>
131
+ <Select.Portal>
132
+ <Select.Positioner>
133
+ <Select.Popup>
134
+ <Select.Arrow />
135
+ <Select.Header>
136
+ <Select.Filter />
137
+ </Select.Header>
138
+ <Select.List>
139
+ <Select.Option>
140
+ <Select.OptionIndicator />
141
+ </Select.Option>
142
+ </Select.List>
143
+ <Select.Empty />
144
+ <Select.Footer />
145
+ </Select.Popup>
146
+ </Select.Positioner>
147
+ </Select.Portal>
148
+ </Select.Root>
149
+ ```
150
+
151
+ ## Examples
152
+
153
+ ### Basic
154
+
155
+ Choose a single value from a dropdown list of options.
156
+
157
+ ```tsx
158
+ 'use client';
159
+ import { ChevronDown } from '@primeicons/react/chevron-down';
160
+ import { Select, type SelectValueChangeEvent } from '@primereact/ui/select';
161
+ import * as React from 'react';
162
+
163
+ const languages = [
164
+ { label: 'English', value: 'en' },
165
+ { label: 'Deutsch', value: 'de' },
166
+ { label: 'Español', value: 'es' },
167
+ { label: 'Français', value: 'fr' },
168
+ { label: 'Italiano', value: 'it' },
169
+ { label: 'Türkçe', value: 'tr' },
170
+ { label: '日本語', value: 'ja' },
171
+ { label: '中文', value: 'zh' }
172
+ ];
173
+
174
+ export default function BasicDemo() {
175
+ const [language, setLanguage] = React.useState<string>('');
176
+
177
+ return (
178
+ <div className="flex justify-center">
179
+ <Select.Root
180
+ value={language}
181
+ onValueChange={(e: SelectValueChangeEvent) => setLanguage(e.value as string)}
182
+ options={languages}
183
+ optionLabel="label"
184
+ optionValue="value"
185
+ className="w-full md:w-56"
186
+ >
187
+ <Select.Trigger>
188
+ <Select.Value placeholder="Select a language" />
189
+ <Select.Indicator>
190
+ <ChevronDown />
191
+ </Select.Indicator>
192
+ </Select.Trigger>
193
+
194
+ <Select.Portal>
195
+ <Select.Positioner>
196
+ <Select.Popup>
197
+ <Select.List />
198
+ </Select.Popup>
199
+ </Select.Positioner>
200
+ </Select.Portal>
201
+ </Select.Root>
202
+ </div>
203
+ );
204
+ }
205
+ ```
206
+
207
+ ### Multiple
208
+
209
+ Use the `multiple` prop to allow selecting more than one item. Place `Select.OptionIndicator` inside each option with a check icon to indicate the selection state.
210
+
211
+ ```tsx
212
+ 'use client';
213
+ import { Check } from '@primeicons/react/check';
214
+ import { ChevronDown } from '@primeicons/react/chevron-down';
215
+ import { Times } from '@primeicons/react/times';
216
+ import { Select, type SelectValueChangeEvent } from '@primereact/ui/select';
217
+ import * as React from 'react';
218
+
219
+ const toppings = [
220
+ { label: 'Pepperoni', value: 'pepperoni' },
221
+ { label: 'Mushrooms', value: 'mushrooms' },
222
+ { label: 'Onions', value: 'onions' },
223
+ { label: 'Black Olives', value: 'olives' },
224
+ { label: 'Green Peppers', value: 'peppers' },
225
+ { label: 'Mozzarella', value: 'mozzarella' },
226
+ { label: 'Basil', value: 'basil' },
227
+ { label: 'Tomatoes', value: 'tomatoes' }
228
+ ];
229
+
230
+ export default function MultipleDemo() {
231
+ const [selected, setSelected] = React.useState<string[]>([]);
232
+
233
+ const getLabel = () => {
234
+ const first = toppings.find((t) => t.value === selected[0])?.label ?? selected[0];
235
+
236
+ return selected.length > 1 ? `${first} (+${selected.length - 1} more)` : first;
237
+ };
238
+
239
+ return (
240
+ <div className="flex justify-center">
241
+ <Select.Root
242
+ value={selected}
243
+ onValueChange={(e: SelectValueChangeEvent) => setSelected(e.value as string[])}
244
+ options={toppings}
245
+ optionLabel="label"
246
+ optionValue="value"
247
+ multiple
248
+ className="w-full md:w-56"
249
+ >
250
+ <Select.Trigger>
251
+ <Select.Value placeholder="Select toppings">{getLabel()}</Select.Value>
252
+ {selected.length > 0 && (
253
+ <Select.Clear>
254
+ <Times />
255
+ </Select.Clear>
256
+ )}
257
+ <Select.Indicator>
258
+ <ChevronDown />
259
+ </Select.Indicator>
260
+ </Select.Trigger>
261
+
262
+ <Select.Portal>
263
+ <Select.Positioner>
264
+ <Select.Popup>
265
+ <Select.List>
266
+ {toppings.map((topping, index) => (
267
+ <Select.Option key={topping.value} index={index} uKey={topping.value} className="gap-2">
268
+ <Select.OptionIndicator className="data-unselected:invisible">
269
+ <Check />
270
+ </Select.OptionIndicator>
271
+ {topping.label}
272
+ </Select.Option>
273
+ ))}
274
+ </Select.List>
275
+ </Select.Popup>
276
+ </Select.Positioner>
277
+ </Select.Portal>
278
+ </Select.Root>
279
+ </div>
280
+ );
281
+ }
282
+ ```
283
+
284
+ ### Checkmark
285
+
286
+ Use `Select.OptionIndicator` inside `Select.Option` to display a visual checkmark next to selected options. Apply `data-unselected:invisible` to hide the indicator when the option is not selected.
287
+
288
+ ```tsx
289
+ 'use client';
290
+ import { Check } from '@primeicons/react/check';
291
+ import { ChevronDown } from '@primeicons/react/chevron-down';
292
+ import { Select, type SelectValueChangeEvent } from '@primereact/ui/select';
293
+ import * as React from 'react';
294
+
295
+ const themes = [
296
+ { label: 'Light', value: 'light', icon: '☀️', description: 'Clean and bright interface' },
297
+ { label: 'Dark', value: 'dark', icon: '🌙', description: 'Easy on the eyes' },
298
+ { label: 'System', value: 'system', icon: '💻', description: 'Match your device settings' },
299
+ { label: 'High Contrast', value: 'high-contrast', icon: '◐', description: 'Maximum readability' }
300
+ ];
301
+
302
+ export default function CheckmarkDemo() {
303
+ const [theme, setTheme] = React.useState(themes[2]);
304
+
305
+ return (
306
+ <div className="flex justify-center">
307
+ <Select.Root
308
+ value={theme}
309
+ onValueChange={(e: SelectValueChangeEvent) => setTheme(e.value as (typeof themes)[number])}
310
+ options={themes}
311
+ optionLabel="label"
312
+ className="w-full md:w-64"
313
+ >
314
+ <Select.Trigger>
315
+ <Select.Value>
316
+ <span className="flex items-center gap-2">
317
+ <span>{theme?.icon}</span>
318
+ <span>{theme?.label}</span>
319
+ </span>
320
+ </Select.Value>
321
+ <Select.Indicator>
322
+ <ChevronDown />
323
+ </Select.Indicator>
324
+ </Select.Trigger>
325
+ <Select.Portal>
326
+ <Select.Positioner>
327
+ <Select.Popup>
328
+ <Select.List>
329
+ {themes.map((t, index) => (
330
+ <Select.Option key={t.value} index={index} uKey={t.value} className="justify-between">
331
+ <div className="flex items-center gap-3 py-1">
332
+ <span className="text-xl">{t.icon}</span>
333
+ <div className="flex flex-col">
334
+ <span className="font-medium">{t.label}</span>
335
+ <span className="text-xs text-surface-500">{t.description}</span>
336
+ </div>
337
+ </div>
338
+ <Select.OptionIndicator className="ml-4 data-unselected:invisible">
339
+ <Check />
340
+ </Select.OptionIndicator>
341
+ </Select.Option>
342
+ ))}
343
+ </Select.List>
344
+ </Select.Popup>
345
+ </Select.Positioner>
346
+ </Select.Portal>
347
+ </Select.Root>
348
+ </div>
349
+ );
350
+ }
351
+ ```
352
+
353
+ ### Checkbox Selection
354
+
355
+ Integrate `Checkbox` components inside options for a checkbox-based multiple selection experience with select all support.
356
+
357
+ ```tsx
358
+ 'use client';
359
+ import { Check } from '@primeicons/react/check';
360
+ import { ChevronDown } from '@primeicons/react/chevron-down';
361
+ import { Minus } from '@primeicons/react/minus';
362
+ import { Times } from '@primeicons/react/times';
363
+ import { Checkbox, type CheckboxRootChangeEvent } from '@primereact/ui/checkbox';
364
+ import type { ListboxListInstance } from '@primereact/ui/listbox';
365
+ import { Select, type SelectValueChangeEvent } from '@primereact/ui/select';
366
+ import * as React from 'react';
367
+
368
+ const cities = [
369
+ { name: 'New York', code: 'NY' },
370
+ { name: 'Rome', code: 'RM' },
371
+ { name: 'London', code: 'LDN' },
372
+ { name: 'Istanbul', code: 'IST' },
373
+ { name: 'Paris', code: 'PRS' }
374
+ ];
375
+
376
+ export default function CheckboxSelectionDemo() {
377
+ const [selectedCities, setSelectedCities] = React.useState<string[]>([]);
378
+
379
+ const isAllSelected = cities.every((city) => selectedCities.includes(city.code));
380
+ const indeterminate = cities.some((city) => selectedCities.includes(city.code)) && !isAllSelected;
381
+
382
+ const getLabel = () => {
383
+ if (selectedCities.length === 0) return undefined;
384
+
385
+ const first = cities.find((c) => c.code === selectedCities[0])?.name ?? selectedCities[0];
386
+
387
+ return selectedCities.length > 1 ? `${first} (+${selectedCities.length - 1} more)` : first;
388
+ };
389
+
390
+ return (
391
+ <div className="flex justify-center">
392
+ <Select.Root
393
+ value={selectedCities}
394
+ onValueChange={(e: SelectValueChangeEvent) => setSelectedCities(e.value as string[])}
395
+ options={cities}
396
+ optionValue="code"
397
+ optionKey="code"
398
+ multiple
399
+ className="w-full md:w-56"
400
+ >
401
+ <Select.Trigger>
402
+ <Select.Value placeholder="Select cities">{getLabel()}</Select.Value>
403
+ <Select.Clear>
404
+ <Times />
405
+ </Select.Clear>
406
+ <Select.Indicator>
407
+ <ChevronDown />
408
+ </Select.Indicator>
409
+ </Select.Trigger>
410
+
411
+ <Select.Portal>
412
+ <Select.Positioner>
413
+ <Select.Popup>
414
+ <Select.Header>
415
+ <Checkbox.Root
416
+ indeterminate={indeterminate}
417
+ checked={isAllSelected}
418
+ onCheckedChange={(e: CheckboxRootChangeEvent) =>
419
+ setSelectedCities(e.checked ? cities.map((city) => city.code) : [])
420
+ }
421
+ >
422
+ <Checkbox.Box>
423
+ <Checkbox.Indicator match="checked">
424
+ <Check />
425
+ </Checkbox.Indicator>
426
+ <Checkbox.Indicator match="indeterminate">
427
+ <Minus />
428
+ </Checkbox.Indicator>
429
+ </Checkbox.Box>
430
+ </Checkbox.Root>
431
+ </Select.Header>
432
+ <Select.List>
433
+ {(instance: ListboxListInstance) => {
434
+ const { listbox } = instance;
435
+ const options = instance.options as typeof cities | undefined | null;
436
+
437
+ return options?.map((option, index) => {
438
+ const selected = listbox?.isSelected(option);
439
+
440
+ return (
441
+ <Select.Option key={index} uKey={option.code} className="gap-2">
442
+ <Checkbox.Root defaultChecked={selected} tabIndex={-1} readOnly>
443
+ <Checkbox.Box>
444
+ <Checkbox.Indicator match="checked">
445
+ <Check />
446
+ </Checkbox.Indicator>
447
+ </Checkbox.Box>
448
+ </Checkbox.Root>
449
+ {option.name}
450
+ </Select.Option>
451
+ );
452
+ });
453
+ }}
454
+ </Select.List>
455
+ </Select.Popup>
456
+ </Select.Positioner>
457
+ </Select.Portal>
458
+ </Select.Root>
459
+ </div>
460
+ );
461
+ }
462
+ ```
463
+
464
+ ### Chips
465
+
466
+ Display selected items as removable chips by composing `Chip` components inside `Select.Value`.
467
+
468
+ ```tsx
469
+ 'use client';
470
+ import { ChevronDown } from '@primeicons/react/chevron-down';
471
+ import { Times } from '@primeicons/react/times';
472
+ import { Avatar } from '@primereact/ui/avatar';
473
+ import { Chip, type ChipRootRemoveEvent } from '@primereact/ui/chip';
474
+ import { Select, type SelectRootInstance, type SelectValueChangeEvent } from '@primereact/ui/select';
475
+ import * as React from 'react';
476
+
477
+ interface Member {
478
+ name: string;
479
+ code: string;
480
+ avatar: string;
481
+ }
482
+
483
+ const members: Member[] = [
484
+ { name: 'Amy Elsner', code: 'AE', avatar: 'https://primefaces.org/cdn/primevue/images/avatar/amyelsner.png' },
485
+ { name: 'Anna Fali', code: 'AF', avatar: 'https://primefaces.org/cdn/primevue/images/avatar/annafali.png' },
486
+ { name: 'Asiya Javayant', code: 'AJ', avatar: 'https://primefaces.org/cdn/primevue/images/avatar/asiyajavayant.png' },
487
+ { name: 'Bernardo Dominic', code: 'BD', avatar: 'https://primefaces.org/cdn/primevue/images/avatar/bernardodominic.png' },
488
+ { name: 'Elwin Sharvill', code: 'ES', avatar: 'https://primefaces.org/cdn/primevue/images/avatar/elwinsharvill.png' },
489
+ { name: 'Ioni Bowcher', code: 'IB', avatar: 'https://primefaces.org/cdn/primevue/images/avatar/ionibowcher.png' },
490
+ { name: 'Ivan Magalhaes', code: 'IM', avatar: 'https://primefaces.org/cdn/primevue/images/avatar/ivanmagalhaes.png' },
491
+ { name: 'Stephen Shaw', code: 'SS', avatar: 'https://primefaces.org/cdn/primevue/images/avatar/stephenshaw.png' }
492
+ ];
493
+
494
+ export default function ChipDemo() {
495
+ const [selected, setSelected] = React.useState<string[]>([]);
496
+ const selectRef = React.useRef<SelectRootInstance>(null);
497
+
498
+ const removeItem = (e: ChipRootRemoveEvent, code: string) => {
499
+ e.originalEvent.stopPropagation();
500
+ const currentIndex = selected.indexOf(code);
501
+ const next = selected.filter((c) => c !== code);
502
+
503
+ setSelected(next);
504
+
505
+ requestAnimationFrame(() => {
506
+ if (currentIndex > 0) {
507
+ const selectElement = selectRef.current?.elementRef.current;
508
+ const removeButtons = selectElement?.querySelectorAll<HTMLElement>('[data-scope="chip"][data-part="remove"]');
509
+
510
+ removeButtons?.[currentIndex - 1]?.focus();
511
+ } else {
512
+ selectRef.current?.focus();
513
+ }
514
+ });
515
+ };
516
+
517
+ return (
518
+ <div className="flex justify-center">
519
+ <Select.Root
520
+ ref={selectRef}
521
+ value={selected}
522
+ onValueChange={(e: SelectValueChangeEvent) => setSelected(e.value as string[])}
523
+ options={members}
524
+ optionLabel="name"
525
+ optionValue="code"
526
+ multiple
527
+ className="w-full"
528
+ >
529
+ <Select.Trigger>
530
+ <Select.Value placeholder="Select members">
531
+ {selected.length > 0 ? (
532
+ <div className="flex flex-wrap gap-1">
533
+ {selected.map((code) => {
534
+ const member = members.find((m) => m.code === code);
535
+
536
+ return member ? (
537
+ <Chip.Root key={code} className="py-0" onRemove={(e: ChipRootRemoveEvent) => removeItem(e, code)}>
538
+ <Chip.Start>
539
+ <Avatar.Root className="size-5!" shape="circle">
540
+ <Avatar.Image src={member.avatar} className="size-full!" />
541
+ <Avatar.Fallback className="text-[10px]!">{member.code}</Avatar.Fallback>
542
+ </Avatar.Root>
543
+ </Chip.Start>
544
+ <Chip.Label className="text-xs">{member.name.split(' ')[0]}</Chip.Label>
545
+ <Chip.Remove>
546
+ <Times />
547
+ </Chip.Remove>
548
+ </Chip.Root>
549
+ ) : null;
550
+ })}
551
+ </div>
552
+ ) : null}
553
+ </Select.Value>
554
+ <Select.Clear>
555
+ <Times />
556
+ </Select.Clear>
557
+ <Select.Indicator>
558
+ <ChevronDown />
559
+ </Select.Indicator>
560
+ </Select.Trigger>
561
+
562
+ <Select.Portal>
563
+ <Select.Positioner>
564
+ <Select.Popup>
565
+ <Select.List>
566
+ {members.map((member, index) => (
567
+ <Select.Option key={member.code} uKey={member.code} index={index} className="gap-2">
568
+ <Avatar.Root shape="circle" className="w-7 h-7">
569
+ <Avatar.Image src={member.avatar} />
570
+ <Avatar.Fallback>{member.code}</Avatar.Fallback>
571
+ </Avatar.Root>
572
+ <span>{member.name}</span>
573
+ </Select.Option>
574
+ ))}
575
+ </Select.List>
576
+ </Select.Popup>
577
+ </Select.Positioner>
578
+ </Select.Portal>
579
+ </Select.Root>
580
+ </div>
581
+ );
582
+ }
583
+ ```
584
+
585
+ ### Clear
586
+
587
+ Use `Select.Clear` inside the trigger to display a clear button that resets the selection.
588
+
589
+ ```tsx
590
+ 'use client';
591
+ import { ChevronDown } from '@primeicons/react/chevron-down';
592
+ import { Times } from '@primeicons/react/times';
593
+ import { Select, type SelectValueChangeEvent } from '@primereact/ui/select';
594
+ import { Tag } from '@primereact/ui/tag';
595
+ import * as React from 'react';
596
+
597
+ const productCategories = [
598
+ { label: 'Electronics', value: 'electronics', count: 1247 },
599
+ { label: 'Clothing', value: 'clothing', count: 856 },
600
+ { label: 'Garden', value: 'home', count: 634 },
601
+ { label: 'Sports', value: 'sports', count: 421 },
602
+ { label: 'Books', value: 'books', count: 2103 },
603
+ { label: 'Toys', value: 'toys', count: 312 }
604
+ ];
605
+
606
+ type CategoryOption = (typeof productCategories)[number] | null;
607
+
608
+ export default function ClearIconDemo() {
609
+ const [category, setCategory] = React.useState<CategoryOption>(null);
610
+
611
+ return (
612
+ <div className="flex flex-col items-center gap-4">
613
+ <div className="flex gap-3">
614
+ <Select.Root
615
+ value={category}
616
+ onValueChange={(e: SelectValueChangeEvent) => setCategory(e.value as CategoryOption)}
617
+ options={productCategories}
618
+ optionLabel="label"
619
+ className="w-full md:w-56"
620
+ >
621
+ <Select.Trigger>
622
+ <Select.Value placeholder="Category" />
623
+ <Select.Clear>
624
+ <Times />
625
+ </Select.Clear>
626
+ <Select.Indicator>
627
+ <ChevronDown />
628
+ </Select.Indicator>
629
+ </Select.Trigger>
630
+
631
+ <Select.Portal>
632
+ <Select.Positioner>
633
+ <Select.Popup>
634
+ <Select.List>
635
+ {productCategories.map((cat, index) => (
636
+ <Select.Option key={cat.value} index={index} uKey={cat.value}>
637
+ <div className="flex items-center justify-between w-full">
638
+ <span>{cat.label}</span>
639
+ <Tag severity="secondary" rounded>
640
+ {cat.count}
641
+ </Tag>
642
+ </div>
643
+ </Select.Option>
644
+ ))}
645
+ </Select.List>
646
+ </Select.Popup>
647
+ </Select.Positioner>
648
+ </Select.Portal>
649
+ </Select.Root>
650
+ </div>
651
+ </div>
652
+ );
653
+ }
654
+ ```
655
+
656
+ ### Filter
657
+
658
+ Add a search field inside the popup using `Select.Header` with `Select.Filter` to filter options. The `Select.Empty` component provides a message when no results match.
659
+
660
+ ```tsx
661
+ 'use client';
662
+ import { ChevronDown } from '@primeicons/react/chevron-down';
663
+ import { Search } from '@primeicons/react/search';
664
+ import { SelectValueChangeEvent } from '@primereact/ui/select';
665
+ import { IconField } from '@primereact/ui/iconfield';
666
+ import { InputText } from '@primereact/ui/inputtext';
667
+ import { Select } from '@primereact/ui/select';
668
+ import Image from 'next/image';
669
+ import * as React from 'react';
670
+
671
+ type Country = {
672
+ name: string;
673
+ code: string;
674
+ };
675
+
676
+ const countries = [
677
+ { name: 'Australia', code: 'AU' },
678
+ { name: 'Brazil', code: 'BR' },
679
+ { name: 'China', code: 'CN' },
680
+ { name: 'Egypt', code: 'EG' },
681
+ { name: 'France', code: 'FR' },
682
+ { name: 'Germany', code: 'DE' },
683
+ { name: 'India', code: 'IN' },
684
+ { name: 'Japan', code: 'JP' },
685
+ { name: 'Spain', code: 'ES' },
686
+ { name: 'Turkey', code: 'TR' },
687
+ { name: 'United States', code: 'US' }
688
+ ];
689
+
690
+ export default function FilterDemo() {
691
+ const [selectedCountry, setSelectedCountry] = React.useState<Country | null>(null);
692
+ const [filterValue, setFilterValue] = React.useState<string>('');
693
+ const filteredCountries = React.useMemo(
694
+ () => countries.filter((country) => country.name.toLowerCase().startsWith(filterValue.toLowerCase())),
695
+ [filterValue]
696
+ );
697
+
698
+ return (
699
+ <div className="flex justify-center">
700
+ <Select.Root
701
+ options={filteredCountries}
702
+ optionLabel="name"
703
+ value={selectedCountry}
704
+ onValueChange={(e: SelectValueChangeEvent) => setSelectedCountry(e.value as Country | null)}
705
+ className="w-full md:w-56"
706
+ >
707
+ <Select.Trigger>
708
+ <Select.Value placeholder="Select a Country" />
709
+ <Select.Indicator>
710
+ <ChevronDown />
711
+ </Select.Indicator>
712
+ </Select.Trigger>
713
+
714
+ <Select.Portal>
715
+ <Select.Positioner>
716
+ <Select.Popup>
717
+ <Select.Header>
718
+ <IconField.Root>
719
+ <Select.Filter
720
+ as={InputText}
721
+ value={filterValue}
722
+ onChange={(e: React.ChangeEvent<HTMLInputElement>) => setFilterValue(e.target.value)}
723
+ />
724
+ <IconField.Inset>
725
+ <Search />
726
+ </IconField.Inset>
727
+ </IconField.Root>
728
+ </Select.Header>
729
+ <Select.List style={{ maxHeight: '14rem' }}>
730
+ {filteredCountries.map((country, index) => (
731
+ <Select.Option key={country.code} index={index} uKey={country.code}>
732
+ <div className="flex items-center gap-2">
733
+ <Image
734
+ alt={country.name}
735
+ src="https://primefaces.org/cdn/primevue/images/flag/flag_placeholder.png"
736
+ className={`flag flag-${country.code.toLowerCase()} mr-2`}
737
+ width={18}
738
+ height={12}
739
+ style={{ width: '18px', height: '12px' }}
740
+ />
741
+ <span>{country.name}</span>
742
+ </div>
743
+ </Select.Option>
744
+ ))}
745
+ </Select.List>
746
+ <Select.Empty className="text-sm">No countries found</Select.Empty>
747
+ </Select.Popup>
748
+ </Select.Positioner>
749
+ </Select.Portal>
750
+ </Select.Root>
751
+ </div>
752
+ );
753
+ }
754
+ ```
755
+
756
+ ### Custom Option
757
+
758
+ Customize option content using a render function inside `Select.Option` that receives the option instance including the `selected` state.
759
+
760
+ ```tsx
761
+ 'use client';
762
+ import { ChevronDown } from '@primeicons/react/chevron-down';
763
+ import { Avatar } from '@primereact/ui/avatar';
764
+ import { Select, type SelectOptionInstance, type SelectValueChangeEvent } from '@primereact/ui/select';
765
+ import * as React from 'react';
766
+
767
+ const teamMembers = [
768
+ { id: 1, name: 'Sarah Chen', role: 'Engineering Lead', avatar: 'SC', status: 'away', className: 'bg-amber-400' },
769
+ { id: 2, name: 'Alex Rivera', role: 'Senior Developer', avatar: 'AR', status: 'online', className: 'bg-green-400' },
770
+ { id: 3, name: 'Jordan Kim', role: 'UX Designer', avatar: 'JK', status: 'away', className: 'bg-amber-400' },
771
+ { id: 4, name: 'Taylor Morgan', role: 'Product Manager', avatar: 'TM', status: 'offline', className: 'bg-zinc-400' },
772
+ { id: 5, name: 'Morgan Lee', role: 'DevOps Engineer', avatar: 'ML', status: 'online', className: 'bg-green-400' },
773
+ { id: 6, name: 'Casey Jones', role: 'QA Engineer', avatar: 'CJ', status: 'busy', className: 'bg-red-400' }
774
+ ];
775
+
776
+ type TeamMember = (typeof teamMembers)[number] | null;
777
+
778
+ export default function OptionDemo() {
779
+ const [assignee, setAssignee] = React.useState<TeamMember>(null);
780
+
781
+ return (
782
+ <div className="flex justify-center">
783
+ <Select.Root
784
+ value={assignee}
785
+ onValueChange={(e: SelectValueChangeEvent) => setAssignee(e.value as TeamMember)}
786
+ options={teamMembers}
787
+ optionLabel="name"
788
+ className="w-full md:w-56"
789
+ >
790
+ <Select.Trigger>
791
+ <Select.Value>
792
+ {assignee ? (
793
+ <span className="flex items-center gap-2">
794
+ <span className={`inline-block w-2 h-2 rounded-full ${assignee.className}`} />
795
+ <span>{assignee.name}</span>
796
+ </span>
797
+ ) : (
798
+ <span className="text-surface-400">Select team member...</span>
799
+ )}
800
+ </Select.Value>
801
+ <Select.Indicator>
802
+ <ChevronDown />
803
+ </Select.Indicator>
804
+ </Select.Trigger>
805
+ <Select.Portal>
806
+ <Select.Positioner>
807
+ <Select.Popup>
808
+ <Select.List style={{ maxHeight: '16rem' }}>
809
+ {teamMembers.map((member, index) => (
810
+ <Select.Option key={member.id} index={index} uKey={String(member.id)}>
811
+ {(instance: SelectOptionInstance) => {
812
+ const { selected } = instance;
813
+
814
+ return (
815
+ <div className="flex items-center gap-3 py-1">
816
+ <div className="relative">
817
+ <Avatar.Root shape="circle" className="w-8 h-8">
818
+ <Avatar.Fallback>{member.avatar}</Avatar.Fallback>
819
+ </Avatar.Root>
820
+ <span
821
+ 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.className}`}
822
+ />
823
+ </div>
824
+ <div className="flex flex-col">
825
+ <span
826
+ className={`font-medium ${selected ? 'text-primary-contrast' : 'text-surface-900 dark:text-surface-0'}`}
827
+ >
828
+ {member.name}
829
+ </span>
830
+ <span
831
+ className={`text-xs ${selected ? 'text-primary-contrast/70' : 'text-surface-500 dark:text-surface-400'}`}
832
+ >
833
+ {member.role}
834
+ </span>
835
+ </div>
836
+ </div>
837
+ );
838
+ }}
839
+ </Select.Option>
840
+ ))}
841
+ </Select.List>
842
+ </Select.Popup>
843
+ </Select.Positioner>
844
+ </Select.Portal>
845
+ </Select.Root>
846
+ </div>
847
+ );
848
+ }
849
+ ```
850
+
851
+ ### Group
852
+
853
+ #### Simple
854
+
855
+ Options can be grouped using the `optionGroupLabel` and `optionGroupChildren` properties.
856
+
857
+ ```tsx
858
+ 'use client';
859
+ import { ChevronDown } from '@primeicons/react/chevron-down';
860
+ import { Select, type SelectValueChangeEvent } from '@primereact/ui/select';
861
+ import * as React from 'react';
862
+
863
+ const jobCategories = [
864
+ {
865
+ label: 'Engineering',
866
+ code: 'eng',
867
+ items: [
868
+ { label: 'Frontend Developer', value: 'frontend' },
869
+ { label: 'Backend Developer', value: 'backend' },
870
+ { label: 'Full Stack Developer', value: 'fullstack' },
871
+ { label: 'DevOps Engineer', value: 'devops' },
872
+ { label: 'QA Engineer', value: 'qa' }
873
+ ]
874
+ },
875
+ {
876
+ label: 'Design',
877
+ code: 'design',
878
+ items: [
879
+ { label: 'UI Designer', value: 'ui' },
880
+ { label: 'UX Designer', value: 'ux' },
881
+ { label: 'Product Designer', value: 'product-design' },
882
+ { label: 'Brand Designer', value: 'brand' }
883
+ ]
884
+ },
885
+ {
886
+ label: 'Product',
887
+ code: 'product',
888
+ items: [
889
+ { label: 'Product Manager', value: 'pm' },
890
+ { label: 'Product Owner', value: 'po' },
891
+ { label: 'Business Analyst', value: 'ba' }
892
+ ]
893
+ },
894
+ {
895
+ label: 'Marketing',
896
+ code: 'marketing',
897
+ items: [
898
+ { label: 'Growth Manager', value: 'growth' },
899
+ { label: 'Content Strategist', value: 'content' },
900
+ { label: 'SEO Specialist', value: 'seo' }
901
+ ]
902
+ }
903
+ ];
904
+
905
+ type Option = (typeof jobCategories)[number]['items'][number] | null;
906
+
907
+ export default function GroupDemo() {
908
+ const [position, setPosition] = React.useState<Option | null>(null);
909
+
910
+ return (
911
+ <div className="flex justify-center">
912
+ <Select.Root
913
+ value={position}
914
+ onValueChange={(e: SelectValueChangeEvent) => setPosition(e.value as Option)}
915
+ options={jobCategories}
916
+ optionLabel="label"
917
+ optionValue="value"
918
+ optionGroupLabel="label"
919
+ optionGroupChildren="items"
920
+ className="w-full md:w-56"
921
+ >
922
+ <Select.Trigger>
923
+ <Select.Value placeholder="Select a position..." />
924
+ <Select.Indicator>
925
+ <ChevronDown />
926
+ </Select.Indicator>
927
+ </Select.Trigger>
928
+
929
+ <Select.Portal>
930
+ <Select.Positioner>
931
+ <Select.Popup>
932
+ <Select.List style={{ maxHeight: '18rem' }} />
933
+ </Select.Popup>
934
+ </Select.Positioner>
935
+ </Select.Portal>
936
+ </Select.Root>
937
+ </div>
938
+ );
939
+ }
940
+ ```
941
+
942
+ #### Custom
943
+
944
+ Customize group headers with custom rendering by accessing the list instance inside `Select.List`.
945
+
946
+ ```tsx
947
+ 'use client';
948
+ import { ChevronDown } from '@primeicons/react/chevron-down';
949
+ import type { ListboxListInstance } from '@primereact/ui/listbox';
950
+ import { Select, type SelectValueChangeEvent } from '@primereact/ui/select';
951
+ import * as React from 'react';
952
+
953
+ const groupedCities = [
954
+ {
955
+ label: 'Germany',
956
+ code: 'DE',
957
+ items: [
958
+ { label: 'Berlin', value: 'Berlin' },
959
+ { label: 'Frankfurt', value: 'Frankfurt' },
960
+ { label: 'Hamburg', value: 'Hamburg' },
961
+ { label: 'Munich', value: 'Munich' }
962
+ ]
963
+ },
964
+ {
965
+ label: 'USA',
966
+ code: 'US',
967
+ items: [
968
+ { label: 'Chicago', value: 'Chicago' },
969
+ { label: 'Los Angeles', value: 'Los Angeles' },
970
+ { label: 'New York', value: 'New York' },
971
+ { label: 'San Francisco', value: 'San Francisco' }
972
+ ]
973
+ },
974
+ {
975
+ label: 'Japan',
976
+ code: 'JP',
977
+ items: [
978
+ { label: 'Kyoto', value: 'Kyoto' },
979
+ { label: 'Osaka', value: 'Osaka' },
980
+ { label: 'Tokyo', value: 'Tokyo' },
981
+ { label: 'Yokohama', value: 'Yokohama' }
982
+ ]
983
+ }
984
+ ];
985
+
986
+ const countryFlags: Record<string, string> = {
987
+ DE: '\uD83C\uDDE9\uD83C\uDDEA',
988
+ US: '\uD83C\uDDFA\uD83C\uDDF8',
989
+ JP: '\uD83C\uDDEF\uD83C\uDDF5'
990
+ };
991
+
992
+ export default function CustomGroupDemo() {
993
+ const [selectedCity, setSelectedCity] = React.useState<string | null>(null);
994
+
995
+ return (
996
+ <div className="flex justify-center">
997
+ <Select.Root
998
+ value={selectedCity}
999
+ onValueChange={(e: SelectValueChangeEvent) => setSelectedCity(e.value as string | null)}
1000
+ options={groupedCities}
1001
+ optionLabel="label"
1002
+ optionGroupLabel="label"
1003
+ optionGroupChildren="items"
1004
+ className="w-full md:w-56"
1005
+ >
1006
+ <Select.Trigger>
1007
+ <Select.Value placeholder="Select a city" />
1008
+ <Select.Indicator>
1009
+ <ChevronDown />
1010
+ </Select.Indicator>
1011
+ </Select.Trigger>
1012
+
1013
+ <Select.Portal>
1014
+ <Select.Positioner>
1015
+ <Select.Popup>
1016
+ <Select.List style={{ maxHeight: '18rem' }} className="p-0!">
1017
+ {(instance: ListboxListInstance) => {
1018
+ const { listbox, options } = instance;
1019
+
1020
+ return (options as unknown[])?.map((option: unknown, index: number) => {
1021
+ const isGroup = listbox?.isOptionGroup(option);
1022
+
1023
+ if (isGroup) {
1024
+ const optionGroup = (option as Record<string, unknown>).optionGroup as Record<string, string>;
1025
+ const code = optionGroup?.code;
1026
+
1027
+ return (
1028
+ <Select.Option
1029
+ key={index}
1030
+ index={index}
1031
+ group
1032
+ className="flex items-center gap-2 sticky top-0 z-1 bg-surface-0! dark:bg-surface-900! border-b border-surface"
1033
+ >
1034
+ <span>{countryFlags[code]}</span>
1035
+ <span>{optionGroup?.label}</span>
1036
+ </Select.Option>
1037
+ );
1038
+ }
1039
+
1040
+ const label = listbox?.getOptionLabel(option);
1041
+
1042
+ return (
1043
+ <Select.Option key={index} index={index}>
1044
+ {label}
1045
+ </Select.Option>
1046
+ );
1047
+ });
1048
+ }}
1049
+ </Select.List>
1050
+ </Select.Popup>
1051
+ </Select.Positioner>
1052
+ </Select.Portal>
1053
+ </Select.Root>
1054
+ </div>
1055
+ );
1056
+ }
1057
+ ```
1058
+
1059
+ #### Checkbox and Filter
1060
+
1061
+ Combine grouped options, checkbox selection, and a filter to create a rich multi-select experience with a compact trigger that displays the selection count.
1062
+
1063
+ ```tsx
1064
+ 'use client';
1065
+ import { Check } from '@primeicons/react/check';
1066
+ import { Search } from '@primeicons/react/search';
1067
+ import { Tag as TagIcon } from '@primeicons/react/tag';
1068
+ import { Button } from '@primereact/ui/button';
1069
+ import { Checkbox } from '@primereact/ui/checkbox';
1070
+ import { Chip } from '@primereact/ui/chip';
1071
+ import { IconField } from '@primereact/ui/iconfield';
1072
+ import { InputText } from '@primereact/ui/inputtext';
1073
+ import type { ListboxListInstance } from '@primereact/ui/listbox';
1074
+ import { Select, type SelectValueChangeEvent } from '@primereact/ui/select';
1075
+ import * as React from 'react';
1076
+
1077
+ const labelGroups = [
1078
+ {
1079
+ label: 'Critical',
1080
+ code: 'critical',
1081
+ items: [
1082
+ { label: 'Security', value: 'security' },
1083
+ {
1084
+ label: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.',
1085
+ value: 'lorem'
1086
+ }
1087
+ ]
1088
+ },
1089
+ {
1090
+ label: 'Optional',
1091
+ code: 'optional',
1092
+ items: [
1093
+ { label: 'Feature', value: 'feature' },
1094
+ { label: 'Other', value: 'other' }
1095
+ ]
1096
+ }
1097
+ ];
1098
+
1099
+ const allItems = labelGroups.flatMap((g) => g.items);
1100
+
1101
+ export default function GroupCheckboxFilterDemo() {
1102
+ const [selected, setSelected] = React.useState<string[]>(['security']);
1103
+ const [filterValue, setFilterValue] = React.useState<string>('');
1104
+
1105
+ const filteredGroups = React.useMemo(() => {
1106
+ if (!filterValue) return labelGroups;
1107
+
1108
+ return labelGroups
1109
+ .map((group) => ({
1110
+ ...group,
1111
+ items: group.items.filter((item) => item.label.toLowerCase().includes(filterValue.toLowerCase()))
1112
+ }))
1113
+ .filter((group) => group.items.length > 0);
1114
+ }, [filterValue]);
1115
+
1116
+ const handleSelectAll = () => {
1117
+ const visibleValues = filteredGroups.flatMap((g) => g.items.map((i) => i.value));
1118
+
1119
+ setSelected([...new Set([...selected, ...visibleValues])]);
1120
+ };
1121
+
1122
+ const handleClear = (e: React.MouseEvent) => {
1123
+ e.stopPropagation();
1124
+ setSelected([]);
1125
+ };
1126
+
1127
+ const getTriggerLabel = () => {
1128
+ if (selected.length === 0) return null;
1129
+
1130
+ const first = allItems.find((i) => i.value === selected[0])?.label ?? selected[0];
1131
+
1132
+ return selected.length > 1 ? `${first} +${selected.length - 1}` : first;
1133
+ };
1134
+
1135
+ return (
1136
+ <div className="flex justify-center">
1137
+ <Select.Root
1138
+ value={selected}
1139
+ onValueChange={(e: SelectValueChangeEvent) => setSelected(e.value as string[])}
1140
+ options={filteredGroups}
1141
+ optionLabel="label"
1142
+ optionValue="value"
1143
+ optionKey="value"
1144
+ optionGroupLabel="label"
1145
+ optionGroupChildren="items"
1146
+ multiple
1147
+ className="w-full md:w-64 border-0! bg-transparent! shadow-none!"
1148
+ >
1149
+ <Select.Trigger>
1150
+ <Select.Value placeholder="Select labels" className="p-0!">
1151
+ {getTriggerLabel() && (
1152
+ <Chip.Root className="bg-blue-50! dark:bg-blue-950! **:text-blue-700! dark:**:text-blue-300!">
1153
+ <Chip.Start>
1154
+ <TagIcon />
1155
+ </Chip.Start>
1156
+ <Chip.Label>{getTriggerLabel()}</Chip.Label>
1157
+ </Chip.Root>
1158
+ )}
1159
+ </Select.Value>
1160
+ </Select.Trigger>
1161
+
1162
+ <Select.Portal>
1163
+ <Select.Positioner>
1164
+ <Select.Popup>
1165
+ <Select.Header className="flex flex-col gap-2 p-2! border-b border-surface">
1166
+ <IconField.Root>
1167
+ <IconField.Inset>
1168
+ <Search />
1169
+ </IconField.Inset>
1170
+ <Select.Filter
1171
+ as={InputText}
1172
+ value={filterValue}
1173
+ onChange={(e: React.ChangeEvent<HTMLInputElement>) => setFilterValue(e.target.value)}
1174
+ placeholder="Search..."
1175
+ />
1176
+ </IconField.Root>
1177
+ <div className="flex items-center gap-1 px-1">
1178
+ <Button variant="text" size="small" onClick={handleSelectAll}>
1179
+ Select All
1180
+ </Button>
1181
+ <Button variant="text" size="small" severity="secondary" onClick={handleClear}>
1182
+ Clear
1183
+ </Button>
1184
+ </div>
1185
+ </Select.Header>
1186
+
1187
+ <Select.List style={{ maxHeight: '18rem' }}>
1188
+ {(instance: ListboxListInstance) => {
1189
+ const { listbox, options } = instance;
1190
+
1191
+ return (options as unknown[])?.map((option: unknown, index: number) => {
1192
+ if (listbox?.isOptionGroup(option)) {
1193
+ const group = (option as Record<string, unknown>).optionGroup as Record<string, string>;
1194
+
1195
+ return (
1196
+ <Select.Option
1197
+ key={index}
1198
+ index={index}
1199
+ group
1200
+ className="text-xs! font-semibold! text-surface-500! uppercase tracking-wide"
1201
+ >
1202
+ {group?.label}
1203
+ </Select.Option>
1204
+ );
1205
+ }
1206
+
1207
+ const isSelected = listbox?.isSelected(option) ?? false;
1208
+
1209
+ return (
1210
+ <Select.Option key={index} index={index} className="gap-2">
1211
+ <Checkbox.Root defaultChecked={isSelected} tabIndex={-1} readOnly>
1212
+ <Checkbox.Box>
1213
+ <Checkbox.Indicator match="checked">
1214
+ <Check />
1215
+ </Checkbox.Indicator>
1216
+ </Checkbox.Box>
1217
+ </Checkbox.Root>
1218
+ <span className="flex-1 truncate">{listbox?.getOptionLabel(option)}</span>
1219
+ </Select.Option>
1220
+ );
1221
+ });
1222
+ }}
1223
+ </Select.List>
1224
+
1225
+ <Select.Empty className="text-sm text-center py-4! text-surface-400">No labels found</Select.Empty>
1226
+ </Select.Popup>
1227
+ </Select.Positioner>
1228
+ </Select.Portal>
1229
+ </Select.Root>
1230
+ </div>
1231
+ );
1232
+ }
1233
+ ```
1234
+
1235
+ ### Arrow
1236
+
1237
+ Use `Select.Arrow` inside the popup to display a visual arrow pointing to the trigger element.
1238
+
1239
+ ```tsx
1240
+ 'use client';
1241
+ import { ChevronDown } from '@primeicons/react/chevron-down';
1242
+ import { Select, type SelectValueChangeEvent } from '@primereact/ui/select';
1243
+ import * as React from 'react';
1244
+
1245
+ const languages = [
1246
+ { label: 'English', value: 'en' },
1247
+ { label: 'Deutsch', value: 'de' },
1248
+ { label: 'Español', value: 'es' },
1249
+ { label: 'Français', value: 'fr' },
1250
+ { label: 'Italiano', value: 'it' },
1251
+ { label: 'Türkçe', value: 'tr' },
1252
+ { label: '日本語', value: 'ja' },
1253
+ { label: '中文', value: 'zh' }
1254
+ ];
1255
+
1256
+ export default function ArrowDemo() {
1257
+ const [language, setLanguage] = React.useState<string>('');
1258
+
1259
+ return (
1260
+ <div className="flex justify-center">
1261
+ <Select.Root
1262
+ value={language}
1263
+ onValueChange={(e: SelectValueChangeEvent) => setLanguage(e.value as string)}
1264
+ options={languages}
1265
+ optionLabel="label"
1266
+ optionValue="value"
1267
+ className="w-full md:w-56"
1268
+ >
1269
+ <Select.Trigger>
1270
+ <Select.Value placeholder="Select a language" />
1271
+ <Select.Indicator>
1272
+ <ChevronDown />
1273
+ </Select.Indicator>
1274
+ </Select.Trigger>
1275
+
1276
+ <Select.Portal>
1277
+ <Select.Positioner sideOffset={12}>
1278
+ <Select.Popup>
1279
+ <Select.Arrow />
1280
+ <Select.List />
1281
+ </Select.Popup>
1282
+ </Select.Positioner>
1283
+ </Select.Portal>
1284
+ </Select.Root>
1285
+ </div>
1286
+ );
1287
+ }
1288
+ ```
1289
+
1290
+ ### Float Label
1291
+
1292
+ Integrate with `FloatLabel` for animated label behavior with three variants: over, in, and on.
1293
+
1294
+ ```tsx
1295
+ import { ChevronDown } from '@primeicons/react/chevron-down';
1296
+ import { FloatLabel } from '@primereact/ui/floatlabel';
1297
+ import { Label } from '@primereact/ui/label';
1298
+ import { Select } from '@primereact/ui/select';
1299
+
1300
+ const cities = [
1301
+ { name: 'New York', code: 'NY' },
1302
+ { name: 'Rome', code: 'RM' },
1303
+ { name: 'London', code: 'LDN' },
1304
+ { name: 'Istanbul', code: 'IST' },
1305
+ { name: 'Paris', code: 'PRS' }
1306
+ ];
1307
+
1308
+ export default function FloatLabelDemo() {
1309
+ return (
1310
+ <div className="flex flex-wrap justify-center items-end gap-4">
1311
+ <FloatLabel>
1312
+ <Select.Root options={cities} optionLabel="name" className="w-full md:w-56">
1313
+ <Select.Trigger id="over_label">
1314
+ <Select.Value />
1315
+ <Select.Indicator>
1316
+ <ChevronDown />
1317
+ </Select.Indicator>
1318
+ </Select.Trigger>
1319
+
1320
+ <Select.Portal>
1321
+ <Select.Positioner>
1322
+ <Select.Popup>
1323
+ <Select.List />
1324
+ </Select.Popup>
1325
+ </Select.Positioner>
1326
+ </Select.Portal>
1327
+ </Select.Root>
1328
+
1329
+ <Label htmlFor="over_label">Over Label</Label>
1330
+ </FloatLabel>
1331
+
1332
+ <FloatLabel variant="in">
1333
+ <Select.Root options={cities} optionLabel="name" className="w-full md:w-56">
1334
+ <Select.Trigger id="in_label">
1335
+ <Select.Value />
1336
+ <Select.Indicator>
1337
+ <ChevronDown />
1338
+ </Select.Indicator>
1339
+ </Select.Trigger>
1340
+
1341
+ <Select.Portal>
1342
+ <Select.Positioner>
1343
+ <Select.Popup>
1344
+ <Select.List />
1345
+ </Select.Popup>
1346
+ </Select.Positioner>
1347
+ </Select.Portal>
1348
+ </Select.Root>
1349
+
1350
+ <Label htmlFor="in_label">In Label</Label>
1351
+ </FloatLabel>
1352
+
1353
+ <FloatLabel variant="on">
1354
+ <Select.Root options={cities} optionLabel="name" className="w-full md:w-56">
1355
+ <Select.Trigger id="on_label">
1356
+ <Select.Value />
1357
+ <Select.Indicator>
1358
+ <ChevronDown />
1359
+ </Select.Indicator>
1360
+ </Select.Trigger>
1361
+
1362
+ <Select.Portal>
1363
+ <Select.Positioner>
1364
+ <Select.Popup>
1365
+ <Select.List />
1366
+ </Select.Popup>
1367
+ </Select.Positioner>
1368
+ </Select.Portal>
1369
+ </Select.Root>
1370
+
1371
+ <Label htmlFor="on_label">On Label</Label>
1372
+ </FloatLabel>
1373
+ </div>
1374
+ );
1375
+ }
1376
+ ```
1377
+
1378
+ ### Ifta Label
1379
+
1380
+ Use `IftaLabel` for an infield top-aligned label pattern.
1381
+
1382
+ ```tsx
1383
+ import { ChevronDown } from '@primeicons/react/chevron-down';
1384
+ import { IftaLabel } from '@primereact/ui/iftalabel';
1385
+ import { Label } from '@primereact/ui/label';
1386
+ import { Select } from '@primereact/ui/select';
1387
+
1388
+ const cities = [
1389
+ { name: 'New York', code: 'NY' },
1390
+ { name: 'Rome', code: 'RM' },
1391
+ { name: 'London', code: 'LDN' },
1392
+ { name: 'Istanbul', code: 'IST' },
1393
+ { name: 'Paris', code: 'PRS' }
1394
+ ];
1395
+
1396
+ export default function IftaLabelDemo() {
1397
+ return (
1398
+ <div className="flex justify-center">
1399
+ <IftaLabel>
1400
+ <Select.Root options={cities} optionLabel="name" variant="filled" className="w-full md:w-56">
1401
+ <Select.Trigger id="select">
1402
+ <Select.Value />
1403
+ <Select.Indicator>
1404
+ <ChevronDown />
1405
+ </Select.Indicator>
1406
+ </Select.Trigger>
1407
+
1408
+ <Select.Portal>
1409
+ <Select.Positioner>
1410
+ <Select.Popup>
1411
+ <Select.List />
1412
+ </Select.Popup>
1413
+ </Select.Positioner>
1414
+ </Select.Portal>
1415
+ </Select.Root>
1416
+
1417
+ <Label htmlFor="select" className="mb-2">
1418
+ City
1419
+ </Label>
1420
+ </IftaLabel>
1421
+ </div>
1422
+ );
1423
+ }
1424
+ ```
1425
+
1426
+ ### Fluid
1427
+
1428
+ Use the `fluid` property to make the select take up the full width of its container.
1429
+
1430
+ ```tsx
1431
+ import { ChevronDown } from '@primeicons/react/chevron-down';
1432
+ import { Select } from '@primereact/ui/select';
1433
+
1434
+ const cities = [
1435
+ { name: 'New York', code: 'NY' },
1436
+ { name: 'Rome', code: 'RM' },
1437
+ { name: 'London', code: 'LDN' },
1438
+ { name: 'Istanbul', code: 'IST' },
1439
+ { name: 'Paris', code: 'PRS' }
1440
+ ];
1441
+
1442
+ export default function FluidDemo() {
1443
+ return (
1444
+ <div>
1445
+ <Select.Root options={cities} optionLabel="name" fluid>
1446
+ <Select.Trigger>
1447
+ <Select.Value placeholder="Select a City" />
1448
+ <Select.Indicator>
1449
+ <ChevronDown />
1450
+ </Select.Indicator>
1451
+ </Select.Trigger>
1452
+
1453
+ <Select.Portal>
1454
+ <Select.Positioner>
1455
+ <Select.Popup>
1456
+ <Select.List />
1457
+ </Select.Popup>
1458
+ </Select.Positioner>
1459
+ </Select.Portal>
1460
+ </Select.Root>
1461
+ </div>
1462
+ );
1463
+ }
1464
+ ```
1465
+
1466
+ ### Sizes
1467
+
1468
+ Use the `size` property to change the size of a select.
1469
+
1470
+ ```tsx
1471
+ import { ChevronDown } from '@primeicons/react/chevron-down';
1472
+ import { Select } from '@primereact/ui/select';
1473
+
1474
+ const cities = [
1475
+ { name: 'New York', code: 'NY' },
1476
+ { name: 'Rome', code: 'RM' },
1477
+ { name: 'London', code: 'LDN' },
1478
+ { name: 'Istanbul', code: 'IST' },
1479
+ { name: 'Paris', code: 'PRS' }
1480
+ ];
1481
+
1482
+ export default function SizesDemo() {
1483
+ return (
1484
+ <div className="flex flex-col items-center gap-4">
1485
+ <Select.Root options={cities} optionLabel="name" size="small" className="w-full md:w-56">
1486
+ <Select.Trigger>
1487
+ <Select.Value placeholder="Small" />
1488
+ <Select.Indicator>
1489
+ <ChevronDown />
1490
+ </Select.Indicator>
1491
+ </Select.Trigger>
1492
+
1493
+ <Select.Portal>
1494
+ <Select.Positioner>
1495
+ <Select.Popup>
1496
+ <Select.List />
1497
+ </Select.Popup>
1498
+ </Select.Positioner>
1499
+ </Select.Portal>
1500
+ </Select.Root>
1501
+
1502
+ <Select.Root options={cities} optionLabel="name" className="w-full md:w-56">
1503
+ <Select.Trigger>
1504
+ <Select.Value placeholder="Normal" />
1505
+ <Select.Indicator>
1506
+ <ChevronDown />
1507
+ </Select.Indicator>
1508
+ </Select.Trigger>
1509
+
1510
+ <Select.Portal>
1511
+ <Select.Positioner>
1512
+ <Select.Popup>
1513
+ <Select.List />
1514
+ </Select.Popup>
1515
+ </Select.Positioner>
1516
+ </Select.Portal>
1517
+ </Select.Root>
1518
+
1519
+ <Select.Root options={cities} optionLabel="name" size="large" className="w-full md:w-56">
1520
+ <Select.Trigger>
1521
+ <Select.Value placeholder="Large" />
1522
+ <Select.Indicator>
1523
+ <ChevronDown />
1524
+ </Select.Indicator>
1525
+ </Select.Trigger>
1526
+
1527
+ <Select.Portal>
1528
+ <Select.Positioner>
1529
+ <Select.Popup>
1530
+ <Select.List />
1531
+ </Select.Popup>
1532
+ </Select.Positioner>
1533
+ </Select.Portal>
1534
+ </Select.Root>
1535
+ </div>
1536
+ );
1537
+ }
1538
+ ```
1539
+
1540
+ ### Filled
1541
+
1542
+ Specify the `variant="filled"` property to display the component with a higher visual emphasis than the default outlined style.
1543
+
1544
+ ```tsx
1545
+ import { ChevronDown } from '@primeicons/react/chevron-down';
1546
+ import { Select } from '@primereact/ui/select';
1547
+
1548
+ const cities = [
1549
+ { name: 'New York', code: 'NY' },
1550
+ { name: 'Rome', code: 'RM' },
1551
+ { name: 'London', code: 'LDN' },
1552
+ { name: 'Istanbul', code: 'IST' },
1553
+ { name: 'Paris', code: 'PRS' }
1554
+ ];
1555
+
1556
+ export default function FilledDemo() {
1557
+ return (
1558
+ <div className="flex justify-center">
1559
+ <Select.Root options={cities} optionLabel="name" variant="filled" className="w-full md:w-56">
1560
+ <Select.Trigger>
1561
+ <Select.Value placeholder="Select a City" />
1562
+ <Select.Indicator>
1563
+ <ChevronDown />
1564
+ </Select.Indicator>
1565
+ </Select.Trigger>
1566
+
1567
+ <Select.Portal>
1568
+ <Select.Positioner>
1569
+ <Select.Popup>
1570
+ <Select.List />
1571
+ </Select.Popup>
1572
+ </Select.Positioner>
1573
+ </Select.Portal>
1574
+ </Select.Root>
1575
+ </div>
1576
+ );
1577
+ }
1578
+ ```
1579
+
1580
+ ### Disabled
1581
+
1582
+ Use the `disabled` property to disable a select.
1583
+
1584
+ ```tsx
1585
+ import { ChevronDown } from '@primeicons/react/chevron-down';
1586
+ import { Select } from '@primereact/ui/select';
1587
+
1588
+ const cities = [
1589
+ { name: 'New York', code: 'NY' },
1590
+ { name: 'Rome', code: 'RM' },
1591
+ { name: 'London', code: 'LDN' },
1592
+ { name: 'Istanbul', code: 'IST' },
1593
+ { name: 'Paris', code: 'PRS' }
1594
+ ];
1595
+
1596
+ export default function DisabledDemo() {
1597
+ return (
1598
+ <div className="flex justify-center">
1599
+ <Select.Root options={cities} optionLabel="name" disabled className="w-full md:w-56">
1600
+ <Select.Trigger>
1601
+ <Select.Value placeholder="Select a City" />
1602
+ <Select.Indicator>
1603
+ <ChevronDown />
1604
+ </Select.Indicator>
1605
+ </Select.Trigger>
1606
+
1607
+ <Select.Portal>
1608
+ <Select.Positioner>
1609
+ <Select.Popup>
1610
+ <Select.List />
1611
+ </Select.Popup>
1612
+ </Select.Positioner>
1613
+ </Select.Portal>
1614
+ </Select.Root>
1615
+ </div>
1616
+ );
1617
+ }
1618
+ ```
1619
+
1620
+ ### Invalid
1621
+
1622
+ Specify the `invalid` property to display the component with a red border for validation errors.
1623
+
1624
+ ```tsx
1625
+ 'use client';
1626
+ import { ChevronDown } from '@primeicons/react/chevron-down';
1627
+ import { Select, type SelectValueChangeEvent } from '@primereact/ui/select';
1628
+ import * as React from 'react';
1629
+
1630
+ const cities = [
1631
+ { name: 'New York', code: 'NY' },
1632
+ { name: 'Rome', code: 'RM' },
1633
+ { name: 'London', code: 'LDN' },
1634
+ { name: 'Istanbul', code: 'IST' },
1635
+ { name: 'Paris', code: 'PRS' }
1636
+ ];
1637
+
1638
+ export default function InvalidDemo() {
1639
+ const [value, setValue] = React.useState<string | null>(null);
1640
+ const [value2, setValue2] = React.useState<string | null>(null);
1641
+
1642
+ return (
1643
+ <div className="flex flex-wrap justify-center gap-4">
1644
+ <Select.Root
1645
+ options={cities}
1646
+ optionLabel="name"
1647
+ invalid={!value}
1648
+ className="w-full md:w-56"
1649
+ value={value}
1650
+ onValueChange={(event: SelectValueChangeEvent) => setValue(event.value as string)}
1651
+ >
1652
+ <Select.Trigger>
1653
+ <Select.Value placeholder="Select a City" />
1654
+ <Select.Indicator>
1655
+ <ChevronDown />
1656
+ </Select.Indicator>
1657
+ </Select.Trigger>
1658
+
1659
+ <Select.Portal>
1660
+ <Select.Positioner>
1661
+ <Select.Popup>
1662
+ <Select.List />
1663
+ </Select.Popup>
1664
+ </Select.Positioner>
1665
+ </Select.Portal>
1666
+ </Select.Root>
1667
+
1668
+ <Select.Root
1669
+ options={cities}
1670
+ optionLabel="name"
1671
+ invalid={!value2}
1672
+ variant="filled"
1673
+ className="w-full md:w-56"
1674
+ value={value2}
1675
+ onValueChange={(event: SelectValueChangeEvent) => setValue2(event.value as string)}
1676
+ >
1677
+ <Select.Trigger>
1678
+ <Select.Value placeholder="Select a City" />
1679
+ <Select.Indicator>
1680
+ <ChevronDown />
1681
+ </Select.Indicator>
1682
+ </Select.Trigger>
1683
+
1684
+ <Select.Portal>
1685
+ <Select.Positioner>
1686
+ <Select.Popup>
1687
+ <Select.List />
1688
+ </Select.Popup>
1689
+ </Select.Positioner>
1690
+ </Select.Portal>
1691
+ </Select.Root>
1692
+ </div>
1693
+ );
1694
+ }
1695
+ ```
1696
+
1697
+ ### Focus Behavior
1698
+
1699
+ Customize keyboard and mouse focus behavior with `autoOptionFocus`, `selectOnFocus`, and `focusOnHover` props.
1700
+
1701
+ ```tsx
1702
+ 'use client';
1703
+ import { ChevronDown } from '@primeicons/react/chevron-down';
1704
+ import { Button } from '@primereact/ui/button';
1705
+ import { Select, type SelectValueChangeEvent } from '@primereact/ui/select';
1706
+ import * as React from 'react';
1707
+
1708
+ const cities = [
1709
+ { name: 'New York', code: 'NY' },
1710
+ { name: 'Rome', code: 'RM' },
1711
+ { name: 'London', code: 'LDN' },
1712
+ { name: 'Istanbul', code: 'IST' },
1713
+ { name: 'Paris', code: 'PRS' }
1714
+ ];
1715
+
1716
+ export default function FocusBehaviorDemo() {
1717
+ const [selectedCity, setSelectedCity] = React.useState<string | null>(null);
1718
+ const [autoOptionFocus, setAutoOptionFocus] = React.useState(true);
1719
+ const [selectOnFocus, setSelectOnFocus] = React.useState(false);
1720
+ const [focusOnHover, setFocusOnHover] = React.useState(true);
1721
+
1722
+ return (
1723
+ <div className="space-y-4">
1724
+ <div className="flex flex-wrap gap-2 justify-center">
1725
+ <Button size="small" severity={autoOptionFocus ? 'primary' : 'secondary'} onClick={() => setAutoOptionFocus((prev) => !prev)}>
1726
+ autoOptionFocus: {String(autoOptionFocus)}
1727
+ </Button>
1728
+ <Button size="small" severity={selectOnFocus ? 'primary' : 'secondary'} onClick={() => setSelectOnFocus((prev) => !prev)}>
1729
+ selectOnFocus: {String(selectOnFocus)}
1730
+ </Button>
1731
+ <Button size="small" severity={focusOnHover ? 'primary' : 'secondary'} onClick={() => setFocusOnHover((prev) => !prev)}>
1732
+ focusOnHover: {String(focusOnHover)}
1733
+ </Button>
1734
+ </div>
1735
+
1736
+ <div className="flex justify-center">
1737
+ <Select.Root
1738
+ value={selectedCity}
1739
+ onValueChange={(e: SelectValueChangeEvent) => setSelectedCity(e.value as string | null)}
1740
+ options={cities}
1741
+ optionLabel="name"
1742
+ optionValue="code"
1743
+ autoOptionFocus={autoOptionFocus}
1744
+ selectOnFocus={selectOnFocus}
1745
+ focusOnHover={focusOnHover}
1746
+ className="w-full md:w-56"
1747
+ >
1748
+ <Select.Trigger>
1749
+ <Select.Value placeholder="Select a city" />
1750
+ <Select.Indicator>
1751
+ <ChevronDown />
1752
+ </Select.Indicator>
1753
+ </Select.Trigger>
1754
+
1755
+ <Select.Portal>
1756
+ <Select.Positioner>
1757
+ <Select.Popup>
1758
+ <Select.List />
1759
+ </Select.Popup>
1760
+ </Select.Positioner>
1761
+ </Select.Portal>
1762
+ </Select.Root>
1763
+ </div>
1764
+ </div>
1765
+ );
1766
+ }
1767
+ ```
1768
+
1769
+ ### Cascade
1770
+
1771
+ Wrap nested `Menu.Submenu` branches inside `Select.Popup` to drill through multi-level options. Each leaf renders as a `Select.Option` so the active value gets the standard selected highlight.
1772
+
1773
+ ```tsx
1774
+ 'use client';
1775
+ import { ChevronDown } from '@primeicons/react/chevron-down';
1776
+ import { ChevronRight } from '@primeicons/react/chevron-right';
1777
+ import { Menu } from '@primereact/ui/menu';
1778
+ import { Select, type SelectOpenChangeEvent } from '@primereact/ui/select';
1779
+ import * as React from 'react';
1780
+
1781
+ type City = { label: string; value: string };
1782
+ type State = { label: string; cities: City[] };
1783
+ type Country = { label: string; states: State[] };
1784
+
1785
+ const data: Country[] = [
1786
+ {
1787
+ label: 'Australia',
1788
+ states: [
1789
+ {
1790
+ label: 'New South Wales',
1791
+ cities: [
1792
+ { label: 'Sydney', value: 'Sydney, AU' },
1793
+ { label: 'Newcastle', value: 'Newcastle, AU' }
1794
+ ]
1795
+ },
1796
+ {
1797
+ label: 'Victoria',
1798
+ cities: [
1799
+ { label: 'Melbourne', value: 'Melbourne, AU' },
1800
+ { label: 'Geelong', value: 'Geelong, AU' }
1801
+ ]
1802
+ }
1803
+ ]
1804
+ },
1805
+ {
1806
+ label: 'United States',
1807
+ states: [
1808
+ {
1809
+ label: 'California',
1810
+ cities: [
1811
+ { label: 'Los Angeles', value: 'Los Angeles, US' },
1812
+ { label: 'San Francisco', value: 'San Francisco, US' }
1813
+ ]
1814
+ },
1815
+ {
1816
+ label: 'New York',
1817
+ cities: [
1818
+ { label: 'New York City', value: 'New York City, US' },
1819
+ { label: 'Albany', value: 'Albany, US' }
1820
+ ]
1821
+ }
1822
+ ]
1823
+ },
1824
+ {
1825
+ label: 'Canada',
1826
+ states: [
1827
+ {
1828
+ label: 'Ontario',
1829
+ cities: [
1830
+ { label: 'Toronto', value: 'Toronto, CA' },
1831
+ { label: 'Ottawa', value: 'Ottawa, CA' }
1832
+ ]
1833
+ },
1834
+ {
1835
+ label: 'Quebec',
1836
+ cities: [
1837
+ { label: 'Montreal', value: 'Montreal, CA' },
1838
+ { label: 'Quebec City', value: 'Quebec City, CA' }
1839
+ ]
1840
+ }
1841
+ ]
1842
+ }
1843
+ ];
1844
+
1845
+ const allCities = data.flatMap((c) => c.states.flatMap((s) => s.cities));
1846
+ const cityIndex = (value: string) => allCities.findIndex((c) => c.value === value);
1847
+
1848
+ export default function CascadeDemo() {
1849
+ const [open, setOpen] = React.useState(false);
1850
+ const [city, setCity] = React.useState<string>('');
1851
+
1852
+ // Open the path leading to the selected city when the popup opens.
1853
+ const isStateActive = (state: State) => state.cities.some((c) => c.value === city);
1854
+ const isCountryActive = (country: Country) => country.states.some(isStateActive);
1855
+
1856
+ const handleSelect = (value: string) => {
1857
+ setCity(value);
1858
+ setOpen(false);
1859
+ };
1860
+
1861
+ return (
1862
+ <div className="flex justify-center">
1863
+ <Select.Root
1864
+ value={city}
1865
+ options={allCities}
1866
+ optionLabel="label"
1867
+ optionValue="value"
1868
+ open={open}
1869
+ onOpenChange={(e: SelectOpenChangeEvent) => setOpen(!!e.value)}
1870
+ className="w-full md:w-64"
1871
+ >
1872
+ <Select.Trigger>
1873
+ <Select.Value placeholder="Select a city">{city || undefined}</Select.Value>
1874
+ <Select.Indicator>
1875
+ <ChevronDown />
1876
+ </Select.Indicator>
1877
+ </Select.Trigger>
1878
+ <Select.Portal>
1879
+ <Select.Positioner sideOffset={4} align="start">
1880
+ <Select.Popup>
1881
+ <Menu.Root open>
1882
+ <Menu.List>
1883
+ <Menu.Group>
1884
+ {data.map((country) => (
1885
+ <Menu.Submenu key={country.label} defaultOpen={isCountryActive(country)}>
1886
+ <Menu.SubmenuTrigger>
1887
+ {country.label}
1888
+ <Menu.SubmenuIndicator>
1889
+ <ChevronRight className="size-3.5" />
1890
+ </Menu.SubmenuIndicator>
1891
+ </Menu.SubmenuTrigger>
1892
+ <Menu.Portal>
1893
+ <Menu.Positioner>
1894
+ <Menu.Popup className="w-44">
1895
+ <Menu.List>
1896
+ <Menu.Group>
1897
+ {country.states.map((state) => (
1898
+ <Menu.Submenu key={state.label} defaultOpen={isStateActive(state)}>
1899
+ <Menu.SubmenuTrigger>
1900
+ {state.label}
1901
+ <Menu.SubmenuIndicator>
1902
+ <ChevronRight className="size-3.5" />
1903
+ </Menu.SubmenuIndicator>
1904
+ </Menu.SubmenuTrigger>
1905
+ <Menu.Portal>
1906
+ <Menu.Positioner>
1907
+ <Menu.Popup className="w-40">
1908
+ <Menu.List>
1909
+ <Menu.Group>
1910
+ {state.cities.map((c) => (
1911
+ <Menu.Item
1912
+ as={Select.Option}
1913
+ index={cityIndex(c.value)}
1914
+ uKey={c.value}
1915
+ key={c.value}
1916
+ onSelect={() => handleSelect(c.value)}
1917
+ >
1918
+ {c.label}
1919
+ </Menu.Item>
1920
+ ))}
1921
+ </Menu.Group>
1922
+ </Menu.List>
1923
+ </Menu.Popup>
1924
+ </Menu.Positioner>
1925
+ </Menu.Portal>
1926
+ </Menu.Submenu>
1927
+ ))}
1928
+ </Menu.Group>
1929
+ </Menu.List>
1930
+ </Menu.Popup>
1931
+ </Menu.Positioner>
1932
+ </Menu.Portal>
1933
+ </Menu.Submenu>
1934
+ ))}
1935
+ </Menu.Group>
1936
+ </Menu.List>
1937
+ </Menu.Root>
1938
+ </Select.Popup>
1939
+ </Select.Positioner>
1940
+ </Select.Portal>
1941
+ </Select.Root>
1942
+ </div>
1943
+ );
1944
+ }
1945
+ ```
1946
+
1947
+ ### Tree
1948
+
1949
+ Embed `Tree` inside `Select.Popup` to expose hierarchical options. Selecting a node commits its value to `Select.Value` and the path expands to the current selection on open.
1950
+
1951
+ ```tsx
1952
+ 'use client';
1953
+ import { ChevronDown } from '@primeicons/react/chevron-down';
1954
+ import { ChevronRight } from '@primeicons/react/chevron-right';
1955
+ import { Select, type SelectOpenChangeEvent } from '@primereact/ui/select';
1956
+ import {
1957
+ Tree,
1958
+ type TreeExpandedKeys,
1959
+ type TreeNodeData,
1960
+ type TreeRootExpandedChangeEvent,
1961
+ type TreeRootSelectionChangeEvent,
1962
+ type TreeSelectionKeys
1963
+ } from '@primereact/ui/tree';
1964
+ import * as React from 'react';
1965
+
1966
+ const nodes: TreeNodeData[] = [
1967
+ {
1968
+ key: '0',
1969
+ label: 'Engineering',
1970
+ children: [
1971
+ {
1972
+ key: '0-0',
1973
+ label: 'Frontend',
1974
+ children: [
1975
+ { key: '0-0-0', label: 'React' },
1976
+ { key: '0-0-1', label: 'Vue' },
1977
+ { key: '0-0-2', label: 'Angular' }
1978
+ ]
1979
+ },
1980
+ {
1981
+ key: '0-1',
1982
+ label: 'Backend',
1983
+ children: [
1984
+ { key: '0-1-0', label: 'Node.js' },
1985
+ { key: '0-1-1', label: 'Python' },
1986
+ { key: '0-1-2', label: 'Go' }
1987
+ ]
1988
+ }
1989
+ ]
1990
+ },
1991
+ {
1992
+ key: '1',
1993
+ label: 'Design',
1994
+ children: [
1995
+ { key: '1-0', label: 'Product Design' },
1996
+ { key: '1-1', label: 'Illustration' },
1997
+ { key: '1-2', label: 'Motion' }
1998
+ ]
1999
+ },
2000
+ {
2001
+ key: '2',
2002
+ label: 'Operations',
2003
+ children: [
2004
+ { key: '2-0', label: 'People' },
2005
+ { key: '2-1', label: 'Finance' }
2006
+ ]
2007
+ }
2008
+ ];
2009
+
2010
+ function findPath(list: TreeNodeData[], key: string, trail: string[] = []): { path: string[]; label: string } | undefined {
2011
+ for (const node of list) {
2012
+ if (node.key === key) return { path: trail, label: node.label as string };
2013
+ if (node.children) {
2014
+ const found = findPath(node.children, key, [...trail, node.key as string]);
2015
+ if (found) return found;
2016
+ }
2017
+ }
2018
+ return undefined;
2019
+ }
2020
+
2021
+ export default function TreeDemo() {
2022
+ const [open, setOpen] = React.useState(false);
2023
+ const [selectionKeys, setSelectionKeys] = React.useState<TreeSelectionKeys>({});
2024
+ const [expandedKeys, setExpandedKeys] = React.useState<TreeExpandedKeys>({});
2025
+
2026
+ const selectedKey = Object.keys(selectionKeys)[0];
2027
+ const selectedInfo = selectedKey ? findPath(nodes, selectedKey) : undefined;
2028
+
2029
+ // Expand the path to the selected node when the popup opens.
2030
+ const onOpenChange = (e: SelectOpenChangeEvent) => {
2031
+ const isOpen = !!e.value;
2032
+ setOpen(isOpen);
2033
+ if (isOpen && selectedInfo) {
2034
+ const next: TreeExpandedKeys = {};
2035
+ for (const key of selectedInfo.path) next[key] = true;
2036
+ setExpandedKeys(next);
2037
+ }
2038
+ };
2039
+
2040
+ const onTreeSelectionChange = (e: TreeRootSelectionChangeEvent) => {
2041
+ setSelectionKeys((e.value as TreeSelectionKeys) ?? {});
2042
+ setOpen(false);
2043
+ };
2044
+
2045
+ return (
2046
+ <div className="flex justify-center">
2047
+ <Select.Root value={selectedKey ?? ''} options={[]} open={open} onOpenChange={onOpenChange} className="w-full md:w-64">
2048
+ <Select.Trigger>
2049
+ <Select.Value placeholder="Select a category">{selectedInfo?.label}</Select.Value>
2050
+ <Select.Indicator>
2051
+ <ChevronDown />
2052
+ </Select.Indicator>
2053
+ </Select.Trigger>
2054
+ <Select.Portal>
2055
+ <Select.Positioner sideOffset={4} align="start">
2056
+ <Select.Popup className="p-1">
2057
+ <Tree.Root
2058
+ value={nodes}
2059
+ selectionMode="single"
2060
+ selectionKeys={selectionKeys}
2061
+ onSelectionChange={onTreeSelectionChange}
2062
+ expandedKeys={expandedKeys}
2063
+ onExpandedChange={(e: TreeRootExpandedChangeEvent) => setExpandedKeys(e.value)}
2064
+ className="w-full p-0!"
2065
+ >
2066
+ <Tree.Nodes>
2067
+ {({ node }) => (
2068
+ <Tree.Node uKey={node.key}>
2069
+ <Tree.Content>
2070
+ <Tree.Toggle>
2071
+ <Tree.ToggleIndicator match="expanded">
2072
+ <ChevronDown />
2073
+ </Tree.ToggleIndicator>
2074
+ <Tree.ToggleIndicator match="collapsed">
2075
+ <ChevronRight />
2076
+ </Tree.ToggleIndicator>
2077
+ </Tree.Toggle>
2078
+ {node.icon ? <i className={node.icon} aria-hidden /> : null}
2079
+ <Tree.Label>{node.label}</Tree.Label>
2080
+ </Tree.Content>
2081
+ <Tree.Nodes />
2082
+ </Tree.Node>
2083
+ )}
2084
+ </Tree.Nodes>
2085
+ </Tree.Root>
2086
+ </Select.Popup>
2087
+ </Select.Positioner>
2088
+ </Select.Portal>
2089
+ </Select.Root>
2090
+ </div>
2091
+ );
2092
+ }
2093
+ ```
2094
+
2095
+ ## Related
2096
+
2097
+ ### Sub-Components
2098
+
2099
+ See [Primitive API](/docs/primitive/components/select#api) for `SelectRoot`, `SelectTrigger`, `SelectList`, `SelectOption`, and other component documentation.
2100
+
2101
+ ### Hooks
2102
+
2103
+ See [Headless API](/docs/headless/components/select#api) for `useSelect` hook documentation.
2104
+
2105
+ ### Accessibility
2106
+
2107
+ See [Select Primitive](/docs/primitive/components/select#accessibility) for WAI-ARIA compliance details and keyboard support.
2108
+
2109
+
2110
+ ## Theming
2111
+
2112
+ ### CSS Classes
2113
+
2114
+ List of class names used in the styled mode.
2115
+
2116
+ <DocTable name="Select" category="style" />
2117
+
2118
+ ### Design Tokens
2119
+
2120
+ List of design tokens.
2121
+
2122
+ <DocTable name="Select" category="token" />