vuetify 3.1.15 → 3.2.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 (486) hide show
  1. package/dist/_component-variables-labs.sass +1 -0
  2. package/dist/json/attributes.json +368 -216
  3. package/dist/json/importMap-labs.json +4 -4
  4. package/dist/json/importMap.json +72 -68
  5. package/dist/json/tags.json +45 -2
  6. package/dist/json/web-types.json +898 -376
  7. package/dist/vuetify-labs.css +577 -355
  8. package/dist/vuetify-labs.d.ts +5910 -7620
  9. package/dist/vuetify-labs.esm.js +1702 -693
  10. package/dist/vuetify-labs.esm.js.map +1 -1
  11. package/dist/vuetify-labs.js +1701 -691
  12. package/dist/vuetify-labs.min.css +2 -2
  13. package/dist/vuetify.css +266 -60
  14. package/dist/vuetify.d.ts +6218 -7204
  15. package/dist/vuetify.esm.js +1425 -461
  16. package/dist/vuetify.esm.js.map +1 -1
  17. package/dist/vuetify.js +1424 -459
  18. package/dist/vuetify.js.map +1 -1
  19. package/dist/vuetify.min.css +2 -2
  20. package/dist/vuetify.min.js +819 -746
  21. package/dist/vuetify.min.js.map +1 -1
  22. package/lib/blueprints/index.d.ts +35 -1
  23. package/lib/blueprints/md1.d.ts +35 -1
  24. package/lib/blueprints/md2.d.ts +35 -1
  25. package/lib/blueprints/md3.d.ts +35 -1
  26. package/lib/components/VAlert/VAlert.mjs +6 -4
  27. package/lib/components/VAlert/VAlert.mjs.map +1 -1
  28. package/lib/components/VAlert/index.d.ts +57 -55
  29. package/lib/components/VApp/VApp.mjs +4 -2
  30. package/lib/components/VApp/VApp.mjs.map +1 -1
  31. package/lib/components/VApp/index.d.ts +22 -13
  32. package/lib/components/VAppBar/VAppBar.mjs +65 -13
  33. package/lib/components/VAppBar/VAppBar.mjs.map +1 -1
  34. package/lib/components/VAppBar/VAppBarNavIcon.mjs +7 -4
  35. package/lib/components/VAppBar/VAppBarNavIcon.mjs.map +1 -1
  36. package/lib/components/VAppBar/index.d.ts +113 -92
  37. package/lib/components/VAutocomplete/VAutocomplete.mjs +2 -1
  38. package/lib/components/VAutocomplete/VAutocomplete.mjs.map +1 -1
  39. package/lib/components/VAutocomplete/index.d.ts +276 -418
  40. package/lib/components/VAvatar/VAvatar.mjs +4 -2
  41. package/lib/components/VAvatar/VAvatar.mjs.map +1 -1
  42. package/lib/components/VAvatar/index.d.ts +23 -14
  43. package/lib/components/VBadge/VBadge.mjs +6 -5
  44. package/lib/components/VBadge/VBadge.mjs.map +1 -1
  45. package/lib/components/VBadge/index.d.ts +27 -22
  46. package/lib/components/VBanner/VBanner.mjs +6 -4
  47. package/lib/components/VBanner/VBanner.mjs.map +1 -1
  48. package/lib/components/VBanner/VBannerActions.mjs +5 -2
  49. package/lib/components/VBanner/VBannerActions.mjs.map +1 -1
  50. package/lib/components/VBanner/index.d.ts +92 -66
  51. package/lib/components/VBottomNavigation/VBottomNavigation.mjs +4 -2
  52. package/lib/components/VBottomNavigation/VBottomNavigation.mjs.map +1 -1
  53. package/lib/components/VBottomNavigation/index.d.ts +22 -13
  54. package/lib/components/VBreadcrumbs/VBreadcrumbs.mjs +35 -18
  55. package/lib/components/VBreadcrumbs/VBreadcrumbs.mjs.map +1 -1
  56. package/lib/components/VBreadcrumbs/VBreadcrumbsDivider.mjs +6 -3
  57. package/lib/components/VBreadcrumbs/VBreadcrumbsDivider.mjs.map +1 -1
  58. package/lib/components/VBreadcrumbs/VBreadcrumbsItem.mjs +4 -2
  59. package/lib/components/VBreadcrumbs/VBreadcrumbsItem.mjs.map +1 -1
  60. package/lib/components/VBreadcrumbs/index.d.ts +134 -93
  61. package/lib/components/VBtn/VBtn.mjs +9 -4
  62. package/lib/components/VBtn/VBtn.mjs.map +1 -1
  63. package/lib/components/VBtn/_mixins.scss +1 -1
  64. package/lib/components/VBtn/index.d.ts +39 -36
  65. package/lib/components/VBtnGroup/VBtnGroup.mjs +4 -1
  66. package/lib/components/VBtnGroup/VBtnGroup.mjs.map +1 -1
  67. package/lib/components/VBtnGroup/index.d.ts +22 -13
  68. package/lib/components/VBtnToggle/VBtnToggle.mjs +4 -2
  69. package/lib/components/VBtnToggle/VBtnToggle.mjs.map +1 -1
  70. package/lib/components/VBtnToggle/index.d.ts +30 -21
  71. package/lib/components/VCard/VCard.mjs +5 -3
  72. package/lib/components/VCard/VCard.mjs.map +1 -1
  73. package/lib/components/VCard/VCardActions.mjs +7 -4
  74. package/lib/components/VCard/VCardActions.mjs.map +1 -1
  75. package/lib/components/VCard/VCardItem.mjs +5 -2
  76. package/lib/components/VCard/VCardItem.mjs.map +1 -1
  77. package/lib/components/VCard/index.d.ts +250 -141
  78. package/lib/components/VCarousel/VCarousel.mjs +3 -3
  79. package/lib/components/VCarousel/VCarousel.mjs.map +1 -1
  80. package/lib/components/VCarousel/VCarouselItem.mjs +6 -3
  81. package/lib/components/VCarousel/VCarouselItem.mjs.map +1 -1
  82. package/lib/components/VCarousel/index.d.ts +78 -141
  83. package/lib/components/VCheckbox/VCheckbox.mjs +3 -2
  84. package/lib/components/VCheckbox/VCheckbox.mjs.map +1 -1
  85. package/lib/components/VCheckbox/VCheckboxBtn.mjs +2 -1
  86. package/lib/components/VCheckbox/VCheckboxBtn.mjs.map +1 -1
  87. package/lib/components/VCheckbox/index.d.ts +75 -109
  88. package/lib/components/VChip/VChip.mjs +7 -8
  89. package/lib/components/VChip/VChip.mjs.map +1 -1
  90. package/lib/components/VChip/index.d.ts +27 -30
  91. package/lib/components/VChipGroup/VChipGroup.mjs +4 -1
  92. package/lib/components/VChipGroup/VChipGroup.mjs.map +1 -1
  93. package/lib/components/VChipGroup/index.d.ts +22 -13
  94. package/lib/components/VCode/index.d.ts +30 -17
  95. package/lib/components/VColorPicker/VColorPicker.mjs +3 -3
  96. package/lib/components/VColorPicker/VColorPicker.mjs.map +1 -1
  97. package/lib/components/VColorPicker/VColorPickerCanvas.mjs +5 -2
  98. package/lib/components/VColorPicker/VColorPickerCanvas.mjs.map +1 -1
  99. package/lib/components/VColorPicker/VColorPickerEdit.mjs +6 -3
  100. package/lib/components/VColorPicker/VColorPickerEdit.mjs.map +1 -1
  101. package/lib/components/VColorPicker/VColorPickerPreview.mjs +6 -3
  102. package/lib/components/VColorPicker/VColorPickerPreview.mjs.map +1 -1
  103. package/lib/components/VColorPicker/VColorPickerSwatches.mjs +7 -5
  104. package/lib/components/VColorPicker/VColorPickerSwatches.mjs.map +1 -1
  105. package/lib/components/VColorPicker/index.d.ts +34 -1
  106. package/lib/components/VCombobox/VCombobox.mjs +2 -1
  107. package/lib/components/VCombobox/VCombobox.mjs.map +1 -1
  108. package/lib/components/VCombobox/index.d.ts +276 -418
  109. package/lib/components/VCounter/VCounter.mjs +4 -1
  110. package/lib/components/VCounter/VCounter.mjs.map +1 -1
  111. package/lib/components/VCounter/index.d.ts +22 -145
  112. package/lib/components/VDefaultsProvider/index.d.ts +0 -12
  113. package/lib/components/VDialog/VDialog.mjs +4 -3
  114. package/lib/components/VDialog/VDialog.mjs.map +1 -1
  115. package/lib/components/VDialog/index.d.ts +104 -282
  116. package/lib/components/VDivider/VDivider.mjs +4 -2
  117. package/lib/components/VDivider/VDivider.mjs.map +1 -1
  118. package/lib/components/VDivider/index.d.ts +22 -13
  119. package/lib/components/VExpansionPanel/VExpansionPanel.mjs +4 -2
  120. package/lib/components/VExpansionPanel/VExpansionPanel.mjs.map +1 -1
  121. package/lib/components/VExpansionPanel/VExpansionPanelText.mjs +4 -1
  122. package/lib/components/VExpansionPanel/VExpansionPanelText.mjs.map +1 -1
  123. package/lib/components/VExpansionPanel/VExpansionPanelTitle.mjs +4 -2
  124. package/lib/components/VExpansionPanel/VExpansionPanelTitle.mjs.map +1 -1
  125. package/lib/components/VExpansionPanel/VExpansionPanels.mjs +4 -1
  126. package/lib/components/VExpansionPanel/VExpansionPanels.mjs.map +1 -1
  127. package/lib/components/VExpansionPanel/index.d.ts +109 -81
  128. package/lib/components/VField/VField.css +59 -12
  129. package/lib/components/VField/VField.mjs +18 -8
  130. package/lib/components/VField/VField.mjs.map +1 -1
  131. package/lib/components/VField/VField.sass +57 -6
  132. package/lib/components/VField/VFieldLabel.mjs +6 -3
  133. package/lib/components/VField/VFieldLabel.mjs.map +1 -1
  134. package/lib/components/VField/_variables.scss +4 -0
  135. package/lib/components/VField/index.d.ts +169 -84
  136. package/lib/components/VFileInput/VFileInput.mjs +2 -1
  137. package/lib/components/VFileInput/VFileInput.mjs.map +1 -1
  138. package/lib/components/VFileInput/index.d.ts +147 -174
  139. package/lib/components/VFooter/VFooter.mjs +4 -2
  140. package/lib/components/VFooter/VFooter.mjs.map +1 -1
  141. package/lib/components/VFooter/index.d.ts +22 -13
  142. package/lib/components/VForm/VForm.mjs +5 -2
  143. package/lib/components/VForm/VForm.mjs.map +1 -1
  144. package/lib/components/VForm/index.d.ts +30 -17
  145. package/lib/components/VGrid/VCol.mjs +4 -1
  146. package/lib/components/VGrid/VCol.mjs.map +1 -1
  147. package/lib/components/VGrid/VContainer.mjs +4 -1
  148. package/lib/components/VGrid/VContainer.mjs.map +1 -1
  149. package/lib/components/VGrid/VRow.mjs +4 -1
  150. package/lib/components/VGrid/VRow.mjs.map +1 -1
  151. package/lib/components/VGrid/index.d.ts +104 -60
  152. package/lib/components/VHover/index.d.ts +20 -44
  153. package/lib/components/VIcon/VIcon.mjs +4 -2
  154. package/lib/components/VIcon/VIcon.mjs.map +1 -1
  155. package/lib/components/VIcon/index.d.ts +23 -26
  156. package/lib/components/VImg/VImg.mjs +5 -3
  157. package/lib/components/VImg/VImg.mjs.map +1 -1
  158. package/lib/components/VImg/index.d.ts +26 -29
  159. package/lib/components/VInput/VInput.mjs +4 -1
  160. package/lib/components/VInput/VInput.mjs.map +1 -1
  161. package/lib/components/VInput/index.d.ts +37 -40
  162. package/lib/components/VItemGroup/VItemGroup.mjs +4 -1
  163. package/lib/components/VItemGroup/VItemGroup.mjs.map +1 -1
  164. package/lib/components/VItemGroup/index.d.ts +30 -33
  165. package/lib/components/VKbd/index.d.ts +30 -17
  166. package/lib/components/VLabel/VLabel.mjs +4 -1
  167. package/lib/components/VLabel/VLabel.mjs.map +1 -1
  168. package/lib/components/VLabel/index.d.ts +22 -13
  169. package/lib/components/VLayout/VLayout.mjs +8 -4
  170. package/lib/components/VLayout/VLayout.mjs.map +1 -1
  171. package/lib/components/VLayout/VLayoutItem.mjs +4 -2
  172. package/lib/components/VLayout/VLayoutItem.mjs.map +1 -1
  173. package/lib/components/VLayout/index.d.ts +44 -26
  174. package/lib/components/VLazy/VLazy.mjs +4 -2
  175. package/lib/components/VLazy/VLazy.mjs.map +1 -1
  176. package/lib/components/VLazy/index.d.ts +22 -13
  177. package/lib/components/VList/VList.mjs +7 -24
  178. package/lib/components/VList/VList.mjs.map +1 -1
  179. package/lib/components/VList/VListChildren.mjs.map +1 -1
  180. package/lib/components/VList/VListGroup.mjs +5 -2
  181. package/lib/components/VList/VListGroup.mjs.map +1 -1
  182. package/lib/components/VList/VListItem.mjs +4 -2
  183. package/lib/components/VList/VListItem.mjs.map +1 -1
  184. package/lib/components/VList/VListItemAction.mjs +4 -1
  185. package/lib/components/VList/VListItemAction.mjs.map +1 -1
  186. package/lib/components/VList/VListItemMedia.mjs +4 -1
  187. package/lib/components/VList/VListItemMedia.mjs.map +1 -1
  188. package/lib/components/VList/VListSubheader.mjs +5 -3
  189. package/lib/components/VList/VListSubheader.mjs.map +1 -1
  190. package/lib/components/VList/index.d.ts +932 -826
  191. package/lib/components/VLocaleProvider/VLocaleProvider.mjs +5 -2
  192. package/lib/components/VLocaleProvider/VLocaleProvider.mjs.map +1 -1
  193. package/lib/components/VLocaleProvider/index.d.ts +30 -17
  194. package/lib/components/VMain/VMain.mjs +4 -2
  195. package/lib/components/VMain/VMain.mjs.map +1 -1
  196. package/lib/components/VMain/index.d.ts +30 -17
  197. package/lib/components/VMenu/VMenu.mjs +2 -1
  198. package/lib/components/VMenu/VMenu.mjs.map +1 -1
  199. package/lib/components/VMenu/index.d.ts +104 -282
  200. package/lib/components/VMessages/VMessages.mjs +4 -2
  201. package/lib/components/VMessages/VMessages.mjs.map +1 -1
  202. package/lib/components/VMessages/index.d.ts +22 -145
  203. package/lib/components/VNavigationDrawer/VNavigationDrawer.mjs +4 -2
  204. package/lib/components/VNavigationDrawer/VNavigationDrawer.mjs.map +1 -1
  205. package/lib/components/VNavigationDrawer/index.d.ts +26 -29
  206. package/lib/components/VNoSsr/VNoSsr.mjs.map +1 -1
  207. package/lib/components/VNoSsr/index.d.ts +3 -13
  208. package/lib/components/VOverlay/VOverlay.mjs +5 -3
  209. package/lib/components/VOverlay/VOverlay.mjs.map +1 -1
  210. package/lib/components/VOverlay/index.d.ts +38 -45
  211. package/lib/components/VPagination/VPagination.mjs +4 -1
  212. package/lib/components/VPagination/VPagination.mjs.map +1 -1
  213. package/lib/components/VPagination/index.d.ts +23 -30
  214. package/lib/components/VParallax/VParallax.mjs +5 -2
  215. package/lib/components/VParallax/VParallax.mjs.map +1 -1
  216. package/lib/components/VParallax/index.d.ts +34 -33
  217. package/lib/components/VProgressCircular/VProgressCircular.mjs +4 -2
  218. package/lib/components/VProgressCircular/VProgressCircular.mjs.map +1 -1
  219. package/lib/components/VProgressCircular/index.d.ts +22 -13
  220. package/lib/components/VProgressLinear/VProgressLinear.mjs +6 -4
  221. package/lib/components/VProgressLinear/VProgressLinear.mjs.map +1 -1
  222. package/lib/components/VProgressLinear/index.d.ts +42 -45
  223. package/lib/components/VRadio/VRadio.mjs +2 -1
  224. package/lib/components/VRadio/VRadio.mjs.map +1 -1
  225. package/lib/components/VRadio/index.d.ts +27 -38
  226. package/lib/components/VRadioGroup/VRadioGroup.mjs +2 -1
  227. package/lib/components/VRadioGroup/VRadioGroup.mjs.map +1 -1
  228. package/lib/components/VRadioGroup/index.d.ts +45 -68
  229. package/lib/components/VRangeSlider/VRangeSlider.mjs +33 -21
  230. package/lib/components/VRangeSlider/VRangeSlider.mjs.map +1 -1
  231. package/lib/components/VRangeSlider/index.d.ts +50 -49
  232. package/lib/components/VRating/VRating.css +0 -4
  233. package/lib/components/VRating/VRating.mjs +10 -36
  234. package/lib/components/VRating/VRating.mjs.map +1 -1
  235. package/lib/components/VRating/VRating.sass +0 -5
  236. package/lib/components/VRating/index.d.ts +24 -18
  237. package/lib/components/VResponsive/VResponsive.mjs +4 -2
  238. package/lib/components/VResponsive/VResponsive.mjs.map +1 -1
  239. package/lib/components/VResponsive/index.d.ts +43 -31
  240. package/lib/components/VSelect/VSelect.mjs +2 -1
  241. package/lib/components/VSelect/VSelect.mjs.map +1 -1
  242. package/lib/components/VSelect/index.d.ts +245 -567
  243. package/lib/components/VSelectionControl/VSelectionControl.mjs +6 -2
  244. package/lib/components/VSelectionControl/VSelectionControl.mjs.map +1 -1
  245. package/lib/components/VSelectionControl/index.d.ts +76 -46
  246. package/lib/components/VSelectionControlGroup/VSelectionControlGroup.mjs +4 -1
  247. package/lib/components/VSelectionControlGroup/VSelectionControlGroup.mjs.map +1 -1
  248. package/lib/components/VSelectionControlGroup/index.d.ts +23 -14
  249. package/lib/components/VSheet/VSheet.mjs +4 -2
  250. package/lib/components/VSheet/VSheet.mjs.map +1 -1
  251. package/lib/components/VSheet/index.d.ts +22 -13
  252. package/lib/components/VSlideGroup/VSlideGroup.mjs +6 -3
  253. package/lib/components/VSlideGroup/VSlideGroup.mjs.map +1 -1
  254. package/lib/components/VSlideGroup/index.d.ts +59 -90
  255. package/lib/components/VSlider/VSlider.mjs +33 -14
  256. package/lib/components/VSlider/VSlider.mjs.map +1 -1
  257. package/lib/components/VSlider/VSliderThumb.mjs +6 -4
  258. package/lib/components/VSlider/VSliderThumb.mjs.map +1 -1
  259. package/lib/components/VSlider/VSliderTrack.mjs +6 -4
  260. package/lib/components/VSlider/VSliderTrack.mjs.map +1 -1
  261. package/lib/components/VSlider/index.d.ts +50 -49
  262. package/lib/components/VSlider/slider.mjs +43 -23
  263. package/lib/components/VSlider/slider.mjs.map +1 -1
  264. package/lib/components/VSnackbar/VSnackbar.mjs +2 -1
  265. package/lib/components/VSnackbar/VSnackbar.mjs.map +1 -1
  266. package/lib/components/VSnackbar/index.d.ts +92 -142
  267. package/lib/components/VSwitch/VSwitch.mjs +2 -1
  268. package/lib/components/VSwitch/VSwitch.mjs.map +1 -1
  269. package/lib/components/VSwitch/index.d.ts +45 -72
  270. package/lib/components/VSystemBar/VSystemBar.mjs +4 -2
  271. package/lib/components/VSystemBar/VSystemBar.mjs.map +1 -1
  272. package/lib/components/VSystemBar/index.d.ts +22 -13
  273. package/lib/components/VTable/VTable.mjs +4 -1
  274. package/lib/components/VTable/VTable.mjs.map +1 -1
  275. package/lib/components/VTable/index.d.ts +26 -29
  276. package/lib/components/VTabs/VTab.mjs +3 -4
  277. package/lib/components/VTabs/VTab.mjs.map +1 -1
  278. package/lib/components/VTabs/VTabs.mjs +2 -2
  279. package/lib/components/VTabs/VTabs.mjs.map +1 -1
  280. package/lib/components/VTabs/index.d.ts +51 -33
  281. package/lib/components/VTextField/VTextField.mjs +2 -1
  282. package/lib/components/VTextField/VTextField.mjs.map +1 -1
  283. package/lib/components/VTextField/index.d.ts +337 -317
  284. package/lib/components/VTextarea/VTextarea.mjs +2 -1
  285. package/lib/components/VTextarea/VTextarea.mjs.map +1 -1
  286. package/lib/components/VTextarea/index.d.ts +127 -146
  287. package/lib/components/VThemeProvider/VThemeProvider.mjs +6 -3
  288. package/lib/components/VThemeProvider/VThemeProvider.mjs.map +1 -1
  289. package/lib/components/VThemeProvider/index.d.ts +22 -13
  290. package/lib/components/VTimeline/VTimeline.mjs +5 -3
  291. package/lib/components/VTimeline/VTimeline.mjs.map +1 -1
  292. package/lib/components/VTimeline/VTimelineDivider.mjs +4 -1
  293. package/lib/components/VTimeline/VTimelineDivider.mjs.map +1 -1
  294. package/lib/components/VTimeline/VTimelineItem.mjs +8 -6
  295. package/lib/components/VTimeline/VTimelineItem.mjs.map +1 -1
  296. package/lib/components/VTimeline/index.d.ts +67 -57
  297. package/lib/components/VToolbar/VToolbar.css +3 -1
  298. package/lib/components/VToolbar/VToolbar.mjs +4 -2
  299. package/lib/components/VToolbar/VToolbar.mjs.map +1 -1
  300. package/lib/components/VToolbar/VToolbar.sass +3 -1
  301. package/lib/components/VToolbar/VToolbarItems.mjs +9 -4
  302. package/lib/components/VToolbar/VToolbarItems.mjs.map +1 -1
  303. package/lib/components/VToolbar/VToolbarTitle.mjs +5 -2
  304. package/lib/components/VToolbar/VToolbarTitle.mjs.map +1 -1
  305. package/lib/components/VToolbar/index.d.ts +74 -71
  306. package/lib/components/VTooltip/VTooltip.mjs +4 -3
  307. package/lib/components/VTooltip/VTooltip.mjs.map +1 -1
  308. package/lib/components/VTooltip/index.d.ts +119 -150
  309. package/lib/components/VValidation/index.d.ts +6 -18
  310. package/lib/{labs → components}/VVirtualScroll/VVirtualScroll.mjs +21 -23
  311. package/lib/components/VVirtualScroll/VVirtualScroll.mjs.map +1 -0
  312. package/lib/{labs → components}/VVirtualScroll/VVirtualScrollItem.mjs +5 -2
  313. package/lib/components/VVirtualScroll/VVirtualScrollItem.mjs.map +1 -0
  314. package/lib/{labs → components}/VVirtualScroll/index.d.ts +70 -30
  315. package/lib/components/VVirtualScroll/index.mjs.map +1 -0
  316. package/lib/components/VWindow/VWindow.mjs +4 -1
  317. package/lib/components/VWindow/VWindow.mjs.map +1 -1
  318. package/lib/components/VWindow/VWindowItem.mjs +4 -1
  319. package/lib/components/VWindow/VWindowItem.mjs.map +1 -1
  320. package/lib/components/VWindow/index.d.ts +61 -79
  321. package/lib/components/index.d.ts +5834 -6865
  322. package/lib/components/index.mjs +2 -1
  323. package/lib/components/index.mjs.map +1 -1
  324. package/lib/components/transitions/index.d.ts +0 -192
  325. package/lib/composables/component.mjs +11 -0
  326. package/lib/composables/component.mjs.map +1 -0
  327. package/lib/composables/defaults.mjs +53 -5
  328. package/lib/composables/defaults.mjs.map +1 -1
  329. package/lib/composables/focus.mjs.map +1 -1
  330. package/lib/composables/icons.mjs +15 -4
  331. package/lib/composables/icons.mjs.map +1 -1
  332. package/lib/composables/index.mjs +1 -0
  333. package/lib/composables/index.mjs.map +1 -1
  334. package/lib/composables/intersectionObserver.mjs +2 -2
  335. package/lib/composables/intersectionObserver.mjs.map +1 -1
  336. package/lib/composables/loader.mjs.map +1 -1
  337. package/lib/composables/scroll.mjs +3 -0
  338. package/lib/composables/scroll.mjs.map +1 -1
  339. package/lib/entry-bundler.mjs +1 -1
  340. package/lib/entry-bundler.mjs.map +1 -1
  341. package/lib/framework.mjs +8 -3
  342. package/lib/framework.mjs.map +1 -1
  343. package/lib/iconsets/fa-svg.d.ts +1 -1
  344. package/lib/iconsets/fa.d.ts +1 -1
  345. package/lib/iconsets/fa4.d.ts +1 -1
  346. package/lib/iconsets/md.d.ts +1 -1
  347. package/lib/iconsets/mdi-svg.d.ts +1 -1
  348. package/lib/iconsets/mdi.d.ts +1 -1
  349. package/lib/index.d.ts +65 -22
  350. package/lib/labs/VDataTable/VDataTable.mjs +1 -1
  351. package/lib/labs/VDataTable/VDataTable.mjs.map +1 -1
  352. package/lib/labs/VDataTable/VDataTableHeaders.mjs +34 -20
  353. package/lib/labs/VDataTable/VDataTableHeaders.mjs.map +1 -1
  354. package/lib/labs/VDataTable/VDataTableRow.mjs +2 -4
  355. package/lib/labs/VDataTable/VDataTableRow.mjs.map +1 -1
  356. package/lib/labs/VDataTable/VDataTableRows.mjs +2 -2
  357. package/lib/labs/VDataTable/VDataTableRows.mjs.map +1 -1
  358. package/lib/labs/VDataTable/VDataTableServer.mjs +1 -1
  359. package/lib/labs/VDataTable/VDataTableServer.mjs.map +1 -1
  360. package/lib/labs/VDataTable/index.d.ts +61 -933
  361. package/lib/labs/VInfiniteScroll/VInfiniteScroll.css +26 -0
  362. package/lib/labs/VInfiniteScroll/VInfiniteScroll.mjs +215 -0
  363. package/lib/labs/VInfiniteScroll/VInfiniteScroll.mjs.map +1 -0
  364. package/lib/labs/VInfiniteScroll/VInfiniteScroll.sass +25 -0
  365. package/lib/labs/VInfiniteScroll/_variables.scss +3 -0
  366. package/lib/labs/VInfiniteScroll/index.d.ts +321 -0
  367. package/lib/labs/VInfiniteScroll/index.mjs +2 -0
  368. package/lib/labs/VInfiniteScroll/index.mjs.map +1 -0
  369. package/lib/labs/VSkeletonLoader/index.d.ts +0 -12
  370. package/lib/labs/components.d.ts +377 -1097
  371. package/lib/labs/components.mjs +1 -1
  372. package/lib/labs/components.mjs.map +1 -1
  373. package/lib/labs/date/DateAdapter.mjs +2 -0
  374. package/lib/labs/date/DateAdapter.mjs.map +1 -0
  375. package/lib/labs/date/adapters/vuetify.d.ts +52 -0
  376. package/lib/labs/date/adapters/vuetify.mjs +399 -0
  377. package/lib/labs/date/adapters/vuetify.mjs.map +1 -0
  378. package/lib/labs/date/date.mjs +39 -0
  379. package/lib/labs/date/date.mjs.map +1 -0
  380. package/lib/labs/date/index.d.ts +40 -0
  381. package/lib/labs/date/index.mjs +2 -0
  382. package/lib/labs/date/index.mjs.map +1 -0
  383. package/lib/labs/index.mjs +3 -2
  384. package/lib/labs/index.mjs.map +1 -1
  385. package/lib/locale/af.mjs +5 -1
  386. package/lib/locale/af.mjs.map +1 -1
  387. package/lib/locale/ar.mjs +5 -1
  388. package/lib/locale/ar.mjs.map +1 -1
  389. package/lib/locale/az.mjs +5 -1
  390. package/lib/locale/az.mjs.map +1 -1
  391. package/lib/locale/bg.mjs +5 -1
  392. package/lib/locale/bg.mjs.map +1 -1
  393. package/lib/locale/ca.mjs +5 -1
  394. package/lib/locale/ca.mjs.map +1 -1
  395. package/lib/locale/ckb.mjs +5 -1
  396. package/lib/locale/ckb.mjs.map +1 -1
  397. package/lib/locale/cs.mjs +5 -1
  398. package/lib/locale/cs.mjs.map +1 -1
  399. package/lib/locale/da.mjs +5 -1
  400. package/lib/locale/da.mjs.map +1 -1
  401. package/lib/locale/de.mjs +5 -1
  402. package/lib/locale/de.mjs.map +1 -1
  403. package/lib/locale/el.mjs +5 -1
  404. package/lib/locale/el.mjs.map +1 -1
  405. package/lib/locale/en.mjs +5 -1
  406. package/lib/locale/en.mjs.map +1 -1
  407. package/lib/locale/es.mjs +5 -1
  408. package/lib/locale/es.mjs.map +1 -1
  409. package/lib/locale/et.mjs +5 -1
  410. package/lib/locale/et.mjs.map +1 -1
  411. package/lib/locale/fa.mjs +5 -1
  412. package/lib/locale/fa.mjs.map +1 -1
  413. package/lib/locale/fi.mjs +5 -1
  414. package/lib/locale/fi.mjs.map +1 -1
  415. package/lib/locale/fr.mjs +5 -1
  416. package/lib/locale/fr.mjs.map +1 -1
  417. package/lib/locale/he.mjs +5 -1
  418. package/lib/locale/he.mjs.map +1 -1
  419. package/lib/locale/hr.mjs +5 -1
  420. package/lib/locale/hr.mjs.map +1 -1
  421. package/lib/locale/hu.mjs +5 -1
  422. package/lib/locale/hu.mjs.map +1 -1
  423. package/lib/locale/id.mjs +5 -1
  424. package/lib/locale/id.mjs.map +1 -1
  425. package/lib/locale/index.d.ts +168 -0
  426. package/lib/locale/it.mjs +5 -1
  427. package/lib/locale/it.mjs.map +1 -1
  428. package/lib/locale/ja.mjs +5 -1
  429. package/lib/locale/ja.mjs.map +1 -1
  430. package/lib/locale/ko.mjs +5 -1
  431. package/lib/locale/ko.mjs.map +1 -1
  432. package/lib/locale/lt.mjs +5 -1
  433. package/lib/locale/lt.mjs.map +1 -1
  434. package/lib/locale/lv.mjs +5 -1
  435. package/lib/locale/lv.mjs.map +1 -1
  436. package/lib/locale/nl.mjs +5 -1
  437. package/lib/locale/nl.mjs.map +1 -1
  438. package/lib/locale/no.mjs +5 -1
  439. package/lib/locale/no.mjs.map +1 -1
  440. package/lib/locale/pl.mjs +5 -1
  441. package/lib/locale/pl.mjs.map +1 -1
  442. package/lib/locale/pt.mjs +5 -1
  443. package/lib/locale/pt.mjs.map +1 -1
  444. package/lib/locale/ro.mjs +5 -1
  445. package/lib/locale/ro.mjs.map +1 -1
  446. package/lib/locale/ru.mjs +5 -1
  447. package/lib/locale/ru.mjs.map +1 -1
  448. package/lib/locale/sk.mjs +5 -1
  449. package/lib/locale/sk.mjs.map +1 -1
  450. package/lib/locale/sl.mjs +5 -1
  451. package/lib/locale/sl.mjs.map +1 -1
  452. package/lib/locale/sr-Cyrl.mjs +5 -1
  453. package/lib/locale/sr-Cyrl.mjs.map +1 -1
  454. package/lib/locale/sr-Latn.mjs +5 -1
  455. package/lib/locale/sr-Latn.mjs.map +1 -1
  456. package/lib/locale/sv.mjs +5 -1
  457. package/lib/locale/sv.mjs.map +1 -1
  458. package/lib/locale/th.mjs +5 -1
  459. package/lib/locale/th.mjs.map +1 -1
  460. package/lib/locale/tr.mjs +5 -1
  461. package/lib/locale/tr.mjs.map +1 -1
  462. package/lib/locale/uk.mjs +5 -1
  463. package/lib/locale/uk.mjs.map +1 -1
  464. package/lib/locale/vi.mjs +5 -1
  465. package/lib/locale/vi.mjs.map +1 -1
  466. package/lib/locale/zh-Hans.mjs +5 -1
  467. package/lib/locale/zh-Hans.mjs.map +1 -1
  468. package/lib/locale/zh-Hant.mjs +5 -1
  469. package/lib/locale/zh-Hant.mjs.map +1 -1
  470. package/lib/styles/main.css +152 -0
  471. package/lib/styles/settings/_utilities.scss +11 -1
  472. package/lib/util/createSimpleFunctional.mjs +9 -4
  473. package/lib/util/createSimpleFunctional.mjs.map +1 -1
  474. package/lib/util/defineComponent.mjs +11 -43
  475. package/lib/util/defineComponent.mjs.map +1 -1
  476. package/lib/util/helpers.mjs +32 -2
  477. package/lib/util/helpers.mjs.map +1 -1
  478. package/lib/util/index.mjs +1 -0
  479. package/lib/util/index.mjs.map +1 -1
  480. package/package.json +4 -3
  481. package/lib/labs/VVirtualScroll/VVirtualScroll.mjs.map +0 -1
  482. package/lib/labs/VVirtualScroll/VVirtualScrollItem.mjs.map +0 -1
  483. package/lib/labs/VVirtualScroll/index.mjs.map +0 -1
  484. /package/lib/{labs → components}/VVirtualScroll/VVirtualScroll.css +0 -0
  485. /package/lib/{labs → components}/VVirtualScroll/VVirtualScroll.sass +0 -0
  486. /package/lib/{labs → components}/VVirtualScroll/index.mjs +0 -0
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.1.15
2
+ * Vuetify v3.2.0
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -171,11 +171,11 @@
171
171
  function keys(o) {
172
172
  return Object.keys(o);
173
173
  }
