pxd 0.0.64 → 0.1.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 (486) hide show
  1. package/README.md +21 -10
  2. package/dist/components/_internal/calendar-day.d.vue.ts +33 -0
  3. package/dist/components/_internal/calendar-day.vue +85 -0
  4. package/dist/components/_internal/dismiss-container.vue +68 -121
  5. package/dist/components/_internal/fragment-container.vue +3 -3
  6. package/dist/components/_internal/loading-mask.d.vue.ts +8 -0
  7. package/dist/components/_internal/loading-mask.vue +25 -0
  8. package/dist/components/_internal/mention-editor.d.vue.ts +42 -0
  9. package/dist/components/_internal/mention-editor.vue +114 -0
  10. package/dist/components/_internal/popover-arrow.vue +8 -5
  11. package/dist/components/_internal/tree-node.d.vue.ts +72 -0
  12. package/dist/components/_internal/tree-node.vue +260 -0
  13. package/dist/components/active-graph/index.d.vue.ts +2 -2
  14. package/dist/components/active-graph/index.vue +381 -239
  15. package/dist/components/active-graph/types.d.ts +2 -1
  16. package/dist/components/approval-card/index.d.vue.ts +28 -0
  17. package/dist/components/approval-card/index.vue +235 -0
  18. package/dist/components/approval-card/types.d.ts +37 -0
  19. package/dist/components/avatar/index.d.vue.ts +2 -2
  20. package/dist/components/avatar/index.vue +43 -72
  21. package/dist/components/avatar-group/index.d.vue.ts +1 -1
  22. package/dist/components/avatar-group/index.vue +38 -25
  23. package/dist/components/backtop/index.d.vue.ts +10 -3
  24. package/dist/components/backtop/index.vue +97 -54
  25. package/dist/components/backtop/types.d.ts +10 -3
  26. package/dist/components/badge/index.d.vue.ts +6 -3
  27. package/dist/components/badge/index.vue +126 -79
  28. package/dist/components/badge/types.d.ts +3 -2
  29. package/dist/components/book/index.vue +57 -162
  30. package/dist/components/border-beam/index.d.vue.ts +18 -0
  31. package/dist/components/border-beam/index.vue +64 -0
  32. package/dist/components/border-beam/types.d.ts +8 -0
  33. package/dist/components/{resizable-panel → breadcrumb}/index.d.vue.ts +3 -4
  34. package/dist/components/breadcrumb/index.vue +32 -0
  35. package/dist/components/breadcrumb/types.d.ts +6 -0
  36. package/dist/components/breadcrumb-item/index.d.vue.ts +16 -0
  37. package/dist/components/breadcrumb-item/index.vue +50 -0
  38. package/dist/components/breadcrumb-item/types.d.ts +4 -0
  39. package/dist/components/browser/index.d.vue.ts +2 -2
  40. package/dist/components/browser/index.vue +13 -28
  41. package/dist/components/bubble/index.d.vue.ts +6 -3
  42. package/dist/components/bubble/index.vue +85 -18
  43. package/dist/components/bubble/types.d.ts +3 -1
  44. package/dist/components/bubble-group/index.d.vue.ts +19 -0
  45. package/dist/components/bubble-group/index.vue +86 -0
  46. package/dist/components/bubble-group/types.d.ts +6 -0
  47. package/dist/components/bubble-group/types.js +0 -0
  48. package/dist/components/button/index.d.vue.ts +2 -1
  49. package/dist/components/button/index.vue +121 -86
  50. package/dist/components/button-group/index.vue +20 -7
  51. package/dist/components/calendar/index.d.vue.ts +41 -0
  52. package/dist/components/calendar/index.vue +247 -0
  53. package/dist/components/calendar/types.d.ts +37 -0
  54. package/dist/components/card/index.d.vue.ts +21 -0
  55. package/dist/components/card/index.vue +47 -0
  56. package/dist/components/card/types.d.ts +6 -0
  57. package/dist/components/carousel/index.d.vue.ts +8 -4
  58. package/dist/components/carousel/index.vue +232 -283
  59. package/dist/components/carousel/types.d.ts +15 -1
  60. package/dist/components/checkbox/index.d.vue.ts +6 -5
  61. package/dist/components/checkbox/index.vue +107 -90
  62. package/dist/components/checkbox/types.d.ts +6 -4
  63. package/dist/components/checkbox-group/index.d.vue.ts +6 -6
  64. package/dist/components/checkbox-group/index.vue +26 -11
  65. package/dist/components/checkbox-group/types.d.ts +3 -1
  66. package/dist/components/checkerboard/index.d.vue.ts +14 -0
  67. package/dist/components/checkerboard/index.vue +37 -0
  68. package/dist/components/checkerboard/types.d.ts +5 -0
  69. package/dist/components/chip/index.d.vue.ts +3 -1
  70. package/dist/components/chip/index.vue +49 -46
  71. package/dist/components/choicebox/index.d.vue.ts +7 -7
  72. package/dist/components/choicebox/index.vue +52 -30
  73. package/dist/components/choicebox-item/index.d.vue.ts +7 -5
  74. package/dist/components/choicebox-item/index.vue +172 -53
  75. package/dist/components/choicebox-item/types.d.ts +3 -7
  76. package/dist/components/collapse/index.d.vue.ts +2 -2
  77. package/dist/components/collapse/index.vue +72 -98
  78. package/dist/components/collapse-group/index.vue +43 -32
  79. package/dist/components/color-selector/index.vue +45 -41
  80. package/dist/components/command-menu/index.d.vue.ts +10 -7
  81. package/dist/components/command-menu/index.vue +103 -45
  82. package/dist/components/command-menu/types.d.ts +3 -2
  83. package/dist/components/config-provider/index.d.vue.ts +77 -3
  84. package/dist/components/config-provider/index.vue +54 -11
  85. package/dist/components/config-provider/types.d.ts +5 -3
  86. package/dist/components/copy-button/index.d.vue.ts +24 -0
  87. package/dist/components/copy-button/index.vue +40 -0
  88. package/dist/components/copy-button/types.d.ts +7 -0
  89. package/dist/components/countdown/index.d.vue.ts +1 -1
  90. package/dist/components/countdown/index.vue +77 -29
  91. package/dist/components/dash-line/index.d.vue.ts +2 -1
  92. package/dist/components/dash-line/index.vue +78 -76
  93. package/dist/components/date-picker/index.d.vue.ts +16 -0
  94. package/dist/components/date-picker/index.vue +295 -0
  95. package/dist/components/date-picker/types.d.ts +20 -0
  96. package/dist/components/description/index.vue +16 -7
  97. package/dist/components/drawer/index.d.vue.ts +5 -5
  98. package/dist/components/drawer/index.vue +138 -67
  99. package/dist/components/drawer/types.d.ts +1 -0
  100. package/dist/components/effort-slider/index.d.vue.ts +10 -0
  101. package/dist/components/effort-slider/index.vue +347 -0
  102. package/dist/components/effort-slider/types.d.ts +14 -0
  103. package/dist/components/ellipsis-text/index.d.vue.ts +1 -1
  104. package/dist/components/ellipsis-text/index.vue +208 -165
  105. package/dist/components/empty-state/index.vue +11 -4
  106. package/dist/components/error/index.d.vue.ts +3 -1
  107. package/dist/components/error/index.vue +42 -28
  108. package/dist/components/error/types.d.ts +1 -0
  109. package/dist/components/fader/index.d.vue.ts +1 -1
  110. package/dist/components/fader/index.vue +56 -112
  111. package/dist/components/fader/types.d.ts +2 -1
  112. package/dist/components/feedback-bar/index.d.vue.ts +12 -0
  113. package/dist/components/feedback-bar/index.vue +81 -0
  114. package/dist/components/feedback-bar/types.d.ts +9 -0
  115. package/dist/components/gauge/index.vue +89 -69
  116. package/dist/components/grid/index.vue +58 -52
  117. package/dist/components/grid-item/index.vue +44 -39
  118. package/dist/components/hold-button/index.vue +111 -115
  119. package/dist/components/hue-text/index.d.vue.ts +16 -0
  120. package/dist/components/hue-text/index.vue +48 -0
  121. package/dist/components/hue-text/types.d.ts +4 -0
  122. package/dist/components/index.d.ts +40 -5
  123. package/dist/components/index.js +40 -5
  124. package/dist/components/input/index.d.vue.ts +5 -4
  125. package/dist/components/input/index.vue +250 -134
  126. package/dist/components/input/types.d.ts +9 -6
  127. package/dist/components/intersection-observer/index.vue +65 -42
  128. package/dist/components/kbd/index.vue +45 -23
  129. package/dist/components/label/index.vue +7 -3
  130. package/dist/components/link-button/index.vue +49 -32
  131. package/dist/components/list/index.d.vue.ts +22 -14
  132. package/dist/components/list/index.vue +238 -77
  133. package/dist/components/list/types.d.ts +39 -11
  134. package/dist/components/list-group/index.d.vue.ts +4 -0
  135. package/dist/components/list-group/index.vue +22 -0
  136. package/dist/components/list-group/types.d.ts +5 -0
  137. package/dist/components/list-item/index.d.vue.ts +7 -7
  138. package/dist/components/list-item/index.vue +78 -76
  139. package/dist/components/list-item/types.d.ts +7 -4
  140. package/dist/components/loading-bar/index.vue +152 -145
  141. package/dist/components/loading-dots/index.d.vue.ts +1 -13
  142. package/dist/components/loading-dots/index.vue +13 -15
  143. package/dist/components/marching-ants/index.d.vue.ts +25 -0
  144. package/dist/components/marching-ants/index.vue +486 -0
  145. package/dist/components/marching-ants/types.d.ts +9 -0
  146. package/dist/components/marquee/index.d.vue.ts +37 -0
  147. package/dist/components/marquee/index.vue +242 -0
  148. package/dist/components/marquee/types.d.ts +18 -0
  149. package/dist/components/material/index.vue +22 -28
  150. package/dist/components/mention/index.d.vue.ts +38 -0
  151. package/dist/components/mention/index.vue +251 -0
  152. package/dist/components/mention/types.d.ts +35 -0
  153. package/dist/components/menu/index.d.vue.ts +17 -10
  154. package/dist/components/menu/index.vue +98 -27
  155. package/dist/components/menu/types.d.ts +7 -5
  156. package/dist/components/message/composables/use-group-expand.js +1 -1
  157. package/dist/components/message/composables/use-message-timer.js +2 -1
  158. package/dist/components/message/composables/use-promise-message.js +4 -4
  159. package/dist/components/message/index.d.vue.ts +7 -7
  160. package/dist/components/message/index.vue +141 -234
  161. package/dist/components/message-item/index.vue +50 -62
  162. package/dist/components/modal/index.d.vue.ts +4 -4
  163. package/dist/components/modal/index.vue +125 -63
  164. package/dist/components/modal/types.d.ts +1 -3
  165. package/dist/components/more-button/index.vue +25 -13
  166. package/dist/components/noise-background/index.d.vue.ts +0 -16
  167. package/dist/components/noise-background/index.vue +70 -9
  168. package/dist/components/noise-background/types.d.ts +4 -0
  169. package/dist/components/note/index.d.vue.ts +1 -1
  170. package/dist/components/note/index.vue +108 -98
  171. package/dist/components/note/types.d.ts +1 -0
  172. package/dist/components/number-input/index.d.vue.ts +1 -3
  173. package/dist/components/number-input/index.vue +196 -161
  174. package/dist/components/number-input/types.d.ts +1 -2
  175. package/dist/components/overlay/index.d.vue.ts +2 -2
  176. package/dist/components/overlay/index.vue +110 -68
  177. package/dist/components/page-number/index.d.vue.ts +18 -0
  178. package/dist/components/page-number/index.vue +232 -0
  179. package/dist/components/page-number/types.d.ts +18 -0
  180. package/dist/components/pagination/index.vue +14 -7
  181. package/dist/components/pin-input/index.d.vue.ts +2 -2
  182. package/dist/components/pin-input/index.vue +191 -173
  183. package/dist/components/placeholder/index.vue +22 -32
  184. package/dist/components/popover/index.d.vue.ts +0 -47
  185. package/dist/components/popover/index.vue +528 -345
  186. package/dist/components/popover/types.d.ts +7 -0
  187. package/dist/components/progress/index.d.vue.ts +2 -8
  188. package/dist/components/progress/index.vue +84 -62
  189. package/dist/components/progress/types.d.ts +0 -5
  190. package/dist/components/project-banner/index.d.vue.ts +3 -1
  191. package/dist/components/project-banner/index.vue +36 -34
  192. package/dist/components/project-banner/types.d.ts +1 -1
  193. package/dist/components/questionnaire/index.d.vue.ts +10 -0
  194. package/dist/components/questionnaire/index.vue +353 -0
  195. package/dist/components/questionnaire/types.d.ts +30 -0
  196. package/dist/components/radial-burst/index.d.vue.ts +14 -0
  197. package/dist/components/radial-burst/index.vue +53 -0
  198. package/dist/components/radial-burst/types.d.ts +5 -0
  199. package/dist/components/radio/index.d.vue.ts +4 -4
  200. package/dist/components/radio/index.vue +56 -74
  201. package/dist/components/radio-group/index.d.vue.ts +4 -4
  202. package/dist/components/radio-group/index.vue +26 -12
  203. package/dist/components/rating/index.d.vue.ts +17 -0
  204. package/dist/components/rating/index.vue +253 -0
  205. package/dist/components/rating/types.d.ts +18 -0
  206. package/dist/components/reasoning/index.d.vue.ts +16 -0
  207. package/dist/components/reasoning/index.vue +68 -0
  208. package/dist/components/reasoning/types.d.ts +3 -0
  209. package/dist/components/resizable/index.d.vue.ts +27 -4
  210. package/dist/components/resizable/index.vue +404 -158
  211. package/dist/components/resizable/types.d.ts +20 -13
  212. package/dist/components/resizable/utils.d.ts +4 -0
  213. package/dist/components/resizable/utils.js +10 -0
  214. package/dist/components/reveal/index.d.vue.ts +22 -0
  215. package/dist/components/reveal/index.vue +100 -0
  216. package/dist/components/reveal/types.d.ts +15 -0
  217. package/dist/components/rolling-number/index.d.vue.ts +17 -0
  218. package/dist/components/rolling-number/index.vue +252 -0
  219. package/dist/components/rolling-number/types.d.ts +11 -0
  220. package/dist/components/scalable-text/index.vue +113 -110
  221. package/dist/components/scroll-progress/index.d.vue.ts +22 -0
  222. package/dist/components/scroll-progress/index.vue +75 -0
  223. package/dist/components/scroll-progress/types.d.ts +9 -0
  224. package/dist/components/scroll-text/index.d.vue.ts +18 -0
  225. package/dist/components/scroll-text/index.vue +123 -0
  226. package/dist/components/scroll-text/types.d.ts +7 -0
  227. package/dist/components/scrollable/index.d.vue.ts +3 -3
  228. package/dist/components/scrollable/index.vue +281 -222
  229. package/dist/components/search-input/index.d.vue.ts +152 -0
  230. package/dist/components/search-input/index.vue +55 -0
  231. package/dist/components/search-input/types.d.ts +7 -0
  232. package/dist/components/select/index.d.vue.ts +33 -0
  233. package/dist/components/select/index.vue +134 -0
  234. package/dist/components/select/types.d.ts +23 -0
  235. package/dist/components/separator/index.vue +9 -6
  236. package/dist/components/shimmer-text/index.d.vue.ts +18 -0
  237. package/dist/components/shimmer-text/index.vue +216 -0
  238. package/dist/components/shimmer-text/types.d.ts +14 -0
  239. package/dist/components/skeleton/index.d.vue.ts +2 -2
  240. package/dist/components/skeleton/index.vue +59 -51
  241. package/dist/components/slider/index.d.vue.ts +2 -2
  242. package/dist/components/slider/index.vue +391 -261
  243. package/dist/components/slider/types.d.ts +3 -1
  244. package/dist/components/snippet/index.d.vue.ts +2 -1
  245. package/dist/components/snippet/index.vue +80 -69
  246. package/dist/components/snippet/types.d.ts +3 -3
  247. package/dist/components/spinner/index.vue +9 -8
  248. package/dist/components/spinner-dots/index.d.vue.ts +7 -0
  249. package/dist/components/spinner-dots/index.vue +232 -0
  250. package/dist/components/spinner-dots/types.d.ts +9 -0
  251. package/dist/components/split-button/index.d.vue.ts +31 -0
  252. package/dist/components/split-button/index.vue +93 -0
  253. package/dist/components/split-button/types.d.ts +18 -0
  254. package/dist/components/stack/index.d.vue.ts +1 -1
  255. package/dist/components/stack/index.vue +98 -84
  256. package/dist/components/status-dot/index.d.vue.ts +1 -1
  257. package/dist/components/status-dot/index.vue +34 -20
  258. package/dist/components/steps/index.d.vue.ts +28 -0
  259. package/dist/components/steps/index.vue +143 -0
  260. package/dist/components/steps/step-item.d.vue.ts +24 -0
  261. package/dist/components/steps/step-item.vue +86 -0
  262. package/dist/components/steps/types.d.ts +25 -0
  263. package/dist/components/stick-to-bottom/index.d.vue.ts +35 -0
  264. package/dist/components/stick-to-bottom/index.vue +78 -0
  265. package/dist/components/stick-to-bottom/types.d.ts +13 -0
  266. package/dist/components/swipe-cell/index.d.vue.ts +53 -0
  267. package/dist/components/swipe-cell/index.vue +412 -0
  268. package/dist/components/swipe-cell/instances.d.ts +7 -0
  269. package/dist/components/swipe-cell/instances.js +17 -0
  270. package/dist/components/swipe-cell/types.d.ts +52 -0
  271. package/dist/components/switch/index.d.vue.ts +1 -1
  272. package/dist/components/switch/index.vue +42 -21
  273. package/dist/components/switch-item/index.vue +36 -37
  274. package/dist/components/tabs/index.d.vue.ts +8 -6
  275. package/dist/components/tabs/index.vue +242 -196
  276. package/dist/components/tabs/tab-slot.d.ts +24 -0
  277. package/dist/components/tabs/tab-slot.js +13 -0
  278. package/dist/components/tabs/types.d.ts +11 -5
  279. package/dist/components/teleport/index.vue +69 -60
  280. package/dist/components/text/index.d.vue.ts +1 -1
  281. package/dist/components/text/index.vue +68 -57
  282. package/dist/components/textarea/index.d.vue.ts +7 -5
  283. package/dist/components/textarea/index.vue +148 -71
  284. package/dist/components/textarea/types.d.ts +5 -2
  285. package/dist/components/theme-switcher/index.d.vue.ts +2 -2
  286. package/dist/components/theme-switcher/index.vue +8 -12
  287. package/dist/components/time-picker/index.d.vue.ts +7 -8
  288. package/dist/components/time-picker/index.vue +246 -183
  289. package/dist/components/time-picker/types.d.ts +7 -7
  290. package/dist/components/timeline/index.d.vue.ts +6 -0
  291. package/dist/components/timeline/index.vue +52 -0
  292. package/dist/components/timeline/types.d.ts +6 -0
  293. package/dist/components/timeline-item/index.d.vue.ts +22 -0
  294. package/dist/components/timeline-item/index.vue +110 -0
  295. package/dist/components/timeline-item/types.d.ts +16 -0
  296. package/dist/components/toc/index.d.vue.ts +37 -0
  297. package/dist/components/toc/index.vue +199 -0
  298. package/dist/components/toc/types.d.ts +28 -0
  299. package/dist/components/todo-list/index.d.vue.ts +64 -0
  300. package/dist/components/todo-list/index.vue +357 -0
  301. package/dist/components/todo-list/types.d.ts +53 -0
  302. package/dist/components/toggle/index.d.vue.ts +6 -6
  303. package/dist/components/toggle/index.vue +92 -41
  304. package/dist/components/toggle/types.d.ts +1 -1
  305. package/dist/components/toggle-button/index.d.vue.ts +5 -5
  306. package/dist/components/toggle-button/index.vue +120 -84
  307. package/dist/components/toggle-button/types.d.ts +6 -4
  308. package/dist/components/toggle-button-group/index.d.vue.ts +7 -6
  309. package/dist/components/toggle-button-group/index.vue +63 -43
  310. package/dist/components/tool-call/index.d.vue.ts +6 -0
  311. package/dist/components/tool-call/index.vue +209 -0
  312. package/dist/components/tool-call/types.d.ts +8 -0
  313. package/dist/components/tooltip/index.d.vue.ts +5 -2
  314. package/dist/components/tooltip/index.vue +105 -50
  315. package/dist/components/tooltip/types.d.ts +1 -0
  316. package/dist/components/tree/index.d.vue.ts +108 -0
  317. package/dist/components/tree/index.vue +684 -0
  318. package/dist/components/tree/types.d.ts +126 -0
  319. package/dist/components/virtual-list/index.d.vue.ts +7 -9
  320. package/dist/components/virtual-list/index.vue +120 -54
  321. package/dist/components/virtual-list/types.d.ts +0 -1
  322. package/dist/composables/_internal/use-collapse-motion.d.ts +6 -0
  323. package/dist/composables/_internal/use-collapse-motion.js +85 -0
  324. package/dist/composables/{use-focus-trap.d.ts → _internal/use-focus-trap.d.ts} +2 -2
  325. package/dist/composables/_internal/use-focus-trap.js +64 -0
  326. package/dist/composables/{use-forward-ref-expose.js → _internal/use-forward-ref-expose.js} +1 -1
  327. package/dist/composables/_internal/use-list-filter.d.ts +15 -0
  328. package/dist/composables/_internal/use-list-filter.js +48 -0
  329. package/dist/composables/_internal/use-list-keyboard-controller.d.ts +21 -0
  330. package/dist/composables/_internal/use-list-keyboard-controller.js +27 -0
  331. package/dist/composables/_internal/use-list-navigation.d.ts +25 -0
  332. package/dist/composables/_internal/use-list-navigation.js +141 -0
  333. package/dist/composables/_internal/use-list-rows.d.ts +29 -0
  334. package/dist/composables/_internal/use-list-rows.js +58 -0
  335. package/dist/composables/_internal/use-list-selection.d.ts +23 -0
  336. package/dist/composables/_internal/use-list-selection.js +41 -0
  337. package/dist/composables/_internal/use-lock-scroll.js +57 -0
  338. package/dist/composables/_internal/use-mention-editor.d.ts +35 -0
  339. package/dist/composables/_internal/use-mention-editor.js +508 -0
  340. package/dist/composables/_internal/use-mention-suggest.d.ts +23 -0
  341. package/dist/composables/_internal/use-mention-suggest.js +113 -0
  342. package/dist/composables/{use-model-value.d.ts → _internal/use-model-value.d.ts} +1 -1
  343. package/dist/composables/_internal/use-model-value.js +13 -0
  344. package/dist/composables/_internal/use-motion-reduce.d.ts +6 -0
  345. package/dist/composables/_internal/use-motion-reduce.js +40 -0
  346. package/dist/composables/_internal/use-overlay-dialog.d.ts +25 -0
  347. package/dist/composables/_internal/use-overlay-dialog.js +25 -0
  348. package/dist/composables/{use-overlay-manager.js → _internal/use-overlay-manager.js} +2 -2
  349. package/dist/composables/{use-popover-responsive.js → _internal/use-popover-responsive.js} +1 -1
  350. package/dist/composables/_internal/use-selected-list-item.d.ts +6 -0
  351. package/dist/composables/_internal/use-selected-list-item.js +36 -0
  352. package/dist/composables/_internal/use-swipe-gesture.d.ts +88 -0
  353. package/dist/composables/_internal/use-swipe-gesture.js +345 -0
  354. package/dist/composables/_internal/use-tailwind-variant.d.ts +31 -0
  355. package/dist/composables/_internal/use-tailwind-variant.js +62 -0
  356. package/dist/composables/_internal/use-tree-drag.d.ts +23 -0
  357. package/dist/composables/_internal/use-tree-drag.js +196 -0
  358. package/dist/composables/_internal/use-tree-move.d.ts +20 -0
  359. package/dist/composables/_internal/use-tree-move.js +96 -0
  360. package/dist/composables/_internal/use-tree-rows.d.ts +46 -0
  361. package/dist/composables/_internal/use-tree-rows.js +101 -0
  362. package/dist/composables/_internal/use-tree-selection.d.ts +22 -0
  363. package/dist/composables/_internal/use-tree-selection.js +87 -0
  364. package/dist/composables/_internal/use-word-limit.d.ts +24 -0
  365. package/dist/composables/_internal/use-word-limit.js +36 -0
  366. package/dist/composables/index.d.ts +7 -10
  367. package/dist/composables/index.js +7 -10
  368. package/dist/composables/use-backoff-retry.d.ts +51 -0
  369. package/dist/composables/use-backoff-retry.js +116 -0
  370. package/dist/composables/use-color-scheme.js +28 -25
  371. package/dist/composables/use-copy-click.d.ts +2 -1
  372. package/dist/composables/use-copy-click.js +21 -18
  373. package/dist/composables/use-countdown.d.ts +0 -9
  374. package/dist/composables/use-countdown.js +12 -4
  375. package/dist/composables/use-deferred-value.js +1 -1
  376. package/dist/composables/use-delay-change.js +6 -2
  377. package/dist/composables/use-delay-destroy.d.ts +1 -1
  378. package/dist/composables/use-delay-destroy.js +16 -9
  379. package/dist/composables/use-intersection-observer.d.ts +6 -0
  380. package/dist/composables/use-intersection-observer.js +38 -0
  381. package/dist/composables/use-media-query.d.ts +0 -3
  382. package/dist/composables/use-media-query.js +19 -19
  383. package/dist/composables/use-mutation-observer.d.ts +6 -0
  384. package/dist/composables/use-mutation-observer.js +42 -0
  385. package/dist/composables/use-outside-click.d.ts +6 -4
  386. package/dist/composables/use-outside-click.js +18 -10
  387. package/dist/composables/use-repeat-action.js +31 -20
  388. package/dist/composables/use-resize-observer.d.ts +6 -0
  389. package/dist/composables/use-resize-observer.js +22 -0
  390. package/dist/composables/use-scrollspy.d.ts +15 -0
  391. package/dist/composables/use-scrollspy.js +98 -0
  392. package/dist/composables/use-stick-to-bottom.d.ts +32 -0
  393. package/dist/composables/use-stick-to-bottom.js +106 -0
  394. package/dist/composables/use-view-transition.d.ts +20 -0
  395. package/dist/composables/use-view-transition.js +79 -0
  396. package/dist/composables/use-virtual-list.d.ts +8 -5
  397. package/dist/composables/use-virtual-list.js +86 -19
  398. package/dist/contexts/breadcrumb.d.ts +2 -0
  399. package/dist/contexts/breadcrumb.js +2 -0
  400. package/dist/contexts/choicebox.d.ts +1 -0
  401. package/dist/contexts/config-provider.d.ts +3 -2
  402. package/dist/contexts/config-provider.js +4 -3
  403. package/dist/contexts/list.d.ts +4 -25
  404. package/dist/contexts/list.js +0 -8
  405. package/dist/locales/en-us.d.ts +56 -28
  406. package/dist/locales/en-us.js +56 -28
  407. package/dist/locales/index.d.ts +1 -0
  408. package/dist/locales/zh-cn.d.ts +55 -28
  409. package/dist/locales/zh-cn.js +69 -28
  410. package/dist/plugins/dayjs-millisecond-token.d.ts +2 -4
  411. package/dist/plugins/dayjs-millisecond-token.js +1 -2
  412. package/dist/styles/source.css +55 -20
  413. package/dist/styles/styles.css +2 -2
  414. package/dist/styles/tw.css +54 -20
  415. package/dist/types/shared/props.d.ts +5 -3
  416. package/dist/types/shared/utils.d.ts +7 -0
  417. package/dist/utils/context.js +2 -1
  418. package/dist/utils/date.d.ts +1 -15
  419. package/dist/utils/date.js +2 -11
  420. package/dist/utils/dom.d.ts +19 -21
  421. package/dist/utils/dom.js +57 -28
  422. package/dist/utils/event.d.ts +14 -2
  423. package/dist/utils/event.js +65 -27
  424. package/dist/utils/format.d.ts +5 -4
  425. package/dist/utils/format.js +33 -13
  426. package/dist/utils/fuzzy-match.d.ts +2 -0
  427. package/dist/utils/fuzzy-match.js +182 -0
  428. package/dist/utils/helper.d.ts +17 -0
  429. package/dist/utils/helper.js +57 -0
  430. package/dist/utils/is.d.ts +5 -1
  431. package/dist/utils/is.js +10 -2
  432. package/dist/utils/mention-html.d.ts +33 -0
  433. package/dist/utils/mention-html.js +146 -0
  434. package/dist/utils/merge.d.ts +1 -0
  435. package/dist/utils/merge.js +19 -0
  436. package/dist/utils/observer.d.ts +42 -0
  437. package/dist/utils/observer.js +173 -0
  438. package/dist/utils/timing.d.ts +19 -6
  439. package/dist/utils/timing.js +74 -16
  440. package/package.json +48 -37
  441. package/volar.d.ts +40 -5
  442. package/dist/components/carousel-item/index.d.vue.ts +0 -13
  443. package/dist/components/carousel-item/index.vue +0 -54
  444. package/dist/components/command-menu-group/index.d.vue.ts +0 -14
  445. package/dist/components/command-menu-group/index.vue +0 -31
  446. package/dist/components/command-menu-group/types.d.ts +0 -5
  447. package/dist/components/resizable-handle/index.d.vue.ts +0 -6
  448. package/dist/components/resizable-handle/index.vue +0 -116
  449. package/dist/components/resizable-panel/index.vue +0 -57
  450. package/dist/components/resizable-panel/types.d.ts +0 -4
  451. package/dist/components/tabs-item/index.d.vue.ts +0 -4
  452. package/dist/components/tabs-item/index.vue +0 -16
  453. package/dist/components/tabs-item/types.d.ts +0 -10
  454. package/dist/composables/use-browser-observer.d.ts +0 -12
  455. package/dist/composables/use-browser-observer.js +0 -74
  456. package/dist/composables/use-focus-trap.js +0 -54
  457. package/dist/composables/use-list-filter.d.ts +0 -11
  458. package/dist/composables/use-list-filter.js +0 -56
  459. package/dist/composables/use-list-navigation.d.ts +0 -27
  460. package/dist/composables/use-list-navigation.js +0 -159
  461. package/dist/composables/use-lock-scroll.js +0 -37
  462. package/dist/composables/use-model-value.js +0 -13
  463. package/dist/composables/use-swipe-gesture.d.ts +0 -65
  464. package/dist/composables/use-swipe-gesture.js +0 -98
  465. package/dist/contexts/carousel.d.ts +0 -14
  466. package/dist/contexts/carousel.js +0 -2
  467. package/dist/contexts/resizable.d.ts +0 -27
  468. package/dist/contexts/resizable.js +0 -2
  469. package/dist/contexts/tabs.d.ts +0 -15
  470. package/dist/contexts/tabs.js +0 -2
  471. package/dist/plugins/any-touch.d.ts +0 -213
  472. package/dist/plugins/any-touch.js +0 -592
  473. package/dist/utils/fuzzy-search.d.ts +0 -7
  474. package/dist/utils/fuzzy-search.js +0 -61
  475. package/dist/utils/get.d.ts +0 -9
  476. package/dist/utils/get.js +0 -55
  477. package/dist/utils/index.d.ts +0 -10
  478. package/dist/utils/index.js +0 -10
  479. package/dist/utils/ref.d.ts +0 -5
  480. package/dist/utils/ref.js +0 -8
  481. package/dist/utils/uid.d.ts +0 -1
  482. package/dist/utils/uid.js +0 -4
  483. /package/dist/composables/{use-forward-ref-expose.d.ts → _internal/use-forward-ref-expose.d.ts} +0 -0
  484. /package/dist/composables/{use-lock-scroll.d.ts → _internal/use-lock-scroll.d.ts} +0 -0
  485. /package/dist/composables/{use-overlay-manager.d.ts → _internal/use-overlay-manager.d.ts} +0 -0
  486. /package/dist/composables/{use-popover-responsive.d.ts → _internal/use-popover-responsive.d.ts} +0 -0
