quasar 2.6.6 → 2.7.2

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 (214) hide show
  1. package/dist/api/QBtnDropdown.json +1 -0
  2. package/dist/api/QBtnToggle.json +1 -0
  3. package/dist/api/QCarousel.json +2 -1
  4. package/dist/api/QCheckbox.json +1 -0
  5. package/dist/api/QChip.json +3 -1
  6. package/dist/api/QColor.json +1 -0
  7. package/dist/api/QDate.json +1 -0
  8. package/dist/api/QDialog.json +6 -0
  9. package/dist/api/QEditor.json +3 -1
  10. package/dist/api/QExpansionItem.json +1 -0
  11. package/dist/api/QFab.json +1 -0
  12. package/dist/api/QFile.json +1 -0
  13. package/dist/api/QFooter.json +1 -0
  14. package/dist/api/QHeader.json +1 -0
  15. package/dist/api/QInput.json +1 -0
  16. package/dist/api/QItem.json +3 -1
  17. package/dist/api/QKnob.json +1 -0
  18. package/dist/api/QOptionGroup.json +1 -0
  19. package/dist/api/QPagination.json +2 -1
  20. package/dist/api/QPopupEdit.json +1 -0
  21. package/dist/api/QPopupProxy.json +1 -0
  22. package/dist/api/QRadio.json +1 -0
  23. package/dist/api/QRange.json +1 -0
  24. package/dist/api/QRating.json +1 -0
  25. package/dist/api/QSelect.json +1 -0
  26. package/dist/api/QSlider.json +1 -0
  27. package/dist/api/QSplitter.json +1 -0
  28. package/dist/api/QTable.json +5 -1
  29. package/dist/api/QTabs.json +1 -0
  30. package/dist/api/QTime.json +1 -0
  31. package/dist/api/QToggle.json +1 -0
  32. package/dist/api/QTree.json +6 -3
  33. package/dist/icon-set/bootstrap-icons.umd.prod.js +1 -1
  34. package/dist/icon-set/eva-icons.umd.prod.js +1 -1
  35. package/dist/icon-set/fontawesome-v5-pro.umd.prod.js +1 -1
  36. package/dist/icon-set/fontawesome-v5.umd.prod.js +1 -1
  37. package/dist/icon-set/fontawesome-v6-pro.umd.prod.js +1 -1
  38. package/dist/icon-set/fontawesome-v6.umd.prod.js +1 -1
  39. package/dist/icon-set/ionicons-v4.umd.prod.js +1 -1
  40. package/dist/icon-set/line-awesome.umd.prod.js +1 -1
  41. package/dist/icon-set/material-icons-outlined.umd.prod.js +1 -1
  42. package/dist/icon-set/material-icons-round.umd.prod.js +1 -1
  43. package/dist/icon-set/material-icons-sharp.umd.prod.js +1 -1
  44. package/dist/icon-set/material-icons.umd.prod.js +1 -1
  45. package/dist/icon-set/material-symbols-outlined.umd.prod.js +6 -0
  46. package/dist/icon-set/material-symbols-rounded.umd.prod.js +6 -0
  47. package/dist/icon-set/material-symbols-sharp.umd.prod.js +6 -0
  48. package/dist/icon-set/mdi-v3.umd.prod.js +1 -1
  49. package/dist/icon-set/mdi-v4.umd.prod.js +1 -1
  50. package/dist/icon-set/mdi-v5.umd.prod.js +1 -1
  51. package/dist/icon-set/mdi-v6.umd.prod.js +1 -1
  52. package/dist/icon-set/svg-bootstrap-icons.umd.prod.js +1 -1
  53. package/dist/icon-set/svg-eva-icons.umd.prod.js +1 -1
  54. package/dist/icon-set/svg-fontawesome-v5.umd.prod.js +1 -1
  55. package/dist/icon-set/svg-fontawesome-v6.umd.prod.js +1 -1
  56. package/dist/icon-set/svg-ionicons-v4.umd.prod.js +1 -1
  57. package/dist/icon-set/svg-ionicons-v5.umd.prod.js +1 -1
  58. package/dist/icon-set/svg-ionicons-v6.umd.prod.js +1 -1
  59. package/dist/icon-set/svg-line-awesome.umd.prod.js +1 -1
  60. package/dist/icon-set/svg-material-icons-outlined.umd.prod.js +1 -1
  61. package/dist/icon-set/svg-material-icons-round.umd.prod.js +1 -1
  62. package/dist/icon-set/svg-material-icons-sharp.umd.prod.js +1 -1
  63. package/dist/icon-set/svg-material-icons.umd.prod.js +1 -1
  64. package/dist/icon-set/svg-material-symbols-outlined.umd.prod.js +6 -0
  65. package/dist/icon-set/svg-material-symbols-rounded.umd.prod.js +6 -0
  66. package/dist/icon-set/svg-material-symbols-sharp.umd.prod.js +6 -0
  67. package/dist/icon-set/svg-mdi-v6.umd.prod.js +1 -1
  68. package/dist/icon-set/svg-themify.umd.prod.js +1 -1
  69. package/dist/icon-set/themify.umd.prod.js +1 -1
  70. package/dist/lang/ar-TN.umd.prod.js +1 -1
  71. package/dist/lang/ar.umd.prod.js +1 -1
  72. package/dist/lang/az-Latn.umd.prod.js +1 -1
  73. package/dist/lang/bg.umd.prod.js +1 -1
  74. package/dist/lang/bn.umd.prod.js +1 -1
  75. package/dist/lang/ca.umd.prod.js +2 -2
  76. package/dist/lang/cs.umd.prod.js +1 -1
  77. package/dist/lang/da.umd.prod.js +1 -1
  78. package/dist/lang/de.umd.prod.js +1 -1
  79. package/dist/lang/el.umd.prod.js +1 -1
  80. package/dist/lang/en-GB.umd.prod.js +1 -1
  81. package/dist/lang/en-US.umd.prod.js +1 -1
  82. package/dist/lang/eo.umd.prod.js +1 -1
  83. package/dist/lang/es.umd.prod.js +2 -2
  84. package/dist/lang/et.umd.prod.js +1 -1
  85. package/dist/lang/eu.umd.prod.js +1 -1
  86. package/dist/lang/fa-IR.umd.prod.js +1 -1
  87. package/dist/lang/fa.umd.prod.js +1 -1
  88. package/dist/lang/fi.umd.prod.js +1 -1
  89. package/dist/lang/fr.umd.prod.js +1 -1
  90. package/dist/lang/gn.umd.prod.js +1 -1
  91. package/dist/lang/he.umd.prod.js +1 -1
  92. package/dist/lang/hr.umd.prod.js +1 -1
  93. package/dist/lang/hu.umd.prod.js +1 -1
  94. package/dist/lang/id.umd.prod.js +1 -1
  95. package/dist/lang/is.umd.prod.js +1 -1
  96. package/dist/lang/it.umd.prod.js +1 -1
  97. package/dist/lang/ja.umd.prod.js +1 -1
  98. package/dist/lang/km.umd.prod.js +1 -1
  99. package/dist/lang/ko-KR.umd.prod.js +2 -2
  100. package/dist/lang/kur-CKB.umd.prod.js +1 -1
  101. package/dist/lang/kz.umd.prod.js +1 -1
  102. package/dist/lang/lt.umd.prod.js +1 -1
  103. package/dist/lang/lu.umd.prod.js +1 -1
  104. package/dist/lang/lv.umd.prod.js +1 -1
  105. package/dist/lang/ml.umd.prod.js +1 -1
  106. package/dist/lang/mm.umd.prod.js +6 -0
  107. package/dist/lang/ms.umd.prod.js +1 -1
  108. package/dist/lang/my.umd.prod.js +1 -1
  109. package/dist/lang/nb-NO.umd.prod.js +1 -1
  110. package/dist/lang/nl.umd.prod.js +1 -1
  111. package/dist/lang/pl.umd.prod.js +1 -1
  112. package/dist/lang/pt-BR.umd.prod.js +1 -1
  113. package/dist/lang/pt.umd.prod.js +1 -1
  114. package/dist/lang/ro.umd.prod.js +1 -1
  115. package/dist/lang/ru.umd.prod.js +1 -1
  116. package/dist/lang/sk.umd.prod.js +1 -1
  117. package/dist/lang/sl.umd.prod.js +1 -1
  118. package/dist/lang/sm.umd.prod.js +6 -0
  119. package/dist/lang/sr-CYR.umd.prod.js +1 -1
  120. package/dist/lang/sr.umd.prod.js +1 -1
  121. package/dist/lang/sv.umd.prod.js +1 -1
  122. package/dist/lang/ta.umd.prod.js +1 -1
  123. package/dist/lang/th.umd.prod.js +1 -1
  124. package/dist/lang/tr.umd.prod.js +1 -1
  125. package/dist/lang/ug.umd.prod.js +1 -1
  126. package/dist/lang/uk.umd.prod.js +1 -1
  127. package/dist/lang/vi.umd.prod.js +1 -1
  128. package/dist/lang/zh-CN.umd.prod.js +1 -1
  129. package/dist/lang/zh-TW.umd.prod.js +1 -1
  130. package/dist/quasar.addon.rtl.css +251 -0
  131. package/dist/quasar.cjs.prod.js +2 -2
  132. package/dist/quasar.css +9 -9
  133. package/dist/quasar.esm.prod.js +2 -2
  134. package/dist/quasar.prod.css +1 -1
  135. package/dist/quasar.rtl.css +1229 -9
  136. package/dist/quasar.rtl.prod.css +1 -1
  137. package/dist/quasar.sass +10 -9
  138. package/dist/quasar.umd.js +182 -126
  139. package/dist/quasar.umd.prod.js +2 -2
  140. package/dist/types/api/quploader.d.ts +7 -7
  141. package/dist/types/extras/icon-set.d.ts +6 -0
  142. package/dist/types/index.d.ts +265 -255
  143. package/dist/types/utils/dom.d.ts +1 -1
  144. package/dist/types/utils.d.ts +11 -0
  145. package/dist/vetur/quasar-attributes.json +4 -0
  146. package/dist/vetur/quasar-tags.json +2 -1
  147. package/dist/web-types/web-types.json +12 -2
  148. package/icon-set/material-symbols-outlined.js +133 -0
  149. package/icon-set/material-symbols-outlined.mjs +128 -0
  150. package/icon-set/material-symbols-rounded.js +133 -0
  151. package/icon-set/material-symbols-rounded.mjs +128 -0
  152. package/icon-set/material-symbols-sharp.js +133 -0
  153. package/icon-set/material-symbols-sharp.mjs +128 -0
  154. package/icon-set/svg-material-symbols-outlined.js +201 -0
  155. package/icon-set/svg-material-symbols-outlined.mjs +201 -0
  156. package/icon-set/svg-material-symbols-rounded.js +201 -0
  157. package/icon-set/svg-material-symbols-rounded.mjs +201 -0
  158. package/icon-set/svg-material-symbols-sharp.js +201 -0
  159. package/icon-set/svg-material-symbols-sharp.mjs +201 -0
  160. package/lang/ca.js +31 -31
  161. package/lang/ca.mjs +31 -31
  162. package/lang/es.js +1 -1
  163. package/lang/es.mjs +1 -1
  164. package/lang/index.json +8 -0
  165. package/lang/ko-KR.js +21 -21
  166. package/lang/ko-KR.mjs +21 -21
  167. package/lang/mm.js +96 -0
  168. package/lang/mm.mjs +91 -0
  169. package/lang/sm.js +96 -0
  170. package/lang/sm.mjs +91 -0
  171. package/package.json +15 -15
  172. package/src/api.extends.json +1 -0
  173. package/src/components/avatar/__tests__/QAvatar.spec.js +1 -1
  174. package/src/components/badge/QBadge.js +2 -2
  175. package/src/components/badge/__tests__/QBadge.spec.js +1 -1
  176. package/src/components/btn/QBtn.js +2 -2
  177. package/src/components/checkbox/use-checkbox.js +8 -7
  178. package/src/components/dialog/QDialog.js +3 -1
  179. package/src/components/dialog/QDialog.json +7 -0
  180. package/src/components/editor/QEditor.js +11 -25
  181. package/src/components/file/QFile.js +6 -1
  182. package/src/components/icon/QIcon.js +24 -1
  183. package/src/components/icon/QIcon.sass +7 -3
  184. package/src/components/img/QImg.sass +1 -0
  185. package/src/components/infinite-scroll/QInfiniteScroll.js +10 -10
  186. package/src/components/input/QInput.js +6 -1
  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/__tests__/QMenu.spec.js +23 -23
  191. package/src/components/pagination/QPagination.json +1 -1
  192. package/src/components/radio/QRadio.js +2 -2
  193. package/src/components/select/QSelect.js +28 -16
  194. package/src/components/select/__tests__/QSelect.spec.js +427 -451
  195. package/src/components/slider/use-slider.js +1 -1
  196. package/src/components/table/QTable.js +0 -1
  197. package/src/components/table/QTable.json +3 -0
  198. package/src/components/table/QTable.sass +1 -1
  199. package/src/components/tabs/QTabs.sass +0 -6
  200. package/src/components/uploader/uploader-core.js +23 -18
  201. package/src/components/virtual-scroll/use-virtual-scroll.js +9 -4
  202. package/src/composables/private/__tests__/use-anchor.spec.js +6 -6
  203. package/src/composables/private/__tests__/use-field.spec.js +7 -7
  204. package/src/composables/private/__tests__/use-model-toggle.spec.js +20 -19
  205. package/src/composables/private/__tests__/use-size.spec.js +2 -2
  206. package/src/composables/private/__tests__/use-transition.spec.js +5 -5
  207. package/src/composables/private/__tests__/use-validate.spec.js +5 -5
  208. package/src/composables/private/use-anchor.js +1 -1
  209. package/src/composables/private/use-field.js +2 -1
  210. package/src/composables/private/use-key-composition.js +16 -13
  211. package/src/directives/Ripple.js +2 -7
  212. package/src/utils/date.js +1 -1
  213. package/src/utils/private/global-dialog.js +22 -10
  214. package/src/components/select/__tests__/WrapperOne.vue +0 -28
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Quasar Framework v2.6.6
2
+ * Quasar Framework v2.7.2
3
3
  * (c) 2015-present Razvan Stoenescu
