quasar 2.4.7 → 2.4.11

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 (142) hide show
  1. package/dist/api/LoadingBar.json +7 -0
  2. package/dist/api/Platform.json +171 -0
  3. package/dist/api/QAjaxBar.json +13 -1
  4. package/dist/api/QFile.json +1 -0
  5. package/dist/api/QTree.json +7 -0
  6. package/dist/api/QUploader.json +3 -1
  7. package/dist/icon-set/bootstrap-icons.umd.prod.js +1 -1
  8. package/dist/icon-set/eva-icons.umd.prod.js +1 -1
  9. package/dist/icon-set/fontawesome-v5-pro.umd.prod.js +1 -1
  10. package/dist/icon-set/fontawesome-v5.umd.prod.js +1 -1
  11. package/dist/icon-set/ionicons-v4.umd.prod.js +1 -1
  12. package/dist/icon-set/line-awesome.umd.prod.js +1 -1
  13. package/dist/icon-set/material-icons-outlined.umd.prod.js +1 -1
  14. package/dist/icon-set/material-icons-round.umd.prod.js +1 -1
  15. package/dist/icon-set/material-icons-sharp.umd.prod.js +1 -1
  16. package/dist/icon-set/material-icons.umd.prod.js +1 -1
  17. package/dist/icon-set/mdi-v3.umd.prod.js +1 -1
  18. package/dist/icon-set/mdi-v4.umd.prod.js +1 -1
  19. package/dist/icon-set/mdi-v5.umd.prod.js +1 -1
  20. package/dist/icon-set/mdi-v6.umd.prod.js +1 -1
  21. package/dist/icon-set/svg-bootstrap-icons.umd.prod.js +1 -1
  22. package/dist/icon-set/svg-eva-icons.umd.prod.js +1 -1
  23. package/dist/icon-set/svg-fontawesome-v5.umd.prod.js +1 -1
  24. package/dist/icon-set/svg-ionicons-v4.umd.prod.js +1 -1
  25. package/dist/icon-set/svg-ionicons-v5.umd.prod.js +1 -1
  26. package/dist/icon-set/svg-ionicons-v6.umd.prod.js +1 -1
  27. package/dist/icon-set/svg-line-awesome.umd.prod.js +1 -1
  28. package/dist/icon-set/svg-material-icons-outlined.umd.prod.js +1 -1
  29. package/dist/icon-set/svg-material-icons-round.umd.prod.js +1 -1
  30. package/dist/icon-set/svg-material-icons-sharp.umd.prod.js +1 -1
  31. package/dist/icon-set/svg-material-icons.umd.prod.js +1 -1
  32. package/dist/icon-set/svg-mdi-v4.umd.prod.js +1 -1
  33. package/dist/icon-set/svg-mdi-v5.umd.prod.js +1 -1
  34. package/dist/icon-set/svg-mdi-v6.umd.prod.js +1 -1
  35. package/dist/icon-set/svg-themify.umd.prod.js +1 -1
  36. package/dist/icon-set/themify.umd.prod.js +1 -1
  37. package/dist/lang/ar.umd.prod.js +1 -1
  38. package/dist/lang/az-Latn.umd.prod.js +1 -1
  39. package/dist/lang/bg.umd.prod.js +1 -1
  40. package/dist/lang/bn.umd.prod.js +1 -1
  41. package/dist/lang/ca.umd.prod.js +1 -1
  42. package/dist/lang/cs.umd.prod.js +1 -1
  43. package/dist/lang/da.umd.prod.js +1 -1
  44. package/dist/lang/de.umd.prod.js +1 -1
  45. package/dist/lang/el.umd.prod.js +1 -1
  46. package/dist/lang/en-GB.umd.prod.js +1 -1
  47. package/dist/lang/en-US.umd.prod.js +1 -1
  48. package/dist/lang/eo.umd.prod.js +1 -1
  49. package/dist/lang/es.umd.prod.js +1 -1
  50. package/dist/lang/et.umd.prod.js +1 -1
  51. package/dist/lang/fa-IR.umd.prod.js +1 -1
  52. package/dist/lang/fa.umd.prod.js +1 -1
  53. package/dist/lang/fi.umd.prod.js +1 -1
  54. package/dist/lang/fr.umd.prod.js +1 -1
  55. package/dist/lang/gn.umd.prod.js +1 -1
  56. package/dist/lang/he.umd.prod.js +1 -1
  57. package/dist/lang/hr.umd.prod.js +1 -1
  58. package/dist/lang/hu.umd.prod.js +1 -1
  59. package/dist/lang/id.umd.prod.js +1 -1
  60. package/dist/lang/is.umd.prod.js +1 -1
  61. package/dist/lang/it.umd.prod.js +1 -1
  62. package/dist/lang/ja.umd.prod.js +1 -1
  63. package/dist/lang/km.umd.prod.js +1 -1
  64. package/dist/lang/ko-KR.umd.prod.js +1 -1
  65. package/dist/lang/kur-CKB.umd.prod.js +1 -1
  66. package/dist/lang/lt.umd.prod.js +1 -1
  67. package/dist/lang/lu.umd.prod.js +1 -1
  68. package/dist/lang/lv.umd.prod.js +1 -1
  69. package/dist/lang/ml.umd.prod.js +1 -1
  70. package/dist/lang/ms.umd.prod.js +1 -1
  71. package/dist/lang/my.umd.prod.js +6 -0
  72. package/dist/lang/nb-NO.umd.prod.js +1 -1
  73. package/dist/lang/nl.umd.prod.js +1 -1
  74. package/dist/lang/pl.umd.prod.js +1 -1
  75. package/dist/lang/pt-BR.umd.prod.js +1 -1
  76. package/dist/lang/pt.umd.prod.js +1 -1
  77. package/dist/lang/ro.umd.prod.js +1 -1
  78. package/dist/lang/ru.umd.prod.js +1 -1
  79. package/dist/lang/sk.umd.prod.js +1 -1
  80. package/dist/lang/sl.umd.prod.js +1 -1
  81. package/dist/lang/sr-CYR.umd.prod.js +1 -1
  82. package/dist/lang/sr.umd.prod.js +1 -1
  83. package/dist/lang/sv.umd.prod.js +1 -1
  84. package/dist/lang/ta.umd.prod.js +1 -1
  85. package/dist/lang/th.umd.prod.js +1 -1
  86. package/dist/lang/tr.umd.prod.js +1 -1
  87. package/dist/lang/ug.umd.prod.js +1 -1
  88. package/dist/lang/uk.umd.prod.js +1 -1
  89. package/dist/lang/vi.umd.prod.js +1 -1
  90. package/dist/lang/zh-CN.umd.prod.js +1 -1
  91. package/dist/lang/zh-TW.umd.prod.js +1 -1
  92. package/dist/quasar.cjs.prod.js +2 -2
  93. package/dist/quasar.css +7 -4
  94. package/dist/quasar.esm.prod.js +2 -2
  95. package/dist/quasar.prod.css +1 -1
  96. package/dist/quasar.rtl.css +7 -4
  97. package/dist/quasar.rtl.prod.css +1 -1
  98. package/dist/quasar.sass +8 -4
  99. package/dist/quasar.umd.js +176 -81
  100. package/dist/quasar.umd.prod.js +2 -2
  101. package/dist/ssr-directives/Morph.js +1 -1
  102. package/dist/types/api/qfile.d.ts +8 -0
  103. package/dist/types/api/qselect.d.ts +4 -0
  104. package/dist/types/api/qtable.d.ts +12 -0
  105. package/dist/types/api/qtree.d.ts +31 -0
  106. package/dist/types/api/quploader.d.ts +28 -0
  107. package/dist/types/api/touchswipe.d.ts +11 -0
  108. package/dist/types/api/validation.d.ts +1 -1
  109. package/dist/types/api.d.ts +6 -0
  110. package/dist/types/index.d.ts +422 -314
  111. package/dist/types/ts-helpers.d.ts +6 -2
  112. package/dist/types/utils.d.ts +4 -1
  113. package/dist/vetur/quasar-attributes.json +4 -0
  114. package/dist/vetur/quasar-tags.json +1 -0
  115. package/dist/web-types/web-types.json +11 -1
  116. package/lang/index.json +4 -0
  117. package/lang/my.js +90 -0
  118. package/package.json +1 -1
  119. package/src/components/ajax-bar/QAjaxBar.js +22 -12
  120. package/src/components/ajax-bar/QAjaxBar.json +16 -1
  121. package/src/components/date/QDate.js +6 -1
  122. package/src/components/dialog-plugin/DialogPlugin.js +1 -1
  123. package/src/components/form/QForm.js +11 -1
  124. package/src/components/icon/QIcon.js +4 -9
  125. package/src/components/icon/QIcon.sass +4 -3
  126. package/src/components/infinite-scroll/QInfiniteScroll.js +3 -2
  127. package/src/components/scroll-area/QScrollArea.js +36 -11
  128. package/src/components/scroll-observer/QScrollObserver.js +12 -10
  129. package/src/components/select/QSelect.js +20 -19
  130. package/src/components/select/QSelect.sass +3 -0
  131. package/src/components/tabs/QTabs.js +10 -2
  132. package/src/components/tree/QTree.js +8 -1
  133. package/src/components/tree/QTree.json +8 -0
  134. package/src/components/uploader/uploader-core.js +2 -0
  135. package/src/components/uploader/xhr-uploader-plugin.json +2 -1
  136. package/src/components/virtual-scroll/use-virtual-scroll.js +11 -3
  137. package/src/composables/private/use-field.js +13 -1
  138. package/src/composables/private/use-file.json +1 -0
  139. package/src/plugins/LoadingBar.js +3 -3
  140. package/src/plugins/LoadingBar.json +8 -0
  141. package/src/plugins/Platform.js +15 -8
  142. package/src/plugins/Platform.json +166 -0
