vectis-ui 0.1.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 (676) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE +27 -0
  3. package/README.md +354 -0
  4. package/dist/_virtual/_plugin-vue_export-helper.js +8 -0
  5. package/dist/components/VAccordion/VAccordion.css +2 -0
  6. package/dist/components/VAccordion/VAccordion.d.ts +59 -0
  7. package/dist/components/VAccordion/VAccordion.js +9 -0
  8. package/dist/components/VAccordion/VAccordion.js.map +1 -0
  9. package/dist/components/VAccordion/VAccordion.vue_vue_type_script_setup_true_lang.js +42 -0
  10. package/dist/components/VAccordion/VAccordion.vue_vue_type_script_setup_true_lang.js.map +1 -0
  11. package/dist/components/VAccordion/VAccordionItem.css +2 -0
  12. package/dist/components/VAccordion/VAccordionItem.d.ts +64 -0
  13. package/dist/components/VAccordion/VAccordionItem.js +9 -0
  14. package/dist/components/VAccordion/VAccordionItem.js.map +1 -0
  15. package/dist/components/VAccordion/VAccordionItem.vue_vue_type_script_setup_true_lang.js +70 -0
  16. package/dist/components/VAccordion/VAccordionItem.vue_vue_type_script_setup_true_lang.js.map +1 -0
  17. package/dist/components/VAccordion/context.d.ts +18 -0
  18. package/dist/components/VAccordion/context.js +6 -0
  19. package/dist/components/VAccordion/context.js.map +1 -0
  20. package/dist/components/VAvatar/VAvatar.css +2 -0
  21. package/dist/components/VAvatar/VAvatar.d.ts +68 -0
  22. package/dist/components/VAvatar/VAvatar.js +9 -0
  23. package/dist/components/VAvatar/VAvatar.js.map +1 -0
  24. package/dist/components/VAvatar/VAvatar.vue_vue_type_script_setup_true_lang.js +87 -0
  25. package/dist/components/VAvatar/VAvatar.vue_vue_type_script_setup_true_lang.js.map +1 -0
  26. package/dist/components/VAvatar/VAvatarGroup.css +2 -0
  27. package/dist/components/VAvatar/VAvatarGroup.d.ts +59 -0
  28. package/dist/components/VAvatar/VAvatarGroup.js +9 -0
  29. package/dist/components/VAvatar/VAvatarGroup.js.map +1 -0
  30. package/dist/components/VAvatar/VAvatarGroup.vue_vue_type_script_setup_true_lang.js +43 -0
  31. package/dist/components/VAvatar/VAvatarGroup.vue_vue_type_script_setup_true_lang.js.map +1 -0
  32. package/dist/components/VAvatar/context.d.ts +17 -0
  33. package/dist/components/VAvatar/context.js +6 -0
  34. package/dist/components/VAvatar/context.js.map +1 -0
  35. package/dist/components/VBadge/VBadge.css +2 -0
  36. package/dist/components/VBadge/VBadge.d.ts +74 -0
  37. package/dist/components/VBadge/VBadge.js +9 -0
  38. package/dist/components/VBadge/VBadge.js.map +1 -0
  39. package/dist/components/VBadge/VBadge.vue_vue_type_script_setup_true_lang.js +40 -0
  40. package/dist/components/VBadge/VBadge.vue_vue_type_script_setup_true_lang.js.map +1 -0
  41. package/dist/components/VBreadcrumb/VBreadcrumb.css +2 -0
  42. package/dist/components/VBreadcrumb/VBreadcrumb.d.ts +68 -0
  43. package/dist/components/VBreadcrumb/VBreadcrumb.js +9 -0
  44. package/dist/components/VBreadcrumb/VBreadcrumb.js.map +1 -0
  45. package/dist/components/VBreadcrumb/VBreadcrumb.vue_vue_type_script_setup_true_lang.js +70 -0
  46. package/dist/components/VBreadcrumb/VBreadcrumb.vue_vue_type_script_setup_true_lang.js.map +1 -0
  47. package/dist/components/VButton/VButton.css +2 -0
  48. package/dist/components/VButton/VButton.d.ts +88 -0
  49. package/dist/components/VButton/VButton.js +9 -0
  50. package/dist/components/VButton/VButton.js.map +1 -0
  51. package/dist/components/VButton/VButton.vue_vue_type_script_setup_true_lang.js +86 -0
  52. package/dist/components/VButton/VButton.vue_vue_type_script_setup_true_lang.js.map +1 -0
  53. package/dist/components/VButton/VButtonGroup.css +2 -0
  54. package/dist/components/VButton/VButtonGroup.d.ts +32 -0
  55. package/dist/components/VButton/VButtonGroup.js +9 -0
  56. package/dist/components/VButton/VButtonGroup.js.map +1 -0
  57. package/dist/components/VButton/VButtonGroup.vue_vue_type_script_setup_true_lang.js +17 -0
  58. package/dist/components/VButton/VButtonGroup.vue_vue_type_script_setup_true_lang.js.map +1 -0
  59. package/dist/components/VCalendar/VCalendar.css +2 -0
  60. package/dist/components/VCalendar/VCalendar.d.ts +129 -0
  61. package/dist/components/VCalendar/VCalendar.js +9 -0
  62. package/dist/components/VCalendar/VCalendar.js.map +1 -0
  63. package/dist/components/VCalendar/VCalendar.vue_vue_type_script_setup_true_lang.js +374 -0
  64. package/dist/components/VCalendar/VCalendar.vue_vue_type_script_setup_true_lang.js.map +1 -0
  65. package/dist/components/VCalendar/VCalendarEvent.css +2 -0
  66. package/dist/components/VCalendar/VCalendarEvent.d.ts +71 -0
  67. package/dist/components/VCalendar/VCalendarEvent.js +9 -0
  68. package/dist/components/VCalendar/VCalendarEvent.js.map +1 -0
  69. package/dist/components/VCalendar/VCalendarEvent.vue_vue_type_script_setup_true_lang.js +106 -0
  70. package/dist/components/VCalendar/VCalendarEvent.vue_vue_type_script_setup_true_lang.js.map +1 -0
  71. package/dist/components/VCalendar/VCalendarMonth.css +2 -0
  72. package/dist/components/VCalendar/VCalendarMonth.d.ts +60 -0
  73. package/dist/components/VCalendar/VCalendarMonth.js +9 -0
  74. package/dist/components/VCalendar/VCalendarMonth.js.map +1 -0
  75. package/dist/components/VCalendar/VCalendarMonth.vue_vue_type_script_setup_true_lang.js +342 -0
  76. package/dist/components/VCalendar/VCalendarMonth.vue_vue_type_script_setup_true_lang.js.map +1 -0
  77. package/dist/components/VCalendar/VCalendarTimeGrid.css +2 -0
  78. package/dist/components/VCalendar/VCalendarTimeGrid.d.ts +85 -0
  79. package/dist/components/VCalendar/VCalendarTimeGrid.js +9 -0
  80. package/dist/components/VCalendar/VCalendarTimeGrid.js.map +1 -0
  81. package/dist/components/VCalendar/VCalendarTimeGrid.vue_vue_type_script_setup_true_lang.js +621 -0
  82. package/dist/components/VCalendar/VCalendarTimeGrid.vue_vue_type_script_setup_true_lang.js.map +1 -0
  83. package/dist/components/VCalendar/VCalendarYear.css +2 -0
  84. package/dist/components/VCalendar/VCalendarYear.d.ts +31 -0
  85. package/dist/components/VCalendar/VCalendarYear.js +9 -0
  86. package/dist/components/VCalendar/VCalendarYear.js.map +1 -0
  87. package/dist/components/VCalendar/VCalendarYear.vue_vue_type_script_setup_true_lang.js +76 -0
  88. package/dist/components/VCalendar/VCalendarYear.vue_vue_type_script_setup_true_lang.js.map +1 -0
  89. package/dist/components/VCalendar/color.d.ts +9 -0
  90. package/dist/components/VCalendar/color.js +9 -0
  91. package/dist/components/VCalendar/color.js.map +1 -0
  92. package/dist/components/VCalendar/edgeStep.d.ts +38 -0
  93. package/dist/components/VCalendar/edgeStep.js +28 -0
  94. package/dist/components/VCalendar/edgeStep.js.map +1 -0
  95. package/dist/components/VCalendar/keyboard.d.ts +78 -0
  96. package/dist/components/VCalendar/keyboard.js +86 -0
  97. package/dist/components/VCalendar/keyboard.js.map +1 -0
  98. package/dist/components/VCalendar/layout.d.ts +355 -0
  99. package/dist/components/VCalendar/layout.js +292 -0
  100. package/dist/components/VCalendar/layout.js.map +1 -0
  101. package/dist/components/VCalendar/types.d.ts +78 -0
  102. package/dist/components/VCarousel/VCarousel.css +2 -0
  103. package/dist/components/VCarousel/VCarousel.d.ts +241 -0
  104. package/dist/components/VCarousel/VCarousel.js +9 -0
  105. package/dist/components/VCarousel/VCarousel.js.map +1 -0
  106. package/dist/components/VCarousel/VCarousel.vue_vue_type_script_setup_true_lang.js +262 -0
  107. package/dist/components/VCarousel/VCarousel.vue_vue_type_script_setup_true_lang.js.map +1 -0
  108. package/dist/components/VCarousel/VCarouselItem.d.ts +41 -0
  109. package/dist/components/VCarousel/VCarouselItem.js +7 -0
  110. package/dist/components/VCarousel/VCarouselItem.js.map +1 -0
  111. package/dist/components/VCarousel/VCarouselItem.vue_vue_type_script_setup_true_lang.js +25 -0
  112. package/dist/components/VCarousel/VCarouselItem.vue_vue_type_script_setup_true_lang.js.map +1 -0
  113. package/dist/components/VCarousel/context.d.ts +23 -0
  114. package/dist/components/VCarousel/context.js +6 -0
  115. package/dist/components/VCarousel/context.js.map +1 -0
  116. package/dist/components/VCheckbox/VCheckbox.css +2 -0
  117. package/dist/components/VCheckbox/VCheckbox.d.ts +63 -0
  118. package/dist/components/VCheckbox/VCheckbox.js +9 -0
  119. package/dist/components/VCheckbox/VCheckbox.js.map +1 -0
  120. package/dist/components/VCheckbox/VCheckbox.vue_vue_type_script_setup_true_lang.js +83 -0
  121. package/dist/components/VCheckbox/VCheckbox.vue_vue_type_script_setup_true_lang.js.map +1 -0
  122. package/dist/components/VChip/VChip.css +2 -0
  123. package/dist/components/VChip/VChip.d.ts +120 -0
  124. package/dist/components/VChip/VChip.js +9 -0
  125. package/dist/components/VChip/VChip.js.map +1 -0
  126. package/dist/components/VChip/VChip.vue_vue_type_script_setup_true_lang.js +118 -0
  127. package/dist/components/VChip/VChip.vue_vue_type_script_setup_true_lang.js.map +1 -0
  128. package/dist/components/VCombobox/VCombobox.css +2 -0
  129. package/dist/components/VCombobox/VCombobox.d.ts +183 -0
  130. package/dist/components/VCombobox/VCombobox.js +9 -0
  131. package/dist/components/VCombobox/VCombobox.js.map +1 -0
  132. package/dist/components/VCombobox/VCombobox.vue_vue_type_script_setup_true_lang.js +428 -0
  133. package/dist/components/VCombobox/VCombobox.vue_vue_type_script_setup_true_lang.js.map +1 -0
  134. package/dist/components/VCombobox/VComboboxGroup.css +2 -0
  135. package/dist/components/VCombobox/VComboboxGroup.d.ts +26 -0
  136. package/dist/components/VCombobox/VComboboxGroup.js +9 -0
  137. package/dist/components/VCombobox/VComboboxGroup.js.map +1 -0
  138. package/dist/components/VCombobox/VComboboxGroup.vue_vue_type_script_setup_true_lang.js +21 -0
  139. package/dist/components/VCombobox/VComboboxGroup.vue_vue_type_script_setup_true_lang.js.map +1 -0
  140. package/dist/components/VCombobox/VComboboxOption.css +2 -0
  141. package/dist/components/VCombobox/VComboboxOption.d.ts +48 -0
  142. package/dist/components/VCombobox/VComboboxOption.js +9 -0
  143. package/dist/components/VCombobox/VComboboxOption.js.map +1 -0
  144. package/dist/components/VCombobox/VComboboxOption.vue_vue_type_script_setup_true_lang.js +56 -0
  145. package/dist/components/VCombobox/VComboboxOption.vue_vue_type_script_setup_true_lang.js.map +1 -0
  146. package/dist/components/VCombobox/VComboboxSeparator.css +2 -0
  147. package/dist/components/VCombobox/VComboboxSeparator.d.ts +3 -0
  148. package/dist/components/VCombobox/VComboboxSeparator.js +9 -0
  149. package/dist/components/VCombobox/VComboboxSeparator.js.map +1 -0
  150. package/dist/components/VCombobox/VComboboxSeparator.vue_vue_type_script_setup_true_lang.js +16 -0
  151. package/dist/components/VCombobox/VComboboxSeparator.vue_vue_type_script_setup_true_lang.js.map +1 -0
  152. package/dist/components/VCombobox/infiniteScroll.d.ts +22 -0
  153. package/dist/components/VCombobox/infiniteScroll.js +28 -0
  154. package/dist/components/VCombobox/infiniteScroll.js.map +1 -0
  155. package/dist/components/VDataTable/VDataTable.css +2 -0
  156. package/dist/components/VDataTable/VDataTable.d.ts +214 -0
  157. package/dist/components/VDataTable/VDataTable.js +9 -0
  158. package/dist/components/VDataTable/VDataTable.js.map +1 -0
  159. package/dist/components/VDataTable/VDataTable.vue_vue_type_script_setup_true_lang.js +396 -0
  160. package/dist/components/VDataTable/VDataTable.vue_vue_type_script_setup_true_lang.js.map +1 -0
  161. package/dist/components/VDateInput/VDateInput.css +2 -0
  162. package/dist/components/VDateInput/VDateInput.d.ts +152 -0
  163. package/dist/components/VDateInput/VDateInput.js +9 -0
  164. package/dist/components/VDateInput/VDateInput.js.map +1 -0
  165. package/dist/components/VDateInput/VDateInput.vue_vue_type_script_setup_true_lang.js +324 -0
  166. package/dist/components/VDateInput/VDateInput.vue_vue_type_script_setup_true_lang.js.map +1 -0
  167. package/dist/components/VDatePicker/VDatePicker.css +2 -0
  168. package/dist/components/VDatePicker/VDatePicker.d.ts +143 -0
  169. package/dist/components/VDatePicker/VDatePicker.js +9 -0
  170. package/dist/components/VDatePicker/VDatePicker.js.map +1 -0
  171. package/dist/components/VDatePicker/VDatePicker.vue_vue_type_script_setup_true_lang.js +454 -0
  172. package/dist/components/VDatePicker/VDatePicker.vue_vue_type_script_setup_true_lang.js.map +1 -0
  173. package/dist/components/VDatePicker/keyboard.d.ts +56 -0
  174. package/dist/components/VDatePicker/keyboard.js +26 -0
  175. package/dist/components/VDatePicker/keyboard.js.map +1 -0
  176. package/dist/components/VDialog/VDialog.css +2 -0
  177. package/dist/components/VDialog/VDialog.d.ts +96 -0
  178. package/dist/components/VDialog/VDialog.js +9 -0
  179. package/dist/components/VDialog/VDialog.js.map +1 -0
  180. package/dist/components/VDialog/VDialog.vue_vue_type_script_setup_true_lang.js +134 -0
  181. package/dist/components/VDialog/VDialog.vue_vue_type_script_setup_true_lang.js.map +1 -0
  182. package/dist/components/VDialog/VDialogAlert.d.ts +67 -0
  183. package/dist/components/VDialog/VDialogAlert.js +7 -0
  184. package/dist/components/VDialog/VDialogAlert.js.map +1 -0
  185. package/dist/components/VDialog/VDialogAlert.vue_vue_type_script_setup_true_lang.js +60 -0
  186. package/dist/components/VDialog/VDialogAlert.vue_vue_type_script_setup_true_lang.js.map +1 -0
  187. package/dist/components/VFileInput/VFileInput.css +2 -0
  188. package/dist/components/VFileInput/VFileInput.d.ts +156 -0
  189. package/dist/components/VFileInput/VFileInput.js +9 -0
  190. package/dist/components/VFileInput/VFileInput.js.map +1 -0
  191. package/dist/components/VFileInput/VFileInput.vue_vue_type_script_setup_true_lang.js +244 -0
  192. package/dist/components/VFileInput/VFileInput.vue_vue_type_script_setup_true_lang.js.map +1 -0
  193. package/dist/components/VFileInput/truncate.d.ts +29 -0
  194. package/dist/components/VFileInput/truncate.js +10 -0
  195. package/dist/components/VFileInput/truncate.js.map +1 -0
  196. package/dist/components/VFilePicker/VFilePicker.css +2 -0
  197. package/dist/components/VFilePicker/VFilePicker.d.ts +203 -0
  198. package/dist/components/VFilePicker/VFilePicker.js +9 -0
  199. package/dist/components/VFilePicker/VFilePicker.js.map +1 -0
  200. package/dist/components/VFilePicker/VFilePicker.vue_vue_type_script_setup_true_lang.js +266 -0
  201. package/dist/components/VFilePicker/VFilePicker.vue_vue_type_script_setup_true_lang.js.map +1 -0
  202. package/dist/components/VFilePicker/fileKind.d.ts +29 -0
  203. package/dist/components/VFilePicker/fileKind.js +91 -0
  204. package/dist/components/VFilePicker/fileKind.js.map +1 -0
  205. package/dist/components/VHotkeys/VHotkeys.css +2 -0
  206. package/dist/components/VHotkeys/VHotkeys.d.ts +100 -0
  207. package/dist/components/VHotkeys/VHotkeys.js +9 -0
  208. package/dist/components/VHotkeys/VHotkeys.js.map +1 -0
  209. package/dist/components/VHotkeys/VHotkeys.vue_vue_type_script_setup_true_lang.js +76 -0
  210. package/dist/components/VHotkeys/VHotkeys.vue_vue_type_script_setup_true_lang.js.map +1 -0
  211. package/dist/components/VHotkeys/platform.d.ts +82 -0
  212. package/dist/components/VHotkeys/platform.js +115 -0
  213. package/dist/components/VHotkeys/platform.js.map +1 -0
  214. package/dist/components/VIcon/VIcon.css +2 -0
  215. package/dist/components/VIcon/VIcon.d.ts +57 -0
  216. package/dist/components/VIcon/VIcon.js +9 -0
  217. package/dist/components/VIcon/VIcon.js.map +1 -0
  218. package/dist/components/VIcon/VIcon.vue_vue_type_script_setup_true_lang.js +99 -0
  219. package/dist/components/VIcon/VIcon.vue_vue_type_script_setup_true_lang.js.map +1 -0
  220. package/dist/components/VIcon/iconProps.d.ts +30 -0
  221. package/dist/components/VIcon/iconProps.js +6 -0
  222. package/dist/components/VIcon/iconProps.js.map +1 -0
  223. package/dist/components/VIcon/icons/arrow_downward.d.ts +5 -0
  224. package/dist/components/VIcon/icons/arrow_downward.js +9 -0
  225. package/dist/components/VIcon/icons/arrow_downward.js.map +1 -0
  226. package/dist/components/VIcon/icons/arrow_downward_alt.d.ts +5 -0
  227. package/dist/components/VIcon/icons/arrow_downward_alt.js +9 -0
  228. package/dist/components/VIcon/icons/arrow_downward_alt.js.map +1 -0
  229. package/dist/components/VIcon/icons/arrow_drop_down.d.ts +5 -0
  230. package/dist/components/VIcon/icons/arrow_drop_down.js +9 -0
  231. package/dist/components/VIcon/icons/arrow_drop_down.js.map +1 -0
  232. package/dist/components/VIcon/icons/arrow_drop_up.d.ts +5 -0
  233. package/dist/components/VIcon/icons/arrow_drop_up.js +9 -0
  234. package/dist/components/VIcon/icons/arrow_drop_up.js.map +1 -0
  235. package/dist/components/VIcon/icons/arrow_left_alt.d.ts +5 -0
  236. package/dist/components/VIcon/icons/arrow_left_alt.js +9 -0
  237. package/dist/components/VIcon/icons/arrow_left_alt.js.map +1 -0
  238. package/dist/components/VIcon/icons/arrow_right_alt.d.ts +5 -0
  239. package/dist/components/VIcon/icons/arrow_right_alt.js +9 -0
  240. package/dist/components/VIcon/icons/arrow_right_alt.js.map +1 -0
  241. package/dist/components/VIcon/icons/arrow_upward.d.ts +5 -0
  242. package/dist/components/VIcon/icons/arrow_upward.js +9 -0
  243. package/dist/components/VIcon/icons/arrow_upward.js.map +1 -0
  244. package/dist/components/VIcon/icons/arrow_upward_alt.d.ts +5 -0
  245. package/dist/components/VIcon/icons/arrow_upward_alt.js +9 -0
  246. package/dist/components/VIcon/icons/arrow_upward_alt.js.map +1 -0
  247. package/dist/components/VIcon/icons/attach_file.d.ts +5 -0
  248. package/dist/components/VIcon/icons/attach_file.js +9 -0
  249. package/dist/components/VIcon/icons/attach_file.js.map +1 -0
  250. package/dist/components/VIcon/icons/audio_file.d.ts +5 -0
  251. package/dist/components/VIcon/icons/audio_file.js +9 -0
  252. package/dist/components/VIcon/icons/audio_file.js.map +1 -0
  253. package/dist/components/VIcon/icons/calendar_today.d.ts +5 -0
  254. package/dist/components/VIcon/icons/calendar_today.js +9 -0
  255. package/dist/components/VIcon/icons/calendar_today.js.map +1 -0
  256. package/dist/components/VIcon/icons/check.d.ts +5 -0
  257. package/dist/components/VIcon/icons/check.js +9 -0
  258. package/dist/components/VIcon/icons/check.js.map +1 -0
  259. package/dist/components/VIcon/icons/check_circle.d.ts +5 -0
  260. package/dist/components/VIcon/icons/check_circle.js +9 -0
  261. package/dist/components/VIcon/icons/check_circle.js.map +1 -0
  262. package/dist/components/VIcon/icons/chevron_left.d.ts +5 -0
  263. package/dist/components/VIcon/icons/chevron_left.js +9 -0
  264. package/dist/components/VIcon/icons/chevron_left.js.map +1 -0
  265. package/dist/components/VIcon/icons/chevron_right.d.ts +5 -0
  266. package/dist/components/VIcon/icons/chevron_right.js +9 -0
  267. package/dist/components/VIcon/icons/chevron_right.js.map +1 -0
  268. package/dist/components/VIcon/icons/close.d.ts +5 -0
  269. package/dist/components/VIcon/icons/close.js +9 -0
  270. package/dist/components/VIcon/icons/close.js.map +1 -0
  271. package/dist/components/VIcon/icons/cloud_upload.d.ts +5 -0
  272. package/dist/components/VIcon/icons/cloud_upload.js +9 -0
  273. package/dist/components/VIcon/icons/cloud_upload.js.map +1 -0
  274. package/dist/components/VIcon/icons/code.d.ts +5 -0
  275. package/dist/components/VIcon/icons/code.js +9 -0
  276. package/dist/components/VIcon/icons/code.js.map +1 -0
  277. package/dist/components/VIcon/icons/description.d.ts +5 -0
  278. package/dist/components/VIcon/icons/description.js +9 -0
  279. package/dist/components/VIcon/icons/description.js.map +1 -0
  280. package/dist/components/VIcon/icons/error.d.ts +5 -0
  281. package/dist/components/VIcon/icons/error.js +9 -0
  282. package/dist/components/VIcon/icons/error.js.map +1 -0
  283. package/dist/components/VIcon/icons/expand_less.d.ts +5 -0
  284. package/dist/components/VIcon/icons/expand_less.js +9 -0
  285. package/dist/components/VIcon/icons/expand_less.js.map +1 -0
  286. package/dist/components/VIcon/icons/expand_more.d.ts +5 -0
  287. package/dist/components/VIcon/icons/expand_more.js +9 -0
  288. package/dist/components/VIcon/icons/expand_more.js.map +1 -0
  289. package/dist/components/VIcon/icons/folder_zip.d.ts +5 -0
  290. package/dist/components/VIcon/icons/folder_zip.js +9 -0
  291. package/dist/components/VIcon/icons/folder_zip.js.map +1 -0
  292. package/dist/components/VIcon/icons/image.d.ts +5 -0
  293. package/dist/components/VIcon/icons/image.js +9 -0
  294. package/dist/components/VIcon/icons/image.js.map +1 -0
  295. package/dist/components/VIcon/icons/index.d.ts +183 -0
  296. package/dist/components/VIcon/icons/index.js +77 -0
  297. package/dist/components/VIcon/icons/index.js.map +1 -0
  298. package/dist/components/VIcon/icons/info.d.ts +5 -0
  299. package/dist/components/VIcon/icons/info.js +9 -0
  300. package/dist/components/VIcon/icons/info.js.map +1 -0
  301. package/dist/components/VIcon/icons/more_horiz.d.ts +5 -0
  302. package/dist/components/VIcon/icons/more_horiz.js +9 -0
  303. package/dist/components/VIcon/icons/more_horiz.js.map +1 -0
  304. package/dist/components/VIcon/icons/names.d.ts +11 -0
  305. package/dist/components/VIcon/icons/names.js +5 -0
  306. package/dist/components/VIcon/icons/names.js.map +1 -0
  307. package/dist/components/VIcon/icons/notifications.d.ts +5 -0
  308. package/dist/components/VIcon/icons/notifications.js +9 -0
  309. package/dist/components/VIcon/icons/notifications.js.map +1 -0
  310. package/dist/components/VIcon/icons/picture_as_pdf.d.ts +5 -0
  311. package/dist/components/VIcon/icons/picture_as_pdf.js +9 -0
  312. package/dist/components/VIcon/icons/picture_as_pdf.js.map +1 -0
  313. package/dist/components/VIcon/icons/schedule.d.ts +5 -0
  314. package/dist/components/VIcon/icons/schedule.js +9 -0
  315. package/dist/components/VIcon/icons/schedule.js.map +1 -0
  316. package/dist/components/VIcon/icons/search.d.ts +5 -0
  317. package/dist/components/VIcon/icons/search.js +9 -0
  318. package/dist/components/VIcon/icons/search.js.map +1 -0
  319. package/dist/components/VIcon/icons/swap_vert.d.ts +5 -0
  320. package/dist/components/VIcon/icons/swap_vert.js +9 -0
  321. package/dist/components/VIcon/icons/swap_vert.js.map +1 -0
  322. package/dist/components/VIcon/icons/table_chart.d.ts +5 -0
  323. package/dist/components/VIcon/icons/table_chart.js +9 -0
  324. package/dist/components/VIcon/icons/table_chart.js.map +1 -0
  325. package/dist/components/VIcon/icons/video_file.d.ts +5 -0
  326. package/dist/components/VIcon/icons/video_file.js +9 -0
  327. package/dist/components/VIcon/icons/video_file.js.map +1 -0
  328. package/dist/components/VIcon/icons/viewBox.d.ts +6 -0
  329. package/dist/components/VIcon/icons/viewBox.js +6 -0
  330. package/dist/components/VIcon/icons/viewBox.js.map +1 -0
  331. package/dist/components/VIcon/icons/warning.d.ts +5 -0
  332. package/dist/components/VIcon/icons/warning.js +9 -0
  333. package/dist/components/VIcon/icons/warning.js.map +1 -0
  334. package/dist/components/VIcon/resolver.d.ts +76 -0
  335. package/dist/components/VIcon/resolver.js +35 -0
  336. package/dist/components/VIcon/resolver.js.map +1 -0
  337. package/dist/components/VIcon/types.d.ts +77 -0
  338. package/dist/components/VIconButton/VIconButton.css +2 -0
  339. package/dist/components/VIconButton/VIconButton.d.ts +66 -0
  340. package/dist/components/VIconButton/VIconButton.js +9 -0
  341. package/dist/components/VIconButton/VIconButton.js.map +1 -0
  342. package/dist/components/VIconButton/VIconButton.vue_vue_type_script_setup_true_lang.js +70 -0
  343. package/dist/components/VIconButton/VIconButton.vue_vue_type_script_setup_true_lang.js.map +1 -0
  344. package/dist/components/VInput/VInput.css +2 -0
  345. package/dist/components/VInput/VInput.d.ts +152 -0
  346. package/dist/components/VInput/VInput.js +9 -0
  347. package/dist/components/VInput/VInput.js.map +1 -0
  348. package/dist/components/VInput/VInput.vue_vue_type_script_setup_true_lang.js +185 -0
  349. package/dist/components/VInput/VInput.vue_vue_type_script_setup_true_lang.js.map +1 -0
  350. package/dist/components/VInputOTP/VInputOTP.css +2 -0
  351. package/dist/components/VInputOTP/VInputOTP.d.ts +76 -0
  352. package/dist/components/VInputOTP/VInputOTP.js +9 -0
  353. package/dist/components/VInputOTP/VInputOTP.js.map +1 -0
  354. package/dist/components/VInputOTP/VInputOTP.vue_vue_type_script_setup_true_lang.js +149 -0
  355. package/dist/components/VInputOTP/VInputOTP.vue_vue_type_script_setup_true_lang.js.map +1 -0
  356. package/dist/components/VMenu/VMenu.d.ts +91 -0
  357. package/dist/components/VMenu/VMenu.js +7 -0
  358. package/dist/components/VMenu/VMenu.js.map +1 -0
  359. package/dist/components/VMenu/VMenu.vue_vue_type_script_setup_true_lang.js +73 -0
  360. package/dist/components/VMenu/VMenu.vue_vue_type_script_setup_true_lang.js.map +1 -0
  361. package/dist/components/VMenu/VMenuGroup.css +2 -0
  362. package/dist/components/VMenu/VMenuGroup.d.ts +22 -0
  363. package/dist/components/VMenu/VMenuGroup.js +9 -0
  364. package/dist/components/VMenu/VMenuGroup.js.map +1 -0
  365. package/dist/components/VMenu/VMenuGroup.vue_vue_type_script_setup_true_lang.js +21 -0
  366. package/dist/components/VMenu/VMenuGroup.vue_vue_type_script_setup_true_lang.js.map +1 -0
  367. package/dist/components/VMenu/VMenuItem.css +2 -0
  368. package/dist/components/VMenu/VMenuItem.d.ts +85 -0
  369. package/dist/components/VMenu/VMenuItem.js +9 -0
  370. package/dist/components/VMenu/VMenuItem.js.map +1 -0
  371. package/dist/components/VMenu/VMenuItem.vue_vue_type_script_setup_true_lang.js +121 -0
  372. package/dist/components/VMenu/VMenuItem.vue_vue_type_script_setup_true_lang.js.map +1 -0
  373. package/dist/components/VMenu/VMenuPanel.css +2 -0
  374. package/dist/components/VMenu/VMenuPanel.d.ts +91 -0
  375. package/dist/components/VMenu/VMenuPanel.js +9 -0
  376. package/dist/components/VMenu/VMenuPanel.js.map +1 -0
  377. package/dist/components/VMenu/VMenuPanel.vue_vue_type_script_setup_true_lang.js +103 -0
  378. package/dist/components/VMenu/VMenuPanel.vue_vue_type_script_setup_true_lang.js.map +1 -0
  379. package/dist/components/VMenu/VMenuSeparator.css +2 -0
  380. package/dist/components/VMenu/VMenuSeparator.d.ts +3 -0
  381. package/dist/components/VMenu/VMenuSeparator.js +9 -0
  382. package/dist/components/VMenu/VMenuSeparator.js.map +1 -0
  383. package/dist/components/VMenu/VMenuSeparator.vue_vue_type_script_setup_true_lang.js +13 -0
  384. package/dist/components/VMenu/VMenuSeparator.vue_vue_type_script_setup_true_lang.js.map +1 -0
  385. package/dist/components/VMenu/context.d.ts +33 -0
  386. package/dist/components/VMenu/context.js +9 -0
  387. package/dist/components/VMenu/context.js.map +1 -0
  388. package/dist/components/VPagination/VPagination.css +2 -0
  389. package/dist/components/VPagination/VPagination.d.ts +103 -0
  390. package/dist/components/VPagination/VPagination.js +9 -0
  391. package/dist/components/VPagination/VPagination.js.map +1 -0
  392. package/dist/components/VPagination/VPagination.vue_vue_type_script_setup_true_lang.js +270 -0
  393. package/dist/components/VPagination/VPagination.vue_vue_type_script_setup_true_lang.js.map +1 -0
  394. package/dist/components/VPopover/VPopover.css +2 -0
  395. package/dist/components/VPopover/VPopover.d.ts +82 -0
  396. package/dist/components/VPopover/VPopover.js +9 -0
  397. package/dist/components/VPopover/VPopover.js.map +1 -0
  398. package/dist/components/VPopover/VPopover.vue_vue_type_script_setup_true_lang.js +65 -0
  399. package/dist/components/VPopover/VPopover.vue_vue_type_script_setup_true_lang.js.map +1 -0
  400. package/dist/components/VProgressCircular/VProgressCircular.css +2 -0
  401. package/dist/components/VProgressCircular/VProgressCircular.d.ts +60 -0
  402. package/dist/components/VProgressCircular/VProgressCircular.js +9 -0
  403. package/dist/components/VProgressCircular/VProgressCircular.js.map +1 -0
  404. package/dist/components/VProgressCircular/VProgressCircular.vue_vue_type_script_setup_true_lang.js +74 -0
  405. package/dist/components/VProgressCircular/VProgressCircular.vue_vue_type_script_setup_true_lang.js.map +1 -0
  406. package/dist/components/VProgressLinear/VProgressLinear.css +2 -0
  407. package/dist/components/VProgressLinear/VProgressLinear.d.ts +74 -0
  408. package/dist/components/VProgressLinear/VProgressLinear.js +9 -0
  409. package/dist/components/VProgressLinear/VProgressLinear.js.map +1 -0
  410. package/dist/components/VProgressLinear/VProgressLinear.vue_vue_type_script_setup_true_lang.js +74 -0
  411. package/dist/components/VProgressLinear/VProgressLinear.vue_vue_type_script_setup_true_lang.js.map +1 -0
  412. package/dist/components/VRadio/VRadio.css +2 -0
  413. package/dist/components/VRadio/VRadio.d.ts +58 -0
  414. package/dist/components/VRadio/VRadio.js +9 -0
  415. package/dist/components/VRadio/VRadio.js.map +1 -0
  416. package/dist/components/VRadio/VRadio.vue_vue_type_script_setup_true_lang.js +60 -0
  417. package/dist/components/VRadio/VRadio.vue_vue_type_script_setup_true_lang.js.map +1 -0
  418. package/dist/components/VSeparator/VSeparator.css +2 -0
  419. package/dist/components/VSeparator/VSeparator.d.ts +23 -0
  420. package/dist/components/VSeparator/VSeparator.js +9 -0
  421. package/dist/components/VSeparator/VSeparator.js.map +1 -0
  422. package/dist/components/VSeparator/VSeparator.vue_vue_type_script_setup_true_lang.js +17 -0
  423. package/dist/components/VSeparator/VSeparator.vue_vue_type_script_setup_true_lang.js.map +1 -0
  424. package/dist/components/VSideNavigation/VSideNavigation.css +2 -0
  425. package/dist/components/VSideNavigation/VSideNavigation.d.ts +64 -0
  426. package/dist/components/VSideNavigation/VSideNavigation.js +9 -0
  427. package/dist/components/VSideNavigation/VSideNavigation.js.map +1 -0
  428. package/dist/components/VSideNavigation/VSideNavigation.vue_vue_type_script_setup_true_lang.js +67 -0
  429. package/dist/components/VSideNavigation/VSideNavigation.vue_vue_type_script_setup_true_lang.js.map +1 -0
  430. package/dist/components/VSideNavigation/VSideNavigationGroup.css +2 -0
  431. package/dist/components/VSideNavigation/VSideNavigationGroup.d.ts +33 -0
  432. package/dist/components/VSideNavigation/VSideNavigationGroup.js +9 -0
  433. package/dist/components/VSideNavigation/VSideNavigationGroup.js.map +1 -0
  434. package/dist/components/VSideNavigation/VSideNavigationGroup.vue_vue_type_script_setup_true_lang.js +20 -0
  435. package/dist/components/VSideNavigation/VSideNavigationGroup.vue_vue_type_script_setup_true_lang.js.map +1 -0
  436. package/dist/components/VSideNavigation/VSideNavigationItem.css +2 -0
  437. package/dist/components/VSideNavigation/VSideNavigationItem.d.ts +103 -0
  438. package/dist/components/VSideNavigation/VSideNavigationItem.js +9 -0
  439. package/dist/components/VSideNavigation/VSideNavigationItem.js.map +1 -0
  440. package/dist/components/VSideNavigation/VSideNavigationItem.vue_vue_type_script_setup_true_lang.js +154 -0
  441. package/dist/components/VSideNavigation/VSideNavigationItem.vue_vue_type_script_setup_true_lang.js.map +1 -0
  442. package/dist/components/VSideNavigation/VSideNavigationSeparator.css +2 -0
  443. package/dist/components/VSideNavigation/VSideNavigationSeparator.d.ts +3 -0
  444. package/dist/components/VSideNavigation/VSideNavigationSeparator.js +17 -0
  445. package/dist/components/VSideNavigation/VSideNavigationSeparator.js.map +1 -0
  446. package/dist/components/VSideNavigation/context.d.ts +37 -0
  447. package/dist/components/VSideNavigation/context.js +6 -0
  448. package/dist/components/VSideNavigation/context.js.map +1 -0
  449. package/dist/components/VSkeletonLoader/VSkeletonLoader.css +2 -0
  450. package/dist/components/VSkeletonLoader/VSkeletonLoader.d.ts +75 -0
  451. package/dist/components/VSkeletonLoader/VSkeletonLoader.js +9 -0
  452. package/dist/components/VSkeletonLoader/VSkeletonLoader.js.map +1 -0
  453. package/dist/components/VSkeletonLoader/VSkeletonLoader.vue_vue_type_script_setup_true_lang.js +61 -0
  454. package/dist/components/VSkeletonLoader/VSkeletonLoader.vue_vue_type_script_setup_true_lang.js.map +1 -0
  455. package/dist/components/VSlider/VSlider.css +2 -0
  456. package/dist/components/VSlider/VSlider.d.ts +82 -0
  457. package/dist/components/VSlider/VSlider.js +9 -0
  458. package/dist/components/VSlider/VSlider.js.map +1 -0
  459. package/dist/components/VSlider/VSlider.vue_vue_type_script_setup_true_lang.js +220 -0
  460. package/dist/components/VSlider/VSlider.vue_vue_type_script_setup_true_lang.js.map +1 -0
  461. package/dist/components/VSnackbar/VSnackbar.css +2 -0
  462. package/dist/components/VSnackbar/VSnackbar.d.ts +51 -0
  463. package/dist/components/VSnackbar/VSnackbar.js +9 -0
  464. package/dist/components/VSnackbar/VSnackbar.js.map +1 -0
  465. package/dist/components/VSnackbar/VSnackbar.vue_vue_type_script_setup_true_lang.js +83 -0
  466. package/dist/components/VSnackbar/VSnackbar.vue_vue_type_script_setup_true_lang.js.map +1 -0
  467. package/dist/components/VSnackbar/state.d.ts +92 -0
  468. package/dist/components/VSnackbar/state.js +18 -0
  469. package/dist/components/VSnackbar/state.js.map +1 -0
  470. package/dist/components/VSpinner/VSpinner.css +2 -0
  471. package/dist/components/VSpinner/VSpinner.d.ts +21 -0
  472. package/dist/components/VSpinner/VSpinner.js +9 -0
  473. package/dist/components/VSpinner/VSpinner.js.map +1 -0
  474. package/dist/components/VSpinner/VSpinner.vue_vue_type_script_setup_true_lang.js +25 -0
  475. package/dist/components/VSpinner/VSpinner.vue_vue_type_script_setup_true_lang.js.map +1 -0
  476. package/dist/components/VSwitch/VSwitch.css +2 -0
  477. package/dist/components/VSwitch/VSwitch.d.ts +46 -0
  478. package/dist/components/VSwitch/VSwitch.js +9 -0
  479. package/dist/components/VSwitch/VSwitch.js.map +1 -0
  480. package/dist/components/VSwitch/VSwitch.vue_vue_type_script_setup_true_lang.js +51 -0
  481. package/dist/components/VSwitch/VSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -0
  482. package/dist/components/VTabs/VTab.css +2 -0
  483. package/dist/components/VTabs/VTab.d.ts +42 -0
  484. package/dist/components/VTabs/VTab.js +9 -0
  485. package/dist/components/VTabs/VTab.js.map +1 -0
  486. package/dist/components/VTabs/VTab.vue_vue_type_script_setup_true_lang.js +66 -0
  487. package/dist/components/VTabs/VTab.vue_vue_type_script_setup_true_lang.js.map +1 -0
  488. package/dist/components/VTabs/VTabPanel.css +2 -0
  489. package/dist/components/VTabs/VTabPanel.d.ts +34 -0
  490. package/dist/components/VTabs/VTabPanel.js +9 -0
  491. package/dist/components/VTabs/VTabPanel.js.map +1 -0
  492. package/dist/components/VTabs/VTabPanel.vue_vue_type_script_setup_true_lang.js +34 -0
  493. package/dist/components/VTabs/VTabPanel.vue_vue_type_script_setup_true_lang.js.map +1 -0
  494. package/dist/components/VTabs/VTabs.css +2 -0
  495. package/dist/components/VTabs/VTabs.d.ts +107 -0
  496. package/dist/components/VTabs/VTabs.js +9 -0
  497. package/dist/components/VTabs/VTabs.js.map +1 -0
  498. package/dist/components/VTabs/VTabs.vue_vue_type_script_setup_true_lang.js +199 -0
  499. package/dist/components/VTabs/VTabs.vue_vue_type_script_setup_true_lang.js.map +1 -0
  500. package/dist/components/VTabs/context.d.ts +43 -0
  501. package/dist/components/VTabs/context.js +6 -0
  502. package/dist/components/VTabs/context.js.map +1 -0
  503. package/dist/components/VTextarea/VTextarea.css +2 -0
  504. package/dist/components/VTextarea/VTextarea.d.ts +140 -0
  505. package/dist/components/VTextarea/VTextarea.js +9 -0
  506. package/dist/components/VTextarea/VTextarea.js.map +1 -0
  507. package/dist/components/VTextarea/VTextarea.vue_vue_type_script_setup_true_lang.js +187 -0
  508. package/dist/components/VTextarea/VTextarea.vue_vue_type_script_setup_true_lang.js.map +1 -0
  509. package/dist/components/VTimeInput/VTimeInput.css +2 -0
  510. package/dist/components/VTimeInput/VTimeInput.d.ts +112 -0
  511. package/dist/components/VTimeInput/VTimeInput.js +9 -0
  512. package/dist/components/VTimeInput/VTimeInput.js.map +1 -0
  513. package/dist/components/VTimeInput/VTimeInput.vue_vue_type_script_setup_true_lang.js +385 -0
  514. package/dist/components/VTimeInput/VTimeInput.vue_vue_type_script_setup_true_lang.js.map +1 -0
  515. package/dist/components/VTimePicker/VTimePicker.css +2 -0
  516. package/dist/components/VTimePicker/VTimePicker.d.ts +89 -0
  517. package/dist/components/VTimePicker/VTimePicker.js +9 -0
  518. package/dist/components/VTimePicker/VTimePicker.js.map +1 -0
  519. package/dist/components/VTimePicker/VTimePicker.vue_vue_type_script_setup_true_lang.js +257 -0
  520. package/dist/components/VTimePicker/VTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -0
  521. package/dist/components/VToast/VToast.css +2 -0
  522. package/dist/components/VToast/VToast.d.ts +24 -0
  523. package/dist/components/VToast/VToast.js +9 -0
  524. package/dist/components/VToast/VToast.js.map +1 -0
  525. package/dist/components/VToast/VToast.vue_vue_type_script_setup_true_lang.js +62 -0
  526. package/dist/components/VToast/VToast.vue_vue_type_script_setup_true_lang.js.map +1 -0
  527. package/dist/components/VToast/VToaster.css +2 -0
  528. package/dist/components/VToast/VToaster.d.ts +42 -0
  529. package/dist/components/VToast/VToaster.js +9 -0
  530. package/dist/components/VToast/VToaster.js.map +1 -0
  531. package/dist/components/VToast/VToaster.vue_vue_type_script_setup_true_lang.js +112 -0
  532. package/dist/components/VToast/VToaster.vue_vue_type_script_setup_true_lang.js.map +1 -0
  533. package/dist/components/VToast/state.d.ts +74 -0
  534. package/dist/components/VToast/state.js +25 -0
  535. package/dist/components/VToast/state.js.map +1 -0
  536. package/dist/components/VToggle/VToggle.css +2 -0
  537. package/dist/components/VToggle/VToggle.d.ts +84 -0
  538. package/dist/components/VToggle/VToggle.js +9 -0
  539. package/dist/components/VToggle/VToggle.js.map +1 -0
  540. package/dist/components/VToggle/VToggle.vue_vue_type_script_setup_true_lang.js +103 -0
  541. package/dist/components/VToggle/VToggle.vue_vue_type_script_setup_true_lang.js.map +1 -0
  542. package/dist/components/VToggle/VToggleItem.css +2 -0
  543. package/dist/components/VToggle/VToggleItem.d.ts +35 -0
  544. package/dist/components/VToggle/VToggleItem.js +9 -0
  545. package/dist/components/VToggle/VToggleItem.js.map +1 -0
  546. package/dist/components/VToggle/VToggleItem.vue_vue_type_script_setup_true_lang.js +51 -0
  547. package/dist/components/VToggle/VToggleItem.vue_vue_type_script_setup_true_lang.js.map +1 -0
  548. package/dist/components/VToggle/context.d.ts +37 -0
  549. package/dist/components/VToggle/context.js +6 -0
  550. package/dist/components/VToggle/context.js.map +1 -0
  551. package/dist/components/VTooltip/VTooltip.css +2 -0
  552. package/dist/components/VTooltip/VTooltip.d.ts +76 -0
  553. package/dist/components/VTooltip/VTooltip.js +9 -0
  554. package/dist/components/VTooltip/VTooltip.js.map +1 -0
  555. package/dist/components/VTooltip/VTooltip.vue_vue_type_script_setup_true_lang.js +50 -0
  556. package/dist/components/VTooltip/VTooltip.vue_vue_type_script_setup_true_lang.js.map +1 -0
  557. package/dist/components/VTypography/VTypography.css +2 -0
  558. package/dist/components/VTypography/VTypography.d.ts +46 -0
  559. package/dist/components/VTypography/VTypography.js +9 -0
  560. package/dist/components/VTypography/VTypography.js.map +1 -0
  561. package/dist/components/VTypography/VTypography.vue_vue_type_script_setup_true_lang.js +49 -0
  562. package/dist/components/VTypography/VTypography.vue_vue_type_script_setup_true_lang.js.map +1 -0
  563. package/dist/composables/useAriaLabel.d.ts +19 -0
  564. package/dist/composables/useAriaLabel.js +10 -0
  565. package/dist/composables/useAriaLabel.js.map +1 -0
  566. package/dist/composables/useFieldIds.d.ts +21 -0
  567. package/dist/composables/useFieldIds.js +14 -0
  568. package/dist/composables/useFieldIds.js.map +1 -0
  569. package/dist/composables/useFieldPanel.d.ts +61 -0
  570. package/dist/composables/useFieldPanel.js +39 -0
  571. package/dist/composables/useFieldPanel.js.map +1 -0
  572. package/dist/composables/useFileDrop.d.ts +30 -0
  573. package/dist/composables/useFileDrop.js +28 -0
  574. package/dist/composables/useFileDrop.js.map +1 -0
  575. package/dist/composables/useFileField.d.ts +36 -0
  576. package/dist/composables/useFileField.js +45 -0
  577. package/dist/composables/useFileField.js.map +1 -0
  578. package/dist/composables/useFocusoutDismiss.d.ts +17 -0
  579. package/dist/composables/useFocusoutDismiss.js +11 -0
  580. package/dist/composables/useFocusoutDismiss.js.map +1 -0
  581. package/dist/composables/useIconClickHandlers.d.ts +27 -0
  582. package/dist/composables/useIconClickHandlers.js +13 -0
  583. package/dist/composables/useIconClickHandlers.js.map +1 -0
  584. package/dist/composables/useMaskedField.d.ts +65 -0
  585. package/dist/composables/useMaskedField.js +54 -0
  586. package/dist/composables/useMaskedField.js.map +1 -0
  587. package/dist/composables/usePopover.d.ts +7 -0
  588. package/dist/composables/usePopover.js +24 -0
  589. package/dist/composables/usePopover.js.map +1 -0
  590. package/dist/composables/useProgressValue.d.ts +13 -0
  591. package/dist/composables/useProgressValue.js +14 -0
  592. package/dist/composables/useProgressValue.js.map +1 -0
  593. package/dist/composables/useRootAttrs.d.ts +34 -0
  594. package/dist/composables/useRootAttrs.js +15 -0
  595. package/dist/composables/useRootAttrs.js.map +1 -0
  596. package/dist/composables/useTextLimit.d.ts +31 -0
  597. package/dist/composables/useTextLimit.js +19 -0
  598. package/dist/composables/useTextLimit.js.map +1 -0
  599. package/dist/composables/useTimer.d.ts +18 -0
  600. package/dist/composables/useTimer.js +19 -0
  601. package/dist/composables/useTimer.js.map +1 -0
  602. package/dist/i18n/en.d.ts +10 -0
  603. package/dist/i18n/en.js +179 -0
  604. package/dist/i18n/en.js.map +1 -0
  605. package/dist/i18n/fr.d.ts +18 -0
  606. package/dist/i18n/fr.js +179 -0
  607. package/dist/i18n/fr.js.map +1 -0
  608. package/dist/i18n/state.d.ts +64 -0
  609. package/dist/i18n/state.js +40 -0
  610. package/dist/i18n/state.js.map +1 -0
  611. package/dist/i18n/types.d.ts +345 -0
  612. package/dist/icons.d.ts +16 -0
  613. package/dist/icons.js +38 -0
  614. package/dist/index.d.ts +90 -0
  615. package/dist/index.js +64 -0
  616. package/dist/styles.css +1 -0
  617. package/dist/tokens/css.d.ts +25 -0
  618. package/dist/tokens/css.js +29 -0
  619. package/dist/tokens/css.js.map +1 -0
  620. package/dist/tokens/index.d.ts +370 -0
  621. package/dist/tokens/index.js +15 -0
  622. package/dist/tokens/index.js.map +1 -0
  623. package/dist/tokens/primitives.d.ts +101 -0
  624. package/dist/tokens/primitives.js +166 -0
  625. package/dist/tokens/primitives.js.map +1 -0
  626. package/dist/tokens/semantic.d.ts +236 -0
  627. package/dist/tokens/semantic.js +219 -0
  628. package/dist/tokens/semantic.js.map +1 -0
  629. package/dist/tokens/themes/dark.d.ts +49 -0
  630. package/dist/tokens/themes/dark.js +53 -0
  631. package/dist/tokens/themes/dark.js.map +1 -0
  632. package/dist/tokens/types.d.ts +38 -0
  633. package/dist/tokens/types.js +16 -0
  634. package/dist/tokens/types.js.map +1 -0
  635. package/dist/tokens.json +1516 -0
  636. package/dist/utils/array.d.ts +10 -0
  637. package/dist/utils/array.js +8 -0
  638. package/dist/utils/array.js.map +1 -0
  639. package/dist/utils/arrowNav.d.ts +27 -0
  640. package/dist/utils/arrowNav.js +26 -0
  641. package/dist/utils/arrowNav.js.map +1 -0
  642. package/dist/utils/chip.d.ts +26 -0
  643. package/dist/utils/chip.js +13 -0
  644. package/dist/utils/chip.js.map +1 -0
  645. package/dist/utils/css.d.ts +19 -0
  646. package/dist/utils/css.js +13 -0
  647. package/dist/utils/css.js.map +1 -0
  648. package/dist/utils/date.d.ts +199 -0
  649. package/dist/utils/date.js +225 -0
  650. package/dist/utils/date.js.map +1 -0
  651. package/dist/utils/direction.d.ts +18 -0
  652. package/dist/utils/direction.js +8 -0
  653. package/dist/utils/direction.js.map +1 -0
  654. package/dist/utils/env.d.ts +10 -0
  655. package/dist/utils/file.d.ts +95 -0
  656. package/dist/utils/file.js +70 -0
  657. package/dist/utils/file.js.map +1 -0
  658. package/dist/utils/focus.d.ts +24 -0
  659. package/dist/utils/focus.js +13 -0
  660. package/dist/utils/focus.js.map +1 -0
  661. package/dist/utils/matcher.d.ts +13 -0
  662. package/dist/utils/matcher.js +11 -0
  663. package/dist/utils/matcher.js.map +1 -0
  664. package/dist/utils/number.d.ts +9 -0
  665. package/dist/utils/number.js +8 -0
  666. package/dist/utils/number.js.map +1 -0
  667. package/dist/utils/text.d.ts +19 -0
  668. package/dist/utils/text.js +12 -0
  669. package/dist/utils/text.js.map +1 -0
  670. package/dist/utils/time.d.ts +138 -0
  671. package/dist/utils/time.js +123 -0
  672. package/dist/utils/time.js.map +1 -0
  673. package/dist/utils/vnode.d.ts +21 -0
  674. package/dist/utils/vnode.js +14 -0
  675. package/dist/utils/vnode.js.map +1 -0
  676. package/package.json +114 -0
