quasar 2.9.2 → 2.10.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 (337) hide show
  1. package/dist/api/Dialog.json +25 -68
  2. package/dist/api/Intersection.json +25 -100
  3. package/dist/api/Loading.json +5 -20
  4. package/dist/api/LoadingBar.json +1 -7
  5. package/dist/api/LocalStorage.json +4 -16
  6. package/dist/api/Morph.json +2 -14
  7. package/dist/api/Notify.json +0 -3
  8. package/dist/api/Platform.json +1 -4
  9. package/dist/api/QAjaxBar.json +1 -11
  10. package/dist/api/QBreadcrumbs.json +0 -8
  11. package/dist/api/QBreadcrumbsEl.json +0 -14
  12. package/dist/api/QBtn.json +0 -3
  13. package/dist/api/QBtnDropdown.json +32 -8
  14. package/dist/api/QCarousel.json +0 -10
  15. package/dist/api/QCarouselControl.json +0 -3
  16. package/dist/api/QCircularProgress.json +0 -23
  17. package/dist/api/QColor.json +0 -3
  18. package/dist/api/QDialog.json +18 -9
  19. package/dist/api/QDrawer.json +0 -6
  20. package/dist/api/QExpansionItem.json +0 -3
  21. package/dist/api/QFab.json +1 -6
  22. package/dist/api/QFabAction.json +1 -3
  23. package/dist/api/QField.json +1 -6
  24. package/dist/api/QFile.json +12 -29
  25. package/dist/api/QFooter.json +0 -3
  26. package/dist/api/QHeader.json +0 -6
  27. package/dist/api/QInfiniteScroll.json +9 -16
  28. package/dist/api/QInnerLoading.json +0 -4
  29. package/dist/api/QInput.json +8 -15
  30. package/dist/api/QIntersection.json +0 -4
  31. package/dist/api/QItemLabel.json +0 -5
  32. package/dist/api/QKnob.json +3 -36
  33. package/dist/api/QLayout.json +6 -24
  34. package/dist/api/QLinearProgress.json +0 -6
  35. package/dist/api/QList.json +15 -0
  36. package/dist/api/QMenu.json +7 -12
  37. package/dist/api/QOptionGroup.json +0 -3
  38. package/dist/api/QPage.json +2 -8
  39. package/dist/api/QPageScroller.json +0 -9
  40. package/dist/api/QPageSticky.json +0 -3
  41. package/dist/api/QPagination.json +138 -127
  42. package/dist/api/QParallax.json +2 -14
  43. package/dist/api/QPopupEdit.json +0 -8
  44. package/dist/api/QPopupProxy.json +0 -4
  45. package/dist/api/QRange.json +5 -32
  46. package/dist/api/QRating.json +0 -4
  47. package/dist/api/QResizeObserver.json +2 -8
  48. package/dist/api/QScrollArea.json +8 -36
  49. package/dist/api/QScrollObserver.json +6 -24
  50. package/dist/api/QSelect.json +18 -108
  51. package/dist/api/QSlideItem.json +1 -6
  52. package/dist/api/QSlideTransition.json +0 -4
  53. package/dist/api/QSlider.json +3 -24
  54. package/dist/api/QSpinner.json +0 -4
  55. package/dist/api/QSplitter.json +1 -4
  56. package/dist/api/QStepper.json +0 -7
  57. package/dist/api/QTabPanels.json +0 -7
  58. package/dist/api/QTable.json +43 -191
  59. package/dist/api/QTabs.json +1 -7
  60. package/dist/api/QTime.json +3 -12
  61. package/dist/api/QTooltip.json +7 -18
  62. package/dist/api/QTree.json +0 -3
  63. package/dist/api/QUploader.json +5 -16
  64. package/dist/api/QVirtualScroll.json +11 -56
  65. package/dist/api/Screen.json +9 -36
  66. package/dist/api/Scroll.json +2 -8
  67. package/dist/api/SessionStorage.json +4 -16
  68. package/dist/api/TouchHold.json +3 -12
  69. package/dist/api/TouchPan.json +7 -28
  70. package/dist/api/TouchRepeat.json +6 -24
  71. package/dist/api/TouchSwipe.json +3 -12
  72. package/dist/icon-set/bootstrap-icons.umd.prod.js +1 -1
  73. package/dist/icon-set/eva-icons.umd.prod.js +1 -1
  74. package/dist/icon-set/fontawesome-v5-pro.umd.prod.js +1 -1
  75. package/dist/icon-set/fontawesome-v5.umd.prod.js +1 -1
  76. package/dist/icon-set/fontawesome-v6-pro.umd.prod.js +1 -1
  77. package/dist/icon-set/fontawesome-v6.umd.prod.js +1 -1
  78. package/dist/icon-set/ionicons-v4.umd.prod.js +1 -1
  79. package/dist/icon-set/line-awesome.umd.prod.js +1 -1
  80. package/dist/icon-set/material-icons-outlined.umd.prod.js +1 -1
  81. package/dist/icon-set/material-icons-round.umd.prod.js +1 -1
  82. package/dist/icon-set/material-icons-sharp.umd.prod.js +1 -1
  83. package/dist/icon-set/material-icons.umd.prod.js +1 -1
  84. package/dist/icon-set/material-symbols-outlined.umd.prod.js +1 -1
  85. package/dist/icon-set/material-symbols-rounded.umd.prod.js +1 -1
  86. package/dist/icon-set/material-symbols-sharp.umd.prod.js +1 -1
  87. package/dist/icon-set/mdi-v3.umd.prod.js +1 -1
  88. package/dist/icon-set/mdi-v4.umd.prod.js +1 -1
  89. package/dist/icon-set/mdi-v5.umd.prod.js +1 -1
  90. package/dist/icon-set/mdi-v6.umd.prod.js +1 -1
  91. package/dist/icon-set/svg-bootstrap-icons.umd.prod.js +1 -1
  92. package/dist/icon-set/svg-eva-icons.umd.prod.js +1 -1
  93. package/dist/icon-set/svg-fontawesome-v5.umd.prod.js +1 -1
  94. package/dist/icon-set/svg-fontawesome-v6.umd.prod.js +1 -1
  95. package/dist/icon-set/svg-ionicons-v4.umd.prod.js +1 -1
  96. package/dist/icon-set/svg-ionicons-v5.umd.prod.js +1 -1
  97. package/dist/icon-set/svg-ionicons-v6.umd.prod.js +1 -1
  98. package/dist/icon-set/svg-line-awesome.umd.prod.js +1 -1
  99. package/dist/icon-set/svg-material-icons-outlined.umd.prod.js +1 -1
  100. package/dist/icon-set/svg-material-icons-round.umd.prod.js +1 -1
  101. package/dist/icon-set/svg-material-icons-sharp.umd.prod.js +1 -1
  102. package/dist/icon-set/svg-material-icons.umd.prod.js +1 -1
  103. package/dist/icon-set/svg-material-symbols-outlined.umd.prod.js +1 -1
  104. package/dist/icon-set/svg-material-symbols-rounded.umd.prod.js +1 -1
  105. package/dist/icon-set/svg-material-symbols-sharp.umd.prod.js +1 -1
  106. package/dist/icon-set/svg-mdi-v6.umd.prod.js +1 -1
  107. package/dist/icon-set/svg-themify.umd.prod.js +1 -1
  108. package/dist/icon-set/themify.umd.prod.js +1 -1
  109. package/dist/lang/ar-TN.umd.prod.js +1 -1
  110. package/dist/lang/ar.umd.prod.js +1 -1
  111. package/dist/lang/az-Latn.umd.prod.js +1 -1
  112. package/dist/lang/bg.umd.prod.js +1 -1
  113. package/dist/lang/bn.umd.prod.js +1 -1
  114. package/dist/lang/ca.umd.prod.js +1 -1
  115. package/dist/lang/cs.umd.prod.js +1 -1
  116. package/dist/lang/da.umd.prod.js +1 -1
  117. package/dist/lang/de.umd.prod.js +1 -1
  118. package/dist/lang/el.umd.prod.js +1 -1
  119. package/dist/lang/en-GB.umd.prod.js +1 -1
  120. package/dist/lang/en-US.umd.prod.js +1 -1
  121. package/dist/lang/eo.umd.prod.js +1 -1
  122. package/dist/lang/es.umd.prod.js +1 -1
  123. package/dist/lang/et.umd.prod.js +1 -1
  124. package/dist/lang/eu.umd.prod.js +1 -1
  125. package/dist/lang/fa-IR.umd.prod.js +1 -1
  126. package/dist/lang/fa.umd.prod.js +1 -1
  127. package/dist/lang/fi.umd.prod.js +1 -1
  128. package/dist/lang/fr.umd.prod.js +1 -1
  129. package/dist/lang/gn.umd.prod.js +1 -1
  130. package/dist/lang/he.umd.prod.js +1 -1
  131. package/dist/lang/hr.umd.prod.js +1 -1
  132. package/dist/lang/hu.umd.prod.js +1 -1
  133. package/dist/lang/id.umd.prod.js +1 -1
  134. package/dist/lang/is.umd.prod.js +1 -1
  135. package/dist/lang/it.umd.prod.js +1 -1
  136. package/dist/lang/ja.umd.prod.js +1 -1
  137. package/dist/lang/km.umd.prod.js +1 -1
  138. package/dist/lang/ko-KR.umd.prod.js +1 -1
  139. package/dist/lang/kur-CKB.umd.prod.js +1 -1
  140. package/dist/lang/kz.umd.prod.js +1 -1
  141. package/dist/lang/lt.umd.prod.js +1 -1
  142. package/dist/lang/lu.umd.prod.js +1 -1
  143. package/dist/lang/lv.umd.prod.js +1 -1
  144. package/dist/lang/ml.umd.prod.js +1 -1
  145. package/dist/lang/mm.umd.prod.js +1 -1
  146. package/dist/lang/ms.umd.prod.js +1 -1
  147. package/dist/lang/my.umd.prod.js +1 -1
  148. package/dist/lang/nb-NO.umd.prod.js +1 -1
  149. package/dist/lang/nl.umd.prod.js +1 -1
  150. package/dist/lang/pl.umd.prod.js +1 -1
  151. package/dist/lang/pt-BR.umd.prod.js +1 -1
  152. package/dist/lang/pt.umd.prod.js +1 -1
  153. package/dist/lang/ro.umd.prod.js +1 -1
  154. package/dist/lang/ru.umd.prod.js +1 -1
  155. package/dist/lang/sk.umd.prod.js +1 -1
  156. package/dist/lang/sl.umd.prod.js +1 -1
  157. package/dist/lang/sm.umd.prod.js +1 -1
  158. package/dist/lang/sr-CYR.umd.prod.js +1 -1
  159. package/dist/lang/sr.umd.prod.js +1 -1
  160. package/dist/lang/sv.umd.prod.js +1 -1
  161. package/dist/lang/ta.umd.prod.js +1 -1
  162. package/dist/lang/th.umd.prod.js +1 -1
  163. package/dist/lang/tr.umd.prod.js +1 -1
  164. package/dist/lang/ug.umd.prod.js +1 -1
  165. package/dist/lang/uk.umd.prod.js +1 -1
  166. package/dist/lang/uz-Cyrl.umd.prod.js +1 -1
  167. package/dist/lang/uz-Latn.umd.prod.js +1 -1
  168. package/dist/lang/vi.umd.prod.js +1 -1
  169. package/dist/lang/zh-CN.umd.prod.js +1 -1
  170. package/dist/lang/zh-TW.umd.prod.js +1 -1
  171. package/dist/quasar.cjs.prod.js +2 -2
  172. package/dist/quasar.css +12 -2
  173. package/dist/quasar.esm.js +603 -445
  174. package/dist/quasar.esm.prod.js +2 -2
  175. package/dist/quasar.prod.css +1 -1
  176. package/dist/quasar.rtl.css +28 -2
  177. package/dist/quasar.rtl.prod.css +1 -1
  178. package/dist/quasar.sass +13 -3
  179. package/dist/quasar.umd.js +603 -445
  180. package/dist/quasar.umd.prod.js +2 -2
  181. package/dist/transforms/auto-import.json +7 -3
  182. package/dist/transforms/import-map.json +2 -0
  183. package/dist/types/index.d.ts +116 -106
  184. package/dist/vetur/quasar-attributes.json +65 -49
  185. package/dist/vetur/quasar-tags.json +18 -14
  186. package/dist/web-types/web-types.json +261 -222
  187. package/package.json +3 -3
  188. package/src/api.extends.json +1 -2
  189. package/src/components/ajax-bar/QAjaxBar.json +5 -11
  190. package/src/components/badge/QBadge.js +1 -1
  191. package/src/components/breadcrumbs/QBreadcrumbs.json +0 -2
  192. package/src/components/breadcrumbs/QBreadcrumbsEl.json +1 -6
  193. package/src/components/breadcrumbs/__tests__/BasicBreadcrumbs.vue +7 -0
  194. package/src/components/breadcrumbs/__tests__/BreadcrumbWithSeparatorSlot.vue +11 -0
  195. package/src/components/breadcrumbs/__tests__/QBreadcrumbs.spec.js +112 -0
  196. package/src/components/breadcrumbs/__tests__/QBreadcrumbsEl.spec.js +87 -0
  197. package/src/components/btn/QBtn.json +1 -3
  198. package/src/components/btn/__tests__/QBtn.spec.js +87 -14
  199. package/src/components/btn/__tests__/use-btn.spec.js +385 -58
  200. package/src/components/btn/use-btn.js +24 -14
  201. package/src/components/btn-dropdown/QBtnDropdown.js +34 -18
  202. package/src/components/btn-dropdown/QBtnDropdown.json +1 -3
  203. package/src/components/btn-toggle/QBtnToggle.js +14 -14
  204. package/src/components/btn-toggle/QBtnToggle.json +2 -4
  205. package/src/components/carousel/QCarousel.json +4 -9
  206. package/src/components/carousel/QCarouselControl.json +0 -1
  207. package/src/components/checkbox/use-checkbox.js +1 -1
  208. package/src/components/checkbox/use-checkbox.json +1 -2
  209. package/src/components/chip/QChip.js +14 -11
  210. package/src/components/circular-progress/QCircularProgress.json +0 -5
  211. package/src/components/color/QColor.json +0 -1
  212. package/src/components/date/QDate.js +3 -3
  213. package/src/components/date/QDate.json +28 -56
  214. package/src/components/dialog/QDialog.js +32 -41
  215. package/src/components/dialog/QDialog.json +9 -2
  216. package/src/components/dialog-bottom-sheet/BottomSheet.js +7 -4
  217. package/src/components/dialog-plugin/DialogPlugin.js +4 -4
  218. package/src/components/drawer/QDrawer.js +10 -8
  219. package/src/components/drawer/QDrawer.json +0 -4
  220. package/src/components/editor/QEditor.json +3 -6
  221. package/src/components/expansion-item/QExpansionItem.js +3 -3
  222. package/src/components/expansion-item/QExpansionItem.json +3 -8
  223. package/src/components/fab/QFab.json +0 -1
  224. package/src/components/fab/use-fab.json +0 -1
  225. package/src/components/field/QField.json +0 -1
  226. package/src/components/file/QFile.js +4 -1
  227. package/src/components/file/QFile.json +19 -20
  228. package/src/components/footer/QFooter.js +5 -3
  229. package/src/components/footer/QFooter.json +0 -1
  230. package/src/components/form/QForm.js +5 -3
  231. package/src/components/form/QForm.json +2 -4
  232. package/src/components/header/QHeader.js +5 -3
  233. package/src/components/header/QHeader.json +0 -4
  234. package/src/components/infinite-scroll/QInfiniteScroll.json +9 -6
  235. package/src/components/inner-loading/QInnerLoading.js +2 -5
  236. package/src/components/input/QInput.js +4 -1
  237. package/src/components/input/QInput.json +11 -7
  238. package/src/components/input/use-mask.js +2 -2
  239. package/src/components/intersection/QIntersection.json +0 -1
  240. package/src/components/item/QItem.js +1 -0
  241. package/src/components/item/QItem.json +1 -2
  242. package/src/components/item/QItemLabel.json +0 -1
  243. package/src/components/item/QList.js +7 -2
  244. package/src/components/item/QList.json +7 -0
  245. package/src/components/knob/QKnob.js +3 -3
  246. package/src/components/knob/QKnob.json +3 -12
  247. package/src/components/layout/QLayout.js +1 -1
  248. package/src/components/layout/QLayout.json +6 -12
  249. package/src/components/linear-progress/QLinearProgress.json +0 -2
  250. package/src/components/menu/QMenu.js +8 -5
  251. package/src/components/menu/QMenu.json +0 -2
  252. package/src/components/option-group/QOptionGroup.js +1 -1
  253. package/src/components/option-group/QOptionGroup.json +2 -5
  254. package/src/components/page/QPage.js +11 -4
  255. package/src/components/page/QPage.json +3 -6
  256. package/src/components/page/QPageContainer.js +5 -3
  257. package/src/components/page-scroller/QPageScroller.json +0 -2
  258. package/src/components/page-sticky/QPageSticky.json +0 -1
  259. package/src/components/page-sticky/use-page-sticky.js +5 -3
  260. package/src/components/pagination/QPagination.js +265 -188
  261. package/src/components/pagination/QPagination.json +87 -78
  262. package/src/components/pagination/QPagination.sass +14 -0
  263. package/src/components/parallax/QParallax.json +2 -6
  264. package/src/components/popup-edit/QPopupEdit.js +3 -3
  265. package/src/components/popup-edit/QPopupEdit.json +4 -10
  266. package/src/components/popup-proxy/QPopupProxy.json +0 -1
  267. package/src/components/radio/QRadio.json +1 -2
  268. package/src/components/range/QRange.json +2 -4
  269. package/src/components/rating/QRating.json +0 -1
  270. package/src/components/resize-observer/QResizeObserver.js +14 -10
  271. package/src/components/resize-observer/QResizeObserver.json +2 -4
  272. package/src/components/scroll-area/QScrollArea.js +15 -4
  273. package/src/components/scroll-area/QScrollArea.json +24 -50
  274. package/src/components/scroll-observer/QScrollObserver.js +2 -0
  275. package/src/components/scroll-observer/QScrollObserver.json +6 -12
  276. package/src/components/select/QSelect.js +20 -24
  277. package/src/components/select/QSelect.json +30 -65
  278. package/src/components/select/QSelect.sass +2 -2
  279. package/src/components/slide-item/QSlideItem.json +1 -2
  280. package/src/components/slide-transition/QSlideTransition.json +0 -1
  281. package/src/components/slider/use-slider.json +33 -70
  282. package/src/components/spinner/QSpinner.json +0 -1
  283. package/src/components/splitter/QSplitter.json +1 -2
  284. package/src/components/stepper/QStep.js +7 -5
  285. package/src/components/tab-panels/QTabPanel.js +1 -1
  286. package/src/components/table/QTable.js +3 -3
  287. package/src/components/table/QTable.json +118 -239
  288. package/src/components/tabs/QRouteTab.json +0 -1
  289. package/src/components/tabs/QTabs.js +0 -7
  290. package/src/components/tabs/QTabs.json +1 -3
  291. package/src/components/tabs/use-tab.js +5 -3
  292. package/src/components/time/QTime.json +10 -20
  293. package/src/components/timeline/QTimelineEntry.js +5 -3
  294. package/src/components/toolbar/QToolbar.js +1 -1
  295. package/src/components/tooltip/QTooltip.js +3 -6
  296. package/src/components/tooltip/QTooltip.json +0 -4
  297. package/src/components/tree/QTree.js +6 -6
  298. package/src/components/tree/QTree.json +15 -31
  299. package/src/components/uploader/QUploader.json +13 -22
  300. package/src/components/uploader/QUploaderAddTrigger.js +7 -3
  301. package/src/components/uploader/xhr-uploader-plugin.js +1 -1
  302. package/src/components/uploader/xhr-uploader-plugin.json +25 -50
  303. package/src/components/virtual-scroll/QVirtualScroll.json +5 -10
  304. package/src/components/virtual-scroll/use-virtual-scroll.js +1 -1
  305. package/src/components/virtual-scroll/use-virtual-scroll.json +8 -19
  306. package/src/composables/private/use-field.js +1 -1
  307. package/src/composables/private/use-field.json +2 -3
  308. package/src/composables/private/use-file.js +10 -1
  309. package/src/composables/private/use-file.json +4 -13
  310. package/src/composables/private/use-model-toggle.js +3 -3
  311. package/src/composables/private/use-panel.js +2 -2
  312. package/src/composables/private/use-panel.json +0 -2
  313. package/src/composables/private/use-portal.js +5 -1
  314. package/src/composables/private/use-portal.json +7 -1
  315. package/src/composables/private/use-transition.js +17 -11
  316. package/src/composables/private/use-transition.json +0 -1
  317. package/src/composables/private/use-validate.json +1 -3
  318. package/src/directives/Intersection.json +26 -53
  319. package/src/directives/Morph.json +4 -8
  320. package/src/directives/Mutation.json +6 -12
  321. package/src/directives/Scroll.json +2 -4
  322. package/src/directives/TouchHold.json +3 -6
  323. package/src/directives/TouchPan.json +7 -14
  324. package/src/directives/TouchRepeat.json +6 -12
  325. package/src/directives/TouchSwipe.json +3 -6
  326. package/src/plugins/BottomSheet.json +1 -2
  327. package/src/plugins/Cookies.json +2 -4
  328. package/src/plugins/Dialog.json +32 -72
  329. package/src/plugins/Loading.json +6 -11
  330. package/src/plugins/LoadingBar.json +3 -6
  331. package/src/plugins/Notify.json +4 -5
  332. package/src/plugins/Platform.json +3 -6
  333. package/src/plugins/Screen.json +9 -18
  334. package/src/utils/private/global-dialog.json +6 -12
  335. package/src/utils/private/portal.js +4 -4
  336. package/src/utils/private/symbols.js +2 -0
  337. package/src/utils/private/web-storage.json +6 -10
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Quasar Framework v2.9.2
2
+ * Quasar Framework v2.10.1
3
3
  * (c) 2015-present Razvan Stoenescu
