vuetify 2.6.16 → 2.7.1

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 (328) hide show
  1. package/dist/json/attributes.json +33 -1
  2. package/dist/json/tags.json +8 -0
  3. package/dist/json/web-types.json +144 -25
  4. package/dist/vuetify.css +52 -9
  5. package/dist/vuetify.css.map +1 -1
  6. package/dist/vuetify.js +688 -259
  7. package/dist/vuetify.js.map +1 -1
  8. package/dist/vuetify.min.css +2 -2
  9. package/dist/vuetify.min.js +2 -2
  10. package/es5/components/VCalendar/mixins/calendar-base.js +1 -1
  11. package/es5/components/VCalendar/mixins/calendar-base.js.map +1 -1
  12. package/es5/components/VDataTable/VDataTable.js +96 -61
  13. package/es5/components/VDataTable/VDataTable.js.map +1 -1
  14. package/es5/components/VExpansionPanel/VExpansionPanelContent.js +3 -1
  15. package/es5/components/VExpansionPanel/VExpansionPanelContent.js.map +1 -1
  16. package/es5/components/VExpansionPanel/VExpansionPanelHeader.js +3 -1
  17. package/es5/components/VExpansionPanel/VExpansionPanelHeader.js.map +1 -1
  18. package/es5/components/VInput/VInput.js +12 -1
  19. package/es5/components/VInput/VInput.js.map +1 -1
  20. package/es5/components/VItemGroup/VItem.js +18 -2
  21. package/es5/components/VItemGroup/VItem.js.map +1 -1
  22. package/es5/components/VMenu/VMenu.js +11 -3
  23. package/es5/components/VMenu/VMenu.js.map +1 -1
  24. package/es5/components/VPagination/VPagination.js +8 -2
  25. package/es5/components/VPagination/VPagination.js.map +1 -1
  26. package/es5/components/VRadioGroup/VRadio.js +14 -4
  27. package/es5/components/VRadioGroup/VRadio.js.map +1 -1
  28. package/es5/components/VSelect/VSelect.js +3 -1
  29. package/es5/components/VSelect/VSelect.js.map +1 -1
  30. package/es5/components/VSkeletonLoader/VSkeletonLoader.js +10 -5
  31. package/es5/components/VSkeletonLoader/VSkeletonLoader.js.map +1 -1
  32. package/es5/components/VSlideGroup/VSlideGroup.js +5 -1
  33. package/es5/components/VSlideGroup/VSlideGroup.js.map +1 -1
  34. package/es5/components/VTabs/VTab.js +4 -0
  35. package/es5/components/VTabs/VTab.js.map +1 -1
  36. package/es5/components/VTimePicker/VTimePicker.js +17 -0
  37. package/es5/components/VTimePicker/VTimePicker.js.map +1 -1
  38. package/es5/framework.js +1 -1
  39. package/es5/locale/af.js +7 -1
  40. package/es5/locale/af.js.map +1 -1
  41. package/es5/locale/ar.js +7 -1
  42. package/es5/locale/ar.js.map +1 -1
  43. package/es5/locale/az.js +7 -1
  44. package/es5/locale/az.js.map +1 -1
  45. package/es5/locale/bg.js +7 -1
  46. package/es5/locale/bg.js.map +1 -1
  47. package/es5/locale/ca.js +7 -1
  48. package/es5/locale/ca.js.map +1 -1
  49. package/es5/locale/ckb.js +7 -1
  50. package/es5/locale/ckb.js.map +1 -1
  51. package/es5/locale/cs.js +7 -1
  52. package/es5/locale/cs.js.map +1 -1
  53. package/es5/locale/da.js +7 -1
  54. package/es5/locale/da.js.map +1 -1
  55. package/es5/locale/de.js +7 -1
  56. package/es5/locale/de.js.map +1 -1
  57. package/es5/locale/el.js +7 -1
  58. package/es5/locale/el.js.map +1 -1
  59. package/es5/locale/en.js +7 -1
  60. package/es5/locale/en.js.map +1 -1
  61. package/es5/locale/es.js +7 -1
  62. package/es5/locale/es.js.map +1 -1
  63. package/es5/locale/et.js +7 -1
  64. package/es5/locale/et.js.map +1 -1
  65. package/es5/locale/fa.js +7 -1
  66. package/es5/locale/fa.js.map +1 -1
  67. package/es5/locale/fi.js +7 -1
  68. package/es5/locale/fi.js.map +1 -1
  69. package/es5/locale/fr.js +7 -1
  70. package/es5/locale/fr.js.map +1 -1
  71. package/es5/locale/he.js +7 -1
  72. package/es5/locale/he.js.map +1 -1
  73. package/es5/locale/hr.js +7 -1
  74. package/es5/locale/hr.js.map +1 -1
  75. package/es5/locale/hu.js +7 -1
  76. package/es5/locale/hu.js.map +1 -1
  77. package/es5/locale/id.js +7 -1
  78. package/es5/locale/id.js.map +1 -1
  79. package/es5/locale/it.js +7 -1
  80. package/es5/locale/it.js.map +1 -1
  81. package/es5/locale/ja.js +7 -1
  82. package/es5/locale/ja.js.map +1 -1
  83. package/es5/locale/ko.js +7 -1
  84. package/es5/locale/ko.js.map +1 -1
  85. package/es5/locale/lt.js +7 -1
  86. package/es5/locale/lt.js.map +1 -1
  87. package/es5/locale/lv.js +7 -1
  88. package/es5/locale/lv.js.map +1 -1
  89. package/es5/locale/nl.js +7 -1
  90. package/es5/locale/nl.js.map +1 -1
  91. package/es5/locale/no.js +7 -1
  92. package/es5/locale/no.js.map +1 -1
  93. package/es5/locale/pl.js +7 -1
  94. package/es5/locale/pl.js.map +1 -1
  95. package/es5/locale/pt.js +7 -1
  96. package/es5/locale/pt.js.map +1 -1
  97. package/es5/locale/ro.js +7 -1
  98. package/es5/locale/ro.js.map +1 -1
  99. package/es5/locale/ru.js +7 -1
  100. package/es5/locale/ru.js.map +1 -1
  101. package/es5/locale/sk.js +7 -1
  102. package/es5/locale/sk.js.map +1 -1
  103. package/es5/locale/sl.js +7 -1
  104. package/es5/locale/sl.js.map +1 -1
  105. package/es5/locale/sr-Cyrl.js +7 -1
  106. package/es5/locale/sr-Cyrl.js.map +1 -1
  107. package/es5/locale/sr-Latn.js +7 -1
  108. package/es5/locale/sr-Latn.js.map +1 -1
  109. package/es5/locale/sv.js +7 -1
  110. package/es5/locale/sv.js.map +1 -1
  111. package/es5/locale/th.js +7 -1
  112. package/es5/locale/th.js.map +1 -1
  113. package/es5/locale/tr.js +7 -1
  114. package/es5/locale/tr.js.map +1 -1
  115. package/es5/locale/uk.js +7 -1
  116. package/es5/locale/uk.js.map +1 -1
  117. package/es5/locale/vi.js +7 -1
  118. package/es5/locale/vi.js.map +1 -1
  119. package/es5/locale/zh-Hans.js +7 -1
  120. package/es5/locale/zh-Hans.js.map +1 -1
  121. package/es5/locale/zh-Hant.js +7 -1
  122. package/es5/locale/zh-Hant.js.map +1 -1
  123. package/es5/mixins/groupable/index.js +9 -1
  124. package/es5/mixins/groupable/index.js.map +1 -1
  125. package/es5/{components/VCalendar/mixins/mouse.js → mixins/mouse/index.js} +14 -6
  126. package/es5/mixins/mouse/index.js.map +1 -0
  127. package/es5/mixins/validatable/index.js +14 -4
  128. package/es5/mixins/validatable/index.js.map +1 -1
  129. package/lib/components/VCalendar/mixins/calendar-base.js +1 -1
  130. package/lib/components/VCalendar/mixins/calendar-base.js.map +1 -1
  131. package/lib/components/VDataTable/VDataTable.js +56 -24
  132. package/lib/components/VDataTable/VDataTable.js.map +1 -1
  133. package/lib/components/VExpansionPanel/VExpansionPanelContent.js +3 -1
  134. package/lib/components/VExpansionPanel/VExpansionPanelContent.js.map +1 -1
  135. package/lib/components/VExpansionPanel/VExpansionPanelHeader.js +3 -1
  136. package/lib/components/VExpansionPanel/VExpansionPanelHeader.js.map +1 -1
  137. package/lib/components/VInput/VInput.js +11 -1
  138. package/lib/components/VInput/VInput.js.map +1 -1
  139. package/lib/components/VItemGroup/VItem.js +14 -3
  140. package/lib/components/VItemGroup/VItem.js.map +1 -1
  141. package/lib/components/VMenu/VMenu.js +7 -0
  142. package/lib/components/VMenu/VMenu.js.map +1 -1
  143. package/lib/components/VPagination/VPagination.js +8 -2
  144. package/lib/components/VPagination/VPagination.js.map +1 -1
  145. package/lib/components/VRadioGroup/VRadio.js +14 -4
  146. package/lib/components/VRadioGroup/VRadio.js.map +1 -1
  147. package/lib/components/VSelect/VSelect.js +4 -1
  148. package/lib/components/VSelect/VSelect.js.map +1 -1
  149. package/lib/components/VSkeletonLoader/VSkeletonLoader.js +10 -5
  150. package/lib/components/VSkeletonLoader/VSkeletonLoader.js.map +1 -1
  151. package/lib/components/VSlideGroup/VSlideGroup.js +5 -1
  152. package/lib/components/VSlideGroup/VSlideGroup.js.map +1 -1
  153. package/lib/components/VTabs/VTab.js +4 -0
  154. package/lib/components/VTabs/VTab.js.map +1 -1
  155. package/lib/components/VTimePicker/VTimePicker.js +19 -0
  156. package/lib/components/VTimePicker/VTimePicker.js.map +1 -1
  157. package/lib/framework.js +1 -1
  158. package/lib/locale/af.js +7 -1
  159. package/lib/locale/af.js.map +1 -1
  160. package/lib/locale/ar.js +7 -1
  161. package/lib/locale/ar.js.map +1 -1
  162. package/lib/locale/az.js +7 -1
  163. package/lib/locale/az.js.map +1 -1
  164. package/lib/locale/bg.js +7 -1
  165. package/lib/locale/bg.js.map +1 -1
  166. package/lib/locale/ca.js +7 -1
  167. package/lib/locale/ca.js.map +1 -1
  168. package/lib/locale/ckb.js +7 -1
  169. package/lib/locale/ckb.js.map +1 -1
  170. package/lib/locale/cs.js +7 -1
  171. package/lib/locale/cs.js.map +1 -1
  172. package/lib/locale/da.js +7 -1
  173. package/lib/locale/da.js.map +1 -1
  174. package/lib/locale/de.js +7 -1
  175. package/lib/locale/de.js.map +1 -1
  176. package/lib/locale/el.js +7 -1
  177. package/lib/locale/el.js.map +1 -1
  178. package/lib/locale/en.js +7 -1
  179. package/lib/locale/en.js.map +1 -1
  180. package/lib/locale/es.js +7 -1
  181. package/lib/locale/es.js.map +1 -1
  182. package/lib/locale/et.js +7 -1
  183. package/lib/locale/et.js.map +1 -1
  184. package/lib/locale/fa.js +7 -1
  185. package/lib/locale/fa.js.map +1 -1
  186. package/lib/locale/fi.js +7 -1
  187. package/lib/locale/fi.js.map +1 -1
  188. package/lib/locale/fr.js +7 -1
  189. package/lib/locale/fr.js.map +1 -1
  190. package/lib/locale/he.js +7 -1
  191. package/lib/locale/he.js.map +1 -1
  192. package/lib/locale/hr.js +7 -1
  193. package/lib/locale/hr.js.map +1 -1
  194. package/lib/locale/hu.js +7 -1
  195. package/lib/locale/hu.js.map +1 -1
  196. package/lib/locale/id.js +7 -1
  197. package/lib/locale/id.js.map +1 -1
  198. package/lib/locale/it.js +7 -1
  199. package/lib/locale/it.js.map +1 -1
  200. package/lib/locale/ja.js +7 -1
  201. package/lib/locale/ja.js.map +1 -1
  202. package/lib/locale/ko.js +7 -1
  203. package/lib/locale/ko.js.map +1 -1
  204. package/lib/locale/lt.js +7 -1
  205. package/lib/locale/lt.js.map +1 -1
  206. package/lib/locale/lv.js +7 -1
  207. package/lib/locale/lv.js.map +1 -1
  208. package/lib/locale/nl.js +7 -1
  209. package/lib/locale/nl.js.map +1 -1
  210. package/lib/locale/no.js +7 -1
  211. package/lib/locale/no.js.map +1 -1
  212. package/lib/locale/pl.js +7 -1
  213. package/lib/locale/pl.js.map +1 -1
  214. package/lib/locale/pt.js +7 -1
  215. package/lib/locale/pt.js.map +1 -1
  216. package/lib/locale/ro.js +7 -1
  217. package/lib/locale/ro.js.map +1 -1
  218. package/lib/locale/ru.js +7 -1
  219. package/lib/locale/ru.js.map +1 -1
  220. package/lib/locale/sk.js +7 -1
  221. package/lib/locale/sk.js.map +1 -1
  222. package/lib/locale/sl.js +7 -1
  223. package/lib/locale/sl.js.map +1 -1
  224. package/lib/locale/sr-Cyrl.js +7 -1
  225. package/lib/locale/sr-Cyrl.js.map +1 -1
  226. package/lib/locale/sr-Latn.js +7 -1
  227. package/lib/locale/sr-Latn.js.map +1 -1
  228. package/lib/locale/sv.js +7 -1
  229. package/lib/locale/sv.js.map +1 -1
  230. package/lib/locale/th.js +7 -1
  231. package/lib/locale/th.js.map +1 -1
  232. package/lib/locale/tr.js +7 -1
  233. package/lib/locale/tr.js.map +1 -1
  234. package/lib/locale/uk.js +7 -1
  235. package/lib/locale/uk.js.map +1 -1
  236. package/lib/locale/vi.js +7 -1
  237. package/lib/locale/vi.js.map +1 -1
  238. package/lib/locale/zh-Hans.js +7 -1
  239. package/lib/locale/zh-Hans.js.map +1 -1
  240. package/lib/locale/zh-Hant.js +7 -1
  241. package/lib/locale/zh-Hant.js.map +1 -1
  242. package/lib/mixins/groupable/index.js +9 -1
  243. package/lib/mixins/groupable/index.js.map +1 -1
  244. package/lib/{components/VCalendar/mixins/mouse.js → mixins/mouse/index.js} +12 -6
  245. package/lib/mixins/mouse/index.js.map +1 -0
  246. package/lib/mixins/validatable/index.js +14 -4
  247. package/lib/mixins/validatable/index.js.map +1 -1
  248. package/package.json +2 -2
  249. package/src/components/VCalendar/mixins/calendar-base.ts +1 -1
  250. package/src/components/VDataTable/VDataTable.ts +69 -21
  251. package/src/components/VDataTable/__tests__/VDataTable.spec.ts +28 -0
  252. package/src/components/VDataTable/__tests__/__snapshots__/VDataTable.spec.ts.snap +15 -15
  253. package/src/components/VExpansionPanel/VExpansionPanelContent.ts +1 -1
  254. package/src/components/VExpansionPanel/VExpansionPanelHeader.ts +1 -1
  255. package/src/components/VFileInput/__tests__/__snapshots__/VFileInput.spec.ts.snap +18 -18
  256. package/src/components/VForm/__tests__/VForm.spec.ts +22 -1
  257. package/src/components/VInput/VInput.ts +12 -1
  258. package/src/components/VInput/__tests__/VInput.spec.ts +7 -0
  259. package/src/components/VItemGroup/VItem.sass +4 -0
  260. package/src/components/VItemGroup/VItem.ts +12 -1
  261. package/src/components/VMenu/VMenu.ts +8 -1
  262. package/src/components/VMenu/__tests__/VMenu.spec.ts +130 -0
  263. package/src/components/VPagination/VPagination.ts +17 -12
  264. package/src/components/VRadioGroup/VRadio.ts +10 -4
  265. package/src/components/VSelect/VSelect.ts +4 -1
  266. package/src/components/VSelect/__tests__/__snapshots__/VSelect2.spec.ts.snap +2 -2
  267. package/src/components/VSkeletonLoader/VSkeletonLoader.ts +10 -5
  268. package/src/components/VSkeletonLoader/__tests__/VSkeletonLoader.spec.ts +7 -0
  269. package/src/components/VSkeletonLoader/__tests__/__snapshots__/VSkeletonLoader.spec.ts.snap +31 -0
  270. package/src/components/VSlideGroup/VSlideGroup.ts +4 -0
  271. package/src/components/VTabs/VTab.ts +5 -0
  272. package/src/components/VTabs/VTabs.sass +1 -1
  273. package/src/components/VTabs/__tests__/VTabs.spec.ts +22 -0
  274. package/src/components/VTabs/_variables.scss +1 -0
  275. package/src/components/VTextField/__tests__/VTextField.spec.ts +15 -8
  276. package/src/components/VTimePicker/VTimePicker.ts +18 -0
  277. package/src/components/VTimePicker/__tests__/VTimePicker.spec.ts +65 -0
  278. package/src/locale/af.ts +6 -0
  279. package/src/locale/ar.ts +6 -0
  280. package/src/locale/az.ts +6 -0
  281. package/src/locale/bg.ts +6 -0
  282. package/src/locale/ca.ts +6 -0
  283. package/src/locale/ckb.ts +6 -0
  284. package/src/locale/cs.ts +6 -0
  285. package/src/locale/da.ts +6 -0
  286. package/src/locale/de.ts +6 -0
  287. package/src/locale/el.ts +6 -0
  288. package/src/locale/en.ts +6 -0
  289. package/src/locale/es.ts +6 -0
  290. package/src/locale/et.ts +6 -0
  291. package/src/locale/fa.ts +6 -0
  292. package/src/locale/fi.ts +6 -0
  293. package/src/locale/fr.ts +6 -0
  294. package/src/locale/he.ts +6 -0
  295. package/src/locale/hr.ts +6 -0
  296. package/src/locale/hu.ts +6 -0
  297. package/src/locale/id.ts +6 -0
  298. package/src/locale/it.ts +6 -0
  299. package/src/locale/ja.ts +6 -0
  300. package/src/locale/ko.ts +6 -0
  301. package/src/locale/lt.ts +6 -0
  302. package/src/locale/lv.ts +6 -0
  303. package/src/locale/nl.ts +6 -0
  304. package/src/locale/no.ts +6 -0
  305. package/src/locale/pl.ts +6 -0
  306. package/src/locale/pt.ts +6 -0
  307. package/src/locale/ro.ts +6 -0
  308. package/src/locale/ru.ts +6 -0
  309. package/src/locale/sk.ts +6 -0
  310. package/src/locale/sl.ts +6 -0
  311. package/src/locale/sr-Cyrl.ts +6 -0
  312. package/src/locale/sr-Latn.ts +6 -0
  313. package/src/locale/sv.ts +6 -0
  314. package/src/locale/th.ts +6 -0
  315. package/src/locale/tr.ts +6 -0
  316. package/src/locale/uk.ts +6 -0
  317. package/src/locale/vi.ts +6 -0
  318. package/src/locale/zh-Hans.ts +6 -0
  319. package/src/locale/zh-Hant.ts +6 -0
  320. package/src/mixins/groupable/index.ts +9 -2
  321. package/src/{components/VCalendar/mixins → mixins/mouse}/__tests__/mouse.spec.ts +2 -2
  322. package/src/{components/VCalendar/mixins/mouse.ts → mixins/mouse/index.ts} +10 -4
  323. package/src/mixins/validatable/index.ts +10 -4
  324. package/src/services/presets/__tests__/__snapshots__/presets.spec.ts.snap +2 -2
  325. package/src/styles/settings/_variables.scss +3 -2
  326. package/types/index.d.ts +6 -0
  327. package/es5/components/VCalendar/mixins/mouse.js.map +0 -1
  328. package/lib/components/VCalendar/mixins/mouse.js.map +0 -1
