vuetify 3.3.3 → 3.3.5

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 (309) hide show
  1. package/dist/_component-variables-labs.sass +2 -0
  2. package/dist/json/attributes.json +448 -12
  3. package/dist/json/importMap-labs.json +32 -0
  4. package/dist/json/importMap.json +12 -12
  5. package/dist/json/tags.json +149 -0
  6. package/dist/json/web-types.json +1599 -21
  7. package/dist/vuetify-labs.css +468 -192
  8. package/dist/vuetify-labs.d.ts +5132 -217
  9. package/dist/vuetify-labs.esm.js +1911 -995
  10. package/dist/vuetify-labs.esm.js.map +1 -1
  11. package/dist/vuetify-labs.js +1911 -995
  12. package/dist/vuetify-labs.min.css +2 -2
  13. package/dist/vuetify.css +180 -173
  14. package/dist/vuetify.d.ts +58 -43
  15. package/dist/vuetify.esm.js +149 -109
  16. package/dist/vuetify.esm.js.map +1 -1
  17. package/dist/vuetify.js +149 -109
  18. package/dist/vuetify.js.map +1 -1
  19. package/dist/vuetify.min.css +2 -2
  20. package/dist/vuetify.min.js +159 -160
  21. package/dist/vuetify.min.js.map +1 -1
  22. package/lib/blueprints/index.d.mts +32 -25
  23. package/lib/blueprints/md1.d.mts +32 -25
  24. package/lib/blueprints/md2.d.mts +32 -25
  25. package/lib/blueprints/md3.d.mts +32 -25
  26. package/lib/components/VAppBar/VAppBar.mjs +3 -10
  27. package/lib/components/VAppBar/VAppBar.mjs.map +1 -1
  28. package/lib/components/VAutocomplete/VAutocomplete.css +4 -22
  29. package/lib/components/VAutocomplete/VAutocomplete.mjs +1 -1
  30. package/lib/components/VAutocomplete/VAutocomplete.mjs.map +1 -1
  31. package/lib/components/VAutocomplete/VAutocomplete.sass +6 -17
  32. package/lib/components/VBreadcrumbs/index.d.mts +7 -7
  33. package/lib/components/VBtn/VBtn.css +11 -11
  34. package/lib/components/VBtn/VBtn.sass +1 -1
  35. package/lib/components/VBtn/_mixins.scss +1 -1
  36. package/lib/components/VChip/VChip.css +67 -67
  37. package/lib/components/VChip/_variables.scss +1 -1
  38. package/lib/components/VCombobox/VCombobox.css +4 -22
  39. package/lib/components/VCombobox/VCombobox.sass +6 -17
  40. package/lib/components/VCombobox/_variables.scss +3 -3
  41. package/lib/components/VCounter/index.d.mts +8 -8
  42. package/lib/components/VField/VField.css +71 -8
  43. package/lib/components/VField/VField.sass +9 -5
  44. package/lib/components/VField/_mixins.sass +7 -0
  45. package/lib/components/VFileInput/VFileInput.css +2 -17
  46. package/lib/components/VFileInput/VFileInput.mjs +0 -2
  47. package/lib/components/VFileInput/VFileInput.mjs.map +1 -1
  48. package/lib/components/VFileInput/VFileInput.sass +2 -11
  49. package/lib/components/VFileInput/_variables.scss +3 -3
  50. package/lib/components/VInput/VInput.css +14 -1
  51. package/lib/components/VInput/VInput.sass +6 -0
  52. package/lib/components/VInput/_variables.scss +5 -1
  53. package/lib/components/VList/VListItem.mjs +1 -1
  54. package/lib/components/VList/VListItem.mjs.map +1 -1
  55. package/lib/components/VSelect/VSelect.css +2 -20
  56. package/lib/components/VSelect/VSelect.mjs +1 -1
  57. package/lib/components/VSelect/VSelect.mjs.map +1 -1
  58. package/lib/components/VSelect/VSelect.sass +2 -12
  59. package/lib/components/VSelect/_variables.scss +3 -3
  60. package/lib/components/VTabs/VTab.mjs +2 -2
  61. package/lib/components/VTabs/VTab.mjs.map +1 -1
  62. package/lib/components/VTimePicker/VTimePickerTitle.mjs +1 -1
  63. package/lib/components/index.d.mts +15 -15
  64. package/lib/components/index.mjs +1 -2
  65. package/lib/components/index.mjs.map +1 -1
  66. package/lib/composables/icons.mjs.map +1 -1
  67. package/lib/composables/list-items.mjs +5 -2
  68. package/lib/composables/list-items.mjs.map +1 -1
  69. package/lib/composables/nested/nested.mjs +1 -1
  70. package/lib/composables/nested/nested.mjs.map +1 -1
  71. package/lib/composables/virtual.mjs +7 -5
  72. package/lib/composables/virtual.mjs.map +1 -1
  73. package/lib/entry-bundler.mjs +1 -1
  74. package/lib/framework.mjs +1 -1
  75. package/lib/iconsets/fa-svg.d.mts +1 -0
  76. package/lib/iconsets/fa.d.mts +1 -0
  77. package/lib/iconsets/fa.mjs +2 -1
  78. package/lib/iconsets/fa.mjs.map +1 -1
  79. package/lib/iconsets/fa4.d.mts +1 -0
  80. package/lib/iconsets/fa4.mjs +2 -1
  81. package/lib/iconsets/fa4.mjs.map +1 -1
  82. package/lib/iconsets/md.d.mts +1 -0
  83. package/lib/iconsets/md.mjs +2 -1
  84. package/lib/iconsets/md.mjs.map +1 -1
  85. package/lib/iconsets/mdi-svg.d.mts +1 -0
  86. package/lib/iconsets/mdi-svg.mjs +2 -1
  87. package/lib/iconsets/mdi-svg.mjs.map +1 -1
  88. package/lib/iconsets/mdi.d.mts +1 -0
  89. package/lib/iconsets/mdi.mjs +2 -1
  90. package/lib/iconsets/mdi.mjs.map +1 -1
  91. package/lib/index.d.mts +43 -28
  92. package/lib/labs/VDataTable/VDataTableVirtual.mjs +16 -12
  93. package/lib/labs/VDataTable/VDataTableVirtual.mjs.map +1 -1
  94. package/lib/labs/VDataTable/composables/headers.mjs +2 -5
  95. package/lib/labs/VDataTable/composables/headers.mjs.map +1 -1
  96. package/lib/labs/VDateInput/VDateInput.mjs +127 -0
  97. package/lib/labs/VDateInput/VDateInput.mjs.map +1 -0
  98. package/lib/labs/VDateInput/VDateInput.sass +11 -0
  99. package/lib/labs/VDateInput/VDateRangeInput.mjs +223 -0
  100. package/lib/labs/VDateInput/VDateRangeInput.mjs.map +1 -0
  101. package/lib/labs/VDateInput/VDateRangeInput.sass +10 -0
  102. package/lib/labs/VDateInput/composables.mjs +59 -0
  103. package/lib/labs/VDateInput/composables.mjs.map +1 -0
  104. package/lib/labs/VDateInput/index.d.mts +1352 -0
  105. package/lib/labs/VDateInput/index.mjs +3 -0
  106. package/lib/labs/VDateInput/index.mjs.map +1 -0
  107. package/lib/labs/VDatePicker/VDateCard.css +33 -0
  108. package/lib/labs/VDatePicker/VDateCard.mjs +112 -0
  109. package/lib/labs/VDatePicker/VDateCard.mjs.map +1 -0
  110. package/lib/labs/VDatePicker/VDateCard.sass +32 -0
  111. package/lib/labs/VDatePicker/VDatePicker.css +21 -0
  112. package/lib/labs/VDatePicker/VDatePicker.mjs +174 -0
  113. package/lib/labs/VDatePicker/VDatePicker.mjs.map +1 -0
  114. package/lib/labs/VDatePicker/VDatePicker.sass +21 -0
  115. package/lib/labs/VDatePicker/VDatePickerControls.css +17 -0
  116. package/lib/labs/VDatePicker/VDatePickerControls.mjs +80 -0
  117. package/lib/labs/VDatePicker/VDatePickerControls.mjs.map +1 -0
  118. package/lib/labs/VDatePicker/VDatePickerControls.sass +15 -0
  119. package/lib/labs/VDatePicker/VDatePickerHeader.css +54 -0
  120. package/lib/labs/VDatePicker/VDatePickerHeader.mjs +75 -0
  121. package/lib/labs/VDatePicker/VDatePickerHeader.mjs.map +1 -0
  122. package/lib/labs/VDatePicker/VDatePickerHeader.sass +51 -0
  123. package/lib/labs/VDatePicker/VDatePickerInput.sass +17 -0
  124. package/lib/labs/VDatePicker/VDatePickerMonth.css +76 -0
  125. package/lib/labs/VDatePicker/VDatePickerMonth.mjs +286 -0
  126. package/lib/labs/VDatePicker/VDatePickerMonth.mjs.map +1 -0
  127. package/lib/labs/VDatePicker/VDatePickerMonth.sass +68 -0
  128. package/lib/{components → labs}/VDatePicker/VDatePickerTitle.mjs +1 -1
  129. package/lib/labs/VDatePicker/VDatePickerTitle.mjs.map +1 -0
  130. package/lib/{components → labs}/VDatePicker/VDatePickerTitle.sass +1 -1
  131. package/lib/labs/VDatePicker/VDatePickerYears.css +18 -0
  132. package/lib/labs/VDatePicker/VDatePickerYears.mjs +64 -0
  133. package/lib/labs/VDatePicker/VDatePickerYears.mjs.map +1 -0
  134. package/lib/labs/VDatePicker/VDatePickerYears.sass +16 -0
  135. package/lib/{components → labs}/VDatePicker/_variables.scss +0 -5
  136. package/lib/labs/VDatePicker/composables.mjs +33 -0
  137. package/lib/labs/VDatePicker/composables.mjs.map +1 -0
  138. package/lib/labs/VDatePicker/index.d.mts +4384 -0
  139. package/lib/labs/VDatePicker/index.mjs +7 -0
  140. package/lib/labs/VDatePicker/index.mjs.map +1 -0
  141. package/lib/labs/VDatePicker/util/createNativeLocaleFormatter.mjs.map +1 -0
  142. package/lib/labs/VDatePicker/util/eventHelpers.mjs.map +1 -0
  143. package/lib/labs/VDatePicker/util/index.mjs.map +1 -0
  144. package/lib/labs/VDatePicker/util/isDateAllowed.mjs.map +1 -0
  145. package/lib/labs/VDatePicker/util/monthChange.mjs.map +1 -0
  146. package/lib/labs/VDatePicker/util/pad.mjs.map +1 -0
  147. package/lib/labs/VDatePicker/util/sanitizeDateString.mjs.map +1 -0
  148. package/lib/labs/VDatePicker/utils.mjs +69 -0
  149. package/lib/labs/VDatePicker/utils.mjs.map +1 -0
  150. package/lib/labs/VDateRangePicker/VDateRangeCard.mjs +87 -0
  151. package/lib/labs/VDateRangePicker/VDateRangeCard.mjs.map +1 -0
  152. package/lib/labs/VDateRangePicker/VDateRangeCard.sass +33 -0
  153. package/lib/labs/VDateRangePicker/VDateRangePicker.mjs +131 -0
  154. package/lib/labs/VDateRangePicker/VDateRangePicker.mjs.map +1 -0
  155. package/lib/labs/VDateRangePicker/VDateRangePicker.sass +21 -0
  156. package/lib/labs/VDateRangePicker/VDateRangePickerHeader.mjs +103 -0
  157. package/lib/labs/VDateRangePicker/VDateRangePickerHeader.mjs.map +1 -0
  158. package/lib/labs/VDateRangePicker/VDateRangePickerHeader.sass +39 -0
  159. package/lib/labs/VDateRangePicker/VDateRangePickerMonth.mjs +61 -0
  160. package/lib/labs/VDateRangePicker/VDateRangePickerMonth.mjs.map +1 -0
  161. package/lib/labs/VDateRangePicker/VDateRangePickerMonth.sass +12 -0
  162. package/lib/labs/VDateRangePicker/index.d.mts +1065 -0
  163. package/lib/labs/VDateRangePicker/index.mjs +3 -0
  164. package/lib/labs/VDateRangePicker/index.mjs.map +1 -0
  165. package/lib/labs/VPicker/VPicker.css +57 -0
  166. package/lib/labs/VPicker/VPicker.mjs +47 -0
  167. package/lib/labs/VPicker/VPicker.mjs.map +1 -0
  168. package/lib/labs/VPicker/VPicker.sass +53 -0
  169. package/lib/labs/VPicker/VPickerTitle.mjs +4 -0
  170. package/lib/labs/VPicker/VPickerTitle.mjs.map +1 -0
  171. package/lib/{components → labs}/VPicker/_variables.scss +2 -2
  172. package/lib/labs/VPicker/index.d.mts +541 -0
  173. package/lib/labs/VPicker/index.mjs +3 -0
  174. package/lib/labs/VPicker/index.mjs.map +1 -0
  175. package/lib/labs/components.d.mts +5090 -198
  176. package/lib/labs/components.mjs +2 -0
  177. package/lib/labs/components.mjs.map +1 -1
  178. package/lib/labs/date/DateAdapter.mjs.map +1 -1
  179. package/lib/labs/date/adapters/vuetify.d.mts +28 -25
  180. package/lib/labs/date/adapters/vuetify.mjs +65 -75
  181. package/lib/labs/date/adapters/vuetify.mjs.map +1 -1
  182. package/lib/labs/date/date.mjs +82 -11
  183. package/lib/labs/date/date.mjs.map +1 -1
  184. package/lib/labs/date/index.d.mts +31 -30
  185. package/lib/locale/af.mjs +14 -5
  186. package/lib/locale/af.mjs.map +1 -1
  187. package/lib/locale/ar.mjs +14 -5
  188. package/lib/locale/ar.mjs.map +1 -1
  189. package/lib/locale/az.mjs +14 -5
  190. package/lib/locale/az.mjs.map +1 -1
  191. package/lib/locale/bg.mjs +14 -5
  192. package/lib/locale/bg.mjs.map +1 -1
  193. package/lib/locale/ca.mjs +14 -5
  194. package/lib/locale/ca.mjs.map +1 -1
  195. package/lib/locale/ckb.mjs +14 -5
  196. package/lib/locale/ckb.mjs.map +1 -1
  197. package/lib/locale/cs.mjs +14 -5
  198. package/lib/locale/cs.mjs.map +1 -1
  199. package/lib/locale/da.mjs +14 -5
  200. package/lib/locale/da.mjs.map +1 -1
  201. package/lib/locale/de.mjs +14 -5
  202. package/lib/locale/de.mjs.map +1 -1
  203. package/lib/locale/el.mjs +14 -5
  204. package/lib/locale/el.mjs.map +1 -1
  205. package/lib/locale/en.mjs +14 -5
  206. package/lib/locale/en.mjs.map +1 -1
  207. package/lib/locale/es.mjs +14 -5
  208. package/lib/locale/es.mjs.map +1 -1
  209. package/lib/locale/et.mjs +14 -5
  210. package/lib/locale/et.mjs.map +1 -1
  211. package/lib/locale/fa.mjs +14 -5
  212. package/lib/locale/fa.mjs.map +1 -1
  213. package/lib/locale/fi.mjs +14 -5
  214. package/lib/locale/fi.mjs.map +1 -1
  215. package/lib/locale/fr.mjs +14 -5
  216. package/lib/locale/fr.mjs.map +1 -1
  217. package/lib/locale/he.mjs +14 -5
  218. package/lib/locale/he.mjs.map +1 -1
  219. package/lib/locale/hr.mjs +14 -5
  220. package/lib/locale/hr.mjs.map +1 -1
  221. package/lib/locale/hu.mjs +14 -5
  222. package/lib/locale/hu.mjs.map +1 -1
  223. package/lib/locale/id.mjs +14 -5
  224. package/lib/locale/id.mjs.map +1 -1
  225. package/lib/locale/index.d.mts +588 -210
  226. package/lib/locale/it.mjs +14 -5
  227. package/lib/locale/it.mjs.map +1 -1
  228. package/lib/locale/ja.mjs +14 -5
  229. package/lib/locale/ja.mjs.map +1 -1
  230. package/lib/locale/ko.mjs +14 -5
  231. package/lib/locale/ko.mjs.map +1 -1
  232. package/lib/locale/lt.mjs +14 -5
  233. package/lib/locale/lt.mjs.map +1 -1
  234. package/lib/locale/lv.mjs +14 -5
  235. package/lib/locale/lv.mjs.map +1 -1
  236. package/lib/locale/nl.mjs +14 -5
  237. package/lib/locale/nl.mjs.map +1 -1
  238. package/lib/locale/no.mjs +14 -5
  239. package/lib/locale/no.mjs.map +1 -1
  240. package/lib/locale/pl.mjs +14 -5
  241. package/lib/locale/pl.mjs.map +1 -1
  242. package/lib/locale/pt.mjs +14 -5
  243. package/lib/locale/pt.mjs.map +1 -1
  244. package/lib/locale/ro.mjs +14 -5
  245. package/lib/locale/ro.mjs.map +1 -1
  246. package/lib/locale/ru.mjs +14 -5
  247. package/lib/locale/ru.mjs.map +1 -1
  248. package/lib/locale/sk.mjs +14 -5
  249. package/lib/locale/sk.mjs.map +1 -1
  250. package/lib/locale/sl.mjs +14 -5
  251. package/lib/locale/sl.mjs.map +1 -1
  252. package/lib/locale/sr-Cyrl.mjs +14 -5
  253. package/lib/locale/sr-Cyrl.mjs.map +1 -1
  254. package/lib/locale/sr-Latn.mjs +14 -5
  255. package/lib/locale/sr-Latn.mjs.map +1 -1
  256. package/lib/locale/sv.mjs +14 -5
  257. package/lib/locale/sv.mjs.map +1 -1
  258. package/lib/locale/th.mjs +14 -5
  259. package/lib/locale/th.mjs.map +1 -1
  260. package/lib/locale/tr.mjs +14 -5
  261. package/lib/locale/tr.mjs.map +1 -1
  262. package/lib/locale/uk.mjs +14 -5
  263. package/lib/locale/uk.mjs.map +1 -1
  264. package/lib/locale/vi.mjs +14 -5
  265. package/lib/locale/vi.mjs.map +1 -1
  266. package/lib/locale/zh-Hans.mjs +14 -5
  267. package/lib/locale/zh-Hans.mjs.map +1 -1
  268. package/lib/locale/zh-Hant.mjs +14 -5
  269. package/lib/locale/zh-Hant.mjs.map +1 -1
  270. package/lib/util/dateTimeUtils.mjs +68 -0
  271. package/lib/util/dateTimeUtils.mjs.map +1 -1
  272. package/package.json +5 -2
  273. package/lib/components/VDatePicker/VDatePicker.mjs +0 -475
  274. package/lib/components/VDatePicker/VDatePicker.mjs.map +0 -1
  275. package/lib/components/VDatePicker/VDatePickerDateTable.mjs +0 -120
  276. package/lib/components/VDatePicker/VDatePickerDateTable.mjs.map +0 -1
  277. package/lib/components/VDatePicker/VDatePickerHeader.mjs +0 -136
  278. package/lib/components/VDatePicker/VDatePickerHeader.mjs.map +0 -1
  279. package/lib/components/VDatePicker/VDatePickerHeader.sass +0 -46
  280. package/lib/components/VDatePicker/VDatePickerMonthTable.mjs +0 -48
  281. package/lib/components/VDatePicker/VDatePickerMonthTable.mjs.map +0 -1
  282. package/lib/components/VDatePicker/VDatePickerTable.sass +0 -84
  283. package/lib/components/VDatePicker/VDatePickerTitle.mjs.map +0 -1
  284. package/lib/components/VDatePicker/VDatePickerYears.mjs +0 -84
  285. package/lib/components/VDatePicker/VDatePickerYears.mjs.map +0 -1
  286. package/lib/components/VDatePicker/VDatePickerYears.sass +0 -30
  287. package/lib/components/VDatePicker/index.mjs +0 -18
  288. package/lib/components/VDatePicker/index.mjs.map +0 -1
  289. package/lib/components/VDatePicker/mixins/date-picker-table.mjs +0 -210
  290. package/lib/components/VDatePicker/mixins/date-picker-table.mjs.map +0 -1
  291. package/lib/components/VDatePicker/util/createNativeLocaleFormatter.mjs.map +0 -1
  292. package/lib/components/VDatePicker/util/eventHelpers.mjs.map +0 -1
  293. package/lib/components/VDatePicker/util/index.mjs.map +0 -1
  294. package/lib/components/VDatePicker/util/isDateAllowed.mjs.map +0 -1
  295. package/lib/components/VDatePicker/util/monthChange.mjs.map +0 -1
  296. package/lib/components/VDatePicker/util/pad.mjs.map +0 -1
  297. package/lib/components/VDatePicker/util/sanitizeDateString.mjs.map +0 -1
  298. package/lib/components/VPicker/VPicker.mjs +0 -86
  299. package/lib/components/VPicker/VPicker.mjs.map +0 -1
  300. package/lib/components/VPicker/VPicker.sass +0 -94
  301. package/lib/components/VPicker/index.mjs +0 -4
  302. package/lib/components/VPicker/index.mjs.map +0 -1
  303. /package/lib/{components → labs}/VDatePicker/util/createNativeLocaleFormatter.mjs +0 -0
  304. /package/lib/{components → labs}/VDatePicker/util/eventHelpers.mjs +0 -0
  305. /package/lib/{components → labs}/VDatePicker/util/index.mjs +0 -0
  306. /package/lib/{components → labs}/VDatePicker/util/isDateAllowed.mjs +0 -0
  307. /package/lib/{components → labs}/VDatePicker/util/monthChange.mjs +0 -0
  308. /package/lib/{components → labs}/VDatePicker/util/pad.mjs +0 -0
  309. /package/lib/{components → labs}/VDatePicker/util/sanitizeDateString.mjs +0 -0
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.3.3
2
+ * Vuetify v3.3.5
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -1647,12 +1647,21 @@
1647
1647
  lastPage: 'Last page',
