quasar 2.6.4 → 2.7.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 (215) hide show
  1. package/dist/api/QBreadcrumbsEl.json +1 -1
  2. package/dist/api/QBtn.json +1 -1
  3. package/dist/api/QBtnDropdown.json +2 -1
  4. package/dist/api/QBtnToggle.json +1 -0
  5. package/dist/api/QCarousel.json +2 -1
  6. package/dist/api/QCheckbox.json +1 -0
  7. package/dist/api/QChip.json +3 -1
  8. package/dist/api/QColor.json +1 -0
  9. package/dist/api/QDate.json +1 -0
  10. package/dist/api/QDialog.json +12 -1
  11. package/dist/api/QEditor.json +3 -1
  12. package/dist/api/QExpansionItem.json +2 -1
  13. package/dist/api/QFab.json +1 -0
  14. package/dist/api/QFile.json +1 -0
  15. package/dist/api/QFooter.json +1 -0
  16. package/dist/api/QHeader.json +1 -0
  17. package/dist/api/QImg.json +23 -0
  18. package/dist/api/QInput.json +1 -0
  19. package/dist/api/QItem.json +4 -2
  20. package/dist/api/QKnob.json +1 -0
  21. package/dist/api/QOptionGroup.json +1 -0
  22. package/dist/api/QPagination.json +1 -0
  23. package/dist/api/QPopupEdit.json +1 -0
  24. package/dist/api/QPopupProxy.json +1 -0
  25. package/dist/api/QRadio.json +1 -0
  26. package/dist/api/QRange.json +1 -0
  27. package/dist/api/QRating.json +1 -0
  28. package/dist/api/QRouteTab.json +1 -1
  29. package/dist/api/QSelect.json +1 -0
  30. package/dist/api/QSlider.json +1 -0
  31. package/dist/api/QSplitter.json +1 -0
  32. package/dist/api/QTable.json +5 -1
  33. package/dist/api/QTabs.json +1 -0
  34. package/dist/api/QTime.json +1 -0
  35. package/dist/api/QToggle.json +1 -0
  36. package/dist/api/QTree.json +6 -3
  37. package/dist/api/QVideo.json +43 -0
  38. package/dist/icon-set/bootstrap-icons.umd.prod.js +1 -1
  39. package/dist/icon-set/eva-icons.umd.prod.js +1 -1
  40. package/dist/icon-set/fontawesome-v5-pro.umd.prod.js +1 -1
  41. package/dist/icon-set/fontawesome-v5.umd.prod.js +1 -1
  42. package/dist/icon-set/fontawesome-v6-pro.umd.prod.js +1 -1
  43. package/dist/icon-set/fontawesome-v6.umd.prod.js +1 -1
  44. package/dist/icon-set/ionicons-v4.umd.prod.js +1 -1
  45. package/dist/icon-set/line-awesome.umd.prod.js +1 -1
  46. package/dist/icon-set/material-icons-outlined.umd.prod.js +1 -1
  47. package/dist/icon-set/material-icons-round.umd.prod.js +1 -1
  48. package/dist/icon-set/material-icons-sharp.umd.prod.js +1 -1
  49. package/dist/icon-set/material-icons.umd.prod.js +1 -1
  50. package/dist/icon-set/material-symbols-outlined.umd.prod.js +6 -0
  51. package/dist/icon-set/material-symbols-rounded.umd.prod.js +6 -0
  52. package/dist/icon-set/material-symbols-sharp.umd.prod.js +6 -0
  53. package/dist/icon-set/mdi-v3.umd.prod.js +1 -1
  54. package/dist/icon-set/mdi-v4.umd.prod.js +1 -1
  55. package/dist/icon-set/mdi-v5.umd.prod.js +1 -1
  56. package/dist/icon-set/mdi-v6.umd.prod.js +1 -1
  57. package/dist/icon-set/svg-bootstrap-icons.umd.prod.js +1 -1
  58. package/dist/icon-set/svg-eva-icons.umd.prod.js +1 -1
  59. package/dist/icon-set/svg-fontawesome-v5.umd.prod.js +1 -1
  60. package/dist/icon-set/svg-fontawesome-v6.umd.prod.js +1 -1
  61. package/dist/icon-set/svg-ionicons-v4.umd.prod.js +1 -1
  62. package/dist/icon-set/svg-ionicons-v5.umd.prod.js +1 -1
  63. package/dist/icon-set/svg-ionicons-v6.umd.prod.js +1 -1
  64. package/dist/icon-set/svg-line-awesome.umd.prod.js +1 -1
  65. package/dist/icon-set/svg-material-icons-outlined.umd.prod.js +1 -1
  66. package/dist/icon-set/svg-material-icons-round.umd.prod.js +1 -1
  67. package/dist/icon-set/svg-material-icons-sharp.umd.prod.js +1 -1
  68. package/dist/icon-set/svg-material-icons.umd.prod.js +1 -1
  69. package/dist/icon-set/svg-material-symbols-outlined.umd.prod.js +6 -0
  70. package/dist/icon-set/svg-material-symbols-rounded.umd.prod.js +6 -0
  71. package/dist/icon-set/svg-material-symbols-sharp.umd.prod.js +6 -0
  72. package/dist/icon-set/svg-mdi-v6.umd.prod.js +1 -1
  73. package/dist/icon-set/svg-themify.umd.prod.js +1 -1
  74. package/dist/icon-set/themify.umd.prod.js +1 -1
  75. package/dist/lang/ar-TN.umd.prod.js +1 -1
  76. package/dist/lang/ar.umd.prod.js +1 -1
  77. package/dist/lang/az-Latn.umd.prod.js +1 -1
  78. package/dist/lang/bg.umd.prod.js +1 -1
  79. package/dist/lang/bn.umd.prod.js +1 -1
  80. package/dist/lang/ca.umd.prod.js +1 -1
  81. package/dist/lang/cs.umd.prod.js +1 -1
  82. package/dist/lang/da.umd.prod.js +1 -1
  83. package/dist/lang/de.umd.prod.js +1 -1
  84. package/dist/lang/el.umd.prod.js +1 -1
  85. package/dist/lang/en-GB.umd.prod.js +1 -1
  86. package/dist/lang/en-US.umd.prod.js +1 -1
  87. package/dist/lang/eo.umd.prod.js +1 -1
  88. package/dist/lang/es.umd.prod.js +2 -2
  89. package/dist/lang/et.umd.prod.js +1 -1
  90. package/dist/lang/eu.umd.prod.js +1 -1
  91. package/dist/lang/fa-IR.umd.prod.js +1 -1
  92. package/dist/lang/fa.umd.prod.js +1 -1
  93. package/dist/lang/fi.umd.prod.js +1 -1
  94. package/dist/lang/fr.umd.prod.js +1 -1
  95. package/dist/lang/gn.umd.prod.js +1 -1
  96. package/dist/lang/he.umd.prod.js +1 -1
  97. package/dist/lang/hr.umd.prod.js +1 -1
  98. package/dist/lang/hu.umd.prod.js +1 -1
  99. package/dist/lang/id.umd.prod.js +1 -1
  100. package/dist/lang/is.umd.prod.js +1 -1
  101. package/dist/lang/it.umd.prod.js +1 -1
  102. package/dist/lang/ja.umd.prod.js +1 -1
  103. package/dist/lang/km.umd.prod.js +1 -1
  104. package/dist/lang/ko-KR.umd.prod.js +1 -1
  105. package/dist/lang/kur-CKB.umd.prod.js +1 -1
  106. package/dist/lang/kz.umd.prod.js +1 -1
  107. package/dist/lang/lt.umd.prod.js +1 -1
  108. package/dist/lang/lu.umd.prod.js +1 -1
  109. package/dist/lang/lv.umd.prod.js +1 -1
  110. package/dist/lang/ml.umd.prod.js +1 -1
  111. package/dist/lang/mm.umd.prod.js +6 -0
  112. package/dist/lang/ms.umd.prod.js +1 -1
  113. package/dist/lang/my.umd.prod.js +1 -1
  114. package/dist/lang/nb-NO.umd.prod.js +1 -1
  115. package/dist/lang/nl.umd.prod.js +1 -1
  116. package/dist/lang/pl.umd.prod.js +1 -1
  117. package/dist/lang/pt-BR.umd.prod.js +1 -1
  118. package/dist/lang/pt.umd.prod.js +1 -1
  119. package/dist/lang/ro.umd.prod.js +1 -1
  120. package/dist/lang/ru.umd.prod.js +1 -1
  121. package/dist/lang/sk.umd.prod.js +1 -1
  122. package/dist/lang/sl.umd.prod.js +1 -1
  123. package/dist/lang/sr-CYR.umd.prod.js +1 -1
  124. package/dist/lang/sr.umd.prod.js +1 -1
  125. package/dist/lang/sv.umd.prod.js +1 -1
  126. package/dist/lang/ta.umd.prod.js +1 -1
  127. package/dist/lang/th.umd.prod.js +1 -1
  128. package/dist/lang/tr.umd.prod.js +1 -1
  129. package/dist/lang/ug.umd.prod.js +1 -1
  130. package/dist/lang/uk.umd.prod.js +1 -1
  131. package/dist/lang/vi.umd.prod.js +1 -1
  132. package/dist/lang/zh-CN.umd.prod.js +1 -1
  133. package/dist/lang/zh-TW.umd.prod.js +1 -1
  134. package/dist/quasar.addon.rtl.css +251 -0
  135. package/dist/quasar.cjs.prod.js +2 -2
  136. package/dist/quasar.css +11 -5
  137. package/dist/quasar.esm.prod.js +2 -2
  138. package/dist/quasar.prod.css +1 -1
  139. package/dist/quasar.rtl.css +1238 -11
  140. package/dist/quasar.rtl.prod.css +1 -1
  141. package/dist/quasar.sass +11 -6
  142. package/dist/quasar.umd.js +184 -114
  143. package/dist/quasar.umd.prod.js +2 -2
  144. package/dist/types/api/quploader.d.ts +7 -7
  145. package/dist/types/api/validation.d.ts +1 -1
  146. package/dist/types/extras/icon-set.d.ts +6 -0
  147. package/dist/types/index.d.ts +300 -256
  148. package/dist/types/utils/dom.d.ts +1 -1
  149. package/dist/types/utils.d.ts +11 -0
  150. package/dist/vetur/quasar-attributes.json +16 -0
  151. package/dist/vetur/quasar-tags.json +5 -1
  152. package/dist/web-types/web-types.json +48 -8
  153. package/icon-set/material-symbols-outlined.js +133 -0
  154. package/icon-set/material-symbols-outlined.mjs +128 -0
  155. package/icon-set/material-symbols-rounded.js +133 -0
  156. package/icon-set/material-symbols-rounded.mjs +128 -0
  157. package/icon-set/material-symbols-sharp.js +133 -0
  158. package/icon-set/material-symbols-sharp.mjs +128 -0
  159. package/icon-set/svg-material-symbols-outlined.js +201 -0
  160. package/icon-set/svg-material-symbols-outlined.mjs +201 -0
  161. package/icon-set/svg-material-symbols-rounded.js +201 -0
  162. package/icon-set/svg-material-symbols-rounded.mjs +201 -0
  163. package/icon-set/svg-material-symbols-sharp.js +201 -0
  164. package/icon-set/svg-material-symbols-sharp.mjs +201 -0
  165. package/lang/es.js +1 -1
  166. package/lang/es.mjs +1 -1
  167. package/lang/index.json +4 -0
  168. package/lang/mm.js +96 -0
  169. package/lang/mm.mjs +91 -0
  170. package/package.json +4 -7
  171. package/src/api.extends.json +1 -0
  172. package/src/components/avatar/__tests__/QAvatar.spec.js +1 -1
  173. package/src/components/badge/__tests__/QBadge.spec.js +1 -1
  174. package/src/components/btn/QBtn.js +2 -2
  175. package/src/components/btn/use-btn.json +1 -1
  176. package/src/components/dialog/QDialog.js +7 -7
  177. package/src/components/dialog/QDialog.json +10 -1
  178. package/src/components/dialog/QDialog.sass +2 -2
  179. package/src/components/dialog-plugin/DialogPlugin.js +4 -4
  180. package/src/components/editor/QEditor.js +21 -29
  181. package/src/components/icon/QIcon.js +25 -2
  182. package/src/components/icon/QIcon.sass +4 -1
  183. package/src/components/img/QImg.js +5 -0
  184. package/src/components/img/QImg.json +19 -1
  185. package/src/components/infinite-scroll/QInfiniteScroll.js +10 -10
  186. package/src/components/input/QInput.js +5 -0
  187. package/src/components/item/QItem.js +5 -2
  188. package/src/components/item/QItem.json +2 -1
  189. package/src/components/layout/QLayout.js +2 -1
  190. package/src/components/menu/QMenu.js +2 -1
  191. package/src/components/select/QSelect.js +1 -1
  192. package/src/components/slider/use-slider.js +1 -1
  193. package/src/components/table/QTable.js +1 -1
  194. package/src/components/table/QTable.json +3 -0
  195. package/src/components/tooltip/QTooltip.js +2 -1
  196. package/src/components/tree/QTree.sass +1 -1
  197. package/src/components/uploader/uploader-core.js +22 -18
  198. package/src/components/video/QVideo.js +17 -1
  199. package/src/components/video/QVideo.json +36 -0
  200. package/src/components/virtual-scroll/QVirtualScroll.sass +4 -1
  201. package/src/components/virtual-scroll/use-virtual-scroll.js +21 -23
  202. package/src/composables/private/__tests__/use-model-toggle.spec.js +2 -2
  203. package/src/composables/private/__tests__/use-size.spec.js +2 -2
  204. package/src/composables/private/__tests__/use-validate.spec.js +1 -1
  205. package/src/composables/private/use-field.js +1 -0
  206. package/src/composables/private/use-portal.js +15 -2
  207. package/src/composables/private/use-router-link.json +1 -1
  208. package/src/history.js +2 -2
  209. package/src/utils/copy-to-clipboard.js +1 -1
  210. package/src/utils/patterns.js +8 -0
  211. package/src/utils/private/date-persian.js +0 -9
  212. package/src/utils/private/position-engine.js +0 -5
  213. package/src/utils/private/sort.js +0 -11
  214. package/src/utils/private/web-storage.js +1 -1
  215. package/src/utils/uid.js +1 -1
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Quasar Framework v2.6.4
2
+ * Quasar Framework v2.7.0
3
3
  * (c) 2015-present Razvan Stoenescu
