@primevue/mcp 4.5.5 → 5.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 (173) hide show
  1. package/LICENSE.md +45 -21
  2. package/README.md +48 -250
  3. package/data/components.json +47269 -0
  4. package/data/llms/components/accordion.md +629 -0
  5. package/data/llms/components/animateonscroll.md +165 -0
  6. package/data/llms/components/autocomplete.md +995 -0
  7. package/data/llms/components/avatar.md +264 -0
  8. package/data/llms/components/badge.md +200 -0
  9. package/data/llms/components/blockui.md +99 -0
  10. package/data/llms/components/breadcrumb.md +269 -0
  11. package/data/llms/components/button.md +902 -0
  12. package/data/llms/components/card.md +209 -0
  13. package/data/llms/components/carousel.md +506 -0
  14. package/data/llms/components/cascadeselect.md +1207 -0
  15. package/data/llms/components/chart.md +1022 -0
  16. package/data/llms/components/checkbox.md +401 -0
  17. package/data/llms/components/chip.md +206 -0
  18. package/data/llms/components/colorpicker.md +213 -0
  19. package/data/llms/components/commandmenu.md +660 -0
  20. package/data/llms/components/compare.md +407 -0
  21. package/data/llms/components/confirmdialog.md +343 -0
  22. package/data/llms/components/confirmpopup.md +252 -0
  23. package/data/llms/components/contextmenu.md +522 -0
  24. package/data/llms/components/datatable.md +5266 -0
  25. package/data/llms/components/dataview.md +569 -0
  26. package/data/llms/components/datepicker.md +964 -0
  27. package/data/llms/components/deferredcontent.md +96 -0
  28. package/data/llms/components/dialog.md +702 -0
  29. package/data/llms/components/divider.md +152 -0
  30. package/data/llms/components/dock.md +488 -0
  31. package/data/llms/components/drawer.md +469 -0
  32. package/data/llms/components/dynamicdialog.md +214 -0
  33. package/data/llms/components/editor.md +205 -0
  34. package/data/llms/components/fieldset.md +253 -0
  35. package/data/llms/components/fileupload.md +459 -0
  36. package/data/llms/components/floatlabel.md +144 -0
  37. package/data/llms/components/fluid.md +104 -0
  38. package/data/llms/components/focustrap.md +59 -0
  39. package/data/llms/components/forms.md +344 -0
  40. package/data/llms/components/galleria.md +1119 -0
  41. package/data/llms/components/gallery.md +1003 -0
  42. package/data/llms/components/iconfield.md +283 -0
  43. package/data/llms/components/iftalabel.md +96 -0
  44. package/data/llms/components/image.md +179 -0
  45. package/data/llms/components/imagecompare.md +108 -0
  46. package/data/llms/components/inplace.md +183 -0
  47. package/data/llms/components/inputcolor.md +869 -0
  48. package/data/llms/components/inputgroup.md +419 -0
  49. package/data/llms/components/inputmask.md +345 -0
  50. package/data/llms/components/inputnumber.md +551 -0
  51. package/data/llms/components/inputotp.md +345 -0
  52. package/data/llms/components/inputpassword.md +738 -0
  53. package/data/llms/components/inputtags.md +432 -0
  54. package/data/llms/components/inputtext.md +569 -0
  55. package/data/llms/components/installation.md +1 -0
  56. package/data/llms/components/keyfilter.md +116 -0
  57. package/data/llms/components/knob.md +318 -0
  58. package/data/llms/components/label.md +151 -0
  59. package/data/llms/components/laravel.md +53 -0
  60. package/data/llms/components/listbox.md +636 -0
  61. package/data/llms/components/mask.md +203 -0
  62. package/data/llms/components/mcp.md +39 -0
  63. package/data/llms/components/megamenu.md +563 -0
  64. package/data/llms/components/menu.md +651 -0
  65. package/data/llms/components/menubar.md +446 -0
  66. package/data/llms/components/message.md +497 -0
  67. package/data/llms/components/metergroup.md +281 -0
  68. package/data/llms/components/multiselect.md +752 -0
  69. package/data/llms/components/orderlist.md +224 -0
  70. package/data/llms/components/organizationchart.md +418 -0
  71. package/data/llms/components/paginator.md +221 -0
  72. package/data/llms/components/panel.md +321 -0
  73. package/data/llms/components/panelmenu.md +703 -0
  74. package/data/llms/components/password.md +657 -0
  75. package/data/llms/components/picklist.md +286 -0
  76. package/data/llms/components/popover.md +145 -0
  77. package/data/llms/components/progressbar.md +242 -0
  78. package/data/llms/components/progressspinner.md +104 -0
  79. package/data/llms/components/radiobutton.md +427 -0
  80. package/data/llms/components/rating.md +312 -0
  81. package/data/llms/components/ripple.md +91 -0
  82. package/data/llms/components/scrollarea.md +700 -0
  83. package/data/llms/components/scrollpanel.md +131 -0
  84. package/data/llms/components/scrolltop.md +87 -0
  85. package/data/llms/components/select.md +1251 -0
  86. package/data/llms/components/selectbutton.md +268 -0
  87. package/data/llms/components/sidebar.md +2232 -0
  88. package/data/llms/components/skeleton.md +302 -0
  89. package/data/llms/components/slider.md +416 -0
  90. package/data/llms/components/speeddial.md +402 -0
  91. package/data/llms/components/splitbutton.md +840 -0
  92. package/data/llms/components/splitter.md +447 -0
  93. package/data/llms/components/stepper.md +551 -0
  94. package/data/llms/components/styleclass.md +226 -0
  95. package/data/llms/components/tabs.md +609 -0
  96. package/data/llms/components/tag.md +178 -0
  97. package/data/llms/components/terminal.md +123 -0
  98. package/data/llms/components/textarea.md +519 -0
  99. package/data/llms/components/tieredmenu.md +578 -0
  100. package/data/llms/components/timeline.md +494 -0
  101. package/data/llms/components/toast.md +472 -0
  102. package/data/llms/components/togglebutton.md +276 -0
  103. package/data/llms/components/toggleswitch.md +271 -0
  104. package/data/llms/components/toolbar.md +140 -0
  105. package/data/llms/components/tooltip.md +160 -0
  106. package/data/llms/components/tree.md +1076 -0
  107. package/data/llms/components/treeselect.md +660 -0
  108. package/data/llms/components/treetable.md +2493 -0
  109. package/data/llms/components/virtualscroller.md +265 -0
  110. package/data/llms/guides/autoimport.md +28 -0
  111. package/data/llms/guides/cdn.md +72 -0
  112. package/data/llms/guides/configuration.md +158 -0
  113. package/data/llms/guides/customicons.md +67 -0
  114. package/data/llms/guides/guides/accessibility.md +27 -0
  115. package/data/llms/guides/guides/animations.md +119 -0
  116. package/data/llms/guides/guides/rtl.md +7 -0
  117. package/data/llms/guides/icons.md +136 -0
  118. package/data/llms/guides/installation.md +3 -0
  119. package/data/llms/guides/laravel.md +66 -0
  120. package/data/llms/guides/llms.md +15 -0
  121. package/data/llms/guides/mcp.md +104 -0
  122. package/data/llms/guides/migration/v4.md +15 -0
  123. package/data/llms/guides/migration/v5.md +15 -0
  124. package/data/llms/guides/nuxt.md +141 -0
  125. package/data/llms/guides/passthrough.md +137 -0
  126. package/data/llms/guides/primeclt.md +43 -0
  127. package/data/llms/guides/tailwind.md +151 -0
  128. package/data/llms/guides/theming/styled.md +497 -0
  129. package/data/llms/guides/theming/unstyled.md +57 -0
  130. package/data/llms/guides/uikit.md +3 -0
  131. package/data/llms/guides/vite.md +90 -0
  132. package/data/llms/llms-full.txt +54465 -0
  133. package/data/llms/llms.txt +132 -0
  134. package/data/llms/pages/accessibility.md +27 -0
  135. package/data/llms/pages/animations.md +119 -0
  136. package/data/llms/pages/autoimport.md +28 -0
  137. package/data/llms/pages/cdn.md +72 -0
  138. package/data/llms/pages/configuration.md +158 -0
  139. package/data/llms/pages/contribution.md +31 -0
  140. package/data/llms/pages/customicons.md +67 -0
  141. package/data/llms/pages/designer.md +79 -0
  142. package/data/llms/pages/dynamicimports.md +7 -0
  143. package/data/llms/pages/forms.md +63 -0
  144. package/data/llms/pages/guides/accessibility.md +27 -0
  145. package/data/llms/pages/guides/animations.md +119 -0
  146. package/data/llms/pages/guides/rtl.md +7 -0
  147. package/data/llms/pages/icons.md +136 -0
  148. package/data/llms/pages/installation.md +3 -0
  149. package/data/llms/pages/introduction.md +23 -0
  150. package/data/llms/pages/laravel.md +66 -0
  151. package/data/llms/pages/llms.md +15 -0
  152. package/data/llms/pages/mcp.md +104 -0
  153. package/data/llms/pages/migration/v4.md +15 -0
  154. package/data/llms/pages/migration/v5.md +15 -0
  155. package/data/llms/pages/nuxt.md +141 -0
  156. package/data/llms/pages/passthrough.md +137 -0
  157. package/data/llms/pages/primeclt.md +43 -0
  158. package/data/llms/pages/rtl.md +7 -0
  159. package/data/llms/pages/setup.md +3 -0
  160. package/data/llms/pages/styled.md +497 -0
  161. package/data/llms/pages/tailwind.md +151 -0
  162. package/data/llms/pages/theming/styled.md +497 -0
  163. package/data/llms/pages/theming/unstyled.md +57 -0
  164. package/data/llms/pages/uikit.md +3 -0
  165. package/data/llms/pages/unstyled.md +57 -0
  166. package/data/llms/pages/v4.md +15 -0
  167. package/data/llms/pages/v5.md +15 -0
  168. package/data/llms/pages/vite.md +90 -0
  169. package/data/manifest.json +11117 -0
  170. package/data/mcp-data.json +55940 -0
  171. package/dist/index.d.ts +17 -1
  172. package/dist/index.js +66066 -72541
  173. package/package.json +10 -12
