quasar 2.14.0 → 2.14.2

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 (133) hide show
  1. package/dist/api/Notify.json +2 -2
  2. package/dist/api/QTime.json +8 -1
  3. package/dist/icon-set/bootstrap-icons.umd.prod.js +1 -1
  4. package/dist/icon-set/eva-icons.umd.prod.js +1 -1
  5. package/dist/icon-set/fontawesome-v5-pro.umd.prod.js +1 -1
  6. package/dist/icon-set/fontawesome-v5.umd.prod.js +1 -1
  7. package/dist/icon-set/fontawesome-v6-pro.umd.prod.js +1 -1
  8. package/dist/icon-set/fontawesome-v6.umd.prod.js +1 -1
  9. package/dist/icon-set/ionicons-v4.umd.prod.js +1 -1
  10. package/dist/icon-set/line-awesome.umd.prod.js +1 -1
  11. package/dist/icon-set/material-icons-outlined.umd.prod.js +1 -1
  12. package/dist/icon-set/material-icons-round.umd.prod.js +1 -1
  13. package/dist/icon-set/material-icons-sharp.umd.prod.js +1 -1
  14. package/dist/icon-set/material-icons.umd.prod.js +1 -1
  15. package/dist/icon-set/material-symbols-outlined.umd.prod.js +1 -1
  16. package/dist/icon-set/material-symbols-rounded.umd.prod.js +1 -1
  17. package/dist/icon-set/material-symbols-sharp.umd.prod.js +1 -1
  18. package/dist/icon-set/mdi-v3.umd.prod.js +1 -1
  19. package/dist/icon-set/mdi-v4.umd.prod.js +1 -1
  20. package/dist/icon-set/mdi-v5.umd.prod.js +1 -1
  21. package/dist/icon-set/mdi-v6.umd.prod.js +1 -1
  22. package/dist/icon-set/mdi-v7.umd.prod.js +1 -1
  23. package/dist/icon-set/svg-bootstrap-icons.umd.prod.js +2 -2
  24. package/dist/icon-set/svg-eva-icons.umd.prod.js +1 -1
  25. package/dist/icon-set/svg-fontawesome-v5.umd.prod.js +1 -1
  26. package/dist/icon-set/svg-fontawesome-v6.umd.prod.js +1 -1
  27. package/dist/icon-set/svg-ionicons-v4.umd.prod.js +1 -1
  28. package/dist/icon-set/svg-ionicons-v5.umd.prod.js +1 -1
  29. package/dist/icon-set/svg-ionicons-v6.umd.prod.js +1 -1
  30. package/dist/icon-set/svg-line-awesome.umd.prod.js +1 -1
  31. package/dist/icon-set/svg-material-icons-outlined.umd.prod.js +1 -1
  32. package/dist/icon-set/svg-material-icons-round.umd.prod.js +1 -1
  33. package/dist/icon-set/svg-material-icons-sharp.umd.prod.js +1 -1
  34. package/dist/icon-set/svg-material-icons.umd.prod.js +1 -1
  35. package/dist/icon-set/svg-material-symbols-outlined.umd.prod.js +1 -1
  36. package/dist/icon-set/svg-material-symbols-rounded.umd.prod.js +1 -1
  37. package/dist/icon-set/svg-material-symbols-sharp.umd.prod.js +1 -1
  38. package/dist/icon-set/svg-mdi-v6.umd.prod.js +1 -1
  39. package/dist/icon-set/svg-mdi-v7.umd.prod.js +1 -1
  40. package/dist/icon-set/svg-themify.umd.prod.js +1 -1
  41. package/dist/icon-set/themify.umd.prod.js +1 -1
  42. package/dist/lang/ar-TN.umd.prod.js +1 -1
  43. package/dist/lang/ar.umd.prod.js +1 -1
  44. package/dist/lang/az-Latn.umd.prod.js +1 -1
  45. package/dist/lang/bg.umd.prod.js +1 -1
  46. package/dist/lang/bn.umd.prod.js +1 -1
  47. package/dist/lang/ca.umd.prod.js +1 -1
  48. package/dist/lang/cs.umd.prod.js +1 -1
  49. package/dist/lang/da.umd.prod.js +1 -1
  50. package/dist/lang/de-CH.umd.prod.js +1 -1
  51. package/dist/lang/de-DE.umd.prod.js +1 -1
  52. package/dist/lang/de.umd.prod.js +1 -1
  53. package/dist/lang/el.umd.prod.js +1 -1
  54. package/dist/lang/en-GB.umd.prod.js +1 -1
  55. package/dist/lang/en-US.umd.prod.js +1 -1
  56. package/dist/lang/eo.umd.prod.js +1 -1
  57. package/dist/lang/es.umd.prod.js +1 -1
  58. package/dist/lang/et.umd.prod.js +1 -1
  59. package/dist/lang/eu.umd.prod.js +1 -1
  60. package/dist/lang/fa-IR.umd.prod.js +1 -1
  61. package/dist/lang/fa.umd.prod.js +1 -1
  62. package/dist/lang/fi.umd.prod.js +1 -1
  63. package/dist/lang/fr.umd.prod.js +1 -1
  64. package/dist/lang/gn.umd.prod.js +1 -1
  65. package/dist/lang/he.umd.prod.js +1 -1
  66. package/dist/lang/hi.umd.prod.js +1 -1
  67. package/dist/lang/hr.umd.prod.js +1 -1
  68. package/dist/lang/hu.umd.prod.js +1 -1
  69. package/dist/lang/id.umd.prod.js +1 -1
  70. package/dist/lang/is.umd.prod.js +1 -1
  71. package/dist/lang/it.umd.prod.js +1 -1
  72. package/dist/lang/ja.umd.prod.js +1 -1
  73. package/dist/lang/kk.umd.prod.js +1 -1
  74. package/dist/lang/km.umd.prod.js +1 -1
  75. package/dist/lang/ko-KR.umd.prod.js +1 -1
  76. package/dist/lang/kur-CKB.umd.prod.js +1 -1
  77. package/dist/lang/lt.umd.prod.js +1 -1
  78. package/dist/lang/lu.umd.prod.js +1 -1
  79. package/dist/lang/lv.umd.prod.js +1 -1
  80. package/dist/lang/mk.umd.prod.js +1 -1
  81. package/dist/lang/ml.umd.prod.js +1 -1
  82. package/dist/lang/mm.umd.prod.js +1 -1
  83. package/dist/lang/ms.umd.prod.js +2 -2
  84. package/dist/lang/my.umd.prod.js +1 -1
  85. package/dist/lang/nb-NO.umd.prod.js +1 -1
  86. package/dist/lang/nl.umd.prod.js +1 -1
  87. package/dist/lang/pl.umd.prod.js +1 -1
  88. package/dist/lang/pt-BR.umd.prod.js +1 -1
  89. package/dist/lang/pt.umd.prod.js +1 -1
  90. package/dist/lang/ro.umd.prod.js +1 -1
  91. package/dist/lang/ru.umd.prod.js +1 -1
  92. package/dist/lang/sk.umd.prod.js +1 -1
  93. package/dist/lang/sl.umd.prod.js +1 -1
  94. package/dist/lang/sm.umd.prod.js +1 -1
  95. package/dist/lang/sr-CYR.umd.prod.js +1 -1
  96. package/dist/lang/sr.umd.prod.js +1 -1
  97. package/dist/lang/sv.umd.prod.js +1 -1
  98. package/dist/lang/ta.umd.prod.js +1 -1
  99. package/dist/lang/th.umd.prod.js +1 -1
  100. package/dist/lang/tr.umd.prod.js +1 -1
  101. package/dist/lang/ug.umd.prod.js +1 -1
  102. package/dist/lang/uk.umd.prod.js +1 -1
  103. package/dist/lang/uz-Cyrl.umd.prod.js +1 -1
  104. package/dist/lang/uz-Latn.umd.prod.js +1 -1
  105. package/dist/lang/vi.umd.prod.js +1 -1
  106. package/dist/lang/zh-CN.umd.prod.js +1 -1
  107. package/dist/lang/zh-TW.umd.prod.js +1 -1
  108. package/dist/quasar.cjs.prod.js +2 -2
  109. package/dist/quasar.esm.js +120 -85
  110. package/dist/quasar.esm.prod.js +2 -2
  111. package/dist/quasar.sass +1 -1
  112. package/dist/quasar.umd.js +120 -85
  113. package/dist/quasar.umd.prod.js +2 -2
  114. package/dist/types/index.d.ts +8 -5
  115. package/dist/web-types/web-types.json +1 -1
  116. package/lang/ms.js +1 -1
  117. package/lang/ms.mjs +1 -1
  118. package/package.json +1 -1
  119. package/src/components/btn/QBtn.js +2 -2
  120. package/src/components/circular-progress/QCircularProgress.js +9 -4
  121. package/src/components/color/QColor.js +5 -9
  122. package/src/components/date/QDate.js +16 -4
  123. package/src/components/editor/QEditor.js +1 -1
  124. package/src/components/range/QRange.js +8 -8
  125. package/src/components/resize-observer/QResizeObserver.js +3 -3
  126. package/src/components/select/QSelect.js +3 -4
  127. package/src/components/slider/QSlider.js +2 -2
  128. package/src/components/slider/use-slider.js +15 -9
  129. package/src/components/time/QTime.json +4 -1
  130. package/src/composables/private/use-field.js +0 -3
  131. package/src/composables/private/use-validate.js +49 -30
  132. package/src/plugins/Notify.js +4 -3
  133. package/src/plugins/Notify.json +2 -2
