quasar 2.5.0 → 2.5.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 (164) hide show
  1. package/dist/api/QBtn.json +2 -2
  2. package/dist/api/QBtnDropdown.json +14 -14
  3. package/dist/api/QCarousel.json +1 -1
  4. package/dist/api/QCheckbox.json +1 -1
  5. package/dist/api/QChip.json +1 -1
  6. package/dist/api/QDialog.json +13 -13
  7. package/dist/api/QDrawer.json +16 -16
  8. package/dist/api/QExpansionItem.json +13 -13
  9. package/dist/api/QFab.json +13 -13
  10. package/dist/api/QFabAction.json +2 -2
  11. package/dist/api/QField.json +2 -2
  12. package/dist/api/QFile.json +1 -1
  13. package/dist/api/QForm.json +9 -3
  14. package/dist/api/QInput.json +2 -2
  15. package/dist/api/QKnob.json +18 -0
  16. package/dist/api/QMenu.json +13 -13
  17. package/dist/api/QPopupEdit.json +6 -6
  18. package/dist/api/QPopupProxy.json +13 -13
  19. package/dist/api/QRadio.json +1 -1
  20. package/dist/api/QRange.json +1 -1
  21. package/dist/api/QRouteTab.json +1 -1
  22. package/dist/api/QSelect.json +18 -4
  23. package/dist/api/QSlider.json +1 -1
  24. package/dist/api/QTable.json +6 -6
  25. package/dist/api/QToggle.json +1 -1
  26. package/dist/api/QTooltip.json +13 -13
  27. package/dist/api/QUploader.json +1 -1
  28. package/dist/api/TouchHold.json +1 -1
  29. package/dist/api/TouchPan.json +1 -1
  30. package/dist/api/TouchRepeat.json +1 -1
  31. package/dist/api/TouchSwipe.json +1 -1
  32. package/dist/icon-set/bootstrap-icons.umd.prod.js +1 -1
  33. package/dist/icon-set/eva-icons.umd.prod.js +1 -1
  34. package/dist/icon-set/fontawesome-v5-pro.umd.prod.js +1 -1
  35. package/dist/icon-set/fontawesome-v5.umd.prod.js +1 -1
  36. package/dist/icon-set/ionicons-v4.umd.prod.js +1 -1
  37. package/dist/icon-set/line-awesome.umd.prod.js +1 -1
  38. package/dist/icon-set/material-icons-outlined.umd.prod.js +1 -1
  39. package/dist/icon-set/material-icons-round.umd.prod.js +1 -1
  40. package/dist/icon-set/material-icons-sharp.umd.prod.js +1 -1
  41. package/dist/icon-set/material-icons.umd.prod.js +1 -1
  42. package/dist/icon-set/mdi-v3.umd.prod.js +1 -1
  43. package/dist/icon-set/mdi-v4.umd.prod.js +1 -1
  44. package/dist/icon-set/mdi-v5.umd.prod.js +1 -1
  45. package/dist/icon-set/mdi-v6.umd.prod.js +1 -1
  46. package/dist/icon-set/svg-bootstrap-icons.umd.prod.js +1 -1
  47. package/dist/icon-set/svg-eva-icons.umd.prod.js +1 -1
  48. package/dist/icon-set/svg-fontawesome-v5.umd.prod.js +1 -1
  49. package/dist/icon-set/svg-ionicons-v4.umd.prod.js +1 -1
  50. package/dist/icon-set/svg-ionicons-v5.umd.prod.js +1 -1
  51. package/dist/icon-set/svg-ionicons-v6.umd.prod.js +1 -1
  52. package/dist/icon-set/svg-line-awesome.umd.prod.js +1 -1
  53. package/dist/icon-set/svg-material-icons-outlined.umd.prod.js +1 -1
  54. package/dist/icon-set/svg-material-icons-round.umd.prod.js +1 -1
  55. package/dist/icon-set/svg-material-icons-sharp.umd.prod.js +1 -1
  56. package/dist/icon-set/svg-material-icons.umd.prod.js +1 -1
  57. package/dist/icon-set/svg-mdi-v4.umd.prod.js +1 -1
  58. package/dist/icon-set/svg-mdi-v5.umd.prod.js +1 -1
  59. package/dist/icon-set/svg-mdi-v6.umd.prod.js +1 -1
  60. package/dist/icon-set/svg-themify.umd.prod.js +1 -1
  61. package/dist/icon-set/themify.umd.prod.js +1 -1
  62. package/dist/lang/ar.umd.prod.js +1 -1
  63. package/dist/lang/az-Latn.umd.prod.js +1 -1
  64. package/dist/lang/bg.umd.prod.js +1 -1
  65. package/dist/lang/bn.umd.prod.js +1 -1
  66. package/dist/lang/ca.umd.prod.js +1 -1
  67. package/dist/lang/cs.umd.prod.js +1 -1
  68. package/dist/lang/da.umd.prod.js +1 -1
  69. package/dist/lang/de.umd.prod.js +1 -1
  70. package/dist/lang/el.umd.prod.js +1 -1
  71. package/dist/lang/en-GB.umd.prod.js +1 -1
  72. package/dist/lang/en-US.umd.prod.js +1 -1
  73. package/dist/lang/eo.umd.prod.js +1 -1
  74. package/dist/lang/es.umd.prod.js +1 -1
  75. package/dist/lang/et.umd.prod.js +1 -1
  76. package/dist/lang/fa-IR.umd.prod.js +1 -1
  77. package/dist/lang/fa.umd.prod.js +1 -1
  78. package/dist/lang/fi.umd.prod.js +1 -1
  79. package/dist/lang/fr.umd.prod.js +1 -1
  80. package/dist/lang/gn.umd.prod.js +1 -1
  81. package/dist/lang/he.umd.prod.js +1 -1
  82. package/dist/lang/hr.umd.prod.js +1 -1
  83. package/dist/lang/hu.umd.prod.js +1 -1
  84. package/dist/lang/id.umd.prod.js +1 -1
  85. package/dist/lang/is.umd.prod.js +1 -1
  86. package/dist/lang/it.umd.prod.js +1 -1
  87. package/dist/lang/ja.umd.prod.js +1 -1
  88. package/dist/lang/km.umd.prod.js +1 -1
  89. package/dist/lang/ko-KR.umd.prod.js +1 -1
  90. package/dist/lang/kur-CKB.umd.prod.js +1 -1
  91. package/dist/lang/lt.umd.prod.js +1 -1
  92. package/dist/lang/lu.umd.prod.js +1 -1
  93. package/dist/lang/lv.umd.prod.js +1 -1
  94. package/dist/lang/ml.umd.prod.js +1 -1
  95. package/dist/lang/ms.umd.prod.js +1 -1
  96. package/dist/lang/my.umd.prod.js +1 -1
  97. package/dist/lang/nb-NO.umd.prod.js +1 -1
  98. package/dist/lang/nl.umd.prod.js +1 -1
  99. package/dist/lang/pl.umd.prod.js +1 -1
  100. package/dist/lang/pt-BR.umd.prod.js +1 -1
  101. package/dist/lang/pt.umd.prod.js +1 -1
  102. package/dist/lang/ro.umd.prod.js +1 -1
  103. package/dist/lang/ru.umd.prod.js +1 -1
  104. package/dist/lang/sk.umd.prod.js +1 -1
  105. package/dist/lang/sl.umd.prod.js +1 -1
  106. package/dist/lang/sr-CYR.umd.prod.js +1 -1
  107. package/dist/lang/sr.umd.prod.js +1 -1
  108. package/dist/lang/sv.umd.prod.js +1 -1
  109. package/dist/lang/ta.umd.prod.js +1 -1
  110. package/dist/lang/th.umd.prod.js +1 -1
  111. package/dist/lang/tr.umd.prod.js +1 -1
  112. package/dist/lang/ug.umd.prod.js +1 -1
  113. package/dist/lang/uk.umd.prod.js +1 -1
  114. package/dist/lang/vi.umd.prod.js +1 -1
  115. package/dist/lang/zh-CN.umd.prod.js +1 -1
  116. package/dist/lang/zh-TW.umd.prod.js +1 -1
  117. package/dist/quasar.cjs.prod.js +2 -2
  118. package/dist/quasar.css +4 -0
  119. package/dist/quasar.esm.prod.js +2 -2
  120. package/dist/quasar.prod.css +1 -1
  121. package/dist/quasar.rtl.css +4 -0
  122. package/dist/quasar.rtl.prod.css +1 -1
  123. package/dist/quasar.sass +3 -1
  124. package/dist/quasar.umd.js +259 -171
  125. package/dist/quasar.umd.prod.js +2 -2
  126. package/dist/ssr-directives/Morph.js +1 -1
  127. package/dist/types/index.d.ts +103 -89
  128. package/dist/types/utils/date.d.ts +25 -13
  129. package/dist/vetur/quasar-attributes.json +8 -0
  130. package/dist/vetur/quasar-tags.json +2 -0
  131. package/dist/web-types/web-types.json +81 -55
  132. package/package.json +1 -1
  133. package/src/api-file-example.json +2 -2
  134. package/src/api.extends.json +21 -32
  135. package/src/components/btn/QBtn.json +3 -6
  136. package/src/components/carousel/QCarousel.json +2 -4
  137. package/src/components/checkbox/use-checkbox.json +2 -4
  138. package/src/components/chip/QChip.json +1 -3
  139. package/src/components/fab/QFabAction.json +1 -3
  140. package/src/components/field/QField.json +2 -6
  141. package/src/components/field/QField.sass +2 -0
  142. package/src/components/form/QForm.js +26 -24
  143. package/src/components/form/QForm.json +9 -7
  144. package/src/components/input/QInput.json +2 -6
  145. package/src/components/input/use-mask.js +2 -2
  146. package/src/components/knob/QKnob.js +46 -40
  147. package/src/components/knob/QKnob.json +16 -0
  148. package/src/components/radio/QRadio.json +2 -4
  149. package/src/components/select/QSelect.js +2 -1
  150. package/src/components/select/QSelect.json +17 -8
  151. package/src/components/slider/use-slider.json +1 -1
  152. package/src/components/table/QTable.json +5 -13
  153. package/src/components/tabs/QRouteTab.json +2 -3
  154. package/src/components/tabs/use-tab.js +11 -8
  155. package/src/components/tree/QTree.js +39 -41
  156. package/src/composables/private/use-file.json +1 -3
  157. package/src/composables/private/use-router-link.js +1 -1
  158. package/src/composables/private/use-validate.js +14 -18
  159. package/src/directives/TouchHold.json +2 -3
  160. package/src/directives/TouchPan.json +2 -3
  161. package/src/directives/TouchRepeat.json +2 -3
  162. package/src/directives/TouchSwipe.json +2 -3
  163. package/src/plugins/Screen.js +9 -5
  164. package/src/utils/date.js +110 -31