@@ -0,0 +1,703 @@
1
+ # PanelMenu
2
+
3
+ PanelMenu is a hybrid of Accordion and Tree components.
4
+
5
+ ## Basic
6
+
7
+ PanelMenu requires a collection of menuitems as its model .
8
+
9
+ ```vue
10
+ <template>
11
+ <div class="flex justify-center">
12
+ <PanelMenu :model="items" class="w-full md:w-80" />
13
+ </div>
14
+ </template>
15
+
16
+ <script setup>
17
+ import { ref } from "vue";
18
+ import CheckCircle from '@primeicons/vue/check-circle';
19
+ import Cloud from '@primeicons/vue/cloud';
20
+ import CloudDownload from '@primeicons/vue/cloud-download';
21
+ import CloudUpload from '@primeicons/vue/cloud-upload';
22
+ import Desktop from '@primeicons/vue/desktop';
23
+ import File from '@primeicons/vue/file';
24
+ import FilePdf from '@primeicons/vue/file-pdf';
25
+ import Image from '@primeicons/vue/image';
26
+ import Mobile from '@primeicons/vue/mobile';
27
+ import Refresh from '@primeicons/vue/refresh';
28
+ import Stop from '@primeicons/vue/stop';
29
+ import Tablet from '@primeicons/vue/tablet';
30
+ import Users from '@primeicons/vue/users';
31
+
32
+ const items = ref([
33
+ {
34
+ label: 'Files',
35
+ icon: File,
36
+ items: [
37
+ {
38
+ label: 'Documents',
39
+ icon: File,
40
+ items: [
41
+ {
42
+ label: 'Invoices',
43
+ icon: FilePdf,
44
+ items: [
45
+ {
46
+ label: 'Pending',
47
+ icon: Stop
48
+ },
49
+ {
50
+ label: 'Paid',
51
+ icon: CheckCircle
52
+ }
53
+ ]
54
+ },
55
+ {
56
+ label: 'Clients',
57
+ icon: Users
58
+ }
59
+ ]
60
+ },
61
+ {
62
+ label: 'Images',
63
+ icon: Image,
64
+ items: [
65
+ {
66
+ label: 'Logos',
67
+ icon: Image
68
+ }
69
+ ]
70
+ }
71
+ ]
72
+ },
73
+ {
74
+ label: 'Cloud',
75
+ icon: Cloud,
76
+ items: [
77
+ {
78
+ label: 'Upload',
79
+ icon: CloudUpload
80
+ },
81
+ {
82
+ label: 'Download',
83
+ icon: CloudDownload
84
+ },
85
+ {
86
+ label: 'Sync',
87
+ icon: Refresh
88
+ }
89
+ ]
90
+ },
91
+ {
92
+ label: 'Devices',
93
+ icon: Desktop,
94
+ items: [
95
+ {
96
+ label: 'Phone',
97
+ icon: Mobile
98
+ },
99
+ {
100
+ label: 'Desktop',
101
+ icon: Desktop
102
+ },
103
+ {
104
+ label: 'Tablet',
105
+ icon: Tablet
106
+ }
107
+ ]
108
+ }
109
+ ]);
110
+ <\/script>
111
+ ```
112
+
113
+ ## Multiple
114
+
115
+ Only one single root menuitem can be active by default, enable multiple property to be able to open more than one items.
116
+
117
+ ```vue
118
+ <template>
119
+ <div class="flex justify-center">
120
+ <PanelMenu :model="items" multiple class="w-full md:w-80" />
121
+ </div>
122
+ </template>
123
+
124
+ <script setup>
125
+ import { ref } from "vue";
126
+ import CheckCircle from '@primeicons/vue/check-circle';
127
+ import Cloud from '@primeicons/vue/cloud';
128
+ import CloudDownload from '@primeicons/vue/cloud-download';
129
+ import CloudUpload from '@primeicons/vue/cloud-upload';
130
+ import Desktop from '@primeicons/vue/desktop';
131
+ import File from '@primeicons/vue/file';
132
+ import FilePdf from '@primeicons/vue/file-pdf';
133
+ import Image from '@primeicons/vue/image';
134
+ import Mobile from '@primeicons/vue/mobile';
135
+ import Refresh from '@primeicons/vue/refresh';
136
+ import Stop from '@primeicons/vue/stop';
137
+ import Tablet from '@primeicons/vue/tablet';
138
+ import Users from '@primeicons/vue/users';
139
+
140
+ const items = ref([
141
+ {
142
+ label: 'Files',
143
+ icon: File,
144
+ items: [
145
+ {
146
+ label: 'Documents',
147
+ icon: File,
148
+ items: [
149
+ {
150
+ label: 'Invoices',
151
+ icon: FilePdf,
152
+ items: [
153
+ {
154
+ label: 'Pending',
155
+ icon: Stop
156
+ },
157
+ {
158
+ label: 'Paid',
159
+ icon: CheckCircle
160
+ }
161
+ ]
162
+ },
163
+ {
164
+ label: 'Clients',
165
+ icon: Users
166
+ }
167
+ ]
168
+ },
169
+ {
170
+ label: 'Images',
171
+ icon: Image,
172
+ items: [
173
+ {
174
+ label: 'Logos',
175
+ icon: Image
176
+ }
177
+ ]
178
+ }
179
+ ]
180
+ },
181
+ {
182
+ label: 'Cloud',
183
+ icon: Cloud,
184
+ items: [
185
+ {
186
+ label: 'Upload',
187
+ icon: CloudUpload
188
+ },
189
+ {
190
+ label: 'Download',
191
+ icon: CloudDownload
192
+ },
193
+ {
194
+ label: 'Sync',
195
+ icon: Refresh
196
+ }
197
+ ]
198
+ },
199
+ {
200
+ label: 'Devices',
201
+ icon: Desktop,
202
+ items: [
203
+ {
204
+ label: 'Phone',
205
+ icon: Mobile
206
+ },
207
+ {
208
+ label: 'Desktop',
209
+ icon: Desktop
210
+ },
211
+ {
212
+ label: 'Tablet',
213
+ icon: Tablet
214
+ }
215
+ ]
216
+ }
217
+ ]);
218
+ <\/script>
219
+ ```
220
+
221
+ ## Controlled
222
+
223
+ Menu items can be controlled programmatically.
224
+
225
+ ```vue
226
+ <template>
227
+ <div class="flex flex-col items-center gap-4">
228
+ <Button type="button" text @click="toggleAll">Toggle All</Button>
229
+ <PanelMenu v-model:expandedKeys="expandedKeys" :model="items" class="w-full md:w-80" />
230
+ </div>
231
+ </template>
232
+
233
+ <script setup>
234
+ import { ref } from "vue";
235
+ import Calendar from '@primeicons/vue/calendar';
236
+ import Server from '@primeicons/vue/server';
237
+ import Users from '@primeicons/vue/users';
238
+
239
+ const expandedKeys = ref({});
240
+ const items = ref([
241
+ {
242
+ key: '0',
243
+ label: 'Users',
244
+ icon: Users,
245
+ items: [
246
+ {
247
+ key: '0_1',
248
+ label: 'New',
249
+ items: [
250
+ {
251
+ key: '0_1_0',
252
+ label: 'Member'
253
+ },
254
+ {
255
+ key: '0_1_1',
256
+ label: 'Group'
257
+ }
258
+ ]
259
+ },
260
+ {
261
+ key: '0_2',
262
+ label: 'Search'
263
+ }
264
+ ]
265
+ },
266
+ {
267
+ key: '1',
268
+ label: 'Tasks',
269
+ icon: Server,
270
+ items: [
271
+ {
272
+ key: '1_0',
273
+ label: 'Add New'
274
+ },
275
+ {
276
+ key: '1_1',
277
+ label: 'Pending'
278
+ },
279
+ {
280
+ key: '1_2',
281
+ label: 'Overdue'
282
+ }
283
+ ]
284
+ },
285
+ {
286
+ key: '2',
287
+ label: 'Calendar',
288
+ icon: Calendar,
289
+ items: [
290
+ {
291
+ key: '2_0',
292
+ label: 'New Event'
293
+ },
294
+ {
295
+ key: '2_1',
296
+ label: 'Today'
297
+ },
298
+ {
299
+ key: '2_2',
300
+ label: 'This Week'
301
+ }
302
+ ]
303
+ }
304
+ ]);
305
+
306
+ const toggleAll = () => {
307
+ if (Object.keys(expandedKeys.value).length) collapseAll();
308
+ else expandAll();
309
+ }
310
+
311
+ const expandAll = () => {
312
+ for (let node of items.value) {
313
+ expandNode(node);
314
+ }
315
+
316
+ expandedKeys.value = {...expandedKeys.value};
317
+ };
318
+
319
+ const collapseAll = () => {
320
+ expandedKeys.value = {};
321
+ };
322
+
323
+ const expandNode = (node) => {
324
+ if (node.items && node.items.length) {
325
+ expandedKeys.value[node.key] = true;
326
+
327
+ for (let child of node.items) {
328
+ expandNode(child);
329
+ }
330
+ }
331
+ };
332
+ <\/script>
333
+ ```
334
+
335
+ ## Template
336
+
337
+ PanelMenu offers item customization with the item template that receives the menuitem instance from the model as a parameter.
338
+
339
+ ```vue
340
+ <template>
341
+ <div class="flex justify-center">
342
+ <PanelMenu :model="items" class="w-full md:w-80">
343
+ <template #item="{ item, icon, label }">
344
+ <a v-ripple class="flex items-center px-4 py-2 cursor-pointer group">
345
+ <component :is="icon" class="text-primary group-hover:text-inherit" />
346
+ <span :class="['ml-2', { 'font-semibold': item.items }]">{{ label }}</span>
347
+ <Badge v-if="item.badge" class="ml-auto" :value="item.badge" />
348
+ <span v-if="item.shortcut" class="ml-auto border border-surface rounded bg-emphasis text-muted-color text-xs p-1">{{ item.shortcut }}</span>
349
+ </a>
350
+ </template>
351
+ </PanelMenu>
352
+ </div>
353
+ </template>
354
+
355
+ <script setup>
356
+ import { ref } from "vue";
357
+ import ChartBar from '@primeicons/vue/chart-bar';
358
+ import ChartLine from '@primeicons/vue/chart-line';
359
+ import Cog from '@primeicons/vue/cog';
360
+ import Envelope from '@primeicons/vue/envelope';
361
+ import FileEdit from '@primeicons/vue/file-edit';
362
+ import Inbox from '@primeicons/vue/inbox';
363
+ import List from '@primeicons/vue/list';
364
+ import Send from '@primeicons/vue/send';
365
+ import Shield from '@primeicons/vue/shield';
366
+ import Trash from '@primeicons/vue/trash';
367
+ import User from '@primeicons/vue/user';
368
+
369
+ const items = ref([
370
+ {
371
+ label: 'Mail',
372
+ icon: Envelope,
373
+ badge: 5,
374
+ items: [
375
+ {
376
+ label: 'Compose',
377
+ icon: FileEdit,
378
+ shortcut: '⌘+N'
379
+ },
380
+ {
381
+ label: 'Inbox',
382
+ icon: Inbox,
383
+ badge: 5
384
+ },
385
+ {
386
+ label: 'Sent',
387
+ icon: Send,
388
+ shortcut: '⌘+S'
389
+ },
390
+ {
391
+ label: 'Trash',
392
+ icon: Trash,
393
+ shortcut: '⌘+T'
394
+ }
395
+ ]
396
+ },
397
+ {
398
+ label: 'Reports',
399
+ icon: ChartBar,
400
+ shortcut: '⌘+R',
401
+ items: [
402
+ {
403
+ label: 'Sales',
404
+ icon: ChartLine,
405
+ badge: 3
406
+ },
407
+ {
408
+ label: 'Products',
409
+ icon: List,
410
+ badge: 6
411
+ }
412
+ ]
413
+ },
414
+ {
415
+ label: 'Profile',
416
+ icon: User,
417
+ shortcut: '⌘+W',
418
+ items: [
419
+ {
420
+ label: 'Settings',
421
+ icon: Cog,
422
+ shortcut: '⌘+O'
423
+ },
424
+ {
425
+ label: 'Privacy',
426
+ icon: Shield,
427
+ shortcut: '⌘+P'
428
+ }
429
+ ]
430
+ }
431
+ ]);
432
+ <\/script>
433
+ ```
434
+
435
+ ## Command
436
+
437
+ The command property defines the callback to run when an item is activated by click or a key event.
438
+
439
+ ```vue
440
+ <template>
441
+ <div class="flex justify-center">
442
+ <PanelMenu :model="items" class="w-full md:w-80" />
443
+ <Toast />
444
+ </div>
445
+ </template>
446
+
447
+ <script setup>
448
+ import { ref } from "vue";
449
+ import { useToast } from "primevue/usetoast";
450
+ import Cloud from '@primeicons/vue/cloud';
451
+ import CloudDownload from '@primeicons/vue/cloud-download';
452
+ import CloudUpload from '@primeicons/vue/cloud-upload';
453
+ import File from '@primeicons/vue/file';
454
+ import Plus from '@primeicons/vue/plus';
455
+ import Print from '@primeicons/vue/print';
456
+ import Search from '@primeicons/vue/search';
457
+ import SignOut from '@primeicons/vue/sign-out';
458
+
459
+ const toast = useToast();
460
+
461
+ const items = ref([
462
+ {
463
+ label: 'Files',
464
+ icon: File,
465
+ items: [
466
+ {
467
+ label: 'New',
468
+ icon: Plus,
469
+ command: () => {
470
+ toast.add({ severity: 'success', summary: 'Success', detail: 'File created', life: 3000 });
471
+ }
472
+ },
473
+ {
474
+ label: 'Search',
475
+ icon: Search,
476
+ command: () => {
477
+ toast.add({ severity: 'warn', summary: 'Search Results', detail: 'No results found', life: 3000 });
478
+ }
479
+ },
480
+ {
481
+ label: 'Print',
482
+ icon: Print,
483
+ command: () => {
484
+ toast.add({ severity: 'error', summary: 'Error', detail: 'No printer connected', life: 3000 });
485
+ }
486
+ }
487
+ ]
488
+ },
489
+ {
490
+ label: 'Sync',
491
+ icon: Cloud,
492
+ items: [
493
+ {
494
+ label: 'Import',
495
+ icon: CloudDownload,
496
+ command: () => {
497
+ toast.add({ severity: 'info', summary: 'Downloads', detail: 'Downloaded from cloud', life: 3000 });
498
+ }
499
+ },
500
+ {
501
+ label: 'Export',
502
+ icon: CloudUpload,
503
+ command: () => {
504
+ toast.add({ severity: 'info', summary: 'Shared', detail: 'Exported to cloud', life: 3000 });
505
+ }
506
+ }
507
+ ]
508
+ },
509
+ {
510
+ label: 'Sign Out',
511
+ icon: SignOut,
512
+ command: () => {
513
+ toast.add({ severity: 'info', summary: 'Signed out', detail: 'User logged out', life: 3000 });
514
+ }
515
+ }
516
+ ]);
517
+ <\/script>
518
+ ```
519
+
520
+ ## Router
521
+
522
+ Menu items support navigation via router-link, programmatic routing using commands, or external URLs.
523
+
524
+ ```vue
525
+ <template>
526
+ <div class="flex justify-center">
527
+ <PanelMenu :model="items" class="w-full md:w-80">
528
+ <template #item="{ item, icon, label }">
529
+ <router-link v-if="item.route" v-slot="{ href, navigate }" :to="item.route" custom>
530
+ <a v-ripple class="flex items-center cursor-pointer text-surface-700 dark:text-surface-0 px-4 py-2" :href="href" @click="navigate">
531
+ <component :is="icon" />
532
+ <span class="ml-2">{{ label }}</span>
533
+ </a>
534
+ </router-link>
535
+ <a v-else v-ripple class="flex items-center cursor-pointer text-surface-700 dark:text-surface-0 px-4 py-2" :href="item.url" :target="item.target">
536
+ <component :is="icon" />
537
+ <span class="ml-2">{{ label }}</span>
538
+ <AngleDown v-if="item.items" class="text-primary ml-auto" />
539
+ </a>
540
+ </template>
541
+ </PanelMenu>
542
+ </div>
543
+ </template>
544
+
545
+ <script setup>
546
+ import { ref } from "vue";
547
+ import { useRouter } from 'vue-router';
548
+ import AngleDown from '@primeicons/vue/angle-down';
549
+ import Bookmark from '@primeicons/vue/bookmark';
550
+ import Eraser from '@primeicons/vue/eraser';
551
+ import Heart from '@primeicons/vue/heart';
552
+ import Home from '@primeicons/vue/home';
553
+ import Link from '@primeicons/vue/link';
554
+ import Palette from '@primeicons/vue/palette';
555
+ import Star from '@primeicons/vue/star';
556
+
557
+ const router = useRouter();
558
+
559
+ const items = ref([
560
+ {
561
+ label: 'Router',
562
+ icon: Palette,
563
+ items: [
564
+ {
565
+ label: 'Styled',
566
+ icon: Eraser,
567
+ route: '/theming/styled'
568
+ },
569
+ {
570
+ label: 'Unstyled',
571
+ icon: Heart,
572
+ route: '/theming/unstyled'
573
+ }
574
+ ]
575
+ },
576
+ {
577
+ label: 'Programmatic',
578
+ icon: Link,
579
+ command: () => {
580
+ router.push('/introduction');
581
+ }
582
+ },
583
+ {
584
+ label: 'External',
585
+ icon: Home,
586
+ items: [
587
+ {
588
+ label: 'Vue.js',
589
+ icon: Star,
590
+ url: 'https://vuejs.org/'
591
+ },
592
+ {
593
+ label: 'Vite.js',
594
+ icon: Bookmark,
595
+ url: 'https://vuejs.org/'
596
+ }
597
+ ]
598
+ }
599
+ ]);
600
+ <\/script>
601
+ ```
602
+
603
+ ## Accessibility
604
+
605
+ Screen Reader Accordion header elements have a button role, an aria-label defined using the label property of the menuitem model and aria-controls to define the id of the content section along with aria-expanded for the visibility state. The content of an accordion panel uses region role, defines an id that matches the aria-controls of the header and aria-labelledby referring to the id of the header. The tree elements has a tree as the role and each menu item has a treeitem role along with aria-label , aria-selected and aria-expanded attributes. The container element of a treenode has the group role. The aria-setsize , aria-posinset and aria-level attributes are calculated implicitly and added to each treeitem. Header Keyboard Support Key Function tab Adds focus to the first header when focus moves in to the component, if there is already a focused tab header then moves the focus out of the component based on the page tab sequence. enter Toggles the visibility of the content. space Toggles the visibility of the content. down arrow If panel is collapsed then moves focus to the next header, otherwise first treenode of the panel receives the focus. up arrow If previous panel is collapsed then moves focus to the previous header, otherwise last treenode of the previous panel receives the focus. home Moves focus to the first header. end Moves focus to the last header. Tree Keyboard Support Key Function tab Moves focus to the next focusable element in the page tab order. shift + tab Moves focus to the previous focusable element in the page tab order. enter Activates the focused treenode. space Activates the focused treenode. down arrow Moves focus to the next treenode. up arrow Moves focus to the previous treenode. right arrow If node is closed, opens the node otherwise moves focus to the first child node. left arrow If node is open, closes the node otherwise moves focus to the parent node.
606
+
607
+ ## Panel Menu API
608
+
609
+ ### Props
610
+
611
+ | Name |Type |Default |Description |
612
+ | --- | --- | --- | --- |
613
+ | model | MenuItem[] | - | An array of menuitems. |
614
+ | expandedKeys | PanelMenuExpandedKeys | - | A map of keys to represent the expansion state in controlled mode. |
615
+ | multiple | boolean | false | When enabled, multiple root menuitems can be activated at the same time. |
616
+ | tabindex | string \| number | - | Index of the element in tabbing order. |
617
+ | dt | any | - | It generates scoped CSS variables using design tokens for the component. |
618
+ | pt | PassThrough<PanelMenuPassThroughOptions> | - | Used to pass attributes to DOM elements inside the component. |
619
+ | ptOptions | any | - | Used to configure passthrough(pt) options of the component. |
620
+ | unstyled | boolean | false | When enabled, it removes component related styles in the core. |
621
+
622
+ ### Pass Through Options
623
+
624
+ | Name |Type |Description |
625
+ | --- | --- | --- |
626
+ | root | PanelMenuPassThroughOptionType | Used to pass attributes to the root's DOM element. |
627
+ | panel | PanelMenuPassThroughOptionType | Used to pass attributes to the panel's DOM element. |
628
+ | header | PanelMenuPassThroughOptionType | Used to pass attributes to the header's DOM element. |
629
+ | headerContent | PanelMenuPassThroughOptionType | Used to pass attributes to the header content's DOM element. |
630
+ | headerLink | PanelMenuPassThroughOptionType | Used to pass attributes to the header link's DOM element. |
631
+ | submenuIcon | PanelMenuPassThroughOptionType | Used to pass attributes to the submenuIcon's DOM element. |
632
+ | headerIcon | PanelMenuPassThroughOptionType | Used to pass attributes to the header icon's DOM element. |
633
+ | headerLabel | PanelMenuPassThroughOptionType | Used to pass attributes to the header label's DOM element. |
634
+ | contentContainer | PanelMenuPassThroughOptionType | Used to pass attributes to the content container's DOM element. |
635
+ | content | PanelMenuPassThroughOptionType | Used to pass attributes to the content's DOM element. |
636
+ | rootList | PanelMenuPassThroughOptionType | Used to pass attributes to the root list's DOM element. |
637
+ | item | PanelMenuPassThroughOptionType | Used to pass attributes to the list item's DOM element. |
638
+ | itemContent | PanelMenuPassThroughOptionType | Used to pass attributes to the item content's DOM element. |
639
+ | itemLink | PanelMenuPassThroughOptionType | Used to pass attributes to the item link's DOM element. |
640
+ | itemIcon | PanelMenuPassThroughOptionType | Used to pass attributes to the item icon's DOM element. |
641
+ | itemLabel | PanelMenuPassThroughOptionType | Used to pass attributes to the item label's DOM element. |
642
+ | submenu | PanelMenuPassThroughOptionType | Used to pass attributes to the submenu's DOM element. |
643
+ | separator | PanelMenuPassThroughOptionType | Used to pass attributes to the separator's DOM element. |
644
+ | hooks | any | Used to manage all lifecycle hooks. |
645
+ | transition | PanelMenuPassThroughTransitionType | Used to control Vue Transition API. |
646
+
647
+ ### Theming
648
+
649
+ ### CSS Classes
650
+
651
+ | Class |Description |
652
+ | --- | --- |
653
+ | p-panelmenu | Class name of the root element |
654
+ | p-panelmenu-panel | Class name of the panel element |
655
+ | p-panelmenu-header | Class name of the header element |
656
+ | p-panelmenu-header-content | Class name of the header content element |
657
+ | p-panelmenu-header-link | Class name of the header link element |
658
+ | p-panelmenu-header-icon | Class name of the header icon element |
659
+ | p-panelmenu-header-label | Class name of the header label element |
660
+ | p-panelmenu-content-container | Class name of the content container element |
661
+ | p-panelmenu-content | Class name of the content element |
662
+ | p-panelmenu-root-list | Class name of the root list element |
663
+ | p-panelmenu-item | Class name of the item element |
664
+ | p-panelmenu-item-content | Class name of the item content element |
665
+ | p-panelmenu-item-link | Class name of the item link element |
666
+ | p-panelmenu-item-icon | Class name of the item icon element |
667
+ | p-panelmenu-item-label | Class name of the item label element |
668
+ | p-panelmenu-submenu-icon | Class name of the submenu icon element |
669
+ | p-panelmenu-submenu | Class name of the submenu element |
670
+ | p-menuitem-separator | |
671
+
672
+ ### Design Tokens
673
+
674
+ | Token |CSS Variable |Description |
675
+ | --- | --- | --- |
676
+ | panelmenu.gap | --p-panelmenu-gap | Gap of root |
677
+ | panelmenu.transition.duration | --p-panelmenu-transition-duration | Transition duration of root |
678
+ | panelmenu.panel.background | --p-panelmenu-panel-background | Background of panel |
679
+ | panelmenu.panel.border.color | --p-panelmenu-panel-border-color | Border color of panel |
680
+ | panelmenu.panel.border.width | --p-panelmenu-panel-border-width | Border width of panel |
681
+ | panelmenu.panel.color | --p-panelmenu-panel-color | Color of panel |
682
+ | panelmenu.panel.padding | --p-panelmenu-panel-padding | Padding of panel |
683
+ | panelmenu.panel.border.radius | --p-panelmenu-panel-border-radius | Border radius of panel |
684
+ | panelmenu.panel.first.border.width | --p-panelmenu-panel-first-border-width | First border width of panel |
685
+ | panelmenu.panel.first.top.border.radius | --p-panelmenu-panel-first-top-border-radius | First top border radius of panel |
686
+ | panelmenu.panel.last.border.width | --p-panelmenu-panel-last-border-width | Last border width of panel |
687
+ | panelmenu.panel.last.bottom.border.radius | --p-panelmenu-panel-last-bottom-border-radius | Last bottom border radius of panel |
688
+ | panelmenu.item.focus.background | --p-panelmenu-item-focus-background | Focus background of item |
689
+ | panelmenu.item.color | --p-panelmenu-item-color | Color of item |
690
+ | panelmenu.item.focus.color | --p-panelmenu-item-focus-color | Focus color of item |
691
+ | panelmenu.item.gap | --p-panelmenu-item-gap | Gap of item |
692
+ | panelmenu.item.padding | --p-panelmenu-item-padding | Padding of item |
693
+ | panelmenu.item.border.radius | --p-panelmenu-item-border-radius | Border radius of item |
694
+ | panelmenu.item.icon.color | --p-panelmenu-item-icon-color | Icon color of item |
695
+ | panelmenu.item.icon.focus.color | --p-panelmenu-item-icon-focus-color | Icon focus color of item |
696
+ | panelmenu.item.icon.size | --p-panelmenu-item-icon-size | Icon size of item |
697
+ | panelmenu.item.label.font.weight | --p-panelmenu-item-label-font-weight | Font weight of item label |
698
+ | panelmenu.item.label.font.size | --p-panelmenu-item-label-font-size | Font size of item label |
699
+ | panelmenu.submenu.indent | --p-panelmenu-submenu-indent | Indent of submenu |
700
+ | panelmenu.submenu.icon.color | --p-panelmenu-submenu-icon-color | Color of submenu icon |
701
+ | panelmenu.submenu.icon.focus.color | --p-panelmenu-submenu-icon-focus-color | Focus color of submenu icon |
702
+
703
+ ## Menu Item API