@@ -0,0 +1,48 @@
1
+ import { IconSource } from '../VIcon/types.js';
2
+ /**
3
+ * One row of a VCombobox's list. It is internal to that component and never exported.
4
+ *
5
+ * The focus never comes here: it stays in the text field throughout, so the highlight is
6
+ * told to this row rather than deduced from anything it holds. Choosing it does not close
7
+ * the panel either — the component above decides that.
8
+ *
9
+ * TRAP — a disabled option does NOT carry the native attribute. It has to remain in the
10
+ * accessibility tree the field walks through, and the native attribute would take it out
11
+ * of it; `aria-disabled` says the same thing while leaving it in place.
12
+ *
13
+ * Its surface is deliberately reduced to what VCombobox actually uses. The label comes
14
+ * through the slot rather than a prop, and there is a single icon, at the start: the end
15
+ * of the row is taken by the selection tick.
16
+ */
17
+ interface ComboboxOptionProps {
18
+ /** An icon before the label: an icon name, or an explicit render. */
19
+ icon?: IconSource;
20
+ /** Marks the option as one of the chosen ones, which also draws the tick. */
21
+ selected?: boolean;
22
+ /** Marks the option as the one currently highlighted. The field decides this. */
23
+ active?: boolean;
24
+ /** Shows the option without allowing it to be chosen. */
25
+ disabled?: boolean;
26
+ }
27
+ type __VLS_Slots = {
28
+ /** What the row shows. */
29
+ default?(): unknown;
30
+ };
31
+ declare const __VLS_base: import('vue').DefineComponent<ComboboxOptionProps, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
32
+ select: () => any;
33
+ }, string, import('vue').PublicProps, Readonly<ComboboxOptionProps> & Readonly<{
34
+ onSelect?: (() => any) | undefined;
35
+ }>, {
36
+ disabled: boolean;
37
+ icon: IconSource;
38
+ selected: boolean;
39
+ active: boolean;
40
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
41
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
42
+ declare const _default: typeof __VLS_export;
43
+ export default _default;
44
+ type __VLS_WithSlots<T, S> = T & {
45
+ new (): {
46
+ $slots: S;
47
+ };
48
+ };
@@ -0,0 +1,9 @@
1
+ import './VComboboxOption.css';
2
+ import e from "./VComboboxOption.vue_vue_type_script_setup_true_lang.js";
3
+ /* empty css */
4
+ //#region src/components/VCombobox/VComboboxOption.vue
5
+ var t = e;
6
+ //#endregion
7
+ export { t as default };
8
+
9
+ //# sourceMappingURL=VComboboxOption.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VComboboxOption.js","names":[],"sources":["../../../src/components/VCombobox/VComboboxOption.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport VIcon from '../VIcon/VIcon.vue'\nimport { iconProps } from '../VIcon/iconProps'\nimport { check as checkIcon } from '../VIcon/icons/check'\nimport type { IconSource } from '../VIcon/types'\n\n/**\n * One row of a VCombobox's list. It is internal to that component and never exported.\n *\n * The focus never comes here: it stays in the text field throughout, so the highlight is\n * told to this row rather than deduced from anything it holds. Choosing it does not close\n * the panel either — the component above decides that.\n *\n * TRAP — a disabled option does NOT carry the native attribute. It has to remain in the\n * accessibility tree the field walks through, and the native attribute would take it out\n * of it; `aria-disabled` says the same thing while leaving it in place.\n *\n * Its surface is deliberately reduced to what VCombobox actually uses. The label comes\n * through the slot rather than a prop, and there is a single icon, at the start: the end\n * of the row is taken by the selection tick.\n */\ninterface ComboboxOptionProps {\n /** An icon before the label: an icon name, or an explicit render. */\n icon?: IconSource\n /** Marks the option as one of the chosen ones, which also draws the tick. */\n selected?: boolean\n /** Marks the option as the one currently highlighted. The field decides this. */\n active?: boolean\n /** Shows the option without allowing it to be chosen. */\n disabled?: boolean\n}\n\nconst props = withDefaults(defineProps<ComboboxOptionProps>(), {\n icon: undefined,\n selected: false,\n active: false,\n disabled: false,\n})\n\nconst emit = defineEmits<{\n /** The option was clicked. What that does to the selection is the field's business. */\n select: []\n}>()\n\ndefineSlots<{\n /** What the row shows. */\n default?(): unknown\n}>()\n\nfunction onClick() {\n if (props.disabled) return\n emit('select')\n}\n</script>\n\n<template>\n <button\n type=\"button\"\n role=\"option\"\n tabindex=\"-1\"\n class=\"v-combobox-option\"\n :aria-selected=\"selected\"\n :aria-disabled=\"disabled ? 'true' : undefined\"\n :data-active=\"active ? '' : undefined\"\n @click=\"onClick\"\n >\n <VIcon v-if=\"icon\" v-bind=\"iconProps(icon)\" />\n <span class=\"v-combobox-option-label\"><slot /></span>\n <VIcon v-if=\"selected\" :name=\"checkIcon\" class=\"v-combobox-option-check\" />\n </button>\n</template>\n\n<style>\n@layer vectis.components {\n .v-combobox-option {\n /* Every dimension is inherited from the panel, which carries the shared size class,\n and the icons follow through the same inheritance.\n\n The type is composite, exactly as in a menu row: the SIZE comes from the scale, the\n line height stays that of body text — a unitless ratio, so it follows the size —\n and the weight stays regular, since a row may wrap. */\n display: flex;\n align-items: center;\n gap: var(--control-gap);\n width: 100%;\n min-height: var(--control-height);\n padding: var(--vectis-space-1) var(--control-padding-inline);\n border: none;\n background: transparent;\n color: var(--vectis-color-text);\n border-radius: var(--vectis-radius-sm);\n font-family: inherit;\n font-size: var(--control-font-size);\n line-height: var(--vectis-text-body-md-leading);\n text-align: start;\n cursor: pointer;\n }\n\n /* The zero minimum is what allows a long label to be compressed at all: a flex item\n otherwise refuses to shrink below its own content. */\n .v-combobox-option-label {\n flex: 1;\n min-inline-size: 0;\n }\n\n /* A row is highlighted by the pointer resting on it, or by being the current one. There\n is deliberately no focus rule: the focus never arrives here, it stays in the field. */\n .v-combobox-option:hover:not([aria-disabled='true']),\n .v-combobox-option[data-active] {\n background: var(--vectis-color-surface-muted);\n outline: none;\n }\n\n .v-combobox-option[aria-selected='true'] {\n color: var(--vectis-color-accent-text);\n }\n\n /* Matched on the ARIA state and not on the native one, which this component\n deliberately never sets — see the introduction. */\n .v-combobox-option[aria-disabled='true'] {\n background: transparent;\n color: var(--vectis-color-text-subtle);\n cursor: not-allowed;\n }\n}\n</style>\n"],"mappings":""}
@@ -0,0 +1,56 @@
1
+ import e from "../VIcon/VIcon.js";
2
+ import { iconProps as t } from "../VIcon/iconProps.js";
3
+ import { check as n } from "../VIcon/icons/check.js";
4
+ import { createBlock as r, createCommentVNode as i, createElementBlock as a, createElementVNode as o, defineComponent as s, mergeProps as c, normalizeProps as l, openBlock as u, renderSlot as d, unref as f } from "vue";
5
+ //#region src/components/VCombobox/VComboboxOption.vue?vue&type=script&setup=true&lang.ts
6
+ var p = [
7
+ "aria-selected",
8
+ "aria-disabled",
9
+ "data-active"
10
+ ], m = { class: "v-combobox-option-label" }, h = /*@__PURE__*/ s({
11
+ __name: "VComboboxOption",
12
+ props: {
13
+ icon: { default: void 0 },
14
+ selected: {
15
+ type: Boolean,
16
+ default: !1
17
+ },
18
+ active: {
19
+ type: Boolean,
20
+ default: !1
21
+ },
22
+ disabled: {
23
+ type: Boolean,
24
+ default: !1
25
+ }
26
+ },
27
+ emits: ["select"],
28
+ setup(s, { emit: h }) {
29
+ let g = s, _ = h;
30
+ function v() {
31
+ g.disabled || _("select");
32
+ }
33
+ return (h, g) => (u(), a("button", {
34
+ type: "button",
35
+ role: "option",
36
+ tabindex: "-1",
37
+ class: "v-combobox-option",
38
+ "aria-selected": s.selected,
39
+ "aria-disabled": s.disabled ? "true" : void 0,
40
+ "data-active": s.active ? "" : void 0,
41
+ onClick: v
42
+ }, [
43
+ s.icon ? (u(), r(e, l(c({ key: 0 }, f(t)(s.icon))), null, 16)) : i("", !0),
44
+ o("span", m, [d(h.$slots, "default")]),
45
+ s.selected ? (u(), r(e, {
46
+ key: 1,
47
+ name: f(n),
48
+ class: "v-combobox-option-check"
49
+ }, null, 8, ["name"])) : i("", !0)
50
+ ], 8, p));
51
+ }
52
+ });
53
+ //#endregion
54
+ export { h as default };
55
+
56
+ //# sourceMappingURL=VComboboxOption.vue_vue_type_script_setup_true_lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VComboboxOption.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/VCombobox/VComboboxOption.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport VIcon from '../VIcon/VIcon.vue'\nimport { iconProps } from '../VIcon/iconProps'\nimport { check as checkIcon } from '../VIcon/icons/check'\nimport type { IconSource } from '../VIcon/types'\n\n/**\n * One row of a VCombobox's list. It is internal to that component and never exported.\n *\n * The focus never comes here: it stays in the text field throughout, so the highlight is\n * told to this row rather than deduced from anything it holds. Choosing it does not close\n * the panel either — the component above decides that.\n *\n * TRAP — a disabled option does NOT carry the native attribute. It has to remain in the\n * accessibility tree the field walks through, and the native attribute would take it out\n * of it; `aria-disabled` says the same thing while leaving it in place.\n *\n * Its surface is deliberately reduced to what VCombobox actually uses. The label comes\n * through the slot rather than a prop, and there is a single icon, at the start: the end\n * of the row is taken by the selection tick.\n */\ninterface ComboboxOptionProps {\n /** An icon before the label: an icon name, or an explicit render. */\n icon?: IconSource\n /** Marks the option as one of the chosen ones, which also draws the tick. */\n selected?: boolean\n /** Marks the option as the one currently highlighted. The field decides this. */\n active?: boolean\n /** Shows the option without allowing it to be chosen. */\n disabled?: boolean\n}\n\nconst props = withDefaults(defineProps<ComboboxOptionProps>(), {\n icon: undefined,\n selected: false,\n active: false,\n disabled: false,\n})\n\nconst emit = defineEmits<{\n /** The option was clicked. What that does to the selection is the field's business. */\n select: []\n}>()\n\ndefineSlots<{\n /** What the row shows. */\n default?(): unknown\n}>()\n\nfunction onClick() {\n if (props.disabled) return\n emit('select')\n}\n</script>\n\n<template>\n <button\n type=\"button\"\n role=\"option\"\n tabindex=\"-1\"\n class=\"v-combobox-option\"\n :aria-selected=\"selected\"\n :aria-disabled=\"disabled ? 'true' : undefined\"\n :data-active=\"active ? '' : undefined\"\n @click=\"onClick\"\n >\n <VIcon v-if=\"icon\" v-bind=\"iconProps(icon)\" />\n <span class=\"v-combobox-option-label\"><slot /></span>\n <VIcon v-if=\"selected\" :name=\"checkIcon\" class=\"v-combobox-option-check\" />\n </button>\n</template>\n\n<style>\n@layer vectis.components {\n .v-combobox-option {\n /* Every dimension is inherited from the panel, which carries the shared size class,\n and the icons follow through the same inheritance.\n\n The type is composite, exactly as in a menu row: the SIZE comes from the scale, the\n line height stays that of body text — a unitless ratio, so it follows the size —\n and the weight stays regular, since a row may wrap. */\n display: flex;\n align-items: center;\n gap: var(--control-gap);\n width: 100%;\n min-height: var(--control-height);\n padding: var(--vectis-space-1) var(--control-padding-inline);\n border: none;\n background: transparent;\n color: var(--vectis-color-text);\n border-radius: var(--vectis-radius-sm);\n font-family: inherit;\n font-size: var(--control-font-size);\n line-height: var(--vectis-text-body-md-leading);\n text-align: start;\n cursor: pointer;\n }\n\n /* The zero minimum is what allows a long label to be compressed at all: a flex item\n otherwise refuses to shrink below its own content. */\n .v-combobox-option-label {\n flex: 1;\n min-inline-size: 0;\n }\n\n /* A row is highlighted by the pointer resting on it, or by being the current one. There\n is deliberately no focus rule: the focus never arrives here, it stays in the field. */\n .v-combobox-option:hover:not([aria-disabled='true']),\n .v-combobox-option[data-active] {\n background: var(--vectis-color-surface-muted);\n outline: none;\n }\n\n .v-combobox-option[aria-selected='true'] {\n color: var(--vectis-color-accent-text);\n }\n\n /* Matched on the ARIA state and not on the native one, which this component\n deliberately never sets — see the introduction. */\n .v-combobox-option[aria-disabled='true'] {\n background: transparent;\n color: var(--vectis-color-text-subtle);\n cursor: not-allowed;\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgCA,IAAM,IAAQ,GAOR,IAAO;EAUb,SAAS,IAAU;GACb,EAAM,YACV,EAAK,QAAQ;EACf;yBAIE,EAaS,UAAA;GAZP,MAAK;GACL,MAAK;GACL,UAAS;GACT,OAAM;GACL,iBAAe,EAAA;GACf,iBAAe,EAAA,WAAQ,SAAY,KAAA;GACnC,eAAa,EAAA,SAAM,KAAQ,KAAA;GACpB;;GAEK,EAAA,QAAA,EAAA,GAAb,EAA8C,GAAA,EAAA,EAAA,EAAA,KAAA,EAAA,GAAnB,EAAA,CAAA,CAAS,CAAC,EAAA,IAAI,CAAA,CAAA,GAAA,MAAA,EAAA,KAAA,EAAA,IAAA,EAAA;GACzC,EAAqD,QAArD,GAAqD,CAAf,EAAQ,EAAA,QAAA,SAAA,CAAA,CAAA;GACjC,EAAA,YAAA,EAAA,GAAb,EAA2E,GAAA;;IAAnD,MAAM,EAAA,CAAA;IAAW,OAAM"}
@@ -0,0 +1,2 @@
1
+ @layer vectis.reset, vectis.tokens, vectis.components, vectis.utilities;
2
+ @layer vectis.components{.v-separator.v-combobox-separator{margin-inline:calc(-1 * var(--vectis-space-1))}}
@@ -0,0 +1,3 @@
1
+ declare const __VLS_export: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
2
+ declare const _default: typeof __VLS_export;
3
+ export default _default;
@@ -0,0 +1,9 @@
1
+ import './VComboboxSeparator.css';
2
+ import e from "./VComboboxSeparator.vue_vue_type_script_setup_true_lang.js";
3
+ /* empty css */
4
+ //#region src/components/VCombobox/VComboboxSeparator.vue
5
+ var t = e;
6
+ //#endregion
7
+ export { t as default };
8
+
9
+ //# sourceMappingURL=VComboboxSeparator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VComboboxSeparator.js","names":[],"sources":["../../../src/components/VCombobox/VComboboxSeparator.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * The rule drawn between two blocks of options in a VCombobox's list.\n *\n * TRAP — it is stripped of the meaning an `<hr>` normally carries. A separator is\n * perfectly legitimate inside a menu, as VMenuSeparator relies on, but a LIST may\n * contain nothing but options and blocks of options — so here the rule has to be\n * declared as pure presentation.\n *\n * Nothing is lost by that: what the rule suggests visually is already said properly by\n * the named blocks around it.\n */\nimport VSeparator from '../VSeparator/VSeparator.vue'\n</script>\n\n<template>\n <VSeparator role=\"presentation\" class=\"v-combobox-separator\" />\n</template>\n\n<style>\n@layer vectis.components {\n /* The rule is bled out to the panel's edges by cancelling its padding. The selector\n compounds both classes because `.v-separator` sets `margin: 0` from a sheet of its\n own: at equal specificity the winner would be whichever of the two the consumer's\n bundler happens to put last. The space above and below comes from the panel's own\n gap, so no margin is added here. */\n .v-separator.v-combobox-separator {\n margin-inline: calc(-1 * var(--vectis-space-1));\n }\n}\n</style>\n"],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import e from "../VSeparator/VSeparator.js";
2
+ import { createBlock as t, defineComponent as n, openBlock as r } from "vue";
3
+ //#region src/components/VCombobox/VComboboxSeparator.vue?vue&type=script&setup=true&lang.ts
4
+ var i = /*@__PURE__*/ n({
5
+ __name: "VComboboxSeparator",
6
+ setup(n) {
7
+ return (n, i) => (r(), t(e, {
8
+ role: "presentation",
9
+ class: "v-combobox-separator"
10
+ }));
11
+ }
12
+ });
13
+ //#endregion
14
+ export { i as default };
15
+
16
+ //# sourceMappingURL=VComboboxSeparator.vue_vue_type_script_setup_true_lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VComboboxSeparator.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/VCombobox/VComboboxSeparator.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * The rule drawn between two blocks of options in a VCombobox's list.\n *\n * TRAP — it is stripped of the meaning an `<hr>` normally carries. A separator is\n * perfectly legitimate inside a menu, as VMenuSeparator relies on, but a LIST may\n * contain nothing but options and blocks of options — so here the rule has to be\n * declared as pure presentation.\n *\n * Nothing is lost by that: what the rule suggests visually is already said properly by\n * the named blocks around it.\n */\nimport VSeparator from '../VSeparator/VSeparator.vue'\n</script>\n\n<template>\n <VSeparator role=\"presentation\" class=\"v-combobox-separator\" />\n</template>\n\n<style>\n@layer vectis.components {\n /* The rule is bled out to the panel's edges by cancelling its padding. The selector\n compounds both classes because `.v-separator` sets `margin: 0` from a sheet of its\n own: at equal specificity the winner would be whichever of the two the consumer's\n bundler happens to put last. The space above and below comes from the panel's own\n gap, so no margin is added here. */\n .v-separator.v-combobox-separator {\n margin-inline: calc(-1 * var(--vectis-space-1));\n }\n}\n</style>\n"],"mappings":";;;;;;yBAgBE,EAA+D,GAAA;GAAnD,MAAK;GAAe,OAAM"}
@@ -0,0 +1,22 @@
1
+ import { Ref } from 'vue';
2
+ export interface InfiniteScrollOptions {
3
+ /** The marker at the foot of the list. It is absent when there is nothing left to load. */
4
+ sentinelEl: Ref<HTMLElement | null>;
5
+ /** Whether a page may be asked for right now: the panel open, more to come, none in flight. */
6
+ canLoad: () => boolean;
7
+ /** How many options are loaded. Its growth is the signal that a page has arrived. */
8
+ loadedCount: () => number;
9
+ /** Asks for the next page. */
10
+ onLoadMore: () => void;
11
+ }
12
+ export interface InfiniteScroll {
13
+ /**
14
+ * Releases the lock that stops two requests overlapping.
15
+ *
16
+ * It must be called wherever a page that was asked for can no longer arrive — when the
17
+ * panel closes, above all. Without that, a request which failed would leave the paging
18
+ * frozen for the rest of the session.
19
+ */
20
+ reset: () => void;
21
+ }
22
+ export declare function useInfiniteScroll(options: InfiniteScrollOptions): InfiniteScroll;
@@ -0,0 +1,28 @@
1
+ import { watch as e } from "vue";
2
+ //#region src/components/VCombobox/infiniteScroll.ts
3
+ function t(t) {
4
+ let n = null, r = !1;
5
+ function i(e) {
6
+ e.some((e) => e.isIntersecting) && (r || !t.canLoad() || (r = !0, t.onLoadMore()));
7
+ }
8
+ return e(t.sentinelEl, (e, t, r) => {
9
+ if (!e || typeof IntersectionObserver > "u") return;
10
+ let a = e.closest("[role=\"listbox\"]");
11
+ a && (n = new IntersectionObserver(i, {
12
+ root: a,
13
+ rootMargin: "0px 0px 50% 0px"
14
+ }), n.observe(e), r(() => {
15
+ n?.disconnect(), n = null;
16
+ }));
17
+ }, { flush: "post" }), e(t.loadedCount, () => {
18
+ r = !1;
19
+ let e = t.sentinelEl.value;
20
+ !n || !e || (n.unobserve(e), n.observe(e));
21
+ }), { reset: () => {
22
+ r = !1;
23
+ } };
24
+ }
25
+ //#endregion
26
+ export { t as useInfiniteScroll };
27
+
28
+ //# sourceMappingURL=infiniteScroll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infiniteScroll.js","names":[],"sources":["../../../src/components/VCombobox/infiniteScroll.ts"],"sourcesContent":["// @core\n/**\n * What asks VCombobox for the next page as the reader reaches the end of the list.\n *\n * Nothing in CSS can report that an element has come into view, so this is code by\n * necessity: a marker is rendered at the foot of the panel and watched, with the panel\n * itself — the box that scrolls — as the frame it is watched within.\n *\n * The module lives in the component's folder rather than among the shared ones, for the\n * usual reason: a single consumer, so it does not qualify as shared code, and VCombobox\n * owns the contract. Promote it the day a second panel paginates.\n *\n * It should not be confused with the shared observer between VTabs and VCombobox that\n * was deliberately refused: VTabs watches two markers at the ends of a row to enable or\n * disable buttons, which has nothing in common with paging a list.\n */\nimport { watch, type Ref } from 'vue'\n\nexport interface InfiniteScrollOptions {\n /** The marker at the foot of the list. It is absent when there is nothing left to load. */\n sentinelEl: Ref<HTMLElement | null>\n /** Whether a page may be asked for right now: the panel open, more to come, none in flight. */\n canLoad: () => boolean\n /** How many options are loaded. Its growth is the signal that a page has arrived. */\n loadedCount: () => number\n /** Asks for the next page. */\n onLoadMore: () => void\n}\n\nexport interface InfiniteScroll {\n /**\n * Releases the lock that stops two requests overlapping.\n *\n * It must be called wherever a page that was asked for can no longer arrive — when the\n * panel closes, above all. Without that, a request which failed would leave the paging\n * frozen for the rest of the session.\n */\n reset: () => void\n}\n\nexport function useInfiniteScroll(options: InfiniteScrollOptions): InfiniteScroll {\n let observer: IntersectionObserver | null = null\n /*\n * A lock of our own, set the instant a page is asked for. The consumer's loading flag\n * cannot serve: they raise it when their request starts, which is at best a tick\n * later, and the gap between the two is wide enough for several requests to go out.\n */\n let pending = false\n\n function onIntersect(entries: IntersectionObserverEntry[]) {\n if (!entries.some((entry) => entry.isIntersecting)) return\n if (pending || !options.canLoad()) return\n pending = true\n options.onLoadMore()\n }\n\n watch(\n options.sentinelEl,\n (el, _previous, onCleanup) => {\n // @fallback\n // The observer does not exist in the unit-test environment, so its absence has to\n // be tolerated rather than assumed away; the behaviour is checked in a real\n // browser.\n if (!el || typeof IntersectionObserver === 'undefined') return\n // TRAP — the panel must be named as the frame the marker is watched within, and it\n // is found by its ARIA role, which is public API, rather than by an internal class.\n // Left unspecified, the frame would be the VIEWPORT — and since the panel floats\n // above the page, the marker would count as visible from the very first moment,\n // firing a burst of requests for every page at once.\n const root = el.closest('[role=\"listbox\"]')\n if (!root) return\n observer = new IntersectionObserver(onIntersect, {\n root,\n // The next page is asked for half a panel before the marker is actually reached,\n // so the list is already growing by the time the reader gets there. It is\n // expressed as a proportion of the panel rather than as a number of pixels.\n rootMargin: '0px 0px 50% 0px',\n })\n observer.observe(el)\n onCleanup(() => {\n observer?.disconnect()\n observer = null\n })\n },\n { flush: 'post' },\n )\n\n // TRAP — an observer only reports a CROSSING. If the page that arrives is too short to\n // push the marker out of view, the marker stays visible without ever crossing anything\n // again, and the loading would stop dead at the second page. Watching it afresh after\n // each page forces a new answer.\n //\n // It also gives the stopping condition away for nothing: a source that returns no new\n // option leaves the count unchanged, this never runs, and the loop simply ends.\n watch(options.loadedCount, () => {\n pending = false\n const el = options.sentinelEl.value\n if (!observer || !el) return\n observer.unobserve(el)\n observer.observe(el)\n })\n\n return {\n reset: () => {\n pending = false\n },\n }\n}\n"],"mappings":";;AAwCA,SAAgB,EAAkB,GAAgD;CAChF,IAAI,IAAwC,MAMxC,IAAU;CAEd,SAAS,EAAY,GAAsC;EACpD,EAAQ,MAAM,MAAU,EAAM,cAAc,MAC7C,KAAW,CAAC,EAAQ,QAAQ,MAChC,IAAU,IACV,EAAQ,WAAW;CACrB;CAgDA,OA9CA,EACE,EAAQ,aACP,GAAI,GAAW,MAAc;EAK5B,IAAI,CAAC,KAAM,OAAO,uBAAyB,KAAa;EAMxD,IAAM,IAAO,EAAG,QAAQ,oBAAkB;EACrC,MACL,IAAW,IAAI,qBAAqB,GAAa;GAC/C;GAIA,YAAY;EACd,CAAC,GACD,EAAS,QAAQ,CAAE,GACnB,QAAgB;GAEd,AADA,GAAU,WAAW,GACrB,IAAW;EACb,CAAC;CACH,GACA,EAAE,OAAO,OAAO,CAClB,GASA,EAAM,EAAQ,mBAAmB;EAC/B,IAAU;EACV,IAAM,IAAK,EAAQ,WAAW;EAC1B,CAAC,KAAY,CAAC,MAClB,EAAS,UAAU,CAAE,GACrB,EAAS,QAAQ,CAAE;CACrB,CAAC,GAEM,EACL,aAAa;EACX,IAAU;CACZ,EACF;AACF"}
@@ -0,0 +1,2 @@
1
+ @layer vectis.reset, vectis.tokens, vectis.components, vectis.utilities;
2
+ @layer vectis.components{.v-table-wrapper{--table-pad-block:var(--vectis-space-3);--table-pad-inline:var(--vectis-space-3);--table-head-pad-block:var(--vectis-space-2);--table-frame-pad:0px;--table-surface:var(--vectis-color-surface);font-family:var(--vectis-text-family);flex-direction:column;block-size:100%;display:flex;container-type:inline-size}.v-table-wrapper[data-compact]{--table-pad-block:var(--vectis-space-2);--table-pad-inline:var(--vectis-space-2);--table-head-pad-block:var(--vectis-space-1)}.v-table-wrapper[data-variant=outlined]{--table-frame-pad:var(--table-pad-inline);--table-surface:var(--vectis-color-surface-raised);background:var(--table-surface);border:1px solid var(--vectis-color-border);border-radius:var(--vectis-radius-surface);overflow:clip}.v-table-scroller{flex:auto;min-block-size:0;overflow:auto}.v-table-toolbar{justify-content:space-between;align-items:center;gap:var(--vectis-space-3);padding-block-start:var(--table-frame-pad);padding-block-end:var(--vectis-space-3);padding-inline:var(--table-frame-pad);flex-wrap:wrap;flex:none;display:flex}.v-table-title{--typography-color:var(--vectis-color-text)}.v-table-toolbar .v-input{inline-size:var(--vectis-control-size-table-search);max-inline-size:100%}.v-table{border-collapse:collapse;width:100%;font-size:var(--vectis-text-body-md-size);color:var(--vectis-color-text)}.v-table-caption{padding-block-end:var(--vectis-space-3);padding-inline:var(--table-frame-pad);text-align:start;font-size:var(--vectis-text-body-md-size);color:var(--vectis-color-text-muted)}.v-table th{padding:var(--table-head-pad-block) var(--table-pad-inline);text-align:start;font-size:var(--vectis-text-body-md-size);font-weight:var(--vectis-font-weight-semibold);color:var(--vectis-color-text-muted);border-block-end:1px solid var(--vectis-color-border)}.v-table td{padding:var(--table-pad-block) var(--table-pad-inline);border-block-end:1px solid var(--vectis-color-border)}.v-table tbody tr:last-child td{border-block-end:none}.v-table [data-align=end]{text-align:end}.v-table [data-align=center]{text-align:center}.v-table .v-table-select{inline-size:0}.v-table-wrapper[data-striped] tbody tr:nth-child(2n){background-color:var(--vectis-color-surface-sunken)}.v-table-wrapper[data-selectable] tbody tr[data-selected]{background-color:var(--vectis-color-accent-surface)}.v-table-wrapper[data-sticky-header] th{z-index:1;background-color:var(--table-surface);position:sticky;inset-block-start:0}.v-table-sort{--vectis-icon-size:var(--vectis-icon-size-md);--vectis-icon-opsz:20;align-items:center;gap:var(--vectis-space-1);color:inherit;font:inherit;cursor:pointer;border-radius:var(--vectis-radius-xs);background:0 0;border:none;padding:0;display:inline-flex}.v-table-sort:hover{color:var(--vectis-color-text)}.v-table-sort:focus-visible{outline:var(--vectis-focus-ring-width) solid var(--vectis-focus-ring-color);outline-offset:var(--vectis-focus-ring-offset)}.v-table-sort-icon{opacity:.35}.v-table-sort[data-direction] .v-table-sort-icon{opacity:1}.v-table-state{padding:var(--vectis-space-6);text-align:center;color:var(--vectis-color-text-muted)}.v-table-footer{justify-content:flex-end;align-items:center;gap:var(--vectis-space-4);padding-block-start:var(--vectis-space-3);padding-block-end:var(--table-frame-pad);padding-inline:var(--table-frame-pad);flex-wrap:wrap;flex:none;display:flex}.v-table-footer-end{justify-content:flex-end;align-items:center;gap:var(--vectis-space-4);flex-wrap:wrap;margin-inline-start:auto;display:flex}.v-table-selection,.v-table-range,.v-table-per-page-label{font-size:var(--vectis-text-body-md-size);color:var(--vectis-color-text-muted)}.v-table-per-page{align-items:center;gap:var(--vectis-space-2);display:flex}@container (width<=640px){.v-table-wrapper[data-responsive=stack] .v-table-head{clip-path:inset(50%);width:1px;height:1px;margin:-1px;position:absolute;overflow:hidden}.v-table-wrapper[data-responsive=stack] tbody tr{padding-block:var(--vectis-space-2);border-block-end:1px solid var(--vectis-color-border);display:block}.v-table-wrapper[data-responsive=stack] tbody tr:last-child{border-block-end:none}.v-table-wrapper[data-responsive=stack] td{justify-content:space-between;align-items:baseline;gap:var(--vectis-space-4);padding:var(--vectis-space-1) var(--vectis-space-2);text-align:end;border:none;display:flex}.v-table-wrapper[data-responsive=stack] td:before{content:attr(data-label);font-size:var(--vectis-text-overline-size);font-weight:var(--vectis-text-overline-weight);letter-spacing:var(--vectis-text-overline-tracking);color:var(--vectis-color-text-muted)}.v-table-wrapper[data-responsive=stack] td.v-table-select{justify-content:flex-start}.v-table-wrapper[data-responsive=stack] td.v-table-select:before{content:none}.v-table-search{flex:100%}}}
@@ -0,0 +1,214 @@
1
+ import { IconSource } from '../VIcon/types.js';
2
+ /**
3
+ * A table of data, with everything usually built around one: a title, a search field,
4
+ * sortable columns, a selection, and pagination.
5
+ *
6
+ * It is a real `<table>` underneath, with a caption, proper column headers and the
7
+ * attribute announcing how each is sorted — which is what lets a screen reader say "row
8
+ * 3 of 40, column Name" rather than reading a grid of unrelated text. Everything around
9
+ * it is assembled from the design system's own components rather than reinvented here.
10
+ *
11
+ * The JavaScript is almost all derivation — filter, then sort, then cut into pages —
12
+ * plus two effects explained where they sit.
13
+ *
14
+ * How the table reacts to a narrow space, and how it fills a height, are both entirely
15
+ * CSS: in the stacked mode each row becomes a card once the COMPONENT is narrow, with
16
+ * nothing measured from code, and the whole thing is a column in which only the scrolling
17
+ * area stretches.
18
+ */
19
+ /** One column of the table. */
20
+ export interface DataTableColumn {
21
+ /** Which field of a row it shows, and the name its slots are addressed by. */
22
+ key: string;
23
+ /** Its heading. */
24
+ label: string;
25
+ /** Lets the reader sort by this column. */
26
+ sortable?: boolean;
27
+ /** How its content is aligned — numbers usually belong at the end. */
28
+ align?: 'start' | 'center' | 'end';
29
+ }
30
+ /** Which column the table is sorted by, and in which direction. */
31
+ export interface DataTableSort {
32
+ key: string;
33
+ direction: 'asc' | 'desc';
34
+ }
35
+ /** How a row is identified: by the field named in `rowKey`, or failing that by its position. */
36
+ export type DataTableRowId = string | number;
37
+ /**
38
+ * Everything the table is currently being asked for, reported whenever it changes so a
39
+ * server can answer it.
40
+ */
41
+ export interface DataTableParams {
42
+ page: number;
43
+ perPage: number | null;
44
+ sortKey: string | null;
45
+ sortDirection: 'asc' | 'desc' | null;
46
+ search: string;
47
+ }
48
+ export interface DataTableProps<Row extends Record<string, unknown>> {
49
+ /** The columns to show, in order. */
50
+ columns: DataTableColumn[];
51
+ /** The rows to show. */
52
+ rows: Row[];
53
+ /**
54
+ * Which field identifies a row. Without it a row is identified by its position, which
55
+ * is enough for display but not for a selection: it must be given as soon as rows can
56
+ * be selected, or the selection follows the positions rather than the rows.
57
+ */
58
+ rowKey?: string;
59
+ /**
60
+ * A sentence describing what the table holds. It is announced before the table itself,
61
+ * and is what tells a screen reader user whether it is worth exploring.
62
+ */
63
+ caption?: string;
64
+ /**
65
+ * How the table is framed: nothing at all, or a card with a raised background, a border
66
+ * and rounded corners.
67
+ */
68
+ variant?: 'flat' | 'outlined';
69
+ /**
70
+ * What happens when the component is too narrow: the table scrolls sideways, or each
71
+ * row becomes a card with its column headings repeated inside it.
72
+ */
73
+ responsive?: 'scroll' | 'stack';
74
+ /** Shows that the rows are being loaded. */
75
+ loading?: boolean;
76
+ /** What is said when there is no row to show. It falls back to the design system dictionary. */
77
+ emptyText?: string;
78
+ /**
79
+ * A title above the table, on the left of its toolbar.
80
+ *
81
+ * Note that this prop shadows the HTML attribute of the same name on the component
82
+ * itself, an accepted trade-off — a tooltip over a whole table would be of little
83
+ * use.
84
+ */
85
+ title?: string;
86
+ /** Adds a search field to the toolbar. */
87
+ searchable?: boolean;
88
+ /** What that field says while empty. It falls back to the design system dictionary. */
89
+ searchPlaceholder?: string;
90
+ /**
91
+ * What screen readers announce for the search field. It falls back to the design
92
+ * system dictionary.
93
+ */
94
+ searchLabel?: string;
95
+ /**
96
+ * When a server does the searching, how long to wait after a keystroke before asking
97
+ * it, in milliseconds. Zero asks at once.
98
+ */
99
+ searchDebounce?: number;
100
+ /** Tints every other row, which helps the eye follow a long line across the table. */
101
+ striped?: boolean;
102
+ /**
103
+ * Keeps the column headings in place while the rows scroll under them. It needs a
104
+ * bounded scrolling area to work: either the `height` prop, or a parent with a height
105
+ * of its own.
106
+ */
107
+ stickyHeader?: boolean;
108
+ /** Tightens the cells by one step, and everything the table renders with them. */
109
+ compact?: boolean;
110
+ /**
111
+ * The height of the WHOLE component, toolbar and pagination included: a number is read
112
+ * as pixels, anything else as a CSS length. Left out, the table takes its parent's
113
+ * height whenever the parent has one.
114
+ */
115
+ height?: number | string;
116
+ /** The heading icon of a column that can be sorted but currently is not. */
117
+ sortIcon?: IconSource;
118
+ /**
119
+ * The icon of an ascending sort. It points DOWN by default, the spreadsheet
120
+ * convention: sorting A to Z reads downwards.
121
+ */
122
+ sortAscIcon?: IconSource;
123
+ /** The icon of a descending sort. */
124
+ sortDescIcon?: IconSource;
125
+ /** The choices offered for how many rows a page holds. */
126
+ perPageOptions?: number[];
127
+ /** What that choice is called. It falls back to the design system dictionary. */
128
+ perPageLabel?: string;
129
+ /**
130
+ * How many rows there are in all on the server. It is what lets the pagination and the
131
+ * range be right when the table only ever holds one page.
132
+ */
133
+ total?: number;
134
+ /** Shows which rows are being looked at — "1–10 of 42" — in the footer. */
135
+ showRange?: boolean;
136
+ /** Rephrases that range. It falls back to the design system dictionary. */
137
+ rangeLabel?: (range: {
138
+ start: number;
139
+ end: number;
140
+ total: number;
141
+ }) => string;
142
+ /** Adds a checkbox to every row, and one in the heading to take the whole page. */
143
+ selectable?: boolean;
144
+ /**
145
+ * What the heading checkbox is announced as. It falls back to the design system
146
+ * dictionary.
147
+ */
148
+ selectAllLabel?: string;
149
+ /**
150
+ * How the selection is summed up in the footer. It says nothing at all when nothing is
151
+ * selected, and falls back to the design system dictionary.
152
+ */
153
+ selectionLabel?: (count: number) => string;
154
+ /**
155
+ * What a row's checkbox is announced as. "Select row" tells a screen reader user
156
+ * nothing about WHICH row, so this is worth supplying with something from the row
157
+ * itself. It falls back to the design system dictionary.
158
+ */
159
+ selectRowLabel?: (row: Row, index: number) => string;
160
+ /**
161
+ * Hands the searching, the sorting and the paging over to a server: the rows are shown
162
+ * exactly as they arrive, and every change of what is being asked for is reported so
163
+ * the server can answer it.
164
+ */
165
+ serverSide?: boolean;
166
+ }
167
+ declare const __VLS_export: <Row extends Record<string, unknown>>(__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<{
168
+ props: import('vue').PublicProps & __VLS_PrettifyLocal<(DataTableProps<Row> & {
169
+ /** The current sort. It may be driven from outside, or simply left to the table. */
170
+ sort?: DataTableSort | null;
171
+ /** The page being shown. */
172
+ page?: number;
173
+ /**
174
+ * How many rows a page holds. Any value above zero turns the pagination on, so passing
175
+ * one down without binding it is enough to enable it.
176
+ */
177
+ perPage?: number | undefined;
178
+ selected?: DataTableRowId[];
179
+ search?: string;
180
+ }) & {
181
+ "onUpdate:selected"?: ((value: DataTableRowId[]) => any) | undefined;
182
+ "onUpdate:params"?: ((params: DataTableParams) => any) | undefined;
183
+ "onUpdate:sort"?: ((value: DataTableSort | null) => any) | undefined;
184
+ "onUpdate:page"?: ((value: number) => any) | undefined;
185
+ "onUpdate:perPage"?: ((value: number | undefined) => any) | undefined;
186
+ "onUpdate:search"?: ((value: string) => any) | undefined;
187
+ }> & (typeof globalThis extends {
188
+ __VLS_PROPS_FALLBACK: infer P;
189
+ } ? P : {});
190
+ expose: (exposed: {}) => void;
191
+ attrs: any;
192
+ slots: {
193
+ [name: `cell-${string}`]: (scope: {
194
+ row: Row;
195
+ value: unknown;
196
+ column: DataTableColumn;
197
+ }) => unknown;
198
+ [name: `head-${string}`]: (scope: {
199
+ column: DataTableColumn;
200
+ }) => unknown;
201
+ /** The left side of the toolbar, replacing the `title` prop. */
202
+ header?: () => unknown;
203
+ };
204
+ emit: ((evt: "update:params", params: DataTableParams) => void) & (((event: "update:selected", value: DataTableRowId[]) => void) & ((event: "update:sort", value: DataTableSort | null) => void) & ((event: "update:page", value: number) => void) & ((event: "update:perPage", value: number | undefined) => void) & ((event: "update:search", value: string) => void));
205
+ }>) => import('vue').VNode & {
206
+ __ctx?: NonNullable<Awaited<typeof __VLS_setup>>;
207
+ };
208
+ declare const _default: typeof __VLS_export;
209
+ export default _default;
210
+ type __VLS_PrettifyLocal<T> = (T extends any ? {
211
+ [K in keyof T]: T[K];
212
+ } : {
213
+ [K in keyof T as K]: T[K];
214
+ }) & {};
@@ -0,0 +1,9 @@
1
+ import './VDataTable.css';
2
+ import e from "./VDataTable.vue_vue_type_script_setup_true_lang.js";
3
+ /* empty css */
4
+ //#region src/components/VDataTable/VDataTable.vue
5
+ var t = e;
6
+ //#endregion
7
+ export { t as default };
8
+
9
+ //# sourceMappingURL=VDataTable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VDataTable.js","names":[],"sources":["../../../src/components/VDataTable/VDataTable.vue"],"sourcesContent":["<script setup lang=\"ts\" generic=\"Row extends Record<string, unknown>\">\nimport { computed, ref, watch } from 'vue'\nimport type { StyleValue } from 'vue'\n\nimport VButton from '../VButton/VButton.vue'\nimport VCheckbox from '../VCheckbox/VCheckbox.vue'\nimport VIcon from '../VIcon/VIcon.vue'\nimport { iconProps } from '../VIcon/iconProps'\nimport { arrow_downward as arrowDownwardIcon } from '../VIcon/icons/arrow_downward'\nimport { arrow_drop_down as arrowDropDownIcon } from '../VIcon/icons/arrow_drop_down'\nimport { arrow_upward as arrowUpwardIcon } from '../VIcon/icons/arrow_upward'\nimport { search as searchIcon } from '../VIcon/icons/search'\nimport { swap_vert as swapVertIcon } from '../VIcon/icons/swap_vert'\nimport type { IconSource } from '../VIcon/types'\nimport VInput from '../VInput/VInput.vue'\nimport VMenu from '../VMenu/VMenu.vue'\nimport VMenuItem from '../VMenu/VMenuItem.vue'\nimport VPagination from '../VPagination/VPagination.vue'\nimport VSpinner from '../VSpinner/VSpinner.vue'\nimport VTypography from '../VTypography/VTypography.vue'\n\nimport { toggleValue } from '../../utils/array'\nimport { cssSize } from '../../utils/css'\nimport { isDev } from '../../utils/env'\nimport { clamp } from '../../utils/number'\nimport { normalizeText } from '../../utils/text'\n\nimport { useRootAttrs } from '../../composables/useRootAttrs'\n\nimport { useTimer } from '../../composables/useTimer'\nimport { useLocale, useMessages } from '../../i18n/state'\n\n// @core\n/**\n * A table of data, with everything usually built around one: a title, a search field,\n * sortable columns, a selection, and pagination.\n *\n * It is a real `<table>` underneath, with a caption, proper column headers and the\n * attribute announcing how each is sorted — which is what lets a screen reader say \"row\n * 3 of 40, column Name\" rather than reading a grid of unrelated text. Everything around\n * it is assembled from the design system's own components rather than reinvented here.\n *\n * The JavaScript is almost all derivation — filter, then sort, then cut into pages —\n * plus two effects explained where they sit.\n *\n * How the table reacts to a narrow space, and how it fills a height, are both entirely\n * CSS: in the stacked mode each row becomes a card once the COMPONENT is narrow, with\n * nothing measured from code, and the whole thing is a column in which only the scrolling\n * area stretches.\n */\n/** One column of the table. */\nexport interface DataTableColumn {\n /** Which field of a row it shows, and the name its slots are addressed by. */\n key: string\n /** Its heading. */\n label: string\n /** Lets the reader sort by this column. */\n sortable?: boolean\n /** How its content is aligned — numbers usually belong at the end. */\n align?: 'start' | 'center' | 'end'\n}\n\n/** Which column the table is sorted by, and in which direction. */\nexport interface DataTableSort {\n key: string\n direction: 'asc' | 'desc'\n}\n\n/** How a row is identified: by the field named in `rowKey`, or failing that by its position. */\nexport type DataTableRowId = string | number\n\n/**\n * Everything the table is currently being asked for, reported whenever it changes so a\n * server can answer it.\n */\nexport interface DataTableParams {\n page: number\n perPage: number | null\n sortKey: string | null\n sortDirection: 'asc' | 'desc' | null\n search: string\n}\n\n// TRAP — this interface is exported rather than kept local, and it is generic rather than\n// referring to the component's own type parameter.\n//\n// A component typed over its rows inlines the whole signature of its props into the\n// declarations it emits, so a name that is not exported cannot be written there and the\n// build of the type declarations fails. And being lifted out of the component's scope, it\n// has no access to that parameter and must take one of its own.\nexport interface DataTableProps<Row extends Record<string, unknown>> {\n /** The columns to show, in order. */\n columns: DataTableColumn[]\n /** The rows to show. */\n rows: Row[]\n /**\n * Which field identifies a row. Without it a row is identified by its position, which\n * is enough for display but not for a selection: it must be given as soon as rows can\n * be selected, or the selection follows the positions rather than the rows.\n */\n rowKey?: string\n /**\n * A sentence describing what the table holds. It is announced before the table itself,\n * and is what tells a screen reader user whether it is worth exploring.\n */\n caption?: string\n /**\n * How the table is framed: nothing at all, or a card with a raised background, a border\n * and rounded corners.\n */\n variant?: 'flat' | 'outlined'\n /**\n * What happens when the component is too narrow: the table scrolls sideways, or each\n * row becomes a card with its column headings repeated inside it.\n */\n responsive?: 'scroll' | 'stack'\n /** Shows that the rows are being loaded. */\n loading?: boolean\n /** What is said when there is no row to show. It falls back to the design system dictionary. */\n emptyText?: string\n /**\n * A title above the table, on the left of its toolbar.\n *\n * Note that this prop shadows the HTML attribute of the same name on the component\n * itself, an accepted trade-off — a tooltip over a whole table would be of little\n * use.\n */\n title?: string\n /** Adds a search field to the toolbar. */\n searchable?: boolean\n /** What that field says while empty. It falls back to the design system dictionary. */\n searchPlaceholder?: string\n /**\n * What screen readers announce for the search field. It falls back to the design\n * system dictionary.\n */\n searchLabel?: string\n /**\n * When a server does the searching, how long to wait after a keystroke before asking\n * it, in milliseconds. Zero asks at once.\n */\n searchDebounce?: number\n /** Tints every other row, which helps the eye follow a long line across the table. */\n striped?: boolean\n /**\n * Keeps the column headings in place while the rows scroll under them. It needs a\n * bounded scrolling area to work: either the `height` prop, or a parent with a height\n * of its own.\n */\n stickyHeader?: boolean\n /** Tightens the cells by one step, and everything the table renders with them. */\n compact?: boolean\n /**\n * The height of the WHOLE component, toolbar and pagination included: a number is read\n * as pixels, anything else as a CSS length. Left out, the table takes its parent's\n * height whenever the parent has one.\n */\n height?: number | string\n /** The heading icon of a column that can be sorted but currently is not. */\n sortIcon?: IconSource\n /**\n * The icon of an ascending sort. It points DOWN by default, the spreadsheet\n * convention: sorting A to Z reads downwards.\n */\n sortAscIcon?: IconSource\n /** The icon of a descending sort. */\n sortDescIcon?: IconSource\n /** The choices offered for how many rows a page holds. */\n perPageOptions?: number[]\n /** What that choice is called. It falls back to the design system dictionary. */\n perPageLabel?: string\n /**\n * How many rows there are in all on the server. It is what lets the pagination and the\n * range be right when the table only ever holds one page.\n */\n total?: number\n /** Shows which rows are being looked at — \"1–10 of 42\" — in the footer. */\n showRange?: boolean\n /** Rephrases that range. It falls back to the design system dictionary. */\n rangeLabel?: (range: { start: number; end: number; total: number }) => string\n /** Adds a checkbox to every row, and one in the heading to take the whole page. */\n selectable?: boolean\n /**\n * What the heading checkbox is announced as. It falls back to the design system\n * dictionary.\n */\n selectAllLabel?: string\n /**\n * How the selection is summed up in the footer. It says nothing at all when nothing is\n * selected, and falls back to the design system dictionary.\n */\n selectionLabel?: (count: number) => string\n /**\n * What a row's checkbox is announced as. \"Select row\" tells a screen reader user\n * nothing about WHICH row, so this is worth supplying with something from the row\n * itself. It falls back to the design system dictionary.\n */\n selectRowLabel?: (row: Row, index: number) => string\n /**\n * Hands the searching, the sorting and the paging over to a server: the rows are shown\n * exactly as they arrive, and every change of what is being asked for is reported so\n * the server can answer it.\n */\n serverSide?: boolean\n}\n\nconst props = withDefaults(defineProps<DataTableProps<Row>>(), {\n rowKey: undefined,\n caption: undefined,\n variant: 'flat',\n responsive: 'scroll',\n loading: false,\n emptyText: undefined,\n title: undefined,\n searchable: false,\n searchPlaceholder: undefined,\n searchLabel: undefined,\n searchDebounce: 250,\n striped: false,\n stickyHeader: false,\n compact: false,\n height: undefined,\n sortIcon: () => swapVertIcon,\n sortAscIcon: () => arrowDownwardIcon,\n sortDescIcon: () => arrowUpwardIcon,\n perPageOptions: undefined,\n perPageLabel: undefined,\n total: undefined,\n showRange: false,\n rangeLabel: undefined,\n selectable: false,\n selectAllLabel: undefined,\n selectionLabel: undefined,\n selectRowLabel: undefined,\n serverSide: false,\n})\n\nconst m = useMessages()\nconst vectisLocale = useLocale()\nconst resolvedEmptyText = computed(() => props.emptyText ?? m.value.dataTable.empty)\nconst resolvedSearchPlaceholder = computed(\n () => props.searchPlaceholder ?? m.value.dataTable.searchPlaceholder,\n)\nconst resolvedSearchLabel = computed(() => props.searchLabel ?? m.value.dataTable.searchLabel)\nconst resolvedPerPageLabel = computed(() => props.perPageLabel ?? m.value.dataTable.perPage)\nconst resolvedSelectAllLabel = computed(() => props.selectAllLabel ?? m.value.dataTable.selectAll)\n\n/** The current sort. It may be driven from outside, or simply left to the table. */\nconst sort = defineModel<DataTableSort | null>('sort', { default: null })\n/** The page being shown. */\nconst page = defineModel<number>('page', { default: 1 })\n/**\n * How many rows a page holds. Any value above zero turns the pagination on, so passing\n * one down without binding it is enough to enable it.\n */\nconst perPage = defineModel<number | undefined>('perPage', { default: undefined })\nconst selected = defineModel<DataTableRowId[]>('selected', { default: () => [] })\nconst search = defineModel<string>('search', { default: '' })\n\nconst emit = defineEmits<{\n /**\n * What the table is now being asked for, when a server is answering: the page, the\n * page size, the sort or the search has changed — the last one after its delay.\n *\n * Nothing is emitted when the component appears: fetching the first page is the\n * consumer's own business, and emitting would make every table fetch twice.\n */\n 'update:params': [params: DataTableParams]\n}>()\n\ndefineSlots<{\n /** What a cell of a given column shows: a slot named after that column's key. */\n [name: `cell-${string}`]: (scope: {\n row: Row\n value: unknown\n column: DataTableColumn\n }) => unknown\n /** What a column's heading shows: a slot named after that column's key. */\n [name: `head-${string}`]: (scope: { column: DataTableColumn }) => unknown\n /** The left side of the toolbar, replacing the `title` prop. */\n header?: () => unknown\n}>()\n\n// `class` and `style` stay on the wrapper, where a consumer expects to place the\n// component; everything else — an id, the aria-* — goes to the `<table>` itself, the only\n// element they validly describe.\ndefineOptions({ inheritAttrs: false })\nconst { rootClass, rootStyle, forwardedAttrs } = useRootAttrs()\n\n// @devwarn\nif (isDev) {\n if (props.selectable && !props.rowKey)\n console.warn(\n '[VDataTable] `selectable` without `rowKey` — index-based identities are corrupted by sorting, filtering and pagination.',\n )\n}\n\nfunction rowIdentity(row: Row, index: number): DataTableRowId {\n return props.rowKey ? String(row[props.rowKey]) : index\n}\n\n// From here on: filter, then sort, then cut into pages — three derivations, each reading\n// the one before it.\n//\n// The search only ever looks at the columns that are DISPLAYED. Searching fields the\n// reader cannot see would return rows for reasons nothing on screen explains.\n/*\n * The cells in their accent-insensitive form, remembered per row and column, and\n * re-checked against the raw value.\n *\n * Normalizing a string means decomposing it, stripping what it decomposed into, and\n * lowercasing it — and the filter below re-reads the entire table on every keystroke.\n * Ten thousand rows across five columns is fifty thousand of those per character typed.\n *\n * Reading the cell on every call, rather than deriving the whole table once, is what\n * keeps the filter reactive against a value edited in place. The memory is keyed by ROW,\n * so replacing the rows lets the old entries be collected with no invalidation to write\n * anywhere.\n */\nconst normalizedCells = new WeakMap<Row, Map<string, { raw: string; normalized: string }>>()\nfunction normalizedCell(row: Row, key: string): string {\n const raw = String(row[key] ?? '')\n let cells = normalizedCells.get(row)\n if (!cells) {\n cells = new Map()\n normalizedCells.set(row, cells)\n }\n const hit = cells.get(key)\n if (hit && hit.raw === raw) return hit.normalized\n const normalized = normalizeText(raw)\n cells.set(key, { raw, normalized })\n return normalized\n}\n\nconst filteredRows = computed(() => {\n if (props.serverSide || !props.searchable) return props.rows\n const needle = normalizeText(search.value.trim())\n if (!needle) return props.rows\n return props.rows.filter((row) =>\n props.columns.some((column) => normalizedCell(row, column.key).includes(needle)),\n )\n})\n\n/*\n * The collator is built ONCE per locale rather than per comparison.\n *\n * `String.localeCompare` reuses an engine-cached collator only when both the locale and the\n * options are `undefined`; passing either — and this passes both, deliberately, since the\n * locale must stay explicit — takes the slow path and constructs an `Intl.Collator` on every\n * call. That is the cost class `utils/date.ts` already fights: construction runs one to two\n * orders of magnitude longer than use. It is not paid once, either: `search` feeds\n * `filteredRows`, which feeds this, so a sorted table re-sorts on every keystroke.\n *\n * The locale stays explicit for the reason it always was — an `undefined` locale resolves\n * differently in Node and in the browser, so the row order would diverge across hydration.\n */\nconst collator = computed(() => new Intl.Collator(vectisLocale.value, { numeric: true }))\n\nconst sortedRows = computed(() => {\n const current = sort.value\n if (!current || props.serverSide) return filteredRows.value\n const factor = current.direction === 'asc' ? 1 : -1\n const compare = collator.value.compare\n return [...filteredRows.value].sort((a, b) => {\n const av = a[current.key]\n const bv = b[current.key]\n if (typeof av === 'number' && typeof bv === 'number') return (av - bv) * factor\n return compare(String(av ?? ''), String(bv ?? '')) * factor\n })\n})\n\nconst paginated = computed(() => (perPage.value ?? 0) > 0)\nconst totalCount = computed(() =>\n props.serverSide ? (props.total ?? props.rows.length) : filteredRows.value.length,\n)\nconst pageCount = computed(() =>\n paginated.value ? Math.max(1, Math.ceil(totalCount.value / (perPage.value ?? 1))) : 1,\n)\n// The page actually shown is CLAMPED by derivation and the model is never rewritten: a\n// search that leaves fewer pages simply falls back to the last one, and typing a\n// character that would have emptied the table does not silently move the consumer's own\n// page number.\nconst currentPage = computed(() => clamp(page.value, 1, pageCount.value))\n\nconst displayedRows = computed(() => {\n // With a server answering, the rows received ARE the current page: cutting them again\n // would show a tenth of a page.\n if (props.serverSide || !paginated.value) return sortedRows.value\n const start = (currentPage.value - 1) * (perPage.value ?? 0)\n return sortedRows.value.slice(start, start + (perPage.value ?? 0))\n})\n\nfunction toggleSort(key: string) {\n const current = sort.value\n if (!current || current.key !== key) sort.value = { key, direction: 'asc' }\n else if (current.direction === 'asc') sort.value = { key, direction: 'desc' }\n else sort.value = null\n}\n\n// @a11y — only the column actually sorted carries the attribute. Setting it on every\n// heading would have a screen reader announce \"not sorted\" on each one in turn, drowning\n// the single piece of information that matters: which column the order comes from.\nfunction ariaSort(column: DataTableColumn): 'ascending' | 'descending' | undefined {\n if (sort.value?.key !== column.key) return undefined\n return sort.value.direction === 'asc' ? 'ascending' : 'descending'\n}\n\n/**\n * Which icon a column's heading shows: a neutral one on any sortable column, and the\n * arrow of the current direction on the one being sorted by.\n *\n * It is deliberately named differently from the prop it falls back to: written the same,\n * the function would shadow the prop inside the template and the icons would never be\n * overridable.\n */\nfunction sortIconFor(column: DataTableColumn): IconSource {\n if (sort.value?.key !== column.key) return props.sortIcon\n return sort.value.direction === 'asc' ? props.sortAscIcon : props.sortDescIcon\n}\n\n// The two effects the search needs.\n//\n// A changed search invalidates where one was: page 4 of the old results has nothing to\n// do with page 4 of the new ones, so the reader goes back to the first. And when a server\n// answers, nothing native waits before asking it, so that has to be written.\n//\n// The waiting is delegated to `useTimer` — a delay of zero running at once, cancellation\n// when the component goes away — and the term that was actually committed is what the\n// parameters below report.\nconst committedSearch = ref('')\nconst searchTimer = useTimer()\n\nfunction commitSearch() {\n committedSearch.value = search.value\n page.value = 1\n}\n\nwatch(search, () => {\n if (!props.serverSide) {\n page.value = 1\n return\n }\n searchTimer.start(commitSearch, props.searchDebounce)\n})\n\n// What the table is asking for, as one value.\nconst params = computed<DataTableParams>(() => ({\n page: currentPage.value,\n perPage: perPage.value ?? null,\n sortKey: sort.value?.key ?? null,\n sortDirection: sort.value?.direction ?? null,\n search: committedSearch.value,\n}))\n\n// Committing a search and going back to the first page happen one after the other, but\n// both land in the same flush, so this runs ONCE on the final values — never two requests\n// for what the reader experienced as a single action.\nwatch(params, (value) => {\n if (props.serverSide) emit('update:params', value)\n})\n\n// The selection. The heading checkbox covers the rows currently VISIBLE and not the whole\n// table: a box that silently selected forty thousand rows would be a trap.\nconst selectedSet = computed(() => new Set<DataTableRowId>(selected.value))\nconst visibleIds = computed(() => displayedRows.value.map((row, index) => rowIdentity(row, index)))\nconst allVisibleSelected = computed(\n () => visibleIds.value.length > 0 && visibleIds.value.every((id) => selectedSet.value.has(id)),\n)\nconst masterIndeterminate = computed(\n () => !allVisibleSelected.value && visibleIds.value.some((id) => selectedSet.value.has(id)),\n)\n\nfunction isSelected(row: Row, index: number): boolean {\n return selectedSet.value.has(rowIdentity(row, index))\n}\n\nfunction toggleRow(row: Row, index: number) {\n selected.value = toggleValue(selected.value, rowIdentity(row, index))\n}\n\n// It only ever touches the rows on screen, so what was selected on the other pages\n// survives moving between them.\nfunction toggleMaster() {\n const ids = visibleIds.value\n if (allVisibleSelected.value) {\n const visible = new Set(ids)\n selected.value = selected.value.filter((id) => !visible.has(id))\n } else {\n const current = selectedSet.value\n selected.value = [...selected.value, ...ids.filter((id) => !current.has(id))]\n }\n}\n\n// @a11y — without this every checkbox in the column would be announced identically, and\n// a screen reader user would have no way of knowing which row they were about to select.\nfunction rowSelectLabel(row: Row, index: number): string {\n // The dictionary is given the position as a HUMAN would count it, from one, while the\n // prop keeps the position as code counts it — changing that would break every consumer\n // already using it.\n return props.selectRowLabel?.(row, index) ?? m.value.dataTable.selectRow(index + 1)\n}\n\nfunction setPerPage(option: number) {\n perPage.value = option\n page.value = 1\n}\n\nconst colCount = computed(() => props.columns.length + (props.selectable ? 1 : 0))\n\n// @a11y\n/**\n * What the footer says about the selection.\n *\n * TRAP — it is rendered, EMPTY, as soon as rows can be selected at all. A region meant to\n * announce its own changes must already exist before the first change: inserted into the\n * page at the same moment as its text, it announces nothing, and the first row selected\n * would pass in silence.\n */\nconst selectionText = computed(() => {\n const count = selected.value.length\n if (props.selectionLabel) return props.selectionLabel(count)\n if (count === 0) return ''\n return m.value.dataTable.selection(count)\n})\n\nconst rangeText = computed(() => {\n const per = perPage.value ?? 0\n const total = totalCount.value\n const start = total === 0 ? 0 : (currentPage.value - 1) * per + 1\n const end = Math.min(currentPage.value * per, total)\n return props.rangeLabel?.({ start, end, total }) ?? m.value.dataTable.range({ start, end, total })\n})\n\n// The height is applied to the WHOLE component and not as a ceiling on the scrolling\n// area. The component then takes exactly the height asked for and the scrolling area\n// absorbs whatever is left, so a page with three rows on it no longer makes the table\n// shrink around them.\n//\n// A soft ceiling remains available to the consumer through a maximum height of their own:\n// the component is a column whose scrolling area can be compressed.\nconst heightStyle = computed<StyleValue | undefined>(() =>\n props.height !== undefined ? { blockSize: cssSize(props.height) } : undefined,\n)\n</script>\n\n<template>\n <div\n class=\"v-table-wrapper\"\n :class=\"rootClass\"\n :style=\"[heightStyle, rootStyle]\"\n :data-variant=\"variant\"\n :data-responsive=\"responsive\"\n :data-striped=\"striped ? '' : undefined\"\n :data-compact=\"compact ? '' : undefined\"\n :data-sticky-header=\"stickyHeader ? '' : undefined\"\n :data-selectable=\"selectable ? '' : undefined\"\n >\n <div v-if=\"title || $slots.header || searchable\" class=\"v-table-toolbar\">\n <VTypography as=\"div\" variant=\"heading-4\" class=\"v-table-title\">\n <slot name=\"header\">{{ title }}</slot>\n </VTypography>\n <VInput\n v-if=\"searchable\"\n v-model=\"search\"\n class=\"v-table-search\"\n type=\"search\"\n size=\"sm\"\n :compact=\"compact\"\n :icon-start=\"searchIcon\"\n clearable\n :placeholder=\"resolvedSearchPlaceholder\"\n :aria-label=\"resolvedSearchLabel\"\n />\n </div>\n\n <!-- Only the table itself scrolls; the toolbar above and the footer below stay\n where they are. -->\n <div class=\"v-table-scroller\">\n <table class=\"v-table\" v-bind=\"forwardedAttrs\">\n <caption v-if=\"caption\" class=\"v-table-caption\">\n {{\n caption\n }}\n </caption>\n <thead class=\"v-table-head\">\n <tr>\n <th v-if=\"selectable\" scope=\"col\" class=\"v-table-select\">\n <VCheckbox\n :model-value=\"allVisibleSelected\"\n :indeterminate=\"masterIndeterminate\"\n :aria-label=\"resolvedSelectAllLabel\"\n @update:model-value=\"toggleMaster\"\n />\n </th>\n <th\n v-for=\"column in columns\"\n :key=\"column.key\"\n scope=\"col\"\n :data-align=\"column.align\"\n :aria-sort=\"ariaSort(column)\"\n >\n <button\n v-if=\"column.sortable\"\n type=\"button\"\n class=\"v-table-sort\"\n :data-direction=\"sort?.key === column.key ? sort.direction : undefined\"\n @click=\"toggleSort(column.key)\"\n >\n <slot :name=\"`head-${column.key}`\" :column=\"column\">{{ column.label }}</slot>\n <!-- Decorative, and deliberately so: given no label, an icon hides itself\n from screen readers. What the sort state is, is already carried by\n the heading itself. -->\n <VIcon class=\"v-table-sort-icon\" v-bind=\"iconProps(sortIconFor(column))\" />\n </button>\n <template v-else>\n <slot :name=\"`head-${column.key}`\" :column=\"column\">{{ column.label }}</slot>\n </template>\n </th>\n </tr>\n </thead>\n <tbody>\n <!-- The order matters: loading is checked BEFORE emptiness, so a table waiting\n for its rows never claims there are none. -->\n <tr v-if=\"loading\">\n <td :colspan=\"colCount\" class=\"v-table-state\">\n <VSpinner :label=\"m.dataTable.loading\" />\n </td>\n </tr>\n <tr v-else-if=\"displayedRows.length === 0\">\n <td :colspan=\"colCount\" class=\"v-table-state\">{{ resolvedEmptyText }}</td>\n </tr>\n <template v-else>\n <tr\n v-for=\"(row, index) in displayedRows\"\n :key=\"rowIdentity(row, index)\"\n :data-selected=\"selectable && isSelected(row, index) ? '' : undefined\"\n >\n <!-- TRAP — the selection is marked with a plain attribute and NOT with the\n ARIA selected state, which is invalid on the row of a table: it belongs\n to a grid. What tells assistive technology that a row is selected is\n its checkbox being checked. -->\n <td v-if=\"selectable\" class=\"v-table-select\">\n <VCheckbox\n :model-value=\"isSelected(row, index)\"\n :aria-label=\"rowSelectLabel(row, index)\"\n @update:model-value=\"toggleRow(row, index)\"\n />\n </td>\n <td\n v-for=\"column in columns\"\n :key=\"column.key\"\n :data-label=\"column.label\"\n :data-align=\"column.align\"\n >\n <slot\n :name=\"`cell-${column.key}`\"\n :row=\"row\"\n :value=\"row[column.key]\"\n :column=\"column\"\n >\n {{ row[column.key] }}\n </slot>\n </td>\n </tr>\n </template>\n </tbody>\n </table>\n </div>\n\n <!-- The footer has two zones: what is selected on the left, and on the right the page\n size, the range and the pagination, in that order. -->\n <div v-if=\"paginated || selectable\" class=\"v-table-footer\">\n <span v-if=\"selectable\" class=\"v-table-selection\" aria-live=\"polite\">{{\n selectionText\n }}</span>\n <div v-if=\"paginated\" class=\"v-table-footer-end\">\n <div v-if=\"perPageOptions?.length\" class=\"v-table-per-page\">\n <span class=\"v-table-per-page-label\" aria-hidden=\"true\">{{ resolvedPerPageLabel }}</span>\n <!-- The panel is told to match its trigger, which here replaces the default\n minimum width with something sensible: a menu of \"10\", \"25\", \"50\" has no\n use for the width a menu of commands assumes, and it still cannot end up\n narrower than the button opening it. -->\n <VMenu size=\"sm\" :compact=\"compact\" placement=\"top-end\" match-trigger>\n <template #trigger=\"{ triggerProps }\">\n <VButton\n variant=\"ghost\"\n tone=\"neutral\"\n size=\"sm\"\n :compact=\"compact\"\n v-bind=\"triggerProps\"\n :aria-label=\"m.dataTable.perPageValue(resolvedPerPageLabel, perPage ?? 0)\"\n >\n {{ perPage }}\n <VIcon :name=\"arrowDropDownIcon\" />\n </VButton>\n </template>\n <VMenuItem\n v-for=\"option in perPageOptions\"\n :key=\"option\"\n :label=\"String(option)\"\n :selected=\"option === perPage\"\n @select=\"setPerPage(option)\"\n />\n </VMenu>\n </div>\n <span v-if=\"showRange\" class=\"v-table-range\" aria-live=\"polite\">{{ rangeText }}</span>\n <!-- Named after the table rather than with the generic pagination wording: a page\n holding this table AND a pagination of its own would otherwise expose two\n navigation landmarks with the same name, and a screen reader user could not\n tell them apart. -->\n <VPagination\n v-model=\"page\"\n :label=\"m.dataTable.pagination\"\n :length=\"pageCount\"\n size=\"sm\"\n :compact=\"compact\"\n align=\"end\"\n variant=\"ghost\"\n :total-visible=\"7\"\n />\n </div>\n </div>\n </div>\n</template>\n\n<style>\n@layer vectis.components {\n .v-table-wrapper {\n /* The density, expressed as the cells' padding and tightened by one step in the\n compact form. It does not go through the shared control scale — there is no single\n control height in a table — which is the same case VAccordion is in. */\n --table-pad-block: var(--vectis-space-3);\n --table-pad-inline: var(--vectis-space-3);\n --table-head-pad-block: var(--vectis-space-2);\n\n /* The gutter between the frame and what it holds: nothing when the table is\n unframed, so the caption, the toolbar and the footer sit flush with the edge, and\n the cells' own inline padding as soon as a frame appears. */\n --table-frame-pad: 0px;\n /* The colour a frozen heading is painted with. It follows the frame's own background:\n any other value would show as a visible seam in the dark theme, where the two\n surfaces differ. */\n --table-surface: var(--vectis-color-surface);\n\n container-type: inline-size;\n font-family: var(--vectis-text-family);\n\n /*\n * A column of three: toolbar, scrolling area, footer. The component takes its\n * parent's height and the scrolling area absorbs whatever is left, which is what\n * stops a last page holding two rows from shrinking the whole table, and what keeps\n * the footer at the bottom.\n *\n * When the parent imposes no height at all, a percentage of an undefined height\n * simply resolves to automatic — so this costs nothing and needs no measurement.\n *\n * TRAP — there is deliberately no zero minimum here. Inside a flex column parent too\n * short for it, that minimum is what keeps the table at its natural height instead of\n * letting it be crushed to nothing.\n */\n display: flex;\n flex-direction: column;\n block-size: 100%;\n }\n\n .v-table-wrapper[data-compact] {\n --table-pad-block: var(--vectis-space-2);\n --table-pad-inline: var(--vectis-space-2);\n --table-head-pad-block: var(--vectis-space-1);\n }\n\n /* The card. The unframed default has nothing to undo, since it declares no decoration\n at all — whatever surrounds the table is what provides the surface then. */\n .v-table-wrapper[data-variant='outlined'] {\n --table-frame-pad: var(--table-pad-inline);\n --table-surface: var(--vectis-color-surface-raised);\n\n background: var(--table-surface);\n border: 1px solid var(--vectis-color-border);\n border-radius: var(--vectis-radius-surface);\n /*\n * The price of the rounded corners: the striped and selected row backgrounds, the\n * opaque background of a frozen heading and the square corners of the scrolling area\n * would all spill past them.\n *\n * TRAP — clipped and not hidden. Hiding the overflow would make this element a\n * scrolling box of its own, and the frozen heading would then stick to IT rather than\n * to the area that actually scrolls, which is to say it would not stick at all.\n *\n * It is confined to the framed form on purpose: unframed, the toolbar and the footer\n * sit flush with the edge and the clip would crop their focus rings. The page-size\n * menu is drawn above the page and is never affected either way.\n */\n overflow: clip;\n }\n\n /*\n * The ONE part that scrolls, taking whatever room the toolbar and the footer leave.\n *\n * It grows from its CONTENT's height rather than from zero, which makes the whole thing\n * inert as long as there is no free space to hand out — a table shorter than its\n * container is left exactly as tall as it is.\n *\n * The zero minimum is load-bearing: a flex item refuses by default to shrink below its\n * content, and without it the area would never compress, so the table would overflow\n * instead of scrolling.\n *\n * It is deliberately not confined to one responsive mode: a table taller than its host\n * must scroll in the stacked form too, or the clip of the framed variant would crop it\n * and make the rows below unreachable.\n */\n .v-table-scroller {\n flex: 1 1 auto;\n min-block-size: 0;\n overflow: auto;\n }\n\n .v-table-toolbar {\n flex: none; /* stays at the top, outside whatever scrolls */\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--vectis-space-3);\n padding-block-start: var(--table-frame-pad);\n padding-block-end: var(--vectis-space-3);\n padding-inline: var(--table-frame-pad);\n }\n\n /* The title is rendered by VTypography, and its colour is stated explicitly because the\n toolbar may well sit inside a context whose text is dimmed.\n\n TRAP — it is set through the colour VARIABLE that component reads, and not with a\n plain colour declaration. That declaration would collide with VTypography's own at\n equal specificity, and the winner would be decided by whichever sheet the consumer's\n bundler put last. */\n .v-table-title {\n --typography-color: var(--vectis-color-text);\n }\n\n /* The search field is given a width of its own, overriding the full width VInput takes\n by default. The selector is qualified by its context, which makes it one step more\n specific than VInput's own rule and therefore independent of the order the two sheets\n end up in. */\n .v-table-toolbar .v-input {\n inline-size: var(--vectis-control-size-table-search);\n max-inline-size: 100%;\n }\n\n .v-table {\n width: 100%;\n border-collapse: collapse;\n font-size: var(--vectis-text-body-md-size);\n color: var(--vectis-color-text);\n }\n\n .v-table-caption {\n padding-block-end: var(--vectis-space-3);\n padding-inline: var(--table-frame-pad);\n text-align: start;\n font-size: var(--vectis-text-body-md-size);\n color: var(--vectis-color-text-muted);\n }\n\n .v-table th {\n padding: var(--table-head-pad-block) var(--table-pad-inline);\n text-align: start;\n font-size: var(--vectis-text-body-md-size);\n /* The heavier weight distinguishes a heading from the data under it, which is\n emphasis rather than a typographic role — hence a font token read directly. */\n font-weight: var(--vectis-font-weight-semibold);\n color: var(--vectis-color-text-muted);\n border-block-end: 1px solid var(--vectis-color-border);\n }\n\n .v-table td {\n padding: var(--table-pad-block) var(--table-pad-inline);\n border-block-end: 1px solid var(--vectis-color-border);\n }\n\n .v-table tbody tr:last-child td {\n border-block-end: none;\n }\n\n .v-table [data-align='end'] {\n text-align: end;\n }\n\n .v-table [data-align='center'] {\n text-align: center;\n }\n\n /* The checkbox column is reduced to the width of its content. A table lays its columns\n out automatically, so asking for no width at all is what makes it take the least\n possible. */\n .v-table .v-table-select {\n inline-size: 0;\n }\n\n .v-table-wrapper[data-striped] tbody tr:nth-child(even) {\n background-color: var(--vectis-color-surface-sunken);\n }\n\n /* Placed after the striping on purpose: the specificity is the same, so it is the order\n that makes a selected row keep its tint on both odd and even rows. */\n .v-table-wrapper[data-selectable] tbody tr[data-selected] {\n background-color: var(--vectis-color-accent-surface);\n }\n\n /* A frozen heading MUST be opaque: the rows scroll underneath it, and without a\n background they would show through. Its colour is read from the variable holding the\n table's real surface — a fixed value would leave a visible seam along the frame's\n edge in the dark theme, where the two surfaces differ. */\n .v-table-wrapper[data-sticky-header] th {\n position: sticky;\n inset-block-start: 0;\n z-index: 1;\n background-color: var(--table-surface);\n }\n\n .v-table-sort {\n /* The icon context for the sort glyph. Without it the icon would fall back to one em\n — the heading's own text size — and come out visibly smaller than every other icon\n in the component. */\n --vectis-icon-size: var(--vectis-icon-size-md);\n --vectis-icon-opsz: 20;\n\n display: inline-flex;\n align-items: center;\n gap: var(--vectis-space-1);\n border: none;\n background: transparent;\n padding: 0;\n color: inherit;\n font: inherit;\n cursor: pointer;\n border-radius: var(--vectis-radius-xs);\n }\n\n .v-table-sort:hover {\n color: var(--vectis-color-text);\n }\n\n .v-table-sort: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 /* The glyph stays faint on every column that merely COULD be sorted: it announces that\n the heading can be clicked without competing for attention with the one column\n actually carrying the order. */\n .v-table-sort-icon {\n opacity: 0.35;\n }\n\n .v-table-sort[data-direction] .v-table-sort-icon {\n opacity: 1;\n }\n\n .v-table-state {\n padding: var(--vectis-space-6);\n text-align: center;\n color: var(--vectis-color-text-muted);\n }\n\n .v-table-footer {\n flex: none; /* stays at the bottom, outside whatever scrolls */\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: flex-end;\n gap: var(--vectis-space-4);\n padding-block-start: var(--vectis-space-3);\n padding-block-end: var(--table-frame-pad);\n padding-inline: var(--table-frame-pad);\n }\n\n /*\n * The right-hand zone is pushed to the edge by an automatic margin rather than by an\n * alignment on the footer. The two zones are siblings in the same row, and the count on\n * the left has to stay at the OPPOSITE edge: any alignment set on the footer would move\n * both of them together.\n *\n * The margin also does the right thing when there is no count at all, the zone simply\n * being pushed against the far edge on its own.\n */\n .v-table-footer-end {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: flex-end;\n gap: var(--vectis-space-4);\n margin-inline-start: auto;\n }\n\n .v-table-selection,\n .v-table-range,\n .v-table-per-page-label {\n font-size: var(--vectis-text-body-md-size);\n color: var(--vectis-color-text-muted);\n }\n\n .v-table-per-page {\n display: flex;\n align-items: center;\n gap: var(--vectis-space-2);\n }\n\n /* The stacked form: once the COMPONENT is narrow, each row becomes a card carrying its\n own headings. It is entirely CSS, and the threshold is written as a literal length —\n these queries accept no variables.\n\n The column headings are not removed but hidden the way visually hidden text is: they\n still name each column for a screen reader, which reads the cells in the same order\n either way. */\n @container (max-width: 640px) {\n .v-table-wrapper[data-responsive='stack'] .v-table-head {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n overflow: hidden;\n clip-path: inset(50%);\n }\n\n .v-table-wrapper[data-responsive='stack'] tbody tr {\n display: block;\n padding-block: var(--vectis-space-2);\n border-block-end: 1px solid var(--vectis-color-border);\n }\n\n .v-table-wrapper[data-responsive='stack'] tbody tr:last-child {\n border-block-end: none;\n }\n\n .v-table-wrapper[data-responsive='stack'] td {\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n gap: var(--vectis-space-4);\n padding: var(--vectis-space-1) var(--vectis-space-2);\n border: none;\n text-align: end;\n }\n\n /* Each cell writes its own column's name before itself, taken from the attribute the\n template put there. It takes the overline type role, without forcing capitals. */\n .v-table-wrapper[data-responsive='stack'] td::before {\n content: attr(data-label);\n font-size: var(--vectis-text-overline-size);\n font-weight: var(--vectis-text-overline-weight);\n letter-spacing: var(--vectis-text-overline-tracking);\n color: var(--vectis-color-text-muted);\n }\n\n /* The checkbox cell carries no column name — there is none — so it gets no heading\n and opens the card on its own line. */\n .v-table-wrapper[data-responsive='stack'] td.v-table-select {\n justify-content: flex-start;\n }\n\n .v-table-wrapper[data-responsive='stack'] td.v-table-select::before {\n content: none;\n }\n\n /* In a narrow component the search field drops under the title and takes the whole\n width. This applies to both responsive forms, the toolbar never being part of what\n scrolls. */\n .v-table-search {\n flex: 1 1 100%;\n }\n }\n}\n</style>\n"],"mappings":""}