@@ -5,7 +5,7 @@ exports[`VFileInput.ts should be unclearable 1`] = `
5
5
  <div class="v-input__prepend-outer">
6
6
  <div class="v-input__icon v-input__icon--prepend">
7
7
  <button type="button"
8
- aria-label="prepend icon"
8
+ aria-label=" prepended action"
9
9
  class="v-icon notranslate v-icon--link material-icons theme--light"
10
10
  >
11
11
  $file
@@ -40,7 +40,7 @@ exports[`VFileInput.ts should display file size 1`] = `
40
40
  <div class="v-input__prepend-outer">
41
41
  <div class="v-input__icon v-input__icon--prepend">
42
42
  <button type="button"
43
- aria-label="prepend icon"
43
+ aria-label=" prepended action"
44
44
  class="v-icon notranslate v-icon--link material-icons theme--light"
45
45
  >
46
46
  $file
@@ -60,7 +60,7 @@ exports[`VFileInput.ts should display file size 1`] = `
60
60
  <div class="v-input__append-inner">
61
61
  <div class="v-input__icon v-input__icon--clear">
62
62
  <button type="button"
63
- aria-label="clear icon"
63
+ aria-label="Clear "
64
64
  tabindex="-1"
65
65
  class="v-icon notranslate v-icon--link material-icons theme--light"
66
66
  >
@@ -87,7 +87,7 @@ exports[`VFileInput.ts should display file size 2`] = `
87
87
  <div class="v-input__prepend-outer">
