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
@@ -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
  */
@@ -1651,7 +1651,7 @@ function prepareApp (app, uiOpts, pluginOpts) {
1651
1651
  }
1652
1652
 
1653
1653
  var installQuasar = function (parentApp, opts = {}) {
1654
- const $q = { version: '2.14.0' };
1654
+ const $q = { version: '2.14.2' };
1655
1655
 
1656
1656
  if (globalConfigIsFrozen === false) {
1657
1657
  if (opts.config !== void 0) {
@@ -3848,7 +3848,7 @@ var QBtn = createComponent({
3848
3848
  props.icon !== void 0 && inner.push(
3849
3849
  h(QIcon, {
3850
3850
  name: props.icon,
3851
- left: props.stack === false && hasLabel.value === true,
3851
+ left: props.stack !== true && hasLabel.value === true,
3852
3852
  role: 'img',
3853
3853
  'aria-hidden': 'true'
3854
3854
  })
@@ -3864,7 +3864,7 @@ var QBtn = createComponent({
3864
3864
  inner.push(
3865
3865
  h(QIcon, {
3866
3866
  name: props.iconRight,
3867
- right: props.stack === false && hasLabel.value === true,
3867
+ right: props.stack !== true && hasLabel.value === true,
3868
3868
  role: 'img',
3869
3869
  'aria-hidden': 'true'
3870
3870
  })
@@ -8198,11 +8198,16 @@ var QCircularProgress = createComponent({
8198
8198
 
8199
8199
  const normalized = computed(() => between(props.value, props.min, props.max));
8200
8200
 
8201
- const strokeDashOffset = computed(() => circumference * (
8202
- 1 - (normalized.value - props.min) / (props.max - props.min)
8203
- ));
8204
-
8201
+ const range = computed(() => props.max - props.min);
8205
8202
  const strokeWidth = computed(() => props.thickness / 2 * viewBox.value);
8203
+ const strokeDashOffset = computed(() => {
8204
+ const dashRatio = (props.max - normalized.value) / range.value;
8205
+ const dashGap = props.rounded === true && normalized.value < props.max && dashRatio < 0.25
8206
+ ? strokeWidth.value / 2 * (1 - dashRatio / 0.25)
8207
+ : 0;
8208
+
8209
+ return circumference * dashRatio + dashGap
8210
+ });
8206
8211
 
8207
8212
  function getCircle ({ thickness, offset, color, cls, rounded }) {
8208
8213
  return h('circle', {
@@ -8830,8 +8835,16 @@ function useSlider ({ updateValue, updatePosition, getDragging, formAttrs }) {
8830
8835
  && innerMin.value < innerMax.value
8831
8836
  ));
8832
8837
 
8833
- const decimals = computed(() => (String(props.step).trim().split('.')[ 1 ] || '').length);
8834
- const step = computed(() => (props.step === 0 ? 1 : props.step));
8838
+ const roundValueFn = computed(() => {
8839
+ if (props.step === 0) {
8840
+ return v => v
8841
+ }
8842
+
8843
+ const decimals = (String(props.step).trim().split('.')[ 1 ] || '').length;
8844
+ return v => parseFloat(v.toFixed(decimals))
8845
+ });
8846
+
8847
+ const keyStep = computed(() => (props.step === 0 ? 1 : props.step));
8835
8848
  const tabindex = computed(() => (editable.value === true ? props.tabindex || 0 : -1));
8836
8849
 
8837
8850
  const trackLen = computed(() => props.max - props.min);
@@ -8939,13 +8952,11 @@ function useSlider ({ updateValue, updatePosition, getDragging, formAttrs }) {
8939
8952
  let model = min + ratio * (max - min);
8940
8953
 
8941
8954
  if (step > 0) {
8942
- const modulo = (model - min) % step;
8955
+ const modulo = (model - innerMin.value) % step;
8943
8956
  model += (Math.abs(modulo) >= step / 2 ? (modulo < 0 ? -1 : 1) * step : 0) - modulo;
8944
8957
  }
8945
8958
 
8946
- if (decimals.value > 0) {
8947
- model = parseFloat(model.toFixed(decimals.value));
8948
- }
8959
+ model = roundValueFn.value(model);
8949
8960
 
8950
8961
  return between(model, innerMin.value, innerMax.value)
8951
8962
  }
@@ -8971,7 +8982,7 @@ function useSlider ({ updateValue, updatePosition, getDragging, formAttrs }) {
8971
8982
  }
8972
8983
 
8973
8984
  const markerStep = computed(() => (
8974
- isNumber(props.markers) === true ? props.markers : step.value)
8985
+ isNumber(props.markers) === true ? props.markers : keyStep.value)
8975
8986
  );
8976
8987
 
8977
8988
  const markerTicks = computed(() => {
@@ -9331,8 +9342,8 @@ function useSlider ({ updateValue, updatePosition, getDragging, formAttrs }) {
9331
9342
  tabindex,
9332
9343
  attributes,
9333
9344
 
9334
- step,
9335
- decimals,
9345
+ roundValueFn,
9346
+ keyStep,
9336
9347
  trackLen,
9337
9348
  innerMin,
9338
9349
  innerMinRatio,
@@ -9478,7 +9489,7 @@ var QSlider = createComponent({
9478
9489
  stopAndPrevent(evt);
9479
9490
 
9480
9491
  const
9481
- stepVal = ([ 34, 33 ].includes(evt.keyCode) ? 10 : 1) * state.step.value,
9492
+ stepVal = ([ 34, 33 ].includes(evt.keyCode) ? 10 : 1) * state.keyStep.value,
9482
9493
  offset = (
9483
9494
  ([ 34, 37, 40 ].includes(evt.keyCode) ? -1 : 1)
9484
9495
  * (state.isReversed.value === true ? -1 : 1)
@@ -9486,7 +9497,7 @@ var QSlider = createComponent({
9486
9497
  );
9487
9498
 
9488
9499
  model.value = between(
9489
- parseFloat((model.value + offset).toFixed(state.decimals.value)),
9500
+ state.roundValueFn.value(model.value + offset),
9490
9501
  state.innerMin.value,
9491
9502
  state.innerMax.value
9492
9503
  );
@@ -9575,6 +9586,9 @@ var QResizeObserver = createComponent({
9575
9586
 
9576
9587
  const { proxy } = getCurrentInstance();
9577
9588
 
9589
+ // expose public method
9590
+ proxy.trigger = trigger;
9591
+
9578
9592
  if (hasObserver === true) {
9579
9593
  let observer;
9580
9594
 
@@ -9648,9 +9662,6 @@ var QResizeObserver = createComponent({
9648
9662
 
9649
9663
  onBeforeUnmount(cleanup);
9650
9664
 
9651
- // expose public method
9652
- proxy.trigger = trigger;
9653
-
9654
9665
  return () => {
9655
9666
  if (canRender.value === true) {
9656
9667
  return h('object', {
@@ -11172,15 +11183,11 @@ var QColor = createComponent({
11172
11183
  + (isDark.value === true ? ' q-color-picker--dark q-dark' : '')
11173
11184
  );
11174
11185
 
11175
- const attributes = computed(() => {
11176
- if (props.disable === true) {
11177
- return { 'aria-disabled': 'true' }
11178
- }
11179
- if (props.readonly === true) {
11180
- return { 'aria-readonly': 'true' }
11181
- }
11182
- return {}
11183
- });
11186
+ const attributes = computed(() => (
11187
+ props.disable === true
11188
+ ? { 'aria-disabled': 'true' }
11189
+ : {}
11190
+ ));
11184
11191
 
11185
11192
  const spectrumDirective = computed(() => {
11186
11193
  // if editable.value === true
@@ -13890,7 +13897,7 @@ var QDate = createComponent({
13890
13897
  const attributes = computed(() => (
13891
13898
  props.disable === true
13892
13899
  ? { 'aria-disabled': 'true' }
13893
- : (props.readonly === true ? { 'aria-readonly': 'true' } : {})
13900
+ : {}
13894
13901
  ));
13895
13902
 
13896
13903
  watch(() => props.modelValue, v => {
@@ -13924,10 +13931,22 @@ var QDate = createComponent({
13924
13931
  });
13925
13932
 
13926
13933
  function setToday () {
13927
- const date = today.value;
13928
- const month = daysMap.value[ getMonthHash(date) ];
13934
+ const { year, month, day } = today.value;
13935
+
13936
+ const date = {
13937
+ // contains more props than needed (hour, minute, second, millisecond)
13938
+ // but those aren't used in the processing of this "date" variable
13939
+ ...viewModel.value,
13929
13940
 
13930
- if (month === void 0 || month.includes(date.day) === false) {
13941
+ // overwriting with today's date
13942
+ year,
13943
+ month,
13944
+ day
13945
+ };
13946
+
13947
+ const monthMap = daysMap.value[ getMonthHash(date) ];
13948
+
13949
+ if (monthMap === void 0 || monthMap.includes(date.day) === false) {
13931
13950
  addToModel(date);
13932
13951
  }
13933
13952
 
@@ -17526,7 +17545,7 @@ var QEditor = createComponent({
17526
17545
  const attributes = computed(() => (
17527
17546
  props.disable === true
17528
17547
  ? { 'aria-disabled': 'true' }
17529
- : (props.readonly === true ? { 'aria-readonly': 'true' } : {})
17548
+ : {}
17530
17549
  ));
17531
17550
 
17532
17551
  function onInput () {
@@ -18725,6 +18744,7 @@ const useValidateProps = {
18725
18744
  reactiveRules: Boolean,
18726
18745
  lazyRules: {
18727
18746
  type: [ Boolean, String ],
18747
+ default: false, // statement unneeded but avoids future vue implementation changes
18728
18748
  validator: v => lazyRulesValues.includes(v)
18729
18749
  }
18730
18750
  };
@@ -18746,10 +18766,14 @@ function useValidate (focused, innerLoading) {
18746
18766
  && props.rules.length !== 0
18747
18767
  );
18748
18768
 
18749
- const hasActiveRules = computed(() =>
18769
+ const canDebounceValidate = computed(() => (
18750
18770
  props.disable !== true
18751
18771
  && hasRules.value === true
18752
- );
18772
+ // Should not have a validation in progress already;
18773
+ // It might mean that focus switched to submit btn and
18774
+ // QForm's submit() has been called already (ENTER key)
18775
+ && innerLoading.value === false
18776
+ ));
18753
18777
 
18754
18778
  const hasError = computed(() =>
18755
18779
  props.error === true || innerError.value === true
@@ -18762,15 +18786,29 @@ function useValidate (focused, innerLoading) {
18762
18786
  ));
18763
18787
 
18764
18788
  watch(() => props.modelValue, () => {
18765
- validateIfNeeded();
18789
+ isDirtyModel.value = true;
18790
+
18791
+ if (
18792
+ canDebounceValidate.value === true
18793
+ // trigger validation if not using any kind of lazy-rules
18794
+ && props.lazyRules === false
18795
+ ) {
18796
+ debouncedValidate();
18797
+ }
18766
18798
  });
18767
18799
 
18768
18800
  watch(() => props.reactiveRules, val => {
18769
18801
  if (val === true) {
18770
18802
  if (unwatchRules === void 0) {
18771
18803
  unwatchRules = watch(() => props.rules, () => {
18772
- validateIfNeeded(true);
18773
- });
18804
+ if (
18805
+ canDebounceValidate.value === true
18806
+ && isDirtyModel.value === true
18807
+ && props.lazyRules !== 'ondemand'
18808
+ ) {
18809
+ debouncedValidate();
18810
+ }
18811
+ }, { immediate: true });
18774
18812
  }
18775
18813
  }
18776
18814
  else if (unwatchRules !== void 0) {
@@ -18779,25 +18817,32 @@ function useValidate (focused, innerLoading) {
18779
18817
  }
18780
18818
  }, { immediate: true });
18781
18819
 
18820
+ watch(() => props.lazyRules, val => {
18821
+ if (
18822
+ val === false
18823
+ && canDebounceValidate.value === true
18824
+ && isDirtyModel.value === true
18825
+ ) {
18826
+ debouncedValidate();
18827
+ }
18828
+ });
18829
+
18782
18830
  watch(focused, val => {
18783
18831
  if (val === true) {
18784
18832
  if (isDirtyModel.value === null) {
18785
- isDirtyModel.value = false;
18833
+ isDirtyModel.value = props.lazyRules === true;
18786
18834
  }
18787
18835
  }
18788
- else if (isDirtyModel.value === false) {
18789
- isDirtyModel.value = true;
18790
-
18791
- if (
18792
- hasActiveRules.value === true
18793
- && props.lazyRules !== 'ondemand'
18794
- // Don't re-trigger if it's already in progress;
18795
- // It might mean that focus switched to submit btn and
18796
- // QForm's submit() has been called already (ENTER key)
18797
- && innerLoading.value === false
18798
- ) {
18799
- debouncedValidate();
18800
- }
18836
+ else if (
18837
+ canDebounceValidate.value === true
18838
+ && (
18839
+ // props.lazyRules can also be 'ondemand',
18840
+ // hence the following form:
18841
+ props.lazyRules === false
18842
+ || (props.lazyRules === true && isDirtyModel.value === true)
18843
+ )
18844
+ ) {
18845
+ debouncedValidate();
18801
18846
  }
18802
18847
  });
18803
18848
 
@@ -18817,7 +18862,10 @@ function useValidate (focused, innerLoading) {
18817
18862
  * - Promise (pending async validation)
18818
18863
  */
18819
18864
  function validate (val = props.modelValue) {
18820
- if (hasActiveRules.value !== true) {
18865
+ if (
18866
+ props.disable === true
18867
+ || hasRules.value === false
18868
+ ) {
18821
18869
  return true
18822
18870
  }
18823
18871
 
@@ -18886,16 +18934,6 @@ function useValidate (focused, innerLoading) {
18886
18934
  )
18887
18935
  }
18888
18936
 
18889
- function validateIfNeeded (changedRules) {
18890
- if (
18891
- hasActiveRules.value === true
18892
- && props.lazyRules !== 'ondemand'
18893
- && (isDirtyModel.value === true || (props.lazyRules !== true && changedRules !== true))
18894
- ) {
18895
- debouncedValidate();
18896
- }
18897
- }
18898
-
18899
18937
  const debouncedValidate = debounce(validate, 0);
18900
18938
 
18901
18939
  onBeforeUnmount(() => {
@@ -19163,9 +19201,6 @@ function useField (state) {
19163
19201
  if (props.disable === true) {
19164
19202
  acc[ 'aria-disabled' ] = 'true';
19165
19203
  }
19166
- else if (props.readonly === true) {
19167
- acc[ 'aria-readonly' ] = 'true';
19168
- }
19169
19204
 
19170
19205
  return acc
19171
19206
  });
@@ -25599,15 +25634,15 @@ var QRange = createComponent({
25599
25634
  case dragType.RANGE:
25600
25635
  const
25601
25636
  ratioDelta = ratio - dragging.offsetRatio,
25602
- minR = between(dragging.ratioMin + ratioDelta, 0, 1 - dragging.rangeRatio),
25637
+ minR = between(dragging.ratioMin + ratioDelta, state.innerMinRatio.value, state.innerMaxRatio.value - dragging.rangeRatio),
25603
25638
  modelDelta = localModel - dragging.offsetModel,
25604
- min = between(dragging.valueMin + modelDelta, props.min, props.max - dragging.rangeValue);
25639
+ min = between(dragging.valueMin + modelDelta, state.innerMin.value, state.innerMax.value - dragging.rangeValue);
25605
25640
 
25606
25641
  pos = {
25607
25642
  minR,
25608
25643
  maxR: minR + dragging.rangeRatio,
25609
- min: parseFloat(min.toFixed(state.decimals.value)),
25610
- max: parseFloat((min + dragging.rangeValue).toFixed(state.decimals.value))
25644
+ min: state.roundValueFn.value(min),
25645
+ max: state.roundValueFn.value(min + dragging.rangeValue)
25611
25646
  };
25612
25647
 
25613
25648
  state.focus.value = 'both';
@@ -25637,7 +25672,7 @@ var QRange = createComponent({
25637
25672
  stopAndPrevent(evt);
25638
25673
 
25639
25674
  const
25640
- stepVal = ([ 34, 33 ].includes(evt.keyCode) ? 10 : 1) * state.step.value,
25675
+ stepVal = ([ 34, 33 ].includes(evt.keyCode) ? 10 : 1) * state.keyStep.value,
25641
25676
  offset = (
25642
25677
  ([ 34, 37, 40 ].includes(evt.keyCode) ? -1 : 1)
25643
25678
  * (state.isReversed.value === true ? -1 : 1)
@@ -25647,14 +25682,14 @@ var QRange = createComponent({
25647
25682
  if (state.focus.value === 'both') {
25648
25683
  const interval = model.value.max - model.value.min;
25649
25684
  const min = between(
25650
- parseFloat((model.value.min + offset).toFixed(state.decimals.value)),
25685
+ state.roundValueFn.value(model.value.min + offset),
25651
25686
  state.innerMin.value,
25652
25687
  state.innerMax.value - interval
25653
25688
  );
25654
25689
 
25655
25690
  model.value = {
25656
25691
  min,
25657
- max: parseFloat((min + interval).toFixed(state.decimals.value))
25692
+ max: state.roundValueFn.value(min + interval)
25658
25693
  };
25659
25694
  }
25660
25695
  else if (state.focus.value === false) {
@@ -25666,7 +25701,7 @@ var QRange = createComponent({
25666
25701
  model.value = {
25667
25702
  ...model.value,
25668
25703
  [ which ]: between(
25669
- parseFloat((model.value[ which ] + offset).toFixed(state.decimals.value)),
25704
+ state.roundValueFn.value(model.value[ which ] + offset),
25670
25705
  which === 'min' ? state.innerMin.value : model.value.min,
25671
25706
  which === 'max' ? state.innerMax.value : model.value.max
25672
25707
  )
@@ -27519,11 +27554,12 @@ var QSelect = createComponent({
27519
27554
 
27520
27555
  return props.options.slice(from, to).map((opt, i) => {
27521
27556
  const disable = isOptionDisabled.value(opt) === true;
27557
+ const active = isOptionSelected(opt) === true;
27522
27558
  const index = from + i;
27523
27559
 
27524
27560
  const itemProps = {
27525
27561
  clickable: true,
27526
- active: false,
27562
+ active,
27527
27563
  activeClass: computedOptionsSelectedClass.value,
27528
27564
  manualFocus: true,
27529
27565
  focused: false,
@@ -27532,16 +27568,14 @@ var QSelect = createComponent({
27532
27568
  dense: props.optionsDense,
27533
27569
  dark: isOptionsDark.value,
27534
27570
  role: 'option',
27571
+ 'aria-selected': active === true ? 'true' : 'false',
27535
27572
  id: `${ state.targetUid.value }_${ index }`,
27536
27573
  onClick: () => { toggleOption(opt); }
27537
27574
  };
27538
27575
 
27539
27576
  if (disable !== true) {
27540
- isOptionSelected(opt) === true && (itemProps.active = true);
27541
27577
  optionIndex.value === index && (itemProps.focused = true);
27542
27578
 
27543
- itemProps[ 'aria-selected' ] = itemProps.active === true ? 'true' : 'false';
27544
-
27545
27579
  if ($q.platform.is.desktop === true) {
27546
27580
  itemProps.onMousemove = () => { menu.value === true && setOptionIndex(index); };
27547
27581
  }
@@ -39669,6 +39703,7 @@ const notificationsList = {};
39669
39703
  const positionClass = {};
39670
39704
  const emptyRE = /^\s*$/;
39671
39705
  const notifRefs = [];
39706
+ const invalidTimeoutValues = [ void 0, null, true, false, '' ];
39672
39707
 
39673
39708
  const positionList = [
39674
39709
  'top-left', 'top-right',
@@ -39762,15 +39797,15 @@ function addNotification (config, $q, originalApi) {
39762
39797
  notif.position = 'bottom';
39763
39798
  }
39764
39799
 
39765
- if (notif.timeout === void 0) {
39800
+ if (invalidTimeoutValues.includes(notif.timeout) === true) {
39766
39801
  notif.timeout = 5000;
39767
39802
  }
39768
39803
  else {
39769
- const t = parseInt(notif.timeout, 10);
39804
+ const t = Number(notif.timeout); // we catch exponential notation too with Number() casting
39770
39805
  if (isNaN(t) || t < 0) {
39771
39806
  return logError('wrong timeout', config)
39772
39807
  }
39773
- notif.timeout = t;
39808
+ notif.timeout = Number.isFinite(t) ? t : 0;
39774
39809
  }
39775
39810
 
39776
39811
  if (notif.timeout === 0) {
@@ -40838,7 +40873,7 @@ function runSequentialPromises (
40838
40873
  */
40839
40874
 
40840
40875
  const Quasar = {
40841
- version: '2.14.0',
40876
+ version: '2.14.2',
40842
40877
  install: installQuasar,
40843
40878
  lang: Plugin$8,
40844
40879
  iconSet: Plugin$7