quasar 2.11.3 → 2.11.5

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.esm.js +445 -196
  104. package/dist/quasar.esm.prod.js +2 -2
  105. package/dist/quasar.sass +1 -1
  106. package/dist/quasar.umd.js +445 -196
  107. package/dist/quasar.umd.prod.js +2 -2
  108. package/dist/web-types/web-types.json +1 -1
  109. package/package.json +1 -1
  110. package/src/components/ajax-bar/QAjaxBar.js +13 -5
  111. package/src/components/btn/QBtn.js +3 -2
  112. package/src/components/carousel/QCarousel.js +17 -10
  113. package/src/components/dialog/QDialog.js +10 -5
  114. package/src/components/drawer/QDrawer.js +8 -3
  115. package/src/components/img/QImg.js +25 -11
  116. package/src/components/infinite-scroll/QInfiniteScroll.js +26 -4
  117. package/src/components/input/QInput.js +14 -4
  118. package/src/components/layout/QLayout.js +5 -5
  119. package/src/components/menu/QMenu.js +1 -1
  120. package/src/components/pull-to-refresh/QPullToRefresh.js +5 -4
  121. package/src/components/rating/QRating.js +3 -3
  122. package/src/components/resize-observer/QResizeObserver.js +9 -4
  123. package/src/components/scroll-area/QScrollArea.js +8 -8
  124. package/src/components/select/QSelect.js +19 -8
  125. package/src/components/slide-item/QSlideItem.js +4 -2
  126. package/src/components/slide-transition/QSlideTransition.js +17 -3
  127. package/src/components/tabs/QTabs.js +12 -5
  128. package/src/components/tooltip/QTooltip.js +1 -1
  129. package/src/components/virtual-scroll/use-virtual-scroll.js +5 -1
  130. package/src/composables/private/use-anchor.js +8 -3
  131. package/src/composables/private/use-field.js +10 -4
  132. package/src/composables/private/use-portal.js +3 -3
  133. package/src/composables/private/use-timeout.js +6 -3
  134. package/src/directives/TouchHold.js +9 -4
  135. package/src/directives/TouchRepeat.js +10 -3
  136. package/src/plugins/Loading.js +16 -11
  137. package/src/plugins/Meta.js +4 -2
  138. package/src/plugins/Notify.js +13 -3
  139. package/src/utils/copy-to-clipboard.js +8 -0
  140. package/src/utils/debounce.js +9 -6
  141. package/src/utils/is.js +11 -6
  142. package/src/utils/morph.js +7 -6
  143. package/src/utils/prevent-scroll.js +14 -7
  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.5
3
3
  * (c) 2015-present Razvan Stoenescu
4
4
  * Released under the MIT License.
5
5
  */
@@ -557,27 +557,30 @@
557
557
  };
558
558
 
559
559
  function debounce (fn, wait = 250, immediate) {
560
- let timeout;
560
+ let timer = null;
561
561
 
562
562
  function debounced (/* ...args */) {
563
563
  const args = arguments;
564
564
 
565
565
  const later = () => {
566
- timeout = void 0;
566
+ timer = null;
567
567
  if (immediate !== true) {
568
568
  fn.apply(this, args);
569
569
  }
570
570
  };
571
571
 
572
- clearTimeout(timeout);
573
- if (immediate === true && timeout === void 0) {
572
+ if (timer !== null) {
573
+ clearTimeout(timer);
574
+ }
575
+ else if (immediate === true) {
574
576
  fn.apply(this, args);
575
577
  }
576
- timeout = setTimeout(later, wait);
578
+
579
+ timer = setTimeout(later, wait);
577
580
  }
578
581
 
579
582
  debounced.cancel = () => {
580
- clearTimeout(timeout);
583
+ timer !== null && clearTimeout(timer);
581
584
  };
582
585
 
583
586
  return debounced
@@ -1473,20 +1476,23 @@
1473
1476
  return false
1474
1477
  }
1475
1478
 
1476
- i = a.entries().next();
1479
+ let iter = a.entries();
1480
+
1481
+ i = iter.next();
1477
1482
  while (i.done !== true) {
1478
1483
  if (b.has(i.value[ 0 ]) !== true) {
1479
1484
  return false
1480
1485
  }
1481
- i = i.next();
1486
+ i = iter.next();
1482
1487
  }
1483
1488
 
1484
- i = a.entries().next();
1489
+ iter = a.entries();
1490
+ i = iter.next();
1485
1491
  while (i.done !== true) {
1486
1492
  if (isDeepEqual(i.value[ 1 ], b.get(i.value[ 0 ])) !== true) {
1487
1493
  return false
1488
1494
  }
1489
- i = i.next();
1495
+ i = iter.next();
1490
1496
  }
1491
1497
 
1492
1498
  return true
@@ -1497,12 +1503,14 @@
1497
1503
  return false
1498
1504
  }
1499
1505
 
1500
- i = a.entries().next();
1506
+ const iter = a.entries();
1507
+
1508
+ i = iter.next();
1501
1509
  while (i.done !== true) {
1502
1510
  if (b.has(i.value[ 0 ]) !== true) {
1503
1511
  return false
1504
1512
  }
1505
- i = i.next();
1513
+ i = iter.next();
1506
1514
  }
1507
1515
 
1508
1516
  return true
@@ -1645,7 +1653,7 @@
1645
1653
  }
1646
1654
 