88
88
  <div class="v-input__icon v-input__icon--prepend">
89
89
  <button type="button"
90
- aria-label="prepend icon"
90
+ aria-label=" prepended action"
91
91
  class="v-icon notranslate v-icon--link material-icons theme--light"
92
92
  >
93
93
  $file
@@ -107,7 +107,7 @@ exports[`VFileInput.ts should display file size 2`] = `
107
107
  <div class="v-input__append-inner">
108
108
  <div class="v-input__icon v-input__icon--clear">
109
109
  <button type="button"
110
- aria-label="clear icon"
110
+ aria-label="Clear "
111
111
  tabindex="-1"
112
112
  class="v-icon notranslate v-icon--link material-icons theme--light"
113
113
  >
@@ -134,7 +134,7 @@ exports[`VFileInput.ts should display total size in counter 1`] = `
134
134
  <div class="v-input__prepend-outer">
135
135
  <div class="v-input__icon v-input__icon--prepend">
136
136
  <button type="button"
137
- aria-label="prepend icon"
137
+ aria-label=" prepended action"
138
138
  class="v-icon notranslate v-icon--link material-icons theme--light"
139
139
  >
140
140
  $file
@@ -154,7 +154,7 @@ exports[`VFileInput.ts should display total size in counter 1`] = `
154
154
  <div class="v-input__append-inner">
155
155
  <div class="v-input__icon v-input__icon--clear">
156
156
  <button type="button"
157
- aria-label="clear icon"
157
+ aria-label="Clear "
158
158
  tabindex="-1"
159
159
  class="v-icon notranslate v-icon--link material-icons theme--light"
160
160
  >
@@ -184,7 +184,7 @@ exports[`VFileInput.ts should display total size in counter 2`] = `
184
184
  <div class="v-input__prepend-outer">