1648
1648
  pageText: '{0}-{1} of {2}'
1649
1649
  },
1650
+ dateRangeInput: {
1651
+ divider: 'to'
1652
+ },
1650
1653
  datePicker: {
1651
- itemsSelected: '{0} selected',
1652
- nextMonthAriaLabel: 'Next month',
1653
- nextYearAriaLabel: 'Next year',
1654
- prevMonthAriaLabel: 'Previous month',
1655
- prevYearAriaLabel: 'Previous year'
1654
+ ok: 'OK',
1655
+ cancel: 'Cancel',
1656
+ range: {
1657
+ title: 'Select dates',
1658
+ header: 'Enter dates'
1659
+ },
1660
+ title: 'Select date',
1661
+ header: 'Enter date',
1662
+ input: {
1663
+ placeholder: 'Enter date'
1664
+ }
1656
1665
  },
1657
1666
  noDataText: 'No data available',
1658
1667
  carousel: {
@@ -3635,7 +3644,7 @@
3635
3644
  const extensionHeight = vToolbarRef.value?.extensionHeight ?? 0;
3636
3645
  return height + extensionHeight;
3637
3646
  });
3638
- function setActive() {
3647
+ vue.watchEffect(() => {
3639
3648
  if (scrollBehavior.value.hide) {
3640
3649
  if (scrollBehavior.value.inverted) {
3641
3650
  isActive.value = currentScroll.value > scrollThreshold.value;
@@ -3645,12 +3654,6 @@
3645
3654
  } else {
3646
3655
  isActive.value = true;
3647
3656
  }
3648
- }
3649
- useToggleScope(() => !!props.scrollBehavior, () => {
3650
- vue.watch(currentScroll, setActive, {
3651
- immediate: true
3652
- });
3653
- vue.watch(scrollBehavior, setActive);
3654
3657
  });
3655
3658
  const {
3656
3659
  ssrBootStyles
@@ -4105,7 +4108,8 @@
4105
4108
  unfold: 'mdi-unfold-more-horizontal',
4106
4109
  file: 'mdi-paperclip',
4107
4110
  plus: 'mdi-plus',
4108
- minus: 'mdi-minus'
4111
+ minus: 'mdi-minus',
4112
+ calendar: 'mdi-calendar'
4109
4113
  };
4110
4114
  const mdi = {
4111
4115
  // Not using mergeProps here, functional components merge props by default (?)
@@ -7315,7 +7319,7 @@
7315
7319
  const useNestedItem = (id, isGroup) => {
7316
7320
  const parent = vue.inject(VNestedSymbol, emptyNested);
7317
7321
  const uidSymbol = Symbol(getUid());
7318
- const computedId = vue.computed(() => id.value ?? uidSymbol);
7322
+ const computedId = vue.computed(() => id.value !== undefined ? id.value : uidSymbol);
7319
7323
  const item = {
7320
7324
  ...parent,
7321
7325
  id: computedId,
@@ -7515,7 +7519,7 @@
7515
7519
  emit
7516
7520
  } = _ref;
7517
7521
  const link = useLink(props, attrs);
7518
- const id = vue.computed(() => props.value ?? link.href.value);
7522
+ const id = vue.computed(() => props.value === undefined ? link.href.value : props.value);
7519
7523
  const {
7520
7524
  select,
7521
7525
  isSelected,
@@ -7912,10 +7916,13 @@
7912
7916
  }
7913
7917
  function useTransformItems(items, transform) {
7914
7918
  function transformIn(value) {
7915
- return value.map(v => {
7919
+ return value
7920
+ // When the model value is null, returns an InternalItem based on null
7921
+ // only if null is one of the items
7922
+ .filter(v => v !== null || items.value.some(item => item.value === null)).map(v => {
7916
7923
  const existingItem = items.value.find(item => deepEqual(v, item.value));
7917
7924
  // Nullish existingItem means value is a custom input value from combobox
7918
- // In this case, use transformItem to create an { value: unknown } based on value
7925
+ // In this case, use transformItem to create an InternalItem based on value
7919
7926
  return existingItem ?? transform(v);
7920
7927
  });
7921
7928
  }
@@ -10445,7 +10452,7 @@
10445
10452
  transformIn,
10446
10453
  transformOut
10447
10454
  } = useItems(props);
10448
- const model = useProxiedModel(props, 'modelValue', [], v => transformIn(wrapInArray(v)), v => {
10455
+ const model = useProxiedModel(props, 'modelValue', [], v => transformIn(v === null ? [null] : wrapInArray(v)), v => {
10449
10456
  const transformed = transformOut(v);
10450
10457
  return props.multiple ? transformed : transformed[0] ?? null;
10451
10458
  });
@@ -10870,7 +10877,7 @@
10870
10877
  textColorStyles
10871
10878
  } = useTextColor(color);
10872
10879
  const search = useProxiedModel(props, 'search', '');
10873
- const model = useProxiedModel(props, 'modelValue', [], v => transformIn(wrapInArray(v)), v => {
10880
+ const model = useProxiedModel(props, 'modelValue', [], v => transformIn(v === null ? [null] : wrapInArray(v)), v => {
10874
10881
  const transformed = transformOut(v);
10875
10882
  return props.multiple ? transformed : transformed[0] ?? null;
10876
10883
  });
@@ -15197,8 +15204,6 @@
15197
15204
  "modelValue": model.value,
15198
15205
  "onUpdate:modelValue": $event => model.value = $event,
15199
15206
  "class": ['v-file-input', {
15200
- 'v-file-input--chips': !!props.chips,
15201
- 'v-file-input--selection-slot': !!slots.selection,
15202
15207
  'v-text-field--plain-underlined': isPlainOrUnderlined.value
15203
15208
  }, props.class],
15204
15209
  "style": props.style,
@@ -18195,8 +18200,8 @@
18195
18200
  const initialScale = prevBox[widthHeight] / nextBox[widthHeight];
18196
18201
  const sigma = 1.5;
18197
18202
  animate(nextEl, {
18198
- backgroundColor: [color, ''],
18199
- transform: [`translate${XY}(${delta}px) scale${XY}(${initialScale})`, `translate${XY}(${delta / sigma}px) scale${XY}(${(scale - 1) / sigma + 1})`, ''],
18203
+ backgroundColor: [color, 'currentcolor'],
18204
+ transform: [`translate${XY}(${delta}px) scale${XY}(${initialScale})`, `translate${XY}(${delta / sigma}px) scale${XY}(${(scale - 1) / sigma + 1})`, 'none'],
18200
18205
  transformOrigin: Array(3).fill(origin)
18201
18206
  }, {
18202
18207
  duration: 225,
@@ -19103,12 +19108,14 @@
19103
19108
  const direction = scrollTop < lastScrollTop ? UP : DOWN;
19104
19109
  const midPointIndex = calculateMidPointIndex(scrollTop + height / 2);
19105
19110
  const buffer = Math.round(visibleItems.value / 3);
19106
- if (direction === UP && midPointIndex <= first.value + buffer * 2 - 1) {
19107
- first.value = clamp(midPointIndex - buffer, 0, items.value.length);
19108
- } else if (direction === DOWN && midPointIndex >= first.value + buffer * 2 - 1) {
19109
- first.value = clamp(midPointIndex - buffer, 0, items.value.length - visibleItems.value);
19111
+ const firstIndex = midPointIndex - buffer;
19112
+ const lastIndex = first.value + buffer * 2 - 1;
19113
+ if (direction === UP && midPointIndex <= lastIndex) {
19114
+ first.value = clamp(firstIndex, 0, items.value.length);
19115
+ } else if (direction === DOWN && midPointIndex >= lastIndex) {
19116
+ first.value = clamp(firstIndex, 0, items.value.length - visibleItems.value);
19110
19117
  }
19111
- lastScrollTop = containerRef.value.scrollTop;
19118
+ lastScrollTop = scrollTop;
19112
19119
  }
19113
19120
  function scrollToIndex(index) {
19114
19121
  if (!containerRef.value) return;
@@ -20235,7 +20242,7 @@
20235
20242
  function createHeaders(props, options) {
20236
20243
  const headers = vue.ref([]);
20237
20244
  const columns = vue.ref([]);
20238
- vue.watch(() => props.headers, () => {
20245
+ vue.watchEffect(() => {
20239
20246
  const wrapped = !props.headers.length ? [] : Array.isArray(props.headers[0]) ? props.headers : [props.headers];
20240
20247
  const flat = wrapped.flatMap((row, index) => row.map(column => ({
20241
20248
  column,
@@ -20355,9 +20362,6 @@
20355
20362
  return filtered;
20356
20363
  });
20357
20364
  columns.value = fixedRows.at(-1) ?? [];
20358
- }, {
20359
- deep: true,
20360
- immediate: true
20361
20365
  });
20362
20366
  const data = {
20363
20367
  headers,
@@ -21190,18 +21194,22 @@
21190
21194
  "items": displayItems.value
21191
21195
  }), {
21192
21196
  ...slots,
21193
- item: itemSlotProps => {
21194
- return slots.item?.(itemSlotProps) ?? vue.createVNode(VVirtualScrollItem, {
21195
- "key": itemSlotProps.item.index,
21196
- "dynamicHeight": true,
21197
- "renderless": true,
21198
- "onUpdate:height": height => handleItemResize(itemSlotProps.item.index, height)
21199
- }, {
21200
- default: slotProps => vue.createVNode(VDataTableRow, vue.mergeProps(itemSlotProps.props, slotProps?.props, {
21201
- "key": itemSlotProps.item.index
21202
- }), slots)
21203
- });
21204
- }
21197
+ item: itemSlotProps => vue.createVNode(VVirtualScrollItem, {
21198
+ "key": itemSlotProps.item.index,
21199
+ "dynamicHeight": true,
21200
+ "renderless": true,
21201
+ "onUpdate:height": height => handleItemResize(itemSlotProps.item.index, height)
21202
+ }, {
21203
+ default: slotProps => slots.item?.({
21204
+ ...itemSlotProps,
21205
+ props: {
21206
+ ...itemSlotProps.props,
21207
+ ...slotProps?.props
21208
+ }
21209
+ }) ?? vue.createVNode(VDataTableRow, vue.mergeProps(itemSlotProps.props, slotProps?.props, {
21210
+ "key": itemSlotProps.item.index
21211
+ }), slots)
21212
+ })
21205
21213
  }), vue.createVNode("tr", {
21206
21214
  "style": {
21207
21215
  height: convertToUnit(paddingBottom.value),
@@ -21389,835 +21397,220 @@
21389
21397
  }
21390
21398
  });
21391
21399
 
21392
- // Types
21393
-
21394
- const makeVInfiniteScrollProps = propsFactory({
21395
- color: String,
21396
- direction: {
21397
- type: String,
21398
- default: 'vertical',
21399
- validator: v => ['vertical', 'horizontal'].includes(v)
21400
- },
21401
- side: {
21402
- type: String,
21403
- default: 'end',
21404
- validator: v => ['start', 'end', 'both'].includes(v)
21405
- },
21406
- mode: {
21407
- type: String,
21408
- default: 'intersect',
21409
- validator: v => ['intersect', 'manual'].includes(v)
21410
- },
21411
- margin: [Number, String],
21412
- loadMoreText: {
21413
- type: String,
21414
- default: '$vuetify.infiniteScroll.loadMore'
21415
- },
21416
- emptyText: {
21417
- type: String,
21418
- default: '$vuetify.infiniteScroll.empty'
21419
- },
21420
- ...makeDimensionProps(),
21421
- ...makeTagProps()
21422
- }, 'VInfiniteScroll');
21423
- const VInfiniteScrollIntersect = defineComponent({
21424
- name: 'VInfiniteScrollIntersect',
21425
- props: {
21426
- side: {
21427
- type: String,
21428
- required: true
21429
- },
21430
- rootRef: null,
21431
- rootMargin: String
21432
- },
21433
- emits: {
21434
- intersect: side => true
21435
- },
21436
- setup(props, _ref) {
21437
- let {
21438
- emit
21439
- } = _ref;
21440
- const {
21441
- intersectionRef,
21442
- isIntersecting
21443
- } = useIntersectionObserver(entries => {}, props.rootMargin ? {
21444
- root: props.rootRef,
21445
- rootMargin: props.rootMargin
21446
- } : undefined);
21447
- vue.watch(isIntersecting, async val => {
21448
- if (val) emit('intersect', props.side);
21449
- });
21450
- useRender(() => vue.createVNode("div", {
21451
- "class": "v-infinite-scroll-intersect",
21452
- "ref": intersectionRef
21453
- }, [vue.createTextVNode("\xA0")]));
21454
- return {};
21455
- }
21456
- });
21457
- const VInfiniteScroll = genericComponent()({
21458
- name: 'VInfiniteScroll',
21459
- props: makeVInfiniteScrollProps(),
21460
- emits: {
21461
- load: options => true
21462
- },
21463
- setup(props, _ref2) {
21464
- let {
21465
- slots,
21466
- emit
21467
- } = _ref2;
21468
- const rootEl = vue.ref();
21469
- const startStatus = vue.ref('ok');
21470
- const endStatus = vue.ref('ok');
21471
- const margin = vue.computed(() => convertToUnit(props.margin));
21472
- function setScrollAmount(amount) {
21473
- if (!rootEl.value) return;
21474
- const property = props.direction === 'vertical' ? 'scrollTop' : 'scrollLeft';
21475
- rootEl.value[property] = amount;
21476
- }
21477
- function getScrollAmount() {
21478
- if (!rootEl.value) return 0;
21479
- const property = props.direction === 'vertical' ? 'scrollTop' : 'scrollLeft';
21480
- return rootEl.value[property];
21481
- }
21482
- function getScrollSize() {
21483
- if (!rootEl.value) return 0;
21484
- const property = props.direction === 'vertical' ? 'scrollHeight' : 'scrollWidth';
21485
- return rootEl.value[property];
21486
- }
21487
- function getContainerSize() {
21488
- if (!rootEl.value) return 0;
21489
- const property = props.direction === 'vertical' ? 'clientHeight' : 'clientWidth';
21490
- return rootEl.value[property];
21491
- }
21492
- vue.onMounted(() => {
21493
- if (!rootEl.value) return;
21494
- if (props.side === 'start') {
21495
- setScrollAmount(getScrollSize());
21496
- } else if (props.side === 'both') {
21497
- setScrollAmount(getScrollSize() / 2 - getContainerSize() / 2);
21498
- }
21499
- });
21500
- function setStatus(side, status) {
21501
- if (side === 'start') {
21502
- startStatus.value = status;
21503
- } else if (side === 'end') {
21504
- endStatus.value = status;
21505
- }
21506
- }
21507
- function getStatus(side) {
21508
- return side === 'start' ? startStatus.value : endStatus.value;
21509
- }
21510
- let previousScrollSize = 0;
21511
- function handleIntersect(side) {
21512
- const status = getStatus(side);
21513
- if (!rootEl.value || status === 'loading') return;
21514
- previousScrollSize = getScrollSize();
21515
- setStatus(side, 'loading');
21516
- function done(status) {
21517
- setStatus(side, status);
21518
- vue.nextTick(() => {
21519
- if (status === 'ok' && side === 'start') {
21520
- setScrollAmount(getScrollSize() - previousScrollSize + getScrollAmount());
21521
- }
21522
- });
21523
- }
21524
- emit('load', {
21525
- side,
21526
- done
21527
- });
21528
- }
21529
- const {
21530
- t
21531
- } = useLocale();
21532
- function renderSide(side, status) {
21533
- if (props.side !== side && props.side !== 'both') return;
21534
- const onClick = () => handleIntersect(side);
21535
- const slotProps = {
21536
- side,
21537
- props: {
21538
- onClick,
21539
- color: props.color
21540
- }
21541
- };
21542
- if (status === 'error') return slots.error?.(slotProps);
21543
- if (status === 'empty') return slots.empty?.(slotProps) ?? vue.createVNode("div", null, [t(props.emptyText)]);
21544
- if (props.mode === 'manual') {
21545
- if (status === 'loading') {
21546
- return slots.loading?.(slotProps) ?? vue.createVNode(VProgressCircular, {
21547
- "indeterminate": true,
21548
- "color": props.color
21549
- }, null);
21550
- }
21551
- return slots['load-more']?.(slotProps) ?? vue.createVNode(VBtn, {
21552
- "variant": "outlined",
21553
- "color": props.color,
21554
- "onClick": onClick
21555
- }, {
21556
- default: () => [t(props.loadMoreText)]
21557
- });
21558
- }
21559
- return slots.loading?.(slotProps) ?? vue.createVNode(VProgressCircular, {
21560
- "indeterminate": true,
21561
- "color": props.color
21562
- }, null);
21563
- }
21564
- const {
21565
- dimensionStyles
21566
- } = useDimension(props);
21567
- useRender(() => {
21568
- const Tag = props.tag;
21569
- const hasStartIntersect = props.side === 'start' || props.side === 'both';
21570
- const hasEndIntersect = props.side === 'end' || props.side === 'both';
21571
- const intersectMode = props.mode === 'intersect';
21572
- return vue.createVNode(Tag, {
21573
- "ref": rootEl,
21574
- "class": ['v-infinite-scroll', `v-infinite-scroll--${props.direction}`, {
21575
- 'v-infinite-scroll--start': hasStartIntersect,
21576
- 'v-infinite-scroll--end': hasEndIntersect
21577
- }],
21578
- "style": dimensionStyles.value
21579
- }, {
21580
- default: () => [vue.createVNode("div", {
21581
- "class": "v-infinite-scroll__side"
21582
- }, [renderSide('start', startStatus.value)]), rootEl.value && hasStartIntersect && intersectMode && vue.createVNode(VInfiniteScrollIntersect, {
21583
- "key": "start",
21584
- "side": "start",
21585
- "onIntersect": handleIntersect,
21586
- "rootRef": rootEl.value,
21587
- "rootMargin": margin.value
21588
- }, null), slots.default?.(), rootEl.value && hasEndIntersect && intersectMode && vue.createVNode(VInfiniteScrollIntersect, {
21589
- "key": "end",
21590
- "side": "end",
21591
- "onIntersect": handleIntersect,
21592
- "rootRef": rootEl.value,
21593
- "rootMargin": margin.value
21594
- }, null), vue.createVNode("div", {
21595
- "class": "v-infinite-scroll__side"
21596
- }, [renderSide('end', endStatus.value)])]
21597
- });
21598
- });
21599
- }
21600
- });
21400
+ // Utilities
21601
21401
 
21602
21402
  // Types
21603
21403
 
21604
- const rootTypes = {
21605
- actions: 'button@2',
21606
- article: 'heading, paragraph',
21607
- avatar: 'avatar',
21608
- button: 'button',
21609
- card: 'image, heading',
21610
- 'card-avatar': 'image, list-item-avatar',
21611
- chip: 'chip',
21612
- 'date-picker': 'list-item, heading, divider, date-picker-options, date-picker-days, actions',
21613
- 'date-picker-options': 'text, avatar@2',
21614
- 'date-picker-days': 'avatar@28',
21615
- divider: 'divider',
21616
- heading: 'heading',
21617
- image: 'image',
21618
- 'list-item': 'text',
21619
- 'list-item-avatar': 'avatar, text',
21620
- 'list-item-two-line': 'sentences',
21621
- 'list-item-avatar-two-line': 'avatar, sentences',
21622
- 'list-item-three-line': 'paragraph',
21623
- 'list-item-avatar-three-line': 'avatar, paragraph',
21624
- paragraph: 'text@3',
21625
- sentences: 'text@2',
21626
- subtitle: 'text',
21627
- table: 'table-heading, table-thead, table-tbody, table-tfoot',
21628
- 'table-heading': 'chip, text',
21629
- 'table-thead': 'heading@6',
21630
- 'table-tbody': 'table-row-divider@6',
21631
- 'table-row-divider': 'table-row, divider',
21632
- 'table-row': 'text@6',
21633
- 'table-tfoot': 'text@2, avatar@2',
21634
- text: 'text'
21404
+ const firstDay = {
21405
+ '001': 1,
21406
+ AD: 1,
21407
+ AE: 6,
21408
+ AF: 6,
21409
+ AG: 0,
21410
+ AI: 1,
21411
+ AL: 1,
21412
+ AM: 1,
21413
+ AN: 1,
21414
+ AR: 1,
21415
+ AS: 0,
21416
+ AT: 1,
21417
+ AU: 1,
21418
+ AX: 1,
21419
+ AZ: 1,
21420
+ BA: 1,
21421
+ BD: 0,
21422
+ BE: 1,
21423
+ BG: 1,
21424
+ BH: 6,
21425
+ BM: 1,
21426
+ BN: 1,
21427
+ BR: 0,
21428
+ BS: 0,
21429
+ BT: 0,
21430
+ BW: 0,
21431
+ BY: 1,
21432
+ BZ: 0,
21433
+ CA: 0,
21434
+ CH: 1,
21435
+ CL: 1,
21436
+ CM: 1,
21437
+ CN: 1,
21438
+ CO: 0,
21439
+ CR: 1,
21440
+ CY: 1,
21441
+ CZ: 1,
21442
+ DE: 1,
21443
+ DJ: 6,
21444
+ DK: 1,
21445
+ DM: 0,
21446
+ DO: 0,
21447
+ DZ: 6,
21448
+ EC: 1,
21449
+ EE: 1,
21450
+ EG: 6,
21451
+ ES: 1,
21452
+ ET: 0,
21453
+ FI: 1,
21454
+ FJ: 1,
21455
+ FO: 1,
21456
+ FR: 1,
21457
+ GB: 1,
21458
+ 'GB-alt-variant': 0,
21459
+ GE: 1,
21460
+ GF: 1,
21461
+ GP: 1,
21462
+ GR: 1,
21463
+ GT: 0,
21464
+ GU: 0,
21465
+ HK: 0,
21466
+ HN: 0,
21467
+ HR: 1,
21468
+ HU: 1,
21469
+ ID: 0,
21470
+ IE: 1,
21471
+ IL: 0,
21472
+ IN: 0,
21473
+ IQ: 6,
21474
+ IR: 6,
21475
+ IS: 1,
21476
+ IT: 1,
21477
+ JM: 0,
21478
+ JO: 6,
21479
+ JP: 0,
21480
+ KE: 0,
21481
+ KG: 1,
21482
+ KH: 0,
21483
+ KR: 0,
21484
+ KW: 6,
21485
+ KZ: 1,
21486
+ LA: 0,
21487
+ LB: 1,
21488
+ LI: 1,
21489
+ LK: 1,
21490
+ LT: 1,
21491
+ LU: 1,
21492
+ LV: 1,
21493
+ LY: 6,
21494
+ MC: 1,
21495
+ MD: 1,
21496
+ ME: 1,
21497
+ MH: 0,
21498
+ MK: 1,
21499
+ MM: 0,
21500
+ MN: 1,
21501
+ MO: 0,
21502
+ MQ: 1,
21503
+ MT: 0,
21504
+ MV: 5,
21505
+ MX: 0,
21506
+ MY: 1,
21507
+ MZ: 0,
21508
+ NI: 0,
21509
+ NL: 1,
21510
+ NO: 1,
21511
+ NP: 0,
21512
+ NZ: 1,
21513
+ OM: 6,
21514
+ PA: 0,
21515
+ PE: 0,
21516
+ PH: 0,
21517
+ PK: 0,
21518
+ PL: 1,
21519
+ PR: 0,
21520
+ PT: 0,
21521
+ PY: 0,
21522
+ QA: 6,
21523
+ RE: 1,
21524
+ RO: 1,
21525
+ RS: 1,
21526
+ RU: 1,
21527
+ SA: 0,
21528
+ SD: 6,
21529
+ SE: 1,
21530
+ SG: 0,
21531
+ SI: 1,
21532
+ SK: 1,
21533
+ SM: 1,
21534
+ SV: 0,
21535
+ SY: 6,
21536
+ TH: 0,
21537
+ TJ: 1,
21538
+ TM: 1,
21539
+ TR: 1,
21540
+ TT: 0,
21541
+ TW: 0,
21542
+ UA: 1,
21543
+ UM: 0,
21544
+ US: 0,
21545
+ UY: 1,
21546
+ UZ: 1,
21547
+ VA: 1,
21548
+ VE: 0,
21549
+ VI: 0,
21550
+ VN: 1,
21551
+ WS: 0,
21552
+ XK: 1,
21553
+ YE: 0,
21554
+ ZA: 0,
21555
+ ZW: 0
21635
21556
  };
21636
- function genBone(type) {
21637
- let children = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
21638
- return vue.createVNode("div", {
21639
- "class": ['v-skeleton-loader__bone', `v-skeleton-loader__${type}`]
21640
- }, [children]);
21641
- }
21642
- function genBones(bone) {
21643
- // e.g. 'text@3'
21644
- const [type, length] = bone.split('@');
21645
-
21646
- // Generate a length array based upon
21647
- // value after @ in the bone string
21648
- return Array.from({
21649
- length
21650
- }).map(() => genStructure(type));
21651
- }
21652
- function genStructure(type) {
21653
- let children = [];
21654
- if (!type) return children;
21557
+ function getWeekArray(date, locale) {
21558
+ const weeks = [];
21559
+ let currentWeek = [];
21560
+ const firstDayOfMonth = startOfMonth(date);
21561
+ const lastDayOfMonth = endOfMonth(date);
21562
+ const firstDayWeekIndex = firstDayOfMonth.getDay() - firstDay[locale.slice(-2).toUpperCase()];
21563
+ const lastDayWeekIndex = lastDayOfMonth.getDay() - firstDay[locale.slice(-2).toUpperCase()];
21564
+ for (let i = 0; i < firstDayWeekIndex; i++) {
21565
+ const adjacentDay = new Date(firstDayOfMonth);
21566
+ adjacentDay.setDate(adjacentDay.getDate() - (firstDayWeekIndex - i));
21567
+ currentWeek.push(adjacentDay);
21568
+ }
21569
+ for (let i = 1; i <= lastDayOfMonth.getDate(); i++) {
21570
+ const day = new Date(date.getFullYear(), date.getMonth(), i);
21655
21571
 
21656
- // TODO: figure out a better way to type this
21657
- const bone = rootTypes[type];
21572
+ // Add the day to the current week
21573
+ currentWeek.push(day);
21658
21574
 
21659
- // End of recursion, do nothing
21660
- /* eslint-disable-next-line no-empty, brace-style */
21661
- if (type === bone) ;
21662
- // Array of values - e.g. 'heading, paragraph, text@2'
21663
- else if (type.includes(',')) return mapBones(type);
21664
- // Array of values - e.g. 'paragraph@4'
21665
- else if (type.includes('@')) return genBones(type);
21666
- // Array of values - e.g. 'card@2'
21667
- else if (bone.includes(',')) children = mapBones(bone);
21668
- // Array of values - e.g. 'list-item@2'
21669
- else if (bone.includes('@')) children = genBones(bone);
21670
- // Single value - e.g. 'card-heading'
21671
- else if (bone) children.push(genStructure(bone));
21672
- return [genBone(type, children)];
21575
+ // If the current week has 7 days, add it to the weeks array and start a new week
21576
+ if (currentWeek.length === 7) {
21577
+ weeks.push(currentWeek);
21578
+ currentWeek = [];
21579
+ }
21580
+ }
21581
+ for (let i = 1; i < 7 - lastDayWeekIndex; i++) {
21582
+ const adjacentDay = new Date(lastDayOfMonth);
21583
+ adjacentDay.setDate(adjacentDay.getDate() + i);
21584
+ currentWeek.push(adjacentDay);
21585
+ }
21586
+ weeks.push(currentWeek);
21587
+ return weeks;
21673
21588
  }
21674
- function mapBones(bones) {
21675
- // Remove spaces and return array of structures
21676
- return bones.replace(/\s/g, '').split(',').map(genStructure);
21589
+ function startOfMonth(date) {
21590
+ return new Date(date.getFullYear(), date.getMonth(), 1);
21677
21591
  }
21678
- const makeVSkeletonLoaderProps = propsFactory({
21679
- boilerplate: Boolean,
21680
- color: String,
21681
- loading: Boolean,
21682
- loadingText: {
21683
- type: String,
21684
- default: '$vuetify.loading'
21685
- },
21686
- type: {
21687
- type: [String, Array],
21688
- default: 'image'
21689
- },
21690
- ...makeDimensionProps(),
21691
- ...makeElevationProps(),
21692
- ...makeThemeProps()
21693
- }, 'VSkeletonLoader');
21694
- const VSkeletonLoader = genericComponent()({
21695
- name: 'VSkeletonLoader',
21696
- props: makeVSkeletonLoaderProps(),
21697
- setup(props, _ref) {
21698
- let {
21699
- slots
21700
- } = _ref;
21701
- const {
21702
- backgroundColorClasses,
21703
- backgroundColorStyles
21704
- } = useBackgroundColor(vue.toRef(props, 'color'));
21705
- const {
21706
- dimensionStyles
21707
- } = useDimension(props);
21708
- const {
21709
- elevationClasses
21710
- } = useElevation(props);
21711
- const {
21712
- themeClasses
21713
- } = provideTheme(props);
21714
- const {
21715
- t
21716
- } = useLocale();
21717
- const items = vue.computed(() => genStructure(wrapInArray(props.type).join(',')));
21718
- useRender(() => {
21719
- const isLoading = !slots.default || props.loading;
21720
- return vue.createVNode("div", {
21721
- "class": ['v-skeleton-loader', {
21722
- 'v-skeleton-loader--boilerplate': props.boilerplate
21723
- }, themeClasses.value, backgroundColorClasses.value, elevationClasses.value],
21724
- "style": [backgroundColorStyles.value, isLoading ? dimensionStyles.value : {}],
21725
- "aria-busy": !props.boilerplate ? isLoading : undefined,
21726
- "aria-live": !props.boilerplate ? 'polite' : undefined,
21727
- "aria-label": !props.boilerplate ? t(props.loadingText) : undefined,
21728
- "role": !props.boilerplate ? 'alert' : undefined
21729
- }, [isLoading ? items.value : slots.default?.()]);
21730
- });
21731
- return {};
21732
- }
21733
- });
21734
-
21735
- var components = /*#__PURE__*/Object.freeze({
21736
- __proto__: null,
21737
- VAlert: VAlert,
21738
- VAlertTitle: VAlertTitle,
21739
- VApp: VApp,
21740
- VAppBar: VAppBar,
21741
- VAppBarNavIcon: VAppBarNavIcon,
21742
- VAppBarTitle: VAppBarTitle,
21743
- VAutocomplete: VAutocomplete,
21744
- VAvatar: VAvatar,
21745
- VBadge: VBadge,
21746
- VBanner: VBanner,
21747
- VBannerActions: VBannerActions,
21748
- VBannerText: VBannerText,
21749
- VBottomNavigation: VBottomNavigation,
21750
- VBottomSheet: VBottomSheet,
21751
- VBreadcrumbs: VBreadcrumbs,
21752
- VBreadcrumbsDivider: VBreadcrumbsDivider,
21753
- VBreadcrumbsItem: VBreadcrumbsItem,
21754
- VBtn: VBtn,
21755
- VBtnGroup: VBtnGroup,
21756
- VBtnToggle: VBtnToggle,
21757
- VCard: VCard,
21758
- VCardActions: VCardActions,
21759
- VCardItem: VCardItem,
21760
- VCardSubtitle: VCardSubtitle,
21761
- VCardText: VCardText,
21762
- VCardTitle: VCardTitle,
21763
- VCarousel: VCarousel,
21764
- VCarouselItem: VCarouselItem,
21765
- VCheckbox: VCheckbox,
21766
- VCheckboxBtn: VCheckboxBtn,
21767
- VChip: VChip,
21768
- VChipGroup: VChipGroup,
21769
- VClassIcon: VClassIcon,
21770
- VCode: VCode,
21771
- VCol: VCol,
21772
- VColorPicker: VColorPicker,
21773
- VCombobox: VCombobox,
21774
- VComponentIcon: VComponentIcon,
21775
- VContainer: VContainer,
21776
- VCounter: VCounter,
21777
- VDataIterator: VDataIterator,
21778
- VDataTable: VDataTable,
21779
- VDataTableFooter: VDataTableFooter,
21780
- VDataTableRow: VDataTableRow,
21781
- VDataTableRows: VDataTableRows,
21782
- VDataTableServer: VDataTableServer,
21783
- VDataTableVirtual: VDataTableVirtual,
21784
- VDefaultsProvider: VDefaultsProvider,
21785
- VDialog: VDialog,
21786
- VDialogBottomTransition: VDialogBottomTransition,
21787
- VDialogTopTransition: VDialogTopTransition,
21788
- VDialogTransition: VDialogTransition,
21789
- VDivider: VDivider,
21790
- VExpandTransition: VExpandTransition,
21791
- VExpandXTransition: VExpandXTransition,
21792
- VExpansionPanel: VExpansionPanel,
21793
- VExpansionPanelText: VExpansionPanelText,
21794
- VExpansionPanelTitle: VExpansionPanelTitle,
21795
- VExpansionPanels: VExpansionPanels,
21796
- VFabTransition: VFabTransition,
21797
- VFadeTransition: VFadeTransition,
21798
- VField: VField,
21799
- VFieldLabel: VFieldLabel,
21800
- VFileInput: VFileInput,
21801
- VFooter: VFooter,
21802
- VForm: VForm,
21803
- VHover: VHover,
21804
- VIcon: VIcon,
21805
- VImg: VImg,
21806
- VInfiniteScroll: VInfiniteScroll,
21807
- VInput: VInput,
21808
- VItem: VItem,
21809
- VItemGroup: VItemGroup,
21810
- VKbd: VKbd,
21811
- VLabel: VLabel,
21812
- VLayout: VLayout,
21813
- VLayoutItem: VLayoutItem,
21814
- VLazy: VLazy,
21815
- VLigatureIcon: VLigatureIcon,
21816
- VList: VList,
21817
- VListGroup: VListGroup,
21818
- VListImg: VListImg,
21819
- VListItem: VListItem,
21820
- VListItemAction: VListItemAction,
21821
- VListItemMedia: VListItemMedia,
21822
- VListItemSubtitle: VListItemSubtitle,
21823
- VListItemTitle: VListItemTitle,
21824
- VListSubheader: VListSubheader,
21825
- VLocaleProvider: VLocaleProvider,
21826
- VMain: VMain,
21827
- VMenu: VMenu,
21828
- VMessages: VMessages,
21829
- VNavigationDrawer: VNavigationDrawer,
21830
- VNoSsr: VNoSsr,
21831
- VOverlay: VOverlay,
21832
- VPagination: VPagination,
21833
- VParallax: VParallax,
21834
- VProgressCircular: VProgressCircular,
21835
- VProgressLinear: VProgressLinear,
21836
- VRadio: VRadio,
21837
- VRadioGroup: VRadioGroup,
21838
- VRangeSlider: VRangeSlider,
21839
- VRating: VRating,
21840
- VResponsive: VResponsive,
21841
- VRow: VRow,
21842
- VScaleTransition: VScaleTransition,
21843
- VScrollXReverseTransition: VScrollXReverseTransition,
21844
- VScrollXTransition: VScrollXTransition,
21845
- VScrollYReverseTransition: VScrollYReverseTransition,
21846
- VScrollYTransition: VScrollYTransition,
21847
- VSelect: VSelect,
21848
- VSelectionControl: VSelectionControl,
21849
- VSelectionControlGroup: VSelectionControlGroup,
21850
- VSheet: VSheet,
21851
- VSkeletonLoader: VSkeletonLoader,
21852
- VSlideGroup: VSlideGroup,
21853
- VSlideGroupItem: VSlideGroupItem,
21854
- VSlideXReverseTransition: VSlideXReverseTransition,
21855
- VSlideXTransition: VSlideXTransition,
21856
- VSlideYReverseTransition: VSlideYReverseTransition,
21857
- VSlideYTransition: VSlideYTransition,
21858
- VSlider: VSlider,
21859
- VSnackbar: VSnackbar,
21860
- VSpacer: VSpacer,
21861
- VSvgIcon: VSvgIcon,
21862
- VSwitch: VSwitch,
21863
- VSystemBar: VSystemBar,
21864
- VTab: VTab,
21865
- VTable: VTable,
21866
- VTabs: VTabs,
21867
- VTextField: VTextField,
21868
- VTextarea: VTextarea,
21869
- VThemeProvider: VThemeProvider,
21870
- VTimeline: VTimeline,
21871
- VTimelineItem: VTimelineItem,
21872
- VToolbar: VToolbar,
21873
- VToolbarItems: VToolbarItems,
21874
- VToolbarTitle: VToolbarTitle,
21875
- VTooltip: VTooltip,
21876
- VValidation: VValidation,
21877
- VVirtualScroll: VVirtualScroll,
21878
- VWindow: VWindow,
21879
- VWindowItem: VWindowItem
21880
- });
21881
-
21882
- // Types
21883
-
21884
- function mounted$2(el, binding) {
21885
- const modifiers = binding.modifiers || {};
21886
- const value = binding.value;
21887
- const {
21888
- once,
21889
- immediate,
21890
- ...modifierKeys
21891
- } = modifiers;
21892
- const defaultValue = !Object.keys(modifierKeys).length;
21893
- const {
21894
- handler,
21895
- options
21896
- } = typeof value === 'object' ? value : {
21897
- handler: value,
21898
- options: {
21899
- attributes: modifierKeys?.attr ?? defaultValue,
21900
- characterData: modifierKeys?.char ?? defaultValue,
21901
- childList: modifierKeys?.child ?? defaultValue,
21902
- subtree: modifierKeys?.sub ?? defaultValue
21903
- }
21904
- };
21905
- const observer = new MutationObserver(function () {
21906
- let mutations = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
21907
- let observer = arguments.length > 1 ? arguments[1] : undefined;
21908
- handler?.(mutations, observer);
21909
- if (once) unmounted$2(el, binding);
21910
- });
21911
- if (immediate) handler?.([], observer);
21912
- el._mutate = Object(el._mutate);
21913
- el._mutate[binding.instance.$.uid] = {
21914
- observer
21915
- };
21916
- observer.observe(el, options);
21917
- }
21918
- function unmounted$2(el, binding) {
21919
- if (!el._mutate?.[binding.instance.$.uid]) return;
21920
- el._mutate[binding.instance.$.uid].observer.disconnect();
21921
- delete el._mutate[binding.instance.$.uid];
21592
+ function endOfMonth(date) {
21593
+ return new Date(date.getFullYear(), date.getMonth() + 1, 0);
21922
21594
  }
21923
- const Mutate = {
21924
- mounted: mounted$2,
21925
- unmounted: unmounted$2
21926
- };
21927
-
21928
- // Types
21929
-
21930
- function mounted$1(el, binding) {
21931
- const handler = binding.value;
21932
- const options = {
21933
- passive: !binding.modifiers?.active
21934
- };
21935
- window.addEventListener('resize', handler, options);
21936
- el._onResize = Object(el._onResize);
21937
- el._onResize[binding.instance.$.uid] = {
21938
- handler,
21939
- options
21940
- };
21941
- if (!binding.modifiers?.quiet) {
21942
- handler();
21595
+ function date(value) {
21596
+ if (value == null) return new Date();
21597
+ if (value instanceof Date) return value;
21598
+ if (typeof value === 'string') {
21599
+ const parsed = Date.parse(value);
21600
+ if (!isNaN(parsed)) return new Date(parsed);
21943
21601
  }
21602
+ return null;
21944
21603
  }
21945
- function unmounted$1(el, binding) {
21946
- if (!el._onResize?.[binding.instance.$.uid]) return;
21947
- const {
21948
- handler,
21949
- options
21950
- } = el._onResize[binding.instance.$.uid];
21951
- window.removeEventListener('resize', handler, options);
21952
- delete el._onResize[binding.instance.$.uid];
21953
- }
21954
- const Resize = {
21955
- mounted: mounted$1,
21956
- unmounted: unmounted$1
21957
- };
21958
-
21959
- // Types
21960
-
21961
- function mounted(el, binding) {
21962
- const {
21963
- self = false
21964
- } = binding.modifiers ?? {};
21965
- const value = binding.value;
21966
- const options = typeof value === 'object' && value.options || {
21967
- passive: true
21968
- };
21969
- const handler = typeof value === 'function' || 'handleEvent' in value ? value : value.handler;
21970
- const target = self ? el : binding.arg ? document.querySelector(binding.arg) : window;
21971
- if (!target) return;
21972
- target.addEventListener('scroll', handler, options);
21973
- el._onScroll = Object(el._onScroll);
21974
- el._onScroll[binding.instance.$.uid] = {
21975
- handler,
21976
- options,
21977
- // Don't reference self
21978
- target: self ? undefined : target
21979
- };
21980
- }
21981
- function unmounted(el, binding) {
21982
- if (!el._onScroll?.[binding.instance.$.uid]) return;
21983
- const {
21984
- handler,
21985
- options,
21986
- target = el
21987
- } = el._onScroll[binding.instance.$.uid];
21988
- target.removeEventListener('scroll', handler, options);
21989
- delete el._onScroll[binding.instance.$.uid];
21990
- }
21991
- function updated(el, binding) {
21992
- if (binding.value === binding.oldValue) return;
21993
- unmounted(el, binding);
21994
- mounted(el, binding);
21995
- }
21996
- const Scroll = {
21997
- mounted,
21998
- unmounted,
21999
- updated
22000
- };
22001
-
22002
- var directives = /*#__PURE__*/Object.freeze({
22003
- __proto__: null,
22004
- ClickOutside: ClickOutside,
22005
- Intersect: Intersect,
22006
- Mutate: Mutate,
22007
- Resize: Resize,
22008
- Ripple: Ripple,
22009
- Scroll: Scroll,
22010
- Touch: Touch
22011
- });
22012
-
22013
- // Utilities
22014
-
22015
- // Types
22016
-
22017
- function getWeekArray(date) {
22018
- let currentWeek = [];
22019
- const weeks = [];
22020
- const firstDayOfMonth = startOfMonth(date);
22021
- const lastDayOfMonth = endOfMonth(date);
22022
- for (let i = 0; i < firstDayOfMonth.getDay(); i++) {
22023
- currentWeek.push(null);
22024
- }
22025
- for (let i = 1; i <= lastDayOfMonth.getDate(); i++) {
22026
- const day = new Date(date.getFullYear(), date.getMonth(), i);
22027
-
22028
- // Add the day to the current week
22029
- currentWeek.push(day);
22030
-
22031
- // If the current week has 7 days, add it to the weeks array and start a new week
22032
- if (currentWeek.length === 7) {
22033
- weeks.push(currentWeek);
22034
- currentWeek = [];
22035
- }
22036
- }
22037
- for (let i = currentWeek.length; i < 7; i++) {
22038
- currentWeek.push(null);
22039
- }
22040
- weeks.push(currentWeek);
22041
- return weeks;
22042
- }
22043
- function startOfMonth(date) {
22044
- return new Date(date.getFullYear(), date.getMonth(), 1);
22045
- }
22046
- function endOfMonth(date) {
22047
- return new Date(date.getFullYear(), date.getMonth() + 1, 0);
22048
- }
22049
- function date(value) {
22050
- if (value == null) return null;
22051
- if (value instanceof Date) return value;
22052
- if (typeof value === 'string') {
22053
- const parsed = Date.parse(value);
22054
- if (!isNaN(parsed)) return new Date(parsed);
22055
- }
22056
- return null;
22057
- }
22058
- const firstDay = {
22059
- '001': 1,
22060
- AD: 1,
22061
- AE: 6,
22062
- AF: 6,
22063
- AG: 0,
22064
- AI: 1,
22065
- AL: 1,
22066
- AM: 1,
22067
- AN: 1,
22068
- AR: 1,
22069
- AS: 0,
22070
- AT: 1,
22071
- AU: 0,
22072
- AX: 1,
22073
- AZ: 1,
22074
- BA: 1,
22075
- BD: 0,
22076
- BE: 1,
22077
- BG: 1,
22078
- BH: 6,
22079
- BM: 1,
22080
- BN: 1,
22081
- BR: 0,
22082
- BS: 0,
22083
- BT: 0,
22084
- BW: 0,
22085
- BY: 1,
22086
- BZ: 0,
22087
- CA: 0,
22088
- CH: 1,
22089
- CL: 1,
22090
- CM: 1,
22091
- CN: 0,
22092
- CO: 0,
22093
- CR: 1,
22094
- CY: 1,
22095
- CZ: 1,
22096
- DE: 1,
22097
- DJ: 6,
22098
- DK: 1,
22099
- DM: 0,
22100
- DO: 0,
22101
- DZ: 6,
22102
- EC: 1,
22103
- EE: 1,
22104
- EG: 6,
22105
- ES: 1,
22106
- ET: 0,
22107
- FI: 1,
22108
- FJ: 1,
22109
- FO: 1,
22110
- FR: 1,
22111
- GB: 1,
22112
- 'GB-alt-variant': 0,
22113
- GE: 1,
22114
- GF: 1,
22115
- GP: 1,
22116
- GR: 1,
22117
- GT: 0,
22118
- GU: 0,
22119
- HK: 0,
22120
- HN: 0,
22121
- HR: 1,
22122
- HU: 1,
22123
- ID: 0,
22124
- IE: 1,
22125
- IL: 0,
22126
- IN: 0,
22127
- IQ: 6,
22128
- IR: 6,
22129
- IS: 1,
22130
- IT: 1,
22131
- JM: 0,
22132
- JO: 6,
22133
- JP: 0,
22134
- KE: 0,
22135
- KG: 1,
22136
- KH: 0,
22137
- KR: 0,
22138
- KW: 6,
22139
- KZ: 1,
22140
- LA: 0,
22141
- LB: 1,
22142
- LI: 1,
22143
- LK: 1,
22144
- LT: 1,
22145
- LU: 1,
22146
- LV: 1,
22147
- LY: 6,
22148
- MC: 1,
22149
- MD: 1,
22150
- ME: 1,
22151
- MH: 0,
22152
- MK: 1,
22153
- MM: 0,
22154
- MN: 1,
22155
- MO: 0,
22156
- MQ: 1,
22157
- MT: 0,
22158
- MV: 5,
22159
- MX: 0,
22160
- MY: 1,
22161
- MZ: 0,
22162
- NI: 0,
22163
- NL: 1,
22164
- NO: 1,
22165
- NP: 0,
22166
- NZ: 1,
22167
- OM: 6,
22168
- PA: 0,
22169
- PE: 0,
22170
- PH: 0,
22171
- PK: 0,
22172
- PL: 1,
22173
- PR: 0,
22174
- PT: 0,
22175
- PY: 0,
22176
- QA: 6,
22177
- RE: 1,
22178
- RO: 1,
22179
- RS: 1,
22180
- RU: 1,
22181
- SA: 0,
22182
- SD: 6,
22183
- SE: 1,
22184
- SG: 0,
22185
- SI: 1,
22186
- SK: 1,
22187
- SM: 1,
22188
- SV: 0,
22189
- SY: 6,
22190
- TH: 0,
22191
- TJ: 1,
22192
- TM: 1,
22193
- TR: 1,
22194
- TT: 0,
22195
- TW: 0,
22196
- UA: 1,
22197
- UM: 0,
22198
- US: 0,
22199
- UY: 1,
22200
- UZ: 1,
22201
- VA: 1,
22202
- VE: 0,
22203
- VI: 0,
22204
- VN: 1,
22205
- WS: 0,
22206
- XK: 1,
22207
- YE: 0,
22208
- ZA: 0,
22209
- ZW: 0
22210
- };
22211
- const sundayJanuarySecond2000 = new Date(2000, 0, 2);
22212
- function getWeekdays(locale) {
22213
- const daysFromSunday = firstDay[locale.slice(-2).toUpperCase()];
22214
- return createRange(7).map(i => {
22215
- const weekday = new Date(sundayJanuarySecond2000);
22216
- weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i);
22217
- return new Intl.DateTimeFormat(locale, {
22218
- weekday: 'long'
22219
- }).format(weekday);
22220
- });
21604
+ const sundayJanuarySecond2000 = new Date(2000, 0, 2);
21605
+ function getWeekdays(locale) {
21606
+ const daysFromSunday = firstDay[locale.slice(-2).toUpperCase()];
21607
+ return createRange(7).map(i => {
21608
+ const weekday = new Date(sundayJanuarySecond2000);
21609
+ weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i);
21610
+ return new Intl.DateTimeFormat(locale, {
21611
+ weekday: 'short'
21612
+ }).format(weekday);
21613
+ });
22221
21614
  }
22222
21615
  function format(value, formatString, locale) {
22223
21616
  const date = new Date(value);
@@ -22235,8 +21628,7 @@
22235
21628
  options = {
22236
21629
  weekday: 'short',
22237
21630
  day: 'numeric',
22238
- month: 'short',
22239
- year: 'numeric'
21631
+ month: 'short'
22240
21632
  };
22241
21633
  break;
22242
21634
  case 'keyboardDate':
@@ -22254,6 +21646,11 @@
22254
21646
  year: 'numeric'
22255
21647
  };
22256
21648
  break;
21649
+ case 'dayOfMonth':
21650
+ options = {
21651
+ day: 'numeric'
21652
+ };
21653
+ break;
22257
21654
  default:
22258
21655
  options = {
22259
21656
  timeZone: 'UTC',
@@ -22278,149 +21675,1668 @@
22278
21675
  function getMonth(date) {
22279
21676
  return date.getMonth();
22280
21677
  }
22281
- function startOfYear(date) {
22282
- return new Date(date.getFullYear(), 0, 1);
21678
+ function startOfYear(date) {
21679
+ return new Date(date.getFullYear(), 0, 1);
21680
+ }
21681
+ function endOfYear(date) {
21682
+ return new Date(date.getFullYear(), 11, 31);
21683
+ }
21684
+ function isWithinRange(date, range) {
21685
+ return isAfter(date, range[0]) && isBefore(date, range[1]);
21686
+ }
21687
+ function isValid(date) {
21688
+ const d = new Date(date);
21689
+ return d instanceof Date && !isNaN(d.getTime());
21690
+ }
21691
+ function isAfter(date, comparing) {
21692
+ return date.getTime() > comparing.getTime();
21693
+ }
21694
+ function isBefore(date, comparing) {
21695
+ return date.getTime() < comparing.getTime();
21696
+ }
21697
+ function isEqual(date, comparing) {
21698
+ return date.getTime() === comparing.getTime();
21699
+ }
21700
+ function isSameDay(date, comparing) {
21701
+ return date.getDate() === comparing.getDate() && date.getMonth() === comparing.getMonth() && date.getFullYear() === comparing.getFullYear();
21702
+ }
21703
+ function isSameMonth(date, comparing) {
21704
+ return date.getMonth() === comparing.getMonth() && date.getFullYear() === comparing.getFullYear();
21705
+ }
21706
+ function getDiff(date, comparing, unit) {
21707
+ const d = new Date(date);
21708
+ const c = new Date(comparing);
21709
+ if (unit === 'month') {
21710
+ return d.getMonth() - c.getMonth() + (d.getFullYear() - c.getFullYear()) * 12;
21711
+ }
21712
+ return Math.floor((d.getTime() - c.getTime()) / (1000 * 60 * 60 * 24));
21713
+ }
21714
+ function setYear(date, year) {
21715
+ const d = new Date(date);
21716
+ d.setFullYear(year);
21717
+ return d;
21718
+ }
21719
+ class VuetifyDateAdapter {
21720
+ constructor(options) {
21721
+ this.locale = options.locale;
21722
+ }
21723
+ date(value) {
21724
+ return date(value);
21725
+ }
21726
+ toJsDate(date) {
21727
+ return date;
21728
+ }
21729
+ addDays(date, amount) {
21730
+ return addDays(date, amount);
21731
+ }
21732
+ addMonths(date, amount) {
21733
+ return addMonths(date, amount);
21734
+ }
21735
+ getWeekArray(date) {
21736
+ return getWeekArray(date, this.locale);
21737
+ }
21738
+ startOfMonth(date) {
21739
+ return startOfMonth(date);
21740
+ }
21741
+ endOfMonth(date) {
21742
+ return endOfMonth(date);
21743
+ }
21744
+ format(date, formatString) {
21745
+ return format(date, formatString, this.locale);
21746
+ }
21747
+ isEqual(date, comparing) {
21748
+ return isEqual(date, comparing);
21749
+ }
21750
+ isValid(date) {
21751
+ return isValid(date);
21752
+ }
21753
+ isWithinRange(date, range) {
21754
+ return isWithinRange(date, range);
21755
+ }
21756
+ isAfter(date, comparing) {
21757
+ return isAfter(date, comparing);
21758
+ }
21759
+ isBefore(date, comparing) {
21760
+ return !isAfter(date, comparing) && !isEqual(date, comparing);
21761
+ }
21762
+ isSameDay(date, comparing) {
21763
+ return isSameDay(date, comparing);
21764
+ }
21765
+ isSameMonth(date, comparing) {
21766
+ return isSameMonth(date, comparing);
21767
+ }
21768
+ setYear(date, year) {
21769
+ return setYear(date, year);
21770
+ }
21771
+ getDiff(date, comparing, unit) {
21772
+ return getDiff(date, comparing, unit);
21773
+ }
21774
+ getWeekdays() {
21775
+ return getWeekdays(this.locale);
21776
+ }
21777
+ getYear(date) {
21778
+ return getYear(date);
21779
+ }
21780
+ getMonth(date) {
21781
+ return getMonth(date);
21782
+ }
21783
+ startOfYear(date) {
21784
+ return startOfYear(date);
21785
+ }
21786
+ endOfYear(date) {
21787
+ return endOfYear(date);
21788
+ }
21789
+ }
21790
+
21791
+ // Composables
21792
+
21793
+ // Types
21794
+
21795
+ const DateAdapterSymbol = Symbol.for('vuetify:date-adapter');
21796
+ function createDate(options) {
21797
+ return mergeDeep({
21798
+ adapter: VuetifyDateAdapter,
21799
+ locale: {
21800
+ af: 'af-ZA',
21801
+ // ar: '', # not the same value for all variants
21802
+ bg: 'bg-BG',
21803
+ ca: 'ca-ES',
21804
+ ckb: '',
21805
+ cs: '',
21806
+ de: 'de-DE',
21807
+ el: 'el-GR',
21808
+ en: 'en-US',
21809
+ // es: '', # not the same value for all variants
21810
+ et: 'et-EE',
21811
+ fa: 'fa-IR',
21812
+ fi: 'fi-FI',
21813
+ // fr: '', #not the same value for all variants
21814
+ hr: 'hr-HR',
21815
+ hu: 'hu-HU',
21816
+ he: 'he-IL',
21817
+ id: 'id-ID',
21818
+ it: 'it-IT',
21819
+ ja: 'ja-JP',
21820
+ ko: 'ko-KR',
21821
+ lv: 'lv-LV',
21822
+ lt: 'lt-LT',
21823
+ nl: 'nl-NL',
21824
+ no: 'nn-NO',
21825
+ pl: 'pl-PL',
21826
+ pt: 'pt-PT',
21827
+ ro: 'ro-RO',
21828
+ ru: 'ru-RU',
21829
+ sk: 'sk-SK',
21830
+ sl: 'sl-SI',
21831
+ srCyrl: 'sr-SP',
21832
+ srLatn: 'sr-SP',
21833
+ sv: 'sv-SE',
21834
+ th: 'th-TH',
21835
+ tr: 'tr-TR',
21836
+ az: 'az-AZ',
21837
+ uk: 'uk-UA',
21838
+ vi: 'vi-VN',
21839
+ zhHans: 'zh-CN',
21840
+ zhHant: 'zh-TW'
21841
+ }
21842
+ }, options);
21843
+ }
21844
+ function useDate() {
21845
+ const date = vue.inject(DateAdapterSymbol);
21846
+ const locale = useLocale();
21847
+ if (!date) throw new Error('[Vuetify] Could not find injected date');
21848
+ const instance = typeof date.adapter === 'function'
21849
+ // eslint-disable-next-line new-cap
21850
+ ? new date.adapter({
21851
+ locale: date.locale?.[locale.current.value] ?? locale.current.value
21852
+ }) : date.adapter;
21853
+ vue.watch(locale.current, value => {
21854
+ const newLocale = date.locale ? date.locale[value] : value;
21855
+ instance.locale = newLocale ?? instance.locale;
21856
+ });
21857
+ return instance;
21858
+ }
21859
+ function toIso(adapter, value) {
21860
+ const date = adapter.toJsDate(value);
21861
+ return `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`;
21862
+ }
21863
+ function getMondayOfFirstWeekOfYear(year) {
21864
+ return new Date(year, 0, 1);
21865
+ }
21866
+
21867
+ // https://stackoverflow.com/questions/274861/how-do-i-calculate-the-week-number-given-a-date/275024#275024
21868
+ function getWeek(adapter, value) {
21869
+ const date = adapter.toJsDate(value);
21870
+ let year = date.getFullYear();
21871
+ let d1w1 = getMondayOfFirstWeekOfYear(year);
21872
+ if (date < d1w1) {
21873
+ year = year - 1;
21874
+ d1w1 = getMondayOfFirstWeekOfYear(year);
21875
+ } else {
21876
+ const tv = getMondayOfFirstWeekOfYear(year + 1);
21877
+ if (date >= tv) {
21878
+ year = year + 1;
21879
+ d1w1 = tv;
21880
+ }
21881
+ }
21882
+ const diffTime = Math.abs(date.getTime() - d1w1.getTime());
21883
+ const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
21884
+ return Math.floor(diffDays / 7) + 1;
21885
+ }
21886
+
21887
+ // Composables
21888
+
21889
+ // Types
21890
+
21891
+ const makeDateProps = propsFactory({
21892
+ modelValue: {
21893
+ type: null,
21894
+ default: () => []
21895
+ },
21896
+ displayDate: {
21897
+ type: null,
21898
+ default: new Date()
21899
+ },
21900
+ inputMode: {
21901
+ type: String,
21902
+ default: 'calendar'
21903
+ },
21904
+ viewMode: {
21905
+ type: String,
21906
+ default: 'month'
21907
+ },
21908
+ format: String
21909
+ }, 'date');
21910
+ const dateEmits = {
21911
+ 'update:modelValue': date => true,
21912
+ 'update:displayDate': date => true,
21913
+ 'update:focused': focused => true,
21914
+ 'update:inputMode': inputMode => true,
21915
+ 'update:viewMode': viewMode => true
21916
+ };
21917
+
21918
+ const makeVDatePickerControlsProps = propsFactory({
21919
+ nextIcon: {
21920
+ type: [String],
21921
+ default: '$next'
21922
+ },
21923
+ prevIcon: {
21924
+ type: [String],
21925
+ default: '$prev'
21926
+ },
21927
+ expandIcon: {
21928
+ type: [String],
21929
+ default: '$expand'
21930
+ },
21931
+ collapseIcon: {
21932
+ type: [String],
21933
+ default: '$collapse'
21934
+ },
21935
+ range: {
21936
+ default: false,
21937
+ type: [String, Boolean],
21938
+ validator: v => v === false || ['start', 'end'].includes(v)
21939
+ },
21940
+ ...omit(makeDateProps(), ['modelValue', 'inputMode'])
21941
+ }, 'VDatePickerControls');
21942
+ const VDatePickerControls = genericComponent()({
21943
+ name: 'VDatePickerControls',
21944
+ props: makeVDatePickerControlsProps(),
21945
+ emits: {
21946
+ ...omit(dateEmits, ['update:modelValue', 'update:inputMode'])
21947
+ },
21948
+ setup(props, _ref) {
21949
+ let {
21950
+ emit
21951
+ } = _ref;
21952
+ const adapter = useDate();
21953
+ const monthAndYear = vue.computed(() => {
21954
+ const month = props.range === 'end' ? adapter.addMonths(props.displayDate, 1) : props.displayDate;
21955
+ return adapter.format(month, 'monthAndYear');
21956
+ });
21957
+ useRender(() => {
21958
+ const prevBtn = vue.createVNode(VBtn, {
21959
+ "variant": "text",
21960
+ "icon": props.prevIcon,
21961
+ "onClick": () => emit('update:displayDate', adapter.addMonths(props.displayDate, -1))
21962
+ }, null);
21963
+ const nextBtn = vue.createVNode(VBtn, {
21964
+ "variant": "text",
21965
+ "icon": props.nextIcon,
21966
+ "onClick": () => emit('update:displayDate', adapter.addMonths(props.displayDate, 1))
21967
+ }, null);
21968
+ return vue.createVNode("div", {
21969
+ "class": "v-date-picker-controls"
21970
+ }, [props.viewMode === 'month' && props.range === 'start' && prevBtn, !!props.range && vue.createVNode(VSpacer, {
21971
+ "key": "range-spacer"
21972
+ }, null), vue.createVNode("div", {
21973
+ "class": "v-date-picker-controls__date"
21974
+ }, [monthAndYear.value]), vue.createVNode(VBtn, {
21975
+ "key": "expand-btn",
21976
+ "variant": "text",
21977
+ "icon": props.viewMode === 'month' ? props.expandIcon : props.collapseIcon,
21978
+ "onClick": () => emit('update:viewMode', props.viewMode === 'month' ? 'year' : 'month')
21979
+ }, null), vue.createVNode(VSpacer, null, null), props.viewMode === 'month' && !props.range && vue.createVNode("div", {
21980
+ "key": "month-buttons"
21981
+ }, [prevBtn, nextBtn]), props.viewMode === 'month' && props.range === 'end' && nextBtn]);
21982
+ });
21983
+ return {};
21984
+ }
21985
+ });
21986
+
21987
+ // Utilities
21988
+
21989
+ // Types
21990
+
21991
+ const DatePickerSymbol = Symbol.for('vuetify:date-picker');
21992
+ function createDatePicker(props) {
21993
+ const hoverDate = vue.ref();
21994
+ const hoverMonth = vue.ref();
21995
+ const isDragging = vue.ref(false);
21996
+ const dragHandle = vue.ref(null);
21997
+ const hasScrolled = vue.ref(false);
21998
+ vue.provide(DatePickerSymbol, {
21999
+ hoverDate,
22000
+ hoverMonth,
22001
+ isDragging,
22002
+ dragHandle,
22003
+ hasScrolled
22004
+ });
22005
+ return {
22006
+ hoverDate,
22007
+ hoverMonth,
22008
+ isDragging,
22009
+ dragHandle,
22010
+ hasScrolled
22011
+ };
22012
+ }
22013
+ function useDatePicker() {
22014
+ const datePicker = vue.inject(DatePickerSymbol);
22015
+ if (!datePicker) throw new Error('foo');
22016
+ return datePicker;
22017
+ }
22018
+
22019
+ const makeVDatePickerMonthProps = propsFactory({
22020
+ color: String,
22021
+ showAdjacentMonths: Boolean,
22022
+ hideWeekdays: Boolean,
22023
+ showWeek: Boolean,
22024
+ range: {
22025
+ default: false,
22026
+ type: [String, Boolean],
22027
+ validator: v => typeof v === 'boolean' || ['start', 'end'].includes(v)
22028
+ },
22029
+ hoverDate: null,
22030
+ multiple: Boolean,
22031
+ side: {
22032
+ type: String
22033
+ },
22034
+ ...omit(makeDateProps(), ['inputMode', 'viewMode'])
22035
+ }, 'VDatePickerMonth');
22036
+ const VDatePickerMonth = genericComponent()({
22037
+ name: 'VDatePickerMonth',
22038
+ props: makeVDatePickerMonthProps({
22039
+ color: 'surface-variant'
22040
+ }),
22041
+ emits: {
22042
+ ...omit(dateEmits, ['update:inputMode', 'update:viewMode']),
22043
+ 'update:hoverDate': date => true
22044
+ },
22045
+ setup(props, _ref) {
22046
+ let {
22047
+ emit,
22048
+ slots
22049
+ } = _ref;
22050
+ const adapter = useDate();
22051
+ const {
22052
+ isDragging,
22053
+ dragHandle,
22054
+ hasScrolled
22055
+ } = useDatePicker();
22056
+ const month = vue.computed(() => props.displayDate);
22057
+ const findClosestDate = (date, dates) => {
22058
+ const {
22059
+ isSameDay,
22060
+ getDiff
22061
+ } = adapter;
22062
+ const [startDate, endDate] = dates;
22063
+ if (isSameDay(startDate, endDate)) {
22064
+ return getDiff(date, startDate, 'days') > 0 ? endDate : startDate;
22065
+ }
22066
+ const distStart = Math.abs(getDiff(date, startDate));
22067
+ const distEnd = Math.abs(getDiff(date, endDate));
22068
+ return distStart < distEnd ? startDate : endDate;
22069
+ };
22070
+
22071
+ // const hoverRange = computed<[any, any] | null>(() => {
22072
+ // if (!props.hoverDate) return null
22073
+
22074
+ // const closestDate = findClosestDate(props.hoverDate, props.modelValue)
22075
+
22076
+ // if (!closestDate) return null
22077
+
22078
+ // return adapter.isAfter(props.hoverDate, closestDate) ? [closestDate, props.hoverDate] : [props.hoverDate, closestDate]
22079
+ // })
22080
+
22081
+ const weeksInMonth = vue.computed(() => {
22082
+ const weeks = adapter.getWeekArray(month.value);
22083
+ const days = weeks.flat();
22084
+
22085
+ // Make sure there's always 6 weeks in month (6 * 7 days)
22086
+ // But only do it if we're not hiding adjacent months?
22087
+ const daysInMonth = 6 * 7;
22088
+ if (days.length < daysInMonth && props.showAdjacentMonths) {
22089
+ const lastDay = days[days.length - 1];
22090
+ let week = [];
22091
+ for (let day = 1; day <= daysInMonth - days.length; day++) {
22092
+ week.push(adapter.addDays(lastDay, day));
22093
+ if (day % 7 === 0) {
22094
+ weeks.push(week);
22095
+ week = [];
22096
+ }
22097
+ }
22098
+ }
22099
+ return weeks;
22100
+ });
22101
+ const daysInMonth = vue.computed(() => {
22102
+ const validDates = props.modelValue.filter(v => !!v);
22103
+ const isRange = validDates.length > 1;
22104
+ const days = weeksInMonth.value.flat();
22105
+ const today = adapter.date();
22106
+ const startDate = validDates[0];
22107
+ const endDate = validDates[1];
22108
+ return days.map((date, index) => {
22109
+ const isStart = startDate && adapter.isSameDay(date, startDate);
22110
+ const isEnd = endDate && adapter.isSameDay(date, endDate);
22111
+ const isAdjacent = !adapter.isSameMonth(date, month.value);
22112
+ const isSame = validDates.length === 2 && adapter.isSameDay(startDate, endDate);
22113
+ return {
22114
+ date,
22115
+ isoDate: toIso(adapter, date),
22116
+ formatted: adapter.format(date, 'keyboardDate'),
22117
+ year: adapter.getYear(date),
22118
+ month: adapter.getMonth(date),
22119
+ isWeekStart: index % 7 === 0,
22120
+ isWeekEnd: index % 7 === 6,
22121
+ isSelected: isStart || isEnd,
22122
+ isStart,
22123
+ isEnd,
22124
+ isToday: adapter.isSameDay(date, today),
22125
+ isAdjacent,
22126
+ isHidden: isAdjacent && !props.showAdjacentMonths,
22127
+ inRange: isRange && !isSame && (isStart || isEnd || validDates.length === 2 && adapter.isWithinRange(date, validDates)),
22128
+ // isHovered: props.hoverDate === date,
22129
+ // inHover: hoverRange.value && isWithinRange(date, hoverRange.value),
22130
+ isHovered: false,
22131
+ inHover: false,
22132
+ localized: adapter.format(date, 'dayOfMonth')
22133
+ };
22134
+ });
22135
+ });
22136
+ const weeks = vue.computed(() => {
22137
+ return weeksInMonth.value.map(week => {
22138
+ return getWeek(adapter, week[0]);
22139
+ });
22140
+ });
22141
+ const {
22142
+ backgroundColorClasses,
22143
+ backgroundColorStyles
22144
+ } = useBackgroundColor(props, 'color');
22145
+ function selectDate(date) {
22146
+ let newModel = props.modelValue.slice();
22147
+ if (props.multiple) {
22148
+ if (isDragging.value && dragHandle.value != null) {
22149
+ const otherIndex = (dragHandle.value + 1) % 2;
22150
+ const fn = otherIndex === 0 ? 'isBefore' : 'isAfter';
22151
+ if (adapter[fn](date, newModel[otherIndex])) {
22152
+ newModel[dragHandle.value] = newModel[otherIndex];
22153
+ newModel[otherIndex] = date;
22154
+ dragHandle.value = otherIndex;
22155
+ } else {
22156
+ newModel[dragHandle.value] = date;
22157
+ }
22158
+ } else {
22159
+ if (newModel.find(d => adapter.isSameDay(d, date))) {
22160
+ newModel = newModel.filter(v => !adapter.isSameDay(v, date));
22161
+ } else if (newModel.length === 2) {
22162
+ let index;
22163
+ if (!props.side || adapter.isSameMonth(newModel[0], newModel[1])) {
22164
+ const closest = findClosestDate(date, newModel);
22165
+ index = newModel.indexOf(closest);
22166
+ } else {
22167
+ index = props.side === 'start' ? 0 : props.side === 'end' ? 1 : undefined;
22168
+ }
22169
+ newModel = newModel.map((v, i) => i === index ? date : v);
22170
+ } else {
22171
+ if (newModel[0] && adapter.isBefore(newModel[0], date)) {
22172
+ newModel = [newModel[0], date];
22173
+ } else {
22174
+ newModel = [date, newModel[0]];
22175
+ }
22176
+ }
22177
+ }
22178
+ } else {
22179
+ newModel = [date];
22180
+ }
22181
+ emit('update:modelValue', newModel.filter(v => !!v));
22182
+ }
22183
+ const daysRef = vue.ref();
22184
+ function findElement(el) {
22185
+ if (!el || el === daysRef.value) return null;
22186
+ if ('vDate' in el.dataset) {
22187
+ return adapter.date(el.dataset.vDate);
22188
+ }
22189
+ return findElement(el.parentElement);
22190
+ }
22191
+ function findDate(e) {
22192
+ const x = 'changedTouches' in e ? e.changedTouches[0]?.clientX : e.clientX;
22193
+ const y = 'changedTouches' in e ? e.changedTouches[0]?.clientY : e.clientY;
22194
+ const el = document.elementFromPoint(x, y);
22195
+ return findElement(el);
22196
+ }
22197
+ let canDrag = false;
22198
+ function handleMousedown(e) {
22199
+ hasScrolled.value = false;
22200
+ const selected = findDate(e);
22201
+ if (!selected) return;
22202
+ const modelIndex = props.modelValue.findIndex(d => adapter.isEqual(d, selected));
22203
+ if (modelIndex >= 0) {
22204
+ canDrag = true;
22205
+ dragHandle.value = modelIndex;
22206
+ window.addEventListener('touchmove', handleTouchmove, {
22207
+ passive: false
22208
+ });
22209
+ window.addEventListener('mousemove', handleTouchmove, {
22210
+ passive: false
22211
+ });
22212
+ e.preventDefault();
22213
+ }
22214
+ window.addEventListener('touchend', handleTouchend, {
22215
+ passive: false
22216
+ });
22217
+ window.addEventListener('mouseup', handleTouchend, {
22218
+ passive: false
22219
+ });
22220
+ }
22221
+ function handleTouchmove(e) {
22222
+ if (!canDrag) return;
22223
+ e.preventDefault();
22224
+ isDragging.value = true;
22225
+ const over = findDate(e);
22226
+ if (!over) return;
22227
+ selectDate(over);
22228
+ }
22229
+ function handleTouchend(e) {
22230
+ if (e.cancelable) e.preventDefault();
22231
+ window.removeEventListener('touchmove', handleTouchmove);
22232
+ window.removeEventListener('mousemove', handleTouchmove);
22233
+ window.removeEventListener('touchend', handleTouchend);
22234
+ window.removeEventListener('mouseup', handleTouchend);
22235
+ const end = findDate(e);
22236
+ if (!end) return;
22237
+ if (!hasScrolled.value) {
22238
+ selectDate(end);
22239
+ }
22240
+ isDragging.value = false;
22241
+ dragHandle.value = null;
22242
+ canDrag = false;
22243
+ }
22244
+ return () => vue.createVNode("div", {
22245
+ "class": "v-date-picker-month"
22246
+ }, [props.showWeek && vue.createVNode("div", {
22247
+ "key": "weeks",
22248
+ "class": "v-date-picker-month__weeks"
22249
+ }, [!props.hideWeekdays && vue.createVNode("div", {
22250
+ "key": "hide-week-days",
22251
+ "class": "v-date-picker-month__day"
22252
+ }, [vue.createTextVNode("\xA0")]), weeks.value.map(week => vue.createVNode("div", {
22253
+ "class": ['v-date-picker-month__day', 'v-date-picker-month__day--adjacent']
22254
+ }, [week]))]), vue.createVNode("div", {
22255
+ "ref": daysRef,
22256
+ "class": "v-date-picker-month__days",
22257
+ "onMousedown": handleMousedown,
22258
+ "onTouchstart": handleMousedown
22259
+ }, [!props.hideWeekdays && adapter.getWeekdays().map(weekDay => vue.createVNode("div", {
22260
+ "class": ['v-date-picker-month__day', 'v-date-picker-month__weekday']
22261
+ }, [weekDay.charAt(0)])), daysInMonth.value.map((item, index) => vue.createVNode("div", {
22262
+ "class": ['v-date-picker-month__day', {
22263
+ 'v-date-picker-month__day--selected': item.isSelected,
22264
+ 'v-date-picker-month__day--start': item.isStart,
22265
+ 'v-date-picker-month__day--end': item.isEnd,
22266
+ 'v-date-picker-month__day--adjacent': item.isAdjacent,
22267
+ 'v-date-picker-month__day--hide-adjacent': item.isHidden,
22268
+ 'v-date-picker-month__day--week-start': item.isWeekStart,
22269
+ 'v-date-picker-month__day--week-end': item.isWeekEnd,
22270
+ 'v-date-picker-month__day--hovered': item.isHovered
22271
+ }],
22272
+ "data-v-date": !item.isHidden ? item.isoDate : undefined
22273
+ }, [item.inRange && vue.createVNode("div", {
22274
+ "key": "in-range",
22275
+ "class": ['v-date-picker-month__day--range', backgroundColorClasses.value],
22276
+ "style": backgroundColorStyles.value
22277
+ }, null), item.inHover && !item.isStart && !item.isEnd && !item.isHovered && !item.inRange && vue.createVNode("div", {
22278
+ "key": "in-hover",
22279
+ "class": "v-date-picker-month__day--hover"
22280
+ }, null), (props.showAdjacentMonths || !item.isAdjacent) && vue.createVNode(VBtn, {
22281
+ "icon": true,
22282
+ "ripple": false,
22283
+ "variant": (item.isToday || item.isHovered) && !item.isSelected ? 'outlined' : 'flat',
22284
+ "active": item.isSelected,
22285
+ "color": item.isSelected || item.isToday ? props.color : item.isHovered ? undefined : 'transparent'
22286
+ }, {
22287
+ default: () => [item.localized]
22288
+ })]))])]);
22289
+ }
22290
+ });
22291
+
22292
+ const makeVDatePickerYearsProps = propsFactory({
22293
+ color: String,
22294
+ min: Number,
22295
+ max: Number,
22296
+ height: [String, Number],
22297
+ displayDate: null
22298
+ }, 'VDatePickerYears');
22299
+ const VDatePickerYears = genericComponent()({
22300
+ name: 'VDatePickerYears',
22301
+ props: makeVDatePickerYearsProps(),
22302
+ emits: {
22303
+ 'update:displayDate': date => true,
22304
+ 'update:viewMode': date => true
22305
+ },
22306
+ setup(props, _ref) {
22307
+ let {
22308
+ emit
22309
+ } = _ref;
22310
+ const adapter = useDate();
22311
+ const displayYear = vue.computed(() => adapter.getYear(props.displayDate ?? new Date()));
22312
+ const years = vue.computed(() => {
22313
+ const min = props.min ?? displayYear.value - 50 - 2;
22314
+ const max = props.max ?? displayYear.value + 50;
22315
+ return createRange(max - min, min);
22316
+ });
22317
+ const yearRef = vue.ref();
22318
+ vue.onMounted(() => {
22319
+ yearRef.value?.$el.scrollIntoView({
22320
+ block: 'center'
22321
+ });
22322
+ });
22323
+ useRender(() => vue.createVNode("div", {
22324
+ "class": "v-date-picker-years",
22325
+ "style": {
22326
+ height: convertToUnit(props.height)
22327
+ }
22328
+ }, [vue.createVNode("div", {
22329
+ "class": "v-date-picker-years__content"
22330
+ }, [years.value.map(year => vue.createVNode(VBtn, {
22331
+ "ref": year === displayYear.value ? yearRef : undefined,
22332
+ "variant": year === displayYear.value ? 'flat' : 'text',
22333
+ "rounded": "xl",
22334
+ "active": year === displayYear.value,
22335
+ "color": year === displayYear.value ? props.color : undefined,
22336
+ "onClick": () => {
22337
+ emit('update:displayDate', adapter.setYear(props.displayDate, year));
22338
+ emit('update:viewMode', 'month');
22339
+ }
22340
+ }, {
22341
+ default: () => [year]
22342
+ }))])]));
22343
+ return {};
22344
+ }
22345
+ });
22346
+
22347
+ // Types
22348
+
22349
+ const makeVDateCardProps = propsFactory({
22350
+ cancelText: {
22351
+ type: String,
22352
+ default: '$vuetify.datePicker.cancel'
22353
+ },
22354
+ okText: {
22355
+ type: String,
22356
+ default: '$vuetify.datePicker.ok'
22357
+ },
22358
+ inputMode: {
22359
+ type: String,
22360
+ default: 'calendar'
22361
+ },
22362
+ hideActions: Boolean,
22363
+ ...makeVDatePickerControlsProps(),
22364
+ ...makeVDatePickerMonthProps(),
22365
+ ...makeVDatePickerYearsProps(),
22366
+ ...makeTransitionProps({
22367
+ transition: {
22368
+ component: VFadeTransition,
22369
+ leaveAbsolute: true
22370
+ }
22371
+ })
22372
+ }, 'VDateCard');
22373
+ const VDateCard = genericComponent()({
22374
+ name: 'VDateCard',
22375
+ props: makeVDateCardProps(),
22376
+ emits: {
22377
+ save: () => true,
22378
+ cancel: () => true,
22379
+ 'update:displayDate': value => true,
22380
+ 'update:inputMode': value => true,
22381
+ 'update:modelValue': value => true,
22382
+ 'update:viewMode': mode => true
22383
+ },
22384
+ setup(props, _ref) {
22385
+ let {
22386
+ emit,
22387
+ slots
22388
+ } = _ref;
22389
+ const model = useProxiedModel(props, 'modelValue');
22390
+ const {
22391
+ t
22392
+ } = useLocale();
22393
+ createDatePicker();
22394
+ function onDisplayUpdate(val) {
22395
+ emit('update:displayDate', val);
22396
+ }
22397
+ function onViewModeUpdate(val) {
22398
+ emit('update:viewMode', val);
22399
+ }
22400
+ function onSave() {
22401
+ emit('update:modelValue', model.value);
22402
+ emit('save');
22403
+ }
22404
+ function onCancel() {
22405
+ emit('cancel');
22406
+ }
22407
+ useRender(() => {
22408
+ const [cardProps] = VCard.filterProps(props);
22409
+ const [datePickerControlsProps] = VDatePickerControls.filterProps(props);
22410
+ const [datePickerMonthProps] = VDatePickerMonth.filterProps(props);
22411
+ const [datePickerYearsProps] = VDatePickerYears.filterProps(props);
22412
+ const hasActions = !props.hideActions || !!slots.actions;
22413
+ return vue.createVNode(VCard, vue.mergeProps(cardProps, {
22414
+ "class": "v-date-card"
22415
+ }), {
22416
+ ...slots,
22417
+ default: () => vue.createVNode(vue.Fragment, null, [vue.createVNode(VDatePickerControls, vue.mergeProps(datePickerControlsProps, {
22418
+ "onUpdate:displayDate": onDisplayUpdate,
22419
+ "onUpdate:viewMode": onViewModeUpdate
22420
+ }), null), vue.createVNode(MaybeTransition, {
22421
+ "transition": props.transition
22422
+ }, {
22423
+ default: () => [props.viewMode === 'month' ? vue.createVNode(VDatePickerMonth, vue.mergeProps(datePickerMonthProps, {
22424
+ "modelValue": model.value,
22425
+ "onUpdate:modelValue": $event => model.value = $event,
22426
+ "onUpdate:displayDate": onDisplayUpdate
22427
+ }), null) : vue.createVNode(VDatePickerYears, vue.mergeProps(datePickerYearsProps, {
22428
+ "onUpdate:displayDate": onDisplayUpdate,
22429
+ "onUpdate:viewMode": onViewModeUpdate
22430
+ }), null)]
22431
+ })]),
22432
+ actions: !hasActions ? undefined : () => vue.createVNode(vue.Fragment, null, [slots.actions?.() ?? vue.createVNode(vue.Fragment, null, [vue.createVNode(VBtn, {
22433
+ "onClick": onCancel,
22434
+ "text": t(props.cancelText)
22435
+ }, null), vue.createVNode(VBtn, {
22436
+ "onClick": onSave,
22437
+ "text": t(props.okText)
22438
+ }, null)])])
22439
+ });
22440
+ });
22441
+ return {};
22442
+ }
22443
+ });
22444
+
22445
+ // Types
22446
+
22447
+ const makeVDatePickerHeaderProps = propsFactory({
22448
+ appendIcon: String,
22449
+ color: String,
22450
+ header: String,
22451
+ transition: String
22452
+ }, 'VDatePickerHeader');
22453
+ const VDatePickerHeader = genericComponent()({
22454
+ name: 'VDatePickerHeader',
22455
+ props: makeVDatePickerHeaderProps(),
22456
+ emits: {
22457
+ 'click:append': () => true
22458
+ },
22459
+ setup(props, _ref) {
22460
+ let {
22461
+ emit,
22462
+ slots
22463
+ } = _ref;
22464
+ const {
22465
+ backgroundColorClasses,
22466
+ backgroundColorStyles
22467
+ } = useBackgroundColor(props, 'color');
22468
+ function onClickAppend() {
22469
+ emit('click:append');
22470
+ }
22471
+ useRender(() => {
22472
+ const hasContent = !!(slots.default || props.header);
22473
+ const hasAppend = !!(slots.append || props.appendIcon);
22474
+ return vue.createVNode("div", {
22475
+ "class": ['v-date-picker-header', backgroundColorClasses.value],
22476
+ "style": backgroundColorStyles.value
22477
+ }, [slots.prepend && vue.createVNode("div", {
22478
+ "key": "prepend",
22479
+ "class": "v-date-picker-header__prepend"
22480
+ }, [slots.prepend()]), hasContent && vue.createVNode(MaybeTransition, {
22481
+ "key": "content",
22482
+ "name": props.transition
22483
+ }, {
22484
+ default: () => [vue.createVNode("div", {
22485
+ "key": props.header,
22486
+ "class": "v-date-picker-header__content"
22487
+ }, [slots.default?.() ?? props.header])]
22488
+ }), hasAppend && vue.createVNode("div", {
22489
+ "class": "v-date-picker-header__append"
22490
+ }, [!slots.append ? vue.createVNode(VBtn, {
22491
+ "key": "append-btn",
22492
+ "icon": props.appendIcon,
22493
+ "variant": "text",
22494
+ "onClick": onClickAppend
22495
+ }, null) : vue.createVNode(VDefaultsProvider, {
22496
+ "key": "append-defaults",
22497
+ "disabled": !props.appendIcon,
22498
+ "defaults": {
22499
+ VBtn: {
22500
+ icon: props.appendIcon,
22501
+ variant: 'text'
22502
+ }
22503
+ }
22504
+ }, {
22505
+ default: () => [slots.append?.()]
22506
+ })])]);
22507
+ });
22508
+ return {};
22509
+ }
22510
+ });
22511
+
22512
+ // Utilities
22513
+ const VPickerTitle = createSimpleFunctional('v-picker-title');
22514
+
22515
+ // Types
22516
+
22517
+ const makeVPickerProps = propsFactory({
22518
+ landscape: Boolean,
22519
+ title: String,
22520
+ ...omit(makeVSheetProps(), ['color'])
22521
+ }, 'VPicker');
22522
+ const VPicker = genericComponent()({
22523
+ name: 'VPicker',
22524
+ props: makeVPickerProps(),
22525
+ setup(props, _ref) {
22526
+ let {
22527
+ slots
22528
+ } = _ref;
22529
+ useRender(() => {
22530
+ const [sheetProps] = VSheet.filterProps(props);
22531
+ const hasTitle = !!(props.title || slots.title);
22532
+ return vue.createVNode(VSheet, vue.mergeProps(sheetProps, {
22533
+ "class": ['v-picker', {
22534
+ 'v-picker--landscape': props.landscape,
22535
+ 'v-picker--with-actions': !!slots.actions
22536
+ }, props.class],
22537
+ "style": props.style
22538
+ }), {
22539
+ default: () => [hasTitle && vue.createVNode(VPickerTitle, {
22540
+ "key": "picker-title"
22541
+ }, {
22542
+ default: () => [slots.title?.() ?? props.title]
22543
+ }), slots.header && vue.createVNode("div", {
22544
+ "class": "v-picker__header"
22545
+ }, [slots.header()]), vue.createVNode("div", {
22546
+ "class": "v-picker__body"
22547
+ }, [slots.default?.()]), slots.actions && vue.createVNode("div", {
22548
+ "class": "v-picker__actions"
22549
+ }, [slots.actions()])]
22550
+ });
22551
+ });
22552
+ return {};
22553
+ }
22554
+ });
22555
+
22556
+ // Types
22557
+
22558
+ const makeVDatePickerProps = propsFactory({
22559
+ calendarIcon: {
22560
+ type: String,
22561
+ default: '$calendar'
22562
+ },
22563
+ keyboardIcon: {
22564
+ type: String,
22565
+ default: '$edit'
22566
+ },
22567
+ cancelText: {
22568
+ type: String,
22569
+ default: '$vuetify.datePicker.cancel'
22570
+ },
22571
+ okText: {
22572
+ type: String,
22573
+ default: '$vuetify.datePicker.ok'
22574
+ },
22575
+ inputText: {
22576
+ type: String,
22577
+ default: '$vuetify.datePicker.input.placeholder'
22578
+ },
22579
+ header: {
22580
+ type: String,
22581
+ default: '$vuetify.datePicker.header'
22582
+ },
22583
+ hideActions: Boolean,
22584
+ ...makeDateProps(),
22585
+ ...makeVDatePickerControlsProps(),
22586
+ ...makeVDatePickerMonthProps(),
22587
+ ...makeVDatePickerYearsProps(),
22588
+ ...makeVPickerProps({
22589
+ title: '$vuetify.datePicker.title'
22590
+ })
22591
+ }, 'VDatePicker');
22592
+ const VDatePicker = genericComponent()({
22593
+ name: 'VDatePicker',
22594
+ props: makeVDatePickerProps(),
22595
+ emits: {
22596
+ 'click:cancel': () => true,
22597
+ 'click:save': () => true,
22598
+ ...dateEmits
22599
+ },
22600
+ setup(props, _ref) {
22601
+ let {
22602
+ emit,
22603
+ slots
22604
+ } = _ref;
22605
+ const adapter = useDate();
22606
+ const {
22607
+ t
22608
+ } = useLocale();
22609
+ createDatePicker();
22610
+ const model = vue.ref(props.modelValue ?? []);
22611
+ const isReversing = vue.ref(false);
22612
+ const displayDate = useProxiedModel(props, 'displayDate', props.displayDate);
22613
+ const inputMode = useProxiedModel(props, 'inputMode', props.inputMode);
22614
+ const viewMode = useProxiedModel(props, 'viewMode', props.viewMode);
22615
+ const inputModel = vue.computed(() => model.value.length ? adapter.format(model.value[0], 'keyboardDate') : '');
22616
+ const title = vue.computed(() => t(props.title));
22617
+ const header = vue.computed(() => model.value.length ? adapter.format(model.value[0], 'normalDateWithWeekday') : t(props.header));
22618
+ const headerIcon = vue.computed(() => inputMode.value === 'calendar' ? props.keyboardIcon : props.calendarIcon);
22619
+ const headerTransition = vue.computed(() => `date-picker-header${isReversing.value ? '-reverse' : ''}-transition`);
22620
+ vue.watch(inputModel, () => {
22621
+ const {
22622
+ isValid,
22623
+ date
22624
+ } = adapter;
22625
+ model.value = isValid(inputModel.value) ? [date(inputModel.value)] : [];
22626
+ });
22627
+ vue.watch(model, (val, oldVal) => {
22628
+ if (props.hideActions) {
22629
+ emit('update:modelValue', val);
22630
+ }
22631
+ if (val[0] && oldVal[0]) {
22632
+ isReversing.value = adapter.isBefore(val[0], oldVal[0]);
22633
+ }
22634
+ });
22635
+ function onClickCancel() {
22636
+ emit('click:cancel');
22637
+ }
22638
+ function onClickSave() {
22639
+ emit('click:save');
22640
+ emit('update:modelValue', model.value);
22641
+ }
22642
+ function onClickAppend() {
22643
+ inputMode.value = inputMode.value === 'calendar' ? 'keyboard' : 'calendar';
22644
+ }
22645
+ const headerSlotProps = vue.computed(() => ({
22646
+ header: header.value,
22647
+ appendIcon: headerIcon.value,
22648
+ transition: headerTransition.value,
22649
+ 'onClick:append': onClickAppend
22650
+ }));
22651
+ useRender(() => {
22652
+ const [pickerProps] = VPicker.filterProps(props);
22653
+ const [datePickerControlsProps] = VDatePickerControls.filterProps(props);
22654
+ const [datePickerMonthProps] = VDatePickerMonth.filterProps(props);
22655
+ const [datePickerYearsProps] = VDatePickerYears.filterProps(props);
22656
+ return vue.createVNode(VPicker, vue.mergeProps(pickerProps, {
22657
+ "class": ['v-date-picker', props.class],
22658
+ "style": props.style,
22659
+ "title": title.value
22660
+ }), {
22661
+ header: () => slots.header?.(headerSlotProps.value) ?? vue.createVNode(VDatePickerHeader, vue.mergeProps({
22662
+ "key": "header"
22663
+ }, headerSlotProps.value), null),
22664
+ default: () => inputMode.value === 'calendar' ? vue.createVNode(vue.Fragment, null, [vue.createVNode(VDatePickerControls, vue.mergeProps(datePickerControlsProps, {
22665
+ "displayDate": displayDate.value,
22666
+ "onUpdate:displayDate": $event => displayDate.value = $event,
22667
+ "viewMode": viewMode.value,
22668
+ "onUpdate:viewMode": $event => viewMode.value = $event
22669
+ }), null), vue.createVNode(VFadeTransition, {
22670
+ "hideOnLeave": true
22671
+ }, {
22672
+ default: () => [viewMode.value === 'month' ? vue.createVNode(VDatePickerMonth, vue.mergeProps({
22673
+ "key": "date-picker-month"
22674
+ }, datePickerMonthProps, {
22675
+ "modelValue": model.value,
22676
+ "onUpdate:modelValue": $event => model.value = $event,
22677
+ "displayDate": displayDate.value,
22678
+ "onUpdate:displayDate": $event => displayDate.value = $event
22679
+ }), null) : vue.createVNode(VDatePickerYears, vue.mergeProps({
22680
+ "key": "date-picker-years"
22681
+ }, datePickerYearsProps, {
22682
+ "displayDate": displayDate.value,
22683
+ "onUpdate:displayDate": $event => displayDate.value = $event,
22684
+ "viewMode": viewMode.value,
22685
+ "onUpdate:viewMode": $event => viewMode.value = $event
22686
+ }), null)]
22687
+ })]) : vue.createVNode("div", {
22688
+ "class": "v-date-picker__input"
22689
+ }, [vue.createVNode(VTextField, {
22690
+ "modelValue": inputModel.value,
22691
+ "onUpdate:modelValue": $event => inputModel.value = $event,
22692
+ "label": t(props.inputText),
22693
+ "placeholder": "dd/mm/yyyy"
22694
+ }, null)]),
22695
+ actions: !props.hideActions ? () => vue.createVNode("div", null, [vue.createVNode(VBtn, {
22696
+ "variant": "text",
22697
+ "color": props.color,
22698
+ "onClick": onClickCancel,
22699
+ "text": t(props.cancelText)
22700
+ }, null), vue.createVNode(VBtn, {
22701
+ "variant": "text",
22702
+ "color": props.color,
22703
+ "onClick": onClickSave,
22704
+ "text": t(props.okText)
22705
+ }, null)]) : undefined
22706
+ });
22707
+ });
22708
+ return {};
22709
+ }
22710
+ });
22711
+
22712
+ // Types
22713
+
22714
+ const makeVInfiniteScrollProps = propsFactory({
22715
+ color: String,
22716
+ direction: {
22717
+ type: String,
22718
+ default: 'vertical',
22719
+ validator: v => ['vertical', 'horizontal'].includes(v)
22720
+ },
22721
+ side: {
22722
+ type: String,
22723
+ default: 'end',
22724
+ validator: v => ['start', 'end', 'both'].includes(v)
22725
+ },
22726
+ mode: {
22727
+ type: String,
22728
+ default: 'intersect',
22729
+ validator: v => ['intersect', 'manual'].includes(v)
22730
+ },
22731
+ margin: [Number, String],
22732
+ loadMoreText: {
22733
+ type: String,
22734
+ default: '$vuetify.infiniteScroll.loadMore'
22735
+ },
22736
+ emptyText: {
22737
+ type: String,
22738
+ default: '$vuetify.infiniteScroll.empty'
22739
+ },
22740
+ ...makeDimensionProps(),
22741
+ ...makeTagProps()
22742
+ }, 'VInfiniteScroll');
22743
+ const VInfiniteScrollIntersect = defineComponent({
22744
+ name: 'VInfiniteScrollIntersect',
22745
+ props: {
22746
+ side: {
22747
+ type: String,
22748
+ required: true
22749
+ },
22750
+ rootRef: null,
22751
+ rootMargin: String
22752
+ },
22753
+ emits: {
22754
+ intersect: side => true
22755
+ },
22756
+ setup(props, _ref) {
22757
+ let {
22758
+ emit
22759
+ } = _ref;
22760
+ const {
22761
+ intersectionRef,
22762
+ isIntersecting
22763
+ } = useIntersectionObserver(entries => {}, props.rootMargin ? {
22764
+ root: props.rootRef,
22765
+ rootMargin: props.rootMargin
22766
+ } : undefined);
22767
+ vue.watch(isIntersecting, async val => {
22768
+ if (val) emit('intersect', props.side);
22769
+ });
22770
+ useRender(() => vue.createVNode("div", {
22771
+ "class": "v-infinite-scroll-intersect",
22772
+ "ref": intersectionRef
22773
+ }, [vue.createTextVNode("\xA0")]));
22774
+ return {};
22775
+ }
22776
+ });
22777
+ const VInfiniteScroll = genericComponent()({
22778
+ name: 'VInfiniteScroll',
22779
+ props: makeVInfiniteScrollProps(),
22780
+ emits: {
22781
+ load: options => true
22782
+ },
22783
+ setup(props, _ref2) {
22784
+ let {
22785
+ slots,
22786
+ emit
22787
+ } = _ref2;
22788
+ const rootEl = vue.ref();
22789
+ const startStatus = vue.ref('ok');
22790
+ const endStatus = vue.ref('ok');
22791
+ const margin = vue.computed(() => convertToUnit(props.margin));
22792
+ function setScrollAmount(amount) {
22793
+ if (!rootEl.value) return;
22794
+ const property = props.direction === 'vertical' ? 'scrollTop' : 'scrollLeft';
22795
+ rootEl.value[property] = amount;
22796
+ }
22797
+ function getScrollAmount() {
22798
+ if (!rootEl.value) return 0;
22799
+ const property = props.direction === 'vertical' ? 'scrollTop' : 'scrollLeft';
22800
+ return rootEl.value[property];
22801
+ }
22802
+ function getScrollSize() {
22803
+ if (!rootEl.value) return 0;
22804
+ const property = props.direction === 'vertical' ? 'scrollHeight' : 'scrollWidth';
22805
+ return rootEl.value[property];
22806
+ }
22807
+ function getContainerSize() {
22808
+ if (!rootEl.value) return 0;
22809
+ const property = props.direction === 'vertical' ? 'clientHeight' : 'clientWidth';
22810
+ return rootEl.value[property];
22811
+ }
22812
+ vue.onMounted(() => {
22813
+ if (!rootEl.value) return;
22814
+ if (props.side === 'start') {
22815
+ setScrollAmount(getScrollSize());
22816
+ } else if (props.side === 'both') {
22817
+ setScrollAmount(getScrollSize() / 2 - getContainerSize() / 2);
22818
+ }
22819
+ });
22820
+ function setStatus(side, status) {
22821
+ if (side === 'start') {
22822
+ startStatus.value = status;
22823
+ } else if (side === 'end') {
22824
+ endStatus.value = status;
22825
+ }
22826
+ }
22827
+ function getStatus(side) {
22828
+ return side === 'start' ? startStatus.value : endStatus.value;
22829
+ }
22830
+ let previousScrollSize = 0;
22831
+ function handleIntersect(side) {
22832
+ const status = getStatus(side);
22833
+ if (!rootEl.value || status === 'loading') return;
22834
+ previousScrollSize = getScrollSize();
22835
+ setStatus(side, 'loading');
22836
+ function done(status) {
22837
+ setStatus(side, status);
22838
+ vue.nextTick(() => {
22839
+ if (status === 'ok' && side === 'start') {
22840
+ setScrollAmount(getScrollSize() - previousScrollSize + getScrollAmount());
22841
+ }
22842
+ });
22843
+ }
22844
+ emit('load', {
22845
+ side,
22846
+ done
22847
+ });
22848
+ }
22849
+ const {
22850
+ t
22851
+ } = useLocale();
22852
+ function renderSide(side, status) {
22853
+ if (props.side !== side && props.side !== 'both') return;
22854
+ const onClick = () => handleIntersect(side);
22855
+ const slotProps = {
22856
+ side,
22857
+ props: {
22858
+ onClick,
22859
+ color: props.color
22860
+ }
22861
+ };
22862
+ if (status === 'error') return slots.error?.(slotProps);
22863
+ if (status === 'empty') return slots.empty?.(slotProps) ?? vue.createVNode("div", null, [t(props.emptyText)]);
22864
+ if (props.mode === 'manual') {
22865
+ if (status === 'loading') {
22866
+ return slots.loading?.(slotProps) ?? vue.createVNode(VProgressCircular, {
22867
+ "indeterminate": true,
22868
+ "color": props.color
22869
+ }, null);
22870
+ }
22871
+ return slots['load-more']?.(slotProps) ?? vue.createVNode(VBtn, {
22872
+ "variant": "outlined",
22873
+ "color": props.color,
22874
+ "onClick": onClick
22875
+ }, {
22876
+ default: () => [t(props.loadMoreText)]
22877
+ });
22878
+ }
22879
+ return slots.loading?.(slotProps) ?? vue.createVNode(VProgressCircular, {
22880
+ "indeterminate": true,
22881
+ "color": props.color
22882
+ }, null);
22883
+ }
22884
+ const {
22885
+ dimensionStyles
22886
+ } = useDimension(props);
22887
+ useRender(() => {
22888
+ const Tag = props.tag;
22889
+ const hasStartIntersect = props.side === 'start' || props.side === 'both';
22890
+ const hasEndIntersect = props.side === 'end' || props.side === 'both';
22891
+ const intersectMode = props.mode === 'intersect';
22892
+ return vue.createVNode(Tag, {
22893
+ "ref": rootEl,
22894
+ "class": ['v-infinite-scroll', `v-infinite-scroll--${props.direction}`, {
22895
+ 'v-infinite-scroll--start': hasStartIntersect,
22896
+ 'v-infinite-scroll--end': hasEndIntersect
22897
+ }],
22898
+ "style": dimensionStyles.value
22899
+ }, {
22900
+ default: () => [vue.createVNode("div", {
22901
+ "class": "v-infinite-scroll__side"
22902
+ }, [renderSide('start', startStatus.value)]), rootEl.value && hasStartIntersect && intersectMode && vue.createVNode(VInfiniteScrollIntersect, {
22903
+ "key": "start",
22904
+ "side": "start",
22905
+ "onIntersect": handleIntersect,
22906
+ "rootRef": rootEl.value,
22907
+ "rootMargin": margin.value
22908
+ }, null), slots.default?.(), rootEl.value && hasEndIntersect && intersectMode && vue.createVNode(VInfiniteScrollIntersect, {
22909
+ "key": "end",
22910
+ "side": "end",
22911
+ "onIntersect": handleIntersect,
22912
+ "rootRef": rootEl.value,
22913
+ "rootMargin": margin.value
22914
+ }, null), vue.createVNode("div", {
22915
+ "class": "v-infinite-scroll__side"
22916
+ }, [renderSide('end', endStatus.value)])]
22917
+ });
22918
+ });
22919
+ }
22920
+ });
22921
+
22922
+ // Types
22923
+
22924
+ const rootTypes = {
22925
+ actions: 'button@2',
22926
+ article: 'heading, paragraph',
22927
+ avatar: 'avatar',
22928
+ button: 'button',
22929
+ card: 'image, heading',
22930
+ 'card-avatar': 'image, list-item-avatar',
22931
+ chip: 'chip',
22932
+ 'date-picker': 'list-item, heading, divider, date-picker-options, date-picker-days, actions',
22933
+ 'date-picker-options': 'text, avatar@2',
22934
+ 'date-picker-days': 'avatar@28',
22935
+ divider: 'divider',
22936
+ heading: 'heading',
22937
+ image: 'image',
22938
+ 'list-item': 'text',
22939
+ 'list-item-avatar': 'avatar, text',
22940
+ 'list-item-two-line': 'sentences',
22941
+ 'list-item-avatar-two-line': 'avatar, sentences',
22942
+ 'list-item-three-line': 'paragraph',
22943
+ 'list-item-avatar-three-line': 'avatar, paragraph',
22944
+ paragraph: 'text@3',
22945
+ sentences: 'text@2',
22946
+ subtitle: 'text',
22947
+ table: 'table-heading, table-thead, table-tbody, table-tfoot',
22948
+ 'table-heading': 'chip, text',
22949
+ 'table-thead': 'heading@6',
22950
+ 'table-tbody': 'table-row-divider@6',
22951
+ 'table-row-divider': 'table-row, divider',
22952
+ 'table-row': 'text@6',
22953
+ 'table-tfoot': 'text@2, avatar@2',
22954
+ text: 'text'
22955
+ };
22956
+ function genBone(type) {
22957
+ let children = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
22958
+ return vue.createVNode("div", {
22959
+ "class": ['v-skeleton-loader__bone', `v-skeleton-loader__${type}`]
22960
+ }, [children]);
22961
+ }
22962
+ function genBones(bone) {
22963
+ // e.g. 'text@3'
22964
+ const [type, length] = bone.split('@');
22965
+
22966
+ // Generate a length array based upon
22967
+ // value after @ in the bone string
22968
+ return Array.from({
22969
+ length
22970
+ }).map(() => genStructure(type));
22283
22971
  }
22284
- function endOfYear(date) {
22285
- return new Date(date.getFullYear(), 11, 31);
22972
+ function genStructure(type) {
22973
+ let children = [];
22974
+ if (!type) return children;
22975
+
22976
+ // TODO: figure out a better way to type this
22977
+ const bone = rootTypes[type];
22978
+
22979
+ // End of recursion, do nothing
22980
+ /* eslint-disable-next-line no-empty, brace-style */
22981
+ if (type === bone) ;
22982
+ // Array of values - e.g. 'heading, paragraph, text@2'
22983
+ else if (type.includes(',')) return mapBones(type);
22984
+ // Array of values - e.g. 'paragraph@4'
22985
+ else if (type.includes('@')) return genBones(type);
22986
+ // Array of values - e.g. 'card@2'
22987
+ else if (bone.includes(',')) children = mapBones(bone);
22988
+ // Array of values - e.g. 'list-item@2'
22989
+ else if (bone.includes('@')) children = genBones(bone);
22990
+ // Single value - e.g. 'card-heading'
22991
+ else if (bone) children.push(genStructure(bone));
22992
+ return [genBone(type, children)];
22286
22993
  }
22287
- function getMondayOfFirstWeekOfYear(year) {
22288
- return new Date(year, 0, 1);
22994
+ function mapBones(bones) {
22995
+ // Remove spaces and return array of structures
22996
+ return bones.replace(/\s/g, '').split(',').map(genStructure);
22289
22997
  }
22998
+ const makeVSkeletonLoaderProps = propsFactory({
22999
+ boilerplate: Boolean,
23000
+ color: String,
23001
+ loading: Boolean,
23002
+ loadingText: {
23003
+ type: String,
23004
+ default: '$vuetify.loading'
23005
+ },
23006
+ type: {
23007
+ type: [String, Array],
23008
+ default: 'image'
23009
+ },
23010
+ ...makeDimensionProps(),
23011
+ ...makeElevationProps(),
23012
+ ...makeThemeProps()
23013
+ }, 'VSkeletonLoader');
23014
+ const VSkeletonLoader = genericComponent()({
23015
+ name: 'VSkeletonLoader',
23016
+ props: makeVSkeletonLoaderProps(),
23017
+ setup(props, _ref) {
23018
+ let {
23019
+ slots
23020
+ } = _ref;
23021
+ const {
23022
+ backgroundColorClasses,
23023
+ backgroundColorStyles
23024
+ } = useBackgroundColor(vue.toRef(props, 'color'));
23025
+ const {
23026
+ dimensionStyles
23027
+ } = useDimension(props);
23028
+ const {
23029
+ elevationClasses
23030
+ } = useElevation(props);
23031
+ const {
23032
+ themeClasses
23033
+ } = provideTheme(props);
23034
+ const {
23035
+ t
23036
+ } = useLocale();
23037
+ const items = vue.computed(() => genStructure(wrapInArray(props.type).join(',')));
23038
+ useRender(() => {
23039
+ const isLoading = !slots.default || props.loading;
23040
+ return vue.createVNode("div", {
23041
+ "class": ['v-skeleton-loader', {
23042
+ 'v-skeleton-loader--boilerplate': props.boilerplate
23043
+ }, themeClasses.value, backgroundColorClasses.value, elevationClasses.value],
23044
+ "style": [backgroundColorStyles.value, isLoading ? dimensionStyles.value : {}],
23045
+ "aria-busy": !props.boilerplate ? isLoading : undefined,
23046
+ "aria-live": !props.boilerplate ? 'polite' : undefined,
23047
+ "aria-label": !props.boilerplate ? t(props.loadingText) : undefined,
23048
+ "role": !props.boilerplate ? 'alert' : undefined
23049
+ }, [isLoading ? items.value : slots.default?.()]);
23050
+ });
23051
+ return {};
23052
+ }
23053
+ });
23054
+
23055
+ var components = /*#__PURE__*/Object.freeze({
23056
+ __proto__: null,
23057
+ VAlert: VAlert,
23058
+ VAlertTitle: VAlertTitle,
23059
+ VApp: VApp,
23060
+ VAppBar: VAppBar,
23061
+ VAppBarNavIcon: VAppBarNavIcon,
23062
+ VAppBarTitle: VAppBarTitle,
23063
+ VAutocomplete: VAutocomplete,
23064
+ VAvatar: VAvatar,
23065
+ VBadge: VBadge,
23066
+ VBanner: VBanner,
23067
+ VBannerActions: VBannerActions,
23068
+ VBannerText: VBannerText,
23069
+ VBottomNavigation: VBottomNavigation,
23070
+ VBottomSheet: VBottomSheet,
23071
+ VBreadcrumbs: VBreadcrumbs,
23072
+ VBreadcrumbsDivider: VBreadcrumbsDivider,
23073
+ VBreadcrumbsItem: VBreadcrumbsItem,
23074
+ VBtn: VBtn,
23075
+ VBtnGroup: VBtnGroup,
23076
+ VBtnToggle: VBtnToggle,
23077
+ VCard: VCard,
23078
+ VCardActions: VCardActions,
23079
+ VCardItem: VCardItem,
23080
+ VCardSubtitle: VCardSubtitle,
23081
+ VCardText: VCardText,
23082
+ VCardTitle: VCardTitle,
23083
+ VCarousel: VCarousel,
23084
+ VCarouselItem: VCarouselItem,
23085
+ VCheckbox: VCheckbox,
23086
+ VCheckboxBtn: VCheckboxBtn,
23087
+ VChip: VChip,
23088
+ VChipGroup: VChipGroup,
23089
+ VClassIcon: VClassIcon,
23090
+ VCode: VCode,
23091
+ VCol: VCol,
23092
+ VColorPicker: VColorPicker,
23093
+ VCombobox: VCombobox,
23094
+ VComponentIcon: VComponentIcon,
23095
+ VContainer: VContainer,
23096
+ VCounter: VCounter,
23097
+ VDataIterator: VDataIterator,
23098
+ VDataTable: VDataTable,
23099
+ VDataTableFooter: VDataTableFooter,
23100
+ VDataTableRow: VDataTableRow,
23101
+ VDataTableRows: VDataTableRows,
23102
+ VDataTableServer: VDataTableServer,
23103
+ VDataTableVirtual: VDataTableVirtual,
23104
+ VDateCard: VDateCard,
23105
+ VDatePicker: VDatePicker,
23106
+ VDatePickerControls: VDatePickerControls,
23107
+ VDatePickerHeader: VDatePickerHeader,
23108
+ VDatePickerMonth: VDatePickerMonth,
23109
+ VDatePickerYears: VDatePickerYears,
23110
+ VDefaultsProvider: VDefaultsProvider,
23111
+ VDialog: VDialog,
23112
+ VDialogBottomTransition: VDialogBottomTransition,
23113
+ VDialogTopTransition: VDialogTopTransition,
23114
+ VDialogTransition: VDialogTransition,
23115
+ VDivider: VDivider,
23116
+ VExpandTransition: VExpandTransition,
23117
+ VExpandXTransition: VExpandXTransition,
23118
+ VExpansionPanel: VExpansionPanel,
23119
+ VExpansionPanelText: VExpansionPanelText,
23120
+ VExpansionPanelTitle: VExpansionPanelTitle,
23121
+ VExpansionPanels: VExpansionPanels,
23122
+ VFabTransition: VFabTransition,
23123
+ VFadeTransition: VFadeTransition,
23124
+ VField: VField,
23125
+ VFieldLabel: VFieldLabel,
23126
+ VFileInput: VFileInput,
23127
+ VFooter: VFooter,
23128
+ VForm: VForm,
23129
+ VHover: VHover,
23130
+ VIcon: VIcon,
23131
+ VImg: VImg,
23132
+ VInfiniteScroll: VInfiniteScroll,
23133
+ VInput: VInput,
23134
+ VItem: VItem,
23135
+ VItemGroup: VItemGroup,
23136
+ VKbd: VKbd,
23137
+ VLabel: VLabel,
23138
+ VLayout: VLayout,
23139
+ VLayoutItem: VLayoutItem,
23140
+ VLazy: VLazy,
23141
+ VLigatureIcon: VLigatureIcon,
23142
+ VList: VList,
23143
+ VListGroup: VListGroup,
23144
+ VListImg: VListImg,
23145
+ VListItem: VListItem,
23146
+ VListItemAction: VListItemAction,
23147
+ VListItemMedia: VListItemMedia,
23148
+ VListItemSubtitle: VListItemSubtitle,
23149
+ VListItemTitle: VListItemTitle,
23150
+ VListSubheader: VListSubheader,
23151
+ VLocaleProvider: VLocaleProvider,
23152
+ VMain: VMain,
23153
+ VMenu: VMenu,
23154
+ VMessages: VMessages,
23155
+ VNavigationDrawer: VNavigationDrawer,
23156
+ VNoSsr: VNoSsr,
23157
+ VOverlay: VOverlay,
23158
+ VPagination: VPagination,
23159
+ VParallax: VParallax,
23160
+ VPicker: VPicker,
23161
+ VPickerTitle: VPickerTitle,
23162
+ VProgressCircular: VProgressCircular,
23163
+ VProgressLinear: VProgressLinear,
23164
+ VRadio: VRadio,
23165
+ VRadioGroup: VRadioGroup,
23166
+ VRangeSlider: VRangeSlider,
23167
+ VRating: VRating,
23168
+ VResponsive: VResponsive,
23169
+ VRow: VRow,
23170
+ VScaleTransition: VScaleTransition,
23171
+ VScrollXReverseTransition: VScrollXReverseTransition,
23172
+ VScrollXTransition: VScrollXTransition,
23173
+ VScrollYReverseTransition: VScrollYReverseTransition,
23174
+ VScrollYTransition: VScrollYTransition,
23175
+ VSelect: VSelect,
23176
+ VSelectionControl: VSelectionControl,
23177
+ VSelectionControlGroup: VSelectionControlGroup,
23178
+ VSheet: VSheet,
23179
+ VSkeletonLoader: VSkeletonLoader,
23180
+ VSlideGroup: VSlideGroup,
23181
+ VSlideGroupItem: VSlideGroupItem,
23182
+ VSlideXReverseTransition: VSlideXReverseTransition,
23183
+ VSlideXTransition: VSlideXTransition,
23184
+ VSlideYReverseTransition: VSlideYReverseTransition,
23185
+ VSlideYTransition: VSlideYTransition,
23186
+ VSlider: VSlider,
23187
+ VSnackbar: VSnackbar,
23188
+ VSpacer: VSpacer,
23189
+ VSvgIcon: VSvgIcon,
23190
+ VSwitch: VSwitch,
23191
+ VSystemBar: VSystemBar,
23192
+ VTab: VTab,
23193
+ VTable: VTable,
23194
+ VTabs: VTabs,
23195
+ VTextField: VTextField,
23196
+ VTextarea: VTextarea,
23197
+ VThemeProvider: VThemeProvider,
23198
+ VTimeline: VTimeline,
23199
+ VTimelineItem: VTimelineItem,
23200
+ VToolbar: VToolbar,
23201
+ VToolbarItems: VToolbarItems,
23202
+ VToolbarTitle: VToolbarTitle,
23203
+ VTooltip: VTooltip,
23204
+ VValidation: VValidation,
23205
+ VVirtualScroll: VVirtualScroll,
23206
+ VWindow: VWindow,
23207
+ VWindowItem: VWindowItem
23208
+ });
22290
23209
 
22291
- // https://stackoverflow.com/questions/274861/how-do-i-calculate-the-week-number-given-a-date/275024#275024
22292
- function getWeek(date) {
22293
- let year = date.getFullYear();
22294
- let d1w1 = getMondayOfFirstWeekOfYear(year);
22295
- if (date < d1w1) {
22296
- year = year - 1;
22297
- d1w1 = getMondayOfFirstWeekOfYear(year);
22298
- } else {
22299
- const tv = getMondayOfFirstWeekOfYear(year + 1);
22300
- if (date >= tv) {
22301
- year = year + 1;
22302
- d1w1 = tv;
23210
+ // Types
23211
+
23212
+ function mounted$2(el, binding) {
23213
+ const modifiers = binding.modifiers || {};
23214
+ const value = binding.value;
23215
+ const {
23216
+ once,
23217
+ immediate,
23218
+ ...modifierKeys
23219
+ } = modifiers;
23220
+ const defaultValue = !Object.keys(modifierKeys).length;
23221
+ const {
23222
+ handler,
23223
+ options
23224
+ } = typeof value === 'object' ? value : {
23225
+ handler: value,
23226
+ options: {
23227
+ attributes: modifierKeys?.attr ?? defaultValue,
23228
+ characterData: modifierKeys?.char ?? defaultValue,
23229
+ childList: modifierKeys?.child ?? defaultValue,
23230
+ subtree: modifierKeys?.sub ?? defaultValue
22303
23231
  }
22304
- }
22305
- const diffTime = Math.abs(date.getTime() - d1w1.getTime());
22306
- const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
22307
- return Math.floor(diffDays / 7) + 1;
22308
- }
22309
- function isWithinRange(date, range) {
22310
- return isAfter(date, range[0]) && isBefore(date, range[1]);
22311
- }
22312
- function isValid(date) {
22313
- const d = new Date(date);
22314
- return d instanceof Date && !isNaN(d.getTime());
22315
- }
22316
- function isAfter(date, comparing) {
22317
- return date.getTime() > comparing.getTime();
22318
- }
22319
- function isBefore(date, comparing) {
22320
- return date.getTime() < comparing.getTime();
22321
- }
22322
- function isEqual(date, comparing) {
22323
- return date.getTime() === comparing.getTime();
22324
- }
22325
- function isSameDay(date, comparing) {
22326
- return date.getDate() === comparing.getDate() && date.getMonth() === comparing.getMonth() && date.getFullYear() === comparing.getFullYear();
23232
+ };
23233
+ const observer = new MutationObserver(function () {
23234
+ let mutations = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
23235
+ let observer = arguments.length > 1 ? arguments[1] : undefined;
23236
+ handler?.(mutations, observer);
23237
+ if (once) unmounted$2(el, binding);
23238
+ });
23239
+ if (immediate) handler?.([], observer);
23240
+ el._mutate = Object(el._mutate);
23241
+ el._mutate[binding.instance.$.uid] = {
23242
+ observer
23243
+ };
23244
+ observer.observe(el, options);
22327
23245
  }
22328
- function isSameMonth(date, comparing) {
22329
- return date.getMonth() === comparing.getMonth() && date.getFullYear() === comparing.getFullYear();
23246
+ function unmounted$2(el, binding) {
23247
+ if (!el._mutate?.[binding.instance.$.uid]) return;
23248
+ el._mutate[binding.instance.$.uid].observer.disconnect();
23249
+ delete el._mutate[binding.instance.$.uid];
22330
23250
  }
22331
- function getDiff(date, comparing, unit) {
22332
- const d = new Date(date);
22333
- const c = new Date(comparing);
22334
- if (unit === 'month') {
22335
- return d.getMonth() - c.getMonth() + (d.getFullYear() - c.getFullYear()) * 12;
23251
+ const Mutate = {
23252
+ mounted: mounted$2,
23253
+ unmounted: unmounted$2
23254
+ };
23255
+
23256
+ // Types
23257
+
23258
+ function mounted$1(el, binding) {
23259
+ const handler = binding.value;
23260
+ const options = {
23261
+ passive: !binding.modifiers?.active
23262
+ };
23263
+ window.addEventListener('resize', handler, options);
23264
+ el._onResize = Object(el._onResize);
23265
+ el._onResize[binding.instance.$.uid] = {
23266
+ handler,
23267
+ options
23268
+ };
23269
+ if (!binding.modifiers?.quiet) {
23270
+ handler();
22336
23271
  }
22337
- return Math.floor((d.getTime() - c.getTime()) / (1000 * 60 * 60 * 24));
22338
- }
22339
- function setYear(date, year) {
22340
- const d = new Date(date);
22341
- d.setFullYear(year);
22342
- return d;
22343
23272
  }
22344
- class VuetifyDateAdapter {
22345
- constructor() {
22346
- let locale = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'en';
22347
- this.locale = locale;
22348
- }
22349
- date(value) {
22350
- return date(value);
22351
- }
22352
- addDays(date, amount) {
22353
- return addDays(date, amount);
22354
- }
22355
- addMonths(date, amount) {
22356
- return addMonths(date, amount);
22357
- }
22358
- getWeekArray(date) {
22359
- return getWeekArray(date);
22360
- }
22361
- startOfMonth(date) {
22362
- return startOfMonth(date);
22363
- }
22364
- endOfMonth(date) {
22365
- return endOfMonth(date);
22366
- }
22367
- format(date, formatString) {
22368
- return format(date, formatString, this.locale);
22369
- }
22370
- isEqual(date, comparing) {
22371
- return isEqual(date, comparing);
22372
- }
22373
- isValid(date) {
22374
- return isValid(date);
22375
- }
22376
- isWithinRange(date, range) {
22377
- return isWithinRange(date, range);
22378
- }
22379
- isAfter(date, comparing) {
22380
- return isAfter(date, comparing);
22381
- }
22382
- isSameDay(date, comparing) {
22383
- return isSameDay(date, comparing);
22384
- }
22385
- isSameMonth(date, comparing) {
22386
- return isSameMonth(date, comparing);
22387
- }
22388
- setYear(date, year) {
22389
- return setYear(date, year);
22390
- }
22391
- getDiff(date, comparing, unit) {
22392
- return getDiff(date, comparing, unit);
22393
- }
22394
- getWeek(date) {
22395
- return getWeek(date);
22396
- }
22397
- getWeekdays() {
22398
- return getWeekdays(this.locale);
22399
- }
22400
- getYear(date) {
22401
- return getYear(date);
22402
- }
22403
- getMonth(date) {
22404
- return getMonth(date);
22405
- }
22406
- startOfYear(date) {
22407
- return startOfYear(date);
22408
- }
22409
- endOfYear(date) {
22410
- return endOfYear(date);
22411
- }
23273
+ function unmounted$1(el, binding) {
23274
+ if (!el._onResize?.[binding.instance.$.uid]) return;
23275
+ const {
23276
+ handler,
23277
+ options
23278
+ } = el._onResize[binding.instance.$.uid];
23279
+ window.removeEventListener('resize', handler, options);
23280
+ delete el._onResize[binding.instance.$.uid];
22412
23281
  }
22413
-
22414
- // Composables
23282
+ const Resize = {
23283
+ mounted: mounted$1,
23284
+ unmounted: unmounted$1
23285
+ };
22415
23286
 
22416
23287
  // Types
22417
23288
 
22418
- const DateAdapterSymbol = Symbol.for('vuetify:date-adapter');
22419
- function createDate(options) {
22420
- return options ?? {
22421
- adapter: VuetifyDateAdapter
23289
+ function mounted(el, binding) {
23290
+ const {
23291
+ self = false
23292
+ } = binding.modifiers ?? {};
23293
+ const value = binding.value;
23294
+ const options = typeof value === 'object' && value.options || {
23295
+ passive: true
23296
+ };
23297
+ const handler = typeof value === 'function' || 'handleEvent' in value ? value : value.handler;
23298
+ const target = self ? el : binding.arg ? document.querySelector(binding.arg) : window;
23299
+ if (!target) return;
23300
+ target.addEventListener('scroll', handler, options);
23301
+ el._onScroll = Object(el._onScroll);
23302
+ el._onScroll[binding.instance.$.uid] = {
23303
+ handler,
23304
+ options,
23305
+ // Don't reference self
23306
+ target: self ? undefined : target
22422
23307
  };
22423
23308
  }
23309
+ function unmounted(el, binding) {
23310
+ if (!el._onScroll?.[binding.instance.$.uid]) return;
23311
+ const {
23312
+ handler,
23313
+ options,
23314
+ target = el
23315
+ } = el._onScroll[binding.instance.$.uid];
23316
+ target.removeEventListener('scroll', handler, options);
23317
+ delete el._onScroll[binding.instance.$.uid];
23318
+ }
23319
+ function updated(el, binding) {
23320
+ if (binding.value === binding.oldValue) return;
23321
+ unmounted(el, binding);
23322
+ mounted(el, binding);
23323
+ }
23324
+ const Scroll = {
23325
+ mounted,
23326
+ unmounted,
23327
+ updated
23328
+ };
23329
+
23330
+ var directives = /*#__PURE__*/Object.freeze({
23331
+ __proto__: null,
23332
+ ClickOutside: ClickOutside,
23333
+ Intersect: Intersect,
23334
+ Mutate: Mutate,
23335
+ Resize: Resize,
23336
+ Ripple: Ripple,
23337
+ Scroll: Scroll,
23338
+ Touch: Touch
23339
+ });
22424
23340
 
22425
23341
  // Composables
22426
23342
  function createVuetify$1() {
@@ -22507,7 +23423,7 @@
22507
23423
  date
22508
23424
  };
22509
23425
  }
22510
- const version$1 = "3.3.3";
23426
+ const version$1 = "3.3.5";
22511
23427
  createVuetify$1.version = version$1;
22512
23428
 
22513
23429
  // Vue's inject() can only be used in setup
@@ -22521,7 +23437,7 @@
22521
23437
 
22522
23438
  /* eslint-disable local-rules/sort-imports */
22523
23439
 
22524
- const version = "3.3.3";
23440
+ const version = "3.3.5";
22525
23441
 
22526
23442
  /* eslint-disable local-rules/sort-imports */
22527
23443