@@ -139,6 +139,11 @@
139
139
  "default": true,
140
140
  "examples": [ false, "{ early: true, center: true, color: 'teal', keyCodes: [] }" ],
141
141
  "category": "style"
142
+ },
143
+
144
+ "evt": {
145
+ "type": "Event",
146
+ "desc": "JS event object"
142
147
  }
143
148
  },
144
149
 
@@ -165,10 +170,8 @@
165
170
  "desc": "Emitted after component has triggered show()",
166
171
  "params": {
167
172
  "evt": {
168
- "type": "Object",
169
- "desc": "JS event object",
170
- "required": true,
171
- "__exemption": [ "examples" ]
173
+ "extends": "evt",
174
+ "required": true
172
175
  }
173
176
  }
174
177
  },
@@ -177,10 +180,8 @@
177
180
  "desc": "Emitted when component triggers show() but before it finishes doing it",
178
181
  "params": {
179
182
  "evt": {
180
- "type": "Object",
181
- "desc": "JS event object",
182
- "required": true,
183
- "__exemption": [ "examples" ]
183
+ "extends": "evt",
184
+ "required": true
184
185
  }
185
186
  }
186
187
  },
@@ -193,10 +194,8 @@
193
194
  "desc": "Emitted after component has triggered hide()",
194
195
  "params": {
195
196
  "evt": {
196
- "type": "Object",
197
- "desc": "JS event object",
198
- "required": true,
199
- "__exemption": [ "examples" ]
197
+ "extends": "evt",
198
+ "required": true
200
199
  }
201
200
  }
