vectis-ui 0.12.0 → 0.13.0

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 (508) hide show
  1. package/dist/components/VAccordion/VAccordion.css +1 -1
  2. package/dist/components/VAccordion/VAccordion.d.ts +6 -5
  3. package/dist/components/VAccordion/VAccordion.js.map +1 -1
  4. package/dist/components/VAccordion/VAccordion.vue_vue_type_script_setup_true_lang.js.map +1 -1
  5. package/dist/components/VAccordion/VAccordionItem.css +1 -1
  6. package/dist/components/VAccordion/VAccordionItem.d.ts +1 -1
  7. package/dist/components/VAccordion/VAccordionItem.js.map +1 -1
  8. package/dist/components/VAccordion/VAccordionItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  9. package/dist/components/VAlert/VAlert.css +2 -0
  10. package/dist/components/VAlert/VAlert.d.ts +73 -0
  11. package/dist/components/VAlert/VAlert.js +9 -0
  12. package/dist/components/VAlert/VAlert.js.map +1 -0
  13. package/dist/components/VAlert/VAlert.vue_vue_type_script_setup_true_lang.js +96 -0
  14. package/dist/components/VAlert/VAlert.vue_vue_type_script_setup_true_lang.js.map +1 -0
  15. package/dist/components/VAvatar/VAvatar.d.ts +2 -2
  16. package/dist/components/VAvatar/VAvatarGroup.d.ts +1 -1
  17. package/dist/components/VAvatar/VAvatarGroup.vue_vue_type_script_setup_true_lang.js +8 -8
  18. package/dist/components/VBadge/VBadge.d.ts +3 -3
  19. package/dist/components/VBreadcrumb/VBreadcrumb.vue_vue_type_script_setup_true_lang.js +9 -9
  20. package/dist/components/VButton/VButton.d.ts +4 -4
  21. package/dist/components/VButton/VButtonGroup.css +1 -1
  22. package/dist/components/VButton/VButtonGroup.d.ts +2 -2
  23. package/dist/components/VButton/VButtonGroup.js.map +1 -1
  24. package/dist/components/VButton/VButtonGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  25. package/dist/components/VCalendar/VCalendar.css +1 -1
  26. package/dist/components/VCalendar/VCalendar.d.ts +7 -1
  27. package/dist/components/VCalendar/VCalendar.js.map +1 -1
  28. package/dist/components/VCalendar/VCalendar.vue_vue_type_script_setup_true_lang.js +20 -18
  29. package/dist/components/VCalendar/VCalendar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  30. package/dist/components/VCalendar/VCalendarEvent.js.map +1 -1
  31. package/dist/components/VCalendar/VCalendarEvent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  32. package/dist/components/VCalendar/VCalendarMonth.css +1 -1
  33. package/dist/components/VCalendar/VCalendarMonth.d.ts +2 -2
  34. package/dist/components/VCalendar/VCalendarMonth.js.map +1 -1
  35. package/dist/components/VCalendar/VCalendarMonth.vue_vue_type_script_setup_true_lang.js.map +1 -1
  36. package/dist/components/VCalendar/VCalendarTimeGrid.css +1 -1
  37. package/dist/components/VCalendar/VCalendarTimeGrid.d.ts +3 -3
  38. package/dist/components/VCalendar/VCalendarTimeGrid.js.map +1 -1
  39. package/dist/components/VCalendar/VCalendarTimeGrid.vue_vue_type_script_setup_true_lang.js.map +1 -1
  40. package/dist/components/VCalendar/VCalendarYear.css +1 -1
  41. package/dist/components/VCalendar/VCalendarYear.js.map +1 -1
  42. package/dist/components/VCalendar/VCalendarYear.vue_vue_type_script_setup_true_lang.js.map +1 -1
  43. package/dist/components/VCalendar/gesture.d.ts +1 -16
  44. package/dist/components/VCalendar/gesture.js +1 -1
  45. package/dist/components/VCalendar/gesture.js.map +1 -1
  46. package/dist/components/VCalendar/types.d.ts +2 -0
  47. package/dist/components/VCard/VCard.css +2 -0
  48. package/dist/components/VCard/VCard.d.ts +87 -0
  49. package/dist/components/VCard/VCard.js +9 -0
  50. package/dist/components/VCard/VCard.js.map +1 -0
  51. package/dist/components/VCard/VCard.vue_vue_type_script_setup_true_lang.js +103 -0
  52. package/dist/components/VCard/VCard.vue_vue_type_script_setup_true_lang.js.map +1 -0
  53. package/dist/components/VCarousel/VCarousel.d.ts +1 -1
  54. package/dist/components/VCarousel/VCarousel.js.map +1 -1
  55. package/dist/components/VCarousel/VCarousel.vue_vue_type_script_setup_true_lang.js +18 -18
  56. package/dist/components/VCarousel/VCarousel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  57. package/dist/components/VCheckbox/VCheckMark.css +2 -0
  58. package/dist/components/VCheckbox/VCheckMark.js +9 -0
  59. package/dist/components/VCheckbox/VCheckMark.js.map +1 -0
  60. package/dist/components/VCheckbox/VCheckMark.vue_vue_type_script_setup_true_lang.js +33 -0
  61. package/dist/components/VCheckbox/VCheckMark.vue_vue_type_script_setup_true_lang.js.map +1 -0
  62. package/dist/components/VCheckbox/VCheckbox.css +1 -1
  63. package/dist/components/VCheckbox/VCheckbox.d.ts +8 -3
  64. package/dist/components/VCheckbox/VCheckbox.js.map +1 -1
  65. package/dist/components/VCheckbox/VCheckbox.vue_vue_type_script_setup_true_lang.js +54 -69
  66. package/dist/components/VCheckbox/VCheckbox.vue_vue_type_script_setup_true_lang.js.map +1 -1
  67. package/dist/components/VChip/VChip.d.ts +6 -6
  68. package/dist/components/VChip/VChip.js.map +1 -1
  69. package/dist/components/VChip/VChip.vue_vue_type_script_setup_true_lang.js +26 -26
  70. package/dist/components/VChip/VChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  71. package/dist/components/VColorInput/VColorInput.css +2 -0
  72. package/dist/components/VColorInput/VColorInput.d.ts +113 -0
  73. package/dist/components/VColorInput/VColorInput.js +9 -0
  74. package/dist/components/VColorInput/VColorInput.js.map +1 -0
  75. package/dist/components/VColorInput/VColorInput.vue_vue_type_script_setup_true_lang.js +230 -0
  76. package/dist/components/VColorInput/VColorInput.vue_vue_type_script_setup_true_lang.js.map +1 -0
  77. package/dist/components/VColorPicker/VColorPicker.css +2 -0
  78. package/dist/components/VColorPicker/VColorPicker.d.ts +67 -0
  79. package/dist/components/VColorPicker/VColorPicker.js +9 -0
  80. package/dist/components/VColorPicker/VColorPicker.js.map +1 -0
  81. package/dist/components/VColorPicker/VColorPicker.vue_vue_type_script_setup_true_lang.js +390 -0
  82. package/dist/components/VColorPicker/VColorPicker.vue_vue_type_script_setup_true_lang.js.map +1 -0
  83. package/dist/components/VColorPicker/color.d.ts +42 -0
  84. package/dist/components/VColorPicker/color.js +158 -0
  85. package/dist/components/VColorPicker/color.js.map +1 -0
  86. package/dist/components/VCombobox/VCombobox.css +1 -1
  87. package/dist/components/VCombobox/VCombobox.d.ts +46 -60
  88. package/dist/components/VCombobox/VCombobox.js.map +1 -1
  89. package/dist/components/VCombobox/VCombobox.vue_vue_type_script_setup_true_lang.js +271 -372
  90. package/dist/components/VCombobox/VCombobox.vue_vue_type_script_setup_true_lang.js.map +1 -1
  91. package/dist/components/VCommandPalette/VCommandPalette.css +2 -0
  92. package/dist/components/VCommandPalette/VCommandPalette.d.ts +163 -0
  93. package/dist/components/VCommandPalette/VCommandPalette.js +9 -0
  94. package/dist/components/VCommandPalette/VCommandPalette.js.map +1 -0
  95. package/dist/components/VCommandPalette/VCommandPalette.vue_vue_type_script_setup_true_lang.js +321 -0
  96. package/dist/components/VCommandPalette/VCommandPalette.vue_vue_type_script_setup_true_lang.js.map +1 -0
  97. package/dist/components/VCommandPalette/VCommandPaletteItem.css +2 -0
  98. package/dist/components/VCommandPalette/VCommandPaletteItem.d.ts +38 -0
  99. package/dist/components/VCommandPalette/VCommandPaletteItem.js +9 -0
  100. package/dist/components/VCommandPalette/VCommandPaletteItem.js.map +1 -0
  101. package/dist/components/VCommandPalette/VCommandPaletteItem.vue_vue_type_script_setup_true_lang.js +69 -0
  102. package/dist/components/VCommandPalette/VCommandPaletteItem.vue_vue_type_script_setup_true_lang.js.map +1 -0
  103. package/dist/components/VContextMenu/VContextMenu.css +2 -0
  104. package/dist/components/VContextMenu/VContextMenu.d.ts +66 -0
  105. package/dist/components/VContextMenu/VContextMenu.js +9 -0
  106. package/dist/components/VContextMenu/VContextMenu.js.map +1 -0
  107. package/dist/components/VContextMenu/VContextMenu.vue_vue_type_script_setup_true_lang.js +148 -0
  108. package/dist/components/VContextMenu/VContextMenu.vue_vue_type_script_setup_true_lang.js.map +1 -0
  109. package/dist/components/VDataTable/VDataTable.css +1 -1
  110. package/dist/components/VDataTable/VDataTable.d.ts +41 -16
  111. package/dist/components/VDataTable/VDataTable.js.map +1 -1
  112. package/dist/components/VDataTable/VDataTable.vue_vue_type_script_setup_true_lang.js +307 -195
  113. package/dist/components/VDataTable/VDataTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  114. package/dist/components/VDateInput/VDateInput.d.ts +27 -7
  115. package/dist/components/VDateInput/VDateInput.js.map +1 -1
  116. package/dist/components/VDateInput/VDateInput.vue_vue_type_script_setup_true_lang.js +170 -162
  117. package/dist/components/VDateInput/VDateInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  118. package/dist/components/VDatePicker/VDatePicker.d.ts +3 -3
  119. package/dist/components/VDatePicker/VDatePicker.js.map +1 -1
  120. package/dist/components/VDatePicker/VDatePicker.vue_vue_type_script_setup_true_lang.js +228 -227
  121. package/dist/components/VDatePicker/VDatePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  122. package/dist/components/VDatePicker/keyboard.d.ts +7 -7
  123. package/dist/components/VDatePicker/keyboard.js +8 -6
  124. package/dist/components/VDatePicker/keyboard.js.map +1 -1
  125. package/dist/components/VDatePicker/names.js +16 -20
  126. package/dist/components/VDatePicker/names.js.map +1 -1
  127. package/dist/components/VDialog/VDialog.d.ts +2 -4
  128. package/dist/components/VDialog/VDialog.js.map +1 -1
  129. package/dist/components/VDialog/VDialog.vue_vue_type_script_setup_true_lang.js +46 -77
  130. package/dist/components/VDialog/VDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  131. package/dist/components/VDrawer/VDrawer.css +2 -0
  132. package/dist/components/VDrawer/VDrawer.d.ts +102 -0
  133. package/dist/components/VDrawer/VDrawer.js +9 -0
  134. package/dist/components/VDrawer/VDrawer.js.map +1 -0
  135. package/dist/components/VDrawer/VDrawer.vue_vue_type_script_setup_true_lang.js +128 -0
  136. package/dist/components/VDrawer/VDrawer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  137. package/dist/components/VEmptyState/VEmptyState.css +2 -0
  138. package/dist/components/VEmptyState/VEmptyState.d.ts +43 -0
  139. package/dist/components/VEmptyState/VEmptyState.js +9 -0
  140. package/dist/components/VEmptyState/VEmptyState.js.map +1 -0
  141. package/dist/components/VEmptyState/VEmptyState.vue_vue_type_script_setup_true_lang.js +48 -0
  142. package/dist/components/VEmptyState/VEmptyState.vue_vue_type_script_setup_true_lang.js.map +1 -0
  143. package/dist/components/VField/VField.css +2 -0
  144. package/dist/components/VField/VField.d.ts +84 -0
  145. package/dist/components/VField/VField.js +9 -0
  146. package/dist/components/VField/VField.js.map +1 -0
  147. package/dist/components/VField/VField.vue_vue_type_script_setup_true_lang.js +99 -0
  148. package/dist/components/VField/VField.vue_vue_type_script_setup_true_lang.js.map +1 -0
  149. package/dist/components/VField/VFieldAnnouncer.d.ts +7 -0
  150. package/dist/components/VField/VFieldAnnouncer.js +7 -0
  151. package/dist/components/VField/VFieldAnnouncer.js.map +1 -0
  152. package/dist/components/VField/VFieldAnnouncer.vue_vue_type_script_setup_true_lang.js +19 -0
  153. package/dist/components/VField/VFieldAnnouncer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  154. package/dist/components/VField/VFieldMessage.d.ts +11 -0
  155. package/dist/components/VField/VFieldMessage.js +7 -0
  156. package/dist/components/VField/VFieldMessage.js.map +1 -0
  157. package/dist/components/VField/VFieldMessage.vue_vue_type_script_setup_true_lang.js +32 -0
  158. package/dist/components/VField/VFieldMessage.vue_vue_type_script_setup_true_lang.js.map +1 -0
  159. package/dist/components/VFieldset/VFieldset.css +2 -0
  160. package/dist/components/VFieldset/VFieldset.d.ts +52 -0
  161. package/dist/components/VFieldset/VFieldset.js +9 -0
  162. package/dist/components/VFieldset/VFieldset.js.map +1 -0
  163. package/dist/components/VFieldset/VFieldset.vue_vue_type_script_setup_true_lang.js +63 -0
  164. package/dist/components/VFieldset/VFieldset.vue_vue_type_script_setup_true_lang.js.map +1 -0
  165. package/dist/components/VFileInput/VFileInput.css +1 -1
  166. package/dist/components/VFileInput/VFileInput.d.ts +31 -7
  167. package/dist/components/VFileInput/VFileInput.js.map +1 -1
  168. package/dist/components/VFileInput/VFileInput.vue_vue_type_script_setup_true_lang.js +168 -161
  169. package/dist/components/VFileInput/VFileInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  170. package/dist/components/VFilePicker/VFilePicker.d.ts +4 -4
  171. package/dist/components/VHotkeys/VHotkeys.css +1 -1
  172. package/dist/components/VHotkeys/VHotkeys.js.map +1 -1
  173. package/dist/components/VHotkeys/VHotkeys.vue_vue_type_script_setup_true_lang.js +27 -30
  174. package/dist/components/VHotkeys/VHotkeys.vue_vue_type_script_setup_true_lang.js.map +1 -1
  175. package/dist/components/VHotkeys/platform.d.ts +2 -0
  176. package/dist/components/VHotkeys/platform.js +24 -5
  177. package/dist/components/VHotkeys/platform.js.map +1 -1
  178. package/dist/components/VHoverCard/VHoverCard.css +2 -0
  179. package/dist/components/VHoverCard/VHoverCard.d.ts +62 -0
  180. package/dist/components/VHoverCard/VHoverCard.js +9 -0
  181. package/dist/components/VHoverCard/VHoverCard.js.map +1 -0
  182. package/dist/components/VHoverCard/VHoverCard.vue_vue_type_script_setup_true_lang.js +97 -0
  183. package/dist/components/VHoverCard/VHoverCard.vue_vue_type_script_setup_true_lang.js.map +1 -0
  184. package/dist/components/VIcon/icons/add.d.ts +5 -0
  185. package/dist/components/VIcon/icons/add.js +9 -0
  186. package/dist/components/VIcon/icons/add.js.map +1 -0
  187. package/dist/components/VIcon/icons/colorize.d.ts +5 -0
  188. package/dist/components/VIcon/icons/colorize.js +9 -0
  189. package/dist/components/VIcon/icons/colorize.js.map +1 -0
  190. package/dist/components/VIcon/icons/inbox.d.ts +5 -0
  191. package/dist/components/VIcon/icons/inbox.js +9 -0
  192. package/dist/components/VIcon/icons/inbox.js.map +1 -0
  193. package/dist/components/VIcon/icons/index.d.ts +42 -2
  194. package/dist/components/VIcon/icons/index.js +88 -72
  195. package/dist/components/VIcon/icons/index.js.map +1 -1
  196. package/dist/components/VIcon/icons/names.d.ts +2 -2
  197. package/dist/components/VIcon/icons/names.js +1 -1
  198. package/dist/components/VIcon/icons/names.js.map +1 -1
  199. package/dist/components/VIcon/icons/open_in_new.d.ts +5 -0
  200. package/dist/components/VIcon/icons/open_in_new.js +9 -0
  201. package/dist/components/VIcon/icons/open_in_new.js.map +1 -0
  202. package/dist/components/VIcon/icons/priority_high.d.ts +5 -0
  203. package/dist/components/VIcon/icons/priority_high.js +9 -0
  204. package/dist/components/VIcon/icons/priority_high.js.map +1 -0
  205. package/dist/components/VIcon/icons/remove.d.ts +5 -0
  206. package/dist/components/VIcon/icons/remove.js +9 -0
  207. package/dist/components/VIcon/icons/remove.js.map +1 -0
  208. package/dist/components/VIcon/icons/search_off.d.ts +5 -0
  209. package/dist/components/VIcon/icons/search_off.js +9 -0
  210. package/dist/components/VIcon/icons/search_off.js.map +1 -0
  211. package/dist/components/VIcon/icons/star.d.ts +5 -0
  212. package/dist/components/VIcon/icons/star.js +9 -0
  213. package/dist/components/VIcon/icons/star.js.map +1 -0
  214. package/dist/components/VIconButton/VIconButton.d.ts +4 -4
  215. package/dist/components/VInput/VInput.css +1 -1
  216. package/dist/components/VInput/VInput.d.ts +51 -2
  217. package/dist/components/VInput/VInput.js.map +1 -1
  218. package/dist/components/VInput/VInput.vue_vue_type_script_setup_true_lang.js +129 -106
  219. package/dist/components/VInput/VInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  220. package/dist/components/VInput/VInputGroup.css +1 -1
  221. package/dist/components/VInput/VInputGroup.d.ts +20 -0
  222. package/dist/components/VInput/VInputGroup.js.map +1 -1
  223. package/dist/components/VInput/VInputGroup.vue_vue_type_script_setup_true_lang.js +50 -51
  224. package/dist/components/VInput/VInputGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
  225. package/dist/components/VInputOTP/VInputOTP.css +1 -1
  226. package/dist/components/VInputOTP/VInputOTP.d.ts +27 -4
  227. package/dist/components/VInputOTP/VInputOTP.js.map +1 -1
  228. package/dist/components/VInputOTP/VInputOTP.vue_vue_type_script_setup_true_lang.js +131 -113
  229. package/dist/components/VInputOTP/VInputOTP.vue_vue_type_script_setup_true_lang.js.map +1 -1
  230. package/dist/components/VLink/VLink.css +2 -0
  231. package/dist/components/VLink/VLink.d.ts +53 -0
  232. package/dist/components/VLink/VLink.js +9 -0
  233. package/dist/components/VLink/VLink.js.map +1 -0
  234. package/dist/components/VLink/VLink.vue_vue_type_script_setup_true_lang.js +58 -0
  235. package/dist/components/VLink/VLink.vue_vue_type_script_setup_true_lang.js.map +1 -0
  236. package/dist/components/VListbox/VListboxChevron.css +2 -0
  237. package/dist/components/VListbox/VListboxChevron.d.ts +12 -0
  238. package/dist/components/VListbox/VListboxChevron.js +9 -0
  239. package/dist/components/VListbox/VListboxChevron.js.map +1 -0
  240. package/dist/components/VListbox/VListboxChevron.vue_vue_type_script_setup_true_lang.js +25 -0
  241. package/dist/components/VListbox/VListboxChevron.vue_vue_type_script_setup_true_lang.js.map +1 -0
  242. package/dist/components/VListbox/VListboxGroup.css +2 -0
  243. package/dist/components/VListbox/VListboxGroup.d.ts +27 -0
  244. package/dist/components/VListbox/VListboxGroup.js +9 -0
  245. package/dist/components/VListbox/VListboxGroup.js.map +1 -0
  246. package/dist/components/VListbox/VListboxGroup.vue_vue_type_script_setup_true_lang.js +21 -0
  247. package/dist/components/VListbox/VListboxGroup.vue_vue_type_script_setup_true_lang.js.map +1 -0
  248. package/dist/components/VListbox/VListboxOption.css +2 -0
  249. package/dist/components/{VCombobox/VComboboxOption.d.ts → VListbox/VListboxOption.d.ts} +4 -4
  250. package/dist/components/VListbox/VListboxOption.js +9 -0
  251. package/dist/components/VListbox/VListboxOption.js.map +1 -0
  252. package/dist/components/{VCombobox/VComboboxOption.vue_vue_type_script_setup_true_lang.js → VListbox/VListboxOption.vue_vue_type_script_setup_true_lang.js} +6 -6
  253. package/dist/components/VListbox/VListboxOption.vue_vue_type_script_setup_true_lang.js.map +1 -0
  254. package/dist/components/VListbox/VListboxPanel.css +2 -0
  255. package/dist/components/VListbox/VListboxPanel.d.ts +59 -0
  256. package/dist/components/VListbox/VListboxPanel.js +9 -0
  257. package/dist/components/VListbox/VListboxPanel.js.map +1 -0
  258. package/dist/components/VListbox/VListboxPanel.vue_vue_type_script_setup_true_lang.js +123 -0
  259. package/dist/components/VListbox/VListboxPanel.vue_vue_type_script_setup_true_lang.js.map +1 -0
  260. package/dist/components/VListbox/VListboxSeparator.css +2 -0
  261. package/dist/components/VListbox/VListboxSeparator.d.ts +3 -0
  262. package/dist/components/VListbox/VListboxSeparator.js +9 -0
  263. package/dist/components/VListbox/VListboxSeparator.js.map +1 -0
  264. package/dist/components/{VCombobox/VComboboxSeparator.vue_vue_type_script_setup_true_lang.js → VListbox/VListboxSeparator.vue_vue_type_script_setup_true_lang.js} +4 -4
  265. package/dist/components/VListbox/VListboxSeparator.vue_vue_type_script_setup_true_lang.js.map +1 -0
  266. package/dist/components/VListbox/VListboxValues.css +2 -0
  267. package/dist/components/VListbox/VListboxValues.d.ts +52 -0
  268. package/dist/components/VListbox/VListboxValues.js +9 -0
  269. package/dist/components/VListbox/VListboxValues.js.map +1 -0
  270. package/dist/components/VListbox/VListboxValues.vue_vue_type_script_setup_true_lang.js +103 -0
  271. package/dist/components/VListbox/VListboxValues.vue_vue_type_script_setup_true_lang.js.map +1 -0
  272. package/dist/components/VMenu/VMenu.d.ts +1 -1
  273. package/dist/components/VMenu/VMenu.vue_vue_type_script_setup_true_lang.js +9 -9
  274. package/dist/components/VMenu/VMenuItem.d.ts +1 -1
  275. package/dist/components/VMenu/VMenuItem.vue_vue_type_script_setup_true_lang.js +16 -16
  276. package/dist/components/VMenu/VMenuPanel.d.ts +2 -2
  277. package/dist/components/VMenu/VMenuPanel.js.map +1 -1
  278. package/dist/components/VMenu/VMenuPanel.vue_vue_type_script_setup_true_lang.js +7 -7
  279. package/dist/components/VMenu/VMenuPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  280. package/dist/components/VMeter/VMeter.css +2 -0
  281. package/dist/components/VMeter/VMeter.d.ts +77 -0
  282. package/dist/components/VMeter/VMeter.js +9 -0
  283. package/dist/components/VMeter/VMeter.js.map +1 -0
  284. package/dist/components/VMeter/VMeter.vue_vue_type_script_setup_true_lang.js +113 -0
  285. package/dist/components/VMeter/VMeter.vue_vue_type_script_setup_true_lang.js.map +1 -0
  286. package/dist/components/VNumberInput/VNumberInput.css +2 -0
  287. package/dist/components/VNumberInput/VNumberInput.d.ts +114 -0
  288. package/dist/components/VNumberInput/VNumberInput.js +9 -0
  289. package/dist/components/VNumberInput/VNumberInput.js.map +1 -0
  290. package/dist/components/VNumberInput/VNumberInput.vue_vue_type_script_setup_true_lang.js +251 -0
  291. package/dist/components/VNumberInput/VNumberInput.vue_vue_type_script_setup_true_lang.js.map +1 -0
  292. package/dist/components/VNumberInput/number.d.ts +30 -0
  293. package/dist/components/VNumberInput/number.js +38 -0
  294. package/dist/components/VNumberInput/number.js.map +1 -0
  295. package/dist/components/VPagination/VPagination.d.ts +1 -1
  296. package/dist/components/VPagination/VPagination.vue_vue_type_script_setup_true_lang.js +76 -76
  297. package/dist/components/VProgressCircular/VProgressCircular.d.ts +2 -2
  298. package/dist/components/VProgressLinear/VProgressLinear.css +1 -1
  299. package/dist/components/VProgressLinear/VProgressLinear.d.ts +10 -7
  300. package/dist/components/VProgressLinear/VProgressLinear.js.map +1 -1
  301. package/dist/components/VProgressLinear/VProgressLinear.vue_vue_type_script_setup_true_lang.js +52 -34
  302. package/dist/components/VProgressLinear/VProgressLinear.vue_vue_type_script_setup_true_lang.js.map +1 -1
  303. package/dist/components/VRadio/VRadio.d.ts +8 -3
  304. package/dist/components/VRadio/VRadio.js.map +1 -1
  305. package/dist/components/VRadio/VRadio.vue_vue_type_script_setup_true_lang.js +52 -46
  306. package/dist/components/VRadio/VRadio.vue_vue_type_script_setup_true_lang.js.map +1 -1
  307. package/dist/components/VRating/VRating.css +2 -0
  308. package/dist/components/VRating/VRating.d.ts +92 -0
  309. package/dist/components/VRating/VRating.js +9 -0
  310. package/dist/components/VRating/VRating.js.map +1 -0
  311. package/dist/components/VRating/VRating.vue_vue_type_script_setup_true_lang.js +158 -0
  312. package/dist/components/VRating/VRating.vue_vue_type_script_setup_true_lang.js.map +1 -0
  313. package/dist/components/VResizable/VResizable.css +2 -0
  314. package/dist/components/VResizable/VResizable.d.ts +50 -0
  315. package/dist/components/VResizable/VResizable.js +9 -0
  316. package/dist/components/VResizable/VResizable.js.map +1 -0
  317. package/dist/components/VResizable/VResizable.vue_vue_type_script_setup_true_lang.js +225 -0
  318. package/dist/components/VResizable/VResizable.vue_vue_type_script_setup_true_lang.js.map +1 -0
  319. package/dist/components/VResizable/VResizablePanel.css +2 -0
  320. package/dist/components/VResizable/VResizablePanel.d.ts +60 -0
  321. package/dist/components/VResizable/VResizablePanel.js +9 -0
  322. package/dist/components/VResizable/VResizablePanel.js.map +1 -0
  323. package/dist/components/VResizable/VResizablePanel.vue_vue_type_script_setup_true_lang.js +83 -0
  324. package/dist/components/VResizable/VResizablePanel.vue_vue_type_script_setup_true_lang.js.map +1 -0
  325. package/dist/components/VResizable/context.d.ts +24 -0
  326. package/dist/components/VResizable/context.js +6 -0
  327. package/dist/components/VResizable/context.js.map +1 -0
  328. package/dist/components/VResizable/layout.d.ts +28 -0
  329. package/dist/components/VResizable/layout.js +41 -0
  330. package/dist/components/VResizable/layout.js.map +1 -0
  331. package/dist/components/VSelect/VSelect.css +2 -0
  332. package/dist/components/VSelect/VSelect.d.ts +193 -0
  333. package/dist/components/VSelect/VSelect.js +9 -0
  334. package/dist/components/VSelect/VSelect.js.map +1 -0
  335. package/dist/components/VSelect/VSelect.vue_vue_type_script_setup_true_lang.js +424 -0
  336. package/dist/components/VSelect/VSelect.vue_vue_type_script_setup_true_lang.js.map +1 -0
  337. package/dist/components/VSeparator/VSeparator.js.map +1 -1
  338. package/dist/components/VSeparator/VSeparator.vue_vue_type_script_setup_true_lang.js.map +1 -1
  339. package/dist/components/VSideNavigation/VSideNavigation.vue_vue_type_script_setup_true_lang.js +8 -8
  340. package/dist/components/VSideNavigation/VSideNavigationItem.d.ts +2 -2
  341. package/dist/components/VSideNavigation/VSideNavigationItem.js.map +1 -1
  342. package/dist/components/VSideNavigation/VSideNavigationItem.vue_vue_type_script_setup_true_lang.js +3 -3
  343. package/dist/components/VSideNavigation/VSideNavigationItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  344. package/dist/components/VSkeletonLoader/VSkeletonLoader.d.ts +3 -3
  345. package/dist/components/VSlider/VSlider.css +1 -1
  346. package/dist/components/VSlider/VSlider.d.ts +34 -8
  347. package/dist/components/VSlider/VSlider.js.map +1 -1
  348. package/dist/components/VSlider/VSlider.vue_vue_type_script_setup_true_lang.js +236 -215
  349. package/dist/components/VSlider/VSlider.vue_vue_type_script_setup_true_lang.js.map +1 -1
  350. package/dist/components/VSnackbar/VSnackbar.vue_vue_type_script_setup_true_lang.js +4 -4
  351. package/dist/components/VSnackbar/state.js.map +1 -1
  352. package/dist/components/VSplitButton/VSplitButton.css +2 -0
  353. package/dist/components/VSplitButton/VSplitButton.d.ts +114 -0
  354. package/dist/components/VSplitButton/VSplitButton.js +9 -0
  355. package/dist/components/VSplitButton/VSplitButton.js.map +1 -0
  356. package/dist/components/VSplitButton/VSplitButton.vue_vue_type_script_setup_true_lang.js +148 -0
  357. package/dist/components/VSplitButton/VSplitButton.vue_vue_type_script_setup_true_lang.js.map +1 -0
  358. package/dist/components/VStepper/VStepper.css +2 -0
  359. package/dist/components/VStepper/VStepper.d.ts +73 -0
  360. package/dist/components/VStepper/VStepper.js +9 -0
  361. package/dist/components/VStepper/VStepper.js.map +1 -0
  362. package/dist/components/VStepper/VStepper.vue_vue_type_script_setup_true_lang.js +96 -0
  363. package/dist/components/VStepper/VStepper.vue_vue_type_script_setup_true_lang.js.map +1 -0
  364. package/dist/components/VSwitch/VSwitch.d.ts +8 -3
  365. package/dist/components/VSwitch/VSwitch.js.map +1 -1
  366. package/dist/components/VSwitch/VSwitch.vue_vue_type_script_setup_true_lang.js +53 -47
  367. package/dist/components/VSwitch/VSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  368. package/dist/components/VTabs/VTab.css +1 -1
  369. package/dist/components/VTabs/VTab.d.ts +1 -1
  370. package/dist/components/VTabs/VTab.js.map +1 -1
  371. package/dist/components/VTabs/VTab.vue_vue_type_script_setup_true_lang.js.map +1 -1
  372. package/dist/components/VTabs/VTabs.css +1 -1
  373. package/dist/components/VTabs/VTabs.d.ts +13 -5
  374. package/dist/components/VTabs/VTabs.js.map +1 -1
  375. package/dist/components/VTabs/VTabs.vue_vue_type_script_setup_true_lang.js +20 -20
  376. package/dist/components/VTabs/VTabs.vue_vue_type_script_setup_true_lang.js.map +1 -1
  377. package/dist/components/VTextarea/VTextarea.css +1 -1
  378. package/dist/components/VTextarea/VTextarea.d.ts +22 -2
  379. package/dist/components/VTextarea/VTextarea.js.map +1 -1
  380. package/dist/components/VTextarea/VTextarea.vue_vue_type_script_setup_true_lang.js +108 -100
  381. package/dist/components/VTextarea/VTextarea.vue_vue_type_script_setup_true_lang.js.map +1 -1
  382. package/dist/components/VTimeInput/VTimeInput.d.ts +27 -7
  383. package/dist/components/VTimeInput/VTimeInput.js.map +1 -1
  384. package/dist/components/VTimeInput/VTimeInput.vue_vue_type_script_setup_true_lang.js +187 -171
  385. package/dist/components/VTimeInput/VTimeInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  386. package/dist/components/VTimePicker/VTimePicker.d.ts +2 -2
  387. package/dist/components/VTimePicker/VTimePicker.js.map +1 -1
  388. package/dist/components/VTimePicker/VTimePicker.vue_vue_type_script_setup_true_lang.js +15 -15
  389. package/dist/components/VTimePicker/VTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  390. package/dist/components/VTimeline/VTimeline.css +2 -0
  391. package/dist/components/VTimeline/VTimeline.d.ts +59 -0
  392. package/dist/components/VTimeline/VTimeline.js +9 -0
  393. package/dist/components/VTimeline/VTimeline.js.map +1 -0
  394. package/dist/components/VTimeline/VTimeline.vue_vue_type_script_setup_true_lang.js +53 -0
  395. package/dist/components/VTimeline/VTimeline.vue_vue_type_script_setup_true_lang.js.map +1 -0
  396. package/dist/components/VTimeline/VTimelineItem.css +2 -0
  397. package/dist/components/VTimeline/VTimelineItem.d.ts +48 -0
  398. package/dist/components/VTimeline/VTimelineItem.js +9 -0
  399. package/dist/components/VTimeline/VTimelineItem.js.map +1 -0
  400. package/dist/components/VTimeline/VTimelineItem.vue_vue_type_script_setup_true_lang.js +70 -0
  401. package/dist/components/VTimeline/VTimelineItem.vue_vue_type_script_setup_true_lang.js.map +1 -0
  402. package/dist/components/VTimeline/context.d.ts +11 -0
  403. package/dist/components/VTimeline/context.js +6 -0
  404. package/dist/components/VTimeline/context.js.map +1 -0
  405. package/dist/components/VTimeline/datetime.d.ts +8 -0
  406. package/dist/components/VTimeline/datetime.js +36 -0
  407. package/dist/components/VTimeline/datetime.js.map +1 -0
  408. package/dist/components/VToast/VToast.vue_vue_type_script_setup_true_lang.js +8 -8
  409. package/dist/components/VToast/VToaster.vue_vue_type_script_setup_true_lang.js +12 -12
  410. package/dist/components/VToggle/VToggle.d.ts +4 -4
  411. package/dist/components/VToggle/VToggleItem.d.ts +1 -1
  412. package/dist/components/VTooltip/VTooltip.d.ts +8 -2
  413. package/dist/components/VTooltip/VTooltip.js.map +1 -1
  414. package/dist/components/VTooltip/VTooltip.vue_vue_type_script_setup_true_lang.js +45 -43
  415. package/dist/components/VTooltip/VTooltip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  416. package/dist/components/VTreeView/VTreeView.css +2 -0
  417. package/dist/components/VTreeView/VTreeView.d.ts +112 -0
  418. package/dist/components/VTreeView/VTreeView.js +9 -0
  419. package/dist/components/VTreeView/VTreeView.js.map +1 -0
  420. package/dist/components/VTreeView/VTreeView.vue_vue_type_script_setup_true_lang.js +321 -0
  421. package/dist/components/VTreeView/VTreeView.vue_vue_type_script_setup_true_lang.js.map +1 -0
  422. package/dist/components/VTypography/VTypography.d.ts +1 -1
  423. package/dist/components/VVirtualList/VVirtualList.css +2 -0
  424. package/dist/components/VVirtualList/VVirtualList.d.ts +78 -0
  425. package/dist/components/VVirtualList/VVirtualList.js +9 -0
  426. package/dist/components/VVirtualList/VVirtualList.js.map +1 -0
  427. package/dist/components/VVirtualList/VVirtualList.vue_vue_type_script_setup_true_lang.js +114 -0
  428. package/dist/components/VVirtualList/VVirtualList.vue_vue_type_script_setup_true_lang.js.map +1 -0
  429. package/dist/composables/useChoice.d.ts +28 -0
  430. package/dist/composables/useChoice.js +28 -0
  431. package/dist/composables/useChoice.js.map +1 -0
  432. package/dist/composables/useDebouncedSearch.d.ts +17 -0
  433. package/dist/composables/useDebouncedSearch.js +18 -0
  434. package/dist/composables/useDebouncedSearch.js.map +1 -0
  435. package/dist/composables/useEscapeDismiss.d.ts +8 -0
  436. package/dist/composables/useEscapeDismiss.js +16 -0
  437. package/dist/composables/useEscapeDismiss.js.map +1 -0
  438. package/dist/composables/useFieldIds.d.ts +2 -1
  439. package/dist/composables/useFieldIds.js +7 -6
  440. package/dist/composables/useFieldIds.js.map +1 -1
  441. package/dist/composables/useFieldPanel.d.ts +1 -0
  442. package/dist/composables/useFieldPanel.js +52 -42
  443. package/dist/composables/useFieldPanel.js.map +1 -1
  444. package/dist/composables/useFileField.d.ts +1 -3
  445. package/dist/composables/useFileField.js +48 -50
  446. package/dist/composables/useFileField.js.map +1 -1
  447. package/dist/composables/useHotkeyListener.d.ts +17 -0
  448. package/dist/composables/useHotkeyListener.js +26 -0
  449. package/dist/composables/useHotkeyListener.js.map +1 -0
  450. package/dist/composables/useIconClickHandlers.d.ts +2 -10
  451. package/dist/composables/useIconClickHandlers.js +1 -1
  452. package/dist/composables/useIconClickHandlers.js.map +1 -1
  453. package/dist/{components/VCombobox/infiniteScroll.d.ts → composables/useInfiniteScroll.d.ts} +6 -0
  454. package/dist/{components/VCombobox/infiniteScroll.js → composables/useInfiniteScroll.js} +7 -7
  455. package/dist/composables/useInfiniteScroll.js.map +1 -0
  456. package/dist/composables/useListbox.d.ts +132 -0
  457. package/dist/composables/useListbox.js +227 -0
  458. package/dist/composables/useListbox.js.map +1 -0
  459. package/dist/composables/useModalDialog.d.ts +28 -0
  460. package/dist/composables/useModalDialog.js +60 -0
  461. package/dist/composables/useModalDialog.js.map +1 -0
  462. package/dist/composables/useRootAttrs.d.ts +2 -3
  463. package/dist/composables/useRootAttrs.js.map +1 -1
  464. package/dist/composables/useVirtualList.d.ts +46 -0
  465. package/dist/composables/useVirtualList.js +145 -0
  466. package/dist/composables/useVirtualList.js.map +1 -0
  467. package/dist/i18n/en.js +50 -0
  468. package/dist/i18n/en.js.map +1 -1
  469. package/dist/i18n/fr.js +50 -0
  470. package/dist/i18n/fr.js.map +1 -1
  471. package/dist/i18n/types.d.ts +103 -2
  472. package/dist/icons.js +45 -37
  473. package/dist/index.d.ts +49 -3
  474. package/dist/index.js +80 -56
  475. package/dist/styles.css +1 -1
  476. package/dist/tokens/index.d.ts +43 -0
  477. package/dist/tokens/semantic.d.ts +42 -0
  478. package/dist/tokens/semantic.js +43 -1
  479. package/dist/tokens/semantic.js.map +1 -1
  480. package/dist/tokens/themes/dark.d.ts +1 -0
  481. package/dist/tokens/themes/dark.js +1 -0
  482. package/dist/tokens/themes/dark.js.map +1 -1
  483. package/dist/tokens.json +215 -1
  484. package/dist/types.d.ts +57 -4
  485. package/dist/utils/arrowNav.js.map +1 -1
  486. package/dist/utils/attrs.d.ts +9 -0
  487. package/dist/utils/attrs.js +14 -0
  488. package/dist/utils/attrs.js.map +1 -0
  489. package/dist/utils/date.d.ts +1 -0
  490. package/dist/utils/date.js +2 -2
  491. package/dist/utils/date.js.map +1 -1
  492. package/package.json +1 -1
  493. package/dist/components/VCombobox/VComboboxGroup.css +0 -2
  494. package/dist/components/VCombobox/VComboboxGroup.d.ts +0 -17
  495. package/dist/components/VCombobox/VComboboxGroup.js +0 -9
  496. package/dist/components/VCombobox/VComboboxGroup.js.map +0 -1
  497. package/dist/components/VCombobox/VComboboxGroup.vue_vue_type_script_setup_true_lang.js +0 -21
  498. package/dist/components/VCombobox/VComboboxGroup.vue_vue_type_script_setup_true_lang.js.map +0 -1
  499. package/dist/components/VCombobox/VComboboxOption.css +0 -2
  500. package/dist/components/VCombobox/VComboboxOption.js +0 -9
  501. package/dist/components/VCombobox/VComboboxOption.js.map +0 -1
  502. package/dist/components/VCombobox/VComboboxOption.vue_vue_type_script_setup_true_lang.js.map +0 -1
  503. package/dist/components/VCombobox/VComboboxSeparator.css +0 -2
  504. package/dist/components/VCombobox/VComboboxSeparator.js +0 -9
  505. package/dist/components/VCombobox/VComboboxSeparator.js.map +0 -1
  506. package/dist/components/VCombobox/VComboboxSeparator.vue_vue_type_script_setup_true_lang.js.map +0 -1
  507. package/dist/components/VCombobox/infiniteScroll.js.map +0 -1
  508. /package/dist/components/{VCombobox/VComboboxSeparator.d.ts → VCheckbox/VCheckMark.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VTreeView.js","names":[],"sources":["../../../src/components/VTreeView/VTreeView.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// @keyboard @a11y @core\n/**\n * A hierarchy following the ARIA tree pattern. The rows are rendered flat, in display order, their\n * depth carried by `aria-level`, `aria-setsize` and `aria-posinset`: no native element folds a tree\n * with a single tab stop, and a row that does not wrap its subtree keeps its accessible name free of\n * its descendants' text. JavaScript owns the focus, the keyboard, selection and lazy loading.\n */\nimport { computed, onMounted, ref, shallowReactive, watch } from 'vue'\nimport type { ComponentPublicInstance } from 'vue'\n\nimport VCheckMark from '../VCheckbox/VCheckMark.vue'\nimport VIcon from '../VIcon/VIcon.vue'\nimport VSpinner from '../VSpinner/VSpinner.vue'\nimport { iconProps } from '../VIcon/iconProps'\nimport { chevron_right as chevronRightIcon } from '../VIcon/icons/chevron_right'\nimport { error as errorIcon } from '../VIcon/icons/error'\nimport type { IconSource } from '../VIcon/types'\nimport type { ItemValue } from '../../types'\nimport { useAriaLabel } from '../../composables/useAriaLabel'\nimport { useLiveAnnouncer } from '../../composables/useLiveAnnouncer'\nimport { useRootAttrs } from '../../composables/useRootAttrs'\nimport { useTimer } from '../../composables/useTimer'\nimport { useMessages } from '../../i18n/state'\nimport { isRtl } from '../../utils/direction'\nimport { normalizeText } from '../../utils/text'\n\n/** Whether nodes can be selected: not at all, one at a time, or several with checkboxes. */\nexport type TreeSelectionMode = 'none' | 'single' | 'multiple'\n\n/** The height of the rows: 32 or 40 pixels. */\nexport type TreeViewSize = 'sm' | 'md'\n\n/**\n * What is selected, and its shape follows `selectionMode`: a single value (or `null`) in `single`\n * mode, an array in `multiple` mode.\n */\nexport type TreeViewModelValue = ItemValue | ItemValue[] | null\n\n/** One node of the tree. */\nexport interface TreeItem {\n /** What identifies the node, in the selection and expansion models. Unique across the tree. */\n value: ItemValue\n /** What the row says. It is also what typeahead matches. */\n label: string\n /** An icon before the label: an icon name, or an explicit render. */\n icon?: IconSource\n /** The child nodes, which make this node a branch. */\n children?: TreeItem[]\n /**\n * Marks a branch whose children `loadChildren` fetches on its first expansion. Ignored when\n * `children` is set or when the tree has no `loadChildren`.\n */\n lazy?: boolean\n /** Where the node leads, which makes the row a link. */\n href?: string\n /** Marks the node as the page being viewed (`aria-current`). */\n current?: boolean\n /**\n * Keeps the node focusable, so it is still found, but it cannot be selected, activated, expanded\n * or collapsed.\n */\n disabled?: boolean\n}\n\n/** What the `#icon`, `#label` and `#end` slots receive. */\nexport interface TreeItemSlotProps {\n item: TreeItem\n /** The depth of the node, from 1. */\n level: number\n /** Whether the node's children are shown. */\n expanded: boolean\n}\n\ntype CheckState = 'true' | 'false' | 'mixed'\n\ninterface TreeNode {\n item: TreeItem\n level: number\n parent: TreeNode | null\n posinset: number\n setsize: number\n}\n\ninterface TreeViewProps {\n /** The first level of the tree. */\n items: TreeItem[]\n /**\n * Whether nodes can be selected. In `multiple` mode each row has a checkbox, and checking a\n * branch checks everything under it.\n */\n selectionMode?: TreeSelectionMode\n /**\n * Fetches the children of a `lazy` node, on its first expansion. The tree keeps them; a failure\n * collapses the node again, and the next expansion retries.\n */\n loadChildren?: (item: TreeItem) => Promise<TreeItem[]>\n /** The height of the rows, 32 or 40 pixels. */\n size?: TreeViewSize\n /** What screen readers announce for the tree. It falls back to the design system dictionary. */\n label?: string\n}\n\ndefineOptions({ inheritAttrs: false })\n\nconst props = withDefaults(defineProps<TreeViewProps>(), {\n selectionMode: 'none',\n loadChildren: undefined,\n size: 'md',\n label: undefined,\n})\n\n/**\n * What is selected. In `single` mode, a value or `null`; in `multiple` mode, the checked nodes in\n * tree order, a branch included when everything under it is checked. A value given for a branch\n * checks its whole subtree. A shape that does not match the mode reads as an empty selection.\n */\nconst model = defineModel<TreeViewModelValue>({ default: null })\n\n/** The values of the expanded nodes. Left unbound, the tree keeps that state itself. */\nconst expanded = defineModel<ItemValue[]>('expanded', { default: () => [] })\n\nconst emit = defineEmits<{\n /**\n * A node was clicked or Enter was pressed on it, after the tree applied its own effect: selecting\n * it, checking it, or folding a branch in `none` mode. For a link, calling `preventDefault()` on\n * the event stops the navigation, which hands it to a router.\n */\n activate: [item: TreeItem, event: MouseEvent | KeyboardEvent]\n}>()\n\ndefineSlots<{\n /** Replaces the icon of a node, for instance to show an open folder when it is expanded. */\n icon?(props: TreeItemSlotProps): unknown\n /** Replaces the label of a node. */\n label?(props: TreeItemSlotProps): unknown\n /**\n * Content at the end of a row: a count, a badge. It must not be focusable: a row is a single\n * control.\n */\n end?(props: TreeItemSlotProps): unknown\n}>()\n\nconst { rootClass, rootStyle, forwardedAttrs } = useRootAttrs()\nconst m = useMessages()\nconst ariaLabel = useAriaLabel(() => props.label ?? m.value.treeView.label)\nconst { polite: announcement, announce } = useLiveAnnouncer()\n\nconst loaded = shallowReactive(new Map<ItemValue, TreeItem[]>())\nconst loading = shallowReactive(new Set<ItemValue>())\nconst failed = shallowReactive(new Set<ItemValue>())\n\nfunction childrenOf(item: TreeItem): TreeItem[] | undefined {\n return item.children ?? loaded.get(item.value)\n}\n\nfunction isPending(item: TreeItem): boolean {\n return !!props.loadChildren && !!item.lazy && !item.children && !loaded.has(item.value)\n}\n\nfunction isBranch(item: TreeItem): boolean {\n return !!childrenOf(item)?.length || isPending(item)\n}\n\nconst expandedSet = computed(() => new Set(expanded.value))\n\n/** The rows on screen, in display order: every node whose ancestors are all expanded. */\nconst visible = computed(() => {\n const rows: TreeNode[] = []\n const walk = (items: TreeItem[], level: number, parent: TreeNode | null) => {\n items.forEach((item, index) => {\n const node = { item, level, parent, posinset: index + 1, setsize: items.length }\n rows.push(node)\n const children = childrenOf(item)\n if (children && expandedSet.value.has(item.value)) walk(children, level + 1, node)\n })\n }\n walk(props.items, 1, null)\n return rows\n})\n\nfunction setExpanded(item: TreeItem, open: boolean) {\n if (open === expandedSet.value.has(item.value)) return\n expanded.value = open\n ? [...expanded.value, item.value]\n : expanded.value.filter((value) => value !== item.value)\n}\n\n// @core\n/**\n * Derives what each checkbox shows. A value in the selection checks its node and the whole subtree\n * under it; a branch then shows checked when all its children are, unchecked when none are, and\n * mixed otherwise, so its own presence in the selection only matters through its children. The map\n * is filled in tree order, which is the order the model is written in.\n */\nfunction deriveCheckStates(chosen: Set<ItemValue>): Map<ItemValue, CheckState> {\n const states = new Map<ItemValue, CheckState>()\n const visit = (item: TreeItem, inherited: boolean): CheckState => {\n states.set(item.value, 'false')\n const own = inherited || chosen.has(item.value)\n const children = childrenOf(item)\n let state: CheckState = own ? 'true' : 'false'\n if (children?.length) {\n const childStates = children.map((child) => visit(child, own))\n state = childStates.every((s) => s === 'true')\n ? 'true'\n : childStates.every((s) => s === 'false')\n ? 'false'\n : 'mixed'\n }\n states.set(item.value, state)\n return state\n }\n props.items.forEach((item) => visit(item, false))\n return states\n}\n\nconst chosenValues = computed<ItemValue[]>(() => {\n const value = model.value\n if (props.selectionMode === 'multiple') return Array.isArray(value) ? value : []\n return value === null || Array.isArray(value) ? [] : [value]\n})\n\nconst checkStates = computed(() =>\n props.selectionMode === 'multiple'\n ? deriveCheckStates(new Set(chosenValues.value))\n : new Map<ItemValue, CheckState>(),\n)\n\n/** Calls `fn` on a node and on every node under it that is not disabled. */\nfunction eachEnabled(item: TreeItem, fn: (item: TreeItem) => void) {\n fn(item)\n childrenOf(item)?.forEach((child) => {\n if (!child.disabled) eachEnabled(child, fn)\n })\n}\n\n// @core\n/**\n * Checks a node and its subtree when any leaf of it is unchecked, and unchecks them otherwise.\n * Disabled nodes keep their state. Unchecking also drops the ancestors, which would otherwise check\n * the node again through their subtree. Values the tree does not know, such as the children of a\n * node not loaded yet, are kept at the end.\n */\nfunction toggleCheck(node: TreeNode) {\n const states = checkStates.value\n const chosen = new Set<ItemValue>()\n states.forEach((state, value) => {\n if (state === 'true') chosen.add(value)\n })\n const unknown = chosenValues.value.filter((value) => !states.has(value))\n\n let check = false\n eachEnabled(node.item, (item) => {\n if (!childrenOf(item)?.length && states.get(item.value) !== 'true') check = true\n })\n // Only the leaves are added: a branch in the selection would check its disabled children too.\n eachEnabled(node.item, (item) => {\n if (!check) chosen.delete(item.value)\n else if (!childrenOf(item)?.length) chosen.add(item.value)\n })\n if (!check) for (let p = node.parent; p; p = p.parent) chosen.delete(p.item.value)\n\n const next: ItemValue[] = []\n deriveCheckStates(chosen).forEach((state, value) => {\n if (state === 'true') next.push(value)\n })\n model.value = [...next, ...unknown]\n}\n\nfunction isSelected(item: TreeItem): boolean {\n return props.selectionMode === 'single' && chosenValues.value[0] === item.value\n}\n\n// @core\n/** What a click or Enter does besides the `activate` event, which follows it. */\nfunction applyDefault(node: TreeNode) {\n const { item } = node\n if (props.selectionMode === 'single') model.value = item.value\n else if (props.selectionMode === 'multiple') toggleCheck(node)\n else if (item.href === undefined && isBranch(item))\n setExpanded(item, !expandedSet.value.has(item.value))\n}\n\nfunction activate(node: TreeNode, event: MouseEvent | KeyboardEvent) {\n applyDefault(node)\n emit('activate', node.item, event)\n}\n\nasync function load(item: TreeItem) {\n const loader = props.loadChildren\n if (!loader) return\n loading.add(item.value)\n failed.delete(item.value)\n try {\n loaded.set(item.value, await loader(item))\n } catch {\n failed.add(item.value)\n setExpanded(item, false)\n announce(m.value.treeView.loadError(item.label), false)\n } finally {\n loading.delete(item.value)\n }\n}\n\n// @ssr\n// Loading waits for the client: an expanded lazy node renders busy on the server, then fetches.\nonMounted(() => {\n // The expanded set is watched too: a pending node shows no children, so its expansion alone\n // does not change the rows.\n watch(\n [visible, expandedSet],\n ([rows, open]) => {\n for (const { item } of rows)\n if (open.has(item.value) && isPending(item) && !loading.has(item.value)) void load(item)\n },\n { immediate: true },\n )\n})\n\nconst treeEl = ref<HTMLElement | null>(null)\nconst rowEls = new Map<ItemValue, HTMLElement>()\nconst rowValues = new WeakMap<Element, ItemValue>()\n\nfunction bindRow(value: ItemValue, el: Element | ComponentPublicInstance | null) {\n if (el instanceof HTMLElement) {\n rowEls.set(value, el)\n rowValues.set(el, value)\n } else rowEls.delete(value)\n}\n\n// @keyboard @a11y\n/**\n * The single tab stop: the node last focused, or its closest ancestor still on screen once a\n * branch above it folds; before any focus, the first selected node on screen, then the current\n * one, then the first row.\n */\nconst active = ref<TreeNode | null>(null)\nconst tabStop = computed<ItemValue | undefined>(() => {\n const rows = visible.value\n const shown = new Set(rows.map((node) => node.item.value))\n for (let node = active.value; node; node = node.parent)\n if (shown.has(node.item.value)) return node.item.value\n const selected =\n props.selectionMode === 'multiple'\n ? rows.find((node) => checkStates.value.get(node.item.value) === 'true')\n : rows.find((node) => isSelected(node.item))\n return (selected ?? rows.find((node) => node.item.current) ?? rows[0])?.item.value\n})\n\nfunction onFocusin(event: FocusEvent) {\n const value = rowValues.get(event.target as Element)\n if (value === undefined) return\n active.value = visible.value.find((node) => node.item.value === value) ?? null\n}\n\nfunction focusRow(node: TreeNode | undefined) {\n if (node) rowEls.get(node.item.value)?.focus()\n}\n\nconst typeahead = useTimer()\nlet typed = ''\n\n// @keyboard\n/**\n * Moves to the next row whose label starts with what was typed in the last half-second. Repeating\n * one letter cycles through the rows starting with it.\n */\nfunction typeTo(char: string, index: number) {\n typed += normalizeText(char)\n typeahead.start(() => (typed = ''), 500)\n const rows = visible.value\n const needle = [...typed].every((c) => c === typed[0]) ? typed[0]! : typed\n const start = needle.length === 1 ? index + 1 : index\n for (let i = 0; i < rows.length; i++) {\n const node = rows[(start + i) % rows.length]!\n if (normalizeText(node.item.label).startsWith(needle)) return focusRow(node)\n }\n}\n\n// @keyboard @a11y\nfunction onKeydown(event: KeyboardEvent) {\n const tree = treeEl.value\n const value = rowValues.get(event.target as Element)\n if (!tree || value === undefined || event.altKey || event.ctrlKey || event.metaKey) return\n const rows = visible.value\n const index = rows.findIndex((node) => node.item.value === value)\n const node = rows[index]\n if (!node) return\n const { item } = node\n const isOpen = expandedSet.value.has(item.value)\n const forward = isRtl(tree) ? 'ArrowLeft' : 'ArrowRight'\n const back = isRtl(tree) ? 'ArrowRight' : 'ArrowLeft'\n\n switch (event.key) {\n case 'ArrowDown':\n focusRow(rows[index + 1])\n break\n case 'ArrowUp':\n focusRow(rows[index - 1])\n break\n case 'Home':\n focusRow(rows[0])\n break\n case 'End':\n focusRow(rows.at(-1))\n break\n case forward:\n if (!isBranch(item)) break\n if (!isOpen) {\n if (!item.disabled) setExpanded(item, true)\n } else if (rows[index + 1]?.parent?.item === item) focusRow(rows[index + 1])\n break\n case back:\n if (isBranch(item) && isOpen && !item.disabled) setExpanded(item, false)\n else focusRow(node.parent ?? undefined)\n break\n case 'Enter':\n // A link follows itself: the browser turns Enter into a click, which lands in onRowClick.\n if (item.href !== undefined) return\n if (!item.disabled) activate(node, event)\n break\n case ' ':\n // Space selects without following a link, as it does nothing on a link natively.\n if (item.disabled) break\n if (item.href !== undefined) applyDefault(node)\n else activate(node, event)\n break\n case '*': {\n const siblings = node.parent ? childrenOf(node.parent.item)! : props.items\n const closed = siblings\n .filter((sibling) => !sibling.disabled && isBranch(sibling))\n .map((sibling) => sibling.value)\n .filter((sibling) => !expandedSet.value.has(sibling))\n if (closed.length) expanded.value = [...expanded.value, ...closed]\n break\n }\n default:\n if (event.key.length !== 1 || event.key === ' ') return\n typeTo(event.key, index)\n }\n event.preventDefault()\n}\n\nfunction onRowClick(node: TreeNode, event: MouseEvent) {\n // An inert link has no address left to follow; this also covers a click on its children.\n if (node.item.disabled) {\n event.preventDefault()\n return\n }\n activate(node, event)\n}\n\n// The chevron folds without selecting, and without following the link it sits in.\nfunction onChevronClick(node: TreeNode, event: MouseEvent) {\n event.preventDefault()\n event.stopPropagation()\n if (!node.item.disabled && isBranch(node.item))\n setExpanded(node.item, !expandedSet.value.has(node.item.value))\n}\n\nfunction slotProps(node: TreeNode): TreeItemSlotProps {\n return {\n item: node.item,\n level: node.level,\n expanded: expandedSet.value.has(node.item.value) && !isPending(node.item),\n }\n}\n\nfunction ariaExpanded(item: TreeItem) {\n return isBranch(item) ? String(expandedSet.value.has(item.value)) : undefined\n}\n\nfunction ariaCurrent(item: TreeItem) {\n if (!item.current) return undefined\n return item.href !== undefined ? 'page' : 'true'\n}\n\n// The root is a wrapper holding the live region, which a tree may not contain: these two reach\n// the tree itself.\ndefineExpose({\n /** Moves the focus to the tree's tab stop: the last focused node, else the selected or current one. */\n focus: (options?: FocusOptions) =>\n tabStop.value !== undefined && rowEls.get(tabStop.value)?.focus(options),\n /** The `role=\"tree\"` element, which also receives the consumer's attributes. */\n el: treeEl,\n})\n</script>\n\n<template>\n <div class=\"v-tree-view\" :class=\"rootClass\" :style=\"rootStyle\">\n <ul\n ref=\"treeEl\"\n class=\"v-tree v-control\"\n role=\"tree\"\n :data-size=\"size\"\n :aria-multiselectable=\"selectionMode === 'multiple' || undefined\"\n v-bind=\"forwardedAttrs\"\n :aria-label=\"ariaLabel\"\n @keydown=\"onKeydown\"\n @focusin=\"onFocusin\"\n >\n <li v-for=\"node in visible\" :key=\"node.item.value\" class=\"v-tree-node\" role=\"none\">\n <component\n :is=\"node.item.href !== undefined ? 'a' : 'div'\"\n :ref=\"(el: Element | ComponentPublicInstance | null) => bindRow(node.item.value, el)\"\n class=\"v-tree-row\"\n role=\"treeitem\"\n :style=\"{ '--tree-level': node.level - 1 }\"\n :href=\"node.item.disabled ? undefined : node.item.href\"\n :tabindex=\"tabStop === node.item.value ? 0 : -1\"\n :aria-level=\"node.level\"\n :aria-setsize=\"node.setsize\"\n :aria-posinset=\"node.posinset\"\n :aria-expanded=\"ariaExpanded(node.item)\"\n :aria-selected=\"selectionMode === 'single' ? String(isSelected(node.item)) : undefined\"\n :aria-checked=\"\n selectionMode === 'multiple' ? checkStates.get(node.item.value) : undefined\n \"\n :aria-current=\"ariaCurrent(node.item)\"\n :aria-disabled=\"node.item.disabled || undefined\"\n :aria-busy=\"loading.has(node.item.value) || undefined\"\n :data-current=\"node.item.current ? '' : undefined\"\n @click=\"onRowClick(node, $event)\"\n >\n <!-- Decorative: the row is the control, and the arrows fold it. -->\n <span class=\"v-tree-toggle\" aria-hidden=\"true\" @click=\"onChevronClick(node, $event)\">\n <VSpinner v-if=\"loading.has(node.item.value)\" />\n <VIcon\n v-else-if=\"isBranch(node.item)\"\n class=\"v-tree-chevron\"\n :name=\"chevronRightIcon\"\n mirrored\n />\n </span>\n <VCheckMark v-if=\"selectionMode === 'multiple'\" />\n <slot name=\"icon\" v-bind=\"slotProps(node)\">\n <VIcon v-if=\"node.item.icon\" class=\"v-tree-icon\" v-bind=\"iconProps(node.item.icon)\" />\n </slot>\n <span class=\"v-tree-label\"\n ><slot name=\"label\" v-bind=\"slotProps(node)\">{{ node.item.label }}</slot></span\n >\n <template v-if=\"failed.has(node.item.value)\">\n <VIcon class=\"v-tree-error\" :name=\"errorIcon\" />\n <span class=\"v-visually-hidden\">{{ m.treeView.loadFailed }}</span>\n </template>\n <span v-if=\"$slots.end\" class=\"v-tree-end\"\n ><slot name=\"end\" v-bind=\"slotProps(node)\"\n /></span>\n </component>\n </li>\n </ul>\n <div class=\"v-visually-hidden\" role=\"status\" aria-live=\"polite\">{{ announcement }}</div>\n </div>\n</template>\n\n<style>\n@layer vectis.components {\n .v-tree {\n /* One level of indentation puts a child's chevron under its parent's icon. */\n --tree-indent: calc(var(--vectis-icon-size) + var(--control-gap));\n\n display: flex;\n flex-direction: column;\n margin: 0;\n padding: 0;\n list-style: none;\n font-family: var(--vectis-text-family);\n }\n\n .v-tree-row {\n /* See VSideNavigation: the radius cannot exceed half the height of a single row. */\n --tree-row-radius: min(var(--vectis-radius-interactive), calc(var(--control-height) / 2));\n\n display: flex;\n align-items: center;\n gap: var(--control-gap);\n min-block-size: var(--control-height);\n padding-block: var(--vectis-space-1);\n padding-inline: calc(var(--vectis-space-2) + var(--tree-level, 0) * var(--tree-indent))\n var(--vectis-space-2);\n border-radius: var(--tree-row-radius);\n color: var(--vectis-color-text);\n font-size: var(--control-font-size);\n font-weight: var(--vectis-text-body-md-weight);\n line-height: var(--vectis-text-body-md-leading);\n text-decoration: none;\n cursor: pointer;\n user-select: none;\n }\n\n .v-tree-row:hover:not([aria-disabled='true']) {\n background: var(--vectis-color-surface-muted);\n }\n\n /* Drawn inwards, so that neighbouring rows cannot cover it. */\n .v-tree-row:focus-visible {\n outline: var(--vectis-focus-ring-width) solid var(--vectis-focus-ring-color);\n outline-offset: calc(-1 * var(--vectis-focus-ring-width));\n }\n\n .v-tree-row:is([aria-selected='true'], [data-current]) {\n background: var(--vectis-color-accent-surface);\n color: var(--vectis-color-accent-text);\n }\n\n /* The selected row is already tinted, so its hover deepens that tint; the VMenuItem idiom. */\n .v-tree-row:is([aria-selected='true'], [data-current]):hover:not([aria-disabled='true']) {\n background: color-mix(\n in oklab,\n var(--vectis-color-accent-surface),\n var(--vectis-color-accent-text) 8%\n );\n }\n\n .v-tree-row:is([aria-selected='true'], [data-current]) :is(.v-tree-icon, .v-tree-toggle) {\n color: inherit;\n }\n\n .v-tree-row[data-current] .v-tree-label {\n font-weight: var(--vectis-text-label-weight);\n }\n\n .v-tree-toggle {\n display: inline-grid;\n flex: none;\n place-items: center;\n inline-size: var(--vectis-icon-size);\n block-size: var(--vectis-icon-size);\n color: var(--vectis-color-text-muted);\n }\n\n .v-tree-chevron {\n transition: rotate var(--vectis-duration-base) var(--vectis-ease-default);\n }\n\n .v-tree-row[aria-expanded='true'] .v-tree-chevron {\n rotate: 90deg;\n }\n\n /* The mirrored chevron points left, and turns the other way to point down. */\n .v-tree-row[aria-expanded='true'] .v-tree-chevron:dir(rtl) {\n rotate: -90deg;\n }\n\n .v-tree-icon {\n flex: none;\n color: var(--vectis-color-text-muted);\n }\n\n .v-tree-label {\n flex: 1;\n min-inline-size: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .v-tree-end {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--vectis-space-1);\n color: var(--vectis-color-text-muted);\n }\n\n .v-tree-error {\n flex: none;\n color: var(--vectis-color-danger-text);\n }\n\n .v-tree-row:is([aria-checked='true'], [aria-checked='mixed']) .v-check-mark {\n background: var(--vectis-color-accent);\n border-color: var(--vectis-color-accent);\n }\n\n .v-tree-row[aria-checked='true'] .v-check-mark-tick,\n .v-tree-row[aria-checked='mixed'] .v-check-mark-dash {\n opacity: 1;\n }\n\n /* Last of the colour rules, so that a disabled node reads as such whatever its state. */\n .v-tree-row[aria-disabled='true'] {\n color: var(--vectis-color-text-subtle);\n cursor: not-allowed;\n }\n\n .v-tree-row[aria-disabled='true'] :is(.v-tree-icon, .v-tree-toggle, .v-tree-end) {\n color: inherit;\n }\n\n .v-tree-row[aria-disabled='true'] .v-check-mark {\n background: var(--vectis-color-surface-muted);\n border-color: var(--vectis-color-border);\n color: var(--vectis-color-text-subtle);\n }\n\n /*\n * Forced colours flatten the tint of the selected row: it takes the system selection pair,\n * repeated to (0,4,0) above its own hover.\n */\n @media (forced-colors: active) {\n .v-tree-row.v-tree-row:is([aria-selected='true'], [data-current]):not([aria-disabled='true']) {\n forced-color-adjust: none;\n background: Highlight;\n color: HighlightText;\n }\n\n .v-tree-row:is([aria-checked='true'], [aria-checked='mixed']):not([aria-disabled='true'])\n .v-check-mark {\n forced-color-adjust: none;\n background: Highlight;\n border-color: Highlight;\n color: HighlightText;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .v-tree-chevron {\n transition: none;\n }\n }\n}\n</style>\n"],"mappings":""}
@@ -0,0 +1,321 @@
1
+ import { useMessages as e } from "../../i18n/state.js";
2
+ import { iconProps as t } from "../VIcon/iconProps.js";
3
+ import n from "../VIcon/VIcon.js";
4
+ import { isRtl as r } from "../../utils/direction.js";
5
+ import i from "../VSpinner/VSpinner.js";
6
+ import { useAriaLabel as a } from "../../composables/useAriaLabel.js";
7
+ import { useRootAttrs as o } from "../../composables/useRootAttrs.js";
8
+ import { chevron_right as s } from "../VIcon/icons/chevron_right.js";
9
+ import c from "../VCheckbox/VCheckMark.js";
10
+ import { error as l } from "../VIcon/icons/error.js";
11
+ import { useLiveAnnouncer as ee } from "../../composables/useLiveAnnouncer.js";
12
+ import { useTimer as te } from "../../composables/useTimer.js";
13
+ import { normalizeText as u } from "../../utils/text.js";
14
+ import { Fragment as d, computed as f, createBlock as p, createCommentVNode as m, createElementBlock as h, createElementVNode as g, createTextVNode as ne, createVNode as re, defineComponent as _, mergeModels as v, mergeProps as y, normalizeClass as ie, normalizeStyle as b, onMounted as ae, openBlock as x, ref as S, renderList as oe, renderSlot as C, resolveDynamicComponent as se, shallowReactive as w, toDisplayString as T, unref as E, useModel as ce, watch as le, withCtx as ue } from "vue";
15
+ //#region src/components/VTreeView/VTreeView.vue?vue&type=script&setup=true&lang.ts
16
+ var de = [
17
+ "data-size",
18
+ "aria-multiselectable",
19
+ "aria-label"
20
+ ], fe = ["onClick"], pe = { class: "v-tree-label" }, me = { class: "v-visually-hidden" }, he = {
21
+ key: 2,
22
+ class: "v-tree-end"
23
+ }, ge = {
24
+ class: "v-visually-hidden",
25
+ role: "status",
26
+ "aria-live": "polite"
27
+ }, _e = /*@__PURE__*/ _({
28
+ inheritAttrs: !1,
29
+ __name: "VTreeView",
30
+ props: /*@__PURE__*/ v({
31
+ items: {},
32
+ selectionMode: { default: "none" },
33
+ loadChildren: {
34
+ type: Function,
35
+ default: void 0
36
+ },
37
+ size: { default: "md" },
38
+ label: { default: void 0 }
39
+ }, {
40
+ modelValue: { default: null },
41
+ modelModifiers: {},
42
+ expanded: { default: () => [] },
43
+ expandedModifiers: {}
44
+ }),
45
+ emits: /*@__PURE__*/ v(["activate"], ["update:modelValue", "update:expanded"]),
46
+ setup(_, { expose: v, emit: _e }) {
47
+ let D = _, O = ce(_, "modelValue"), k = ce(_, "expanded"), ve = _e, { rootClass: ye, rootStyle: be, forwardedAttrs: xe } = o(), A = e(), Se = a(() => D.label ?? A.value.treeView.label), { polite: Ce, announce: we } = ee(), j = w(/* @__PURE__ */ new Map()), M = w(/* @__PURE__ */ new Set()), N = w(/* @__PURE__ */ new Set());
48
+ function P(e) {
49
+ return e.children ?? j.get(e.value);
50
+ }
51
+ function F(e) {
52
+ return !!D.loadChildren && !!e.lazy && !e.children && !j.has(e.value);
53
+ }
54
+ function I(e) {
55
+ return !!P(e)?.length || F(e);
56
+ }
57
+ let L = f(() => new Set(k.value)), R = f(() => {
58
+ let e = [], t = (n, r, i) => {
59
+ n.forEach((a, o) => {
60
+ let s = {
61
+ item: a,
62
+ level: r,
63
+ parent: i,
64
+ posinset: o + 1,
65
+ setsize: n.length
66
+ };
67
+ e.push(s);
68
+ let c = P(a);
69
+ c && L.value.has(a.value) && t(c, r + 1, s);
70
+ });
71
+ };
72
+ return t(D.items, 1, null), e;
73
+ });
74
+ function z(e, t) {
75
+ t !== L.value.has(e.value) && (k.value = t ? [...k.value, e.value] : k.value.filter((t) => t !== e.value));
76
+ }
77
+ function B(e) {
78
+ let t = /* @__PURE__ */ new Map(), n = (r, i) => {
79
+ t.set(r.value, "false");
80
+ let a = i || e.has(r.value), o = P(r), s = a ? "true" : "false";
81
+ if (o?.length) {
82
+ let e = o.map((e) => n(e, a));
83
+ s = e.every((e) => e === "true") ? "true" : e.every((e) => e === "false") ? "false" : "mixed";
84
+ }
85
+ return t.set(r.value, s), s;
86
+ };
87
+ return D.items.forEach((e) => n(e, !1)), t;
88
+ }
89
+ let V = f(() => {
90
+ let e = O.value;
91
+ return D.selectionMode === "multiple" ? Array.isArray(e) ? e : [] : e === null || Array.isArray(e) ? [] : [e];
92
+ }), H = f(() => D.selectionMode === "multiple" ? B(new Set(V.value)) : /* @__PURE__ */ new Map());
93
+ function U(e, t) {
94
+ t(e), P(e)?.forEach((e) => {
95
+ e.disabled || U(e, t);
96
+ });
97
+ }
98
+ function Te(e) {
99
+ let t = H.value, n = /* @__PURE__ */ new Set();
100
+ t.forEach((e, t) => {
101
+ e === "true" && n.add(t);
102
+ });
103
+ let r = V.value.filter((e) => !t.has(e)), i = !1;
104
+ if (U(e.item, (e) => {
105
+ !P(e)?.length && t.get(e.value) !== "true" && (i = !0);
106
+ }), U(e.item, (e) => {
107
+ i ? P(e)?.length || n.add(e.value) : n.delete(e.value);
108
+ }), !i) for (let t = e.parent; t; t = t.parent) n.delete(t.item.value);
109
+ let a = [];
110
+ B(n).forEach((e, t) => {
111
+ e === "true" && a.push(t);
112
+ }), O.value = [...a, ...r];
113
+ }
114
+ function W(e) {
115
+ return D.selectionMode === "single" && V.value[0] === e.value;
116
+ }
117
+ function G(e) {
118
+ let { item: t } = e;
119
+ D.selectionMode === "single" ? O.value = t.value : D.selectionMode === "multiple" ? Te(e) : t.href === void 0 && I(t) && z(t, !L.value.has(t.value));
120
+ }
121
+ function K(e, t) {
122
+ G(e), ve("activate", e.item, t);
123
+ }
124
+ async function Ee(e) {
125
+ let t = D.loadChildren;
126
+ if (t) {
127
+ M.add(e.value), N.delete(e.value);
128
+ try {
129
+ j.set(e.value, await t(e));
130
+ } catch {
131
+ N.add(e.value), z(e, !1), we(A.value.treeView.loadError(e.label), !1);
132
+ } finally {
133
+ M.delete(e.value);
134
+ }
135
+ }
136
+ }
137
+ ae(() => {
138
+ le([R, L], ([e, t]) => {
139
+ for (let { item: n } of e) t.has(n.value) && F(n) && !M.has(n.value) && Ee(n);
140
+ }, { immediate: !0 });
141
+ });
142
+ let q = S(null), J = /* @__PURE__ */ new Map(), Y = /* @__PURE__ */ new WeakMap();
143
+ function De(e, t) {
144
+ t instanceof HTMLElement ? (J.set(e, t), Y.set(t, e)) : J.delete(e);
145
+ }
146
+ let Oe = S(null), X = f(() => {
147
+ let e = R.value, t = new Set(e.map((e) => e.item.value));
148
+ for (let e = Oe.value; e; e = e.parent) if (t.has(e.item.value)) return e.item.value;
149
+ return ((D.selectionMode === "multiple" ? e.find((e) => H.value.get(e.item.value) === "true") : e.find((e) => W(e.item))) ?? e.find((e) => e.item.current) ?? e[0])?.item.value;
150
+ });
151
+ function ke(e) {
152
+ let t = Y.get(e.target);
153
+ t !== void 0 && (Oe.value = R.value.find((e) => e.item.value === t) ?? null);
154
+ }
155
+ function Z(e) {
156
+ e && J.get(e.item.value)?.focus();
157
+ }
158
+ let Ae = te(), Q = "";
159
+ function je(e, t) {
160
+ Q += u(e), Ae.start(() => Q = "", 500);
161
+ let n = R.value, r = [...Q].every((e) => e === Q[0]) ? Q[0] : Q, i = r.length === 1 ? t + 1 : t;
162
+ for (let e = 0; e < n.length; e++) {
163
+ let t = n[(i + e) % n.length];
164
+ if (u(t.item.label).startsWith(r)) return Z(t);
165
+ }
166
+ }
167
+ function Me(e) {
168
+ let t = q.value, n = Y.get(e.target);
169
+ if (!t || n === void 0 || e.altKey || e.ctrlKey || e.metaKey) return;
170
+ let i = R.value, a = i.findIndex((e) => e.item.value === n), o = i[a];
171
+ if (!o) return;
172
+ let { item: s } = o, c = L.value.has(s.value), l = r(t) ? "ArrowLeft" : "ArrowRight", ee = r(t) ? "ArrowRight" : "ArrowLeft";
173
+ switch (e.key) {
174
+ case "ArrowDown":
175
+ Z(i[a + 1]);
176
+ break;
177
+ case "ArrowUp":
178
+ Z(i[a - 1]);
179
+ break;
180
+ case "Home":
181
+ Z(i[0]);
182
+ break;
183
+ case "End":
184
+ Z(i.at(-1));
185
+ break;
186
+ case l:
187
+ if (!I(s)) break;
188
+ c ? i[a + 1]?.parent?.item === s && Z(i[a + 1]) : s.disabled || z(s, !0);
189
+ break;
190
+ case ee:
191
+ I(s) && c && !s.disabled ? z(s, !1) : Z(o.parent ?? void 0);
192
+ break;
193
+ case "Enter":
194
+ if (s.href !== void 0) return;
195
+ s.disabled || K(o, e);
196
+ break;
197
+ case " ":
198
+ if (s.disabled) break;
199
+ s.href === void 0 ? K(o, e) : G(o);
200
+ break;
201
+ case "*": {
202
+ let e = (o.parent ? P(o.parent.item) : D.items).filter((e) => !e.disabled && I(e)).map((e) => e.value).filter((e) => !L.value.has(e));
203
+ e.length && (k.value = [...k.value, ...e]);
204
+ break;
205
+ }
206
+ default:
207
+ if (e.key.length !== 1 || e.key === " ") return;
208
+ je(e.key, a);
209
+ }
210
+ e.preventDefault();
211
+ }
212
+ function Ne(e, t) {
213
+ if (e.item.disabled) {
214
+ t.preventDefault();
215
+ return;
216
+ }
217
+ K(e, t);
218
+ }
219
+ function Pe(e, t) {
220
+ t.preventDefault(), t.stopPropagation(), !e.item.disabled && I(e.item) && z(e.item, !L.value.has(e.item.value));
221
+ }
222
+ function $(e) {
223
+ return {
224
+ item: e.item,
225
+ level: e.level,
226
+ expanded: L.value.has(e.item.value) && !F(e.item)
227
+ };
228
+ }
229
+ function Fe(e) {
230
+ return I(e) ? String(L.value.has(e.value)) : void 0;
231
+ }
232
+ function Ie(e) {
233
+ if (e.current) return e.href === void 0 ? "true" : "page";
234
+ }
235
+ return v({
236
+ focus: (e) => X.value !== void 0 && J.get(X.value)?.focus(e),
237
+ el: q
238
+ }), (e, r) => (x(), h("div", {
239
+ class: ie(["v-tree-view", E(ye)]),
240
+ style: b(E(be))
241
+ }, [g("ul", y({
242
+ ref_key: "treeEl",
243
+ ref: q,
244
+ class: "v-tree v-control",
245
+ role: "tree",
246
+ "data-size": _.size,
247
+ "aria-multiselectable": _.selectionMode === "multiple" || void 0
248
+ }, E(xe), {
249
+ "aria-label": E(Se),
250
+ onKeydown: Me,
251
+ onFocusin: ke
252
+ }), [(x(!0), h(d, null, oe(R.value, (r) => (x(), h("li", {
253
+ key: r.item.value,
254
+ class: "v-tree-node",
255
+ role: "none"
256
+ }, [(x(), p(se(r.item.href === void 0 ? "div" : "a"), {
257
+ ref_for: !0,
258
+ ref: (e) => De(r.item.value, e),
259
+ class: "v-tree-row",
260
+ role: "treeitem",
261
+ style: b({ "--tree-level": r.level - 1 }),
262
+ href: r.item.disabled ? void 0 : r.item.href,
263
+ tabindex: X.value === r.item.value ? 0 : -1,
264
+ "aria-level": r.level,
265
+ "aria-setsize": r.setsize,
266
+ "aria-posinset": r.posinset,
267
+ "aria-expanded": Fe(r.item),
268
+ "aria-selected": _.selectionMode === "single" ? String(W(r.item)) : void 0,
269
+ "aria-checked": _.selectionMode === "multiple" ? H.value.get(r.item.value) : void 0,
270
+ "aria-current": Ie(r.item),
271
+ "aria-disabled": r.item.disabled || void 0,
272
+ "aria-busy": E(M).has(r.item.value) || void 0,
273
+ "data-current": r.item.current ? "" : void 0,
274
+ onClick: (e) => Ne(r, e)
275
+ }, {
276
+ default: ue(() => [
277
+ g("span", {
278
+ class: "v-tree-toggle",
279
+ "aria-hidden": "true",
280
+ onClick: (e) => Pe(r, e)
281
+ }, [E(M).has(r.item.value) ? (x(), p(i, { key: 0 })) : I(r.item) ? (x(), p(n, {
282
+ key: 1,
283
+ class: "v-tree-chevron",
284
+ name: E(s),
285
+ mirrored: ""
286
+ }, null, 8, ["name"])) : m("", !0)], 8, fe),
287
+ _.selectionMode === "multiple" ? (x(), p(c, { key: 0 })) : m("", !0),
288
+ C(e.$slots, "icon", y({ ref_for: !0 }, $(r)), () => [r.item.icon ? (x(), p(n, y({
289
+ key: 0,
290
+ class: "v-tree-icon"
291
+ }, { ref_for: !0 }, E(t)(r.item.icon)), null, 16)) : m("", !0)]),
292
+ g("span", pe, [C(e.$slots, "label", y({ ref_for: !0 }, $(r)), () => [ne(T(r.item.label), 1)])]),
293
+ E(N).has(r.item.value) ? (x(), h(d, { key: 1 }, [re(n, {
294
+ class: "v-tree-error",
295
+ name: E(l)
296
+ }, null, 8, ["name"]), g("span", me, T(E(A).treeView.loadFailed), 1)], 64)) : m("", !0),
297
+ e.$slots.end ? (x(), h("span", he, [C(e.$slots, "end", y({ ref_for: !0 }, $(r)))])) : m("", !0)
298
+ ]),
299
+ _: 2
300
+ }, 1032, [
301
+ "style",
302
+ "href",
303
+ "tabindex",
304
+ "aria-level",
305
+ "aria-setsize",
306
+ "aria-posinset",
307
+ "aria-expanded",
308
+ "aria-selected",
309
+ "aria-checked",
310
+ "aria-current",
311
+ "aria-disabled",
312
+ "aria-busy",
313
+ "data-current",
314
+ "onClick"
315
+ ]))]))), 128))], 16, de), g("div", ge, T(E(Ce)), 1)], 6));
316
+ }
317
+ });
318
+ //#endregion
319
+ export { _e as default };
320
+
321
+ //# sourceMappingURL=VTreeView.vue_vue_type_script_setup_true_lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VTreeView.vue_vue_type_script_setup_true_lang.js","names":["$slots"],"sources":["../../../src/components/VTreeView/VTreeView.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// @keyboard @a11y @core\n/**\n * A hierarchy following the ARIA tree pattern. The rows are rendered flat, in display order, their\n * depth carried by `aria-level`, `aria-setsize` and `aria-posinset`: no native element folds a tree\n * with a single tab stop, and a row that does not wrap its subtree keeps its accessible name free of\n * its descendants' text. JavaScript owns the focus, the keyboard, selection and lazy loading.\n */\nimport { computed, onMounted, ref, shallowReactive, watch } from 'vue'\nimport type { ComponentPublicInstance } from 'vue'\n\nimport VCheckMark from '../VCheckbox/VCheckMark.vue'\nimport VIcon from '../VIcon/VIcon.vue'\nimport VSpinner from '../VSpinner/VSpinner.vue'\nimport { iconProps } from '../VIcon/iconProps'\nimport { chevron_right as chevronRightIcon } from '../VIcon/icons/chevron_right'\nimport { error as errorIcon } from '../VIcon/icons/error'\nimport type { IconSource } from '../VIcon/types'\nimport type { ItemValue } from '../../types'\nimport { useAriaLabel } from '../../composables/useAriaLabel'\nimport { useLiveAnnouncer } from '../../composables/useLiveAnnouncer'\nimport { useRootAttrs } from '../../composables/useRootAttrs'\nimport { useTimer } from '../../composables/useTimer'\nimport { useMessages } from '../../i18n/state'\nimport { isRtl } from '../../utils/direction'\nimport { normalizeText } from '../../utils/text'\n\n/** Whether nodes can be selected: not at all, one at a time, or several with checkboxes. */\nexport type TreeSelectionMode = 'none' | 'single' | 'multiple'\n\n/** The height of the rows: 32 or 40 pixels. */\nexport type TreeViewSize = 'sm' | 'md'\n\n/**\n * What is selected, and its shape follows `selectionMode`: a single value (or `null`) in `single`\n * mode, an array in `multiple` mode.\n */\nexport type TreeViewModelValue = ItemValue | ItemValue[] | null\n\n/** One node of the tree. */\nexport interface TreeItem {\n /** What identifies the node, in the selection and expansion models. Unique across the tree. */\n value: ItemValue\n /** What the row says. It is also what typeahead matches. */\n label: string\n /** An icon before the label: an icon name, or an explicit render. */\n icon?: IconSource\n /** The child nodes, which make this node a branch. */\n children?: TreeItem[]\n /**\n * Marks a branch whose children `loadChildren` fetches on its first expansion. Ignored when\n * `children` is set or when the tree has no `loadChildren`.\n */\n lazy?: boolean\n /** Where the node leads, which makes the row a link. */\n href?: string\n /** Marks the node as the page being viewed (`aria-current`). */\n current?: boolean\n /**\n * Keeps the node focusable, so it is still found, but it cannot be selected, activated, expanded\n * or collapsed.\n */\n disabled?: boolean\n}\n\n/** What the `#icon`, `#label` and `#end` slots receive. */\nexport interface TreeItemSlotProps {\n item: TreeItem\n /** The depth of the node, from 1. */\n level: number\n /** Whether the node's children are shown. */\n expanded: boolean\n}\n\ntype CheckState = 'true' | 'false' | 'mixed'\n\ninterface TreeNode {\n item: TreeItem\n level: number\n parent: TreeNode | null\n posinset: number\n setsize: number\n}\n\ninterface TreeViewProps {\n /** The first level of the tree. */\n items: TreeItem[]\n /**\n * Whether nodes can be selected. In `multiple` mode each row has a checkbox, and checking a\n * branch checks everything under it.\n */\n selectionMode?: TreeSelectionMode\n /**\n * Fetches the children of a `lazy` node, on its first expansion. The tree keeps them; a failure\n * collapses the node again, and the next expansion retries.\n */\n loadChildren?: (item: TreeItem) => Promise<TreeItem[]>\n /** The height of the rows, 32 or 40 pixels. */\n size?: TreeViewSize\n /** What screen readers announce for the tree. It falls back to the design system dictionary. */\n label?: string\n}\n\ndefineOptions({ inheritAttrs: false })\n\nconst props = withDefaults(defineProps<TreeViewProps>(), {\n selectionMode: 'none',\n loadChildren: undefined,\n size: 'md',\n label: undefined,\n})\n\n/**\n * What is selected. In `single` mode, a value or `null`; in `multiple` mode, the checked nodes in\n * tree order, a branch included when everything under it is checked. A value given for a branch\n * checks its whole subtree. A shape that does not match the mode reads as an empty selection.\n */\nconst model = defineModel<TreeViewModelValue>({ default: null })\n\n/** The values of the expanded nodes. Left unbound, the tree keeps that state itself. */\nconst expanded = defineModel<ItemValue[]>('expanded', { default: () => [] })\n\nconst emit = defineEmits<{\n /**\n * A node was clicked or Enter was pressed on it, after the tree applied its own effect: selecting\n * it, checking it, or folding a branch in `none` mode. For a link, calling `preventDefault()` on\n * the event stops the navigation, which hands it to a router.\n */\n activate: [item: TreeItem, event: MouseEvent | KeyboardEvent]\n}>()\n\ndefineSlots<{\n /** Replaces the icon of a node, for instance to show an open folder when it is expanded. */\n icon?(props: TreeItemSlotProps): unknown\n /** Replaces the label of a node. */\n label?(props: TreeItemSlotProps): unknown\n /**\n * Content at the end of a row: a count, a badge. It must not be focusable: a row is a single\n * control.\n */\n end?(props: TreeItemSlotProps): unknown\n}>()\n\nconst { rootClass, rootStyle, forwardedAttrs } = useRootAttrs()\nconst m = useMessages()\nconst ariaLabel = useAriaLabel(() => props.label ?? m.value.treeView.label)\nconst { polite: announcement, announce } = useLiveAnnouncer()\n\nconst loaded = shallowReactive(new Map<ItemValue, TreeItem[]>())\nconst loading = shallowReactive(new Set<ItemValue>())\nconst failed = shallowReactive(new Set<ItemValue>())\n\nfunction childrenOf(item: TreeItem): TreeItem[] | undefined {\n return item.children ?? loaded.get(item.value)\n}\n\nfunction isPending(item: TreeItem): boolean {\n return !!props.loadChildren && !!item.lazy && !item.children && !loaded.has(item.value)\n}\n\nfunction isBranch(item: TreeItem): boolean {\n return !!childrenOf(item)?.length || isPending(item)\n}\n\nconst expandedSet = computed(() => new Set(expanded.value))\n\n/** The rows on screen, in display order: every node whose ancestors are all expanded. */\nconst visible = computed(() => {\n const rows: TreeNode[] = []\n const walk = (items: TreeItem[], level: number, parent: TreeNode | null) => {\n items.forEach((item, index) => {\n const node = { item, level, parent, posinset: index + 1, setsize: items.length }\n rows.push(node)\n const children = childrenOf(item)\n if (children && expandedSet.value.has(item.value)) walk(children, level + 1, node)\n })\n }\n walk(props.items, 1, null)\n return rows\n})\n\nfunction setExpanded(item: TreeItem, open: boolean) {\n if (open === expandedSet.value.has(item.value)) return\n expanded.value = open\n ? [...expanded.value, item.value]\n : expanded.value.filter((value) => value !== item.value)\n}\n\n// @core\n/**\n * Derives what each checkbox shows. A value in the selection checks its node and the whole subtree\n * under it; a branch then shows checked when all its children are, unchecked when none are, and\n * mixed otherwise, so its own presence in the selection only matters through its children. The map\n * is filled in tree order, which is the order the model is written in.\n */\nfunction deriveCheckStates(chosen: Set<ItemValue>): Map<ItemValue, CheckState> {\n const states = new Map<ItemValue, CheckState>()\n const visit = (item: TreeItem, inherited: boolean): CheckState => {\n states.set(item.value, 'false')\n const own = inherited || chosen.has(item.value)\n const children = childrenOf(item)\n let state: CheckState = own ? 'true' : 'false'\n if (children?.length) {\n const childStates = children.map((child) => visit(child, own))\n state = childStates.every((s) => s === 'true')\n ? 'true'\n : childStates.every((s) => s === 'false')\n ? 'false'\n : 'mixed'\n }\n states.set(item.value, state)\n return state\n }\n props.items.forEach((item) => visit(item, false))\n return states\n}\n\nconst chosenValues = computed<ItemValue[]>(() => {\n const value = model.value\n if (props.selectionMode === 'multiple') return Array.isArray(value) ? value : []\n return value === null || Array.isArray(value) ? [] : [value]\n})\n\nconst checkStates = computed(() =>\n props.selectionMode === 'multiple'\n ? deriveCheckStates(new Set(chosenValues.value))\n : new Map<ItemValue, CheckState>(),\n)\n\n/** Calls `fn` on a node and on every node under it that is not disabled. */\nfunction eachEnabled(item: TreeItem, fn: (item: TreeItem) => void) {\n fn(item)\n childrenOf(item)?.forEach((child) => {\n if (!child.disabled) eachEnabled(child, fn)\n })\n}\n\n// @core\n/**\n * Checks a node and its subtree when any leaf of it is unchecked, and unchecks them otherwise.\n * Disabled nodes keep their state. Unchecking also drops the ancestors, which would otherwise check\n * the node again through their subtree. Values the tree does not know, such as the children of a\n * node not loaded yet, are kept at the end.\n */\nfunction toggleCheck(node: TreeNode) {\n const states = checkStates.value\n const chosen = new Set<ItemValue>()\n states.forEach((state, value) => {\n if (state === 'true') chosen.add(value)\n })\n const unknown = chosenValues.value.filter((value) => !states.has(value))\n\n let check = false\n eachEnabled(node.item, (item) => {\n if (!childrenOf(item)?.length && states.get(item.value) !== 'true') check = true\n })\n // Only the leaves are added: a branch in the selection would check its disabled children too.\n eachEnabled(node.item, (item) => {\n if (!check) chosen.delete(item.value)\n else if (!childrenOf(item)?.length) chosen.add(item.value)\n })\n if (!check) for (let p = node.parent; p; p = p.parent) chosen.delete(p.item.value)\n\n const next: ItemValue[] = []\n deriveCheckStates(chosen).forEach((state, value) => {\n if (state === 'true') next.push(value)\n })\n model.value = [...next, ...unknown]\n}\n\nfunction isSelected(item: TreeItem): boolean {\n return props.selectionMode === 'single' && chosenValues.value[0] === item.value\n}\n\n// @core\n/** What a click or Enter does besides the `activate` event, which follows it. */\nfunction applyDefault(node: TreeNode) {\n const { item } = node\n if (props.selectionMode === 'single') model.value = item.value\n else if (props.selectionMode === 'multiple') toggleCheck(node)\n else if (item.href === undefined && isBranch(item))\n setExpanded(item, !expandedSet.value.has(item.value))\n}\n\nfunction activate(node: TreeNode, event: MouseEvent | KeyboardEvent) {\n applyDefault(node)\n emit('activate', node.item, event)\n}\n\nasync function load(item: TreeItem) {\n const loader = props.loadChildren\n if (!loader) return\n loading.add(item.value)\n failed.delete(item.value)\n try {\n loaded.set(item.value, await loader(item))\n } catch {\n failed.add(item.value)\n setExpanded(item, false)\n announce(m.value.treeView.loadError(item.label), false)\n } finally {\n loading.delete(item.value)\n }\n}\n\n// @ssr\n// Loading waits for the client: an expanded lazy node renders busy on the server, then fetches.\nonMounted(() => {\n // The expanded set is watched too: a pending node shows no children, so its expansion alone\n // does not change the rows.\n watch(\n [visible, expandedSet],\n ([rows, open]) => {\n for (const { item } of rows)\n if (open.has(item.value) && isPending(item) && !loading.has(item.value)) void load(item)\n },\n { immediate: true },\n )\n})\n\nconst treeEl = ref<HTMLElement | null>(null)\nconst rowEls = new Map<ItemValue, HTMLElement>()\nconst rowValues = new WeakMap<Element, ItemValue>()\n\nfunction bindRow(value: ItemValue, el: Element | ComponentPublicInstance | null) {\n if (el instanceof HTMLElement) {\n rowEls.set(value, el)\n rowValues.set(el, value)\n } else rowEls.delete(value)\n}\n\n// @keyboard @a11y\n/**\n * The single tab stop: the node last focused, or its closest ancestor still on screen once a\n * branch above it folds; before any focus, the first selected node on screen, then the current\n * one, then the first row.\n */\nconst active = ref<TreeNode | null>(null)\nconst tabStop = computed<ItemValue | undefined>(() => {\n const rows = visible.value\n const shown = new Set(rows.map((node) => node.item.value))\n for (let node = active.value; node; node = node.parent)\n if (shown.has(node.item.value)) return node.item.value\n const selected =\n props.selectionMode === 'multiple'\n ? rows.find((node) => checkStates.value.get(node.item.value) === 'true')\n : rows.find((node) => isSelected(node.item))\n return (selected ?? rows.find((node) => node.item.current) ?? rows[0])?.item.value\n})\n\nfunction onFocusin(event: FocusEvent) {\n const value = rowValues.get(event.target as Element)\n if (value === undefined) return\n active.value = visible.value.find((node) => node.item.value === value) ?? null\n}\n\nfunction focusRow(node: TreeNode | undefined) {\n if (node) rowEls.get(node.item.value)?.focus()\n}\n\nconst typeahead = useTimer()\nlet typed = ''\n\n// @keyboard\n/**\n * Moves to the next row whose label starts with what was typed in the last half-second. Repeating\n * one letter cycles through the rows starting with it.\n */\nfunction typeTo(char: string, index: number) {\n typed += normalizeText(char)\n typeahead.start(() => (typed = ''), 500)\n const rows = visible.value\n const needle = [...typed].every((c) => c === typed[0]) ? typed[0]! : typed\n const start = needle.length === 1 ? index + 1 : index\n for (let i = 0; i < rows.length; i++) {\n const node = rows[(start + i) % rows.length]!\n if (normalizeText(node.item.label).startsWith(needle)) return focusRow(node)\n }\n}\n\n// @keyboard @a11y\nfunction onKeydown(event: KeyboardEvent) {\n const tree = treeEl.value\n const value = rowValues.get(event.target as Element)\n if (!tree || value === undefined || event.altKey || event.ctrlKey || event.metaKey) return\n const rows = visible.value\n const index = rows.findIndex((node) => node.item.value === value)\n const node = rows[index]\n if (!node) return\n const { item } = node\n const isOpen = expandedSet.value.has(item.value)\n const forward = isRtl(tree) ? 'ArrowLeft' : 'ArrowRight'\n const back = isRtl(tree) ? 'ArrowRight' : 'ArrowLeft'\n\n switch (event.key) {\n case 'ArrowDown':\n focusRow(rows[index + 1])\n break\n case 'ArrowUp':\n focusRow(rows[index - 1])\n break\n case 'Home':\n focusRow(rows[0])\n break\n case 'End':\n focusRow(rows.at(-1))\n break\n case forward:\n if (!isBranch(item)) break\n if (!isOpen) {\n if (!item.disabled) setExpanded(item, true)\n } else if (rows[index + 1]?.parent?.item === item) focusRow(rows[index + 1])\n break\n case back:\n if (isBranch(item) && isOpen && !item.disabled) setExpanded(item, false)\n else focusRow(node.parent ?? undefined)\n break\n case 'Enter':\n // A link follows itself: the browser turns Enter into a click, which lands in onRowClick.\n if (item.href !== undefined) return\n if (!item.disabled) activate(node, event)\n break\n case ' ':\n // Space selects without following a link, as it does nothing on a link natively.\n if (item.disabled) break\n if (item.href !== undefined) applyDefault(node)\n else activate(node, event)\n break\n case '*': {\n const siblings = node.parent ? childrenOf(node.parent.item)! : props.items\n const closed = siblings\n .filter((sibling) => !sibling.disabled && isBranch(sibling))\n .map((sibling) => sibling.value)\n .filter((sibling) => !expandedSet.value.has(sibling))\n if (closed.length) expanded.value = [...expanded.value, ...closed]\n break\n }\n default:\n if (event.key.length !== 1 || event.key === ' ') return\n typeTo(event.key, index)\n }\n event.preventDefault()\n}\n\nfunction onRowClick(node: TreeNode, event: MouseEvent) {\n // An inert link has no address left to follow; this also covers a click on its children.\n if (node.item.disabled) {\n event.preventDefault()\n return\n }\n activate(node, event)\n}\n\n// The chevron folds without selecting, and without following the link it sits in.\nfunction onChevronClick(node: TreeNode, event: MouseEvent) {\n event.preventDefault()\n event.stopPropagation()\n if (!node.item.disabled && isBranch(node.item))\n setExpanded(node.item, !expandedSet.value.has(node.item.value))\n}\n\nfunction slotProps(node: TreeNode): TreeItemSlotProps {\n return {\n item: node.item,\n level: node.level,\n expanded: expandedSet.value.has(node.item.value) && !isPending(node.item),\n }\n}\n\nfunction ariaExpanded(item: TreeItem) {\n return isBranch(item) ? String(expandedSet.value.has(item.value)) : undefined\n}\n\nfunction ariaCurrent(item: TreeItem) {\n if (!item.current) return undefined\n return item.href !== undefined ? 'page' : 'true'\n}\n\n// The root is a wrapper holding the live region, which a tree may not contain: these two reach\n// the tree itself.\ndefineExpose({\n /** Moves the focus to the tree's tab stop: the last focused node, else the selected or current one. */\n focus: (options?: FocusOptions) =>\n tabStop.value !== undefined && rowEls.get(tabStop.value)?.focus(options),\n /** The `role=\"tree\"` element, which also receives the consumer's attributes. */\n el: treeEl,\n})\n</script>\n\n<template>\n <div class=\"v-tree-view\" :class=\"rootClass\" :style=\"rootStyle\">\n <ul\n ref=\"treeEl\"\n class=\"v-tree v-control\"\n role=\"tree\"\n :data-size=\"size\"\n :aria-multiselectable=\"selectionMode === 'multiple' || undefined\"\n v-bind=\"forwardedAttrs\"\n :aria-label=\"ariaLabel\"\n @keydown=\"onKeydown\"\n @focusin=\"onFocusin\"\n >\n <li v-for=\"node in visible\" :key=\"node.item.value\" class=\"v-tree-node\" role=\"none\">\n <component\n :is=\"node.item.href !== undefined ? 'a' : 'div'\"\n :ref=\"(el: Element | ComponentPublicInstance | null) => bindRow(node.item.value, el)\"\n class=\"v-tree-row\"\n role=\"treeitem\"\n :style=\"{ '--tree-level': node.level - 1 }\"\n :href=\"node.item.disabled ? undefined : node.item.href\"\n :tabindex=\"tabStop === node.item.value ? 0 : -1\"\n :aria-level=\"node.level\"\n :aria-setsize=\"node.setsize\"\n :aria-posinset=\"node.posinset\"\n :aria-expanded=\"ariaExpanded(node.item)\"\n :aria-selected=\"selectionMode === 'single' ? String(isSelected(node.item)) : undefined\"\n :aria-checked=\"\n selectionMode === 'multiple' ? checkStates.get(node.item.value) : undefined\n \"\n :aria-current=\"ariaCurrent(node.item)\"\n :aria-disabled=\"node.item.disabled || undefined\"\n :aria-busy=\"loading.has(node.item.value) || undefined\"\n :data-current=\"node.item.current ? '' : undefined\"\n @click=\"onRowClick(node, $event)\"\n >\n <!-- Decorative: the row is the control, and the arrows fold it. -->\n <span class=\"v-tree-toggle\" aria-hidden=\"true\" @click=\"onChevronClick(node, $event)\">\n <VSpinner v-if=\"loading.has(node.item.value)\" />\n <VIcon\n v-else-if=\"isBranch(node.item)\"\n class=\"v-tree-chevron\"\n :name=\"chevronRightIcon\"\n mirrored\n />\n </span>\n <VCheckMark v-if=\"selectionMode === 'multiple'\" />\n <slot name=\"icon\" v-bind=\"slotProps(node)\">\n <VIcon v-if=\"node.item.icon\" class=\"v-tree-icon\" v-bind=\"iconProps(node.item.icon)\" />\n </slot>\n <span class=\"v-tree-label\"\n ><slot name=\"label\" v-bind=\"slotProps(node)\">{{ node.item.label }}</slot></span\n >\n <template v-if=\"failed.has(node.item.value)\">\n <VIcon class=\"v-tree-error\" :name=\"errorIcon\" />\n <span class=\"v-visually-hidden\">{{ m.treeView.loadFailed }}</span>\n </template>\n <span v-if=\"$slots.end\" class=\"v-tree-end\"\n ><slot name=\"end\" v-bind=\"slotProps(node)\"\n /></span>\n </component>\n </li>\n </ul>\n <div class=\"v-visually-hidden\" role=\"status\" aria-live=\"polite\">{{ announcement }}</div>\n </div>\n</template>\n\n<style>\n@layer vectis.components {\n .v-tree {\n /* One level of indentation puts a child's chevron under its parent's icon. */\n --tree-indent: calc(var(--vectis-icon-size) + var(--control-gap));\n\n display: flex;\n flex-direction: column;\n margin: 0;\n padding: 0;\n list-style: none;\n font-family: var(--vectis-text-family);\n }\n\n .v-tree-row {\n /* See VSideNavigation: the radius cannot exceed half the height of a single row. */\n --tree-row-radius: min(var(--vectis-radius-interactive), calc(var(--control-height) / 2));\n\n display: flex;\n align-items: center;\n gap: var(--control-gap);\n min-block-size: var(--control-height);\n padding-block: var(--vectis-space-1);\n padding-inline: calc(var(--vectis-space-2) + var(--tree-level, 0) * var(--tree-indent))\n var(--vectis-space-2);\n border-radius: var(--tree-row-radius);\n color: var(--vectis-color-text);\n font-size: var(--control-font-size);\n font-weight: var(--vectis-text-body-md-weight);\n line-height: var(--vectis-text-body-md-leading);\n text-decoration: none;\n cursor: pointer;\n user-select: none;\n }\n\n .v-tree-row:hover:not([aria-disabled='true']) {\n background: var(--vectis-color-surface-muted);\n }\n\n /* Drawn inwards, so that neighbouring rows cannot cover it. */\n .v-tree-row:focus-visible {\n outline: var(--vectis-focus-ring-width) solid var(--vectis-focus-ring-color);\n outline-offset: calc(-1 * var(--vectis-focus-ring-width));\n }\n\n .v-tree-row:is([aria-selected='true'], [data-current]) {\n background: var(--vectis-color-accent-surface);\n color: var(--vectis-color-accent-text);\n }\n\n /* The selected row is already tinted, so its hover deepens that tint; the VMenuItem idiom. */\n .v-tree-row:is([aria-selected='true'], [data-current]):hover:not([aria-disabled='true']) {\n background: color-mix(\n in oklab,\n var(--vectis-color-accent-surface),\n var(--vectis-color-accent-text) 8%\n );\n }\n\n .v-tree-row:is([aria-selected='true'], [data-current]) :is(.v-tree-icon, .v-tree-toggle) {\n color: inherit;\n }\n\n .v-tree-row[data-current] .v-tree-label {\n font-weight: var(--vectis-text-label-weight);\n }\n\n .v-tree-toggle {\n display: inline-grid;\n flex: none;\n place-items: center;\n inline-size: var(--vectis-icon-size);\n block-size: var(--vectis-icon-size);\n color: var(--vectis-color-text-muted);\n }\n\n .v-tree-chevron {\n transition: rotate var(--vectis-duration-base) var(--vectis-ease-default);\n }\n\n .v-tree-row[aria-expanded='true'] .v-tree-chevron {\n rotate: 90deg;\n }\n\n /* The mirrored chevron points left, and turns the other way to point down. */\n .v-tree-row[aria-expanded='true'] .v-tree-chevron:dir(rtl) {\n rotate: -90deg;\n }\n\n .v-tree-icon {\n flex: none;\n color: var(--vectis-color-text-muted);\n }\n\n .v-tree-label {\n flex: 1;\n min-inline-size: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .v-tree-end {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--vectis-space-1);\n color: var(--vectis-color-text-muted);\n }\n\n .v-tree-error {\n flex: none;\n color: var(--vectis-color-danger-text);\n }\n\n .v-tree-row:is([aria-checked='true'], [aria-checked='mixed']) .v-check-mark {\n background: var(--vectis-color-accent);\n border-color: var(--vectis-color-accent);\n }\n\n .v-tree-row[aria-checked='true'] .v-check-mark-tick,\n .v-tree-row[aria-checked='mixed'] .v-check-mark-dash {\n opacity: 1;\n }\n\n /* Last of the colour rules, so that a disabled node reads as such whatever its state. */\n .v-tree-row[aria-disabled='true'] {\n color: var(--vectis-color-text-subtle);\n cursor: not-allowed;\n }\n\n .v-tree-row[aria-disabled='true'] :is(.v-tree-icon, .v-tree-toggle, .v-tree-end) {\n color: inherit;\n }\n\n .v-tree-row[aria-disabled='true'] .v-check-mark {\n background: var(--vectis-color-surface-muted);\n border-color: var(--vectis-color-border);\n color: var(--vectis-color-text-subtle);\n }\n\n /*\n * Forced colours flatten the tint of the selected row: it takes the system selection pair,\n * repeated to (0,4,0) above its own hover.\n */\n @media (forced-colors: active) {\n .v-tree-row.v-tree-row:is([aria-selected='true'], [data-current]):not([aria-disabled='true']) {\n forced-color-adjust: none;\n background: Highlight;\n color: HighlightText;\n }\n\n .v-tree-row:is([aria-checked='true'], [aria-checked='mixed']):not([aria-disabled='true'])\n .v-check-mark {\n forced-color-adjust: none;\n background: Highlight;\n border-color: Highlight;\n color: HighlightText;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .v-tree-chevron {\n transition: none;\n }\n }\n}\n</style>\n"],"mappings":"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"}
@@ -30,8 +30,8 @@ type __VLS_Slots = {
30
30
  };
31
31
  declare const __VLS_base: import('vue').DefineComponent<TypographyProps, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<TypographyProps> & Readonly<{}>, {
32
32
  variant: TypographyVariant;
33
- as: string;
34
33
  tone: TypographyTone;
34
+ as: string;
35
35
  truncate: boolean;
36
36
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
37
37
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -0,0 +1,2 @@
1
+ @layer vectis.reset, vectis.tokens, vectis.components, vectis.utilities;
2
+ @layer vectis.components{.v-virtual-list{overflow-anchor:none;border-radius:var(--vectis-radius-xs);display:block;position:relative;overflow-y:auto}.v-virtual-list:focus-visible{outline:var(--vectis-focus-ring-width) solid var(--vectis-focus-ring-color);outline-offset:var(--vectis-focus-ring-offset)}.v-virtual-list-item{display:flow-root}.v-virtual-list-more{justify-content:center;align-items:center;gap:var(--vectis-space-2);min-block-size:var(--vectis-control-height-md);padding:var(--vectis-space-2);font-size:var(--vectis-text-body-sm-size);font-weight:var(--vectis-text-body-sm-weight);line-height:var(--vectis-text-body-sm-leading);color:var(--vectis-color-text-muted);display:flex}}
@@ -0,0 +1,78 @@
1
+ /** Where `scrollToIndex` brings the row: to the top, the middle, the bottom, or barely in view. */
2
+ export type VirtualListAlign = ScrollLogicalPosition;
3
+ /** What the default slot receives for each rendered row. */
4
+ export interface VirtualListItemSlotProps<T> {
5
+ item: T;
6
+ index: number;
7
+ }
8
+ /** The props of VVirtualList, for a row type `T`. */
9
+ export interface VirtualListProps<T> {
10
+ /** The rows of the list, all of them: only those near the viewport are rendered. */
11
+ items: T[];
12
+ /**
13
+ * The field identifying a row, under which its measured height is remembered. Without it a
14
+ * row is identified by its position, which suits a list that only grows at the end.
15
+ */
16
+ itemKey?: string;
17
+ /**
18
+ * The height assumed for a row not rendered yet, in pixels. Each row is measured once it
19
+ * renders, so this is only an estimate; the closer it is, the steadier the scrollbar.
20
+ */
21
+ itemSize?: number;
22
+ /** How many rows to render beyond each edge of the viewport, so a fast scroll shows no gap. */
23
+ overscan?: number;
24
+ /**
25
+ * How many rows to render before the list can measure its viewport: on the server and until
26
+ * the page is hydrated.
27
+ */
28
+ initialCount?: number;
29
+ /**
30
+ * The height of the list: a number of pixels or any CSS length. Without it, give the list a
31
+ * bounded height in your own CSS; a list that grows with its content renders every row.
32
+ */
33
+ height?: number | string;
34
+ /** The accessible name of the list. */
35
+ label?: string;
36
+ /** Says that rows are being loaded: a row with a spinner ends the list. */
37
+ loading?: boolean;
38
+ /** What that row says, and what the spinner is announced as. */
39
+ loadingText?: string;
40
+ /**
41
+ * Says that there are more rows to come, which makes the list ask for them as its end comes
42
+ * into view. The total is then announced as unknown.
43
+ */
44
+ hasMore?: boolean;
45
+ }
46
+ declare const __VLS_export: <T>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_exposed?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
47
+ props: import('vue').PublicProps & __VLS_PrettifyLocal<VirtualListProps<T> & {
48
+ "onLoad-more"?: (() => any) | undefined;
49
+ }> & (typeof globalThis extends {
50
+ __VLS_PROPS_FALLBACK: infer P;
51
+ } ? P : {});
52
+ expose: (exposed: import('vue').ShallowUnwrapRef<{
53
+ /**
54
+ * Scrolls the list until a row is in view, rendering it first if needed. `align` places it at
55
+ * the top, the middle or the bottom; by default it moves as little as possible.
56
+ */
57
+ scrollToIndex: (index: number, align?: VirtualListAlign) => Promise<void>;
58
+ /** The scrolling element, which carries the list role. */
59
+ el: import('vue').Ref<HTMLElement | null, HTMLElement | null>;
60
+ }>) => void;
61
+ attrs: any;
62
+ slots: {
63
+ /** One row of the list. */
64
+ default(props: VirtualListItemSlotProps<T>): unknown;
65
+ /** Replaces the spinner and the text of the loading row. */
66
+ loading?(): unknown;
67
+ };
68
+ emit: (evt: "load-more") => void;
69
+ }>) => import('vue').VNode & {
70
+ __ctx?: NonNullable<Awaited<typeof __VLS_setup>>;
71
+ };
72
+ declare const _default: typeof __VLS_export;
73
+ export default _default;
74
+ type __VLS_PrettifyLocal<T> = (T extends any ? {
75
+ [K in keyof T]: T[K];
76
+ } : {
77
+ [K in keyof T as K]: T[K];
78
+ }) & {};
@@ -0,0 +1,9 @@
1
+ import './VVirtualList.css';
2
+ import e from "./VVirtualList.vue_vue_type_script_setup_true_lang.js";
3
+ /* empty css */
4
+ //#region src/components/VVirtualList/VVirtualList.vue
5
+ var t = e;
6
+ //#endregion
7
+ export { t as default };
8
+
9
+ //# sourceMappingURL=VVirtualList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VVirtualList.js","names":[],"sources":["../../../src/components/VVirtualList/VVirtualList.vue"],"sourcesContent":["<script setup lang=\"ts\" generic=\"T\">\n// @a11y @ssr @core\n/**\n * A list too long to render whole: only the rows near its viewport exist in the page. It is its\n * own scroll container, focusable so the keyboard can scroll it, and each row says where it\n * stands in the whole list. Rows are measured as they render, so they may differ in height.\n */\nimport { computed, ref, toRaw, watch } from 'vue'\n\nimport VSpinner from '../VSpinner/VSpinner.vue'\nimport { useInfiniteScroll } from '../../composables/useInfiniteScroll'\nimport { useVirtualList } from '../../composables/useVirtualList'\nimport { useMessages } from '../../i18n/state'\nimport { cssSize } from '../../utils/css'\nimport { isDev } from '../../utils/env'\n\n/** Where `scrollToIndex` brings the row: to the top, the middle, the bottom, or barely in view. */\nexport type VirtualListAlign = ScrollLogicalPosition\n\n/** What the default slot receives for each rendered row. */\nexport interface VirtualListItemSlotProps<T> {\n item: T\n index: number\n}\n\n/** The props of VVirtualList, for a row type `T`. */\nexport interface VirtualListProps<T> {\n /** The rows of the list, all of them: only those near the viewport are rendered. */\n items: T[]\n /**\n * The field identifying a row, under which its measured height is remembered. Without it a\n * row is identified by its position, which suits a list that only grows at the end.\n */\n itemKey?: string\n /**\n * The height assumed for a row not rendered yet, in pixels. Each row is measured once it\n * renders, so this is only an estimate; the closer it is, the steadier the scrollbar.\n */\n itemSize?: number\n /** How many rows to render beyond each edge of the viewport, so a fast scroll shows no gap. */\n overscan?: number\n /**\n * How many rows to render before the list can measure its viewport: on the server and until\n * the page is hydrated.\n */\n initialCount?: number\n /**\n * The height of the list: a number of pixels or any CSS length. Without it, give the list a\n * bounded height in your own CSS; a list that grows with its content renders every row.\n */\n height?: number | string\n /** The accessible name of the list. */\n label?: string\n /** Says that rows are being loaded: a row with a spinner ends the list. */\n loading?: boolean\n /** What that row says, and what the spinner is announced as. */\n loadingText?: string\n /**\n * Says that there are more rows to come, which makes the list ask for them as its end comes\n * into view. The total is then announced as unknown.\n */\n hasMore?: boolean\n}\n\nconst props = withDefaults(defineProps<VirtualListProps<T>>(), {\n itemKey: undefined,\n itemSize: 40,\n overscan: 5,\n initialCount: 10,\n height: undefined,\n label: undefined,\n loading: false,\n loadingText: undefined,\n hasMore: false,\n})\n\nconst emit = defineEmits<{\n /** The end of the list has come into view: send the next rows. */\n 'load-more': []\n}>()\n\ndefineSlots<{\n /** One row of the list. */\n default(props: VirtualListItemSlotProps<T>): unknown\n /** Replaces the spinner and the text of the loading row. */\n loading?(): unknown\n}>()\n\nconst m = useMessages()\nconst resolvedLoadingText = computed(() => props.loadingText ?? m.value.common.loading)\n\nconst listEl = ref<HTMLElement | null>(null)\nconst sentinelEl = ref<HTMLElement | null>(null)\n\n// Read through the raw array: computing the offsets visits every row's key, and a reactive read\n// for each of a hundred thousand rows is what would make scrolling stutter. The length is still\n// read reactively, so rows pushed in place are seen.\nfunction keyOf(index: number): unknown {\n if (!props.itemKey) return index\n const item = toRaw(props.items)[index] as Record<string, unknown> | undefined\n return item?.[props.itemKey]\n}\n\n// @a11y\n// The row holding the focus stays rendered while the list scrolls away from it: dropping it\n// would send the focus back to the page.\nconst focusedIndex = ref(-1)\n\nconst virtualList = useVirtualList({\n scrollEl: listEl,\n count: () => props.items.length,\n key: keyOf,\n itemSize: () => props.itemSize,\n overscan: () => props.overscan,\n initialCount: () => props.initialCount,\n pinned: () => (focusedIndex.value >= 0 ? [focusedIndex.value] : []),\n})\nconst { segments, measure } = virtualList\n\nfunction rowOf(target: EventTarget | null) {\n if (!(target instanceof Element)) return -1\n const row = target.closest('.v-virtual-list-item')\n if (!row || row.parentElement !== listEl.value) return -1\n return Number((row as HTMLElement).dataset.index)\n}\n\nfunction onFocusin(event: FocusEvent) {\n focusedIndex.value = rowOf(event.target)\n}\n\nfunction onFocusout(event: FocusEvent) {\n focusedIndex.value = rowOf(event.relatedTarget)\n}\n\nuseInfiniteScroll({\n sentinelEl,\n root: () => listEl.value,\n canLoad: () => props.hasMore && !props.loading,\n loaded: () => props.items,\n onLoadMore: () => emit('load-more'),\n})\n\n// @devwarn\n// A list without a bounded height grows with its content, so every row is in view and\n// rendered: the symptom is a long list that never scrolls.\nif (isDev) {\n watch(\n segments,\n (list) => {\n const el = listEl.value\n if (!el || props.items.length < 100 || el.scrollHeight > el.clientHeight) return\n if (list.some((segment) => segment.type === 'spacer')) return\n console.warn(\n '[VVirtualList] Every row is rendered because the list does not scroll: give it a `height` or a bounded height in CSS.',\n )\n },\n { flush: 'post', once: true },\n )\n}\n\ndefineExpose({\n /**\n * Scrolls the list until a row is in view, rendering it first if needed. `align` places it at\n * the top, the middle or the bottom; by default it moves as little as possible.\n */\n scrollToIndex: (index: number, align?: VirtualListAlign) =>\n virtualList.scrollToIndex(index, align),\n /** The scrolling element, which carries the list role. */\n el: listEl,\n})\n</script>\n\n<template>\n <div\n ref=\"listEl\"\n class=\"v-virtual-list\"\n role=\"list\"\n tabindex=\"0\"\n :aria-label=\"label\"\n :aria-busy=\"loading ? 'true' : undefined\"\n :style=\"{ blockSize: cssSize(height) }\"\n @focusin=\"onFocusin\"\n @focusout=\"onFocusout\"\n >\n <template\n v-for=\"segment in segments\"\n :key=\"segment.type === 'row' ? `row:${String(keyOf(segment.index))}` : segment.key\"\n >\n <div\n v-if=\"segment.type === 'spacer'\"\n class=\"v-virtual-list-spacer\"\n aria-hidden=\"true\"\n :style=\"{ blockSize: `${segment.size}px` }\"\n />\n <div\n v-else\n :ref=\"(el) => measure(el as Element | null, segment.index)\"\n role=\"listitem\"\n class=\"v-virtual-list-item\"\n :aria-setsize=\"hasMore ? -1 : items.length\"\n :aria-posinset=\"segment.index + 1\"\n :data-index=\"segment.index\"\n >\n <slot :item=\"items[segment.index]!\" :index=\"segment.index\" />\n </div>\n </template>\n\n <!--\n A single element for as long as more rows may come: replacing it would cancel the\n observation, and no further rows would be asked for. Hidden from assistive technology,\n which hears `aria-busy` on the list instead.\n -->\n <div v-if=\"hasMore || loading\" ref=\"sentinelEl\" class=\"v-virtual-list-more\" aria-hidden=\"true\">\n <slot v-if=\"loading\" name=\"loading\">\n <VSpinner :label=\"resolvedLoadingText\" />\n <span>{{ resolvedLoadingText }}</span>\n </slot>\n </div>\n </div>\n</template>\n\n<style>\n@layer vectis.components {\n /*\n * The list corrects its scroll itself when a row above the view changes height; the browser's\n * own anchoring would apply the same correction a second time. Positioned, so it contains the\n * absolutely positioned parts of the rows: positioned against an ancestor beyond it, they\n * escape its clip and stretch the page.\n */\n .v-virtual-list {\n position: relative;\n display: block;\n overflow-y: auto;\n overflow-anchor: none;\n border-radius: var(--vectis-radius-xs);\n }\n\n .v-virtual-list:focus-visible {\n outline: var(--vectis-focus-ring-width) solid var(--vectis-focus-ring-color);\n outline-offset: var(--vectis-focus-ring-offset);\n }\n\n /*\n * A row contains the margins of its content: collapsing through it, they would sit between\n * rows where no measurement sees them.\n */\n .v-virtual-list-item {\n display: flow-root;\n }\n\n .v-virtual-list-more {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--vectis-space-2);\n min-block-size: var(--vectis-control-height-md);\n padding: var(--vectis-space-2);\n font-size: var(--vectis-text-body-sm-size);\n font-weight: var(--vectis-text-body-sm-weight);\n line-height: var(--vectis-text-body-sm-leading);\n color: var(--vectis-color-text-muted);\n }\n}\n</style>\n"],"mappings":""}