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
  */
@@ -1396,6 +1396,8 @@ const formKey = '_q_fo_';
1396
1396
  const tabsKey = '_q_tabs_';
1397
1397
  const uploaderKey = '_q_u_';
1398
1398
 
1399
+ const emptyRenderFn = () => {};
1400
+
1399
1401
  const globalConfig = {};
1400
1402
  let globalConfigIsFrozen = false;
1401
1403
 
@@ -1608,7 +1610,7 @@ function prepareApp (app, uiOpts, pluginOpts) {
1608
1610
  }
1609
1611
 
1610
1612
  var installQuasar = function (parentApp, opts = {}) {
1611
- const $q = { version: '2.9.2' };
1613
+ const $q = { version: '2.10.1' };
1612
1614
 
1613
1615
  if (globalConfigIsFrozen === false) {
1614
1616
  if (opts.config !== void 0) {
@@ -2367,7 +2369,7 @@ var QBadge = createComponent({
2367
2369
  return () => h('div', {
2368
2370
  class: classes.value,
2369
2371
  style: style.value,
2370
- role: 'alert',
2372
+ role: 'status',
2371
2373
  'aria-label': props.label
2372
2374
  }, hMergeSlot(slots.default, props.label !== void 0 ? [ props.label ] : []))
2373
2375
  }
@@ -3298,7 +3300,7 @@ var Ripple = createDirective({
3298
3300
  }
3299
3301
  );
3300
3302
 
3301
- const padding = {
3303
+ const btnPadding = {
3302
3304
  none: 0,
3303
3305
  xs: 4,
3304
3306
  sm: 8,
@@ -3318,6 +3320,21 @@ const defaultSizes$2 = {
3318
3320
  const formTypes = [ 'button', 'submit', 'reset' ];
3319
3321
  const mediaTypeRE = /[^\s]\/[^\s]/;
3320
3322
 
3323
+ const btnDesignOptions = [ 'flat', 'outline', 'push', 'unelevated' ];
3324
+ const getBtnDesign = (props, defaultValue) => {
3325
+ if (props.flat === true) return 'flat'
3326
+ if (props.outline === true) return 'outline'
3327
+ if (props.push === true) return 'push'
3328
+ if (props.unelevated === true) return 'unelevated'
3329
+ return defaultValue
3330
+ };
3331
+ const getBtnDesignAttr = props => {
3332
+ const design = getBtnDesign(props);
3333
+ return design !== void 0
3334
+ ? { [ design ]: true }
3335
+ : {}
3336
+ };
3337
+
3321
3338
  const useBtnProps = {
3322
3339
  ...useSizeProps,
3323
3340
  ...useRouterLinkProps,
@@ -3331,13 +3348,14 @@ const useBtnProps = {
3331
3348
  icon: String,
3332
3349
  iconRight: String,
3333
3350
 
3334
- round: Boolean,
3351
+ ...btnDesignOptions.reduce(
3352
+ (acc, val) => (acc[ val ] = Boolean) && acc,
3353
+ {}
3354
+ ),
3355
+
3335
3356
  square: Boolean,
3336
- outline: Boolean,
3337
- flat: Boolean,
3338
- unelevated: Boolean,
3357
+ round: Boolean,
3339
3358
  rounded: Boolean,
3340
- push: Boolean,
3341
3359
  glossy: Boolean,
3342
3360
 
3343
3361
  size: String,
@@ -3387,7 +3405,7 @@ function useBtn (props) {
3387
3405
  ? Object.assign({}, obj, {
3388
3406
  padding: props.padding
3389
3407
  .split(/\s+/)
3390
- .map(v => (v in padding ? padding[ v ] + 'px' : v))
3408
+ .map(v => (v in btnPadding ? btnPadding[ v ] + 'px' : v))
3391
3409
  .join(' '),
3392
3410
  minWidth: '0',
3393
3411
  minHeight: '0'
@@ -3407,13 +3425,7 @@ function useBtn (props) {
3407
3425
  isActionable.value === true ? props.tabindex || 0 : -1
3408
3426
  ));
3409
3427
 
3410
- const design = computed(() => {
3411
- if (props.flat === true) return 'flat'
3412
- if (props.outline === true) return 'outline'
3413
- if (props.push === true) return 'push'
3414
- if (props.unelevated === true) return 'unelevated'
3415
- return 'standard'
3416
- });
3428
+ const design = computed(() => getBtnDesign(props, 'standard'));
3417
3429
 
3418
3430
  const attributes = computed(() => {
3419
3431
  const acc = { tabindex: tabIndex.value };
@@ -4173,7 +4185,7 @@ const useModelToggleProps = {
4173
4185
  };
4174
4186
 
4175
4187
  const useModelToggleEmits = [
4176
- 'before-show', 'show', 'before-hide', 'hide'
4188
+ 'beforeShow', 'show', 'beforeHide', 'hide'
4177
4189
  ];
4178
4190
 
4179
4191
  // handleShow/handleHide -> removeTick(), self (& emit show)
@@ -4233,7 +4245,7 @@ function useModelToggle ({
4233
4245
 
4234
4246
  showing.value = true;
4235
4247
 
4236
- emit('before-show', evt);
4248
+ emit('beforeShow', evt);
4237
4249
 
4238
4250
  if (handleShow !== void 0) {
4239
4251
  handleShow(evt);
@@ -4272,7 +4284,7 @@ function useModelToggle ({
4272
4284
 
4273
4285
  showing.value = false;
4274
4286
 
4275
- emit('before-hide', evt);
4287
+ emit('beforeHide', evt);
4276
4288
 
4277
4289
  if (handleHide !== void 0) {
4278
4290
  handleHide(evt);
@@ -4394,8 +4406,8 @@ const portalProxyList = [];
4394
4406
 
4395
4407
  function getPortalProxy (el) {
4396
4408
  return portalProxyList.find(proxy =>
4397
- proxy.__qPortalInnerRef.value !== null
4398
- && proxy.__qPortalInnerRef.value.contains(el)
4409
+ proxy.contentEl !== null
4410
+ && proxy.contentEl.contains(el)
4399
4411
  )
4400
4412
  }
4401
4413
 
@@ -4409,7 +4421,7 @@ function closePortalMenus (proxy, evt) {
4409
4421
  return getParentProxy(proxy)
4410
4422
  }
4411
4423
  }
4412
- else if (proxy.__qPortalInnerRef !== void 0) {
4424
+ else if (proxy.__qPortal === true) {
4413
4425
  // treat it as point of separation if parent is QPopupProxy
4414
4426
  // (so mobile matches desktop behavior)
4415
4427
  // and hide it too
@@ -4430,7 +4442,7 @@ function closePortalMenus (proxy, evt) {
4430
4442
 
4431
4443
  function closePortals (proxy, evt, depth) {
4432
4444
  while (depth !== 0 && proxy !== void 0 && proxy !== null) {
4433
- if (proxy.__qPortalInnerRef !== void 0) {
4445
+ if (proxy.__qPortal === true) {
4434
4446
  depth--;
4435
4447
 
4436
4448
  if (proxy.$options.name === 'QMenu') {
@@ -4522,7 +4534,10 @@ function usePortal (vm, innerRef, renderPortalContent, checkGlobalDialog) {
4522
4534
  onUnmounted(() => { hidePortal(true); });
4523
4535
 
4524
4536
  // needed for portal vm detection
4525
- vm.proxy.__qPortalInnerRef = innerRef;
4537
+ vm.proxy.__qPortal = true;
4538
+
4539
+ // public way of accessing the rendered content
4540
+ injectProp(vm.proxy, 'contentEl', () => innerRef.value);
4526
4541
 
4527
4542
  return {
4528
4543
  showPortal,
@@ -4560,18 +4575,24 @@ const useTransitionProps = {
4560
4575
  }
4561
4576
  };
4562
4577
 
4563
- function useTransition (props, showing) {
4564
- const transitionState = ref(showing.value);
4578
+ function useTransition (props, defaultShowFn = () => {}, defaultHideFn = () => {}) {
4579
+ return {
4580
+ transitionProps: computed(() => {
4581
+ const show = `q-transition--${ props.transitionShow || defaultShowFn() }`;
4582
+ const hide = `q-transition--${ props.transitionHide || defaultHideFn() }`;
4565
4583
 
4566
- watch(showing, val => {
4567
- nextTick(() => { transitionState.value = val; });
4568
- });
4584
+ return {
4585
+ appear: true,
4569
4586
 
4570
- // return transition
4571
- return {
4572
- transition: computed(() => 'q-transition--' + (
4573
- transitionState.value === true ? props.transitionHide : props.transitionShow
4574
- )),
4587
+ enterFromClass: `${ show }-enter-from`,
4588
+ enterActiveClass: `${ show }-enter-active`,
4589
+ enterToClass: `${ show }-enter-to`,
4590
+
4591
+ leaveFromClass: `${ hide }-leave-from`,
4592
+ leaveActiveClass: `${ hide }-leave-active`,
4593
+ leaveToClass: `${ hide }-leave-to`
4594
+ }
4595
+ }),
4575
4596
 
4576
4597
  transitionStyle: computed(() => `--q-transition-duration: ${ props.transitionDuration }ms`)
4577
4598
  }
@@ -5294,7 +5315,7 @@ var QMenu = createComponent({
5294
5315
 
5295
5316
  emits: [
5296
5317
  ...useModelToggleEmits,
5297
- 'click', 'escape-key'
5318
+ 'click', 'escapeKey'
5298
5319
  ],
5299
5320
 
5300
5321
  setup (props, { slots, emit, attrs }) {
@@ -5315,7 +5336,7 @@ var QMenu = createComponent({
5315
5336
  const isDark = useDark(props, $q);
5316
5337
  const { registerTick, removeTick } = useTick();
5317
5338
  const { registerTimeout } = useTimeout();
5318
- const { transition, transitionStyle } = useTransition(props, showing);
5339
+ const { transitionProps, transitionStyle } = useTransition(props);
5319
5340
  const { localScrollTarget, changeScrollEvent, unconfigureScrollTarget } = useScrollTarget(props, configureScrollTarget);
5320
5341
 
5321
5342
  const { anchorEl, canShow } = useAnchor({ showing });
@@ -5395,7 +5416,10 @@ var QMenu = createComponent({
5395
5416
  let node = innerRef.value;
5396
5417
 
5397
5418
  if (node && node.contains(document.activeElement) !== true) {
5398
- node = node.querySelector('[autofocus], [data-autofocus]') || node;
5419
+ node = node.querySelector('[autofocus][tabindex], [data-autofocus][tabindex]')
5420
+ || node.querySelector('[autofocus] [tabindex], [data-autofocus] [tabindex]')
5421
+ || node.querySelector('[autofocus], [data-autofocus]')
5422
+ || node;
5399
5423
  node.focus({ preventScroll: true });
5400
5424
  }
5401
5425
  });
@@ -5532,7 +5556,7 @@ var QMenu = createComponent({
5532
5556
  }
5533
5557
 
5534
5558
  function onEscapeKey (evt) {
5535
- emit('escape-key');
5559
+ emit('escapeKey');
5536
5560
  hide(evt);
5537
5561
  }
5538
5562
 
@@ -5560,7 +5584,7 @@ var QMenu = createComponent({
5560
5584
  function renderPortalContent () {
5561
5585
  return h(
5562
5586
  Transition,
5563
- { name: transition.value, appear: true },
5587
+ transitionProps.value,
5564
5588
  () => (
5565
5589
  showing.value === true
5566
5590
  ? h('div', {
@@ -5665,11 +5689,25 @@ function uid$3 () {
5665
5689
  + hexBytes[ b[ 14 ] ] + hexBytes[ b[ 15 ] ]
5666
5690
  }
5667
5691
 
5692
+ const btnPropsList = Object.keys(useBtnProps);
5693
+
5694
+ const passBtnProps = props => btnPropsList.reduce(
5695
+ (acc, key) => {
5696
+ const val = props[ key ];
5697
+ if (val !== void 0) {
5698
+ acc[ key ] = val;
5699
+ }
5700
+ return acc
5701
+ },
5702
+ {}
5703
+ );
5704
+
5668
5705
  var QBtnDropdown = createComponent({
5669
5706
  name: 'QBtnDropdown',
5670
5707
 
5671
5708
  props: {
5672
5709
  ...useBtnProps,
5710
+ ...useTransitionProps,
5673
5711
 
5674
5712
  modelValue: Boolean,
5675
5713
  split: Boolean,
@@ -5701,7 +5739,7 @@ var QBtnDropdown = createComponent({
5701
5739
  toggleAriaLabel: String
5702
5740
  },
5703
5741
 
5704
- emits: [ 'update:modelValue', 'click', 'before-show', 'show', 'before-hide', 'hide' ],
5742
+ emits: [ 'update:modelValue', 'click', 'beforeShow', 'show', 'beforeHide', 'hide' ],
5705
5743
 
5706
5744
  setup (props, { slots, emit }) {
5707
5745
  const { proxy } = getCurrentInstance();
@@ -5710,7 +5748,7 @@ var QBtnDropdown = createComponent({
5710
5748
  const menuRef = ref(null);
5711
5749
  const targetUid = uid$3();
5712
5750
 
5713
- const attributes = computed(() => {
5751
+ const ariaAttrs = computed(() => {
5714
5752
  const acc = {
5715
5753
  'aria-expanded': showing.value === true ? 'true' : 'false',
5716
5754
  'aria-haspopup': 'true',
@@ -5738,6 +5776,9 @@ var QBtnDropdown = createComponent({
5738
5776
  + (props.split === false ? ' q-btn-dropdown__arrow-container' : '')
5739
5777
  );
5740
5778
 
5779
+ const btnDesignAttr = computed(() => getBtnDesignAttr(props));
5780
+ const btnProps = computed(() => passBtnProps(props));
5781
+
5741
5782
  watch(() => props.modelValue, val => {
5742
5783
  menuRef.value !== null && menuRef.value[ val ? 'show' : 'hide' ]();
5743
5784
  });
@@ -5746,7 +5787,7 @@ var QBtnDropdown = createComponent({
5746
5787
 
5747
5788
  function onBeforeShow (e) {
5748
5789
  showing.value = true;
5749
- emit('before-show', e);
5790
+ emit('beforeShow', e);
5750
5791
  }
5751
5792
 
5752
5793
  function onShow (e) {
@@ -5756,7 +5797,7 @@ var QBtnDropdown = createComponent({
5756
5797
 
5757
5798
  function onBeforeHide (e) {
5758
5799
  showing.value = false;
5759
- emit('before-hide', e);
5800
+ emit('beforeHide', e);
5760
5801
  }
5761
5802
 
5762
5803
  function onHide (e) {
@@ -5818,6 +5859,9 @@ var QBtnDropdown = createComponent({
5818
5859
  self: props.menuSelf,
5819
5860
  offset: props.menuOffset,
5820
5861
  separateClosePopup: true,
5862
+ transitionShow: props.transitionShow,
5863
+ transitionHide: props.transitionHide,
5864
+ transitionDuration: props.transitionDuration,
5821
5865
  onBeforeShow,
5822
5866
  onShow,
5823
5867
  onBeforeHide,
@@ -5828,11 +5872,11 @@ var QBtnDropdown = createComponent({
5828
5872
  if (props.split === false) {
5829
5873
  return h(QBtn, {
5830
5874
  class: 'q-btn-dropdown q-btn-dropdown--simple',
5831
- ...props,
5875
+ ...btnProps.value,
5876
+ ...ariaAttrs.value,
5832
5877
  disable: props.disable === true || props.disableMainBtn === true,
5833
5878
  noWrap: true,
5834
5879
  round: false,
5835
- ...attributes.value,
5836
5880
  onClick
5837
5881
  }, {
5838
5882
  default: () => hSlot(slots.label, []).concat(Arrow),
@@ -5842,21 +5886,17 @@ var QBtnDropdown = createComponent({
5842
5886
 
5843
5887
  return h(QBtnGroup, {
5844
5888
  class: 'q-btn-dropdown q-btn-dropdown--split no-wrap q-btn-item',
5845
- outline: props.outline,
5846
- flat: props.flat,
5847
5889
  rounded: props.rounded,
5848
5890
  square: props.square,
5849
- push: props.push,
5850
- unelevated: props.unelevated,
5891
+ ...btnDesignAttr.value,
5851
5892
  glossy: props.glossy,
5852
5893
  stretch: props.stretch
5853
5894
  }, () => [
5854
5895
  h(QBtn, {
5855
5896
  class: 'q-btn-dropdown--current',
5856
- ...props,
5897
+ ...btnProps.value,
5857
5898
  disable: props.disable === true || props.disableMainBtn === true,
5858
5899
  noWrap: true,
5859
- iconRight: props.iconRight,
5860
5900
  round: false,
5861
5901
  onClick: onClickHide
5862
5902
  }, {
@@ -5866,16 +5906,15 @@ var QBtnDropdown = createComponent({
5866
5906
 
5867
5907
  h(QBtn, {
5868
5908
  class: 'q-btn-dropdown__arrow-container q-anchor--skip',
5869
- ...attributes.value,
5909
+ ...ariaAttrs.value,
5910
+ ...btnDesignAttr.value,
5870
5911
  disable: props.disable === true || props.disableDropdown === true,
5871
- outline: props.outline,
5872
- flat: props.flat,
5873
5912
  rounded: props.rounded,
5874
- push: props.push,
5875
- size: props.size,
5876
5913
  color: props.color,
5877
5914
  textColor: props.textColor,
5878
5915
  dense: props.dense,
5916
+ size: props.size,
5917
+ padding: props.padding,
5879
5918
  ripple: props.ripple
5880
5919
  }, () => Arrow)
5881
5920
  ])
@@ -5982,6 +6021,14 @@ var QBtnToggle = createComponent({
5982
6021
 
5983
6022
  const injectFormInput = useFormInject(formAttrs);
5984
6023
 
6024
+ const btnDesignAttr = computed(() => getBtnDesignAttr(props));
6025
+
6026
+ const btnOptionDesign = computed(() => ({
6027
+ rounded: props.rounded,
6028
+ dense: props.dense,
6029
+ ...btnDesignAttr.value
6030
+ }));
6031
+
5985
6032
  const btnOptions = computed(() => props.options.map((item, i) => {
5986
6033
  const { attrs, value, slot, ...opt } = item;
5987
6034
 
@@ -5989,19 +6036,11 @@ var QBtnToggle = createComponent({
5989
6036
  slot,
5990
6037
  props: {
5991
6038
  key: i,
5992
- onClick (e) { set(value, item, e); },
5993
6039
 
5994
6040
  'aria-pressed': value === props.modelValue ? 'true' : 'false',
5995
-
5996
6041
  ...attrs,
5997
6042
  ...opt,
5998
-
5999
- outline: props.outline,
6000
- flat: props.flat,
6001
- rounded: props.rounded,
6002
- push: props.push,
6003
- unelevated: props.unelevated,
6004
- dense: props.dense,
6043
+ ...btnOptionDesign.value,
6005
6044
 
6006
6045
  disable: props.disable === true || opt.disable === true,
6007
6046
 
@@ -6019,7 +6058,9 @@ var QBtnToggle = createComponent({
6019
6058
  padding: mergeOpt(opt, 'padding'),
6020
6059
  ripple: mergeOpt(opt, 'ripple'),
6021
6060
  stack: mergeOpt(opt, 'stack') === true,
6022
- stretch: mergeOpt(opt, 'stretch') === true
6061
+ stretch: mergeOpt(opt, 'stretch') === true,
6062
+
6063
+ onClick (e) { set(value, item, e); }
6023
6064
  }
6024
6065
  }
6025
6066
  }));
@@ -6058,12 +6099,9 @@ var QBtnToggle = createComponent({
6058
6099
 
6059
6100
  return () => h(QBtnGroup, {
6060
6101
  class: 'q-btn-toggle',
6061
- outline: props.outline,
6062
- flat: props.flat,
6102
+ ...btnDesignAttr.value,
6063
6103
  rounded: props.rounded,
6064
- push: props.push,
6065
6104
  stretch: props.stretch,
6066
- unelevated: props.unelevated,
6067
6105
  glossy: props.glossy,
6068
6106
  spread: props.spread
6069
6107
  }, getContent)
@@ -6521,7 +6559,7 @@ const usePanelProps = {
6521
6559
  keepAliveMax: Number
6522
6560
  };
6523
6561
 
6524
- const usePanelEmits = [ 'update:modelValue', 'before-transition', 'transition' ];
6562
+ const usePanelEmits = [ 'update:modelValue', 'beforeTransition', 'transition' ];
6525
6563
 
6526
6564
  function usePanel () {
6527
6565
  const { props, emit, proxy } = getCurrentInstance();
@@ -6593,7 +6631,7 @@ function usePanel () {
6593
6631
 
6594
6632
  if (panelIndex.value !== index) {
6595
6633
  panelIndex.value = index;
6596
- emit('before-transition', newVal, oldVal);
6634
+ emit('beforeTransition', newVal, oldVal);
6597
6635
  nextTick(() => {
6598
6636
  emit('transition', newVal, oldVal);
6599
6637
  });
@@ -7504,7 +7542,7 @@ function useCheckbox (type, getInner) {
7504
7542
  const attributes = computed(() => {
7505
7543
  const attrs = {
7506
7544
  tabindex: tabindex.value,
7507
- role: 'checkbox',
7545
+ role: type === 'toggle' ? 'switch' : 'checkbox',
7508
7546
  'aria-label': props.label,
7509
7547
  'aria-checked': isIndeterminate.value === true
7510
7548
  ? 'mixed'
@@ -7769,16 +7807,19 @@ var QChip = createComponent({
7769
7807
  + (isDark.value === true ? ' q-chip--dark q-dark' : '')
7770
7808
  });
7771
7809
 
7772
- const attributes = computed(() => (
7773
- props.disable === true
7810
+ const attributes = computed(() => {
7811
+ const chip = props.disable === true
7774
7812
  ? { tabindex: -1, 'aria-disabled': 'true' }
7775
- : {
7776
- tabindex: props.tabindex || 0,
7777
- role: 'button',
7778
- 'aria-hidden': 'false',
7779
- 'aria-label': props.removeAriaLabel || $q.lang.label.remove
7780
- }
7781
- ));
7813
+ : { tabindex: props.tabindex || 0 };
7814
+ const remove = {
7815
+ ...chip,
7816
+ role: 'button',
7817
+ 'aria-hidden': 'false',
7818
+ 'aria-label': props.removeAriaLabel || $q.lang.label.remove
7819
+ };
7820
+
7821
+ return { chip, remove }
7822
+ });
7782
7823
 
7783
7824
  function onKeyup (e) {
7784
7825
  e.keyCode === 13 /* ENTER */ && onClick(e);
@@ -7836,7 +7877,7 @@ var QChip = createComponent({
7836
7877
  h(QIcon, {
7837
7878
  class: 'q-chip__icon q-chip__icon--remove cursor-pointer',
7838
7879
  name: removeIcon.value,
7839
- ...attributes.value,
7880
+ ...attributes.value.remove,
7840
7881
  onClick: onRemove,
7841
7882
  onKeyup: onRemove
7842
7883
  })
@@ -7855,7 +7896,7 @@ var QChip = createComponent({
7855
7896
 
7856
7897
  isClickable.value === true && Object.assign(
7857
7898
  data,
7858
- attributes.value,
7899
+ attributes.value.chip,
7859
7900
  { onClick, onKeyup }
7860
7901
  );
7861
7902
 
@@ -9339,17 +9380,21 @@ var QResizeObserver = createComponent({
9339
9380
  if (hasObserver === true) {
9340
9381
  let observer;
9341
9382
 
9342
- onMounted(() => {
9343
- nextTick(() => {
9344
- targetEl = proxy.$el.parentNode;
9383
+ // initialize as soon as possible
9384
+ const init = stop => {
9385
+ targetEl = proxy.$el.parentNode;
9345
9386
 
9346
- if (targetEl) {
9347
- observer = new ResizeObserver(trigger);
9348
- observer.observe(targetEl);
9349
- emitEvent();
9350
- }
9351
- });
9352
- });
9387
+ if (targetEl) {
9388
+ observer = new ResizeObserver(trigger);
9389
+ observer.observe(targetEl);
9390
+ emitEvent();
9391
+ }
9392
+ else if (stop !== true) {
9393
+ nextTick(() => { init(true); });
9394
+ }
9395
+ };
9396
+
9397
+ onMounted(() => { init(); });
9353
9398
 
9354
9399
  onBeforeUnmount(() => {
9355
9400
  clearTimeout(timer);
@@ -10033,13 +10078,6 @@ var QTabs = createComponent({
10033
10078
  }
10034
10079
  }
10035
10080
 
10036
- /*
10037
- * Vue has an aggressive diff (in-place replacement) so we cannot
10038
- * ensure that the instance getting destroyed is the actual tab
10039
- * reported here. As a result, we cannot use its name or check
10040
- * if it's a route one to make the necessary updates. We need to
10041
- * always check the existing list again and infer the changes.
10042
- */
10043
10081
  function unregisterTab (tabData) {
10044
10082
  tabDataList.splice(tabDataList.indexOf(tabData), 1);
10045
10083
  tabDataListLen.value--;
@@ -10171,9 +10209,11 @@ const useTabProps = {
10171
10209
  };
10172
10210
 
10173
10211
  function useTab (props, slots, emit, routeData) {
10174
- const $tabs = inject(tabsKey, () => {
10212
+ const $tabs = inject(tabsKey, emptyRenderFn);
10213
+ if ($tabs === emptyRenderFn) {
10175
10214
  console.error('QTab/QRouteTab component needs to be child of QTabs');
10176
- });
10215
+ return emptyRenderFn
10216
+ }
10177
10217
 
10178
10218
  const { proxy } = getCurrentInstance();
10179
10219
 
@@ -10449,7 +10489,7 @@ var QTabPanel = createComponent({
10449
10489
  props: usePanelChildProps,
10450
10490
 
10451
10491
  setup (_, { slots }) {
10452
- return () => h('div', { class: 'q-tab-panel' }, hSlot(slots.default))
10492
+ return () => h('div', { class: 'q-tab-panel', role: 'tabpanel' }, hSlot(slots.default))
10453
10493
  }
10454
10494
  });
10455
10495
 
@@ -13051,7 +13091,7 @@ var QDate = createComponent({
13051
13091
 
13052
13092
  emits: [
13053
13093
  ...useDatetimeEmits,
13054
- 'range-start', 'range-end', 'navigation'
13094
+ 'rangeStart', 'rangeEnd', 'navigation'
13055
13095
  ],
13056
13096
 
13057
13097
  setup (props, { slots, emit }) {
@@ -14360,7 +14400,7 @@ var QDate = createComponent({
14360
14400
  finalHash: initHash
14361
14401
  };
14362
14402
 
14363
- emit('range-start', getShortDate(day));
14403
+ emit('rangeStart', getShortDate(day));
14364
14404
  }
14365
14405
  else {
14366
14406
  const
@@ -14373,7 +14413,7 @@ var QDate = createComponent({
14373
14413
  editRange.value = null;
14374
14414
  addToModel(initHash === finalHash ? day : { target: day, ...payload });
14375
14415
 
14376
- emit('range-end', {
14416
+ emit('rangeEnd', {
14377
14417
  from: getShortDate(payload.from),
14378
14418
  to: getShortDate(payload.to)
14379
14419
  });
@@ -14678,7 +14718,7 @@ const positionClass$1 = {
14678
14718
  left: 'fixed-left items-center'
14679
14719
  };
14680
14720
 
14681
- const transitions = {
14721
+ const defaultTransitions = {
14682
14722
  standard: [ 'scale', 'scale' ],
14683
14723
  top: [ 'slide-down', 'slide-up' ],
14684
14724
  bottom: [ 'slide-up', 'slide-down' ],
@@ -14695,8 +14735,8 @@ var QDialog = createComponent({
14695
14735
  ...useModelToggleProps,
14696
14736
  ...useTransitionProps,
14697
14737
 
14698
- transitionShow: String,
14699
- transitionHide: String,
14738
+ transitionShow: String, // override useTransitionProps
14739
+ transitionHide: String, // override useTransitionProps
14700
14740
 
14701
14741
  persistent: Boolean,
14702
14742
  autoClose: Boolean,
@@ -14727,7 +14767,7 @@ var QDialog = createComponent({
14727
14767
 
14728
14768
  emits: [
14729
14769
  ...useModelToggleEmits,
14730
- 'shake', 'click', 'escape-key'
14770
+ 'shake', 'click', 'escapeKey'
14731
14771
  ],
14732
14772
 
14733
14773
  setup (props, { slots, emit, attrs }) {
@@ -14735,7 +14775,6 @@ var QDialog = createComponent({
14735
14775
 
14736
14776
  const innerRef = ref(null);
14737
14777
  const showing = ref(false);
14738
- const transitionState = ref(false);
14739
14778
  const animating = ref(false);
14740
14779
 
14741
14780
  let shakeTimeout, refocusTarget = null, isMaximized, avoidAutoClose;
@@ -14750,6 +14789,12 @@ var QDialog = createComponent({
14750
14789
  const { registerTimeout } = useTimeout();
14751
14790
  const { registerTick, removeTick } = useTick();
14752
14791
 
14792
+ const { transitionProps, transitionStyle } = useTransition(
14793
+ props,
14794
+ () => defaultTransitions[ props.position ][ 0 ],
14795
+ () => defaultTransitions[ props.position ][ 1 ]
14796
+ );
14797
+
14753
14798
  const { showPortal, hidePortal, portalIsAccessible, renderPortal } = usePortal(
14754
14799
  vm, innerRef, renderPortalContent, /* pls do check if on a global dialog */ true
14755
14800
  );
@@ -14774,26 +14819,6 @@ var QDialog = createComponent({
14774
14819
  + (props.square === true ? ' q-dialog__inner--square' : '')
14775
14820
  );
14776
14821
 
14777
- const transitionShow = computed(() =>
14778
- 'q-transition--'
14779
- + (props.transitionShow === void 0 ? transitions[ props.position ][ 0 ] : props.transitionShow)
14780
- );
14781
-
14782
- const transitionHide = computed(() =>
14783
- 'q-transition--'
14784
- + (props.transitionHide === void 0 ? transitions[ props.position ][ 1 ] : props.transitionHide)
14785
- );
14786
-
14787
- const transition = computed(() => (
14788
- transitionState.value === true
14789
- ? transitionHide.value
14790
- : transitionShow.value
14791
- ));
14792
-
14793
- const transitionStyle = computed(
14794
- () => `--q-transition-duration: ${ props.transitionDuration }ms`
14795
- );
14796
-
14797
14822
  const useBackdrop = computed(() => showing.value === true && props.seamless !== true);
14798
14823
 
14799
14824
  const onEvents = computed(() => (
@@ -14808,12 +14833,6 @@ var QDialog = createComponent({
14808
14833
  attrs.class
14809
14834
  ]);
14810
14835
 
14811
- watch(showing, val => {
14812
- nextTick(() => {
14813
- transitionState.value = val;
14814
- });
14815
- });
14816
-
14817
14836
  watch(() => props.maximized, state => {
14818
14837
  showing.value === true && updateMaximized(state);
14819
14838
  });
@@ -14913,13 +14932,23 @@ var QDialog = createComponent({
14913
14932
  return
14914
14933
  }
14915
14934
 
14916
- node = node.querySelector(selector || '[autofocus], [data-autofocus]') || node;
14935
+ node = (selector !== '' ? node.querySelector(selector) : null)
14936
+ || node.querySelector('[autofocus][tabindex], [data-autofocus][tabindex]')
14937
+ || node.querySelector('[autofocus] [tabindex], [data-autofocus] [tabindex]')
14938
+ || node.querySelector('[autofocus], [data-autofocus]')
14939
+ || node;
14917
14940
  node.focus({ preventScroll: true });
14918
14941
  });
14919
14942
  }
14920
14943
 
14921
- function shake () {
14922
- focus();
14944
+ function shake (refocusTarget) {
14945
+ if (refocusTarget && typeof refocusTarget.focus === 'function') {
14946
+ refocusTarget.focus({ preventScroll: true });
14947
+ }
14948
+ else {
14949
+ focus();
14950
+ }
14951
+
14923
14952
  emit('shake');
14924
14953
 
14925
14954
  const node = innerRef.value;
@@ -14945,7 +14974,7 @@ var QDialog = createComponent({
14945
14974
  props.maximized !== true && props.noShake !== true && shake();
14946
14975
  }
14947
14976
  else {
14948
- emit('escape-key');
14977
+ emit('escapeKey');
14949
14978
  hide();
14950
14979
  }
14951
14980
  }
@@ -15000,7 +15029,7 @@ var QDialog = createComponent({
15000
15029
  hide(e);
15001
15030
  }
15002
15031
  else if (props.noShake !== true) {
15003
- shake();
15032
+ shake(e.relatedTarget);
15004
15033
  }
15005
15034
  }
15006
15035
 
@@ -15029,7 +15058,8 @@ var QDialog = createComponent({
15029
15058
 
15030
15059
  function renderPortalContent () {
15031
15060
  return h('div', {
15032
- 'aria-modal': 'true',
15061
+ role: 'dialog',
15062
+ 'aria-modal': useBackdrop.value === true ? 'true' : 'false',
15033
15063
  ...attrs,
15034
15064
  class: rootClasses.value
15035
15065
  }, [
@@ -15042,14 +15072,15 @@ var QDialog = createComponent({
15042
15072
  class: 'q-dialog__backdrop fixed-full',
15043
15073
  style: transitionStyle.value,
15044
15074
  'aria-hidden': 'true',
15045
- onMousedown: onBackdropClick
15075
+ tabindex: -1,
15076
+ onFocusin: onBackdropClick
15046
15077
  })
15047
15078
  : null
15048
15079
  )),
15049
15080
 
15050
15081
  h(
15051
15082
  Transition,
15052
- { name: transition.value, appear: true },
15083
+ transitionProps.value,
15053
15084
  () => (
15054
15085
  showing.value === true
15055
15086
  ? h('div', {
@@ -15122,7 +15153,7 @@ var QDrawer = createComponent({
15122
15153
 
15123
15154
  emits: [
15124
15155
  ...useModelToggleEmits,
15125
- 'on-layout', 'mini-state'
15156
+ 'onLayout', 'miniState'
15126
15157
  ],
15127
15158
 
15128
15159
  setup (props, { slots, emit, attrs }) {
@@ -15133,9 +15164,11 @@ var QDrawer = createComponent({
15133
15164
  const { preventBodyScroll } = usePreventScroll();
15134
15165
  const { registerTimeout, removeTimeout } = useTimeout();
15135
15166
 
15136
- const $layout = inject(layoutKey, () => {
15167
+ const $layout = inject(layoutKey, emptyRenderFn);
15168
+ if ($layout === emptyRenderFn) {
15137
15169
  console.error('QDrawer needs to be child of QLayout');
15138
- });
15170
+ return emptyRenderFn
15171
+ }
15139
15172
 
15140
15173
  let lastDesktopState, timerMini, layoutTotalWidthWatcher;
15141
15174
 
@@ -15453,7 +15486,7 @@ var QDrawer = createComponent({
15453
15486
  watch(offset, val => { updateLayout('offset', val); });
15454
15487
 
15455
15488
  watch(onLayout, val => {
15456
- emit('on-layout', val);
15489
+ emit('onLayout', val);
15457
15490
  updateLayout('space', val);
15458
15491
  });
15459
15492
 
@@ -15477,7 +15510,7 @@ var QDrawer = createComponent({
15477
15510
  }
15478
15511
  });
15479
15512
 
15480
- watch(isMini, val => { emit('mini-state', val); });
15513
+ watch(isMini, val => { emit('miniState', val); });
15481
15514
 
15482
15515
  function applyPosition (position) {
15483
15516
  if (position === void 0) {
@@ -15642,8 +15675,8 @@ var QDrawer = createComponent({
15642
15675
  }
15643
15676
 
15644
15677
  onMounted(() => {
15645
- emit('on-layout', onLayout.value);
15646
- emit('mini-state', isMini.value);
15678
+ emit('onLayout', onLayout.value);
15679
+ emit('miniState', isMini.value);
15647
15680
 
15648
15681
  lastDesktopState = props.showIfAbove === true;
15649
15682
 
@@ -16196,7 +16229,7 @@ var QTooltip = createComponent({
16196
16229
 
16197
16230
  const { registerTick, removeTick } = useTick();
16198
16231
  const { registerTimeout } = useTimeout();
16199
- const { transition, transitionStyle } = useTransition(props, showing);
16232
+ const { transitionProps, transitionStyle } = useTransition(props);
16200
16233
  const { localScrollTarget, changeScrollEvent, unconfigureScrollTarget } = useScrollTarget(props, configureScrollTarget);
16201
16234
 
16202
16235
  const { anchorEl, canShow, anchorEvents } = useAnchor({ showing, configureAnchorEl });
@@ -16387,16 +16420,13 @@ var QTooltip = createComponent({
16387
16420
  attrs.style,
16388
16421
  transitionStyle.value
16389
16422
  ],
16390
- role: 'complementary'
16423
+ role: 'tooltip'
16391
16424
  }, hSlot(slots.default))
16392
16425
  : null
16393
16426
  }
16394
16427
 
16395
16428
  function renderPortalContent () {
16396
- return h(Transition, {
16397
- name: transition.value,
16398
- appear: true
16399
- }, getTooltipContent)
16429
+ return h(Transition, transitionProps.value, getTooltipContent)
16400
16430
  }
16401
16431
 
16402
16432
  onBeforeUnmount(anchorCleanup);
@@ -16536,6 +16566,7 @@ var QItem = createComponent({
16536
16566
  ref: rootRef,
16537
16567
  class: classes.value,
16538
16568
  style: style.value,
16569
+ role: 'listitem',
16539
16570
  onClick,
16540
16571
  onKeyup
16541
16572
  };
@@ -17769,7 +17800,7 @@ var QExpansionItem = createComponent({
17769
17800
 
17770
17801
  emits: [
17771
17802
  ...useModelToggleEmits,
17772
- 'click', 'after-show', 'after-hide'
17803
+ 'click', 'afterShow', 'afterHide'
17773
17804
  ],
17774
17805
 
17775
17806
  setup (props, { slots, emit }) {
@@ -17878,11 +17909,11 @@ var QExpansionItem = createComponent({
17878
17909
  }
17879
17910
 
17880
17911
  function onShow () {
17881
- emit('after-show');
17912
+ emit('afterShow');
17882
17913
  }
17883
17914
 
17884
17915
  function onHide () {
17885
- emit('after-hide');
17916
+ emit('afterHide');
17886
17917
  }
17887
17918
 
17888
17919
  function enterGroup () {
@@ -18710,7 +18741,7 @@ const useFieldProps = {
18710
18741
  maxlength: [ Number, String ]
18711
18742
  };
18712
18743
 
18713
- const useFieldEmits = [ 'update:modelValue', 'clear', 'focus', 'blur', 'popup-show', 'popup-hide' ];
18744
+ const useFieldEmits = [ 'update:modelValue', 'clear', 'focus', 'blur', 'popupShow', 'popupHide' ];
18714
18745
 
18715
18746
  function useFieldState () {
18716
18747
  const { props, attrs, proxy, vnode } = getCurrentInstance();
@@ -19440,7 +19471,14 @@ function useFile ({
19440
19471
 
19441
19472
  function onDragleave (e) {
19442
19473
  stopAndPrevent(e);
19443
- e.relatedTarget !== dndRef.value && (dnd.value = false);
19474
+
19475
+ // Safari bug: relatedTarget is null for over 10 years
19476
+ // https://bugs.webkit.org/show_bug.cgi?id=66547
19477
+ const gone = e.relatedTarget !== null || client.is.safari !== true
19478
+ ? e.relatedTarget !== dndRef.value
19479
+ : document.elementsFromPoint(e.clientX, e.clientY).includes(dndRef.value) === false;
19480
+
19481
+ gone === true && (dnd.value = false);
19444
19482
  }
19445
19483
 
19446
19484
  function onDrop (e) {
@@ -19474,6 +19512,7 @@ function useFile ({
19474
19512
  pickFiles,
19475
19513
  addFiles,
19476
19514
  onDragover,
19515
+ onDragleave,
19477
19516
  processFiles,
19478
19517
  getDndNode,
19479
19518
 
@@ -19797,9 +19836,11 @@ var QFile = createComponent({
19797
19836
  Object.assign(proxy, {
19798
19837
  removeAtIndex,
19799
19838
  removeFile,
19800
- getNativeElement: () => inputRef.value
19839
+ getNativeElement: () => inputRef.value // deprecated
19801
19840
  });
19802
19841
 
19842
+ injectProp(proxy, 'nativeEl', () => inputRef.value);
19843
+
19803
19844
  return useField(state)
19804
19845
  }
19805
19846
  });
@@ -19827,9 +19868,11 @@ var QFooter = createComponent({
19827
19868
  setup (props, { slots, emit }) {
19828
19869
  const { proxy: { $q } } = getCurrentInstance();
19829
19870
 
19830
- const $layout = inject(layoutKey, () => {
19871
+ const $layout = inject(layoutKey, emptyRenderFn);
19872
+ if ($layout === emptyRenderFn) {
19831
19873
  console.error('QFooter needs to be child of QLayout');
19832
- });
19874
+ return emptyRenderFn
19875
+ }
19833
19876
 
19834
19877
  const size = ref(parseInt(props.heightHint, 10));
19835
19878
  const revealed = ref(true);
@@ -20008,7 +20051,7 @@ var QForm = createComponent({
20008
20051
  onSubmit: Function
20009
20052
  },
20010
20053
 
20011
- emits: [ 'reset', 'validation-success', 'validation-error' ],
20054
+ emits: [ 'reset', 'validationSuccess', 'validationError' ],
20012
20055
 
20013
20056
  setup (props, { slots, emit }) {
20014
20057
  const vm = getCurrentInstance();
@@ -20025,7 +20068,7 @@ var QForm = createComponent({
20025
20068
  const index = ++validateIndex;
20026
20069
 
20027
20070
  const emitEvent = (res, ref) => {
20028
- emit('validation-' + (res === true ? 'success' : 'error'), ref);
20071
+ emit('validation' + (res === true ? 'Success' : 'Error'), ref);
20029
20072
  };
20030
20073
 
20031
20074
  const validateComponent = comp => {
@@ -20127,7 +20170,9 @@ var QForm = createComponent({
20127
20170
  addFocusFn(() => {
20128
20171
  if (rootRef.value === null) { return }
20129
20172
 
20130
- const target = rootRef.value.querySelector('[autofocus], [data-autofocus]')
20173
+ const target = rootRef.value.querySelector('[autofocus][tabindex], [data-autofocus][tabindex]')
20174
+ || rootRef.value.querySelector('[autofocus] [tabindex], [data-autofocus] [tabindex]')
20175
+ || rootRef.value.querySelector('[autofocus], [data-autofocus]')
20131
20176
  || Array.prototype.find.call(rootRef.value.querySelectorAll('[tabindex]'), el => el.tabIndex > -1);
20132
20177
 
20133
20178
  target !== null && target !== void 0 && target.focus({ preventScroll: true });
@@ -20247,9 +20292,11 @@ var QHeader = createComponent({
20247
20292
  setup (props, { slots, emit }) {
20248
20293
  const { proxy: { $q } } = getCurrentInstance();
20249
20294
 
20250
- const $layout = inject(layoutKey, () => {
20295
+ const $layout = inject(layoutKey, emptyRenderFn);
20296
+ if ($layout === emptyRenderFn) {
20251
20297
  console.error('QHeader needs to be child of QLayout');
20252
- });
20298
+ return emptyRenderFn
20299
+ }
20253
20300
 
20254
20301
  const size = ref(parseInt(props.heightHint, 10));
20255
20302
  const revealed = ref(true);
@@ -20943,7 +20990,7 @@ var QInnerLoading = createComponent({
20943
20990
  const vm = getCurrentInstance();
20944
20991
  const isDark = useDark(props, vm.proxy.$q);
20945
20992
 
20946
- const { transition, transitionStyle } = useTransition(props, computed(() => props.showing));
20993
+ const { transitionProps, transitionStyle } = useTransition(props);
20947
20994
 
20948
20995
  const classes = computed(() =>
20949
20996
  'q-inner-loading absolute-full column flex-center'
@@ -20987,10 +21034,7 @@ var QInnerLoading = createComponent({
20987
21034
  : null
20988
21035
  }
20989
21036
 
20990
- return () => h(Transition, {
20991
- name: transition.value,
20992
- appear: true
20993
- }, getContent)
21037
+ return () => h(Transition, transitionProps.value, getContent)
20994
21038
  }
20995
21039
  });
20996
21040
 
@@ -21158,7 +21202,7 @@ function useMask (props, emit, emitValue, inputRef) {
21158
21202
  '^'
21159
21203
  + unmask.join('')
21160
21204
  + '(' + (unmaskChar === '' ? '.' : '[^' + unmaskChar + ']') + '+)?'
21161
- + '[' + unmaskChar + ']*$'
21205
+ + (unmaskChar === '' ? '' : '[' + unmaskChar + ']*') + '$'
21162
21206
  ),
21163
21207
  extractLast = extract.length - 1,
21164
21208
  extractMatcher = extract.map((re, index) => {
@@ -21178,7 +21222,7 @@ function useMask (props, emit, emitValue, inputRef) {
21178
21222
 
21179
21223
  computedMask = mask;
21180
21224
  computedUnmask = val => {
21181
- const unmaskMatch = unmaskMatcher.exec(val);
21225
+ const unmaskMatch = unmaskMatcher.exec(props.reverseFillMask === true ? val : val.slice(0, mask.length));
21182
21226
  if (unmaskMatch !== null) {
21183
21227
  val = unmaskMatch.slice(1).join('');
21184
21228
  }
@@ -21967,9 +22011,11 @@ var QInput = createComponent({
21967
22011
  Object.assign(proxy, {
21968
22012
  focus,
21969
22013
  select,
21970
- getNativeElement: () => inputRef.value
22014
+ getNativeElement: () => inputRef.value // deprecated
21971
22015
  });
21972
22016
 
22017
+ injectProp(proxy, 'nativeEl', () => inputRef.value);
22018
+
21973
22019
  return renderFn
21974
22020
  }
21975
22021
  });
@@ -22168,7 +22214,12 @@ var QList = createComponent({
22168
22214
  bordered: Boolean,
22169
22215
  dense: Boolean,
22170
22216
  separator: Boolean,
22171
- padding: Boolean
22217
+ padding: Boolean,
22218
+
22219
+ tag: {
22220
+ type: String,
22221
+ default: 'div'
22222
+ }
22172
22223
  },
22173
22224
 
22174
22225
  setup (props, { slots }) {
@@ -22184,7 +22235,7 @@ var QList = createComponent({
22184
22235
  + (props.padding === true ? ' q-list--padding' : '')
22185
22236
  );
22186
22237
 
22187
- return () => h('div', { class: classes.value }, hSlot(slots.default))
22238
+ return () => h(props.tag, { class: classes.value, role: 'list' }, hSlot(slots.default))
22188
22239
  }
22189
22240
  });
22190
22241
 
@@ -22222,7 +22273,7 @@ var QKnob = createComponent({
22222
22273
  readonly: Boolean
22223
22274
  },
22224
22275
 
22225
- emits: [ 'update:modelValue', 'change', 'drag-value' ],
22276
+ emits: [ 'update:modelValue', 'change', 'dragValue' ],
22226
22277
 
22227
22278
  setup (props, { slots, emit }) {
22228
22279
  const { proxy } = getCurrentInstance();
@@ -22269,7 +22320,7 @@ var QKnob = createComponent({
22269
22320
  )
22270
22321
  );
22271
22322
 
22272
- const decimals = computed(() => (String(props.step).trim('0').split('.')[ 1 ] || '').length);
22323
+ const decimals = computed(() => (String(props.step).trim().split('.')[ 1 ] || '').length);
22273
22324
  const step = computed(() => (props.step === 0 ? 1 : props.step));
22274
22325
  const instantFeedback = computed(() => props.instantFeedback === true || dragging.value === true);
22275
22326
 
@@ -22404,7 +22455,7 @@ var QKnob = createComponent({
22404
22455
 
22405
22456
  newModel = between(newModel, innerMin.value, innerMax.value);
22406
22457
 
22407
- emit('drag-value', newModel);
22458
+ emit('dragValue', newModel);
22408
22459
 
22409
22460
  if (model.value !== newModel) {
22410
22461
  model.value = newModel;
@@ -22579,6 +22630,8 @@ var QScrollObserver = createComponent({
22579
22630
 
22580
22631
  const { proxy } = getCurrentInstance();
22581
22632
 
22633
+ watch(() => proxy.$q.lang.rtl, emitEvent);
22634
+
22582
22635
  onMounted(() => {
22583
22636
  parentEl = proxy.$el.parentNode;
22584
22637
  configureScrollTarget();
@@ -22679,7 +22732,7 @@ var QLayout = createComponent({
22679
22732
  if (height.value !== newHeight) {
22680
22733
  resized = true;
22681
22734
  height.value = newHeight;
22682
- props.onScrollHeight !== void 0 && emit('scroll-height', newHeight);
22735
+ props.onScrollHeight !== void 0 && emit('scrollHeight', newHeight);
22683
22736
  updateScrollbarWidth();
22684
22737
  }
22685
22738
  if (width.value !== newWidth) {
@@ -23225,7 +23278,7 @@ var QOptionGroup = createComponent({
23225
23278
  );
23226
23279
 
23227
23280
  const attrs = computed(() => {
23228
- const attrs = {};
23281
+ const attrs = { role: 'group' };
23229
23282
 
23230
23283
  if (props.type === 'radio') {
23231
23284
  attrs.role = 'radiogroup';
@@ -23290,10 +23343,17 @@ var QPage = createComponent({
23290
23343
  setup (props, { slots }) {
23291
23344
  const { proxy: { $q } } = getCurrentInstance();
23292
23345
 
23293
- const $layout = inject(layoutKey);
23294
- inject(pageContainerKey, () => {
23346
+ const $layout = inject(layoutKey, emptyRenderFn);
23347
+ if ($layout === emptyRenderFn) {
23348
+ console.error('QPage needs to be a deep child of QLayout');
23349
+ return emptyRenderFn
23350
+ }
23351
+
23352
+ const $pageContainer = inject(pageContainerKey, emptyRenderFn);
23353
+ if ($pageContainer === emptyRenderFn) {
23295
23354
  console.error('QPage needs to be child of QPageContainer');
23296
- });
23355
+ return emptyRenderFn
23356
+ }
23297
23357
 
23298
23358
  const style = computed(() => {
23299
23359
  const offset
@@ -23336,9 +23396,11 @@ var QPageContainer = createComponent({
23336
23396
  setup (_, { slots }) {
23337
23397
  const { proxy: { $q } } = getCurrentInstance();
23338
23398
 
23339
- const $layout = inject(layoutKey, () => {
23399
+ const $layout = inject(layoutKey, emptyRenderFn);
23400
+ if ($layout === emptyRenderFn) {
23340
23401
  console.error('QPageContainer needs to be child of QLayout');
23341
- });
23402
+ return emptyRenderFn
23403
+ }
23342
23404
 
23343
23405
  provide(pageContainerKey, true);
23344
23406
 
@@ -23388,9 +23450,11 @@ const usePageStickyProps = {
23388
23450
  function usePageSticky () {
23389
23451
  const { props, proxy: { $q } } = getCurrentInstance();
23390
23452
 
23391
- const $layout = inject(layoutKey, () => {
23453
+ const $layout = inject(layoutKey, emptyRenderFn);
23454
+ if ($layout === emptyRenderFn) {
23392
23455
  console.error('QPageSticky needs to be child of QLayout');
23393
- });
23456
+ return emptyRenderFn
23457
+ }
23394
23458
 
23395
23459
  const attach = computed(() => {
23396
23460
  const pos = props.position;
@@ -23603,6 +23667,12 @@ var QPageSticky = createComponent({
23603
23667
  }
23604
23668
  });
23605
23669
 
23670
+ function getBool (val, otherwise) {
23671
+ return [ true, false ].includes(val)
23672
+ ? val
23673
+ : otherwise
23674
+ }
23675
+
23606
23676
  var QPagination = createComponent({
23607
23677
  name: 'QPagination',
23608
23678
 
@@ -23614,22 +23684,20 @@ var QPagination = createComponent({
23614
23684
  required: true
23615
23685
  },
23616
23686
  min: {
23617
- type: Number,
23687
+ type: [ Number, String ],
23618
23688
  default: 1
23619
23689
  },
23620
23690
  max: {
23621
- type: Number,
23691
+ type: [ Number, String ],
23622
23692
  required: true
23623
23693
  },
23624
-
23625
- color: {
23626
- type: String,
23627
- default: 'primary'
23694
+ maxPages: {
23695
+ type: [ Number, String ],
23696
+ default: 0,
23697
+ validator: v => (
23698
+ (typeof v === 'string' ? parseInt(v, 10) : v) >= 0
23699
+ )
23628
23700
  },
23629
- textColor: String,
23630
-
23631
- activeColor: String,
23632
- activeTextColor: String,
23633
23701
 
23634
23702
  inputStyle: [ Array, String, Object ],
23635
23703
  inputClass: [ Array, String, Object ],
@@ -23663,11 +23731,6 @@ var QPagination = createComponent({
23663
23731
  type: Boolean,
23664
23732
  default: null
23665
23733
  },
23666
- maxPages: {
23667
- type: Number,
23668
- default: 0,
23669
- validator: v => v >= 0
23670
- },
23671
23734
 
23672
23735
  ripple: {
23673
23736
  type: [ Boolean, Object ],
@@ -23683,7 +23746,21 @@ var QPagination = createComponent({
23683
23746
  push: Boolean,
23684
23747
  glossy: Boolean,
23685
23748
 
23686
- dense: Boolean,
23749
+ color: {
23750
+ type: String,
23751
+ default: 'primary'
23752
+ },
23753
+ textColor: String,
23754
+
23755
+ activeDesign: {
23756
+ type: String,
23757
+ default: '',
23758
+ values: v => v === '' || btnDesignOptions.includes(v)
23759
+ },
23760
+ activeColor: String,
23761
+ activeTextColor: String,
23762
+
23763
+ gutter: String,
23687
23764
  padding: {
23688
23765
  type: String,
23689
23766
  default: '3px 2px'
@@ -23698,6 +23775,16 @@ var QPagination = createComponent({
23698
23775
 
23699
23776
  const isDark = useDark(props, $q);
23700
23777
 
23778
+ const minProp = computed(() => parseInt(props.min, 10));
23779
+ const maxProp = computed(() => parseInt(props.max, 10));
23780
+ const maxPagesProp = computed(() => parseInt(props.maxPages, 10));
23781
+
23782
+ const inputPlaceholder = computed(() => model.value + ' / ' + maxProp.value);
23783
+ const boundaryLinksProp = computed(() => getBool(props.boundaryLinks, props.input));
23784
+ const boundaryNumbersProp = computed(() => getBool(props.boundaryNumbers, !props.input));
23785
+ const directionLinksProp = computed(() => getBool(props.directionLinks, props.input));
23786
+ const ellipsesProp = computed(() => getBool(props.ellipses, !props.input));
23787
+
23701
23788
  const newPage = ref(null);
23702
23789
  const model = computed({
23703
23790
  get: () => props.modelValue,
@@ -23706,32 +23793,33 @@ var QPagination = createComponent({
23706
23793
  if (props.disable || isNaN(val)) {
23707
23794
  return
23708
23795
  }
23709
- const value = between(val, props.min, props.max);
23796
+ const value = between(val, minProp.value, maxProp.value);
23710
23797
  if (props.modelValue !== value) {
23711
23798
  emit('update:modelValue', value);
23712
23799
  }
23713
23800
  }
23714
23801
  });
23715
23802
 
23716
- watch(() => props.min + props.max, () => {
23803
+ watch(() => `${ minProp.value }|${ maxProp.value }`, () => {
23717
23804
  model.value = props.modelValue;
23718
23805
  });
23719
23806
 
23720
- function getBool (val, otherwise) {
23721
- return [ true, false ].includes(val)
23722
- ? val
23723
- : otherwise
23724
- }
23725
-
23726
23807
  const classes = computed(() =>
23727
23808
  'q-pagination row no-wrap items-center'
23728
23809
  + (props.disable === true ? ' disabled' : '')
23729
23810
  );
23730
- const inputPlaceholder = computed(() => model.value + ' / ' + props.max);
23731
- const __boundaryLinks = computed(() => getBool(props.boundaryLinks, props.input));
23732
- const __boundaryNumbers = computed(() => getBool(props.boundaryNumbers, !props.input));
23733
- const __directionLinks = computed(() => getBool(props.directionLinks, props.input));
23734
- const __ellipses = computed(() => getBool(props.ellipses, !props.input));
23811
+
23812
+ const gutterProp = computed(() => (
23813
+ props.gutter in btnPadding
23814
+ ? `${ btnPadding[ props.gutter ] }px`
23815
+ : props.gutter || null
23816
+ ));
23817
+ const gutterStyle = computed(() => (
23818
+ gutterProp.value !== null
23819
+ ? `--q-pagination-gutter-parent:-${ gutterProp.value };--q-pagination-gutter-child:${ gutterProp.value }`
23820
+ : null
23821
+ ));
23822
+
23735
23823
  const icons = computed(() => {
23736
23824
  const ico = [
23737
23825
  props.iconFirst || $q.iconSet.pagination.first,
@@ -23742,38 +23830,90 @@ var QPagination = createComponent({
23742
23830
  return $q.lang.rtl === true ? ico.reverse() : ico
23743
23831
  });
23744
23832
 
23745
- const attrs = computed(() => (
23746
- props.disable === true
23747
- ? { 'aria-disabled': 'true' }
23748
- : {}
23749
- ));
23833
+ const attrs = computed(() => ({
23834
+ 'aria-disabled': props.disable === true ? 'true' : 'false',
23835
+ role: 'navigation'
23836
+ }));
23750
23837
 
23838
+ const btnDesignProp = computed(() => getBtnDesign(props, 'flat'));
23751
23839
  const btnProps = computed(() => ({
23840
+ [ btnDesignProp.value ]: true,
23841
+
23752
23842
  round: props.round,
23753
23843
  rounded: props.rounded,
23754
23844
 
23755
- outline: props.outline,
23756
- unelevated: props.unelevated,
23757
- push: props.push,
23758
- glossy: props.glossy,
23759
-
23760
- dense: props.dense,
23761
23845
  padding: props.padding,
23762
23846
 
23763
23847
  color: props.color,
23764
- flat: true,
23848
+ textColor: props.textColor,
23849
+
23765
23850
  size: props.size,
23766
23851
  ripple: props.ripple !== null
23767
23852
  ? props.ripple
23768
23853
  : true
23769
23854
  }));
23770
23855
 
23856
+ const btnActiveDesignProp = computed(() => {
23857
+ // we also reset non-active design
23858
+ const acc = { [ btnDesignProp.value ]: false };
23859
+ if (props.activeDesign !== '') {
23860
+ acc[ props.activeDesign ] = true;
23861
+ }
23862
+ return acc
23863
+ });
23771
23864
  const activeBtnProps = computed(() => ({
23772
- flat: props.flat,
23865
+ ...btnActiveDesignProp.value,
23773
23866
  color: props.activeColor || props.color,
23774
23867
  textColor: props.activeTextColor || props.textColor
23775
23868
  }));
23776
23869
 
23870
+ const btnConfig = computed(() => {
23871
+ let maxPages = Math.max(
23872
+ maxPagesProp.value,
23873
+ 1 + (ellipsesProp.value ? 2 : 0) + (boundaryNumbersProp.value ? 2 : 0)
23874
+ );
23875
+
23876
+ const acc = {
23877
+ pgFrom: minProp.value,
23878
+ pgTo: maxProp.value,
23879
+ ellipsesStart: false,
23880
+ ellipsesEnd: false,
23881
+ boundaryStart: false,
23882
+ boundaryEnd: false,
23883
+ marginalStyle: {
23884
+ minWidth: `${ Math.max(2, String(maxProp.value).length) }em`
23885
+ }
23886
+ };
23887
+
23888
+ if (maxPagesProp.value && maxPages < (maxProp.value - minProp.value + 1)) {
23889
+ maxPages = 1 + Math.floor(maxPages / 2) * 2;
23890
+ acc.pgFrom = Math.max(minProp.value, Math.min(maxProp.value - maxPages + 1, props.modelValue - Math.floor(maxPages / 2)));
23891
+ acc.pgTo = Math.min(maxProp.value, acc.pgFrom + maxPages - 1);
23892
+
23893
+ if (boundaryNumbersProp.value) {
23894
+ acc.boundaryStart = true;
23895
+ acc.pgFrom++;
23896
+ }
23897
+
23898
+ if (ellipsesProp.value && acc.pgFrom > (minProp.value + (boundaryNumbersProp.value ? 1 : 0))) {
23899
+ acc.ellipsesStart = true;
23900
+ acc.pgFrom++;
23901
+ }
23902
+
23903
+ if (boundaryNumbersProp.value) {
23904
+ acc.boundaryEnd = true;
23905
+ acc.pgTo--;
23906
+ }
23907
+
23908
+ if (ellipsesProp.value && acc.pgTo < (maxProp.value - (boundaryNumbersProp.value ? 1 : 0))) {
23909
+ acc.ellipsesEnd = true;
23910
+ acc.pgTo--;
23911
+ }
23912
+ }
23913
+
23914
+ return acc
23915
+ });
23916
+
23777
23917
  function set (value) {
23778
23918
  model.value = value;
23779
23919
  }
@@ -23782,20 +23922,40 @@ var QPagination = createComponent({
23782
23922
  model.value = model.value + offset;
23783
23923
  }
23784
23924
 
23785
- function updateModel () {
23786
- model.value = newPage.value;
23787
- newPage.value = null;
23788
- }
23925
+ const inputEvents = computed(() => {
23926
+ function updateModel () {
23927
+ model.value = newPage.value;
23928
+ newPage.value = null;
23929
+ }
23930
+
23931
+ return {
23932
+ 'onUpdate:modelValue': val => { newPage.value = val; },
23933
+ onKeyup: e => { isKeyCode(e, 13) === true && updateModel(); },
23934
+ onBlur: updateModel
23935
+ }
23936
+ });
23937
+
23938
+ function getBtn (cfg, page, active) {
23939
+ const data = {
23940
+ 'aria-label': page,
23941
+ 'aria-current': 'false',
23942
+ ...btnProps.value,
23943
+ ...cfg
23944
+ };
23789
23945
 
23790
- function getBtn (cfg, page) {
23791
- const data = { ...btnProps.value, ...cfg };
23946
+ if (active === true) {
23947
+ Object.assign(data, {
23948
+ 'aria-current': 'true',
23949
+ ...activeBtnProps.value
23950
+ });
23951
+ }
23792
23952
 
23793
23953
  if (page !== void 0) {
23794
23954
  if (props.toFn !== void 0) {
23795
23955
  data.to = props.toFn(page);
23796
23956
  }
23797
23957
  else {
23798
- data.onClick = () => set(page);
23958
+ data.onClick = () => { set(page); };
23799
23959
  }
23800
23960
  }
23801
23961
 
@@ -23806,147 +23966,107 @@ var QPagination = createComponent({
23806
23966
  Object.assign(proxy, { set, setByOffset });
23807
23967
 
23808
23968
  return () => {
23809
- const
23810
- contentStart = [],
23811
- contentEnd = [],
23812
- contentMiddle = [];
23969
+ const contentStart = [];
23970
+ const contentEnd = [];
23971
+ let contentMiddle;
23972
+
23973
+ if (boundaryLinksProp.value === true) {
23974
+ contentStart.push(
23975
+ getBtn({
23976
+ key: 'bls',
23977
+ disable: props.disable || props.modelValue <= minProp.value,
23978
+ icon: icons.value[ 0 ]
23979
+ }, minProp.value)
23980
+ );
23813
23981
 
23814
- if (__boundaryLinks.value) {
23815
- contentStart.push(getBtn({
23816
- key: 'bls',
23817
- disable: props.disable || props.modelValue <= props.min,
23818
- icon: icons.value[ 0 ]
23819
- }, props.min));
23820
- contentEnd.unshift(getBtn({
23821
- key: 'ble',
23822
- disable: props.disable || props.modelValue >= props.max,
23823
- icon: icons.value[ 3 ]
23824
- }, props.max));
23825
- }
23826
-
23827
- if (__directionLinks.value) {
23828
- contentStart.push(getBtn({
23829
- key: 'bdp',
23830
- disable: props.disable || props.modelValue <= props.min,
23831
- icon: icons.value[ 1 ]
23832
- }, props.modelValue - 1));
23833
- contentEnd.unshift(getBtn({
23834
- key: 'bdn',
23835
- disable: props.disable || props.modelValue >= props.max,
23836
- icon: icons.value[ 2 ]
23837
- }, props.modelValue + 1));
23838
- }
23839
-
23840
- if (props.input === true) {
23841
- contentMiddle.push(h(QInput, {
23842
- class: 'inline',
23843
- style: {
23844
- width: `${ inputPlaceholder.value.length / 1.5 }em`
23845
- },
23846
- type: 'number',
23847
- dense: true,
23848
- value: newPage.value,
23849
- disable: props.disable,
23850
- dark: isDark.value,
23851
- borderless: true,
23852
- inputClass: props.inputClass,
23853
- inputStyle: props.inputStyle,
23854
- placeholder: inputPlaceholder.value,
23855
- min: props.min,
23856
- max: props.max,
23857
- 'onUpdate:modelValue' (value) { newPage.value = value; },
23858
- onKeyup (e) { isKeyCode(e, 13) === true && updateModel(); },
23859
- onBlur: updateModel
23860
- }));
23982
+ contentEnd.unshift(
23983
+ getBtn({
23984
+ key: 'ble',
23985
+ disable: props.disable || props.modelValue >= maxProp.value,
23986
+ icon: icons.value[ 3 ]
23987
+ }, maxProp.value)
23988
+ );
23861
23989
  }
23862
- else { // is type select
23863
- let
23864
- maxPages = Math.max(
23865
- props.maxPages,
23866
- 1 + (__ellipses.value ? 2 : 0) + (__boundaryNumbers.value ? 2 : 0)
23867
- ),
23868
- pgFrom = props.min,
23869
- pgTo = props.max,
23870
- ellipsesStart = false,
23871
- ellipsesEnd = false,
23872
- boundaryStart = false,
23873
- boundaryEnd = false;
23874
-
23875
- if (props.maxPages && maxPages < (props.max - props.min + 1)) {
23876
- maxPages = 1 + Math.floor(maxPages / 2) * 2;
23877
- pgFrom = Math.max(props.min, Math.min(props.max - maxPages + 1, props.modelValue - Math.floor(maxPages / 2)));
23878
- pgTo = Math.min(props.max, pgFrom + maxPages - 1);
23879
- if (__boundaryNumbers.value) {
23880
- boundaryStart = true;
23881
- pgFrom += 1;
23882
- }
23883
- if (__ellipses.value && pgFrom > (props.min + (__boundaryNumbers.value ? 1 : 0))) {
23884
- ellipsesStart = true;
23885
- pgFrom += 1;
23886
- }
23887
- if (__boundaryNumbers.value) {
23888
- boundaryEnd = true;
23889
- pgTo -= 1;
23890
- }
23891
- if (__ellipses.value && pgTo < (props.max - (__boundaryNumbers.value ? 1 : 0))) {
23892
- ellipsesEnd = true;
23893
- pgTo -= 1;
23894
- }
23990
+
23991
+ if (directionLinksProp.value === true) {
23992
+ contentStart.push(
23993
+ getBtn({
23994
+ key: 'bdp',
23995
+ disable: props.disable || props.modelValue <= minProp.value,
23996
+ icon: icons.value[ 1 ]
23997
+ }, props.modelValue - 1)
23998
+ );
23999
+
24000
+ contentEnd.unshift(
24001
+ getBtn({
24002
+ key: 'bdn',
24003
+ disable: props.disable || props.modelValue >= maxProp.value,
24004
+ icon: icons.value[ 2 ]
24005
+ }, props.modelValue + 1)
24006
+ );
24007
+ }
24008
+
24009
+ if (props.input !== true) { // has buttons instead of inputbox
24010
+ contentMiddle = [];
24011
+ const { pgFrom, pgTo, marginalStyle: style } = btnConfig.value;
24012
+
24013
+ if (btnConfig.value.boundaryStart === true) {
24014
+ const active = minProp.value === props.modelValue;
24015
+ contentStart.push(
24016
+ getBtn({
24017
+ key: 'bns',
24018
+ style,
24019
+ disable: props.disable,
24020
+ label: minProp.value
24021
+ }, minProp.value, active)
24022
+ );
23895
24023
  }
23896
- const style = {
23897
- minWidth: `${ Math.max(2, String(props.max).length) }em`
23898
- };
23899
- if (boundaryStart) {
23900
- const active = props.min === props.modelValue;
23901
- contentStart.push(getBtn({
23902
- key: 'bns',
23903
- style,
23904
- disable: props.disable,
23905
- flat: !active,
23906
- label: props.min,
23907
- ...(active ? activeBtnProps.value : {})
23908
- }, props.min));
23909
- }
23910
- if (boundaryEnd) {
23911
- const active = props.max === props.modelValue;
23912
- contentEnd.unshift(getBtn({
23913
- key: 'bne',
23914
- style,
23915
- disable: props.disable,
23916
- flat: !active,
23917
- label: props.max,
23918
- ...(active ? activeBtnProps.value : {})
23919
- }, props.max));
23920
- }
23921
- if (ellipsesStart) {
23922
- contentStart.push(getBtn({
23923
- key: 'bes',
23924
- style,
23925
- disable: props.disable,
23926
- label: '…',
23927
- ripple: false
23928
- }, pgFrom - 1));
23929
- }
23930
- if (ellipsesEnd) {
23931
- contentEnd.unshift(getBtn({
23932
- key: 'bee',
23933
- style,
23934
- disable: props.disable,
23935
- label: '…',
23936
- ripple: false
23937
- }, pgTo + 1));
24024
+
24025
+ if (btnConfig.value.boundaryEnd === true) {
24026
+ const active = maxProp.value === props.modelValue;
24027
+ contentEnd.unshift(
24028
+ getBtn({
24029
+ key: 'bne',
24030
+ style,
24031
+ disable: props.disable,
24032
+ label: maxProp.value
24033
+ }, maxProp.value, active)
24034
+ );
24035
+ }
24036
+
24037
+ if (btnConfig.value.ellipsesStart === true) {
24038
+ contentStart.push(
24039
+ getBtn({
24040
+ key: 'bes',
24041
+ style,
24042
+ disable: props.disable,
24043
+ label: '…',
24044
+ ripple: false
24045
+ }, pgFrom - 1)
24046
+ );
24047
+ }
24048
+
24049
+ if (btnConfig.value.ellipsesEnd === true) {
24050
+ contentEnd.unshift(
24051
+ getBtn({
24052
+ key: 'bee',
24053
+ style,
24054
+ disable: props.disable,
24055
+ label: '…',
24056
+ ripple: false
24057
+ }, pgTo + 1)
24058
+ );
23938
24059
  }
24060
+
23939
24061
  for (let i = pgFrom; i <= pgTo; i++) {
23940
- const btn = {
23941
- key: `bpg${ i }`,
23942
- style,
23943
- disable: props.disable,
23944
- label: i
23945
- };
23946
- if (i === props.modelValue) {
23947
- Object.assign(btn, activeBtnProps.value);
23948
- }
23949
- contentMiddle.push(getBtn(btn, i));
24062
+ contentMiddle.push(
24063
+ getBtn({
24064
+ key: `bpg${ i }`,
24065
+ style,
24066
+ disable: props.disable,
24067
+ label: i
24068
+ }, i, i === props.modelValue)
24069
+ );
23950
24070
  }
23951
24071
  }
23952
24072
 
@@ -23954,15 +24074,35 @@ var QPagination = createComponent({
23954
24074
  class: classes.value,
23955
24075
  ...attrs.value
23956
24076
  }, [
23957
- contentStart,
23958
-
23959
24077
  h('div', {
23960
- class: 'row justify-center'
24078
+ class: 'q-pagination__content row no-wrap items-center',
24079
+ style: gutterStyle.value
23961
24080
  }, [
23962
- contentMiddle
23963
- ]),
24081
+ ...contentStart,
24082
+
24083
+ props.input === true
24084
+ ? h(QInput, {
24085
+ class: 'inline',
24086
+ style: { width: `${ inputPlaceholder.value.length / 1.5 }em` },
24087
+ type: 'number',
24088
+ dense: true,
24089
+ value: newPage.value,
24090
+ disable: props.disable,
24091
+ dark: isDark.value,
24092
+ borderless: true,
24093
+ inputClass: props.inputClass,
24094
+ inputStyle: props.inputStyle,
24095
+ placeholder: inputPlaceholder.value,
24096
+ min: minProp.value,
24097
+ max: maxProp.value,
24098
+ ...inputEvents.value
24099
+ })
24100
+ : h('div', {
24101
+ class: 'q-pagination__middle row justify-center'
24102
+ }, contentMiddle),
23964
24103
 
23965
- contentEnd
24104
+ ...contentEnd
24105
+ ])
23966
24106
  ])
23967
24107
  }
23968
24108
  }
@@ -24243,7 +24383,7 @@ var QPopupEdit = createComponent({
24243
24383
 
24244
24384
  emits: [
24245
24385
  'update:modelValue', 'save', 'cancel',
24246
- 'before-show', 'show', 'before-hide', 'hide'
24386
+ 'beforeShow', 'show', 'beforeHide', 'hide'
24247
24387
  ],
24248
24388
 
24249
24389
  setup (props, { slots, emit }) {
@@ -24307,7 +24447,7 @@ var QPopupEdit = createComponent({
24307
24447
  validated = false;
24308
24448
  initialValue.value = cloneDeep(props.modelValue);
24309
24449
  currentModel.value = cloneDeep(props.modelValue);
24310
- emit('before-show');
24450
+ emit('beforeShow');
24311
24451
  }
24312
24452
 
24313
24453
  function onShow () {
@@ -24325,7 +24465,7 @@ var QPopupEdit = createComponent({
24325
24465
  }
24326
24466
  }
24327
24467
 
24328
- emit('before-hide');
24468
+ emit('beforeHide');
24329
24469
  }
24330
24470
 
24331
24471
  function onHide () {
@@ -25594,7 +25734,7 @@ var QScrollArea = createComponent({
25594
25734
  scroll.horizontal.percentage = computed(() => {
25595
25735
  const diff = scroll.horizontal.size.value - container.horizontal.value;
25596
25736
  if (diff <= 0) { return 0 }
25597
- const p = between(scroll.horizontal.position.value / diff, 0, 1);
25737
+ const p = between(Math.abs(scroll.horizontal.position.value) / diff, 0, 1);
25598
25738
  return Math.round(p * 10000) / 10000
25599
25739
  });
25600
25740
  scroll.horizontal.thumbHidden = computed(() =>
@@ -25620,7 +25760,7 @@ var QScrollArea = createComponent({
25620
25760
  return {
25621
25761
  ...props.thumbStyle,
25622
25762
  ...props.horizontalThumbStyle,
25623
- left: `${ scroll.horizontal.thumbStart.value }px`,
25763
+ [ proxy.$q.lang.rtl === true ? 'right' : 'left' ]: `${ scroll.horizontal.thumbStart.value }px`,
25624
25764
  width: `${ scroll.horizontal.thumbSize.value }px`
25625
25765
  }
25626
25766
  });
@@ -25814,6 +25954,15 @@ var QScrollArea = createComponent({
25814
25954
 
25815
25955
  let scrollPosition = null;
25816
25956
 
25957
+ watch(() => proxy.$q.lang.rtl, rtl => {
25958
+ if (targetRef.value !== null) {
25959
+ setHorizontalScrollPosition(
25960
+ targetRef.value,
25961
+ Math.abs(scroll.horizontal.position.value) * (rtl === true ? -1 : 1)
25962
+ );
25963
+ }
25964
+ });
25965
+
25817
25966
  onDeactivated(() => {
25818
25967
  scrollPosition = {
25819
25968
  top: scroll.vertical.position.value,
@@ -25850,7 +25999,9 @@ var QScrollArea = createComponent({
25850
25999
  setScrollPercentage (axis, percentage, duration) {
25851
26000
  localSetScrollPosition(
25852
26001
  axis,
25853
- percentage * (scroll[ axis ].size.value - container[ axis ].value),
26002
+ percentage
26003
+ * (scroll[ axis ].size.value - container[ axis ].value)
26004
+ * (axis === 'horizontal' && proxy.$q.lang.rtl === true ? -1 : 1),
25854
26005
  duration
25855
26006
  );
25856
26007
  }
@@ -26599,7 +26750,7 @@ function useVirtualScroll ({
26599
26750
 
26600
26751
  function emitScroll (index) {
26601
26752
  if (prevToIndex !== index) {
26602
- props.onVirtualScroll !== void 0 && emit('virtual-scroll', {
26753
+ props.onVirtualScroll !== void 0 && emit('virtualScroll', {
26603
26754
  index,
26604
26755
  from: virtualScrollSliceRange.value.from,
26605
26756
  to: virtualScrollSliceRange.value.to - 1,
@@ -26771,9 +26922,9 @@ var QSelect = createComponent({
26771
26922
 
26772
26923
  emits: [
26773
26924
  ...useFieldEmits,
26774
- 'add', 'remove', 'input-value', 'new-value',
26925
+ 'add', 'remove', 'inputValue', 'newValue',
26775
26926
  'keyup', 'keypress', 'keydown',
26776
- 'filter-abort'
26927
+ 'filterAbort'
26777
26928
  ],
26778
26929
 
26779
26930
  setup (props, { slots, emit }) {
@@ -26912,20 +27063,16 @@ var QSelect = createComponent({
26912
27063
 
26913
27064
  const tabindex = computed(() => (state.focused.value === true ? props.tabindex : -1));
26914
27065
 
26915
- const comboboxAttrs = computed(() => {
26916
- const attrs = {
26917
- tabindex: props.tabindex,
26918
- role: 'combobox',
26919
- 'aria-label': props.label,
26920
- 'aria-readonly': props.readonly === true ? 'true' : 'false',
26921
- 'aria-autocomplete': props.useInput === true ? 'list' : 'none',
26922
- 'aria-expanded': menu.value === true ? 'true' : 'false',
26923
- 'aria-owns': `${ state.targetUid.value }_lb`,
26924
- 'aria-controls': `${ state.targetUid.value }_lb`
26925
- };
26926
-
26927
- return attrs
26928
- });
27066
+ const comboboxAttrs = computed(() => ({
27067
+ tabindex: props.tabindex,
27068
+ role: 'combobox',
27069
+ 'aria-label': props.label,
27070
+ 'aria-readonly': props.readonly === true ? 'true' : 'false',
27071
+ 'aria-autocomplete': props.useInput === true ? 'list' : 'none',
27072
+ 'aria-expanded': menu.value === true ? 'true' : 'false',
27073
+ 'aria-owns': `${ state.targetUid.value }_lb`,
27074
+ 'aria-controls': `${ state.targetUid.value }_lb`
27075
+ }));
26929
27076
 
26930
27077
  const listboxAttrs = computed(() => {
26931
27078
  const attrs = {
@@ -27521,7 +27668,7 @@ var QSelect = createComponent({
27521
27668
  };
27522
27669
 
27523
27670
  if (props.onNewValue !== void 0) {
27524
- emit('new-value', inputValue.value, done);
27671
+ emit('newValue', inputValue.value, done);
27525
27672
  }
27526
27673
  else {
27527
27674
  done(inputValue.value);
@@ -27544,8 +27691,8 @@ var QSelect = createComponent({
27544
27691
  return hasDialog === true
27545
27692
  ? menuContentRef.value
27546
27693
  : (
27547
- menuRef.value !== null && menuRef.value.__qPortalInnerRef.value !== null
27548
- ? menuRef.value.__qPortalInnerRef.value
27694
+ menuRef.value !== null && menuRef.value.contentEl !== null
27695
+ ? menuRef.value.contentEl
27549
27696
  : void 0
27550
27697
  )
27551
27698
  }
@@ -27688,7 +27835,7 @@ var QSelect = createComponent({
27688
27835
  function setInputValue (val) {
27689
27836
  if (inputValue.value !== val) {
27690
27837
  inputValue.value = val;
27691
- emit('input-value', val);
27838
+ emit('inputValue', val);
27692
27839
  }
27693
27840
  }
27694
27841
 
@@ -27712,7 +27859,7 @@ var QSelect = createComponent({
27712
27859
  }
27713
27860
 
27714
27861
  if (state.innerLoading.value === true) {
27715
- emit('filter-abort');
27862
+ emit('filterAbort');
27716
27863
  }
27717
27864
  else {
27718
27865
  state.innerLoading.value = true;
@@ -27929,7 +28076,7 @@ var QSelect = createComponent({
27929
28076
  filterId = void 0;
27930
28077
 
27931
28078
  if (state.innerLoading.value === true) {
27932
- emit('filter-abort');
28079
+ emit('filterAbort');
27933
28080
  state.innerLoading.value = false;
27934
28081
  innerLoadingIndicator.value = false;
27935
28082
  }
@@ -28015,14 +28162,14 @@ var QSelect = createComponent({
28015
28162
 
28016
28163
  function onControlPopupShow (e) {
28017
28164
  e !== void 0 && stop(e);
28018
- emit('popup-show', e);
28165
+ emit('popupShow', e);
28019
28166
  state.hasPopupOpen = true;
28020
28167
  state.onControlFocusin(e);
28021
28168
  }
28022
28169
 
28023
28170
  function onControlPopupHide (e) {
28024
28171
  e !== void 0 && stop(e);
28025
- emit('popup-hide', e);
28172
+ emit('popupHide', e);
28026
28173
  state.hasPopupOpen = false;
28027
28174
  state.onControlFocusout(e);
28028
28175
  }
@@ -30881,9 +31028,11 @@ var QStep = createComponent({
30881
31028
  setup (props, { slots, emit }) {
30882
31029
  const { proxy: { $q } } = getCurrentInstance();
30883
31030
 
30884
- const $stepper = inject(stepperKey, () => {
30885
- console.error('QStep needs to be child of QStepper');
30886
- });
31031
+ const $stepper = inject(stepperKey, emptyRenderFn);
31032
+ if ($stepper === emptyRenderFn) {
31033
+ console.error('QStep needs to be a child of QStepper');
31034
+ return emptyRenderFn
31035
+ }
30887
31036
 
30888
31037
  const { getCacheWithFn } = useCache();
30889
31038
 
@@ -30941,7 +31090,7 @@ var QStep = createComponent({
30941
31090
 
30942
31091
  return () => h(
30943
31092
  'div',
30944
- { ref: rootRef, class: 'q-stepper__step', ...scrollEvent.value },
31093
+ { ref: rootRef, class: 'q-stepper__step', role: 'tabpanel', ...scrollEvent.value },
30945
31094
  $stepper.value.vertical === true
30946
31095
  ? [
30947
31096
  h(StepHeader, {
@@ -32011,7 +32160,7 @@ var QTable = createComponent({
32011
32160
  },
32012
32161
 
32013
32162
  emits: [
32014
- 'request', 'virtual-scroll',
32163
+ 'request', 'virtualScroll',
32015
32164
  ...useFullscreenEmits,
32016
32165
  ...useTableRowExpandEmits,
32017
32166
  ...useTableRowSelectionEmits
@@ -32245,7 +32394,7 @@ var QTable = createComponent({
32245
32394
 
32246
32395
  scrollTarget.scrollTop = offsetTop;
32247
32396
 
32248
- emit('virtual-scroll', {
32397
+ emit('virtualScroll', {
32249
32398
  index: toIndex,
32250
32399
  from: 0,
32251
32400
  to: innerPagination.value.rowsPerPage - 1,
@@ -32255,7 +32404,7 @@ var QTable = createComponent({
32255
32404
  }
32256
32405
 
32257
32406
  function onVScroll (info) {
32258
- emit('virtual-scroll', info);
32407
+ emit('virtualScroll', info);
32259
32408
  }
32260
32409
 
32261
32410
  function getProgress () {
@@ -34006,9 +34155,11 @@ var QTimelineEntry = createComponent({
34006
34155
  },
34007
34156
 
34008
34157
  setup (props, { slots }) {
34009
- const $timeline = inject(timelineKey, () => {
34158
+ const $timeline = inject(timelineKey, emptyRenderFn);
34159
+ if ($timeline === emptyRenderFn) {
34010
34160
  console.error('QTimelineEntry needs to be child of QTimeline');
34011
- });
34161
+ return emptyRenderFn
34162
+ }
34012
34163
 
34013
34164
  const classes = computed(() =>
34014
34165
  `q-timeline__entry q-timeline__entry--${ props.side }`
@@ -34097,7 +34248,7 @@ var QToolbar = createComponent({
34097
34248
  + (props.inset === true ? ' q-toolbar--inset' : '')
34098
34249
  );
34099
34250
 
34100
- return () => h('div', { class: classes.value }, hSlot(slots.default))
34251
+ return () => h('div', { class: classes.value, role: 'toolbar' }, hSlot(slots.default))
34101
34252
  }
34102
34253
  });
34103
34254
 
@@ -34181,9 +34332,9 @@ var QTree = createComponent({
34181
34332
  'update:expanded',
34182
34333
  'update:ticked',
34183
34334
  'update:selected',
34184
- 'lazy-load',
34185
- 'after-show',
34186
- 'after-hide'
34335
+ 'lazyLoad',
34336
+ 'afterShow',
34337
+ 'afterHide'
34187
34338
  ],
34188
34339
 
34189
34340
  setup (props, { slots, emit }) {
@@ -34432,7 +34583,7 @@ var QTree = createComponent({
34432
34583
  if (Array.isArray(node[ props.childrenKey ]) !== true) {
34433
34584
  node[ props.childrenKey ] = [];
34434
34585
  }
34435
- emit('lazy-load', {
34586
+ emit('lazyLoad', {
34436
34587
  node,
34437
34588
  key,
34438
34589
  done: children => {
@@ -34579,11 +34730,11 @@ var QTree = createComponent({
34579
34730
  }
34580
34731
 
34581
34732
  function onShow () {
34582
- emit('after-show');
34733
+ emit('afterShow');
34583
34734
  }
34584
34735
 
34585
34736
  function onHide () {
34586
- emit('after-hide');
34737
+ emit('afterHide');
34587
34738
  }
34588
34739
 
34589
34740
  function getNode (node) {
@@ -35426,7 +35577,7 @@ function injectPlugin ({ props, emit, helpers }) {
35426
35577
  helpers.queuedFiles.value = helpers.queuedFiles.value.concat(files);
35427
35578
  files.forEach(f => { helpers.updateFileStatus(f, 'failed'); });
35428
35579
 
35429
- emit('factory-failed', err, files);
35580
+ emit('factoryFailed', err, files);
35430
35581
  workingThreads.value--;
35431
35582
  }
35432
35583
  };
@@ -35585,9 +35736,13 @@ var QUploaderAddTrigger = createComponent({
35585
35736
  name: 'QUploaderAddTrigger',
35586
35737
 
35587
35738
  setup () {
35588
- return inject(uploaderKey, () => {
35739
+ const $trigger = inject(uploaderKey, emptyRenderFn);
35740
+
35741
+ if ($trigger === emptyRenderFn) {
35589
35742
  console.error('QUploaderAddTrigger needs to be child of QUploader');
35590
- })
35743
+ }
35744
+
35745
+ return $trigger
35591
35746
  }
35592
35747
  });
35593
35748
 
@@ -37765,6 +37920,7 @@ var BottomSheet$1 = createComponent({
37765
37920
  action.class
37766
37921
  ],
37767
37922
  tabindex: 0,
37923
+ role: 'listitem',
37768
37924
  onClick () { onOk(action); },
37769
37925
  onKeyup (e) { e.keyCode === 13 && onOk(action); }
37770
37926
  }, [
@@ -37797,8 +37953,7 @@ var BottomSheet$1 = createComponent({
37797
37953
  tabindex: 0,
37798
37954
  clickable: true,
37799
37955
  dark: isDark.value,
37800
- onClick () { onOk(action); },
37801
- onKeyup (e) { e.keyCode === 13 && onOk(action); }
37956
+ onClick () { onOk(action); }
37802
37957
  }, () => [
37803
37958
  h(
37804
37959
  QItemSection,
@@ -37840,9 +37995,12 @@ var BottomSheet$1 = createComponent({
37840
37995
  child.push(
37841
37996
  props.grid === true
37842
37997
  ? h('div', {
37843
- class: 'row items-stretch justify-start'
37998
+ class: 'row items-stretch justify-start',
37999
+ role: 'list'
37844
38000
  }, getGrid())
37845
- : h('div', getList())
38001
+ : h('div', {
38002
+ role: 'list'
38003
+ }, getList())
37846
38004
  );
37847
38005
 
37848
38006
  return child
@@ -38432,12 +38590,12 @@ var DialogPlugin = createComponent({
38432
38590
  function getPrompt () {
38433
38591
  return [
38434
38592
  h(QInput, {
38435
- modelValue: model.value,
38436
- ...formProps.value,
38437
38593
  color: vmColor.value,
38438
38594
  dense: true,
38439
38595
  autofocus: true,
38440
38596
  dark: isDark.value,
38597
+ ...formProps.value,
38598
+ modelValue: model.value,
38441
38599
  'onUpdate:modelValue': onUpdateModel,
38442
38600
  onKeyup: onInputKeyup
38443
38601
  })
@@ -38447,11 +38605,11 @@ var DialogPlugin = createComponent({
38447
38605
  function getOptions () {
38448
38606
  return [
38449
38607
  h(QOptionGroup, {
38450
- modelValue: model.value,
38451
- ...formProps.value,
38452
38608
  color: vmColor.value,
38453
38609
  options: props.options.items,
38454
38610
  dark: isDark.value,
38611
+ ...formProps.value,
38612
+ modelValue: model.value,
38455
38613
  'onUpdate:modelValue': onUpdateModel
38456
38614
  })
38457
38615
  ]
@@ -40138,7 +40296,7 @@ function runSequentialPromises (
40138
40296
  */
40139
40297
 
40140
40298
  const Quasar = {
40141
- version: '2.9.2',
40299
+ version: '2.10.1',
40142
40300
  install: installQuasar,
40143
40301
  lang: Plugin$8,
40144
40302
  iconSet: Plugin$7