quasar 2.4.2 → 2.4.3

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 (148) hide show
  1. package/dist/api/BottomSheet.json +1 -1
  2. package/dist/api/Notify.json +5 -5
  3. package/dist/api/QAvatar.json +1 -1
  4. package/dist/api/QBreadcrumbsEl.json +1 -1
  5. package/dist/api/QBtn.json +2 -2
  6. package/dist/api/QBtnDropdown.json +3 -3
  7. package/dist/api/QBtnToggle.json +1 -1
  8. package/dist/api/QCarousel.json +4 -4
  9. package/dist/api/QChip.json +4 -4
  10. package/dist/api/QExpansionItem.json +3 -3
  11. package/dist/api/QFab.json +2 -2
  12. package/dist/api/QFabAction.json +1 -1
  13. package/dist/api/QLinearProgress.json +1 -1
  14. package/dist/api/QPagination.json +4 -4
  15. package/dist/api/QPullToRefresh.json +1 -1
  16. package/dist/api/QRating.json +3 -3
  17. package/dist/api/QRouteTab.json +1 -1
  18. package/dist/api/QSelect.json +1 -1
  19. package/dist/api/QStep.json +4 -4
  20. package/dist/api/QStepper.json +4 -4
  21. package/dist/api/QTab.json +1 -1
  22. package/dist/api/QTable.json +4 -4
  23. package/dist/api/QTimelineEntry.json +1 -1
  24. package/dist/api/QToggle.json +1 -1
  25. package/dist/api/QTree.json +1 -1
  26. package/dist/api/QVideo.json +11 -1
  27. package/dist/icon-set/bootstrap-icons.umd.prod.js +1 -1
  28. package/dist/icon-set/eva-icons.umd.prod.js +1 -1
  29. package/dist/icon-set/fontawesome-v5-pro.umd.prod.js +1 -1
  30. package/dist/icon-set/fontawesome-v5.umd.prod.js +1 -1
  31. package/dist/icon-set/ionicons-v4.umd.prod.js +1 -1
  32. package/dist/icon-set/line-awesome.umd.prod.js +1 -1
  33. package/dist/icon-set/material-icons-outlined.umd.prod.js +1 -1
  34. package/dist/icon-set/material-icons-round.umd.prod.js +1 -1
  35. package/dist/icon-set/material-icons-sharp.umd.prod.js +1 -1
  36. package/dist/icon-set/material-icons.umd.prod.js +1 -1
  37. package/dist/icon-set/mdi-v3.umd.prod.js +1 -1
  38. package/dist/icon-set/mdi-v4.umd.prod.js +1 -1
  39. package/dist/icon-set/mdi-v5.umd.prod.js +1 -1
  40. package/dist/icon-set/mdi-v6.umd.prod.js +1 -1
  41. package/dist/icon-set/svg-bootstrap-icons.umd.prod.js +1 -1
  42. package/dist/icon-set/svg-eva-icons.umd.prod.js +1 -1
  43. package/dist/icon-set/svg-fontawesome-v5.umd.prod.js +1 -1
  44. package/dist/icon-set/svg-ionicons-v4.umd.prod.js +1 -1
  45. package/dist/icon-set/svg-ionicons-v5.umd.prod.js +1 -1
  46. package/dist/icon-set/svg-ionicons-v6.umd.prod.js +1 -1
  47. package/dist/icon-set/svg-line-awesome.umd.prod.js +1 -1
  48. package/dist/icon-set/svg-material-icons-outlined.umd.prod.js +1 -1
  49. package/dist/icon-set/svg-material-icons-round.umd.prod.js +1 -1
  50. package/dist/icon-set/svg-material-icons-sharp.umd.prod.js +1 -1
  51. package/dist/icon-set/svg-material-icons.umd.prod.js +1 -1
  52. package/dist/icon-set/svg-mdi-v4.umd.prod.js +1 -1
  53. package/dist/icon-set/svg-mdi-v5.umd.prod.js +1 -1
  54. package/dist/icon-set/svg-mdi-v6.umd.prod.js +1 -1
  55. package/dist/icon-set/svg-themify.umd.prod.js +1 -1
  56. package/dist/icon-set/themify.umd.prod.js +1 -1
  57. package/dist/lang/ar.umd.prod.js +1 -1
  58. package/dist/lang/az-Latn.umd.prod.js +1 -1
  59. package/dist/lang/bg.umd.prod.js +1 -1
  60. package/dist/lang/bn.umd.prod.js +1 -1
  61. package/dist/lang/ca.umd.prod.js +1 -1
  62. package/dist/lang/cs.umd.prod.js +1 -1
  63. package/dist/lang/da.umd.prod.js +1 -1
  64. package/dist/lang/de.umd.prod.js +1 -1
  65. package/dist/lang/el.umd.prod.js +1 -1
  66. package/dist/lang/en-GB.umd.prod.js +1 -1
  67. package/dist/lang/en-US.umd.prod.js +1 -1
  68. package/dist/lang/eo.umd.prod.js +1 -1
  69. package/dist/lang/es.umd.prod.js +1 -1
  70. package/dist/lang/et.umd.prod.js +1 -1
  71. package/dist/lang/fa-IR.umd.prod.js +1 -1
  72. package/dist/lang/fa.umd.prod.js +1 -1
  73. package/dist/lang/fi.umd.prod.js +1 -1
  74. package/dist/lang/fr.umd.prod.js +1 -1
  75. package/dist/lang/gn.umd.prod.js +1 -1
  76. package/dist/lang/he.umd.prod.js +1 -1
  77. package/dist/lang/hr.umd.prod.js +1 -1
  78. package/dist/lang/hu.umd.prod.js +1 -1
  79. package/dist/lang/id.umd.prod.js +1 -1
  80. package/dist/lang/is.umd.prod.js +1 -1
  81. package/dist/lang/it.umd.prod.js +1 -1
  82. package/dist/lang/ja.umd.prod.js +1 -1
  83. package/dist/lang/km.umd.prod.js +1 -1
  84. package/dist/lang/ko-KR.umd.prod.js +1 -1
  85. package/dist/lang/kur-CKB.umd.prod.js +1 -1
  86. package/dist/lang/lt.umd.prod.js +1 -1
  87. package/dist/lang/lu.umd.prod.js +1 -1
  88. package/dist/lang/lv.umd.prod.js +1 -1
  89. package/dist/lang/ml.umd.prod.js +1 -1
  90. package/dist/lang/ms.umd.prod.js +1 -1
  91. package/dist/lang/nb-NO.umd.prod.js +1 -1
  92. package/dist/lang/nl.umd.prod.js +1 -1
  93. package/dist/lang/pl.umd.prod.js +1 -1
  94. package/dist/lang/pt-BR.umd.prod.js +1 -1
  95. package/dist/lang/pt.umd.prod.js +1 -1
  96. package/dist/lang/ro.umd.prod.js +1 -1
  97. package/dist/lang/ru.umd.prod.js +1 -1
  98. package/dist/lang/sk.umd.prod.js +1 -1
  99. package/dist/lang/sl.umd.prod.js +1 -1
  100. package/dist/lang/sr-CYR.umd.prod.js +1 -1
  101. package/dist/lang/sr.umd.prod.js +1 -1
  102. package/dist/lang/sv.umd.prod.js +1 -1
  103. package/dist/lang/ta.umd.prod.js +1 -1
  104. package/dist/lang/th.umd.prod.js +1 -1
  105. package/dist/lang/tr.umd.prod.js +1 -1
  106. package/dist/lang/ug.umd.prod.js +1 -1
  107. package/dist/lang/uk.umd.prod.js +1 -1
  108. package/dist/lang/vi.umd.prod.js +1 -1
  109. package/dist/lang/zh-CN.umd.prod.js +1 -1
  110. package/dist/lang/zh-TW.umd.prod.js +1 -1
  111. package/dist/quasar.cjs.prod.js +2 -2
  112. package/dist/quasar.css +5 -5
  113. package/dist/quasar.esm.prod.js +2 -2
  114. package/dist/quasar.prod.css +1 -1
  115. package/dist/quasar.rtl.css +5 -5
  116. package/dist/quasar.rtl.prod.css +1 -1
  117. package/dist/quasar.sass +5 -6
  118. package/dist/quasar.umd.js +268 -206
  119. package/dist/quasar.umd.prod.js +2 -2
  120. package/dist/ssr-directives/Morph.js +1 -1
  121. package/dist/types/index.d.ts +5 -1
  122. package/dist/types/utils/date.d.ts +2 -1
  123. package/dist/vetur/quasar-attributes.json +4 -0
  124. package/dist/vetur/quasar-tags.json +2 -1
  125. package/dist/web-types/web-types.json +59 -50
  126. package/package.json +1 -1
  127. package/src/api.extends.json +1 -1
  128. package/src/components/dialog/QDialog.js +7 -5
  129. package/src/components/linear-progress/QLinearProgress.json +1 -1
  130. package/src/components/menu/QMenu.js +6 -2
  131. package/src/components/range/QRange.js +67 -89
  132. package/src/components/rating/QRating.json +3 -3
  133. package/src/components/resize-observer/QResizeObserver.js +11 -10
  134. package/src/components/scroll-area/QScrollArea.js +5 -1
  135. package/src/components/scroll-observer/QScrollObserver.js +2 -0
  136. package/src/components/slider/QSlider.js +20 -10
  137. package/src/components/slider/QSlider.sass +5 -6
  138. package/src/components/slider/use-slider.js +19 -16
  139. package/src/components/tabs/QTabs.js +27 -11
  140. package/src/components/tooltip/QTooltip.js +1 -2
  141. package/src/components/video/QVideo.js +4 -1
  142. package/src/components/video/QVideo.json +12 -1
  143. package/src/composables/private/use-field.js +13 -15
  144. package/src/composables/private/use-model-toggle.js +1 -1
  145. package/src/composables/private/use-portal.js +9 -7
  146. package/src/composables/private/use-tick.js +7 -14
  147. package/src/utils/clone.js +53 -4
  148. package/src/utils/private/focus-manager.js +8 -10
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Quasar Framework v2.4.2
2
+ * Quasar Framework v2.4.3
3
3
  * (c) 2015-present Razvan Stoenescu