1647
1655
  var installQuasar = function (parentApp, opts = {}) {
1648
- const $q = { version: '2.11.3' };
1656
+ const $q = { version: '2.11.5' };
1649
1657
 
1650
1658
  if (globalConfigIsFrozen === false) {
1651
1659
  if (opts.config !== void 0) {
@@ -1844,7 +1852,7 @@
1844
1852
  const onScreen = vue.ref(false);
1845
1853
  const animate = vue.ref(true);
1846
1854
 
1847
- let sessions = 0, timer, speed;
1855
+ let sessions = 0, timer = null, speed;
1848
1856
 
1849
1857
  const classes = vue.computed(() =>
1850
1858
  `q-loading-bar q-loading-bar--${ props.position }`
@@ -1896,19 +1904,21 @@
1896
1904
  if (oldSpeed === 0 && newSpeed > 0) {
1897
1905
  planNextStep();
1898
1906
  }
1899
- else if (oldSpeed > 0 && newSpeed <= 0) {
1907
+ else if (timer !== null && oldSpeed > 0 && newSpeed <= 0) {
1900
1908
  clearTimeout(timer);
1909
+ timer = null;
1901
1910
  }
1902
1911
 
1903
1912
  return sessions
1904
1913
  }
1905
1914
 
1906
- clearTimeout(timer);
1915
+ timer !== null && clearTimeout(timer);
1907
1916
  emit('start');
1908
1917
 
1909
1918
  progress.value = 0;
1910
1919
 
1911
1920
  timer = setTimeout(() => {
1921
+ timer = null;
1912
1922
  animate.value = true;
1913
1923
  newSpeed > 0 && planNextStep();
1914
1924
  }, onScreen.value === true ? 500 : 1);
@@ -1935,13 +1945,18 @@
1935
1945
  return sessions
1936
1946
  }
1937
1947
 
1938
- clearTimeout(timer);
1948
+ if (timer !== null) {
1949
+ clearTimeout(timer);
1950
+ timer = null;
1951
+ }
1952
+
1939
1953
  emit('stop');
1940
1954
 
1941
1955
  const end = () => {
1942
1956
  animate.value = true;
1943
1957
  progress.value = 100;
1944
1958
  timer = setTimeout(() => {
1959
+ timer = null;
1945
1960
  onScreen.value = false;
1946
1961
  }, 1000);
1947
1962
  };
@@ -1959,6 +1974,7 @@
1959
1974
  function planNextStep () {
1960
1975
  if (progress.value < 100) {
1961
1976
  timer = setTimeout(() => {
1977
+ timer = null;
1962
1978
  increment();
1963
1979
  planNextStep();
1964
1980
  }, speed);
@@ -1979,7 +1995,7 @@
1979
1995
  });
1980
1996
 
1981
1997
  vue.onBeforeUnmount(() => {
1982
- clearTimeout(timer);
1998
+ timer !== null && clearTimeout(timer);
1983
1999
  hijacked === true && restoreAjax(start);
1984
2000
  });
1985
2001
 
@@ -3583,7 +3599,7 @@
3583
3599
  const rootRef = vue.ref(null);
3584
3600
  const blurTargetRef = vue.ref(null);
3585
3601
 
3586
- let localTouchTargetEl = null, avoidMouseRipple, mouseTimer;
3602
+ let localTouchTargetEl = null, avoidMouseRipple, mouseTimer = null;
3587
3603
 
3588
3604
  const hasLabel = vue.computed(() =>
3589
3605
  props.label !== void 0 && props.label !== null && props.label !== ''
@@ -3729,8 +3745,9 @@
3729
3745
  // avoid duplicated mousedown event
3730
3746
  // triggering another early ripple
3731
3747
  avoidMouseRipple = true;
3732
- clearTimeout(mouseTimer);
3748
+ mouseTimer !== null && clearTimeout(mouseTimer);
3733
3749
  mouseTimer = setTimeout(() => {
3750
+ mouseTimer = null;
3734
3751
  avoidMouseRipple = false;
3735
3752
  }, 200);
3736
3753
  }
@@ -3976,7 +3993,7 @@
3976
3993
 
3977
3994
  const anchorEl = vue.ref(null);
3978
3995
 
3979
- let touchTimer;
3996
+ let touchTimer = null;
3980
3997
 
3981
3998
  function canShow (evt) {
3982
3999
  // abort with no parent configured or on multi-touch
@@ -4035,6 +4052,7 @@
4035
4052
  ]);
4036
4053
 
4037
4054
  touchTimer = setTimeout(() => {
4055
+ touchTimer = null;
4038
4056
  proxy.show(evt);
4039
4057
  evt.qAnchorHandled = true;
4040
4058
  }, 300);
@@ -4042,7 +4060,11 @@
4042
4060
 
4043
4061
  mobileCleanup (evt) {
4044
4062
  anchorEl.value.classList.remove('non-selectable');
4045
- clearTimeout(touchTimer);
4063
+
4064
+ if (touchTimer !== null) {
4065
+ clearTimeout(touchTimer);
4066
+ touchTimer = null;
4067
+ }
4046
4068
 
4047
4069
  if (showing.value === true && evt !== void 0) {
4048
4070
  clearSelection();
@@ -4156,7 +4178,7 @@
4156
4178
  });
4157
4179
 
4158
4180
  vue.onBeforeUnmount(() => {
4159
- clearTimeout(touchTimer);
4181
+ touchTimer !== null && clearTimeout(touchTimer);
4160
4182
  unconfigureAnchorEl();
4161
4183
  });
4162
4184
 
@@ -4397,15 +4419,18 @@
4397
4419
  queue = queue.filter(entry => entry !== fn);
4398
4420
  }
4399
4421
 
4400
- const globalNodes = [];
4422
+ const nodesList = [];
4423
+ const portalTypeList = [];
4424
+
4425
+ let portalIndex = 1;
4401
4426
  let target = document.body;
4402
4427
 
4403
- function createGlobalNode (id) {
4428
+ function createGlobalNode (id, portalType) {
4404
4429
  const el = document.createElement('div');
4405
4430
 
4406
- if (id !== void 0) {
4407
- el.id = id;
4408
- }
4431
+ el.id = portalType !== void 0
4432
+ ? `q-portal--${ portalType }--${ portalIndex++ }`
4433
+ : id;
4409
4434
 
4410
4435
  if (globalConfig.globalNodes !== void 0) {
4411
4436
  const cls = globalConfig.globalNodes.class;
@@ -4415,25 +4440,53 @@
4415
4440
  }
4416
4441
 
4417
4442
  target.appendChild(el);
4418
- globalNodes.push(el);
4443
+ nodesList.push(el);
4444
+ portalTypeList.push(portalType);
4419
4445
 
4420
4446
  return el
4421
4447
  }
4422
4448
 
4423
4449
  function removeGlobalNode (el) {
4424
- globalNodes.splice(globalNodes.indexOf(el), 1);
4450
+ const nodeIndex = nodesList.indexOf(el);
4451
+
4452
+ nodesList.splice(nodeIndex, 1);
4453
+ portalTypeList.splice(nodeIndex, 1);
4454
+
4425
4455
  el.remove();
4426
4456
  }
4427
4457
 
4428
- function changeGlobalNodesTarget (el) {
4429
- if (el !== target) {
4430
- target = el;
4458
+ function changeGlobalNodesTarget (newTarget) {
4459
+ if (newTarget === target) {
4460
+ return
4461
+ }
4462
+
4463
+ target = newTarget;
4431
4464
 
4432
- globalNodes.forEach(el => {
4433
- if (el.contains(target) === false) {
4434
- target.appendChild(el);
4465
+ if (
4466
+ target === document.body
4467
+ // or we have less than 2 dialogs:
4468
+ || portalTypeList.reduce((acc, type) => (type === 'dialog' ? acc + 1 : acc), 0) < 2
4469
+ ) {
4470
+ nodesList.forEach(node => {
4471
+ if (node.contains(target) === false) {
4472
+ target.appendChild(node);
4435
4473
  }
4436
4474
  });
4475
+
4476
+ return
4477
+ }
4478
+
4479
+ const lastDialogIndex = portalTypeList.lastIndexOf('dialog');
4480
+
4481
+ for (let i = 0; i < nodesList.length; i++) {
4482
+ const el = nodesList[ i ];
4483
+
4484
+ if (
4485
+ (i === lastDialogIndex || portalTypeList[ i ] !== 'dialog')
4486
+ && el.contains(target) === false
4487
+ ) {
4488
+ target.appendChild(el);
4489
+ }
4437
4490
  }
4438
4491
  }
4439
4492
 
@@ -4512,7 +4565,7 @@
4512
4565
  // Warning!
4513
4566
  // You MUST specify "inheritAttrs: false" in your component
4514
4567
 
4515
- function usePortal (vm, innerRef, renderPortalContent, checkGlobalDialog) {
4568
+ function usePortal (vm, innerRef, renderPortalContent, type) {
4516
4569
  // showing, including while in show/hide transition
4517
4570
  const portalIsActive = vue.ref(false);
4518
4571
 
@@ -4521,7 +4574,7 @@
4521
4574
 
4522
4575
  let portalEl = null;
4523
4576
  const focusObj = {};
4524
- const onGlobalDialog = checkGlobalDialog === true && isOnGlobalDialog(vm);
4577
+ const onGlobalDialog = type === 'dialog' && isOnGlobalDialog(vm);
4525
4578
 
4526
4579
  function showPortal (isReady) {
4527
4580
  if (isReady === true) {
@@ -4534,7 +4587,7 @@
4534
4587
 
4535
4588
  if (portalIsActive.value === false) {
4536
4589
  if (onGlobalDialog === false && portalEl === null) {
4537
- portalEl = createGlobalNode();
4590
+ portalEl = createGlobalNode(false, type);
4538
4591
  }
4539
4592
 
4540
4593
  portalIsActive.value = true;
@@ -4675,11 +4728,14 @@
4675
4728
  */
4676
4729
 
4677
4730
  function useTimeout () {
4678
- let timer;
4731
+ let timer = null;
4679
4732
  const vm = vue.getCurrentInstance();
4680
4733
 
4681
4734
  function removeTimeout () {
4682
- clearTimeout(timer);
4735
+ if (timer !== null) {
4736
+ clearTimeout(timer);
4737
+ timer = null;
4738
+ }
4683
4739
  }
4684
4740
 
4685
4741
  vue.onDeactivated(removeTimeout);
@@ -4689,7 +4745,7 @@
4689
4745
  removeTimeout,
4690
4746
 
4691
4747
  registerTimeout (fn, delay) {
4692
- clearTimeout(timer);
4748
+ removeTimeout();
4693
4749
 
4694
4750
  if (vmIsDestroyed(vm) === false) {
4695
4751
  timer = setTimeout(fn, delay);
@@ -4971,14 +5027,11 @@
4971
5027
  }
4972
5028
  }
4973
5029
 
4974
- let timer;
4975
-
4976
5030
  const
4977
5031
  { notPassiveCapture } = listenOpts,
4978
5032
  registeredList = [];
4979
5033
 
4980
5034
  function globalHandler (evt) {
4981
- clearTimeout(timer);
4982
5035
 
4983
5036
  const target = evt.target;
4984
5037
 
@@ -5051,7 +5104,7 @@
5051
5104
  registeredList.splice(index, 1);
5052
5105
 
5053
5106
  if (registeredList.length === 0) {
5054
- clearTimeout(timer);
5107
+
5055
5108
  document.removeEventListener('mousedown', globalHandler, notPassiveCapture);
5056
5109
  document.removeEventListener('touchstart', globalHandler, notPassiveCapture);
5057
5110
  }
@@ -5119,17 +5172,32 @@
5119
5172
  }
5120
5173
 
5121
5174
  return {
5122
- top,
5123
- left,
5124
- right,
5125
- bottom,
5126
- width,
5127
- height,
5175
+ top, bottom, height,
5176
+ left, right, width,
5128
5177
  middle: left + (right - left) / 2,
5129
5178
  center: top + (bottom - top) / 2
5130
5179
  }
5131
5180
  }
5132
5181
 
5182
+ function getAbsoluteAnchorProps (el, absoluteOffset, offset) {
5183
+ let { top, left } = el.getBoundingClientRect();
5184
+
5185
+ top += absoluteOffset.top;
5186
+ left += absoluteOffset.left;
5187
+
5188
+ if (offset !== void 0) {
5189
+ top += offset[ 1 ];
5190
+ left += offset[ 0 ];
5191
+ }
5192
+
5193
+ return {
5194
+ top, bottom: top + 1, height: 1,
5195
+ left, right: left + 1, width: 1,
5196
+ middle: left,
5197
+ center: top
5198
+ }
5199
+ }
5200
+
5133
5201
  function getTargetProps (el) {
5134
5202
  return {
5135
5203
  top: 0,
@@ -5141,6 +5209,13 @@
5141
5209
  }
5142
5210
  }
5143
5211
 
5212
+ function getTopLeftProps (anchorProps, targetProps, cfg) {
5213
+ return {
5214
+ top: anchorProps[ cfg.anchorOrigin.vertical ] - targetProps[ cfg.selfOrigin.vertical ],
5215
+ left: anchorProps[ cfg.anchorOrigin.horizontal ] - targetProps[ cfg.selfOrigin.horizontal ]
5216
+ }
5217
+ }
5218
+
5144
5219
  // cfg: { el, anchorEl, anchorOrigin, selfOrigin, offset, absoluteOffset, cover, fit, maxHeight, maxWidth }
5145
5220
  function setPosition (cfg) {
5146
5221
  if (client.is.ios === true && window.visualViewport !== void 0) {
@@ -5159,25 +5234,15 @@
5159
5234
  }
5160
5235
  }
5161
5236
 
5162
- let anchorProps;
5163
-
5164
5237
  // scroll position might change
5165
5238
  // if max-height/-width changes, so we
5166
5239
  // need to restore it after we calculate
5167
5240
  // the new positioning
5168
5241
  const { scrollLeft, scrollTop } = cfg.el;
5169
5242
 
5170
- if (cfg.absoluteOffset === void 0) {
5171
- anchorProps = getAnchorProps(cfg.anchorEl, cfg.cover === true ? [ 0, 0 ] : cfg.offset);
5172
- }
5173
- else {
5174
- const
5175
- { top: anchorTop, left: anchorLeft } = cfg.anchorEl.getBoundingClientRect(),
5176
- top = anchorTop + cfg.absoluteOffset.top,
5177
- left = anchorLeft + cfg.absoluteOffset.left;
5178
-
5179
- anchorProps = { top, left, width: 1, height: 1, right: left + 1, center: top, middle: left, bottom: top + 1 };
5180
- }
5243
+ const anchorProps = cfg.absoluteOffset === void 0
5244
+ ? getAnchorProps(cfg.anchorEl, cfg.cover === true ? [ 0, 0 ] : cfg.offset)
5245
+ : getAbsoluteAnchorProps(cfg.anchorEl, cfg.absoluteOffset, cfg.offset);
5181
5246
 
5182
5247
  let elStyle = {
5183
5248
  maxHeight: cfg.maxHeight,
@@ -5194,14 +5259,44 @@
5194
5259
 
5195
5260
  Object.assign(cfg.el.style, elStyle);
5196
5261
 
5197
- const
5198
- targetProps = getTargetProps(cfg.el),
5199
- props = {
5200
- top: anchorProps[ cfg.anchorOrigin.vertical ] - targetProps[ cfg.selfOrigin.vertical ],
5201
- left: anchorProps[ cfg.anchorOrigin.horizontal ] - targetProps[ cfg.selfOrigin.horizontal ]
5202
- };
5262
+ const targetProps = getTargetProps(cfg.el);
5263
+ let props = getTopLeftProps(anchorProps, targetProps, cfg);
5203
5264
 
5204
- applyBoundaries(props, anchorProps, targetProps, cfg.anchorOrigin, cfg.selfOrigin);
5265
+ if (cfg.absoluteOffset === void 0 || cfg.offset === void 0) {
5266
+ applyBoundaries(props, anchorProps, targetProps, cfg.anchorOrigin, cfg.selfOrigin);
5267
+ }
5268
+ else { // we have touch position or context menu with offset
5269
+ const { top, left } = props; // cache initial values
5270
+
5271
+ // apply initial boundaries
5272
+ applyBoundaries(props, anchorProps, targetProps, cfg.anchorOrigin, cfg.selfOrigin);
5273
+
5274
+ let hasChanged = false;
5275
+
5276
+ // did it flip vertically?
5277
+ if (props.top !== top) {
5278
+ hasChanged = true;
5279
+ const offsetY = 2 * cfg.offset[ 1 ];
5280
+ anchorProps.center = anchorProps.top -= offsetY;
5281
+ anchorProps.bottom -= offsetY + 2;
5282
+ }
5283
+
5284
+ // did it flip horizontally?
5285
+ if (props.left !== left) {
5286
+ hasChanged = true;
5287
+ const offsetX = 2 * cfg.offset[ 0 ];
5288
+ anchorProps.middle = anchorProps.left -= offsetX;
5289
+ anchorProps.right -= offsetX + 2;
5290
+ }
5291
+
5292
+ if (hasChanged === true) {
5293
+ // re-calculate props with the new anchor
5294
+ props = getTopLeftProps(anchorProps, targetProps, cfg);
5295
+
5296
+ // and re-apply boundaries
5297
+ applyBoundaries(props, anchorProps, targetProps, cfg.anchorOrigin, cfg.selfOrigin);
5298
+ }
5299
+ }
5205
5300
 
5206
5301
  elStyle = {
5207
5302
  top: props.top + 'px',
@@ -5382,7 +5477,7 @@
5382
5477
  processOnMount: true
5383
5478
  });
5384
5479
 
5385
- const { showPortal, hidePortal, renderPortal } = usePortal(vm, innerRef, renderPortalContent);
5480
+ const { showPortal, hidePortal, renderPortal } = usePortal(vm, innerRef, renderPortalContent, 'menu');
5386
5481
 
5387
5482
  const clickOutsideProps = {
5388
5483
  anchorEl,
@@ -6999,7 +7094,7 @@
6999
7094
 
7000
7095
  const isDark = useDark(props, $q);
7001
7096
 
7002
- let timer, panelsLen;
7097
+ let timer = null, panelsLen;
7003
7098
 
7004
7099
  const {
7005
7100
  updatePanelsList, getPanelContent,
@@ -7053,7 +7148,6 @@
7053
7148
 
7054
7149
  vue.watch(() => props.modelValue, () => {
7055
7150
  if (props.autoplay) {
7056
- clearInterval(timer);
7057
7151
  startTimer();
7058
7152
  }
7059
7153
  });
@@ -7062,20 +7156,28 @@
7062
7156
  if (val) {
7063
7157
  startTimer();
7064
7158
  }
7065
- else {
7066
- clearInterval(timer);
7159
+ else if (timer !== null) {
7160
+ clearTimeout(timer);
7161
+ timer = null;
7067
7162
  }
7068
7163
  });
7069
7164
 
7070
7165
  function startTimer () {
7071
7166
  const duration = isNumber(props.autoplay) === true
7072
- ? props.autoplay
7167
+ ? Math.abs(props.autoplay)
7073
7168
  : 5000;
7074
7169
 
7075
- timer = setTimeout(
7076
- duration >= 0 ? nextPanel : previousPanel,
7077
- Math.abs(duration)
7078
- );
7170
+ timer !== null && clearTimeout(timer);
7171
+ timer = setTimeout(() => {
7172
+ timer = null;
7173
+
7174
+ if (duration >= 0) {
7175
+ nextPanel();
7176
+ }
7177
+ else {
7178
+ previousPanel();
7179
+ }
7180
+ }, duration);
7079
7181
  }
7080
7182
 
7081
7183
  vue.onMounted(() => {
@@ -7083,7 +7185,7 @@
7083
7185
  });
7084
7186
 
7085
7187
  vue.onBeforeUnmount(() => {
7086
- clearInterval(timer);
7188
+ timer !== null && clearTimeout(timer);
7087
7189
  });
7088
7190
 
7089
7191
  function getNavigationContainer (type, mapping) {
@@ -9401,8 +9503,10 @@
9401
9503
  }
9402
9504
 
9403
9505
  function emitEvent () {
9404
- clearTimeout(timer);
9405
- timer = null;
9506
+ if (timer !== null) {
9507
+ clearTimeout(timer);
9508
+ timer = null;
9509
+ }
9406
9510
 
9407
9511
  if (targetEl) {
9408
9512
  const { offsetWidth: width, offsetHeight: height } = targetEl;
@@ -9436,7 +9540,7 @@
9436
9540
  vue.onMounted(() => { init(); });
9437
9541
 
9438
9542
  vue.onBeforeUnmount(() => {
9439
- clearTimeout(timer);
9543
+ timer !== null && clearTimeout(timer);
9440
9544
 
9441
9545
  if (observer !== void 0) {
9442
9546
  if (observer.disconnect !== void 0) {
@@ -9456,7 +9560,10 @@
9456
9560
  let curDocView;
9457
9561
 
9458
9562
  function cleanup () {
9459
- clearTimeout(timer);
9563
+ if (timer !== null) {
9564
+ clearTimeout(timer);
9565
+ timer = null;
9566
+ }
9460
9567
 
9461
9568
  if (curDocView !== void 0) {
9462
9569
  // iOS is fuzzy, need to check it first
@@ -9609,7 +9716,7 @@
9609
9716
  const tabDataListLen = vue.ref(0);
9610
9717
  const hasFocus = vue.ref(false);
9611
9718
 
9612
- let animateTimer, scrollTimer, unwatchRoute;
9719
+ let animateTimer = null, scrollTimer = null, unwatchRoute;
9613
9720
 
9614
9721
  const tabProps = vue.computed(() => ({
9615
9722
  activeClass: props.activeClass,
@@ -9745,7 +9852,10 @@
9745
9852
  oldEl = oldTab.tabIndicatorRef.value,
9746
9853
  newEl = newTab.tabIndicatorRef.value;
9747
9854
 
9748
- clearTimeout(animateTimer);
9855
+ if (animateTimer !== null) {
9856
+ clearTimeout(animateTimer);
9857
+ animateTimer = null;
9858
+ }
9749
9859
 
9750
9860
  oldEl.style.transition = 'none';
9751
9861
  oldEl.style.transform = 'none';
@@ -9763,6 +9873,7 @@
9763
9873
  // allow scope updates to kick in (QRouteTab needs more time)
9764
9874
  registerAnimateTick(() => {
9765
9875
  animateTimer = setTimeout(() => {
9876
+ animateTimer = null;
9766
9877
  newEl.style.transition = 'transform .25s cubic-bezier(.4, 0, .2, 1)';
9767
9878
  newEl.style.transform = 'none';
9768
9879
  }, 70);
@@ -9815,7 +9926,7 @@
9815
9926
  }
9816
9927
 
9817
9928
  function animScrollTo (value) {
9818
- stopAnimScroll();
9929
+ scrollTimer !== null && clearInterval(scrollTimer);
9819
9930
  scrollTimer = setInterval(() => {
9820
9931
  if (scrollTowards(value) === true) {
9821
9932
  stopAnimScroll();
@@ -9832,7 +9943,10 @@
9832
9943
  }
9833
9944
 
9834
9945
  function stopAnimScroll () {
9835
- clearInterval(scrollTimer);
9946
+ if (scrollTimer !== null) {
9947
+ clearInterval(scrollTimer);
9948
+ scrollTimer = null;
9949
+ }
9836
9950
  }
9837
9951
 
9838
9952
  function onKbdNavigate (keyCode, fromEl) {
@@ -10136,7 +10250,7 @@
10136
10250
  vue.provide(tabsKey, $tabs);
10137
10251
 
10138
10252
  function cleanup () {
10139
- clearTimeout(animateTimer);
10253
+ animateTimer !== null && clearTimeout(animateTimer);
10140
10254
  stopAnimScroll();
10141
10255
  unwatchRoute !== void 0 && unwatchRoute();
10142
10256
  }
@@ -14528,7 +14642,8 @@
14528
14642
  vpPendingUpdate = false,
14529
14643
  bodyLeft,
14530
14644
  bodyTop,
14531
- closeTimer;
14645
+ href,
14646
+ closeTimer = null;
14532
14647
 
14533
14648
  function onWheel (e) {
14534
14649
  if (shouldPreventScroll(e)) {
@@ -14614,6 +14729,8 @@
14614
14729
  bodyLeft = body.style.left;
14615
14730
  bodyTop = body.style.top;
14616
14731
 
14732
+ href = window.location.href;
14733
+
14617
14734
  body.style.left = `-${ scrollPositionX }px`;
14618
14735
  body.style.top = `-${ scrollPositionY }px`;
14619
14736
 
@@ -14626,6 +14743,7 @@
14626
14743
 
14627
14744
  body.classList.add('q-body--prevent-scroll');
14628
14745
  document.qScrollPrevented = true;
14746
+
14629
14747
  if (client.is.ios === true) {
14630
14748
  if (hasViewport === true) {
14631
14749
  window.scrollTo(0, 0);
@@ -14664,7 +14782,11 @@
14664
14782
  body.style.left = bodyLeft;
14665
14783
  body.style.top = bodyTop;
14666
14784
 
14667
- window.scrollTo(scrollPositionX, scrollPositionY);
14785
+ // scroll back only if route has not changed
14786
+ if (window.location.href === href) {
14787
+ window.scrollTo(scrollPositionX, scrollPositionY);
14788
+ }
14789
+
14668
14790
  maxScrollTop = void 0;
14669
14791
  }
14670
14792
  }
@@ -14675,9 +14797,9 @@
14675
14797
  if (state === true) {
14676
14798
  registered++;
14677
14799
 
14678
- if (closeTimer !== void 0) {
14800
+ if (closeTimer !== null) {
14679
14801
  clearTimeout(closeTimer);
14680
- closeTimer = void 0;
14802
+ closeTimer = null;
14681
14803
  return
14682
14804
  }
14683
14805
 
@@ -14699,11 +14821,10 @@
14699
14821
  action = 'remove';
14700
14822
 
14701
14823
  if (client.is.ios === true && client.is.nativeMobile === true) {
14702
- clearTimeout(closeTimer);
14703
-
14824
+ closeTimer !== null && clearTimeout(closeTimer);
14704
14825
  closeTimer = setTimeout(() => {
14705
14826
  apply$1(action);
14706
- closeTimer = void 0;
14827
+ closeTimer = null;
14707
14828
  }, 100);
14708
14829
  return
14709
14830
  }
@@ -14792,12 +14913,13 @@
14792
14913
 
14793
14914
  setup (props, { slots, emit, attrs }) {
14794
14915
  const vm = vue.getCurrentInstance();
14916
+ const { proxy: { $q } } = vm;
14795
14917
 
14796
14918
  const innerRef = vue.ref(null);
14797
14919
  const showing = vue.ref(false);
14798
14920
  const animating = vue.ref(false);
14799
14921
 
14800
- let shakeTimeout, refocusTarget = null, isMaximized, avoidAutoClose;
14922
+ let shakeTimeout = null, refocusTarget = null, isMaximized, avoidAutoClose;
14801
14923
 
14802
14924
  const hideOnRouteChange = vue.computed(() =>
14803
14925
  props.persistent !== true
@@ -14816,7 +14938,7 @@
14816
14938
  );
14817
14939
 
14818
14940
  const { showPortal, hidePortal, portalIsAccessible, renderPortal } = usePortal(
14819
- vm, innerRef, renderPortalContent, /* pls do check if on a global dialog */ true
14941
+ vm, innerRef, renderPortalContent, 'dialog'
14820
14942
  );
14821
14943
 
14822
14944
  const { hide } = useModelToggle({
@@ -14979,8 +15101,9 @@
14979
15101
  if (node !== null) {
14980
15102
  node.classList.remove('q-animate--scale');
14981
15103
  node.classList.add('q-animate--scale');
14982
- clearTimeout(shakeTimeout);
15104
+ shakeTimeout !== null && clearTimeout(shakeTimeout);
14983
15105
  shakeTimeout = setTimeout(() => {
15106
+ shakeTimeout = null;
14984
15107
  if (innerRef.value !== null) {
14985
15108
  node.classList.remove('q-animate--scale');
14986
15109
  // some platforms (like desktop Chrome)
@@ -15004,7 +15127,10 @@
15004
15127
  }
15005
15128
 
15006
15129
  function cleanup (hiding) {
15007
- clearTimeout(shakeTimeout);
15130
+ if (shakeTimeout !== null) {
15131
+ clearTimeout(shakeTimeout);
15132
+ shakeTimeout = null;
15133
+ }
15008
15134
 
15009
15135
  if (hiding === true || showing.value === true) {
15010
15136
  updateMaximized(false);
@@ -15079,7 +15205,7 @@
15079
15205
 
15080
15206
  vue.onBeforeUnmount(cleanup);
15081
15207
 
15082
- const backdropEvt = vm.proxy.$q.platform.is.ios === true ? 'onClick' : 'onFocusin';
15208
+ const backdropEvt = $q.platform.is.ios === true || $q.platform.is.safari ? 'onClick' : 'onFocusin';
15083
15209
 
15084
15210
  function renderPortalContent () {
15085
15211
  return vue.h('div', {
@@ -15195,7 +15321,7 @@
15195
15321
  return emptyRenderFn
15196
15322
  }
15197
15323
 
15198
- let lastDesktopState, timerMini, layoutTotalWidthWatcher;
15324
+ let lastDesktopState, timerMini = null, layoutTotalWidthWatcher;
15199
15325
 
15200
15326
  const belowBreakpoint = vue.ref(
15201
15327
  props.behavior === 'mobile'
@@ -15570,7 +15696,7 @@
15570
15696
  }
15571
15697
 
15572
15698
  function animateMini () {
15573
- clearTimeout(timerMini);
15699
+ timerMini !== null && clearTimeout(timerMini);
15574
15700
 
15575
15701
  if (vm.proxy && vm.proxy.$el) {
15576
15702
  // need to speed it up and apply it immediately,
@@ -15580,6 +15706,7 @@
15580
15706
 
15581
15707
  flagMiniAnimate.value = true;
15582
15708
  timerMini = setTimeout(() => {
15709
+ timerMini = null;
15583
15710
  flagMiniAnimate.value = false;
15584
15711
  if (vm && vm.proxy && vm.proxy.$el) {
15585
15712
  vm.proxy.$el.classList.remove('q-drawer--mini-animate');
@@ -15732,7 +15859,11 @@
15732
15859
 
15733
15860
  vue.onBeforeUnmount(() => {
15734
15861
  layoutTotalWidthWatcher !== void 0 && layoutTotalWidthWatcher();
15735
- clearTimeout(timerMini);
15862
+
15863
+ if (timerMini !== null) {
15864
+ clearTimeout(timerMini);
15865
+ timerMini = null;
15866
+ }
15736
15867
 
15737
15868
  showing.value === true && cleanup();
15738
15869
 
@@ -16267,7 +16398,7 @@
16267
16398
 
16268
16399
  Object.assign(anchorEvents, { delayShow, delayHide });
16269
16400
 
16270
- const { showPortal, hidePortal, renderPortal } = usePortal(vm, innerRef, renderPortalContent);
16401
+ const { showPortal, hidePortal, renderPortal } = usePortal(vm, innerRef, renderPortalContent, 'tooltip');
16271
16402
 
16272
16403
  // if we're on mobile, let's improve the experience
16273
16404
  // by closing it when user taps outside of it
@@ -17602,15 +17733,23 @@
17602
17733
 
17603
17734
  setup (props, { slots, emit }) {
17604
17735
  let animating = false, doneFn, element;
17605
- let timer, timerFallback, animListener, lastEvent;
17736
+ let timer = null, timerFallback = null, animListener, lastEvent;
17606
17737
 
17607
17738
  function cleanup () {
17608
17739
  doneFn && doneFn();
17609
17740
  doneFn = null;
17610
17741
  animating = false;
17611
17742
 
17612
- clearTimeout(timer);
17613
- clearTimeout(timerFallback);
17743
+ if (timer !== null) {
17744
+ clearTimeout(timer);
17745
+ timer = null;
17746
+ }
17747
+
17748
+ if (timerFallback !== null) {
17749
+ clearTimeout(timerFallback);
17750
+ timerFallback = null;
17751
+ }
17752
+
17614
17753
  element !== void 0 && element.removeEventListener('transitionend', animListener);
17615
17754
  animListener = null;
17616
17755
  }
@@ -17649,8 +17788,11 @@
17649
17788
  begin(el, pos, done);
17650
17789
 
17651
17790
  timer = setTimeout(() => {
17791
+ timer = null;
17652
17792
  el.style.height = `${ el.scrollHeight }px`;
17653
17793
  animListener = evt => {
17794
+ timerFallback = null;
17795
+
17654
17796
  if (Object(evt) !== evt || evt.target === el) {
17655
17797
  end(el, 'show');
17656
17798
  }
@@ -17675,8 +17817,11 @@
17675
17817
  begin(el, pos, done);
17676
17818
 
17677
17819
  timer = setTimeout(() => {
17820
+ timer = null;
17678
17821
  el.style.height = 0;
17679
17822
  animListener = evt => {
17823
+ timerFallback = null;
17824
+
17680
17825
  if (Object(evt) !== evt || evt.target === el) {
17681
17826
  end(el, 'hide');
17682
17827
  }
@@ -18812,7 +18957,7 @@
18812
18957
  const { props, emit, slots, attrs, proxy } = vue.getCurrentInstance();
18813
18958
  const { $q } = proxy;
18814
18959
 
18815
- let focusoutTimer;
18960
+ let focusoutTimer = null;
18816
18961
 
18817
18962
  if (state.hasValue === void 0) {
18818
18963
  state.hasValue = vue.computed(() => fieldValueIsFilled(props.modelValue));
@@ -18978,7 +19123,11 @@
18978
19123
  }
18979
19124
 
18980
19125
  function onControlFocusin (e) {
18981
- clearTimeout(focusoutTimer);
19126
+ if (focusoutTimer !== null) {
19127
+ clearTimeout(focusoutTimer);
19128
+ focusoutTimer = null;
19129
+ }
19130
+
18982
19131
  if (state.editable.value === true && state.focused.value === false) {
18983
19132
  state.focused.value = true;
18984
19133
  emit('focus', e);
@@ -18986,8 +19135,10 @@
18986
19135
  }
18987
19136
 
18988
19137
  function onControlFocusout (e, then) {
18989
- clearTimeout(focusoutTimer);
19138
+ focusoutTimer !== null && clearTimeout(focusoutTimer);
18990
19139
  focusoutTimer = setTimeout(() => {
19140
+ focusoutTimer = null;
19141
+
18991
19142
  if (
18992
19143
  document.hasFocus() === true && (
18993
19144
  state.hasPopupOpen === true
@@ -19237,7 +19388,7 @@
19237
19388
  });
19238
19389
 
19239
19390
  vue.onBeforeUnmount(() => {
19240
- clearTimeout(focusoutTimer);
19391
+ focusoutTimer !== null && clearTimeout(focusoutTimer);
19241
19392
  });
19242
19393
 
19243
19394
  // expose public methods
@@ -20540,7 +20691,7 @@
20540
20691
  const naturalRatio = vue.ref(props.initialRatio);
20541
20692
  const ratioStyle = useRatio(props, naturalRatio);
20542
20693
 
20543
- let loadTimer;
20694
+ let loadTimer = null, isDestroyed = false;
20544
20695
 
20545
20696
  const images = [
20546
20697
  vue.ref(null),
@@ -20591,7 +20742,11 @@
20591
20742
  }
20592
20743
 
20593
20744
  function addImage (imgProps) {
20594
- clearTimeout(loadTimer);
20745
+ if (loadTimer !== null) {
20746
+ clearTimeout(loadTimer);
20747
+ loadTimer = null;
20748
+ }
20749
+
20595
20750
  hasError.value = false;
20596
20751
 
20597
20752
  if (imgProps === null) {
@@ -20606,10 +20761,12 @@
20606
20761
  }
20607
20762
 
20608
20763
  function onLoad ({ target }) {
20609
- // if component has been already destroyed
20610
- if (loadTimer === null) { return }
20764
+ if (isDestroyed === true) { return }
20611
20765
 
20612
- clearTimeout(loadTimer);
20766
+ if (loadTimer !== null) {
20767
+ clearTimeout(loadTimer);
20768
+ loadTimer = null;
20769
+ }
20613
20770
 
20614
20771
  naturalRatio.value = target.naturalHeight === 0
20615
20772
  ? 0.5
@@ -20620,21 +20777,21 @@
20620
20777
 
20621
20778
  function waitForCompleteness (target, count) {
20622
20779
  // protect against running forever
20623
- if (loadTimer === null || count === 1000) { return }
20780
+ if (isDestroyed === true || count === 1000) { return }
20624
20781
 
20625
20782
  if (target.complete === true) {
20626
20783
  onReady(target);
20627
20784
  }
20628
20785
  else {
20629
20786
  loadTimer = setTimeout(() => {
20787
+ loadTimer = null;
20630
20788
  waitForCompleteness(target, count + 1);
20631
20789
  }, 50);
20632
20790
  }
20633
20791
  }
20634
20792
 
20635
20793
  function onReady (img) {
20636
- // if component has been already destroyed
20637
- if (loadTimer === null) { return }
20794
+ if (isDestroyed === true) { return }
20638
20795
 
20639
20796
  position.value = position.value ^ 1;
20640
20797
  images[ position.value ].value = null;
@@ -20644,7 +20801,11 @@
20644
20801
  }
20645
20802
 
20646
20803
  function onError (err) {
20647
- clearTimeout(loadTimer);
20804
+ if (loadTimer !== null) {
20805
+ clearTimeout(loadTimer);
20806
+ loadTimer = null;
20807
+ }
20808
+
20648
20809
  isLoading.value = false;
20649
20810
  hasError.value = true;
20650
20811
  images[ position.value ].value = null;
@@ -20719,8 +20880,12 @@
20719
20880
  }
20720
20881
 
20721
20882
  vue.onBeforeUnmount(() => {
20722
- clearTimeout(loadTimer);
20723
- loadTimer = null;
20883
+ isDestroyed = true;
20884
+
20885
+ if (loadTimer !== null) {
20886
+ clearTimeout(loadTimer);
20887
+ loadTimer = null;
20888
+ }
20724
20889
  });
20725
20890
  }
20726
20891
 
@@ -20789,6 +20954,7 @@
20789
20954
  const isFetching = vue.ref(false);
20790
20955
  const isWorking = vue.ref(true);
20791
20956
  const rootRef = vue.ref(null);
20957
+ const loadingRef = vue.ref(null);
20792
20958
 
20793
20959
  let index = props.initialIndex || 0;
20794
20960
  let localScrollTarget, poll;
@@ -20920,12 +21086,32 @@
20920
21086
  }
20921
21087
  }
20922
21088
 
21089
+ function updateSvgAnimations (isRetry) {
21090
+ if (renderLoadingSlot.value === true) {
21091
+ if (loadingRef.value === null) {
21092
+ isRetry !== true && vue.nextTick(() => { updateSvgAnimations(true); });
21093
+ return
21094
+ }
21095
+
21096
+ // we need to pause svg animations (if any) when hiding
21097
+ // otherwise the browser will keep on recalculating the style
21098
+ const action = `${ isFetching.value === true ? 'un' : '' }pauseAnimations`;
21099
+ Array.from(loadingRef.value.getElementsByTagName('svg')).forEach(el => {
21100
+ el[ action ]();
21101
+ });
21102
+ }
21103
+ }
21104
+
21105
+ const renderLoadingSlot = vue.computed(() => props.disable !== true && isWorking.value === true);
21106
+
21107
+ vue.watch([ isFetching, renderLoadingSlot ], () => { updateSvgAnimations(); });
21108
+
20923
21109
  vue.watch(() => props.disable, val => {
20924
21110
  if (val === true) { stop(); }
20925
21111
  else { resume(); }
20926
21112
  });
20927
21113
 
20928
- vue.watch(() => props.reverse, val => {
21114
+ vue.watch(() => props.reverse, () => {
20929
21115
  if (isFetching.value === false && isWorking.value === true) {
20930
21116
  immediatePoll();
20931
21117
  }
@@ -20956,8 +21142,9 @@
20956
21142
 
20957
21143
  vue.onMounted(() => {
20958
21144
  setDebounce(props.debounce);
20959
-
20960
21145
  updateScrollTarget();
21146
+
21147
+ isFetching.value === false && updateSvgAnimations();
20961
21148
  });
20962
21149
 
20963
21150
  // expose public methods
@@ -20970,9 +21157,9 @@
20970
21157
  return () => {
20971
21158
  const child = hUniqueSlot(slots.default, []);
20972
21159
 
20973
- if (props.disable !== true && isWorking.value === true) {
21160
+ if (renderLoadingSlot.value === true) {
20974
21161
  child[ props.reverse === false ? 'push' : 'unshift' ](
20975
- vue.h('div', { class: classes.value }, hSlot(slots.loading))
21162
+ vue.h('div', { ref: loadingRef, class: classes.value }, hSlot(slots.loading))
20976
21163
  );
20977
21164
  }
20978
21165
 
@@ -21664,7 +21851,7 @@
21664
21851
  const { $q } = proxy;
21665
21852
 
21666
21853
  const temp = {};
21667
- let emitCachedValue = NaN, typedNumber, stopValueWatcher, emitTimer, emitValueFn;
21854
+ let emitCachedValue = NaN, typedNumber, stopValueWatcher, emitTimer = null, emitValueFn;
21668
21855
 
21669
21856
  const inputRef = vue.ref(null);
21670
21857
  const nameProp = useFormInputNameAttr(props);
@@ -21876,6 +22063,8 @@
21876
22063
 
21877
22064
  function emitValue (val, stopWatcher) {
21878
22065
  emitValueFn = () => {
22066
+ emitTimer = null;
22067
+
21879
22068
  if (
21880
22069
  props.type !== 'number'
21881
22070
  && temp.hasOwnProperty('value') === true
@@ -21903,7 +22092,7 @@
21903
22092
  }
21904
22093
 
21905
22094
  if (props.debounce !== void 0) {
21906
- clearTimeout(emitTimer);
22095
+ emitTimer !== null && clearTimeout(emitTimer);
21907
22096
  temp.value = val;
21908
22097
  emitTimer = setTimeout(emitValueFn, props.debounce);
21909
22098
  }
@@ -21937,7 +22126,11 @@
21937
22126
  function onChange (e) {
21938
22127
  onComposition(e);
21939
22128
 
21940
- clearTimeout(emitTimer);
22129
+ if (emitTimer !== null) {
22130
+ clearTimeout(emitTimer);
22131
+ emitTimer = null;
22132
+ }
22133
+
21941
22134
  emitValueFn !== void 0 && emitValueFn();
21942
22135
 
21943
22136
  emit('change', e.target.value);
@@ -21946,7 +22139,11 @@
21946
22139
  function onFinishEditing (e) {
21947
22140
  e !== void 0 && stop(e);
21948
22141
 
21949
- clearTimeout(emitTimer);
22142
+ if (emitTimer !== null) {
22143
+ clearTimeout(emitTimer);
22144
+ emitTimer = null;
22145
+ }
22146
+
21950
22147
  emitValueFn !== void 0 && emitValueFn();
21951
22148
 
21952
22149
  typedNumber = false;
@@ -22790,7 +22987,7 @@
22790
22987
  }
22791
22988
  }
22792
22989
 
22793
- let timer;
22990
+ let animateTimer = null;
22794
22991
 
22795
22992
  const $layout = {
22796
22993
  instances: {},
@@ -22821,16 +23018,16 @@
22821
23018
  scroll,
22822
23019
 
22823
23020
  animate () {
22824
- if (timer !== void 0) {
22825
- clearTimeout(timer);
23021
+ if (animateTimer !== null) {
23022
+ clearTimeout(animateTimer);
22826
23023
  }
22827
23024
  else {
22828
23025
  document.body.classList.add('q-body--layout-animate');
22829
23026
  }
22830
23027
 
22831
- timer = setTimeout(() => {
23028
+ animateTimer = setTimeout(() => {
23029
+ animateTimer = null;
22832
23030
  document.body.classList.remove('q-body--layout-animate');
22833
- timer = void 0;
22834
23031
  }, 155);
22835
23032
  },
22836
23033
 
@@ -24898,6 +25095,8 @@
24898
25095
  });
24899
25096
  }
24900
25097
 
25098
+ let $el, localScrollTarget, timer = null;
25099
+
24901
25100
  function animateTo ({ pos, ratio }, done) {
24902
25101
  animating.value = true;
24903
25102
  pullPosition.value = pos;
@@ -24906,15 +25105,14 @@
24906
25105
  pullRatio.value = ratio;
24907
25106
  }
24908
25107
 
24909
- clearTimeout(timer);
25108
+ timer !== null && clearTimeout(timer);
24910
25109
  timer = setTimeout(() => {
25110
+ timer = null;
24911
25111
  animating.value = false;
24912
25112
  done && done();
24913
25113
  }, 300);
24914
25114
  }
24915
25115
 
24916
- let $el, localScrollTarget, timer;
24917
-
24918
25116
  function updateScrollTarget () {
24919
25117
  localScrollTarget = getScrollTarget($el, props.scrollTarget);
24920
25118
  }
@@ -24927,7 +25125,7 @@
24927
25125
  });
24928
25126
 
24929
25127
  vue.onBeforeUnmount(() => {
24930
- clearTimeout(timer);
25128
+ timer !== null && clearTimeout(timer);
24931
25129
  });
24932
25130
 
24933
25131
  // expose public methods
@@ -25559,13 +25757,13 @@
25559
25757
  case 37: // LEFT ARROW
25560
25758
  case 40: // DOWN ARROW
25561
25759
  if (iconRefs[ `rt${ i - 1 }` ]) {
25562
- iconRefs[ `rt${ i - 1 }` ].$el.focus();
25760
+ iconRefs[ `rt${ i - 1 }` ].focus();
25563
25761
  }
25564
25762
  return stopAndPrevent(e)
25565
25763
  case 39: // RIGHT ARROW
25566
25764
  case 38: // UP ARROW
25567
25765
  if (iconRefs[ `rt${ i + 1 }` ]) {
25568
- iconRefs[ `rt${ i + 1 }` ].$el.focus();
25766
+ iconRefs[ `rt${ i + 1 }` ].focus();
25569
25767
  }
25570
25768
  return stopAndPrevent(e)
25571
25769
  }
@@ -25588,7 +25786,7 @@
25588
25786
  child.push(
25589
25787
  vue.h('div', {
25590
25788
  key: i,
25591
- ref: vm => { iconRefs[ `rt${ i }` ] = vm; },
25789
+ ref: el => { iconRefs[ `rt${ i }` ] = el; },
25592
25790
  class: 'q-rating__icon-container flex flex-center',
25593
25791
  ...attrs,
25594
25792
  onClick () { set(i); },
@@ -25716,7 +25914,7 @@
25716
25914
 
25717
25915
  const isDark = useDark(props, proxy.$q);
25718
25916
 
25719
- let timer, panRefPos;
25917
+ let timer = null, panRefPos;
25720
25918
 
25721
25919
  const targetRef = vue.ref(null);
25722
25920
 
@@ -25965,14 +26163,14 @@
25965
26163
  }
25966
26164
 
25967
26165
  function startTimer () {
25968
- if (tempShowing.value === true) {
25969
- clearTimeout(timer);
25970
- }
25971
- else {
25972
- tempShowing.value = true;
25973
- }
26166
+ tempShowing.value = true;
26167
+
26168
+ timer !== null && clearTimeout(timer);
26169
+ timer = setTimeout(() => {
26170
+ timer = null;
26171
+ tempShowing.value = false;
26172
+ }, props.delay);
25974
26173
 
25975
- timer = setTimeout(() => { tempShowing.value = false; }, props.delay);
25976
26174
  props.onScroll !== void 0 && emitScroll();
25977
26175
  }
25978
26176
 
@@ -26133,12 +26331,16 @@
26133
26331
  return
26134
26332
  }
26135
26333
 
26136
- cancelAnimationFrame(contentEl._qOverflowAnimationFrame);
26334
+ if (contentEl._qOverflowAnimationFrame !== void 0) {
26335
+ cancelAnimationFrame(contentEl._qOverflowAnimationFrame);
26336
+ }
26337
+
26137
26338
  contentEl._qOverflowAnimationFrame = requestAnimationFrame(() => {
26138
26339
  if (contentEl === null) {
26139
26340
  return
26140
26341
  }
26141
26342
 
26343
+ contentEl._qOverflowAnimationFrame = void 0;
26142
26344
  const children = contentEl.children || [];
26143
26345
 
26144
26346
  filterProto
@@ -26974,8 +27176,8 @@
26974
27176
  const dialogFieldFocused = vue.ref(false);
26975
27177
  const innerLoadingIndicator = vue.ref(false);
26976
27178
 
26977
- let inputTimer, innerValueCache,
26978
- hasDialog, userInputValue, filterId, defaultInputValue,
27179
+ let inputTimer = null, innerValueCache,
27180
+ hasDialog, userInputValue, filterId = null, defaultInputValue,
26979
27181
  transitionShowComputed, searchBuffer, searchBufferExp;
26980
27182
 
26981
27183
  const inputRef = vue.ref(null);
@@ -27481,7 +27683,12 @@
27481
27683
  }
27482
27684
 
27483
27685
  e.target.value = '';
27484
- clearTimeout(inputTimer);
27686
+
27687
+ if (inputTimer !== null) {
27688
+ clearTimeout(inputTimer);
27689
+ inputTimer = null;
27690
+ }
27691
+
27485
27692
  resetInputValue();
27486
27693
 
27487
27694
  if (typeof value === 'string' && value.length > 0) {
@@ -27846,7 +28053,10 @@
27846
28053
  }
27847
28054
 
27848
28055
  function onInput (e) {
27849
- clearTimeout(inputTimer);
28056
+ if (inputTimer !== null) {
28057
+ clearTimeout(inputTimer);
28058
+ inputTimer = null;
28059
+ }
27850
28060
 
27851
28061
  if (e && e.target && e.target.qComposing === true) {
27852
28062
  return
@@ -27867,6 +28077,7 @@
27867
28077
 
27868
28078
  if (props.onFilter !== void 0) {
27869
28079
  inputTimer = setTimeout(() => {
28080
+ inputTimer = null;
27870
28081
  filter(inputValue.value);
27871
28082
  }, props.inputDebounce);
27872
28083
  }
@@ -27920,7 +28131,7 @@
27920
28131
  menu.value === true && (menu.value = false);
27921
28132
  }, 10);
27922
28133
 
27923
- clearTimeout(filterId);
28134
+ filterId !== null && clearTimeout(filterId);
27924
28135
  filterId = localFilterId;
27925
28136
 
27926
28137
  emit(
@@ -28112,8 +28323,10 @@
28112
28323
  }
28113
28324
 
28114
28325
  if (state.focused.value === false) {
28115
- clearTimeout(filterId);
28116
- filterId = void 0;
28326
+ if (filterId !== null) {
28327
+ clearTimeout(filterId);
28328
+ filterId = null;
28329
+ }
28117
28330
 
28118
28331
  if (state.innerLoading.value === true) {
28119
28332
  emit('filterAbort');
@@ -28234,7 +28447,7 @@
28234
28447
  updatePreState();
28235
28448
 
28236
28449
  vue.onBeforeUnmount(() => {
28237
- clearTimeout(inputTimer);
28450
+ inputTimer !== null && clearTimeout(inputTimer);
28238
28451
  });
28239
28452
 
28240
28453
  // expose public methods
@@ -28494,7 +28707,7 @@
28494
28707
 
28495
28708
  const contentRef = vue.ref(null);
28496
28709
 
28497
- let timer, pan = {}, dirRefs = {}, dirContentRefs = {};
28710
+ let timer = null, pan = {}, dirRefs = {}, dirContentRefs = {};
28498
28711
 
28499
28712
  const langDir = vue.computed(() => (
28500
28713
  $q.lang.rtl === true
@@ -28545,7 +28758,9 @@
28545
28758
  if (pan.scale === 1) {
28546
28759
  node.style.transform = `translate${ pan.axis }(${ pan.dir * 100 }%)`;
28547
28760
 
28761
+ timer !== null && clearTimeout(timer);
28548
28762
  timer = setTimeout(() => {
28763
+ timer = null;
28549
28764
  emit(pan.showing, { reset });
28550
28765
  emit('action', { side: pan.showing, reset });
28551
28766
  }, 230);
@@ -28616,7 +28831,7 @@
28616
28831
  });
28617
28832
 
28618
28833
  vue.onBeforeUnmount(() => {
28619
- clearTimeout(timer);
28834
+ timer !== null && clearTimeout(timer);
28620
28835
  });
28621
28836
 
28622
28837
  // expose public methods
@@ -36978,12 +37193,11 @@
36978
37193
  : (
36979
37194
  options.waitFor === 'transitionend'
36980
37195
  ? new Promise(resolve => {
36981
- const timer = setTimeout(() => {
36982
- endFn();
36983
- }, 400);
36984
-
36985
- const endFn = ev => {
36986
- clearTimeout(timer);
37196
+ const endFn = () => {
37197
+ if (timer !== null) {
37198
+ clearTimeout(timer);
37199
+ timer = null;
37200
+ }
36987
37201
 
36988
37202
  if (elTo) {
36989
37203
  elTo.removeEventListener('transitionend', endFn);
@@ -36993,6 +37207,8 @@
36993
37207
  resolve();
36994
37208
  };
36995
37209
 
37210
+ let timer = setTimeout(endFn, 400);
37211
+
36996
37212
  elTo.addEventListener('transitionend', endFn);
36997
37213
  elTo.addEventListener('transitioncancel', endFn);
36998
37214
  })
@@ -37461,6 +37677,7 @@
37461
37677
  : ctx.touchSensitivity;
37462
37678
 
37463
37679
  ctx.timer = setTimeout(() => {
37680
+ ctx.timer = void 0;
37464
37681
  clearSelection();
37465
37682
  ctx.triggered = true;
37466
37683
 
@@ -37477,10 +37694,13 @@
37477
37694
  move (evt) {
37478
37695
  const { top, left } = position(evt);
37479
37696
  if (
37480
- Math.abs(left - ctx.origin.left) >= ctx.sensitivity
37481
- || Math.abs(top - ctx.origin.top) >= ctx.sensitivity
37697
+ ctx.timer !== void 0 && (
37698
+ Math.abs(left - ctx.origin.left) >= ctx.sensitivity
37699
+ || Math.abs(top - ctx.origin.top) >= ctx.sensitivity
37700
+ )
37482
37701
  ) {
37483
37702
  clearTimeout(ctx.timer);
37703
+ ctx.timer = void 0;
37484
37704
  }
37485
37705
  },
37486
37706
 
@@ -37493,8 +37713,9 @@
37493
37713
  if (ctx.triggered === true) {
37494
37714
  evt !== void 0 && stopAndPrevent(evt);
37495
37715
  }
37496
- else {
37716
+ else if (ctx.timer !== void 0) {
37497
37717
  clearTimeout(ctx.timer);
37718
+ ctx.timer = void 0;
37498
37719
  }
37499
37720
  }
37500
37721
  };
@@ -37546,7 +37767,7 @@
37546
37767
  cleanEvt(ctx, 'main');
37547
37768
  cleanEvt(ctx, 'temp');
37548
37769
 
37549
- clearTimeout(ctx.timer);
37770
+ ctx.timer !== void 0 && clearTimeout(ctx.timer);
37550
37771
  ctx.styleCleanup !== void 0 && ctx.styleCleanup();
37551
37772
 
37552
37773
  delete el.__qtouchhold;
@@ -37685,6 +37906,8 @@
37685
37906
  };
37686
37907
 
37687
37908
  const fn = () => {
37909
+ ctx.timer = void 0;
37910
+
37688
37911
  if (ctx.event === void 0) {
37689
37912
  return
37690
37913
  }
@@ -37728,8 +37951,9 @@
37728
37951
  },
37729
37952
 
37730
37953
  move (evt) {
37731
- if (ctx.event !== void 0 && shouldEnd(evt, ctx.origin) === true) {
37954
+ if (ctx.event !== void 0 && ctx.timer !== void 0 && shouldEnd(evt, ctx.origin) === true) {
37732
37955
  clearTimeout(ctx.timer);
37956
+ ctx.timer = void 0;
37733
37957
  }
37734
37958
  },
37735
37959
 
@@ -37742,7 +37966,11 @@
37742
37966
  evt !== void 0 && ctx.event.repeatCount > 0 && stopAndPrevent(evt);
37743
37967
 
37744
37968
  cleanEvt(ctx, 'temp');
37745
- clearTimeout(ctx.timer);
37969
+
37970
+ if (ctx.timer !== void 0) {
37971
+ clearTimeout(ctx.timer);
37972
+ ctx.timer = void 0;
37973
+ }
37746
37974
 
37747
37975
  ctx.event = void 0;
37748
37976
  }
@@ -37791,7 +38019,7 @@
37791
38019
  const ctx = el.__qtouchrepeat;
37792
38020
 
37793
38021
  if (ctx !== void 0) {
37794
- clearTimeout(ctx.timer);
38022
+ ctx.timer !== void 0 && clearTimeout(ctx.timer);
37795
38023
 
37796
38024
  cleanEvt(ctx, 'main');
37797
38025
  cleanEvt(ctx, 'temp');
@@ -38255,7 +38483,7 @@
38255
38483
 
38256
38484
  let vm, emittedOK = false;
38257
38485
  const dialogRef = vue.ref(null);
38258
- const el = createGlobalNode();
38486
+ const el = createGlobalNode(false, 'dialog');
38259
38487
 
38260
38488
  const applyState = cmd => {
38261
38489
  if (dialogRef.value !== null && dialogRef.value[ cmd ] !== void 0) {
@@ -38955,7 +39183,7 @@
38955
39183
  app,
38956
39184
  vm,
38957
39185
  uid$1 = 0,
38958
- timeout,
39186
+ timeout = null,
38959
39187
  props = {},
38960
39188
  activeGroups = {};
38961
39189
 
@@ -39004,14 +39232,14 @@
39004
39232
  }
39005
39233
  else {
39006
39234
  props.uid = ++uid$1;
39007
- clearTimeout(timeout);
39235
+ timeout !== null && clearTimeout(timeout);
39008
39236
 
39009
39237
  timeout = setTimeout(() => {
39010
- timeout = void 0;
39238
+ timeout = null;
39011
39239
 
39012
39240
  const el = createGlobalNode('q-loading');
39013
39241
 
39014
- app = vue.createApp({
39242
+ app = createChildApp({
39015
39243
  name: 'QLoading',
39016
39244
 
39017
39245
  setup () {
@@ -39073,7 +39301,7 @@
39073
39301
  onAfterLeave
39074
39302
  }, getContent)
39075
39303
  }
39076
- });
39304
+ }, Plugin$2.__parentApp);
39077
39305
 
39078
39306
  vm = app.mount(el);
39079
39307
  }, props.delay);
@@ -39117,9 +39345,9 @@
39117
39345
  }
39118
39346
  }
39119
39347
 
39120
- if (timeout !== void 0) {
39348
+ if (timeout !== null) {
39121
39349
  clearTimeout(timeout);
39122
- timeout = void 0;
39350
+ timeout = null;
39123
39351
  }
39124
39352
 
39125
39353
  Plugin$2.isActive = false;
@@ -39132,16 +39360,20 @@
39132
39360
  }
39133
39361
  },
39134
39362
 
39135
- install ({ $q }) {
39363
+ install ({ $q, parentApp }) {
39136
39364
  $q.loading = this;
39137
39365
 
39138
- if ($q.config.loading !== void 0) {
39139
- this.setDefaults($q.config.loading);
39366
+ {
39367
+ Plugin$2.__parentApp = parentApp;
39368
+
39369
+ if ($q.config.loading !== void 0) {
39370
+ this.setDefaults($q.config.loading);
39371
+ }
39140
39372
  }
39141
39373
  }
39142
39374
  });
39143
39375
 
39144
- let updateId, currentClientMeta;
39376
+ let updateId = null, currentClientMeta;
39145
39377
  const clientList = [];
39146
39378
 
39147
39379
  function normalize (meta) {
@@ -39275,6 +39507,8 @@
39275
39507
  }
39276
39508
 
39277
39509
  function updateClientMeta () {
39510
+ updateId = null;
39511
+
39278
39512
  const data = {
39279
39513
  title: '',
39280
39514
  titleTemplate: null,
@@ -39300,7 +39534,7 @@
39300
39534
  }
39301
39535
 
39302
39536
  function planClientUpdate () {
39303
- clearTimeout(updateId);
39537
+ updateId !== null && clearTimeout(updateId);
39304
39538
  updateId = setTimeout(updateClientMeta, 50);
39305
39539
  }
39306
39540
 
@@ -39527,7 +39761,10 @@
39527
39761
 
39528
39762
  if (originalApi !== void 0) {
39529
39763
  // reset timeout if any
39530
- clearTimeout(originalApi.notif.meta.timer);
39764
+ if (originalApi.notif.meta.timer) {
39765
+ clearTimeout(originalApi.notif.meta.timer);
39766
+ originalApi.notif.meta.timer = void 0;
39767
+ }
39531
39768
 
39532
39769
  // retain uid
39533
39770
  notif.meta.uid = originalApi.notif.meta.uid;
@@ -39563,7 +39800,10 @@
39563
39800
  // ok, so it's NOT a new one
39564
39801
  else {
39565
39802
  // reset timeout if any
39566
- clearTimeout(original.meta.timer);
39803
+ if (original.meta.timer) {
39804
+ clearTimeout(original.meta.timer);
39805
+ original.meta.timer = void 0;
39806
+ }
39567
39807
 
39568
39808
  if (notif.badgePosition !== void 0) {
39569
39809
  if (badgePositions.includes(notif.badgePosition) === false) {
@@ -39593,6 +39833,7 @@
39593
39833
 
39594
39834
  if (notif.timeout > 0) {
39595
39835
  notif.meta.timer = setTimeout(() => {
39836
+ notif.meta.timer = void 0;
39596
39837
  dismiss();
39597
39838
  }, notif.timeout + /* show duration */ 1000);
39598
39839
  }
@@ -39641,7 +39882,10 @@
39641
39882
  }
39642
39883
 
39643
39884
  function removeNotification (notif) {
39644
- clearTimeout(notif.meta.timer);
39885
+ if (notif.meta.timer) {
39886
+ clearTimeout(notif.meta.timer);
39887
+ notif.meta.timer = void 0;
39888
+ }
39645
39889
 
39646
39890
  const index = notificationsList[ notif.position ].value.indexOf(notif);
39647
39891
  if (index !== -1) {
@@ -40014,6 +40258,9 @@
40014
40258
  area.contentEditable = 'true';
40015
40259
  area.style.position = 'fixed'; // avoid scrolling to bottom
40016
40260
 
40261
+ const fn = () => {};
40262
+ addFocusout(fn);
40263
+
40017
40264
  document.body.appendChild(area);
40018
40265
  area.focus();
40019
40266
  area.select();
@@ -40021,6 +40268,8 @@
40021
40268
  const res = document.execCommand('copy');
40022
40269
 
40023
40270
  area.remove();
40271
+ removeFocusout(fn);
40272
+
40024
40273
  return res
40025
40274
  }
40026
40275
 
@@ -40527,7 +40776,7 @@
40527
40776
  */
40528
40777
 
40529
40778
  var index_umd = {
40530
- version: '2.11.3',
40779
+ version: '2.11.5',
40531
40780
  install (app, opts) {
40532
40781
  installQuasar(app, {
40533
40782
  components,