4
4
  * Released under the MIT License.
5
5
  */
@@ -1603,7 +1603,7 @@
1603
1603
  }
1604
1604
 
1605
1605
  var installQuasar = function (parentApp, opts = {}) {
1606
- const $q = { version: '2.6.6' };
1606
+ const $q = { version: '2.7.2' };
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:/;
@@ -2165,6 +2172,22 @@
2165
2172
  else if (ionRE.test(icon) === true) {
2166
2173
  cls = `ionicons ion-${ $q.platform.is.ios === true ? 'ios' : 'md' }${ icon.substring(3) }`;
2167
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;
2190
+ }
2168
2191
  else {
2169
2192
  // "notranslate" class is for Google Translate
2170
2193
  // to avoid tampering with Material Icons ligature font
@@ -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
  }
@@ -2341,7 +2364,7 @@
2341
2364
  style: style.value,
2342
2365
  role: 'alert',
2343
2366
  'aria-label': props.label
2344
- }, props.label !== void 0 ? props.label : hSlot(slots.default))
2367
+ }, hMergeSlot(slots.default, props.label !== void 0 ? [ props.label ] : []))
2345
2368
  }
2346
2369
  });
2347
2370
 
@@ -3171,11 +3194,7 @@
3171
3194
  if (
3172
3195
  ctx.enabled === true
3173
3196
  && evt.qSkipRipple !== true
3174
- && (
3175
- ctx.modifiers.early === true
3176
- ? [ 'mousedown', 'touchstart' ].includes(evt.type) === true
3177
- : evt.type === 'click'
3178
- )
3197
+ && evt.type === (ctx.modifiers.early === true ? 'pointerdown' : 'click')
3179
3198
  ) {
3180
3199
  showRipple(evt, el, ctx, evt.qKeyEvent === true);
3181
3200
  }