4
4
  * Released under the MIT License.
5
5
  */
@@ -837,9 +837,9 @@
837
837
  }
838
838
 
839
839
  function normalizeExitPath (path) {
840
- path.startsWith('#') === true && (path = path.substr(1));
840
+ path.startsWith('#') === true && (path = path.substring(1));
841
841
  path.startsWith('/') === false && (path = '/' + path);
842
- path.endsWith('/') === true && (path = path.substr(0, path.length - 1));
842
+ path.endsWith('/') === true && (path = path.substring(0, path.length - 1));
843
843
  return '#' + path
844
844
  }
845
845
 
@@ -1603,7 +1603,7 @@
1603
1603
  }
1604
1604
 
1605
1605
  var installQuasar = function (parentApp, opts = {}) {
1606
- const $q = { version: '2.6.4' };
1606
+ const $q = { version: '2.7.0' };
1607
1607
 
1608
1608
  if (globalConfigIsFrozen === false) {
1609
1609
  if (opts.config !== void 0) {
@@ -2059,8 +2059,15 @@
2059
2059
  s_: '-sharp'
2060
2060
  };
2061
2061
 
2062
+ const symMap = {
2063
+ sym_o_: '-outlined',
2064
+ sym_r_: '-rounded',
2065
+ sym_s_: '-sharp'
2066
+ };
2067
+
2062
2068
  const libRE = new RegExp('^(' + Object.keys(libMap).join('|') + ')');
2063
2069
  const matRE = new RegExp('^(' + Object.keys(matMap).join('|') + ')');
2070
+ const symRE = new RegExp('^(' + Object.keys(symMap).join('|') + ')');
2064
2071
  const mRE = /^[Mm]\s?[-+]?\.?\d/;
2065
2072
  const imgRE = /^img:/;
2066
2073
  const svgUseRE = /^svguse:/;
@@ -2163,7 +2170,23 @@
2163
2170
  cls = icon;
2164
2171
  }
2165
2172
  else if (ionRE.test(icon) === true) {
2166
- cls = `ionicons ion-${ $q.platform.is.ios === true ? 'ios' : 'md' }${ icon.substr(3) }`;
2173
+ cls = `ionicons ion-${ $q.platform.is.ios === true ? 'ios' : 'md' }${ icon.substring(3) }`;
2174
+ }
2175
+ else if (symRE.test(icon) === true) {
2176
+ // "notranslate" class is for Google Translate
2177
+ // to avoid tampering with Material Symbols ligature font
2178
+ //
2179
+ // Caution: To be able to add suffix to the class name,
2180
+ // keep the 'material-symbols' at the end of the string.
2181
+ cls = 'notranslate material-symbols';
2182
+
2183
+ const matches = icon.match(symRE);
2184
+ if (matches !== null) {
2185
+ icon = icon.substring(6);
2186
+ cls += symMap[ matches[ 1 ] ];
2187
+ }
2188
+
2189
+ content = icon;
2167
2190
  }
2168
2191
  else {
2169
2192
  // "notranslate" class is for Google Translate
@@ -2209,7 +2232,7 @@
2209
2232
  if (type.value.svg === true) {
2210
2233
  return vue.h('span', data, hMergeSlot(slots.default, [
2211
2234
  vue.h('svg', {
2212
- viewBox: type.value.viewBox
2235
+ viewBox: type.value.viewBox || '0 0 24 24'
2213
2236
  }, type.value.nodes)
2214
2237
  ]))
2215
2238
  }
@@ -3740,10 +3763,10 @@
3740
3763
  if (props.loading === true && props.percentage !== void 0) {
3741
3764
  child.push(
3742
3765
  vue.h('span', {
3743
- class: 'q-btn__progress absolute-full overflow-hidden'
3766
+ class: 'q-btn__progress absolute-full overflow-hidden' + (props.darkPercentage === true ? ' q-btn__progress--dark' : '')
3744
3767
  }, [
3745
3768
  vue.h('span', {
3746
- class: 'q-btn__progress-indicator fit block' + (props.darkPercentage === true ? ' q-btn__progress--dark' : ''),
3769
+ class: 'q-btn__progress-indicator fit block',
3747
3770
  style: percentageStyle.value
3748
3771
  })
3749
3772
  ])
@@ -4386,8 +4409,12 @@
4386
4409
  // You MUST specify "inheritAttrs: false" in your component
4387
4410
 
4388
4411
  function usePortal (vm, innerRef, renderPortalContent, checkGlobalDialog) {
4412
+ // showing, including while in show/hide transition
4389
4413
  const portalIsActive = vue.ref(false);
4390
4414
 
4415
+ // showing & not in any show/hide transition
4416
+ const portalIsAccessible = vue.ref(false);
4417
+
4391
4418
  let portalEl = null;
4392
4419
  const focusObj = {};
4393
4420
  const onGlobalDialog = checkGlobalDialog === true && isOnGlobalDialog(vm);
@@ -4395,9 +4422,12 @@
4395
4422
  function showPortal (isReady) {
4396
4423
  if (isReady === true) {
4397
4424
  removeFocusWaitFlag(focusObj);
4425
+ portalIsAccessible.value = true;
4398
4426
  return
4399
4427
  }
4400
4428
 
4429
+ portalIsAccessible.value = false;
4430
+
4401
4431
  if (portalIsActive.value === false) {
4402
4432
  if (onGlobalDialog === false && portalEl === null) {
4403
4433
  portalEl = createGlobalNode();
@@ -4412,7 +4442,11 @@
4412
4442
  }
4413
4443
  }
4414
4444
 
4415
- function hidePortal () {
4445
+ function hidePortal (isReady) {
4446
+ portalIsAccessible.value = false;
4447
+
4448
+ if (isReady !== true) { return }
4449
+
4416
4450
  removeFocusWaitFlag(focusObj);
4417
4451
  portalIsActive.value = false;
4418
4452
 
@@ -4428,7 +4462,7 @@
4428
4462
  }
4429
4463
  }
4430
4464
 
4431
- vue.onUnmounted(hidePortal);
4465
+ vue.onUnmounted(() => { hidePortal(true); });
4432
4466
 
4433
4467
  // expose publicly needed stuff for portal utils
4434
4468
  Object.assign(vm.proxy, { __qPortalInnerRef: innerRef });
@@ -4438,6 +4472,7 @@
4438
4472
  hidePortal,
4439
4473
 
4440
4474
  portalIsActive,
4475
+ portalIsAccessible,
4441
4476
 
4442
4477
  renderPortal: () => (
4443
4478
  onGlobalDialog === true
@@ -5352,6 +5387,7 @@
5352
5387
  function handleHide (evt) {
5353
5388
  removeTick();
5354
5389
  removeTimeout();
5390
+ hidePortal();
5355
5391
 
5356
5392
  anchorCleanup(true);
5357
5393
 
@@ -5369,7 +5405,7 @@
5369
5405
  }
5370
5406
 
5371
5407
  registerTimeout(() => {
5372
- hidePortal();
5408
+ hidePortal(true); // done hiding, now destroy
5373
5409
  emit('hide', evt);
5374
5410
  }, props.transitionDuration);
5375
5411
  }
@@ -8368,7 +8404,7 @@
8368
8404
  && innerMin.value < innerMax.value
8369
8405
  ));
8370
8406
 
8371
- const decimals = vue.computed(() => (String(props.step).trim('0').split('.')[ 1 ] || '').length);
8407
+ const decimals = vue.computed(() => (String(props.step).trim().split('.')[ 1 ] || '').length);
8372
8408
  const step = vue.computed(() => (props.step === 0 ? 1 : props.step));
8373
8409
  const tabindex = vue.computed(() => (editable.value === true ? props.tabindex || 0 : -1));
8374
8410
 
@@ -10126,6 +10162,14 @@
10126
10162
  fulltime: v => /^([0-1]?\d|2[0-3]):[0-5]\d:[0-5]\d$/.test(v),
10127
10163
  timeOrFulltime: v => /^([0-1]?\d|2[0-3]):[0-5]\d(:[0-5]\d)?$/.test(v),
10128
10164
 
10165
+ // -- RFC 5322 --
10166
+ // -- Added in v2.6.6 --
10167
+ // This is a basic helper validation.
10168
+ // For something more complex (like RFC 822) you should write and use your own rule.
10169
+ // We won't be accepting PRs to enhance the one below because of the reason above.
10170
+ // eslint-disable-next-line
10171
+ email: v => /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(v),
10172
+
10129
10173
  hexColor: v => hex.test(v),
10130
10174
  hexaColor: v => hexa.test(v),
10131
10175
  hexOrHexaColor: v => hexOrHexa.test(v),
@@ -14398,7 +14442,7 @@
14398
14442
  const { registerTimeout, removeTimeout } = useTimeout();
14399
14443
  const { registerTick, removeTick } = useTick();
14400
14444
 
14401
- const { showPortal, hidePortal, portalIsActive, renderPortal } = usePortal(
14445
+ const { showPortal, hidePortal, portalIsAccessible, renderPortal } = usePortal(
14402
14446
  vm, innerRef, renderPortalContent, /* pls do check if on a global dialog */ true
14403
14447
  );
14404
14448
 
@@ -14537,6 +14581,7 @@
14537
14581
  removeFromHistory();
14538
14582
  cleanup(true);
14539
14583
  animating.value = true;
14584
+ hidePortal();
14540
14585
 
14541
14586
  if (refocusTarget !== null) {
14542
14587
  refocusTarget.focus();
@@ -14544,13 +14589,13 @@
14544
14589
  }
14545
14590
 
14546
14591
  registerTimeout(() => {
14547
- hidePortal();
14592
+ hidePortal(true); // done hiding, now destroy
14548
14593
  animating.value = false;
14549
14594
  emit('hide', evt);
14550
14595
  }, props.transitionDuration);
14551
14596
  }
14552
14597
 
14553
- function focus () {
14598
+ function focus (selector) {
14554
14599
  addFocusFn(() => {
14555
14600
  let node = innerRef.value;
14556
14601
 
@@ -14558,7 +14603,7 @@
14558
14603
  return
14559
14604
  }
14560
14605
 
14561
- node = node.querySelector('[autofocus], [data-autofocus]') || node;
14606
+ node = node.querySelector(selector || '[autofocus], [data-autofocus]') || node;
14562
14607
  node.focus({ preventScroll: true });
14563
14608
  });
14564
14609
  }
@@ -14652,11 +14697,10 @@
14652
14697
  function onFocusChange (evt) {
14653
14698
  // the focus is not in a vue child component
14654
14699
  if (
14655
- showing.value === true
14656
- && portalIsActive.value === true
14700
+ portalIsAccessible.value === true
14657
14701
  && childHasFocus(innerRef.value, evt.target) !== true
14658
14702
  ) {
14659
- focus();
14703
+ focus('[tabindex]:not([tabindex="-1"])');
14660
14704
  }
14661
14705
  }
14662
14706
 
@@ -15918,11 +15962,12 @@
15918
15962
  function handleHide (evt) {
15919
15963
  removeTick();
15920
15964
  removeTimeout();
15965
+ hidePortal();
15921
15966
 
15922
15967
  anchorCleanup();
15923
15968
 
15924
15969
  registerTimeout(() => {
15925
- hidePortal();
15970
+ hidePortal(true); // done hiding, now destroy
15926
15971
  emit('hide', evt);
15927
15972
  }, props.transitionDuration);
15928
15973
  }
@@ -16066,7 +16111,10 @@
16066
16111
  default: 'div'
16067
16112
  },
16068
16113
 
16069
- active: Boolean,
16114
+ active: {
16115
+ type: Boolean,
16116
+ default: null
16117
+ },
16070
16118
 
16071
16119
  clickable: Boolean,
16072
16120
  dense: Boolean,
@@ -16104,7 +16152,7 @@
16104
16152
  + (props.dense === true ? ' q-item--dense' : '')
16105
16153
  + (isDark.value === true ? ' q-item--dark' : '')
16106
16154
  + (
16107
- hasLink.value === true
16155
+ hasLink.value === true && props.active === null
16108
16156
  ? linkClass.value
16109
16157
  : (
16110
16158
  props.active === true
@@ -16975,11 +17023,14 @@
16975
17023
  }
16976
17024
 
16977
17025
  function onFocusin (e) {
17026
+ const root = rootRef.value;
17027
+
16978
17028
  if (
16979
- rootRef.value.contains(e.target) === true
17029
+ root !== null
17030
+ && root.contains(e.target) === true
16980
17031
  && (
16981
17032
  e.relatedTarget === null
16982
- || rootRef.value.contains(e.relatedTarget) !== true
17033
+ || root.contains(e.relatedTarget) !== true
16983
17034
  )
16984
17035
  ) {
16985
17036
  const prop = `inner${ isViewingSource.value === true ? 'Text' : 'HTML' }`;
@@ -16989,11 +17040,14 @@
16989
17040
  }
16990
17041
 
16991
17042
  function onFocusout (e) {
17043
+ const root = rootRef.value;
17044
+
16992
17045
  if (
16993
- rootRef.value.contains(e.target) === true
17046
+ root !== null
17047
+ && root.contains(e.target) === true
16994
17048
  && (
16995
17049
  e.relatedTarget === null
16996
- || rootRef.value.contains(e.relatedTarget) !== true
17050
+ || root.contains(e.relatedTarget) !== true
16997
17051
  )
16998
17052
  ) {
16999
17053
  eVm.caret.savePosition();
@@ -17001,27 +17055,12 @@
17001
17055
  }
17002
17056
  }
17003
17057
 
17004
- function onMousedown () {
17058
+ function onPointerStart () {
17005
17059
  offsetBottom = void 0;
17006
17060
  }
17007
17061
 
17008
- function onMouseup (e) {
17062
+ function onSelectionchange (e) {
17009
17063
  eVm.caret.save();
17010
- emit('mouseup', e);
17011
- }
17012
-
17013
- function onTouchstartPassive () {
17014
- offsetBottom = void 0;
17015
- }
17016
-
17017
- function onKeyup (e) {
17018
- eVm.caret.save();
17019
- emit('keyup', e);
17020
- }
17021
-
17022
- function onTouchend (e) {
17023
- eVm.caret.save();
17024
- emit('touchend', e);
17025
17064
  }
17026
17065
 
17027
17066
  function setContent (v, restorePosition) {
@@ -17078,6 +17117,12 @@
17078
17117
  eVm.caret = proxy.caret = new Caret(contentRef.value, eVm);
17079
17118
  setContent(props.modelValue);
17080
17119
  refreshToolbar();
17120
+
17121
+ document.addEventListener('selectionchange', onSelectionchange);
17122
+ });
17123
+
17124
+ vue.onBeforeUnmount(() => {
17125
+ document.removeEventListener('selectionchange', onSelectionchange);
17081
17126
  });
17082
17127
 
17083
17128
  return () => {
@@ -17131,13 +17176,8 @@
17131
17176
  onFocus,
17132
17177
 
17133
17178
  // clean saved scroll position
17134
- onMousedown,
17135
- onTouchstartPassive,
17136
-
17137
- // save caret
17138
- onMouseup,
17139
- onKeyup,
17140
- onTouchend
17179
+ onMousedown: onPointerStart,
17180
+ onTouchstartPassive: onPointerStart
17141
17181
  })
17142
17182
  ])
17143
17183
  }
@@ -17387,7 +17427,7 @@
17387
17427
 
17388
17428
  // Pre-calculate toString(16) for speed
17389
17429
  for (let i = 0; i < 256; i++) {
17390
- hexBytes[ i ] = (i + 0x100).toString(16).substr(1);
17430
+ hexBytes[ i ] = (i + 0x100).toString(16).substring(1);
17391
17431
  }
17392
17432
 
17393
17433
  // Use best available PRNG
@@ -18178,7 +18218,7 @@
18178
18218
  function fallback (text) {
18179
18219
  const area = document.createElement('textarea');
18180
18220
  area.value = text;
18181
- area.contentEditable = true;
18221
+ area.contentEditable = 'true';
18182
18222
  area.style.position = 'fixed'; // avoid scrolling to bottom
18183
18223
 
18184
18224
  document.body.appendChild(area);
@@ -18981,28 +19021,32 @@
18981
19021
 
18982
19022
  return [
18983
19023
  vue.h('div', {
18984
- class: 'q-uploader__header-content flex flex-center no-wrap q-gutter-xs'
19024
+ class: 'q-uploader__header-content column'
18985
19025
  }, [
18986
- getBtn(state.queuedFiles.value.length > 0, 'removeQueue', removeQueuedFiles),
18987
- getBtn(state.uploadedFiles.value.length > 0, 'removeUploaded', removeUploadedFiles),
18988
-
18989
- state.isUploading.value === true
18990
- ? vue.h(QSpinner, { class: 'q-uploader__spinner' })
18991
- : null,
19026
+ vue.h('div', {
19027
+ class: 'flex flex-center no-wrap q-gutter-xs'
19028
+ }, [
19029
+ getBtn(state.queuedFiles.value.length > 0, 'removeQueue', removeQueuedFiles),
19030
+ getBtn(state.uploadedFiles.value.length > 0, 'removeUploaded', removeUploadedFiles),
18992
19031
 
18993
- vue.h('div', { class: 'col column justify-center' }, [
18994
- props.label !== void 0
18995
- ? vue.h('div', { class: 'q-uploader__title' }, [ props.label ])
19032
+ state.isUploading.value === true
19033
+ ? vue.h(QSpinner, { class: 'q-uploader__spinner' })
18996
19034
  : null,
18997
19035
 
18998
- vue.h('div', { class: 'q-uploader__subtitle' }, [
18999
- uploadSizeLabel.value + ' / ' + uploadProgressLabel.value
19000
- ])
19001
- ]),
19036
+ vue.h('div', { class: 'col column justify-center' }, [
19037
+ props.label !== void 0
19038
+ ? vue.h('div', { class: 'q-uploader__title' }, [ props.label ])
19039
+ : null,
19002
19040
 
19003
- getBtn(canAddFiles.value, 'add'),
19004
- getBtn(props.hideUploadBtn === false && canUpload.value === true, 'upload', state.upload),
19005
- getBtn(state.isUploading.value, 'clear', state.abort)
19041
+ vue.h('div', { class: 'q-uploader__subtitle' }, [
19042
+ uploadSizeLabel.value + ' / ' + uploadProgressLabel.value
19043
+ ])
19044
+ ]),
19045
+
19046
+ getBtn(canAddFiles.value, 'add'),
19047
+ getBtn(props.hideUploadBtn === false && canUpload.value === true, 'upload', state.upload),
19048
+ getBtn(state.isUploading.value, 'clear', state.abort)
19049
+ ])
19006
19050
  ])
19007
19051
  ]
19008
19052
  }
@@ -19258,7 +19302,7 @@
19258
19302
  return getComputedStyle(element).getPropertyValue(`--q-${ propName }`).trim() || null
19259
19303
  }
19260
19304
 
19261
- let id$1 = 0;
19305
+ let id = 0;
19262
19306
  let offsetBase = void 0;
19263
19307
 
19264
19308
  function getAbsolutePosition (el, resize) {
@@ -19986,7 +20030,7 @@
19986
20030
  };
19987
20031
  }
