quasar 2.2.3 → 2.3.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 (169) hide show
  1. package/dist/api/BottomSheet.json +17 -2
  2. package/dist/api/Dialog.json +17 -2
  3. package/dist/api/LocalStorage.json +8 -0
  4. package/dist/api/QCircularProgress.json +14 -0
  5. package/dist/api/QDate.json +46 -0
  6. package/dist/api/QEditor.json +7 -2
  7. package/dist/api/QFooter.json +1 -1
  8. package/dist/api/QHeader.json +1 -1
  9. package/dist/api/QIntersection.json +14 -0
  10. package/dist/api/QLinearProgress.json +14 -0
  11. package/dist/api/QRouteTab.json +1 -24
  12. package/dist/api/QScrollArea.json +3 -0
  13. package/dist/api/QSelect.json +62 -0
  14. package/dist/api/QSkeleton.json +1 -1
  15. package/dist/api/QTable.json +62 -5
  16. package/dist/api/QTree.json +6 -0
  17. package/dist/api/QUploader.json +81 -1
  18. package/dist/api/SessionStorage.json +8 -0
  19. package/dist/icon-set/bootstrap-icons.umd.prod.js +1 -1
  20. package/dist/icon-set/eva-icons.umd.prod.js +1 -1
  21. package/dist/icon-set/fontawesome-v5-pro.umd.prod.js +1 -1
  22. package/dist/icon-set/fontawesome-v5.umd.prod.js +1 -1
  23. package/dist/icon-set/ionicons-v4.umd.prod.js +1 -1
  24. package/dist/icon-set/line-awesome.umd.prod.js +1 -1
  25. package/dist/icon-set/material-icons-outlined.umd.prod.js +1 -1
  26. package/dist/icon-set/material-icons-round.umd.prod.js +1 -1
  27. package/dist/icon-set/material-icons-sharp.umd.prod.js +1 -1
  28. package/dist/icon-set/material-icons.umd.prod.js +1 -1
  29. package/dist/icon-set/mdi-v3.umd.prod.js +1 -1
  30. package/dist/icon-set/mdi-v4.umd.prod.js +1 -1
  31. package/dist/icon-set/mdi-v5.umd.prod.js +1 -1
  32. package/dist/icon-set/mdi-v6.umd.prod.js +1 -1
  33. package/dist/icon-set/svg-bootstrap-icons.umd.prod.js +1 -1
  34. package/dist/icon-set/svg-eva-icons.umd.prod.js +1 -1
  35. package/dist/icon-set/svg-fontawesome-v5.umd.prod.js +1 -1
  36. package/dist/icon-set/svg-ionicons-v4.umd.prod.js +1 -1
  37. package/dist/icon-set/svg-ionicons-v5.umd.prod.js +1 -1
  38. package/dist/icon-set/svg-ionicons-v6.umd.prod.js +6 -0
  39. package/dist/icon-set/svg-line-awesome.umd.prod.js +1 -1
  40. package/dist/icon-set/svg-material-icons-outlined.umd.prod.js +1 -1
  41. package/dist/icon-set/svg-material-icons-round.umd.prod.js +1 -1
  42. package/dist/icon-set/svg-material-icons-sharp.umd.prod.js +1 -1
  43. package/dist/icon-set/svg-material-icons.umd.prod.js +1 -1
  44. package/dist/icon-set/svg-mdi-v4.umd.prod.js +1 -1
  45. package/dist/icon-set/svg-mdi-v5.umd.prod.js +1 -1
  46. package/dist/icon-set/svg-mdi-v6.umd.prod.js +1 -1
  47. package/dist/icon-set/svg-themify.umd.prod.js +1 -1
  48. package/dist/icon-set/themify.umd.prod.js +1 -1
  49. package/dist/lang/ar.umd.prod.js +1 -1
  50. package/dist/lang/az-Latn.umd.prod.js +1 -1
  51. package/dist/lang/bg.umd.prod.js +1 -1
  52. package/dist/lang/bn.umd.prod.js +1 -1
  53. package/dist/lang/ca.umd.prod.js +1 -1
  54. package/dist/lang/cs.umd.prod.js +1 -1
  55. package/dist/lang/da.umd.prod.js +1 -1
  56. package/dist/lang/de.umd.prod.js +1 -1
  57. package/dist/lang/el.umd.prod.js +1 -1
  58. package/dist/lang/en-GB.umd.prod.js +1 -1
  59. package/dist/lang/en-US.umd.prod.js +1 -1
  60. package/dist/lang/eo.umd.prod.js +1 -1
  61. package/dist/lang/es.umd.prod.js +1 -1
  62. package/dist/lang/et.umd.prod.js +1 -1
  63. package/dist/lang/fa-IR.umd.prod.js +1 -1
  64. package/dist/lang/fa.umd.prod.js +1 -1
  65. package/dist/lang/fi.umd.prod.js +1 -1
  66. package/dist/lang/fr.umd.prod.js +1 -1
  67. package/dist/lang/gn.umd.prod.js +1 -1
  68. package/dist/lang/he.umd.prod.js +1 -1
  69. package/dist/lang/hr.umd.prod.js +1 -1
  70. package/dist/lang/hu.umd.prod.js +1 -1
  71. package/dist/lang/id.umd.prod.js +1 -1
  72. package/dist/lang/is.umd.prod.js +1 -1
  73. package/dist/lang/it.umd.prod.js +1 -1
  74. package/dist/lang/ja.umd.prod.js +1 -1
  75. package/dist/lang/km.umd.prod.js +1 -1
  76. package/dist/lang/ko-KR.umd.prod.js +1 -1
  77. package/dist/lang/kur-CKB.umd.prod.js +1 -1
  78. package/dist/lang/lt.umd.prod.js +1 -1
  79. package/dist/lang/lu.umd.prod.js +1 -1
  80. package/dist/lang/lv.umd.prod.js +1 -1
  81. package/dist/lang/ml.umd.prod.js +1 -1
  82. package/dist/lang/ms.umd.prod.js +1 -1
  83. package/dist/lang/nb-NO.umd.prod.js +1 -1
  84. package/dist/lang/nl.umd.prod.js +1 -1
  85. package/dist/lang/pl.umd.prod.js +1 -1
  86. package/dist/lang/pt-BR.umd.prod.js +1 -1
  87. package/dist/lang/pt.umd.prod.js +1 -1
  88. package/dist/lang/ro.umd.prod.js +1 -1
  89. package/dist/lang/ru.umd.prod.js +1 -1
  90. package/dist/lang/sk.umd.prod.js +1 -1
  91. package/dist/lang/sl.umd.prod.js +1 -1
  92. package/dist/lang/sr-CYR.umd.prod.js +1 -1
  93. package/dist/lang/sr.umd.prod.js +1 -1
  94. package/dist/lang/sv.umd.prod.js +1 -1
  95. package/dist/lang/ta.umd.prod.js +1 -1
  96. package/dist/lang/th.umd.prod.js +1 -1
  97. package/dist/lang/tr.umd.prod.js +1 -1
  98. package/dist/lang/ug.umd.prod.js +1 -1
  99. package/dist/lang/uk.umd.prod.js +1 -1
  100. package/dist/lang/vi.umd.prod.js +1 -1
  101. package/dist/lang/zh-CN.umd.prod.js +1 -1
  102. package/dist/lang/zh-TW.umd.prod.js +1 -1
  103. package/dist/quasar.cjs.prod.js +2 -2
  104. package/dist/quasar.css +57 -3
  105. package/dist/quasar.esm.prod.js +2 -2
  106. package/dist/quasar.prod.css +1 -1
  107. package/dist/quasar.rtl.css +124 -3
  108. package/dist/quasar.rtl.prod.css +1 -1
  109. package/dist/quasar.sass +47 -5
  110. package/dist/quasar.umd.js +206 -125
  111. package/dist/quasar.umd.prod.js +2 -2
  112. package/dist/ssr-directives/Morph.js +1 -1
  113. package/dist/types/composables.d.ts +5 -1
  114. package/dist/types/extras/icon-set.d.ts +1 -0
  115. package/dist/types/index.d.ts +374 -141
  116. package/dist/vetur/quasar-attributes.json +18 -2
  117. package/dist/vetur/quasar-tags.json +6 -2
  118. package/dist/web-types/web-types.json +44 -3
  119. package/icon-set/svg-ionicons-v6.js +225 -0
  120. package/package.json +5 -2
  121. package/src/api.extends.json +7 -0
  122. package/src/body.js +14 -4
  123. package/src/components/circular-progress/QCircularProgress.js +6 -1
  124. package/src/components/circular-progress/QCircularProgress.json +6 -0
  125. package/src/components/date/QDate.json +34 -0
  126. package/src/components/editor/QEditor.js +2 -2
  127. package/src/components/editor/QEditor.json +6 -2
  128. package/src/components/footer/QFooter.json +1 -1
  129. package/src/components/header/QHeader.json +1 -1
  130. package/src/components/icon/QIcon.js +1 -1
  131. package/src/components/infinite-scroll/QInfiniteScroll.js +48 -31
  132. package/src/components/intersection/QIntersection.js +9 -1
  133. package/src/components/intersection/QIntersection.json +9 -0
  134. package/src/components/linear-progress/QLinearProgress.js +10 -1
  135. package/src/components/linear-progress/QLinearProgress.json +6 -0
  136. package/src/components/linear-progress/QLinearProgress.sass +2 -1
  137. package/src/components/popup-proxy/QPopupProxy.js +6 -15
  138. package/src/components/scroll-area/QScrollArea.js +1 -1
  139. package/src/components/scroll-area/QScrollArea.json +4 -1
  140. package/src/components/select/QSelect.js +15 -21
  141. package/src/components/select/QSelect.json +47 -0
  142. package/src/components/skeleton/QSkeleton.json +1 -4
  143. package/src/components/slider/use-slider.js +3 -3
  144. package/src/components/table/QTable.json +51 -5
  145. package/src/components/table/table-pagination.js +2 -2
  146. package/src/components/tabs/QRouteTab.json +1 -23
  147. package/src/components/tabs/QTabs.js +1 -1
  148. package/src/components/time/QTime.js +6 -5
  149. package/src/components/tree/QTree.js +9 -5
  150. package/src/components/tree/QTree.json +5 -0
  151. package/src/components/tree/QTree.sass +52 -4
  152. package/src/components/uploader/uploader-core.js +2 -7
  153. package/src/components/uploader/xhr-uploader-plugin.json +97 -1
  154. package/src/components/virtual-scroll/use-virtual-scroll.js +17 -1
  155. package/src/composables/private/use-field.js +4 -4
  156. package/src/composables/private/use-file.js +8 -0
  157. package/src/composables/private/use-model-toggle.js +1 -1
  158. package/src/composables/private/use-refocus-target.js +12 -3
  159. package/src/composables/private/use-split-attrs.js +7 -1
  160. package/src/composables/use-dialog-plugin-component.js +7 -1
  161. package/src/css/core/transitions.sass +3 -1
  162. package/src/install-quasar.js +1 -0
  163. package/src/utils/create-uploader-component.js +6 -4
  164. package/src/utils/date.js +1 -1
  165. package/src/utils/private/get-emits-object.js +11 -0
  166. package/src/utils/private/global-dialog.json +10 -2
  167. package/src/utils/private/vm.js +3 -3
  168. package/src/utils/private/web-storage.json +10 -0
  169. package/wrappers/index.js +4 -0
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Quasar Framework v2.2.3
2
+ * Quasar Framework v2.3.2
3
3
  * (c) 2015-present Razvan Stoenescu