174
- function pick(obj, paths) {
174
+ function pick(obj, paths, exclude) {
175
175
  const found = Object.create(null);
176
176
  const rest = Object.create(null);
177
177
  for (const key in obj) {
178
- if (paths.some(path => path instanceof RegExp ? path.test(key) : path === key)) {
178
+ if (paths.some(path => path instanceof RegExp ? path.test(key) : path === key) && !exclude?.some(path => path === key)) {
179
179
  found[key] = obj[key];
180
180
  } else {
181
181
  rest[key] = obj[key];
@@ -360,6 +360,32 @@
360
360
  handler(...args);
361
361
  }
362
362
  }
363
+ function focusableChildren(el) {
364
+ const targets = ['button', '[href]', 'input:not([type="hidden"])', 'select', 'textarea', '[tabindex]'].map(s => `${s}:not([tabindex="-1"]):not([disabled])`).join(', ');
365
+ return [...el.querySelectorAll(targets)];
366
+ }
367
+ function focusChild(el, location) {
368
+ const focusable = focusableChildren(el);
369
+ const idx = focusable.indexOf(document.activeElement);
370
+ if (!location) {
371
+ if (!el.contains(document.activeElement)) {
372
+ focusable[0]?.focus();
373
+ }
374
+ } else if (location === 'first') {
375
+ focusable[0]?.focus();
376
+ } else if (location === 'last') {
377
+ focusable.at(-1)?.focus();
378
+ } else {
379
+ let _el;
380
+ let idxx = idx;
381
+ const inc = location === 'next' ? 1 : -1;
382
+ do {
383
+ idxx += inc;
384
+ _el = focusable[idxx];
385
+ } while ((!_el || _el.offsetParent == null) && idxx < focusable.length && idxx >= 0);
386
+ if (_el) _el.focus();else focusChild(el, location === 'next' ? 'first' : 'last');
387
+ }
388
+ }
363
389
 
364
390
  const block = ['top', 'bottom'];
365
391
  const inline = ['start', 'end', 'left', 'right'];
@@ -860,44 +886,6 @@
860
886
  return (light + 0.05) / (dark + 0.05);
861
887
  }
862
888
 
863
- // Utilities
864
- function getCurrentInstance(name, message) {
865
- const vm = vue.getCurrentInstance();
866
- if (!vm) {
867
- throw new Error(`[Vuetify] ${name} ${message || 'must be called from inside a setup function'}`);
868
- }
869
- return vm;
870
- }
871
- function getCurrentInstanceName() {
872
- let name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'composables';
873
- const vm = getCurrentInstance(name).type;
874
- return toKebabCase(vm?.aliasName || vm?.name);
875
- }
876
- let _uid = 0;
877
- let _map = new WeakMap();
878
- function getUid() {
879
- const vm = getCurrentInstance('getUid');
880
- if (_map.has(vm)) return _map.get(vm);else {
881
- const uid = _uid++;
882
- _map.set(vm, uid);
883
- return uid;
884
- }
885
- }
886
- getUid.reset = () => {
887
- _uid = 0;
888
- _map = new WeakMap();
889
- };
890
-
891
- function injectSelf(key) {
892
- const {
893
- provides
894
- } = getCurrentInstance('injectSelf');
895
- if (provides && key in provides) {
896
- // TS doesn't allow symbol as index type
897
- return provides[key];
898
- }
899
- }
900
-
901
889
  /**
902
890
  * Creates a factory function for props definitions.
903
891
  * This is used to define props in a composable then override
@@ -951,17 +939,54 @@
951
939
 
952
940
  // Types
953
941
 
942
+ // Composables
943
+ const makeComponentProps = propsFactory({
944
+ class: [String, Array],
945
+ style: {
946
+ type: [String, Array, Object],
947
+ default: null
948
+ }
949
+ }, 'component');
950
+
951
+ function useToggleScope(source, fn) {
952
+ let scope;
953
+ function start() {
954
+ scope = vue.effectScope();
955
+ scope.run(() => fn.length ? fn(() => {
956
+ scope?.stop();
957
+ start();
958
+ }) : fn());
959
+ }
960
+ vue.watch(source, active => {
961
+ if (active && !scope) {
962
+ start();
963
+ } else if (!active) {
964
+ scope?.stop();
965
+ scope = undefined;
966
+ }
967
+ }, {
968
+ immediate: true
969
+ });
970
+ vue.onScopeDispose(() => {
971
+ scope?.stop();
972
+ });
973
+ }
974
+
975
+ // Composables
976
+
977
+ // Types
978
+
954
979
  const DefaultsSymbol = Symbol.for('vuetify:defaults');
955
980
  function createDefaults(options) {
956
981
  return vue.ref(options);
957
982
  }
958
- function useDefaults() {
983
+ function injectDefaults() {
959
984
  const defaults = vue.inject(DefaultsSymbol);
960
985
  if (!defaults) throw new Error('[Vuetify] Could not find defaults instance');
961
986
  return defaults;
962
987
  }
963
988
  function provideDefaults(defaults, options) {
964
- const injectedDefaults = useDefaults();
989
+ const injectedDefaults = injectDefaults();
965
990
  const providedDefaults = vue.ref(defaults);
966
991
  const newDefaults = vue.computed(() => {
967
992
  const disabled = vue.unref(options?.disabled);
@@ -988,41 +1013,58 @@
988
1013
  vue.provide(DefaultsSymbol, newDefaults);
989
1014
  return newDefaults;
990
1015
  }
991
-
992
- function useToggleScope(source, fn) {
993
- let scope;
994
- function start() {
995
- scope = vue.effectScope();
996
- scope.run(() => fn.length ? fn(() => {
997
- scope?.stop();
998
- start();
999
- }) : fn());
1000
- }
1001
- vue.watch(source, active => {
1002
- if (active && !scope) {
1003
- start();
1004
- } else if (!active) {
1005
- scope?.stop();
1006
- scope = undefined;
1016
+ function propIsDefined(vnode, prop) {
1017
+ return typeof vnode.props?.[prop] !== 'undefined' || typeof vnode.props?.[toKebabCase(prop)] !== 'undefined';
1018
+ }
1019
+ function useDefaults() {
1020
+ let props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
1021
+ let name = arguments.length > 1 ? arguments[1] : undefined;
1022
+ let defaults = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : injectDefaults();
1023
+ const vm = getCurrentInstance('useDefaults');
1024
+ name = name ?? vm.type.name ?? vm.type.__name;
1025
+ if (!name) {
1026
+ throw new Error('[Vuetify] Could not determine component name');
1027
+ }
1028
+ const componentDefaults = vue.computed(() => defaults.value?.[props._as ?? name]);
1029
+ const _props = new Proxy(props, {
1030
+ get(target, prop) {
1031
+ const propValue = Reflect.get(target, prop);
1032
+ if (prop === 'class' || prop === 'style') {
1033
+ return [componentDefaults.value?.[prop], propValue].filter(v => v != null);
1034
+ } else if (typeof prop === 'string' && !propIsDefined(vm.vnode, prop)) {
1035
+ return componentDefaults.value?.[prop] ?? defaults.value?.global?.[prop] ?? propValue;
1036
+ }
1037
+ return propValue;
1007
1038
  }
1008
- }, {
1009
- immediate: true
1010
1039
  });
1011
- vue.onScopeDispose(() => {
1012
- scope?.stop();
1040
+ const _subcomponentDefaults = vue.shallowRef();
1041
+ vue.watchEffect(() => {
1042
+ if (componentDefaults.value) {
1043
+ const subComponents = Object.entries(componentDefaults.value).filter(_ref => {
1044
+ let [key] = _ref;
1045
+ return key.startsWith(key[0].toUpperCase());
1046
+ });
1047
+ if (subComponents.length) _subcomponentDefaults.value = Object.fromEntries(subComponents);
1048
+ }
1013
1049
  });
1050
+ function provideSubDefaults() {
1051
+ // If subcomponent defaults are provided, override any
1052
+ // subcomponents provided by the component's setup function.
1053
+ // This uses injectSelf so must be done after the original setup to work.
1054
+ useToggleScope(_subcomponentDefaults, () => {
1055
+ provideDefaults(mergeDeep(injectSelf(DefaultsSymbol)?.value ?? {}, _subcomponentDefaults.value));
1056
+ });
1057
+ }
1058
+ return {
1059
+ props: _props,
1060
+ provideSubDefaults
1061
+ };
1014
1062
  }
1015
1063
 
1016
1064
  // Utils
1017
1065
 
1018
1066
  // Types
1019
1067
 
1020
- function propIsDefined(vnode, prop) {
1021
- return typeof vnode.props?.[prop] !== 'undefined' || typeof vnode.props?.[toKebabCase(prop)] !== 'undefined';
1022
- }
1023
-
1024
- // No props
1025
-
1026
1068
  // Implementation
1027
1069
  function defineComponent(options) {
1028
1070
  options._setup = options._setup ?? options.setup;
@@ -1034,43 +1076,20 @@
1034
1076
  options.props = propsFactory(options.props ?? {}, toKebabCase(options.name))();
1035
1077
  const propKeys = Object.keys(options.props);
1036
1078
  options.filterProps = function filterProps(props) {
1037
- return pick(props, propKeys);
1079
+ return pick(props, propKeys, ['class', 'style']);
1038
1080
  };
1039
1081
  options.props._as = String;
1040
1082
  options.setup = function setup(props, ctx) {
1041
- const defaults = useDefaults();
1083
+ const defaults = injectDefaults();
1042
1084
 
1043
1085
  // Skip props proxy if defaults are not provided
1044
1086
  if (!defaults.value) return options._setup(props, ctx);
1045
- const vm = vue.getCurrentInstance();
1046
- const componentDefaults = vue.computed(() => defaults.value[props._as ?? options.name]);
1047
- const _props = new Proxy(props, {
1048
- get(target, prop) {
1049
- const propValue = Reflect.get(target, prop);
1050
- if (typeof prop === 'string' && !propIsDefined(vm.vnode, prop)) {
1051
- return componentDefaults.value?.[prop] ?? defaults.value.global?.[prop] ?? propValue;
1052
- }
1053
- return propValue;
1054
- }
1055
- });
1056
- const _subcomponentDefaults = vue.shallowRef();
1057
- vue.watchEffect(() => {
1058
- if (componentDefaults.value) {
1059
- const subComponents = Object.entries(componentDefaults.value).filter(_ref => {
1060
- let [key] = _ref;
1061
- return key.startsWith(key[0].toUpperCase());
1062
- });
1063
- if (subComponents.length) _subcomponentDefaults.value = Object.fromEntries(subComponents);
1064
- }
1065
- });
1087
+ const {
1088
+ props: _props,
1089
+ provideSubDefaults
1090
+ } = useDefaults(props, props._as ?? options.name, defaults);
1066
1091
  const setupBindings = options._setup(_props, ctx);
1067
-
1068
- // If subcomponent defaults are provided, override any
1069
- // subcomponents provided by the component's setup function.
1070
- // This uses injectSelf so must be done after the original setup to work.
1071
- useToggleScope(_subcomponentDefaults, () => {
1072
- provideDefaults(mergeDeep(injectSelf(DefaultsSymbol)?.value ?? {}, _subcomponentDefaults.value));
1073
- });
1092
+ provideSubDefaults();
1074
1093
  return setupBindings;
1075
1094
  };
1076
1095
  }
@@ -1095,15 +1114,19 @@
1095
1114
  tag: {
1096
1115
  type: String,
1097
1116
  default: tag
1098
- }
1117
+ },
1118
+ ...makeComponentProps()
1099
1119
  },
1100
1120
  setup(props, _ref) {
1101
1121
  let {
1102
1122
  slots
1103
1123
  } = _ref;
1104
- return () => vue.h(props.tag, {
1105
- class: klass
1106
- }, slots.default?.());
1124
+ return () => {
1125
+ return vue.h(props.tag, {
1126
+ class: [klass, props.class],
1127
+ style: props.style
1128
+ }, slots.default?.());
1129
+ };
1107
1130
  }
1108
1131
  });
1109
1132
  }
@@ -1136,6 +1159,34 @@
1136
1159
  const deceleratedEasing = 'cubic-bezier(0.0, 0, 0.2, 1)'; // Entering
1137
1160
  const acceleratedEasing = 'cubic-bezier(0.4, 0, 1, 1)'; // Leaving
1138
1161
 
1162
+ // Utilities
1163
+ function getCurrentInstance(name, message) {
1164
+ const vm = vue.getCurrentInstance();
1165
+ if (!vm) {
1166
+ throw new Error(`[Vuetify] ${name} ${message || 'must be called from inside a setup function'}`);
1167
+ }
1168
+ return vm;
1169
+ }
1170
+ function getCurrentInstanceName() {
1171
+ let name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'composables';
1172
+ const vm = getCurrentInstance(name).type;
1173
+ return toKebabCase(vm?.aliasName || vm?.name);
1174
+ }
1175
+ let _uid = 0;
1176
+ let _map = new WeakMap();
1177
+ function getUid() {
1178
+ const vm = getCurrentInstance('getUid');
1179
+ if (_map.has(vm)) return _map.get(vm);else {
1180
+ const uid = _uid++;
1181
+ _map.set(vm, uid);
1182
+ return uid;
1183
+ }
1184
+ }
1185
+ getUid.reset = () => {
1186
+ _uid = 0;
1187
+ _map = new WeakMap();
1188
+ };
1189
+
1139
1190
  function getScrollParent(el) {
1140
1191
  while (el) {
1141
1192
  if (hasScrollbar(el)) return el;
@@ -1159,6 +1210,16 @@
1159
1210
  return style.overflowY === 'scroll' || style.overflowY === 'auto' && el.scrollHeight > el.clientHeight;
1160
1211
  }
1161
1212
 
1213
+ function injectSelf(key) {
1214
+ const {
1215
+ provides
1216
+ } = getCurrentInstance('injectSelf');
1217
+ if (provides && key in provides) {
1218
+ // TS doesn't allow symbol as index type
1219
+ return provides[key];
1220
+ }
1221
+ }
1222
+
1162
1223
  function isFixedPosition(el) {
1163
1224
  while (el) {
1164
1225
  if (window.getComputedStyle(el).position === 'fixed') {
@@ -1939,7 +2000,11 @@
1939
2000
  item: 'Rating {0} of {1}'
1940
2001
  }
1941
2002
  },
1942
- loading: 'Loading...'
2003
+ loading: 'Loading...',
2004
+ infiniteScroll: {
2005
+ loadMore: 'Load more',
2006
+ empty: 'No more'
2007
+ }
1943
2008
  };
1944
2009
 
1945
2010
  const LANG_PREFIX = '$vuetify.';
@@ -2137,6 +2202,7 @@
2137
2202
  const VApp = genericComponent()({
2138
2203
  name: 'VApp',
2139
2204
  props: {
2205
+ ...makeComponentProps(),
2140
2206
  ...makeLayoutProps({
2141
2207
  fullHeight: true
2142
2208
  }),
@@ -2159,8 +2225,8 @@
2159
2225
  } = useRtl();
2160
2226
  useRender(() => vue.createVNode("div", {
2161
2227
  "ref": layoutRef,
2162
- "class": ['v-application', theme.themeClasses.value, layoutClasses.value, rtlClasses.value],
2163
- "style": layoutStyles.value
2228
+ "class": ['v-application', theme.themeClasses.value, layoutClasses.value, rtlClasses.value, props.class],
2229
+ "style": [layoutStyles.value, props.style]
2164
2230
  }, [vue.createVNode("div", {
2165
2231
  "class": "v-application__wrap"
2166
2232
  }, [slots.default?.()])]));
@@ -2585,6 +2651,7 @@
2585
2651
  props: {
2586
2652
  aspectRatio: [String, Number],
2587
2653
  contentClass: String,
2654
+ ...makeComponentProps(),
2588
2655
  ...makeDimensionProps()
2589
2656
  },
2590
2657
  setup(props, _ref) {
@@ -2598,8 +2665,8 @@
2598
2665
  dimensionStyles
2599
2666
  } = useDimension(props);
2600
2667
  useRender(() => vue.createVNode("div", {
2601
- "class": "v-responsive",
2602
- "style": dimensionStyles.value
2668
+ "class": ['v-responsive', props.class],
2669
+ "style": [dimensionStyles.value, props.style]
2603
2670
  }, [vue.createVNode("div", {
2604
2671
  "class": "v-responsive__sizer",
2605
2672
  "style": aspectStyles.value
@@ -2717,6 +2784,7 @@
2717
2784
  },
2718
2785
  srcset: String,
2719
2786
  width: [String, Number],
2787
+ ...makeComponentProps(),
2720
2788
  ...makeTransitionProps()
2721
2789
  },
2722
2790
  emits: {
@@ -2904,10 +2972,10 @@
2904
2972
  useRender(() => vue.withDirectives(vue.createVNode(VResponsive, {
2905
2973
  "class": ['v-img', {
2906
2974
  'v-img--booting': !isBooted.value
2907
- }],
2908
- "style": {
2975
+ }, props.class],
2976
+ "style": [{
2909
2977
  width: convertToUnit(props.width === 'auto' ? naturalWidth.value : props.width)
2910
- },
2978
+ }, props.style],
2911
2979
  "aspectRatio": aspectRatio.value,
2912
2980
  "aria-label": props.alt,
2913
2981
  "role": props.alt ? 'img' : undefined
@@ -2942,10 +3010,9 @@
2942
3010
  }
2943
3011
  }, 'tag');
2944
3012
 
2945
- // Types
2946
-
2947
3013
  const makeVToolbarTitleProps = propsFactory({
2948
3014
  text: String,
3015
+ ...makeComponentProps(),
2949
3016
  ...makeTagProps()
2950
3017
  }, 'v-toolbar-title');
2951
3018
  const VToolbarTitle = genericComponent()({
@@ -2958,7 +3025,8 @@
2958
3025
  useRender(() => {
2959
3026
  const hasText = !!(slots.default || slots.text || props.text);
2960
3027
  return vue.createVNode(props.tag, {
2961
- "class": "v-toolbar-title"
3028
+ "class": ['v-toolbar-title', props.class],
3029
+ "style": props.style
2962
3030
  }, {
2963
3031
  default: () => [hasText && vue.createVNode("div", {
2964
3032
  "class": "v-toolbar-title__placeholder"
@@ -3139,6 +3207,7 @@
3139
3207
  image: String,
3140
3208
  title: String,
3141
3209
  ...makeBorderProps(),
3210
+ ...makeComponentProps(),
3142
3211
  ...makeElevationProps(),
3143
3212
  ...makeRoundedProps(),
3144
3213
  ...makeTagProps({
@@ -3189,8 +3258,8 @@
3189
3258
  'v-toolbar--flat': props.flat,
3190
3259
  'v-toolbar--floating': props.floating,
3191
3260
  [`v-toolbar--density-${props.density}`]: true
3192
- }, backgroundColorClasses.value, borderClasses.value, elevationClasses.value, roundedClasses.value, themeClasses.value],
3193
- "style": [backgroundColorStyles.value]
3261
+ }, backgroundColorClasses.value, borderClasses.value, elevationClasses.value, roundedClasses.value, themeClasses.value, props.class],
3262
+ "style": [backgroundColorStyles.value, props.style]
3194
3263
  }, {
3195
3264
  default: () => [hasImage && vue.createVNode("div", {
3196
3265
  "key": "image",
@@ -3257,6 +3326,98 @@
3257
3326
 
3258
3327
  // Utilities
3259
3328
 
3329
+ // Types
3330
+
3331
+ // Composables
3332
+ const makeScrollProps = propsFactory({
3333
+ scrollTarget: {
3334
+ type: String
3335
+ },
3336
+ scrollThreshold: {
3337
+ type: [String, Number]
3338
+ }
3339
+ }, 'scroll');
3340
+ function useScroll(props) {
3341
+ let args = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
3342
+ const {
3343
+ thresholdMetCallback,
3344
+ scrollThreshold,
3345
+ canScroll
3346
+ } = args;
3347
+ let previousScroll = 0;
3348
+ const target = vue.ref(null);
3349
+ const currentScroll = vue.ref(0);
3350
+ const savedScroll = vue.ref(0);
3351
+ const currentThreshold = vue.ref(0);
3352
+ const isScrollActive = vue.ref(false);
3353
+ const isScrollingUp = vue.ref(false);
3354
+ const computedScrollThreshold = vue.computed(() => {
3355
+ return Number(props.scrollThreshold ?? scrollThreshold ?? 300);
3356
+ });
3357
+ const onScroll = () => {
3358
+ const targetEl = target.value;
3359
+ if (!targetEl || canScroll && !canScroll.value) return;
3360
+ previousScroll = currentScroll.value;
3361
+ currentScroll.value = 'window' in targetEl ? targetEl.pageYOffset : targetEl.scrollTop;
3362
+ isScrollingUp.value = currentScroll.value < previousScroll;
3363
+ currentThreshold.value = Math.abs(currentScroll.value - computedScrollThreshold.value);
3364
+ };
3365
+ vue.watch(isScrollingUp, () => {
3366
+ savedScroll.value = savedScroll.value || currentScroll.value;
3367
+ });
3368
+ vue.watch(isScrollActive, () => {
3369
+ savedScroll.value = 0;
3370
+ });
3371
+ vue.onMounted(() => {
3372
+ vue.watch(() => props.scrollTarget, scrollTarget => {
3373
+ const newTarget = scrollTarget ? document.querySelector(scrollTarget) : window;
3374
+ if (!newTarget) {
3375
+ consoleWarn(`Unable to locate element with identifier ${scrollTarget}`, vue.getCurrentInstance());
3376
+ return;
3377
+ }
3378
+ if (newTarget === target.value) return;
3379
+ target.value?.removeEventListener('scroll', onScroll);
3380
+ target.value = newTarget;
3381
+ target.value.addEventListener('scroll', onScroll, {
3382
+ passive: true
3383
+ });
3384
+ }, {
3385
+ immediate: true
3386
+ });
3387
+ });
3388
+ vue.onBeforeUnmount(() => {
3389
+ target.value?.removeEventListener('scroll', onScroll);
3390
+ });
3391
+ thresholdMetCallback && vue.watch(() => Math.abs(currentScroll.value - savedScroll.value) > computedScrollThreshold.value, thresholdMet => {
3392
+ thresholdMet && thresholdMetCallback({
3393
+ currentThreshold: currentThreshold.value,
3394
+ isScrollingUp: isScrollingUp.value,
3395
+ savedScroll
3396
+ });
3397
+ }, {
3398
+ immediate: true
3399
+ });
3400
+
3401
+ // Do we need this? If yes - seems that
3402
+ // there's no need to expose onScroll
3403
+ canScroll && vue.watch(canScroll, onScroll, {
3404
+ immediate: true
3405
+ });
3406
+ return {
3407
+ computedScrollThreshold,
3408
+ currentScroll,
3409
+ currentThreshold,
3410
+ isScrollActive,
3411
+ // required only for testing
3412
+ // probably can be removed
3413
+ // later (2 chars chlng)
3414
+ isScrollingUp,
3415
+ savedScroll
3416
+ };
3417
+ }
3418
+
3419
+ // Utilities
3420
+
3260
3421
  // Composables
3261
3422
  function useSsrBoot() {
3262
3423
  const isBooted = vue.ref(false);
@@ -3279,13 +3440,7 @@
3279
3440
  const VAppBar = genericComponent()({
3280
3441
  name: 'VAppBar',
3281
3442
  props: {
3282
- // TODO: Implement scrolling techniques
3283
- // hideOnScroll: Boolean
3284
- // invertedScroll: Boolean
3285
- // collapseOnScroll: Boolean
3286
- // elevateOnScroll: Boolean
3287
- // shrinkOnScroll: Boolean
3288
- // fadeImageOnScroll: Boolean
3443
+ scrollBehavior: String,
3289
3444
  modelValue: {
3290
3445
  type: Boolean,
3291
3446
  default: true
@@ -3297,6 +3452,7 @@
3297
3452
  },
3298
3453
  ...makeVToolbarProps(),
3299
3454
  ...makeLayoutItemProps(),
3455
+ ...makeScrollProps(),
3300
3456
  height: {
3301
3457
  type: [Number, String],
3302
3458
  default: 64
@@ -3311,11 +3467,63 @@
3311
3467
  } = _ref;
3312
3468
  const vToolbarRef = vue.ref();
3313
3469
  const isActive = useProxiedModel(props, 'modelValue');
3470
+ const scrollBehavior = vue.computed(() => {
3471
+ const behavior = new Set(props.scrollBehavior?.split(' ') ?? []);
3472
+ return {
3473
+ hide: behavior.has('hide'),
3474
+ // fullyHide: behavior.has('fully-hide'),
3475
+ inverted: behavior.has('inverted'),
3476
+ collapse: behavior.has('collapse'),
3477
+ elevate: behavior.has('elevate'),
3478
+ fadeImage: behavior.has('fade-image')
3479
+ // shrink: behavior.has('shrink'),
3480
+ };
3481
+ });
3482
+
3483
+ const canScroll = vue.computed(() => {
3484
+ const behavior = scrollBehavior.value;
3485
+ return behavior.hide ||
3486
+ // behavior.fullyHide ||
3487
+ behavior.inverted || behavior.collapse || behavior.elevate || behavior.fadeImage ||
3488
+ // behavior.shrink ||
3489
+ !isActive.value;
3490
+ });
3491
+ const {
3492
+ currentScroll,
3493
+ currentThreshold,
3494
+ computedScrollThreshold,
3495
+ isScrollingUp
3496
+ } = useScroll(props, {
3497
+ canScroll
3498
+ });
3499
+ const isCollapsed = vue.computed(() => props.collapse || scrollBehavior.value.collapse && (scrollBehavior.value.inverted ? currentScroll.value < 1 : currentScroll.value > 0));
3500
+ const isFlat = vue.computed(() => props.flat || scrollBehavior.value.elevate && currentScroll.value === (scrollBehavior.value.inverted ? 1 : 0));
3501
+ const scrollRatio = vue.computed(() => Math.min((currentThreshold.value - currentScroll.value) / currentThreshold.value || 1, 1));
3502
+ const opacity = vue.computed(() => scrollBehavior.value.fadeImage ? scrollBehavior.value.inverted ? 1 - scrollRatio.value : scrollRatio.value : undefined);
3314
3503
  const height = vue.computed(() => {
3504
+ if (scrollBehavior.value.hide && scrollBehavior.value.inverted) return 0;
3315
3505
  const height = vToolbarRef.value?.contentHeight ?? 0;
3316
3506
  const extensionHeight = vToolbarRef.value?.extensionHeight ?? 0;
3317
3507
  return height + extensionHeight;
3318
3508
  });
3509
+ function setActive() {
3510
+ const val = currentScroll.value;
3511
+ if (scrollBehavior.value.hide) {
3512
+ if (scrollBehavior.value.inverted) {
3513
+ isActive.value = val > computedScrollThreshold.value;
3514
+ } else {
3515
+ isActive.value = isScrollingUp.value || val < computedScrollThreshold.value;
3516
+ }
3517
+ } else if (scrollBehavior.value.inverted) {
3518
+ isActive.value = currentScroll.value === 0;
3519
+ } else {
3520
+ isActive.value = true;
3521
+ }
3522
+ }
3523
+ vue.watch(currentScroll, setActive, {
3524
+ immediate: true
3525
+ });
3526
+ vue.watch(scrollBehavior, setActive);
3319
3527
  const {
3320
3528
  ssrBootStyles
3321
3529
  } = useSsrBoot();
@@ -3326,7 +3534,7 @@
3326
3534
  order: vue.computed(() => parseInt(props.order, 10)),
3327
3535
  position: vue.toRef(props, 'location'),
3328
3536
  layoutSize: height,
3329
- elementSize: height,
3537
+ elementSize: vue.ref(undefined),
3330
3538
  active: isActive,
3331
3539
  absolute: vue.toRef(props, 'absolute')
3332
3540
  });
@@ -3336,13 +3544,17 @@
3336
3544
  "ref": vToolbarRef,
3337
3545
  "class": ['v-app-bar', {
3338
3546
  'v-app-bar--bottom': props.location === 'bottom'
3339
- }],
3340
- "style": {
3547
+ }, props.class],
3548
+ "style": [{
3341
3549
  ...layoutItemStyles.value,
3550
+ '--v-toolbar-image-opacity': opacity.value,
3342
3551
  height: undefined,
3343
3552
  ...ssrBootStyles.value
3344
- }
3345
- }, toolbarProps), slots);
3553
+ }, props.style]
3554
+ }, toolbarProps, {
3555
+ "collapse": isCollapsed.value,
3556
+ "flat": isFlat.value
3557
+ }), slots);
3346
3558
  });
3347
3559
  return {};
3348
3560
  }
@@ -3425,6 +3637,7 @@
3425
3637
  const makeVBtnGroupProps = propsFactory({
3426
3638
  divided: Boolean,
3427
3639
  ...makeBorderProps(),
3640
+ ...makeComponentProps(),
3428
3641
  ...makeDensityProps(),
3429
3642
  ...makeElevationProps(),
3430
3643
  ...makeRoundedProps(),
@@ -3467,7 +3680,8 @@
3467
3680
  return vue.createVNode(props.tag, {
3468
3681
  "class": ['v-btn-group', {
3469
3682
  'v-btn-group--divided': props.divided
3470
- }, themeClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value]
3683
+ }, themeClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value, props.class],
3684
+ "style": props.style
3471
3685
  }, slots);
3472
3686
  });
3473
3687
  }
@@ -3700,8 +3914,10 @@
3700
3914
  useRender(() => {
3701
3915
  const [btnGroupProps] = VBtnGroup.filterProps(props);
3702
3916
  return vue.createVNode(VBtnGroup, vue.mergeProps({
3703
- "class": "v-btn-toggle"
3704
- }, btnGroupProps), {
3917
+ "class": ['v-btn-toggle', props.class]
3918
+ }, btnGroupProps, {
3919
+ "style": props.style
3920
+ }), {
3705
3921
  default: () => [slots.default?.({
3706
3922
  isSelected,
3707
3923
  next,
@@ -3772,7 +3988,7 @@
3772
3988
 
3773
3989
  // Types
3774
3990
 
3775
- const IconValue = [String, Function, Object];
3991
+ const IconValue = [String, Function, Object, Array];
3776
3992
  const IconSymbol = Symbol.for('vuetify:icons');
3777
3993
  const makeIconProps = propsFactory({
3778
3994
  icon: {
@@ -3792,8 +4008,9 @@
3792
4008
  slots
3793
4009
  } = _ref;
3794
4010
  return () => {
4011
+ const Icon = props.icon;
3795
4012
  return vue.createVNode(props.tag, null, {
3796
- default: () => [props.icon ? vue.createVNode(props.icon, null, null) : slots.default?.()]
4013
+ default: () => [props.icon ? vue.createVNode(Icon, null, null) : slots.default?.()]
3797
4014
  });
3798
4015
  };
3799
4016
  }
@@ -3816,7 +4033,12 @@
3816
4033
  "viewBox": "0 0 24 24",
3817
4034
  "role": "img",
3818
4035
  "aria-hidden": "true"
3819
- }, [vue.createVNode("path", {
4036
+ }, [Array.isArray(props.icon) ? props.icon.map(path => Array.isArray(path) ? vue.createVNode("path", {
4037
+ "d": path[0],
4038
+ "fill-opacity": path[1]
4039
+ }, null) : vue.createVNode("path", {
4040
+ "d": path
4041
+ }, null)) : vue.createVNode("path", {
3820
4042
  "d": props.icon
3821
4043
  }, null)])]
3822
4044
  });
@@ -3881,7 +4103,12 @@
3881
4103
  }
3882
4104
  }
3883
4105
  if (!icon) throw new Error(`Could not find aliased icon "${iconAlias}"`);
3884
- if (typeof icon !== 'string') {
4106
+ if (Array.isArray(icon)) {
4107
+ return {
4108
+ component: VSvgIcon,
4109
+ icon
4110
+ };
4111
+ } else if (typeof icon !== 'string') {
3885
4112
  return {
3886
4113
  component: VComponentIcon,
3887
4114
  icon
@@ -3938,6 +4165,7 @@
3938
4165
  start: Boolean,
3939
4166
  end: Boolean,
3940
4167
  icon: IconValue,
4168
+ ...makeComponentProps(),
3941
4169
  ...makeSizeProps(),
3942
4170
  ...makeTagProps({
3943
4171
  tag: 'i'
@@ -3980,12 +4208,12 @@
3980
4208
  'v-icon--clickable': !!attrs.onClick,
3981
4209
  'v-icon--start': props.start,
3982
4210
  'v-icon--end': props.end
3983
- }],
4211
+ }, props.class],
3984
4212
  "style": [!sizeClasses.value ? {
3985
4213
  fontSize: convertToUnit(props.size),
3986
4214
  height: convertToUnit(props.size),
3987
4215
  width: convertToUnit(props.size)
3988
- } : undefined, textColorStyles.value],
4216
+ } : undefined, textColorStyles.value, props.style],
3989
4217
  "role": attrs.onClick ? 'button' : undefined,
3990
4218
  "aria-hidden": !attrs.onClick
3991
4219
  }, {
@@ -3996,14 +4224,14 @@
3996
4224
  });
3997
4225
 
3998
4226
  // Utilities
3999
- function useIntersectionObserver(callback) {
4227
+ function useIntersectionObserver(callback, options) {
4000
4228
  const intersectionRef = vue.ref();
4001
4229
  const isIntersecting = vue.ref(false);
4002
4230
  if (SUPPORTS_INTERSECTION) {
4003
4231
  const observer = new IntersectionObserver(entries => {
4004
4232
  callback?.(entries, observer);
4005
4233
  isIntersecting.value = !!entries.find(entry => entry.isIntersecting);
4006
- });
4234
+ }, options);
4007
4235
  vue.onBeforeUnmount(() => {
4008
4236
  observer.disconnect();
4009
4237
  });
@@ -4043,6 +4271,7 @@
4043
4271
  type: [Number, String],
4044
4272
  default: 4
4045
4273
  },
4274
+ ...makeComponentProps(),
4046
4275
  ...makeSizeProps(),
4047
4276
  ...makeTagProps({
4048
4277
  tag: 'div'
@@ -4098,8 +4327,8 @@
4098
4327
  'v-progress-circular--indeterminate': !!props.indeterminate,
4099
4328
  'v-progress-circular--visible': isIntersecting.value,
4100
4329
  'v-progress-circular--disable-shrink': props.indeterminate === 'disable-shrink'
4101
- }, themeClasses.value, sizeClasses.value, textColorClasses.value],
4102
- "style": [sizeStyles.value, textColorStyles.value],
4330
+ }, themeClasses.value, sizeClasses.value, textColorClasses.value, props.class],
4331
+ "style": [sizeStyles.value, textColorStyles.value, props.style],
4103
4332
  "role": "progressbar",
4104
4333
  "aria-valuemin": "0",
4105
4334
  "aria-valuemax": "100",
@@ -4518,6 +4747,7 @@
4518
4747
  stream: Boolean,
4519
4748
  striped: Boolean,
4520
4749
  roundedBar: Boolean,
4750
+ ...makeComponentProps(),
4521
4751
  ...makeLocationProps({
4522
4752
  location: 'top'
4523
4753
  }),
@@ -4589,14 +4819,14 @@
4589
4819
  'v-progress-linear--rounded': props.rounded,
4590
4820
  'v-progress-linear--rounded-bar': props.roundedBar,
4591
4821
  'v-progress-linear--striped': props.striped
4592
- }, roundedClasses.value, themeClasses.value],
4593
- "style": {
4822
+ }, roundedClasses.value, themeClasses.value, props.class],
4823
+ "style": [{
4594
4824
  bottom: props.location === 'bottom' ? 0 : undefined,
4595
4825
  top: props.location === 'top' ? 0 : undefined,
4596
4826
  height: props.active ? convertToUnit(height.value) : 0,
4597
4827
  '--v-progress-linear-height': convertToUnit(height.value),
4598
4828
  ...locationStyles.value
4599
- },
4829
+ }, props.style],
4600
4830
  "role": "progressbar",
4601
4831
  "aria-hidden": props.active ? 'false' : 'true',
4602
4832
  "aria-valuemin": "0",
@@ -4805,8 +5035,9 @@
4805
5035
  type: Boolean,
4806
5036
  default: true
4807
5037
  },
5038
+ text: String,
4808
5039
  ...makeBorderProps(),
4809
- ...makeRoundedProps(),
5040
+ ...makeComponentProps(),
4810
5041
  ...makeDensityProps(),
4811
5042
  ...makeDimensionProps(),
4812
5043
  ...makeElevationProps(),
@@ -4814,6 +5045,7 @@
4814
5045
  ...makeLoaderProps(),
4815
5046
  ...makeLocationProps(),
4816
5047
  ...makePositionProps(),
5048
+ ...makeRoundedProps(),
4817
5049
  ...makeRouterProps(),
4818
5050
  ...makeSizeProps(),
4819
5051
  ...makeTagProps({
@@ -4911,8 +5143,8 @@
4911
5143
  'v-btn--icon': !!props.icon,
4912
5144
  'v-btn--loading': props.loading,
4913
5145
  'v-btn--stacked': props.stacked
4914
- }, themeClasses.value, borderClasses.value, hasColor ? colorClasses.value : undefined, densityClasses.value, elevationClasses.value, loaderClasses.value, positionClasses.value, roundedClasses.value, sizeClasses.value, variantClasses.value],
4915
- "style": [hasColor ? colorStyles.value : undefined, dimensionStyles.value, locationStyles.value, sizeStyles.value],
5146
+ }, themeClasses.value, borderClasses.value, hasColor ? colorClasses.value : undefined, densityClasses.value, elevationClasses.value, loaderClasses.value, positionClasses.value, roundedClasses.value, sizeClasses.value, variantClasses.value, props.class],
5147
+ "style": [hasColor ? colorStyles.value : undefined, dimensionStyles.value, locationStyles.value, sizeStyles.value, props.style],
4916
5148
  "disabled": isDisabled.value || undefined,
4917
5149
  "href": link.href.value,
4918
5150
  "onClick": e => {
@@ -4950,7 +5182,9 @@
4950
5182
  icon: props.icon
4951
5183
  }
4952
5184
  }
4953
- }, slots.default)]), !props.icon && hasAppend && vue.createVNode("span", {
5185
+ }, {
5186
+ default: () => [slots.default?.() ?? props.text]
5187
+ })]), !props.icon && hasAppend && vue.createVNode("span", {
4954
5188
  "key": "append",
4955
5189
  "class": "v-btn__append"
4956
5190
  }, [!slots.append ? vue.createVNode(VIcon, {
@@ -4987,15 +5221,17 @@
4987
5221
  icon: {
4988
5222
  type: IconValue,
4989
5223
  default: '$menu'
4990
- }
5224
+ },
5225
+ ...makeComponentProps()
4991
5226
  },
4992
5227
  setup(props, _ref) {
4993
5228
  let {
4994
5229
  slots
4995
5230
  } = _ref;
4996
5231
  useRender(() => vue.createVNode(VBtn, {
4997
- "class": "v-app-bar-nav-icon",
4998
- "icon": props.icon
5232
+ "class": ['v-app-bar-nav-icon', props.class],
5233
+ "icon": props.icon,
5234
+ "style": props.style
4999
5235
  }, slots));
5000
5236
  return {};
5001
5237
  }
@@ -5003,9 +5239,12 @@
5003
5239
 
5004
5240
  const VToolbarItems = genericComponent()({
5005
5241
  name: 'VToolbarItems',
5006
- props: makeVariantProps({
5007
- variant: 'text'
5008
- }),
5242
+ props: {
5243
+ ...makeComponentProps(),
5244
+ ...makeVariantProps({
5245
+ variant: 'text'
5246
+ })
5247
+ },
5009
5248
  setup(props, _ref) {
5010
5249
  let {
5011
5250
  slots
@@ -5018,7 +5257,8 @@
5018
5257
  }
5019
5258
  });
5020
5259
  useRender(() => vue.createVNode("div", {
5021
- "class": "v-toolbar-items"
5260
+ "class": ['v-toolbar-items', props.class],
5261
+ "style": props.style
5022
5262
  }, [slots.default?.()]));
5023
5263
  return {};
5024
5264
  }
@@ -5080,6 +5320,7 @@
5080
5320
  type: String,
5081
5321
  validator: val => allowedTypes.includes(val)
5082
5322
  },
5323
+ ...makeComponentProps(),
5083
5324
  ...makeDensityProps(),
5084
5325
  ...makeDimensionProps(),
5085
5326
  ...makeElevationProps(),
@@ -5162,8 +5403,8 @@
5162
5403
  [`v-alert--border-${props.border === true ? 'start' : props.border}`]: true
5163
5404
  }, {
5164
5405
  'v-alert--prominent': props.prominent
5165
- }, themeClasses.value, colorClasses.value, densityClasses.value, elevationClasses.value, positionClasses.value, roundedClasses.value, variantClasses.value],
5166
- "style": [colorStyles.value, dimensionStyles.value, locationStyles.value],
5406
+ }, themeClasses.value, colorClasses.value, densityClasses.value, elevationClasses.value, positionClasses.value, roundedClasses.value, variantClasses.value, props.class],
5407
+ "style": [colorStyles.value, dimensionStyles.value, locationStyles.value, props.style],
5167
5408
  "role": "alert"
5168
5409
  }, {
5169
5410
  default: () => [genOverlays(false, 'v-alert'), props.border && vue.createVNode("div", {
@@ -5257,6 +5498,7 @@
5257
5498
  props: {
5258
5499
  text: String,
5259
5500
  clickable: Boolean,
5501
+ ...makeComponentProps(),
5260
5502
  ...makeThemeProps()
5261
5503
  },
5262
5504
  setup(props, _ref) {
@@ -5266,7 +5508,8 @@
5266
5508
  useRender(() => vue.createVNode("label", {
5267
5509
  "class": ['v-label', {
5268
5510
  'v-label--clickable': props.clickable
5269
- }]
5511
+ }, props.class],
5512
+ "style": props.style
5270
5513
  }, [props.text, slots.default?.()]));
5271
5514
  return {};
5272
5515
  }
@@ -5275,7 +5518,8 @@
5275
5518
  const VFieldLabel = genericComponent()({
5276
5519
  name: 'VFieldLabel',
5277
5520
  props: {
5278
- floating: Boolean
5521
+ floating: Boolean,
5522
+ ...makeComponentProps()
5279
5523
  },
5280
5524
  setup(props, _ref) {
5281
5525
  let {
@@ -5284,7 +5528,8 @@
5284
5528
  useRender(() => vue.createVNode(VLabel, {
5285
5529
  "class": ['v-field-label', {
5286
5530
  'v-field-label--floating': props.floating
5287
- }],
5531
+ }, props.class],
5532
+ "style": props.style,
5288
5533
  "aria-hidden": props.floating || undefined
5289
5534
  }, slots));
5290
5535
  return {};
@@ -5324,7 +5569,7 @@
5324
5569
 
5325
5570
  // Types
5326
5571
 
5327
- const allowedVariants$1 = ['underlined', 'outlined', 'filled', 'solo', 'plain'];
5572
+ const allowedVariants$1 = ['underlined', 'outlined', 'filled', 'solo', 'solo-inverted', 'solo-filled', 'plain'];
5328
5573
  const makeVFieldProps = propsFactory({
5329
5574
  appendInnerIcon: IconValue,
5330
5575
  bgColor: String,
@@ -5335,9 +5580,11 @@
5335
5580
  },
5336
5581
  active: Boolean,
5337
5582
  color: String,
5583
+ baseColor: String,
5338
5584
  dirty: Boolean,
5339
5585
  disabled: Boolean,
5340
5586
  error: Boolean,
5587
+ flat: Boolean,
5341
5588
  label: String,
5342
5589
  persistentClear: Boolean,
5343
5590
  prependInnerIcon: IconValue,
@@ -5351,8 +5598,10 @@
5351
5598
  'onClick:clear': EventProp(),
5352
5599
  'onClick:appendInner': EventProp(),
5353
5600
  'onClick:prependInner': EventProp(),
5354
- ...makeThemeProps(),
5355
- ...makeLoaderProps()
5601
+ ...makeComponentProps(),
5602
+ ...makeLoaderProps(),
5603
+ ...makeRoundedProps(),
5604
+ ...makeThemeProps()
5356
5605
  }, 'v-field');
5357
5606
  const VField = genericComponent()({
5358
5607
  name: 'VField',
@@ -5387,7 +5636,10 @@
5387
5636
  const {
5388
5637
  InputIcon
5389
5638
  } = useInputIcon(props);
5390
- const isActive = vue.computed(() => props.dirty || props.active);
5639
+ const {
5640
+ roundedClasses
5641
+ } = useRounded(props);
5642
+ const isActive = vue.computed(() => props.dirty || props.active);
5391
5643
  const hasLabel = vue.computed(() => !props.singleLine && !!(props.label || slots.label));
5392
5644
  const uid = getUid();
5393
5645
  const id = vue.computed(() => props.id || `input-${uid}`);
@@ -5403,7 +5655,7 @@
5403
5655
  textColorClasses,
5404
5656
  textColorStyles
5405
5657
  } = useTextColor(vue.computed(() => {
5406
- return isActive.value && isFocused.value && !props.error && !props.disabled ? props.color : undefined;
5658
+ return props.error || props.disabled ? undefined : isActive.value && isFocused.value ? props.color : props.baseColor;
5407
5659
  }));
5408
5660
  vue.watch(isActive, val => {
5409
5661
  if (hasLabel.value) {
@@ -5472,6 +5724,7 @@
5472
5724
  'v-field--disabled': props.disabled,
5473
5725
  'v-field--dirty': props.dirty,
5474
5726
  'v-field--error': props.error,
5727
+ 'v-field--flat': props.flat,
5475
5728
  'v-field--has-background': !!props.bgColor,
5476
5729
  'v-field--persistent-clear': props.persistentClear,
5477
5730
  'v-field--prepended': hasPrepend,
@@ -5479,8 +5732,8 @@
5479
5732
  'v-field--single-line': props.singleLine,
5480
5733
  'v-field--no-label': !label,
5481
5734
  [`v-field--variant-${props.variant}`]: true
5482
- }, themeClasses.value, backgroundColorClasses.value, focusClasses.value, loaderClasses.value],
5483
- "style": [backgroundColorStyles.value, textColorStyles.value],
5735
+ }, themeClasses.value, backgroundColorClasses.value, focusClasses.value, loaderClasses.value, roundedClasses.value, props.class],
5736
+ "style": [backgroundColorStyles.value, textColorStyles.value, props.style],
5484
5737
  "onClick": onClick
5485
5738
  }, attrs), [vue.createVNode("div", {
5486
5739
  "class": "v-field__overlay"
@@ -5499,7 +5752,7 @@
5499
5752
  }, null), slots['prepend-inner']?.(slotProps.value)]), vue.createVNode("div", {
5500
5753
  "class": "v-field__field",
5501
5754
  "data-no-activator": ""
5502
- }, [['solo', 'filled'].includes(props.variant) && hasLabel.value && vue.createVNode(VFieldLabel, {
5755
+ }, [['filled', 'solo', 'solo-inverted', 'solo-filled'].includes(props.variant) && hasLabel.value && vue.createVNode(VFieldLabel, {
5503
5756
  "key": "floating-label",
5504
5757
  "ref": floatingLabelRef,
5505
5758
  "class": [textColorClasses.value],
@@ -5568,7 +5821,7 @@
5568
5821
  });
5569
5822
  // TODO: this is kinda slow, might be better to implicitly inherit props instead
5570
5823
  function filterFieldProps(attrs) {
5571
- const keys = Object.keys(VField.props).filter(k => !isOn(k));
5824
+ const keys = Object.keys(VField.props).filter(k => !isOn(k) && k !== 'class' && k !== 'style');
5572
5825
  return pick(attrs, keys);
5573
5826
  }
5574
5827
 
@@ -5583,6 +5836,7 @@
5583
5836
  type: [Array, String],
5584
5837
  default: () => []
5585
5838
  },
5839
+ ...makeComponentProps(),
5586
5840
  ...makeTransitionProps({
5587
5841
  transition: {
5588
5842
  component: VSlideYTransition,
@@ -5603,8 +5857,8 @@
5603
5857
  useRender(() => vue.createVNode(MaybeTransition, {
5604
5858
  "transition": props.transition,
5605
5859
  "tag": "div",
5606
- "class": ['v-messages', textColorClasses.value],
5607
- "style": textColorStyles.value,
5860
+ "class": ['v-messages', textColorClasses.value, props.class],
5861
+ "style": [textColorStyles.value, props.style],
5608
5862
  "role": "alert",
5609
5863
  "aria-live": "polite"
5610
5864
  }, {
@@ -5900,6 +6154,7 @@
5900
6154
  },
5901
6155
  'onClick:prepend': EventProp(),
5902
6156
  'onClick:append': EventProp(),
6157
+ ...makeComponentProps(),
5903
6158
  ...makeDensityProps(),
5904
6159
  ...makeValidationProps()
5905
6160
  }, 'v-input');
@@ -5967,7 +6222,8 @@
5967
6222
  const hasMessages = messages.value.length > 0;
5968
6223
  const hasDetails = !props.hideDetails || props.hideDetails === 'auto' && (hasMessages || !!slots.details);
5969
6224
  return vue.createVNode("div", {
5970
- "class": ['v-input', `v-input--${props.direction}`, densityClasses.value, validationClasses.value]
6225
+ "class": ['v-input', `v-input--${props.direction}`, densityClasses.value, validationClasses.value, props.class],
6226
+ "style": props.style
5971
6227
  }, [hasPrepend && vue.createVNode("div", {
5972
6228
  "key": "prepend",
5973
6229
  "class": "v-input__prepend"
@@ -6010,6 +6266,7 @@
6010
6266
  type: [Number, String],
6011
6267
  default: 0
6012
6268
  },
6269
+ ...makeComponentProps(),
6013
6270
  ...makeTransitionProps({
6014
6271
  transition: {
6015
6272
  component: VSlideYTransition
@@ -6027,7 +6284,8 @@
6027
6284
  "transition": props.transition
6028
6285
  }, {
6029
6286
  default: () => [vue.withDirectives(vue.createVNode("div", {
6030
- "class": "v-counter"
6287
+ "class": ['v-counter', props.class],
6288
+ "style": props.style
6031
6289
  }, [slots.default ? slots.default({
6032
6290
  counter: counter.value,
6033
6291
  max: props.max,
@@ -6230,7 +6488,8 @@
6230
6488
  'v-text-field--prefixed': props.prefix,
6231
6489
  'v-text-field--suffixed': props.suffix,
6232
6490
  'v-text-field--flush-details': ['plain', 'underlined'].includes(props.variant)
6233
- }]
6491
+ }, props.class],
6492
+ "style": props.style
6234
6493
  }, rootAttrs, inputProps, {
6235
6494
  "focused": isFocused.value
6236
6495
  }), {
@@ -6346,6 +6605,7 @@
6346
6605
  type: String,
6347
6606
  default: 'VSelectionControl'
6348
6607
  },
6608
+ ...makeComponentProps(),
6349
6609
  ...makeSelectionControlGroupProps()
6350
6610
  },
6351
6611
  emits: {
@@ -6393,7 +6653,8 @@
6393
6653
  useRender(() => vue.createVNode("div", {
6394
6654
  "class": ['v-selection-control-group', {
6395
6655
  'v-selection-control-group--inline': props.inline
6396
- }],
6656
+ }, props.class],
6657
+ "style": props.style,
6397
6658
  "role": props.type === 'radio' ? 'radiogroup' : undefined
6398
6659
  }, [slots.default?.()]));
6399
6660
  return {};
@@ -6407,6 +6668,7 @@
6407
6668
  trueValue: null,
6408
6669
  falseValue: null,
6409
6670
  value: null,
6671
+ ...makeComponentProps(),
6410
6672
  ...makeSelectionControlGroupProps()
6411
6673
  }, 'v-selection-control');
6412
6674
  function useSelectionControl(props) {
@@ -6521,8 +6783,10 @@
6521
6783
  'v-selection-control--focused': isFocused.value,
6522
6784
  'v-selection-control--focus-visible': isFocusVisible.value,
6523
6785
  'v-selection-control--inline': props.inline
6524
- }, densityClasses.value]
6525
- }, rootAttrs), [vue.createVNode("div", {
6786
+ }, densityClasses.value, props.class]
6787
+ }, rootAttrs, {
6788
+ "style": props.style
6789
+ }), [vue.createVNode("div", {
6526
6790
  "class": ['v-selection-control__wrapper', textColorClasses.value],
6527
6791
  "style": textColorStyles.value
6528
6792
  }, [slots.default?.(), vue.withDirectives(vue.createVNode("div", {
@@ -6604,7 +6868,8 @@
6604
6868
  useRender(() => vue.createVNode(VSelectionControl, vue.mergeProps(props, {
6605
6869
  "modelValue": model.value,
6606
6870
  "onUpdate:modelValue": [$event => model.value = $event, onChange],
6607
- "class": "v-checkbox-btn",
6871
+ "class": ['v-checkbox-btn', props.class],
6872
+ "style": props.style,
6608
6873
  "type": "checkbox",
6609
6874
  "inline": true,
6610
6875
  "falseIcon": falseIcon.value,
@@ -6644,10 +6909,11 @@
6644
6909
  const [inputProps, _1] = VInput.filterProps(props);
6645
6910
  const [checkboxProps, _2] = VCheckboxBtn.filterProps(props);
6646
6911
  return vue.createVNode(VInput, vue.mergeProps({
6647
- "class": "v-checkbox"
6912
+ "class": ['v-checkbox', props.class]
6648
6913
  }, inputAttrs, inputProps, {
6649
6914
  "id": id.value,
6650
- "focused": isFocused.value
6915
+ "focused": isFocused.value,
6916
+ "style": props.style
6651
6917
  }), {
6652
6918
  ...slots,
6653
6919
  default: _ref2 => {
@@ -6678,6 +6944,7 @@
6678
6944
  end: Boolean,
6679
6945
  icon: IconValue,
6680
6946
  image: String,
6947
+ ...makeComponentProps(),
6681
6948
  ...makeDensityProps(),
6682
6949
  ...makeRoundedProps(),
6683
6950
  ...makeSizeProps(),
@@ -6716,8 +6983,8 @@
6716
6983
  "class": ['v-avatar', {
6717
6984
  'v-avatar--start': props.start,
6718
6985
  'v-avatar--end': props.end
6719
- }, themeClasses.value, colorClasses.value, densityClasses.value, roundedClasses.value, sizeClasses.value, variantClasses.value],
6720
- "style": [colorStyles.value, sizeStyles.value]
6986
+ }, themeClasses.value, colorClasses.value, densityClasses.value, roundedClasses.value, sizeClasses.value, variantClasses.value, props.class],
6987
+ "style": [colorStyles.value, sizeStyles.value, props.style]
6721
6988
  }, {
6722
6989
  default: () => [props.image ? vue.createVNode(VImg, {
6723
6990
  "key": "image",
@@ -6745,6 +7012,7 @@
6745
7012
  type: Function,
6746
7013
  default: deepEqual
6747
7014
  },
7015
+ ...makeComponentProps(),
6748
7016
  ...makeGroupProps({
6749
7017
  selectedClass: 'v-chip--selected'
6750
7018
  }),
@@ -6782,7 +7050,8 @@
6782
7050
  useRender(() => vue.createVNode(props.tag, {
6783
7051
  "class": ['v-chip-group', {
6784
7052
  'v-chip-group--column': props.column
6785
- }, themeClasses.value]
7053
+ }, themeClasses.value, props.class],
7054
+ "style": props.style
6786
7055
  }, {
6787
7056
  default: () => [slots.default?.({
6788
7057
  isSelected,
@@ -6796,8 +7065,6 @@
6796
7065
  }
6797
7066
  });
6798
7067
 
6799
- // Types
6800
-
6801
7068
  const VChip = genericComponent()({
6802
7069
  name: 'VChip',
6803
7070
  directives: {
@@ -6842,6 +7109,7 @@
6842
7109
  onClick: EventProp(),
6843
7110
  onClickOnce: EventProp(),
6844
7111
  ...makeBorderProps(),
7112
+ ...makeComponentProps(),
6845
7113
  ...makeDensityProps(),
6846
7114
  ...makeElevationProps(),
6847
7115
  ...makeGroupItemProps(),
@@ -6934,8 +7202,8 @@
6934
7202
  'v-chip--link': isClickable.value,
6935
7203
  'v-chip--filter': hasFilter,
6936
7204
  'v-chip--pill': props.pill
6937
- }, themeClasses.value, borderClasses.value, hasColor ? colorClasses.value : undefined, densityClasses.value, elevationClasses.value, roundedClasses.value, sizeClasses.value, variantClasses.value, group?.selectedClass.value],
6938
- "style": [hasColor ? colorStyles.value : undefined],
7205
+ }, themeClasses.value, borderClasses.value, hasColor ? colorClasses.value : undefined, densityClasses.value, elevationClasses.value, roundedClasses.value, sizeClasses.value, variantClasses.value, group?.selectedClass.value, props.class],
7206
+ "style": [hasColor ? colorStyles.value : undefined, props.style],
6939
7207
  "disabled": props.disabled || undefined,
6940
7208
  "draggable": props.draggable,
6941
7209
  "href": link.href.value,
@@ -7044,6 +7312,7 @@
7044
7312
  length: [Number, String],
7045
7313
  thickness: [Number, String],
7046
7314
  vertical: Boolean,
7315
+ ...makeComponentProps(),
7047
7316
  ...makeThemeProps()
7048
7317
  },
7049
7318
  setup(props, _ref) {
@@ -7072,8 +7341,8 @@
7072
7341
  'v-divider': true,
7073
7342
  'v-divider--inset': props.inset,
7074
7343
  'v-divider--vertical': props.vertical
7075
- }, themeClasses.value, textColorClasses.value],
7076
- "style": [dividerStyles.value, textColorStyles.value],
7344
+ }, themeClasses.value, textColorClasses.value, props.class],
7345
+ "style": [dividerStyles.value, textColorStyles.value, props.style],
7077
7346
  "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
7078
7347
  "role": `${attrs.role || 'separator'}`
7079
7348
  }, null));
@@ -7572,6 +7841,7 @@
7572
7841
  fluid: Boolean,
7573
7842
  subgroup: Boolean,
7574
7843
  value: null,
7844
+ ...makeComponentProps(),
7575
7845
  ...makeTagProps()
7576
7846
  }, 'v-list-group');
7577
7847
  const VListGroup = genericComponent()({
@@ -7620,7 +7890,8 @@
7620
7890
  'v-list-group--fluid': props.fluid,
7621
7891
  'v-list-group--subgroup': props.subgroup,
7622
7892
  'v-list-group--open': isOpen.value
7623
- }]
7893
+ }, props.class],
7894
+ "style": props.style
7624
7895
  }, {
7625
7896
  default: () => [slots.activator && vue.createVNode(VDefaultsProvider, {
7626
7897
  "defaults": activatorDefaults.value
@@ -7687,6 +7958,7 @@
7687
7958
  onClick: EventProp(),
7688
7959
  onClickOnce: EventProp(),
7689
7960
  ...makeBorderProps(),
7961
+ ...makeComponentProps(),
7690
7962
  ...makeDensityProps(),
7691
7963
  ...makeDimensionProps(),
7692
7964
  ...makeElevationProps(),
@@ -7797,8 +8069,8 @@
7797
8069
  'v-list-item--nav': props.nav,
7798
8070
  'v-list-item--prepend': !hasPrepend && list?.hasPrepend.value,
7799
8071
  [`${props.activeClass}`]: props.activeClass && isActive.value
7800
- }, themeClasses.value, borderClasses.value, hasColor ? colorClasses.value : undefined, densityClasses.value, elevationClasses.value, lineClasses.value, roundedClasses.value, variantClasses.value],
7801
- "style": [hasColor ? colorStyles.value : undefined, dimensionStyles.value],
8072
+ }, themeClasses.value, borderClasses.value, hasColor ? colorClasses.value : undefined, densityClasses.value, elevationClasses.value, lineClasses.value, roundedClasses.value, variantClasses.value, props.class],
8073
+ "style": [hasColor ? colorStyles.value : undefined, dimensionStyles.value, props.style],
7802
8074
  "href": link.href.value,
7803
8075
  "tabindex": isClickable.value ? 0 : undefined,
7804
8076
  "onClick": onClick,
@@ -7891,6 +8163,7 @@
7891
8163
  inset: Boolean,
7892
8164
  sticky: Boolean,
7893
8165
  title: String,
8166
+ ...makeComponentProps(),
7894
8167
  ...makeTagProps()
7895
8168
  },
7896
8169
  setup(props, _ref) {
@@ -7907,10 +8180,10 @@
7907
8180
  "class": ['v-list-subheader', {
7908
8181
  'v-list-subheader--inset': props.inset,
7909
8182
  'v-list-subheader--sticky': props.sticky
7910
- }, textColorClasses.value],
7911
- "style": {
8183
+ }, textColorClasses.value, props.class],
8184
+ "style": [{
7912
8185
  textColorStyles
7913
- }
8186
+ }, props.style]
7914
8187
  }, {
7915
8188
  default: () => [hasText && vue.createVNode("div", {
7916
8189
  "class": "v-list-subheader__text"
@@ -8130,6 +8403,7 @@
8130
8403
  openStrategy: 'list'
8131
8404
  }),
8132
8405
  ...makeBorderProps(),
8406
+ ...makeComponentProps(),
8133
8407
  ...makeDensityProps(),
8134
8408
  ...makeDimensionProps(),
8135
8409
  ...makeElevationProps(),
@@ -8231,27 +8505,8 @@
8231
8505
  e.preventDefault();
8232
8506
  }
8233
8507
  function focus(location) {
8234
- if (!contentRef.value) return;
8235
- const targets = ['button', '[href]', 'input', 'select', 'textarea', '[tabindex]'].map(s => `${s}:not([tabindex="-1"])`).join(', ');
8236
- const focusable = [...contentRef.value.querySelectorAll(targets)].filter(el => !el.hasAttribute('disabled'));
8237
- const idx = focusable.indexOf(document.activeElement);
8238
- if (!location) {
8239
- if (!contentRef.value.contains(document.activeElement)) {
8240
- focusable[0]?.focus();
8241
- }
8242
- } else if (location === 'first') {
8243
- focusable[0]?.focus();
8244
- } else if (location === 'last') {
8245
- focusable.at(-1)?.focus();
8246
- } else {
8247
- let el;
8248
- let idxx = idx;
8249
- const inc = location === 'next' ? 1 : -1;
8250
- do {
8251
- idxx += inc;
8252
- el = focusable[idxx];
8253
- } while ((!el || el.offsetParent == null) && idxx < focusable.length && idxx >= 0);
8254
- if (el) el.focus();else focus(location === 'next' ? 'first' : 'last');
8508
+ if (contentRef.value) {
8509
+ return focusChild(contentRef.value, location);
8255
8510
  }
8256
8511
  }
8257
8512
  useRender(() => {
@@ -8260,8 +8515,8 @@
8260
8515
  "class": ['v-list', {
8261
8516
  'v-list--disabled': props.disabled,
8262
8517
  'v-list--nav': props.nav
8263
- }, themeClasses.value, backgroundColorClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, lineClasses.value, roundedClasses.value],
8264
- "style": [backgroundColorStyles.value, dimensionStyles.value],
8518
+ }, themeClasses.value, backgroundColorClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, lineClasses.value, roundedClasses.value, props.class],
8519
+ "style": [backgroundColorStyles.value, dimensionStyles.value, props.style],
8265
8520
  "role": "listbox",
8266
8521
  "aria-activedescendant": undefined,
8267
8522
  "onFocusin": onFocusin,
@@ -8289,6 +8544,7 @@
8289
8544
  props: {
8290
8545
  start: Boolean,
8291
8546
  end: Boolean,
8547
+ ...makeComponentProps(),
8292
8548
  ...makeTagProps()
8293
8549
  },
8294
8550
  setup(props, _ref) {
@@ -8299,7 +8555,8 @@
8299
8555
  "class": ['v-list-item-action', {
8300
8556
  'v-list-item-action--start': props.start,
8301
8557
  'v-list-item-action--end': props.end
8302
- }]
8558
+ }, props.class],
8559
+ "style": props.style
8303
8560
  }, slots));
8304
8561
  return {};
8305
8562
  }
@@ -8310,6 +8567,7 @@
8310
8567
  props: {
8311
8568
  start: Boolean,
8312
8569
  end: Boolean,
8570
+ ...makeComponentProps(),
8313
8571
  ...makeTagProps()
8314
8572
  },
8315
8573
  setup(props, _ref) {
@@ -8321,7 +8579,8 @@
8321
8579
  "class": ['v-list-item-media', {
8322
8580
  'v-list-item-media--start': props.start,
8323
8581
  'v-list-item-media--end': props.end
8324
- }]
8582
+ }, props.class],
8583
+ "style": props.style
8325
8584
  }, slots);
8326
8585
  });
8327
8586
  return {};
@@ -9562,6 +9821,7 @@
9562
9821
  default: 2000
9563
9822
  },
9564
9823
  ...makeActivatorProps(),
9824
+ ...makeComponentProps(),
9565
9825
  ...makeDimensionProps(),
9566
9826
  ...makeLazyProps(),
9567
9827
  ...makeLocationStrategyProps(),
@@ -9729,10 +9989,10 @@
9729
9989
  'v-overlay--absolute': props.absolute || props.contained,
9730
9990
  'v-overlay--active': isActive.value,
9731
9991
  'v-overlay--contained': props.contained
9732
- }, themeClasses.value, rtlClasses.value],
9992
+ }, themeClasses.value, rtlClasses.value, props.class],
9733
9993
  "style": [stackStyles.value, {
9734
9994
  top: convertToUnit(top.value)
9735
- }],
9995
+ }, props.style],
9736
9996
  "ref": root
9737
9997
  }, scopeId, attrs), [vue.createVNode(Scrim, vue.mergeProps({
9738
9998
  "color": scrimColor,
@@ -9838,7 +10098,8 @@
9838
10098
  const [overlayProps] = VOverlay.filterProps(props);
9839
10099
  return vue.createVNode(VOverlay, vue.mergeProps({
9840
10100
  "ref": overlay,
9841
- "class": ['v-menu']
10101
+ "class": ['v-menu', props.class],
10102
+ "style": props.style
9842
10103
  }, overlayProps, {
9843
10104
  "modelValue": isActive.value,
9844
10105
  "onUpdate:modelValue": $event => isActive.value = $event,
@@ -10057,7 +10318,8 @@
10057
10318
  'v-select--chips': !!props.chips,
10058
10319
  [`v-select--${props.multiple ? 'multiple' : 'single'}`]: true,
10059
10320
  'v-select--selected': model.value.length
10060
- }],
10321
+ }, props.class],
10322
+ "style": props.style,
10061
10323
  "appendInnerIcon": props.menuIcon,
10062
10324
  "readonly": true,
10063
10325
  "placeholder": placeholder,
@@ -10500,7 +10762,8 @@
10500
10762
  'v-autocomplete--selecting-index': selectionIndex.value > -1,
10501
10763
  [`v-autocomplete--${props.multiple ? 'multiple' : 'single'}`]: true,
10502
10764
  'v-autocomplete--selection-slot': !!slots.selection
10503
- }],
10765
+ }, props.class],
10766
+ "style": props.style,
10504
10767
  "appendInnerIcon": props.menuIcon,
10505
10768
  "readonly": props.readonly,
10506
10769
  "placeholder": isDirty ? undefined : props.placeholder,
@@ -10614,8 +10877,6 @@
10614
10877
  }
10615
10878
  });
10616
10879
 
10617
- // Types
10618
-
10619
10880
  const VBadge = genericComponent()({
10620
10881
  name: 'VBadge',
10621
10882
  inheritAttrs: false,
@@ -10639,6 +10900,7 @@
10639
10900
  offsetX: [Number, String],
10640
10901
  offsetY: [Number, String],
10641
10902
  textColor: String,
10903
+ ...makeComponentProps(),
10642
10904
  ...makeLocationProps({
10643
10905
  location: 'top end'
10644
10906
  }),
@@ -10683,8 +10945,10 @@
10683
10945
  'v-badge--dot': props.dot,
10684
10946
  'v-badge--floating': props.floating,
10685
10947
  'v-badge--inline': props.inline
10686
- }]
10687
- }, attrs), {
10948
+ }, props.class]
10949
+ }, attrs, {
10950
+ "style": props.style
10951
+ }), {
10688
10952
  default: () => [vue.createVNode("div", {
10689
10953
  "class": "v-badge__wrapper"
10690
10954
  }, [ctx.slots.default?.(), vue.createVNode(MaybeTransition, {
@@ -10711,7 +10975,8 @@
10711
10975
  name: 'VBannerActions',
10712
10976
  props: {
10713
10977
  color: String,
10714
- density: String
10978
+ density: String,
10979
+ ...makeComponentProps()
10715
10980
  },
10716
10981
  setup(props, _ref) {
10717
10982
  let {
@@ -10725,7 +10990,8 @@
10725
10990
  }
10726
10991
  });
10727
10992
  useRender(() => vue.createVNode("div", {
10728
- "class": "v-banner-actions"
10993
+ "class": ['v-banner-actions', props.class],
10994
+ "style": props.style
10729
10995
  }, [slots.default?.()]));
10730
10996
  return {};
10731
10997
  }
@@ -10746,6 +11012,7 @@
10746
11012
  sticky: Boolean,
10747
11013
  text: String,
10748
11014
  ...makeBorderProps(),
11015
+ ...makeComponentProps(),
10749
11016
  ...makeDensityProps(),
10750
11017
  ...makeDimensionProps(),
10751
11018
  ...makeElevationProps(),
@@ -10803,8 +11070,8 @@
10803
11070
  'v-banner--stacked': props.stacked || mobile.value,
10804
11071
  'v-banner--sticky': props.sticky,
10805
11072
  [`v-banner--${props.lines}-line`]: !!props.lines
10806
- }, borderClasses.value, densityClasses.value, elevationClasses.value, positionClasses.value, roundedClasses.value, themeClasses.value],
10807
- "style": [dimensionStyles.value, locationStyles.value],
11073
+ }, borderClasses.value, densityClasses.value, elevationClasses.value, positionClasses.value, roundedClasses.value, themeClasses.value, props.class],
11074
+ "style": [dimensionStyles.value, locationStyles.value, props.style],
10808
11075
  "role": "banner"
10809
11076
  }, {
10810
11077
  default: () => [hasPrepend && vue.createVNode("div", {
@@ -10860,6 +11127,7 @@
10860
11127
  default: true
10861
11128
  },
10862
11129
  ...makeBorderProps(),
11130
+ ...makeComponentProps(),
10863
11131
  ...makeDensityProps(),
10864
11132
  ...makeElevationProps(),
10865
11133
  ...makeRoundedProps(),
@@ -10934,11 +11202,11 @@
10934
11202
  'v-bottom-navigation--active': isActive.value,
10935
11203
  'v-bottom-navigation--grow': props.grow,
10936
11204
  'v-bottom-navigation--shift': props.mode === 'shift'
10937
- }, themeClasses.value, backgroundColorClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value],
11205
+ }, themeClasses.value, backgroundColorClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value, props.class],
10938
11206
  "style": [backgroundColorStyles.value, layoutItemStyles.value, {
10939
11207
  height: convertToUnit(height.value),
10940
11208
  transform: `translateY(${convertToUnit(!isActive.value ? 100 : 0, '%')})`
10941
- }, ssrBootStyles.value]
11209
+ }, ssrBootStyles.value, props.style]
10942
11210
  }, {
10943
11211
  default: () => [slots.default && vue.createVNode("div", {
10944
11212
  "class": "v-bottom-navigation__content"
@@ -10952,14 +11220,16 @@
10952
11220
  const VBreadcrumbsDivider = genericComponent()({
10953
11221
  name: 'VBreadcrumbsDivider',
10954
11222
  props: {
10955
- divider: [Number, String]
11223
+ divider: [Number, String],
11224
+ ...makeComponentProps()
10956
11225
  },
10957
11226
  setup(props, _ref) {
10958
11227
  let {
10959
11228
  slots
10960
11229
  } = _ref;
10961
11230
  useRender(() => vue.createVNode("li", {
10962
- "class": "v-breadcrumbs-divider"
11231
+ "class": ['v-breadcrumbs-divider', props.class],
11232
+ "style": props.style
10963
11233
  }, [slots?.default?.() ?? props.divider]));
10964
11234
  return {};
10965
11235
  }
@@ -10974,6 +11244,7 @@
10974
11244
  color: String,
10975
11245
  disabled: Boolean,
10976
11246
  title: String,
11247
+ ...makeComponentProps(),
10977
11248
  ...makeRouterProps(),
10978
11249
  ...makeTagProps({
10979
11250
  tag: 'li'
@@ -10999,8 +11270,8 @@
10999
11270
  'v-breadcrumbs-item--disabled': props.disabled,
11000
11271
  'v-breadcrumbs-item--link': link.isLink.value,
11001
11272
  [`${props.activeClass}`]: isActive.value && props.activeClass
11002
- }, textColorClasses.value],
11003
- "style": [textColorStyles.value],
11273
+ }, textColorClasses.value, props.class],
11274
+ "style": [textColorStyles.value, props.style],
11004
11275
  "href": link.href.value,
11005
11276
  "aria-current": isActive.value ? 'page' : undefined,
11006
11277
  "onClick": link.navigate
@@ -11031,6 +11302,7 @@
11031
11302
  type: Array,
11032
11303
  default: () => []
11033
11304
  },
11305
+ ...makeComponentProps(),
11034
11306
  ...makeDensityProps(),
11035
11307
  ...makeRoundedProps(),
11036
11308
  ...makeTagProps({
@@ -11062,11 +11334,22 @@
11062
11334
  disabled: vue.toRef(props, 'disabled')
11063
11335
  }
11064
11336
  });
11337
+ const items = vue.computed(() => props.items.map(item => {
11338
+ return typeof item === 'string' ? {
11339
+ item: {
11340
+ title: item
11341
+ },
11342
+ raw: item
11343
+ } : {
11344
+ item,
11345
+ raw: item
11346
+ };
11347
+ }));
11065
11348
  useRender(() => {
11066
11349
  const hasPrepend = !!(slots.prepend || props.icon);
11067
11350
  return vue.createVNode(props.tag, {
11068
- "class": ['v-breadcrumbs', backgroundColorClasses.value, densityClasses.value, roundedClasses.value],
11069
- "style": backgroundColorStyles.value
11351
+ "class": ['v-breadcrumbs', backgroundColorClasses.value, densityClasses.value, roundedClasses.value, props.class],
11352
+ "style": [backgroundColorStyles.value, props.style]
11070
11353
  }, {
11071
11354
  default: () => [hasPrepend && vue.createVNode("div", {
11072
11355
  "key": "prepend",
@@ -11084,33 +11367,36 @@
11084
11367
  start: true
11085
11368
  }
11086
11369
  }
11087
- }, slots.prepend)]), props.items.map((item, index, array) => vue.createVNode(vue.Fragment, null, [vue.createVNode(VBreadcrumbsItem, vue.mergeProps({
11088
- "key": index,
11089
- "disabled": index >= array.length - 1
11090
- }, typeof item === 'string' ? {
11091
- title: item
11092
- } : item), {
11093
- default: slots.title ? () => slots.title?.({
11094
- item,
11095
- index
11096
- }) : undefined
11097
- }), index < array.length - 1 && vue.createVNode(VBreadcrumbsDivider, null, {
11098
- default: slots.divider ? () => slots.divider?.({
11370
+ }, slots.prepend)]), items.value.map((_ref2, index, array) => {
11371
+ let {
11099
11372
  item,
11100
- index
11101
- }) : undefined
11102
- })])), slots.default?.()]
11373
+ raw
11374
+ } = _ref2;
11375
+ return vue.createVNode(vue.Fragment, null, [vue.createVNode(VBreadcrumbsItem, vue.mergeProps({
11376
+ "key": item.title,
11377
+ "disabled": index >= array.length - 1
11378
+ }, item), {
11379
+ default: slots.title ? () => slots.title?.({
11380
+ item: raw,
11381
+ index
11382
+ }) : undefined
11383
+ }), index < array.length - 1 && vue.createVNode(VBreadcrumbsDivider, null, {
11384
+ default: slots.divider ? () => slots.divider?.({
11385
+ item: raw,
11386
+ index
11387
+ }) : undefined
11388
+ })]);
11389
+ }), slots.default?.()]
11103
11390
  });
11104
11391
  });
11105
11392
  return {};
11106
11393
  }
11107
11394
  });
11108
11395
 
11109
- // Types
11110
-
11111
- const VCardActions = defineComponent({
11396
+ const VCardActions = genericComponent()({
11112
11397
  name: 'VCardActions',
11113
- setup(_, _ref) {
11398
+ props: makeComponentProps(),
11399
+ setup(props, _ref) {
11114
11400
  let {
11115
11401
  slots
11116
11402
  } = _ref;
@@ -11120,7 +11406,8 @@
11120
11406
  }
11121
11407
  });
11122
11408
  useRender(() => vue.createVNode("div", {
11123
- "class": "v-card-actions"
11409
+ "class": ['v-card-actions', props.class],
11410
+ "style": props.style
11124
11411
  }, [slots.default?.()]));
11125
11412
  return {};
11126
11413
  }
@@ -11130,8 +11417,6 @@
11130
11417
 
11131
11418
  const VCardTitle = createSimpleFunctional('v-card-title');
11132
11419
 
11133
- // Types
11134
-
11135
11420
  const VCardItem = genericComponent()({
11136
11421
  name: 'VCardItem',
11137
11422
  props: {
@@ -11141,6 +11426,7 @@
11141
11426
  prependIcon: IconValue,
11142
11427
  subtitle: String,
11143
11428
  title: String,
11429
+ ...makeComponentProps(),
11144
11430
  ...makeDensityProps()
11145
11431
  },
11146
11432
  setup(props, _ref) {
@@ -11155,7 +11441,8 @@
11155
11441
  const hasTitle = !!(props.title || slots.title);
11156
11442
  const hasSubtitle = !!(props.subtitle || slots.subtitle);
11157
11443
  return vue.createVNode("div", {
11158
- "class": "v-card-item"
11444
+ "class": ['v-card-item', props.class],
11445
+ "style": props.style
11159
11446
  }, [hasPrepend && vue.createVNode("div", {
11160
11447
  "key": "prepend",
11161
11448
  "class": "v-card-item__prepend"
@@ -11237,8 +11524,8 @@
11237
11524
  subtitle: String,
11238
11525
  text: String,
11239
11526
  title: String,
11240
- ...makeThemeProps(),
11241
11527
  ...makeBorderProps(),
11528
+ ...makeComponentProps(),
11242
11529
  ...makeDensityProps(),
11243
11530
  ...makeDimensionProps(),
11244
11531
  ...makeElevationProps(),
@@ -11248,6 +11535,7 @@
11248
11535
  ...makeRoundedProps(),
11249
11536
  ...makeRouterProps(),
11250
11537
  ...makeTagProps(),
11538
+ ...makeThemeProps(),
11251
11539
  ...makeVariantProps({
11252
11540
  variant: 'elevated'
11253
11541
  })
@@ -11308,8 +11596,8 @@
11308
11596
  'v-card--flat': props.flat,
11309
11597
  'v-card--hover': props.hover && !(props.disabled || props.flat),
11310
11598
  'v-card--link': isClickable.value
11311
- }, themeClasses.value, borderClasses.value, colorClasses.value, densityClasses.value, elevationClasses.value, loaderClasses.value, positionClasses.value, roundedClasses.value, variantClasses.value],
11312
- "style": [colorStyles.value, dimensionStyles.value, locationStyles.value],
11599
+ }, themeClasses.value, borderClasses.value, colorClasses.value, densityClasses.value, elevationClasses.value, loaderClasses.value, positionClasses.value, roundedClasses.value, variantClasses.value, props.class],
11600
+ "style": [colorStyles.value, dimensionStyles.value, locationStyles.value, props.style],
11313
11601
  "href": link.href.value,
11314
11602
  "onClick": isClickable.value && link.navigate,
11315
11603
  "tabindex": props.disabled ? -1 : undefined
@@ -11505,6 +11793,7 @@
11505
11793
  mandatory: {
11506
11794
  default: 'force'
11507
11795
  },
11796
+ ...makeComponentProps(),
11508
11797
  ...makeTagProps(),
11509
11798
  ...makeThemeProps()
11510
11799
  }, 'v-window');
@@ -11620,7 +11909,8 @@
11620
11909
  "ref": rootRef,
11621
11910
  "class": ['v-window', {
11622
11911
  'v-window--show-arrows-on-hover': props.showArrows === 'hover'
11623
- }, themeClasses.value]
11912
+ }, themeClasses.value, props.class],
11913
+ "style": props.style
11624
11914
  }, {
11625
11915
  default: () => [vue.createVNode("div", {
11626
11916
  "class": "v-window__container",
@@ -11705,10 +11995,10 @@
11705
11995
  "class": ['v-carousel', {
11706
11996
  'v-carousel--hide-delimiter-background': props.hideDelimiterBackground,
11707
11997
  'v-carousel--vertical-delimiters': props.verticalDelimiters
11708
- }],
11709
- "style": {
11998
+ }, props.class],
11999
+ "style": [{
11710
12000
  height: convertToUnit(props.height)
11711
- },
12001
+ }, props.style],
11712
12002
  "continuous": true,
11713
12003
  "mandatory": "force",
11714
12004
  "showArrows": props.showArrows
@@ -11774,6 +12064,7 @@
11774
12064
  type: [Boolean, String],
11775
12065
  default: undefined
11776
12066
  },
12067
+ ...makeComponentProps(),
11777
12068
  ...makeGroupItemProps(),
11778
12069
  ...makeLazyProps()
11779
12070
  },
@@ -11860,7 +12151,8 @@
11860
12151
  "disabled": !isBooted.value
11861
12152
  }, {
11862
12153
  default: () => [vue.withDirectives(vue.createVNode("div", {
11863
- "class": ['v-window-item', groupItem.selectedClass.value]
12154
+ "class": ['v-window-item', groupItem.selectedClass.value, props.class],
12155
+ "style": props.style
11864
12156
  }, [hasContent.value && slots.default?.()]), [[vue.vShow, groupItem.isSelected.value]])]
11865
12157
  }));
11866
12158
  return {};
@@ -11873,7 +12165,8 @@
11873
12165
  name: 'VCarouselItem',
11874
12166
  inheritAttrs: false,
11875
12167
  props: {
11876
- value: null
12168
+ value: null,
12169
+ ...makeComponentProps()
11877
12170
  },
11878
12171
  setup(props, _ref) {
11879
12172
  let {
@@ -11881,7 +12174,8 @@
11881
12174
  attrs
11882
12175
  } = _ref;
11883
12176
  useRender(() => vue.createVNode(VWindowItem, {
11884
- "class": "v-carousel-item",
12177
+ "class": ['v-carousel-item', props.class],
12178
+ "style": props.style,
11885
12179
  "value": props.value
11886
12180
  }, {
11887
12181
  default: () => [vue.createVNode(VImg, attrs, slots)]
@@ -11894,6 +12188,7 @@
11894
12188
  const makeVSheetProps = propsFactory({
11895
12189
  color: String,
11896
12190
  ...makeBorderProps(),
12191
+ ...makeComponentProps(),
11897
12192
  ...makeDimensionProps(),
11898
12193
  ...makeElevationProps(),
11899
12194
  ...makeLocationProps(),
@@ -11937,8 +12232,8 @@
11937
12232
  roundedClasses
11938
12233
  } = useRounded(props);
11939
12234
  useRender(() => vue.createVNode(props.tag, {
11940
- "class": ['v-sheet', themeClasses.value, backgroundColorClasses.value, borderClasses.value, elevationClasses.value, positionClasses.value, roundedClasses.value],
11941
- "style": [backgroundColorStyles.value, dimensionStyles.value, locationStyles.value]
12235
+ "class": ['v-sheet', themeClasses.value, backgroundColorClasses.value, borderClasses.value, elevationClasses.value, positionClasses.value, roundedClasses.value, props.class],
12236
+ "style": [backgroundColorStyles.value, dimensionStyles.value, locationStyles.value, props.style]
11942
12237
  }, slots));
11943
12238
  return {};
11944
12239
  }
@@ -11964,7 +12259,8 @@
11964
12259
  width: {
11965
12260
  type: [Number, String],
11966
12261
  default: 300
11967
- }
12262
+ },
12263
+ ...makeComponentProps()
11968
12264
  },
11969
12265
  emits: {
11970
12266
  'update:color': color => true,
@@ -12109,7 +12405,8 @@
12109
12405
  vue.onMounted(() => updateCanvas());
12110
12406
  useRender(() => vue.createVNode("div", {
12111
12407
  "ref": resizeRef,
12112
- "class": "v-color-picker-canvas",
12408
+ "class": ['v-color-picker-canvas', props.class],
12409
+ "style": props.style,
12113
12410
  "onClick": handleClick,
12114
12411
  "onMousedown": handleMouseDown,
12115
12412
  "onTouchstart": handleMouseDown
@@ -12342,7 +12639,8 @@
12342
12639
  type: Array,
12343
12640
  default: () => Object.keys(modes),
12344
12641
  validator: v => Array.isArray(v) && v.every(m => Object.keys(modes).includes(m))
12345
- }
12642
+ },
12643
+ ...makeComponentProps()
12346
12644
  },
12347
12645
  emits: {
12348
12646
  'update:color': color => true,
@@ -12382,7 +12680,8 @@
12382
12680
  });
12383
12681
  });
12384
12682
  useRender(() => vue.createVNode("div", {
12385
- "class": "v-color-picker-edit"
12683
+ "class": ['v-color-picker-edit', props.class],
12684
+ "style": props.style
12386
12685
  }, [inputs.value?.map(props => vue.createVNode(VColorPickerInput, props, null)), enabledModes.value.length > 1 && vue.createVNode(VBtn, {
12387
12686
  "icon": "$unfold",
12388
12687
  "size": "x-small",
@@ -12466,11 +12765,33 @@
12466
12765
  elevation: 2
12467
12766
  })
12468
12767
  }, 'slider');
12768
+ const useSteps = props => {
12769
+ const min = vue.computed(() => parseFloat(props.min));
12770
+ const max = vue.computed(() => parseFloat(props.max));
12771
+ const step = vue.computed(() => +props.step > 0 ? parseFloat(props.step) : 0);
12772
+ const decimals = vue.computed(() => Math.max(getDecimals(step.value), getDecimals(min.value)));
12773
+ function roundValue(value) {
12774
+ if (step.value <= 0) return value;
12775
+ const clamped = clamp(value, min.value, max.value);
12776
+ const offset = min.value % step.value;
12777
+ const newValue = Math.round((clamped - offset) / step.value) * step.value + offset;
12778
+ return parseFloat(Math.min(newValue, max.value).toFixed(decimals.value));
12779
+ }
12780
+ return {
12781
+ min,
12782
+ max,
12783
+ step,
12784
+ decimals,
12785
+ roundValue
12786
+ };
12787
+ };
12469
12788
  const useSlider = _ref => {
12470
12789
  let {
12471
12790
  props,
12472
- handleSliderMouseUp,
12473
- handleMouseMove,
12791
+ steps,
12792
+ onSliderStart,
12793
+ onSliderMove,
12794
+ onSliderEnd,
12474
12795
  getActiveThumb
12475
12796
  } = _ref;
12476
12797
  const {
@@ -12484,10 +12805,13 @@
12484
12805
  }
12485
12806
  return hd;
12486
12807
  });
12487
- const min = vue.computed(() => parseFloat(props.min));
12488
- const max = vue.computed(() => parseFloat(props.max));
12489
- const step = vue.computed(() => +props.step > 0 ? parseFloat(props.step) : 0);
12490
- const decimals = vue.computed(() => Math.max(getDecimals(step.value), getDecimals(min.value)));
12808
+ const {
12809
+ min,
12810
+ max,
12811
+ step,
12812
+ decimals,
12813
+ roundValue
12814
+ } = steps;
12491
12815
  const thumbSize = vue.computed(() => parseInt(props.thumbSize, 10));
12492
12816
  const tickSize = vue.computed(() => parseInt(props.tickSize, 10));
12493
12817
  const trackSize = vue.computed(() => parseInt(props.trackSize, 10));
@@ -12501,13 +12825,6 @@
12501
12825
  const startOffset = vue.ref(0);
12502
12826
  const trackContainerRef = vue.ref();
12503
12827
  const activeThumbRef = vue.ref();
12504
- function roundValue(value) {
12505
- if (step.value <= 0) return value;
12506
- const clamped = clamp(value, min.value, max.value);
12507
- const offset = min.value % step.value;
12508
- const newValue = Math.round((clamped - offset) / step.value) * step.value + offset;
12509
- return parseFloat(Math.min(newValue, max.value).toFixed(decimals.value));
12510
- }
12511
12828
  function parseMouseMove(e) {
12512
12829
  const vertical = props.direction === 'vertical';
12513
12830
  const start = vertical ? 'top' : 'left';
@@ -12524,14 +12841,11 @@
12524
12841
  if (vertical || horizontalDirection.value === 'rtl') clickPos = 1 - clickPos;
12525
12842
  return roundValue(min.value + clickPos * (max.value - min.value));
12526
12843
  }
12527
- let thumbMoved = false;
12528
12844
  const handleStop = e => {
12529
- if (!thumbMoved) {
12530
- startOffset.value = 0;
12531
- handleSliderMouseUp(parseMouseMove(e));
12532
- }
12845
+ onSliderEnd({
12846
+ value: parseMouseMove(e)
12847
+ });
12533
12848
  mousePressed.value = false;
12534
- thumbMoved = false;
12535
12849
  startOffset.value = 0;
12536
12850
  };
12537
12851
  const handleStart = e => {
@@ -12540,20 +12854,25 @@
12540
12854
  activeThumbRef.value.focus();
12541
12855
  mousePressed.value = true;
12542
12856
  if (activeThumbRef.value.contains(e.target)) {
12543
- thumbMoved = true;
12544
12857
  startOffset.value = getOffset(e, activeThumbRef.value, props.direction);
12545
12858
  } else {
12546
12859
  startOffset.value = 0;
12547
- handleMouseMove(parseMouseMove(e));
12860
+ onSliderMove({
12861
+ value: parseMouseMove(e)
12862
+ });
12548
12863
  }
12864
+ onSliderStart({
12865
+ value: parseMouseMove(e)
12866
+ });
12549
12867
  };
12550
12868
  const moveListenerOptions = {
12551
12869
  passive: true,
12552
12870
  capture: true
12553
12871
  };
12554
12872
  function onMouseMove(e) {
12555
- thumbMoved = true;
12556
- handleMouseMove(parseMouseMove(e));
12873
+ onSliderMove({
12874
+ value: parseMouseMove(e)
12875
+ });
12557
12876
  }
12558
12877
  function onSliderMouseUp(e) {
12559
12878
  e.stopPropagation();
@@ -12681,7 +13000,8 @@
12681
13000
  ripple: {
12682
13001
  type: Boolean,
12683
13002
  default: true
12684
- }
13003
+ },
13004
+ ...makeComponentProps()
12685
13005
  },
12686
13006
  emits: {
12687
13007
  'update:modelValue': v => true
@@ -12759,11 +13079,11 @@
12759
13079
  "class": ['v-slider-thumb', {
12760
13080
  'v-slider-thumb--focused': props.focused,
12761
13081
  'v-slider-thumb--pressed': props.focused && mousePressed.value
12762
- }],
12763
- "style": {
13082
+ }, props.class],
13083
+ "style": [{
12764
13084
  '--v-slider-thumb-position': positionPercentage,
12765
13085
  '--v-slider-thumb-size': convertToUnit(thumbSize.value)
12766
- },
13086
+ }, props.style],
12767
13087
  "role": "slider",
12768
13088
  "tabindex": disabled.value ? -1 : 0,
12769
13089
  "aria-valuemin": props.min,
@@ -12809,7 +13129,8 @@
12809
13129
  stop: {
12810
13130
  type: Number,
12811
13131
  required: true
12812
- }
13132
+ },
13133
+ ...makeComponentProps()
12813
13134
  },
12814
13135
  emits: {},
12815
13136
  setup(props, _ref) {
@@ -12884,12 +13205,12 @@
12884
13205
  });
12885
13206
  useRender(() => {
12886
13207
  return vue.createVNode("div", {
12887
- "class": ['v-slider-track', roundedClasses.value],
12888
- "style": {
13208
+ "class": ['v-slider-track', roundedClasses.value, props.class],
13209
+ "style": [{
12889
13210
  '--v-slider-track-size': convertToUnit(trackSize.value),
12890
13211
  '--v-slider-tick-size': convertToUnit(tickSize.value),
12891
13212
  direction: !vertical.value ? horizontalDirection.value : undefined
12892
- }
13213
+ }, props.style]
12893
13214
  }, [vue.createVNode("div", {
12894
13215
  "class": ['v-slider-track__background', trackColorClasses.value, {
12895
13216
  'v-slider-track__background--opacity': !!color.value || !trackFillColor.value
@@ -12929,13 +13250,21 @@
12929
13250
  },
12930
13251
  emits: {
12931
13252
  'update:focused': value => true,
12932
- 'update:modelValue': v => true
13253
+ 'update:modelValue': v => true,
13254
+ start: value => true,
13255
+ end: value => true
12933
13256
  },
12934
13257
  setup(props, _ref) {
12935
13258
  let {
12936
- slots
13259
+ slots,
13260
+ emit
12937
13261
  } = _ref;
12938
13262
  const thumbContainerRef = vue.ref();
13263
+ const steps = useSteps(props);
13264
+ const model = useProxiedModel(props, 'modelValue', undefined, v => {
13265
+ const value = typeof v === 'string' ? parseFloat(v) : v == null ? steps.min.value : v;
13266
+ return steps.roundValue(value);
13267
+ });
12939
13268
  const {
12940
13269
  min,
12941
13270
  max,
@@ -12949,16 +13278,26 @@
12949
13278
  readonly
12950
13279
  } = useSlider({
12951
13280
  props,
12952
- // eslint-disable-next-line @typescript-eslint/no-use-before-define
12953
- handleSliderMouseUp: newValue => model.value = roundValue(newValue),
12954
- // eslint-disable-next-line @typescript-eslint/no-use-before-define
12955
- handleMouseMove: newValue => model.value = roundValue(newValue),
13281
+ steps,
13282
+ onSliderStart: () => {
13283
+ emit('start', model.value);
13284
+ },
13285
+ onSliderEnd: _ref2 => {
13286
+ let {
13287
+ value
13288
+ } = _ref2;
13289
+ const roundedValue = roundValue(value);
13290
+ model.value = roundedValue;
13291
+ emit('end', roundedValue);
13292
+ },
13293
+ onSliderMove: _ref3 => {
13294
+ let {
13295
+ value
13296
+ } = _ref3;
13297
+ return model.value = roundValue(value);
13298
+ },
12956
13299
  getActiveThumb: () => thumbContainerRef.value?.$el
12957
13300
  });
12958
- const model = useProxiedModel(props, 'modelValue', undefined, v => {
12959
- const value = typeof v === 'string' ? parseFloat(v) : v == null ? min.value : v;
12960
- return roundValue(value);
12961
- });
12962
13301
  const {
12963
13302
  isFocused,
12964
13303
  focus,
@@ -12974,7 +13313,8 @@
12974
13313
  'v-slider--focused': isFocused.value,
12975
13314
  'v-slider--pressed': mousePressed.value,
12976
13315
  'v-slider--disabled': props.disabled
12977
- }]
13316
+ }, props.class],
13317
+ "style": props.style
12978
13318
  }, inputProps, {
12979
13319
  "focused": isFocused.value
12980
13320
  }), {
@@ -12984,11 +13324,11 @@
12984
13324
  "class": "v-slider__label",
12985
13325
  "text": props.label
12986
13326
  }, null) : undefined, slots.prepend?.(slotProps)]) : undefined,
12987
- default: _ref2 => {
13327
+ default: _ref4 => {
12988
13328
  let {
12989
13329
  id,
12990
13330
  messagesId
12991
- } = _ref2;
13331
+ } = _ref4;
12992
13332
  return vue.createVNode("div", {
12993
13333
  "class": "v-slider__container",
12994
13334
  "onMousedown": !readonly.value ? onSliderMousedown : undefined,
@@ -13037,7 +13377,8 @@
13037
13377
  type: Object
13038
13378
  },
13039
13379
  disabled: Boolean,
13040
- hideAlpha: Boolean
13380
+ hideAlpha: Boolean,
13381
+ ...makeComponentProps()
13041
13382
  },
13042
13383
  emits: {
13043
13384
  'update:color': color => true
@@ -13049,7 +13390,8 @@
13049
13390
  useRender(() => vue.createVNode("div", {
13050
13391
  "class": ['v-color-picker-preview', {
13051
13392
  'v-color-picker-preview--hide-alpha': props.hideAlpha
13052
- }]
13393
+ }, props.class],
13394
+ "style": props.style
13053
13395
  }, [vue.createVNode("div", {
13054
13396
  "class": "v-color-picker-preview__dot"
13055
13397
  }, [vue.createVNode("div", {
@@ -13430,7 +13772,8 @@
13430
13772
  },
13431
13773
  disabled: Boolean,
13432
13774
  color: Object,
13433
- maxHeight: [Number, String]
13775
+ maxHeight: [Number, String],
13776
+ ...makeComponentProps()
13434
13777
  },
13435
13778
  emits: {
13436
13779
  'update:color': color => true
@@ -13440,10 +13783,10 @@
13440
13783
  emit
13441
13784
  } = _ref;
13442
13785
  useRender(() => vue.createVNode("div", {
13443
- "class": "v-color-picker-swatches",
13444
- "style": {
13786
+ "class": ['v-color-picker-swatches', props.class],
13787
+ "style": [{
13445
13788
  maxHeight: convertToUnit(props.maxHeight)
13446
- }
13789
+ }, props.style]
13447
13790
  }, [vue.createVNode("div", null, [props.swatches.map(swatch => vue.createVNode("div", {
13448
13791
  "class": "v-color-picker-swatches__swatch"
13449
13792
  }, [swatch.map(color => {
@@ -13547,13 +13890,13 @@
13547
13890
  "rounded": props.rounded,
13548
13891
  "elevation": props.elevation,
13549
13892
  "theme": props.theme,
13550
- "class": ['v-color-picker'],
13551
- "style": {
13893
+ "class": ['v-color-picker', props.class],
13894
+ "style": [{
13552
13895
  '--v-color-picker-color-hsv': HSVtoCSS({
13553
13896
  ...(currentColor.value ?? nullColor),
13554
13897
  a: 1
13555
13898
  })
13556
- }
13899
+ }, props.style]
13557
13900
  }, sheetProps, {
13558
13901
  "maxWidth": props.width
13559
13902
  }), {
@@ -13864,7 +14207,8 @@
13864
14207
  'v-combobox--chips': !!props.chips,
13865
14208
  'v-combobox--selecting-index': selectionIndex.value > -1,
13866
14209
  [`v-combobox--${props.multiple ? 'multiple' : 'single'}`]: true
13867
- }],
14210
+ }, props.class],
14211
+ "style": props.style,
13868
14212
  "appendInnerIcon": props.items.length ? props.menuIcon : undefined,
13869
14213
  "readonly": props.readonly,
13870
14214
  "placeholder": isDirty ? undefined : props.placeholder,
@@ -14021,7 +14365,7 @@
14021
14365
  ![document, overlay.value.contentEl].includes(after) &&
14022
14366
  // It isn't inside the dialog body
14023
14367
  !overlay.value.contentEl.contains(after)) {
14024
- const focusable = [...overlay.value.contentEl.querySelectorAll('button, [href], input:not([type="hidden"]), select, textarea, [tabindex]:not([tabindex="-1"])')].filter(el => !el.hasAttribute('disabled') && !el.matches('[tabindex="-1"]'));
14368
+ const focusable = focusableChildren(overlay.value.contentEl);
14025
14369
  if (!focusable.length) return;
14026
14370
  const firstElement = focusable[0];
14027
14371
  const lastElement = focusable[focusable.length - 1];
@@ -14062,7 +14406,8 @@
14062
14406
  "class": ['v-dialog', {
14063
14407
  'v-dialog--fullscreen': props.fullscreen,
14064
14408
  'v-dialog--scrollable': props.scrollable
14065
- }]
14409
+ }, props.class],
14410
+ "style": props.style
14066
14411
  }, overlayProps, {
14067
14412
  "modelValue": isActive.value,
14068
14413
  "onUpdate:modelValue": $event => isActive.value = $event,
@@ -14101,6 +14446,7 @@
14101
14446
  validator: v => allowedVariants.includes(v)
14102
14447
  },
14103
14448
  readonly: Boolean,
14449
+ ...makeComponentProps(),
14104
14450
  ...makeGroupProps(),
14105
14451
  ...makeTagProps(),
14106
14452
  ...makeThemeProps()
@@ -14126,7 +14472,8 @@
14126
14472
  }
14127
14473
  });
14128
14474
  useRender(() => vue.createVNode(props.tag, {
14129
- "class": ['v-expansion-panels', themeClasses.value, variantClass.value]
14475
+ "class": ['v-expansion-panels', themeClasses.value, variantClass.value, props.class],
14476
+ "style": props.style
14130
14477
  }, slots));
14131
14478
  return {};
14132
14479
  }
@@ -14155,6 +14502,7 @@
14155
14502
  Ripple
14156
14503
  },
14157
14504
  props: {
14505
+ ...makeComponentProps(),
14158
14506
  ...makeVExpansionPanelTitleProps()
14159
14507
  },
14160
14508
  setup(props, _ref) {
@@ -14177,8 +14525,8 @@
14177
14525
  useRender(() => vue.withDirectives(vue.createVNode("button", {
14178
14526
  "class": ['v-expansion-panel-title', {
14179
14527
  'v-expansion-panel-title--active': expansionPanel.isSelected.value
14180
- }, backgroundColorClasses.value],
14181
- "style": backgroundColorStyles.value,
14528
+ }, backgroundColorClasses.value, props.class],
14529
+ "style": [backgroundColorStyles.value, props.style],
14182
14530
  "type": "button",
14183
14531
  "tabindex": expansionPanel.disabled.value ? -1 : undefined,
14184
14532
  "disabled": expansionPanel.disabled.value,
@@ -14198,6 +14546,7 @@
14198
14546
  const VExpansionPanelText = genericComponent()({
14199
14547
  name: 'VExpansionPanelText',
14200
14548
  props: {
14549
+ ...makeComponentProps(),
14201
14550
  ...makeLazyProps()
14202
14551
  },
14203
14552
  setup(props, _ref) {
@@ -14214,7 +14563,8 @@
14214
14563
  "onAfterLeave": onAfterLeave
14215
14564
  }, {
14216
14565
  default: () => [vue.withDirectives(vue.createVNode("div", {
14217
- "class": "v-expansion-panel-text"
14566
+ "class": ['v-expansion-panel-text', props.class],
14567
+ "style": props.style
14218
14568
  }, [slots.default && hasContent.value && vue.createVNode("div", {
14219
14569
  "class": "v-expansion-panel-text__wrapper"
14220
14570
  }, [slots.default?.()])]), [[vue.vShow, expansionPanel.isSelected.value]])]
@@ -14229,6 +14579,7 @@
14229
14579
  title: String,
14230
14580
  text: String,
14231
14581
  bgColor: String,
14582
+ ...makeComponentProps(),
14232
14583
  ...makeElevationProps(),
14233
14584
  ...makeGroupItemProps(),
14234
14585
  ...makeLazyProps(),
@@ -14277,8 +14628,8 @@
14277
14628
  'v-expansion-panel--before-active': isBeforeSelected.value,
14278
14629
  'v-expansion-panel--after-active': isAfterSelected.value,
14279
14630
  'v-expansion-panel--disabled': isDisabled.value
14280
- }, roundedClasses.value, backgroundColorClasses.value],
14281
- "style": backgroundColorStyles.value,
14631
+ }, roundedClasses.value, backgroundColorClasses.value, props.class],
14632
+ "style": [backgroundColorStyles.value, props.style],
14282
14633
  "aria-expanded": groupItem.isSelected.value
14283
14634
  }, {
14284
14635
  default: () => [vue.createVNode("div", {
@@ -14428,7 +14779,8 @@
14428
14779
  "ref": vInputRef,
14429
14780
  "modelValue": model.value,
14430
14781
  "onUpdate:modelValue": $event => model.value = $event,
14431
- "class": "v-file-input",
14782
+ "class": ['v-file-input', props.class],
14783
+ "style": props.style,
14432
14784
  "onClick:prepend": onClickPrepend
14433
14785
  }, rootAttrs, inputProps, {
14434
14786
  "focused": isFocused.value
@@ -14520,6 +14872,7 @@
14520
14872
  default: 'auto'
14521
14873
  },
14522
14874
  ...makeBorderProps(),
14875
+ ...makeComponentProps(),
14523
14876
  ...makeElevationProps(),
14524
14877
  ...makeLayoutItemProps(),
14525
14878
  ...makeRoundedProps(),
@@ -14569,8 +14922,8 @@
14569
14922
  });
14570
14923
  useRender(() => vue.createVNode(props.tag, {
14571
14924
  "ref": resizeRef,
14572
- "class": ['v-footer', themeClasses.value, backgroundColorClasses.value, borderClasses.value, elevationClasses.value, roundedClasses.value],
14573
- "style": [backgroundColorStyles.value, props.app ? layoutItemStyles.value : undefined]
14925
+ "class": ['v-footer', themeClasses.value, backgroundColorClasses.value, borderClasses.value, elevationClasses.value, roundedClasses.value, props.class],
14926
+ "style": [backgroundColorStyles.value, props.app ? layoutItemStyles.value : undefined, props.style]
14574
14927
  }, slots));
14575
14928
  return {};
14576
14929
  }
@@ -14581,6 +14934,7 @@
14581
14934
  const VForm = genericComponent()({
14582
14935
  name: 'VForm',
14583
14936
  props: {
14937
+ ...makeComponentProps(),
14584
14938
  ...makeFormProps()
14585
14939
  },
14586
14940
  emits: {
@@ -14619,7 +14973,8 @@
14619
14973
  }
14620
14974
  useRender(() => vue.createVNode("form", {
14621
14975
  "ref": formRef,
14622
- "class": "v-form",
14976
+ "class": ['v-form', props.class],
14977
+ "style": props.style,
14623
14978
  "novalidate": true,
14624
14979
  "onReset": onReset,
14625
14980
  "onSubmit": onSubmit
@@ -14635,6 +14990,7 @@
14635
14990
  type: Boolean,
14636
14991
  default: false
14637
14992
  },
14993
+ ...makeComponentProps(),
14638
14994
  ...makeTagProps()
14639
14995
  },
14640
14996
  setup(props, _ref) {
@@ -14644,7 +15000,8 @@
14644
15000
  useRender(() => vue.createVNode(props.tag, {
14645
15001
  "class": ['v-container', {
14646
15002
  'v-container--fluid': props.fluid
14647
- }]
15003
+ }, props.class],
15004
+ "style": props.style
14648
15005
  }, slots));
14649
15006
  return {};
14650
15007
  }
@@ -14735,6 +15092,7 @@
14735
15092
  default: null,
14736
15093
  validator: str => ALIGN_SELF_VALUES.includes(str)
14737
15094
  },
15095
+ ...makeComponentProps(),
14738
15096
  ...makeTagProps()
14739
15097
  },
14740
15098
  setup(props, _ref) {
@@ -14765,7 +15123,8 @@
14765
15123
  return classList;
14766
15124
  });
14767
15125
  return () => vue.h(props.tag, {
14768
- class: classes.value
15126
+ class: [classes.value, props.class],
15127
+ style: props.style
14769
15128
  }, slots.default?.());
14770
15129
  }
14771
15130
  });
@@ -14851,6 +15210,7 @@
14851
15210
  validator: alignContentValidator
14852
15211
  },
14853
15212
  ...alignContentProps,
15213
+ ...makeComponentProps(),
14854
15214
  ...makeTagProps()
14855
15215
  },
14856
15216
  setup(props, _ref) {
@@ -14879,7 +15239,8 @@
14879
15239
  return classList;
14880
15240
  });
14881
15241
  return () => vue.h(props.tag, {
14882
- class: ['v-row', classes.value]
15242
+ class: ['v-row', classes.value, props.class],
15243
+ style: props.style
14883
15244
  }, slots.default?.());
14884
15245
  }
14885
15246
  });
@@ -14923,6 +15284,7 @@
14923
15284
  const VItemGroup = genericComponent()({
14924
15285
  name: 'VItemGroup',
14925
15286
  props: {
15287
+ ...makeComponentProps(),
14926
15288
  ...makeGroupProps({
14927
15289
  selectedClass: 'v-item--selected'
14928
15290
  }),
@@ -14947,7 +15309,8 @@
14947
15309
  selected
14948
15310
  } = useGroup(props, VItemGroupSymbol);
14949
15311
  return () => vue.createVNode(props.tag, {
14950
- "class": ['v-item-group', themeClasses.value]
15312
+ "class": ['v-item-group', themeClasses.value, props.class],
15313
+ "style": props.style
14951
15314
  }, {
14952
15315
  default: () => [slots.default?.({
14953
15316
  isSelected,
@@ -14997,7 +15360,10 @@
14997
15360
 
14998
15361
  const VLayout = genericComponent()({
14999
15362
  name: 'VLayout',
15000
- props: makeLayoutProps(),
15363
+ props: {
15364
+ ...makeComponentProps(),
15365
+ ...makeLayoutProps()
15366
+ },
15001
15367
  setup(props, _ref) {
15002
15368
  let {
15003
15369
  slots
@@ -15011,8 +15377,8 @@
15011
15377
  } = createLayout(props);
15012
15378
  useRender(() => vue.createVNode("div", {
15013
15379
  "ref": layoutRef,
15014
- "class": layoutClasses.value,
15015
- "style": layoutStyles.value
15380
+ "class": [layoutClasses.value, props.class],
15381
+ "style": [layoutStyles.value, props.style]
15016
15382
  }, [slots.default?.()]));
15017
15383
  return {
15018
15384
  getLayoutItem,
@@ -15035,6 +15401,7 @@
15035
15401
  default: 300
15036
15402
  },
15037
15403
  modelValue: Boolean,
15404
+ ...makeComponentProps(),
15038
15405
  ...makeLayoutItemProps()
15039
15406
  },
15040
15407
  setup(props, _ref) {
@@ -15053,8 +15420,8 @@
15053
15420
  absolute: vue.toRef(props, 'absolute')
15054
15421
  });
15055
15422
  return () => vue.createVNode("div", {
15056
- "class": ['v-layout-item'],
15057
- "style": layoutItemStyles.value
15423
+ "class": ['v-layout-item', props.class],
15424
+ "style": [layoutItemStyles.value, props.style]
15058
15425
  }, [slots.default?.()]);
15059
15426
  }
15060
15427
  });
@@ -15078,6 +15445,7 @@
15078
15445
  threshold: undefined
15079
15446
  })
15080
15447
  },
15448
+ ...makeComponentProps(),
15081
15449
  ...makeDimensionProps(),
15082
15450
  ...makeTagProps(),
15083
15451
  ...makeTransitionProps({
@@ -15100,8 +15468,8 @@
15100
15468
  isActive.value = isIntersecting;
15101
15469
  }
15102
15470
  useRender(() => vue.withDirectives(vue.createVNode(props.tag, {
15103
- "class": "v-lazy",
15104
- "style": dimensionStyles.value
15471
+ "class": ['v-lazy', props.class],
15472
+ "style": [dimensionStyles.value, props.style]
15105
15473
  }, {
15106
15474
  default: () => [isActive.value && vue.createVNode(MaybeTransition, {
15107
15475
  "transition": props.transition,
@@ -15126,7 +15494,8 @@
15126
15494
  rtl: {
15127
15495
  type: Boolean,
15128
15496
  default: undefined
15129
- }
15497
+ },
15498
+ ...makeComponentProps()
15130
15499
  },
15131
15500
  setup(props, _ref) {
15132
15501
  let {
@@ -15136,7 +15505,8 @@
15136
15505
  rtlClasses
15137
15506
  } = provideLocale(props);
15138
15507
  useRender(() => vue.createVNode("div", {
15139
- "class": ['v-locale-provider', rtlClasses.value]
15508
+ "class": ['v-locale-provider', rtlClasses.value, props.class],
15509
+ "style": props.style
15140
15510
  }, [slots.default?.()]));
15141
15511
  return {};
15142
15512
  }
@@ -15146,6 +15516,7 @@
15146
15516
  name: 'VMain',
15147
15517
  props: {
15148
15518
  scrollable: Boolean,
15519
+ ...makeComponentProps(),
15149
15520
  ...makeTagProps({
15150
15521
  tag: 'main'
15151
15522
  })
@@ -15163,8 +15534,8 @@
15163
15534
  useRender(() => vue.createVNode(props.tag, {
15164
15535
  "class": ['v-main', {
15165
15536
  'v-main--scrollable': props.scrollable
15166
- }],
15167
- "style": [mainStyles.value, ssrBootStyles.value]
15537
+ }, props.class],
15538
+ "style": [mainStyles.value, ssrBootStyles.value, props.style]
15168
15539
  }, {
15169
15540
  default: () => [props.scrollable ? vue.createVNode("div", {
15170
15541
  "class": "v-main__scroller"
@@ -15510,6 +15881,7 @@
15510
15881
  },
15511
15882
  sticky: Boolean,
15512
15883
  ...makeBorderProps(),
15884
+ ...makeComponentProps(),
15513
15885
  ...makeElevationProps(),
15514
15886
  ...makeLayoutItemProps(),
15515
15887
  ...makeRoundedProps(),
@@ -15661,8 +16033,8 @@
15661
16033
  'v-navigation-drawer--temporary': isTemporary.value,
15662
16034
  'v-navigation-drawer--active': isActive.value,
15663
16035
  'v-navigation-drawer--sticky': isSticky.value
15664
- }, themeClasses.value, backgroundColorClasses.value, borderClasses.value, elevationClasses.value, roundedClasses.value],
15665
- "style": [backgroundColorStyles.value, layoutItemStyles.value, dragStyles.value, ssrBootStyles.value, stickyStyles.value]
16036
+ }, themeClasses.value, backgroundColorClasses.value, borderClasses.value, elevationClasses.value, roundedClasses.value, props.class],
16037
+ "style": [backgroundColorStyles.value, layoutItemStyles.value, dragStyles.value, ssrBootStyles.value, stickyStyles.value, props.style]
15666
16038
  }, attrs), {
15667
16039
  default: () => [hasImage && vue.createVNode("div", {
15668
16040
  "key": "image",
@@ -15791,6 +16163,7 @@
15791
16163
  },
15792
16164
  showFirstLastPage: Boolean,
15793
16165
  ...makeBorderProps(),
16166
+ ...makeComponentProps(),
15794
16167
  ...makeDensityProps(),
15795
16168
  ...makeElevationProps(),
15796
16169
  ...makeRoundedProps(),
@@ -15987,7 +16360,8 @@
15987
16360
  }
15988
16361
  useRender(() => vue.createVNode(props.tag, {
15989
16362
  "ref": resizeRef,
15990
- "class": ['v-pagination', themeClasses.value],
16363
+ "class": ['v-pagination', themeClasses.value, props.class],
16364
+ "style": props.style,
15991
16365
  "role": "navigation",
15992
16366
  "aria-label": t(props.ariaLabel),
15993
16367
  "onKeydown": onKeydown,
@@ -16046,7 +16420,8 @@
16046
16420
  scale: {
16047
16421
  type: [Number, String],
16048
16422
  default: 0.5
16049
- }
16423
+ },
16424
+ ...makeComponentProps()
16050
16425
  },
16051
16426
  setup(props, _ref) {
16052
16427
  let {
@@ -16108,7 +16483,8 @@
16108
16483
  useRender(() => vue.createVNode(VImg, {
16109
16484
  "class": ['v-parallax', {
16110
16485
  'v-parallax--active': isIntersecting.value
16111
- }],
16486
+ }, props.class],
16487
+ "style": props.style,
16112
16488
  "ref": root,
16113
16489
  "cover": true,
16114
16490
  "onLoadstart": onScroll,
@@ -16133,7 +16509,8 @@
16133
16509
  slots
16134
16510
  } = _ref;
16135
16511
  useRender(() => vue.createVNode(VSelectionControl, vue.mergeProps(props, {
16136
- "class": "v-radio",
16512
+ "class": ['v-radio', props.class],
16513
+ "style": props.style,
16137
16514
  "type": "radio"
16138
16515
  }), slots));
16139
16516
  return {};
@@ -16187,7 +16564,8 @@
16187
16564
  }
16188
16565
  }) : props.label;
16189
16566
  return vue.createVNode(VInput, vue.mergeProps({
16190
- "class": "v-radio-group"
16567
+ "class": ['v-radio-group', props.class],
16568
+ "style": props.style
16191
16569
  }, inputAttrs, inputProps, {
16192
16570
  "modelValue": model.value,
16193
16571
  "onUpdate:modelValue": $event => model.value = $event,
@@ -16243,11 +16621,14 @@
16243
16621
  },
16244
16622
  emits: {
16245
16623
  'update:focused': value => true,
16246
- 'update:modelValue': value => true
16624
+ 'update:modelValue': value => true,
16625
+ end: value => true,
16626
+ start: value => true
16247
16627
  },
16248
16628
  setup(props, _ref) {
16249
16629
  let {
16250
- slots
16630
+ slots,
16631
+ emit
16251
16632
  } = _ref;
16252
16633
  const startThumbRef = vue.ref();
16253
16634
  const stopThumbRef = vue.ref();
@@ -16260,6 +16641,11 @@
16260
16641
  const b = Math.abs(stopOffset);
16261
16642
  return a < b || a === b && startOffset < 0 ? startThumbRef.value.$el : stopThumbRef.value.$el;
16262
16643
  }
16644
+ const steps = useSteps(props);
16645
+ const model = useProxiedModel(props, 'modelValue', undefined, arr => {
16646
+ if (!arr?.length) return [0, 0];
16647
+ return arr.map(value => steps.roundValue(value));
16648
+ });
16263
16649
  const {
16264
16650
  activeThumbRef,
16265
16651
  hasLabels,
@@ -16269,34 +16655,37 @@
16269
16655
  onSliderMousedown,
16270
16656
  onSliderTouchstart,
16271
16657
  position,
16272
- roundValue,
16273
16658
  trackContainerRef
16274
16659
  } = useSlider({
16275
- /* eslint-disable @typescript-eslint/no-use-before-define */
16276
16660
  props,
16277
- handleSliderMouseUp: newValue => {
16278
- model.value = activeThumbRef.value === startThumbRef.value?.$el ? [newValue, model.value[1]] : [model.value[0], newValue];
16661
+ steps,
16662
+ onSliderStart: () => {
16663
+ emit('start', model.value);
16664
+ },
16665
+ onSliderEnd: _ref2 => {
16666
+ let {
16667
+ value
16668
+ } = _ref2;
16669
+ const newValue = activeThumbRef.value === startThumbRef.value?.$el ? [value, model.value[1]] : [model.value[0], value];
16670
+ model.value = newValue;
16671
+ emit('end', newValue);
16279
16672
  },
16280
- handleMouseMove: newValue => {
16673
+ onSliderMove: _ref3 => {
16674
+ let {
16675
+ value
16676
+ } = _ref3;
16281
16677
  const [start, stop] = model.value;
16282
16678
  if (!props.strict && start === stop && start !== min.value) {
16283
- activeThumbRef.value = newValue > start ? stopThumbRef.value?.$el : startThumbRef.value?.$el;
16679
+ activeThumbRef.value = value > start ? stopThumbRef.value?.$el : startThumbRef.value?.$el;
16284
16680
  activeThumbRef.value?.focus();
16285
16681
  }
16286
16682
  if (activeThumbRef.value === startThumbRef.value?.$el) {
16287
- model.value = [Math.min(newValue, stop), stop];
16683
+ model.value = [Math.min(value, stop), stop];
16288
16684
  } else {
16289
- model.value = [start, Math.max(start, newValue)];
16685
+ model.value = [start, Math.max(start, value)];
16290
16686
  }
16291
16687
  },
16292
16688
  getActiveThumb
16293
- /* eslint-enable @typescript-eslint/no-use-before-define */
16294
- });
16295
-
16296
- const model = useProxiedModel(props, 'modelValue', undefined, arr => {
16297
- // eslint-disable-next-line @typescript-eslint/prefer-optional-chain
16298
- if (!arr || !arr.length) return [0, 0];
16299
- return arr.map(value => roundValue(value));
16300
16689
  });
16301
16690
  const {
16302
16691
  isFocused,
@@ -16314,7 +16703,8 @@
16314
16703
  'v-slider--focused': isFocused.value,
16315
16704
  'v-slider--pressed': mousePressed.value,
16316
16705
  'v-slider--disabled': props.disabled
16317
- }],
16706
+ }, props.class],
16707
+ "style": props.style,
16318
16708
  "ref": inputRef
