quasar 2.4.0 → 2.4.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 (167) hide show
  1. package/dist/api/BottomSheet.json +6 -2
  2. package/dist/api/Notify.json +25 -25
  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/QCarouselSlide.json +2 -2
  10. package/dist/api/QChatMessage.json +1 -1
  11. package/dist/api/QChip.json +4 -4
  12. package/dist/api/QExpansionItem.json +3 -3
  13. package/dist/api/QFab.json +2 -2
  14. package/dist/api/QFabAction.json +1 -1
  15. package/dist/api/QImg.json +2 -2
  16. package/dist/api/QLinearProgress.json +1 -1
  17. package/dist/api/QPagination.json +4 -4
  18. package/dist/api/QParallax.json +1 -1
  19. package/dist/api/QPullToRefresh.json +1 -1
  20. package/dist/api/QRating.json +3 -3
  21. package/dist/api/QRouteTab.json +1 -1
  22. package/dist/api/QSelect.json +2 -2
  23. package/dist/api/QStep.json +4 -4
  24. package/dist/api/QStepper.json +4 -4
  25. package/dist/api/QTab.json +1 -1
  26. package/dist/api/QTable.json +4 -4
  27. package/dist/api/QTimelineEntry.json +2 -2
  28. package/dist/api/QToggle.json +1 -1
  29. package/dist/api/QTree.json +1 -1
  30. package/dist/api/QVideo.json +11 -1
  31. package/dist/icon-set/bootstrap-icons.umd.prod.js +1 -1
  32. package/dist/icon-set/eva-icons.umd.prod.js +1 -1
  33. package/dist/icon-set/fontawesome-v5-pro.umd.prod.js +1 -1
  34. package/dist/icon-set/fontawesome-v5.umd.prod.js +1 -1
  35. package/dist/icon-set/ionicons-v4.umd.prod.js +1 -1
  36. package/dist/icon-set/line-awesome.umd.prod.js +1 -1
  37. package/dist/icon-set/material-icons-outlined.umd.prod.js +1 -1
  38. package/dist/icon-set/material-icons-round.umd.prod.js +1 -1
  39. package/dist/icon-set/material-icons-sharp.umd.prod.js +1 -1
  40. package/dist/icon-set/material-icons.umd.prod.js +1 -1
  41. package/dist/icon-set/mdi-v3.umd.prod.js +1 -1
  42. package/dist/icon-set/mdi-v4.umd.prod.js +1 -1
  43. package/dist/icon-set/mdi-v5.umd.prod.js +1 -1
  44. package/dist/icon-set/mdi-v6.umd.prod.js +1 -1
  45. package/dist/icon-set/svg-bootstrap-icons.umd.prod.js +1 -1
  46. package/dist/icon-set/svg-eva-icons.umd.prod.js +1 -1
  47. package/dist/icon-set/svg-fontawesome-v5.umd.prod.js +1 -1
  48. package/dist/icon-set/svg-ionicons-v4.umd.prod.js +1 -1
  49. package/dist/icon-set/svg-ionicons-v5.umd.prod.js +1 -1
  50. package/dist/icon-set/svg-ionicons-v6.umd.prod.js +1 -1
  51. package/dist/icon-set/svg-line-awesome.umd.prod.js +1 -1
  52. package/dist/icon-set/svg-material-icons-outlined.umd.prod.js +1 -1
  53. package/dist/icon-set/svg-material-icons-round.umd.prod.js +1 -1
  54. package/dist/icon-set/svg-material-icons-sharp.umd.prod.js +1 -1
  55. package/dist/icon-set/svg-material-icons.umd.prod.js +1 -1
  56. package/dist/icon-set/svg-mdi-v4.umd.prod.js +1 -1
  57. package/dist/icon-set/svg-mdi-v5.umd.prod.js +1 -1
  58. package/dist/icon-set/svg-mdi-v6.umd.prod.js +1 -1
  59. package/dist/icon-set/svg-themify.umd.prod.js +1 -1
  60. package/dist/icon-set/themify.umd.prod.js +1 -1
  61. package/dist/lang/ar.umd.prod.js +1 -1
  62. package/dist/lang/az-Latn.umd.prod.js +1 -1
  63. package/dist/lang/bg.umd.prod.js +1 -1
  64. package/dist/lang/bn.umd.prod.js +1 -1
  65. package/dist/lang/ca.umd.prod.js +1 -1
  66. package/dist/lang/cs.umd.prod.js +1 -1
  67. package/dist/lang/da.umd.prod.js +1 -1
  68. package/dist/lang/de.umd.prod.js +1 -1
  69. package/dist/lang/el.umd.prod.js +1 -1
  70. package/dist/lang/en-GB.umd.prod.js +1 -1
  71. package/dist/lang/en-US.umd.prod.js +1 -1
  72. package/dist/lang/eo.umd.prod.js +1 -1
  73. package/dist/lang/es.umd.prod.js +1 -1
  74. package/dist/lang/et.umd.prod.js +1 -1
  75. package/dist/lang/fa-IR.umd.prod.js +1 -1
  76. package/dist/lang/fa.umd.prod.js +1 -1
  77. package/dist/lang/fi.umd.prod.js +1 -1
  78. package/dist/lang/fr.umd.prod.js +1 -1
  79. package/dist/lang/gn.umd.prod.js +1 -1
  80. package/dist/lang/he.umd.prod.js +1 -1
  81. package/dist/lang/hr.umd.prod.js +1 -1
  82. package/dist/lang/hu.umd.prod.js +1 -1
  83. package/dist/lang/id.umd.prod.js +1 -1
  84. package/dist/lang/is.umd.prod.js +1 -1
  85. package/dist/lang/it.umd.prod.js +1 -1
  86. package/dist/lang/ja.umd.prod.js +1 -1
  87. package/dist/lang/km.umd.prod.js +1 -1
  88. package/dist/lang/ko-KR.umd.prod.js +1 -1
  89. package/dist/lang/kur-CKB.umd.prod.js +1 -1
  90. package/dist/lang/lt.umd.prod.js +1 -1
  91. package/dist/lang/lu.umd.prod.js +1 -1
  92. package/dist/lang/lv.umd.prod.js +1 -1
  93. package/dist/lang/ml.umd.prod.js +1 -1
  94. package/dist/lang/ms.umd.prod.js +1 -1
  95. package/dist/lang/nb-NO.umd.prod.js +1 -1
  96. package/dist/lang/nl.umd.prod.js +1 -1
  97. package/dist/lang/pl.umd.prod.js +1 -1
  98. package/dist/lang/pt-BR.umd.prod.js +1 -1
  99. package/dist/lang/pt.umd.prod.js +1 -1
  100. package/dist/lang/ro.umd.prod.js +1 -1
  101. package/dist/lang/ru.umd.prod.js +1 -1
  102. package/dist/lang/sk.umd.prod.js +1 -1
  103. package/dist/lang/sl.umd.prod.js +1 -1
  104. package/dist/lang/sr-CYR.umd.prod.js +1 -1
  105. package/dist/lang/sr.umd.prod.js +1 -1
  106. package/dist/lang/sv.umd.prod.js +1 -1
  107. package/dist/lang/ta.umd.prod.js +1 -1
  108. package/dist/lang/th.umd.prod.js +1 -1
  109. package/dist/lang/tr.umd.prod.js +1 -1
  110. package/dist/lang/ug.umd.prod.js +1 -1
  111. package/dist/lang/uk.umd.prod.js +1 -1
  112. package/dist/lang/vi.umd.prod.js +1 -1
  113. package/dist/lang/zh-CN.umd.prod.js +1 -1
  114. package/dist/lang/zh-TW.umd.prod.js +1 -1
  115. package/dist/quasar.cjs.prod.js +2 -2
  116. package/dist/quasar.css +15 -14
  117. package/dist/quasar.esm.prod.js +2 -2
  118. package/dist/quasar.prod.css +1 -1
  119. package/dist/quasar.rtl.css +15 -14
  120. package/dist/quasar.rtl.prod.css +1 -1
  121. package/dist/quasar.sass +11 -13
  122. package/dist/quasar.umd.js +279 -209
  123. package/dist/quasar.umd.prod.js +2 -2
  124. package/dist/ssr-directives/Morph.js +1 -1
  125. package/dist/types/api/slider.d.ts +6 -6
  126. package/dist/types/index.d.ts +20 -8
  127. package/dist/types/utils/date.d.ts +2 -1
  128. package/dist/vetur/quasar-attributes.json +5 -1
  129. package/dist/vetur/quasar-tags.json +2 -1
  130. package/dist/web-types/web-types.json +66 -57
  131. package/package.json +1 -1
  132. package/src/api.extends.json +1 -1
  133. package/src/components/btn/use-btn.js +5 -2
  134. package/src/components/btn-toggle/QBtnToggle.js +2 -0
  135. package/src/components/carousel/QCarouselSlide.json +2 -2
  136. package/src/components/chat/QChatMessage.json +1 -1
  137. package/src/components/dialog/QDialog.js +7 -5
  138. package/src/components/img/QImg.json +2 -2
  139. package/src/components/linear-progress/QLinearProgress.json +1 -1
  140. package/src/components/menu/QMenu.js +6 -2
  141. package/src/components/parallax/QParallax.json +1 -1
  142. package/src/components/range/QRange.js +67 -89
  143. package/src/components/rating/QRating.json +3 -3
  144. package/src/components/resize-observer/QResizeObserver.js +11 -10
  145. package/src/components/scroll-area/QScrollArea.js +5 -1
  146. package/src/components/scroll-area/QScrollArea.sass +1 -0
  147. package/src/components/scroll-observer/QScrollObserver.js +2 -0
  148. package/src/components/select/QSelect.js +4 -1
  149. package/src/components/select/QSelect.json +1 -1
  150. package/src/components/slider/QSlider.js +20 -10
  151. package/src/components/slider/QSlider.sass +5 -6
  152. package/src/components/slider/use-slider.js +19 -16
  153. package/src/components/tabs/QTabs.js +27 -11
  154. package/src/components/timeline/QTimeline.sass +1 -2
  155. package/src/components/timeline/QTimelineEntry.json +1 -1
  156. package/src/components/tooltip/QTooltip.js +1 -2
  157. package/src/components/video/QVideo.js +4 -1
  158. package/src/components/video/QVideo.json +12 -1
  159. package/src/composables/private/use-field.js +13 -15
  160. package/src/composables/private/use-model-toggle.js +1 -1
  161. package/src/composables/private/use-portal.js +9 -7
  162. package/src/composables/private/use-tick.js +7 -14
  163. package/src/css/variables.sass +4 -6
  164. package/src/plugins/BottomSheet.json +7 -1
  165. package/src/plugins/Notify.json +22 -22
  166. package/src/utils/clone.js +53 -4
  167. package/src/utils/private/focus-manager.js +8 -10
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Quasar Framework v2.4.0
2
+ * Quasar Framework v2.4.4
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.0' };
1450
+ const $q = { version: '2.4.4' };
1451
1451
 