19988
20032
  else {
19989
- const qAnimId = `q-morph-anim-${ ++id$1 }`;
20033
+ const qAnimId = `q-morph-anim-${ ++id }`;
19990
20034
  const style = document.createElement('style');
19991
20035
  const resizeFrom = options.resize === true
19992
20036
  ? `
@@ -20977,6 +21021,7 @@
20977
21021
  vue.h('div', {
20978
21022
  ref: state.targetRef,
20979
21023
  class: 'q-field__native row',
21024
+ tabindex: -1,
20980
21025
  ...state.splitAttrs.attributes.value,
20981
21026
  'data-autofocus': props.autofocus === true || void 0
20982
21027
  }, slots.control(controlSlotScope.value))
@@ -22092,6 +22137,10 @@
22092
22137
  type: String,
22093
22138
  default: 'lazy'
22094
22139
  },
22140
+ fetchpriority: {
22141
+ type: String,
22142
+ default: 'auto'
22143
+ },
22095
22144
  width: String,
22096
22145
  height: String,
22097
22146
  initialRatio: {
@@ -22254,6 +22303,7 @@
22254
22303
  height: props.height,
22255
22304
  width: props.width,
22256
22305
  loading: props.loading,
22306
+ fetchpriority: props.fetchpriority,
22257
22307
  'aria-hidden': 'true',
22258
22308
  draggable: props.draggable,
22259
22309
  ...img
@@ -22469,6 +22519,16 @@
22469
22519
 
22470
22520
  if (isWorking.value === true) {
22471
22521
  localScrollTarget.addEventListener('scroll', poll, passive$3);
22522
+
22523
+ if (props.reverse === true) {
22524
+ const
22525
+ scrollHeight = getScrollHeight(localScrollTarget),
22526
+ containerHeight = height(localScrollTarget);
22527
+
22528
+ setVerticalScrollPosition(localScrollTarget, scrollHeight - containerHeight);
22529
+ }
22530
+
22531
+ immediatePoll();
22472
22532
  }
22473
22533
  }
22474
22534
 
@@ -22539,16 +22599,6 @@
22539
22599
  setDebounce(props.debounce);
22540
22600
 
22541
22601
  updateScrollTarget();
22542
-
22543
- if (props.reverse === true) {
22544
- const
22545
- scrollHeight = getScrollHeight(localScrollTarget),
22546
- containerHeight = height(localScrollTarget);
22547
-
22548
- setVerticalScrollPosition(localScrollTarget, scrollHeight - containerHeight);
22549
- }
22550
-
22551
- immediatePoll();
22552
22602
  });
22553
22603
 
22554
22604
  return () => {
@@ -23453,6 +23503,8 @@
23453
23503
  }
23454
23504
 
23455
23505
  if (props.modelValue !== val && emitCachedValue !== val) {
23506
+ emitCachedValue = val;
23507
+
23456
23508
  stopWatcher === true && (stopValueWatcher = true);
23457
23509
  emit('update:modelValue', val);
23458
23510
 
@@ -23484,13 +23536,16 @@
23484
23536
  const inp = inputRef.value;
23485
23537
  if (inp !== null) {
23486
23538
  const parentStyle = inp.parentNode.style;
23539
+ const { overflow } = inp.style;
23487
23540
 
23488
23541
  // reset height of textarea to a small size to detect the real height
23489
23542
  // but keep the total control size the same
23490
23543
  parentStyle.marginBottom = (inp.scrollHeight - 1) + 'px';
23491
23544
  inp.style.height = '1px';
23545
+ inp.style.overflow = 'hidden';
23492
23546
 
23493
23547
  inp.style.height = inp.scrollHeight + 'px';
23548
+ inp.style.overflow = overflow;
23494
23549
  parentStyle.marginBottom = '';
23495
23550
  }
23496
23551
  }
@@ -24452,7 +24507,8 @@
24452
24507
  const layout = vue.h('div', {
24453
24508
  class: classes.value,
24454
24509
  style: style.value,
24455
- ref: props.container === true ? void 0 : rootRef
24510
+ ref: props.container === true ? void 0 : rootRef,
24511
+ tabindex: -1
24456
24512
  }, content);
24457
24513
 
24458
24514
  if (props.container === true) {
@@ -27452,27 +27508,30 @@
27452
27508
  'end-force'
27453
27509
  ];
27454
27510
 
27455
- let id = 1;
27456
27511
  const filterProto = Array.prototype.filter;
27457
27512
 
27458
27513
  const setOverflowAnchor = window.getComputedStyle(document.body).overflowAnchor === void 0
27459
27514
  ? noop
27460
- : function (id, index) {
27461
- const ssId = id + '_ss';
27515
+ : function (contentEl, index) {
27516
+ requestAnimationFrame(() => {
27517
+ if (contentEl === null) {
27518
+ return
27519
+ }
27462
27520
 
27463
- let styleSheet = document.getElementById(ssId);
27521
+ const children = contentEl.children || [];
27464
27522
 
27465
- if (styleSheet === null) {
27466
- styleSheet = document.createElement('style');
27467
- styleSheet.type = 'text/css';
27468
- styleSheet.id = ssId;
27469
- document.head.appendChild(styleSheet);
27470
- }
27523
+ filterProto
27524
+ .call(children, el => el.dataset && el.dataset.qVsAnchor !== void 0)
27525
+ .forEach(el => {
27526
+ delete el.dataset.qVsAnchor;
27527
+ });
27471
27528
 
27472
- if (styleSheet.qChildIndex !== index) {
27473
- styleSheet.qChildIndex = index;
27474
- styleSheet.innerHTML = `#${ id } > *:nth-child(${ index }) { overflow-anchor: auto }`;
27475
- }
27529
+ const el = children[ index ];
27530
+
27531
+ if (el && el.dataset) {
27532
+ el.dataset.qVsAnchor = '';
27533
+ }
27534
+ });
27476
27535
  };