16319
16709
  }, inputProps, {
16320
16710
  "focused": isFocused.value
@@ -16324,11 +16714,11 @@
16324
16714
  "class": "v-slider__label",
16325
16715
  "text": props.label
16326
16716
  }, null) : undefined, slots.prepend?.(slotProps)]) : undefined,
16327
- default: _ref2 => {
16717
+ default: _ref4 => {
16328
16718
  let {
16329
16719
  id,
16330
16720
  messagesId
16331
- } = _ref2;
16721
+ } = _ref4;
16332
16722
  return vue.createVNode("div", {
16333
16723
  "class": "v-slider__container",
16334
16724
  "onMousedown": onSliderMousedown,
@@ -16457,6 +16847,7 @@
16457
16847
  validator: v => ['top', 'bottom'].includes(v)
16458
16848
  },
16459
16849
  ripple: Boolean,
16850
+ ...makeComponentProps(),
16460
16851
  ...makeDensityProps(),
16461
16852
  ...makeSizeProps(),
16462
16853
  ...makeTagProps(),
@@ -16480,9 +16871,6 @@
16480
16871
  const range = vue.computed(() => createRange(Number(props.length), 1));
16481
16872
  const increments = vue.computed(() => range.value.flatMap(v => props.halfIncrements ? [v - 0.5, v] : [v]));
16482
16873
  const hoverIndex = vue.ref(-1);
16483
- const focusIndex = vue.ref(-1);
16484
- const firstRef = vue.ref();
16485
- let isClicking = false;
16486
16874
  const itemState = vue.computed(() => increments.value.map(value => {
16487
16875
  const isHovering = props.hover && hoverIndex.value > -1;
16488
16876
  const isFilled = normalizedValue.value >= value;
@@ -16505,16 +16893,6 @@
16505
16893
  function onMouseleave() {
16506
16894
  hoverIndex.value = -1;
16507
16895
  }
16508
- function onFocus() {
16509
- if (value === 0 && normalizedValue.value === 0) {
16510
- firstRef.value?.focus();
16511
- } else {
16512
- focusIndex.value = value;
16513
- }
16514
- }
16515
- function onBlur() {
16516
- if (!isClicking) focusIndex.value = -1;
16517
- }
16518
16896
  function onClick() {
16519
16897
  if (props.disabled || props.readonly) return;
16520
16898
  rating.value = normalizedValue.value === value && props.clearable ? 0 : value;
@@ -16522,17 +16900,9 @@
16522
16900
  return {
16523
16901
  onMouseenter: props.hover ? onMouseenter : undefined,
16524
16902
  onMouseleave: props.hover ? onMouseleave : undefined,
16525
- onFocus,
16526
- onBlur,
16527
16903
  onClick
16528
16904
  };
16529
16905
  }));
16530
- function onMousedown() {
16531
- isClicking = true;
16532
- }
16533
- function onMouseup() {
16534
- isClicking = false;
16535
- }
16536
16906
  const name = vue.computed(() => props.name ?? `v-rating-${getUid()}`);
16537
16907
  function VRatingItem(_ref2) {
16538
16908
  let {
@@ -16543,8 +16913,6 @@
16543
16913
  const {
16544
16914
  onMouseenter,
16545
16915
  onMouseleave,
16546
- onFocus,
16547
- onBlur,
16548
16916
  onClick
16549
16917
  } = eventState.value[index + 1];
16550
16918
  const id = `${name.value}-${String(value).replace('.', '-')}`;
@@ -16555,7 +16923,6 @@
16555
16923
  icon: itemState.value[index]?.icon,
16556
16924
  ripple: props.ripple,
16557
16925
  size: props.size,
16558
- tag: 'span',
16559
16926
  variant: 'plain'
16560
16927
  };
16561
16928
  return vue.createVNode(vue.Fragment, null, [vue.createVNode("label", {
@@ -16564,17 +16931,17 @@
16564
16931
  'v-rating__item--half': props.halfIncrements && value % 1 > 0,
16565
16932
  'v-rating__item--full': props.halfIncrements && value % 1 === 0
16566
16933
  },
16567
- "onMousedown": onMousedown,
16568
- "onMouseup": onMouseup,
16569
16934
  "onMouseenter": onMouseenter,
16570
- "onMouseleave": onMouseleave
16935
+ "onMouseleave": onMouseleave,
16936
+ "onClick": onClick
16571
16937
  }, [vue.createVNode("span", {
16572
16938
  "class": "v-rating__hidden"
16573
16939
  }, [t(props.itemAriaLabel, value, props.length)]), !showStar ? undefined : slots.item ? slots.item({
16574
16940
  ...itemState.value[index],
16575
16941
  props: btnProps,
16576
16942
  value,
16577
- index
16943
+ index,
16944
+ rating: normalizedValue.value
16578
16945
  }) : vue.createVNode(VBtn, btnProps, null)]), vue.createVNode("input", {
16579
16946
  "class": "v-rating__hidden",
16580
16947
  "name": name.value,
@@ -16582,10 +16949,7 @@
16582
16949
  "type": "radio",
16583
16950
  "value": value,
16584
16951
  "checked": normalizedValue.value === value,
16585
- "onClick": onClick,
16586
- "onFocus": onFocus,
16587
- "onBlur": onBlur,
16588
- "ref": index === 0 ? firstRef : undefined,
16952
+ "tabindex": -1,
16589
16953
  "readonly": props.readonly,
16590
16954
  "disabled": props.disabled
16591
16955
  }, null)]);
@@ -16601,7 +16965,8 @@
16601
16965
  "class": ['v-rating', {
16602
16966
  'v-rating--hover': props.hover,
16603
16967
  'v-rating--readonly': props.readonly
16604
- }, themeClasses.value]
16968
+ }, themeClasses.value, props.class],
16969
+ "style": props.style
16605
16970
  }, {
16606
16971
  default: () => [vue.createVNode(VRatingItem, {
16607
16972
  "value": 0,
@@ -16614,9 +16979,7 @@
16614
16979
  index: i,
16615
16980
  label: props.itemLabels?.[i]
16616
16981
  }) : undefined, vue.createVNode("div", {
16617
- "class": ['v-rating__item', {
16618
- 'v-rating__item--focused': Math.ceil(focusIndex.value) === value
16619
- }]
16982
+ "class": "v-rating__item"
16620
16983
  }, [props.halfIncrements ? vue.createVNode(vue.Fragment, null, [vue.createVNode(VRatingItem, {
16621
16984
  "value": value - 0.5,
16622
16985
  "index": i * 2
@@ -16703,6 +17066,7 @@
16703
17066
  type: [Boolean, String],
16704
17067
  validator: v => typeof v === 'boolean' || ['always', 'desktop', 'mobile'].includes(v)
16705
17068
  },
17069
+ ...makeComponentProps(),
16706
17070
  ...makeTagProps(),
16707
17071
  ...makeGroupProps({
16708
17072
  selectedClass: 'v-slide-group-item--active'
@@ -16866,7 +17230,7 @@
16866
17230
  function focus(location) {
16867
17231
  if (!contentRef.value) return;
16868
17232
  if (!location) {
16869
- const focusable = [...contentRef.value.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])')].filter(el => !el.hasAttribute('disabled'));
17233
+ const focusable = focusableChildren(contentRef.value);
16870
17234
  focusable[0]?.focus();
16871
17235
  } else if (location === 'next') {
16872
17236
  const el = contentRef.value.querySelector(':focus')?.nextElementSibling;
@@ -16943,7 +17307,8 @@
16943
17307
  'v-slide-group--vertical': !isHorizontal.value,
16944
17308
  'v-slide-group--has-affixes': hasAffixes.value,
16945
17309
  'v-slide-group--is-overflowing': isOverflowing.value
16946
- }],
17310
+ }, props.class],
17311
+ "style": props.style,
16947
17312
  "tabindex": isFocused.value || group.selected.value.length ? -1 : 0,
16948
17313
  "onFocus": onFocus
16949
17314
  }, {
@@ -17093,7 +17458,8 @@
17093
17458
  'v-snackbar--active': isActive.value,
17094
17459
  'v-snackbar--multi-line': props.multiLine && !props.vertical,
17095
17460
  'v-snackbar--vertical': props.vertical
17096
- }, positionClasses.value]
17461
+ }, positionClasses.value, props.class],
17462
+ "style": props.style
17097
17463
  }, overlayProps, {
17098
17464
  "modelValue": isActive.value,
17099
17465
  "onUpdate:modelValue": $event => isActive.value = $event,
@@ -17193,7 +17559,8 @@
17193
17559
  'v-switch--inset': props.inset
17194
17560
  }, {
17195
17561
  'v-switch--indeterminate': indeterminate.value
17196
- }, loaderClasses.value]
17562
+ }, loaderClasses.value, props.class],
17563
+ "style": props.style
17197
17564
  }, inputAttrs, inputProps, {
17198
17565
  "id": id.value,
17199
17566
  "focused": isFocused.value
@@ -17262,6 +17629,7 @@
17262
17629
  color: String,
17263
17630
  height: [Number, String],
17264
17631
  window: Boolean,
17632
+ ...makeComponentProps(),
17265
17633
  ...makeElevationProps(),
17266
17634
  ...makeLayoutItemProps(),
17267
17635
  ...makeRoundedProps(),
@@ -17303,8 +17671,8 @@
17303
17671
  useRender(() => vue.createVNode(props.tag, {
17304
17672
  "class": ['v-system-bar', {
17305
17673
  'v-system-bar--window': props.window
17306
- }, themeClasses.value, backgroundColorClasses.value, elevationClasses.value, roundedClasses.value],
17307
- "style": [backgroundColorStyles.value, layoutItemStyles.value, ssrBootStyles.value]
17674
+ }, themeClasses.value, backgroundColorClasses.value, elevationClasses.value, roundedClasses.value, props.class],
17675
+ "style": [backgroundColorStyles.value, layoutItemStyles.value, ssrBootStyles.value, props.style]
17308
17676
  }, slots));
