quasar 2.11.3 → 2.11.4

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 (147) hide show
  1. package/dist/icon-set/bootstrap-icons.umd.prod.js +1 -1
  2. package/dist/icon-set/eva-icons.umd.prod.js +1 -1
  3. package/dist/icon-set/fontawesome-v5-pro.umd.prod.js +1 -1
  4. package/dist/icon-set/fontawesome-v5.umd.prod.js +1 -1
  5. package/dist/icon-set/fontawesome-v6-pro.umd.prod.js +1 -1
  6. package/dist/icon-set/fontawesome-v6.umd.prod.js +1 -1
  7. package/dist/icon-set/ionicons-v4.umd.prod.js +1 -1
  8. package/dist/icon-set/line-awesome.umd.prod.js +1 -1
  9. package/dist/icon-set/material-icons-outlined.umd.prod.js +1 -1
  10. package/dist/icon-set/material-icons-round.umd.prod.js +1 -1
  11. package/dist/icon-set/material-icons-sharp.umd.prod.js +1 -1
  12. package/dist/icon-set/material-icons.umd.prod.js +1 -1
  13. package/dist/icon-set/material-symbols-outlined.umd.prod.js +1 -1
  14. package/dist/icon-set/material-symbols-rounded.umd.prod.js +1 -1
  15. package/dist/icon-set/material-symbols-sharp.umd.prod.js +1 -1
  16. package/dist/icon-set/mdi-v3.umd.prod.js +1 -1
  17. package/dist/icon-set/mdi-v4.umd.prod.js +1 -1
  18. package/dist/icon-set/mdi-v5.umd.prod.js +1 -1
  19. package/dist/icon-set/mdi-v6.umd.prod.js +1 -1
  20. package/dist/icon-set/mdi-v7.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-fontawesome-v6.umd.prod.js +1 -1
  25. package/dist/icon-set/svg-ionicons-v4.umd.prod.js +1 -1
  26. package/dist/icon-set/svg-ionicons-v5.umd.prod.js +1 -1
  27. package/dist/icon-set/svg-ionicons-v6.umd.prod.js +1 -1
  28. package/dist/icon-set/svg-line-awesome.umd.prod.js +1 -1
  29. package/dist/icon-set/svg-material-icons-outlined.umd.prod.js +1 -1
  30. package/dist/icon-set/svg-material-icons-round.umd.prod.js +1 -1
  31. package/dist/icon-set/svg-material-icons-sharp.umd.prod.js +1 -1
  32. package/dist/icon-set/svg-material-icons.umd.prod.js +1 -1
  33. package/dist/icon-set/svg-material-symbols-outlined.umd.prod.js +1 -1
  34. package/dist/icon-set/svg-material-symbols-rounded.umd.prod.js +1 -1
  35. package/dist/icon-set/svg-material-symbols-sharp.umd.prod.js +1 -1
  36. package/dist/icon-set/svg-mdi-v6.umd.prod.js +1 -1
  37. package/dist/icon-set/svg-mdi-v7.umd.prod.js +1 -1
  38. package/dist/icon-set/svg-themify.umd.prod.js +1 -1
  39. package/dist/icon-set/themify.umd.prod.js +1 -1
  40. package/dist/lang/ar-TN.umd.prod.js +1 -1
  41. package/dist/lang/ar.umd.prod.js +1 -1
  42. package/dist/lang/az-Latn.umd.prod.js +1 -1
  43. package/dist/lang/bg.umd.prod.js +1 -1
  44. package/dist/lang/bn.umd.prod.js +1 -1
  45. package/dist/lang/ca.umd.prod.js +1 -1
  46. package/dist/lang/cs.umd.prod.js +1 -1
  47. package/dist/lang/da.umd.prod.js +1 -1
  48. package/dist/lang/de.umd.prod.js +1 -1
  49. package/dist/lang/el.umd.prod.js +1 -1
  50. package/dist/lang/en-GB.umd.prod.js +1 -1
  51. package/dist/lang/en-US.umd.prod.js +1 -1
  52. package/dist/lang/eo.umd.prod.js +1 -1
  53. package/dist/lang/es.umd.prod.js +1 -1
  54. package/dist/lang/et.umd.prod.js +1 -1
  55. package/dist/lang/eu.umd.prod.js +1 -1
  56. package/dist/lang/fa-IR.umd.prod.js +1 -1
  57. package/dist/lang/fa.umd.prod.js +1 -1
  58. package/dist/lang/fi.umd.prod.js +1 -1
  59. package/dist/lang/fr.umd.prod.js +1 -1
  60. package/dist/lang/gn.umd.prod.js +1 -1
  61. package/dist/lang/he.umd.prod.js +1 -1
  62. package/dist/lang/hr.umd.prod.js +1 -1
  63. package/dist/lang/hu.umd.prod.js +1 -1
  64. package/dist/lang/id.umd.prod.js +1 -1
  65. package/dist/lang/is.umd.prod.js +1 -1
  66. package/dist/lang/it.umd.prod.js +1 -1
  67. package/dist/lang/ja.umd.prod.js +1 -1
  68. package/dist/lang/kk.umd.prod.js +1 -1
  69. package/dist/lang/km.umd.prod.js +1 -1
  70. package/dist/lang/ko-KR.umd.prod.js +1 -1
  71. package/dist/lang/kur-CKB.umd.prod.js +1 -1
  72. package/dist/lang/lt.umd.prod.js +1 -1
  73. package/dist/lang/lu.umd.prod.js +1 -1
  74. package/dist/lang/lv.umd.prod.js +1 -1
  75. package/dist/lang/ml.umd.prod.js +1 -1
  76. package/dist/lang/mm.umd.prod.js +1 -1
  77. package/dist/lang/ms.umd.prod.js +1 -1
  78. package/dist/lang/my.umd.prod.js +1 -1
  79. package/dist/lang/nb-NO.umd.prod.js +1 -1
  80. package/dist/lang/nl.umd.prod.js +1 -1
  81. package/dist/lang/pl.umd.prod.js +1 -1
  82. package/dist/lang/pt-BR.umd.prod.js +1 -1
  83. package/dist/lang/pt.umd.prod.js +1 -1
  84. package/dist/lang/ro.umd.prod.js +1 -1
  85. package/dist/lang/ru.umd.prod.js +1 -1
  86. package/dist/lang/sk.umd.prod.js +1 -1
  87. package/dist/lang/sl.umd.prod.js +1 -1
  88. package/dist/lang/sm.umd.prod.js +1 -1
  89. package/dist/lang/sr-CYR.umd.prod.js +1 -1
  90. package/dist/lang/sr.umd.prod.js +1 -1
  91. package/dist/lang/sv.umd.prod.js +1 -1
  92. package/dist/lang/ta.umd.prod.js +1 -1
  93. package/dist/lang/th.umd.prod.js +1 -1
  94. package/dist/lang/tr.umd.prod.js +1 -1
  95. package/dist/lang/ug.umd.prod.js +1 -1
  96. package/dist/lang/uk.umd.prod.js +1 -1
  97. package/dist/lang/uz-Cyrl.umd.prod.js +1 -1
  98. package/dist/lang/uz-Latn.umd.prod.js +1 -1
  99. package/dist/lang/vi.umd.prod.js +1 -1
  100. package/dist/lang/zh-CN.umd.prod.js +1 -1
  101. package/dist/lang/zh-TW.umd.prod.js +1 -1
  102. package/dist/quasar.cjs.prod.js +2 -2
  103. package/dist/quasar.css +4 -0
  104. package/dist/quasar.esm.js +375 -175
  105. package/dist/quasar.esm.prod.js +2 -2
  106. package/dist/quasar.prod.css +1 -1
  107. package/dist/quasar.rtl.css +4 -0
  108. package/dist/quasar.rtl.prod.css +1 -1
  109. package/dist/quasar.sass +3 -1
  110. package/dist/quasar.umd.js +375 -175
  111. package/dist/quasar.umd.prod.js +2 -2
  112. package/dist/web-types/web-types.json +1 -1
  113. package/package.json +1 -1
  114. package/src/components/ajax-bar/QAjaxBar.js +13 -5
  115. package/src/components/btn/QBtn.js +3 -2
  116. package/src/components/carousel/QCarousel.js +17 -10
  117. package/src/components/dialog/QDialog.js +8 -4
  118. package/src/components/drawer/QDrawer.js +8 -3
  119. package/src/components/img/QImg.js +25 -11
  120. package/src/components/input/QInput.js +14 -4
  121. package/src/components/layout/QLayout.js +5 -5
  122. package/src/components/menu/QMenu.js +1 -1
  123. package/src/components/pull-to-refresh/QPullToRefresh.js +5 -4
  124. package/src/components/resize-observer/QResizeObserver.js +9 -4
  125. package/src/components/scroll-area/QScrollArea.js +8 -8
  126. package/src/components/select/QSelect.js +19 -8
  127. package/src/components/slide-item/QSlideItem.js +4 -2
  128. package/src/components/slide-transition/QSlideTransition.js +17 -3
  129. package/src/components/tabs/QTabs.js +12 -5
  130. package/src/components/tooltip/QTooltip.js +1 -1
  131. package/src/composables/private/use-anchor.js +8 -3
  132. package/src/composables/private/use-field.js +10 -4
  133. package/src/composables/private/use-portal.js +3 -3
  134. package/src/composables/private/use-timeout.js +6 -3
  135. package/src/css/core/visibility.sass +2 -0
  136. package/src/directives/TouchHold.js +9 -4
  137. package/src/directives/TouchRepeat.js +10 -3
  138. package/src/plugins/Loading.js +5 -5
  139. package/src/plugins/Meta.js +4 -2
  140. package/src/plugins/Notify.js +13 -3
  141. package/src/utils/debounce.js +9 -6
  142. package/src/utils/morph.js +7 -6
  143. package/src/utils/prevent-scroll.js +5 -6
  144. package/src/utils/private/click-outside.js +10 -3
  145. package/src/utils/private/global-dialog.js +1 -1
  146. package/src/utils/private/global-nodes.js +44 -13
  147. package/src/utils/private/position-engine.js +67 -25
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Quasar Framework v2.11.3
2
+ * Quasar Framework v2.11.4
3
3
  * (c) 2015-present Razvan Stoenescu