4
4
  * Released under the MIT License.
5
5
  */
@@ -560,7 +560,7 @@
560
560
  }
561
561
 
562
562
  const SIZE_LIST = [ 'sm', 'md', 'lg', 'xl' ];
563
- const { passive: passive$3 } = listenOpts;
563
+ const { passive: passive$4 } = listenOpts;
564
564
 
565
565
  var Screen = defineReactivePlugin({
566
566
  width: 0,
@@ -697,11 +697,11 @@
697
697
  };
698
698
 
699
699
  this.setDebounce = delay => {
700
- updateEvt !== void 0 && target.removeEventListener('resize', updateEvt, passive$3);
700
+ updateEvt !== void 0 && target.removeEventListener('resize', updateEvt, passive$4);
701
701
  updateEvt = delay > 0
702
702
  ? debounce(this.__update, delay)
703
703
  : this.__update;
704
- target.addEventListener('resize', updateEvt, passive$3);
704
+ target.addEventListener('resize', updateEvt, passive$4);
705
705
  };
706
706
 
707
707
  this.setDebounce(updateDebounce);
@@ -1170,16 +1170,16 @@
1170
1170
  var Body = {
1171
1171
  install (opts) {
1172
1172
 
1173
- const { $q } = opts;
1174
-
1175
- $q.config.brand !== void 0 && setColors($q.config.brand);
1176
-
1177
1173
  if (this.__installed === true) { return }
1178
1174
 
1179
1175
  if (isRuntimeSsrPreHydration.value === true) {
1180
1176
  applyClientSsrCorrections();
1181
1177
  }
1182
1178
  else {
1179
+ const { $q } = opts;
1180
+
1181
+ $q.config.brand !== void 0 && setColors($q.config.brand);
1182
+
1183
1183
  const cls = getBodyClasses(client, $q.config);
1184
1184
  document.body.classList.add.apply(document.body.classList, cls);
1185
1185
  }
@@ -1437,7 +1437,7 @@
1437
1437
  }
1438
1438
 
1439
1439
  var installQuasar = function (parentApp, opts = {}) {
1440
- const $q = { version: '2.2.3' };
1440
+ const $q = { version: '2.3.2' };
1441
1441
 
1442
1442
  if (globalConfigIsFrozen === false) {
1443
1443
  if (opts.config !== void 0) {
@@ -1866,7 +1866,7 @@
1866
1866
  const imgRE = /^img:/;
1867
1867
  const svgUseRE = /^svguse:/;
1868
1868
  const ionRE = /^ion-/;
1869
- const faLaRE = /^[l|f]a[s|r|l|b|d]? /;
1869
+ const faLaRE = /^[l|f]a[s|r|l|b|d|k]? /;
1870
1870
 
1871
1871
  var QIcon = createComponent({
1872
1872
  name: 'QIcon',
@@ -2271,14 +2271,14 @@
2271
2271
 
2272
2272
  // used directly by docs too
2273
2273
  function getParentVm (vm) {
2274
- if (vm.$parent !== void 0 && vm.$parent !== null) {
2274
+ if (Object(vm.$parent) === vm.$parent) {
2275
2275
  return vm.$parent
2276
2276
  }
2277
2277
 
2278
2278
  vm = vm.$.parent;
2279
2279
 
2280
- while (vm !== void 0 && vm !== null) {
2281
- if (vm.proxy !== void 0 && vm.proxy !== null) {
2280
+ while (Object(vm) === vm) {
2281
+ if (Object(vm.proxy) === vm.proxy) {
2282
2282
  return vm.proxy
2283
2283
  }
2284
2284
 
@@ -3846,7 +3846,7 @@
3846
3846
  default: null
3847
3847
  },
3848
3848
 
3849
- 'onUpdate:modelValue': Function
3849
+ 'onUpdate:modelValue': [ Function, Array ]
3850
3850
  };
3851
3851
 
3852
3852
  const useModelToggleEmits = [
@@ -7028,12 +7028,21 @@
7028
7028
  });
7029
7029
 
7030
7030
  function refocusTarget (e) {
7031
+ const root = rootRef.value;
7032
+
7031
7033
  if (e !== void 0 && e.type.indexOf('key') === 0) {
7032
- if (document.activeElement !== rootRef.value && rootRef.value.contains(document.activeElement) === true) {
7033
- rootRef.value.focus();
7034
+ if (
7035
+ root !== null
7036
+ && document.activeElement !== root
7037
+ && root.contains(document.activeElement) === true
7038
+ ) {
7039
+ root.focus();
7034
7040
  }
7035
7041
  }
7036
- else if ((e === void 0 || rootRef.value.contains(e.target) === true) && refocusRef.value !== null) {
7042
+ else if (
7043
+ refocusRef.value !== null
7044
+ && (e === void 0 || (root !== null && root.contains(e.target) === true))
7045
+ ) {
7037
7046
  refocusRef.value.focus();
7038
7047
  }
7039
7048
  }
@@ -7550,6 +7559,11 @@
7550
7559
  default: 0
7551
7560
  },
7552
7561
 
7562
+ animationSpeed: {
7563
+ type: [ String, Number ],
7564
+ default: 600
7565
+ },
7566
+
7553
7567
  indeterminate: Boolean
7554
7568
  },
7555
7569
 
@@ -7569,7 +7583,7 @@
7569
7583
 
7570
7584
  const circleStyle = vue.computed(() => (
7571
7585
  props.instantFeedback !== true && props.indeterminate !== true
7572
- ? { transition: 'stroke-dashoffset 0.6s ease 0s, stroke 0.6s ease' }
7586
+ ? { transition: `stroke-dashoffset ${ props.animationSpeed }ms ease 0s, stroke ${ props.animationSpeed }ms ease` }
7573
7587
  : ''
7574
7588
  ));
7575
7589
 
@@ -8281,7 +8295,7 @@
8281
8295
  }
8282
8296
 
8283
8297
  function onPan (event) {
8284
- if (event.isFinal) {
8298
+ if (event.isFinal === true) {
8285
8299
  if (dragging.value !== void 0) {
8286
8300
  updatePosition(event.evt);
8287
8301
  // only if touch, because we also have mousedown/up:
@@ -8291,7 +8305,7 @@
8291
8305
  }
8292
8306
  active.value = false;
8293
8307
  }
8294
- else if (event.isFirst) {
8308
+ else if (event.isFirst === true) {
8295
8309
  dragging.value = getDragging(event.evt);
8296
8310
  updatePosition(event.evt);
8297
8311
  updateValue();
@@ -8321,7 +8335,7 @@
8321
8335
  function onDeactivate () {
8322
8336
  preventFocus.value = false;
8323
8337
 
8324
- if (dragging.value === void 0) {
8338
+ if (dragging.value === false) {
8325
8339
  active.value = false;
8326
8340
  }
8327
8341
 
@@ -8823,7 +8837,7 @@
8823
8837
 
8824
8838
  contentClass: String,
8825
8839
 
8826
- 'onUpdate:modelValue': Function
8840
+ 'onUpdate:modelValue': [ Function, Array ]
8827
8841
  },
8828
8842
 
8829
8843
  setup (props, { slots, emit }) {
@@ -11490,7 +11504,7 @@
11490
11504
  }
11491
11505
  }
11492
11506
 
11493
- date.dateHash = date.year + '/' + pad(date.month) + '/' + pad(date.day);
11507
+ date.dateHash = pad(date.year, 6) + '/' + pad(date.month) + '/' + pad(date.day);
11494
11508
  date.timeHash = pad(date.hour) + ':' + pad(date.minute) + ':' + pad(date.second) + tzString;
11495
11509
 
11496
11510
  return date
@@ -15878,7 +15892,7 @@
15878
15892
 
15879
15893
  const listenerRE = /^on[A-Z]/;
15880
15894
 
15881
- function useSplitAttrs (attrs) {
15895
+ function useSplitAttrs (attrs, vnode) {
15882
15896
  const acc = {
15883
15897
  listeners: vue.ref({}),
15884
15898
  attributes: vue.ref({})
@@ -15897,6 +15911,12 @@
15897
15911
  }
15898
15912
  });
15899
15913
 
15914
+ Object.keys(vnode.props).forEach(key => {
15915
+ if (listenerRE.test(key) === true) {
15916
+ listeners[ key ] = vnode.props[ key ];
15917
+ }
15918
+ });
15919
+
15900
15920
  acc.listeners.value = listeners;
15901
15921
  acc.attributes.value = attributes;
15902
15922
  }
@@ -16059,12 +16079,12 @@
16059
16079
  ],
16060
16080
 
16061
16081
  setup (props, { slots, emit, attrs }) {
16062
- const { proxy } = vue.getCurrentInstance();
16082
+ const { proxy, vnode } = vue.getCurrentInstance();
16063
16083
  const { $q } = proxy;
16064
16084
 
16065
16085
  const isDark = useDark(props, $q);
16066
16086
  const { inFullscreen, toggleFullscreen } = useFullscreen();
16067
- const splitAttrs = useSplitAttrs(attrs);
16087
+ const splitAttrs = useSplitAttrs(attrs, vnode);
16068
16088
 
16069
16089
  const rootRef = vue.ref(null);
16070
16090
  const contentRef = vue.ref(null);
@@ -17747,7 +17767,7 @@
17747
17767
  const useFieldEmits = [ 'update:modelValue', 'clear', 'focus', 'blur', 'popup-show', 'popup-hide' ];
17748
17768
 
17749
17769
  function useFieldState () {
17750
- const { props, attrs, proxy } = vue.getCurrentInstance();
17770
+ const { props, attrs, proxy, vnode } = vue.getCurrentInstance();
17751
17771
 
17752
17772
  const isDark = useDark(props, proxy.$q);
17753
17773
 
@@ -17760,9 +17780,9 @@
17760
17780
 
17761
17781
  innerLoading: vue.ref(false),
17762
17782
  focused: vue.ref(false),
17763
- hasPopupOpen: vue.ref(false),
17783
+ hasPopupOpen: false,
17764
17784
 
17765
- splitAttrs: useSplitAttrs(attrs),
17785
+ splitAttrs: useSplitAttrs(attrs, vnode),
17766
17786
  targetUid: vue.ref(getTargetUid(props.for)),
17767
17787
 
17768
17788
  rootRef: vue.ref(null),
@@ -17973,7 +17993,7 @@
17973
17993
  focusoutTimer = setTimeout(() => {
17974
17994
  if (
17975
17995
  document.hasFocus() === true && (
17976
- state.hasPopupOpen.value === true
17996
+ state.hasPopupOpen === true
17977
17997
  || (
17978
17998
  state.controlRef !== void 0
17979
17999
  && (
@@ -18382,6 +18402,14 @@
18382
18402
  files = [ files[ 0 ] ];
18383
18403
  }
18384
18404
 
18405
+ // Avoid duplicate files
18406
+ const filenameMap = currentFileList.map(entry => entry.name);
18407
+ files = filterFiles(files, rejectedFiles, 'duplicate', file => {
18408
+ return filenameMap.includes(file.name) === false
18409
+ });
18410
+
18411
+ if (files.length === 0) { return done() }
18412
+
18385
18413
  if (props.maxTotalSize !== void 0) {
18386
18414
  let size = append === true
18387
18415
  ? currentFileList.reduce((total, file) => total + file.size, 0)
@@ -19645,6 +19673,8 @@
19645
19673
  }
19646
19674
  });
19647
19675
 
19676
+ const { passive: passive$3 } = listenOpts;
19677
+
19648
19678
  var QInfiniteScroll = createComponent({
19649
19679
  name: 'QInfiniteScroll',
19650
19680
 
@@ -19672,20 +19702,21 @@
19672
19702
  emits: [ 'load' ],
19673
19703
 
19674
19704
  setup (props, { slots, emit }) {
19675
- const fetching = vue.ref(false);
19705
+ const isFetching = vue.ref(false);
19706
+ const isWorking = vue.ref(true);
19676
19707
  const rootRef = vue.ref(null);
19677
19708
 
19678
19709
  let index = props.initialIndex || 0;
19679
- let isWorking = true;
19710
+ let scrollPos = false;
19680
19711
  let localScrollTarget, poll;
19681
19712
 
19682
19713
  const classes = vue.computed(() =>
19683
19714
  'q-infinite-scroll__loading'
19684
- + (fetching.value === true ? '' : ' invisible')
19715
+ + (isFetching.value === true ? '' : ' invisible')
19685
19716
  );
19686
19717
 
19687
19718
  function immediatePoll () {
19688
- if (props.disable === true || fetching.value === true || isWorking === false) {
19719
+ if (props.disable === true || isFetching.value === true || isWorking.value === false) {
19689
19720
  return
19690
19721
  }
19691
19722
 
@@ -19707,18 +19738,18 @@
19707
19738
  }
19708
19739
 
19709
19740
  function trigger () {
19710
- if (props.disable === true || fetching.value === true || isWorking === false) {
19741
+ if (props.disable === true || isFetching.value === true || isWorking.value === false) {
19711
19742
  return
19712
19743
  }
19713
19744
 
19714
19745
  index++;
19715
- fetching.value = true;
19746
+ isFetching.value = true;
19716
19747
 
19717
19748
  const heightBefore = getScrollHeight(localScrollTarget);
19718
19749
 
19719
19750
  emit('load', index, isDone => {
19720
- if (isWorking === true) {
19721
- fetching.value = false;
19751
+ if (isWorking.value === true) {
19752
+ isFetching.value = false;
19722
19753
  vue.nextTick(() => {
19723
19754
  if (props.reverse === true) {
19724
19755
  const
@@ -19745,31 +19776,31 @@
19745
19776
  }
19746
19777
 
19747
19778
  function resume () {
19748
- if (isWorking === false) {
19749
- isWorking = true;
19750
- localScrollTarget.addEventListener('scroll', poll, listenOpts.passive);
19779
+ if (isWorking.value === false) {
19780
+ isWorking.value = true;
19781
+ localScrollTarget.addEventListener('scroll', poll, passive$3);
19751
19782
  }
19752
19783
 
19753
19784
  immediatePoll();
19754
19785
  }
19755
19786
 
19756
19787
  function stop () {
19757
- if (isWorking === true) {
19758
- isWorking = false;
19759
- fetching.value = false;
19760
- localScrollTarget.removeEventListener('scroll', poll, listenOpts.passive);
19788
+ if (isWorking.value === true) {
19789
+ isWorking.value = false;
19790
+ isFetching.value = false;
19791
+ localScrollTarget.removeEventListener('scroll', poll, passive$3);
19761
19792
  }
19762
19793
  }
19763
19794
 
19764
19795
  function updateScrollTarget () {
19765
- if (localScrollTarget && isWorking === true) {
19766
- localScrollTarget.removeEventListener('scroll', poll, listenOpts.passive);
19796
+ if (localScrollTarget && isWorking.value === true) {
19797
+ localScrollTarget.removeEventListener('scroll', poll, passive$3);
19767
19798
  }
19768
19799
 
19769
19800
  localScrollTarget = getScrollTarget(rootRef.value, props.scrollTarget);
19770
19801
 
19771
- if (isWorking === true) {
19772
- localScrollTarget.addEventListener('scroll', poll, listenOpts.passive);
19802
+ if (isWorking.value === true) {
19803
+ localScrollTarget.addEventListener('scroll', poll, passive$3);
19773
19804
  }
19774
19805
  }
19775
19806
 
@@ -19793,30 +19824,44 @@
19793
19824
  ? immediatePoll
19794
19825
  : debounce(immediatePoll, isNaN(val) === true ? 100 : val);
19795
19826
 
19796
- if (localScrollTarget && isWorking === true) {
19827
+ if (localScrollTarget && isWorking.value === true) {
19797
19828
  if (oldPoll !== void 0) {
19798
- localScrollTarget.removeEventListener('scroll', oldPoll, listenOpts.passive);
19829
+ localScrollTarget.removeEventListener('scroll', oldPoll, passive$3);
19799
19830
  }
19800
19831
 
19801
- localScrollTarget.addEventListener('scroll', poll, listenOpts.passive);
19832
+ localScrollTarget.addEventListener('scroll', poll, passive$3);
19802
19833
  }
19803
19834
  }
19804
19835
 
19805
19836
  vue.watch(() => props.disable, val => {
19806
- if (val === true) {
19807
- stop();
19808
- }
19809
- else {
19810
- resume();
19837
+ if (val === true) { stop(); }
19838
+ else { resume(); }
19839
+ });
19840
+
19841
+ vue.watch(() => props.reverse, val => {
19842
+ if (isFetching.value === false && isWorking.value === true) {
19843
+ immediatePoll();
19811
19844
  }
19812
19845
  });
19813
19846
 
19814
19847
  vue.watch(() => props.scrollTarget, updateScrollTarget);
19815
19848
  vue.watch(() => props.debounce, setDebounce);
19816
19849
 
19850
+ vue.onActivated(() => {
19851
+ if (localScrollTarget && scrollPos !== false) {
19852
+ setVerticalScrollPosition(localScrollTarget, scrollPos);
19853
+ }
19854
+ });
19855
+
19856
+ vue.onDeactivated(() => {
19857
+ scrollPos = localScrollTarget
19858
+ ? getVerticalScrollPosition(localScrollTarget)
19859
+ : false;
19860
+ });
19861
+
19817
19862
  vue.onBeforeUnmount(() => {
19818
- if (isWorking === true) {
19819
- localScrollTarget.removeEventListener('scroll', poll, listenOpts.passive);
19863
+ if (isWorking.value === true) {
19864
+ localScrollTarget.removeEventListener('scroll', poll, passive$3);
19820
19865
  }
19821
19866
  });
19822
19867
 
@@ -19839,7 +19884,7 @@
19839
19884
  return () => {
19840
19885
  const child = hUniqueSlot(slots.default, []);
19841
19886
 
19842
- if (props.disable !== true && isWorking === true) {
19887
+ if (props.disable !== true && isWorking.value === true) {
19843
19888
  child[ props.reverse === false ? 'push' : 'unshift' ](
19844
19889
  vue.h('div', { class: classes.value }, hSlot(slots.loading))
19845
19890
  );
@@ -20977,6 +21022,10 @@
20977
21022
 
20978
21023
  once: Boolean,
20979
21024
  transition: String,
21025
+ transitionDuration: {
21026
+ type: [ String, Number ],
21027
+ default: 300
21028
+ },
20980
21029
 
20981
21030
  ssrPrerender: Boolean,
20982
21031
 
@@ -21022,6 +21071,10 @@
21022
21071
  ] ]
21023
21072
  });
21024
21073
 
21074
+ const transitionStyle = vue.computed(
21075
+ () => `--q-transition-duration: ${ props.transitionDuration }ms`
21076
+ );
21077
+
21025
21078
  function trigger (entry) {
21026
21079
  if (showing.value !== entry.isIntersecting) {
21027
21080
  showing.value = entry.isIntersecting;
@@ -21031,7 +21084,7 @@
21031
21084
 
21032
21085
  function getContent () {
21033
21086
  return showing.value === true
21034
- ? [ vue.h('div', { key: 'content' }, hSlot(slots.default)) ]
21087
+ ? [ vue.h('div', { key: 'content', style: transitionStyle.value }, hSlot(slots.default)) ]
21035
21088
  : void 0
21036
21089
  }
21037
21090
 
@@ -23202,6 +23255,10 @@
23202
23255
 
23203
23256
  const type = vue.ref(getType());
23204
23257
 
23258
+ const popupProps = vue.computed(() => (
23259
+ type.value === 'menu' ? { maxHeight: '99vh' } : {})
23260
+ );
23261
+
23205
23262
  vue.watch(() => getType(), val => {
23206
23263
  if (showing.value !== true) {
23207
23264
  type.value = val;
@@ -23227,21 +23284,9 @@
23227
23284
  }
23228
23285
 
23229
23286
  return () => {
23230
- const def = hSlot(slots.default);
23231
-
23232
- const popupProps = (
23233
- type.value === 'menu'
23234
- && def !== void 0
23235
- && def[ 0 ] !== void 0
23236
- && def[ 0 ].type !== void 0
23237
- && [ 'QDate', 'QTime', 'QCarousel', 'QColor' ].includes(
23238
- def[ 0 ].type.name
23239
- )
23240
- ) ? { cover: true, maxHeight: '99vh' } : {};
23241
-
23242
23287
  const data = {
23243
23288
  ref: popupRef,
23244
- ...popupProps,
23289
+ ...popupProps.value,
23245
23290
  ...attrs,
23246
23291
  onShow,
23247
23292
  onHide
@@ -23262,7 +23307,7 @@
23262
23307
  });
23263
23308
  }
23264
23309
 
23265
- return vue.h(component, data, () => def)
23310
+ return vue.h(component, data, slots.default)
23266
23311
  }
23267
23312
  }
23268
23313
  });
@@ -23305,6 +23350,11 @@
23305
23350
  query: Boolean,
23306
23351
  rounded: Boolean,
23307
23352
 
23353
+ animationSpeed: {
23354
+ type: [ String, Number ],
23355
+ default: 2100
23356
+ },
23357
+
23308
23358
  instantFeedback: Boolean
23309
23359
  },
23310
23360
 
@@ -23314,6 +23364,10 @@
23314
23364
  const sizeStyle = useSize(props, defaultSizes);
23315
23365
 
23316
23366
  const motion = vue.computed(() => props.indeterminate === true || props.query === true);
23367
+ const style = vue.computed(() => ({
23368
+ ...(sizeStyle.value !== null ? sizeStyle.value : {}),
23369
+ '--q-linear-progress-speed': `${ props.animationSpeed }ms`
23370
+ }));
23317
23371
 
23318
23372
  const classes = vue.computed(() =>
23319
23373
  'q-linear-progress'
@@ -23364,7 +23418,7 @@
23364
23418
 
23365
23419
  return vue.h('div', {
23366
23420
  class: classes.value,
23367
- style: sizeStyle.value,
23421
+ style: style.value,
23368
23422
  role: 'progressbar',
23369
23423
  'aria-valuemin': 0,
23370
23424
  'aria-valuemax': 1,
@@ -24503,7 +24557,7 @@
24503
24557
  );
24504
24558
 
24505
24559
  const mainStyle = vue.computed(() => (
24506
- scroll.vertical.thumbHidden.value === true || scroll.horizontal.thumbHidden.value === true
24560
+ scroll.vertical.thumbHidden.value === true && scroll.horizontal.thumbHidden.value === true
24507
24561
  ? props.contentStyle
24508
24562
  : props.contentActiveStyle
24509
24563
  ));
@@ -25451,6 +25505,22 @@
25451
25505
  setVirtualScrollSize();
25452
25506
  });
25453
25507
 
25508
+ vue.onActivated(() => {
25509
+ const scrollEl = getVirtualScrollTarget();
25510
+
25511
+ if (prevScrollStart !== void 0 && scrollEl !== void 0 && scrollEl !== null && scrollEl.nodeType !== 8) {
25512
+ setScroll(
25513
+ scrollEl,
25514
+ prevScrollStart,
25515
+ props.virtualScrollHorizontal,
25516
+ $q.lang.rtl
25517
+ );
25518
+ }
25519
+ else {
25520
+ scrollTo(prevToIndex);
25521
+ }
25522
+ });
25523
+
25454
25524
  setOverflowAnchor !== noop && vue.onBeforeUnmount(() => {
25455
25525
  const styleSheet = document.getElementById(vsId + '_ss');
25456
25526
  styleSheet !== null && styleSheet.remove();
@@ -26384,6 +26454,12 @@
26384
26454
  }
26385
26455
 
26386
26456
  function getAllOptions () {
26457
+ if (noOptions.value === true) {
26458
+ return slots[ 'no-option' ] !== void 0
26459
+ ? slots[ 'no-option' ]({ inputValue: inputValue.value })
26460
+ : void 0
26461
+ }
26462
+
26387
26463
  const fn = slots.option !== void 0
26388
26464
  ? slots.option
26389
26465
  : scope => {
@@ -26565,14 +26641,6 @@
26565
26641
  }
26566
26642
 
26567
26643
  function getMenu () {
26568
- const child = noOptions.value === true
26569
- ? (
26570
- slots[ 'no-option' ] !== void 0
26571
- ? () => slots[ 'no-option' ]({ inputValue: inputValue.value })
26572
- : void 0
26573
- )
26574
- : getAllOptions;
26575
-
26576
26644
  return vue.h(QMenu, {
26577
26645
  ref: menuRef,
26578
26646
  class: menuContentClass.value,
@@ -26597,7 +26665,7 @@
26597
26665
  onBeforeShow: onControlPopupShow,
26598
26666
  onBeforeHide: onMenuBeforeHide,
26599
26667
  onShow: onMenuShow
26600
- }, child)
26668
+ }, getAllOptions)
26601
26669
  }
26602
26670
 
26603
26671
  function onMenuBeforeHide (e) {
@@ -26626,7 +26694,7 @@
26626
26694
  function getDialog () {
26627
26695
  const content = [
26628
26696
  vue.h(QField, {
26629
- class: `col-auto ${ state.fieldClass }`,
26697
+ class: `col-auto ${ state.fieldClass.value }`,
26630
26698
  ...innerFieldProps.value,
26631
26699
  for: state.targetUid.value,
26632
26700
  dark: isOptionsDark.value,
@@ -26654,15 +26722,7 @@
26654
26722
  ...listboxAttrs.value,
26655
26723
  onClick: prevent,
26656
26724
  onScrollPassive: onVirtualScrollEvt
26657
- }, (
26658
- noOptions.value === true
26659
- ? (
26660
- slots[ 'no-option' ] !== void 0
26661
- ? slots[ 'no-option' ]({ inputValue: inputValue.value })
26662
- : null
26663
- )
26664
- : getAllOptions()
26665
- ))
26725
+ }, getAllOptions())
26666
26726
  );
26667
26727
 
26668
26728
  return vue.h(QDialog, {
@@ -26800,14 +26860,14 @@
26800
26860
  function onControlPopupShow (e) {
26801
26861
  e !== void 0 && stop(e);
26802
26862
  emit('popup-show', e);
26803
- state.hasPopupOpen.value = true;
26863
+ state.hasPopupOpen = true;
26804
26864
  state.onControlFocusin(e);
26805
26865
  }
26806
26866
 
26807
26867
  function onControlPopupHide (e) {
26808
26868
  e !== void 0 && stop(e);
26809
26869
  emit('popup-hide', e);
26810
- state.hasPopupOpen.value = false;
26870
+ state.hasPopupOpen = false;
26811
26871
  state.onControlFocusout(e);
26812
26872
  }
26813
26873
 
@@ -26879,6 +26939,10 @@
26879
26939
  ) {
26880
26940
  return hasDialog === true ? getDialog() : getMenu()
26881
26941
  }
26942
+ else if (state.hasPopupOpen === true) {
26943
+ // explicitly set it otherwise TAB will not blur component
26944
+ state.hasPopupOpen = false;
26945
+ }
26882
26946
  },
26883
26947
 
26884
26948
  controlEvents: {
@@ -30246,7 +30310,7 @@
30246
30310
  default: () => [ 5, 7, 10, 15, 20, 25, 50, 0 ]
30247
30311
  },
30248
30312
 
30249
- 'onUpdate:pagination': Function
30313
+ 'onUpdate:pagination': [ Function, Array ]
30250
30314
  };
30251
30315
 
30252
30316
  function useTablePaginationState (vm, getCellValue) {
@@ -30296,7 +30360,7 @@
30296
30360
  ...val
30297
30361
  });
30298
30362
 
30299
- if (samePagination(computedPagination.value, newPagination)) {
30363
+ if (samePagination(computedPagination.value, newPagination) === true) {
30300
30364
  if (isServerSide.value === true && forceServerRequest === true) {
30301
30365
  sendServerRequest(newPagination);
30302
30366
  }
@@ -32439,21 +32503,22 @@
32439
32503
  function setHour (hour) {
32440
32504
  if (innerModel.value.hour !== hour) {
32441
32505
  innerModel.value.hour = hour;
32442
- innerModel.value.minute = null;
32443
- innerModel.value.second = null;
32506
+ verifyAndUpdate();
32444
32507
  }
32445
32508
  }
32446
32509
 
32447
32510
  function setMinute (minute) {
32448
32511
  if (innerModel.value.minute !== minute) {
32449
32512
  innerModel.value.minute = minute;
32450
- innerModel.value.second = null;
32451
- props.withSeconds !== true && updateValue({ minute });
32513
+ verifyAndUpdate();
32452
32514
  }
32453
32515
  }
32454
32516
 
32455
32517
  function setSecond (second) {
32456
- innerModel.value.second !== second && updateValue({ second });
32518
+ if (innerModel.value.second !== second) {
32519
+ innerModel.value.second = second;
32520
+ verifyAndUpdate();
32521
+ }
32457
32522
  }
32458
32523
 
32459
32524
  const setModel = {
@@ -32877,6 +32942,8 @@
32877
32942
  }
32878
32943
  });
32879
32944
 
32945
+ const tickStrategyOptions = [ 'none', 'strict', 'leaf', 'leaf-filtered' ];
32946
+
32880
32947
  var QTree = createComponent({
32881
32948
  name: 'QTree',
32882
32949
 
@@ -32900,6 +32967,8 @@
32900
32967
  default: 'children'
32901
32968
  },
32902
32969
 
32970
+ dense: Boolean,
32971
+
32903
32972
  color: String,
32904
32973
  controlColor: String,
32905
32974
  textColor: String,
@@ -32910,7 +32979,7 @@
32910
32979
  tickStrategy: {
32911
32980
  type: String,
32912
32981
  default: 'none',
32913
- validator: v => [ 'none', 'strict', 'leaf', 'leaf-filtered' ].includes(v)
32982
+ validator: v => tickStrategyOptions.includes(v)
32914
32983
  },
32915
32984
  ticked: Array, // v-model:ticked
32916
32985
  expanded: Array, // v-model:expanded
@@ -32955,7 +33024,7 @@
32955
33024
  });
32956
33025
 
32957
33026
  const classes = vue.computed(() =>
32958
- 'q-tree'
33027
+ `q-tree q-tree--${ props.dense === true ? 'dense' : 'standard' }`
32959
33028
  + (props.noConnectors === true ? ' q-tree--no-connectors' : '')
32960
33029
  + (isDark.value === true ? ' q-tree--dark' : '')
32961
33030
  + (props.color !== void 0 ? ` text-${ props.color }` : '')
@@ -33397,13 +33466,13 @@
33397
33466
 
33398
33467
  m.lazy === 'loading'
33399
33468
  ? vue.h(QSpinner, {
33400
- class: 'q-tree__spinner q-mr-xs',
33469
+ class: 'q-tree__spinner',
33401
33470
  color: computedControlColor.value
33402
33471
  })
33403
33472
  : (
33404
33473
  isParent === true
33405
33474
  ? vue.h(QIcon, {
33406
- class: 'q-tree__arrow q-mr-xs'
33475
+ class: 'q-tree__arrow'
33407
33476
  + (m.expanded === true ? ' q-tree__arrow--rotate' : ''),
33408
33477
  name: computedIcon.value,
33409
33478
  onClick (e) { onExpandClick(node, m, e); }
@@ -33413,7 +33482,7 @@
33413
33482
 
33414
33483
  m.hasTicking === true && m.noTick !== true
33415
33484
  ? vue.h(QCheckbox, {
33416
- class: 'q-mr-xs',
33485
+ class: 'q-tree__tickbox',
33417
33486
  modelValue: m.indeterminate === true ? null : m.ticked,
33418
33487
  color: computedControlColor.value,
33419
33488
  dark: isDark.value,
@@ -33805,20 +33874,15 @@
33805
33874
  }
33806
33875
 
33807
33876
  function addFilesToQueue (e, fileList) {
33808
- const processedFiles = processFiles(e, fileList, state.files.value, true);
33809
-
33810
- if (processedFiles === void 0) { return }
33877
+ const localFiles = processFiles(e, fileList, state.files.value, true);
33811
33878
 
33812
- const localFiles = processedFiles
33813
- .filter(file => state.files.value.findIndex(f => file.name === f.name) === -1);
33879
+ if (localFiles === void 0) { return }
33814
33880
 
33815
33881
  const fileInput = getFileInput();
33816
33882
  if (fileInput !== void 0 && fileInput !== null) {
33817
33883
  fileInput.value = '';
33818
33884
  }
33819
33885
 
33820
- if (localFiles === void 0) { return }
33821
-
33822
33886
  localFiles.forEach(file => {
33823
33887
  state.updateFileStatus(file, 'idle');
33824
33888
  uploadSize.value += file.size;
@@ -34025,6 +34089,20 @@
34025
34089
  }
34026
34090
  }
34027
34091
 
34092
+ const trueFn = () => true;
34093
+
34094
+ function getEmitsObject (emitsArray) {
34095
+ const emitsObject = {};
34096
+
34097
+ emitsArray.forEach(val => {
34098
+ emitsObject[ val ] = trueFn;
34099
+ });
34100
+
34101
+ return emitsObject
34102
+ }
34103
+
34104
+ const coreEmitsObject = getEmitsObject(coreEmits);
34105
+
34028
34106
  var createUploaderComponent = ({ name, props, emits, injectPlugin }) => createComponent({
34029
34107
  name,
34030
34108
 
@@ -34033,10 +34111,9 @@
34033
34111
  ...props
34034
34112
  },
34035
34113
 
34036
- emits: [
34037
- ...coreEmits,
34038
- ...emits
34039
- ],
34114
+ emits: Object(emits) === emits
34115
+ ? { ...coreEmitsObject, ...emits }
34116
+ : [ ...coreEmits, ...emits ],
34040
34117
 
34041
34118
  setup () {
34042
34119
  return getRenderer(injectPlugin)
@@ -34070,7 +34147,7 @@
34070
34147
  factory: Function
34071
34148
  };
34072
34149
 
34073
- const emits = [ 'factory-failed', 'uploaded', 'failed', 'uploading' ];
34150
+ const emits$1 = [ 'factory-failed', 'uploaded', 'failed', 'uploading' ];
34074
34151
 
34075
34152
  function injectPlugin ({ props, emit, helpers }) {
34076
34153
  const xhrs = vue.ref([]);
@@ -34296,7 +34373,7 @@
34296
34373
  var xhrUploaderPlugin = {
34297
34374
  name: 'QUploader',
34298
34375
  props: props$2,
34299
- emits,
34376
+ emits: emits$1,
34300
34377
  injectPlugin
34301
34378
  };
34302
34379
 
@@ -38678,7 +38755,11 @@
38678
38755
  }
38679
38756
  }
38680
38757
 
38681
- useDialogPluginComponent.emits = [ 'ok', 'hide' ];
38758
+ // Don't forget to update the types in "ui/types/composables.d.ts"
38759
+ const emits = [ 'ok', 'hide' ];
38760
+
38761
+ useDialogPluginComponent.emits = emits;
38762
+ useDialogPluginComponent.emitsObject = getEmitsObject(emits);
38682
38763
 
38683
38764
  function useMeta (metaOptions) {
38684
38765
  {
@@ -38734,7 +38815,7 @@
38734
38815
  });
38735
38816
 
38736
38817
  var index_umd = {
38737
- version: '2.2.3',
38818
+ version: '2.3.2',
38738
38819
  install (app, opts) {
38739
38820
  installQuasar(app, {
38740
38821
  components,