quasar 1.20.2 → 1.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (287) hide show
  1. package/dist/api/QBreadcrumbsEl.json +53 -0
  2. package/dist/api/QBtn.json +42 -5
  3. package/dist/api/QBtnDropdown.json +1 -1
  4. package/dist/api/QChip.json +1 -1
  5. package/dist/api/QDialog.json +6 -0
  6. package/dist/api/QExpansionItem.json +1 -1
  7. package/dist/api/QItem.json +53 -0
  8. package/dist/api/QRating.json +13 -0
  9. package/dist/api/QRouteTab.json +6 -2
  10. package/dist/babel-transforms/imports.js +2 -12
  11. package/dist/icon-set/bootstrap-icons.umd.min.js +1 -1
  12. package/dist/icon-set/eva-icons.umd.min.js +1 -1
  13. package/dist/icon-set/fontawesome-v5-pro.umd.min.js +1 -1
  14. package/dist/icon-set/fontawesome-v5.umd.min.js +1 -1
  15. package/dist/icon-set/fontawesome-v6-pro.umd.min.js +1 -1
  16. package/dist/icon-set/fontawesome-v6.umd.min.js +1 -1
  17. package/dist/icon-set/ionicons-v4.umd.min.js +1 -1
  18. package/dist/icon-set/line-awesome.umd.min.js +1 -1
  19. package/dist/icon-set/material-icons-outlined.umd.min.js +1 -1
  20. package/dist/icon-set/material-icons-round.umd.min.js +1 -1
  21. package/dist/icon-set/material-icons-sharp.umd.min.js +1 -1
  22. package/dist/icon-set/material-icons.umd.min.js +1 -1
  23. package/dist/icon-set/material-symbols-outlined.umd.min.js +1 -1
  24. package/dist/icon-set/material-symbols-rounded.umd.min.js +1 -1
  25. package/dist/icon-set/material-symbols-sharp.umd.min.js +1 -1
  26. package/dist/icon-set/mdi-v3.umd.min.js +1 -1
  27. package/dist/icon-set/mdi-v4.umd.min.js +1 -1
  28. package/dist/icon-set/mdi-v5.umd.min.js +1 -1
  29. package/dist/icon-set/mdi-v6.umd.min.js +1 -1
  30. package/dist/icon-set/svg-bootstrap-icons.umd.min.js +1 -1
  31. package/dist/icon-set/svg-eva-icons.umd.min.js +1 -1
  32. package/dist/icon-set/svg-fontawesome-v5.umd.min.js +1 -1
  33. package/dist/icon-set/svg-fontawesome-v6.umd.min.js +2 -2
  34. package/dist/icon-set/svg-ionicons-v4.umd.min.js +1 -1
  35. package/dist/icon-set/svg-ionicons-v5.umd.min.js +1 -1
  36. package/dist/icon-set/svg-ionicons-v6.umd.min.js +1 -1
  37. package/dist/icon-set/svg-line-awesome.umd.min.js +1 -1
  38. package/dist/icon-set/svg-material-icons-outlined.umd.min.js +1 -1
  39. package/dist/icon-set/svg-material-icons-round.umd.min.js +1 -1
  40. package/dist/icon-set/svg-material-icons-sharp.umd.min.js +1 -1
  41. package/dist/icon-set/svg-material-icons.umd.min.js +1 -1
  42. package/dist/icon-set/svg-material-symbols-outlined.umd.min.js +2 -2
  43. package/dist/icon-set/svg-material-symbols-rounded.umd.min.js +2 -2
  44. package/dist/icon-set/svg-material-symbols-sharp.umd.min.js +2 -2
  45. package/dist/icon-set/svg-mdi-v4.umd.min.js +1 -1
  46. package/dist/icon-set/svg-mdi-v5.umd.min.js +1 -1
  47. package/dist/icon-set/svg-mdi-v6.umd.min.js +1 -1
  48. package/dist/icon-set/svg-themify.umd.min.js +1 -1
  49. package/dist/icon-set/themify.umd.min.js +1 -1
  50. package/dist/lang/ar.umd.min.js +1 -1
  51. package/dist/lang/az-latn.umd.min.js +1 -1
  52. package/dist/lang/bg.umd.min.js +1 -1
  53. package/dist/lang/ca.umd.min.js +1 -1
  54. package/dist/lang/cs.umd.min.js +1 -1
  55. package/dist/lang/da.umd.min.js +1 -1
  56. package/dist/lang/de.umd.min.js +1 -1
  57. package/dist/lang/el.umd.min.js +1 -1
  58. package/dist/lang/en-gb.umd.min.js +1 -1
  59. package/dist/lang/en-us.umd.min.js +1 -1
  60. package/dist/lang/eo.umd.min.js +1 -1
  61. package/dist/lang/es.umd.min.js +1 -1
  62. package/dist/lang/et.umd.min.js +1 -1
  63. package/dist/lang/eu.umd.min.js +1 -1
  64. package/dist/lang/fa-ir.umd.min.js +1 -1
  65. package/dist/lang/fa.umd.min.js +1 -1
  66. package/dist/lang/fi.umd.min.js +1 -1
  67. package/dist/lang/fr.umd.min.js +1 -1
  68. package/dist/lang/gn.umd.min.js +1 -1
  69. package/dist/lang/he.umd.min.js +1 -1
  70. package/dist/lang/hr.umd.min.js +1 -1
  71. package/dist/lang/hu.umd.min.js +1 -1
  72. package/dist/lang/id.umd.min.js +1 -1
  73. package/dist/lang/is.umd.min.js +1 -1
  74. package/dist/lang/it.umd.min.js +1 -1
  75. package/dist/lang/ja.umd.min.js +1 -1
  76. package/dist/lang/km.umd.min.js +1 -1
  77. package/dist/lang/ko-kr.umd.min.js +1 -1
  78. package/dist/lang/kur-ckb.umd.min.js +1 -1
  79. package/dist/lang/kz.umd.min.js +1 -1
  80. package/dist/lang/lu.umd.min.js +1 -1
  81. package/dist/lang/lv.umd.min.js +1 -1
  82. package/dist/lang/ml.umd.min.js +1 -1
  83. package/dist/lang/mm.umd.min.js +1 -1
  84. package/dist/lang/ms.umd.min.js +1 -1
  85. package/dist/lang/my.umd.min.js +1 -1
  86. package/dist/lang/nb-no.umd.min.js +1 -1
  87. package/dist/lang/nl.umd.min.js +2 -2
  88. package/dist/lang/pl.umd.min.js +1 -1
  89. package/dist/lang/pt-br.umd.min.js +1 -1
  90. package/dist/lang/pt.umd.min.js +1 -1
  91. package/dist/lang/ro.umd.min.js +1 -1
  92. package/dist/lang/ru.umd.min.js +1 -1
  93. package/dist/lang/sk.umd.min.js +1 -1
  94. package/dist/lang/sl.umd.min.js +1 -1
  95. package/dist/lang/sm.umd.min.js +1 -1
  96. package/dist/lang/sr.umd.min.js +1 -1
  97. package/dist/lang/sv.umd.min.js +1 -1
  98. package/dist/lang/ta.umd.min.js +1 -1
  99. package/dist/lang/th.umd.min.js +1 -1
  100. package/dist/lang/tr.umd.min.js +1 -1
  101. package/dist/lang/ug.umd.min.js +1 -1
  102. package/dist/lang/uk.umd.min.js +1 -1
  103. package/dist/lang/uz-Cyrl.umd.min.js +1 -1
  104. package/dist/lang/uz-Latn.umd.min.js +1 -1
  105. package/dist/lang/vi.umd.min.js +1 -1
  106. package/dist/lang/zh-hans.umd.min.js +1 -1
  107. package/dist/lang/zh-hant.umd.min.js +1 -1
  108. package/dist/quasar.addon.css +1 -1
  109. package/dist/quasar.addon.rtl.css +1 -1
  110. package/dist/quasar.common.js +2 -2
  111. package/dist/quasar.css +43 -288
  112. package/dist/quasar.esm.js +2 -2
  113. package/dist/quasar.ie.polyfills.js +1 -1
  114. package/dist/quasar.ie.polyfills.umd.min.js +1 -1
  115. package/dist/quasar.min.css +1 -1
  116. package/dist/quasar.rtl.css +46 -408
  117. package/dist/quasar.rtl.min.css +1 -1
  118. package/dist/quasar.sass +3 -7
  119. package/dist/quasar.styl +3 -7
  120. package/dist/quasar.umd.js +1062 -867
  121. package/dist/quasar.umd.min.js +2 -2
  122. package/dist/quasar.umd.modern.js +1017 -854
  123. package/dist/quasar.umd.modern.min.js +2 -2
  124. package/dist/types/index.d.ts +8 -0
  125. package/dist/types/utils/run-sequential-promises.d.ts +1 -1
  126. package/dist/vetur/quasar-attributes.json +8 -0
  127. package/dist/vetur/quasar-tags.json +3 -1
  128. package/dist/web-types/web-types.json +66 -5
  129. package/lang/nl.js +2 -2
  130. package/package.json +1 -1
  131. package/src/body.js +1 -1
  132. package/src/components/avatar/QAvatar.js +1 -1
  133. package/src/components/badge/QBadge.js +1 -1
  134. package/src/components/banner/QBanner.js +1 -1
  135. package/src/components/bar/QBar.js +1 -1
  136. package/src/components/breadcrumbs/QBreadcrumbs.js +1 -1
  137. package/src/components/breadcrumbs/QBreadcrumbsEl.js +7 -4
  138. package/src/components/breadcrumbs/QBreadcrumbsEl.json +56 -0
  139. package/src/components/btn/QBtn.js +7 -29
  140. package/src/components/btn/QBtn.json +43 -5
  141. package/src/components/btn-dropdown/QBtnDropdown.js +2 -2
  142. package/src/components/btn-dropdown/QBtnDropdown.json +1 -1
  143. package/src/components/btn-group/QBtnGroup.js +1 -1
  144. package/src/components/btn-toggle/QBtnToggle.js +1 -1
  145. package/src/components/card/QCard.js +1 -1
  146. package/src/components/card/QCardActions.js +1 -1
  147. package/src/components/card/QCardSection.js +1 -1
  148. package/src/components/carousel/QCarousel.js +2 -2
  149. package/src/components/carousel/QCarouselControl.js +1 -1
  150. package/src/components/carousel/QCarouselSlide.js +1 -1
  151. package/src/components/checkbox/QCheckbox.js +1 -1
  152. package/src/components/chip/QChip.js +2 -2
  153. package/src/components/chip/QChip.json +1 -1
  154. package/src/components/circular-progress/QCircularProgress.js +1 -1
  155. package/src/components/color/QColor.js +1 -1
  156. package/src/components/date/QDate.js +3 -3
  157. package/src/components/dialog/QDialog.js +22 -7
  158. package/src/components/dialog/QDialog.json +7 -0
  159. package/src/components/dialog-bottom-sheet/BottomSheet.js +1 -1
  160. package/src/components/dialog-plugin/DialogPlugin.js +2 -2
  161. package/src/components/drawer/QDrawer.js +13 -7
  162. package/src/components/editor/QEditor.js +2 -2
  163. package/src/components/editor/editor-utils.js +2 -2
  164. package/src/components/expansion-item/QExpansionItem.js +29 -14
  165. package/src/components/expansion-item/QExpansionItem.json +1 -1
  166. package/src/components/fab/QFab.js +2 -2
  167. package/src/components/fab/QFabAction.js +1 -1
  168. package/src/components/field/QField.js +2 -2
  169. package/src/components/file/QFile.js +1 -1
  170. package/src/components/footer/QFooter.js +2 -2
  171. package/src/components/form/QForm.js +3 -3
  172. package/src/components/header/QHeader.js +2 -2
  173. package/src/components/icon/QIcon.js +1 -1
  174. package/src/components/img/QImg.js +1 -1
  175. package/src/components/infinite-scroll/QInfiniteScroll.js +1 -1
  176. package/src/components/input/QInput.js +1 -1
  177. package/src/components/intersection/QIntersection.js +1 -1
  178. package/src/components/item/QItem.js +39 -33
  179. package/src/components/item/QItem.json +56 -0
  180. package/src/components/item/QItemLabel.js +1 -1
  181. package/src/components/item/QItemSection.js +1 -1
  182. package/src/components/item/QList.js +1 -1
  183. package/src/components/knob/QKnob.js +2 -2
  184. package/src/components/layout/QLayout.js +2 -2
  185. package/src/components/linear-progress/QLinearProgress.js +1 -1
  186. package/src/components/markup-table/QMarkupTable.js +1 -1
  187. package/src/components/menu/ClickOutside.js +1 -1
  188. package/src/components/menu/QMenu.js +16 -7
  189. package/src/components/no-ssr/QNoSsr.js +1 -1
  190. package/src/components/option-group/QOptionGroup.js +1 -1
  191. package/src/components/page/QPage.js +1 -1
  192. package/src/components/page/QPageContainer.js +1 -1
  193. package/src/components/page-sticky/QPageSticky.js +1 -1
  194. package/src/components/pagination/QPagination.js +2 -2
  195. package/src/components/parallax/QParallax.js +1 -1
  196. package/src/components/popup-edit/QPopupEdit.js +6 -12
  197. package/src/components/popup-proxy/QPopupProxy.js +1 -1
  198. package/src/components/pull-to-refresh/QPullToRefresh.js +1 -1
  199. package/src/components/radio/QRadio.js +5 -4
  200. package/src/components/rating/QRating.js +46 -15
  201. package/src/components/rating/QRating.json +11 -0
  202. package/src/components/resize-observer/QResizeObserver.js +1 -1
  203. package/src/components/responsive/QResponsive.js +1 -1
  204. package/src/components/scroll-area/QScrollArea.js +2 -2
  205. package/src/components/select/QSelect.js +3 -3
  206. package/src/components/skeleton/QSkeleton.js +1 -1
  207. package/src/components/slide-item/QSlideItem.js +2 -2
  208. package/src/components/slide-transition/QSlideTransition.js +2 -2
  209. package/src/components/splitter/QSplitter.js +2 -2
  210. package/src/components/stepper/QStep.js +2 -2
  211. package/src/components/stepper/QStepper.js +2 -2
  212. package/src/components/stepper/QStepperNavigation.js +1 -1
  213. package/src/components/stepper/StepHeader.js +1 -1
  214. package/src/components/tab-panels/QTabPanel.js +1 -1
  215. package/src/components/table/QTable.js +1 -1
  216. package/src/components/table/QTd.js +1 -1
  217. package/src/components/table/QTh.js +1 -1
  218. package/src/components/table/QTr.js +1 -1
  219. package/src/components/table/table-body.js +21 -32
  220. package/src/components/table/table-bottom.js +1 -1
  221. package/src/components/table/table-header.js +9 -9
  222. package/src/components/table/table-sort.js +1 -1
  223. package/src/components/tabs/QRouteTab.js +10 -120
  224. package/src/components/tabs/QRouteTab.json +7 -2
  225. package/src/components/tabs/QTab.js +112 -75
  226. package/src/components/tabs/QTabs.js +411 -329
  227. package/src/components/tabs/QTabs.sass +2 -7
  228. package/src/components/tabs/QTabs.styl +2 -7
  229. package/src/components/time/QTime.js +2 -2
  230. package/src/components/timeline/QTimeline.js +1 -1
  231. package/src/components/timeline/QTimelineEntry.js +1 -1
  232. package/src/components/toolbar/QToolbar.js +1 -1
  233. package/src/components/toolbar/QToolbarTitle.js +1 -1
  234. package/src/components/tooltip/QTooltip.js +19 -15
  235. package/src/components/tree/QTree.js +17 -15
  236. package/src/components/uploader/QUploaderBase.js +1 -1
  237. package/src/components/virtual-scroll/QVirtualScroll.js +1 -1
  238. package/src/directives/ClosePopup.js +1 -1
  239. package/src/directives/GoBack.js +1 -1
  240. package/src/directives/Ripple.js +1 -1
  241. package/src/directives/TouchHold.js +2 -2
  242. package/src/directives/TouchPan.js +4 -4
  243. package/src/directives/TouchRepeat.js +3 -3
  244. package/src/directives/TouchSwipe.js +3 -3
  245. package/src/mixins/anchor.js +2 -2
  246. package/src/mixins/attrs.js +1 -1
  247. package/src/mixins/btn.js +4 -3
  248. package/src/mixins/checkbox.js +4 -3
  249. package/src/mixins/datetime.js +1 -1
  250. package/src/mixins/file.js +1 -1
  251. package/src/mixins/listeners.js +1 -1
  252. package/src/mixins/mask.js +1 -1
  253. package/src/mixins/model-toggle.js +5 -7
  254. package/src/mixins/panel.js +2 -2
  255. package/src/mixins/portal.js +1 -1
  256. package/src/mixins/router-link.js +164 -38
  257. package/src/mixins/timeout.js +57 -26
  258. package/src/plugins/BottomSheet.js +1 -1
  259. package/src/plugins/BottomSheet.json +1 -1
  260. package/src/plugins/Dialog.js +1 -1
  261. package/src/plugins/Dialog.json +1 -1
  262. package/src/plugins/Loading.js +1 -1
  263. package/src/plugins/LocalStorage.js +1 -1
  264. package/src/plugins/LocalStorage.json +1 -1
  265. package/src/plugins/SessionStorage.js +1 -1
  266. package/src/plugins/SessionStorage.json +1 -1
  267. package/src/utils/date.js +1 -1
  268. package/src/utils/extend.js +15 -19
  269. package/src/utils/{cache.js → private/cache.js} +1 -1
  270. package/src/utils/{date-persian.js → private/date-persian.js} +0 -0
  271. package/src/utils/{escape-key.js → private/escape-key.js} +0 -0
  272. package/src/utils/{focus-manager.js → private/focus-manager.js} +0 -0
  273. package/src/utils/{global-dialog.js → private/global-dialog.js} +1 -1
  274. package/src/utils/{global-dialog.json → private/global-dialog.json} +0 -0
  275. package/src/utils/private/inject-obj-prop.js +15 -0
  276. package/src/utils/{key-composition.js → private/key-composition.js} +0 -0
  277. package/src/utils/{position-engine.js → private/position-engine.js} +2 -2
  278. package/src/utils/{selection.js → private/selection.js} +1 -1
  279. package/src/utils/{slot.js → private/slot.js} +0 -0
  280. package/src/utils/{sort.js → private/sort.js} +0 -0
  281. package/src/utils/{touch.js → private/touch.js} +0 -0
  282. package/src/utils/{vm.js → private/vm.js} +0 -0
  283. package/src/utils/{web-storage.js → private/web-storage.js} +2 -2
  284. package/src/utils/{web-storage.json → private/web-storage.json} +0 -0
  285. package/src/utils/run-sequential-promises.js +1 -1
  286. package/src/utils.js +4 -4
  287. package/src/utils/router.js +0 -50