4
4
  * Released under the MIT License.
5
5
  */
@@ -1447,7 +1447,7 @@
1447
1447
  }
1448
1448
 
1449
1449
  var installQuasar = function (parentApp, opts = {}) {
1450
- const $q = { version: '2.4.2' };
1450
+ const $q = { version: '2.4.3' };
1451
1451
 
1452
1452
  if (globalConfigIsFrozen === false) {
1453
1453
  if (opts.config !== void 0) {
@@ -3896,7 +3896,7 @@
3896
3896
  'before-show', 'show', 'before-hide', 'hide'
3897
3897
  ];
3898
3898
 
3899
- // handleShow/handleHide -> removeTick(), self (& emit show), prepareTick()
3899
+ // handleShow/handleHide -> removeTick(), self (& emit show)
3900
3900
 
3901
3901
  function useModelToggle ({
3902
3902
  showing,
@@ -4036,17 +4036,19 @@
4036
4036
  }
4037
4037
 
4038
4038
  let queue = [];
4039
- const waitFlags = [];
4039
+ let waitFlags = [];
4040
+
4041
+ function clearFlag (flag) {
4042
+ waitFlags = waitFlags.filter(entry => entry !== flag);
4043
+ }
4040
4044
 
4041
4045
  function addFocusWaitFlag (flag) {
4046
+ clearFlag(flag);
4042
4047
  waitFlags.push(flag);
4043
4048
  }
4044
4049
 
4045
4050
  function removeFocusWaitFlag (flag) {
4046
- const index = waitFlags.indexOf(flag);
4047
- if (index !== -1) {
4048
- waitFlags.splice(index, 1);
4049
- }
4051
+ clearFlag(flag);
4050
4052
 
4051
4053
  if (waitFlags.length === 0 && queue.length > 0) {
4052
4054
  // only call last focus handler (can't focus multiple things at once)
@@ -4061,15 +4063,11 @@
4061
4063
  }
4062
4064
  else {
4063
4065
  queue.push(fn);
4064
- return fn
4065
4066
  }
4066
4067
  }
4067
4068
 
4068
4069
  function removeFocusFn (fn) {
4069
- const index = queue.indexOf(fn);
4070
- if (index !== -1) {
4071
- queue.splice(index, 1);
4072
- }
4070
+ queue = queue.filter(entry => entry !== fn);
4073
4071
  }
4074
4072
 
4075
4073
  const globalNodes = [];
@@ -4200,16 +4198,18 @@
4200
4198
  return
4201
4199
  }
4202
4200
 
4203
- if (onGlobalDialog === false && portalEl === null) {
4204
- portalEl = createGlobalNode();
4205
- }
4201
+ if (portalIsActive.value === false) {
4202
+ if (onGlobalDialog === false && portalEl === null) {
4203
+ portalEl = createGlobalNode();
4204
+ }
4206
4205
 
4207
- portalIsActive.value = true;
4206
+ portalIsActive.value = true;
4208
4207
 
4209
- // register portal
4210
- portalList.push(vm.proxy);
4208
+ // register portal
4209
+ portalList.push(vm.proxy);
4211
4210
 
4212
- addFocusWaitFlag(focusObj);
4211
+ addFocusWaitFlag(focusObj);
4212
+ }
4213
4213
  }
4214
4214
 
4215
4215
  function hidePortal () {
@@ -4289,8 +4289,6 @@
4289
4289
  * Usage:
4290
4290
  * registerTick(fn)
4291
4291
  * registerTick(fn)
4292
- * ....
4293
- * prepareTick()
4294
4292
  */
4295
4293
 
4296
4294
  function useTick () {
@@ -4303,22 +4301,17 @@
4303
4301
  return {
4304
4302
  registerTick (fn) {
4305
4303
  tickFn = fn;
4304
+
4305
+ vue.nextTick(() => {
4306
+ if (tickFn === fn) {
4307
+ tickFn();
4308
+ tickFn = void 0;
4309
+ }
4310
+ });
4306
4311
  },
4307
4312
 
4308
4313
  removeTick () {
4309
4314
  tickFn = void 0;
4310
- },
4311
-
4312
- prepareTick () {
4313
- if (tickFn !== void 0) {
4314
- const fn = tickFn;
4315
- vue.nextTick(() => {
4316
- if (tickFn === fn) {
4317
- tickFn();
4318
- tickFn = void 0;
4319
- }
4320
- });
4321
- }
4322
4315
  }
4323
4316
  }
4324
4317
  }
@@ -5013,7 +5006,7 @@
5013
5006
  );
5014
5007
 
5015
5008
  const isDark = useDark(props, $q);
5016
- const { registerTick, removeTick, prepareTick } = useTick();
5009
+ const { registerTick, removeTick } = useTick();
5017
5010
  const { registerTimeout, removeTimeout } = useTimeout();
5018
5011
  const { transition, transitionStyle } = useTransition(props, showing);
5019
5012
  const { localScrollTarget, changeScrollEvent, unconfigureScrollTarget } = useScrollTarget(props, configureScrollTarget);
@@ -5140,7 +5133,6 @@
5140
5133
  updatePosition();
5141
5134
  props.noFocus !== true && focus();
5142
5135
  });