4
4
  * Released under the MIT License.
5
5
  */
@@ -1398,6 +1398,8 @@
1398
1398
  const tabsKey = '_q_tabs_';
1399
1399
  const uploaderKey = '_q_u_';
1400
1400
 
1401
+ const emptyRenderFn = () => {};
1402
+
1401
1403
  const globalConfig = {};
1402
1404
  let globalConfigIsFrozen = false;
1403
1405
 
@@ -1610,7 +1612,7 @@
1610
1612
  }
1611
1613
 
1612
1614
  var installQuasar = function (parentApp, opts = {}) {
1613
- const $q = { version: '2.9.2' };
1615
+ const $q = { version: '2.10.1' };
1614
1616
 
1615
1617
  if (globalConfigIsFrozen === false) {
1616
1618
  if (opts.config !== void 0) {
@@ -2369,7 +2371,7 @@
2369
2371
  return () => vue.h('div', {
2370
2372
  class: classes.value,
2371
2373
  style: style.value,
2372
- role: 'alert',
2374
+ role: 'status',
2373
2375
  'aria-label': props.label
2374
2376
  }, hMergeSlot(slots.default, props.label !== void 0 ? [ props.label ] : []))
2375
2377
  }
@@ -3300,7 +3302,7 @@
3300
3302
  }
3301
3303
  );
3302
3304
 