@@ -2589,6 +2589,10 @@ export interface QDialog extends Vue {
2589
2589
  * Do not shake up the Dialog to catch user's attention
2590
2590
  */
2591
2591
  noShake? : boolean
2592
+ /**
2593
+ * Allow elements outside of the Dialog to be focusable; By default, for accessibility reasons, QDialog does not allow outer focus
2594
+ */
2595
+ allowFocusOutside? : boolean
2592
2596
  /**
2593
2597
  * Triggers component to show
2594
2598
  * @param evt JS event object
@@ -5435,6 +5439,10 @@ export interface QRating extends Vue {
5435
5439
  * Icon name following Quasar convention to be used when selected (optional); make sure you have the icon library installed unless you are using 'img:' prefix; If an array is provided each rating value will use the corresponding icon in the array (0 based)
5436
5440
  */
5437
5441
  iconHalf? : string | any[]
5442
+ /**
5443
+ * Label to be set on aria-label for Icon; If an array is provided each rating value will use the corresponding aria-label in the array (0 based); If string value is provided the rating value will be appended; If not provided the name of the icon will be used
5444
+ */
5445
+ iconAriaLabel? : string | any[]
5438
5446
  /**
5439
5447
  * Color name for component from the Quasar Color Palette; v1.5.0+: If an array is provided each rating value will use the corresponding color in the array (0 based)
5440
5448
  */
@@ -43,7 +43,7 @@ export type RunSequentialPromisesResult<TKey extends number | string, TValue> =
43
43
  export interface RunSequentialPromisesOptions {
44
44
  /**
45
45
  * When making HTTP requests, be aware of the maximum threads that
46
- * the hosting browser supports (usually 3). Any number of threads
46
+ * the hosting browser supports (usually 5). Any number of threads
47
47
  * above that won't add any real benefits.
48
48
  *
49
49
  * @default 1
@@ -1331,6 +1331,10 @@
1331
1331
  "type": "boolean",
1332
1332
  "description": "Do not shake up the Dialog to catch user's attention"
1333
1333
  },
1334
+ "q-dialog/allow-focus-outside": {
1335
+ "type": "boolean",
1336
+ "description": "Allow elements outside of the Dialog to be focusable; By default, for accessibility reasons, QDialog does not allow outer focus"
1337
+ },
1334
1338
  "q-drawer/value": {
1335
1339
  "type": "boolean",
1336
1340
  "description": "Model of the component defining shown/hidden state; Either use this property (along with a listener for 'input' event) OR use v-model directive"
@@ -3663,6 +3667,10 @@
3663
3667
  "type": "string|array",
3664
3668
  "description": "Icon name following Quasar convention to be used when selected (optional); make sure you have the icon library installed unless you are using 'img:' prefix; If an array is provided each rating value will use the corresponding icon in the array (0 based)"
3665
3669
  },
3670
+ "q-rating/icon-aria-label": {
3671
+ "type": "string|array",
3672
+ "description": "Label to be set on aria-label for Icon; If an array is provided each rating value will use the corresponding aria-label in the array (0 based); If string value is provided the rating value will be appended; If not provided the name of the icon will be used"
3673
+ },
3666
3674
  "q-rating/color": {
3667
3675
  "type": "string|array",
3668
3676
  "description": "Color name for component from the Quasar Color Palette; v1.5.0+: If an array is provided each rating value will use the corresponding color in the array (0 based)"
@@ -448,7 +448,8 @@
448
448
  "square",
449
449
  "no-refocus",
450
450
  "no-focus",
451
- "no-shake"
451
+ "no-shake",
452
+ "allow-focus-outside"
452
453
  ],
453
454
  "description": ""
454
455
  },
@@ -1226,6 +1227,7 @@
1226
1227
  "icon",
1227
1228
  "icon-selected",
1228
1229
  "icon-half",
1230
+ "icon-aria-label",
1229
1231
  "color",
1230
1232
  "color-selected",
1231
1233
  "color-half",
@@ -2,7 +2,7 @@
2
2
  "$schema": "",
3
3
  "framework": "vue",
4
4
  "name": "quasar",
5
- "version": "1.20.2",
5
+ "version": "1.21.0",
6
6
  "contributions": {
7
7
  "html": {
8
8
  "types-syntax": "typescript",
@@ -566,6 +566,27 @@
566
566
  "doc-url": "https://v1.quasar.dev/vue-components/breadcrumbs"
567
567
  }
568
568
  ],
569
+ "events": [
570
+ {
571
+ "name": "click",
572
+ "arguments": [
573
+ {
574
+ "name": "evt",
575
+ "type": "object",
576
+ "description": "JS event object; If you are using route navigation ('to'/'replace'/'append' props) and you want to cancel navigation then call evt.preventDefault() synchronously in your event handler",
577
+ "doc-url": "https://v1.quasar.dev/vue-components/breadcrumbs"
578
+ },
579
+ {
580
+ "name": "navigateFn",
581
+ "type": "Function",
582
+ "description": "Available ONLY if you are using route navigation ('to'/'replace'/'append' props); When you need to control the time at which the component should trigger the route navigation then call evt.preventDefault() synchronously and then call this function at your convenience; Useful if you have async work to be done before the actual route navigation or if you want to redirect somewhere else",
583
+ "doc-url": "https://v1.quasar.dev/vue-components/breadcrumbs"
584
+ }
585
+ ],
586
+ "description": "Emitted when the component is clicked",
587
+ "doc-url": "https://v1.quasar.dev/vue-components/breadcrumbs"
588
+ }
589
+ ],
569
590
  "slots": [
570
591
  {
571
592
  "name": "default",
@@ -1868,17 +1889,17 @@
1868
1889
  {
1869
1890
  "name": "evt",
1870
1891
  "type": "object",
1871
- "description": "JS event object; If you want to cancel navigation set synchronously 'evt.navigate' to false",
1892
+ "description": "JS event object; If you are using route navigation ('to'/'replace'/'append' props) and you want to cancel navigation then call evt.preventDefault() synchronously in your event handler",
1872
1893
  "doc-url": "https://v1.quasar.dev/vue-components/button"
1873
1894
  },
1874
1895
  {
1875
1896
  "name": "navigateFn",
1876
1897
  "type": "Function",
1877
- "description": "When you need to control the time at which the button should trigger the route navigation then set 'evt.navigate' to false and call this function; Useful if you have async work to be done before the actual route navigation",
1898
+ "description": "Available ONLY if you are using route navigation ('to'/'replace'/'append' props); When you need to control the time at which the component should trigger the route navigation then call evt.preventDefault() synchronously and then call this function at your convenience; Useful if you have async work to be done before the actual route navigation or if you want to redirect somewhere else",
1878
1899
  "doc-url": "https://v1.quasar.dev/vue-components/button"
1879
1900
  }
1880
1901
  ],
1881
- "description": "Emitted when component is clicked (activated)",
1902
+ "description": "Emitted when the component is clicked",
1882
1903
  "doc-url": "https://v1.quasar.dev/vue-components/button"
1883
1904
  }
1884
1905
  ],
@@ -4098,6 +4119,16 @@
4098
4119
  "description": "Do not shake up the Dialog to catch user's attention",
4099
4120
  "doc-url": "https://v1.quasar.dev/vue-components/dialog",
4100
4121
  "type": "boolean"
4122
+ },
4123
+ {
4124
+ "name": "allow-focus-outside",
4125
+ "value": {
4126
+ "kind": "expression",
4127
+ "type": "boolean"
4128
+ },
4129
+ "description": "Allow elements outside of the Dialog to be focusable; By default, for accessibility reasons, QDialog does not allow outer focus",
4130
+ "doc-url": "https://v1.quasar.dev/vue-components/dialog",
4131
+ "type": "boolean"
4101
4132
  }
4102
4133
  ],
4103
4134
  "events": [
@@ -8936,6 +8967,27 @@
8936
8967
  "type": "boolean"
8937
8968
  }
8938
8969
  ],
8970
+ "events": [
8971
+ {
8972
+ "name": "click",
8973
+ "arguments": [
8974
+ {
8975
+ "name": "evt",
8976
+ "type": "object",
8977
+ "description": "JS event object; If you are using route navigation ('to'/'replace'/'append' props) and you want to cancel navigation then call evt.preventDefault() synchronously in your event handler",
8978
+ "doc-url": "https://v1.quasar.dev/vue-components/list-and-list-items"
8979
+ },
8980
+ {
8981
+ "name": "navigateFn",
8982
+ "type": "Function",
8983
+ "description": "Available ONLY if you are using route navigation ('to'/'replace'/'append' props); When you need to control the time at which the component should trigger the route navigation then call evt.preventDefault() synchronously and then call this function at your convenience; Useful if you have async work to be done before the actual route navigation or if you want to redirect somewhere else",
8984
+ "doc-url": "https://v1.quasar.dev/vue-components/list-and-list-items"
8985
+ }
8986
+ ],
8987
+ "description": "Emitted when the component is clicked",
8988
+ "doc-url": "https://v1.quasar.dev/vue-components/list-and-list-items"
8989
+ }
8990
+ ],
8939
8991
  "slots": [
8940
8992
  {
8941
8993
  "name": "default",
@@ -12239,6 +12291,15 @@
12239
12291
  "description": "Icon name following Quasar convention to be used when selected (optional); make sure you have the icon library installed unless you are using 'img:' prefix; If an array is provided each rating value will use the corresponding icon in the array (0 based)\n\nExamples:\nmap\nion-add\nimg:https://cdn.quasar.dev/logo/svg/quasar-logo.svg\nimg:path/to/some_image.png",
12240
12292
  "doc-url": "https://v1.quasar.dev/vue-components/rating"
12241
12293
  },
12294
+ {
12295
+ "name": "icon-aria-label",
12296
+ "value": {
12297
+ "kind": "expression",
12298
+ "type": "string|any[]"
12299
+ },
12300
+ "description": "Label to be set on aria-label for Icon; If an array is provided each rating value will use the corresponding aria-label in the array (0 based); If string value is provided the rating value will be appended; If not provided the name of the icon will be used\n\nExamples:\nRating\n[\"Bad\", \"Normal\", \"Good\"]",
12301
+ "doc-url": "https://v1.quasar.dev/vue-components/rating"
12302
+ },
12242
12303
  {
12243
12304
  "name": "color",
12244
12305
  "value": {
@@ -18464,7 +18525,7 @@
18464
18525
  {
18465
18526
  "name": "navigateFn",
18466
18527
  "type": "Function",
18467
- "description": "When you need to control the time at which the tab should trigger the route navigation then set 'evt.navigate' to false and call this function; Useful if you have async work to be done before the actual route navigation",
18528
+ "description": "When you need to control the time at which the tab should trigger the route navigation then set 'evt.navigate' to false and call this function at your convenience; Useful if you have async work to be done before the actual route navigation or you want to navigate elsewhere",
18468
18529
  "doc-url": "https://v1.quasar.dev/vue-components/tabs"
18469
18530
  }
18470
18531
  ],
package/lang/nl.js CHANGED
@@ -15,8 +15,8 @@ export default {
15
15
  search: 'Zoek',
16
16
  filter: 'Filter',
17
17
  refresh: 'Ververs',
18
- expand: function (label) { return label ? `Vouw "${label}" uit` : 'Uitbreiden' },
19
- collapse: function (label) { return label ? `"${label}" samenvouwen` : 'Instorten' }
18
+ expand: function (label) { return label ? `"${label}" uitklappen` : 'Uitklappen' },
19
+ collapse: function (label) { return label ? `"${label}" inklappen` : 'Inklappen' }
20
20
  },
21
21
  date: {
22
22
  days: 'Zondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrijdag_Zaterdag'.split('_'),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "quasar",
3
- "version": "1.20.2",
3
+ "version": "1.21.0",
4
4
  "description": "Build high-performance VueJS user interfaces (SPA, PWA, SSR, Mobile and Desktop) in record time",
5
5
  "module": "src/index.esm.js",
6
6
  "typings": "dist/types/index.d.ts",
package/src/body.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { setBrand } from './utils/colors.js'
2
2
  import { noop } from './utils/event.js'
3
- import { onKeyDownComposition } from './utils/key-composition.js'
3
+ import { onKeyDownComposition } from './utils/private/key-composition.js'
4
4
  import { isSSR, fromSSR, client, iosCorrection } from './plugins/Platform.js'
5
5
 
6
6
  function getMobilePlatform (is) {
@@ -5,7 +5,7 @@ import QIcon from '../icon/QIcon.js'
5
5
  import SizeMixin from '../../mixins/size.js'
6
6
  import ListenersMixin from '../../mixins/listeners.js'
7
7
 
8
- import { mergeSlotSafely } from '../../utils/slot.js'
8
+ import { mergeSlotSafely } from '../../utils/private/slot.js'
9
9
 
10
10
  export default Vue.extend({
11
11
  name: 'QAvatar',
@@ -2,7 +2,7 @@ import Vue from 'vue'
2
2
 
3
3
  import ListenersMixin from '../../mixins/listeners.js'
4
4
 
5
- import { slot } from '../../utils/slot.js'
5
+ import { slot } from '../../utils/private/slot.js'
6
6
 
7
7
  export default Vue.extend({
8
8
  name: 'QBadge',
@@ -3,7 +3,7 @@ import Vue from 'vue'
3
3
  import DarkMixin from '../../mixins/dark.js'
4
4
  import ListenersMixin from '../../mixins/listeners.js'
5
5
 
6
- import { slot } from '../../utils/slot.js'
6
+ import { slot } from '../../utils/private/slot.js'
7
7
 
8
8
  const attrs = { role: 'alert' }
9
9
 
@@ -3,7 +3,7 @@ import Vue from 'vue'
3
3
  import DarkMixin from '../../mixins/dark.js'
4
4
  import ListenersMixin from '../../mixins/listeners.js'
5
5
 
6
- import { slot } from '../../utils/slot.js'
6
+ import { slot } from '../../utils/private/slot.js'
7
7
 
8
8
  const attrs = { role: 'toolbar' }
9
9
 
@@ -1,7 +1,7 @@
1
1
  import Vue from 'vue'
2
2
 
3
3
  import AlignMixin from '../../mixins/align.js'
4
- import { slot } from '../../utils/slot.js'
4
+ import { slot } from '../../utils/private/slot.js'
5
5
  import ListenersMixin from '../../mixins/listeners.js'
6
6
 
7
7
  const disabledValues = [ true, '' ]
@@ -1,6 +1,6 @@
1
1
  import Vue from 'vue'
2
2
 
3
- import { mergeSlot } from '../../utils/slot.js'
3
+ import { mergeSlot } from '../../utils/private/slot.js'
4
4
  import ListenersMixin from '../../mixins/listeners.js'
5
5
  import RouterLinkMixin from '../../mixins/router-link.js'
6
6
 
@@ -26,9 +26,12 @@ export default Vue.extend({
26
26
  return {
27
27
  staticClass: 'q-breadcrumbs__el q-link ' +
28
28
  'flex inline items-center relative-position ' +
29
- (this.disable !== true ? 'q-link--focusable' : 'q-breadcrumbs__el--disabled'),
30
- ...this.linkProps,
31
- [this.hasRouterLink === true ? 'nativeOn' : 'on']: { ...this.qListeners }
29
+ (this.disable !== true ? 'q-link--focusable' + this.linkClass : 'q-breadcrumbs__el--disabled'),
30
+ attrs: this.linkAttrs,
31
+ on: {
32
+ ...this.qListeners,
33
+ click: this.__navigateOnClick
34
+ }
32
35
  }
33
36
  }
34
37
  },
@@ -26,5 +26,61 @@
26
26
  "default": {
27
27
  "desc": "This is where custom content goes, unless 'icon' and 'label' props are not enough"
28
28
  }
29
+ },
30
+
31
+ "events": {
32
+ "click": {
33
+ "desc": "Emitted when the component is clicked",
34
+ "params": {
35
+ "evt": {
36
+ "type": "Object",
37
+ "desc": "JS event object; If you are using route navigation ('to'/'replace'/'append' props) and you want to cancel navigation then call evt.preventDefault() synchronously in your event handler",
38
+ "required": true,
39
+ "__exemption": [ "examples" ]
40
+ },
41
+ "navigateFn": {
42
+ "type": "Function",
43
+ "desc": "Available ONLY if you are using route navigation ('to'/'replace'/'append' props); When you need to control the time at which the component should trigger the route navigation then call evt.preventDefault() synchronously and then call this function at your convenience; Useful if you have async work to be done before the actual route navigation or if you want to redirect somewhere else",
44
+ "addedIn": "v1.21.0",
45
+ "params": {
46
+ "opts": {
47
+ "type": "Object",
48
+ "desc": "Optional options",
49
+ "definition": {
50
+ "to": {
51
+ "type": [ "String", "Object" ],
52
+ "desc": "Equivalent to Vue Router <router-link> 'to' property; Specify it explicitly otherwise it will be set with same value as component's 'to' prop",
53
+ "examples": [
54
+ "/home/dashboard",
55
+ "{ name: 'my-route-name' }"
56
+ ]
57
+ },
58
+
59
+ "replace": {
60
+ "type": "Boolean",
61
+ "desc": "Equivalent to Vue Router <router-link> 'replace' property; Specify it explicitly otherwise it will be set with same value as component's 'replace' prop"
62
+ },
63
+
64
+ "append": {
65
+ "type": "Boolean",
66
+ "desc": "Equivalent to Vue Router <router-link> 'append' property",
67
+ "default": "Tab's 'append' property"
68
+ },
69
+
70
+ "returnRouterError": {
71
+ "type": "Boolean",
72
+ "desc": "Return the router error, if any; Otherwise the returned Promise will always fulfill"
73
+ }
74
+ }
75
+ }
76
+ },
77
+ "returns": {
78
+ "type": "Promise<any>",
79
+ "desc": "Returns the router's navigation promise",
80
+ "__exemption": [ "examples" ]
81
+ }
82
+ }
83
+ }
84
+ }
29
85
  }
30
86
  }
@@ -5,9 +5,9 @@ import QSpinner from '../spinner/QSpinner.js'
5
5
 
6
6
  import BtnMixin from '../../mixins/btn.js'
7
7
 
8
- import { mergeSlot } from '../../utils/slot.js'
9
- import { stop, prevent, stopAndPrevent, listenOpts, noop } from '../../utils/event.js'
10
- import { isKeyCode } from '../../utils/key-composition.js'
8
+ import { mergeSlot } from '../../utils/private/slot.js'
9
+ import { stop, prevent, stopAndPrevent, listenOpts } from '../../utils/event.js'
10
+ import { isKeyCode } from '../../utils/private/key-composition.js'
11
11
 
12
12
  const { passiveCapture } = listenOpts
13
13
 
@@ -69,7 +69,7 @@ export default Vue.extend({
69
69
  }
70
70
 
71
71
  if (this.$q.platform.has.touch === true) {
72
- on.touchstart = this.__onTouchstart
72
+ on[ `${on.touchstart === void 0 ? '&' : ''}touchstart` ] = this.__onTouchstart
73
73
  }
74
74
 
75
75
  return on
@@ -126,32 +126,9 @@ export default Vue.extend({
126
126
  document.addEventListener('keyup', onClickCleanup, passiveCapture)
127
127
  this.$el.addEventListener('blur', onClickCleanup, passiveCapture)
128
128
  }
129
-
130
- if (this.hasRouterLink === true) {
131
- if (
132
- e.ctrlKey === true ||
133
- e.shiftKey === true ||
134
- e.altKey === true ||
135
- e.metaKey === true
136
- ) {
137
- // if it has meta keys, let vue-router link
138
- // handle this by its own
139
- return
140
- }
141
-
142
- stopAndPrevent(e)
143
- }
144
- }
145
-
146
- const go = () => {
147
- // vue-router now throwing error if navigating
148
- // to the same route that the user is currently at
149
- // https://github.com/vuejs/vue-router/issues/2872
150
- this.$router[this.replace === true ? 'replace' : 'push'](this.linkRoute.route, void 0, noop)
151
129
  }
152
130
 
153
- this.$emit('click', e, go)
154
- this.hasRouterLink === true && e.navigate !== false && go()
131
+ this.__navigateOnClick(e)
155
132
  },
156
133
 
157
134
  __onKeydown (e) {
@@ -248,7 +225,8 @@ export default Vue.extend({
248
225
  destroying !== true &&
249
226
  (touchTarget === this.$el || mouseTarget === this.$el) &&
250
227
  blurTarget !== void 0 &&
251
- blurTarget !== document.activeElement
228
+ blurTarget !== document.activeElement &&
229
+ this.$el.contains(document.activeElement) === true
252
230
  ) {
253
231
  blurTarget.setAttribute('tabindex', -1)
254
232
  blurTarget.focus()
@@ -55,18 +55,56 @@
55
55
 
56
56
  "events": {
57
57
  "click": {
58
- "desc": "Emitted when component is clicked (activated)",
58
+ "desc": "Emitted when the component is clicked",
59
59
  "params": {
60
60
  "evt": {
61
61
  "type": "Object",
62
- "desc": "JS event object; If you want to cancel navigation set synchronously 'evt.navigate' to false",
62
+ "desc": "JS event object; If you are using route navigation ('to'/'replace'/'append' props) and you want to cancel navigation then call evt.preventDefault() synchronously in your event handler",
63
+ "required": true,
63
64
  "__exemption": [ "examples" ]
64
65
  },
65
66
  "navigateFn": {
66
67
  "type": "Function",
67
- "desc": "When you need to control the time at which the button should trigger the route navigation then set 'evt.navigate' to false and call this function; Useful if you have async work to be done before the actual route navigation",
68
- "params": null,
69
- "returns": null
68
+ "desc": "Available ONLY if you are using route navigation ('to'/'replace'/'append' props); When you need to control the time at which the component should trigger the route navigation then call evt.preventDefault() synchronously and then call this function at your convenience; Useful if you have async work to be done before the actual route navigation or if you want to redirect somewhere else",
69
+ "params": {
70
+ "opts": {
71
+ "type": "Object",
72
+ "desc": "Optional options",
73
+ "addedIn": "v1.21.0",
74
+ "definition": {
75
+ "to": {
76
+ "type": [ "String", "Object" ],
77
+ "desc": "Equivalent to Vue Router <router-link> 'to' property; Specify it explicitly otherwise it will be set with same value as component's 'to' prop",
78
+ "examples": [
79
+ "/home/dashboard",
80
+ "{ name: 'my-route-name' }"
81
+ ]
82
+ },
83
+
84
+ "replace": {
85
+ "type": "Boolean",
86
+ "desc": "Equivalent to Vue Router <router-link> 'replace' property; Specify it explicitly otherwise it will be set with same value as component's 'replace' prop"
87
+ },
88
+
89
+ "append": {
90
+ "type": "Boolean",
91
+ "desc": "Equivalent to Vue Router <router-link> 'append' property",
92
+ "default": "Tab's 'append' property"
93
+ },
94
+
95
+ "returnRouterError": {
96
+ "type": "Boolean",
97
+ "desc": "Return the router error, if any; Otherwise the returned Promise will always fulfill"
98
+ }
99
+ }
100
+ }
101
+ },
102
+ "returns": {
103
+ "type": "Promise<any>",
104
+ "desc": "Returns the router's navigation promise",
105
+ "__exemption": [ "examples" ],
106
+ "addedIn": "v1.21.0"
107
+ }
70
108
  }
71
109
  }
72
110
  }
@@ -8,9 +8,9 @@ import QBtn from '../btn/QBtn.js'
8
8
  import QBtnGroup from '../btn-group/QBtnGroup.js'
9
9
  import QMenu from '../menu/QMenu.js'
10
10
 
11
- import { slot } from '../../utils/slot.js'
11
+ import { slot } from '../../utils/private/slot.js'
12
12
  import { stop } from '../../utils/event.js'
13
- import cache from '../../utils/cache.js'
13
+ import cache from '../../utils/private/cache.js'
14
14
  import uid from '../../utils/uid.js'
15
15
 
16
16
  export default Vue.extend({
@@ -125,7 +125,7 @@
125
125
  "type": "String",
126
126
  "desc": "aria-label to be used on the dropdown toggle element",
127
127
  "examples": [ "Open menu" ],
128
- "category": "content",
128
+ "category": "accessibility",
129
129
  "addedIn": "v1.20.2"
130
130
  }
131
131
  },
@@ -2,7 +2,7 @@ import Vue from 'vue'
2
2
 
3
3
  import ListenersMixin from '../../mixins/listeners.js'
4
4
 
5
- import { slot } from '../../utils/slot.js'
5
+ import { slot } from '../../utils/private/slot.js'
6
6
 
7
7
  export default Vue.extend({
8
8
  name: 'QBtnGroup',
@@ -7,7 +7,7 @@ import ListenersMixin from '../../mixins/listeners.js'
7
7
  import FormMixin from '../../mixins/form.js'
8
8
  import RippleMixin from '../../mixins/ripple.js'
9
9
 
10
- import { slot, mergeSlot } from '../../utils/slot.js'
10
+ import { slot, mergeSlot } from '../../utils/private/slot.js'
11
11
 
12
12
  export default Vue.extend({
13
13
  name: 'QBtnToggle',
@@ -4,7 +4,7 @@ import DarkMixin from '../../mixins/dark.js'
4
4
  import TagMixin from '../../mixins/tag.js'
5
5
  import ListenersMixin from '../../mixins/listeners.js'
6
6
 
7
- import { slot } from '../../utils/slot.js'
7
+ import { slot } from '../../utils/private/slot.js'
8
8
 
9
9
  export default Vue.extend({
10
10
  name: 'QCard',
@@ -3,7 +3,7 @@ import Vue from 'vue'
3
3
  import AlignMixin from '../../mixins/align.js'
4
4
  import ListenersMixin from '../../mixins/listeners.js'
5
5
 
6
- import { slot } from '../../utils/slot.js'
6
+ import { slot } from '../../utils/private/slot.js'
7
7
 
8
8
  export default Vue.extend({
9
9
  name: 'QCardActions',
@@ -3,7 +3,7 @@ import Vue from 'vue'
3
3
  import TagMixin from '../../mixins/tag.js'
4
4
  import ListenersMixin from '../../mixins/listeners.js'
5
5
 
6
- import { slot } from '../../utils/slot.js'
6
+ import { slot } from '../../utils/private/slot.js'
7
7
 
8
8
  export default Vue.extend({
9
9
  name: 'QCardSection',
@@ -7,8 +7,8 @@ import { PanelParentMixin } from '../../mixins/panel.js'
7
7
  import FullscreenMixin from '../../mixins/fullscreen.js'
8
8
 
9
9
  import { isNumber } from '../../utils/is.js'
10
- import { mergeSlot } from '../../utils/slot.js'
11
- import cache from '../../utils/cache.js'
10
+ import { mergeSlot } from '../../utils/private/slot.js'
11
+ import cache from '../../utils/private/cache.js'
12
12
 
13
13
  export default Vue.extend({
14
14
  name: 'QCarousel',
@@ -2,7 +2,7 @@ import Vue from 'vue'
2
2
 
3
3
  import ListenersMixin from '../../mixins/listeners.js'
4
4
 
5
- import { slot } from '../../utils/slot.js'
5
+ import { slot } from '../../utils/private/slot.js'
6
6
 
7
7
  export default Vue.extend({
8
8
  name: 'QCarouselControl',
@@ -2,7 +2,7 @@ import Vue from 'vue'
2
2
 
3
3
  import { PanelChildMixin } from '../../mixins/panel.js'
4
4
 
5
- import { slot } from '../../utils/slot.js'
5
+ import { slot } from '../../utils/private/slot.js'
6
6
 
7
7
  export default Vue.extend({
8
8
  name: 'QCarouselSlide',
@@ -41,7 +41,7 @@ export default Vue.extend({
41
41
  }, [
42
42
  h('svg', {
43
43
  staticClass: 'q-checkbox__svg fit absolute-full',
44
- attrs: { focusable: 'false' /* needed for IE11 */, viewBox: '0 0 24 24', 'aria-hidden': 'true' }
44
+ attrs: { focusable: 'false' /* needed for IE11 */, viewBox: '0 0 24 24' }
45
45
  }, [
46
46
  h('path', {
47
47
  staticClass: 'q-checkbox__truthy',
@@ -7,8 +7,8 @@ import RippleMixin from '../../mixins/ripple.js'
7
7
  import { getSizeMixin } from '../../mixins/size.js'
8
8
 
9
9
  import { stopAndPrevent } from '../../utils/event.js'
10
- import { mergeSlotSafely } from '../../utils/slot.js'
11
- import cache from '../../utils/cache.js'
10
+ import { mergeSlotSafely } from '../../utils/private/slot.js'
11
+ import cache from '../../utils/private/cache.js'
12
12
 
13
13
  export default Vue.extend({
14
14
  name: 'QChip',
@@ -96,7 +96,7 @@
96
96
  "type": "String",
97
97
  "desc": "aria-label to be used on the remove icon",
98
98
  "examples": [ "Remove item" ],
99
- "category": "content",
99
+ "category": "accessibility",
100
100
  "addedIn": "v1.20.2"
101
101
  },
102
102