17309
17677
  return {};
17310
17678
  }
@@ -17316,7 +17684,6 @@
17316
17684
  name: 'VTab',
17317
17685
  props: {
17318
17686
  fixed: Boolean,
17319
- title: String,
17320
17687
  sliderColor: String,
17321
17688
  hideSlider: Boolean,
17322
17689
  direction: {
@@ -17378,10 +17745,10 @@
17378
17745
  useRender(() => {
17379
17746
  const [btnProps] = VBtn.filterProps(props);
17380
17747
  return vue.createVNode(VBtn, vue.mergeProps({
17381
- "_as": "VTab",
17382
17748
  "symbol": VTabsSymbol,
17383
17749
  "ref": rootEl,
17384
- "class": ['v-tab'],
17750
+ "class": ['v-tab', props.class],
17751
+ "style": props.style,
17385
17752
  "tabindex": isSelected.value ? 0 : -1,
17386
17753
  "role": "tab",
17387
17754
  "aria-selected": String(isSelected.value),
@@ -17392,7 +17759,7 @@
17392
17759
  }, btnProps, attrs, {
17393
17760
  "onGroup:selected": updateSlider
17394
17761
  }), {
17395
- default: () => [slots.default ? slots.default() : props.title, !props.hideSlider && vue.createVNode("div", {
17762
+ default: () => [slots.default?.() ?? props.text, !props.hideSlider && vue.createVNode("div", {
17396
17763
  "ref": sliderEl,
17397
17764
  "class": ['v-tab__slider', sliderColorClasses.value],
17398
17765
  "style": sliderColorStyles.value
@@ -17476,10 +17843,10 @@
17476
17843
  'v-tabs--fixed-tabs': props.fixedTabs,
17477
17844
  'v-tabs--grow': props.grow,
17478
17845
  'v-tabs--stacked': props.stacked
17479
- }, densityClasses.value, backgroundColorClasses.value],
17846
+ }, densityClasses.value, backgroundColorClasses.value, props.class],
17480
17847
  "style": [{
17481
17848
  '--v-tabs-height': convertToUnit(props.height)
17482
- }, backgroundColorStyles.value],
17849
+ }, backgroundColorStyles.value, props.style],
17483
17850
  "role": "tablist",
17484
17851
  "symbol": VTabsSymbol
17485
17852
  }), {
@@ -17499,6 +17866,7 @@
17499
17866
  fixedFooter: Boolean,
17500
17867
  height: [Number, String],
17501
17868
  hover: Boolean,
17869
+ ...makeComponentProps(),
17502
17870
  ...makeDensityProps(),
17503
17871
  ...makeTagProps(),
17504
17872
  ...makeThemeProps()
@@ -17521,7 +17889,8 @@
17521
17889
  'v-table--has-top': !!slots.top,
17522
17890
  'v-table--has-bottom': !!slots.bottom,
17523
17891
  'v-table--hover': props.hover
17524
- }, themeClasses.value, densityClasses.value]
17892
+ }, themeClasses.value, densityClasses.value, props.class],
17893
+ "style": props.style
17525
17894
  }, {
17526
17895
  default: () => [slots.top?.(), slots.default ? vue.createVNode("div", {
17527
17896
  "class": "v-table__wrapper",
@@ -17686,7 +18055,8 @@
17686
18055
  'v-textarea--auto-grow': props.autoGrow,
17687
18056
  'v-textarea--no-resize': props.noResize || props.autoGrow,
17688
18057
  'v-text-field--flush-details': ['plain', 'underlined'].includes(props.variant)
17689
- }]
18058
+ }, props.class],
18059
+ "style": props.style
17690
18060
  }, rootAttrs, inputProps, {
17691
18061
  "focused": isFocused.value
17692
18062
  }), {
@@ -17770,6 +18140,7 @@
17770
18140
  name: 'VThemeProvider',
17771
18141
  props: {
17772
18142
  withBackground: Boolean,
18143
+ ...makeComponentProps(),
17773
18144
  ...makeThemeProps(),
17774
18145
  ...makeTagProps()
17775
18146
  },
@@ -17783,7 +18154,8 @@
17783
18154
  return () => {
17784
18155
  if (!props.withBackground) return slots.default?.();
17785
18156
  return vue.createVNode(props.tag, {
17786
- "class": ['v-theme-provider', themeClasses.value]
18157
+ "class": ['v-theme-provider', themeClasses.value, props.class],
18158
+ "style": props.style
17787
18159
  }, {
17788
18160
  default: () => [slots.default?.()]
17789
18161
  });
@@ -17828,6 +18200,7 @@
17828
18200
  type: String,
17829
18201
  validator: v => ['start', 'end', 'both'].includes(v)
17830
18202
  },
18203
+ ...makeComponentProps(),
17831
18204
  ...makeDensityProps(),
17832
18205
  ...makeTagProps(),
17833
18206
  ...makeThemeProps()
@@ -17871,10 +18244,10 @@
17871
18244
  useRender(() => vue.createVNode(props.tag, {
17872
18245
  "class": ['v-timeline', `v-timeline--${props.direction}`, `v-timeline--align-${props.align}`, `v-timeline--justify-${props.justify}`, truncateClasses.value, {
17873
18246
  'v-timeline--inset-line': !!props.lineInset
17874
- }, themeClasses.value, densityClasses.value, sideClasses.value],
17875
- "style": {
18247
+ }, themeClasses.value, densityClasses.value, sideClasses.value, props.class],
18248
+ "style": [{
17876
18249
  '--v-timeline-line-thickness': convertToUnit(props.lineThickness)
17877
- }
18250
+ }, props.style]
17878
18251
  }, slots));