@@ -3198,8 +3217,7 @@
3198
3217
  el.__qripple = ctx;
3199
3218
 
3200
3219
  addEvt(ctx, 'main', [
3201
- [ el, 'mousedown', 'start', 'passive' ],
3202
- [ el, 'touchstart', 'start', 'passive' ],
3220
+ [ el, 'pointerdown', 'start', 'passive' ],
3203
3221
  [ el, 'click', 'start', 'passive' ],
3204
3222
  [ el, 'keydown', 'keystart', 'passive' ],
3205
3223
  [ el, 'keyup', 'keystart', 'passive' ]
@@ -3740,10 +3758,10 @@
3740
3758
  if (props.loading === true && props.percentage !== void 0) {
3741
3759
  child.push(
3742
3760
  vue.h('span', {
3743
- class: 'q-btn__progress absolute-full overflow-hidden'
3761
+ class: 'q-btn__progress absolute-full overflow-hidden' + (props.darkPercentage === true ? ' q-btn__progress--dark' : '')
3744
3762
  }, [
3745
3763
  vue.h('span', {
3746
- class: 'q-btn__progress-indicator fit block' + (props.darkPercentage === true ? ' q-btn__progress--dark' : ''),
3764
+ class: 'q-btn__progress-indicator fit block',
3747
3765
  style: percentageStyle.value
3748
3766
  })
3749
3767
  ])
@@ -3965,7 +3983,7 @@
3965
3983
  }
3966
3984
 
3967
3985
  function pickAnchorEl () {
3968
- if (props.target === false || props.target === '') {
3986
+ if (props.target === false || props.target === '' || proxy.$el.parentNode === null) {
3969
3987
  anchorEl.value = null;
3970
3988
  }
3971
3989
  else if (props.target === true) {
@@ -7249,22 +7267,23 @@
7249
7267
  props.val !== void 0 && Array.isArray(props.modelValue)
7250
7268
  );
7251
7269
 
7252
- const index = vue.computed(() => (
7253
- modelIsArray.value === true
7254
- ? props.modelValue.indexOf(props.val)
7270
+ const index = vue.computed(() => {
7271
+ const val = vue.toRaw(props.val);
7272
+ return modelIsArray.value === true
7273
+ ? props.modelValue.findIndex(opt => vue.toRaw(opt) === val)
7255
7274
  : -1
7256
- ));
7275
+ });
7257
7276
 
7258
7277
  const isTrue = vue.computed(() => (
7259
7278
  modelIsArray.value === true
7260
7279
  ? index.value > -1
7261
- : props.modelValue === props.trueValue
7280
+ : vue.toRaw(props.modelValue) === vue.toRaw(props.trueValue)
7262
7281
  ));
7263
7282
 
7264
7283
  const isFalse = vue.computed(() => (
7265
7284
  modelIsArray.value === true
7266
7285
  ? index.value === -1
7267
- : props.modelValue === props.falseValue
7286
+ : vue.toRaw(props.modelValue) === vue.toRaw(props.falseValue)
7268
7287
  ));
7269
7288
 
7270
7289
  const isIndeterminate = vue.computed(() =>
@@ -8381,7 +8400,7 @@
8381
8400
  && innerMin.value < innerMax.value
8382
8401
  ));
8383
8402
 
8384
- const decimals = vue.computed(() => (String(props.step).trim('0').split('.')[ 1 ] || '').length);
8403
+ const decimals = vue.computed(() => (String(props.step).trim().split('.')[ 1 ] || '').length);
8385
8404
  const step = vue.computed(() => (props.step === 0 ? 1 : props.step));
8386
8405
  const tabindex = vue.computed(() => (editable.value === true ? props.tabindex || 0 : -1));
8387
8406
 
@@ -11958,7 +11977,7 @@
11958
11977
  const date = new Date(
11959
11978
  d.year,
11960
11979
  d.month === null ? null : d.month - 1,
11961
- d.day,
11980
+ d.day === null ? 1 : d.day,
11962
11981
  d.hour,
11963
11982
  d.minute,
11964
11983
  d.second,
@@ -14370,6 +14389,7 @@
14370
14389
 
14371
14390
  persistent: Boolean,
14372
14391
  autoClose: Boolean,
14392
+ allowFocusOutside: Boolean,
14373
14393
 
14374
14394
  noEscDismiss: Boolean,
14375
14395
  noBackdropDismiss: Boolean,
@@ -14674,7 +14694,8 @@
14674
14694
  function onFocusChange (evt) {
14675
14695
  // the focus is not in a vue child component
14676
14696
  if (
14677
- portalIsAccessible.value === true
14697
+ props.allowFocusOutside !== true
14698
+ && portalIsAccessible.value === true
14678
14699
  && childHasFocus(innerRef.value, evt.target) !== true
14679
14700
  ) {
14680
14701
  focus('[tabindex]:not([tabindex="-1"])');
@@ -16088,7 +16109,10 @@
16088
16109
  default: 'div'
16089
16110
  },
16090
16111
 
16091
- active: Boolean,
16112
+ active: {
16113
+ type: Boolean,
16114
+ default: null
16115
+ },
16092
16116
 
16093
16117
  clickable: Boolean,
16094
16118
  dense: Boolean,
@@ -16126,7 +16150,7 @@
16126
16150
  + (props.dense === true ? ' q-item--dense' : '')
16127
16151
  + (isDark.value === true ? ' q-item--dark' : '')
16128
16152
  + (
16129
- hasLink.value === true
16153
+ hasLink.value === true && props.active === null
16130
16154
  ? linkClass.value
16131
16155
  : (
16132
16156
  props.active === true
@@ -17029,27 +17053,12 @@
17029
17053
  }
17030
17054
  }
17031
17055
 
17032
- function onMousedown () {
17056
+ function onPointerStart () {
17033
17057
  offsetBottom = void 0;
17034
17058
  }
17035
17059
 
17036
- function onMouseup (e) {
17060
+ function onSelectionchange (e) {
17037
17061
  eVm.caret.save();
17038
- emit('mouseup', e);
17039
- }
17040
-
17041
- function onTouchstartPassive () {
17042
- offsetBottom = void 0;
17043
- }
17044
-
17045
- function onKeyup (e) {
17046
- eVm.caret.save();
17047
- emit('keyup', e);
17048
- }
17049
-
17050
- function onTouchend (e) {
17051
- eVm.caret.save();
17052
- emit('touchend', e);
17053
17062
  }
17054
17063
 
17055
17064
  function setContent (v, restorePosition) {
@@ -17106,6 +17115,12 @@
17106
17115
  eVm.caret = proxy.caret = new Caret(contentRef.value, eVm);
17107
17116
  setContent(props.modelValue);
17108
17117
  refreshToolbar();
17118
+
17119
+ document.addEventListener('selectionchange', onSelectionchange);
17120
+ });
17121
+
17122
+ vue.onBeforeUnmount(() => {
17123
+ document.removeEventListener('selectionchange', onSelectionchange);
17109
17124
  });
17110
17125
 
17111
17126
  return () => {
@@ -17159,13 +17174,8 @@
17159
17174
  onFocus,
17160
17175
 
17161
17176
  // clean saved scroll position
17162
- onMousedown,
17163
- onTouchstartPassive,
17164
-
17165
- // save caret
17166
- onMouseup,
17167
- onKeyup,
17168
- onTouchend
17177
+ onMousedown: onPointerStart,
17178
+ onTouchstartPassive: onPointerStart
17169
17179
  })
17170
17180
  ])
17171
17181
  }
@@ -18819,6 +18829,7 @@
18819
18829
  + (props.square === true ? ' q-uploader--square no-border-radius' : '')
18820
18830
  + (props.flat === true ? ' q-uploader--flat no-shadow' : '')
18821
18831
  + (props.disable === true ? ' disabled q-uploader--disable' : '')
18832
+ + (dnd.value === true ? ' q-uploader--dnd' : '')
18822
18833
  );
18823
18834
 
18824
18835
  const colorClass = vue.computed(() =>
@@ -19009,28 +19020,32 @@
19009
19020
 
19010
19021
  return [
19011
19022
  vue.h('div', {
19012
- class: 'q-uploader__header-content flex flex-center no-wrap q-gutter-xs'
19023
+ class: 'q-uploader__header-content column'
19013
19024
  }, [
19014
- getBtn(state.queuedFiles.value.length > 0, 'removeQueue', removeQueuedFiles),
19015
- getBtn(state.uploadedFiles.value.length > 0, 'removeUploaded', removeUploadedFiles),
19016
-
19017
- state.isUploading.value === true
19018
- ? vue.h(QSpinner, { class: 'q-uploader__spinner' })
19019
- : null,
19025
+ vue.h('div', {
19026
+ class: 'flex flex-center no-wrap q-gutter-xs'
19027
+ }, [
19028
+ getBtn(state.queuedFiles.value.length > 0, 'removeQueue', removeQueuedFiles),
19029
+ getBtn(state.uploadedFiles.value.length > 0, 'removeUploaded', removeUploadedFiles),
19020
19030
 
19021
- vue.h('div', { class: 'col column justify-center' }, [
19022
- props.label !== void 0
19023
- ? vue.h('div', { class: 'q-uploader__title' }, [ props.label ])
19031
+ state.isUploading.value === true
19032
+ ? vue.h(QSpinner, { class: 'q-uploader__spinner' })
19024
19033
  : null,
19025
19034
 
19026
- vue.h('div', { class: 'q-uploader__subtitle' }, [
19027
- uploadSizeLabel.value + ' / ' + uploadProgressLabel.value
19028
- ])
19029
- ]),
19035
+ vue.h('div', { class: 'col column justify-center' }, [
19036
+ props.label !== void 0
19037
+ ? vue.h('div', { class: 'q-uploader__title' }, [ props.label ])
19038
+ : null,
19030
19039
 
19031
- getBtn(canAddFiles.value, 'add'),
19032
- getBtn(props.hideUploadBtn === false && canUpload.value === true, 'upload', state.upload),
19033
- getBtn(state.isUploading.value, 'clear', state.abort)
19040
+ vue.h('div', { class: 'q-uploader__subtitle' }, [
19041
+ uploadSizeLabel.value + ' / ' + uploadProgressLabel.value
19042
+ ])
19043
+ ]),
19044
+
19045
+ getBtn(canAddFiles.value, 'add'),
19046
+ getBtn(props.hideUploadBtn === false && canUpload.value === true, 'upload', state.upload),
19047
+ getBtn(state.isUploading.value, 'clear', state.abort)
19048
+ ])
19034
19049
  ])
19035
19050
  ]
19036
19051
  }
@@ -21005,6 +21020,7 @@
21005
21020
  vue.h('div', {
21006
21021
  ref: state.targetRef,
21007
21022
  class: 'q-field__native row',
21023
+ tabindex: -1,
21008
21024
  ...state.splitAttrs.attributes.value,
21009
21025
  'data-autofocus': props.autofocus === true || void 0
21010
21026
  }, slots.control(controlSlotScope.value))
@@ -21115,7 +21131,7 @@
21115
21131
  const labelAttrs = state.getControl === void 0 && slots.control === void 0
21116
21132
  ? {
21117
21133
  ...state.splitAttrs.attributes.value,
21118
- 'data-autofocus': props.autofocus,
21134
+ 'data-autofocus': props.autofocus === true || void 0,
21119
21135
  ...attributes.value
21120
21136
  }
21121
21137
  : attributes.value;
@@ -21308,6 +21324,11 @@
21308
21324
  disabled: state.editable.value !== true
21309
21325
  }));