5143
- prepareTick();
5144
5136
 
5145
5137
  registerTimeout(() => {
5146
5138
  // required in order to avoid the "double-tap needed" issue
@@ -5173,6 +5165,7 @@
5173
5165
  )
5174
5166
  ) {
5175
5167
  refocusTarget.focus();
5168
+ refocusTarget = null;
5176
5169
  }
5177
5170
 
5178
5171
  registerTimeout(() => {
@@ -5195,6 +5188,10 @@
5195
5188
  removeClickOutside(clickOutsideProps);
5196
5189
  removeEscapeKey(onEscapeKey);
5197
5190
  }
5191
+
5192
+ if (hiding !== true) {
5193
+ refocusTarget = null;
5194
+ }
5198
5195
  }
5199
5196
 
5200
5197
  function configureScrollTarget () {
@@ -8278,7 +8275,7 @@
8278
8275
  const positionProp = vue.computed(() => (
8279
8276
  props.vertical === true
8280
8277
  ? (isReversed.value === true ? 'bottom' : 'top')
8281
- : isReversed.value === true ? 'right' : 'left'
8278
+ : (isReversed.value === true ? 'right' : 'left')
8282
8279
  ));
8283
8280
 
8284
8281
  const sizeProp = vue.computed(() => (props.vertical === true ? 'height' : 'width'));
@@ -8288,8 +8285,8 @@
8288
8285
  const attributes = vue.computed(() => {
8289
8286
  const acc = {
8290
8287
  role: 'slider',
8291
- 'aria-valuemin': props.min,
8292
- 'aria-valuemax': props.max,
8288
+ 'aria-valuemin': innerMin.value,
8289
+ 'aria-valuemax': innerMax.value,
8293
8290
  'aria-orientation': orientation.value,
8294
8291
  'data-step': props.step
8295
8292
  };
@@ -8480,15 +8477,19 @@
8480
8477
  })
8481
8478
  }
8482
8479
 
8480
+ const filterFn = ({ value }) => value >= props.min && value <= props.max;
8481
+
8483
8482
  if (Array.isArray(def) === true) {
8484
- return def.map(item => (Object(item) === item ? item : { value: item }))
8483
+ return def
8484
+ .map(item => (Object(item) === item ? item : { value: item }))
8485
+ .filter(filterFn)
8485
8486
  }
8486
8487
 
8487
8488
  return Object.keys(def).map(key => {
8488
8489
  const item = def[ key ];
8489
8490
  const value = Number(key);
8490
8491
  return Object(item) === item ? { ...item, value } : { value, label: item }
8491
- })
8492
+ }).filter(filterFn)
8492
8493
  }
8493
8494
 
8494
8495
  function getMarkerLabelStyle (val) {
@@ -8543,6 +8544,7 @@
8543
8544
  emit('pan', 'end');
8544
8545
  }
8545
8546
  active.value = false;
8547
+ focus.value = false;
8546
8548
  }
8547
8549
  else if (event.isFirst === true) {
8548
8550
  dragging.value = getDragging(event.evt);
@@ -8603,7 +8605,7 @@
8603
8605
 
8604
8606
  function getThumbRenderFn (thumb) {
8605
8607
  const focusClass = vue.computed(() => (
8606
- preventFocus.value === false && focus.value === thumb.focusValue
8608
+ preventFocus.value === false && (focus.value === thumb.focusValue || focus.value === 'both')
8607
8609
  ? ' q-slider--focus'
8608
8610
  : ''
8609
8611
  ));
@@ -8618,9 +8620,7 @@
8618
8620
  width: props.thumbSize,
8619
8621
  height: props.thumbSize,
8620
8622
  [ positionProp.value ]: `${ 100 * thumb.ratio.value }%`,
8621
- 'z-index': thumb.nextFocus !== void 0
8622
- ? thumb.nextFocus.value === 'min' ? 2 : void 0
8623
- : void 0
8623
+ zIndex: focus.value === thumb.focusValue ? 2 : void 0
8624
8624
  }));
8625
8625
 
8626
8626
  const pinColor = vue.computed(() => (
@@ -8676,12 +8676,12 @@
8676
8676
  return vue.h('div', {
8677
8677
  class: classes.value,
8678
8678
  style: style.value,
8679
- ...(thumb.getNodeData !== void 0 ? thumb.getNodeData() : {})
8679
+ ...thumb.getNodeData()
8680
8680
  }, thumbContent)
8681
8681
  }
8682
8682
  }
8683
8683
 