17879
18252
  return {};
17880
18253
  }
@@ -17889,6 +18262,7 @@
17889
18262
  icon: IconValue,
17890
18263
  iconColor: String,
17891
18264
  lineColor: String,
18265
+ ...makeComponentProps(),
17892
18266
  ...makeRoundedProps(),
17893
18267
  ...makeSizeProps(),
17894
18268
  ...makeElevationProps()
@@ -17918,7 +18292,8 @@
17918
18292
  useRender(() => vue.createVNode("div", {
17919
18293
  "class": ['v-timeline-divider', {
17920
18294
  'v-timeline-divider--fill-dot': props.fillDot
17921
- }]
18295
+ }, props.class],
18296
+ "style": props.style
17922
18297
  }, [vue.createVNode("div", {
17923
18298
  "class": ['v-timeline-divider__before', lineColorClasses.value],
17924
18299
  "style": lineColorStyles.value
@@ -17968,11 +18343,12 @@
17968
18343
  icon: IconValue,
17969
18344
  iconColor: String,
17970
18345
  lineInset: [Number, String],
17971
- ...makeRoundedProps(),
18346
+ ...makeComponentProps(),
18347
+ ...makeDimensionProps(),
17972
18348
  ...makeElevationProps(),
18349
+ ...makeRoundedProps(),
17973
18350
  ...makeSizeProps(),
17974
- ...makeTagProps(),
17975
- ...makeDimensionProps()
18351
+ ...makeTagProps()
17976
18352
  },
17977
18353
  setup(props, _ref) {
17978
18354
  let {
@@ -17992,11 +18368,11 @@
17992
18368
  useRender(() => vue.createVNode("div", {
17993
18369
  "class": ['v-timeline-item', {
17994
18370
  'v-timeline-item--fill-dot': props.fillDot
17995
- }],
17996
- "style": {
18371
+ }, props.class],
18372
+ "style": [{
17997
18373
  '--v-timeline-dot-size': convertToUnit(dotSize.value),
17998
18374
  '--v-timeline-line-inset': props.lineInset ? `calc(var(--v-timeline-dot-size) / 2 + ${convertToUnit(props.lineInset)})` : convertToUnit(0)
17999
- }
18375
+ }, props.style]
18000
18376
  }, [vue.createVNode("div", {
18001
18377
  "class": "v-timeline-item__body",
18002
18378
  "style": dimensionStyles.value
@@ -18030,6 +18406,7 @@
18030
18406
  closeOnBack: false,
18031
18407
  location: 'end',
18032
18408
  locationStrategy: 'connected',
18409
+ eager: true,
18033
18410
  minWidth: 0,
18034
18411
  offset: 10,
18035
18412
  openOnClick: false,
@@ -18038,7 +18415,7 @@
18038
18415
  scrim: false,
18039
18416
  scrollStrategy: 'reposition',
18040
18417
  transition: false
18041
- }), ['absolute', 'persistent', 'eager'])
18418
+ }), ['absolute', 'persistent'])
18042
18419
  },