202
201
  },
@@ -205,10 +204,8 @@
205
204
  "desc": "Emitted when component triggers hide() but before it finishes doing it",
206
205
  "params": {
207
206
  "evt": {
208
- "type": "Object",
209
- "desc": "JS event object",
210
- "required": true,
211
- "__exemption": [ "examples" ]
207
+ "extends": "evt",
208
+ "required": true
212
209
  }
213
210
  }
214
211
  },
@@ -221,10 +218,8 @@
221
218
  "desc": "Emitted when user clicks/taps on the component",
222
219
  "params": {
223
220
  "evt": {
224
- "type": "Object",
225
- "desc": "JS event object",
226
- "required": true,
227
- "__exemption": [ "examples" ]
221
+ "extends": "evt",
222
+ "required": true
228
223
  }
229
224
  }
230
225
  }
@@ -235,10 +230,8 @@
235
230
  "desc": "Triggers component to show",
236
231
  "params": {
237
232
  "evt": {
238
- "type": "Object",
239
- "required": false,
240
- "desc": "JS event object",
241
- "__exemption": [ "examples" ]
233
+ "extends": "evt",
234
+ "required": false
242
235
  }
243
236
  }
244
237
  },
@@ -247,10 +240,8 @@
247
240
  "desc": "Triggers component to hide",