1452
1452
  if (globalConfigIsFrozen === false) {
1453
1453
  if (opts.config !== void 0) {
@@ -3048,7 +3048,7 @@
3048
3048
  xl: 24
3049
3049
  };
3050
3050
 
3051
- const formTypes = [ 'submit', 'reset' ];
3051
+ const formTypes = [ 'button', 'submit', 'reset' ];
3052
3052
  const mediaTypeRE = /[^\s]\/[^\s]/;
3053
3053
 
3054
3054
  const useBtnProps = {
@@ -3156,7 +3156,10 @@
3156
3156
  }
3157
3157
 
3158
3158
  if (linkTag.value === 'a') {
3159
- if (acc.href === void 0) {
3159
+ if (props.disable === true) {
3160
+ acc[ 'aria-disabled' ] = 'true';
3161
+ }
3162
+ else if (acc.href === void 0) {
3160
3163
  acc.role = 'button';
3161
3164
  }
3162
3165
  if (hasRouterLink.value !== true && mediaTypeRE.test(props.type) === true) {
@@ -3896,7 +3899,7 @@
3896
3899
  'before-show', 'show', 'before-hide', 'hide'
3897
3900
  ];
3898
3901
 
3899
- // handleShow/handleHide -> removeTick(), self (& emit show), prepareTick()
3902
+ // handleShow/handleHide -> removeTick(), self (& emit show)
3900
3903
 
3901
3904
  function useModelToggle ({
3902
3905
  showing,
@@ -4036,17 +4039,19 @@
4036
4039
  }
4037
4040
 
4038
4041
  let queue = [];
4039
- const waitFlags = [];
4042
+ let waitFlags = [];
4043
+
4044
+ function clearFlag (flag) {
4045
+ waitFlags = waitFlags.filter(entry => entry !== flag);
4046
+ }
4040
4047
 
4041
4048
  function addFocusWaitFlag (flag) {
4049
+ clearFlag(flag);
4042
4050
  waitFlags.push(flag);
4043
4051
  }
4044
4052
 
4045
4053
  function removeFocusWaitFlag (flag) {
4046
- const index = waitFlags.indexOf(flag);
4047
- if (index !== -1) {
4048
- waitFlags.splice(index, 1);
4049
- }
4054
+ clearFlag(flag);
4050
4055
 
4051
4056
  if (waitFlags.length === 0 && queue.length > 0) {
4052
4057
  // only call last focus handler (can't focus multiple things at once)
@@ -4061,15 +4066,11 @@
4061
4066
  }
4062
4067
  else {
4063
4068
  queue.push(fn);
4064
- return fn
4065
4069
  }
4066
4070
  }
4067
4071
 
4068
4072
  function removeFocusFn (fn) {
4069
- const index = queue.indexOf(fn);
4070
- if (index !== -1) {
4071
- queue.splice(index, 1);
4072
- }
4073
+ queue = queue.filter(entry => entry !== fn);
4073
4074
  }
4074
4075
 
4075
4076
  const globalNodes = [];
@@ -4200,16 +4201,18 @@
4200
4201
  return
4201
4202
  }
4202
4203
 
4203
- if (onGlobalDialog === false && portalEl === null) {
4204
- portalEl = createGlobalNode();
4205
- }
4204
+ if (portalIsActive.value === false) {
4205
+ if (onGlobalDialog === false && portalEl === null) {
4206
+ portalEl = createGlobalNode();
4207
+ }
4206
4208
 
4207
- portalIsActive.value = true;
4209
+ portalIsActive.value = true;
4208
4210
 
4209
- // register portal
4210
- portalList.push(vm.proxy);
4211
+ // register portal
4212
+ portalList.push(vm.proxy);
4211
4213
 
4212
- addFocusWaitFlag(focusObj);
4214
+ addFocusWaitFlag(focusObj);
4215
+ }
4213
4216
  }
4214
4217
 
4215
4218
  function hidePortal () {
@@ -4289,8 +4292,6 @@
4289
4292
  * Usage:
4290
4293
  * registerTick(fn)
4291
4294
  * registerTick(fn)
4292
- * ....
4293
- * prepareTick()
4294
4295
  */
4295
4296
 
4296
4297
  function useTick () {
@@ -4303,22 +4304,17 @@
4303
4304
  return {
4304
4305
  registerTick (fn) {
4305
4306
  tickFn = fn;
4307
+
4308
+ vue.nextTick(() => {
4309
+ if (tickFn === fn) {
4310
+ tickFn();
4311
+ tickFn = void 0;
4312
+ }
4313
+ });
4306
4314
  },
4307
4315
 
4308
4316
  removeTick () {
4309
4317
  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
4318
  }
4323
4319
  }
4324
4320
  }
@@ -5013,7 +5009,7 @@
5013
5009
  );
5014
5010
 
5015
5011
  const isDark = useDark(props, $q);
5016
- const { registerTick, removeTick, prepareTick } = useTick();
5012
+ const { registerTick, removeTick } = useTick();
5017
5013
  const { registerTimeout, removeTimeout } = useTimeout();
5018
5014
  const { transition, transitionStyle } = useTransition(props, showing);
5019
5015
  const { localScrollTarget, changeScrollEvent, unconfigureScrollTarget } = useScrollTarget(props, configureScrollTarget);
@@ -5140,7 +5136,6 @@
5140
5136
  updatePosition();
5141
5137
  props.noFocus !== true && focus();
5142
5138
  });
