quasar 2.11.2 → 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 (150) 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 +2 -2
  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 +386 -179
  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 +386 -179
  111. package/dist/quasar.umd.prod.js +2 -2
  112. package/dist/web-types/web-types.json +1 -1
  113. package/package.json +8 -8
  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/checkbox/use-checkbox.js +2 -0
  118. package/src/components/dialog/QDialog.js +8 -4
  119. package/src/components/drawer/QDrawer.js +8 -3
  120. package/src/components/img/QImg.js +25 -11
  121. package/src/components/input/QInput.js +14 -4
  122. package/src/components/layout/QLayout.js +5 -5
  123. package/src/components/menu/QMenu.js +1 -1
  124. package/src/components/pull-to-refresh/QPullToRefresh.js +5 -4
  125. package/src/components/radio/QRadio.js +2 -0
  126. package/src/components/resize-observer/QResizeObserver.js +9 -4
  127. package/src/components/scroll-area/QScrollArea.js +8 -8
  128. package/src/components/select/QSelect.js +19 -8
  129. package/src/components/slide-item/QSlideItem.js +4 -2
  130. package/src/components/slide-transition/QSlideTransition.js +17 -3
  131. package/src/components/tabs/QTabs.js +12 -5
  132. package/src/components/tooltip/QTooltip.js +1 -1
  133. package/src/composables/private/use-anchor.js +8 -3
  134. package/src/composables/private/use-field.js +10 -4
  135. package/src/composables/private/use-portal.js +3 -3
  136. package/src/composables/private/use-timeout.js +6 -3
  137. package/src/css/core/visibility.sass +2 -0
  138. package/src/directives/TouchHold.js +9 -4
  139. package/src/directives/TouchRepeat.js +10 -3
  140. package/src/lang.js +17 -11
  141. package/src/plugins/Loading.js +5 -5
  142. package/src/plugins/Meta.js +4 -2
  143. package/src/plugins/Notify.js +13 -3
  144. package/src/utils/debounce.js +9 -6
  145. package/src/utils/morph.js +7 -6
  146. package/src/utils/prevent-scroll.js +5 -6
  147. package/src/utils/private/click-outside.js +10 -3
  148. package/src/utils/private/global-dialog.js +1 -1
  149. package/src/utils/private/global-nodes.js +44 -13
  150. package/src/utils/private/position-engine.js +67 -25
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Quasar Framework v2.11.2
2
+ * Quasar Framework v2.11.4
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
@@ -1071,12 +1074,14 @@
1071
1074
  };
1072
1075
 