185
185
  <div class="v-input__icon v-input__icon--prepend">
186
186
  <button type="button"
187
- aria-label="prepend icon"
187
+ aria-label=" prepended action"
188
188
  class="v-icon notranslate v-icon--link material-icons theme--light"
189
189
  >
190
190
  $file
@@ -204,7 +204,7 @@ exports[`VFileInput.ts should display total size in counter 2`] = `
204
204
  <div class="v-input__append-inner">
205
205
  <div class="v-input__icon v-input__icon--clear">
206
206
  <button type="button"
207
- aria-label="clear icon"
207
+ aria-label="Clear "
208
208
  tabindex="-1"
209
209
  class="v-icon notranslate v-icon--link material-icons theme--light"
210
210
  >
@@ -234,7 +234,7 @@ exports[`VFileInput.ts should render 1`] = `
234
234
  <div class="v-input__prepend-outer">
235
235
  <div class="v-input__icon v-input__icon--prepend">
236
236
  <button type="button"
237
- aria-label="prepend icon"
237
+ aria-label=" prepended action"
238
238
  class="v-icon notranslate v-icon--link material-icons theme--light"
239
239
  >
240
240
  $file
@@ -273,7 +273,7 @@ exports[`VFileInput.ts should render chips 1`] = `
273
273
  <div class="v-input__prepend-outer">
274
274
  <div class="v-input__icon v-input__icon--prepend">
275
275
  <button type="button"
276
- aria-label="prepend icon"
276
+ aria-label=" prepended action"
277
277
  class="v-icon notranslate v-icon--link material-icons theme--light"
278
278
  >
279
279
  $file
@@ -297,7 +297,7 @@ exports[`VFileInput.ts should render chips 1`] = `
297
297
  <div class="v-input__append-inner">