4
4
  * Released under the MIT License.
5
5
  */
@@ -555,27 +555,30 @@ var event = {
555
555
  };
556
556
 
557
557
  function debounce (fn, wait = 250, immediate) {
558
- let timeout;
558
+ let timer = null;
559
559
 
560
560
  function debounced (/* ...args */) {
561
561
  const args = arguments;
562
562
 
563
563
  const later = () => {
564
- timeout = void 0;
564
+ timer = null;
565
565
  if (immediate !== true) {
566
566
  fn.apply(this, args);
567
567
  }
568
568
  };
569
569
 
570
- clearTimeout(timeout);
571
- if (immediate === true && timeout === void 0) {
570
+ if (timer !== null) {
571
+ clearTimeout(timer);
572
+ }
573
+ else if (immediate === true) {
572
574
  fn.apply(this, args);
573
575
  }
574
- timeout = setTimeout(later, wait);
576
+
577
+ timer = setTimeout(later, wait);
575
578
  }
576
579
 
577
580
  debounced.cancel = () => {
578
- clearTimeout(timeout);
581
+ timer !== null && clearTimeout(timer);
579
582
  };
580
583
 
581
584
  return debounced
@@ -1643,7 +1646,7 @@ function prepareApp (app, uiOpts, pluginOpts) {
1643
1646
  }
1644
1647
 
1645
1648
  var installQuasar = function (parentApp, opts = {}) {
1646
- const $q = { version: '2.11.3' };
1649
+ const $q = { version: '2.11.4' };
1647
1650
 
1648
1651
  if (globalConfigIsFrozen === false) {
1649
1652
  if (opts.config !== void 0) {
@@ -1842,7 +1845,7 @@ var QAjaxBar = createComponent({
1842
1845
  const onScreen = ref(false);
1843
1846
  const animate = ref(true);
1844
1847
 
1845
- let sessions = 0, timer, speed;
1848
+ let sessions = 0, timer = null, speed;
1846
1849
 
1847
1850
  const classes = computed(() =>
1848
1851
  `q-loading-bar q-loading-bar--${ props.position }`
@@ -1894,19 +1897,21 @@ var QAjaxBar = createComponent({
1894
1897
  if (oldSpeed === 0 && newSpeed > 0) {
1895
1898
  planNextStep();
1896
1899
  }
1897
- else if (oldSpeed > 0 && newSpeed <= 0) {
1900
+ else if (timer !== null && oldSpeed > 0 && newSpeed <= 0) {
1898
1901
  clearTimeout(timer);
1902
+ timer = null;
1899
1903
  }
1900
1904
 
1901
1905
  return sessions
1902
1906
  }
1903
1907
 
1904
- clearTimeout(timer);
1908
+ timer !== null && clearTimeout(timer);
1905
1909
  emit('start');
1906
1910
 
1907
1911
  progress.value = 0;
1908
1912
 
1909
1913
  timer = setTimeout(() => {
1914
+ timer = null;
1910
1915
  animate.value = true;
1911
1916
  newSpeed > 0 && planNextStep();
1912
1917
  }, onScreen.value === true ? 500 : 1);
@@ -1933,13 +1938,18 @@ var QAjaxBar = createComponent({
1933
1938
  return sessions
1934
1939
  }
1935
1940
 
1936
- clearTimeout(timer);
1941
+ if (timer !== null) {
1942
+ clearTimeout(timer);
1943
+ timer = null;
1944
+ }
1945
+
1937
1946
  emit('stop');
1938
1947
 
1939
1948
  const end = () => {
1940
1949
  animate.value = true;
1941
1950
  progress.value = 100;
1942
1951
  timer = setTimeout(() => {
1952
+ timer = null;
1943
1953
  onScreen.value = false;
1944
1954
  }, 1000);
1945
1955
  };
@@ -1957,6 +1967,7 @@ var QAjaxBar = createComponent({
1957
1967
  function planNextStep () {
1958
1968
  if (progress.value < 100) {
1959
1969
  timer = setTimeout(() => {
1970
+ timer = null;
1960
1971
  increment();
1961
1972
  planNextStep();
1962
1973
  }, speed);
@@ -1977,7 +1988,7 @@ var QAjaxBar = createComponent({
1977
1988
  });
1978
1989
 
1979
1990
  onBeforeUnmount(() => {
1980
- clearTimeout(timer);
1991
+ timer !== null && clearTimeout(timer);
1981
1992
  hijacked === true && restoreAjax(start);
1982
1993
  });
1983
1994
 
@@ -3581,7 +3592,7 @@ var QBtn = createComponent({
3581
3592
  const rootRef = ref(null);
3582
3593
  const blurTargetRef = ref(null);
3583
3594
 
3584
- let localTouchTargetEl = null, avoidMouseRipple, mouseTimer;
3595
+ let localTouchTargetEl = null, avoidMouseRipple, mouseTimer = null;
3585
3596
 
3586
3597
  const hasLabel = computed(() =>
3587
3598
  props.label !== void 0 && props.label !== null && props.label !== ''
@@ -3727,8 +3738,9 @@ var QBtn = createComponent({
3727
3738
  // avoid duplicated mousedown event
3728
3739
  // triggering another early ripple
3729
3740
  avoidMouseRipple = true;
3730
- clearTimeout(mouseTimer);
3741
+ mouseTimer !== null && clearTimeout(mouseTimer);
3731
3742
  mouseTimer = setTimeout(() => {
3743
+ mouseTimer = null;
3732
3744
  avoidMouseRipple = false;
3733
3745
  }, 200);
3734
3746
  }
@@ -3974,7 +3986,7 @@ function useAnchor ({
3974
3986
 
3975
3987
  const anchorEl = ref(null);
3976
3988
 
3977
- let touchTimer;
3989
+ let touchTimer = null;
3978
3990
 
3979
3991
  function canShow (evt) {
3980
3992
  // abort with no parent configured or on multi-touch
@@ -4033,6 +4045,7 @@ function useAnchor ({
4033
4045
  ]);
4034
4046
 
4035
4047
  touchTimer = setTimeout(() => {
4048
+ touchTimer = null;
4036
4049
  proxy.show(evt);
4037
4050
  evt.qAnchorHandled = true;
4038
4051
  }, 300);
@@ -4040,7 +4053,11 @@ function useAnchor ({
4040
4053
 
4041
4054
  mobileCleanup (evt) {
4042
4055
  anchorEl.value.classList.remove('non-selectable');
4043
- clearTimeout(touchTimer);
4056
+
4057
+ if (touchTimer !== null) {
4058
+ clearTimeout(touchTimer);
4059
+ touchTimer = null;
4060
+ }
4044
4061
 
4045
4062
  if (showing.value === true && evt !== void 0) {
4046
4063
  clearSelection();
@@ -4154,7 +4171,7 @@ function useAnchor ({
4154
4171
  });
4155
4172
 
4156
4173
  onBeforeUnmount(() => {
4157
- clearTimeout(touchTimer);
4174
+ touchTimer !== null && clearTimeout(touchTimer);
4158
4175
  unconfigureAnchorEl();
4159
4176
  });
4160
4177
 
@@ -4395,15 +4412,18 @@ function removeFocusFn (fn) {
4395
4412
  queue = queue.filter(entry => entry !== fn);
4396
4413
  }
4397
4414
 
4398
- const globalNodes = [];
4415
+ const nodesList = [];
4416
+ const portalTypeList = [];
4417
+
4418
+ let portalIndex = 1;
4399
4419
  let target = document.body;
4400
4420
 
4401
- function createGlobalNode (id) {
4421
+ function createGlobalNode (id, portalType) {
4402
4422
  const el = document.createElement('div');
4403
4423
 
4404
- if (id !== void 0) {
4405
- el.id = id;
4406
- }
4424
+ el.id = portalType !== void 0
4425
+ ? `q-portal--${ portalType }--${ portalIndex++ }`
4426
+ : id;
4407
4427
 
4408
4428
  if (globalConfig.globalNodes !== void 0) {
4409
4429
  const cls = globalConfig.globalNodes.class;
@@ -4413,25 +4433,53 @@ function createGlobalNode (id) {
4413
4433
  }
4414
4434
 
4415
4435
  target.appendChild(el);
4416
- globalNodes.push(el);
4436
+ nodesList.push(el);
4437
+ portalTypeList.push(portalType);
4417
4438
 
4418
4439
  return el
4419
4440
  }
4420
4441
 
4421
4442
  function removeGlobalNode (el) {
4422
- globalNodes.splice(globalNodes.indexOf(el), 1);
4443
+ const nodeIndex = nodesList.indexOf(el);
4444
+
4445
+ nodesList.splice(nodeIndex, 1);
4446
+ portalTypeList.splice(nodeIndex, 1);
4447
+
4423
4448
  el.remove();
4424
4449
  }
4425
4450
 
4426
- function changeGlobalNodesTarget (el) {
4427
- if (el !== target) {
4428
- target = el;
4451
+ function changeGlobalNodesTarget (newTarget) {
4452
+ if (newTarget === target) {
4453
+ return
4454
+ }
4429
4455
 
4430
- globalNodes.forEach(el => {
4431
- if (el.contains(target) === false) {
4432
- target.appendChild(el);
4456
+ target = newTarget;
4457
+
4458
+ if (
4459
+ target === document.body
4460
+ // or we have less than 2 dialogs:
4461
+ || portalTypeList.reduce((acc, type) => (type === 'dialog' ? acc + 1 : acc), 0) < 2
4462
+ ) {
4463
+ nodesList.forEach(node => {
4464
+ if (node.contains(target) === false) {
4465
+ target.appendChild(node);
4433
4466
  }
4434
4467
  });
4468
+
4469
+ return
4470
+ }
4471
+
4472
+ const lastDialogIndex = portalTypeList.lastIndexOf('dialog');
4473
+
4474
+ for (let i = 0; i < nodesList.length; i++) {
4475
+ const el = nodesList[ i ];
4476
+
4477
+ if (
4478
+ (i === lastDialogIndex || portalTypeList[ i ] !== 'dialog')
4479
+ && el.contains(target) === false
4480
+ ) {
4481
+ target.appendChild(el);
4482
+ }
4435
4483
  }
4436
4484
  }
4437
4485
 
@@ -4510,7 +4558,7 @@ function isOnGlobalDialog (vm) {
4510
4558
  // Warning!
4511
4559
  // You MUST specify "inheritAttrs: false" in your component
4512
4560
 
4513
- function usePortal (vm, innerRef, renderPortalContent, checkGlobalDialog) {
4561
+ function usePortal (vm, innerRef, renderPortalContent, type) {
4514
4562
  // showing, including while in show/hide transition
4515
4563
  const portalIsActive = ref(false);
4516
4564
 
@@ -4519,7 +4567,7 @@ function usePortal (vm, innerRef, renderPortalContent, checkGlobalDialog) {
4519
4567
 
4520
4568
  let portalEl = null;
4521
4569
  const focusObj = {};
4522
- const onGlobalDialog = checkGlobalDialog === true && isOnGlobalDialog(vm);
4570
+ const onGlobalDialog = type === 'dialog' && isOnGlobalDialog(vm);
4523
4571
 
4524
4572
  function showPortal (isReady) {
4525
4573
  if (isReady === true) {
@@ -4532,7 +4580,7 @@ function usePortal (vm, innerRef, renderPortalContent, checkGlobalDialog) {
4532
4580
 
4533
4581
  if (portalIsActive.value === false) {
4534
4582
  if (onGlobalDialog === false && portalEl === null) {
4535
- portalEl = createGlobalNode();
4583
+ portalEl = createGlobalNode(false, type);
4536
4584
  }
4537
4585
 
4538
4586
  portalIsActive.value = true;
@@ -4673,11 +4721,14 @@ function useTick () {
4673
4721
  */
4674
4722
 
4675
4723
  function useTimeout () {
4676
- let timer;
4724
+ let timer = null;
4677
4725
  const vm = getCurrentInstance();
4678
4726
 
4679
4727
  function removeTimeout () {
4680
- clearTimeout(timer);
4728
+ if (timer !== null) {
4729
+ clearTimeout(timer);
4730
+ timer = null;
4731
+ }
4681
4732
  }
4682
4733
 
4683
4734
  onDeactivated(removeTimeout);
@@ -4687,7 +4738,7 @@ function useTimeout () {
4687
4738
  removeTimeout,
4688
4739
 
4689
4740
  registerTimeout (fn, delay) {
4690
- clearTimeout(timer);
4741
+ removeTimeout();
4691
4742
 
4692
4743
  if (vmIsDestroyed(vm) === false) {
4693
4744
  timer = setTimeout(fn, delay);
@@ -4969,14 +5020,11 @@ function removeFocusout (fn) {
4969
5020
  }
4970
5021
  }
4971
5022
 
4972
- let timer;
4973
-
4974
5023
  const
4975
5024
  { notPassiveCapture } = listenOpts,
4976
5025
  registeredList = [];
4977
5026
 
4978
5027
  function globalHandler (evt) {
4979
- clearTimeout(timer);
4980
5028
 
4981
5029
  const target = evt.target;
4982
5030
 
@@ -5049,7 +5097,7 @@ function removeClickOutside (clickOutsideProps) {
5049
5097
  registeredList.splice(index, 1);
5050
5098
 
5051
5099
  if (registeredList.length === 0) {
5052
- clearTimeout(timer);
5100
+
5053
5101
  document.removeEventListener('mousedown', globalHandler, notPassiveCapture);
5054
5102
  document.removeEventListener('touchstart', globalHandler, notPassiveCapture);
5055
5103
  }
@@ -5117,17 +5165,32 @@ function getAnchorProps (el, offset) {
5117
5165
  }
5118
5166
 
5119
5167
  return {
5120
- top,
5121
- left,
5122
- right,
5123
- bottom,
5124
- width,
5125
- height,
5168
+ top, bottom, height,
5169
+ left, right, width,
5126
5170
  middle: left + (right - left) / 2,
5127
5171
  center: top + (bottom - top) / 2
5128
5172
  }
5129
5173
  }
5130
5174
 
5175
+ function getAbsoluteAnchorProps (el, absoluteOffset, offset) {
5176
+ let { top, left } = el.getBoundingClientRect();
5177
+
5178
+ top += absoluteOffset.top;
5179
+ left += absoluteOffset.left;
5180
+
5181
+ if (offset !== void 0) {
5182
+ top += offset[ 1 ];
5183
+ left += offset[ 0 ];
5184
+ }
5185
+
5186
+ return {
5187
+ top, bottom: top + 1, height: 1,
5188
+ left, right: left + 1, width: 1,
5189
+ middle: left,
5190
+ center: top
5191
+ }
5192
+ }
5193
+
5131
5194
  function getTargetProps (el) {
5132
5195
  return {
5133
5196
  top: 0,
@@ -5139,6 +5202,13 @@ function getTargetProps (el) {
5139
5202
  }
5140
5203
  }
5141
5204
 
5205
+ function getTopLeftProps (anchorProps, targetProps, cfg) {
5206
+ return {
5207
+ top: anchorProps[ cfg.anchorOrigin.vertical ] - targetProps[ cfg.selfOrigin.vertical ],
5208
+ left: anchorProps[ cfg.anchorOrigin.horizontal ] - targetProps[ cfg.selfOrigin.horizontal ]
5209
+ }
5210
+ }
5211
+
5142
5212
  // cfg: { el, anchorEl, anchorOrigin, selfOrigin, offset, absoluteOffset, cover, fit, maxHeight, maxWidth }
5143
5213
  function setPosition (cfg) {
5144
5214
  if (client.is.ios === true && window.visualViewport !== void 0) {
@@ -5157,25 +5227,15 @@ function setPosition (cfg) {
5157
5227
  }
5158
5228
  }
5159
5229
 
5160
- let anchorProps;
5161
-
5162
5230
  // scroll position might change
5163
5231
  // if max-height/-width changes, so we
5164
5232
  // need to restore it after we calculate
5165
5233
  // the new positioning
5166
5234
  const { scrollLeft, scrollTop } = cfg.el;
5167
5235
 
5168
- if (cfg.absoluteOffset === void 0) {
5169
- anchorProps = getAnchorProps(cfg.anchorEl, cfg.cover === true ? [ 0, 0 ] : cfg.offset);
5170
- }
5171
- else {
5172
- const
5173
- { top: anchorTop, left: anchorLeft } = cfg.anchorEl.getBoundingClientRect(),
5174
- top = anchorTop + cfg.absoluteOffset.top,
5175
- left = anchorLeft + cfg.absoluteOffset.left;
5176
-
5177
- anchorProps = { top, left, width: 1, height: 1, right: left + 1, center: top, middle: left, bottom: top + 1 };
5178
- }
5236
+ const anchorProps = cfg.absoluteOffset === void 0
5237
+ ? getAnchorProps(cfg.anchorEl, cfg.cover === true ? [ 0, 0 ] : cfg.offset)
5238
+ : getAbsoluteAnchorProps(cfg.anchorEl, cfg.absoluteOffset, cfg.offset);
5179
5239
 
5180
5240
  let elStyle = {
5181
5241
  maxHeight: cfg.maxHeight,
@@ -5192,14 +5252,44 @@ function setPosition (cfg) {
5192
5252
 
5193
5253
  Object.assign(cfg.el.style, elStyle);
5194
5254
 
5195
- const
5196
- targetProps = getTargetProps(cfg.el),
5197
- props = {
5198
- top: anchorProps[ cfg.anchorOrigin.vertical ] - targetProps[ cfg.selfOrigin.vertical ],
5199
- left: anchorProps[ cfg.anchorOrigin.horizontal ] - targetProps[ cfg.selfOrigin.horizontal ]
5200
- };
5255
+ const targetProps = getTargetProps(cfg.el);
5256
+ let props = getTopLeftProps(anchorProps, targetProps, cfg);
5201
5257
 
5202
- applyBoundaries(props, anchorProps, targetProps, cfg.anchorOrigin, cfg.selfOrigin);
5258
+ if (cfg.absoluteOffset === void 0 || cfg.offset === void 0) {
5259
+ applyBoundaries(props, anchorProps, targetProps, cfg.anchorOrigin, cfg.selfOrigin);
5260
+ }
5261
+ else { // we have touch position or context menu with offset
5262
+ const { top, left } = props; // cache initial values
5263
+
5264
+ // apply initial boundaries
5265
+ applyBoundaries(props, anchorProps, targetProps, cfg.anchorOrigin, cfg.selfOrigin);
5266
+
5267
+ let hasChanged = false;
5268
+
5269
+ // did it flip vertically?
5270
+ if (props.top !== top) {
5271
+ hasChanged = true;
5272
+ const offsetY = 2 * cfg.offset[ 1 ];
5273
+ anchorProps.center = anchorProps.top -= offsetY;
5274
+ anchorProps.bottom -= offsetY + 2;
5275
+ }
5276
+
5277
+ // did it flip horizontally?
5278
+ if (props.left !== left) {
5279
+ hasChanged = true;
5280
+ const offsetX = 2 * cfg.offset[ 0 ];
5281
+ anchorProps.middle = anchorProps.left -= offsetX;
5282
+ anchorProps.right -= offsetX + 2;
5283
+ }
5284
+
5285
+ if (hasChanged === true) {
5286
+ // re-calculate props with the new anchor
5287
+ props = getTopLeftProps(anchorProps, targetProps, cfg);
5288
+
5289
+ // and re-apply boundaries
5290
+ applyBoundaries(props, anchorProps, targetProps, cfg.anchorOrigin, cfg.selfOrigin);
5291
+ }
5292
+ }
5203
5293
 
5204
5294
  elStyle = {
5205
5295
  top: props.top + 'px',
@@ -5380,7 +5470,7 @@ var QMenu = createComponent({
5380
5470
  processOnMount: true
5381
5471
  });
5382
5472
 
5383
- const { showPortal, hidePortal, renderPortal } = usePortal(vm, innerRef, renderPortalContent);
5473
+ const { showPortal, hidePortal, renderPortal } = usePortal(vm, innerRef, renderPortalContent, 'menu');
5384
5474
 
5385
5475
  const clickOutsideProps = {
5386
5476
  anchorEl,
@@ -6997,7 +7087,7 @@ var QCarousel = createComponent({
6997
7087
 
6998
7088
  const isDark = useDark(props, $q);
6999
7089
 
7000
- let timer, panelsLen;
7090
+ let timer = null, panelsLen;
7001
7091
 
7002
7092
  const {
7003
7093
  updatePanelsList, getPanelContent,
@@ -7051,7 +7141,6 @@ var QCarousel = createComponent({
7051
7141
 
7052
7142
  watch(() => props.modelValue, () => {
7053
7143
  if (props.autoplay) {
7054
- clearInterval(timer);
7055
7144
  startTimer();
7056
7145
  }
7057
7146
  });
@@ -7060,20 +7149,28 @@ var QCarousel = createComponent({
7060
7149
  if (val) {
7061
7150
  startTimer();
7062
7151
  }
7063
- else {
7064
- clearInterval(timer);
7152
+ else if (timer !== null) {
7153
+ clearTimeout(timer);
7154
+ timer = null;
7065
7155
  }
7066
7156
  });
7067
7157
 
7068
7158
  function startTimer () {
7069
7159
  const duration = isNumber(props.autoplay) === true
7070
- ? props.autoplay
7160
+ ? Math.abs(props.autoplay)
7071
7161
  : 5000;
7072
7162
 
7073
- timer = setTimeout(
7074
- duration >= 0 ? nextPanel : previousPanel,
7075
- Math.abs(duration)
7076
- );
7163
+ timer !== null && clearTimeout(timer);
7164
+ timer = setTimeout(() => {
7165
+ timer = null;
7166
+
7167
+ if (duration >= 0) {
7168
+ nextPanel();
7169
+ }
7170
+ else {
7171
+ previousPanel();
7172
+ }
7173
+ }, duration);
7077
7174
  }
7078
7175
 
7079
7176
  onMounted(() => {
@@ -7081,7 +7178,7 @@ var QCarousel = createComponent({
7081
7178
  });
7082
7179
 
7083
7180
  onBeforeUnmount(() => {
7084
- clearInterval(timer);
7181
+ timer !== null && clearTimeout(timer);
7085
7182
  });
7086
7183
 
7087
7184
  function getNavigationContainer (type, mapping) {
@@ -9399,8 +9496,10 @@ var QResizeObserver = createComponent({
9399
9496
  }
9400
9497
 
9401
9498
  function emitEvent () {
9402
- clearTimeout(timer);
9403
- timer = null;
9499
+ if (timer !== null) {
9500
+ clearTimeout(timer);
9501
+ timer = null;
9502
+ }
9404
9503
 
9405
9504
  if (targetEl) {
9406
9505
  const { offsetWidth: width, offsetHeight: height } = targetEl;
@@ -9434,7 +9533,7 @@ var QResizeObserver = createComponent({
9434
9533
  onMounted(() => { init(); });
9435
9534
 
9436
9535
  onBeforeUnmount(() => {
9437
- clearTimeout(timer);
9536
+ timer !== null && clearTimeout(timer);
9438
9537
 
9439
9538
  if (observer !== void 0) {
9440
9539
  if (observer.disconnect !== void 0) {
@@ -9454,7 +9553,10 @@ var QResizeObserver = createComponent({
9454
9553
  let curDocView;
9455
9554
 
9456
9555
  function cleanup () {
9457
- clearTimeout(timer);
9556
+ if (timer !== null) {
9557
+ clearTimeout(timer);
9558
+ timer = null;
9559
+ }
9458
9560
 
9459
9561
  if (curDocView !== void 0) {
9460
9562
  // iOS is fuzzy, need to check it first
@@ -9607,7 +9709,7 @@ var QTabs = createComponent({
9607
9709
  const tabDataListLen = ref(0);
9608
9710
  const hasFocus = ref(false);
9609
9711
 
9610
- let animateTimer, scrollTimer, unwatchRoute;
9712
+ let animateTimer = null, scrollTimer = null, unwatchRoute;
9611
9713
 
9612
9714
  const tabProps = computed(() => ({
9613
9715
  activeClass: props.activeClass,
@@ -9743,7 +9845,10 @@ var QTabs = createComponent({
9743
9845
  oldEl = oldTab.tabIndicatorRef.value,
9744
9846
  newEl = newTab.tabIndicatorRef.value;
9745
9847
 
9746
- clearTimeout(animateTimer);
9848
+ if (animateTimer !== null) {
9849
+ clearTimeout(animateTimer);
9850
+ animateTimer = null;
9851
+ }
9747
9852
 
9748
9853
  oldEl.style.transition = 'none';
9749
9854
  oldEl.style.transform = 'none';
@@ -9761,6 +9866,7 @@ var QTabs = createComponent({
9761
9866
  // allow scope updates to kick in (QRouteTab needs more time)
9762
9867
  registerAnimateTick(() => {
9763
9868
  animateTimer = setTimeout(() => {
9869
+ animateTimer = null;
9764
9870
  newEl.style.transition = 'transform .25s cubic-bezier(.4, 0, .2, 1)';
9765
9871
  newEl.style.transform = 'none';
9766
9872
  }, 70);
@@ -9813,7 +9919,7 @@ var QTabs = createComponent({
9813
9919
  }
9814
9920
 
9815
9921
  function animScrollTo (value) {
9816
- stopAnimScroll();
9922
+ scrollTimer !== null && clearInterval(scrollTimer);
9817
9923
  scrollTimer = setInterval(() => {
9818
9924
  if (scrollTowards(value) === true) {
9819
9925
  stopAnimScroll();
@@ -9830,7 +9936,10 @@ var QTabs = createComponent({
9830
9936
  }
9831
9937
 
9832
9938
  function stopAnimScroll () {
9833
- clearInterval(scrollTimer);
9939
+ if (scrollTimer !== null) {
9940
+ clearInterval(scrollTimer);
9941
+ scrollTimer = null;
9942
+ }
9834
9943
  }
9835
9944
 
9836
9945
  function onKbdNavigate (keyCode, fromEl) {
@@ -10134,7 +10243,7 @@ var QTabs = createComponent({
10134
10243
  provide(tabsKey, $tabs);
10135
10244
 
10136
10245
  function cleanup () {
10137
- clearTimeout(animateTimer);
10246
+ animateTimer !== null && clearTimeout(animateTimer);
10138
10247
  stopAnimScroll();
10139
10248
  unwatchRoute !== void 0 && unwatchRoute();
10140
10249
  }
@@ -14526,7 +14635,7 @@ let
14526
14635
  vpPendingUpdate = false,
14527
14636
  bodyLeft,
14528
14637
  bodyTop,
14529
- closeTimer;
14638
+ closeTimer = null;
14530
14639
 
14531
14640
  function onWheel (e) {
14532
14641
  if (shouldPreventScroll(e)) {
@@ -14673,9 +14782,9 @@ function preventScroll (state) {
14673
14782
  if (state === true) {
14674
14783
  registered++;
14675
14784
 
14676
- if (closeTimer !== void 0) {
14785
+ if (closeTimer !== null) {
14677
14786
  clearTimeout(closeTimer);
14678
- closeTimer = void 0;
14787
+ closeTimer = null;
14679
14788
  return
14680
14789
  }
14681
14790
 
@@ -14697,11 +14806,10 @@ function preventScroll (state) {
14697
14806
  action = 'remove';
14698
14807
 
14699
14808
  if (client.is.ios === true && client.is.nativeMobile === true) {
14700
- clearTimeout(closeTimer);
14701
-
14809
+ closeTimer !== null && clearTimeout(closeTimer);
14702
14810
  closeTimer = setTimeout(() => {
14703
14811
  apply$1(action);
14704
- closeTimer = void 0;
14812
+ closeTimer = null;
14705
14813
  }, 100);
14706
14814
  return
14707
14815
  }
@@ -14795,7 +14903,7 @@ var QDialog = createComponent({
14795
14903
  const showing = ref(false);
14796
14904
  const animating = ref(false);
14797
14905
 
14798
- let shakeTimeout, refocusTarget = null, isMaximized, avoidAutoClose;
14906
+ let shakeTimeout = null, refocusTarget = null, isMaximized, avoidAutoClose;
14799
14907
 
14800
14908
  const hideOnRouteChange = computed(() =>
14801
14909
  props.persistent !== true
@@ -14814,7 +14922,7 @@ var QDialog = createComponent({
14814
14922
  );
14815
14923
 
14816
14924
  const { showPortal, hidePortal, portalIsAccessible, renderPortal } = usePortal(
14817
- vm, innerRef, renderPortalContent, /* pls do check if on a global dialog */ true
14925
+ vm, innerRef, renderPortalContent, 'dialog'
14818
14926
  );
14819
14927
 
14820
14928
  const { hide } = useModelToggle({
@@ -14977,8 +15085,9 @@ var QDialog = createComponent({
14977
15085
  if (node !== null) {
14978
15086
  node.classList.remove('q-animate--scale');
14979
15087
  node.classList.add('q-animate--scale');
14980
- clearTimeout(shakeTimeout);
15088
+ shakeTimeout !== null && clearTimeout(shakeTimeout);
14981
15089
  shakeTimeout = setTimeout(() => {
15090
+ shakeTimeout = null;
14982
15091
  if (innerRef.value !== null) {
14983
15092
  node.classList.remove('q-animate--scale');
14984
15093
  // some platforms (like desktop Chrome)
@@ -15002,7 +15111,10 @@ var QDialog = createComponent({
15002
15111
  }
15003
15112
 
15004
15113
  function cleanup (hiding) {
15005
- clearTimeout(shakeTimeout);
15114
+ if (shakeTimeout !== null) {
15115
+ clearTimeout(shakeTimeout);
15116
+ shakeTimeout = null;
15117
+ }
15006
15118
 
15007
15119
  if (hiding === true || showing.value === true) {
15008
15120
  updateMaximized(false);
@@ -15193,7 +15305,7 @@ var QDrawer = createComponent({
15193
15305
  return emptyRenderFn
15194
15306
  }
15195
15307
 
15196
- let lastDesktopState, timerMini, layoutTotalWidthWatcher;
15308
+ let lastDesktopState, timerMini = null, layoutTotalWidthWatcher;
15197
15309
 
15198
15310
  const belowBreakpoint = ref(
15199
15311
  props.behavior === 'mobile'
@@ -15568,7 +15680,7 @@ var QDrawer = createComponent({
15568
15680
  }
15569
15681
 
15570
15682
  function animateMini () {
15571
- clearTimeout(timerMini);
15683
+ timerMini !== null && clearTimeout(timerMini);
15572
15684
 
15573
15685
  if (vm.proxy && vm.proxy.$el) {
15574
15686
  // need to speed it up and apply it immediately,
@@ -15578,6 +15690,7 @@ var QDrawer = createComponent({
15578
15690
 
15579
15691
  flagMiniAnimate.value = true;
15580
15692
  timerMini = setTimeout(() => {
15693
+ timerMini = null;
15581
15694
  flagMiniAnimate.value = false;
15582
15695
  if (vm && vm.proxy && vm.proxy.$el) {
15583
15696
  vm.proxy.$el.classList.remove('q-drawer--mini-animate');
@@ -15730,7 +15843,11 @@ var QDrawer = createComponent({
15730
15843
 
15731
15844
  onBeforeUnmount(() => {
15732
15845
  layoutTotalWidthWatcher !== void 0 && layoutTotalWidthWatcher();
15733
- clearTimeout(timerMini);
15846
+
15847
+ if (timerMini !== null) {
15848
+ clearTimeout(timerMini);
15849
+ timerMini = null;
15850
+ }
15734
15851
 
15735
15852
  showing.value === true && cleanup();
15736
15853
 
@@ -16265,7 +16382,7 @@ var QTooltip = createComponent({
16265
16382
 
16266
16383
  Object.assign(anchorEvents, { delayShow, delayHide });
16267
16384
 
16268
- const { showPortal, hidePortal, renderPortal } = usePortal(vm, innerRef, renderPortalContent);
16385
+ const { showPortal, hidePortal, renderPortal } = usePortal(vm, innerRef, renderPortalContent, 'tooltip');
16269
16386
 
16270
16387
  // if we're on mobile, let's improve the experience
16271
16388
  // by closing it when user taps outside of it
@@ -17600,15 +17717,23 @@ var QSlideTransition = createComponent({
17600
17717
 
17601
17718
  setup (props, { slots, emit }) {
17602
17719
  let animating = false, doneFn, element;
17603
- let timer, timerFallback, animListener, lastEvent;
17720
+ let timer = null, timerFallback = null, animListener, lastEvent;
17604
17721
 
17605
17722
  function cleanup () {
17606
17723
  doneFn && doneFn();
17607
17724
  doneFn = null;
17608
17725
  animating = false;
17609
17726
 
17610
- clearTimeout(timer);
17611
- clearTimeout(timerFallback);
17727
+ if (timer !== null) {
17728
+ clearTimeout(timer);
17729
+ timer = null;
17730
+ }
17731
+
17732
+ if (timerFallback !== null) {
17733
+ clearTimeout(timerFallback);
17734
+ timerFallback = null;
17735
+ }
17736
+
17612
17737
  element !== void 0 && element.removeEventListener('transitionend', animListener);
17613
17738
  animListener = null;
17614
17739
  }
@@ -17647,8 +17772,11 @@ var QSlideTransition = createComponent({
17647
17772
  begin(el, pos, done);
17648
17773
 
17649
17774
  timer = setTimeout(() => {
17775
+ timer = null;
17650
17776
  el.style.height = `${ el.scrollHeight }px`;
17651
17777
  animListener = evt => {
17778
+ timerFallback = null;
17779
+
17652
17780
  if (Object(evt) !== evt || evt.target === el) {
17653
17781
  end(el, 'show');
17654
17782
  }
@@ -17673,8 +17801,11 @@ var QSlideTransition = createComponent({
17673
17801
  begin(el, pos, done);
17674
17802
 
17675
17803
  timer = setTimeout(() => {
17804
+ timer = null;
17676
17805
  el.style.height = 0;
17677
17806
  animListener = evt => {
17807
+ timerFallback = null;
17808
+
17678
17809
  if (Object(evt) !== evt || evt.target === el) {
17679
17810
  end(el, 'hide');
17680
17811
  }
@@ -18810,7 +18941,7 @@ function useField (state) {
18810
18941
  const { props, emit, slots, attrs, proxy } = getCurrentInstance();
18811
18942
  const { $q } = proxy;
18812
18943
 
18813
- let focusoutTimer;
18944
+ let focusoutTimer = null;
18814
18945
 
18815
18946
  if (state.hasValue === void 0) {
18816
18947
  state.hasValue = computed(() => fieldValueIsFilled(props.modelValue));
@@ -18976,7 +19107,11 @@ function useField (state) {
18976
19107
  }
18977
19108
 
18978
19109
  function onControlFocusin (e) {
18979
- clearTimeout(focusoutTimer);
19110
+ if (focusoutTimer !== null) {
19111
+ clearTimeout(focusoutTimer);
19112
+ focusoutTimer = null;
19113
+ }
19114
+
18980
19115
  if (state.editable.value === true && state.focused.value === false) {
18981
19116
  state.focused.value = true;
18982
19117
  emit('focus', e);
@@ -18984,8 +19119,10 @@ function useField (state) {
18984
19119
  }
18985
19120
 
18986
19121
  function onControlFocusout (e, then) {
18987
- clearTimeout(focusoutTimer);
19122
+ focusoutTimer !== null && clearTimeout(focusoutTimer);
18988
19123
  focusoutTimer = setTimeout(() => {
19124
+ focusoutTimer = null;
19125
+
18989
19126
  if (
18990
19127
  document.hasFocus() === true && (
18991
19128
  state.hasPopupOpen === true
@@ -19235,7 +19372,7 @@ function useField (state) {
19235
19372
  });
19236
19373
 
19237
19374
  onBeforeUnmount(() => {
19238
- clearTimeout(focusoutTimer);
19375
+ focusoutTimer !== null && clearTimeout(focusoutTimer);
19239
19376
  });
19240
19377
 
19241
19378
  // expose public methods
@@ -20538,7 +20675,7 @@ var QImg = createComponent({
20538
20675
  const naturalRatio = ref(props.initialRatio);
20539
20676
  const ratioStyle = useRatio(props, naturalRatio);
20540
20677
 
20541
- let loadTimer;
20678
+ let loadTimer = null, isDestroyed = false;
20542
20679
 
20543
20680
  const images = [
20544
20681
  ref(null),
@@ -20589,7 +20726,11 @@ var QImg = createComponent({
20589
20726
  }
20590
20727
 
20591
20728
  function addImage (imgProps) {
20592
- clearTimeout(loadTimer);
20729
+ if (loadTimer !== null) {
20730
+ clearTimeout(loadTimer);
20731
+ loadTimer = null;
20732
+ }
20733
+
20593
20734
  hasError.value = false;
20594
20735
 
20595
20736
  if (imgProps === null) {
@@ -20604,10 +20745,12 @@ var QImg = createComponent({
20604
20745
  }
20605
20746
 
20606
20747
  function onLoad ({ target }) {
20607
- // if component has been already destroyed
20608
- if (loadTimer === null) { return }
20748
+ if (isDestroyed === true) { return }
20609
20749
 
20610
- clearTimeout(loadTimer);
20750
+ if (loadTimer !== null) {
20751
+ clearTimeout(loadTimer);
20752
+ loadTimer = null;
20753
+ }
20611
20754
 
20612
20755
  naturalRatio.value = target.naturalHeight === 0
20613
20756
  ? 0.5
@@ -20618,21 +20761,21 @@ var QImg = createComponent({
20618
20761
 
20619
20762
  function waitForCompleteness (target, count) {
20620
20763
  // protect against running forever
20621
- if (loadTimer === null || count === 1000) { return }
20764
+ if (isDestroyed === true || count === 1000) { return }
20622
20765
 
20623
20766
  if (target.complete === true) {
20624
20767
  onReady(target);
20625
20768
  }
20626
20769
  else {
20627
20770
  loadTimer = setTimeout(() => {
20771
+ loadTimer = null;
20628
20772
  waitForCompleteness(target, count + 1);
20629
20773
  }, 50);
20630
20774
  }
20631
20775
  }
20632
20776
 
20633
20777
  function onReady (img) {
20634
- // if component has been already destroyed
20635
- if (loadTimer === null) { return }
20778
+ if (isDestroyed === true) { return }
20636
20779
 
20637
20780
  position.value = position.value ^ 1;
20638
20781
  images[ position.value ].value = null;
@@ -20642,7 +20785,11 @@ var QImg = createComponent({
20642
20785
  }
20643
20786
 
20644
20787
  function onError (err) {
20645
- clearTimeout(loadTimer);
20788
+ if (loadTimer !== null) {
20789
+ clearTimeout(loadTimer);
20790
+ loadTimer = null;
20791
+ }
20792
+
20646
20793
  isLoading.value = false;
20647
20794
  hasError.value = true;
20648
20795
  images[ position.value ].value = null;
@@ -20722,8 +20869,12 @@ var QImg = createComponent({
20722
20869
  }
20723
20870
 
20724
20871
  onBeforeUnmount(() => {
20725
- clearTimeout(loadTimer);
20726
- loadTimer = null;
20872
+ isDestroyed = true;
20873
+
20874
+ if (loadTimer !== null) {
20875
+ clearTimeout(loadTimer);
20876
+ loadTimer = null;
20877
+ }
20727
20878
  });
20728
20879
  }
20729
20880
 
@@ -21667,7 +21818,7 @@ var QInput = createComponent({
21667
21818
  const { $q } = proxy;
21668
21819
 
21669
21820
  const temp = {};
21670
- let emitCachedValue = NaN, typedNumber, stopValueWatcher, emitTimer, emitValueFn;
21821
+ let emitCachedValue = NaN, typedNumber, stopValueWatcher, emitTimer = null, emitValueFn;
21671
21822
 
21672
21823
  const inputRef = ref(null);
21673
21824
  const nameProp = useFormInputNameAttr(props);
@@ -21879,6 +22030,8 @@ var QInput = createComponent({
21879
22030
 
21880
22031
  function emitValue (val, stopWatcher) {
21881
22032
  emitValueFn = () => {
22033
+ emitTimer = null;
22034
+
21882
22035
  if (
21883
22036
  props.type !== 'number'
21884
22037
  && temp.hasOwnProperty('value') === true
@@ -21906,7 +22059,7 @@ var QInput = createComponent({
21906
22059
  }
21907
22060
 
21908
22061
  if (props.debounce !== void 0) {
21909
- clearTimeout(emitTimer);
22062
+ emitTimer !== null && clearTimeout(emitTimer);
21910
22063
  temp.value = val;
21911
22064
  emitTimer = setTimeout(emitValueFn, props.debounce);
21912
22065
  }
@@ -21940,7 +22093,11 @@ var QInput = createComponent({
21940
22093
  function onChange (e) {
21941
22094
  onComposition(e);
21942
22095
 
21943
- clearTimeout(emitTimer);
22096
+ if (emitTimer !== null) {
22097
+ clearTimeout(emitTimer);
22098
+ emitTimer = null;
22099
+ }
22100
+
21944
22101
  emitValueFn !== void 0 && emitValueFn();
21945
22102
 
21946
22103
  emit('change', e.target.value);
@@ -21949,7 +22106,11 @@ var QInput = createComponent({
21949
22106
  function onFinishEditing (e) {
21950
22107
  e !== void 0 && stop(e);
21951
22108
 
21952
- clearTimeout(emitTimer);
22109
+ if (emitTimer !== null) {
22110
+ clearTimeout(emitTimer);
22111
+ emitTimer = null;
22112
+ }
22113
+
21953
22114
  emitValueFn !== void 0 && emitValueFn();
21954
22115
 
21955
22116
  typedNumber = false;
@@ -22793,7 +22954,7 @@ var QLayout = createComponent({
22793
22954
  }
22794
22955
  }
22795
22956
 
22796
- let timer;
22957
+ let animateTimer = null;
22797
22958
 
22798
22959
  const $layout = {
22799
22960
  instances: {},
@@ -22824,16 +22985,16 @@ var QLayout = createComponent({
22824
22985
  scroll,
22825
22986
 
22826
22987
  animate () {
22827
- if (timer !== void 0) {
22828
- clearTimeout(timer);
22988
+ if (animateTimer !== null) {
22989
+ clearTimeout(animateTimer);
22829
22990
  }
22830
22991
  else {
22831
22992
  document.body.classList.add('q-body--layout-animate');
22832
22993
  }
22833
22994
 
22834
- timer = setTimeout(() => {
22995
+ animateTimer = setTimeout(() => {
22996
+ animateTimer = null;
22835
22997
  document.body.classList.remove('q-body--layout-animate');
22836
- timer = void 0;
22837
22998
  }, 155);
22838
22999
  },
22839
23000
 
@@ -24901,6 +25062,8 @@ var QPullToRefresh = createComponent({
24901
25062
  });
24902
25063
  }
24903
25064
 
25065
+ let $el, localScrollTarget, timer = null;
25066
+
24904
25067
  function animateTo ({ pos, ratio }, done) {
24905
25068
  animating.value = true;
24906
25069
  pullPosition.value = pos;
@@ -24909,15 +25072,14 @@ var QPullToRefresh = createComponent({
24909
25072
  pullRatio.value = ratio;
24910
25073
  }
24911
25074
 
24912
- clearTimeout(timer);
25075
+ timer !== null && clearTimeout(timer);
24913
25076
  timer = setTimeout(() => {
25077
+ timer = null;
24914
25078
  animating.value = false;
24915
25079
  done && done();
24916
25080
  }, 300);
24917
25081
  }
24918
25082
 
24919
- let $el, localScrollTarget, timer;
24920
-
24921
25083
  function updateScrollTarget () {
24922
25084
  localScrollTarget = getScrollTarget($el, props.scrollTarget);
24923
25085
  }
@@ -24930,7 +25092,7 @@ var QPullToRefresh = createComponent({
24930
25092
  });
24931
25093
 
24932
25094
  onBeforeUnmount(() => {
24933
- clearTimeout(timer);
25095
+ timer !== null && clearTimeout(timer);
24934
25096
  });
24935
25097
 
24936
25098
  // expose public methods
@@ -25719,7 +25881,7 @@ var QScrollArea = createComponent({
25719
25881
 
25720
25882
  const isDark = useDark(props, proxy.$q);
25721
25883
 
25722
- let timer, panRefPos;
25884
+ let timer = null, panRefPos;
25723
25885
 
25724
25886
  const targetRef = ref(null);
25725
25887
 
@@ -25968,14 +26130,14 @@ var QScrollArea = createComponent({
25968
26130
  }
25969
26131
 
25970
26132
  function startTimer () {
25971
- if (tempShowing.value === true) {
25972
- clearTimeout(timer);
25973
- }
25974
- else {
25975
- tempShowing.value = true;
25976
- }
26133
+ tempShowing.value = true;
26134
+
26135
+ timer !== null && clearTimeout(timer);
26136
+ timer = setTimeout(() => {
26137
+ timer = null;
26138
+ tempShowing.value = false;
26139
+ }, props.delay);
25977
26140
 
25978
- timer = setTimeout(() => { tempShowing.value = false; }, props.delay);
25979
26141
  props.onScroll !== void 0 && emitScroll();
25980
26142
  }
25981
26143
 
@@ -26977,8 +27139,8 @@ var QSelect = createComponent({
26977
27139
  const dialogFieldFocused = ref(false);
26978
27140
  const innerLoadingIndicator = ref(false);
26979
27141
 
26980
- let inputTimer, innerValueCache,
26981
- hasDialog, userInputValue, filterId, defaultInputValue,
27142
+ let inputTimer = null, innerValueCache,
27143
+ hasDialog, userInputValue, filterId = null, defaultInputValue,
26982
27144
  transitionShowComputed, searchBuffer, searchBufferExp;
26983
27145
 
26984
27146
  const inputRef = ref(null);
@@ -27484,7 +27646,12 @@ var QSelect = createComponent({
27484
27646
  }
27485
27647
 
27486
27648
  e.target.value = '';
27487
- clearTimeout(inputTimer);
27649
+
27650
+ if (inputTimer !== null) {
27651
+ clearTimeout(inputTimer);
27652
+ inputTimer = null;
27653
+ }
27654
+
27488
27655
  resetInputValue();
27489
27656
 
27490
27657
  if (typeof value === 'string' && value.length > 0) {
@@ -27849,7 +28016,10 @@ var QSelect = createComponent({
27849
28016
  }
27850
28017
 
27851
28018
  function onInput (e) {
27852
- clearTimeout(inputTimer);
28019
+ if (inputTimer !== null) {
28020
+ clearTimeout(inputTimer);
28021
+ inputTimer = null;
28022
+ }
27853
28023
 
27854
28024
  if (e && e.target && e.target.qComposing === true) {
27855
28025
  return
@@ -27870,6 +28040,7 @@ var QSelect = createComponent({
27870
28040
 
27871
28041
  if (props.onFilter !== void 0) {
27872
28042
  inputTimer = setTimeout(() => {
28043
+ inputTimer = null;
27873
28044
  filter(inputValue.value);
27874
28045
  }, props.inputDebounce);
27875
28046
  }
@@ -27923,7 +28094,7 @@ var QSelect = createComponent({
27923
28094
  menu.value === true && (menu.value = false);
27924
28095
  }, 10);
27925
28096
 
27926
- clearTimeout(filterId);
28097
+ filterId !== null && clearTimeout(filterId);
27927
28098
  filterId = localFilterId;
27928
28099
 
27929
28100
  emit(
@@ -28115,8 +28286,10 @@ var QSelect = createComponent({
28115
28286
  }
28116
28287
 
28117
28288
  if (state.focused.value === false) {
28118
- clearTimeout(filterId);
28119
- filterId = void 0;
28289
+ if (filterId !== null) {
28290
+ clearTimeout(filterId);
28291
+ filterId = null;
28292
+ }
28120
28293
 
28121
28294
  if (state.innerLoading.value === true) {
28122
28295
  emit('filterAbort');
@@ -28237,7 +28410,7 @@ var QSelect = createComponent({
28237
28410
  updatePreState();
28238
28411
 
28239
28412
  onBeforeUnmount(() => {
28240
- clearTimeout(inputTimer);
28413
+ inputTimer !== null && clearTimeout(inputTimer);
28241
28414
  });
28242
28415
 
28243
28416
  // expose public methods
@@ -28497,7 +28670,7 @@ var QSlideItem = createComponent({
28497
28670
 
28498
28671
  const contentRef = ref(null);
28499
28672
 
28500
- let timer, pan = {}, dirRefs = {}, dirContentRefs = {};
28673
+ let timer = null, pan = {}, dirRefs = {}, dirContentRefs = {};
28501
28674
 
28502
28675
  const langDir = computed(() => (
28503
28676
  $q.lang.rtl === true
@@ -28548,7 +28721,9 @@ var QSlideItem = createComponent({
28548
28721
  if (pan.scale === 1) {
28549
28722
  node.style.transform = `translate${ pan.axis }(${ pan.dir * 100 }%)`;
28550
28723
 
28724
+ timer !== null && clearTimeout(timer);
28551
28725
  timer = setTimeout(() => {
28726
+ timer = null;
28552
28727
  emit(pan.showing, { reset });
28553
28728
  emit('action', { side: pan.showing, reset });
28554
28729
  }, 230);
@@ -28619,7 +28794,7 @@ var QSlideItem = createComponent({
28619
28794
  });
28620
28795
 
28621
28796
  onBeforeUnmount(() => {
28622
- clearTimeout(timer);
28797
+ timer !== null && clearTimeout(timer);
28623
28798
  });
28624
28799
 
28625
28800
  // expose public methods
@@ -36854,12 +37029,11 @@ function morph (_options) {
36854
37029
  : (
36855
37030
  options.waitFor === 'transitionend'
36856
37031
  ? new Promise(resolve => {
36857
- const timer = setTimeout(() => {
36858
- endFn();
36859
- }, 400);
36860
-
36861
- const endFn = ev => {
36862
- clearTimeout(timer);
37032
+ const endFn = () => {
37033
+ if (timer !== null) {
37034
+ clearTimeout(timer);
37035
+ timer = null;
37036
+ }
36863
37037
 
36864
37038
  if (elTo) {
36865
37039
  elTo.removeEventListener('transitionend', endFn);
@@ -36869,6 +37043,8 @@ function morph (_options) {
36869
37043
  resolve();
36870
37044
  };
36871
37045
 
37046
+ let timer = setTimeout(endFn, 400);
37047
+
36872
37048
  elTo.addEventListener('transitionend', endFn);
36873
37049
  elTo.addEventListener('transitioncancel', endFn);
36874
37050
  })
@@ -37337,6 +37513,7 @@ var TouchHold = createDirective({
37337
37513
  : ctx.touchSensitivity;
37338
37514
 
37339
37515
  ctx.timer = setTimeout(() => {
37516
+ ctx.timer = void 0;
37340
37517
  clearSelection();
37341
37518
  ctx.triggered = true;
37342
37519
 
@@ -37353,10 +37530,13 @@ var TouchHold = createDirective({
37353
37530
  move (evt) {
37354
37531
  const { top, left } = position(evt);
37355
37532
  if (
37356
- Math.abs(left - ctx.origin.left) >= ctx.sensitivity
37357
- || Math.abs(top - ctx.origin.top) >= ctx.sensitivity
37533
+ ctx.timer !== void 0 && (
37534
+ Math.abs(left - ctx.origin.left) >= ctx.sensitivity
37535
+ || Math.abs(top - ctx.origin.top) >= ctx.sensitivity
37536
+ )
37358
37537
  ) {
37359
37538
  clearTimeout(ctx.timer);
37539
+ ctx.timer = void 0;
37360
37540
  }
37361
37541
  },
37362
37542
 
@@ -37369,8 +37549,9 @@ var TouchHold = createDirective({
37369
37549
  if (ctx.triggered === true) {
37370
37550
  evt !== void 0 && stopAndPrevent(evt);
37371
37551
  }
37372
- else {
37552
+ else if (ctx.timer !== void 0) {
37373
37553
  clearTimeout(ctx.timer);
37554
+ ctx.timer = void 0;
37374
37555
  }
37375
37556
  }
37376
37557
  };
@@ -37422,7 +37603,7 @@ var TouchHold = createDirective({
37422
37603
  cleanEvt(ctx, 'main');
37423
37604
  cleanEvt(ctx, 'temp');
37424
37605
 
37425
- clearTimeout(ctx.timer);
37606
+ ctx.timer !== void 0 && clearTimeout(ctx.timer);
37426
37607
  ctx.styleCleanup !== void 0 && ctx.styleCleanup();
37427
37608
 
37428
37609
  delete el.__qtouchhold;
@@ -37561,6 +37742,8 @@ var TouchRepeat = createDirective({
37561
37742
  };
37562
37743
 
37563
37744
  const fn = () => {
37745
+ ctx.timer = void 0;
37746
+
37564
37747
  if (ctx.event === void 0) {
37565
37748
  return
37566
37749
  }
@@ -37604,8 +37787,9 @@ var TouchRepeat = createDirective({
37604
37787
  },
37605
37788
 
37606
37789
  move (evt) {
37607
- if (ctx.event !== void 0 && shouldEnd(evt, ctx.origin) === true) {
37790
+ if (ctx.event !== void 0 && ctx.timer !== void 0 && shouldEnd(evt, ctx.origin) === true) {
37608
37791
  clearTimeout(ctx.timer);
37792
+ ctx.timer = void 0;
37609
37793
  }
37610
37794
  },
37611
37795
 
@@ -37618,7 +37802,11 @@ var TouchRepeat = createDirective({
37618
37802
  evt !== void 0 && ctx.event.repeatCount > 0 && stopAndPrevent(evt);
37619
37803
 
37620
37804
  cleanEvt(ctx, 'temp');
37621
- clearTimeout(ctx.timer);
37805
+
37806
+ if (ctx.timer !== void 0) {
37807
+ clearTimeout(ctx.timer);
37808
+ ctx.timer = void 0;
37809
+ }
37622
37810
 
37623
37811
  ctx.event = void 0;
37624
37812
  }
@@ -37667,7 +37855,7 @@ var TouchRepeat = createDirective({
37667
37855
  const ctx = el.__qtouchrepeat;
37668
37856
 
37669
37857
  if (ctx !== void 0) {
37670
- clearTimeout(ctx.timer);
37858
+ ctx.timer !== void 0 && clearTimeout(ctx.timer);
37671
37859
 
37672
37860
  cleanEvt(ctx, 'main');
37673
37861
  cleanEvt(ctx, 'temp');
@@ -38116,7 +38304,7 @@ function globalDialog (DefaultComponent, supportsCustomComponent, parentApp) {
38116
38304
 
38117
38305
  let vm, emittedOK = false;
38118
38306
  const dialogRef = ref(null);
38119
- const el = createGlobalNode();
38307
+ const el = createGlobalNode(false, 'dialog');
38120
38308
 
38121
38309
  const applyState = cmd => {
38122
38310
  if (dialogRef.value !== null && dialogRef.value[ cmd ] !== void 0) {
@@ -38824,7 +39012,7 @@ let
38824
39012
  app,
38825
39013
  vm,
38826
39014
  uid$1 = 0,
38827
- timeout,
39015
+ timeout = null,
38828
39016
  props = {},
38829
39017
  activeGroups = {};
38830
39018
 
@@ -38873,10 +39061,10 @@ const Plugin$2 = defineReactivePlugin({
38873
39061
  }
38874
39062
  else {
38875
39063
  props.uid = ++uid$1;
38876
- clearTimeout(timeout);
39064
+ timeout !== null && clearTimeout(timeout);
38877
39065
 
38878
39066
  timeout = setTimeout(() => {
38879
- timeout = void 0;
39067
+ timeout = null;
38880
39068
 
38881
39069
  const el = createGlobalNode('q-loading');
38882
39070
 
@@ -38986,9 +39174,9 @@ const Plugin$2 = defineReactivePlugin({
38986
39174
  }
38987
39175
  }
38988
39176
 
38989
- if (timeout !== void 0) {
39177
+ if (timeout !== null) {
38990
39178
  clearTimeout(timeout);
38991
- timeout = void 0;
39179
+ timeout = null;
38992
39180
  }
38993
39181
 
38994
39182
  Plugin$2.isActive = false;
@@ -39010,7 +39198,7 @@ const Plugin$2 = defineReactivePlugin({
39010
39198
  }
39011
39199
  });
39012
39200
 
39013
- let updateId, currentClientMeta;
39201
+ let updateId = null, currentClientMeta;
39014
39202
  const clientList = [];
39015
39203
 
39016
39204
  function normalize (meta) {
@@ -39144,6 +39332,8 @@ function apply ({ add, remove }) {
39144
39332
  }
39145
39333
 
39146
39334
  function updateClientMeta () {
39335
+ updateId = null;
39336
+
39147
39337
  const data = {
39148
39338
  title: '',
39149
39339
  titleTemplate: null,
@@ -39169,7 +39359,7 @@ function updateClientMeta () {
39169
39359
  }
39170
39360
 
39171
39361
  function planClientUpdate () {
39172
- clearTimeout(updateId);
39362
+ updateId !== null && clearTimeout(updateId);
39173
39363
  updateId = setTimeout(updateClientMeta, 50);
39174
39364
  }
39175
39365
 
@@ -39396,7 +39586,10 @@ function addNotification (config, $q, originalApi) {
39396
39586
 
39397
39587
  if (originalApi !== void 0) {
39398
39588
  // reset timeout if any
39399
- clearTimeout(originalApi.notif.meta.timer);
39589
+ if (originalApi.notif.meta.timer) {
39590
+ clearTimeout(originalApi.notif.meta.timer);
39591
+ originalApi.notif.meta.timer = void 0;
39592
+ }
39400
39593
 
39401
39594
  // retain uid
39402
39595
  notif.meta.uid = originalApi.notif.meta.uid;
@@ -39432,7 +39625,10 @@ function addNotification (config, $q, originalApi) {
39432
39625
  // ok, so it's NOT a new one
39433
39626
  else {
39434
39627
  // reset timeout if any
39435
- clearTimeout(original.meta.timer);
39628
+ if (original.meta.timer) {
39629
+ clearTimeout(original.meta.timer);
39630
+ original.meta.timer = void 0;
39631
+ }
39436
39632
 
39437
39633
  if (notif.badgePosition !== void 0) {
39438
39634
  if (badgePositions.includes(notif.badgePosition) === false) {
@@ -39462,6 +39658,7 @@ function addNotification (config, $q, originalApi) {
39462
39658
 
39463
39659
  if (notif.timeout > 0) {
39464
39660
  notif.meta.timer = setTimeout(() => {
39661
+ notif.meta.timer = void 0;
39465
39662
  dismiss();
39466
39663
  }, notif.timeout + /* show duration */ 1000);
39467
39664
  }
@@ -39510,7 +39707,10 @@ function addNotification (config, $q, originalApi) {
39510
39707
  }
39511
39708
 
39512
39709
  function removeNotification (notif) {
39513
- clearTimeout(notif.meta.timer);
39710
+ if (notif.meta.timer) {
39711
+ clearTimeout(notif.meta.timer);
39712
+ notif.meta.timer = void 0;
39713
+ }
39514
39714
 
39515
39715
  const index = notificationsList[ notif.position ].value.indexOf(notif);
39516
39716
  if (index !== -1) {
@@ -40340,7 +40540,7 @@ function runSequentialPromises (
40340
40540
  */
40341
40541
 
40342
40542
  const Quasar = {
40343
- version: '2.11.3',
40543
+ version: '2.11.4',
40344
40544
  install: installQuasar,
40345
40545
  lang: Plugin$8,
40346
40546
  iconSet: Plugin$7