248
241
  "params": {
249
242
  "evt": {
250
- "type": "Object",
251
- "required": false,
252
- "desc": "JS event object",
253
- "__exemption": [ "examples" ]
243
+ "extends": "evt",
244
+ "required": false
254
245
  }
255
246
  }
256
247
  },
@@ -258,10 +249,8 @@
258
249
  "toggle": {
259
250
  "params": {
260
251
  "evt": {
261
- "type": "Object",
262
- "required": false,
263
- "desc": "JS event object",
264
- "__exemption": [ "examples" ]
252
+ "extends": "evt",
253
+ "required": false
265
254
  }
266
255
  },
267
256
  "desc": "Triggers component to toggle between show/hide"
@@ -41,9 +41,7 @@
41
41
  "desc": "Emulate click on QBtn",
42
42
  "params": {
43
43
  "evt": {
44
- "type": "Object",
45
- "desc": "JS event object",
46
- "__exemption": [ "examples" ]
44
+ "extends": "evt"
47
45
  }
48
46
  }
49
47
  }
@@ -54,9 +52,8 @@
54
52
  "desc": "Emitted when component is clicked (activated)",
55
53
  "params": {
56
54
  "evt": {
57
- "type": "Object",
58
- "desc": "JS event object; If you want to cancel navigation set synchronously 'evt.navigate' to false",
59
- "__exemption": [ "examples" ]
55
+ "extends": "evt",
56
+ "desc": "JS event object; If you want to cancel navigation set synchronously 'evt.navigate' to false"
60
57
  },
61
58
  "navigateFn": {
62
59
  "type": "Function",
@@ -144,10 +144,8 @@
144
144
  "desc": "Default trigger when clicked/tapped on",
145
145
  "params": {
146
146
  "evt": {
147
- "type": "Object",
148
- "desc": "JS event object",
149
- "required": true,
150
- "__exemption": [ "examples" ]
147
+ "extends": "evt",
148
+ "required": true
151
149
  }
152
150
  },
153
151
  "returns": null
@@ -122,10 +122,8 @@
122
122
  "__exemption": [ "examples" ]
123
123
  },
124
124
  "evt": {
125
- "type": "Object",
126
- "desc": "JS event object",
127
- "required": true,
128
- "__exemption": [ "examples" ]
125
+ "extends": "evt",
126
+ "required": true
129
127
  }
130
128
  }
131
129
  }
@@ -115,9 +115,7 @@
115
115
  "desc": "Emitted on QChip click if 'clickable' property is set",
116
116
  "params": {
117
117
  "evt": {
118
- "type": "Object",
119
- "desc": "JS event object",
120
- "__exemption": [ "examples" ]
118
+ "extends": "evt"
121
119
  }
122
120
  }
123
121
  },
@@ -59,9 +59,7 @@
59
59
  "desc": "Emulate click on QFabAction",