298
298
  <div class="v-input__icon v-input__icon--clear">
299
299
  <button type="button"
300
- aria-label="clear icon"
300
+ aria-label="Clear "
301
301
  tabindex="-1"
302
302
  class="v-icon notranslate v-icon--link material-icons theme--light"
303
303
  >
@@ -324,7 +324,7 @@ exports[`VFileInput.ts should render counter 1`] = `
324
324
  <div class="v-input__prepend-outer">
325
325
  <div class="v-input__icon v-input__icon--prepend">
326
326
  <button type="button"
327
- aria-label="prepend icon"
327
+ aria-label=" prepended action"
328
328
  class="v-icon notranslate v-icon--link material-icons theme--light"
329
329
  >
330
330
  $file
@@ -344,7 +344,7 @@ exports[`VFileInput.ts should render counter 1`] = `
344
344
  <div class="v-input__append-inner">
345
345
  <div class="v-input__icon v-input__icon--clear">
346
346
  <button type="button"
347
- aria-label="clear icon"
347
+ aria-label="Clear "
348
348
  tabindex="-1"
349
349
  class="v-icon notranslate v-icon--link material-icons theme--light"
350
350
  >
@@ -374,7 +374,7 @@ exports[`VFileInput.ts should render multiple 1`] = `
374
374
  <div class="v-input__prepend-outer">
375
375
  <div class="v-input__icon v-input__icon--prepend">
376
376
  <button type="button"
377
- aria-label="prepend icon"
377
+ aria-label=" prepended action"
378
378
  class="v-icon notranslate v-icon--link material-icons theme--light"
379
379
  >
380
380
  $file
@@ -414,7 +414,7 @@ exports[`VFileInput.ts should render small chips 1`] = `
414
414
  <div class="v-input__prepend-outer">
415
415
  <div class="v-input__icon v-input__icon--prepend">
416
416
  <button type="button"
417
- aria-label="prepend icon"
417
+ aria-label=" prepended action"
418
418
  class="v-icon notranslate v-icon--link material-icons theme--light"
419
419
  >
420
420
  $file
@@ -438,7 +438,7 @@ exports[`VFileInput.ts should render small chips 1`] = `
438
438
  <div class="v-input__append-inner">
439
439
  <div class="v-input__icon v-input__icon--clear">
440
440
  <button type="button"
441
- aria-label="clear icon"
441
+ aria-label="Clear "
442
442
  tabindex="-1"
443
443
  class="v-icon notranslate v-icon--link material-icons theme--light"
444
444
  >
@@ -494,7 +494,7 @@ exports[`VFileInput.ts should set display none if hide-input prop is set 1`] = `
494
494
  <div class="v-input__prepend-outer">
495
495
  <div class="v-input__icon v-input__icon--prepend">
496
496
  <button type="button"