8684
- function getContent (selectionBarStyle, events, injectThumb) {
8684
+ function getContent (selectionBarStyle, trackContainerTabindex, trackContainerEvents, injectThumb) {
8685
8685
  const trackContent = [];
8686
8686
 
8687
8687
  props.innerTrackColor !== 'transparent' && trackContent.push(
@@ -8716,15 +8716,14 @@
8716
8716
  {
8717
8717
  key: 'trackC',
8718
8718
  class: trackContainerClass.value,
8719
- tabindex: tabindex.value,
8720
- ...events.value
8719
+ tabindex: trackContainerTabindex.value,
8720
+ ...trackContainerEvents.value
8721
8721
  },
8722
8722
  [
8723
8723
  vue.h('div', {
8724
8724
  class: trackClass.value,
8725
8725
  style: trackStyle.value
8726
- },
8727
- trackContent)
8726
+ }, trackContent)
8728
8727
  ],
8729
8728
  'slide',
8730
8729
  editable.value, () => panDirective.value
@@ -8771,7 +8770,8 @@
8771
8770
  innerMax,
8772
8771
  innerMaxRatio,
8773
8772
  positionProp,
8774
- sizeProp
8773
+ sizeProp,
8774
+ isReversed
8775
8775
  },
8776
8776
 
8777
8777
  methods: {
@@ -8788,6 +8788,8 @@
8788
8788
  }
8789
8789
  }
8790
8790
 