60
60
  "params": {
61
61
  "evt": {
62
- "type": "Object",
63
- "desc": "JS event object",
64
- "__exemption": [ "examples" ]
62
+ "extends": "evt"
65
63
  }
66
64
  }
67
65
  }
@@ -81,9 +81,7 @@
81
81
  "desc": "Emitted when component gets focused",
82
82
  "params": {
83
83
  "evt": {
84
- "type": "Object",
85
- "desc": "JS event object",
86
- "__exemption": [ "examples" ]
84
+ "extends": "evt"
87
85
  }
88
86
  }
89
87
  },
@@ -92,9 +90,7 @@
92
90
  "desc": "Emitted when component loses focus",
93
91
  "params": {
94
92
  "evt": {
95
- "type": "Object",
96
- "desc": "JS event object",
97
- "__exemption": [ "examples" ]
93
+ "extends": "evt"
98
94
  }
99
95
  }
100
96
  }
@@ -45,6 +45,7 @@ $field-transition-label-right-up: .324s cubic-bezier(.4,0,.2,1)
45
45
  line-height: 1
46
46
  color: rgba(0,0,0,.54)
47
47
  padding: 8px 12px 0
48
+ backface-visibility: hidden
48
49
 
49
50
  &--animated
50
51
  transform: translateY(100%)
@@ -190,6 +191,7 @@ $field-transition-label-right-up: .324s cubic-bezier(.4,0,.2,1)
190
191
  text-transform: inherit
191
192
  transform-origin: left top
192
193
  transition: transform $field-transition, max-width $field-transition-label-right-up
194
+ backface-visibility: hidden
193
195
 
194
196
  &--float .q-field__label
195
197
  max-width: 133%