3303
- const padding = {
3305
+ const btnPadding = {
3304
3306
  none: 0,
3305
3307
  xs: 4,
3306
3308
  sm: 8,
@@ -3320,6 +3322,21 @@
3320
3322
  const formTypes = [ 'button', 'submit', 'reset' ];
3321
3323
  const mediaTypeRE = /[^\s]\/[^\s]/;
3322
3324
 
3325
+ const btnDesignOptions = [ 'flat', 'outline', 'push', 'unelevated' ];
3326
+ const getBtnDesign = (props, defaultValue) => {
3327
+ if (props.flat === true) return 'flat'
3328
+ if (props.outline === true) return 'outline'
3329
+ if (props.push === true) return 'push'
3330
+ if (props.unelevated === true) return 'unelevated'
3331
+ return defaultValue
3332
+ };
3333
+ const getBtnDesignAttr = props => {
3334
+ const design = getBtnDesign(props);
3335
+ return design !== void 0
3336
+ ? { [ design ]: true }
3337
+ : {}
3338
+ };
3339
+
3323
3340
  const useBtnProps = {
3324
3341
  ...useSizeProps,
3325
3342
  ...useRouterLinkProps,
@@ -3333,13 +3350,14 @@
3333
3350
  icon: String,
3334
3351
  iconRight: String,
3335
3352
 
3336
- round: Boolean,
3353
+ ...btnDesignOptions.reduce(
3354
+ (acc, val) => (acc[ val ] = Boolean) && acc,
3355
+ {}
3356
+ ),
3357
+
3337
3358
  square: Boolean,
3338
- outline: Boolean,
3339
- flat: Boolean,
3340
- unelevated: Boolean,
3359
+ round: Boolean,
3341
3360
  rounded: Boolean,
3342
- push: Boolean,
3343
3361
  glossy: Boolean,
3344
3362
 
3345
3363
  size: String,
@@ -3389,7 +3407,7 @@
3389
3407
  ? Object.assign({}, obj, {
3390
3408
  padding: props.padding
3391
3409
  .split(/\s+/)
3392
- .map(v => (v in padding ? padding[ v ] + 'px' : v))
3410
+ .map(v => (v in btnPadding ? btnPadding[ v ] + 'px' : v))
3393
3411
  .join(' '),
3394
3412
  minWidth: '0',
3395
3413
  minHeight: '0'
@@ -3409,13 +3427,7 @@
3409
3427
  isActionable.value === true ? props.tabindex || 0 : -1
3410
3428
  ));
3411
3429
 
3412
- const design = vue.computed(() => {
3413
- if (props.flat === true) return 'flat'
3414
- if (props.outline === true) return 'outline'
3415
- if (props.push === true) return 'push'
3416
- if (props.unelevated === true) return 'unelevated'
3417
- return 'standard'
3418
- });
3430
+ const design = vue.computed(() => getBtnDesign(props, 'standard'));
3419
3431
 
3420
3432
  const attributes = vue.computed(() => {
3421
3433
  const acc = { tabindex: tabIndex.value };
@@ -4175,7 +4187,7 @@
4175
4187
  };
4176
4188
 
4177
4189
  const useModelToggleEmits = [
4178
- 'before-show', 'show', 'before-hide', 'hide'
4190
+ 'beforeShow', 'show', 'beforeHide', 'hide'
4179
4191
  ];
4180
4192
 
4181
4193
  // handleShow/handleHide -> removeTick(), self (& emit show)
@@ -4235,7 +4247,7 @@
4235
4247
 
4236
4248
  showing.value = true;
4237
4249
 
4238
- emit('before-show', evt);
4250
+ emit('beforeShow', evt);
4239
4251
 
4240
4252
  if (handleShow !== void 0) {
4241
4253
  handleShow(evt);
@@ -4274,7 +4286,7 @@
4274
4286
 
4275
4287
  showing.value = false;
4276
4288
 
4277
- emit('before-hide', evt);
4289
+ emit('beforeHide', evt);
4278
4290
 
4279
4291
  if (handleHide !== void 0) {
4280
4292
  handleHide(evt);
@@ -4396,8 +4408,8 @@
4396
4408
 
4397
4409
  function getPortalProxy (el) {
4398
4410
  return portalProxyList.find(proxy =>
4399
- proxy.__qPortalInnerRef.value !== null
4400
- && proxy.__qPortalInnerRef.value.contains(el)
4411
+ proxy.contentEl !== null
4412
+ && proxy.contentEl.contains(el)
4401
4413
  )
4402
4414
  }
4403
4415
 
@@ -4411,7 +4423,7 @@
4411
4423
  return getParentProxy(proxy)
4412
4424
  }
4413
4425
  }
4414
- else if (proxy.__qPortalInnerRef !== void 0) {
4426
+ else if (proxy.__qPortal === true) {
4415
4427
  // treat it as point of separation if parent is QPopupProxy
4416
4428
  // (so mobile matches desktop behavior)
4417
4429
  // and hide it too
@@ -4432,7 +4444,7 @@
4432
4444
 
4433
4445
  function closePortals (proxy, evt, depth) {
4434
4446
  while (depth !== 0 && proxy !== void 0 && proxy !== null) {
4435
- if (proxy.__qPortalInnerRef !== void 0) {
4447
+ if (proxy.__qPortal === true) {
4436
4448
  depth--;
4437
4449
 
4438
4450
  if (proxy.$options.name === 'QMenu') {
@@ -4524,7 +4536,10 @@
4524
4536
  vue.onUnmounted(() => { hidePortal(true); });
4525
4537
 
4526
4538
  // needed for portal vm detection
4527
- vm.proxy.__qPortalInnerRef = innerRef;
4539
+ vm.proxy.__qPortal = true;
4540
+
4541
+ // public way of accessing the rendered content
4542
+ injectProp(vm.proxy, 'contentEl', () => innerRef.value);
4528
4543
 
4529
4544
  return {
4530
4545
  showPortal,
@@ -4562,18 +4577,24 @@
4562
4577
  }
4563
4578
  };
4564
4579
 
4565
- function useTransition (props, showing) {
4566
- const transitionState = vue.ref(showing.value);
4580
+ function useTransition (props, defaultShowFn = () => {}, defaultHideFn = () => {}) {
4581
+ return {
4582
+ transitionProps: vue.computed(() => {
4583
+ const show = `q-transition--${ props.transitionShow || defaultShowFn() }`;
4584
+ const hide = `q-transition--${ props.transitionHide || defaultHideFn() }`;
4567
4585
 
4568
- vue.watch(showing, val => {
4569
- vue.nextTick(() => { transitionState.value = val; });
4570
- });
4586
+ return {
4587
+ appear: true,
4571
4588
 
4572
- // return transition
4573
- return {
4574
- transition: vue.computed(() => 'q-transition--' + (
4575
- transitionState.value === true ? props.transitionHide : props.transitionShow
4576
- )),
4589
+ enterFromClass: `${ show }-enter-from`,
4590
+ enterActiveClass: `${ show }-enter-active`,
4591
+ enterToClass: `${ show }-enter-to`,
4592
+
4593
+ leaveFromClass: `${ hide }-leave-from`,
4594
+ leaveActiveClass: `${ hide }-leave-active`,
4595
+ leaveToClass: `${ hide }-leave-to`
4596
+ }
4597
+ }),
4577
4598
 
4578
4599
  transitionStyle: vue.computed(() => `--q-transition-duration: ${ props.transitionDuration }ms`)
4579
4600
  }
@@ -5296,7 +5317,7 @@
5296
5317
 
5297
5318
  emits: [
5298
5319
  ...useModelToggleEmits,
5299
- 'click', 'escape-key'
5320
+ 'click', 'escapeKey'
5300
5321
  ],
5301
5322
 
5302
5323
  setup (props, { slots, emit, attrs }) {
@@ -5317,7 +5338,7 @@
5317
5338
  const isDark = useDark(props, $q);
5318
5339
  const { registerTick, removeTick } = useTick();
5319
5340
  const { registerTimeout } = useTimeout();
5320
- const { transition, transitionStyle } = useTransition(props, showing);
5341
+ const { transitionProps, transitionStyle } = useTransition(props);
5321
5342
  const { localScrollTarget, changeScrollEvent, unconfigureScrollTarget } = useScrollTarget(props, configureScrollTarget);
5322
5343
 
5323
5344
  const { anchorEl, canShow } = useAnchor({ showing });
@@ -5397,7 +5418,10 @@
5397
5418
  let node = innerRef.value;
5398
5419
 
5399
5420
  if (node && node.contains(document.activeElement) !== true) {
5400
- node = node.querySelector('[autofocus], [data-autofocus]') || node;
5421
+ node = node.querySelector('[autofocus][tabindex], [data-autofocus][tabindex]')
5422
+ || node.querySelector('[autofocus] [tabindex], [data-autofocus] [tabindex]')
5423
+ || node.querySelector('[autofocus], [data-autofocus]')
5424
+ || node;
5401
5425
  node.focus({ preventScroll: true });
5402
5426
  }
5403
5427
  });
@@ -5534,7 +5558,7 @@
5534
5558
  }
5535
5559
 
5536
5560
  function onEscapeKey (evt) {
5537
- emit('escape-key');
5561
+ emit('escapeKey');
5538
5562
  hide(evt);
5539
5563
  }
5540
5564
 
@@ -5562,7 +5586,7 @@
5562
5586
  function renderPortalContent () {
5563
5587
  return vue.h(
5564
5588
  vue.Transition,
5565
- { name: transition.value, appear: true },
5589
+ transitionProps.value,
5566
5590
  () => (
5567
5591
  showing.value === true
5568
5592
  ? vue.h('div', {
@@ -5667,11 +5691,25 @@
5667
5691
  + hexBytes[ b[ 14 ] ] + hexBytes[ b[ 15 ] ]
5668
5692
  }
5669
5693
 
5694
+ const btnPropsList = Object.keys(useBtnProps);
5695
+
5696
+ const passBtnProps = props => btnPropsList.reduce(
5697
+ (acc, key) => {
5698
+ const val = props[ key ];
5699
+ if (val !== void 0) {
5700
+ acc[ key ] = val;
5701
+ }
5702
+ return acc
5703
+ },
5704
+ {}
5705
+ );
5706
+
5670
5707
  var QBtnDropdown = createComponent({
5671
5708
  name: 'QBtnDropdown',
5672
5709
 
5673
5710
  props: {
5674
5711
  ...useBtnProps,
5712
+ ...useTransitionProps,
5675
5713
 
5676
5714
  modelValue: Boolean,
5677
5715
  split: Boolean,
@@ -5703,7 +5741,7 @@
5703
5741
  toggleAriaLabel: String
5704
5742
  },
5705
5743
 
5706
- emits: [ 'update:modelValue', 'click', 'before-show', 'show', 'before-hide', 'hide' ],
5744
+ emits: [ 'update:modelValue', 'click', 'beforeShow', 'show', 'beforeHide', 'hide' ],
5707
5745
 
5708
5746
  setup (props, { slots, emit }) {
5709
5747
  const { proxy } = vue.getCurrentInstance();
@@ -5712,7 +5750,7 @@
5712
5750
  const menuRef = vue.ref(null);
5713
5751
  const targetUid = uid$3();
5714
5752
 
5715
- const attributes = vue.computed(() => {
5753
+ const ariaAttrs = vue.computed(() => {
5716
5754
  const acc = {
5717
5755
  'aria-expanded': showing.value === true ? 'true' : 'false',
5718
5756
  'aria-haspopup': 'true',
@@ -5740,6 +5778,9 @@
5740
5778
  + (props.split === false ? ' q-btn-dropdown__arrow-container' : '')
5741
5779
  );
5742
5780
 
5781
+ const btnDesignAttr = vue.computed(() => getBtnDesignAttr(props));
5782
+ const btnProps = vue.computed(() => passBtnProps(props));
5783
+
5743
5784
  vue.watch(() => props.modelValue, val => {
5744
5785
  menuRef.value !== null && menuRef.value[ val ? 'show' : 'hide' ]();
5745
5786
  });
@@ -5748,7 +5789,7 @@
5748
5789
 
5749
5790
  function onBeforeShow (e) {
5750
5791
  showing.value = true;
5751
- emit('before-show', e);
5792
+ emit('beforeShow', e);
5752
5793
  }
5753
5794
 
5754
5795
  function onShow (e) {
@@ -5758,7 +5799,7 @@
5758
5799
 
5759
5800
  function onBeforeHide (e) {
5760
5801
  showing.value = false;
5761
- emit('before-hide', e);
5802
+ emit('beforeHide', e);
5762
5803
  }
5763
5804
 
5764
5805
  function onHide (e) {
@@ -5820,6 +5861,9 @@
5820
5861
  self: props.menuSelf,
5821
5862
  offset: props.menuOffset,
5822
5863
  separateClosePopup: true,
5864
+ transitionShow: props.transitionShow,
5865
+ transitionHide: props.transitionHide,
5866
+ transitionDuration: props.transitionDuration,
5823
5867
  onBeforeShow,
5824
5868
  onShow,
5825
5869
  onBeforeHide,
@@ -5830,11 +5874,11 @@
5830
5874
  if (props.split === false) {
5831
5875
  return vue.h(QBtn, {
5832
5876
  class: 'q-btn-dropdown q-btn-dropdown--simple',
5833
- ...props,
5877
+ ...btnProps.value,
5878
+ ...ariaAttrs.value,
5834
5879
  disable: props.disable === true || props.disableMainBtn === true,
5835
5880
  noWrap: true,
5836
5881
  round: false,
5837
- ...attributes.value,
5838
5882
  onClick
5839
5883
  }, {
5840
5884
  default: () => hSlot(slots.label, []).concat(Arrow),
@@ -5844,21 +5888,17 @@
5844
5888
 
5845
5889
  return vue.h(QBtnGroup, {
5846
5890
  class: 'q-btn-dropdown q-btn-dropdown--split no-wrap q-btn-item',
5847
- outline: props.outline,
5848
- flat: props.flat,
5849
5891
  rounded: props.rounded,
5850
5892
  square: props.square,
5851
- push: props.push,
5852
- unelevated: props.unelevated,
5893
+ ...btnDesignAttr.value,
5853
5894
  glossy: props.glossy,
5854
5895
  stretch: props.stretch
5855
5896
  }, () => [
5856
5897
  vue.h(QBtn, {
5857
5898
  class: 'q-btn-dropdown--current',
5858
- ...props,
5899
+ ...btnProps.value,
5859
5900
  disable: props.disable === true || props.disableMainBtn === true,
5860
5901
  noWrap: true,
5861
- iconRight: props.iconRight,
5862
5902
  round: false,
5863
5903
  onClick: onClickHide
5864
5904
  }, {
@@ -5868,16 +5908,15 @@
5868
5908
 
5869
5909
  vue.h(QBtn, {
5870
5910
  class: 'q-btn-dropdown__arrow-container q-anchor--skip',
5871
- ...attributes.value,
5911
+ ...ariaAttrs.value,
5912
+ ...btnDesignAttr.value,
5872
5913
  disable: props.disable === true || props.disableDropdown === true,
5873
- outline: props.outline,
5874
- flat: props.flat,
5875
5914
  rounded: props.rounded,
5876
- push: props.push,
5877
- size: props.size,
5878
5915
  color: props.color,
5879
5916
  textColor: props.textColor,
5880
5917
  dense: props.dense,
5918
+ size: props.size,
5919
+ padding: props.padding,
5881
5920
  ripple: props.ripple
5882
5921
  }, () => Arrow)
5883
5922
  ])
@@ -5984,6 +6023,14 @@
5984
6023
 
5985
6024
  const injectFormInput = useFormInject(formAttrs);
5986
6025
 
6026
+ const btnDesignAttr = vue.computed(() => getBtnDesignAttr(props));
6027
+
6028
+ const btnOptionDesign = vue.computed(() => ({
6029
+ rounded: props.rounded,
6030
+ dense: props.dense,
6031
+ ...btnDesignAttr.value
6032
+ }));
6033
+
5987
6034
  const btnOptions = vue.computed(() => props.options.map((item, i) => {
5988
6035
  const { attrs, value, slot, ...opt } = item;
5989
6036
 
@@ -5991,19 +6038,11 @@
5991
6038
  slot,
5992
6039
  props: {
5993
6040
  key: i,
5994
- onClick (e) { set(value, item, e); },
5995
6041
 
5996
6042
  'aria-pressed': value === props.modelValue ? 'true' : 'false',
5997
-
5998
6043
  ...attrs,
5999
6044
  ...opt,
6000
-
6001
- outline: props.outline,
6002
- flat: props.flat,
6003
- rounded: props.rounded,
6004
- push: props.push,
6005
- unelevated: props.unelevated,
6006
- dense: props.dense,
6045
+ ...btnOptionDesign.value,
6007
6046
 
6008
6047
  disable: props.disable === true || opt.disable === true,
6009
6048
 
@@ -6021,7 +6060,9 @@
6021
6060
  padding: mergeOpt(opt, 'padding'),
6022
6061
  ripple: mergeOpt(opt, 'ripple'),
6023
6062
  stack: mergeOpt(opt, 'stack') === true,
6024
- stretch: mergeOpt(opt, 'stretch') === true
6063
+ stretch: mergeOpt(opt, 'stretch') === true,
6064
+
6065
+ onClick (e) { set(value, item, e); }
6025
6066
  }
6026
6067
  }
6027
6068
  }));
@@ -6060,12 +6101,9 @@
6060
6101
 
6061
6102
  return () => vue.h(QBtnGroup, {
6062
6103
  class: 'q-btn-toggle',
6063
- outline: props.outline,
6064
- flat: props.flat,
6104
+ ...btnDesignAttr.value,
6065
6105
  rounded: props.rounded,
6066
- push: props.push,
6067
6106
  stretch: props.stretch,
6068
- unelevated: props.unelevated,
6069
6107
  glossy: props.glossy,
6070
6108
  spread: props.spread
6071
6109
  }, getContent)
@@ -6523,7 +6561,7 @@
6523
6561
  keepAliveMax: Number
6524
6562
  };
6525
6563
 
6526
- const usePanelEmits = [ 'update:modelValue', 'before-transition', 'transition' ];
6564
+ const usePanelEmits = [ 'update:modelValue', 'beforeTransition', 'transition' ];
6527
6565
 
6528
6566
  function usePanel () {
6529
6567
  const { props, emit, proxy } = vue.getCurrentInstance();
@@ -6595,7 +6633,7 @@
6595
6633
 
6596
6634
  if (panelIndex.value !== index) {
6597
6635
  panelIndex.value = index;
6598
- emit('before-transition', newVal, oldVal);
6636
+ emit('beforeTransition', newVal, oldVal);
6599
6637
  vue.nextTick(() => {
6600
6638
  emit('transition', newVal, oldVal);
6601
6639
  });
@@ -7506,7 +7544,7 @@
7506
7544
  const attributes = vue.computed(() => {
7507
7545
  const attrs = {
7508
7546
  tabindex: tabindex.value,
7509
- role: 'checkbox',
7547
+ role: type === 'toggle' ? 'switch' : 'checkbox',
7510
7548
  'aria-label': props.label,
7511
7549
  'aria-checked': isIndeterminate.value === true
7512
7550
  ? 'mixed'
@@ -7771,16 +7809,19 @@
7771
7809
  + (isDark.value === true ? ' q-chip--dark q-dark' : '')
7772
7810
  });
7773
7811
 
7774
- const attributes = vue.computed(() => (
7775
- props.disable === true
7812
+ const attributes = vue.computed(() => {
7813
+ const chip = props.disable === true
7776
7814
  ? { tabindex: -1, 'aria-disabled': 'true' }
7777
- : {
7778
- tabindex: props.tabindex || 0,
7779
- role: 'button',
7780
- 'aria-hidden': 'false',
7781
- 'aria-label': props.removeAriaLabel || $q.lang.label.remove
7782
- }
7783
- ));
7815
+ : { tabindex: props.tabindex || 0 };
7816
+ const remove = {
7817
+ ...chip,
7818
+ role: 'button',
7819
+ 'aria-hidden': 'false',
7820
+ 'aria-label': props.removeAriaLabel || $q.lang.label.remove
7821
+ };
7822
+
7823
+ return { chip, remove }
7824
+ });
7784
7825
 
7785
7826
  function onKeyup (e) {
7786
7827
  e.keyCode === 13 /* ENTER */ && onClick(e);
@@ -7838,7 +7879,7 @@
7838
7879
  vue.h(QIcon, {
7839
7880
  class: 'q-chip__icon q-chip__icon--remove cursor-pointer',
7840
7881
  name: removeIcon.value,
7841
- ...attributes.value,
7882
+ ...attributes.value.remove,
7842
7883
  onClick: onRemove,
7843
7884
  onKeyup: onRemove
7844
7885
  })
@@ -7857,7 +7898,7 @@
7857
7898
 
7858
7899
  isClickable.value === true && Object.assign(
7859
7900
  data,
7860
- attributes.value,
7901
+ attributes.value.chip,
7861
7902
  { onClick, onKeyup }
7862
7903
  );
7863
7904
 
@@ -9341,17 +9382,21 @@
9341
9382
  if (hasObserver === true) {
9342
9383
  let observer;
9343
9384
 
9344
- vue.onMounted(() => {
9345
- vue.nextTick(() => {
9346
- targetEl = proxy.$el.parentNode;
9385
+ // initialize as soon as possible
9386
+ const init = stop => {
9387
+ targetEl = proxy.$el.parentNode;
9347
9388
 
9348
- if (targetEl) {
9349
- observer = new ResizeObserver(trigger);
9350
- observer.observe(targetEl);
9351
- emitEvent();
9352
- }
9353
- });
9354
- });
9389
+ if (targetEl) {
9390
+ observer = new ResizeObserver(trigger);
9391
+ observer.observe(targetEl);
9392
+ emitEvent();
9393
+ }
9394
+ else if (stop !== true) {
9395
+ vue.nextTick(() => { init(true); });
9396
+ }
9397
+ };
9398
+
9399
+ vue.onMounted(() => { init(); });
9355
9400
 
9356
9401
  vue.onBeforeUnmount(() => {
9357
9402
  clearTimeout(timer);
@@ -10035,13 +10080,6 @@
10035
10080
  }
10036
10081
  }
10037
10082
 
10038
- /*
10039
- * Vue has an aggressive diff (in-place replacement) so we cannot
10040
- * ensure that the instance getting destroyed is the actual tab
10041
- * reported here. As a result, we cannot use its name or check
10042
- * if it's a route one to make the necessary updates. We need to
10043
- * always check the existing list again and infer the changes.
10044
- */
10045
10083
  function unregisterTab (tabData) {
10046
10084
  tabDataList.splice(tabDataList.indexOf(tabData), 1);
10047
10085
  tabDataListLen.value--;
@@ -10173,9 +10211,11 @@
10173
10211
  };
10174
10212
 
10175
10213
  function useTab (props, slots, emit, routeData) {
10176
- const $tabs = vue.inject(tabsKey, () => {
10214
+ const $tabs = vue.inject(tabsKey, emptyRenderFn);
10215
+ if ($tabs === emptyRenderFn) {
10177
10216
  console.error('QTab/QRouteTab component needs to be child of QTabs');
10178
- });
10217
+ return emptyRenderFn
10218
+ }
10179
10219
 
10180
10220
  const { proxy } = vue.getCurrentInstance();
10181
10221
 
@@ -10451,7 +10491,7 @@
10451
10491
  props: usePanelChildProps,
10452
10492
 
10453
10493
  setup (_, { slots }) {
10454
- return () => vue.h('div', { class: 'q-tab-panel' }, hSlot(slots.default))
10494
+ return () => vue.h('div', { class: 'q-tab-panel', role: 'tabpanel' }, hSlot(slots.default))
10455
10495
  }
10456
10496
  });
10457
10497
 
@@ -13053,7 +13093,7 @@
13053
13093
 
13054
13094
  emits: [
13055
13095
  ...useDatetimeEmits,
13056
- 'range-start', 'range-end', 'navigation'
13096
+ 'rangeStart', 'rangeEnd', 'navigation'
13057
13097
  ],
13058
13098
 
13059
13099
  setup (props, { slots, emit }) {
@@ -14362,7 +14402,7 @@
14362
14402
  finalHash: initHash
14363
14403
  };
14364
14404
 
14365
- emit('range-start', getShortDate(day));
14405
+ emit('rangeStart', getShortDate(day));
14366
14406
  }
14367
14407
  else {
14368
14408
  const
@@ -14375,7 +14415,7 @@
14375
14415
  editRange.value = null;
14376
14416
  addToModel(initHash === finalHash ? day : { target: day, ...payload });
14377
14417
 
14378
- emit('range-end', {
14418
+ emit('rangeEnd', {
14379
14419
  from: getShortDate(payload.from),
14380
14420
  to: getShortDate(payload.to)
14381
14421
  });
@@ -14680,7 +14720,7 @@
14680
14720
  left: 'fixed-left items-center'
14681
14721
  };
14682
14722
 
14683
- const transitions = {
14723
+ const defaultTransitions = {
14684
14724
  standard: [ 'scale', 'scale' ],
14685
14725
  top: [ 'slide-down', 'slide-up' ],
14686
14726
  bottom: [ 'slide-up', 'slide-down' ],
@@ -14697,8 +14737,8 @@
14697
14737
  ...useModelToggleProps,
14698
14738
  ...useTransitionProps,
14699
14739
 
14700
- transitionShow: String,
14701
- transitionHide: String,
14740
+ transitionShow: String, // override useTransitionProps
14741
+ transitionHide: String, // override useTransitionProps
14702
14742
 
14703
14743
  persistent: Boolean,
14704
14744
  autoClose: Boolean,
@@ -14729,7 +14769,7 @@
14729
14769
 
14730
14770
  emits: [
14731
14771
  ...useModelToggleEmits,
14732
- 'shake', 'click', 'escape-key'
14772
+ 'shake', 'click', 'escapeKey'
14733
14773
  ],
14734
14774
 
14735
14775
  setup (props, { slots, emit, attrs }) {
@@ -14737,7 +14777,6 @@
14737
14777
 
14738
14778
  const innerRef = vue.ref(null);
14739
14779
  const showing = vue.ref(false);
14740
- const transitionState = vue.ref(false);
14741
14780
  const animating = vue.ref(false);
14742
14781
 
14743
14782
  let shakeTimeout, refocusTarget = null, isMaximized, avoidAutoClose;
@@ -14752,6 +14791,12 @@
14752
14791
  const { registerTimeout } = useTimeout();
14753
14792
  const { registerTick, removeTick } = useTick();
14754
14793
 
14794
+ const { transitionProps, transitionStyle } = useTransition(
14795
+ props,
14796
+ () => defaultTransitions[ props.position ][ 0 ],
14797
+ () => defaultTransitions[ props.position ][ 1 ]
14798
+ );
14799
+
14755
14800
  const { showPortal, hidePortal, portalIsAccessible, renderPortal } = usePortal(
14756
14801
  vm, innerRef, renderPortalContent, /* pls do check if on a global dialog */ true
14757
14802
  );
@@ -14776,26 +14821,6 @@
14776
14821
  + (props.square === true ? ' q-dialog__inner--square' : '')
14777
14822
  );
14778
14823
 
14779
- const transitionShow = vue.computed(() =>
14780
- 'q-transition--'
14781
- + (props.transitionShow === void 0 ? transitions[ props.position ][ 0 ] : props.transitionShow)
14782
- );
14783
-
14784
- const transitionHide = vue.computed(() =>
14785
- 'q-transition--'
14786
- + (props.transitionHide === void 0 ? transitions[ props.position ][ 1 ] : props.transitionHide)
14787
- );
14788
-
14789
- const transition = vue.computed(() => (
14790
- transitionState.value === true
14791
- ? transitionHide.value
14792
- : transitionShow.value
14793
- ));
14794
-
14795
- const transitionStyle = vue.computed(
14796
- () => `--q-transition-duration: ${ props.transitionDuration }ms`
14797
- );
14798
-
14799
14824
  const useBackdrop = vue.computed(() => showing.value === true && props.seamless !== true);
14800
14825
 
14801
14826
  const onEvents = vue.computed(() => (
@@ -14810,12 +14835,6 @@
14810
14835
  attrs.class
14811
14836
  ]);
14812
14837
 
14813
- vue.watch(showing, val => {
14814
- vue.nextTick(() => {
14815
- transitionState.value = val;
14816
- });
14817
- });
14818
-
14819
14838
  vue.watch(() => props.maximized, state => {
14820
14839
  showing.value === true && updateMaximized(state);
14821
14840
  });
@@ -14915,13 +14934,23 @@
14915
14934
  return
14916
14935
  }
14917
14936
 
14918
- node = node.querySelector(selector || '[autofocus], [data-autofocus]') || node;
14937
+ node = (selector !== '' ? node.querySelector(selector) : null)
14938
+ || node.querySelector('[autofocus][tabindex], [data-autofocus][tabindex]')
14939
+ || node.querySelector('[autofocus] [tabindex], [data-autofocus] [tabindex]')
14940
+ || node.querySelector('[autofocus], [data-autofocus]')
14941
+ || node;
14919
14942
  node.focus({ preventScroll: true });
14920
14943
  });
14921
14944
  }
14922
14945
 
14923
- function shake () {
14924
- focus();
14946
+ function shake (refocusTarget) {
14947
+ if (refocusTarget && typeof refocusTarget.focus === 'function') {
14948
+ refocusTarget.focus({ preventScroll: true });
14949
+ }
14950
+ else {
14951
+ focus();
14952
+ }
14953
+
14925
14954
  emit('shake');
14926
14955
 
14927
14956
  const node = innerRef.value;
@@ -14947,7 +14976,7 @@
14947
14976
  props.maximized !== true && props.noShake !== true && shake();
14948
14977
  }
14949
14978
  else {
14950
- emit('escape-key');
14979
+ emit('escapeKey');
14951
14980
  hide();
14952
14981
  }
14953
14982
  }
@@ -15002,7 +15031,7 @@
15002
15031
  hide(e);
15003
15032
  }
15004
15033
  else if (props.noShake !== true) {
15005
- shake();
15034
+ shake(e.relatedTarget);
15006
15035
  }
15007
15036
  }
15008
15037
 
@@ -15031,7 +15060,8 @@
15031
15060
 
15032
15061
  function renderPortalContent () {
15033
15062
  return vue.h('div', {
15034
- 'aria-modal': 'true',
15063
+ role: 'dialog',
15064
+ 'aria-modal': useBackdrop.value === true ? 'true' : 'false',
15035
15065
  ...attrs,
15036
15066
  class: rootClasses.value
15037
15067
  }, [
@@ -15044,14 +15074,15 @@
15044
15074
  class: 'q-dialog__backdrop fixed-full',
15045
15075
  style: transitionStyle.value,
15046
15076
  'aria-hidden': 'true',
15047
- onMousedown: onBackdropClick
15077
+ tabindex: -1,
15078
+ onFocusin: onBackdropClick
15048
15079
  })
15049
15080
  : null
15050
15081
  )),
15051
15082
 
15052
15083
  vue.h(
15053
15084
  vue.Transition,
15054
- { name: transition.value, appear: true },
15085
+ transitionProps.value,
15055
15086
  () => (
15056
15087
  showing.value === true
15057
15088
  ? vue.h('div', {
@@ -15124,7 +15155,7 @@
15124
15155
 
15125
15156
  emits: [
15126
15157
  ...useModelToggleEmits,
15127
- 'on-layout', 'mini-state'
15158
+ 'onLayout', 'miniState'
15128
15159
  ],
15129
15160
 
15130
15161
  setup (props, { slots, emit, attrs }) {
@@ -15135,9 +15166,11 @@
15135
15166
  const { preventBodyScroll } = usePreventScroll();
15136
15167
  const { registerTimeout, removeTimeout } = useTimeout();
15137
15168
 
15138
- const $layout = vue.inject(layoutKey, () => {
15169
+ const $layout = vue.inject(layoutKey, emptyRenderFn);
15170
+ if ($layout === emptyRenderFn) {
15139
15171
  console.error('QDrawer needs to be child of QLayout');
15140
- });
15172
+ return emptyRenderFn
15173
+ }
15141
15174
 
15142
15175
  let lastDesktopState, timerMini, layoutTotalWidthWatcher;
15143
15176
 
@@ -15455,7 +15488,7 @@
15455
15488
  vue.watch(offset, val => { updateLayout('offset', val); });
15456
15489
 
15457
15490
  vue.watch(onLayout, val => {
15458
- emit('on-layout', val);
15491
+ emit('onLayout', val);
15459
15492
  updateLayout('space', val);
15460
15493
  });
15461
15494
 
@@ -15479,7 +15512,7 @@
15479
15512
  }
15480
15513
  });
15481
15514
 
15482
- vue.watch(isMini, val => { emit('mini-state', val); });
15515
+ vue.watch(isMini, val => { emit('miniState', val); });
15483
15516
 
15484
15517
  function applyPosition (position) {
15485
15518
  if (position === void 0) {
@@ -15644,8 +15677,8 @@
15644
15677
  }
15645
15678
 
15646
15679
  vue.onMounted(() => {
15647
- emit('on-layout', onLayout.value);
15648
- emit('mini-state', isMini.value);
15680
+ emit('onLayout', onLayout.value);
15681
+ emit('miniState', isMini.value);
15649
15682
 
15650
15683
  lastDesktopState = props.showIfAbove === true;
15651
15684
 
@@ -16198,7 +16231,7 @@
16198
16231
 
16199
16232
  const { registerTick, removeTick } = useTick();
16200
16233
  const { registerTimeout } = useTimeout();
16201
- const { transition, transitionStyle } = useTransition(props, showing);
16234
+ const { transitionProps, transitionStyle } = useTransition(props);
16202
16235
  const { localScrollTarget, changeScrollEvent, unconfigureScrollTarget } = useScrollTarget(props, configureScrollTarget);
16203
16236
 
16204
16237
  const { anchorEl, canShow, anchorEvents } = useAnchor({ showing, configureAnchorEl });
@@ -16389,16 +16422,13 @@
16389
16422
  attrs.style,
16390
16423
  transitionStyle.value
16391
16424
  ],
16392
- role: 'complementary'
16425
+ role: 'tooltip'
16393
16426
  }, hSlot(slots.default))
16394
16427
  : null
16395
16428
  }
16396
16429
 
16397
16430
  function renderPortalContent () {
16398
- return vue.h(vue.Transition, {
16399
- name: transition.value,
16400
- appear: true
16401
- }, getTooltipContent)
16431
+ return vue.h(vue.Transition, transitionProps.value, getTooltipContent)
16402
16432
  }
16403
16433
 
16404
16434
  vue.onBeforeUnmount(anchorCleanup);
@@ -16538,6 +16568,7 @@
16538
16568
  ref: rootRef,
16539
16569
  class: classes.value,
16540
16570
  style: style.value,
16571
+ role: 'listitem',
16541
16572
  onClick,
16542
16573
  onKeyup
16543
16574
  };
@@ -17771,7 +17802,7 @@
17771
17802
 
17772
17803
  emits: [
17773
17804
  ...useModelToggleEmits,
17774
- 'click', 'after-show', 'after-hide'
17805
+ 'click', 'afterShow', 'afterHide'
17775
17806
  ],
17776
17807
 
17777
17808
  setup (props, { slots, emit }) {
@@ -17880,11 +17911,11 @@
17880
17911
  }
17881
17912
 
17882
17913
  function onShow () {
17883
- emit('after-show');
17914
+ emit('afterShow');
17884
17915
  }
17885
17916
 
17886
17917
  function onHide () {
17887
- emit('after-hide');
17918
+ emit('afterHide');
17888
17919
  }
17889
17920
 
17890
17921
  function enterGroup () {
@@ -18712,7 +18743,7 @@
18712
18743
  maxlength: [ Number, String ]
18713
18744
  };
18714
18745
 
18715
- const useFieldEmits = [ 'update:modelValue', 'clear', 'focus', 'blur', 'popup-show', 'popup-hide' ];
18746
+ const useFieldEmits = [ 'update:modelValue', 'clear', 'focus', 'blur', 'popupShow', 'popupHide' ];
18716
18747
 
18717
18748
  function useFieldState () {
18718
18749
  const { props, attrs, proxy, vnode } = vue.getCurrentInstance();
@@ -19442,7 +19473,14 @@
19442
19473
 
19443
19474
  function onDragleave (e) {
19444
19475
  stopAndPrevent(e);
19445
- e.relatedTarget !== dndRef.value && (dnd.value = false);
19476
+
19477
+ // Safari bug: relatedTarget is null for over 10 years
19478
+ // https://bugs.webkit.org/show_bug.cgi?id=66547
19479
+ const gone = e.relatedTarget !== null || client.is.safari !== true
19480
+ ? e.relatedTarget !== dndRef.value
19481
+ : document.elementsFromPoint(e.clientX, e.clientY).includes(dndRef.value) === false;
19482
+
19483
+ gone === true && (dnd.value = false);
19446
19484
  }
19447
19485
 
19448
19486
  function onDrop (e) {
@@ -19476,6 +19514,7 @@
19476
19514
  pickFiles,
19477
19515
  addFiles,
19478
19516
  onDragover,
19517
+ onDragleave,
19479
19518
  processFiles,
19480
19519
  getDndNode,
19481
19520
 
@@ -19799,9 +19838,11 @@
19799
19838
  Object.assign(proxy, {
19800
19839
  removeAtIndex,
19801
19840
  removeFile,
19802
- getNativeElement: () => inputRef.value
19841
+ getNativeElement: () => inputRef.value // deprecated
19803
19842
  });
19804
19843
 
19844
+ injectProp(proxy, 'nativeEl', () => inputRef.value);
19845
+
19805
19846
  return useField(state)
19806
19847
  }
19807
19848
  });
@@ -19829,9 +19870,11 @@
19829
19870
  setup (props, { slots, emit }) {
19830
19871
  const { proxy: { $q } } = vue.getCurrentInstance();
19831
19872
 
19832
- const $layout = vue.inject(layoutKey, () => {
19873
+ const $layout = vue.inject(layoutKey, emptyRenderFn);
19874
+ if ($layout === emptyRenderFn) {
19833
19875
  console.error('QFooter needs to be child of QLayout');
19834
- });
19876
+ return emptyRenderFn
19877
+ }
19835
19878
 
19836
19879
  const size = vue.ref(parseInt(props.heightHint, 10));
19837
19880
  const revealed = vue.ref(true);
@@ -20010,7 +20053,7 @@
20010
20053
  onSubmit: Function
20011
20054
  },
20012
20055
 
20013
- emits: [ 'reset', 'validation-success', 'validation-error' ],
20056
+ emits: [ 'reset', 'validationSuccess', 'validationError' ],
20014
20057
 
20015
20058
  setup (props, { slots, emit }) {
20016
20059
  const vm = vue.getCurrentInstance();
@@ -20027,7 +20070,7 @@
20027
20070
  const index = ++validateIndex;
20028
20071
 
20029
20072
  const emitEvent = (res, ref) => {
20030
- emit('validation-' + (res === true ? 'success' : 'error'), ref);
20073
+ emit('validation' + (res === true ? 'Success' : 'Error'), ref);
20031
20074
  };
20032
20075
 
20033
20076
  const validateComponent = comp => {
@@ -20129,7 +20172,9 @@
20129
20172
  addFocusFn(() => {
20130
20173
  if (rootRef.value === null) { return }
20131
20174
 
20132
- const target = rootRef.value.querySelector('[autofocus], [data-autofocus]')
20175
+ const target = rootRef.value.querySelector('[autofocus][tabindex], [data-autofocus][tabindex]')
20176
+ || rootRef.value.querySelector('[autofocus] [tabindex], [data-autofocus] [tabindex]')
20177
+ || rootRef.value.querySelector('[autofocus], [data-autofocus]')
20133
20178
  || Array.prototype.find.call(rootRef.value.querySelectorAll('[tabindex]'), el => el.tabIndex > -1);
20134
20179
 
20135
20180
  target !== null && target !== void 0 && target.focus({ preventScroll: true });
@@ -20249,9 +20294,11 @@
20249
20294
  setup (props, { slots, emit }) {
20250
20295
  const { proxy: { $q } } = vue.getCurrentInstance();
20251
20296
 
20252
- const $layout = vue.inject(layoutKey, () => {
20297
+ const $layout = vue.inject(layoutKey, emptyRenderFn);
20298
+ if ($layout === emptyRenderFn) {
20253
20299
  console.error('QHeader needs to be child of QLayout');
20254
- });
20300
+ return emptyRenderFn
20301
+ }
20255
20302
 
20256
20303
  const size = vue.ref(parseInt(props.heightHint, 10));
20257
20304
  const revealed = vue.ref(true);
@@ -20940,7 +20987,7 @@
20940
20987
  const vm = vue.getCurrentInstance();
20941
20988
  const isDark = useDark(props, vm.proxy.$q);
20942
20989
 
20943
- const { transition, transitionStyle } = useTransition(props, vue.computed(() => props.showing));
20990
+ const { transitionProps, transitionStyle } = useTransition(props);
20944
20991
 
20945
20992
  const classes = vue.computed(() =>
20946
20993
  'q-inner-loading absolute-full column flex-center'
@@ -20984,10 +21031,7 @@
20984
21031
  : null
20985
21032
  }
20986
21033
 
20987
- return () => vue.h(vue.Transition, {
20988
- name: transition.value,
20989
- appear: true
20990
- }, getContent)
21034
+ return () => vue.h(vue.Transition, transitionProps.value, getContent)
20991
21035
  }
20992
21036
  });
20993
21037
 
@@ -21155,7 +21199,7 @@
21155
21199
  '^'
21156
21200
  + unmask.join('')
21157
21201
  + '(' + (unmaskChar === '' ? '.' : '[^' + unmaskChar + ']') + '+)?'
21158
- + '[' + unmaskChar + ']*$'
21202
+ + (unmaskChar === '' ? '' : '[' + unmaskChar + ']*') + '$'
21159
21203
  ),
21160
21204
  extractLast = extract.length - 1,
21161
21205
  extractMatcher = extract.map((re, index) => {
@@ -21175,7 +21219,7 @@
21175
21219
 
21176
21220
  computedMask = mask;
21177
21221
  computedUnmask = val => {
21178
- const unmaskMatch = unmaskMatcher.exec(val);
21222
+ const unmaskMatch = unmaskMatcher.exec(props.reverseFillMask === true ? val : val.slice(0, mask.length));
21179
21223
  if (unmaskMatch !== null) {
21180
21224
  val = unmaskMatch.slice(1).join('');
21181
21225
  }
@@ -21964,9 +22008,11 @@
21964
22008
  Object.assign(proxy, {
21965
22009
  focus,
21966
22010
  select,
21967
- getNativeElement: () => inputRef.value
22011
+ getNativeElement: () => inputRef.value // deprecated
21968
22012
  });
21969
22013
 
22014
+ injectProp(proxy, 'nativeEl', () => inputRef.value);
22015
+
21970
22016
  return renderFn
21971
22017
  }
21972
22018
  });
@@ -22165,7 +22211,12 @@
22165
22211
  bordered: Boolean,
22166
22212
  dense: Boolean,
22167
22213
  separator: Boolean,
22168
- padding: Boolean
22214
+ padding: Boolean,
22215
+
22216
+ tag: {
22217
+ type: String,
22218
+ default: 'div'
22219
+ }
22169
22220
  },
22170
22221
 
22171
22222
  setup (props, { slots }) {
@@ -22181,7 +22232,7 @@
22181
22232
  + (props.padding === true ? ' q-list--padding' : '')
22182
22233
  );
22183
22234
 
22184
- return () => vue.h('div', { class: classes.value }, hSlot(slots.default))
22235
+ return () => vue.h(props.tag, { class: classes.value, role: 'list' }, hSlot(slots.default))
22185
22236
  }
22186
22237
  });
22187
22238
 
@@ -22219,7 +22270,7 @@
22219
22270
  readonly: Boolean
22220
22271
  },
22221
22272
 
22222
- emits: [ 'update:modelValue', 'change', 'drag-value' ],
22273
+ emits: [ 'update:modelValue', 'change', 'dragValue' ],
22223
22274
 
22224
22275
  setup (props, { slots, emit }) {
22225
22276
  const { proxy } = vue.getCurrentInstance();
@@ -22266,7 +22317,7 @@
22266
22317
  )
22267
22318
  );
22268
22319
 
22269
- const decimals = vue.computed(() => (String(props.step).trim('0').split('.')[ 1 ] || '').length);
22320
+ const decimals = vue.computed(() => (String(props.step).trim().split('.')[ 1 ] || '').length);
22270
22321
  const step = vue.computed(() => (props.step === 0 ? 1 : props.step));
22271
22322
  const instantFeedback = vue.computed(() => props.instantFeedback === true || dragging.value === true);
22272
22323
 
@@ -22401,7 +22452,7 @@
22401
22452
 
22402
22453
  newModel = between(newModel, innerMin.value, innerMax.value);
22403
22454
 
22404
- emit('drag-value', newModel);
22455
+ emit('dragValue', newModel);
22405
22456
 
22406
22457
  if (model.value !== newModel) {
22407
22458
  model.value = newModel;
@@ -22576,6 +22627,8 @@
22576
22627
 
22577
22628
  const { proxy } = vue.getCurrentInstance();
22578
22629
 
22630
+ vue.watch(() => proxy.$q.lang.rtl, emitEvent);
22631
+
22579
22632
  vue.onMounted(() => {
22580
22633
  parentEl = proxy.$el.parentNode;
22581
22634
  configureScrollTarget();
@@ -22676,7 +22729,7 @@
22676
22729
  if (height.value !== newHeight) {
22677
22730
  resized = true;
22678
22731
  height.value = newHeight;
22679
- props.onScrollHeight !== void 0 && emit('scroll-height', newHeight);
22732
+ props.onScrollHeight !== void 0 && emit('scrollHeight', newHeight);
22680
22733
  updateScrollbarWidth();
22681
22734
  }
22682
22735
  if (width.value !== newWidth) {
@@ -23222,7 +23275,7 @@
23222
23275
  );
23223
23276
 
23224
23277
  const attrs = vue.computed(() => {
23225
- const attrs = {};
23278
+ const attrs = { role: 'group' };
23226
23279
 
23227
23280
  if (props.type === 'radio') {
23228
23281
  attrs.role = 'radiogroup';
@@ -23287,10 +23340,17 @@
23287
23340
  setup (props, { slots }) {
23288
23341
  const { proxy: { $q } } = vue.getCurrentInstance();
23289
23342
 
23290
- const $layout = vue.inject(layoutKey);
23291
- vue.inject(pageContainerKey, () => {
23343
+ const $layout = vue.inject(layoutKey, emptyRenderFn);
23344
+ if ($layout === emptyRenderFn) {
23345
+ console.error('QPage needs to be a deep child of QLayout');
23346
+ return emptyRenderFn
23347
+ }
23348
+
23349
+ const $pageContainer = vue.inject(pageContainerKey, emptyRenderFn);
23350
+ if ($pageContainer === emptyRenderFn) {
23292
23351
  console.error('QPage needs to be child of QPageContainer');
23293
- });
23352
+ return emptyRenderFn
23353
+ }
23294
23354
 
23295
23355
  const style = vue.computed(() => {
23296
23356
  const offset
@@ -23333,9 +23393,11 @@
23333
23393
  setup (_, { slots }) {
23334
23394
  const { proxy: { $q } } = vue.getCurrentInstance();
23335
23395
 
23336
- const $layout = vue.inject(layoutKey, () => {
23396
+ const $layout = vue.inject(layoutKey, emptyRenderFn);
23397
+ if ($layout === emptyRenderFn) {
23337
23398
  console.error('QPageContainer needs to be child of QLayout');
23338
- });
23399
+ return emptyRenderFn
23400
+ }
23339
23401
 
23340
23402
  vue.provide(pageContainerKey, true);
23341
23403
 
@@ -23385,9 +23447,11 @@
23385
23447
  function usePageSticky () {
23386
23448
  const { props, proxy: { $q } } = vue.getCurrentInstance();
23387
23449
 
23388
- const $layout = vue.inject(layoutKey, () => {
23450
+ const $layout = vue.inject(layoutKey, emptyRenderFn);
23451
+ if ($layout === emptyRenderFn) {
23389
23452
  console.error('QPageSticky needs to be child of QLayout');
23390
- });
23453
+ return emptyRenderFn
23454
+ }
23391
23455
 
23392
23456
  const attach = vue.computed(() => {
23393
23457
  const pos = props.position;
@@ -23600,6 +23664,12 @@
23600
23664
  }
23601
23665
  });
23602
23666
 
23667
+ function getBool (val, otherwise) {
23668
+ return [ true, false ].includes(val)
23669
+ ? val
23670
+ : otherwise
23671
+ }
23672
+
23603
23673
  var QPagination = createComponent({
23604
23674
  name: 'QPagination',
23605
23675
 
@@ -23611,22 +23681,20 @@
23611
23681
  required: true
23612
23682
  },
23613
23683
  min: {
23614
- type: Number,
23684
+ type: [ Number, String ],
23615
23685
  default: 1
23616
23686
  },
23617
23687
  max: {
23618
- type: Number,
23688
+ type: [ Number, String ],
23619
23689
  required: true
23620
23690
  },
23621
-
23622
- color: {
23623
- type: String,
23624
- default: 'primary'
23691
+ maxPages: {
23692
+ type: [ Number, String ],
23693
+ default: 0,
23694
+ validator: v => (
23695
+ (typeof v === 'string' ? parseInt(v, 10) : v) >= 0
23696
+ )
23625
23697
  },
23626
- textColor: String,
23627
-
23628
- activeColor: String,
23629
- activeTextColor: String,
23630
23698
 
23631
23699
  inputStyle: [ Array, String, Object ],
23632
23700
  inputClass: [ Array, String, Object ],
@@ -23660,11 +23728,6 @@
23660
23728
  type: Boolean,
23661
23729
  default: null
23662
23730
  },
23663
- maxPages: {
23664
- type: Number,
23665
- default: 0,
23666
- validator: v => v >= 0
23667
- },
23668
23731
 
23669
23732
  ripple: {
23670
23733
  type: [ Boolean, Object ],
@@ -23680,7 +23743,21 @@
23680
23743
  push: Boolean,
23681
23744
  glossy: Boolean,
23682
23745
 
23683
- dense: Boolean,
23746
+ color: {
23747
+ type: String,
23748
+ default: 'primary'
23749
+ },
23750
+ textColor: String,
23751
+
23752
+ activeDesign: {
23753
+ type: String,
23754
+ default: '',
23755
+ values: v => v === '' || btnDesignOptions.includes(v)
23756
+ },
23757
+ activeColor: String,
23758
+ activeTextColor: String,
23759
+
23760
+ gutter: String,
23684
23761
  padding: {
23685
23762
  type: String,
23686
23763
  default: '3px 2px'
@@ -23695,6 +23772,16 @@
23695
23772
 
23696
23773
  const isDark = useDark(props, $q);
23697
23774
 
23775
+ const minProp = vue.computed(() => parseInt(props.min, 10));
23776
+ const maxProp = vue.computed(() => parseInt(props.max, 10));
23777
+ const maxPagesProp = vue.computed(() => parseInt(props.maxPages, 10));
23778
+
23779
+ const inputPlaceholder = vue.computed(() => model.value + ' / ' + maxProp.value);
23780
+ const boundaryLinksProp = vue.computed(() => getBool(props.boundaryLinks, props.input));
23781
+ const boundaryNumbersProp = vue.computed(() => getBool(props.boundaryNumbers, !props.input));
23782
+ const directionLinksProp = vue.computed(() => getBool(props.directionLinks, props.input));
23783
+ const ellipsesProp = vue.computed(() => getBool(props.ellipses, !props.input));
23784
+
23698
23785
  const newPage = vue.ref(null);
23699
23786
  const model = vue.computed({
23700
23787
  get: () => props.modelValue,
@@ -23703,32 +23790,33 @@
23703
23790
  if (props.disable || isNaN(val)) {
23704
23791
  return
23705
23792
  }
23706
- const value = between(val, props.min, props.max);
23793
+ const value = between(val, minProp.value, maxProp.value);
23707
23794
  if (props.modelValue !== value) {
23708
23795
  emit('update:modelValue', value);
23709
23796
  }
23710
23797
  }
23711
23798
  });
23712
23799
 
23713
- vue.watch(() => props.min + props.max, () => {
23800
+ vue.watch(() => `${ minProp.value }|${ maxProp.value }`, () => {
23714
23801
  model.value = props.modelValue;
23715
23802
  });
23716
23803
 
23717
- function getBool (val, otherwise) {
23718
- return [ true, false ].includes(val)
23719
- ? val
23720
- : otherwise
23721
- }
23722
-
23723
23804
  const classes = vue.computed(() =>
23724
23805
  'q-pagination row no-wrap items-center'
23725
23806
  + (props.disable === true ? ' disabled' : '')
23726
23807
  );
23727
- const inputPlaceholder = vue.computed(() => model.value + ' / ' + props.max);
23728
- const __boundaryLinks = vue.computed(() => getBool(props.boundaryLinks, props.input));
23729
- const __boundaryNumbers = vue.computed(() => getBool(props.boundaryNumbers, !props.input));
23730
- const __directionLinks = vue.computed(() => getBool(props.directionLinks, props.input));
23731
- const __ellipses = vue.computed(() => getBool(props.ellipses, !props.input));
23808
+
23809
+ const gutterProp = vue.computed(() => (
23810
+ props.gutter in btnPadding
23811
+ ? `${ btnPadding[ props.gutter ] }px`
23812
+ : props.gutter || null
23813
+ ));
23814
+ const gutterStyle = vue.computed(() => (
23815
+ gutterProp.value !== null
23816
+ ? `--q-pagination-gutter-parent:-${ gutterProp.value };--q-pagination-gutter-child:${ gutterProp.value }`
23817
+ : null
23818
+ ));
23819
+
23732
23820
  const icons = vue.computed(() => {
23733
23821
  const ico = [
23734
23822
  props.iconFirst || $q.iconSet.pagination.first,
@@ -23739,38 +23827,90 @@
23739
23827
  return $q.lang.rtl === true ? ico.reverse() : ico
23740
23828
  });
23741
23829
 
23742
- const attrs = vue.computed(() => (
23743
- props.disable === true
23744
- ? { 'aria-disabled': 'true' }
23745
- : {}
23746
- ));
23830
+ const attrs = vue.computed(() => ({
23831
+ 'aria-disabled': props.disable === true ? 'true' : 'false',
23832
+ role: 'navigation'
23833
+ }));
23747
23834
 
23835
+ const btnDesignProp = vue.computed(() => getBtnDesign(props, 'flat'));
23748
23836
  const btnProps = vue.computed(() => ({
23837
+ [ btnDesignProp.value ]: true,
23838
+
23749
23839
  round: props.round,
23750
23840
  rounded: props.rounded,
23751
23841
 
23752
- outline: props.outline,
23753
- unelevated: props.unelevated,
23754
- push: props.push,
23755
- glossy: props.glossy,
23756
-
23757
- dense: props.dense,
23758
23842
  padding: props.padding,
23759
23843
 
23760
23844
  color: props.color,
23761
- flat: true,
23845
+ textColor: props.textColor,
23846
+
23762
23847
  size: props.size,
23763
23848
  ripple: props.ripple !== null
23764
23849
  ? props.ripple
23765
23850
  : true
23766
23851
  }));
23767
23852
 
23853
+ const btnActiveDesignProp = vue.computed(() => {
23854
+ // we also reset non-active design
23855
+ const acc = { [ btnDesignProp.value ]: false };
23856
+ if (props.activeDesign !== '') {
23857
+ acc[ props.activeDesign ] = true;
23858
+ }
23859
+ return acc
23860
+ });
23768
23861
  const activeBtnProps = vue.computed(() => ({
23769
- flat: props.flat,
23862
+ ...btnActiveDesignProp.value,
23770
23863
  color: props.activeColor || props.color,
23771
23864
  textColor: props.activeTextColor || props.textColor
23772
23865
  }));
23773
23866
 
23867
+ const btnConfig = vue.computed(() => {
23868
+ let maxPages = Math.max(
23869
+ maxPagesProp.value,
23870
+ 1 + (ellipsesProp.value ? 2 : 0) + (boundaryNumbersProp.value ? 2 : 0)
23871
+ );
23872
+
23873
+ const acc = {
23874
+ pgFrom: minProp.value,
23875
+ pgTo: maxProp.value,
23876
+ ellipsesStart: false,
23877
+ ellipsesEnd: false,
23878
+ boundaryStart: false,
23879
+ boundaryEnd: false,
23880
+ marginalStyle: {
23881
+ minWidth: `${ Math.max(2, String(maxProp.value).length) }em`
23882
+ }
23883
+ };
23884
+
23885
+ if (maxPagesProp.value && maxPages < (maxProp.value - minProp.value + 1)) {
23886
+ maxPages = 1 + Math.floor(maxPages / 2) * 2;
23887
+ acc.pgFrom = Math.max(minProp.value, Math.min(maxProp.value - maxPages + 1, props.modelValue - Math.floor(maxPages / 2)));
23888
+ acc.pgTo = Math.min(maxProp.value, acc.pgFrom + maxPages - 1);
23889
+
23890
+ if (boundaryNumbersProp.value) {
23891
+ acc.boundaryStart = true;
23892
+ acc.pgFrom++;
23893
+ }
23894
+
23895
+ if (ellipsesProp.value && acc.pgFrom > (minProp.value + (boundaryNumbersProp.value ? 1 : 0))) {
23896
+ acc.ellipsesStart = true;
23897
+ acc.pgFrom++;
23898
+ }
23899
+
23900
+ if (boundaryNumbersProp.value) {
23901
+ acc.boundaryEnd = true;
23902
+ acc.pgTo--;
23903
+ }
23904
+
23905
+ if (ellipsesProp.value && acc.pgTo < (maxProp.value - (boundaryNumbersProp.value ? 1 : 0))) {
23906
+ acc.ellipsesEnd = true;
23907
+ acc.pgTo--;
23908
+ }
23909
+ }
23910
+
23911
+ return acc
23912
+ });
23913
+
23774
23914
  function set (value) {
23775
23915
  model.value = value;
23776
23916
  }
@@ -23779,20 +23919,40 @@
23779
23919
  model.value = model.value + offset;
23780
23920
  }
23781
23921
 
23782
- function updateModel () {
23783
- model.value = newPage.value;
23784
- newPage.value = null;
23785
- }
23922
+ const inputEvents = vue.computed(() => {
23923
+ function updateModel () {
23924
+ model.value = newPage.value;
23925
+ newPage.value = null;
23926
+ }
23927
+
23928
+ return {
23929
+ 'onUpdate:modelValue': val => { newPage.value = val; },
23930
+ onKeyup: e => { isKeyCode(e, 13) === true && updateModel(); },
23931
+ onBlur: updateModel
23932
+ }
23933
+ });
23934
+
23935
+ function getBtn (cfg, page, active) {
23936
+ const data = {
23937
+ 'aria-label': page,
23938
+ 'aria-current': 'false',
23939
+ ...btnProps.value,
23940
+ ...cfg
23941
+ };
23786
23942
 
23787
- function getBtn (cfg, page) {
23788
- const data = { ...btnProps.value, ...cfg };
23943
+ if (active === true) {
23944
+ Object.assign(data, {
23945
+ 'aria-current': 'true',
23946
+ ...activeBtnProps.value
23947
+ });
23948
+ }
23789
23949
 
23790
23950
  if (page !== void 0) {
23791
23951
  if (props.toFn !== void 0) {
23792
23952
  data.to = props.toFn(page);
23793
23953
  }
23794
23954
  else {
23795
- data.onClick = () => set(page);
23955
+ data.onClick = () => { set(page); };
23796
23956
  }
23797
23957
  }
23798
23958
 
@@ -23803,147 +23963,107 @@
23803
23963
  Object.assign(proxy, { set, setByOffset });
23804
23964
 
23805
23965
  return () => {
23806
- const
23807
- contentStart = [],
23808
- contentEnd = [],
23809
- contentMiddle = [];
23966
+ const contentStart = [];
23967
+ const contentEnd = [];
23968
+ let contentMiddle;
23969
+
23970
+ if (boundaryLinksProp.value === true) {
23971
+ contentStart.push(
23972
+ getBtn({
23973
+ key: 'bls',
23974
+ disable: props.disable || props.modelValue <= minProp.value,
23975
+ icon: icons.value[ 0 ]
23976
+ }, minProp.value)
23977
+ );
23810
23978
 
23811
- if (__boundaryLinks.value) {
23812
- contentStart.push(getBtn({
23813
- key: 'bls',
23814
- disable: props.disable || props.modelValue <= props.min,
23815
- icon: icons.value[ 0 ]
23816
- }, props.min));
23817
- contentEnd.unshift(getBtn({
23818
- key: 'ble',
23819
- disable: props.disable || props.modelValue >= props.max,
23820
- icon: icons.value[ 3 ]
23821
- }, props.max));
23822
- }
23823
-
23824
- if (__directionLinks.value) {
23825
- contentStart.push(getBtn({
23826
- key: 'bdp',
23827
- disable: props.disable || props.modelValue <= props.min,
23828
- icon: icons.value[ 1 ]
23829
- }, props.modelValue - 1));
23830
- contentEnd.unshift(getBtn({
23831
- key: 'bdn',
23832
- disable: props.disable || props.modelValue >= props.max,
23833
- icon: icons.value[ 2 ]
23834
- }, props.modelValue + 1));
23835
- }
23836
-
23837
- if (props.input === true) {
23838
- contentMiddle.push(vue.h(QInput, {
23839
- class: 'inline',
23840
- style: {
23841
- width: `${ inputPlaceholder.value.length / 1.5 }em`
23842
- },
23843
- type: 'number',
23844
- dense: true,
23845
- value: newPage.value,
23846
- disable: props.disable,
23847
- dark: isDark.value,
23848
- borderless: true,
23849
- inputClass: props.inputClass,
23850
- inputStyle: props.inputStyle,
23851
- placeholder: inputPlaceholder.value,
23852
- min: props.min,
23853
- max: props.max,
23854
- 'onUpdate:modelValue' (value) { newPage.value = value; },
23855
- onKeyup (e) { isKeyCode(e, 13) === true && updateModel(); },
23856
- onBlur: updateModel
23857
- }));
23979
+ contentEnd.unshift(
23980
+ getBtn({
23981
+ key: 'ble',
23982
+ disable: props.disable || props.modelValue >= maxProp.value,
23983
+ icon: icons.value[ 3 ]
23984
+ }, maxProp.value)
23985
+ );
23858
23986
  }
23859
- else { // is type select
23860
- let
23861
- maxPages = Math.max(
23862
- props.maxPages,
23863
- 1 + (__ellipses.value ? 2 : 0) + (__boundaryNumbers.value ? 2 : 0)
23864
- ),
23865
- pgFrom = props.min,
23866
- pgTo = props.max,
23867
- ellipsesStart = false,
23868
- ellipsesEnd = false,
23869
- boundaryStart = false,
23870
- boundaryEnd = false;
23871
-
23872
- if (props.maxPages && maxPages < (props.max - props.min + 1)) {
23873
- maxPages = 1 + Math.floor(maxPages / 2) * 2;
23874
- pgFrom = Math.max(props.min, Math.min(props.max - maxPages + 1, props.modelValue - Math.floor(maxPages / 2)));
23875
- pgTo = Math.min(props.max, pgFrom + maxPages - 1);
23876
- if (__boundaryNumbers.value) {
23877
- boundaryStart = true;
23878
- pgFrom += 1;
23879
- }
23880
- if (__ellipses.value && pgFrom > (props.min + (__boundaryNumbers.value ? 1 : 0))) {
23881
- ellipsesStart = true;
23882
- pgFrom += 1;
23883
- }
23884
- if (__boundaryNumbers.value) {
23885
- boundaryEnd = true;
23886
- pgTo -= 1;
23887
- }
23888
- if (__ellipses.value && pgTo < (props.max - (__boundaryNumbers.value ? 1 : 0))) {
23889
- ellipsesEnd = true;
23890
- pgTo -= 1;
23891
- }
23987
+
23988
+ if (directionLinksProp.value === true) {
23989
+ contentStart.push(
23990
+ getBtn({
23991
+ key: 'bdp',
23992
+ disable: props.disable || props.modelValue <= minProp.value,
23993
+ icon: icons.value[ 1 ]
23994
+ }, props.modelValue - 1)
23995
+ );
23996
+
23997
+ contentEnd.unshift(
23998
+ getBtn({
23999
+ key: 'bdn',
24000
+ disable: props.disable || props.modelValue >= maxProp.value,
24001
+ icon: icons.value[ 2 ]
24002
+ }, props.modelValue + 1)
24003
+ );
24004
+ }
24005
+
24006
+ if (props.input !== true) { // has buttons instead of inputbox
24007
+ contentMiddle = [];
24008
+ const { pgFrom, pgTo, marginalStyle: style } = btnConfig.value;
24009
+
24010
+ if (btnConfig.value.boundaryStart === true) {
24011
+ const active = minProp.value === props.modelValue;
24012
+ contentStart.push(
24013
+ getBtn({
24014
+ key: 'bns',
24015
+ style,
24016
+ disable: props.disable,
24017
+ label: minProp.value
24018
+ }, minProp.value, active)
24019
+ );
23892
24020
  }
23893
- const style = {
23894
- minWidth: `${ Math.max(2, String(props.max).length) }em`
23895
- };
23896
- if (boundaryStart) {
23897
- const active = props.min === props.modelValue;
23898
- contentStart.push(getBtn({
23899
- key: 'bns',
23900
- style,
23901
- disable: props.disable,
23902
- flat: !active,
23903
- label: props.min,
23904
- ...(active ? activeBtnProps.value : {})
23905
- }, props.min));
23906
- }
23907
- if (boundaryEnd) {
23908
- const active = props.max === props.modelValue;
23909
- contentEnd.unshift(getBtn({
23910
- key: 'bne',
23911
- style,
23912
- disable: props.disable,
23913
- flat: !active,
23914
- label: props.max,
23915
- ...(active ? activeBtnProps.value : {})
23916
- }, props.max));
23917
- }
23918
- if (ellipsesStart) {
23919
- contentStart.push(getBtn({
23920
- key: 'bes',
23921
- style,
23922
- disable: props.disable,
23923
- label: '…',
23924
- ripple: false
23925
- }, pgFrom - 1));
23926
- }
23927
- if (ellipsesEnd) {
23928
- contentEnd.unshift(getBtn({
23929
- key: 'bee',
23930
- style,
23931
- disable: props.disable,
23932
- label: '…',
23933
- ripple: false
23934
- }, pgTo + 1));
24021
+
24022
+ if (btnConfig.value.boundaryEnd === true) {
24023
+ const active = maxProp.value === props.modelValue;
24024
+ contentEnd.unshift(
24025
+ getBtn({
24026
+ key: 'bne',
24027
+ style,
24028
+ disable: props.disable,
24029
+ label: maxProp.value
24030
+ }, maxProp.value, active)
24031
+ );
24032
+ }
24033
+
24034
+ if (btnConfig.value.ellipsesStart === true) {
24035
+ contentStart.push(
24036
+ getBtn({
24037
+ key: 'bes',
24038
+ style,
24039
+ disable: props.disable,
24040
+ label: '…',
24041
+ ripple: false
24042
+ }, pgFrom - 1)
24043
+ );
24044
+ }
24045
+
24046
+ if (btnConfig.value.ellipsesEnd === true) {
24047
+ contentEnd.unshift(
24048
+ getBtn({
24049
+ key: 'bee',
24050
+ style,
24051
+ disable: props.disable,
24052
+ label: '…',
24053
+ ripple: false
24054
+ }, pgTo + 1)
24055
+ );
23935
24056
  }
24057
+
23936
24058
  for (let i = pgFrom; i <= pgTo; i++) {
23937
- const btn = {
23938
- key: `bpg${ i }`,
23939
- style,
23940
- disable: props.disable,
23941
- label: i
23942
- };
23943
- if (i === props.modelValue) {
23944
- Object.assign(btn, activeBtnProps.value);
23945
- }
23946
- contentMiddle.push(getBtn(btn, i));
24059
+ contentMiddle.push(
24060
+ getBtn({
24061
+ key: `bpg${ i }`,
24062
+ style,
24063
+ disable: props.disable,
24064
+ label: i
24065
+ }, i, i === props.modelValue)
24066
+ );
23947
24067
  }
23948
24068
  }
23949
24069
 
@@ -23951,15 +24071,35 @@
23951
24071
  class: classes.value,
23952
24072
  ...attrs.value
23953
24073
  }, [
23954
- contentStart,
23955
-
23956
24074
  vue.h('div', {
23957
- class: 'row justify-center'
24075
+ class: 'q-pagination__content row no-wrap items-center',
24076
+ style: gutterStyle.value
23958
24077
  }, [
23959
- contentMiddle
23960
- ]),
24078
+ ...contentStart,
24079
+
24080
+ props.input === true
24081
+ ? vue.h(QInput, {
24082
+ class: 'inline',
24083
+ style: { width: `${ inputPlaceholder.value.length / 1.5 }em` },
24084
+ type: 'number',
24085
+ dense: true,
24086
+ value: newPage.value,
24087
+ disable: props.disable,
24088
+ dark: isDark.value,
24089
+ borderless: true,
24090
+ inputClass: props.inputClass,
24091
+ inputStyle: props.inputStyle,
24092
+ placeholder: inputPlaceholder.value,
24093
+ min: minProp.value,
24094
+ max: maxProp.value,
24095
+ ...inputEvents.value
24096
+ })
24097
+ : vue.h('div', {
24098
+ class: 'q-pagination__middle row justify-center'
24099
+ }, contentMiddle),
23961
24100
 
23962
- contentEnd
24101
+ ...contentEnd
24102
+ ])
23963
24103
  ])
23964
24104
  }
23965
24105
  }
@@ -24240,7 +24380,7 @@
24240
24380
 
24241
24381
  emits: [
24242
24382
  'update:modelValue', 'save', 'cancel',
24243
- 'before-show', 'show', 'before-hide', 'hide'
24383
+ 'beforeShow', 'show', 'beforeHide', 'hide'
24244
24384
  ],
24245
24385
 
24246
24386
  setup (props, { slots, emit }) {
@@ -24304,7 +24444,7 @@
24304
24444
  validated = false;
24305
24445
  initialValue.value = cloneDeep(props.modelValue);
24306
24446
  currentModel.value = cloneDeep(props.modelValue);
24307
- emit('before-show');
24447
+ emit('beforeShow');
24308
24448
  }
24309
24449
 
24310
24450
  function onShow () {
@@ -24322,7 +24462,7 @@
24322
24462
  }
24323
24463
  }
24324
24464
 
24325
- emit('before-hide');
24465
+ emit('beforeHide');
24326
24466
  }
24327
24467
 
24328
24468
  function onHide () {
@@ -25591,7 +25731,7 @@
25591
25731
  scroll.horizontal.percentage = vue.computed(() => {
25592
25732
  const diff = scroll.horizontal.size.value - container.horizontal.value;
25593
25733
  if (diff <= 0) { return 0 }
25594
- const p = between(scroll.horizontal.position.value / diff, 0, 1);
25734
+ const p = between(Math.abs(scroll.horizontal.position.value) / diff, 0, 1);
25595
25735
  return Math.round(p * 10000) / 10000
25596
25736
  });
25597
25737
  scroll.horizontal.thumbHidden = vue.computed(() =>
@@ -25617,7 +25757,7 @@
25617
25757
  return {
25618
25758
  ...props.thumbStyle,
25619
25759
  ...props.horizontalThumbStyle,
25620
- left: `${ scroll.horizontal.thumbStart.value }px`,
25760
+ [ proxy.$q.lang.rtl === true ? 'right' : 'left' ]: `${ scroll.horizontal.thumbStart.value }px`,
25621
25761
  width: `${ scroll.horizontal.thumbSize.value }px`
25622
25762
  }
25623
25763
  });
@@ -25811,6 +25951,15 @@
25811
25951
 
25812
25952
  let scrollPosition = null;
25813
25953
 
25954
+ vue.watch(() => proxy.$q.lang.rtl, rtl => {
25955
+ if (targetRef.value !== null) {
25956
+ setHorizontalScrollPosition(
25957
+ targetRef.value,
25958
+ Math.abs(scroll.horizontal.position.value) * (rtl === true ? -1 : 1)
25959
+ );
25960
+ }
25961
+ });
25962
+
25814
25963
  vue.onDeactivated(() => {
25815
25964
  scrollPosition = {
25816
25965
  top: scroll.vertical.position.value,
@@ -25847,7 +25996,9 @@
25847
25996
  setScrollPercentage (axis, percentage, duration) {
25848
25997
  localSetScrollPosition(
25849
25998
  axis,
25850
- percentage * (scroll[ axis ].size.value - container[ axis ].value),
25999
+ percentage
26000
+ * (scroll[ axis ].size.value - container[ axis ].value)
26001
+ * (axis === 'horizontal' && proxy.$q.lang.rtl === true ? -1 : 1),
25851
26002
  duration
25852
26003
  );
25853
26004
  }
@@ -26596,7 +26747,7 @@
26596
26747
 
26597
26748
  function emitScroll (index) {
26598
26749
  if (prevToIndex !== index) {
26599
- props.onVirtualScroll !== void 0 && emit('virtual-scroll', {
26750
+ props.onVirtualScroll !== void 0 && emit('virtualScroll', {
26600
26751
  index,
26601
26752
  from: virtualScrollSliceRange.value.from,
26602
26753
  to: virtualScrollSliceRange.value.to - 1,
@@ -26768,9 +26919,9 @@
26768
26919
 
26769
26920
  emits: [
26770
26921
  ...useFieldEmits,
26771
- 'add', 'remove', 'input-value', 'new-value',
26922
+ 'add', 'remove', 'inputValue', 'newValue',
26772
26923
  'keyup', 'keypress', 'keydown',
26773
- 'filter-abort'
26924
+ 'filterAbort'
26774
26925
  ],
26775
26926
 
26776
26927
  setup (props, { slots, emit }) {
@@ -26909,20 +27060,16 @@
26909
27060
 
26910
27061
  const tabindex = vue.computed(() => (state.focused.value === true ? props.tabindex : -1));
26911
27062
 
26912
- const comboboxAttrs = vue.computed(() => {
26913
- const attrs = {
26914
- tabindex: props.tabindex,
26915
- role: 'combobox',
26916
- 'aria-label': props.label,
26917
- 'aria-readonly': props.readonly === true ? 'true' : 'false',
26918
- 'aria-autocomplete': props.useInput === true ? 'list' : 'none',
26919
- 'aria-expanded': menu.value === true ? 'true' : 'false',
26920
- 'aria-owns': `${ state.targetUid.value }_lb`,
26921
- 'aria-controls': `${ state.targetUid.value }_lb`
26922
- };
26923
-
26924
- return attrs
26925
- });
27063
+ const comboboxAttrs = vue.computed(() => ({
27064
+ tabindex: props.tabindex,
27065
+ role: 'combobox',
27066
+ 'aria-label': props.label,
27067
+ 'aria-readonly': props.readonly === true ? 'true' : 'false',
27068
+ 'aria-autocomplete': props.useInput === true ? 'list' : 'none',
27069
+ 'aria-expanded': menu.value === true ? 'true' : 'false',
27070
+ 'aria-owns': `${ state.targetUid.value }_lb`,
27071
+ 'aria-controls': `${ state.targetUid.value }_lb`
27072
+ }));
26926
27073
 
26927
27074
  const listboxAttrs = vue.computed(() => {
26928
27075
  const attrs = {
@@ -27518,7 +27665,7 @@
27518
27665
  };
27519
27666
 
27520
27667
  if (props.onNewValue !== void 0) {
27521
- emit('new-value', inputValue.value, done);
27668
+ emit('newValue', inputValue.value, done);
27522
27669
  }
27523
27670
  else {
27524
27671
  done(inputValue.value);
@@ -27541,8 +27688,8 @@
27541
27688
  return hasDialog === true
27542
27689
  ? menuContentRef.value
27543
27690
  : (
27544
- menuRef.value !== null && menuRef.value.__qPortalInnerRef.value !== null
27545
- ? menuRef.value.__qPortalInnerRef.value
27691
+ menuRef.value !== null && menuRef.value.contentEl !== null
27692
+ ? menuRef.value.contentEl
27546
27693
  : void 0
27547
27694
  )
27548
27695
  }
@@ -27685,7 +27832,7 @@
27685
27832
  function setInputValue (val) {
27686
27833
  if (inputValue.value !== val) {
27687
27834
  inputValue.value = val;
27688
- emit('input-value', val);
27835
+ emit('inputValue', val);
27689
27836
  }
27690
27837
  }
27691
27838
 
@@ -27709,7 +27856,7 @@
27709
27856
  }
27710
27857
 
27711
27858
  if (state.innerLoading.value === true) {
27712
- emit('filter-abort');
27859
+ emit('filterAbort');
27713
27860
  }
27714
27861
  else {
27715
27862
  state.innerLoading.value = true;
@@ -27926,7 +28073,7 @@
27926
28073
  filterId = void 0;
27927
28074
 
27928
28075
  if (state.innerLoading.value === true) {
27929
- emit('filter-abort');
28076
+ emit('filterAbort');
27930
28077
  state.innerLoading.value = false;
27931
28078
  innerLoadingIndicator.value = false;
27932
28079
  }
@@ -28012,14 +28159,14 @@
28012
28159
 
28013
28160
  function onControlPopupShow (e) {
28014
28161
  e !== void 0 && stop(e);
28015
- emit('popup-show', e);
28162
+ emit('popupShow', e);
28016
28163
  state.hasPopupOpen = true;
28017
28164
  state.onControlFocusin(e);
28018
28165
  }
28019
28166
 
28020
28167
  function onControlPopupHide (e) {
28021
28168
  e !== void 0 && stop(e);
28022
- emit('popup-hide', e);
28169
+ emit('popupHide', e);
28023
28170
  state.hasPopupOpen = false;
28024
28171
  state.onControlFocusout(e);
28025
28172
  }
@@ -30878,9 +31025,11 @@
30878
31025
  setup (props, { slots, emit }) {
30879
31026
  const { proxy: { $q } } = vue.getCurrentInstance();
30880
31027
 
30881
- const $stepper = vue.inject(stepperKey, () => {
30882
- console.error('QStep needs to be child of QStepper');
30883
- });
31028
+ const $stepper = vue.inject(stepperKey, emptyRenderFn);
31029
+ if ($stepper === emptyRenderFn) {
31030
+ console.error('QStep needs to be a child of QStepper');
31031
+ return emptyRenderFn
31032
+ }
30884
31033
 
30885
31034
  const { getCacheWithFn } = useCache();
30886
31035
 
@@ -30938,7 +31087,7 @@
30938
31087
 
30939
31088
  return () => vue.h(
30940
31089
  'div',
30941
- { ref: rootRef, class: 'q-stepper__step', ...scrollEvent.value },
31090
+ { ref: rootRef, class: 'q-stepper__step', role: 'tabpanel', ...scrollEvent.value },
30942
31091
  $stepper.value.vertical === true
30943
31092
  ? [
30944
31093
  vue.h(StepHeader, {
@@ -32008,7 +32157,7 @@
32008
32157
  },
32009
32158
 
32010
32159
  emits: [
32011
- 'request', 'virtual-scroll',
32160
+ 'request', 'virtualScroll',
32012
32161
  ...useFullscreenEmits,
32013
32162
  ...useTableRowExpandEmits,
32014
32163
  ...useTableRowSelectionEmits
@@ -32242,7 +32391,7 @@
32242
32391
 
32243
32392
  scrollTarget.scrollTop = offsetTop;
32244
32393
 
32245
- emit('virtual-scroll', {
32394
+ emit('virtualScroll', {
32246
32395
  index: toIndex,
32247
32396
  from: 0,
32248
32397
  to: innerPagination.value.rowsPerPage - 1,
@@ -32252,7 +32401,7 @@
32252
32401
  }
32253
32402
 
32254
32403
  function onVScroll (info) {
32255
- emit('virtual-scroll', info);
32404
+ emit('virtualScroll', info);
32256
32405
  }
32257
32406
 
32258
32407
  function getProgress () {
@@ -34003,9 +34152,11 @@
34003
34152
  },
34004
34153
 
34005
34154
  setup (props, { slots }) {
34006
- const $timeline = vue.inject(timelineKey, () => {
34155
+ const $timeline = vue.inject(timelineKey, emptyRenderFn);
34156
+ if ($timeline === emptyRenderFn) {
34007
34157
  console.error('QTimelineEntry needs to be child of QTimeline');
34008
- });
34158
+ return emptyRenderFn
34159
+ }
34009
34160
 
34010
34161
  const classes = vue.computed(() =>
34011
34162
  `q-timeline__entry q-timeline__entry--${ props.side }`
@@ -34094,7 +34245,7 @@
34094
34245
  + (props.inset === true ? ' q-toolbar--inset' : '')
34095
34246
  );
34096
34247
 
34097
- return () => vue.h('div', { class: classes.value }, hSlot(slots.default))
34248
+ return () => vue.h('div', { class: classes.value, role: 'toolbar' }, hSlot(slots.default))
34098
34249
  }
34099
34250
  });
34100
34251
 
@@ -34178,9 +34329,9 @@
34178
34329
  'update:expanded',
34179
34330
  'update:ticked',
34180
34331
  'update:selected',
34181
- 'lazy-load',
34182
- 'after-show',
34183
- 'after-hide'
34332
+ 'lazyLoad',
34333
+ 'afterShow',
34334
+ 'afterHide'
34184
34335
  ],
34185
34336
 
34186
34337
  setup (props, { slots, emit }) {
@@ -34429,7 +34580,7 @@
34429
34580
  if (Array.isArray(node[ props.childrenKey ]) !== true) {
34430
34581
  node[ props.childrenKey ] = [];
34431
34582
  }
34432
- emit('lazy-load', {
34583
+ emit('lazyLoad', {
34433
34584
  node,
34434
34585
  key,
34435
34586
  done: children => {
@@ -34576,11 +34727,11 @@
34576
34727
  }
34577
34728
 
34578
34729
  function onShow () {
34579
- emit('after-show');
34730
+ emit('afterShow');
34580
34731
  }
34581
34732
 
34582
34733
  function onHide () {
34583
- emit('after-hide');
34734
+ emit('afterHide');
34584
34735
  }
34585
34736
 
34586
34737
  function getNode (node) {
@@ -35423,7 +35574,7 @@
35423
35574
  helpers.queuedFiles.value = helpers.queuedFiles.value.concat(files);
35424
35575
  files.forEach(f => { helpers.updateFileStatus(f, 'failed'); });
35425
35576
 
35426
- emit('factory-failed', err, files);
35577
+ emit('factoryFailed', err, files);
35427
35578
  workingThreads.value--;
35428
35579
  }
35429
35580
  };
@@ -35582,9 +35733,13 @@
35582
35733
  name: 'QUploaderAddTrigger',
35583
35734
 
35584
35735
  setup () {
35585
- return vue.inject(uploaderKey, () => {
35736
+ const $trigger = vue.inject(uploaderKey, emptyRenderFn);
35737
+
35738
+ if ($trigger === emptyRenderFn) {
35586
35739
  console.error('QUploaderAddTrigger needs to be child of QUploader');
35587
- })
35740
+ }
35741
+
35742
+ return $trigger
35588
35743
  }
35589
35744
  });
35590
35745
 
@@ -37904,6 +38059,7 @@
37904
38059
  action.class
37905
38060
  ],
37906
38061
  tabindex: 0,
38062
+ role: 'listitem',
37907
38063
  onClick () { onOk(action); },
37908
38064
  onKeyup (e) { e.keyCode === 13 && onOk(action); }
37909
38065
  }, [
@@ -37936,8 +38092,7 @@
37936
38092
  tabindex: 0,
37937
38093
  clickable: true,
37938
38094
  dark: isDark.value,
37939
- onClick () { onOk(action); },
37940
- onKeyup (e) { e.keyCode === 13 && onOk(action); }
38095
+ onClick () { onOk(action); }
37941
38096
  }, () => [
37942
38097
  vue.h(
37943
38098
  QItemSection,
@@ -37979,9 +38134,12 @@
37979
38134
  child.push(
37980
38135
  props.grid === true
37981
38136
  ? vue.h('div', {
37982
- class: 'row items-stretch justify-start'
38137
+ class: 'row items-stretch justify-start',
38138
+ role: 'list'
37983
38139
  }, getGrid())
37984
- : vue.h('div', getList())
38140
+ : vue.h('div', {
38141
+ role: 'list'
38142
+ }, getList())
37985
38143
  );
37986
38144
 
37987
38145
  return child
@@ -38563,12 +38721,12 @@
38563
38721
  function getPrompt () {
38564
38722
  return [
38565
38723
  vue.h(QInput, {
38566
- modelValue: model.value,
38567
- ...formProps.value,
38568
38724
  color: vmColor.value,
38569
38725
  dense: true,
38570
38726
  autofocus: true,
38571
38727
  dark: isDark.value,
38728
+ ...formProps.value,
38729
+ modelValue: model.value,
38572
38730
  'onUpdate:modelValue': onUpdateModel,
38573
38731
  onKeyup: onInputKeyup
38574
38732
  })
@@ -38578,11 +38736,11 @@
38578
38736
  function getOptions () {
38579
38737
  return [
38580
38738
  vue.h(QOptionGroup, {
38581
- modelValue: model.value,
38582
- ...formProps.value,
38583
38739
  color: vmColor.value,
38584
38740
  options: props.options.items,
38585
38741
  dark: isDark.value,
38742
+ ...formProps.value,
38743
+ modelValue: model.value,
38586
38744
  'onUpdate:modelValue': onUpdateModel
38587
38745
  })
38588
38746
  ]
@@ -40325,7 +40483,7 @@
40325
40483
  */
40326
40484
 
40327
40485
  var index_umd = {
40328
- version: '2.9.2',
40486
+ version: '2.10.1',
40329
40487
  install (app, opts) {
40330
40488
  installQuasar(app, {
40331
40489
  components,