package/dist/quasar.sass CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Quasar Framework v2.4.7
2
+ * Quasar Framework v2.4.11
3
3
  * (c) 2015-present Razvan Stoenescu
4
4
  * Released under the MIT License.
5
5
  */
@@ -661,9 +661,10 @@ input[type='search']::-webkit-search-decoration
661
661
  display: flex !important
662
662
  align-items: center
663
663
  justify-content: center
664
- > svg
665
- width: 100%
666
- height: 100%
664
+ > svg,
665
+ > img
666
+ width: 1em
667
+ height: 1em
667
668
  .q-icon,
668
669
  .material-icons,
669
670
  .material-icons-outlined,
@@ -3261,7 +3262,10 @@ body.desktop
3261
3262
  min-width: 50px !important
3262
3263
  &--padding
3263
3264
  padding-left: 4px
3265
+ &__focus-target,
3264
3266
  &__autocomplete-input
3267
+ position: absolute
3268
+ outline: 0 !important
3265
3269
  width: 0
3266
3270
  height: 0
3267
3271
  padding: 0
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Quasar Framework v2.4.7
2
+ * Quasar Framework v2.4.11
3
3
  * (c) 2015-present Razvan Stoenescu
4
4
  * Released under the MIT License.
5
5
  */
@@ -40,19 +40,15 @@
40
40
  let iosCorrection;