18043
18420
  emits: {
18044
18421
  'update:modelValue': value => true
@@ -18071,7 +18448,8 @@
18071
18448
  const [overlayProps] = VOverlay.filterProps(props);
18072
18449
  return vue.createVNode(VOverlay, vue.mergeProps({
18073
18450
  "ref": overlay,
18074
- "class": ['v-tooltip'],
18451
+ "class": ['v-tooltip', props.class],
18452
+ "style": props.style,
18075
18453
  "id": id.value
18076
18454
  }, overlayProps, {
18077
18455
  "modelValue": isActive.value,
@@ -18082,7 +18460,6 @@
18082
18460
  "origin": origin.value,
18083
18461
  "persistent": true,
18084
18462
  "role": "tooltip",
18085
- "eager": true,
18086
18463
  "activatorProps": activatorProps.value,
18087
18464
  "_disableGlobalStack": true
18088
18465
  }, scopeId), {
@@ -18117,40 +18494,210 @@
18117
18494
  }
18118
18495
  });
18119
18496
 
18120
- const VDataTableColumn = defineFunctionalComponent({
18121
- align: {
18122
- type: String,
18123
- default: 'start'
18497
+ const VVirtualScrollItem = genericComponent()({
18498
+ name: 'VVirtualScrollItem',
18499
+ props: {
18500
+ dynamicHeight: Boolean,
18501
+ ...makeComponentProps()
18124
18502
  },
18125
- fixed: Boolean,
18126
- fixedOffset: [Number, String],
18127
- height: [Number, String],
18128
- lastFixed: Boolean,
18129
- noPadding: Boolean,
18130
- tag: String,
18131
- width: [Number, String]
18132
- }, (props, _ref) => {
18133
- let {
18134
- slots,
18135
- attrs
18136
- } = _ref;
18137
- const Tag = props.tag ?? 'td';
18138
- return vue.createVNode(Tag, vue.mergeProps({
18139
- "class": ['v-data-table__td', {
18140
- 'v-data-table-column--fixed': props.fixed,
18141
- 'v-data-table-column--last-fixed': props.lastFixed,
18142
- 'v-data-table-column--no-padding': props.noPadding
18143
- }, `v-data-table-column--align-${props.align}`],
18144
- "style": {
18145
- height: convertToUnit(props.height),
18146
- width: convertToUnit(props.width),
18147
- left: convertToUnit(props.fixedOffset || null)
18503
+ emits: {
18504
+ 'update:height': height => true
18505
+ },
18506
+ setup(props, _ref) {
18507
+ let {
18508
+ emit,
18509
+ slots
18510
+ } = _ref;
18511
+ const {
18512
+ resizeRef,
18513
+ contentRect
18514
+ } = useResizeObserver();
18515
+ useToggleScope(() => props.dynamicHeight, () => {
18516
+ vue.watch(() => contentRect.value?.height, height => {
18517
+ if (height != null) emit('update:height', height);
18518
+ });
18519
+ });
18520
+ function updateHeight() {
18521
+ if (props.dynamicHeight && contentRect.value) {
18522
+ emit('update:height', contentRect.value.height);
18523
+ }
18148
18524
  }
18149
- }, attrs), {
18150
- default: () => [slots.default?.()]
18151
- });
18152
- });
18153
-
18525
+ vue.onUpdated(updateHeight);
18526
+ useRender(() => vue.createVNode("div", {
18527
+ "ref": props.dynamicHeight ? resizeRef : undefined,
18528
+ "class": ['v-virtual-scroll__item', props.class],
18529
+ "style": props.style
18530
+ }, [slots.default?.()]));
18531
+ }
18532
+ });
18533
+
18534
+ // Types
18535
+
18536
+ const UP$1 = -1;
18537
+ const DOWN$1 = 1;
18538
+ const VVirtualScroll = genericComponent()({
18539
+ name: 'VVirtualScroll',
18540
+ props: {
18541
+ items: {
18542
+ type: Array,
18543
+ default: () => []
18544
+ },
18545
+ itemHeight: [Number, String],
18546
+ ...makeComponentProps(),
18547
+ ...makeDimensionProps()
18548
+ },
18549
+ setup(props, _ref) {
18550
+ let {
18551
+ slots
18552
+ } = _ref;
18553
+ const first = vue.ref(0);
18554
+ const baseItemHeight = vue.ref(props.itemHeight);
18555
+ const itemHeight = vue.computed({
18556
+ get: () => parseInt(baseItemHeight.value ?? 0, 10),
18557
+ set(val) {
18558
+ baseItemHeight.value = val;
18559
+ }
18560
+ });
18561
+ const rootEl = vue.ref();
18562
+ const {
18563
+ resizeRef,
18564
+ contentRect
18565
+ } = useResizeObserver();
18566
+ vue.watchEffect(() => {
18567
+ resizeRef.value = rootEl.value;
18568
+ });
18569
+ const display = useDisplay();
18570
+ const sizeMap = new Map();
18571
+ let sizes = createRange(props.items.length).map(() => itemHeight.value);
18572
+ const visibleItems = vue.computed(() => {
18573
+ return Math.max(12, Math.ceil((contentRect.value?.height ?? display.height.value) / itemHeight.value * 1.7 + 1));
18574
+ });
18575
+ function handleItemResize(index, height) {
18576
+ itemHeight.value = Math.max(itemHeight.value, height);
18577
+ sizes[index] = height;
18578
+ sizeMap.set(props.items[index], height);
18579
+ }
18580
+ function calculateOffset(index) {
18581
+ return sizes.slice(0, index).reduce((curr, value) => curr + (value || itemHeight.value), 0);
18582
+ }
18583
+ function calculateMidPointIndex(scrollTop) {
18584
+ const end = props.items.length;
18585
+ let middle = 0;
18586
+ let middleOffset = 0;
18587
+ while (middleOffset < scrollTop && middle < end) {
18588
+ middleOffset += sizes[middle++] || itemHeight.value;
18589
+ }
18590
+ return middle - 1;
18591
+ }
18592
+ let lastScrollTop = 0;
18593
+ function handleScroll() {
18594
+ if (!rootEl.value || !contentRect.value) return;
18595
+ const height = contentRect.value.height;
18596
+ const scrollTop = rootEl.value.scrollTop;
18597
+ const direction = scrollTop < lastScrollTop ? UP$1 : DOWN$1;
18598
+ const midPointIndex = calculateMidPointIndex(scrollTop + height / 2);
18599
+ const buffer = Math.round(visibleItems.value / 3);
18600
+ if (direction === UP$1 && midPointIndex <= first.value + buffer * 2 - 1) {
18601
+ first.value = clamp(midPointIndex - buffer, 0, props.items.length);
18602
+ } else if (direction === DOWN$1 && midPointIndex >= first.value + buffer * 2 - 1) {
18603
+ first.value = clamp(midPointIndex - buffer, 0, props.items.length - visibleItems.value);
18604
+ }
18605
+ lastScrollTop = rootEl.value.scrollTop;
18606
+ }
18607
+ function scrollToIndex(index) {
18608
+ if (!rootEl.value) return;
18609
+ const offset = calculateOffset(index);
18610
+ rootEl.value.scrollTop = offset;
18611
+ }
18612
+ const items = vue.computed(() => props.items.map((item, index) => ({
18613
+ raw: item,
18614
+ index
18615
+ })));
18616
+ const last = vue.computed(() => Math.min(props.items.length, first.value + visibleItems.value));
18617
+ const computedItems = vue.computed(() => items.value.slice(first.value, last.value));
18618
+ const paddingTop = vue.computed(() => calculateOffset(first.value));
18619
+ const paddingBottom = vue.computed(() => calculateOffset(props.items.length) - calculateOffset(last.value));
18620
+ const {
18621
+ dimensionStyles
18622
+ } = useDimension(props);
18623
+ vue.onMounted(() => {
18624
+ if (!itemHeight.value) {
18625
+ // If itemHeight prop is not set, then calculate an estimated height from the average of inital items
18626
+ itemHeight.value = sizes.slice(first.value, last.value).reduce((curr, height) => curr + height, 0) / visibleItems.value;
18627
+ }
18628
+ });
18629
+ vue.watch(() => props.items.length, () => {
18630
+ sizes = createRange(props.items.length).map(() => itemHeight.value);
18631
+ sizeMap.forEach((height, item) => {
18632
+ const index = props.items.indexOf(item);
18633
+ if (index === -1) {
18634
+ sizeMap.delete(item);
18635
+ } else {
18636
+ sizes[index] = height;
18637
+ }
18638
+ });
18639
+ });
18640
+ useRender(() => vue.createVNode("div", {
18641
+ "ref": rootEl,
18642
+ "class": ['v-virtual-scroll', props.class],
18643
+ "onScroll": handleScroll,
18644
+ "style": [dimensionStyles.value, props.style]
18645
+ }, [vue.createVNode("div", {
18646
+ "class": "v-virtual-scroll__container",
18647
+ "style": {
18648
+ paddingTop: convertToUnit(paddingTop.value),
18649
+ paddingBottom: convertToUnit(paddingBottom.value)
18650
+ }
18651
+ }, [computedItems.value.map(item => vue.createVNode(VVirtualScrollItem, {
18652
+ "key": item.index,
18653
+ "dynamicHeight": !props.itemHeight,
18654
+ "onUpdate:height": height => handleItemResize(item.index, height)
18655
+ }, {
18656
+ default: () => [slots.default?.({
18657
+ item: item.raw,
18658
+ index: item.index
18659
+ })]
18660
+ }))])]));
18661
+ return {
18662
+ scrollToIndex
18663
+ };
18664
+ }
18665
+ });
18666
+
18667
+ const VDataTableColumn = defineFunctionalComponent({
18668
+ align: {
18669
+ type: String,
18670
+ default: 'start'
18671
+ },
18672
+ fixed: Boolean,
18673
+ fixedOffset: [Number, String],
18674
+ height: [Number, String],
18675
+ lastFixed: Boolean,
18676
+ noPadding: Boolean,
18677
+ tag: String,
18678
+ width: [Number, String]
18679
+ }, (props, _ref) => {
18680
+ let {
18681
+ slots,
18682
+ attrs
18683
+ } = _ref;
18684
+ const Tag = props.tag ?? 'td';
18685
+ return vue.createVNode(Tag, vue.mergeProps({
18686
+ "class": ['v-data-table__td', {
18687
+ 'v-data-table-column--fixed': props.fixed,
18688
+ 'v-data-table-column--last-fixed': props.lastFixed,
18689
+ 'v-data-table-column--no-padding': props.noPadding
18690
+ }, `v-data-table-column--align-${props.align}`],
18691
+ "style": {
18692
+ height: convertToUnit(props.height),
18693
+ width: convertToUnit(props.width),
18694
+ left: convertToUnit(props.fixedOffset || null)
18695
+ }
18696
+ }, attrs), {
18697
+ default: () => [slots.default?.()]
18698
+ });
18699
+ });
18700
+
18154
18701
  // Utilities
18155
18702
 
18156
18703
  // Types
@@ -18542,6 +19089,17 @@
18542
19089
  backgroundColorClasses,
18543
19090
  backgroundColorStyles
18544
19091
  } = useBackgroundColor(props, 'color');
19092
+ const slotProps = vue.computed(() => ({
19093
+ headers: headers.value,
19094
+ columns: columns.value,
19095
+ toggleSort,
19096
+ sortBy: sortBy.value,
19097
+ someSelected: someSelected.value,
19098
+ allSelected: allSelected.value,
19099
+ selectAll,
19100
+ getSortIcon,
19101
+ getFixedStyles
19102
+ }));
18545
19103
  const VDataTableHeaderCell = _ref2 => {
18546
19104
  let {
18547
19105
  column,
@@ -18569,14 +19127,14 @@
18569
19127
  "noPadding": noPadding
18570
19128
  }, {
18571
19129
  default: () => {
18572
- const slotName = `column.${column.key}`;
18573
- const slotProps = {
19130
+ const columnSlotName = `column.${column.key}`;
19131
+ const columnSlotProps = {
18574
19132
  column,
18575
19133
  selectAll
18576
19134
  };
18577
- if (slots[slotName]) return slots[slotName](slotProps);
19135
+ if (slots[columnSlotName]) return slots[columnSlotName](columnSlotProps);
18578
19136
  if (column.key === 'data-table-select') {
18579
- return slots['column.data-table-select']?.(slotProps) ?? vue.createVNode(VCheckboxBtn, {
19137
+ return slots['column.data-table-select']?.(columnSlotProps) ?? vue.createVNode(VCheckboxBtn, {
18580
19138
  "modelValue": allSelected.value,
18581
19139
  "indeterminate": someSelected.value && !allSelected.value,
18582
19140
  "onUpdate:modelValue": selectAll
@@ -18596,22 +19154,24 @@
18596
19154
  }
18597
19155
  });
18598
19156
  };
18599
- useRender(() => vue.createVNode(vue.Fragment, null, [headers.value.map((row, y) => vue.createVNode("tr", null, [row.map((column, x) => vue.createVNode(VDataTableHeaderCell, {
18600
- "column": column,
18601
- "x": x,
18602
- "y": y
18603
- }, null))])), props.loading && vue.createVNode("tr", {
18604
- "class": "v-data-table__progress"
18605
- }, [vue.createVNode("th", {
18606
- "colspan": columns.value.length
18607
- }, [vue.createVNode(LoaderSlot, {
18608
- "name": "v-data-table-headers",
18609
- "active": true,
18610
- "color": typeof props.loading === 'boolean' ? undefined : props.loading,
18611
- "indeterminate": true
18612
- }, {
18613
- default: slots.loader
18614
- })])])]));
19157
+ useRender(() => {
19158
+ return vue.createVNode(vue.Fragment, null, [slots.headers ? slots.headers(slotProps.value) : headers.value.map((row, y) => vue.createVNode("tr", null, [row.map((column, x) => vue.createVNode(VDataTableHeaderCell, {
19159
+ "column": column,
19160
+ "x": x,
19161
+ "y": y
19162
+ }, null))])), props.loading && vue.createVNode("tr", {
19163
+ "class": "v-data-table__progress"
19164
+ }, [vue.createVNode("th", {
19165
+ "colspan": columns.value.length
19166
+ }, [vue.createVNode(LoaderSlot, {
19167
+ "name": "v-data-table-headers",
19168
+ "active": true,
19169
+ "color": typeof props.loading === 'boolean' ? undefined : props.loading,
19170
+ "indeterminate": true
19171
+ }, {
19172
+ default: slots.loader
19173
+ })])])]);
19174
+ });
18615
19175
  }
18616
19176
  });
18617
19177
 
@@ -18910,9 +19470,7 @@
18910
19470
  'v-data-table__tr--clickable': !!props.onClick
18911
19471
  }],
18912
19472
  "onClick": props.onClick
18913
- }, [!columns.value.length && vue.createVNode(VDataTableColumn, {
18914
- "key": "no-data"
18915
- }, slots), props.item && columns.value.map((column, i) => vue.createVNode(VDataTableColumn, {
19473
+ }, [props.item && columns.value.map((column, i) => vue.createVNode(VDataTableColumn, {
18916
19474
  "align": column.align,
18917
19475
  "fixed": column.fixed,
18918
19476
  "fixedOffset": column.fixedOffset,
@@ -19002,13 +19560,13 @@
19002
19560
  useRender(() => {
19003
19561
  if (props.loading && slots.loading) {
19004
19562
  return vue.createVNode("tr", {
19005
- "class": "v-data-table-rows-no-data",
19563
+ "class": "v-data-table-rows-loading",
19006
19564
  "key": "loading"
19007
19565
  }, [vue.createVNode("td", {
19008
19566
  "colspan": columns.value.length
19009
19567
  }, [slots.loading()])]);
19010
19568
  }
19011
- if (!props.loading && !props.items.length && !props.hideNoData && slots['no-data']) {
19569
+ if (!props.loading && !props.items.length && !props.hideNoData) {
19012
19570
  return vue.createVNode("tr", {
19013
19571
  "class": "v-data-table-rows-no-data",
19014
19572
  "key": "no-data"
@@ -19487,7 +20045,7 @@
19487
20045
  top: slots.top,
19488
20046
  default: slots.default ?? (() => vue.createVNode(vue.Fragment, null, [slots.colgroup?.({
19489
20047
  columns
19490
- }), vue.createVNode("thead", null, [slots.headers ? slots.headers() : vue.createVNode(VDataTableHeaders, {
20048
+ }), vue.createVNode("thead", null, [vue.createVNode(VDataTableHeaders, {
19491
20049
  "sticky": props.fixedHeader,
19492
20050
  "multiSort": props.multiSort
19493
20051
  }, slots)]), slots.thead?.(), vue.createVNode("tbody", null, [slots.body ? slots.body() : vue.createVNode(VDataTableRows, {
@@ -19516,8 +20074,8 @@
19516
20074
  default: 52
19517
20075
  }
19518
20076
  }, 'virtual');
19519
- const UP$1 = -1;
19520
- const DOWN$1 = 1;
20077
+ const UP = -1;
20078
+ const DOWN = 1;
19521
20079
 
19522
20080
  // TODO: Replace this with composable from v-virtual-scroll
19523
20081
  function useVirtual(props, items) {
@@ -19555,12 +20113,12 @@
19555
20113
  isScrolling.value = false;
19556
20114
  }, 100);
19557
20115
  const scrollTop = containerRef.value.scrollTop;
19558
- const direction = scrollTop < lastScrollTop ? UP$1 : DOWN$1;
20116
+ const direction = scrollTop < lastScrollTop ? UP : DOWN;
19559
20117
  const midPointIndex = calculateMidPointIndex(scrollTop);
19560
20118
  const buffer = Math.round(visibleItems.value / 3);
19561
- if (direction === UP$1 && midPointIndex <= startIndex.value) {
20119
+ if (direction === UP && midPointIndex <= startIndex.value) {
19562
20120
  startIndex.value = Math.max(midPointIndex - buffer, 0);
19563
- } else if (direction === DOWN$1 && midPointIndex >= startIndex.value + buffer * 2) {
20121
+ } else if (direction === DOWN && midPointIndex >= startIndex.value + buffer * 2) {
19564
20122
  startIndex.value = Math.min(Math.max(0, midPointIndex - buffer), items.value.length - visibleItems.value);
19565
20123
  }
19566
20124
  lastScrollTop = containerRef.value.scrollTop;
@@ -19853,7 +20411,7 @@
19853
20411
  }), vue.createVNode("thead", {
19854
20412
  "class": "v-data-table__thead",
19855
20413
  "role": "rowgroup"
19856
- }, [slots.headers ? slots.headers() : vue.createVNode(VDataTableHeaders, {
20414
+ }, [vue.createVNode(VDataTableHeaders, {
19857
20415
  "sticky": props.fixedHeader,
19858
20416
  "loading": props.loading,
19859
20417
  "color": props.color
@@ -19873,6 +20431,211 @@
19873
20431
 
19874
20432
  // Types
19875
20433
 
20434
+ const VInfiniteScrollIntersect = defineComponent({
20435
+ name: 'VInfiniteScrollIntersect',
20436
+ props: {
20437
+ side: {
20438
+ type: String,
20439
+ required: true
20440
+ },
20441
+ rootRef: null,
20442
+ rootMargin: String
20443
+ },
20444
+ emits: {
20445
+ intersect: side => true
20446
+ },
20447
+ setup(props, _ref) {
20448
+ let {
20449
+ emit
20450
+ } = _ref;
20451
+ const {
20452
+ intersectionRef,
20453
+ isIntersecting
20454
+ } = useIntersectionObserver(entries => {}, props.rootMargin ? {
20455
+ root: props.rootRef,
20456
+ rootMargin: props.rootMargin
20457
+ } : undefined);
20458
+ vue.watch(isIntersecting, async val => {
20459
+ if (val) emit('intersect', props.side);
20460
+ });
20461
+ useRender(() => vue.createVNode("div", {
20462
+ "class": "v-infinite-scroll-intersect",
20463
+ "ref": intersectionRef
20464
+ }, [vue.createTextVNode("\xA0")]));
20465
+ return {};
20466
+ }
20467
+ });
20468
+ const VInfiniteScroll = genericComponent()({
20469
+ name: 'VInfiniteScroll',
20470
+ props: {
20471
+ color: String,
20472
+ direction: {
20473
+ type: String,
20474
+ default: 'vertical',
20475
+ validator: v => ['vertical', 'horizontal'].includes(v)
20476
+ },
20477
+ side: {
20478
+ type: String,
20479
+ default: 'end',
20480
+ validator: v => ['start', 'end', 'both'].includes(v)
20481
+ },
20482
+ mode: {
20483
+ type: String,
20484
+ default: 'intersect',
20485
+ validator: v => ['intersect', 'manual'].includes(v)
20486
+ },
20487
+ margin: [Number, String],
20488
+ loadMoreText: {
20489
+ type: String,
20490
+ default: '$vuetify.infiniteScroll.loadMore'
20491
+ },
20492
+ emptyText: {
20493
+ type: String,
20494
+ default: '$vuetify.infiniteScroll.empty'
20495
+ },
20496
+ ...makeDimensionProps()
20497
+ },
20498
+ emits: {
20499
+ load: options => true
20500
+ },
20501
+ setup(props, _ref2) {
20502
+ let {
20503
+ slots,
20504
+ emit
20505
+ } = _ref2;
20506
+ const rootEl = vue.ref();
20507
+ const startStatus = vue.ref('ok');
20508
+ const endStatus = vue.ref('ok');
20509
+ const margin = vue.computed(() => convertToUnit(props.margin));
20510
+ function setScrollAmount(amount) {
20511
+ if (!rootEl.value) return;
20512
+ const property = props.direction === 'vertical' ? 'scrollTop' : 'scrollLeft';
20513
+ rootEl.value[property] = amount;
20514
+ }
20515
+ function getScrollAmount() {
20516
+ if (!rootEl.value) return 0;
20517
+ const property = props.direction === 'vertical' ? 'scrollTop' : 'scrollLeft';
20518
+ return rootEl.value[property];
20519
+ }
20520
+ function getScrollSize() {
20521
+ if (!rootEl.value) return 0;
20522
+ const property = props.direction === 'vertical' ? 'scrollHeight' : 'scrollWidth';
20523
+ return rootEl.value[property];
20524
+ }
20525
+ function getContainerSize() {
20526
+ if (!rootEl.value) return 0;
20527
+ const property = props.direction === 'vertical' ? 'clientHeight' : 'clientWidth';
20528
+ return rootEl.value[property];
20529
+ }
20530
+ vue.onMounted(() => {
20531
+ if (!rootEl.value) return;
20532
+ if (props.side === 'start') {
20533
+ setScrollAmount(getScrollSize());
20534
+ } else if (props.side === 'both') {
20535
+ setScrollAmount(getScrollSize() / 2 - getContainerSize() / 2);
20536
+ }
20537
+ });
20538
+ function setStatus(side, status) {
20539
+ if (side === 'start') {
20540
+ startStatus.value = status;
20541
+ } else if (side === 'end') {
20542
+ endStatus.value = status;
20543
+ }
20544
+ }
20545
+ function getStatus(side) {
20546
+ return side === 'start' ? startStatus.value : endStatus.value;
20547
+ }
20548
+ let previousScrollSize = 0;
20549
+ function handleIntersect(side) {
20550
+ const status = getStatus(side);
20551
+ if (!rootEl.value || status === 'loading') return;
20552
+ previousScrollSize = getScrollSize();
20553
+ setStatus(side, 'loading');
20554
+ function done(status) {
20555
+ setStatus(side, status);
20556
+ vue.nextTick(() => {
20557
+ if (status === 'ok' && side === 'start') {
20558
+ setScrollAmount(getScrollSize() - previousScrollSize + getScrollAmount());
20559
+ }
20560
+ });
20561
+ }
20562
+ emit('load', {
20563
+ side,
20564
+ done
20565
+ });
20566
+ }
20567
+ const {
20568
+ t
20569
+ } = useLocale();
20570
+ function renderSide(side, status) {
20571
+ if (props.side !== side && props.side !== 'both') return;
20572
+ const onClick = () => handleIntersect(side);
20573
+ const slotProps = {
20574
+ side,
20575
+ props: {
20576
+ onClick,
20577
+ color: props.color
20578
+ }
20579
+ };
20580
+ if (status === 'error') return slots.error?.(slotProps);
20581
+ if (status === 'empty') return slots.empty?.(slotProps) ?? vue.createVNode("div", null, [t(props.emptyText)]);
20582
+ if (props.mode === 'manual') {
20583
+ if (status === 'loading') {
20584
+ return slots.loading?.(slotProps) ?? vue.createVNode(VProgressCircular, {
20585
+ "indeterminate": true,
20586
+ "color": props.color
20587
+ }, null);
20588
+ }
20589
+ return slots['load-more']?.(slotProps) ?? vue.createVNode(VBtn, {
20590
+ "variant": "outlined",
20591
+ "color": props.color,
20592
+ "onClick": onClick
20593
+ }, {
20594
+ default: () => [t(props.loadMoreText)]
20595
+ });
20596
+ }
20597
+ return slots.loading?.(slotProps) ?? vue.createVNode(VProgressCircular, {
20598
+ "indeterminate": true,
20599
+ "color": props.color
20600
+ }, null);
20601
+ }
20602
+ const {
20603
+ dimensionStyles
20604
+ } = useDimension(props);
20605
+ useRender(() => {
20606
+ const hasStartIntersect = props.side === 'start' || props.side === 'both';
20607
+ const hasEndIntersect = props.side === 'end' || props.side === 'both';
20608
+ const intersectMode = props.mode === 'intersect';
20609
+ return vue.createVNode("div", {
20610
+ "ref": rootEl,
20611
+ "class": ['v-infinite-scroll', `v-infinite-scroll--${props.direction}`, {
20612
+ 'v-infinite-scroll--start': hasStartIntersect,
20613
+ 'v-infinite-scroll--end': hasEndIntersect
20614
+ }],
20615
+ "style": dimensionStyles.value
20616
+ }, [vue.createVNode("div", {
20617
+ "class": "v-infinite-scroll__side"
20618
+ }, [renderSide('start', startStatus.value)]), rootEl.value && hasStartIntersect && intersectMode && vue.createVNode(VInfiniteScrollIntersect, {
20619
+ "key": "start",
20620
+ "side": "start",
20621
+ "onIntersect": handleIntersect,
20622
+ "rootRef": rootEl.value,
20623
+ "rootMargin": margin.value
20624
+ }, null), slots.default?.(), rootEl.value && hasEndIntersect && intersectMode && vue.createVNode(VInfiniteScrollIntersect, {
20625
+ "key": "end",
20626
+ "side": "end",
20627
+ "onIntersect": handleIntersect,
20628
+ "rootRef": rootEl.value,
20629
+ "rootMargin": margin.value
20630
+ }, null), vue.createVNode("div", {
20631
+ "class": "v-infinite-scroll__side"
20632
+ }, [renderSide('end', endStatus.value)])]);
20633
+ });
20634
+ }
20635
+ });
20636
+
20637
+ // Types
20638
+
19876
20639
  const rootTypes = {
19877
20640
  actions: 'button@2',
19878
20641
  article: 'heading, paragraph',
@@ -20003,177 +20766,6 @@
20003
20766
  }
20004
20767
  });
20005
20768
 
20006
- const VVirtualScrollItem = genericComponent()({
20007
- name: 'VVirtualScrollItem',
20008
- props: {
20009
- dynamicHeight: Boolean
20010
- },
20011
- emits: {
20012
- 'update:height': height => true
20013
- },
20014
- setup(props, _ref) {
20015
- let {
20016
- emit,
20017
- slots
20018
- } = _ref;
20019
- const {
20020
- resizeRef,
20021
- contentRect
20022
- } = useResizeObserver();
20023
- useToggleScope(() => props.dynamicHeight, () => {
20024
- vue.watch(() => contentRect.value?.height, height => {
20025
- if (height != null) emit('update:height', height);
20026
- });
20027
- });
20028
- function updateHeight() {
20029
- if (props.dynamicHeight && contentRect.value) {
20030
- emit('update:height', contentRect.value.height);
20031
- }
20032
- }
20033
- vue.onUpdated(updateHeight);
20034
- useRender(() => vue.createVNode("div", {
20035
- "ref": props.dynamicHeight ? resizeRef : undefined,
20036
- "class": "v-virtual-scroll__item"
20037
- }, [slots.default?.()]));
20038
- }
20039
- });
20040
-
20041
- // Types
20042
-
20043
- const UP = -1;
20044
- const DOWN = 1;
20045
- const VVirtualScroll = genericComponent()({
20046
- name: 'VVirtualScroll',
20047
- props: {
20048
- items: {
20049
- type: Array,
20050
- default: () => []
20051
- },
20052
- itemHeight: [Number, String],
20053
- visibleItems: [Number, String],
20054
- ...makeDimensionProps()
20055
- },
20056
- setup(props, _ref) {
20057
- let {
20058
- slots
20059
- } = _ref;
20060
- const first = vue.ref(0);
20061
- const baseItemHeight = vue.ref(props.itemHeight);
20062
- const itemHeight = vue.computed({
20063
- get: () => parseInt(baseItemHeight.value ?? 0, 10),
20064
- set(val) {
20065
- baseItemHeight.value = val;
20066
- }
20067
- });
20068
- const rootEl = vue.ref();
20069
- const {
20070
- resizeRef,
20071
- contentRect
20072
- } = useResizeObserver();
20073
- vue.watchEffect(() => {
20074
- resizeRef.value = rootEl.value;
20075
- });
20076
- const display = useDisplay();
20077
- const sizeMap = new Map();
20078
- let sizes = createRange(props.items.length).map(() => itemHeight.value);
20079
- const visibleItems = vue.computed(() => {
20080
- return props.visibleItems ? parseInt(props.visibleItems, 10) : Math.max(12, Math.ceil((contentRect.value?.height ?? display.height.value) / itemHeight.value * 1.7 + 1));
20081
- });
20082
- function handleItemResize(index, height) {
20083
- itemHeight.value = Math.max(itemHeight.value, height);
20084
- sizes[index] = height;
20085
- sizeMap.set(props.items[index], height);
20086
- }
20087
- function calculateOffset(index) {
20088
- return sizes.slice(0, index).reduce((curr, value) => curr + (value || itemHeight.value), 0);
20089
- }
20090
- function calculateMidPointIndex(scrollTop) {
20091
- let start = 0;
20092
- let end = props.items.length;
20093
- while (start <= end) {
20094
- const middle = start + Math.floor((end - start) / 2);
20095
- const middleOffset = calculateOffset(middle);
20096
- if (middleOffset === scrollTop) {
20097
- return middle;
20098
- } else if (middleOffset < scrollTop) {
20099
- start = middle + 1;
20100
- } else if (middleOffset > scrollTop) {
20101
- end = middle - 1;
20102
- }
20103
- }
20104
- return start;
20105
- }
20106
- let lastScrollTop = 0;
20107
- function handleScroll() {
20108
- if (!rootEl.value || !contentRect.value) return;
20109
- const height = contentRect.value.height;
20110
- const scrollTop = rootEl.value.scrollTop;
20111
- const direction = scrollTop < lastScrollTop ? UP : DOWN;
20112
- const midPointIndex = calculateMidPointIndex(scrollTop + height / 2);
20113
- const buffer = Math.round(visibleItems.value / 3);
20114
- if (direction === UP && midPointIndex <= first.value + buffer * 2 - 1) {
20115
- first.value = clamp(midPointIndex - buffer, 0, props.items.length);
20116
- } else if (direction === DOWN && midPointIndex >= first.value + buffer * 2 - 1) {
20117
- first.value = clamp(midPointIndex - buffer, 0, props.items.length - visibleItems.value);
20118
- }
20119
- lastScrollTop = rootEl.value.scrollTop;
20120
- }
20121
- function scrollToIndex(index) {
20122
- if (!rootEl.value) return;
20123
- const offset = calculateOffset(index);
20124
- rootEl.value.scrollTop = offset;
20125
- }
20126
- const last = vue.computed(() => Math.min(props.items.length, first.value + visibleItems.value));
20127
- const computedItems = vue.computed(() => props.items.slice(first.value, last.value));
20128
- const paddingTop = vue.computed(() => calculateOffset(first.value));
20129
- const paddingBottom = vue.computed(() => calculateOffset(props.items.length) - calculateOffset(last.value));
20130
- const {
20131
- dimensionStyles
20132
- } = useDimension(props);
20133
- vue.onMounted(() => {
20134
- if (!itemHeight.value) {
20135
- // If itemHeight prop is not set, then calculate an estimated height from the average of inital items
20136
- itemHeight.value = sizes.slice(first.value, last.value).reduce((curr, height) => curr + height, 0) / visibleItems.value;
20137
- }
20138
- });
20139
- vue.watch(() => props.items.length, () => {
20140
- sizes = createRange(props.items.length).map(() => itemHeight.value);
20141
- sizeMap.forEach((height, item) => {
20142
- const index = props.items.indexOf(item);
20143
- if (index === -1) {
20144
- sizeMap.delete(item);
20145
- } else {
20146
- sizes[index] = height;
20147
- }
20148
- });
20149
- });
20150
- useRender(() => vue.createVNode("div", {
20151
- "ref": rootEl,
20152
- "class": "v-virtual-scroll",
20153
- "onScroll": handleScroll,
20154
- "style": dimensionStyles.value
20155
- }, [vue.createVNode("div", {
20156
- "class": "v-virtual-scroll__container",
20157
- "style": {
20158
- paddingTop: convertToUnit(paddingTop.value),
20159
- paddingBottom: convertToUnit(paddingBottom.value)
20160
- }
20161
- }, [computedItems.value.map((item, index) => vue.createVNode(VVirtualScrollItem, {
20162
- "key": index,
20163
- "dynamicHeight": !props.itemHeight,
20164
- "onUpdate:height": height => handleItemResize(index + first.value, height)
20165
- }, {
20166
- default: () => [slots.default?.({
20167
- item,
20168
- index: index + first.value
20169
- })]
20170
- }))])]));
20171
- return {
20172
- scrollToIndex
20173
- };
20174
- }
20175
- });
20176
-
20177
20769
  var components = /*#__PURE__*/Object.freeze({
20178
20770
  __proto__: null,
20179
20771
  VAlert: VAlert,
@@ -20243,6 +20835,7 @@
20243
20835
  VHover: VHover,
20244
20836
  VIcon: VIcon,
20245
20837
  VImg: VImg,
20838
+ VInfiniteScroll: VInfiniteScroll,
20246
20839
  VInput: VInput,
20247
20840
  VItem: VItem,
20248
20841
  VItemGroup: VItemGroup,
@@ -20445,6 +21038,418 @@
20445
21038
  Touch: Touch
20446
21039
  });
20447
21040
 
21041
+ // Utilities
21042
+
21043
+ // Types
21044
+
21045
+ function getWeekArray(date) {
21046
+ let currentWeek = [];
21047
+ const weeks = [];
21048
+ const firstDayOfMonth = startOfMonth(date);
21049
+ const lastDayOfMonth = endOfMonth(date);
21050
+ for (let i = 0; i < firstDayOfMonth.getDay(); i++) {
21051
+ currentWeek.push(null);
21052
+ }
21053
+ for (let i = 1; i <= lastDayOfMonth.getDate(); i++) {
21054
+ const day = new Date(date.getFullYear(), date.getMonth(), i);
21055
+
21056
+ // Add the day to the current week
21057
+ currentWeek.push(day);
21058
+
21059
+ // If the current week has 7 days, add it to the weeks array and start a new week
21060
+ if (currentWeek.length === 7) {
21061
+ weeks.push(currentWeek);
21062
+ currentWeek = [];
21063
+ }
21064
+ }
21065
+ for (let i = currentWeek.length; i < 7; i++) {
21066
+ currentWeek.push(null);
21067
+ }
21068
+ weeks.push(currentWeek);
21069
+ return weeks;
21070
+ }
21071
+ function startOfMonth(date) {
21072
+ return new Date(date.getFullYear(), date.getMonth(), 1);
21073
+ }
21074
+ function endOfMonth(date) {
21075
+ return new Date(date.getFullYear(), date.getMonth() + 1, 0);
21076
+ }
21077
+ function date(value) {
21078
+ if (value == null) return null;
21079
+ if (value instanceof Date) return value;
21080
+ if (typeof value === 'string') {
21081
+ const parsed = Date.parse(value);
21082
+ if (!isNaN(parsed)) return new Date(parsed);
21083
+ }
21084
+ return null;
21085
+ }
21086
+ const firstDay = {
21087
+ '001': 1,
21088
+ AD: 1,
21089
+ AE: 6,
21090
+ AF: 6,
21091
+ AG: 0,
21092
+ AI: 1,
21093
+ AL: 1,
21094
+ AM: 1,
21095
+ AN: 1,
21096
+ AR: 1,
21097
+ AS: 0,
21098
+ AT: 1,
21099
+ AU: 0,
21100
+ AX: 1,
21101
+ AZ: 1,
21102
+ BA: 1,
21103
+ BD: 0,
21104
+ BE: 1,
21105
+ BG: 1,
21106
+ BH: 6,
21107
+ BM: 1,
21108
+ BN: 1,
21109
+ BR: 0,
21110
+ BS: 0,
21111
+ BT: 0,
21112
+ BW: 0,
21113
+ BY: 1,
21114
+ BZ: 0,
21115
+ CA: 0,
21116
+ CH: 1,
21117
+ CL: 1,
21118
+ CM: 1,
21119
+ CN: 0,
21120
+ CO: 0,
21121
+ CR: 1,
21122
+ CY: 1,
21123
+ CZ: 1,
21124
+ DE: 1,
21125
+ DJ: 6,
21126
+ DK: 1,
21127
+ DM: 0,
21128
+ DO: 0,
21129
+ DZ: 6,
21130
+ EC: 1,
21131
+ EE: 1,
21132
+ EG: 6,
21133
+ ES: 1,
21134
+ ET: 0,
21135
+ FI: 1,
21136
+ FJ: 1,
21137
+ FO: 1,
21138
+ FR: 1,
21139
+ GB: 1,
21140
+ 'GB-alt-variant': 0,
21141
+ GE: 1,
21142
+ GF: 1,
21143
+ GP: 1,
21144
+ GR: 1,
21145
+ GT: 0,
21146
+ GU: 0,
21147
+ HK: 0,
21148
+ HN: 0,
21149
+ HR: 1,
21150
+ HU: 1,
21151
+ ID: 0,
21152
+ IE: 1,
21153
+ IL: 0,
21154
+ IN: 0,
21155
+ IQ: 6,
21156
+ IR: 6,
21157
+ IS: 1,
21158
+ IT: 1,
21159
+ JM: 0,
21160
+ JO: 6,
21161
+ JP: 0,
21162
+ KE: 0,
21163
+ KG: 1,
21164
+ KH: 0,
21165
+ KR: 0,
21166
+ KW: 6,
21167
+ KZ: 1,
21168
+ LA: 0,
21169
+ LB: 1,
21170
+ LI: 1,
21171
+ LK: 1,
21172
+ LT: 1,
21173
+ LU: 1,
21174
+ LV: 1,
21175
+ LY: 6,
21176
+ MC: 1,
21177
+ MD: 1,
21178
+ ME: 1,
21179
+ MH: 0,
21180
+ MK: 1,
21181
+ MM: 0,
21182
+ MN: 1,
21183
+ MO: 0,
21184
+ MQ: 1,
21185
+ MT: 0,
21186
+ MV: 5,
21187
+ MX: 0,
21188
+ MY: 1,
21189
+ MZ: 0,
21190
+ NI: 0,
21191
+ NL: 1,
21192
+ NO: 1,
21193
+ NP: 0,
21194
+ NZ: 1,
21195
+ OM: 6,
21196
+ PA: 0,
21197
+ PE: 0,
21198
+ PH: 0,
21199
+ PK: 0,
21200
+ PL: 1,
21201
+ PR: 0,
21202
+ PT: 0,
21203
+ PY: 0,
21204
+ QA: 6,
21205
+ RE: 1,
21206
+ RO: 1,
21207
+ RS: 1,
21208
+ RU: 1,
21209
+ SA: 0,
21210
+ SD: 6,
21211
+ SE: 1,
21212
+ SG: 0,
21213
+ SI: 1,
21214
+ SK: 1,
21215
+ SM: 1,
21216
+ SV: 0,
21217
+ SY: 6,
21218
+ TH: 0,
21219
+ TJ: 1,
21220
+ TM: 1,
21221
+ TR: 1,
21222
+ TT: 0,
21223
+ TW: 0,
21224
+ UA: 1,
21225
+ UM: 0,
21226
+ US: 0,
21227
+ UY: 1,
21228
+ UZ: 1,
21229
+ VA: 1,
21230
+ VE: 0,
21231
+ VI: 0,
21232
+ VN: 1,
21233
+ WS: 0,
21234
+ XK: 1,
21235
+ YE: 0,
21236
+ ZA: 0,
21237
+ ZW: 0
21238
+ };
21239
+ const sundayJanuarySecond2000 = new Date(2000, 0, 2);
21240
+ function getWeekdays(locale) {
21241
+ const daysFromSunday = firstDay[locale.slice(-2).toUpperCase()];
21242
+ return createRange(7).map(i => {
21243
+ const weekday = new Date(sundayJanuarySecond2000);
21244
+ weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i);
21245
+ return new Intl.DateTimeFormat(locale, {
21246
+ weekday: 'long'
21247
+ }).format(weekday);
21248
+ });
21249
+ }
21250
+ function format(value, formatString, locale) {
21251
+ const date = new Date(value);
21252
+ let options = {};
21253
+ switch (formatString) {
21254
+ case 'fullDateWithWeekday':
21255
+ options = {
21256
+ weekday: 'long',
21257
+ day: 'numeric',
21258
+ month: 'long',
21259
+ year: 'numeric'
21260
+ };
21261
+ break;
21262
+ case 'normalDateWithWeekday':
21263
+ options = {
21264
+ weekday: 'short',
21265
+ day: 'numeric',
21266
+ month: 'short',
21267
+ year: 'numeric'
21268
+ };
21269
+ break;
21270
+ case 'keyboardDate':
21271
+ options = {};
21272
+ break;
21273
+ case 'monthAndDate':
21274
+ options = {
21275
+ month: 'long',
21276
+ day: 'numeric'
21277
+ };
21278
+ break;
21279
+ case 'monthAndYear':
21280
+ options = {
21281
+ month: 'long',
21282
+ year: 'numeric'
21283
+ };
21284
+ break;
21285
+ default:
21286
+ options = {
21287
+ timeZone: 'UTC',
21288
+ timeZoneName: 'short'
21289
+ };
21290
+ }
21291
+ return new Intl.DateTimeFormat(locale, options).format(date);
21292
+ }
21293
+ function addDays(date, amount) {
21294
+ const d = new Date(date);
21295
+ d.setDate(d.getDate() + amount);
21296
+ return d;
21297
+ }
21298
+ function addMonths(date, amount) {
21299
+ const d = new Date(date);
21300
+ d.setMonth(d.getMonth() + amount);
21301
+ return d;
21302
+ }
21303
+ function getYear(date) {
21304
+ return date.getFullYear();
21305
+ }
21306
+ function getMonth(date) {
21307
+ return date.getMonth();
21308
+ }
21309
+ function startOfYear(date) {
21310
+ return new Date(date.getFullYear(), 0, 1);
21311
+ }
21312
+ function endOfYear(date) {
21313
+ return new Date(date.getFullYear(), 11, 31);
21314
+ }
21315
+ function getMondayOfFirstWeekOfYear(year) {
21316
+ return new Date(year, 0, 1);
21317
+ }
21318
+
21319
+ // https://stackoverflow.com/questions/274861/how-do-i-calculate-the-week-number-given-a-date/275024#275024
21320
+ function getWeek(date) {
21321
+ let year = date.getFullYear();
21322
+ let d1w1 = getMondayOfFirstWeekOfYear(year);
21323
+ if (date < d1w1) {
21324
+ year = year - 1;
21325
+ d1w1 = getMondayOfFirstWeekOfYear(year);
21326
+ } else {
21327
+ const tv = getMondayOfFirstWeekOfYear(year + 1);
21328
+ if (date >= tv) {
21329
+ year = year + 1;
21330
+ d1w1 = tv;
21331
+ }
21332
+ }
21333
+ const diffTime = Math.abs(date.getTime() - d1w1.getTime());
21334
+ const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
21335
+ return Math.floor(diffDays / 7) + 1;
21336
+ }
21337
+ function isWithinRange(date, range) {
21338
+ return isAfter(date, range[0]) && isBefore(date, range[1]);
21339
+ }
21340
+ function isValid(date) {
21341
+ const d = new Date(date);
21342
+ return d instanceof Date && !isNaN(d.getTime());
21343
+ }
21344
+ function isAfter(date, comparing) {
21345
+ return date.getTime() > comparing.getTime();
21346
+ }
21347
+ function isBefore(date, comparing) {
21348
+ return date.getTime() < comparing.getTime();
21349
+ }
21350
+ function isEqual(date, comparing) {
21351
+ return date.getTime() === comparing.getTime();
21352
+ }
21353
+ function isSameDay(date, comparing) {
21354
+ return date.getDate() === comparing.getDate() && date.getMonth() === comparing.getMonth() && date.getFullYear() === comparing.getFullYear();
21355
+ }
21356
+ function isSameMonth(date, comparing) {
21357
+ return date.getMonth() === comparing.getMonth() && date.getFullYear() === comparing.getFullYear();
21358
+ }
21359
+ function getDiff(date, comparing, unit) {
21360
+ const d = new Date(date);
21361
+ const c = new Date(comparing);
21362
+ if (unit === 'month') {
21363
+ return d.getMonth() - c.getMonth() + (d.getFullYear() - c.getFullYear()) * 12;
21364
+ }
21365
+ return Math.floor((d.getTime() - c.getTime()) / (1000 * 60 * 60 * 24));
21366
+ }
21367
+ function setYear(date, year) {
21368
+ const d = new Date(date);
21369
+ d.setFullYear(year);
21370
+ return d;
21371
+ }
21372
+ class VuetifyDateAdapter {
21373
+ constructor() {
21374
+ let locale = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'en';
21375
+ this.locale = locale;
21376
+ }
21377
+ date(value) {
21378
+ return date(value);
21379
+ }
21380
+ addDays(date, amount) {
21381
+ return addDays(date, amount);
21382
+ }
21383
+ addMonths(date, amount) {
21384
+ return addMonths(date, amount);
21385
+ }
21386
+ getWeekArray(date) {
21387
+ return getWeekArray(date);
21388
+ }
21389
+ startOfMonth(date) {
21390
+ return startOfMonth(date);
21391
+ }
21392
+ endOfMonth(date) {
21393
+ return endOfMonth(date);
21394
+ }
21395
+ format(date, formatString) {
21396
+ return format(date, formatString, this.locale);
21397
+ }
21398
+ isEqual(date, comparing) {
21399
+ return isEqual(date, comparing);
21400
+ }
21401
+ isValid(date) {
21402
+ return isValid(date);
21403
+ }
21404
+ isWithinRange(date, range) {
21405
+ return isWithinRange(date, range);
21406
+ }
21407
+ isAfter(date, comparing) {
21408
+ return isAfter(date, comparing);
21409
+ }
21410
+ isSameDay(date, comparing) {
21411
+ return isSameDay(date, comparing);
21412
+ }
21413
+ isSameMonth(date, comparing) {
21414
+ return isSameMonth(date, comparing);
21415
+ }
21416
+ setYear(date, year) {
21417
+ return setYear(date, year);
21418
+ }
21419
+ getDiff(date, comparing, unit) {
21420
+ return getDiff(date, comparing, unit);
21421
+ }
21422
+ getWeek(date) {
21423
+ return getWeek(date);
21424
+ }
21425
+ getWeekdays() {
21426
+ return getWeekdays(this.locale);
21427
+ }
21428
+ getYear(date) {
21429
+ return getYear(date);
21430
+ }
21431
+ getMonth(date) {
21432
+ return getMonth(date);
21433
+ }
21434
+ startOfYear(date) {
21435
+ return startOfYear(date);
21436
+ }
21437
+ endOfYear(date) {
21438
+ return endOfYear(date);
21439
+ }
21440
+ }
21441
+
21442
+ // Composables
21443
+
21444
+ // Types
21445
+
21446
+ const DateAdapterSymbol = Symbol.for('vuetify:date-adapter');
21447
+ function createDate(options) {
21448
+ return options ?? {
21449
+ adapter: VuetifyDateAdapter
21450
+ };
21451
+ }
21452
+
20448
21453
  // Composables
20449
21454
  function createVuetify$1() {
20450
21455
  let vuetify = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
@@ -20463,6 +21468,7 @@
20463
21468
  const theme = createTheme(options.theme);
20464
21469
  const icons = createIcons(options.icons);
20465
21470
  const locale = createLocale(options.locale);
21471
+ const date = createDate(options.date);
20466
21472
  const install = app => {
20467
21473
  for (const key in directives) {
20468
21474
  app.directive(key, directives[key]);
@@ -20483,6 +21489,7 @@
20483
21489
  app.provide(ThemeSymbol, theme);
20484
21490
  app.provide(IconSymbol, icons);
20485
21491
  app.provide(LocaleSymbol, locale);
21492
+ app.provide(DateAdapterSymbol, date);
20486
21493
  if (IN_BROWSER && options.ssr) {
20487
21494
  if (app.$nuxt) {
20488
21495
  app.$nuxt.hook('app:suspense:resolve', () => {
@@ -20510,7 +21517,8 @@
20510
21517
  display: inject.call(this, DisplaySymbol),
20511
21518
  theme: inject.call(this, ThemeSymbol),
20512
21519
  icons: inject.call(this, IconSymbol),
20513
- locale: inject.call(this, LocaleSymbol)
21520
+ locale: inject.call(this, LocaleSymbol),
21521
+ date: inject.call(this, DateAdapterSymbol)
20514
21522
  });
20515
21523
  }
20516
21524
  }
@@ -20523,10 +21531,11 @@
20523
21531
  display,
20524
21532
  theme,
20525
21533
  icons,
20526
- locale
21534
+ locale,
21535
+ date
20527
21536
  };
20528
21537
  }
20529
- const version$1 = "3.1.15";
21538
+ const version$1 = "3.2.0";
20530
21539
  createVuetify$1.version = version$1;
20531
21540
 
20532
21541
  // Vue's inject() can only be used in setup
@@ -20538,7 +21547,7 @@
20538
21547
  }
20539
21548
  }
20540
21549
 
20541
- const version = "3.1.15";
21550
+ const version = "3.2.0";
20542
21551
 
20543
21552
  const createVuetify = function () {
20544
21553
  let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
@@ -20552,6 +21561,7 @@
20552
21561
  exports.components = components;
20553
21562
  exports.createVuetify = createVuetify;
20554
21563
  exports.directives = directives;
21564
+ exports.useDefaults = useDefaults;
20555
21565
  exports.useDisplay = useDisplay;
20556
21566
  exports.useLayout = useLayout;
20557
21567
  exports.useLocale = useLocale;