@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,1386 @@
1
+ # Tree
2
+
3
+ Tree is used to display hierarchical data.
4
+
5
+ ```tsx
6
+ 'use client';
7
+ import { NodeService } from '@/shared/services/node.service';
8
+ import { Check } from '@primeicons/react/check';
9
+ import { ChevronDown } from '@primeicons/react/chevron-down';
10
+ import { ChevronRight } from '@primeicons/react/chevron-right';
11
+ import { File } from '@primeicons/react/file';
12
+ import { Folder } from '@primeicons/react/folder';
13
+ import { FolderOpen } from '@primeicons/react/folder-open';
14
+ import { Minus } from '@primeicons/react/minus';
15
+ import { Checkbox, type CheckboxRootChangeEvent } from '@primereact/ui/checkbox';
16
+ import {
17
+ Tree,
18
+ type TreeCheckboxSelectionKeys,
19
+ type TreeNodeData,
20
+ type TreeRootSelectionChangeEvent,
21
+ type TreeSelectionInstance
22
+ } from '@primereact/ui/tree';
23
+ import * as React from 'react';
24
+
25
+ export default function Preview() {
26
+ const [nodes, setNodes] = React.useState<TreeNodeData[]>([]);
27
+ const [selectionKeys, setSelectionKeys] = React.useState<TreeCheckboxSelectionKeys>({});
28
+
29
+ React.useEffect(() => {
30
+ NodeService.getTreeNodes().then(setNodes);
31
+ }, []);
32
+
33
+ return (
34
+ <Tree.Root
35
+ value={nodes}
36
+ selectionMode="checkbox"
37
+ selectionKeys={selectionKeys}
38
+ onSelectionChange={(e: TreeRootSelectionChangeEvent) => setSelectionKeys(e.value as TreeCheckboxSelectionKeys)}
39
+ defaultExpandedKeys={{ '0': true }}
40
+ className="w-full md:w-120"
41
+ >
42
+ <Tree.Nodes>
43
+ {({ node, leaf, expanded }) => (
44
+ <Tree.Node uKey={node.key}>
45
+ <Tree.Content>
46
+ <Tree.Toggle>
47
+ <Tree.ToggleIndicator match="expanded">
48
+ <ChevronDown />
49
+ </Tree.ToggleIndicator>
50
+ <Tree.ToggleIndicator match="collapsed">
51
+ <ChevronRight />
52
+ </Tree.ToggleIndicator>
53
+ </Tree.Toggle>
54
+ <Tree.Selection>
55
+ {({ isSelected, isPartiallySelected, toggle }: TreeSelectionInstance) => (
56
+ <Checkbox.Root
57
+ checked={isSelected}
58
+ indeterminate={isPartiallySelected}
59
+ onCheckedChange={(e: CheckboxRootChangeEvent) => toggle(e.originalEvent)}
60
+ tabIndex={-1}
61
+ >
62
+ <Checkbox.Box>
63
+ <Checkbox.Indicator match="checked">
64
+ <Check />
65
+ </Checkbox.Indicator>
66
+ <Checkbox.Indicator match="indeterminate">
67
+ <Minus />
68
+ </Checkbox.Indicator>
69
+ </Checkbox.Box>
70
+ </Checkbox.Root>
71
+ )}
72
+ </Tree.Selection>
73
+ {leaf ? <File /> : expanded ? <FolderOpen /> : <Folder />}
74
+ <Tree.Label>{node.label}</Tree.Label>
75
+ </Tree.Content>
76
+ </Tree.Node>
77
+ )}
78
+ </Tree.Nodes>
79
+ </Tree.Root>
80
+ );
81
+ }
82
+ ```
83
+
84
+ ## Usage
85
+
86
+ ```tsx
87
+ import { Tree } from '@primereact/ui/tree';
88
+ ```
89
+
90
+ Tree requires a collection of _TreeNode_ instances as its _value_. Each visible row is produced by _Tree.Nodes_ through its render function and identified by _uKey_.
91
+
92
+ ```tsx
93
+ <Tree.Root value={nodes}>
94
+ <Tree.Nodes>
95
+ {({ node }) => (
96
+ <Tree.Node uKey={node.key}>
97
+ <Tree.Content>
98
+ <Tree.Toggle>
99
+ <Tree.ToggleIndicator />
100
+ </Tree.Toggle>
101
+ <Tree.Label />
102
+ </Tree.Content>
103
+ </Tree.Node>
104
+ )}
105
+ </Tree.Nodes>
106
+ </Tree.Root>
107
+ ```
108
+
109
+ ## Examples
110
+
111
+ ### Basic
112
+
113
+ A basic Tree displays a collection of _TreeNode_ instances.
114
+
115
+ ```tsx
116
+ 'use client';
117
+ import { NodeService } from '@/shared/services/node.service';
118
+ import { ChevronDown } from '@primeicons/react/chevron-down';
119
+ import { ChevronRight } from '@primeicons/react/chevron-right';
120
+ import { Tree, type TreeNodeData } from '@primereact/ui/tree';
121
+ import * as React from 'react';
122
+
123
+ export default function BasicDemo() {
124
+ const [nodes, setNodes] = React.useState<TreeNodeData[]>([]);
125
+
126
+ React.useEffect(() => {
127
+ NodeService.getTreeNodes().then((data) => setNodes(data));
128
+ }, []);
129
+
130
+ return (
131
+ <Tree.Root value={nodes} defaultExpandedKeys={{ '0': true }} className="w-full md:w-120">
132
+ <Tree.Nodes>
133
+ {({ node }) => (
134
+ <Tree.Node uKey={node.key}>
135
+ <Tree.Content>
136
+ <Tree.Toggle>
137
+ <Tree.ToggleIndicator match="expanded">
138
+ <ChevronDown />
139
+ </Tree.ToggleIndicator>
140
+ <Tree.ToggleIndicator match="collapsed">
141
+ <ChevronRight />
142
+ </Tree.ToggleIndicator>
143
+ </Tree.Toggle>
144
+ <Tree.Label>{node.label}</Tree.Label>
145
+ </Tree.Content>
146
+ </Tree.Node>
147
+ )}
148
+ </Tree.Nodes>
149
+ </Tree.Root>
150
+ );
151
+ }
152
+ ```
153
+
154
+ ### Content
155
+
156
+ Custom node content is rendered inside _Tree.Content_; the row payload exposes _leaf_ and _expanded_ so the right icon can be chosen.
157
+
158
+ ```tsx
159
+ 'use client';
160
+ import { NodeService } from '@/shared/services/node.service';
161
+ import { ChevronDown } from '@primeicons/react/chevron-down';
162
+ import { ChevronRight } from '@primeicons/react/chevron-right';
163
+ import { File } from '@primeicons/react/file';
164
+ import { Folder } from '@primeicons/react/folder';
165
+ import { FolderOpen } from '@primeicons/react/folder-open';
166
+ import { Tree, type TreeNodeData } from '@primereact/ui/tree';
167
+ import * as React from 'react';
168
+
169
+ export default function NodeDemo() {
170
+ const [nodes, setNodes] = React.useState<TreeNodeData[]>([]);
171
+
172
+ React.useEffect(() => {
173
+ NodeService.getTreeNodes().then(setNodes);
174
+ }, []);
175
+
176
+ return (
177
+ <Tree.Root value={nodes} defaultExpandedKeys={{ '0': true }} className="w-full md:w-120">
178
+ <Tree.Nodes>
179
+ {({ node, leaf, expanded }) => (
180
+ <Tree.Node uKey={node.key}>
181
+ <Tree.Content>
182
+ <Tree.Toggle>
183
+ <Tree.ToggleIndicator match="expanded">
184
+ <ChevronDown />
185
+ </Tree.ToggleIndicator>
186
+ <Tree.ToggleIndicator match="collapsed">
187
+ <ChevronRight />
188
+ </Tree.ToggleIndicator>
189
+ </Tree.Toggle>
190
+ {leaf ? <File /> : expanded ? <FolderOpen /> : <Folder />}
191
+ <Tree.Label>{node.label}</Tree.Label>
192
+ </Tree.Content>
193
+ </Tree.Node>
194
+ )}
195
+ </Tree.Nodes>
196
+ </Tree.Root>
197
+ );
198
+ }
199
+ ```
200
+
201
+ ### Toggle Indicator
202
+
203
+ Toggle indicators are customized with _Tree.ToggleIndicator_ and its _match_ property of _expanded_, _collapsed_ or _always_.
204
+
205
+ ```tsx
206
+ 'use client';
207
+ import { NodeService } from '@/shared/services/node.service';
208
+ import { MinusCircle } from '@primeicons/react/minus-circle';
209
+ import { PlusCircle } from '@primeicons/react/plus-circle';
210
+ import { Tree, type TreeNodeData } from '@primereact/ui/tree';
211
+ import * as React from 'react';
212
+
213
+ export default function PlusMinusToggleDemo() {
214
+ const [nodes, setNodes] = React.useState<TreeNodeData[]>([]);
215
+
216
+ React.useEffect(() => {
217
+ NodeService.getTreeNodes().then(setNodes);
218
+ }, []);
219
+
220
+ return (
221
+ <Tree.Root value={nodes} defaultExpandedKeys={{ '0': true }} className="w-full md:w-120">
222
+ <Tree.Nodes>
223
+ {({ node }) => (
224
+ <Tree.Node uKey={node.key}>
225
+ <Tree.Content>
226
+ <Tree.Toggle>
227
+ <Tree.ToggleIndicator match="expanded">
228
+ <MinusCircle />
229
+ </Tree.ToggleIndicator>
230
+ <Tree.ToggleIndicator match="collapsed">
231
+ <PlusCircle />
232
+ </Tree.ToggleIndicator>
233
+ </Tree.Toggle>
234
+ <Tree.Label>{node.label}</Tree.Label>
235
+ </Tree.Content>
236
+ </Tree.Node>
237
+ )}
238
+ </Tree.Nodes>
239
+ </Tree.Root>
240
+ );
241
+ }
242
+ ```
243
+
244
+ ### Controlled
245
+
246
+ Expansion state is managed programmatically with _expandedKeys_ and _onExpandedChange_ properties.
247
+
248
+ ```tsx
249
+ 'use client';
250
+ import { NodeService } from '@/shared/services/node.service';
251
+ import { ChevronDown } from '@primeicons/react/chevron-down';
252
+ import { ChevronRight } from '@primeicons/react/chevron-right';
253
+ import { Minus } from '@primeicons/react/minus';
254
+ import { Plus } from '@primeicons/react/plus';
255
+ import { Button } from '@primereact/ui/button';
256
+ import { Tree, type TreeExpandedKeys, type TreeNodeData, type TreeRootExpandedChangeEvent } from '@primereact/ui/tree';
257
+ import * as React from 'react';
258
+
259
+ function collectExpandableKeys(list: TreeNodeData[], acc: TreeExpandedKeys = {}): TreeExpandedKeys {
260
+ for (const node of list) {
261
+ if (node.children?.length) {
262
+ acc[node.key] = true;
263
+ collectExpandableKeys(node.children, acc);
264
+ }
265
+ }
266
+
267
+ return acc;
268
+ }
269
+
270
+ export default function ExpandCollapseAllDemo() {
271
+ const [nodes, setNodes] = React.useState<TreeNodeData[]>([]);
272
+ const [expandedKeys, setExpandedKeys] = React.useState<TreeExpandedKeys>({});
273
+
274
+ React.useEffect(() => {
275
+ NodeService.getTreeNodes().then(setNodes);
276
+ }, []);
277
+
278
+ const expandAll = () => setExpandedKeys(collectExpandableKeys(nodes));
279
+ const collapseAll = () => setExpandedKeys({});
280
+
281
+ return (
282
+ <div className="flex flex-col gap-3 w-full md:w-120">
283
+ <div className="flex gap-2">
284
+ <Button onClick={expandAll}>
285
+ <Plus />
286
+ Expand All
287
+ </Button>
288
+ <Button onClick={collapseAll} variant="outlined">
289
+ <Minus />
290
+ Collapse All
291
+ </Button>
292
+ </div>
293
+ <Tree.Root value={nodes} expandedKeys={expandedKeys} onExpandedChange={(e: TreeRootExpandedChangeEvent) => setExpandedKeys(e.value)}>
294
+ <Tree.Nodes>
295
+ {({ node }) => (
296
+ <Tree.Node uKey={node.key}>
297
+ <Tree.Content>
298
+ <Tree.Toggle>
299
+ <Tree.ToggleIndicator match="expanded">
300
+ <ChevronDown />
301
+ </Tree.ToggleIndicator>
302
+ <Tree.ToggleIndicator match="collapsed">
303
+ <ChevronRight />
304
+ </Tree.ToggleIndicator>
305
+ </Tree.Toggle>
306
+ <Tree.Label>{node.label}</Tree.Label>
307
+ </Tree.Content>
308
+ </Tree.Node>
309
+ )}
310
+ </Tree.Nodes>
311
+ </Tree.Root>
312
+ </div>
313
+ );
314
+ }
315
+ ```
316
+
317
+ ### Selection
318
+
319
+ #### Single
320
+
321
+ Single node selection is configured by setting _selectionMode_ as _single_ along with _selectionKeys_ and _onSelectionChange_ properties to manage the selection value binding.
322
+
323
+ ```tsx
324
+ 'use client';
325
+ import { NodeService } from '@/shared/services/node.service';
326
+ import { ChevronDown } from '@primeicons/react/chevron-down';
327
+ import { ChevronRight } from '@primeicons/react/chevron-right';
328
+ import { File } from '@primeicons/react/file';
329
+ import { Folder } from '@primeicons/react/folder';
330
+ import { Tree, type TreeNodeData, type TreeRootSelectionChangeEvent, type TreeSelectionKeys } from '@primereact/ui/tree';
331
+ import * as React from 'react';
332
+
333
+ export default function SingleSelectionDemo() {
334
+ const [nodes, setNodes] = React.useState<TreeNodeData[]>([]);
335
+ const [selectionKeys, setSelectionKeys] = React.useState<TreeSelectionKeys>({});
336
+
337
+ React.useEffect(() => {
338
+ NodeService.getTreeNodes().then(setNodes);
339
+ }, []);
340
+
341
+ return (
342
+ <Tree.Root
343
+ value={nodes}
344
+ selectionMode="single"
345
+ selectionKeys={selectionKeys}
346
+ onSelectionChange={(e: TreeRootSelectionChangeEvent) => setSelectionKeys(e.value as TreeSelectionKeys)}
347
+ defaultExpandedKeys={{ '0': true }}
348
+ className="w-full md:w-120"
349
+ >
350
+ <Tree.Nodes>
351
+ {({ node, leaf }) => (
352
+ <Tree.Node uKey={node.key}>
353
+ <Tree.Content>
354
+ <Tree.Toggle>
355
+ <Tree.ToggleIndicator match="expanded">
356
+ <ChevronDown />
357
+ </Tree.ToggleIndicator>
358
+ <Tree.ToggleIndicator match="collapsed">
359
+ <ChevronRight />
360
+ </Tree.ToggleIndicator>
361
+ </Tree.Toggle>
362
+ {leaf ? <File /> : <Folder />}
363
+ <Tree.Label>{node.label}</Tree.Label>
364
+ </Tree.Content>
365
+ </Tree.Node>
366
+ )}
367
+ </Tree.Nodes>
368
+ </Tree.Root>
369
+ );
370
+ }
371
+ ```
372
+
373
+ #### Multiple
374
+
375
+ More than one node is selectable by setting _selectionMode_ to _multiple_. By default in multiple selection mode, metaKey press (e.g. ⌘) is necessary to add to existing selections, however this can be configured with the _metaKeySelection_ property.
376
+
377
+ ```tsx
378
+ 'use client';
379
+ import { NodeService } from '@/shared/services/node.service';
380
+ import { ChevronDown } from '@primeicons/react/chevron-down';
381
+ import { ChevronRight } from '@primeicons/react/chevron-right';
382
+ import { File } from '@primeicons/react/file';
383
+ import { Folder } from '@primeicons/react/folder';
384
+ import { Tree, type TreeNodeData, type TreeRootSelectionChangeEvent, type TreeSelectionKeys } from '@primereact/ui/tree';
385
+ import * as React from 'react';
386
+
387
+ export default function MultipleSelectionDemo() {
388
+ const [nodes, setNodes] = React.useState<TreeNodeData[]>([]);
389
+ const [selectionKeys, setSelectionKeys] = React.useState<TreeSelectionKeys>({});
390
+
391
+ React.useEffect(() => {
392
+ NodeService.getTreeNodes().then(setNodes);
393
+ }, []);
394
+
395
+ return (
396
+ <Tree.Root
397
+ value={nodes}
398
+ selectionMode="multiple"
399
+ metaKeySelection
400
+ selectionKeys={selectionKeys}
401
+ onSelectionChange={(e: TreeRootSelectionChangeEvent) => setSelectionKeys(e.value as TreeSelectionKeys)}
402
+ defaultExpandedKeys={{ '0': true }}
403
+ className="w-full md:w-120"
404
+ >
405
+ <Tree.Nodes>
406
+ {({ node, leaf }) => (
407
+ <Tree.Node uKey={node.key}>
408
+ <Tree.Content>
409
+ <Tree.Toggle>
410
+ <Tree.ToggleIndicator match="expanded">
411
+ <ChevronDown />
412
+ </Tree.ToggleIndicator>
413
+ <Tree.ToggleIndicator match="collapsed">
414
+ <ChevronRight />
415
+ </Tree.ToggleIndicator>
416
+ </Tree.Toggle>
417
+ {leaf ? <File /> : <Folder />}
418
+ <Tree.Label>{node.label}</Tree.Label>
419
+ </Tree.Content>
420
+ </Tree.Node>
421
+ )}
422
+ </Tree.Nodes>
423
+ </Tree.Root>
424
+ );
425
+ }
426
+ ```
427
+
428
+ #### Checkbox
429
+
430
+ Selection of multiple nodes via checkboxes is composed with _Tree.Selection_ inside _Tree.Node_. The render prop exposes _isSelected_, _isPartiallySelected_ and _toggle_; the down/up tri-state cascade runs in the headless layer.
431
+
432
+ ```tsx
433
+ 'use client';
434
+ import { NodeService } from '@/shared/services/node.service';
435
+ import { Check } from '@primeicons/react/check';
436
+ import { ChevronDown } from '@primeicons/react/chevron-down';
437
+ import { ChevronRight } from '@primeicons/react/chevron-right';
438
+ import { Minus } from '@primeicons/react/minus';
439
+ import { Checkbox, type CheckboxRootChangeEvent } from '@primereact/ui/checkbox';
440
+ import {
441
+ Tree,
442
+ type TreeCheckboxSelectionKeys,
443
+ type TreeNodeData,
444
+ type TreeRootSelectionChangeEvent,
445
+ type TreeSelectionInstance
446
+ } from '@primereact/ui/tree';
447
+ import * as React from 'react';
448
+
449
+ export default function CheckboxSelectionDemo() {
450
+ const [nodes, setNodes] = React.useState<TreeNodeData[]>([]);
451
+ const [selectionKeys, setSelectionKeys] = React.useState<TreeCheckboxSelectionKeys>({});
452
+
453
+ React.useEffect(() => {
454
+ NodeService.getTreeNodes().then(setNodes);
455
+ }, []);
456
+
457
+ return (
458
+ <Tree.Root
459
+ value={nodes}
460
+ selectionMode="checkbox"
461
+ selectionKeys={selectionKeys}
462
+ onSelectionChange={(e: TreeRootSelectionChangeEvent) => setSelectionKeys(e.value as TreeCheckboxSelectionKeys)}
463
+ defaultExpandedKeys={{ '0': true }}
464
+ className="w-full md:w-120"
465
+ >
466
+ <Tree.Nodes>
467
+ {({ node }) => (
468
+ <Tree.Node uKey={node.key}>
469
+ <Tree.Content>
470
+ <Tree.Toggle>
471
+ <Tree.ToggleIndicator match="expanded">
472
+ <ChevronDown />
473
+ </Tree.ToggleIndicator>
474
+ <Tree.ToggleIndicator match="collapsed">
475
+ <ChevronRight />
476
+ </Tree.ToggleIndicator>
477
+ </Tree.Toggle>
478
+ <Tree.Selection>
479
+ {({ isSelected, isPartiallySelected, toggle }: TreeSelectionInstance) => (
480
+ <Checkbox.Root
481
+ checked={isSelected}
482
+ indeterminate={isPartiallySelected}
483
+ onCheckedChange={(e: CheckboxRootChangeEvent) => toggle(e.originalEvent)}
484
+ tabIndex={-1}
485
+ >
486
+ <Checkbox.Box>
487
+ <Checkbox.Indicator match="checked">
488
+ <Check />
489
+ </Checkbox.Indicator>
490
+ <Checkbox.Indicator match="indeterminate">
491
+ <Minus />
492
+ </Checkbox.Indicator>
493
+ </Checkbox.Box>
494
+ </Checkbox.Root>
495
+ )}
496
+ </Tree.Selection>
497
+ <Tree.Label>{node.label}</Tree.Label>
498
+ </Tree.Content>
499
+ </Tree.Node>
500
+ )}
501
+ </Tree.Nodes>
502
+ </Tree.Root>
503
+ );
504
+ }
505
+ ```
506
+
507
+ #### Radio
508
+
509
+ Use _Tree.Selection_ with _mode="radio"_ to keep a single selection sticky. Re-clicking the selected node does not deselect it.
510
+
511
+ ```tsx
512
+ 'use client';
513
+ import { NodeService } from '@/shared/services/node.service';
514
+ import { ChevronDown } from '@primeicons/react/chevron-down';
515
+ import { ChevronRight } from '@primeicons/react/chevron-right';
516
+ import type { RadioButtonRootChangeEvent } from '@primereact/ui/radiobutton';
517
+ import { RadioButton } from '@primereact/ui/radiobutton';
518
+ import { Tree, type TreeNodeData, type TreeRootSelectionChangeEvent, type TreeSelectionInstance, type TreeSelectionKeys } from '@primereact/ui/tree';
519
+ import * as React from 'react';
520
+
521
+ export default function RadioSelectionDemo() {
522
+ const [nodes, setNodes] = React.useState<TreeNodeData[]>([]);
523
+ const [selectionKeys, setSelectionKeys] = React.useState<TreeSelectionKeys>({});
524
+
525
+ React.useEffect(() => {
526
+ NodeService.getTreeNodes().then(setNodes);
527
+ }, []);
528
+
529
+ return (
530
+ <Tree.Root
531
+ value={nodes}
532
+ selectionMode="single"
533
+ selectionKeys={selectionKeys}
534
+ onSelectionChange={(e: TreeRootSelectionChangeEvent) => setSelectionKeys(e.value as TreeSelectionKeys)}
535
+ defaultExpandedKeys={{ '0': true }}
536
+ className="w-full md:w-120"
537
+ >
538
+ <Tree.Nodes>
539
+ {({ node }) => (
540
+ <Tree.Node uKey={node.key}>
541
+ <Tree.Content>
542
+ <Tree.Toggle>
543
+ <Tree.ToggleIndicator match="expanded">
544
+ <ChevronDown />
545
+ </Tree.ToggleIndicator>
546
+ <Tree.ToggleIndicator match="collapsed">
547
+ <ChevronRight />
548
+ </Tree.ToggleIndicator>
549
+ </Tree.Toggle>
550
+ <Tree.Selection mode="radio">
551
+ {({ isSelected, toggle }: TreeSelectionInstance) => (
552
+ <RadioButton.Root
553
+ checked={isSelected}
554
+ onCheckedChange={(e: RadioButtonRootChangeEvent) => toggle(e.originalEvent)}
555
+ tabIndex={-1}
556
+ >
557
+ <RadioButton.Box>
558
+ <RadioButton.Indicator match="checked" />
559
+ </RadioButton.Box>
560
+ </RadioButton.Root>
561
+ )}
562
+ </Tree.Selection>
563
+ <Tree.Label>{node.label}</Tree.Label>
564
+ </Tree.Content>
565
+ </Tree.Node>
566
+ )}
567
+ </Tree.Nodes>
568
+ </Tree.Root>
569
+ );
570
+ }
571
+ ```
572
+
573
+ #### Select All
574
+
575
+ Outside a _Tree.Node_, _Tree.Selection_ exposes _isAllSelected_, _isSomeSelected_ and _toggleAll_ for an aggregate checkbox in _Tree.Header_.
576
+
577
+ ```tsx
578
+ 'use client';
579
+ import { NodeService } from '@/shared/services/node.service';
580
+ import { Check } from '@primeicons/react/check';
581
+ import { ChevronDown } from '@primeicons/react/chevron-down';
582
+ import { ChevronRight } from '@primeicons/react/chevron-right';
583
+ import { Minus } from '@primeicons/react/minus';
584
+ import { Checkbox, type CheckboxRootChangeEvent } from '@primereact/ui/checkbox';
585
+ import {
586
+ Tree,
587
+ type TreeCheckboxSelectionKeys,
588
+ type TreeNodeData,
589
+ type TreeRootSelectionChangeEvent,
590
+ type TreeSelectionInstance
591
+ } from '@primereact/ui/tree';
592
+ import * as React from 'react';
593
+
594
+ export default function SelectAllDemo() {
595
+ const [nodes, setNodes] = React.useState<TreeNodeData[]>([]);
596
+ const [selectionKeys, setSelectionKeys] = React.useState<TreeCheckboxSelectionKeys>({});
597
+
598
+ React.useEffect(() => {
599
+ NodeService.getTreeNodes().then(setNodes);
600
+ }, []);
601
+
602
+ return (
603
+ <Tree.Root
604
+ value={nodes}
605
+ selectionMode="checkbox"
606
+ selectionKeys={selectionKeys}
607
+ onSelectionChange={(e: TreeRootSelectionChangeEvent) => setSelectionKeys(e.value as TreeCheckboxSelectionKeys)}
608
+ defaultExpandedKeys={{ '0': true }}
609
+ className="w-full md:w-120"
610
+ >
611
+ <Tree.Header className="flex items-center gap-2 mb-2 px-2">
612
+ <Tree.Selection>
613
+ {({ isAllSelected, isSomeSelected, toggleAll }: TreeSelectionInstance) => (
614
+ <Checkbox.Root
615
+ checked={isAllSelected}
616
+ indeterminate={isSomeSelected && !isAllSelected}
617
+ onCheckedChange={(e: CheckboxRootChangeEvent) => toggleAll(e.originalEvent)}
618
+ >
619
+ <Checkbox.Box>
620
+ <Checkbox.Indicator match="checked">
621
+ <Check />
622
+ </Checkbox.Indicator>
623
+ <Checkbox.Indicator match="indeterminate">
624
+ <Minus />
625
+ </Checkbox.Indicator>
626
+ </Checkbox.Box>
627
+ </Checkbox.Root>
628
+ )}
629
+ </Tree.Selection>
630
+ <span className="font-medium">Select All</span>
631
+ </Tree.Header>
632
+ <Tree.Nodes>
633
+ {({ node }) => (
634
+ <Tree.Node uKey={node.key}>
635
+ <Tree.Content>
636
+ <Tree.Toggle>
637
+ <Tree.ToggleIndicator match="expanded">
638
+ <ChevronDown />
639
+ </Tree.ToggleIndicator>
640
+ <Tree.ToggleIndicator match="collapsed">
641
+ <ChevronRight />
642
+ </Tree.ToggleIndicator>
643
+ </Tree.Toggle>
644
+ <Tree.Selection>
645
+ {({ isSelected, isPartiallySelected, toggle }: TreeSelectionInstance) => (
646
+ <Checkbox.Root
647
+ checked={isSelected}
648
+ indeterminate={isPartiallySelected}
649
+ onCheckedChange={(e: CheckboxRootChangeEvent) => toggle(e.originalEvent)}
650
+ tabIndex={-1}
651
+ >
652
+ <Checkbox.Box>
653
+ <Checkbox.Indicator match="checked">
654
+ <Check />
655
+ </Checkbox.Indicator>
656
+ <Checkbox.Indicator match="indeterminate">
657
+ <Minus />
658
+ </Checkbox.Indicator>
659
+ </Checkbox.Box>
660
+ </Checkbox.Root>
661
+ )}
662
+ </Tree.Selection>
663
+ <Tree.Label>{node.label}</Tree.Label>
664
+ </Tree.Content>
665
+ </Tree.Node>
666
+ )}
667
+ </Tree.Nodes>
668
+ </Tree.Root>
669
+ );
670
+ }
671
+ ```
672
+
673
+ #### Keyboard
674
+
675
+ Tree fully supports keyboard navigation. Arrow keys move focus across visible rows, Right and Left expand and collapse, Space and Enter toggle selection on the focused node.
676
+
677
+ ```tsx
678
+ 'use client';
679
+ import { NodeService } from '@/shared/services/node.service';
680
+ import { ChevronDown } from '@primeicons/react/chevron-down';
681
+ import { ChevronRight } from '@primeicons/react/chevron-right';
682
+ import { File } from '@primeicons/react/file';
683
+ import { Folder } from '@primeicons/react/folder';
684
+ import { Badge } from '@primereact/ui/badge';
685
+ import { Tree, type TreeNodeData, type TreeRootSelectionChangeEvent, type TreeSelectionKeys } from '@primereact/ui/tree';
686
+ import * as React from 'react';
687
+
688
+ export default function KeyboardDemo() {
689
+ const [nodes, setNodes] = React.useState<TreeNodeData[]>([]);
690
+ const [selectionKeys, setSelectionKeys] = React.useState<TreeSelectionKeys>({});
691
+
692
+ React.useEffect(() => {
693
+ NodeService.getTreeNodes().then(setNodes);
694
+ }, []);
695
+
696
+ const selectedCount = Object.values(selectionKeys).filter(Boolean).length;
697
+
698
+ return (
699
+ <div className="flex flex-col gap-3 w-full md:w-120">
700
+ <div className="flex items-center justify-between gap-3 p-3 rounded-md border border-surface-200 dark:border-surface-700 bg-surface-50 dark:bg-surface-900">
701
+ <span className="text-sm text-surface-500 dark:text-surface-400">
702
+ <kbd className="px-1.5 py-0.5 text-xs rounded bg-surface-200 dark:bg-surface-700">↑</kbd>{' '}
703
+ <kbd className="px-1.5 py-0.5 text-xs rounded bg-surface-200 dark:bg-surface-700">↓</kbd> navigate,{' '}
704
+ <kbd className="px-1.5 py-0.5 text-xs rounded bg-surface-200 dark:bg-surface-700">→</kbd> expand,{' '}
705
+ <kbd className="px-1.5 py-0.5 text-xs rounded bg-surface-200 dark:bg-surface-700">←</kbd> collapse,{' '}
706
+ <kbd className="px-1.5 py-0.5 text-xs rounded bg-surface-200 dark:bg-surface-700">Space</kbd> select
707
+ </span>
708
+ <div className="flex items-center gap-2">
709
+ <span className="text-sm font-medium">Selected</span>
710
+ <Badge severity={selectedCount ? 'info' : 'secondary'}>{selectedCount}</Badge>
711
+ </div>
712
+ </div>
713
+ <Tree.Root
714
+ value={nodes}
715
+ selectionMode="multiple"
716
+ metaKeySelection
717
+ selectionKeys={selectionKeys}
718
+ onSelectionChange={(e: TreeRootSelectionChangeEvent) => setSelectionKeys(e.value as TreeSelectionKeys)}
719
+ defaultExpandedKeys={{ '0': true }}
720
+ >
721
+ <Tree.Nodes>
722
+ {({ node, leaf }) => (
723
+ <Tree.Node uKey={node.key}>
724
+ <Tree.Content>
725
+ <Tree.Toggle>
726
+ <Tree.ToggleIndicator match="expanded">
727
+ <ChevronDown />
728
+ </Tree.ToggleIndicator>
729
+ <Tree.ToggleIndicator match="collapsed">
730
+ <ChevronRight />
731
+ </Tree.ToggleIndicator>
732
+ </Tree.Toggle>
733
+ {leaf ? <File /> : <Folder />}
734
+ <Tree.Label>{node.label}</Tree.Label>
735
+ </Tree.Content>
736
+ </Tree.Node>
737
+ )}
738
+ </Tree.Nodes>
739
+ </Tree.Root>
740
+ </div>
741
+ );
742
+ }
743
+ ```
744
+
745
+ ### Filter
746
+
747
+ Filtering is composed with the _Tree.Filter_ input and a derived _value_. The [_useTreeFilter_](/docs/hooks/use-tree-filter) hook covers the common case of label-based search and exposes the filtered nodes along with an _expandedKeys_ map.
748
+
749
+ ```tsx
750
+ 'use client';
751
+ import { NodeService } from '@/shared/services/node.service';
752
+ import { ChevronDown } from '@primeicons/react/chevron-down';
753
+ import { ChevronRight } from '@primeicons/react/chevron-right';
754
+ import { Search } from '@primeicons/react/search';
755
+ import { useTreeFilter } from '@primereact/hooks/use-tree-filter';
756
+ import { Fluid } from '@primereact/ui/fluid';
757
+ import { IconField } from '@primereact/ui/iconfield';
758
+ import { InputText } from '@primereact/ui/inputtext';
759
+ import { Tree, type TreeExpandedKeys, type TreeNodeData, type TreeRootExpandedChangeEvent } from '@primereact/ui/tree';
760
+ import * as React from 'react';
761
+
762
+ function collectKeys(list: TreeNodeData[], acc: TreeExpandedKeys = {}): TreeExpandedKeys {
763
+ for (const node of list) {
764
+ if (node.children?.length) {
765
+ acc[node.key] = true;
766
+ collectKeys(node.children, acc);
767
+ }
768
+ }
769
+
770
+ return acc;
771
+ }
772
+
773
+ export default function FilterDemo() {
774
+ const [nodes, setNodes] = React.useState<TreeNodeData[]>([]);
775
+ const [query, setQuery] = React.useState('');
776
+ const [expandedKeys, setExpandedKeys] = React.useState<TreeExpandedKeys>({ '0': true });
777
+
778
+ React.useEffect(() => {
779
+ NodeService.getTreeNodes().then(setNodes);
780
+ }, []);
781
+
782
+ const { filteredNodes, isFiltered } = useTreeFilter<TreeNodeData>({
783
+ nodes,
784
+ field: 'label',
785
+ value: query,
786
+ matchMode: 'contains'
787
+ });
788
+
789
+ React.useEffect(() => {
790
+ if (isFiltered) setExpandedKeys(collectKeys(filteredNodes));
791
+ }, [isFiltered, filteredNodes]);
792
+
793
+ return (
794
+ <Tree.Root
795
+ value={filteredNodes}
796
+ expandedKeys={expandedKeys}
797
+ onExpandedChange={(e: TreeRootExpandedChangeEvent) => setExpandedKeys(e.value)}
798
+ className="w-full md:w-120"
799
+ >
800
+ <Tree.Header>
801
+ <IconField.Root as={Fluid}>
802
+ <InputText
803
+ value={query}
804
+ onChange={(e: React.ChangeEvent<HTMLInputElement>) => setQuery(e.target.value)}
805
+ placeholder="Search..."
806
+ />
807
+ <IconField.Inset>
808
+ <Search />
809
+ </IconField.Inset>
810
+ </IconField.Root>
811
+ </Tree.Header>
812
+ <Tree.Nodes>
813
+ {({ node }) => (
814
+ <Tree.Node uKey={node.key}>
815
+ <Tree.Content>
816
+ <Tree.Toggle>
817
+ <Tree.ToggleIndicator match="expanded">
818
+ <ChevronDown />
819
+ </Tree.ToggleIndicator>
820
+ <Tree.ToggleIndicator match="collapsed">
821
+ <ChevronRight />
822
+ </Tree.ToggleIndicator>
823
+ </Tree.Toggle>
824
+ <Tree.Label>{node.label}</Tree.Label>
825
+ </Tree.Content>
826
+ </Tree.Node>
827
+ )}
828
+ </Tree.Nodes>
829
+ <Tree.Empty className="mt-4 text-center text-sm text-surface-500">No nodes match &quot;{query}&quot;</Tree.Empty>
830
+ </Tree.Root>
831
+ );
832
+ }
833
+ ```
834
+
835
+ ### Lazy
836
+
837
+ Lazy loading is useful when dealing with huge datasets. Placeholder nodes are marked with _leaf: false_ and children are loaded on demand using the _onExpand_ event. The _loading_ flag on the node toggles a spinner inside _Tree.Toggle_.
838
+
839
+ ```tsx
840
+ 'use client';
841
+ import { ChevronDown } from '@primeicons/react/chevron-down';
842
+ import { ChevronRight } from '@primeicons/react/chevron-right';
843
+ import { File } from '@primeicons/react/file';
844
+ import { Folder } from '@primeicons/react/folder';
845
+ import { FolderOpen } from '@primeicons/react/folder-open';
846
+ import { Spinner } from '@primeicons/react/spinner';
847
+ import { Tree, type TreeNodeData, type TreeRootExpandEvent } from '@primereact/ui/tree';
848
+ import * as React from 'react';
849
+
850
+ const INITIAL_NODES: TreeNodeData[] = [
851
+ { key: '0', label: 'Documents', leaf: false },
852
+ { key: '1', label: 'Pictures', leaf: false },
853
+ { key: '2', label: 'Videos', leaf: false }
854
+ ];
855
+
856
+ function fetchChildren(parent: TreeNodeData): Promise<TreeNodeData[]> {
857
+ return new Promise((resolve) => {
858
+ setTimeout(() => {
859
+ const depth = parent.key.split('-').length;
860
+ const leaf = depth >= 3;
861
+
862
+ resolve([
863
+ { key: `${parent.key}-0`, label: leaf ? `${parent.label} - file.txt` : `${parent.label} / folder A`, leaf },
864
+ { key: `${parent.key}-1`, label: leaf ? `${parent.label} - readme.md` : `${parent.label} / folder B`, leaf },
865
+ { key: `${parent.key}-2`, label: `${parent.label} - notes.txt`, leaf: true }
866
+ ]);
867
+ }, 800);
868
+ });
869
+ }
870
+
871
+ function setChildren(list: TreeNodeData[], key: string, children: TreeNodeData[]): TreeNodeData[] {
872
+ return list.map((n) => {
873
+ if (n.key === key) return { ...n, children, loading: false };
874
+ if (n.children?.length) return { ...n, children: setChildren(n.children, key, children) };
875
+
876
+ return n;
877
+ });
878
+ }
879
+
880
+ function setLoading(list: TreeNodeData[], key: string, loading: boolean): TreeNodeData[] {
881
+ return list.map((n) => {
882
+ if (n.key === key) return { ...n, loading };
883
+ if (n.children?.length) return { ...n, children: setLoading(n.children, key, loading) };
884
+
885
+ return n;
886
+ });
887
+ }
888
+
889
+ export default function LazyDemo() {
890
+ const [nodes, setNodes] = React.useState<TreeNodeData[]>(INITIAL_NODES);
891
+
892
+ const pendingRef = React.useRef<Set<string>>(new Set());
893
+
894
+ const onExpand = async (event: TreeRootExpandEvent) => {
895
+ const node = event.node;
896
+
897
+ if (node.children || pendingRef.current.has(node.key)) return;
898
+
899
+ pendingRef.current.add(node.key);
900
+ setNodes((prev) => setLoading(prev, node.key, true));
901
+
902
+ try {
903
+ const children = await fetchChildren(node);
904
+
905
+ setNodes((prev) => setChildren(prev, node.key, children));
906
+ } catch {
907
+ setNodes((prev) => setLoading(prev, node.key, false));
908
+ } finally {
909
+ pendingRef.current.delete(node.key);
910
+ }
911
+ };
912
+
913
+ return (
914
+ <Tree.Root value={nodes} onExpand={onExpand} className="w-full md:w-120">
915
+ <Tree.Nodes>
916
+ {({ node, loading, leaf, expanded }) => (
917
+ <Tree.Node uKey={node.key}>
918
+ <Tree.Content>
919
+ <Tree.Toggle>
920
+ {loading ? (
921
+ <Spinner className="animate-spin" />
922
+ ) : (
923
+ <>
924
+ <Tree.ToggleIndicator match="expanded">
925
+ <ChevronDown />
926
+ </Tree.ToggleIndicator>
927
+ <Tree.ToggleIndicator match="collapsed">
928
+ <ChevronRight />
929
+ </Tree.ToggleIndicator>
930
+ </>
931
+ )}
932
+ </Tree.Toggle>
933
+ {leaf ? <File /> : expanded ? <FolderOpen /> : <Folder />}
934
+ <Tree.Label>{node.label}</Tree.Label>
935
+ </Tree.Content>
936
+ </Tree.Node>
937
+ )}
938
+ </Tree.Nodes>
939
+ </Tree.Root>
940
+ );
941
+ }
942
+ ```
943
+
944
+ ### Loading
945
+
946
+ #### Overlay
947
+
948
+ Setting the _loading_ property displays a mask over the tree. The mask content is provided through _Tree.Loading_.
949
+
950
+ ```tsx
951
+ 'use client';
952
+ import { NodeService } from '@/shared/services/node.service';
953
+ import { ChevronDown } from '@primeicons/react/chevron-down';
954
+ import { ChevronRight } from '@primeicons/react/chevron-right';
955
+ import { File } from '@primeicons/react/file';
956
+ import { Folder } from '@primeicons/react/folder';
957
+ import { Refresh } from '@primeicons/react/refresh';
958
+ import { Spinner } from '@primeicons/react/spinner';
959
+ import { Button } from '@primereact/ui/button';
960
+ import { Tree, type TreeNodeData } from '@primereact/ui/tree';
961
+ import * as React from 'react';
962
+
963
+ export default function LoadingOverlayDemo() {
964
+ const [nodes, setNodes] = React.useState<TreeNodeData[]>([]);
965
+ const [loading, setLoading] = React.useState(false);
966
+
967
+ React.useEffect(() => {
968
+ NodeService.getTreeNodes().then(setNodes);
969
+ }, []);
970
+
971
+ const refresh = React.useCallback(() => {
972
+ setLoading(true);
973
+ setTimeout(async () => {
974
+ const data = await NodeService.getTreeNodes();
975
+ setNodes(data);
976
+ setLoading(false);
977
+ }, 1500);
978
+ }, []);
979
+
980
+ return (
981
+ <div className="w-full md:w-120 flex flex-col gap-3">
982
+ <Button size="small" onClick={refresh} disabled={loading} className="self-end">
983
+ <Refresh />
984
+ Refresh
985
+ </Button>
986
+ <Tree.Root value={nodes} loading={loading} defaultExpandedKeys={{ '0': true }}>
987
+ <Tree.Nodes>
988
+ {({ node, leaf }) => (
989
+ <Tree.Node uKey={node.key}>
990
+ <Tree.Content>
991
+ <Tree.Toggle>
992
+ <Tree.ToggleIndicator match="expanded">
993
+ <ChevronDown />
994
+ </Tree.ToggleIndicator>
995
+ <Tree.ToggleIndicator match="collapsed">
996
+ <ChevronRight />
997
+ </Tree.ToggleIndicator>
998
+ </Tree.Toggle>
999
+ {leaf ? <File /> : <Folder />}
1000
+ <Tree.Label>{node.label}</Tree.Label>
1001
+ </Tree.Content>
1002
+ </Tree.Node>
1003
+ )}
1004
+ </Tree.Nodes>
1005
+ <Tree.Loading>
1006
+ <Spinner className="w-8! h-8! animate-spin text-primary" />
1007
+ </Tree.Loading>
1008
+ </Tree.Root>
1009
+ </div>
1010
+ );
1011
+ }
1012
+ ```
1013
+
1014
+ #### Skeleton
1015
+
1016
+ Placeholder _Skeleton_ primitives are rendered inside _Tree.Content_ while the dataset loads.
1017
+
1018
+ ```tsx
1019
+ 'use client';
1020
+ import { NodeService } from '@/shared/services/node.service';
1021
+ import { ChevronDown } from '@primeicons/react/chevron-down';
1022
+ import { ChevronRight } from '@primeicons/react/chevron-right';
1023
+ import { File } from '@primeicons/react/file';
1024
+ import { Folder } from '@primeicons/react/folder';
1025
+ import { Refresh } from '@primeicons/react/refresh';
1026
+ import { Button } from '@primereact/ui/button';
1027
+ import { Skeleton } from '@primereact/ui/skeleton';
1028
+ import { Tree, type TreeNodeData } from '@primereact/ui/tree';
1029
+ import * as React from 'react';
1030
+
1031
+ const PLACEHOLDERS: TreeNodeData[] = Array.from({ length: 6 }, (_, i) => ({
1032
+ key: `skeleton-${i}`,
1033
+ label: '',
1034
+ leaf: true
1035
+ }));
1036
+
1037
+ export default function LoadingSkeletonDemo() {
1038
+ const [nodes, setNodes] = React.useState<TreeNodeData[]>([]);
1039
+ const [loading, setLoading] = React.useState(true);
1040
+
1041
+ const refresh = React.useCallback(() => {
1042
+ setLoading(true);
1043
+ setTimeout(async () => {
1044
+ const data = await NodeService.getTreeNodes();
1045
+ setNodes(data);
1046
+ setLoading(false);
1047
+ }, 1500);
1048
+ }, []);
1049
+
1050
+ React.useEffect(() => {
1051
+ refresh();
1052
+ }, [refresh]);
1053
+
1054
+ return (
1055
+ <div className="w-full md:w-120 flex flex-col gap-3">
1056
+ <Button size="small" onClick={refresh} disabled={loading} className="self-end">
1057
+ <Refresh />
1058
+ Refresh
1059
+ </Button>
1060
+ <Tree.Root value={loading ? PLACEHOLDERS : nodes} defaultExpandedKeys={{ '0': true }}>
1061
+ <Tree.Nodes>
1062
+ {({ node, leaf }) =>
1063
+ loading ? (
1064
+ <Tree.Node uKey={node.key}>
1065
+ <Tree.Content>
1066
+ <Skeleton shape="circle" size="1rem" />
1067
+ <Skeleton width="40%" height="0.75rem" borderRadius="4px" />
1068
+ </Tree.Content>
1069
+ </Tree.Node>
1070
+ ) : (
1071
+ <Tree.Node uKey={node.key}>
1072
+ <Tree.Content>
1073
+ <Tree.Toggle>
1074
+ <Tree.ToggleIndicator match="expanded">
1075
+ <ChevronDown />
1076
+ </Tree.ToggleIndicator>
1077
+ <Tree.ToggleIndicator match="collapsed">
1078
+ <ChevronRight />
1079
+ </Tree.ToggleIndicator>
1080
+ </Tree.Toggle>
1081
+ {leaf ? <File /> : <Folder />}
1082
+ <Tree.Label>{node.label}</Tree.Label>
1083
+ </Tree.Content>
1084
+ </Tree.Node>
1085
+ )
1086
+ }
1087
+ </Tree.Nodes>
1088
+ </Tree.Root>
1089
+ </div>
1090
+ );
1091
+ }
1092
+ ```
1093
+
1094
+ ### Empty
1095
+
1096
+ When _value_ is empty, _Tree.Empty_ is rendered in place of the rows.
1097
+
1098
+ ```tsx
1099
+ 'use client';
1100
+ import { ChevronDown } from '@primeicons/react/chevron-down';
1101
+ import { ChevronRight } from '@primeicons/react/chevron-right';
1102
+ import { Folder } from '@primeicons/react/folder';
1103
+ import { Plus } from '@primeicons/react/plus';
1104
+ import { Button } from '@primereact/ui/button';
1105
+ import { Tree, type TreeNodeData } from '@primereact/ui/tree';
1106
+ import * as React from 'react';
1107
+
1108
+ export default function EmptyDemo() {
1109
+ const [nodes, setNodes] = React.useState<TreeNodeData[]>([]);
1110
+
1111
+ const addNode = () => {
1112
+ const next: TreeNodeData = { key: `root-${nodes.length}`, label: `New Folder ${nodes.length + 1}` };
1113
+ setNodes((prev) => [...prev, next]);
1114
+ };
1115
+
1116
+ return (
1117
+ <Tree.Root value={nodes} className="w-full md:w-120">
1118
+ <Tree.Nodes>
1119
+ {({ node }) => (
1120
+ <Tree.Node uKey={node.key}>
1121
+ <Tree.Content>
1122
+ <Tree.Toggle>
1123
+ <Tree.ToggleIndicator match="expanded">
1124
+ <ChevronDown />
1125
+ </Tree.ToggleIndicator>
1126
+ <Tree.ToggleIndicator match="collapsed">
1127
+ <ChevronRight />
1128
+ </Tree.ToggleIndicator>
1129
+ </Tree.Toggle>
1130
+ <Folder />
1131
+ <Tree.Label>{node.label}</Tree.Label>
1132
+ </Tree.Content>
1133
+ </Tree.Node>
1134
+ )}
1135
+ </Tree.Nodes>
1136
+ <Tree.Empty>
1137
+ <div className="flex flex-col items-center justify-center gap-3 py-10 text-center">
1138
+ <div className="w-14 h-14 rounded-full bg-surface-100 dark:bg-surface-800 flex items-center justify-center">
1139
+ <Folder className="w-7 h-7 text-surface-400 dark:text-surface-500" />
1140
+ </div>
1141
+ <div>
1142
+ <p className="m-0 font-semibold text-surface-900 dark:text-surface-0">No folders yet</p>
1143
+ <p className="mt-1 text-sm text-surface-500 dark:text-surface-400">Create your first folder to start building a tree.</p>
1144
+ </div>
1145
+ <Button size="small" onClick={addNode}>
1146
+ <Plus />
1147
+ New Folder
1148
+ </Button>
1149
+ </div>
1150
+ </Tree.Empty>
1151
+ </Tree.Root>
1152
+ );
1153
+ }
1154
+ ```
1155
+
1156
+ ### Drag and Drop
1157
+
1158
+ #### Single
1159
+
1160
+ Nodes can be reordered within a tree by setting _draggable_ and _droppable_. The _onMove_ callback receives the updated tree value along with _dragNode_, _dropNode_, _dropIndex_ and _dropPosition_. Drop targets render _Tree.DropIndicator_ with _position="before"_ and _position="after"_ around _Tree.Content_.
1161
+
1162
+ ```tsx
1163
+ 'use client';
1164
+ import { ChevronDown } from '@primeicons/react/chevron-down';
1165
+ import { ChevronRight } from '@primeicons/react/chevron-right';
1166
+ import { Tree, type TreeNodeData, type TreeRootMoveEvent } from '@primereact/ui/tree';
1167
+ import * as React from 'react';
1168
+
1169
+ const INITIAL: TreeNodeData[] = [
1170
+ {
1171
+ key: '0',
1172
+ label: 'app',
1173
+ children: [
1174
+ {
1175
+ key: '0-0',
1176
+ label: 'api',
1177
+ children: [{ key: '0-0-0', label: 'route.ts' }]
1178
+ },
1179
+ { key: '0-1', label: 'layout.tsx' },
1180
+ { key: '0-2', label: 'page.tsx' }
1181
+ ]
1182
+ },
1183
+ {
1184
+ key: '1',
1185
+ label: 'components',
1186
+ children: [
1187
+ { key: '1-0', label: 'Header.tsx' },
1188
+ { key: '1-1', label: 'Footer.tsx' }
1189
+ ]
1190
+ },
1191
+ { key: '2', label: 'package.json' },
1192
+ { key: '3', label: 'README.md' }
1193
+ ];
1194
+
1195
+ export default function DragDropSingleDemo() {
1196
+ const [nodes, setNodes] = React.useState<TreeNodeData[]>(INITIAL);
1197
+
1198
+ return (
1199
+ <Tree.Root
1200
+ value={nodes}
1201
+ draggable
1202
+ droppable
1203
+ onMove={(e: TreeRootMoveEvent) => setNodes(e.value)}
1204
+ defaultExpandedKeys={{ '0': true, '1': true }}
1205
+ className="w-full md:w-120"
1206
+ >
1207
+ <Tree.Nodes>
1208
+ {({ node }) => (
1209
+ <Tree.Node uKey={node.key}>
1210
+ <Tree.DropIndicator position="before" />
1211
+ <Tree.Content>
1212
+ <Tree.Toggle>
1213
+ <Tree.ToggleIndicator match="expanded">
1214
+ <ChevronDown />
1215
+ </Tree.ToggleIndicator>
1216
+ <Tree.ToggleIndicator match="collapsed">
1217
+ <ChevronRight />
1218
+ </Tree.ToggleIndicator>
1219
+ </Tree.Toggle>
1220
+ <Tree.Label>{node.label}</Tree.Label>
1221
+ </Tree.Content>
1222
+ <Tree.DropIndicator position="after" />
1223
+ </Tree.Node>
1224
+ )}
1225
+ </Tree.Nodes>
1226
+ </Tree.Root>
1227
+ );
1228
+ }
1229
+ ```
1230
+
1231
+ #### Multiple
1232
+
1233
+ Nodes can be transferred between trees with _draggableScope_ and _droppableScope_. The _draggableScope_ tags the nodes that leave a tree; _droppableScope_ declares which scopes a tree accepts. Both accept a string or an array of strings.
1234
+
1235
+ ```tsx
1236
+ 'use client';
1237
+ import { ChevronDown } from '@primeicons/react/chevron-down';
1238
+ import { ChevronRight } from '@primeicons/react/chevron-right';
1239
+ import { Tree, type TreeNodeData, type TreeRootMoveEvent } from '@primereact/ui/tree';
1240
+ import * as React from 'react';
1241
+
1242
+ const INITIAL_A: TreeNodeData[] = [
1243
+ {
1244
+ key: '0',
1245
+ label: 'app',
1246
+ children: [
1247
+ { key: '0-0', label: 'api', children: [{ key: '0-0-0', label: 'route.ts' }] },
1248
+ { key: '0-1', label: 'layout.tsx' },
1249
+ { key: '0-2', label: 'page.tsx' }
1250
+ ]
1251
+ },
1252
+ {
1253
+ key: '1',
1254
+ label: 'components',
1255
+ children: [
1256
+ { key: '1-0', label: 'Header.tsx' },
1257
+ { key: '1-1', label: 'Footer.tsx' }
1258
+ ]
1259
+ },
1260
+ {
1261
+ key: '2',
1262
+ label: 'public',
1263
+ children: [{ key: '2-0', label: 'favicon.ico' }]
1264
+ },
1265
+ { key: '3', label: '.env.local' },
1266
+ { key: '4', label: 'next.config.js' },
1267
+ { key: '5', label: 'package.json' },
1268
+ { key: '6', label: 'README.md' }
1269
+ ];
1270
+
1271
+ const INITIAL_B: TreeNodeData[] = [{ key: 'etc', label: '/etc' }];
1272
+
1273
+ function renderNode({ node }: { node: TreeNodeData }) {
1274
+ return (
1275
+ <Tree.Node uKey={node.key}>
1276
+ <Tree.Content>
1277
+ <Tree.Toggle>
1278
+ <Tree.ToggleIndicator match="expanded">
1279
+ <ChevronDown />
1280
+ </Tree.ToggleIndicator>
1281
+ <Tree.ToggleIndicator match="collapsed">
1282
+ <ChevronRight />
1283
+ </Tree.ToggleIndicator>
1284
+ </Tree.Toggle>
1285
+ <Tree.Label>{node.label}</Tree.Label>
1286
+ </Tree.Content>
1287
+ </Tree.Node>
1288
+ );
1289
+ }
1290
+
1291
+ export default function DragDropMultipleDemo() {
1292
+ const [a, setA] = React.useState<TreeNodeData[]>(INITIAL_A);
1293
+ const [b, setB] = React.useState<TreeNodeData[]>(INITIAL_B);
1294
+ const [c, setC] = React.useState<TreeNodeData[]>([]);
1295
+
1296
+ return (
1297
+ <div className="flex flex-col md:flex-row gap-4">
1298
+ <Tree.Root
1299
+ value={a}
1300
+ draggable
1301
+ droppable
1302
+ draggableScope="first"
1303
+ droppableScope="none"
1304
+ onMove={(e: TreeRootMoveEvent) => setA(e.value)}
1305
+ defaultExpandedKeys={{ '0': true }}
1306
+ className="flex-1 border border-surface rounded-lg p-2"
1307
+ >
1308
+ <Tree.Nodes>{renderNode}</Tree.Nodes>
1309
+ </Tree.Root>
1310
+ <Tree.Root
1311
+ value={b}
1312
+ draggable
1313
+ droppable
1314
+ draggableScope="second"
1315
+ droppableScope="first"
1316
+ onMove={(e: TreeRootMoveEvent) => setB(e.value)}
1317
+ className="flex-1 border border-surface rounded-lg p-2"
1318
+ >
1319
+ <Tree.Nodes>{renderNode}</Tree.Nodes>
1320
+ </Tree.Root>
1321
+ <Tree.Root
1322
+ value={c}
1323
+ droppable
1324
+ droppableScope={['first', 'second']}
1325
+ onMove={(e: TreeRootMoveEvent) => setC(e.value)}
1326
+ className="flex-1 border border-surface rounded-lg p-2 min-h-40"
1327
+ >
1328
+ <Tree.Nodes>{renderNode}</Tree.Nodes>
1329
+ <Tree.Empty className="text-center text-sm text-surface-500 py-12">Drop here</Tree.Empty>
1330
+ </Tree.Root>
1331
+ </div>
1332
+ );
1333
+ }
1334
+ ```
1335
+
1336
+ ## Related
1337
+
1338
+ ### Sub-Components
1339
+
1340
+ See the [Primitive API](/docs/primitive/components/tree#api) for _Tree.Root_, _Tree.Nodes_, _Tree.Node_, _Tree.Content_, _Tree.Toggle_, _Tree.ToggleIndicator_, _Tree.Selection_, _Tree.DropIndicator_, _Tree.Label_, _Tree.Filter_, _Tree.Header_, _Tree.Footer_, _Tree.Empty_ and _Tree.Loading_.
1341
+
1342
+ ### Hooks
1343
+
1344
+ See the [Headless API](/docs/headless/components/tree#api) for _useTree_ and _useTreeNode_.
1345
+
1346
+ ### Accessibility
1347
+
1348
+ See [Tree Primitive](/docs/primitive/components/tree#accessibility) for WAI-ARIA compliance details and keyboard support.
1349
+
1350
+
1351
+ # Tree Theming
1352
+
1353
+ Theming documentation for Tree component
1354
+
1355
+ ## Styled
1356
+
1357
+ ### CSS Classes
1358
+
1359
+ The class names emitted in styled mode:
1360
+
1361
+ <DocTable name="Tree" category="style" />
1362
+
1363
+ ### Design Tokens
1364
+
1365
+ The design tokens Tree reads:
1366
+
1367
+ <DocTable name="Tree" category="token" />
1368
+
1369
+ ## Unstyled
1370
+
1371
+ In unstyled mode there are no built-in classes. Style each part through the pass-through (`pt`) prop.
1372
+
1373
+
1374
+ ## Theming
1375
+
1376
+ ### CSS Classes
1377
+
1378
+ List of class names used in the styled mode.
1379
+
1380
+ <DocTable name="Tree" category="style" />
1381
+
1382
+ ### Design Tokens
1383
+
1384
+ List of design tokens.
1385
+
1386
+ <DocTable name="Tree" category="token" />