5143
- prepareTick();
5144
5139
 
5145
5140
  registerTimeout(() => {
5146
5141
  // required in order to avoid the "double-tap needed" issue
@@ -5173,6 +5168,7 @@
5173
5168
  )
5174
5169
  ) {
5175
5170
  refocusTarget.focus();
5171
+ refocusTarget = null;
5176
5172
  }
5177
5173
 
5178
5174
  registerTimeout(() => {
@@ -5195,6 +5191,10 @@
5195
5191
  removeClickOutside(clickOutsideProps);
5196
5192
  removeEscapeKey(onEscapeKey);
5197
5193
  }
5194
+
5195
+ if (hiding !== true) {
5196
+ refocusTarget = null;
5197
+ }
5198
5198
  }
5199
5199
 
5200
5200
  function configureScrollTarget () {
@@ -5598,6 +5598,8 @@
5598
5598
  key: i,
5599
5599
  onClick (e) { set(value, item, e); },
5600
5600
 
5601
+ 'aria-pressed': value === props.modelValue ? 'true' : 'false',
5602
+
5601
5603
  ...attrs,
5602
5604
  ...opt,
5603
5605
 
@@ -8278,7 +8280,7 @@
8278
8280
  const positionProp = vue.computed(() => (
8279
8281
  props.vertical === true
8280
8282
  ? (isReversed.value === true ? 'bottom' : 'top')
8281
- : isReversed.value === true ? 'right' : 'left'
8283
+ : (isReversed.value === true ? 'right' : 'left')
8282
8284
  ));
8283
8285
 
8284
8286
  const sizeProp = vue.computed(() => (props.vertical === true ? 'height' : 'width'));
@@ -8288,8 +8290,8 @@
8288
8290
  const attributes = vue.computed(() => {
8289
8291
  const acc = {
8290
8292
  role: 'slider',
8291
- 'aria-valuemin': props.min,
8292
- 'aria-valuemax': props.max,
8293
+ 'aria-valuemin': innerMin.value,
8294
+ 'aria-valuemax': innerMax.value,
8293
8295
  'aria-orientation': orientation.value,
8294
8296
  'data-step': props.step
8295
8297
  };
@@ -8480,15 +8482,19 @@
8480
8482
  })
8481
8483
  }
8482
8484
 
8485
+ const filterFn = ({ value }) => value >= props.min && value <= props.max;
8486
+
8483
8487
  if (Array.isArray(def) === true) {
8484
- return def.map(item => (Object(item) === item ? item : { value: item }))
8488
+ return def
8489
+ .map(item => (Object(item) === item ? item : { value: item }))
8490
+ .filter(filterFn)
8485
8491
  }
8486
8492
 
8487
8493
  return Object.keys(def).map(key => {
8488
8494
  const item = def[ key ];
8489
8495
  const value = Number(key);
8490
8496
  return Object(item) === item ? { ...item, value } : { value, label: item }
8491
- })
8497
+ }).filter(filterFn)
8492
8498
  }
8493
8499
 
8494
8500
  function getMarkerLabelStyle (val) {
@@ -8543,6 +8549,7 @@
8543
8549
  emit('pan', 'end');
8544
8550
  }
8545
8551
  active.value = false;
8552
+ focus.value = false;
8546
8553
  }