27477
27536
 
27478
27537
  function sumFn (acc, h) {
@@ -27668,8 +27727,6 @@
27668
27727
 
27669
27728
  let prevScrollStart, prevToIndex, localScrollViewSize, virtualScrollSizesAgg = [], virtualScrollSizes;
27670
27729
 
27671
- const vsId = 'qvs_' + id++;
27672
-
27673
27730
  const virtualScrollPaddingBefore = vue.ref(0);
27674
27731
  const virtualScrollPaddingAfter = vue.ref(0);
27675
27732
  const virtualScrollSliceSizeComputed = vue.ref({});
@@ -27851,11 +27908,11 @@
27851
27908
  contentEl.addEventListener('focusout', onBlurRefocusFn);
27852
27909
 
27853
27910
  setTimeout(() => {
27854
- contentEl !== void 0 && contentEl.removeEventListener('focusout', onBlurRefocusFn);
27911
+ contentEl !== null && contentEl.removeEventListener('focusout', onBlurRefocusFn);
27855
27912
  });
27856
27913
  }
27857
27914
 
27858
- setOverflowAnchor(vsId, toIndex - from + 1);
27915
+ setOverflowAnchor(contentEl, toIndex - from);
27859
27916
 
27860
27917
  const sizeBefore = alignEnd !== void 0 ? virtualScrollSizes.slice(from, toIndex).reduce(sumFn, 0) : 0;