1073
1076
  {
1074
- const el = document.documentElement;
1075
- el.setAttribute('dir', lang.rtl === true ? 'rtl' : 'ltr');
1076
- el.setAttribute('lang', lang.isoName);
1077
-
1078
1077
  lang.set = Plugin$8.set;
1079
1078
 
1079
+ if (Plugin$8.__langConfig === void 0 || Plugin$8.__langConfig.noHtmlAttrs !== true) {
1080
+ const el = document.documentElement;
1081
+ el.setAttribute('dir', lang.rtl === true ? 'rtl' : 'ltr');
1082
+ el.setAttribute('lang', lang.isoName);
1083
+ }
1084
+
1080
1085
  Object.assign(Plugin$8.__langPack, lang);
1081
1086
 
1082
1087
  Plugin$8.props = lang;
@@ -1088,6 +1093,7 @@
1088
1093
  install ({ $q, lang, ssrContext }) {
1089
1094
  {
1090
1095
  $q.lang = Plugin$8.__langPack;
1096
+ Plugin$8.__langConfig = $q.config.lang;
1091
1097
 
1092
1098
  if (this.__installed === true) {
1093
1099
  lang !== void 0 && this.set(lang);
@@ -1642,7 +1648,7 @@
1642
1648
  }
1643
1649
 
1644
1650
  var installQuasar = function (parentApp, opts = {}) {
1645
- const $q = { version: '2.11.2' };
1651
+ const $q = { version: '2.11.4' };
1646
1652
 
1647
1653
  if (globalConfigIsFrozen === false) {
1648
1654
  if (opts.config !== void 0) {
@@ -1841,7 +1847,7 @@
1841
1847
  const onScreen = vue.ref(false);
1842
1848
  const animate = vue.ref(true);
1843
1849
 
1844
- let sessions = 0, timer, speed;
1850
+ let sessions = 0, timer = null, speed;
1845
1851
 
1846
1852
  const classes = vue.computed(() =>
1847
1853
  `q-loading-bar q-loading-bar--${ props.position }`
@@ -1893,19 +1899,21 @@
1893
1899
  if (oldSpeed === 0 && newSpeed > 0) {
1894
1900
  planNextStep();
1895
1901
  }
1896
- else if (oldSpeed > 0 && newSpeed <= 0) {
1902
+ else if (timer !== null && oldSpeed > 0 && newSpeed <= 0) {
1897
1903
  clearTimeout(timer);
1904
+ timer = null;
1898
1905
  }
1899
1906
 
1900
1907
  return sessions
1901
1908
  }
1902
1909
 
1903
- clearTimeout(timer);
1910
+ timer !== null && clearTimeout(timer);
1904
1911
  emit('start');
1905
1912
 
1906
1913
  progress.value = 0;
1907
1914
 
1908
1915
  timer = setTimeout(() => {
1916
+ timer = null;
1909
1917
  animate.value = true;
1910
1918
  newSpeed > 0 && planNextStep();
1911
1919
  }, onScreen.value === true ? 500 : 1);
@@ -1932,13 +1940,18 @@
1932
1940
  return sessions
1933
1941
  }
1934
1942
 
1935
- clearTimeout(timer);
1943
+ if (timer !== null) {
1944
+ clearTimeout(timer);
1945
+ timer = null;
1946
+ }
1947
+
1936
1948
  emit('stop');
1937
1949
 
1938
1950
  const end = () => {
1939
1951
  animate.value = true;
1940
1952
  progress.value = 100;
1941
1953
  timer = setTimeout(() => {
1954
+ timer = null;
1942
1955
  onScreen.value = false;
1943
1956
  }, 1000);
1944
1957
  };
@@ -1956,6 +1969,7 @@
1956
1969
  function planNextStep () {
1957
1970
  if (progress.value < 100) {
1958
1971
  timer = setTimeout(() => {
1972
+ timer = null;
1959
1973
  increment();
1960
1974
  planNextStep();
1961
1975
  }, speed);
@@ -1976,7 +1990,7 @@
1976
1990
  });
1977
1991
 
1978
1992
  vue.onBeforeUnmount(() => {
1979
- clearTimeout(timer);
1993
+ timer !== null && clearTimeout(timer);
1980
1994
  hijacked === true && restoreAjax(start);
1981
1995
  });
1982
1996
 
@@ -3580,7 +3594,7 @@
3580
3594
  const rootRef = vue.ref(null);
3581
3595
  const blurTargetRef = vue.ref(null);
3582
3596
 
3583
- let localTouchTargetEl = null, avoidMouseRipple, mouseTimer;
3597
+ let localTouchTargetEl = null, avoidMouseRipple, mouseTimer = null;
3584
3598
 
3585
3599
  const hasLabel = vue.computed(() =>
3586
3600
  props.label !== void 0 && props.label !== null && props.label !== ''
@@ -3726,8 +3740,9 @@
3726
3740
  // avoid duplicated mousedown event
3727
3741
  // triggering another early ripple
3728
3742
  avoidMouseRipple = true;
3729
- clearTimeout(mouseTimer);
3743
+ mouseTimer !== null && clearTimeout(mouseTimer);
3730
3744
  mouseTimer = setTimeout(() => {
3745
+ mouseTimer = null;
3731
3746
  avoidMouseRipple = false;
3732
3747
  }, 200);
3733
3748
  }
@@ -3973,7 +3988,7 @@
3973
3988
 
3974
3989
  const anchorEl = vue.ref(null);
3975
3990
 
3976
- let touchTimer;
3991
+ let touchTimer = null;
3977
3992
 
3978
3993
  function canShow (evt) {
3979
3994
  // abort with no parent configured or on multi-touch
@@ -4032,6 +4047,7 @@
4032
4047
  ]);
4033
4048
 
4034
4049
  touchTimer = setTimeout(() => {
4050
+ touchTimer = null;
4035
4051
  proxy.show(evt);
4036
4052
  evt.qAnchorHandled = true;
4037
4053
  }, 300);
@@ -4039,7 +4055,11 @@
4039
4055
 
4040
4056
  mobileCleanup (evt) {
4041
4057
  anchorEl.value.classList.remove('non-selectable');
4042
- clearTimeout(touchTimer);
4058
+
4059
+ if (touchTimer !== null) {
4060
+ clearTimeout(touchTimer);
4061
+ touchTimer = null;
4062
+ }
4043
4063
 
4044
4064
  if (showing.value === true && evt !== void 0) {
4045
4065
  clearSelection();
@@ -4153,7 +4173,7 @@
4153
4173
  });
4154
4174
 
4155
4175
  vue.onBeforeUnmount(() => {
4156
- clearTimeout(touchTimer);
4176
+ touchTimer !== null && clearTimeout(touchTimer);
4157
4177
  unconfigureAnchorEl();
4158
4178
  });
4159
4179
 
@@ -4394,15 +4414,18 @@
4394
4414
  queue = queue.filter(entry => entry !== fn);
4395
4415
  }
4396
4416
 
4397
- const globalNodes = [];
4417
+ const nodesList = [];
4418
+ const portalTypeList = [];
4419
+
4420
+ let portalIndex = 1;
4398
4421
  let target = document.body;
4399
4422
 
4400
- function createGlobalNode (id) {
4423
+ function createGlobalNode (id, portalType) {
4401
4424
  const el = document.createElement('div');
4402
4425
 
4403
- if (id !== void 0) {
4404
- el.id = id;
4405
- }
4426
+ el.id = portalType !== void 0
4427
+ ? `q-portal--${ portalType }--${ portalIndex++ }`
4428
+ : id;
4406
4429
 
4407
4430
  if (globalConfig.globalNodes !== void 0) {
4408
4431
  const cls = globalConfig.globalNodes.class;
@@ -4412,25 +4435,53 @@
4412
4435
  }
4413
4436
 
4414
4437
  target.appendChild(el);
4415
- globalNodes.push(el);
4438
+ nodesList.push(el);
4439
+ portalTypeList.push(portalType);
4416
4440
 
4417
4441
  return el
4418
4442
  }
4419
4443
 
4420
4444
  function removeGlobalNode (el) {
4421
- globalNodes.splice(globalNodes.indexOf(el), 1);
4445
+ const nodeIndex = nodesList.indexOf(el);
4446
+
4447
+ nodesList.splice(nodeIndex, 1);
4448
+ portalTypeList.splice(nodeIndex, 1);
4449
+
4422
4450
  el.remove();
4423
4451
  }
4424
4452
 
4425
- function changeGlobalNodesTarget (el) {
4426
- if (el !== target) {
4427
- target = el;
4453
+ function changeGlobalNodesTarget (newTarget) {
4454
+ if (newTarget === target) {
4455
+ return
4456
+ }
4457
+
4458
+ target = newTarget;
4428
4459
 
4429
- globalNodes.forEach(el => {
4430
- if (el.contains(target) === false) {
4431
- target.appendChild(el);
4460
+ if (
4461
+ target === document.body
4462
+ // or we have less than 2 dialogs:
4463
+ || portalTypeList.reduce((acc, type) => (type === 'dialog' ? acc + 1 : acc), 0) < 2
4464
+ ) {
4465
+ nodesList.forEach(node => {
4466
+ if (node.contains(target) === false) {
4467
+ target.appendChild(node);
4432
4468
  }
4433
4469
  });
4470
+
4471
+ return
4472
+ }
4473
+
4474
+ const lastDialogIndex = portalTypeList.lastIndexOf('dialog');
4475
+
4476
+ for (let i = 0; i < nodesList.length; i++) {
4477
+ const el = nodesList[ i ];
4478
+
4479
+ if (
4480
+ (i === lastDialogIndex || portalTypeList[ i ] !== 'dialog')
4481
+ && el.contains(target) === false
4482
+ ) {
4483
+ target.appendChild(el);
4484
+ }
4434
4485
  }
4435
4486
  }
4436
4487
 
@@ -4509,7 +4560,7 @@
4509
4560
  // Warning!
4510
4561
  // You MUST specify "inheritAttrs: false" in your component
4511
4562
 
4512
- function usePortal (vm, innerRef, renderPortalContent, checkGlobalDialog) {
4563
+ function usePortal (vm, innerRef, renderPortalContent, type) {
4513
4564
  // showing, including while in show/hide transition
4514
4565
  const portalIsActive = vue.ref(false);
4515
4566
 
@@ -4518,7 +4569,7 @@
4518
4569
 
4519
4570
  let portalEl = null;
4520
4571
  const focusObj = {};
4521
- const onGlobalDialog = checkGlobalDialog === true && isOnGlobalDialog(vm);
4572
+ const onGlobalDialog = type === 'dialog' && isOnGlobalDialog(vm);
4522
4573
 
4523
4574
  function showPortal (isReady) {
4524
4575
  if (isReady === true) {
@@ -4531,7 +4582,7 @@
4531
4582
 
4532
4583
  if (portalIsActive.value === false) {
4533
4584
  if (onGlobalDialog === false && portalEl === null) {
4534
- portalEl = createGlobalNode();
4585
+ portalEl = createGlobalNode(false, type);
4535
4586
  }
4536
4587
 
4537
4588
  portalIsActive.value = true;
@@ -4672,11 +4723,14 @@
4672
4723
  */
4673
4724
 
4674
4725
  function useTimeout () {
4675
- let timer;
4726
+ let timer = null;
4676
4727
  const vm = vue.getCurrentInstance();
4677
4728
 
4678
4729
  function removeTimeout () {
4679
- clearTimeout(timer);
4730
+ if (timer !== null) {
4731
+ clearTimeout(timer);
4732
+ timer = null;
4733
+ }
4680
4734
  }
4681
4735
 
4682
4736
  vue.onDeactivated(removeTimeout);
@@ -4686,7 +4740,7 @@
4686
4740
  removeTimeout,
4687
4741
 
4688
4742
  registerTimeout (fn, delay) {
4689
- clearTimeout(timer);
4743
+ removeTimeout();
4690
4744
 
4691
4745
  if (vmIsDestroyed(vm) === false) {
4692
4746
  timer = setTimeout(fn, delay);
@@ -4968,14 +5022,11 @@
4968
5022
  }
4969
5023
  }
4970
5024
 
4971
- let timer;
4972
-
4973
5025
  const
4974
5026
  { notPassiveCapture } = listenOpts,
4975
5027
  registeredList = [];
4976
5028
 
4977
5029
  function globalHandler (evt) {
4978
- clearTimeout(timer);
4979
5030
 
4980
5031
  const target = evt.target;
4981
5032
 
@@ -5048,7 +5099,7 @@
5048
5099
  registeredList.splice(index, 1);
5049
5100
 
5050
5101
  if (registeredList.length === 0) {
5051
- clearTimeout(timer);
5102
+
5052
5103
  document.removeEventListener('mousedown', globalHandler, notPassiveCapture);
5053
5104
  document.removeEventListener('touchstart', globalHandler, notPassiveCapture);
5054
5105
  }
@@ -5116,17 +5167,32 @@
5116
5167
  }
5117
5168
 
5118
5169
  return {
5119
- top,
5120
- left,
5121
- right,
5122
- bottom,
5123
- width,
5124
- height,
5170
+ top, bottom, height,
5171
+ left, right, width,
5125
5172
  middle: left + (right - left) / 2,
5126
5173
  center: top + (bottom - top) / 2
5127
5174
  }
5128
5175
  }
5129
5176
 
5177
+ function getAbsoluteAnchorProps (el, absoluteOffset, offset) {
5178
+ let { top, left } = el.getBoundingClientRect();
5179
+
5180
+ top += absoluteOffset.top;
5181
+ left += absoluteOffset.left;
5182
+
5183
+ if (offset !== void 0) {
5184
+ top += offset[ 1 ];
5185
+ left += offset[ 0 ];
5186
+ }
5187
+
5188
+ return {
5189
+ top, bottom: top + 1, height: 1,
5190
+ left, right: left + 1, width: 1,
5191
+ middle: left,
5192
+ center: top
5193
+ }
5194
+ }
5195
+
5130
5196
  function getTargetProps (el) {
5131
5197
  return {
5132
5198
  top: 0,
@@ -5138,6 +5204,13 @@
5138
5204
  }
5139
5205
  }
5140
5206
 
5207
+ function getTopLeftProps (anchorProps, targetProps, cfg) {
5208
+ return {
5209
+ top: anchorProps[ cfg.anchorOrigin.vertical ] - targetProps[ cfg.selfOrigin.vertical ],
5210
+ left: anchorProps[ cfg.anchorOrigin.horizontal ] - targetProps[ cfg.selfOrigin.horizontal ]
5211
+ }
5212
+ }
5213
+
5141
5214
  // cfg: { el, anchorEl, anchorOrigin, selfOrigin, offset, absoluteOffset, cover, fit, maxHeight, maxWidth }
5142
5215
  function setPosition (cfg) {
5143
5216
  if (client.is.ios === true && window.visualViewport !== void 0) {
@@ -5156,25 +5229,15 @@
5156
5229
  }
5157
5230
  }
5158
5231
 
5159
- let anchorProps;
5160
-
5161
5232
  // scroll position might change
5162
5233
  // if max-height/-width changes, so we
5163
5234
  // need to restore it after we calculate
5164
5235
  // the new positioning
5165
5236
  const { scrollLeft, scrollTop } = cfg.el;
5166
5237
 
5167
- if (cfg.absoluteOffset === void 0) {
5168
- anchorProps = getAnchorProps(cfg.anchorEl, cfg.cover === true ? [ 0, 0 ] : cfg.offset);
5169
- }
5170
- else {
5171
- const
5172
- { top: anchorTop, left: anchorLeft } = cfg.anchorEl.getBoundingClientRect(),
5173
- top = anchorTop + cfg.absoluteOffset.top,
5174
- left = anchorLeft + cfg.absoluteOffset.left;
5175
-
5176
- anchorProps = { top, left, width: 1, height: 1, right: left + 1, center: top, middle: left, bottom: top + 1 };
5177
- }
5238
+ const anchorProps = cfg.absoluteOffset === void 0
5239
+ ? getAnchorProps(cfg.anchorEl, cfg.cover === true ? [ 0, 0 ] : cfg.offset)
5240
+ : getAbsoluteAnchorProps(cfg.anchorEl, cfg.absoluteOffset, cfg.offset);
5178
5241
 
5179
5242
  let elStyle = {
5180
5243
  maxHeight: cfg.maxHeight,
@@ -5191,14 +5254,44 @@
5191
5254
 
5192
5255
  Object.assign(cfg.el.style, elStyle);
5193
5256
 
5194
- const
5195
- targetProps = getTargetProps(cfg.el),
5196
- props = {
5197
- top: anchorProps[ cfg.anchorOrigin.vertical ] - targetProps[ cfg.selfOrigin.vertical ],
5198
- left: anchorProps[ cfg.anchorOrigin.horizontal ] - targetProps[ cfg.selfOrigin.horizontal ]
5199
- };
5257
+ const targetProps = getTargetProps(cfg.el);
5258
+ let props = getTopLeftProps(anchorProps, targetProps, cfg);
5259
+
5260
+ if (cfg.absoluteOffset === void 0 || cfg.offset === void 0) {
5261
+ applyBoundaries(props, anchorProps, targetProps, cfg.anchorOrigin, cfg.selfOrigin);
5262
+ }
5263
+ else { // we have touch position or context menu with offset
5264
+ const { top, left } = props; // cache initial values
5200
5265
 
5201
- applyBoundaries(props, anchorProps, targetProps, cfg.anchorOrigin, cfg.selfOrigin);
5266
+ // apply initial boundaries
5267
+ applyBoundaries(props, anchorProps, targetProps, cfg.anchorOrigin, cfg.selfOrigin);
5268
+
5269
+ let hasChanged = false;
5270
+
5271
+ // did it flip vertically?
5272
+ if (props.top !== top) {
5273
+ hasChanged = true;
5274
+ const offsetY = 2 * cfg.offset[ 1 ];
5275
+ anchorProps.center = anchorProps.top -= offsetY;
5276
+ anchorProps.bottom -= offsetY + 2;
5277
+ }
5278
+
5279
+ // did it flip horizontally?
5280
+ if (props.left !== left) {
5281
+ hasChanged = true;
5282
+ const offsetX = 2 * cfg.offset[ 0 ];
5283
+ anchorProps.middle = anchorProps.left -= offsetX;
5284
+ anchorProps.right -= offsetX + 2;
5285
+ }
5286
+
5287
+ if (hasChanged === true) {
5288
+ // re-calculate props with the new anchor
5289
+ props = getTopLeftProps(anchorProps, targetProps, cfg);
5290
+
5291
+ // and re-apply boundaries
5292
+ applyBoundaries(props, anchorProps, targetProps, cfg.anchorOrigin, cfg.selfOrigin);
5293
+ }
5294
+ }
5202
5295
 
5203
5296
  elStyle = {
5204
5297
  top: props.top + 'px',
@@ -5379,7 +5472,7 @@
5379
5472
  processOnMount: true
5380
5473
  });
5381
5474
 
5382
- const { showPortal, hidePortal, renderPortal } = usePortal(vm, innerRef, renderPortalContent);
5475
+ const { showPortal, hidePortal, renderPortal } = usePortal(vm, innerRef, renderPortalContent, 'menu');
5383
5476
 
5384
5477
  const clickOutsideProps = {
5385
5478
  anchorEl,
@@ -6996,7 +7089,7 @@
6996
7089
 
6997
7090
  const isDark = useDark(props, $q);
6998
7091
 
6999
- let timer, panelsLen;
7092
+ let timer = null, panelsLen;
7000
7093
 
7001
7094
  const {
7002
7095
  updatePanelsList, getPanelContent,
@@ -7050,7 +7143,6 @@
7050
7143
 
7051
7144
  vue.watch(() => props.modelValue, () => {
7052
7145
  if (props.autoplay) {
7053
- clearInterval(timer);
7054
7146
  startTimer();
7055
7147
  }
7056
7148
  });
@@ -7059,20 +7151,28 @@
7059
7151
  if (val) {
7060
7152
  startTimer();
7061
7153
  }
7062
- else {
7063
- clearInterval(timer);
7154
+ else if (timer !== null) {
7155
+ clearTimeout(timer);
7156
+ timer = null;
7064
7157
  }
7065
7158
  });
7066
7159
 
7067
7160
  function startTimer () {
7068
7161
  const duration = isNumber(props.autoplay) === true
7069
- ? props.autoplay
7162
+ ? Math.abs(props.autoplay)
7070
7163
  : 5000;
7071
7164
 
7072
- timer = setTimeout(
7073
- duration >= 0 ? nextPanel : previousPanel,
7074
- Math.abs(duration)
7075
- );
7165
+ timer !== null && clearTimeout(timer);
7166
+ timer = setTimeout(() => {
7167
+ timer = null;
7168
+
7169
+ if (duration >= 0) {
7170
+ nextPanel();
7171
+ }
7172
+ else {
7173
+ previousPanel();
7174
+ }
7175
+ }, duration);
7076
7176
  }
7077
7177
 
7078
7178
  vue.onMounted(() => {
@@ -7080,7 +7180,7 @@
7080
7180
  });
7081
7181
 
7082
7182
  vue.onBeforeUnmount(() => {
7083
- clearInterval(timer);
7183
+ timer !== null && clearTimeout(timer);
7084
7184
  });
7085
7185
 
7086
7186
  function getNavigationContainer (type, mapping) {
@@ -7561,6 +7661,8 @@
7561
7661
  const prop = { type: 'checkbox' };
7562
7662
 
7563
7663
  props.name !== void 0 && Object.assign(prop, {
7664
+ // see https://vuejs.org/guide/extras/render-function.html#creating-vnodes (.prop)
7665
+ '.checked': isTrue.value,
7564
7666
  '^checked': isTrue.value === true ? 'checked' : void 0,
7565
7667
  name: props.name,
7566
7668
  value: modelIsArray.value === true
@@ -9396,8 +9498,10 @@
9396
9498
  }
9397
9499
 
9398
9500
  function emitEvent () {
9399
- clearTimeout(timer);
9400
- timer = null;
9501
+ if (timer !== null) {
9502
+ clearTimeout(timer);
9503
+ timer = null;
9504
+ }
9401
9505
 
9402
9506
  if (targetEl) {
9403
9507
  const { offsetWidth: width, offsetHeight: height } = targetEl;
@@ -9431,7 +9535,7 @@
9431
9535
  vue.onMounted(() => { init(); });
9432
9536
 
9433
9537
  vue.onBeforeUnmount(() => {
9434
- clearTimeout(timer);
9538
+ timer !== null && clearTimeout(timer);
9435
9539
 
9436
9540
  if (observer !== void 0) {
9437
9541
  if (observer.disconnect !== void 0) {
@@ -9451,7 +9555,10 @@
9451
9555
  let curDocView;
9452
9556
 
9453
9557
  function cleanup () {
9454
- clearTimeout(timer);
9558
+ if (timer !== null) {
9559
+ clearTimeout(timer);
9560
+ timer = null;
9561
+ }
9455
9562
 
9456
9563
  if (curDocView !== void 0) {
9457
9564
  // iOS is fuzzy, need to check it first
@@ -9604,7 +9711,7 @@
9604
9711
  const tabDataListLen = vue.ref(0);
9605
9712
  const hasFocus = vue.ref(false);
9606
9713
 
9607
- let animateTimer, scrollTimer, unwatchRoute;
9714
+ let animateTimer = null, scrollTimer = null, unwatchRoute;
9608
9715
 
9609
9716
  const tabProps = vue.computed(() => ({
9610
9717
  activeClass: props.activeClass,
@@ -9740,7 +9847,10 @@
9740
9847
  oldEl = oldTab.tabIndicatorRef.value,
9741
9848
  newEl = newTab.tabIndicatorRef.value;
9742
9849
 
9743
- clearTimeout(animateTimer);
9850
+ if (animateTimer !== null) {
9851
+ clearTimeout(animateTimer);
9852
+ animateTimer = null;
9853
+ }
9744
9854
 
9745
9855
  oldEl.style.transition = 'none';
9746
9856
  oldEl.style.transform = 'none';
@@ -9758,6 +9868,7 @@
9758
9868
  // allow scope updates to kick in (QRouteTab needs more time)
9759
9869
  registerAnimateTick(() => {
9760
9870
  animateTimer = setTimeout(() => {
9871
+ animateTimer = null;
9761
9872
  newEl.style.transition = 'transform .25s cubic-bezier(.4, 0, .2, 1)';
9762
9873
  newEl.style.transform = 'none';
9763
9874
  }, 70);
@@ -9810,7 +9921,7 @@
9810
9921
  }
9811
9922
 
9812
9923
  function animScrollTo (value) {
9813
- stopAnimScroll();
9924
+ scrollTimer !== null && clearInterval(scrollTimer);
9814
9925
  scrollTimer = setInterval(() => {
9815
9926
  if (scrollTowards(value) === true) {
9816
9927
  stopAnimScroll();
@@ -9827,7 +9938,10 @@
9827
9938
  }
9828
9939
 
9829
9940
  function stopAnimScroll () {
9830
- clearInterval(scrollTimer);
9941
+ if (scrollTimer !== null) {
9942
+ clearInterval(scrollTimer);
9943
+ scrollTimer = null;
9944
+ }
9831
9945
  }
9832
9946
 
9833
9947
  function onKbdNavigate (keyCode, fromEl) {
@@ -10131,7 +10245,7 @@
10131
10245
  vue.provide(tabsKey, $tabs);
10132
10246
 
10133
10247
  function cleanup () {
10134
- clearTimeout(animateTimer);
10248
+ animateTimer !== null && clearTimeout(animateTimer);
10135
10249
  stopAnimScroll();
10136
10250
  unwatchRoute !== void 0 && unwatchRoute();
10137
10251
  }
@@ -14523,7 +14637,7 @@
14523
14637
  vpPendingUpdate = false,
14524
14638
  bodyLeft,
14525
14639
  bodyTop,
14526
- closeTimer;
14640
+ closeTimer = null;
14527
14641
 
14528
14642
  function onWheel (e) {
14529
14643
  if (shouldPreventScroll(e)) {
@@ -14670,9 +14784,9 @@
14670
14784
  if (state === true) {
14671
14785
  registered++;
14672
14786
 
14673
- if (closeTimer !== void 0) {
14787
+ if (closeTimer !== null) {
14674
14788
  clearTimeout(closeTimer);
14675
- closeTimer = void 0;
14789
+ closeTimer = null;
14676
14790
  return
14677
14791
  }
14678
14792
 
@@ -14694,11 +14808,10 @@
14694
14808
  action = 'remove';
14695
14809
 
14696
14810
  if (client.is.ios === true && client.is.nativeMobile === true) {
14697
- clearTimeout(closeTimer);
14698
-
14811
+ closeTimer !== null && clearTimeout(closeTimer);
14699
14812
  closeTimer = setTimeout(() => {
14700
14813
  apply$1(action);
14701
- closeTimer = void 0;
14814
+ closeTimer = null;
14702
14815
  }, 100);
14703
14816
  return
14704
14817
  }
@@ -14792,7 +14905,7 @@
14792
14905
  const showing = vue.ref(false);
14793
14906
  const animating = vue.ref(false);
14794
14907
 
14795
- let shakeTimeout, refocusTarget = null, isMaximized, avoidAutoClose;
14908
+ let shakeTimeout = null, refocusTarget = null, isMaximized, avoidAutoClose;
14796
14909
 
14797
14910
  const hideOnRouteChange = vue.computed(() =>
14798
14911
  props.persistent !== true
@@ -14811,7 +14924,7 @@
14811
14924
  );
14812
14925
 
14813
14926
  const { showPortal, hidePortal, portalIsAccessible, renderPortal } = usePortal(
14814
- vm, innerRef, renderPortalContent, /* pls do check if on a global dialog */ true
14927
+ vm, innerRef, renderPortalContent, 'dialog'
14815
14928
  );
14816
14929
 
14817
14930
  const { hide } = useModelToggle({
@@ -14974,8 +15087,9 @@
14974
15087
  if (node !== null) {
14975
15088
  node.classList.remove('q-animate--scale');
14976
15089
  node.classList.add('q-animate--scale');
14977
- clearTimeout(shakeTimeout);
15090
+ shakeTimeout !== null && clearTimeout(shakeTimeout);
14978
15091
  shakeTimeout = setTimeout(() => {
15092
+ shakeTimeout = null;
14979
15093
  if (innerRef.value !== null) {
14980
15094
  node.classList.remove('q-animate--scale');
14981
15095
  // some platforms (like desktop Chrome)
@@ -14999,7 +15113,10 @@
14999
15113
  }
15000
15114
 
15001
15115
  function cleanup (hiding) {
15002
- clearTimeout(shakeTimeout);
15116
+ if (shakeTimeout !== null) {
15117
+ clearTimeout(shakeTimeout);
15118
+ shakeTimeout = null;
15119
+ }
15003
15120
 
15004
15121
  if (hiding === true || showing.value === true) {
15005
15122
  updateMaximized(false);
@@ -15190,7 +15307,7 @@
15190
15307
  return emptyRenderFn
15191
15308
  }
15192
15309
 
15193
- let lastDesktopState, timerMini, layoutTotalWidthWatcher;
15310
+ let lastDesktopState, timerMini = null, layoutTotalWidthWatcher;
15194
15311
 
15195
15312
  const belowBreakpoint = vue.ref(
15196
15313
  props.behavior === 'mobile'
@@ -15565,7 +15682,7 @@
15565
15682
  }
15566
15683
 
15567
15684
  function animateMini () {
15568
- clearTimeout(timerMini);
15685
+ timerMini !== null && clearTimeout(timerMini);
15569
15686
 
15570
15687
  if (vm.proxy && vm.proxy.$el) {
15571
15688
  // need to speed it up and apply it immediately,
@@ -15575,6 +15692,7 @@
15575
15692
 
15576
15693
  flagMiniAnimate.value = true;
15577
15694
  timerMini = setTimeout(() => {
15695
+ timerMini = null;
15578
15696
  flagMiniAnimate.value = false;
15579
15697
  if (vm && vm.proxy && vm.proxy.$el) {
15580
15698
  vm.proxy.$el.classList.remove('q-drawer--mini-animate');
@@ -15727,7 +15845,11 @@
15727
15845
 
15728
15846
  vue.onBeforeUnmount(() => {
15729
15847
  layoutTotalWidthWatcher !== void 0 && layoutTotalWidthWatcher();
15730
- clearTimeout(timerMini);
15848
+
15849
+ if (timerMini !== null) {
15850
+ clearTimeout(timerMini);
15851
+ timerMini = null;
15852
+ }
15731
15853
 
15732
15854
  showing.value === true && cleanup();
15733
15855
 
@@ -16262,7 +16384,7 @@
16262
16384
 
16263
16385
  Object.assign(anchorEvents, { delayShow, delayHide });
16264
16386
 
16265
- const { showPortal, hidePortal, renderPortal } = usePortal(vm, innerRef, renderPortalContent);
16387
+ const { showPortal, hidePortal, renderPortal } = usePortal(vm, innerRef, renderPortalContent, 'tooltip');
16266
16388
 
16267
16389
  // if we're on mobile, let's improve the experience
16268
16390
  // by closing it when user taps outside of it
@@ -17597,15 +17719,23 @@
17597
17719
 
17598
17720
  setup (props, { slots, emit }) {
17599
17721
  let animating = false, doneFn, element;
17600
- let timer, timerFallback, animListener, lastEvent;
17722
+ let timer = null, timerFallback = null, animListener, lastEvent;
17601
17723
 
17602
17724
  function cleanup () {
17603
17725
  doneFn && doneFn();
17604
17726
  doneFn = null;
17605
17727
  animating = false;
17606
17728
 
17607
- clearTimeout(timer);
17608
- clearTimeout(timerFallback);
17729
+ if (timer !== null) {
17730
+ clearTimeout(timer);
17731
+ timer = null;
17732
+ }
17733
+
17734
+ if (timerFallback !== null) {
17735
+ clearTimeout(timerFallback);
17736
+ timerFallback = null;
17737
+ }
17738
+
17609
17739
  element !== void 0 && element.removeEventListener('transitionend', animListener);
17610
17740
  animListener = null;
17611
17741
  }
@@ -17644,8 +17774,11 @@
17644
17774
  begin(el, pos, done);
17645
17775
 
17646
17776
  timer = setTimeout(() => {
17777
+ timer = null;
17647
17778
  el.style.height = `${ el.scrollHeight }px`;
17648
17779
  animListener = evt => {
17780
+ timerFallback = null;
17781
+
17649
17782
  if (Object(evt) !== evt || evt.target === el) {
17650
17783
  end(el, 'show');
17651
17784
  }
@@ -17670,8 +17803,11 @@
17670
17803
  begin(el, pos, done);
17671
17804
 
17672
17805
  timer = setTimeout(() => {
17806
+ timer = null;
17673
17807
  el.style.height = 0;
17674
17808
  animListener = evt => {
17809
+ timerFallback = null;
17810
+
17675
17811
  if (Object(evt) !== evt || evt.target === el) {
17676
17812
  end(el, 'hide');
17677
17813
  }
@@ -18807,7 +18943,7 @@
18807
18943
  const { props, emit, slots, attrs, proxy } = vue.getCurrentInstance();
18808
18944
  const { $q } = proxy;
18809
18945
 
18810
- let focusoutTimer;
18946
+ let focusoutTimer = null;
18811
18947
 
18812
18948
  if (state.hasValue === void 0) {
18813
18949
  state.hasValue = vue.computed(() => fieldValueIsFilled(props.modelValue));
@@ -18973,7 +19109,11 @@
18973
19109
  }
18974
19110
 
18975
19111
  function onControlFocusin (e) {
18976
- clearTimeout(focusoutTimer);
19112
+ if (focusoutTimer !== null) {
19113
+ clearTimeout(focusoutTimer);
19114
+ focusoutTimer = null;
19115
+ }
19116
+
18977
19117
  if (state.editable.value === true && state.focused.value === false) {
18978
19118
  state.focused.value = true;
18979
19119
  emit('focus', e);
@@ -18981,8 +19121,10 @@
18981
19121
  }
18982
19122
 
18983
19123
  function onControlFocusout (e, then) {
18984
- clearTimeout(focusoutTimer);
19124
+ focusoutTimer !== null && clearTimeout(focusoutTimer);
18985
19125
  focusoutTimer = setTimeout(() => {
19126
+ focusoutTimer = null;
19127
+
18986
19128
  if (
18987
19129
  document.hasFocus() === true && (
18988
19130
  state.hasPopupOpen === true
@@ -19232,7 +19374,7 @@
19232
19374
  });
19233
19375
 
19234
19376
  vue.onBeforeUnmount(() => {
19235
- clearTimeout(focusoutTimer);
19377
+ focusoutTimer !== null && clearTimeout(focusoutTimer);
19236
19378
  });
19237
19379
 
19238
19380
  // expose public methods
@@ -20535,7 +20677,7 @@
20535
20677
  const naturalRatio = vue.ref(props.initialRatio);
20536
20678
  const ratioStyle = useRatio(props, naturalRatio);
20537
20679
 
20538
- let loadTimer;
20680
+ let loadTimer = null, isDestroyed = false;
20539
20681
 
20540
20682
  const images = [
20541
20683
  vue.ref(null),
@@ -20586,7 +20728,11 @@
20586
20728
  }
20587
20729
 
20588
20730
  function addImage (imgProps) {
20589
- clearTimeout(loadTimer);
20731
+ if (loadTimer !== null) {
20732
+ clearTimeout(loadTimer);
20733
+ loadTimer = null;
20734
+ }
20735
+
20590
20736
  hasError.value = false;
20591
20737
 
20592
20738
  if (imgProps === null) {
@@ -20601,10 +20747,12 @@
20601
20747
  }
20602
20748
 
20603
20749
  function onLoad ({ target }) {
20604
- // if component has been already destroyed
20605
- if (loadTimer === null) { return }
20750
+ if (isDestroyed === true) { return }
20606
20751
 
20607
- clearTimeout(loadTimer);
20752
+ if (loadTimer !== null) {
20753
+ clearTimeout(loadTimer);
20754
+ loadTimer = null;
20755
+ }
20608
20756
 
20609
20757
  naturalRatio.value = target.naturalHeight === 0
20610
20758
  ? 0.5
@@ -20615,21 +20763,21 @@
20615
20763
 
20616
20764
  function waitForCompleteness (target, count) {
20617
20765
  // protect against running forever
20618
- if (loadTimer === null || count === 1000) { return }
20766
+ if (isDestroyed === true || count === 1000) { return }
20619
20767
 
20620
20768
  if (target.complete === true) {
20621
20769
  onReady(target);
20622
20770
  }
20623
20771
  else {
20624
20772
  loadTimer = setTimeout(() => {
20773
+ loadTimer = null;
20625
20774
  waitForCompleteness(target, count + 1);
20626
20775
  }, 50);
20627
20776
  }
20628
20777
  }
20629
20778
 
20630
20779
  function onReady (img) {
20631
- // if component has been already destroyed
20632
- if (loadTimer === null) { return }
20780
+ if (isDestroyed === true) { return }
20633
20781
 
20634
20782
  position.value = position.value ^ 1;
20635
20783
  images[ position.value ].value = null;
@@ -20639,7 +20787,11 @@
20639
20787
  }
20640
20788
 
20641
20789
  function onError (err) {
20642
- clearTimeout(loadTimer);
20790
+ if (loadTimer !== null) {
20791
+ clearTimeout(loadTimer);
20792
+ loadTimer = null;
20793
+ }
20794
+
20643
20795
  isLoading.value = false;
20644
20796
  hasError.value = true;
20645
20797
  images[ position.value ].value = null;
@@ -20714,8 +20866,12 @@
20714
20866
  }
20715
20867
 
20716
20868
  vue.onBeforeUnmount(() => {
20717
- clearTimeout(loadTimer);
20718
- loadTimer = null;
20869
+ isDestroyed = true;
20870
+
20871
+ if (loadTimer !== null) {
20872
+ clearTimeout(loadTimer);
20873
+ loadTimer = null;
20874
+ }
20719
20875
  });
20720
20876
  }
20721
20877
 
@@ -21659,7 +21815,7 @@
21659
21815
  const { $q } = proxy;
21660
21816
 
21661
21817
  const temp = {};
21662
- let emitCachedValue = NaN, typedNumber, stopValueWatcher, emitTimer, emitValueFn;
21818
+ let emitCachedValue = NaN, typedNumber, stopValueWatcher, emitTimer = null, emitValueFn;
21663
21819
 
21664
21820
  const inputRef = vue.ref(null);
21665
21821
  const nameProp = useFormInputNameAttr(props);
@@ -21871,6 +22027,8 @@
21871
22027
 
21872
22028
  function emitValue (val, stopWatcher) {
21873
22029
  emitValueFn = () => {
22030
+ emitTimer = null;
22031
+
21874
22032
  if (
21875
22033
  props.type !== 'number'
21876
22034
  && temp.hasOwnProperty('value') === true
@@ -21898,7 +22056,7 @@
21898
22056
  }
21899
22057
 
21900
22058
  if (props.debounce !== void 0) {
21901
- clearTimeout(emitTimer);
22059
+ emitTimer !== null && clearTimeout(emitTimer);
21902
22060
  temp.value = val;
21903
22061
  emitTimer = setTimeout(emitValueFn, props.debounce);
21904
22062
  }
@@ -21932,7 +22090,11 @@
21932
22090
  function onChange (e) {
21933
22091
  onComposition(e);
21934
22092
 
21935
- clearTimeout(emitTimer);
22093
+ if (emitTimer !== null) {
22094
+ clearTimeout(emitTimer);
22095
+ emitTimer = null;
22096
+ }
22097
+
21936
22098
  emitValueFn !== void 0 && emitValueFn();
21937
22099
 
21938
22100
  emit('change', e.target.value);
@@ -21941,7 +22103,11 @@
21941
22103
  function onFinishEditing (e) {
21942
22104
  e !== void 0 && stop(e);
21943
22105
 
21944
- clearTimeout(emitTimer);
22106
+ if (emitTimer !== null) {
22107
+ clearTimeout(emitTimer);
22108
+ emitTimer = null;
22109
+ }
22110
+
21945
22111
  emitValueFn !== void 0 && emitValueFn();
21946
22112
 
21947
22113
  typedNumber = false;
@@ -22785,7 +22951,7 @@
22785
22951
  }
22786
22952
  }
22787
22953
 
22788
- let timer;
22954
+ let animateTimer = null;
22789
22955
 
22790
22956
  const $layout = {
22791
22957
  instances: {},
@@ -22816,16 +22982,16 @@
22816
22982
  scroll,
22817
22983
 
22818
22984
  animate () {
22819
- if (timer !== void 0) {
22820
- clearTimeout(timer);
22985
+ if (animateTimer !== null) {
22986
+ clearTimeout(animateTimer);
22821
22987
  }
22822
22988
  else {
22823
22989
  document.body.classList.add('q-body--layout-animate');
22824
22990
  }
22825
22991
 
22826
- timer = setTimeout(() => {
22992
+ animateTimer = setTimeout(() => {
22993
+ animateTimer = null;
22827
22994
  document.body.classList.remove('q-body--layout-animate');
22828
- timer = void 0;
22829
22995
  }, 155);
22830
22996
  },
22831
22997
 
@@ -23094,6 +23260,8 @@
23094
23260
  const prop = { type: 'radio' };
23095
23261
 
23096
23262
  props.name !== void 0 && Object.assign(prop, {
23263
+ // see https://vuejs.org/guide/extras/render-function.html#creating-vnodes (.prop)
23264
+ '.checked': isTrue.value === true,
23097
23265
  '^checked': isTrue.value === true ? 'checked' : void 0,
23098
23266
  name: props.name,
23099
23267
  value: props.val
@@ -24891,6 +25059,8 @@
24891
25059
  });
24892
25060
  }
24893
25061
 
25062
+ let $el, localScrollTarget, timer = null;
25063
+
24894
25064
  function animateTo ({ pos, ratio }, done) {
24895
25065
  animating.value = true;
24896
25066
  pullPosition.value = pos;
@@ -24899,15 +25069,14 @@
24899
25069
  pullRatio.value = ratio;
24900
25070
  }
24901
25071
 
24902
- clearTimeout(timer);
25072
+ timer !== null && clearTimeout(timer);
24903
25073
  timer = setTimeout(() => {
25074
+ timer = null;
24904
25075
  animating.value = false;
24905
25076
  done && done();
24906
25077
  }, 300);
24907
25078
  }
24908
25079
 
24909
- let $el, localScrollTarget, timer;
24910
-
24911
25080
  function updateScrollTarget () {
24912
25081
  localScrollTarget = getScrollTarget($el, props.scrollTarget);
24913
25082
  }
@@ -24920,7 +25089,7 @@
24920
25089
  });
24921
25090
 
24922
25091
  vue.onBeforeUnmount(() => {
24923
- clearTimeout(timer);
25092
+ timer !== null && clearTimeout(timer);
24924
25093
  });
24925
25094
 
24926
25095
  // expose public methods
@@ -25709,7 +25878,7 @@
25709
25878
 
25710
25879
  const isDark = useDark(props, proxy.$q);
25711
25880
 
25712
- let timer, panRefPos;
25881
+ let timer = null, panRefPos;
25713
25882
 
25714
25883
  const targetRef = vue.ref(null);
25715
25884
 
@@ -25958,14 +26127,14 @@
25958
26127
  }
25959
26128
 
25960
26129
  function startTimer () {
25961
- if (tempShowing.value === true) {
25962
- clearTimeout(timer);
25963
- }
25964
- else {
25965
- tempShowing.value = true;
25966
- }
26130
+ tempShowing.value = true;
26131
+
26132
+ timer !== null && clearTimeout(timer);
26133
+ timer = setTimeout(() => {
26134
+ timer = null;
26135
+ tempShowing.value = false;
26136
+ }, props.delay);
25967
26137
 
25968
- timer = setTimeout(() => { tempShowing.value = false; }, props.delay);
25969
26138
  props.onScroll !== void 0 && emitScroll();
25970
26139
  }
25971
26140
 
@@ -26967,8 +27136,8 @@
26967
27136
  const dialogFieldFocused = vue.ref(false);
26968
27137
  const innerLoadingIndicator = vue.ref(false);
26969
27138
 
26970
- let inputTimer, innerValueCache,
26971
- hasDialog, userInputValue, filterId, defaultInputValue,
27139
+ let inputTimer = null, innerValueCache,
27140
+ hasDialog, userInputValue, filterId = null, defaultInputValue,
26972
27141
  transitionShowComputed, searchBuffer, searchBufferExp;
26973
27142
 
26974
27143
  const inputRef = vue.ref(null);
@@ -27474,7 +27643,12 @@
27474
27643
  }
27475
27644
 
27476
27645
  e.target.value = '';
27477
- clearTimeout(inputTimer);
27646
+
27647
+ if (inputTimer !== null) {
27648
+ clearTimeout(inputTimer);
27649
+ inputTimer = null;
27650
+ }
27651
+
27478
27652
  resetInputValue();
27479
27653
 
27480
27654
  if (typeof value === 'string' && value.length > 0) {
@@ -27839,7 +28013,10 @@
27839
28013
  }
27840
28014
 
27841
28015
  function onInput (e) {
27842
- clearTimeout(inputTimer);
28016
+ if (inputTimer !== null) {
28017
+ clearTimeout(inputTimer);
28018
+ inputTimer = null;
28019
+ }
27843
28020
 
27844
28021
  if (e && e.target && e.target.qComposing === true) {
27845
28022
  return
@@ -27860,6 +28037,7 @@
27860
28037
 
27861
28038
  if (props.onFilter !== void 0) {
27862
28039
  inputTimer = setTimeout(() => {
28040
+ inputTimer = null;
27863
28041
  filter(inputValue.value);
27864
28042
  }, props.inputDebounce);
27865
28043
  }
@@ -27913,7 +28091,7 @@
27913
28091
  menu.value === true && (menu.value = false);
27914
28092
  }, 10);
27915
28093
 
27916
- clearTimeout(filterId);
28094
+ filterId !== null && clearTimeout(filterId);
27917
28095
  filterId = localFilterId;
27918
28096
 
27919
28097
  emit(
@@ -28105,8 +28283,10 @@
28105
28283
  }
28106
28284
 
28107
28285
  if (state.focused.value === false) {
28108
- clearTimeout(filterId);
28109
- filterId = void 0;
28286
+ if (filterId !== null) {
28287
+ clearTimeout(filterId);
28288
+ filterId = null;
28289
+ }
28110
28290
 
28111
28291
  if (state.innerLoading.value === true) {
28112
28292
  emit('filterAbort');
@@ -28227,7 +28407,7 @@
28227
28407
  updatePreState();
28228
28408
 
28229
28409
  vue.onBeforeUnmount(() => {
28230
- clearTimeout(inputTimer);
28410
+ inputTimer !== null && clearTimeout(inputTimer);
28231
28411
  });
28232
28412
 
28233
28413
  // expose public methods
@@ -28487,7 +28667,7 @@
28487
28667
 
28488
28668
  const contentRef = vue.ref(null);
28489
28669
 
28490
- let timer, pan = {}, dirRefs = {}, dirContentRefs = {};
28670
+ let timer = null, pan = {}, dirRefs = {}, dirContentRefs = {};
28491
28671
 
28492
28672
  const langDir = vue.computed(() => (
28493
28673
  $q.lang.rtl === true
@@ -28538,7 +28718,9 @@
28538
28718
  if (pan.scale === 1) {
28539
28719
  node.style.transform = `translate${ pan.axis }(${ pan.dir * 100 }%)`;
28540
28720
 
28721
+ timer !== null && clearTimeout(timer);
28541
28722
  timer = setTimeout(() => {
28723
+ timer = null;
28542
28724
  emit(pan.showing, { reset });
28543
28725
  emit('action', { side: pan.showing, reset });
28544
28726
  }, 230);
@@ -28609,7 +28791,7 @@
28609
28791
  });
28610
28792
 
28611
28793
  vue.onBeforeUnmount(() => {
28612
- clearTimeout(timer);
28794
+ timer !== null && clearTimeout(timer);
28613
28795
  });
28614
28796
 
28615
28797
  // expose public methods
@@ -36971,12 +37153,11 @@
36971
37153
  : (
36972
37154
  options.waitFor === 'transitionend'
36973
37155
  ? new Promise(resolve => {
36974
- const timer = setTimeout(() => {
36975
- endFn();
36976
- }, 400);
36977
-
36978
- const endFn = ev => {
36979
- clearTimeout(timer);
37156
+ const endFn = () => {
37157
+ if (timer !== null) {
37158
+ clearTimeout(timer);
37159
+ timer = null;
37160
+ }
36980
37161
 
36981
37162
  if (elTo) {
36982
37163
  elTo.removeEventListener('transitionend', endFn);
@@ -36986,6 +37167,8 @@
36986
37167
  resolve();
36987
37168
  };
36988
37169
 
37170
+ let timer = setTimeout(endFn, 400);
37171
+
36989
37172
  elTo.addEventListener('transitionend', endFn);
36990
37173
  elTo.addEventListener('transitioncancel', endFn);
36991
37174
  })
@@ -37454,6 +37637,7 @@
37454
37637
  : ctx.touchSensitivity;
37455
37638
 
37456
37639
  ctx.timer = setTimeout(() => {
37640
+ ctx.timer = void 0;
37457
37641
  clearSelection();
37458
37642
  ctx.triggered = true;
37459
37643
 
@@ -37470,10 +37654,13 @@
37470
37654
  move (evt) {
37471
37655
  const { top, left } = position(evt);
37472
37656
  if (
37473
- Math.abs(left - ctx.origin.left) >= ctx.sensitivity
37474
- || Math.abs(top - ctx.origin.top) >= ctx.sensitivity
37657
+ ctx.timer !== void 0 && (
37658
+ Math.abs(left - ctx.origin.left) >= ctx.sensitivity
37659
+ || Math.abs(top - ctx.origin.top) >= ctx.sensitivity
37660
+ )
37475
37661
  ) {
37476
37662
  clearTimeout(ctx.timer);
37663
+ ctx.timer = void 0;
37477
37664
  }
37478
37665
  },
37479
37666
 
@@ -37486,8 +37673,9 @@
37486
37673
  if (ctx.triggered === true) {
37487
37674
  evt !== void 0 && stopAndPrevent(evt);
37488
37675
  }
37489
- else {
37676
+ else if (ctx.timer !== void 0) {
37490
37677
  clearTimeout(ctx.timer);
37678
+ ctx.timer = void 0;
37491
37679
  }
37492
37680
  }
37493
37681
  };
@@ -37539,7 +37727,7 @@
37539
37727
  cleanEvt(ctx, 'main');
37540
37728
  cleanEvt(ctx, 'temp');
37541
37729
 
37542
- clearTimeout(ctx.timer);
37730
+ ctx.timer !== void 0 && clearTimeout(ctx.timer);
37543
37731
  ctx.styleCleanup !== void 0 && ctx.styleCleanup();
37544
37732
 
37545
37733
  delete el.__qtouchhold;
@@ -37678,6 +37866,8 @@
37678
37866
  };
37679
37867
 
37680
37868
  const fn = () => {
37869
+ ctx.timer = void 0;
37870
+
37681
37871
  if (ctx.event === void 0) {
37682
37872
  return
37683
37873
  }
@@ -37721,8 +37911,9 @@
37721
37911
  },
37722
37912
 
37723
37913
  move (evt) {
37724
- if (ctx.event !== void 0 && shouldEnd(evt, ctx.origin) === true) {
37914
+ if (ctx.event !== void 0 && ctx.timer !== void 0 && shouldEnd(evt, ctx.origin) === true) {
37725
37915
  clearTimeout(ctx.timer);
37916
+ ctx.timer = void 0;
37726
37917
  }
37727
37918
  },
37728
37919
 
@@ -37735,7 +37926,11 @@
37735
37926
  evt !== void 0 && ctx.event.repeatCount > 0 && stopAndPrevent(evt);
37736
37927
 
37737
37928
  cleanEvt(ctx, 'temp');
37738
- clearTimeout(ctx.timer);
37929
+
37930
+ if (ctx.timer !== void 0) {
37931
+ clearTimeout(ctx.timer);
37932
+ ctx.timer = void 0;
37933
+ }
37739
37934
 
37740
37935
  ctx.event = void 0;
37741
37936
  }
@@ -37784,7 +37979,7 @@
37784
37979
  const ctx = el.__qtouchrepeat;
37785
37980
 
37786
37981
  if (ctx !== void 0) {
37787
- clearTimeout(ctx.timer);
37982
+ ctx.timer !== void 0 && clearTimeout(ctx.timer);
37788
37983
 
37789
37984
  cleanEvt(ctx, 'main');
37790
37985
  cleanEvt(ctx, 'temp');
@@ -38248,7 +38443,7 @@
38248
38443
 
38249
38444
  let vm, emittedOK = false;
38250
38445
  const dialogRef = vue.ref(null);
38251
- const el = createGlobalNode();
38446
+ const el = createGlobalNode(false, 'dialog');
38252
38447
 
38253
38448
  const applyState = cmd => {
38254
38449
  if (dialogRef.value !== null && dialogRef.value[ cmd ] !== void 0) {
@@ -38948,7 +39143,7 @@
38948
39143
  app,
38949
39144
  vm,
38950
39145
  uid$1 = 0,
38951
- timeout,
39146
+ timeout = null,
38952
39147
  props = {},
38953
39148
  activeGroups = {};
38954
39149
 
@@ -38997,10 +39192,10 @@
38997
39192
  }
38998
39193
  else {
38999
39194
  props.uid = ++uid$1;
39000
- clearTimeout(timeout);
39195
+ timeout !== null && clearTimeout(timeout);
39001
39196
 
39002
39197
  timeout = setTimeout(() => {
39003
- timeout = void 0;
39198
+ timeout = null;
39004
39199
 
39005
39200
  const el = createGlobalNode('q-loading');
39006
39201
 
@@ -39110,9 +39305,9 @@
39110
39305
  }
39111
39306
  }
39112
39307
 
39113
- if (timeout !== void 0) {
39308
+ if (timeout !== null) {
39114
39309
  clearTimeout(timeout);
39115
- timeout = void 0;
39310
+ timeout = null;
39116
39311
  }
39117
39312
 
39118
39313
  Plugin$2.isActive = false;
@@ -39134,7 +39329,7 @@
39134
39329
  }
39135
39330
  });
39136
39331
 
39137
- let updateId, currentClientMeta;
39332
+ let updateId = null, currentClientMeta;
39138
39333
  const clientList = [];
39139
39334
 
39140
39335
  function normalize (meta) {
@@ -39268,6 +39463,8 @@
39268
39463
  }
39269
39464
 
39270
39465
  function updateClientMeta () {
39466
+ updateId = null;
39467
+
39271
39468
  const data = {
39272
39469
  title: '',
39273
39470
  titleTemplate: null,
@@ -39293,7 +39490,7 @@
39293
39490
  }
39294
39491
 
39295
39492
  function planClientUpdate () {
39296
- clearTimeout(updateId);
39493
+ updateId !== null && clearTimeout(updateId);
39297
39494
  updateId = setTimeout(updateClientMeta, 50);
39298
39495
  }
39299
39496
 
@@ -39520,7 +39717,10 @@
39520
39717
 
39521
39718
  if (originalApi !== void 0) {
39522
39719
  // reset timeout if any
39523
- clearTimeout(originalApi.notif.meta.timer);
39720
+ if (originalApi.notif.meta.timer) {
39721
+ clearTimeout(originalApi.notif.meta.timer);
39722
+ originalApi.notif.meta.timer = void 0;
39723
+ }
39524
39724
 
39525
39725
  // retain uid
39526
39726
  notif.meta.uid = originalApi.notif.meta.uid;
@@ -39556,7 +39756,10 @@
39556
39756
  // ok, so it's NOT a new one
39557
39757
  else {
39558
39758
  // reset timeout if any
39559
- clearTimeout(original.meta.timer);
39759
+ if (original.meta.timer) {
39760
+ clearTimeout(original.meta.timer);
39761
+ original.meta.timer = void 0;
39762
+ }
39560
39763
 
39561
39764
  if (notif.badgePosition !== void 0) {
39562
39765
  if (badgePositions.includes(notif.badgePosition) === false) {
@@ -39586,6 +39789,7 @@
39586
39789
 
39587
39790
  if (notif.timeout > 0) {
39588
39791
  notif.meta.timer = setTimeout(() => {
39792
+ notif.meta.timer = void 0;
39589
39793
  dismiss();
39590
39794
  }, notif.timeout + /* show duration */ 1000);
39591
39795
  }
@@ -39634,7 +39838,10 @@
39634
39838
  }
39635
39839
 
39636
39840
  function removeNotification (notif) {
39637
- clearTimeout(notif.meta.timer);
39841
+ if (notif.meta.timer) {
39842
+ clearTimeout(notif.meta.timer);
39843
+ notif.meta.timer = void 0;
39844
+ }
39638
39845
 
39639
39846
  const index = notificationsList[ notif.position ].value.indexOf(notif);
39640
39847
  if (index !== -1) {
@@ -40520,7 +40727,7 @@
40520
40727
  */
40521
40728
 
40522
40729
  var index_umd = {
40523
- version: '2.11.2',
40730
+ version: '2.11.4',
40524
40731
  install (app, opts) {
40525
40732
  installQuasar(app, {
40526
40733
  components,