8547
8554
  else if (event.isFirst === true) {
8548
8555
  dragging.value = getDragging(event.evt);
@@ -8603,7 +8610,7 @@
8603
8610
 
8604
8611
  function getThumbRenderFn (thumb) {
8605
8612
  const focusClass = vue.computed(() => (
8606
- preventFocus.value === false && focus.value === thumb.focusValue
8613
+ preventFocus.value === false && (focus.value === thumb.focusValue || focus.value === 'both')
8607
8614
  ? ' q-slider--focus'
8608
8615
  : ''
8609
8616
  ));
@@ -8618,9 +8625,7 @@
8618
8625
  width: props.thumbSize,
8619
8626
  height: props.thumbSize,
8620
8627
  [ positionProp.value ]: `${ 100 * thumb.ratio.value }%`,
8621
- 'z-index': thumb.nextFocus !== void 0
8622
- ? thumb.nextFocus.value === 'min' ? 2 : void 0
8623
- : void 0
8628
+ zIndex: focus.value === thumb.focusValue ? 2 : void 0
8624
8629
  }));
8625
8630
 
8626
8631
  const pinColor = vue.computed(() => (
@@ -8676,12 +8681,12 @@
8676
8681
  return vue.h('div', {
8677
8682
  class: classes.value,
8678
8683
  style: style.value,
8679
- ...(thumb.getNodeData !== void 0 ? thumb.getNodeData() : {})
8684
+ ...thumb.getNodeData()
8680
8685
  }, thumbContent)
8681
8686
  }
8682
8687
  }
8683
8688
 
8684
- function getContent (selectionBarStyle, events, injectThumb) {
8689
+ function getContent (selectionBarStyle, trackContainerTabindex, trackContainerEvents, injectThumb) {
8685
8690
  const trackContent = [];
8686
8691
 
8687
8692
  props.innerTrackColor !== 'transparent' && trackContent.push(
@@ -8716,15 +8721,14 @@
8716
8721
  {
8717
8722
  key: 'trackC',
8718
8723
  class: trackContainerClass.value,
8719
- tabindex: tabindex.value,
8720
- ...events.value
8724
+ tabindex: trackContainerTabindex.value,
8725
+ ...trackContainerEvents.value
8721
8726
  },
8722
8727
  [
8723
8728
  vue.h('div', {
8724
8729
  class: trackClass.value,
8725
8730
  style: trackStyle.value
8726
- },
8727
- trackContent)
8731
+ }, trackContent)
8728
8732
  ],
8729
8733
  'slide',
8730
8734
  editable.value, () => panDirective.value
@@ -8771,7 +8775,8 @@
8771
8775
  innerMax,
8772
8776
  innerMaxRatio,
8773
8777
  positionProp,
8774
- sizeProp
8778
+ sizeProp,
8779
+ isReversed
8775
8780
  },
8776
8781
 
8777
8782
  methods: {
@@ -8788,6 +8793,8 @@
8788
8793
  }
8789
8794
  }
8790
8795
 