@@ -33,7 +33,7 @@ export default createComponent({
33
33
  ? shouldFocus
34
34
  : props.noErrorFocus !== true
35
35
 
36
- validateIndex++
36
+ const index = ++validateIndex
37
37
 
38
38
  const emitEvent = (res, ref) => {
39
39
  emit('validation-' + (res === true ? 'success' : 'error'), ref)
@@ -47,7 +47,7 @@ export default createComponent({
47
47
  promises.push(
48
48
  valid.then(
49
49
  valid => ({ valid, comp }),
50
- error => ({ valid: false, comp, error })
50
+ err => ({ valid: false, comp, err })
51
51
  )
52
52
  )
53
53
  }
@@ -71,34 +71,33 @@ export default createComponent({
71
71
  return Promise.resolve(true)
72
72
  }
73
73
 
74
- const index = validateIndex
75
-
76
- return Promise.all(promises).then(
77
- res => {
78
- if (index === validateIndex) {
79
- const errors = res.filter(r => r.valid !== true)
74
+ return Promise.all(promises).then(res => {
75
+ const errors = res.filter(r => r.valid !== true)
80
76
 
81
- if (errors.length === 0) {
82
- emitEvent(true)
83
- return true
84
- }
77
+ if (errors.length === 0) {
78
+ index === validateIndex && emitEvent(true)
79
+ return true
80
+ }
85
81
 
86
- const { valid, comp } = errors[ 0 ]
82
+ const { valid, comp, err } = errors[ 0 ]
87
83
 
88
- emitEvent(false, comp)
84
+ // if not outdated already
85
+ if (index === validateIndex) {
86
+ err !== void 0 && console.error(err)
89
87
 
90
- if (
91
- focus === true
92
- && valid !== true
93
- && typeof comp.focus === 'function'
94
- ) {
95
- comp.focus()
96
- }
88
+ emitEvent(false, comp)
97
89
 
98
- return false
90
+ if (
91
+ focus === true
92
+ && valid !== true
93
+ && typeof comp.focus === 'function'
94
+ ) {
95
+ comp.focus()
99
96
  }
100
97
  }
101
- )
98
+
99
+ return false
100
+ })
102
101
  }
103
102
 
104
103
  function resetValidation () {
@@ -112,8 +111,11 @@ export default createComponent({
112
111
  function submit (evt) {
113
112
  evt !== void 0 && stopAndPrevent(evt)
114
113
 
114
+ const index = validateIndex + 1
115
+
115
116
  validate().then(val => {
116
- if (val === true) {
117
+ // if not outdated && validation succeeded
118
+ if (index === validateIndex && val === true) {
117
119
  if (props.onSubmit !== void 0) {
118
120
  emit('submit', evt)
119
121
  }
@@ -37,7 +37,13 @@
37
37
 
38
38
  "events": {
39
39
  "submit": {
40
- "desc": "Emitted when all validations have passed when tethered to a submit button"
40
+ "desc": "Emitted when all validations have passed when tethered to a submit button",
41
+ "params": {
42
+ "evt": {
43
+ "type": "SubmitEvent",
44
+ "desc": "Form submission event object"
45
+ }
46
+ }
41
47
  },
42
48
 
43
49
  "reset": {
@@ -89,9 +95,7 @@
89
95
  "desc": "Manually trigger form validation and submit",
90
96
  "params": {
91
97
  "evt": {
92
- "type": "Object",
93
- "desc": "JS event object",
94
- "__exemption": [ "examples" ]
98
+ "extends": "evt"
95
99
  }
96
100
  }
97
101
  },
@@ -100,9 +104,7 @@
100
104
  "desc": "Manually trigger form reset",
101
105
  "params": {
102
106
  "evt": {
103
- "type": "Object",
104
- "desc": "JS event object",
105
- "__exemption": [ "examples" ]
107
+ "extends": "evt"
106
108
  }
107
109
  }
108
110
  },
@@ -89,9 +89,7 @@
89
89
  "desc": "Emitted when component gets focused",
90
90
  "params": {
91
91
  "evt": {
92
- "type": "Object",
93
- "desc": "JS event object",
94
- "__exemption": [ "examples" ]
92
+ "extends": "evt"
95
93
  }
96
94
  }
97
95
  },
@@ -100,9 +98,7 @@
100
98
  "desc": "Emitted when component loses focus",
101
99
  "params": {
102
100
  "evt": {
103
- "type": "Object",
104
- "desc": "JS event object",
105
- "__exemption": [ "examples" ]
101
+ "extends": "evt"
106
102
  }
107
103
  }
108
104
  }
@@ -1,4 +1,4 @@
1
- import { ref, computed, watch, nextTick } from 'vue'
1
+ import { ref, watch, nextTick } from 'vue'
2
2
 
3
3
  import { shouldIgnoreKey } from '../../utils/private/key-composition.js'
4
4
 
@@ -297,7 +297,7 @@ export default function (props, emit, emitValue, inputRef) {
297
297
  ? unmaskValue(masked)
298
298
  : masked
299
299
 
300
- props.modelValue !== val && emitValue(val, true)
300
+ String(props.modelValue) !== val && emitValue(val, true)
301
301
  }
302
302
 
303
303
  function moveCursorForPaste (inp, start, end) {
@@ -1,4 +1,4 @@
1
- import { h, ref, computed, watch, onMounted, withDirectives, getCurrentInstance } from 'vue'
1
+ import { h, ref, computed, watch, getCurrentInstance } from 'vue'
2
2
 
3
3
  import QCircularProgress from '../circular-progress/QCircularProgress.js'
4
4
  import TouchPan from '../../directives/TouchPan.js'
@@ -6,6 +6,7 @@ import TouchPan from '../../directives/TouchPan.js'
6
6
  import { createComponent } from '../../utils/private/create.js'
7
7
  import { position, stopAndPrevent } from '../../utils/event.js'
8
8
  import { between, normalizeToInterval } from '../../utils/format.js'
9
+ import { hDir } from '../../utils/private/render.js'
9
10
 
10
11
  import { useFormProps, useFormAttrs } from '../../composables/private/use-form.js'
11
12
  import { useCircularCommonProps } from '../circular-progress/use-circular-progress.js'
@@ -26,6 +27,9 @@ export default createComponent({
26
27
  required: true
27
28
  },
28
29
 
30
+ innerMin: Number,
31
+ innerMax: Number,
32
+
29
33
  step: {
30
34
  type: Number,
31
35
  default: 1,
@@ -50,27 +54,33 @@ export default createComponent({
50
54
  const model = ref(props.modelValue)
51
55
  const dragging = ref(false)
52
56
 
53
- let centerPosition, $el
57
+ const innerMin = computed(() => (
58
+ isNaN(props.innerMin) === true || props.innerMin < props.min
59
+ ? props.min
60
+ : props.innerMin
61
+ ))
62
+ const innerMax = computed(() => (
63
+ isNaN(props.innerMax) === true || props.innerMax > props.max
64
+ ? props.max
65
+ : props.innerMax
66
+ ))
54
67
 
55
- watch(() => props.modelValue, val => {
56
- if (val < props.min) {
57
- model.value = props.min
58
- }
59
- else if (val > props.max) {
60
- model.value = props.max
61
- }
62
- else {
63
- if (val !== model.value) {
64
- model.value = val
65
- }
66
- return
67
- }
68
+ let centerPosition
68
69
 
69
- if (model.value !== props.modelValue) {
70
- emit('update:modelValue', model.value)
71
- emit('change', model.value)
72
- }
73
- })
70
+ function normalizeModel () {
71
+ model.value = props.modelValue === null
72
+ ? innerMin.value
73
+ : between(props.modelValue, innerMin.value, innerMax.value)
74
+
75
+ updateValue(true)
76
+ }
77
+
78
+ watch(
79
+ () => `${ props.modelValue }|${ innerMin.value }|${ innerMax.value }`,
80
+ normalizeModel
81
+ )
82
+
83
+ normalizeModel()
74
84
 
75
85
  const editable = computed(() => props.disable === false && props.readonly === false)
76
86
 
@@ -138,7 +148,7 @@ export default createComponent({
138
148
  })
139
149
 
140
150
  function updateCenterPosition () {
141
- const { top, left, width, height } = $el.getBoundingClientRect()
151
+ const { top, left, width, height } = proxy.$el.getBoundingClientRect()
142
152
  centerPosition = {
143
153
  top: top + height / 2,
144
154
  left: left + width / 2
@@ -168,8 +178,8 @@ export default createComponent({
168
178
 
169
179
  model.value = between(
170
180
  parseFloat((model.value + offset).toFixed(decimals.value)),
171
- props.min,
172
- props.max
181
+ innerMin.value,
182
+ innerMax.value
173
183
  )
174
184
 
175
185
  updateValue()
@@ -212,7 +222,7 @@ export default createComponent({
212
222
  newModel = parseFloat(newModel.toFixed(decimals.value))
213
223
  }
214
224
 
215
- newModel = between(newModel, props.min, props.max)
225
+ newModel = between(newModel, innerMin.value, innerMax.value)
216
226
 
217
227
  emit('drag-value', newModel)
218
228
 
@@ -240,16 +250,12 @@ export default createComponent({
240
250
  return h('input', formAttrs.value)
241
251
  }
242
252
 
243
- onMounted(() => {
244
- $el = proxy.$el
245
- })
246
-
247
253
  return () => {
248
254
  const data = {
249
255
  class: classes.value,
250
256
  role: 'slider',
251
- 'aria-valuemin': props.min,
252
- 'aria-valuemax': props.max,
257
+ 'aria-valuemin': innerMin.value,
258
+ 'aria-valuemax': innerMax.value,
253
259
  'aria-valuenow': props.modelValue,
254
260
  ...attrs.value,
255
261
  ...circularProps.value,
@@ -262,18 +268,18 @@ export default createComponent({
262
268
  default: slots.default
263
269
  }
264
270
 
265
- if (editable.value === true) {
266
- if (props.name !== void 0) {
267
- child.internal = getNameInput
268
- }
269
-
270
- return withDirectives(
271
- h(QCircularProgress, data, child),
272
- directives.value
273
- )
271
+ if (editable.value === true && props.name !== void 0) {
272
+ child.internal = getNameInput
274
273
  }
275
274
 
276
- return h(QCircularProgress, data, child)
275
+ return hDir(
276
+ QCircularProgress,
277
+ data,
278
+ child,
279
+ 'knob',
280
+ editable.value,
281
+ () => directives.value
282
+ )
277
283
  }
278
284
  }
279
285
  })
@@ -27,6 +27,22 @@
27
27
  "category": "model"
28
28
  },
29
29
 
30
+ "inner-min": {
31
+ "type": "Number",
32
+ "desc": "Inner minimum value of the model; Use in case you need the model value to be inside of the track's min-max values; Needs to be higher or equal to 'min' prop; Defaults to 'min' prop",
33
+ "examples": [ ":inner-min=\"0\"" ],
34
+ "category": "model",
35
+ "addedIn": "v2.5.4"
36
+ },
37
+
38
+ "inner-max": {
39
+ "type": "Number",
40
+ "desc": "Inner maximum value of the model; Use in case you need the model value to be inside of the track's min-max values; Needs to be lower or equal to 'max' prop; Defaults to 'max' prop",
41
+ "examples": [ ":inner-max=\"100\"" ],
42
+ "category": "model",
43
+ "addedIn": "v2.5.4"
44
+ },
45
+
30
46
  "step": {
31
47
  "type": "Number",
32
48
  "default": "1",
@@ -93,10 +93,8 @@
93
93
  "__exemption": [ "examples" ]
94
94
  },
95
95
  "evt": {
96
- "type": "Object",
97
- "desc": "JS event object",
98
- "required": true,
99
- "__exemption": [ "examples" ]
96
+ "extends": "evt",
97
+ "required": true
100
98
  }
101
99
  }
102
100
  }
@@ -337,7 +337,7 @@ export default createComponent({
337
337
  itemProps[ 'aria-selected' ] = itemProps.active === true ? 'true' : 'false'
338
338
 
339
339
  if ($q.platform.is.desktop === true) {
340
- itemProps.onMousemove = () => { setOptionIndex(index) }
340
+ itemProps.onMousemove = () => { menu.value === true && setOptionIndex(index) }
341
341
  }
342
342
  }
343
343
 
@@ -1385,6 +1385,7 @@ export default createComponent({
1385
1385
  Object.assign(proxy, {
1386
1386
  showPopup, hidePopup,
1387
1387
  removeAtIndex, add, toggleOption,
1388
+ getOptionIndex: () => optionIndex.value,
1388
1389
  setOptionIndex, moveOptionSelection,
1389
1390
  filter, updateMenuPosition, updateInputValue,
1390
1391
  isOptionSelected,
@@ -628,9 +628,7 @@
628
628
  "desc": "Emitted when the select options menu or dialog is shown.",
629
629
  "params": {
630
630
  "evt": {
631
- "type": "Object",
632
- "desc": "JS event object",
633
- "__exemption": [ "examples" ]
631
+ "extends": "evt"
634
632
  }
635
633
  }
636
634
  },
@@ -639,9 +637,7 @@
639
637
  "desc": "Emitted when the select options menu or dialog is hidden.",
640
638
  "params": {
641
639
  "evt": {
642
- "type": "Object",
643
- "desc": "JS event object",
644
- "__exemption": [ "examples" ]
640
+ "extends": "evt"
645
641
  }
646
642
  }
647
643
  },
@@ -718,13 +714,26 @@
718
714
  }
719
715
  },
720
716
 
717
+ "getOptionIndex": {
718
+ "desc": "Gets current focused option index from menu; It's -1 if no option is focused",
719
+ "params": {
720
+ "index": {
721
+ "type": "Number",
722
+ "required": true,
723
+ "desc": "Index of option from menu; -1 if no option is focused",
724
+ "examples": [ 10 ]
725
+ }
726
+ },
727
+ "addedIn": "v2.5.4"
728
+ },
729
+
721
730
  "setOptionIndex": {
722
- "desc": "Sets option from menu as 'focused'",
731
+ "desc": "Sets option from menu as 'focused'; -1 to focus none",
723
732
  "params": {
724
733
  "index": {
725
734
  "type": "Number",
726
735
  "required": true,
727
- "desc": "Index of option from menu",
736
+ "desc": "Index of option from menu; -1 to focus none",
728
737
  "examples": [ 10 ]
729
738
  }
730
739
  }
@@ -29,7 +29,7 @@
29
29
  "inner-max": {
30
30
  "type": "Number",
31
31
  "desc": "Inner maximum value of the model; Use in case you need the model value to be inside of the track's min-max values; Needs to be lower or equal to 'max' prop; Defaults to 'max' prop",
32
- "examples": [ ":max-value=\"100\"" ],
32
+ "examples": [ ":inner-max=\"100\"" ],
33
33
  "category": "model",
34
34
  "addedIn": "v2.4"
35
35
  },