package/dist/quasar.sass CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Quasar Framework v2.14.0
2
+ * Quasar Framework v2.14.2
3
3
  * (c) 2015-present Razvan Stoenescu
4
4
  * Released under the MIT License.
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Quasar Framework v2.14.0
2
+ * Quasar Framework v2.14.2
3
3
  * (c) 2015-present Razvan Stoenescu
4
4
  * Released under the MIT License.
5
5
  */
@@ -1653,7 +1653,7 @@
1653
1653
  }
1654
1654
 
1655
1655
  var installQuasar = function (parentApp, opts = {}) {
1656
- const $q = { version: '2.14.0' };
1656
+ const $q = { version: '2.14.2' };
1657
1657
 
1658
1658
  if (globalConfigIsFrozen === false) {
1659
1659
  if (opts.config !== void 0) {
@@ -3850,7 +3850,7 @@
3850
3850
  props.icon !== void 0 && inner.push(
3851
3851
  vue.h(QIcon, {
3852
3852
  name: props.icon,
3853
- left: props.stack === false && hasLabel.value === true,
3853
+ left: props.stack !== true && hasLabel.value === true,
3854
3854
  role: 'img',
3855
3855
  'aria-hidden': 'true'
3856
3856
  })
@@ -3866,7 +3866,7 @@
3866
3866
  inner.push(
3867
3867
  vue.h(QIcon, {
3868
3868
  name: props.iconRight,
3869
- right: props.stack === false && hasLabel.value === true,
3869
+ right: props.stack !== true && hasLabel.value === true,
3870
3870
  role: 'img',
3871
3871
  'aria-hidden': 'true'
3872
3872
  })
@@ -8200,11 +8200,16 @@
8200
8200
 
8201
8201
  const normalized = vue.computed(() => between(props.value, props.min, props.max));
8202
8202
 
8203
- const strokeDashOffset = vue.computed(() => circumference * (
8204
- 1 - (normalized.value - props.min) / (props.max - props.min)
8205
- ));
8206
-
8203
+ const range = vue.computed(() => props.max - props.min);
8207
8204
  const strokeWidth = vue.computed(() => props.thickness / 2 * viewBox.value);
8205
+ const strokeDashOffset = vue.computed(() => {
8206
+ const dashRatio = (props.max - normalized.value) / range.value;
8207
+ const dashGap = props.rounded === true && normalized.value < props.max && dashRatio < 0.25
8208
+ ? strokeWidth.value / 2 * (1 - dashRatio / 0.25)
8209
+ : 0;
8210
+
8211
+ return circumference * dashRatio + dashGap
8212
+ });
8208
8213
 
8209
8214
  function getCircle ({ thickness, offset, color, cls, rounded }) {
8210
8215
  return vue.h('circle', {
@@ -8832,8 +8837,16 @@
8832
8837
  && innerMin.value < innerMax.value
8833
8838
  ));
8834
8839
 
8835
- const decimals = vue.computed(() => (String(props.step).trim().split('.')[ 1 ] || '').length);
8836
- const step = vue.computed(() => (props.step === 0 ? 1 : props.step));
8840
+ const roundValueFn = vue.computed(() => {
8841
+ if (props.step === 0) {
8842
+ return v => v
8843
+ }
8844
+
8845
+ const decimals = (String(props.step).trim().split('.')[ 1 ] || '').length;
8846
+ return v => parseFloat(v.toFixed(decimals))
8847
+ });
8848
+
8849
+ const keyStep = vue.computed(() => (props.step === 0 ? 1 : props.step));
8837
8850
  const tabindex = vue.computed(() => (editable.value === true ? props.tabindex || 0 : -1));
8838
8851
 
8839
8852
  const trackLen = vue.computed(() => props.max - props.min);
@@ -8941,13 +8954,11 @@
8941
8954
  let model = min + ratio * (max - min);
8942
8955
 
8943
8956
  if (step > 0) {
8944
- const modulo = (model - min) % step;
8957
+ const modulo = (model - innerMin.value) % step;
8945
8958
  model += (Math.abs(modulo) >= step / 2 ? (modulo < 0 ? -1 : 1) * step : 0) - modulo;
8946
8959
  }
8947
8960
 
8948
- if (decimals.value > 0) {
8949
- model = parseFloat(model.toFixed(decimals.value));
8950
- }
8961
+ model = roundValueFn.value(model);
8951
8962
 
8952
8963
  return between(model, innerMin.value, innerMax.value)
8953
8964
  }
@@ -8973,7 +8984,7 @@
8973
8984
  }
8974
8985
 
8975
8986
  const markerStep = vue.computed(() => (
8976
- isNumber(props.markers) === true ? props.markers : step.value)
8987
+ isNumber(props.markers) === true ? props.markers : keyStep.value)
8977
8988
  );
8978
8989
 
8979
8990
  const markerTicks = vue.computed(() => {
@@ -9333,8 +9344,8 @@
9333
9344
  tabindex,
9334
9345
  attributes,
9335
9346
 
9336
- step,
9337
- decimals,
9347
+ roundValueFn,
9348
+ keyStep,
9338
9349
  trackLen,
9339
9350
  innerMin,
9340
9351
  innerMinRatio,
@@ -9480,7 +9491,7 @@
9480
9491
  stopAndPrevent(evt);
9481
9492
 
9482
9493
  const
9483
- stepVal = ([ 34, 33 ].includes(evt.keyCode) ? 10 : 1) * state.step.value,
9494
+ stepVal = ([ 34, 33 ].includes(evt.keyCode) ? 10 : 1) * state.keyStep.value,
9484
9495
  offset = (
9485
9496
  ([ 34, 37, 40 ].includes(evt.keyCode) ? -1 : 1)
9486
9497
  * (state.isReversed.value === true ? -1 : 1)
@@ -9488,7 +9499,7 @@
9488
9499
  );
9489
9500
 
9490
9501
  model.value = between(
9491
- parseFloat((model.value + offset).toFixed(state.decimals.value)),
9502
+ state.roundValueFn.value(model.value + offset),
9492
9503
  state.innerMin.value,
9493
9504
  state.innerMax.value
9494
9505
  );
@@ -9577,6 +9588,9 @@
9577
9588
 
9578
9589
  const { proxy } = vue.getCurrentInstance();
9579
9590
 
9591
+ // expose public method
9592
+ proxy.trigger = trigger;
9593
+
9580
9594
  if (hasObserver === true) {
9581
9595
  let observer;
9582
9596
 
@@ -9650,9 +9664,6 @@
9650
9664
 
9651
9665
  vue.onBeforeUnmount(cleanup);
9652
9666
 
9653
- // expose public method
9654
- proxy.trigger = trigger;
9655
-
9656
9667
  return () => {
9657
9668
  if (canRender.value === true) {
9658
9669
  return vue.h('object', {
@@ -11174,15 +11185,11 @@
11174
11185
  + (isDark.value === true ? ' q-color-picker--dark q-dark' : '')
11175
11186
  );
11176
11187
 
11177
- const attributes = vue.computed(() => {
11178
- if (props.disable === true) {
11179
- return { 'aria-disabled': 'true' }
11180
- }
11181
- if (props.readonly === true) {
11182
- return { 'aria-readonly': 'true' }
11183
- }
11184
- return {}
11185
- });
11188
+ const attributes = vue.computed(() => (
11189
+ props.disable === true
11190
+ ? { 'aria-disabled': 'true' }
11191
+ : {}
11192
+ ));
11186
11193
 
11187
11194
  const spectrumDirective = vue.computed(() => {
11188
11195
  // if editable.value === true
@@ -13892,7 +13899,7 @@
13892
13899
  const attributes = vue.computed(() => (
13893
13900
  props.disable === true
13894
13901
  ? { 'aria-disabled': 'true' }
13895
- : (props.readonly === true ? { 'aria-readonly': 'true' } : {})
13902
+ : {}
13896
13903
  ));
13897
13904
 
13898
13905
  vue.watch(() => props.modelValue, v => {
@@ -13926,10 +13933,22 @@
13926
13933
  });
13927
13934
 
13928
13935
  function setToday () {
13929
- const date = today.value;
13930
- const month = daysMap.value[ getMonthHash(date) ];
13936
+ const { year, month, day } = today.value;
13937
+
13938
+ const date = {
13939
+ // contains more props than needed (hour, minute, second, millisecond)
13940
+ // but those aren't used in the processing of this "date" variable
13941
+ ...viewModel.value,
13931
13942
 
13932
- if (month === void 0 || month.includes(date.day) === false) {
13943
+ // overwriting with today's date
13944
+ year,
13945
+ month,
13946
+ day
13947
+ };
13948
+
13949
+ const monthMap = daysMap.value[ getMonthHash(date) ];
13950
+
13951
+ if (monthMap === void 0 || monthMap.includes(date.day) === false) {
13933
13952
  addToModel(date);
13934
13953
  }
13935
13954
 
@@ -17528,7 +17547,7 @@
17528
17547
  const attributes = vue.computed(() => (
17529
17548
  props.disable === true
17530
17549
  ? { 'aria-disabled': 'true' }
17531
- : (props.readonly === true ? { 'aria-readonly': 'true' } : {})
17550
+ : {}
17532
17551
  ));
17533
17552
 
17534
17553
  function onInput () {
@@ -18727,6 +18746,7 @@
18727
18746
  reactiveRules: Boolean,
18728
18747
  lazyRules: {
18729
18748
  type: [ Boolean, String ],
18749
+ default: false, // statement unneeded but avoids future vue implementation changes
18730
18750
  validator: v => lazyRulesValues.includes(v)
18731
18751
  }
18732
18752
  };
@@ -18748,10 +18768,14 @@
18748
18768
  && props.rules.length !== 0
18749
18769
  );
18750
18770
 
18751
- const hasActiveRules = vue.computed(() =>
18771
+ const canDebounceValidate = vue.computed(() => (
18752
18772
  props.disable !== true
18753
18773
  && hasRules.value === true
18754
- );
18774
+ // Should not have a validation in progress already;
18775
+ // It might mean that focus switched to submit btn and
18776
+ // QForm's submit() has been called already (ENTER key)
18777
+ && innerLoading.value === false
18778
+ ));
18755
18779
 
18756
18780
  const hasError = vue.computed(() =>
18757
18781
  props.error === true || innerError.value === true
@@ -18764,15 +18788,29 @@
18764
18788
  ));
18765
18789
 
18766
18790
  vue.watch(() => props.modelValue, () => {
18767
- validateIfNeeded();
18791
+ isDirtyModel.value = true;
18792
+
18793
+ if (
18794
+ canDebounceValidate.value === true
18795
+ // trigger validation if not using any kind of lazy-rules
18796
+ && props.lazyRules === false
18797
+ ) {
18798
+ debouncedValidate();
18799
+ }
18768
18800
  });
18769
18801
 
18770
18802
  vue.watch(() => props.reactiveRules, val => {
18771
18803
  if (val === true) {
18772
18804
  if (unwatchRules === void 0) {
18773
18805
  unwatchRules = vue.watch(() => props.rules, () => {
18774
- validateIfNeeded(true);
18775
- });
18806
+ if (
18807
+ canDebounceValidate.value === true
18808
+ && isDirtyModel.value === true
18809
+ && props.lazyRules !== 'ondemand'
18810
+ ) {
18811
+ debouncedValidate();
18812
+ }
18813
+ }, { immediate: true });
18776
18814
  }
18777
18815
  }
18778
18816
  else if (unwatchRules !== void 0) {
@@ -18781,25 +18819,32 @@
18781
18819
  }
18782
18820
  }, { immediate: true });
18783
18821
 
18822
+ vue.watch(() => props.lazyRules, val => {
18823
+ if (
18824
+ val === false
18825
+ && canDebounceValidate.value === true
18826
+ && isDirtyModel.value === true
18827
+ ) {
18828
+ debouncedValidate();
18829
+ }
18830
+ });
18831
+
18784
18832
  vue.watch(focused, val => {
18785
18833
  if (val === true) {
18786
18834
  if (isDirtyModel.value === null) {
18787
- isDirtyModel.value = false;
18835
+ isDirtyModel.value = props.lazyRules === true;
18788
18836
  }
18789
18837
  }
18790
- else if (isDirtyModel.value === false) {
18791
- isDirtyModel.value = true;
18792
-
18793
- if (
18794
- hasActiveRules.value === true
18795
- && props.lazyRules !== 'ondemand'
18796
- // Don't re-trigger if it's already in progress;
18797
- // It might mean that focus switched to submit btn and
18798
- // QForm's submit() has been called already (ENTER key)
18799
- && innerLoading.value === false
18800
- ) {
18801
- debouncedValidate();
18802
- }
18838
+ else if (
18839
+ canDebounceValidate.value === true
18840
+ && (
18841
+ // props.lazyRules can also be 'ondemand',
18842
+ // hence the following form:
18843
+ props.lazyRules === false
18844
+ || (props.lazyRules === true && isDirtyModel.value === true)
18845
+ )
18846
+ ) {
18847
+ debouncedValidate();
18803
18848
  }
18804
18849
  });
18805
18850
 
@@ -18819,7 +18864,10 @@
18819
18864
  * - Promise (pending async validation)
18820
18865
  */
18821
18866
  function validate (val = props.modelValue) {
18822
- if (hasActiveRules.value !== true) {
18867
+ if (
18868
+ props.disable === true
18869
+ || hasRules.value === false
18870
+ ) {
18823
18871
  return true
18824
18872
  }
18825
18873
 
@@ -18888,16 +18936,6 @@
18888
18936
  )
18889
18937
  }
18890
18938
 
18891
- function validateIfNeeded (changedRules) {
18892
- if (
18893
- hasActiveRules.value === true
18894
- && props.lazyRules !== 'ondemand'
18895
- && (isDirtyModel.value === true || (props.lazyRules !== true && changedRules !== true))
18896
- ) {
18897
- debouncedValidate();
18898
- }
18899
- }
18900
-
18901
18939
  const debouncedValidate = debounce(validate, 0);
18902
18940
 
18903
18941
  vue.onBeforeUnmount(() => {
@@ -19165,9 +19203,6 @@
19165
19203
  if (props.disable === true) {
19166
19204
  acc[ 'aria-disabled' ] = 'true';
19167
19205
  }
19168
- else if (props.readonly === true) {
19169
- acc[ 'aria-readonly' ] = 'true';
19170
- }
19171
19206
 
19172
19207
  return acc
19173
19208
  });
@@ -25596,15 +25631,15 @@
25596
25631
  case dragType.RANGE:
25597
25632
  const
25598
25633
  ratioDelta = ratio - dragging.offsetRatio,
25599
- minR = between(dragging.ratioMin + ratioDelta, 0, 1 - dragging.rangeRatio),
25634
+ minR = between(dragging.ratioMin + ratioDelta, state.innerMinRatio.value, state.innerMaxRatio.value - dragging.rangeRatio),
25600
25635
  modelDelta = localModel - dragging.offsetModel,
25601
- min = between(dragging.valueMin + modelDelta, props.min, props.max - dragging.rangeValue);
25636
+ min = between(dragging.valueMin + modelDelta, state.innerMin.value, state.innerMax.value - dragging.rangeValue);
25602
25637
 
25603
25638
  pos = {
25604
25639
  minR,
25605
25640
  maxR: minR + dragging.rangeRatio,
25606
- min: parseFloat(min.toFixed(state.decimals.value)),
25607
- max: parseFloat((min + dragging.rangeValue).toFixed(state.decimals.value))
25641
+ min: state.roundValueFn.value(min),
25642
+ max: state.roundValueFn.value(min + dragging.rangeValue)
25608
25643
  };
25609
25644
 
25610
25645
  state.focus.value = 'both';
@@ -25634,7 +25669,7 @@
25634
25669
  stopAndPrevent(evt);
25635
25670
 
25636
25671
  const
25637
- stepVal = ([ 34, 33 ].includes(evt.keyCode) ? 10 : 1) * state.step.value,
25672
+ stepVal = ([ 34, 33 ].includes(evt.keyCode) ? 10 : 1) * state.keyStep.value,
25638
25673
  offset = (
25639
25674
  ([ 34, 37, 40 ].includes(evt.keyCode) ? -1 : 1)
25640
25675
  * (state.isReversed.value === true ? -1 : 1)
@@ -25644,14 +25679,14 @@
25644
25679
  if (state.focus.value === 'both') {
25645
25680
  const interval = model.value.max - model.value.min;
25646
25681
  const min = between(
25647
- parseFloat((model.value.min + offset).toFixed(state.decimals.value)),
25682
+ state.roundValueFn.value(model.value.min + offset),
25648
25683
  state.innerMin.value,
25649
25684
  state.innerMax.value - interval
25650
25685
  );
25651
25686
 
25652
25687
  model.value = {
25653
25688
  min,
25654
- max: parseFloat((min + interval).toFixed(state.decimals.value))
25689
+ max: state.roundValueFn.value(min + interval)
25655
25690
  };
25656
25691
  }
25657
25692
  else if (state.focus.value === false) {
@@ -25663,7 +25698,7 @@
25663
25698
  model.value = {
25664
25699
  ...model.value,
25665
25700
  [ which ]: between(
25666
- parseFloat((model.value[ which ] + offset).toFixed(state.decimals.value)),
25701
+ state.roundValueFn.value(model.value[ which ] + offset),
25667
25702
  which === 'min' ? state.innerMin.value : model.value.min,
25668
25703
  which === 'max' ? state.innerMax.value : model.value.max
25669
25704
  )
@@ -27516,11 +27551,12 @@
27516
27551
 
27517
27552
  return props.options.slice(from, to).map((opt, i) => {
27518
27553
  const disable = isOptionDisabled.value(opt) === true;
27554
+ const active = isOptionSelected(opt) === true;
27519
27555
  const index = from + i;
27520
27556
 
27521
27557
  const itemProps = {
27522
27558
  clickable: true,
27523
- active: false,
27559
+ active,
27524
27560
  activeClass: computedOptionsSelectedClass.value,
27525
27561
  manualFocus: true,
27526
27562
  focused: false,
@@ -27529,16 +27565,14 @@
27529
27565
  dense: props.optionsDense,
27530
27566
  dark: isOptionsDark.value,
27531
27567
  role: 'option',
27568
+ 'aria-selected': active === true ? 'true' : 'false',
27532
27569
  id: `${ state.targetUid.value }_${ index }`,
27533
27570
  onClick: () => { toggleOption(opt); }
27534
27571
  };
27535
27572
 
27536
27573
  if (disable !== true) {
27537
- isOptionSelected(opt) === true && (itemProps.active = true);
27538
27574
  optionIndex.value === index && (itemProps.focused = true);
27539
27575
 
27540
- itemProps[ 'aria-selected' ] = itemProps.active === true ? 'true' : 'false';
27541
-
27542
27576
  if ($q.platform.is.desktop === true) {
27543
27577
  itemProps.onMousemove = () => { menu.value === true && setOptionIndex(index); };
27544
27578
  }
@@ -39800,6 +39834,7 @@
39800
39834
  const positionClass = {};
39801
39835
  const emptyRE = /^\s*$/;
39802
39836
  const notifRefs = [];
39837
+ const invalidTimeoutValues = [ void 0, null, true, false, '' ];
39803
39838
 
39804
39839
  const positionList = [
39805
39840
  'top-left', 'top-right',
@@ -39893,15 +39928,15 @@
39893
39928
  notif.position = 'bottom';
39894
39929
  }
39895
39930
 
39896
- if (notif.timeout === void 0) {
39931
+ if (invalidTimeoutValues.includes(notif.timeout) === true) {
39897
39932
  notif.timeout = 5000;
39898
39933
  }
39899
39934
  else {
39900
- const t = parseInt(notif.timeout, 10);
39935
+ const t = Number(notif.timeout); // we catch exponential notation too with Number() casting
39901
39936
  if (isNaN(t) || t < 0) {
39902
39937
  return logError('wrong timeout', config)
39903
39938
  }
39904
- notif.timeout = t;
39939
+ notif.timeout = Number.isFinite(t) ? t : 0;
39905
39940
  }
39906
39941
 
39907
39942
  if (notif.timeout === 0) {
@@ -41025,7 +41060,7 @@
41025
41060
  */
41026
41061
 
41027
41062
  var index_umd = {
41028
- version: '2.14.0',
41063
+ version: '2.14.2',
41029
41064
  install (app, opts) {
41030
41065
  installQuasar(app, {
41031
41066
  components,