21310
21326
 
21327
+ const fieldClass = vue.computed(() =>
21328
+ 'q-file q-field--auto-height'
21329
+ + (dnd.value === true ? ' q-file--dnd' : '')
21330
+ );
21331
+
21311
21332
  const isAppending = vue.computed(() =>
21312
21333
  props.multiple === true && props.append === true
21313
21334
  );
@@ -21440,7 +21461,7 @@
21440
21461
  }
21441
21462
 
21442
21463
  Object.assign(state, {
21443
- fieldClass: { value: 'q-file q-field--auto-height' },
21464
+ fieldClass,
21444
21465
  emitValue,
21445
21466
  hasValue,
21446
21467
  inputRef,
@@ -22502,6 +22523,16 @@
22502
22523
 
22503
22524
  if (isWorking.value === true) {
22504
22525
  localScrollTarget.addEventListener('scroll', poll, passive$3);
22526
+
22527
+ if (props.reverse === true) {
22528
+ const
22529
+ scrollHeight = getScrollHeight(localScrollTarget),
22530
+ containerHeight = height(localScrollTarget);
22531
+
22532
+ setVerticalScrollPosition(localScrollTarget, scrollHeight - containerHeight);
22533
+ }
22534
+
22535
+ immediatePoll();
22505
22536
  }
22506
22537
  }
22507
22538
 
@@ -22572,16 +22603,6 @@
22572
22603
  setDebounce(props.debounce);
22573
22604
 
22574
22605
  updateScrollTarget();
22575
-
22576
- if (props.reverse === true) {
22577
- const
22578
- scrollHeight = getScrollHeight(localScrollTarget),
22579
- containerHeight = height(localScrollTarget);
22580
-
22581
- setVerticalScrollPosition(localScrollTarget, scrollHeight - containerHeight);
22582
- }
22583
-
22584
- immediatePoll();
22585
22606
  });