27861
27918
 
@@ -27964,7 +28021,7 @@
27964
28021
  }
27965
28022
 
27966
28023
  function onBlurRefocusFn () {
27967
- contentRef.value !== void 0 && contentRef.value.focus();
28024
+ contentRef.value !== null && contentRef.value !== void 0 && contentRef.value.focus();
27968
28025
  }
27969
28026
 
27970
28027
  function localResetVirtualScroll (toIndex, fullReset) {
@@ -28081,7 +28138,6 @@
28081
28138
  class: 'q-virtual-scroll__content',
28082
28139
  key: 'content',
28083
28140
  ref: contentRef,
28084
- id: vsId,
28085
28141
  tabindex: -1
28086
28142
  }, content.flat()),
28087
28143
 
@@ -28155,9 +28211,7 @@
28155
28211
  }
28156
28212
  });
28157
28213
 
28158
- setOverflowAnchor !== noop && vue.onBeforeUnmount(() => {
28159
- const styleSheet = document.getElementById(vsId + '_ss');
28160
- styleSheet !== null && styleSheet.remove();
28214
+ vue.onBeforeUnmount(() => {
28161
28215
  onVirtualScrollEvt.cancel();
28162
28216
  });
28163
28217
 
@@ -28321,7 +28375,7 @@
28321
28375
 
28322
28376
  const virtualScrollItemSizeComputed = vue.computed(() => (
28323
28377
  props.virtualScrollItemSize === void 0
28324
- ? (props.dense === true ? 24 : 48)
28378
+ ? (props.optionsDense === true ? 24 : 48)
28325
28379
  : props.virtualScrollItemSize
28326
28380
  ));
28327
28381
 
@@ -34374,7 +34428,7 @@
34374
34428
 
34375
34429
  return vue.h('div', {
34376
34430
  class: 'q-table__grid-item col-xs-12 col-sm-6 col-md-4 col-lg-3'
34377
- + (scope.selected === true ? 'q-table__grid-item--selected' : '')
34431
+ + (scope.selected === true ? ' q-table__grid-item--selected' : '')
34378
34432
  }, [
34379
34433
  vue.h('div', data, child)
34380
34434
  ])
@@ -36594,7 +36648,20 @@
36594
36648
  required: true
36595
36649
  },
36596
36650
 
36597
- title: String
36651
+ title: String,
36652
+
36653
+ fetchpriority: {
36654
+ type: String,
36655
+ default: 'auto'
36656
+ },
36657
+ loading: {
36658
+ type: String,
36659
+ default: 'eager'
36660
+ },
36661
+ referrerpolicy: {
36662
+ type: String,
36663
+ default: 'strict-origin-when-cross-origin'
36664
+ }
36598
36665
  },