497
- aria-label="prepend icon"
497
+ aria-label=" prepended action"
498
498
  class="v-icon notranslate v-icon--link material-icons theme--light"
499
499
  >
500
500
  $file
@@ -1,5 +1,5 @@
1
1
  // Libraries
2
- import Vue from 'vue'
2
+ import Vue, { h } from 'vue'
3
3
  import Vuetify from '../../../framework'
4
4
 
5
5
  // Components
@@ -232,4 +232,25 @@ describe('VForm.ts', () => {
232
232
 
233
233
  expect(disabledInputs).toBe(inputs.length)
234
234
  })
235
+
236
+ it('disables all inputs but one', async () => {
237
+ const inputs = {
238
+ functional: true,
239
+ render () {
240
+ return [h(VTextField), h(VTextField, { props: { disabled: false } })]
241
+ },
242
+ }
243
+
244
+ const wrapper = mountFunction({
245
+ propsData: { disabled: true },
246
+ slots: { default: inputs },
247
+ })
248
+
249
+ await wrapper.vm.$nextTick()
250
+
251
+ expect(wrapper.vm.inputs).toEqual([
252
+ expect.objectContaining({ isDisabled: true }),
253
+ expect.objectContaining({ isDisabled: false }),
254
+ ])
255
+ })
235
256
  })