8796
+ const getNodeData = () => ({});
8797
+
8791
8798
  var QSlider = createComponent({
8792
8799
  name: 'QSlider',
8793
8800
 
@@ -8815,8 +8822,20 @@
8815
8822
 
8816
8823
  const rootRef = vue.ref(null);
8817
8824
  const curRatio = vue.ref(0);
8825
+ const model = vue.ref(0);
8826
+
8827
+ function normalizeModel () {
8828
+ model.value = props.modelValue === null
8829
+ ? state.innerMin.value
8830
+ : between(props.modelValue, state.innerMin.value, state.innerMax.value);
8831
+ }
8818
8832
 
8819
- const model = vue.ref(props.modelValue === null ? state.innerMin.value : props.modelValue);
8833
+ vue.watch(
8834
+ () => `${ props.modelValue }|${ state.innerMin.value }|${ state.innerMax.value }`,
8835
+ normalizeModel
8836
+ );
8837
+
8838
+ normalizeModel();
8820
8839
 
8821
8840
  const modelRatio = vue.computed(() => methods.convertModelToRatio(model.value));
8822
8841
  const ratio = vue.computed(() => (state.active.value === true ? curRatio.value : modelRatio.value));
@@ -8834,6 +8853,7 @@
8834
8853
 
8835
8854
  const getThumb = methods.getThumbRenderFn({
8836
8855
  focusValue: true,
8856
+ getNodeData,
8837
8857
  ratio,
8838
8858
  label: vue.computed(() => (
8839
8859
  props.labelValue !== void 0
@@ -8845,7 +8865,7 @@
8845
8865
  labelTextColor: vue.computed(() => props.labelTextColor)
8846
8866
  });
8847
8867
 
8848
- const events = vue.computed(() => {
8868
+ const trackContainerEvents = vue.computed(() => {
8849
8869
  if (state.editable.value !== true) {
8850
8870
  return {}
8851
8871
  }
@@ -8861,12 +8881,6 @@
8861
8881
  }
8862
8882
  });
8863
8883
 
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
8884
  function updateValue (change) {
8871
8885
  if (model.value !== props.modelValue) {
8872
8886
  emit('update:modelValue', model.value);
@@ -8901,7 +8915,7 @@
8901
8915
 
8902
8916
  const
8903
8917
  stepVal = ([ 34, 33 ].includes(evt.keyCode) ? 10 : 1) * state.step.value,
8904
- offset = [ 34, 37, 40 ].includes(evt.keyCode) ? -stepVal : stepVal;
8918
+ offset = ([ 34, 37, 40 ].includes(evt.keyCode) ? -1 : 1) * (state.isReversed.value === true ? -1 : 1) * stepVal;
8905
8919
 
8906
8920
  model.value = between(
8907
8921
  parseFloat((model.value + offset).toFixed(state.decimals.value)),
@@ -8915,7 +8929,8 @@
8915
8929
  return () => {
8916
8930
  const content = methods.getContent(
8917
8931
  selectionBarStyle,
8918
- events,
8932
+ state.tabindex,
8933
+ trackContainerEvents,
8919
8934
  node => { node.push(getThumb()); }
8920
8935
  );
8921
8936
 
@@ -8963,19 +8978,20 @@
8963
8978
 
8964
8979
  setup (props, { emit }) {
8965
8980
 
8966
- let timer, targetEl, size = { width: -1, height: -1 };
8981
+ let timer = null, targetEl, size = { width: -1, height: -1 };
8967
8982
 
8968
- function trigger (now) {
8969
- if (now === true || props.debounce === 0 || props.debounce === '0') {
8970
- onResize();
8983
+ function trigger (immediately) {
8984
+ if (immediately === true || props.debounce === 0 || props.debounce === '0') {
8985
+ emitEvent();
8971
8986
  }
8972
- else if (!timer) {
8973
- timer = setTimeout(onResize, props.debounce);
8987
+ else if (timer === null) {
8988
+ timer = setTimeout(emitEvent, props.debounce);
8974
8989
  }
8975
8990
  }
8976
8991
 
8977
- function onResize () {
8978
- timer = void 0;
8992
+ function emitEvent () {
8993
+ clearTimeout(timer);
8994
+ timer = null;
8979
8995
 
8980
8996
  if (targetEl) {
8981
8997
  const { offsetWidth: width, offsetHeight: height } = targetEl;
@@ -9002,7 +9018,7 @@
9002
9018
  if (targetEl) {
9003
9019
  observer = new ResizeObserver(trigger);
9004
9020
  observer.observe(targetEl);
9005
- onResize();
9021
+ emitEvent();
9006
9022
  }
9007
9023
  });
9008
9024
  });
@@ -9045,7 +9061,7 @@
9045
9061
  if (targetEl && targetEl.contentDocument) {
9046
9062
  curDocView = targetEl.contentDocument.defaultView;
9047
9063
  curDocView.addEventListener('resize', trigger, listenOpts.passive);
9048
- onResize();
9064
+ emitEvent();
9049
9065
  }
9050
9066
  }
9051
9067
 
@@ -9156,7 +9172,8 @@
9156
9172
  const vm = vue.getCurrentInstance();
9157
9173
  const { proxy: { $q } } = vm;
9158
9174
 
9159
- const { registerTick, prepareTick } = useTick();
9175
+ const { registerTick: registerScrollTick } = useTick();
9176
+ const { registerTimeout: registerFocusTimeout, removeTimeout: removeFocusTimeout } = useTimeout();
9160
9177
  const { registerTimeout } = useTimeout();
9161
9178
 
9162
9179
  const rootRef = vue.ref(null);
@@ -9264,7 +9281,7 @@
9264
9281
  }
9265
9282
 
9266
9283
  function recalculateScroll () {
9267
- registerTick(() => {
9284
+ registerScrollTick(() => {
9268
9285
  if (vm.isDeactivated !== true && vm.isUnmounted !== true) {
9269
9286
  updateContainer({
9270
9287
  width: rootRef.value.offsetWidth,
@@ -9272,8 +9289,6 @@
9272
9289
  });
9273
9290
  }
9274
9291
  });
9275
-
9276
- prepareTick();
9277
9292
  }
9278
9293
 
9279
9294
  function updateContainer (domSize) {
@@ -9432,11 +9447,8 @@
9432
9447
  return true
9433
9448
  }
9434
9449
 
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 */);
9450
+ const dirPrev = keyCode === (props.vertical === true ? 38 /* ArrowUp */ : 37 /* ArrowLeft */);
9451
+ const dirNext = keyCode === (props.vertical === true ? 40 /* ArrowDown */ : 39 /* ArrowRight */);
9440
9452
 
9441
9453
  const dir = dirPrev === true ? -1 : (dirNext === true ? 1 : void 0);
9442
9454
 
@@ -9570,8 +9582,28 @@
9570
9582
  }
9571
9583
  }
9572
9584
 
9573
- function onFocusin () { hasFocus.value = true; }
9574
- function onFocusout () { hasFocus.value = false; }
9585
+ function onFocusin (e) {
9586
+ removeFocusTimeout();
9587
+
9588
+ if (
9589
+ hasFocus.value !== true
9590
+ && rootRef.value !== null
9591
+ && e.target
9592
+ && typeof e.target.closest === 'function'
9593
+ ) {
9594
+ const tab = e.target.closest('.q-tab');
9595
+
9596
+ // if the target is contained by a QTab/QRouteTab
9597
+ // (it might be other elements focused, like additional QBtn)
9598
+ if (tab && rootRef.value.contains(tab) === true) {
9599
+ hasFocus.value = true;
9600
+ }
9601
+ }
9602
+ }
9603
+
9604
+ function onFocusout () {
9605
+ registerFocusTimeout(() => { hasFocus.value = false; }, 30);
9606
+ }
9575
9607
 
9576
9608
  function verifyRouteModel () {
9577
9609
  if ($tabs.avoidRouteWatcher !== true) {
@@ -12381,7 +12413,7 @@
12381
12413
  )
12382
12414
  }
12383
12415
 
12384
- function clone$1 (date) {
12416
+ function clone (date) {
12385
12417
  return isDate(date) === true
12386
12418
  ? new Date(date.getTime())
12387
12419
  : date
@@ -12408,7 +12440,7 @@
12408
12440
  isSameDate,
12409
12441
  daysInMonth,
12410
12442
  formatDate,
12411
- clone: clone$1
12443
+ clone
12412
12444
  };
12413
12445
 
12414
12446
  const yearsInterval = 20;
@@ -14170,7 +14202,7 @@
14170
14202
 
14171
14203
  const { preventBodyScroll } = usePreventScroll();
14172
14204
  const { registerTimeout, removeTimeout } = useTimeout();
14173
- const { registerTick, removeTick, prepareTick } = useTick();
14205
+ const { registerTick, removeTick } = useTick();
14174
14206
 
14175
14207
  const { showPortal, hidePortal, portalIsActive, renderPortal } = usePortal(
14176
14208
  vm, innerRef, renderPortalContent, /* pls do check if on a global dialog */ true
@@ -14269,7 +14301,6 @@
14269
14301
  if (props.noFocus !== true) {
14270
14302
  document.activeElement !== null && document.activeElement.blur();
14271
14303
  registerTick(focus);
14272
- prepareTick();
14273
14304
  }
14274
14305
 
14275
14306
  registerTimeout(() => {
@@ -14315,6 +14346,7 @@
14315
14346
 
14316
14347
  if (refocusTarget !== null) {
14317
14348
  refocusTarget.focus();
14349
+ refocusTarget = null;
14318
14350
  }
14319
14351
 
14320
14352
  registerTimeout(() => {
@@ -14382,6 +14414,10 @@
14382
14414
  removeEscapeKey(onEscapeKey);
14383
14415
  }
14384
14416
  }
14417
+
14418
+ if (hiding !== true) {
14419
+ refocusTarget = null;
14420
+ }
14385
14421
  }
14386
14422
 
14387
14423
  function updateMaximized (active) {
@@ -14440,9 +14476,7 @@
14440
14476
  }
14441
14477
  });
14442
14478
 
14443
- vue.onBeforeUnmount(() => {
14444
- cleanup();
14445
- });
14479
+ vue.onBeforeUnmount(cleanup);
14446
14480
 
14447
14481
  function renderPortalContent () {
14448
14482
  return vue.h('div', {
@@ -15607,7 +15641,7 @@
15607
15641
  const selfOrigin = vue.computed(() => parsePosition(props.self, $q.lang.rtl));
15608
15642
  const hideOnRouteChange = vue.computed(() => props.persistent !== true);
15609
15643
 
15610
- const { registerTick, removeTick, prepareTick } = useTick();
15644
+ const { registerTick, removeTick } = useTick();
15611
15645
  const { registerTimeout, removeTimeout } = useTimeout();
15612
15646
  const { transition, transitionStyle } = useTransition(props, showing);
15613
15647
  const { localScrollTarget, changeScrollEvent, unconfigureScrollTarget } = useScrollTarget(props, configureScrollTarget);
@@ -15673,7 +15707,6 @@
15673
15707
  updatePosition();
15674
15708
  configureScrollTarget();
15675
15709
  });
15676
- prepareTick();
15677
15710
 
15678
15711
  if (unwatchPosition === void 0) {
15679
15712
  unwatchPosition = vue.watch(
@@ -17892,11 +17925,60 @@
17892
17925
  }
17893
17926
  }
17894
17927
 
17895
- function clone (data) {
17896
- const s = JSON.stringify(data);
17897
- if (s) {
17898
- return JSON.parse(s)
17928
+ // adapted from https://stackoverflow.com/a/40294058
17929
+
17930
+ function cloneDeep (data, hash = new WeakMap()) {
17931
+ if (Object(data) !== data) return data
17932
+ if (hash.has(data)) return hash.get(data)
17933
+
17934
+ const result = data instanceof Date
17935
+ ? new Date(data)
17936
+ : (data instanceof RegExp
17937
+ ? new RegExp(data.source, data.flags)
17938
+ : (data instanceof Set
17939
+ ? new Set()
17940
+ : (data instanceof Map
17941
+ ? new Map()
17942
+ : (typeof data.constructor !== 'function'
17943
+ ? Object.create(null)
17944
+ : (data.prototype !== void 0 && typeof data.prototype.constructor === 'function'
17945
+ ? data
17946
+ : new data.constructor()
17947
+ )
17948
+ )
17949
+ )
17950
+ )
17951
+ );
17952
+
17953
+ if (typeof data.constructor === 'function' && typeof data.valueOf === 'function') {
17954
+ const val = data.valueOf();
17955
+
17956
+ if (Object(val) !== val) {
17957
+ const result = new data.constructor(val);
17958
+
17959
+ hash.set(data, result);
17960
+
17961
+ return result
17962
+ }
17963
+ }
17964
+
17965
+ hash.set(data, result);
17966
+
17967
+ if (data instanceof Set) {
17968
+ data.forEach(val => {
17969
+ result.add(cloneDeep(val, hash));
17970
+ });
17971
+ }
17972
+ else if (data instanceof Map) {
17973
+ data.forEach((val, key) => {
17974
+ result.set(key, cloneDeep(val, hash));
17975
+ });
17899
17976
  }
17977
+
17978
+ return Object.assign(
17979
+ result,
17980
+ ...Object.keys(data).map(key => ({ [ key ]: cloneDeep(data[ key ], hash) }))
17981
+ )
17900
17982
  }
17901
17983
 
17902
17984
  function fallback (text) {
@@ -20025,7 +20107,7 @@
20025
20107
 
20026
20108
  var utils = /*#__PURE__*/Object.freeze({
20027
20109
  __proto__: null,
20028
- clone: clone,
20110
+ clone: cloneDeep,
20029
20111
  colors: colors,
20030
20112
  copyToClipboard: copyToClipboard,
20031
20113
  createMetaMixin: createMetaMixin,
@@ -20513,26 +20595,24 @@
20513
20595
  state.targetUid.value = getTargetUid(val);
20514
20596
  });
20515
20597
 
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;
20598
+ function focusHandler () {
20599
+ const el = document.activeElement;
20600
+ let target = state.targetRef !== void 0 && state.targetRef.value;
20524
20601
 
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
- }
20602
+ if (target && (el === null || el.id !== state.targetUid.value)) {
20603
+ target.hasAttribute('tabindex') === true || (target = target.querySelector('[tabindex]'));
20604
+ if (target && target !== el) {
20605
+ target.focus();
20530
20606
  }
20531
- });
20607
+ }
20608
+ }
20609
+
20610
+ function focus () {
20611
+ addFocusFn(focusHandler);
20532
20612
  }
20533
20613
 
20534
20614
  function blur () {
20535
- focusFn !== void 0 && removeFocusFn(focusFn);
20615
+ removeFocusFn(focusHandler);
20536
20616
  const el = document.activeElement;
20537
20617
  if (el !== null && state.rootRef.value.contains(el)) {
20538
20618
  el.blur();
@@ -23814,6 +23894,8 @@
23814
23894
  });
23815
23895
 
23816
23896
  function emitEvent () {
23897
+ clearTimeout(timer);
23898
+ cancelAnimationFrame(timer);
23817
23899
  timer = null;
23818
23900
 
23819
23901
  const top = Math.max(0, getVerticalScrollPosition(localScrollTarget));
@@ -25464,8 +25546,8 @@
25464
25546
 
25465
25547
  function onBeforeShow () {
25466
25548
  validated = false;
25467
- initialValue.value = clone(props.modelValue);
25468
- currentModel.value = clone(props.modelValue);
25549
+ initialValue.value = cloneDeep(props.modelValue);
25550
+ currentModel.value = cloneDeep(props.modelValue);
25469
25551
  emit('before-show');
25470
25552
  }
25471
25553
 
@@ -25971,13 +26053,8 @@
25971
26053
 
25972
26054
  modelValue: {
25973
26055
  type: Object,
25974
- default: () => ({
25975
- min: null,
25976
- max: null
25977
- }),
25978
- validator (val) {
25979
- return 'min' in val && 'max' in val
25980
- }
26056
+ default: () => ({ min: null, max: null }),
26057
+ validator: v => 'min' in v && 'max' in v
25981
26058
  },
25982
26059
 
25983
26060
  dragRange: Boolean,
@@ -26012,13 +26089,24 @@
26012
26089
  const rootRef = vue.ref(null);
26013
26090
  const curMinRatio = vue.ref(0);
26014
26091
  const curMaxRatio = vue.ref(0);
26092
+ const model = vue.ref({ min: 0, max: 0 });
26015
26093
 
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
- });
26094
+ function normalizeModel () {
26095
+ model.value.min = props.modelValue.min === null
26096
+ ? state.innerMin.value
26097
+ : between(props.modelValue.min, state.innerMin.value, state.innerMax.value);
26020
26098
 
26021
- const nextFocus = vue.ref(null);
26099
+ model.value.max = props.modelValue.max === null
26100
+ ? state.innerMax.value
26101
+ : between(props.modelValue.max, state.innerMin.value, state.innerMax.value);
26102
+ }
26103
+
26104
+ vue.watch(
26105
+ () => `${ props.modelValue.min }|${ props.modelValue.max }|${ state.innerMin.value }|${ state.innerMax.value }`,
26106
+ normalizeModel
26107
+ );
26108
+
26109
+ normalizeModel();
26022
26110
 
26023
26111
  const modelMinRatio = vue.computed(() => methods.convertModelToRatio(model.value.min));
26024
26112
  const modelMaxRatio = vue.computed(() => methods.convertModelToRatio(model.value.max));
@@ -26041,7 +26129,7 @@
26041
26129
  return acc
26042
26130
  });
26043
26131
 
26044
- const events = vue.computed(() => {
26132
+ const trackContainerEvents = vue.computed(() => {
26045
26133
  if (state.editable.value !== true) {
26046
26134
  return {}
26047
26135
  }
@@ -26052,34 +26140,45 @@
26052
26140
 
26053
26141
  const evt = { onMousedown: methods.onActivate };
26054
26142
 
26055
- props.dragOnlyRange === true && Object.assign(evt, {
26056
- onFocus: () => { onFocus('both'); },
26057
- onBlur: methods.onBlur,
26058
- onKeydown,
26059
- onKeyup: methods.onKeyup
26060
- });
26143
+ if (props.dragRange === true || props.dragOnlyRange === true) {
26144
+ Object.assign(evt, {
26145
+ onFocus: () => { state.focus.value = 'both'; },
26146
+ onBlur: methods.onBlur,
26147
+ onKeydown,
26148
+ onKeyup: methods.onKeyup
26149
+ });
26150
+ }
26061
26151
 
26062
26152
  return evt
26063
26153
  });
26064
26154
 
26065
- const minThumbRef = vue.ref(null);
26066
- const minEvents = vue.computed(() => (
26067
- state.editable.value === true && $q.platform.is.mobile !== true && props.dragOnlyRange !== true
26155
+ function getEvents (side) {
26156
+ return $q.platform.is.mobile !== true && state.editable.value === true && props.dragOnlyRange !== true
26068
26157
  ? {
26069
- onFocus: () => { onFocus('min'); },
26158
+ onFocus: () => { state.focus.value = side; },
26070
26159
  onBlur: methods.onBlur,
26071
26160
  onKeydown,
26072
26161
  onKeyup: methods.onKeyup
26073
26162
  }
26074
26163
  : {}
26164
+ }
26165
+
26166
+ const thumbTabindex = vue.computed(() => (props.dragOnlyRange !== true ? state.tabindex.value : null));
26167
+ const trackContainerTabindex = vue.computed(() => (
26168
+ $q.platform.is.mobile !== true && (props.dragRange || props.dragOnlyRange === true)
26169
+ ? state.tabindex.value
26170
+ : null
26075
26171
  ));
26172
+
26173
+ const minThumbRef = vue.ref(null);
26174
+ const minEvents = vue.computed(() => getEvents('min'));
26076
26175
  const getMinThumb = methods.getThumbRenderFn({
26077
26176
  focusValue: 'min',
26078
- nextFocus,
26079
26177
  getNodeData: () => ({
26080
26178
  ref: minThumbRef,
26179
+ key: 'tmin',
26081
26180
  ...minEvents.value,
26082
- tabindex: props.dragOnlyRange !== true ? state.tabindex.value : null
26181
+ tabindex: thumbTabindex.value
26083
26182
  }),
26084
26183
  ratio: ratioMin,
26085
26184
  label: vue.computed(() => (
@@ -26092,22 +26191,13 @@
26092
26191
  labelTextColor: vue.computed(() => props.leftLabelTextColor || props.labelTextColor)
26093
26192
  });
26094
26193
 
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
- ));
26194
+ const maxEvents = vue.computed(() => getEvents('max'));
26105
26195
  const getMaxThumb = methods.getThumbRenderFn({
26106
26196
  focusValue: 'max',
26107
- nextFocus,
26108
26197
  getNodeData: () => ({
26109
26198
  ...maxEvents.value,
26110
- tabindex: props.dragOnlyRange !== true ? state.tabindex.value : null
26199
+ key: 'tmax',
26200
+ tabindex: thumbTabindex.value
26111
26201
  }),
26112
26202
  ratio: ratioMax,
26113
26203
  label: vue.computed(() => (
@@ -26120,19 +26210,6 @@
26120
26210
  labelTextColor: vue.computed(() => props.rightLabelTextColor || props.labelTextColor)
26121
26211
  });
26122
26212
 
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
26213
  function updateValue (change) {
26137
26214
  if (model.value.min !== props.modelValue.min || model.value.max !== props.modelValue.max) {
26138
26215
  emit('update:modelValue', { ...model.value });
@@ -26161,15 +26238,14 @@
26161
26238
  ratioMax: modelMaxRatio.value
26162
26239
  };
26163
26240
 
26164
- let type;
26165
26241
  const ratio = methods.getDraggingRatio(event, dragging);
26166
26242
 
26167
26243
  if (props.dragOnlyRange !== true && ratio < dragging.ratioMin + sensitivity) {
26168
- type = dragType.MIN;
26244
+ dragging.type = dragType.MIN;
26169
26245
  }
26170
26246
  else if (props.dragOnlyRange === true || ratio < dragging.ratioMax - sensitivity) {
26171
26247
  if (props.dragRange === true || props.dragOnlyRange === true) {
26172
- type = dragType.RANGE;
26248
+ dragging.type = dragType.RANGE;
26173
26249
  Object.assign(dragging, {
26174
26250
  offsetRatio: ratio,
26175
26251
  offsetModel: methods.convertRatioToModel(ratio),
@@ -26178,18 +26254,15 @@
26178
26254
  });
26179
26255
  }
26180
26256
  else {
26181
- type = dragging.ratioMax - ratio < ratio - dragging.ratioMin
26257
+ dragging.type = dragging.ratioMax - ratio < ratio - dragging.ratioMin
26182
26258
  ? dragType.MAX
26183
26259
  : dragType.MIN;
26184
26260
  }
26185
26261
  }
26186
26262
  else {
26187
- type = dragType.MAX;
26263
+ dragging.type = dragType.MAX;
26188
26264
  }
26189
26265
 
26190
- dragging.type = type;
26191
- nextFocus.value = null;
26192
-
26193
26266
  return dragging
26194
26267
  }
26195
26268
 
@@ -26207,7 +26280,7 @@
26207
26280
  min: localModel,
26208
26281
  max: dragging.valueMax
26209
26282
  };
26210
- nextFocus.value = 'min';
26283
+ state.focus.value = 'min';
26211
26284
  }
26212
26285
  else {
26213
26286
  pos = {
@@ -26216,7 +26289,7 @@
26216
26289
  min: dragging.valueMax,
26217
26290
  max: localModel
26218
26291
  };
26219
- nextFocus.value = 'max';
26292
+ state.focus.value = 'max';
26220
26293
  }
26221
26294
  break
26222
26295
 
@@ -26228,7 +26301,7 @@
26228
26301
  min: dragging.valueMin,
26229
26302
  max: localModel
26230
26303
  };
26231
- nextFocus.value = 'max';
26304
+ state.focus.value = 'max';
26232
26305
  }
26233
26306
  else {
26234
26307
  pos = {
@@ -26237,7 +26310,7 @@
26237
26310
  min: localModel,
26238
26311
  max: dragging.valueMin
26239
26312
  };
26240
- nextFocus.value = 'min';
26313
+ state.focus.value = 'min';
26241
26314
  }
26242
26315
  break
26243
26316
 
@@ -26254,34 +26327,26 @@
26254
26327
  min: parseFloat(min.toFixed(state.decimals.value)),
26255
26328
  max: parseFloat((min + dragging.rangeValue).toFixed(state.decimals.value))
26256
26329
  };
26330
+
26331
+ state.focus.value = 'both';
26257
26332
  break
26258
26333
  }
26259
26334
 
26260
- model.value = {
26261
- min: pos.min,
26262
- max: pos.max
26263
- };
26264
-
26265
26335
  // 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
- }
26336
+ model.value = model.value.min === null || model.value.max === null
26337
+ ? { min: pos.min || props.min, max: pos.max || props.max }
26338
+ : { min: pos.min, max: pos.max };
26270
26339
 
26271
26340
  if (props.snap !== true || props.step === 0) {
26272
26341
  curMinRatio.value = pos.minR;
26273
26342
  curMaxRatio.value = pos.maxR;
26274
26343
  }
26275
26344
  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;
26345
+ curMinRatio.value = methods.convertModelToRatio(model.value.min);
26346
+ curMaxRatio.value = methods.convertModelToRatio(model.value.max);
26278
26347
  }
26279
26348
  }
26280
26349
 
26281
- function onFocus (which) {
26282
- state.focus.value = which;
26283
- }
26284
-
26285
26350
  function onKeydown (evt) {
26286
26351
  if (!keyCodes$2.includes(evt.keyCode)) {
26287
26352
  return
@@ -26290,14 +26355,11 @@
26290
26355
  stopAndPrevent(evt);
26291
26356
 
26292
26357
  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;
26358
+ stepVal = ([ 34, 33 ].includes(evt.keyCode) ? 10 : 1) * state.step.value,
26359
+ offset = ([ 34, 37, 40 ].includes(evt.keyCode) ? -1 : 1) * (state.isReversed.value === true ? -1 : 1) * stepVal;
26300
26360
 
26361
+ if (state.focus.value === 'both') {
26362
+ const interval = model.value.max - model.value.min;
26301
26363
  const min = between(
26302
26364
  parseFloat((model.value.min + offset).toFixed(state.decimals.value)),
26303
26365
  state.innerMin.value,
@@ -26331,7 +26393,8 @@
26331
26393
  return () => {
26332
26394
  const content = methods.getContent(
26333
26395
  selectionBarStyle,
26334
- events,
26396
+ trackContainerTabindex,
26397
+ trackContainerEvents,
26335
26398
  node => {
26336
26399
  node.push(
26337
26400
  getMinThumb(),
@@ -26348,10 +26411,7 @@
26348
26411
  : ''
26349
26412
  ),
26350
26413
  ...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
26414
+ 'aria-valuenow': props.modelValue.min + '|' + props.modelValue.max
26355
26415
  }, content)
26356
26416
  }
26357
26417
  }
@@ -26987,6 +27047,7 @@
26987
27047
  style: mainStyle.value
26988
27048
  }, hMergeSlot(slots.default, [
26989
27049
  vue.h(QResizeObserver, {
27050
+ debounce: 0,
26990
27051
  onResize: updateScrollSize
26991
27052
  })
26992
27053
  ])),
@@ -26997,7 +27058,10 @@
26997
27058
  })
26998
27059
  ]),
26999
27060
 
27000
- vue.h(QResizeObserver, { onResize: updateContainer }),
27061
+ vue.h(QResizeObserver, {
27062
+ debounce: 0,
27063
+ onResize: updateContainer
27064
+ }),
27001
27065
 
27002
27066
  vue.h('div', {
27003
27067
  class: scroll.vertical.barClass.value,
@@ -28252,7 +28316,10 @@
28252
28316
 
28253
28317
  targetRef.value !== null && targetRef.value.focus();
28254
28318
 
28255
- if (isDeepEqual(getOptionValue.value(innerValue.value[ 0 ]), optValue) !== true) {
28319
+ if (
28320
+ innerValue.value.length === 0
28321
+ || isDeepEqual(getOptionValue.value(innerValue.value[ 0 ]), optValue) !== true
28322
+ ) {
28256
28323
  emit('update:modelValue', props.emitValue === true ? optValue : opt);
28257
28324
  }
28258
28325
  return
@@ -36107,7 +36174,9 @@
36107
36174
  src: {
36108
36175
  type: String,
36109
36176
  required: true
36110
- }
36177
+ },
36178
+
36179
+ title: String
36111
36180
  },
36112
36181
 
36113
36182
  setup (props) {
@@ -36124,6 +36193,7 @@
36124
36193
  }, [
36125
36194
  vue.h('iframe', {
36126
36195
  src: props.src,
36196
+ title: props.title,
36127
36197
  frameborder: '0',
36128
36198
  allowfullscreen: true
36129
36199
  })
@@ -39124,7 +39194,7 @@
39124
39194
  });
39125
39195
 
39126
39196
  var index_umd = {
39127
- version: '2.4.0',
39197
+ version: '2.4.4',
39128
39198
  install (app, opts) {
39129
39199
  installQuasar(app, {
39130
39200
  components,