41
41
 
42
42
  function getMatch (userAgent, platformMatch) {
43
- const match = /(edge|edga|edgios)\/([\w.]+)/.exec(userAgent)
43
+ const match = /(edg|edge|edga|edgios)\/([\w.]+)/.exec(userAgent)
44
44
  || /(opr)[\/]([\w.]+)/.exec(userAgent)
45
45
  || /(vivaldi)[\/]([\w.]+)/.exec(userAgent)
46
46
  || /(chrome|crios)[\/]([\w.]+)/.exec(userAgent)
47
- || /(iemobile)[\/]([\w.]+)/.exec(userAgent)
48
47
  || /(version)(applewebkit)[\/]([\w.]+).*(safari)[\/]([\w.]+)/.exec(userAgent)
49
48
  || /(webkit)[\/]([\w.]+).*(version)[\/]([\w.]+).*(safari)[\/]([\w.]+)/.exec(userAgent)
50
49
  || /(firefox|fxios)[\/]([\w.]+)/.exec(userAgent)
51
50
  || /(webkit)[\/]([\w.]+)/.exec(userAgent)
52
51
  || /(opera)(?:.*version|)[\/]([\w.]+)/.exec(userAgent)
53
- || /(msie) ([\w.]+)/.exec(userAgent)
54
- || (userAgent.indexOf('trident') >= 0 && /(rv)(?::| )([\w.]+)/.exec(userAgent))
55
- || (userAgent.indexOf('compatible') < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(userAgent))
56
52
  || [];
57
53
 
58
54
  return {
@@ -75,6 +71,8 @@
75
71
  || /(mac)/.exec(userAgent)
76
72
  || /(linux)/.exec(userAgent)
77
73
  || /(cros)/.exec(userAgent)
74
+ // TODO: Remove BlackBerry detection. BlackBerry OS, BlackBerry 10, and BlackBerry PlayBook OS
75
+ // is officially dead as of January 4, 2022 (https://www.blackberry.com/us/en/support/devices/end-of-life)
78
76
  || /(playbook)/.exec(userAgent)
79
77
  || /(bb)/.exec(userAgent)
80
78
  || /(blackberry)/.exec(userAgent)
@@ -164,6 +162,10 @@
164
162
  delete browser[ 'windows phone' ];
165
163
  }
166
164
 
165
+ // TODO: The assumption about WebKit based browsers below is not completely accurate.
166
+ // Google released Blink(a fork of WebKit) engine on April 3, 2013, which is really different than WebKit today.
167
+ // Today, one might want to check for WebKit to deal with its bugs, which is used on all browsers on iOS, and Safari browser on all platforms.
168
+
167
169
  // Chrome, Opera 15+, Vivaldi and Safari are webkit based browsers
168
170
  if (
169
171
  browser.chrome
@@ -180,8 +182,15 @@
180
182
  browser.webkit = true;
181
183
  }
182
184
 
185
+ // TODO: (Qv3) rename the terms 'edge' to 'edge legacy'(or remove it) then 'edge chromium' to 'edge' to match with the known up-to-date terms
186
+ // Microsoft Edge is the new Chromium-based browser. Microsoft Edge Legacy is the old EdgeHTML-based browser (EOL: March 9, 2021).
187
+ if (browser.edg) {
188
+ matched.browser = 'edgechromium';
189
+ browser.edgeChromium = true;
190
+ }
191
+
183
192
  // Blackberry browsers are marked as Safari on BlackBerry
184
- if (browser.safari && browser.blackberry || browser.bb) {
193
+ if ((browser.safari && browser.blackberry) || browser.bb) {
185
194
  matched.browser = 'blackberry';
186
195
  browser.blackberry = true;
187
196
  }
@@ -1447,7 +1456,7 @@
1447
1456
  }
1448
1457
 
1449
1458
  var installQuasar = function (parentApp, opts = {}) {
1450
- const $q = { version: '2.4.7' };
1459
+ const $q = { version: '2.4.11' };
1451
1460
 
1452
1461
  if (globalConfigIsFrozen === false) {
1453
1462
  if (opts.config !== void 0) {
@@ -1646,7 +1655,7 @@
1646
1655
  const onScreen = vue.ref(false);
1647
1656
  const animate = vue.ref(true);
1648
1657
 
1649
- let calls = 0, timer, speed;
1658
+ let sessions = 0, timer, speed;
1650
1659
 
1651
1660
  const classes = vue.computed(() =>
1652
1661
  `q-loading-bar q-loading-bar--${ props.position }`
@@ -1692,16 +1701,17 @@
1692
1701
  const oldSpeed = speed;
1693
1702
  speed = Math.max(0, newSpeed) || 0;
1694
1703
 
1695
- calls++;
1704
+ sessions++;
1696
1705
 
1697
- if (calls > 1) {
1706
+ if (sessions > 1) {
1698
1707
  if (oldSpeed === 0 && newSpeed > 0) {
1699
1708
  planNextStep();
1700
1709
  }
1701
1710
  else if (oldSpeed > 0 && newSpeed <= 0) {
1702
1711
  clearTimeout(timer);
1703
1712
  }
1704
- return
1713
+
1714
+ return sessions
1705
1715
  }
1706
1716
 
1707
1717
  clearTimeout(timer);
@@ -1709,25 +1719,32 @@
1709
1719
 
1710
1720
  progress.value = 0;
1711
1721
 
1712
- if (onScreen.value === true) { return }
1713
-
1714
- onScreen.value = true;
1715
- animate.value = false;
1716
1722
  timer = setTimeout(() => {
1717
1723
  animate.value = true;
1718
1724
  newSpeed > 0 && planNextStep();
1719
- }, 100);
1725
+ }, onScreen.value === true ? 500 : 1);
1726
+
1727
+ if (onScreen.value !== true) {
1728
+ onScreen.value = true;
1729
+ animate.value = false;
1730
+ }
1731
+
1732
+ return sessions
1720
1733
  }
1721
1734
 
1722
1735
  function increment (amount) {
1723
- if (calls > 0) {
1736
+ if (sessions > 0) {
1724
1737
  progress.value = inc(progress.value, amount);
1725
1738
  }
1739
+
1740
+ return sessions
1726
1741
  }
1727
1742
 
1728
1743
  function stop () {
1729
- calls = Math.max(0, calls - 1);
1730
- if (calls > 0) { return }
1744
+ sessions = Math.max(0, sessions - 1);
1745
+ if (sessions > 0) {
1746
+ return sessions
1747
+ }
1731
1748
 
1732
1749
  clearTimeout(timer);
1733
1750
  emit('stop');
@@ -1746,6 +1763,8 @@
1746
1763
  else {
1747
1764
  end();
1748
1765
  }
1766
+
1767
+ return sessions
1749
1768
  }
1750
1769
 
1751
1770
  function planNextStep () {
@@ -2032,27 +2051,22 @@
2032
2051
  }
2033
2052
 
2034
2053
  if (type.value.img === true) {
2035
- return vue.h('div', data, hMergeSlot(slots.default, [
2036
- vue.h('img', {
2037
- class: type.value.cls,
2038
- src: type.value.src
2039
- })
2054
+ return vue.h('span', data, hMergeSlot(slots.default, [
2055
+ vue.h('img', { src: type.value.src })
2040
2056
  ]))
2041
2057
  }
2042
2058
 
2043
2059
  if (type.value.svg === true) {
2044
- return vue.h('div', data, hMergeSlot(slots.default, [
2060
+ return vue.h('span', data, hMergeSlot(slots.default, [
2045
2061
  vue.h('svg', {
2046
- class: type.value.cls,
2047
2062
  viewBox: type.value.viewBox
2048
2063
  }, type.value.nodes)
2049
2064
  ]))
2050
2065
  }
2051
2066
 
2052
2067
  if (type.value.svguse === true) {
2053
- return vue.h('div', data, hMergeSlot(slots.default, [
2068
+ return vue.h('span', data, hMergeSlot(slots.default, [
2054
2069
  vue.h('svg', {
2055
- class: type.value.cls,
2056
2070
  viewBox: type.value.viewBox
2057
2071
  }, [
2058
2072
  vue.h('use', { 'xlink:href': type.value.src })
@@ -9695,7 +9709,15 @@
9695
9709
  unwatchRoute !== void 0 && unwatchRoute();
9696
9710
  });
9697
9711
 
9698
- vue.onActivated(recalculateScroll);
9712
+ let shouldActivate = false;
9713
+
9714
+ vue.onDeactivated(() => {
9715
+ shouldActivate = true;
9716
+ });
9717
+
9718
+ vue.onActivated(() => {
9719
+ shouldActivate === true && recalculateScroll();
9720
+ });
9699
9721
 
9700
9722
  return () => {
9701
9723
  const child = [
@@ -12608,7 +12630,12 @@
12608
12630
  normalizedModel.value
12609
12631
  .filter(date => typeof date === 'string')
12610
12632
  .map(date => decodeString(date, innerMask.value, innerLocale.value))
12611
- .filter(date => date.dateHash !== null)
12633
+ .filter(date =>
12634
+ date.dateHash !== null
12635
+ && date.day !== null
12636
+ && date.month !== null
12637
+ && date.year !== null
12638
+ )
12612
12639
  );
12613
12640
 
12614
12641
  const rangeModel = vue.computed(() => {
@@ -18906,6 +18933,8 @@
18906
18933
  abort: state.abort
18907
18934
  };
18908
18935
 
18936
+ // TODO: the result of this computed, especially the dynamic part, isn't currently typed
18937
+ // This result in an error with Volar when accessing the state (eg. files array)
18909
18938
  const slotScope = vue.computed(() => {
18910
18939
  const acc = {
18911
18940
  canAddFiles: canAddFiles.value,
@@ -20759,6 +20788,8 @@
20759
20788
  name: props.clearIcon || $q.iconSet.field.clear,
20760
20789
  tabindex: 0,
20761
20790
  type: 'button',
20791
+ 'aria-hidden': null,
20792
+ role: null,
20762
20793
  onClick: clearValue
20763
20794
  })
20764
20795
  ])
@@ -20887,6 +20918,16 @@
20887
20918
  // expose public methods
20888
20919
  Object.assign(proxy, { focus, blur });
20889
20920
 
20921
+ let shouldActivate = false;
20922
+
20923
+ vue.onDeactivated(() => {
20924
+ shouldActivate = true;
20925
+ });
20926
+
20927
+ vue.onActivated(() => {
20928
+ shouldActivate === true && props.autofocus === true && proxy.focus();
20929
+ });
20930
+
20890
20931
  vue.onMounted(() => {
20891
20932
  if (isRuntimeSsrPreHydration.value === true && props.for === void 0) {
20892
20933
  state.targetUid.value = getTargetUid();
@@ -21613,6 +21654,16 @@
21613
21654
  }
21614
21655
  });
21615
21656
 
21657
+ let shouldActivate = false;
21658
+
21659
+ vue.onDeactivated(() => {
21660
+ shouldActivate = true;
21661
+ });
21662
+
21663
+ vue.onActivated(() => {
21664
+ shouldActivate === true && props.autofocus === true && focus();
21665
+ });
21666
+
21616
21667
  vue.onMounted(() => {
21617
21668
  props.autofocus === true && focus();
21618
21669
  });
@@ -22170,7 +22221,6 @@
22170
22221
  const rootRef = vue.ref(null);
22171
22222
 
22172
22223
  let index = props.initialIndex || 0;
22173
- let scrollPos = false;
22174
22224
  let localScrollTarget, poll;
22175
22225
 
22176
22226
  const classes = vue.computed(() =>
@@ -22309,8 +22359,10 @@
22309
22359
  vue.watch(() => props.scrollTarget, updateScrollTarget);
22310
22360
  vue.watch(() => props.debounce, setDebounce);
22311
22361
 
22362
+ let scrollPos = false;
22363
+
22312
22364
  vue.onActivated(() => {
22313
- if (localScrollTarget && scrollPos !== false) {
22365
+ if (scrollPos !== false && localScrollTarget) {
22314
22366
  setVerticalScrollPosition(localScrollTarget, scrollPos);
22315
22367
  }
22316
22368
  });
@@ -23911,7 +23963,7 @@
23911
23963
  }
23912
23964
  };
23913
23965
 
23914
- let timer = null, localScrollTarget, parentEl;
23966
+ let clearTimer = null, localScrollTarget, parentEl;
23915
23967
 
23916
23968
  vue.watch(() => props.scrollTarget, () => {
23917
23969
  unconfigureScrollTarget();
@@ -23919,9 +23971,7 @@
23919
23971
  });
23920
23972
 
23921
23973
  function emitEvent () {
23922
- clearTimeout(timer);
23923
- cancelAnimationFrame(timer);
23924
- timer = null;
23974
+ clearTimer !== null && clearTimer();
23925
23975
 
23926
23976
  const top = Math.max(0, getVerticalScrollPosition(localScrollTarget));
23927
23977
  const left = getHorizontalScrollPosition(localScrollTarget);
@@ -23971,10 +24021,15 @@
23971
24021
  if (immediately === true || props.debounce === 0 || props.debounce === '0') {
23972
24022
  emitEvent();
23973
24023
  }
23974
- else if (timer === null) {
23975
- timer = props.debounce
23976
- ? setTimeout(emitEvent, props.debounce)
23977
- : requestAnimationFrame(emitEvent);
24024
+ else if (clearTimer === null) {
24025
+ const [ timer, fn ] = props.debounce
24026
+ ? [ setTimeout(emitEvent, props.debounce), clearTimeout ]
24027
+ : [ requestAnimationFrame(emitEvent), cancelAnimationFrame ];
24028
+
24029
+ clearTimer = () => {
24030
+ fn(timer);
24031
+ clearTimer = null;
24032
+ };
23978
24033
  }
23979
24034
  }
23980
24035
 
@@ -23986,8 +24041,7 @@
23986
24041
  });
23987
24042
 
23988
24043
  vue.onBeforeUnmount(() => {
23989
- clearTimeout(timer);
23990
- cancelAnimationFrame(timer);
24044
+ clearTimer !== null && clearTimer();
23991
24045
  unconfigureScrollTarget();
23992
24046
  });
23993
24047
 
@@ -26832,6 +26886,9 @@
26832
26886
  && panning.value === false
26833
26887
  ) || scroll.vertical.size.value <= container.vertical.value + 1
26834
26888
  );
26889
+ scroll.vertical.thumbStart = vue.computed(() =>
26890
+ scroll.vertical.percentage.value * (container.vertical.value - scroll.vertical.thumbSize.value)
26891
+ );
26835
26892
  scroll.vertical.thumbSize = vue.computed(() =>
26836
26893
  Math.round(
26837
26894
  between(
@@ -26842,13 +26899,11 @@
26842
26899
  )
26843
26900
  );
26844
26901
  scroll.vertical.style = vue.computed(() => {
26845
- const thumbSize = scroll.vertical.thumbSize.value;
26846
- const pos = scroll.vertical.percentage.value * (container.vertical.value - thumbSize);
26847
26902
  return {
26848
26903
  ...props.thumbStyle,
26849
26904
  ...props.verticalThumbStyle,
26850
- top: `${ pos }px`,
26851
- height: `${ thumbSize }px`
26905
+ top: `${ scroll.vertical.thumbStart.value }px`,
26906
+ height: `${ scroll.vertical.thumbSize.value }px`
26852
26907
  }
26853
26908
  });
26854
26909
  scroll.vertical.thumbClass = vue.computed(() =>
@@ -26873,6 +26928,9 @@
26873
26928
  && panning.value === false
26874
26929
  ) || scroll.horizontal.size.value <= container.horizontal.value + 1
26875
26930
  );
26931
+ scroll.horizontal.thumbStart = vue.computed(() =>
26932
+ scroll.horizontal.percentage.value * (container.horizontal.value - scroll.horizontal.thumbSize.value)
26933
+ );
26876
26934
  scroll.horizontal.thumbSize = vue.computed(() =>
26877
26935
  Math.round(
26878
26936
  between(
@@ -26883,13 +26941,11 @@
26883
26941
  )
26884
26942
  );
26885
26943
  scroll.horizontal.style = vue.computed(() => {
26886
- const thumbSize = scroll.horizontal.thumbSize.value;
26887
- const pos = scroll.horizontal.percentage.value * (container.horizontal.value - thumbSize);
26888
26944
  return {
26889
26945
  ...props.thumbStyle,
26890
26946
  ...props.horizontalThumbStyle,
26891
- left: `${ pos }px`,
26892
- width: `${ thumbSize }px`
26947
+ left: `${ scroll.horizontal.thumbStart.value }px`,
26948
+ width: `${ scroll.horizontal.thumbSize.value }px`
26893
26949
  }
26894
26950
  });
26895
26951
  scroll.horizontal.thumbClass = vue.computed(() =>
@@ -27035,8 +27091,11 @@
27035
27091
  const data = scroll[ axis ];
27036
27092
 
27037
27093
  if (data.thumbHidden.value !== true) {
27038
- const pos = evt[ dirProps[ axis ].offset ] - data.thumbSize.value / 2;
27039
- setScroll(pos / container[ axis ].value * data.size.value, axis);
27094
+ const offset = evt[ dirProps[ axis ].offset ];
27095
+ if (offset < data.thumbStart.value || offset > data.thumbStart.value + data.thumbSize.value) {
27096
+ const pos = offset - data.thumbSize.value / 2;
27097
+ setScroll(pos / container[ axis ].value * data.size.value, axis);
27098
+ }
27040
27099
 
27041
27100
  // activate thumb pan
27042
27101
  if (data.ref.value !== null) {
@@ -27099,6 +27158,26 @@
27099
27158
  }
27100
27159
  });
27101
27160
 
27161
+ let scrollPosition = null;
27162
+
27163
+ vue.onDeactivated(() => {
27164
+ scrollPosition = {
27165
+ top: scroll.vertical.position.value,
27166
+ left: scroll.horizontal.position.value
27167
+ };
27168
+ });
27169
+
27170
+ vue.onActivated(() => {
27171
+ if (scrollPosition === null) { return }
27172
+
27173
+ const scrollTarget = targetRef.value;
27174
+
27175
+ if (scrollTarget !== null) {
27176
+ setHorizontalScrollPosition(scrollTarget, scrollPosition.left);
27177
+ setVerticalScrollPosition(scrollTarget, scrollPosition.top);
27178
+ }
27179
+ });
27180
+
27102
27181
  vue.onBeforeUnmount(emitScroll.cancel);
27103
27182
 
27104
27183
  return () => {
@@ -27763,9 +27842,9 @@
27763
27842
  : Math.ceil(scrollViewSize / virtualScrollItemSizeComputed.value);
27764
27843
 
27765
27844
  const baseSize = Math.max(
27766
- 10,
27845
+ 1,
27767
27846
  view,
27768
- Math.ceil(props.virtualScrollSliceSize / multiplier)
27847
+ Math.ceil((props.virtualScrollSliceSize > 0 ? props.virtualScrollSliceSize : 10) / multiplier)
27769
27848
  );
27770
27849
 
27771
27850
  virtualScrollSliceSizeComputed.value = {
@@ -27858,7 +27937,15 @@
27858
27937
  setVirtualScrollSize();
27859
27938
  });
27860
27939
 
27940
+ let shouldActivate = false;
27941
+
27942
+ vue.onDeactivated(() => {
27943
+ shouldActivate = true;
27944
+ });
27945
+
27861
27946
  vue.onActivated(() => {
27947
+ if (shouldActivate !== true) { return }
27948
+
27862
27949
  const scrollEl = getVirtualScrollTarget();
27863
27950
 
27864
27951
  if (prevScrollStart !== void 0 && scrollEl !== void 0 && scrollEl !== null && scrollEl.nodeType !== 8) {
@@ -28519,34 +28606,34 @@
28519
28606
 
28520
28607
  if (typeof value === 'string' && value.length > 0) {
28521
28608
  const needle = value.toLocaleLowerCase();
28609
+ const findFn = extractFn => {
28610
+ const option = props.options.find(opt => extractFn.value(opt).toLocaleLowerCase() === needle);
28522
28611
 
28523
- let fn = opt => getOptionValue.value(opt).toLocaleLowerCase() === needle;
28524
- let option = props.options.find(fn);
28612
+ if (option === void 0) {
28613
+ return false
28614
+ }
28525
28615
 
28526
- if (option !== void 0) {
28527
28616
  if (innerValue.value.indexOf(option) === -1) {
28528
28617
  toggleOption(option);
28529
28618
  }
28530
28619
  else {
28531
28620
  hidePopup();
28532
28621
  }
28533
- }
28534
- else {
28535
- fn = opt => getOptionLabel.value(opt).toLocaleLowerCase() === needle;
28536
- option = props.options.find(fn);
28537
28622
 
28538
- if (option !== void 0) {
28539
- if (innerValue.value.indexOf(option) === -1) {
28540
- toggleOption(option);
28541
- }
28542
- else {
28543
- hidePopup();
28544
- }
28623
+ return true
28624
+ };
28625
+ const fillFn = afterFilter => {
28626
+ if (findFn(getOptionValue) === true) {
28627
+ return
28545
28628
  }
28546
- else {
28547
- filter(value, true);
28629
+ if (findFn(getOptionLabel) === true || afterFilter === true) {
28630
+ return
28548
28631
  }
28549
- }
28632
+
28633
+ filter(value, true, () => fillFn(true));
28634
+ };
28635
+
28636
+ fillFn();
28550
28637
  }
28551
28638
  else {
28552
28639
  state.clearValue(e);
@@ -28925,7 +29012,7 @@
28925
29012
  }
28926
29013
  }
28927
29014
 
28928
- function filter (val, keepClosed) {
29015
+ function filter (val, keepClosed, afterUpdateFn) {
28929
29016
  if (props.onFilter === void 0 || (keepClosed !== true && state.focused.value !== true)) {
28930
29017
  return
28931
29018
  }
@@ -28983,6 +29070,7 @@
28983
29070
  }
28984
29071
 
28985
29072
  typeof afterFn === 'function' && vue.nextTick(() => { afterFn(proxy); });
29073
+ typeof afterUpdateFn === 'function' && vue.nextTick(() => { afterUpdateFn(proxy); });
28986
29074
  });
28987
29075
  }
28988
29076
  },
@@ -29337,7 +29425,7 @@
29337
29425
  vue.h('div', {
29338
29426
  ref: targetRef,
29339
29427
  key: 'd_t',
29340
- class: 'no-outline',
29428
+ class: 'q-select__focus-target',
29341
29429
  id: state.targetUid.value,
29342
29430
  ...comboboxAttrs.value,
29343
29431
  onKeydown: onTargetKeydown,
@@ -29349,7 +29437,7 @@
29349
29437
  if (typeof props.autocomplete === 'string' && props.autocomplete.length > 0) {
29350
29438
  child.push(
29351
29439
  vue.h('input', {
29352
- class: 'q-select__autocomplete-input no-outline',
29440
+ class: 'q-select__autocomplete-input',
29353
29441
  autocomplete: props.autocomplete,
29354
29442
  onKeyup: onTargetAutocomplete
29355
29443
  })
@@ -35324,6 +35412,8 @@
35324
35412
  expanded: Array, // v-model:expanded
35325
35413
  selected: {}, // v-model:selected
35326
35414
 
35415
+ noSelectionUnset: Boolean,
35416
+
35327
35417
  defaultExpandAll: Boolean,
35328
35418
  accordion: Boolean,
35329
35419
 
@@ -35881,7 +35971,12 @@
35881
35971
 
35882
35972
  if (hasSelection.value) {
35883
35973
  if (meta.selectable) {
35884
- emit('update:selected', meta.key !== props.selected ? meta.key : null);
35974
+ if (props.noSelectionUnset === false) {
35975
+ emit('update:selected', meta.key !== props.selected ? meta.key : null);
35976
+ }
35977
+ else if (meta.key !== props.selected) {
35978
+ emit('update:selected', meta.key || null);
35979
+ }
35885
35980
  }
35886
35981
  }
35887
35982
  else {
@@ -38094,8 +38189,8 @@
38094
38189
  color: vmColor.value,
38095
38190
  label: okLabel.value,
38096
38191
  ripple: false,
38097
- ...(Object(props.ok) === props.ok ? props.ok : { flat: true }),
38098
38192
  disable: okDisabled.value,
38193
+ ...(Object(props.ok) === props.ok ? props.ok : { flat: true }),
38099
38194
  'data-autofocus': (props.focus === 'ok' && hasForm.value !== true) || void 0,
38100
38195
  onClick: onOk
38101
38196
  }));
@@ -38322,11 +38417,11 @@
38322
38417
  Object.assign(this, {
38323
38418
  start (speed) {
38324
38419
  barRef.value.start(speed);
38325
- Plugin$3.isActive = barRef.value.calls > 0;
38420
+ Plugin$3.isActive = true;
38326
38421
  },
38327
38422
  stop () {
38328
- barRef.value.stop();
38329
- Plugin$3.isActive = barRef.value.calls > 0;
38423
+ const sessions = barRef.value.stop();
38424
+ Plugin$3.isActive = sessions > 0;
38330
38425
  },
38331
38426
  increment () {
38332
38427
  barRef.value.increment.apply(null, arguments);
@@ -39264,7 +39359,7 @@
39264
39359
  });
39265
39360
 
39266
39361
  var index_umd = {
39267
- version: '2.4.7',
39362
+ version: '2.4.11',
39268
39363
  install (app, opts) {
39269
39364
  installQuasar(app, {
39270
39365
  components,