@@ -177,9 +177,20 @@ export default baseMixins.extend<options>().extend({
177
177
  const eventName = `click:${kebabCase(type)}`
178
178
  const hasListener = !!(this.listeners$[eventName] || cb)
179
179
 
180
+ const localeKey = {
181
+ prepend: 'prependAction',
182
+ prependInner: 'prependAction',
183
+ append: 'appendAction',
184
+ appendOuter: 'appendAction',
185
+ clear: 'clear',
186
+ }[type]
187
+ const label = hasListener && localeKey
188
+ ? this.$vuetify.lang.t(`$vuetify.input.${localeKey}`, this.label ?? '')
189
+ : undefined
190
+
180
191
  const data = mergeData({
181
192
  attrs: {
182
- 'aria-label': hasListener ? kebabCase(type).split('-')[0] + ' icon' : undefined,
193
+ 'aria-label': label,
183
194
  color: this.validationState,
184
195
  dark: this.dark,
185
196
  disabled: this.isDisabled,
@@ -13,6 +13,13 @@ describe('VInput.ts', () => {
13
13
  return mount(VInput, {
14
14
  // https://github.com/vuejs/vue-test-utils/issues/1130
15
15
  sync: false,
16
+ mocks: {
17
+ $vuetify: {
18
+ lang: {
19
+ t: (val: string) => val,
20
+ },
21
+ },
22
+ },
16
23
  ...options,
17
24
  })
18
25
  }
@@ -0,0 +1,4 @@
1
+ .v-item--disabled
2
+ &,
3
+ & *
4
+ pointer-events: none
@@ -1,3 +1,6 @@
1
+ // Styles
2
+ import './VItem.sass'
3
+
1
4
  // Mixins
2
5
  import { factory as GroupableFactory } from '../../mixins/groupable'
3
6
 
@@ -16,6 +19,7 @@ export const BaseItem = Vue.extend({
16
19
  value: {
17
20
  required: false,
18
21
  },
22
+ disabled: Boolean,
19
23
  },
20
24
 
21
25
  data: () => ({
@@ -56,9 +60,16 @@ export const BaseItem = Vue.extend({
56
60
  }
57
61
 
58
62
  element.data = this._b(element.data || {}, element.tag!, {
59
- class: { [this.activeClass]: this.isActive },
63
+ class: {
64
+ [this.activeClass]: this.isActive,
65
+ 'v-item--disabled': this.disabled,
66
+ },
60
67
  })
61
68
 
69
+ if (this.disabled) {
70
+ element.data.attrs = { ...element.data.attrs, tabindex: -1 }
71
+ }
72
+
62
73
  return element
63
74
  },
64
75
  })
@@ -27,7 +27,7 @@ import {
27
27
  import goTo from '../../services/goto'
28
28
 
29
29
  // Types
30
- import { VNode, VNodeDirective, VNodeData } from 'vue'
30
+ import { VNode, VNodeDirective, VNodeData, PropType } from 'vue'
31
31
 
32
32
  const baseMixins = mixins(
33
33
  Dependent,
@@ -82,6 +82,10 @@ export default baseMixins.extend({
82
82
  type: [Boolean, String],
83
83
  default: 'v-menu-transition',
84
84
  },
85
+ contentProps: {
86
+ type: Object as PropType<Record<string, any>>,
87
+ default: () => ({}),
88
+ },
85
89
  },
86
90
 
87
91
  data () {
@@ -340,6 +344,7 @@ export default baseMixins.extend({
340
344
  const options = {
341
345
  attrs: {
342
346
  ...this.getScopeIdAttrs(),
347
+ ...this.contentProps,
343
348
  role: 'role' in this.$attrs ? this.$attrs.role : 'menu',
344
349
  },
345
350
  staticClass: 'v-menu__content',
@@ -454,6 +459,8 @@ export default baseMixins.extend({
454
459
  if (tile.tabIndex === -1) this.nextTile()
455
460
  },
456
461
  onKeyDown (e: KeyboardEvent) {
462
+ if (this.disableKeys) return
463
+
457
464
  if (e.keyCode === keyCodes.esc) {
458
465
  // Wait for dependent elements to close first
459
466
  setTimeout(() => { this.isActive = false })
@@ -259,6 +259,37 @@ describe('VMenu.ts', () => {
259
259
  expect('Unable to locate target [data-app]').toHaveBeenTipped()
260
260
  })
261
261
 
262
+ it('should be able to navigate the menu list with up and down keys', async () => {
263
+ const event = (keyCode: number) => new KeyboardEvent('keydown', { keyCode })
264
+ const wrapper = mountFunction({
265
+ propsData: { eager: true },
266
+ scopedSlots: {
267
+ default () {
268
+ return this.$createElement('div', [
269
+ this.$createElement(VListItem, { props: { link: true } }),
270
+ this.$createElement(VListItem, { props: { link: true } }),
271
+ ])
272
+ },
273
+ },
274
+ })
275
+
276
+ wrapper.setData({ isActive: true })
277
+
278
+ wrapper.vm.onKeyDown(event(keyCodes.down))
279
+
280
+ await wrapper.vm.$nextTick()
281
+
282
+ expect(wrapper.vm.listIndex).toBe(0)
283
+
284
+ wrapper.vm.onKeyDown(event(keyCodes.up))
285
+
286
+ await wrapper.vm.$nextTick()
287
+
288
+ expect(wrapper.vm.listIndex).toBe(1)
289
+
290
+ expect('Unable to locate target [data-app]').toHaveBeenTipped()
291
+ })
292
+
262
293
  it('should select first or last item when pressing home or end on active menu', async () => {
263
294
  const event = (keyCode: number) => new KeyboardEvent('keydown', { keyCode })
264
295
  const wrapper = mountFunction({
@@ -291,4 +322,103 @@ describe('VMenu.ts', () => {
291
322
 
292
323
  expect('Unable to locate target [data-app]').toHaveBeenTipped()
293
324
  })
325
+
326
+ it('should deactivate when escape is pressed', async () => {
327
+ jest.useFakeTimers()
328
+ const event = (keyCode: number) => new KeyboardEvent('keydown', { keyCode })
329
+ const wrapper = mountFunction({
330
+ propsData: { eager: true },
331
+ })
332
+
333
+ wrapper.setData({ isActive: true })
334
+
335
+ wrapper.vm.onKeyDown(event(keyCodes.esc))
336
+
337
+ await wrapper.vm.$nextTick()
338
+ jest.runAllTimers()
339
+
340
+ expect(wrapper.vm.isActive).toBe(false)
341
+
342
+ expect('Unable to locate target [data-app]').toHaveBeenTipped()
343
+ jest.useRealTimers()
344
+ })
345
+
346
+ it('should disable escape key when disableKeys is true', async () => {
347
+ const event = (keyCode: number) => new KeyboardEvent('keydown', { keyCode })
348
+ const wrapper = mountFunction({
349
+ propsData: {
350
+ eager: true,
351
+ disableKeys: true,
352
+ },
353
+ })
354
+
355
+ wrapper.setData({ isActive: true })
356
+
357
+ wrapper.vm.onKeyDown(event(keyCodes.esc))
358
+
359
+ await wrapper.vm.$nextTick()
360
+
361
+ expect(wrapper.vm.isActive).toBe(true)
362
+
363
+ expect('Unable to locate target [data-app]').toHaveBeenTipped()
364
+ })
365
+
366
+ it('should disable navigation keys when disableKeys is true', async () => {
367
+ const event = (keyCode: number) => new KeyboardEvent('keydown', { keyCode })
368
+ const wrapper = mountFunction({
369
+ propsData: {
370
+ eager: true,
371
+ disableKeys: true,
372
+ },
373
+ scopedSlots: {
374
+ default () {
375
+ return this.$createElement('div', [
376
+ this.$createElement(VListItem, { props: { link: true } }),
377
+ ])
378
+ },
379
+ },
380
+ })
381
+
382
+ wrapper.setData({ isActive: true })
383
+
384
+ wrapper.vm.onKeyDown(event(keyCodes.up))
385
+ await wrapper.vm.$nextTick()
386
+ expect(wrapper.vm.listIndex).toBe(-1)
387
+
388
+ wrapper.vm.onKeyDown(event(keyCodes.down))
389
+ await wrapper.vm.$nextTick()
390
+ expect(wrapper.vm.listIndex).toBe(-1)
391
+
392
+ wrapper.vm.onKeyDown(event(keyCodes.end))
393
+ await wrapper.vm.$nextTick()
394
+ expect(wrapper.vm.listIndex).toBe(-1)
395
+
396
+ wrapper.vm.onKeyDown(event(keyCodes.home))
397
+ await wrapper.vm.$nextTick()
398
+ expect(wrapper.vm.listIndex).toBe(-1)
399
+
400
+ expect('Unable to locate target [data-app]').toHaveBeenTipped()
401
+ })
402
+
403
+ it('should not open menu on up or down press when disableKeys is true', async () => {
404
+ const event = (keyCode: number) => new KeyboardEvent('keydown', { keyCode })
405
+ const wrapper = mountFunction({
406
+ propsData: {
407
+ eager: true,
408
+ disableKeys: true,
409
+ },
410
+ })
411
+
412
+ wrapper.vm.onKeyDown(event(keyCodes.up))
413
+ await wrapper.vm.$nextTick()
414
+ expect(wrapper.vm.isActive).toBe(false)
415
+ expect(wrapper.vm.listIndex).toBe(-1)
416
+
417
+ wrapper.vm.onKeyDown(event(keyCodes.down))
418
+ await wrapper.vm.$nextTick()
419
+ expect(wrapper.vm.isActive).toBe(false)
420
+ expect(wrapper.vm.listIndex).toBe(-1)
421
+
422
+ expect('Unable to locate target [data-app]').toHaveBeenTipped()
423
+ })
294
424
  })
@@ -29,6 +29,8 @@ export default mixins(
29
29
  props: {
30
30
  circle: Boolean,
31
31
  disabled: Boolean,
32
+ navigationColor: String,
33
+ navigationTextColor: String,
32
34
  length: {
33
35
  type: Number,
34
36
  default: 0,
@@ -181,18 +183,21 @@ export default mixins(
181
183
  },
182
184
  genIcon (h: CreateElement, icon: string, disabled: boolean, fn: EventListener, label: String): VNode {
183
185
  return h('li', [
184
- h('button', {
185
- staticClass: 'v-pagination__navigation',
186
- class: {
187
- 'v-pagination__navigation--disabled': disabled,
188
- },
189
- attrs: {
190
- disabled,
191
- type: 'button',
192
- 'aria-label': label,
193
- },
194
- on: disabled ? {} : { click: fn },
195
- }, [h(VIcon, [icon])]),
186
+ h('button',
187
+ this.setBackgroundColor(this.navigationColor, {
188
+ staticClass: 'v-pagination__navigation',
189
+ class: {
190
+ 'v-pagination__navigation--disabled': disabled,
191
+ },
192
+ attrs: {
193
+ disabled,
194
+ type: 'button',
195
+ 'aria-label': label,
196
+ },
197
+ on: disabled ? {} : { click: fn },
198
+ }),
199
+ [h(VIcon, { props: { color: this.navigationTextColor } }, [icon])]
200
+ ),
196
201
  ])
197
202
  },
198
203
  genItem (h: CreateElement, i: string | number): VNode {
@@ -42,7 +42,10 @@ export default baseMixins.extend<options>().extend({
42
42
  inheritAttrs: false,
43
43
 
44
44
  props: {
45
- disabled: Boolean,
45
+ disabled: {
46
+ type: Boolean,
47
+ default: null,
48
+ },
46
49
  id: String,
47
50
  label: String,
48
51
  name: String,
@@ -54,7 +57,10 @@ export default baseMixins.extend<options>().extend({
54
57
  type: String,
55
58
  default: '$radioOn',
56
59
  },
57
- readonly: Boolean,
60
+ readonly: {
61
+ type: Boolean,
62
+ default: null,
63
+ },
58
64
  value: {
59
65
  default: null,
60
66
  },
@@ -90,13 +96,13 @@ export default baseMixins.extend<options>().extend({
90
96
  return (this.radioGroup || {}).hasState
91
97
  },
92
98
  isDisabled (): boolean {
93
- return this.disabled || (
99
+ return this.disabled ?? (
94
100
  !!this.radioGroup &&
95
101
  this.radioGroup.isDisabled
96
102
  )
97
103
  },
98
104
  isReadonly (): boolean {
99
- return this.readonly || (
105
+ return this.readonly ?? (
100
106
  !!this.radioGroup &&
101
107
  this.radioGroup.isReadonly
102
108
  )
@@ -754,7 +754,10 @@ export default baseMixins.extend<options>().extend({
754
754
  },
755
755
  onScroll () {
756
756
  if (!this.isMenuActive) {
757
- requestAnimationFrame(() => (this.getContent().scrollTop = 0))
757
+ requestAnimationFrame(() => {
758
+ const content = this.getContent()
759
+ if (content) content.scrollTop = 0
760
+ })
758
761
  } else {
759
762
  if (this.lastItem > this.computedItems.length) return
760
763
 
@@ -24,7 +24,7 @@ exports[`VSelect.ts should be clearable with prop, dirty and multi select 1`] =
24
24
  <div class="v-input__append-inner">
25
25
  <div class="v-input__icon v-input__icon--clear">
26
26
  <button type="button"
27
- aria-label="clear icon"
27
+ aria-label="$vuetify.input.clear"
28
28
  tabindex="-1"
29
29
  class="v-icon notranslate v-icon--link material-icons theme--light"
30
30
  >
@@ -85,7 +85,7 @@ exports[`VSelect.ts should be clearable with prop, dirty and single select 1`] =
85
85
  <div class="v-input__append-inner">
86
86
  <div class="v-input__icon v-input__icon--clear">
87
87
  <button type="button"
88
- aria-label="clear icon"
88
+ aria-label="$vuetify.input.clear"
89
89
  tabindex="-1"
90
90
  class="v-icon notranslate v-icon--link material-icons theme--light"
91
91
  >
@@ -32,6 +32,10 @@ export default mixins(
32
32
  props: {
33
33
  boilerplate: Boolean,
34
34
  loading: Boolean,
35
+ loadingText: {
36
+ type: String,
37
+ default: '$vuetify.loading',
38
+ },
35
39
  tile: Boolean,
36
40
  transition: String,
37
41
  type: String,
@@ -45,12 +49,13 @@ export default mixins(
45
49
  attrs (): object {
46
50
  if (!this.isLoading) return this.$attrs
47
51
 
48
- return !this.boilerplate ? {
49
- 'aria-busy': true,
50
- 'aria-live': 'polite',
51
- role: 'alert',
52
+ return {
53
+ 'aria-busy': !this.boilerplate ? true : undefined,
54
+ 'aria-live': !this.boilerplate ? 'polite' : undefined,
55
+ 'aria-label': !this.boilerplate ? this.$vuetify.lang.t(this.loadingText) : undefined,
56
+ role: !this.boilerplate ? 'alert' : undefined,
52
57
  ...this.$attrs,
53
- } : {}
58
+ }
54
59
  },
55
60
  classes (): object {
56
61
  return {
@@ -15,6 +15,13 @@ describe('VSkeletonLoader.ts', () => {
15
15
  beforeEach(() => {
16
16
  mountFunction = (options = {}) => {
17
17
  return mount(VSkeletonLoader, {
18
+ mocks: {
19
+ $vuetify: {
20
+ lang: {
21
+ t: (v: string) => v,
22
+ },
23
+ },
24
+ },
18
25
  ...options,
19
26
  })
20
27
  }