8791
+ const getNodeData = () => ({});
8792
+
8791
8793
  var QSlider = createComponent({
8792
8794
  name: 'QSlider',
8793
8795
 
@@ -8815,8 +8817,20 @@
8815
8817
 
8816
8818
  const rootRef = vue.ref(null);
8817
8819
  const curRatio = vue.ref(0);
8820
+ const model = vue.ref(0);
8818
8821
 
8819
- const model = vue.ref(props.modelValue === null ? state.innerMin.value : props.modelValue);
8822
+ function normalizeModel () {
8823
+ model.value = props.modelValue === null
8824
+ ? state.innerMin.value
8825
+ : between(props.modelValue, state.innerMin.value, state.innerMax.value);
8826
+ }
8827
+
8828
+ vue.watch(
8829
+ () => `${ props.modelValue }|${ state.innerMin.value }|${ state.innerMax.value }`,
8830
+ normalizeModel
8831
+ );
8832
+
8833
+ normalizeModel();
8820
8834
 
8821
8835
  const modelRatio = vue.computed(() => methods.convertModelToRatio(model.value));
8822
8836
  const ratio = vue.computed(() => (state.active.value === true ? curRatio.value : modelRatio.value));
@@ -8834,6 +8848,7 @@
8834
8848
 
8835
8849
  const getThumb = methods.getThumbRenderFn({
8836
8850
  focusValue: true,
8851
+ getNodeData,
8837
8852
  ratio,
8838
8853
  label: vue.computed(() => (
8839
8854
  props.labelValue !== void 0
@@ -8845,7 +8860,7 @@
8845
8860
  labelTextColor: vue.computed(() => props.labelTextColor)
8846
8861
  });
8847
8862
 
8848
- const events = vue.computed(() => {
8863
+ const trackContainerEvents = vue.computed(() => {
8849
8864
  if (state.editable.value !== true) {
8850
8865
  return {}
8851
8866
  }
@@ -8861,12 +8876,6 @@
8861
8876
  }
8862
8877
  });
8863
8878
 
8864
- vue.watch(() => props.modelValue + state.innerMin.value + state.innerMax.value, () => {
8865
- model.value = props.modelValue === null
8866
- ? state.innerMin.value
8867
- : between(props.modelValue, state.innerMin.value, state.innerMax.value);
8868
- });
8869
-
8870
8879
  function updateValue (change) {
8871
8880
  if (model.value !== props.modelValue) {
8872
8881
  emit('update:modelValue', model.value);
@@ -8901,7 +8910,7 @@
8901
8910
 
8902
8911
  const
8903
8912
  stepVal = ([ 34, 33 ].includes(evt.keyCode) ? 10 : 1) * state.step.value,
8904
- offset = [ 34, 37, 40 ].includes(evt.keyCode) ? -stepVal : stepVal;
8913
+ offset = ([ 34, 37, 40 ].includes(evt.keyCode) ? -1 : 1) * (state.isReversed.value === true ? -1 : 1) * stepVal;
8905
8914
 
8906
8915
  model.value = between(
8907
8916
  parseFloat((model.value + offset).toFixed(state.decimals.value)),
@@ -8915,7 +8924,8 @@
8915
8924
  return () => {
8916
8925
  const content = methods.getContent(
8917
8926
  selectionBarStyle,
8918
- events,
8927
+ state.tabindex,
8928
+ trackContainerEvents,
8919
8929
  node => { node.push(getThumb()); }
8920
8930
  );
8921
8931
 
@@ -8963,19 +8973,20 @@
8963
8973
 
8964
8974
  setup (props, { emit }) {
8965
8975
 
8966
- let timer, targetEl, size = { width: -1, height: -1 };
8976
+ let timer = null, targetEl, size = { width: -1, height: -1 };
8967
8977
 
8968
- function trigger (now) {
8969
- if (now === true || props.debounce === 0 || props.debounce === '0') {
8970
- onResize();
8978
+ function trigger (immediately) {
8979
+ if (immediately === true || props.debounce === 0 || props.debounce === '0') {
8980
+ emitEvent();
8971
8981
  }
8972
- else if (!timer) {
8973
- timer = setTimeout(onResize, props.debounce);
8982
+ else if (timer === null) {
8983
+ timer = setTimeout(emitEvent, props.debounce);
8974
8984
  }
8975
8985
  }
8976
8986
 
8977
- function onResize () {
8978
- timer = void 0;
8987
+ function emitEvent () {
8988
+ clearTimeout(timer);
8989
+ timer = null;
8979
8990
 
8980
8991
  if (targetEl) {
8981
8992
  const { offsetWidth: width, offsetHeight: height } = targetEl;
@@ -9002,7 +9013,7 @@
9002
9013
  if (targetEl) {
9003
9014
  observer = new ResizeObserver(trigger);
9004
9015
  observer.observe(targetEl);
9005
- onResize();
9016
+ emitEvent();
9006
9017
  }
9007
9018
  });
9008
9019
  });
@@ -9045,7 +9056,7 @@
9045
9056
  if (targetEl && targetEl.contentDocument) {
9046
9057
  curDocView = targetEl.contentDocument.defaultView;
9047
9058
  curDocView.addEventListener('resize', trigger, listenOpts.passive);
9048
- onResize();
9059
+ emitEvent();
9049
9060
  }
9050
9061
  }
9051
9062
 
@@ -9156,7 +9167,8 @@
9156
9167
  const vm = vue.getCurrentInstance();
9157
9168
  const { proxy: { $q } } = vm;
9158
9169
 
9159
- const { registerTick, prepareTick } = useTick();
9170
+ const { registerTick: registerScrollTick } = useTick();
9171
+ const { registerTimeout: registerFocusTimeout, removeTimeout: removeFocusTimeout } = useTimeout();
9160
9172
  const { registerTimeout } = useTimeout();
9161
9173
 
9162
9174
  const rootRef = vue.ref(null);
@@ -9264,7 +9276,7 @@
9264
9276
  }
9265
9277
 
9266
9278
  function recalculateScroll () {
9267
- registerTick(() => {
9279
+ registerScrollTick(() => {
9268
9280
  if (vm.isDeactivated !== true && vm.isUnmounted !== true) {
9269
9281
  updateContainer({
9270
9282
  width: rootRef.value.offsetWidth,
@@ -9272,8 +9284,6 @@
9272
9284
  });
9273
9285
  }
9274
9286
  });
9275
-
9276
- prepareTick();
9277
9287
  }
9278
9288
 
9279
9289
  function updateContainer (domSize) {
@@ -9432,11 +9442,8 @@
9432
9442
  return true
9433
9443
  }
9434
9444
 
9435
- const dirPrev = (props.vertical === true && keyCode === 38 /* ArrowUp */)
9436
- || (props.vertical !== true && keyCode === 37 /* ArrowLeft */);
9437
-
9438
- const dirNext = (props.vertical === true && keyCode === 40 /* ArrowDown */)
9439
- || (props.vertical !== true && keyCode === 39 /* ArrowRight */);
9445
+ const dirPrev = keyCode === (props.vertical === true ? 38 /* ArrowUp */ : 37 /* ArrowLeft */);
9446
+ const dirNext = keyCode === (props.vertical === true ? 40 /* ArrowDown */ : 39 /* ArrowRight */);
9440
9447
 
9441
9448
  const dir = dirPrev === true ? -1 : (dirNext === true ? 1 : void 0);
9442
9449
 
@@ -9570,8 +9577,28 @@
9570
9577
  }
9571
9578
  }
9572
9579
 
9573
- function onFocusin () { hasFocus.value = true; }
9574
- function onFocusout () { hasFocus.value = false; }
9580
+ function onFocusin (e) {
9581
+ removeFocusTimeout();
9582
+
9583
+ if (
9584
+ hasFocus.value !== true
9585
+ && rootRef.value !== null
9586
+ && e.target
9587
+ && typeof e.target.closest === 'function'
9588
+ ) {
9589
+ const tab = e.target.closest('.q-tab');
9590
+
9591
+ // if the target is contained by a QTab/QRouteTab
9592
+ // (it might be other elements focused, like additional QBtn)
9593
+ if (tab && rootRef.value.contains(tab) === true) {
9594
+ hasFocus.value = true;
9595
+ }
9596
+ }
9597
+ }
9598
+
9599
+ function onFocusout () {
9600
+ registerFocusTimeout(() => { hasFocus.value = false; }, 30);
9601
+ }
9575
9602
 
9576
9603
  function verifyRouteModel () {
9577
9604
  if ($tabs.avoidRouteWatcher !== true) {
@@ -12381,7 +12408,7 @@
12381
12408
  )
12382
12409
  }
12383
12410
 
12384
- function clone$1 (date) {
12411
+ function clone (date) {
12385
12412
  return isDate(date) === true
12386
12413
  ? new Date(date.getTime())
12387
12414
  : date
@@ -12408,7 +12435,7 @@
12408
12435
  isSameDate,
12409
12436
  daysInMonth,
12410
12437
  formatDate,
12411
- clone: clone$1
12438
+ clone
12412
12439
  };
12413
12440
 
12414
12441
  const yearsInterval = 20;
@@ -14170,7 +14197,7 @@
14170
14197
 
14171
14198
  const { preventBodyScroll } = usePreventScroll();
14172
14199
  const { registerTimeout, removeTimeout } = useTimeout();
14173
- const { registerTick, removeTick, prepareTick } = useTick();
14200
+ const { registerTick, removeTick } = useTick();
14174
14201
 
14175
14202
  const { showPortal, hidePortal, portalIsActive, renderPortal } = usePortal(
14176
14203
  vm, innerRef, renderPortalContent, /* pls do check if on a global dialog */ true
@@ -14269,7 +14296,6 @@
14269
14296
  if (props.noFocus !== true) {
14270
14297
  document.activeElement !== null && document.activeElement.blur();
14271
14298
  registerTick(focus);
14272
- prepareTick();
14273
14299
  }
14274
14300
 
14275
14301
  registerTimeout(() => {
@@ -14315,6 +14341,7 @@
14315
14341
 
14316
14342
  if (refocusTarget !== null) {
14317
14343
  refocusTarget.focus();
14344
+ refocusTarget = null;
14318
14345
  }
14319
14346
 
14320
14347
  registerTimeout(() => {
@@ -14382,6 +14409,10 @@
14382
14409
  removeEscapeKey(onEscapeKey);
14383
14410
  }
14384
14411
  }
14412
+
14413
+ if (hiding !== true) {
14414
+ refocusTarget = null;
14415
+ }
14385
14416
  }
14386
14417
 
14387
14418
  function updateMaximized (active) {
@@ -14440,9 +14471,7 @@
14440
14471
  }
14441
14472
  });
14442
14473
 
14443
- vue.onBeforeUnmount(() => {
14444
- cleanup();
14445
- });
14474
+ vue.onBeforeUnmount(cleanup);
14446
14475
 
14447
14476
  function renderPortalContent () {
14448
14477
  return vue.h('div', {
@@ -15607,7 +15636,7 @@
15607
15636
  const selfOrigin = vue.computed(() => parsePosition(props.self, $q.lang.rtl));
15608
15637
  const hideOnRouteChange = vue.computed(() => props.persistent !== true);
15609
15638
 
15610
- const { registerTick, removeTick, prepareTick } = useTick();
15639
+ const { registerTick, removeTick } = useTick();
15611
15640
  const { registerTimeout, removeTimeout } = useTimeout();
15612
15641
  const { transition, transitionStyle } = useTransition(props, showing);
15613
15642
  const { localScrollTarget, changeScrollEvent, unconfigureScrollTarget } = useScrollTarget(props, configureScrollTarget);
@@ -15673,7 +15702,6 @@
15673
15702
  updatePosition();
15674
15703
  configureScrollTarget();
15675
15704
  });
15676
- prepareTick();
15677
15705
 
15678
15706
  if (unwatchPosition === void 0) {
15679
15707
  unwatchPosition = vue.watch(
@@ -17892,11 +17920,60 @@
17892
17920
  }
17893
17921
  }
17894
17922
 
17895
- function clone (data) {
17896
- const s = JSON.stringify(data);
17897
- if (s) {
17898
- return JSON.parse(s)
17923
+ // adapted from https://stackoverflow.com/a/40294058
17924
+
17925
+ function cloneDeep (data, hash = new WeakMap()) {
17926
+ if (Object(data) !== data) return data
17927
+ if (hash.has(data)) return hash.get(data)
17928
+
17929
+ const result = data instanceof Date
17930
+ ? new Date(data)
17931
+ : (data instanceof RegExp
17932
+ ? new RegExp(data.source, data.flags)
17933
+ : (data instanceof Set
17934
+ ? new Set()
17935
+ : (data instanceof Map
17936
+ ? new Map()
17937
+ : (typeof data.constructor !== 'function'
17938
+ ? Object.create(null)
17939
+ : (data.prototype !== void 0 && typeof data.prototype.constructor === 'function'
17940
+ ? data
17941
+ : new data.constructor()
17942
+ )
17943
+ )
17944
+ )
17945
+ )
17946
+ );
17947
+
17948
+ if (typeof data.constructor === 'function' && typeof data.valueOf === 'function') {
17949
+ const val = data.valueOf();
17950
+
17951
+ if (Object(val) !== val) {
17952
+ const result = new data.constructor(val);
17953
+
17954
+ hash.set(data, result);
17955
+
17956
+ return result
17957
+ }
17958
+ }
17959
+
17960
+ hash.set(data, result);
17961
+
17962
+ if (data instanceof Set) {
17963
+ data.forEach(val => {
17964
+ result.add(cloneDeep(val, hash));
17965
+ });
17966
+ }
17967
+ else if (data instanceof Map) {
17968
+ data.forEach((val, key) => {
17969
+ result.set(key, cloneDeep(val, hash));
17970
+ });
17899
17971
  }
17972
+
17973
+ return Object.assign(
17974
+ result,
17975
+ ...Object.keys(data).map(key => ({ [ key ]: cloneDeep(data[ key ], hash) }))
17976
+ )
17900
17977
  }
17901
17978
 
17902
17979
  function fallback (text) {
@@ -20025,7 +20102,7 @@
20025
20102
 
20026
20103
  var utils = /*#__PURE__*/Object.freeze({
20027
20104
  __proto__: null,
20028
- clone: clone,
20105
+ clone: cloneDeep,
20029
20106
  colors: colors,
20030
20107
  copyToClipboard: copyToClipboard,
20031
20108
  createMetaMixin: createMetaMixin,
@@ -20513,26 +20590,24 @@
20513
20590
  state.targetUid.value = getTargetUid(val);
20514
20591
  });
20515
20592
 
20516
- let focusFn;
20517
-
20518
- function focus () {
20519
- focusFn !== void 0 && removeFocusFn(focusFn);
20520
- focusFn = addFocusFn(() => {
20521
- focusFn = void 0;
20522
- const el = document.activeElement;
20523
- let target = state.targetRef !== void 0 && state.targetRef.value;
20593
+ function focusHandler () {
20594
+ const el = document.activeElement;
20595
+ let target = state.targetRef !== void 0 && state.targetRef.value;
20524
20596
 
20525
- if (target && (el === null || el.id !== state.targetUid.value)) {
20526
- target.hasAttribute('tabindex') === true || (target = target.querySelector('[tabindex]'));
20527
- if (target && target !== el) {
20528
- target.focus();
20529
- }
20597
+ if (target && (el === null || el.id !== state.targetUid.value)) {
20598
+ target.hasAttribute('tabindex') === true || (target = target.querySelector('[tabindex]'));
20599
+ if (target && target !== el) {
20600
+ target.focus();
20530
20601
  }
20531
- });
20602
+ }
20603
+ }
20604
+
20605
+ function focus () {
20606
+ addFocusFn(focusHandler);
20532
20607
  }
20533
20608
 
20534
20609
  function blur () {
20535
- focusFn !== void 0 && removeFocusFn(focusFn);
20610
+ removeFocusFn(focusHandler);
20536
20611
  const el = document.activeElement;
20537
20612
  if (el !== null && state.rootRef.value.contains(el)) {
20538
20613
  el.blur();
@@ -23814,6 +23889,8 @@
23814
23889
  });
23815
23890
 
23816
23891
  function emitEvent () {
23892
+ clearTimeout(timer);
23893
+ cancelAnimationFrame(timer);
23817
23894
  timer = null;
23818
23895
 
23819
23896
  const top = Math.max(0, getVerticalScrollPosition(localScrollTarget));
@@ -25464,8 +25541,8 @@
25464
25541
 
25465
25542
  function onBeforeShow () {
25466
25543
  validated = false;
25467
- initialValue.value = clone(props.modelValue);
25468
- currentModel.value = clone(props.modelValue);
25544
+ initialValue.value = cloneDeep(props.modelValue);
25545
+ currentModel.value = cloneDeep(props.modelValue);
25469
25546
  emit('before-show');
25470
25547
  }
25471
25548
 
@@ -25971,13 +26048,8 @@
25971
26048
 
25972
26049
  modelValue: {
25973
26050
  type: Object,
25974
- default: () => ({
25975
- min: null,
25976
- max: null
25977
- }),
25978
- validator (val) {
25979
- return 'min' in val && 'max' in val
25980
- }
26051
+ default: () => ({ min: null, max: null }),
26052
+ validator: v => 'min' in v && 'max' in v
25981
26053
  },
25982
26054
 
25983
26055
  dragRange: Boolean,
@@ -26012,13 +26084,24 @@
26012
26084
  const rootRef = vue.ref(null);
26013
26085
  const curMinRatio = vue.ref(0);
26014
26086
  const curMaxRatio = vue.ref(0);
26087
+ const model = vue.ref({ min: 0, max: 0 });
26015
26088
 
26016
- const model = vue.ref({
26017
- min: props.modelValue.min === null ? state.innerMin.value : props.modelValue.min,
26018
- max: props.modelValue.max === null ? state.innerMax.value : props.modelValue.max
26019
- });
26089
+ function normalizeModel () {
26090
+ model.value.min = props.modelValue.min === null
26091
+ ? state.innerMin.value
26092
+ : between(props.modelValue.min, state.innerMin.value, state.innerMax.value);
26020
26093
 
26021
- const nextFocus = vue.ref(null);
26094
+ model.value.max = props.modelValue.max === null
26095
+ ? state.innerMax.value
26096
+ : between(props.modelValue.max, state.innerMin.value, state.innerMax.value);
26097
+ }
26098
+
26099
+ vue.watch(
26100
+ () => `${ props.modelValue.min }|${ props.modelValue.max }|${ state.innerMin.value }|${ state.innerMax.value }`,
26101
+ normalizeModel
26102
+ );
26103
+
26104
+ normalizeModel();
26022
26105
 
26023
26106
  const modelMinRatio = vue.computed(() => methods.convertModelToRatio(model.value.min));
26024
26107
  const modelMaxRatio = vue.computed(() => methods.convertModelToRatio(model.value.max));
@@ -26041,7 +26124,7 @@
26041
26124
  return acc
26042
26125
  });
26043
26126
 
26044
- const events = vue.computed(() => {
26127
+ const trackContainerEvents = vue.computed(() => {
26045
26128
  if (state.editable.value !== true) {
26046
26129
  return {}
26047
26130
  }
@@ -26052,34 +26135,45 @@
26052
26135
 
26053
26136
  const evt = { onMousedown: methods.onActivate };
26054
26137
 
26055
- props.dragOnlyRange === true && Object.assign(evt, {
26056
- onFocus: () => { onFocus('both'); },
26057
- onBlur: methods.onBlur,
26058
- onKeydown,
26059
- onKeyup: methods.onKeyup
26060
- });
26138
+ if (props.dragRange === true || props.dragOnlyRange === true) {
26139
+ Object.assign(evt, {
26140
+ onFocus: () => { state.focus.value = 'both'; },
26141
+ onBlur: methods.onBlur,
26142
+ onKeydown,
26143
+ onKeyup: methods.onKeyup
26144
+ });
26145
+ }
26061
26146
 
26062
26147
  return evt
26063
26148
  });
26064
26149
 
26065
- const minThumbRef = vue.ref(null);
26066
- const minEvents = vue.computed(() => (
26067
- state.editable.value === true && $q.platform.is.mobile !== true && props.dragOnlyRange !== true
26150
+ function getEvents (side) {
26151
+ return $q.platform.is.mobile !== true && state.editable.value === true && props.dragOnlyRange !== true
26068
26152
  ? {
26069
- onFocus: () => { onFocus('min'); },
26153
+ onFocus: () => { state.focus.value = side; },
26070
26154
  onBlur: methods.onBlur,
26071
26155
  onKeydown,
26072
26156
  onKeyup: methods.onKeyup
26073
26157
  }
26074
26158
  : {}
26159
+ }
26160
+
26161
+ const thumbTabindex = vue.computed(() => (props.dragOnlyRange !== true ? state.tabindex.value : null));
26162
+ const trackContainerTabindex = vue.computed(() => (
26163
+ $q.platform.is.mobile !== true && (props.dragRange || props.dragOnlyRange === true)
26164
+ ? state.tabindex.value
26165
+ : null
26075
26166
  ));
26167
+
26168
+ const minThumbRef = vue.ref(null);
26169
+ const minEvents = vue.computed(() => getEvents('min'));
26076
26170
  const getMinThumb = methods.getThumbRenderFn({
26077
26171
  focusValue: 'min',
26078
- nextFocus,
26079
26172
  getNodeData: () => ({
26080
26173
  ref: minThumbRef,
26174
+ key: 'tmin',
26081
26175
  ...minEvents.value,
26082
- tabindex: props.dragOnlyRange !== true ? state.tabindex.value : null
26176
+ tabindex: thumbTabindex.value
26083
26177
  }),
26084
26178
  ratio: ratioMin,
26085
26179
  label: vue.computed(() => (
@@ -26092,22 +26186,13 @@
26092
26186
  labelTextColor: vue.computed(() => props.leftLabelTextColor || props.labelTextColor)
26093
26187
  });
26094
26188
 
26095
- const maxEvents = vue.computed(() => (
26096
- state.editable.value === true && $q.platform.is.mobile !== true && props.dragOnlyRange !== true
26097
- ? {
26098
- onFocus: () => { onFocus('max'); },
26099
- onBlur: methods.onBlur,
26100
- onKeydown,
26101
- onKeyup: methods.onKeyup
26102
- }
26103
- : {}
26104
- ));
26189
+ const maxEvents = vue.computed(() => getEvents('max'));
26105
26190
  const getMaxThumb = methods.getThumbRenderFn({
26106
26191
  focusValue: 'max',
26107
- nextFocus,
26108
26192
  getNodeData: () => ({
26109
26193
  ...maxEvents.value,
26110
- tabindex: props.dragOnlyRange !== true ? state.tabindex.value : null
26194
+ key: 'tmax',
26195
+ tabindex: thumbTabindex.value
26111
26196
  }),
26112
26197
  ratio: ratioMax,
26113
26198
  label: vue.computed(() => (
@@ -26120,19 +26205,6 @@
26120
26205
  labelTextColor: vue.computed(() => props.rightLabelTextColor || props.labelTextColor)
26121
26206
  });
26122
26207
 
26123
- vue.watch(
26124
- () => props.modelValue.min + props.modelValue.max + state.innerMin.value + state.innerMax.value,
26125
- () => {
26126
- model.value.min = props.modelValue.min === null
26127
- ? state.innerMin.value
26128
- : between(props.modelValue.min, state.innerMin.value, state.innerMax.value);
26129
-
26130
- model.value.max = props.modelValue.max === null
26131
- ? state.innerMax.value
26132
- : between(props.modelValue.max, state.innerMin.value, state.innerMax.value);
26133
- }
26134
- );
26135
-
26136
26208
  function updateValue (change) {
26137
26209
  if (model.value.min !== props.modelValue.min || model.value.max !== props.modelValue.max) {
26138
26210
  emit('update:modelValue', { ...model.value });
@@ -26161,15 +26233,14 @@
26161
26233
  ratioMax: modelMaxRatio.value
26162
26234
  };
26163
26235
 
26164
- let type;
26165
26236
  const ratio = methods.getDraggingRatio(event, dragging);
26166
26237
 
26167
26238
  if (props.dragOnlyRange !== true && ratio < dragging.ratioMin + sensitivity) {
26168
- type = dragType.MIN;
26239
+ dragging.type = dragType.MIN;
26169
26240
  }
26170
26241
  else if (props.dragOnlyRange === true || ratio < dragging.ratioMax - sensitivity) {
26171
26242
  if (props.dragRange === true || props.dragOnlyRange === true) {
26172
- type = dragType.RANGE;
26243
+ dragging.type = dragType.RANGE;
26173
26244
  Object.assign(dragging, {
26174
26245
  offsetRatio: ratio,
26175
26246
  offsetModel: methods.convertRatioToModel(ratio),
@@ -26178,18 +26249,15 @@
26178
26249
  });
26179
26250
  }
26180
26251
  else {
26181
- type = dragging.ratioMax - ratio < ratio - dragging.ratioMin
26252
+ dragging.type = dragging.ratioMax - ratio < ratio - dragging.ratioMin
26182
26253
  ? dragType.MAX
26183
26254
  : dragType.MIN;
26184
26255
  }
26185
26256
  }
26186
26257
  else {
26187
- type = dragType.MAX;
26258
+ dragging.type = dragType.MAX;
26188
26259
  }
26189
26260
 
26190
- dragging.type = type;
26191
- nextFocus.value = null;
26192
-
26193
26261
  return dragging
26194
26262
  }
26195
26263
 
@@ -26207,7 +26275,7 @@
26207
26275
  min: localModel,
26208
26276
  max: dragging.valueMax
26209
26277
  };
26210
- nextFocus.value = 'min';
26278
+ state.focus.value = 'min';
26211
26279
  }
26212
26280
  else {
26213
26281
  pos = {
@@ -26216,7 +26284,7 @@
26216
26284
  min: dragging.valueMax,
26217
26285
  max: localModel
26218
26286
  };
26219
- nextFocus.value = 'max';
26287
+ state.focus.value = 'max';
26220
26288
  }
26221
26289
  break
26222
26290
 
@@ -26228,7 +26296,7 @@
26228
26296
  min: dragging.valueMin,
26229
26297
  max: localModel
26230
26298
  };
26231
- nextFocus.value = 'max';
26299
+ state.focus.value = 'max';
26232
26300
  }
26233
26301
  else {
26234
26302
  pos = {
@@ -26237,7 +26305,7 @@
26237
26305
  min: localModel,
26238
26306
  max: dragging.valueMin
26239
26307
  };
26240
- nextFocus.value = 'min';
26308
+ state.focus.value = 'min';
26241
26309
  }
26242
26310
  break
26243
26311
 
@@ -26254,34 +26322,26 @@
26254
26322
  min: parseFloat(min.toFixed(state.decimals.value)),
26255
26323
  max: parseFloat((min + dragging.rangeValue).toFixed(state.decimals.value))
26256
26324
  };
26325
+
26326
+ state.focus.value = 'both';
26257
26327
  break
26258
26328
  }
26259
26329
 
26260
- model.value = {
26261
- min: pos.min,
26262
- max: pos.max
26263
- };
26264
-
26265
26330
  // If either of the values to be emitted are null, set them to the defaults the user has entered.
26266
- if (model.value.min === null || model.value.max === null) {
26267
- model.value.min = pos.min || props.min;
26268
- model.value.max = pos.max || props.max;
26269
- }
26331
+ model.value = model.value.min === null || model.value.max === null
26332
+ ? { min: pos.min || props.min, max: pos.max || props.max }
26333
+ : { min: pos.min, max: pos.max };
26270
26334
 
26271
26335
  if (props.snap !== true || props.step === 0) {
26272
26336
  curMinRatio.value = pos.minR;
26273
26337
  curMaxRatio.value = pos.maxR;
26274
26338
  }
26275
26339
  else {
26276
- curMinRatio.value = state.trackLen.value === 0 ? 0 : (model.value.min - props.min) / state.trackLen.value;
26277
- curMaxRatio.value = state.trackLen.value === 0 ? 0 : (model.value.max - props.min) / state.trackLen.value;
26340
+ curMinRatio.value = methods.convertModelToRatio(model.value.min);
26341
+ curMaxRatio.value = methods.convertModelToRatio(model.value.max);
26278
26342
  }
26279
26343
  }
26280
26344
 
26281
- function onFocus (which) {
26282
- state.focus.value = which;
26283
- }
26284
-
26285
26345
  function onKeydown (evt) {
26286
26346
  if (!keyCodes$2.includes(evt.keyCode)) {
26287
26347
  return
@@ -26290,14 +26350,11 @@
26290
26350
  stopAndPrevent(evt);
26291
26351
 
26292
26352
  const
26293
- stepVal = ([ 34, 33 ].includes(evt.keyCode) ? 10 : 1) * props.step,
26294
- offset = [ 34, 37, 40 ].includes(evt.keyCode) ? -stepVal : stepVal;
26295
-
26296
- if (props.dragOnlyRange) {
26297
- const interval = props.dragOnlyRange
26298
- ? model.value.max - model.value.min
26299
- : 0;
26353
+ stepVal = ([ 34, 33 ].includes(evt.keyCode) ? 10 : 1) * state.step.value,
26354
+ offset = ([ 34, 37, 40 ].includes(evt.keyCode) ? -1 : 1) * (state.isReversed.value === true ? -1 : 1) * stepVal;
26300
26355
 
26356
+ if (state.focus.value === 'both') {
26357
+ const interval = model.value.max - model.value.min;
26301
26358
  const min = between(
26302
26359
  parseFloat((model.value.min + offset).toFixed(state.decimals.value)),
26303
26360
  state.innerMin.value,
@@ -26331,7 +26388,8 @@
26331
26388
  return () => {
26332
26389
  const content = methods.getContent(
26333
26390
  selectionBarStyle,
26334
- events,
26391
+ trackContainerTabindex,
26392
+ trackContainerEvents,
26335
26393
  node => {
26336
26394
  node.push(
26337
26395
  getMinThumb(),
@@ -26348,10 +26406,7 @@
26348
26406
  : ''
26349
26407
  ),
26350
26408
  ...state.attributes.value,
26351
- 'aria-valuenow': props.modelValue.min + '|' + props.modelValue.max,
26352
- tabindex: props.dragOnlyRange === true && $q.platform.is.mobile !== true
26353
- ? state.tabindex.value
26354
- : null
26409
+ 'aria-valuenow': props.modelValue.min + '|' + props.modelValue.max
26355
26410
  }, content)
26356
26411
  }
26357
26412
  }
@@ -26987,6 +27042,7 @@
26987
27042
  style: mainStyle.value
26988
27043
  }, hMergeSlot(slots.default, [
26989
27044
  vue.h(QResizeObserver, {
27045
+ debounce: 0,
26990
27046
  onResize: updateScrollSize
26991
27047
  })
26992
27048
  ])),
@@ -26997,7 +27053,10 @@
26997
27053
  })
26998
27054
  ]),
26999
27055
 
27000
- vue.h(QResizeObserver, { onResize: updateContainer }),
27056
+ vue.h(QResizeObserver, {
27057
+ debounce: 0,
27058
+ onResize: updateContainer
27059
+ }),
27001
27060
 
27002
27061
  vue.h('div', {
27003
27062
  class: scroll.vertical.barClass.value,
@@ -36110,7 +36169,9 @@
36110
36169
  src: {
36111
36170
  type: String,
36112
36171
  required: true
36113
- }
36172
+ },
36173
+
36174
+ title: String
36114
36175
  },
36115
36176
 
36116
36177
  setup (props) {
@@ -36127,6 +36188,7 @@
36127
36188
  }, [
36128
36189
  vue.h('iframe', {
36129
36190
  src: props.src,
36191
+ title: props.title,
36130
36192
  frameborder: '0',
36131
36193
  allowfullscreen: true
36132
36194
  })
@@ -39127,7 +39189,7 @@
39127
39189
  });
39128
39190
 
39129
39191
  var index_umd = {
39130
- version: '2.4.2',
39192
+ version: '2.4.3',
39131
39193
  install (app, opts) {
39132
39194
  installQuasar(app, {
39133
39195
  components,