@@ -0,0 +1,684 @@
1
+ <script setup>
2
+ import { computed, shallowRef, useSlots } from "vue";
3
+ import { useListKeyboardController } from "../../composables/_internal/use-list-keyboard-controller.js";
4
+ import { useListNavigation } from "../../composables/_internal/use-list-navigation.js";
5
+ import { useTreeDrag } from "../../composables/_internal/use-tree-drag.js";
6
+ import { isTreeDescendant, moveTreeNode } from "../../composables/_internal/use-tree-move.js";
7
+ import { useTreeIndex, useTreeMatched, useTreeRows } from "../../composables/_internal/use-tree-rows.js";
8
+ import { useTreeSelection } from "../../composables/_internal/use-tree-selection.js";
9
+ import { useVirtualList } from "../../composables/use-virtual-list.js";
10
+ import { getElement } from "../../utils/dom.js";
11
+ import { getUniqueId } from "../../utils/helper.js";
12
+ import { isNumber } from "../../utils/is.js";
13
+ import PTreeNode from "../_internal/tree-node.vue";
14
+ import PSearchInput from "../search-input/index.vue";
15
+ import PTeleport from "../teleport/index.vue";
16
+ defineOptions({
17
+ name: "PTree",
18
+ inheritAttrs: false,
19
+ model: {
20
+ prop: "modelValue",
21
+ event: "update:modelValue"
22
+ }
23
+ });
24
+ const props = defineProps({
25
+ data: {
26
+ type: Array,
27
+ required: false,
28
+ default: () => []
29
+ },
30
+ modelValue: {
31
+ type: [
32
+ String,
33
+ Number,
34
+ Array,
35
+ null
36
+ ],
37
+ required: false
38
+ },
39
+ multiple: {
40
+ type: Boolean,
41
+ required: false,
42
+ default: false
43
+ },
44
+ checkStrictly: {
45
+ type: Boolean,
46
+ required: false,
47
+ default: false
48
+ },
49
+ disabled: {
50
+ type: Boolean,
51
+ required: false,
52
+ default: false
53
+ },
54
+ expandOnClick: {
55
+ type: Boolean,
56
+ required: false,
57
+ default: false
58
+ },
59
+ draggable: {
60
+ type: Boolean,
61
+ required: false,
62
+ default: false
63
+ },
64
+ allowDrop: {
65
+ type: Function,
66
+ required: false
67
+ },
68
+ showIcon: {
69
+ type: Boolean,
70
+ required: false,
71
+ default: true
72
+ },
73
+ virtual: {
74
+ type: Boolean,
75
+ required: false,
76
+ default: false
77
+ },
78
+ itemSize: {
79
+ type: Number,
80
+ required: false,
81
+ default: 32
82
+ },
83
+ overScan: {
84
+ type: Number,
85
+ required: false,
86
+ default: 4
87
+ },
88
+ height: {
89
+ type: [Number, String],
90
+ required: false
91
+ },
92
+ indent: {
93
+ type: Number,
94
+ required: false,
95
+ default: 16
96
+ },
97
+ expandedKeys: {
98
+ type: Array,
99
+ required: false
100
+ },
101
+ defaultExpandedKeys: {
102
+ type: Array,
103
+ required: false
104
+ },
105
+ childrenField: {
106
+ type: String,
107
+ required: false,
108
+ default: "children"
109
+ },
110
+ filterable: {
111
+ type: Boolean,
112
+ required: false,
113
+ default: false
114
+ },
115
+ filter: {
116
+ type: Function,
117
+ required: false
118
+ },
119
+ searchMatchesOnly: {
120
+ type: Boolean,
121
+ required: false
122
+ },
123
+ highlightMatch: {
124
+ type: Boolean,
125
+ required: false,
126
+ default: false
127
+ },
128
+ searchPlaceholder: {
129
+ type: String,
130
+ required: false,
131
+ default: "Search"
132
+ },
133
+ searchValue: {
134
+ type: String,
135
+ required: false
136
+ },
137
+ defaultSearchValue: {
138
+ type: String,
139
+ required: false,
140
+ default: ""
141
+ },
142
+ itemClass: {
143
+ type: [
144
+ String,
145
+ Array,
146
+ Object
147
+ ],
148
+ required: false
149
+ }
150
+ });
151
+ const emits = defineEmits([
152
+ "update:modelValue",
153
+ "update:data",
154
+ "move",
155
+ "change",
156
+ "update:expandedKeys",
157
+ "expand",
158
+ "collapse",
159
+ "update:searchValue"
160
+ ]);
161
+ const uid = getUniqueId();
162
+ const containerRef = shallowRef();
163
+ const internalSearchValue = shallowRef(props.defaultSearchValue ?? "");
164
+ // Controlled when `searchValue` is given, the internal copy otherwise, exactly like expandedKeys.
165
+ const searchValue = computed(() => props.searchValue ?? internalSearchValue.value);
166
+ const internalExpandedKeys = shallowRef([...props.defaultExpandedKeys ?? []]);
167
+ const index = useTreeIndex(() => props.data, () => props.childrenField);
168
+ const matched = useTreeMatched(index, () => searchValue.value, () => props.filter);
169
+ const { checked, indeterminate, toggle } = useTreeSelection({
170
+ index,
171
+ modelValue: () => props.modelValue,
172
+ multiple: () => props.multiple,
173
+ checkStrictly: () => props.checkStrictly
174
+ });
175
+ const expandedKeys = computed(() => props.expandedKeys ?? internalExpandedKeys.value);
176
+ const expanded = computed(() => new Set(expandedKeys.value));
177
+ const rows = useTreeRows(index, {
178
+ query: () => searchValue.value,
179
+ expanded,
180
+ matched: () => matched.value.visible,
181
+ exactMatched: () => matched.value.exact,
182
+ matchesOnly: () => props.searchMatchesOnly
183
+ });
184
+ const rowByKey = computed(() => {
185
+ const result = new Map();
186
+ rows.value.forEach((row) => result.set(row.key, row));
187
+ return result;
188
+ });
189
+ function getRow(value) {
190
+ return rowByKey.value.get(value);
191
+ }
192
+ function commitExpandedKeys(next) {
193
+ internalExpandedKeys.value = next;
194
+ emits("update:expandedKeys", next);
195
+ }
196
+ function setExpandedByValue(value, next) {
197
+ if (expanded.value.has(value) === next) {
198
+ return;
199
+ }
200
+ const current = expandedKeys.value;
201
+ commitExpandedKeys(next ? [...current, value] : current.filter((key) => key !== value));
202
+ const node = index.value.byValue.get(value)?.node;
203
+ if (!node) {
204
+ return;
205
+ }
206
+ if (next) {
207
+ emits("expand", {
208
+ value,
209
+ node
210
+ });
211
+ return;
212
+ }
213
+ emits("collapse", {
214
+ value,
215
+ node
216
+ });
217
+ }
218
+ function toggleNode(row) {
219
+ if (!row.hasChildren) {
220
+ return;
221
+ }
222
+ setExpandedByValue(row.key, !row.expanded);
223
+ }
224
+ function expandAll() {
225
+ commitExpandedKeys(index.value.list.filter((meta) => meta.children.length > 0).map((meta) => meta.node.value));
226
+ }
227
+ function collapseAll() {
228
+ commitExpandedKeys([]);
229
+ }
230
+ function toValues(value) {
231
+ if (Array.isArray(value)) {
232
+ return value;
233
+ }
234
+ return value == null ? [] : [value];
235
+ }
236
+ function onCheck(row) {
237
+ if (props.disabled || row.node.disabled) {
238
+ return;
239
+ }
240
+ const next = toggle(row.key);
241
+ const checkedValues = toValues(next.value);
242
+ emits("update:modelValue", next.value);
243
+ emits("change", {
244
+ value: row.key,
245
+ node: row.node,
246
+ checked: checkedValues.includes(row.key),
247
+ checkedValues,
248
+ halfCheckedValues: next.halfCheckedValues
249
+ });
250
+ }
251
+ function onSearchInput(value) {
252
+ internalSearchValue.value = value;
253
+ emits("update:searchValue", value);
254
+ }
255
+ /**
256
+ * A plain getter object, not `reactive()`: `useVirtualList` reads these inside computeds and
257
+ * watchers, which track the getter just the same, while a reactive wrapper would hand the
258
+ * virtualizer a deep proxy of the rows instead of the rows themselves.
259
+ */
260
+ const virtualOptions = {
261
+ dataKey: "key",
262
+ get enabled() {
263
+ return props.virtual;
264
+ },
265
+ get items() {
266
+ return rows.value;
267
+ },
268
+ get itemSize() {
269
+ return props.itemSize;
270
+ },
271
+ get overScan() {
272
+ return props.overScan;
273
+ }
274
+ };
275
+ const { totalSize, virtualItems, scrollToIndex } = useVirtualList(containerRef, virtualOptions);
276
+ const highlightQuery = computed(() => props.highlightMatch ? searchValue.value.trim() : "");
277
+ const containerStyle = computed(() => {
278
+ const height = props.height;
279
+ if (height == null) {
280
+ return undefined;
281
+ }
282
+ return { height: isNumber(height) ? height + "px" : height };
283
+ });
284
+ const contentStyle = computed(() => props.virtual ? { height: totalSize.value + "px" } : undefined);
285
+ function isNodeDisabled(row) {
286
+ return props.disabled || row.node.disabled === true;
287
+ }
288
+ function scrollRowIntoView(index) {
289
+ if (props.virtual) {
290
+ scrollToIndex(index, {
291
+ align: "auto",
292
+ behavior: "instant"
293
+ });
294
+ return;
295
+ }
296
+ const selector = `[data-tree-item][data-index="${index}"]`;
297
+ getElement(selector, containerRef.value)?.scrollIntoView({
298
+ block: "nearest",
299
+ behavior: "instant"
300
+ });
301
+ }
302
+ function isNavDisabled(index) {
303
+ return isNodeDisabled(rows.value[index]);
304
+ }
305
+ /**
306
+ * The active row follows the keyboard only. The pointer never sets it: the tree already
307
+ * carries the selection highlight, so a second marker would survive the pointer leaving
308
+ * and duplicate what `checked` already shows.
309
+ */
310
+ const { activeIndex, dispatch, setActiveIndex } = useListNavigation({
311
+ count: () => rows.value.length,
312
+ isDisabled: isNavDisabled,
313
+ onActivateItem: (index) => {
314
+ const row = rows.value[index];
315
+ if (row) {
316
+ onCheck(row);
317
+ }
318
+ },
319
+ onRight: (index) => {
320
+ const row = rows.value[index];
321
+ if (!row) {
322
+ return;
323
+ }
324
+ if (row.hasChildren && !row.expanded) {
325
+ setExpandedByValue(row.key, true);
326
+ return;
327
+ }
328
+ if (row.hasChildren && index + 1 < rows.value.length) {
329
+ setActiveIndex(index + 1);
330
+ scrollRowIntoView(index + 1);
331
+ }
332
+ },
333
+ onLeft: () => {
334
+ const row = rows.value[activeIndex.value];
335
+ if (!row) {
336
+ return;
337
+ }
338
+ if (row.hasChildren && row.expanded) {
339
+ setExpandedByValue(row.key, false);
340
+ return;
341
+ }
342
+ if (row.parentValue === undefined) {
343
+ return;
344
+ }
345
+ const parentIndex = getRow(row.parentValue)?.index;
346
+ if (parentIndex === undefined) {
347
+ return;
348
+ }
349
+ setActiveIndex(parentIndex);
350
+ scrollRowIntoView(parentIndex);
351
+ },
352
+ scrollToIndex: scrollRowIntoView
353
+ });
354
+ const KEYMAP = {
355
+ ArrowDown: "next",
356
+ ArrowUp: "previous",
357
+ ArrowRight: "enter-child",
358
+ ArrowLeft: "leave-parent",
359
+ End: "last",
360
+ Enter: "activate",
361
+ Home: "first",
362
+ " ": "activate"
363
+ };
364
+ const { onKeydown } = useListKeyboardController({
365
+ keymap: KEYMAP,
366
+ enabled: () => !props.disabled,
367
+ onCommand: (command) => dispatch(command)
368
+ });
369
+ /**
370
+ * A focus indicator left on a blurred element lies about where the focus is, so the
371
+ * active row is only painted while the tree holds it. The index itself is kept:
372
+ * tabbing back in resumes on the row the user left from.
373
+ */
374
+ const focused = shallowRef(false);
375
+ const activeDescendant = computed(() => activeIndex.value >= 0 ? uid + "-" + activeIndex.value : undefined);
376
+ const renderEntries = computed(() => {
377
+ if (props.virtual) {
378
+ // Only the window is ever built here: materialising an entry per row would cost more than
379
+ // the rows the virtual layout shows, and it would redo that on every scroll frame.
380
+ return virtualItems.value.flatMap((virtualItem) => {
381
+ const row = rows.value[virtualItem.index];
382
+ return row ? [{
383
+ ...row,
384
+ id: uid + "-" + row.index,
385
+ start: virtualItem.start,
386
+ active: focused.value && activeIndex.value === row.index
387
+ }] : [];
388
+ });
389
+ }
390
+ const entries = [];
391
+ for (const row of rows.value) {
392
+ entries.push({
393
+ ...row,
394
+ id: uid + "-" + row.index,
395
+ active: focused.value && activeIndex.value === row.index
396
+ });
397
+ }
398
+ return entries;
399
+ });
400
+ const slots = useSlots();
401
+ /**
402
+ * A row rendered with slot children carries the DYNAMIC_SLOTS patch flag, so it re-renders
403
+ * with every tree update no matter which row changed. Without a node slot the flag stays
404
+ * off and each row is skipped unless one of its own props moved.
405
+ */
406
+ const hasDragHandle = computed(() => !!slots["node-drag-handle"]);
407
+ /** A drag handle is a node slot too: forwarding it puts every row back on the dynamic path. */
408
+ const hasNodeSlot = computed(() => hasDragHandle.value || !!slots.node || !!slots["node-switcher"] || !!slots["node-icon"] || !!slots["node-content"] || !!slots["node-suffix"]);
409
+ function onRowClick(value) {
410
+ const row = getRow(value);
411
+ if (!row) {
412
+ return;
413
+ }
414
+ // The row always selects, in both modes: with a checkbox the row is still the bigger target,
415
+ // and the keyboard path already selects on Enter/Space, so this keeps the two in step.
416
+ onCheck(row);
417
+ if (row.hasChildren && props.expandOnClick) {
418
+ toggleNode(row);
419
+ }
420
+ }
421
+ function onSwitcherClick(value) {
422
+ const row = getRow(value);
423
+ if (row) {
424
+ toggleNode(row);
425
+ }
426
+ }
427
+ function onCheckboxClick(value) {
428
+ const row = getRow(value);
429
+ if (row) {
430
+ onCheck(row);
431
+ }
432
+ }
433
+ function onContainerFocus() {
434
+ focused.value = true;
435
+ }
436
+ function onContainerBlur() {
437
+ focused.value = false;
438
+ }
439
+ function scrollToKey(value) {
440
+ const index = getRow(value)?.index;
441
+ if (index !== undefined) {
442
+ scrollRowIntoView(index);
443
+ }
444
+ }
445
+ function setActiveKey(value) {
446
+ const at = getRow(value)?.index;
447
+ // Without the scroll the row can sit outside the virtual window, and aria-activedescendant
448
+ // would then point at an id nothing in the document carries.
449
+ if (at === undefined) {
450
+ return;
451
+ }
452
+ setActiveIndex(at);
453
+ scrollRowIntoView(at);
454
+ }
455
+ /**
456
+ * Reads the whole index rather than the rendered rows: a collapsed subtree still holds checked
457
+ * nodes, and this is the same set, in the same document order, that `change` reports.
458
+ */
459
+ function getCheckedKeys(includeIndeterminate = false) {
460
+ const result = [];
461
+ for (const meta of index.value.list) {
462
+ const value = meta.node.value;
463
+ if (checked.value.has(value) || includeIndeterminate && indeterminate.value.has(value)) {
464
+ result.push(value);
465
+ }
466
+ }
467
+ return result;
468
+ }
469
+ function getVisibleKeys() {
470
+ return rows.value.map((row) => row.key);
471
+ }
472
+ /**
473
+ * A search hides whole subtrees, so a row only tells you where it sits among what is left.
474
+ * Dragging while a query is active would drop a node relative to an incomplete neighbourhood.
475
+ */
476
+ const dragEnabled = computed(() => props.draggable && !props.disabled && searchValue.value.trim().length === 0);
477
+ function canDrop(value, targetValue, position) {
478
+ const meta = index.value.byValue.get(targetValue);
479
+ const dragNode = index.value.byValue.get(value)?.node;
480
+ // Structural: a node can never land on itself or inside its own subtree.
481
+ if (!meta || !dragNode || targetValue === value || isTreeDescendant(index.value, value, targetValue)) {
482
+ return false;
483
+ }
484
+ // Policy: `allow-drop` takes it over, so a consumer can allow what the tree forbids by
485
+ // default (a disabled target) and forbid what it would otherwise allow.
486
+ if (props.allowDrop) {
487
+ return props.allowDrop({
488
+ dragValue: value,
489
+ dragNode,
490
+ targetValue,
491
+ targetNode: meta.node,
492
+ position
493
+ });
494
+ }
495
+ return meta.node.disabled !== true;
496
+ }
497
+ const { value: dragValue, target: dropTarget, x: dragX, y: dragY, onPointerDown: onDragPointerdown } = useTreeDrag({
498
+ container: containerRef,
499
+ rows: () => rows.value,
500
+ enabled: () => dragEnabled.value,
501
+ canDrop,
502
+ onExpand: (value) => setExpandedByValue(value, true),
503
+ onCommit
504
+ });
505
+ const dragNode = computed(() => dragValue.value === undefined ? undefined : index.value.byValue.get(dragValue.value)?.node);
506
+ /** The source node behind a key, collapsed subtree included, so callers never lose data the tree hides. */
507
+ function getData(value) {
508
+ return index.value.byValue.get(value)?.node;
509
+ }
510
+ /**
511
+ * The tree never writes `data` itself: the caller owns it, so a drop only proposes the next
512
+ * tree through `update:data`. A move that resolves to the current shape emits nothing.
513
+ */
514
+ function onCommit(value, target) {
515
+ const result = moveTreeNode(props.data, props.childrenField, value, target);
516
+ if (!result) {
517
+ return;
518
+ }
519
+ emits("update:data", result.data);
520
+ emits("move", result.detail);
521
+ }
522
+ defineExpose({
523
+ focus: () => containerRef.value?.focus(),
524
+ scrollToKey,
525
+ setActiveKey,
526
+ expandKey: (value) => setExpandedByValue(value, true),
527
+ collapseKey: (value) => setExpandedByValue(value, false),
528
+ expandAll,
529
+ collapseAll,
530
+ getCheckedKeys,
531
+ getVisibleKeys,
532
+ getData,
533
+ activeIndex
534
+ });
535
+ </script>
536
+
537
+ <template>
538
+ <!--
539
+ The filter sits outside the tree on purpose: a text field is not a node, and `role="tree"`
540
+ owns only `treeitem` content. Keeping it a sibling also leaves it on screen while the tree
541
+ scrolls.
542
+ -->
543
+ <div data-tree class="pxd-tree-root w-full max-w-full">
544
+ <div v-if="filterable" data-tree-search class="pxd-tree--search mbe-1">
545
+ <slot name="search">
546
+ <PSearchInput
547
+ :model-value="searchValue"
548
+ :placeholder="searchPlaceholder"
549
+ @update:model-value="onSearchInput"
550
+ />
551
+ </slot>
552
+ </div>
553
+
554
+ <div
555
+ ref="containerRef"
556
+ role="tree"
557
+ tabindex="0"
558
+ class="pxd-tree m-0 p-1 scroll-p-1 w-full max-w-full overflow-auto rounded-inherit bg-background-100 outline-none"
559
+ :style="containerStyle"
560
+ :aria-multiselectable="multiple || void 0"
561
+ :aria-activedescendant="focused ? activeDescendant : void 0"
562
+ v-bind="$attrs"
563
+ @keydown="onKeydown"
564
+ @focus="onContainerFocus"
565
+ @blur="onContainerBlur"
566
+ >
567
+ <div class="pxd-tree--content w-full" :class="{ relative: virtual }" :style="contentStyle">
568
+ <div
569
+ v-for="entry in renderEntries"
570
+ :key="entry.key"
571
+ :data-checked="checked.has(entry.key)"
572
+ class="pxd-tree--row w-full"
573
+ :class="{ 'left-0 top-0 absolute': virtual }"
574
+ :style="virtual ? { transform: 'translateY(' + entry.start + 'px)' } : void 0"
575
+ >
576
+ <PTreeNode
577
+ v-if="hasNodeSlot"
578
+ :id="entry.id"
579
+ :node="entry.node"
580
+ :value="entry.key"
581
+ :depth="entry.depth"
582
+ :index="entry.index"
583
+ :has-children="entry.hasChildren"
584
+ :expanded="entry.expanded"
585
+ :checked="checked.has(entry.key)"
586
+ :indeterminate="indeterminate.has(entry.key)"
587
+ :active="entry.active"
588
+ :multiple="multiple"
589
+ :disabled="disabled"
590
+ :set-size="rows.length"
591
+ :indent="indent"
592
+ :highlight-query="highlightQuery"
593
+ :show-icon="showIcon"
594
+ :item-class="itemClass"
595
+ :draggable="dragEnabled"
596
+ :drag-handle="hasDragHandle"
597
+ :dragging="entry.key === dragValue"
598
+ :drop-position="dropTarget?.targetValue === entry.key ? dropTarget.position : void 0"
599
+ @row-click="onRowClick"
600
+ @drag-pointerdown="onDragPointerdown"
601
+ @check="onCheckboxClick"
602
+ @toggle="onSwitcherClick"
603
+ >
604
+ <template #node="scope">
605
+ <slot name="node" v-bind="scope" />
606
+ </template>
607
+
608
+ <template #node-switcher="scope">
609
+ <slot name="node-switcher" v-bind="scope" />
610
+ </template>
611
+
612
+ <template #node-icon="scope">
613
+ <slot name="node-icon" v-bind="scope" />
614
+ </template>
615
+
616
+ <template #node-content="scope">
617
+ <slot name="node-content" v-bind="scope" />
618
+ </template>
619
+
620
+ <template #node-suffix="scope">
621
+ <slot name="node-suffix" v-bind="scope" />
622
+ </template>
623
+
624
+ <template #node-drag-handle="scope">
625
+ <slot name="node-drag-handle" v-bind="scope" />
626
+ </template>
627
+ </PTreeNode>
628
+
629
+ <PTreeNode
630
+ v-else
631
+ :id="entry.id"
632
+ :node="entry.node"
633
+ :value="entry.key"
634
+ :depth="entry.depth"
635
+ :index="entry.index"
636
+ :has-children="entry.hasChildren"
637
+ :expanded="entry.expanded"
638
+ :checked="checked.has(entry.key)"
639
+ :indeterminate="indeterminate.has(entry.key)"
640
+ :active="entry.active"
641
+ :multiple="multiple"
642
+ :disabled="disabled"
643
+ :set-size="rows.length"
644
+ :indent="indent"
645
+ :highlight-query="highlightQuery"
646
+ :show-icon="showIcon"
647
+ :item-class="itemClass"
648
+ :draggable="dragEnabled"
649
+ :drag-handle="hasDragHandle"
650
+ :dragging="entry.key === dragValue"
651
+ :drop-position="dropTarget?.targetValue === entry.key ? dropTarget.position : void 0"
652
+ @row-click="onRowClick"
653
+ @drag-pointerdown="onDragPointerdown"
654
+ @check="onCheckboxClick"
655
+ @toggle="onSwitcherClick"
656
+ />
657
+ </div>
658
+ </div>
659
+
660
+ <div
661
+ v-if="!rows.length"
662
+ class="pxd-tree--empty py-7 text-sm text-center text-foreground-secondary"
663
+ >
664
+ <slot name="empty" />
665
+ </div>
666
+ </div>
667
+
668
+ <PTeleport to="body">
669
+ <div
670
+ v-if="dragValue !== void 0"
671
+ class="pxd-tree--drag-preview px-2 py-1 text-sm shadow-lg pointer-events-none fixed z-50 rounded-md border border-gray-300 bg-background-100 text-foreground"
672
+ :style="{ left: dragX + 'px', top: dragY + 'px' }"
673
+ >
674
+ <slot name="node-drag-preview" :node="dragNode">
675
+ {{ dragNode?.label }}
676
+ </slot>
677
+ </div>
678
+ </PTeleport>
679
+ </div>
680
+ </template>
681
+
682
+ <style>
683
+ .pxd-tree--row[data-checked=true]+.pxd-tree--row[data-checked=true]>.pxd-tree--node{border-top-left-radius:0;border-top-right-radius:0}.pxd-tree--row[data-checked=true]:has(+.pxd-tree--row[data-checked=true])>.pxd-tree--node{border-bottom-left-radius:0;border-bottom-right-radius:0}
684
+ </style>