22586
22607
 
22587
22608
  return () => {
@@ -23219,27 +23240,28 @@
23219
23240
  const isJapanese = /[\u3000-\u303f\u3040-\u309f\u30a0-\u30ff\uff00-\uff9f\u4e00-\u9faf\u3400-\u4dbf]/;
23220
23241
  const isChinese = /[\u4e00-\u9fff\u3400-\u4dbf\u{20000}-\u{2a6df}\u{2a700}-\u{2b73f}\u{2b740}-\u{2b81f}\u{2b820}-\u{2ceaf}\uf900-\ufaff\u3300-\u33ff\ufe30-\ufe4f\uf900-\ufaff\u{2f800}-\u{2fa1f}]/u;
23221
23242
  const isKorean = /[\u3131-\u314e\u314f-\u3163\uac00-\ud7a3]/;
23243
+ const isPlainText = /[a-z0-9_ -]$/i;
23222
23244
 
23223
23245
  function useKeyComposition (onInput) {
23224
23246
  return function onComposition (e) {
23225
23247
  if (e.type === 'compositionend' || e.type === 'change') {
23226
- if (e.target.composing !== true) { return }
23227
- e.target.composing = false;
23248
+ if (e.target.qComposing !== true) { return }
23249
+ e.target.qComposing = false;
23228
23250
  onInput(e);
23229
23251
  }
23230
- else if (e.type === 'compositionupdate') {
23231
- if (
23232
- typeof e.data === 'string'
23233
- && isJapanese.test(e.data) === false
23234
- && isChinese.test(e.data) === false
23235
- && isKorean.test(e.data) === false
23236
- ) {
23237
- e.target.composing = false;
23252
+ else if (
23253
+ e.type === 'compositionupdate'
23254
+ && e.target.qComposing !== true
23255
+ && typeof e.data === 'string'
23256
+ ) {
23257
+ const isComposing = client.is.firefox === true
23258
+ ? isPlainText.test(e.data) === false
23259
+ : isJapanese.test(e.data) === true || isChinese.test(e.data) === true || isKorean.test(e.data) === true;
23260
+
23261
+ if (isComposing === true) {
23262
+ e.target.qComposing = true;
23238
23263
  }
23239
23264
  }
23240
- else {
23241
- e.target.composing = true;
23242
- }
23243
23265
  }
23244
23266
  }
23245
23267
 
@@ -23441,7 +23463,7 @@
23441
23463
  }
23442
23464
 
23443
23465
  function onInput (e) {
23444
- if (!e || !e.target || e.target.composing === true) {
23466
+ if (!e || !e.target || e.target.qComposing === true) {
23445
23467
  return
23446
23468
  }
23447
23469
 
@@ -23486,6 +23508,8 @@
23486
23508
  }
23487
23509
 
23488
23510
  if (props.modelValue !== val && emitCachedValue !== val) {
23511
+ emitCachedValue = val;
23512
+
23489
23513
  stopWatcher === true && (stopValueWatcher = true);
23490
23514
  emit('update:modelValue', val);
23491
23515
 
@@ -23517,13 +23541,16 @@
23517
23541
  const inp = inputRef.value;
23518
23542
  if (inp !== null) {
23519
23543
  const parentStyle = inp.parentNode.style;
23544
+ const { overflow } = inp.style;
23520
23545
 
23521
23546
  // reset height of textarea to a small size to detect the real height
23522
23547
  // but keep the total control size the same
23523
23548
  parentStyle.marginBottom = (inp.scrollHeight - 1) + 'px';
23524
23549
  inp.style.height = '1px';
23550
+ inp.style.overflow = 'hidden';
23525
23551
 
23526
23552
  inp.style.height = inp.scrollHeight + 'px';
23553
+ inp.style.overflow = overflow;
23527
23554
  parentStyle.marginBottom = '';
23528
23555
  }
23529
23556
  }
@@ -24485,7 +24512,8 @@
24485
24512
  const layout = vue.h('div', {
24486
24513
  class: classes.value,
24487
24514
  style: style.value,
24488
- ref: props.container === true ? void 0 : rootRef
24515
+ ref: props.container === true ? void 0 : rootRef,
24516
+ tabindex: -1
24489
24517
  }, content);
24490
24518
 
24491
24519
  if (props.container === true) {
@@ -24648,7 +24676,7 @@
24648
24676
  const rootRef = vue.ref(null);
24649
24677
  const { refocusTargetEl, refocusTarget } = useRefocusTarget(props, rootRef);
24650
24678
 
24651
- const isTrue = vue.computed(() => props.modelValue === props.val);
24679
+ const isTrue = vue.computed(() => vue.toRaw(props.modelValue) === vue.toRaw(props.val));
24652
24680
 
24653
24681
  const classes = vue.computed(() =>
24654
24682
  'q-radio cursor-pointer no-outline row inline no-wrap items-center'
@@ -27490,8 +27518,13 @@
27490
27518
  const setOverflowAnchor = window.getComputedStyle(document.body).overflowAnchor === void 0
27491
27519
  ? noop
27492
27520
  : function (contentEl, index) {
27493
- requestAnimationFrame(() => {
27494
- if (contentEl === void 0) {
27521
+ if (contentEl === null) {
27522
+ return
27523
+ }
27524
+
27525
+ cancelAnimationFrame(contentEl._qOverflowAnimationFrame);
27526
+ contentEl._qOverflowAnimationFrame = requestAnimationFrame(() => {
27527
+ if (contentEl === null) {
27495
27528
  return
27496
27529
  }
27497
27530
 
@@ -27885,7 +27918,7 @@
27885
27918
  contentEl.addEventListener('focusout', onBlurRefocusFn);
27886
27919
 
27887
27920
  setTimeout(() => {
27888
- contentEl !== void 0 && contentEl.removeEventListener('focusout', onBlurRefocusFn);
27921
+ contentEl !== null && contentEl.removeEventListener('focusout', onBlurRefocusFn);
27889
27922
  });
27890
27923
  }
27891
27924
 
@@ -27998,7 +28031,7 @@
27998
28031
  }
27999
28032
 
28000
28033
  function onBlurRefocusFn () {
28001
- contentRef.value !== void 0 && contentRef.value.focus();
28034
+ contentRef.value !== null && contentRef.value !== void 0 && contentRef.value.focus();
28002
28035
  }
28003
28036
 
28004
28037
  function localResetVirtualScroll (toIndex, fullReset) {
@@ -28314,7 +28347,7 @@
28314
28347
 
28315
28348
  emits: [
28316
28349
  ...useFieldEmits,
28317
- 'add', 'remove', 'input-value',
28350
+ 'add', 'remove', 'input-value', 'new-value',
28318
28351
  'keyup', 'keypress', 'keydown',
28319
28352
  'filter-abort'
28320
28353
  ],
@@ -28352,7 +28385,7 @@
28352
28385
 
28353
28386
  const virtualScrollItemSizeComputed = vue.computed(() => (
28354
28387
  props.virtualScrollItemSize === void 0
28355
- ? (props.dense === true ? 24 : 48)
28388
+ ? (props.optionsDense === true ? 24 : 48)
28356
28389
  : props.virtualScrollItemSize
28357
28390
  ));
28358
28391
 
@@ -28362,7 +28395,6 @@
28362
28395
  localResetVirtualScroll,
28363
28396
  padVirtualScroll,
28364
28397
  onVirtualScrollEvt,
28365
- reset,
28366
28398
  scrollTo,
28367
28399
  setVirtualScrollSize
28368
28400
  } = useVirtualScroll({
@@ -28456,15 +28488,23 @@
28456
28488
 
28457
28489
  const tabindex = vue.computed(() => (state.focused.value === true ? props.tabindex : -1));
28458
28490
 
28459
- const comboboxAttrs = vue.computed(() => ({
28460
- tabindex: props.tabindex,
28461
- role: 'combobox',
28462
- 'aria-label': props.label,
28463
- 'aria-autocomplete': props.useInput === true ? 'list' : 'none',
28464
- 'aria-expanded': menu.value === true ? 'true' : 'false',
28465
- 'aria-owns': `${ state.targetUid.value }_lb`,
28466
- 'aria-controls': `${ state.targetUid.value }_lb`
28467
- }));
28491
+ const comboboxAttrs = vue.computed(() => {
28492
+ const attrs = {
28493
+ tabindex: props.tabindex,
28494
+ role: 'combobox',
28495
+ 'aria-label': props.label,
28496
+ 'aria-autocomplete': props.useInput === true ? 'list' : 'none',
28497
+ 'aria-expanded': menu.value === true ? 'true' : 'false',
28498
+ 'aria-owns': `${ state.targetUid.value }_lb`,
28499
+ 'aria-controls': `${ state.targetUid.value }_lb`
28500
+ };
28501
+
28502
+ if (optionIndex.value >= 0) {
28503
+ attrs[ 'aria-activedescendant' ] = `${ state.targetUid.value }_${ optionIndex.value }`;
28504
+ }
28505
+
28506
+ return attrs
28507
+ });
28468
28508
 
28469
28509
  const listboxAttrs = vue.computed(() => {
28470
28510
  const attrs = {
@@ -29200,7 +29240,7 @@
29200
29240
  function onInput (e) {
29201
29241
  clearTimeout(inputTimer);
29202
29242
 
29203
- if (e && e.target && e.target.composing === true) {
29243
+ if (e && e.target && e.target.qComposing === true) {
29204
29244
  return
29205
29245
  }
29206
29246
 
@@ -29529,13 +29569,18 @@
29529
29569
  setOptionIndex(optionIndex);
29530
29570
  }
29531
29571
 
29532
- function rerenderMenu () {
29572
+ function rerenderMenu (newLength, oldLength) {
29533
29573
  if (menu.value === true && state.innerLoading.value === false) {
29534
- reset();
29574
+ localResetVirtualScroll(-1, true);
29535
29575
 
29536
29576
  vue.nextTick(() => {
29537
29577
  if (menu.value === true && state.innerLoading.value === false) {
29538
- updateMenu(true);
29578
+ if (newLength > oldLength) {
29579
+ localResetVirtualScroll();
29580
+ }
29581
+ else {
29582
+ updateMenu(true);
29583
+ }
29539
29584
  }
29540
29585
  });
29541
29586
  }
@@ -33579,7 +33624,6 @@
33579
33624
 
33580
33625
  const __containerClass = vue.computed(() =>
33581
33626
  `q-table__container q-table--${ props.separator }-separator column no-wrap`
33582
- + (props.loading === true ? ' q-table--loading' : '')
33583
33627
  + (props.grid === true ? ' q-table--grid' : cardDefaultClass.value)
33584
33628
  + (isDark.value === true ? ' q-table--dark' : '')
33585
33629
  + (props.dense === true ? ' q-table--dense' : '')
@@ -38060,19 +38104,31 @@
38060
38104
  const applyState = cmd => {
38061
38105
  if (dialogRef.value !== null && dialogRef.value[ cmd ] !== void 0) {
38062
38106
  dialogRef.value[ cmd ]();
38107
+ return
38063
38108
  }
38064
- else if (
38109
+
38110
+ const target = vm.$.subTree;
38111
+
38112
+ if (target && target.component) {
38065
38113
  // account for "script setup" way of declaring component
38066
- vm.$.subTree
38067
- && vm.$.subTree.component
38068
- && vm.$.subTree.component.proxy
38069
- && vm.$.subTree.component.proxy[ cmd ]
38070
- ) {
38071
- vm.$.subTree.component.proxy[ cmd ]();
38072
- }
38073
- else {
38074
- console.error('[Quasar] Incorrectly defined Dialog component');
38114
+ if (target.component.proxy && target.component.proxy[ cmd ]) {
38115
+ target.component.proxy[ cmd ]();
38116
+ return
38117
+ }
38118
+
38119
+ // account for "script setup" + async component way of declaring component
38120
+ if (
38121
+ target.component.subTree &&
38122
+ target.component.subTree.component &&
38123
+ target.component.subTree.component.proxy &&
38124
+ target.component.subTree.component.proxy[ cmd ]
38125
+ ) {
38126
+ target.component.subTree.component.proxy[ cmd ]();
38127
+ return
38128
+ }
38075
38129
  }
38130
+
38131
+ console.error('[Quasar] Incorrectly defined Dialog component');
38076
38132
  };
38077
38133
 
38078
38134
  const
@@ -39675,7 +39731,7 @@
39675
39731
  });
39676
39732
 
39677
39733
  var index_umd = {
39678
- version: '2.6.6',
39734
+ version: '2.7.2',
39679
39735
  install (app, opts) {
39680
39736
  installQuasar(app, {
39681
39737
  components,