36599
36666
 
36600
36667
  setup (props) {
@@ -36612,6 +36679,9 @@
36612
36679
  vue.h('iframe', {
36613
36680
  src: props.src,
36614
36681
  title: props.title,
36682
+ fetchpriority: props.fetchpriority,
36683
+ loading: props.loading,
36684
+ referrerpolicy: props.referrerpolicy,
36615
36685
  frameborder: '0',
36616
36686
  allowfullscreen: true
36617
36687
  })
@@ -38540,14 +38610,14 @@
38540
38610
  function getButtons () {
38541
38611
  const child = [];
38542
38612
 
38543
- props.ok && child.push(
38544
- vue.h(QBtn, okProps.value)
38545
- );
38546
-
38547
38613
  props.cancel && child.push(
38548
38614
  vue.h(QBtn, cancelProps.value)
38549
38615
  );
38550
38616
 
38617
+ props.ok && child.push(
38618
+ vue.h(QBtn, okProps.value)
38619
+ );
38620
+
38551
38621
  return vue.h(QCardActions, {
38552
38622
  class: props.stackButtons === true ? 'items-end' : '',
38553
38623
  vertical: props.stackButtons,
@@ -39392,7 +39462,7 @@
39392
39462
  return value
39393
39463
  }
39394
39464
 
39395
- const type = value.substr(0, 8);
39465
+ const type = value.substring(0, 8);
39396
39466
  const source = value.substring(9);
39397
39467
 
39398
39468
  switch (type) {
@@ -39628,7 +39698,7 @@
39628
39698
  });
39629
39699
 
39630
39700
  var index_umd = {
39631
- version: '2.6.4',
39701
+ version: '2.7.0',
39632
39702
  install (app, opts) {
39633
39703
  installQuasar(app, {
39634
39704
  components,