quasar 2.6.6 → 2.7.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 (214) hide show
  1. package/dist/api/QBtnDropdown.json +1 -0
  2. package/dist/api/QBtnToggle.json +1 -0
  3. package/dist/api/QCarousel.json +2 -1
  4. package/dist/api/QCheckbox.json +1 -0
  5. package/dist/api/QChip.json +3 -1
  6. package/dist/api/QColor.json +1 -0
  7. package/dist/api/QDate.json +1 -0
  8. package/dist/api/QDialog.json +6 -0
  9. package/dist/api/QEditor.json +3 -1
  10. package/dist/api/QExpansionItem.json +1 -0
  11. package/dist/api/QFab.json +1 -0
  12. package/dist/api/QFile.json +1 -0
  13. package/dist/api/QFooter.json +1 -0
  14. package/dist/api/QHeader.json +1 -0
  15. package/dist/api/QInput.json +1 -0
  16. package/dist/api/QItem.json +3 -1
  17. package/dist/api/QKnob.json +1 -0
  18. package/dist/api/QOptionGroup.json +1 -0
  19. package/dist/api/QPagination.json +2 -1
  20. package/dist/api/QPopupEdit.json +1 -0
  21. package/dist/api/QPopupProxy.json +1 -0
  22. package/dist/api/QRadio.json +1 -0
  23. package/dist/api/QRange.json +1 -0
  24. package/dist/api/QRating.json +1 -0
  25. package/dist/api/QSelect.json +1 -0
  26. package/dist/api/QSlider.json +1 -0
  27. package/dist/api/QSplitter.json +1 -0
  28. package/dist/api/QTable.json +5 -1
  29. package/dist/api/QTabs.json +1 -0
  30. package/dist/api/QTime.json +1 -0
  31. package/dist/api/QToggle.json +1 -0
  32. package/dist/api/QTree.json +6 -3
  33. package/dist/icon-set/bootstrap-icons.umd.prod.js +1 -1
  34. package/dist/icon-set/eva-icons.umd.prod.js +1 -1
  35. package/dist/icon-set/fontawesome-v5-pro.umd.prod.js +1 -1
  36. package/dist/icon-set/fontawesome-v5.umd.prod.js +1 -1
  37. package/dist/icon-set/fontawesome-v6-pro.umd.prod.js +1 -1
  38. package/dist/icon-set/fontawesome-v6.umd.prod.js +1 -1
  39. package/dist/icon-set/ionicons-v4.umd.prod.js +1 -1
  40. package/dist/icon-set/line-awesome.umd.prod.js +1 -1
  41. package/dist/icon-set/material-icons-outlined.umd.prod.js +1 -1
  42. package/dist/icon-set/material-icons-round.umd.prod.js +1 -1
  43. package/dist/icon-set/material-icons-sharp.umd.prod.js +1 -1
  44. package/dist/icon-set/material-icons.umd.prod.js +1 -1
  45. package/dist/icon-set/material-symbols-outlined.umd.prod.js +6 -0
  46. package/dist/icon-set/material-symbols-rounded.umd.prod.js +6 -0
  47. package/dist/icon-set/material-symbols-sharp.umd.prod.js +6 -0
  48. package/dist/icon-set/mdi-v3.umd.prod.js +1 -1
  49. package/dist/icon-set/mdi-v4.umd.prod.js +1 -1
  50. package/dist/icon-set/mdi-v5.umd.prod.js +1 -1
  51. package/dist/icon-set/mdi-v6.umd.prod.js +1 -1
  52. package/dist/icon-set/svg-bootstrap-icons.umd.prod.js +1 -1
  53. package/dist/icon-set/svg-eva-icons.umd.prod.js +1 -1
  54. package/dist/icon-set/svg-fontawesome-v5.umd.prod.js +1 -1
  55. package/dist/icon-set/svg-fontawesome-v6.umd.prod.js +1 -1
  56. package/dist/icon-set/svg-ionicons-v4.umd.prod.js +1 -1
  57. package/dist/icon-set/svg-ionicons-v5.umd.prod.js +1 -1
  58. package/dist/icon-set/svg-ionicons-v6.umd.prod.js +1 -1
  59. package/dist/icon-set/svg-line-awesome.umd.prod.js +1 -1
  60. package/dist/icon-set/svg-material-icons-outlined.umd.prod.js +1 -1
  61. package/dist/icon-set/svg-material-icons-round.umd.prod.js +1 -1
  62. package/dist/icon-set/svg-material-icons-sharp.umd.prod.js +1 -1
  63. package/dist/icon-set/svg-material-icons.umd.prod.js +1 -1
  64. package/dist/icon-set/svg-material-symbols-outlined.umd.prod.js +6 -0
  65. package/dist/icon-set/svg-material-symbols-rounded.umd.prod.js +6 -0
  66. package/dist/icon-set/svg-material-symbols-sharp.umd.prod.js +6 -0
  67. package/dist/icon-set/svg-mdi-v6.umd.prod.js +1 -1
  68. package/dist/icon-set/svg-themify.umd.prod.js +1 -1
  69. package/dist/icon-set/themify.umd.prod.js +1 -1
  70. package/dist/lang/ar-TN.umd.prod.js +1 -1
  71. package/dist/lang/ar.umd.prod.js +1 -1
  72. package/dist/lang/az-Latn.umd.prod.js +1 -1
  73. package/dist/lang/bg.umd.prod.js +1 -1
  74. package/dist/lang/bn.umd.prod.js +1 -1
  75. package/dist/lang/ca.umd.prod.js +2 -2
  76. package/dist/lang/cs.umd.prod.js +1 -1
  77. package/dist/lang/da.umd.prod.js +1 -1
  78. package/dist/lang/de.umd.prod.js +1 -1
  79. package/dist/lang/el.umd.prod.js +1 -1
  80. package/dist/lang/en-GB.umd.prod.js +1 -1
  81. package/dist/lang/en-US.umd.prod.js +1 -1
  82. package/dist/lang/eo.umd.prod.js +1 -1
  83. package/dist/lang/es.umd.prod.js +2 -2
  84. package/dist/lang/et.umd.prod.js +1 -1
  85. package/dist/lang/eu.umd.prod.js +1 -1
  86. package/dist/lang/fa-IR.umd.prod.js +1 -1
  87. package/dist/lang/fa.umd.prod.js +1 -1
  88. package/dist/lang/fi.umd.prod.js +1 -1
  89. package/dist/lang/fr.umd.prod.js +1 -1
  90. package/dist/lang/gn.umd.prod.js +1 -1
  91. package/dist/lang/he.umd.prod.js +1 -1
  92. package/dist/lang/hr.umd.prod.js +1 -1
  93. package/dist/lang/hu.umd.prod.js +1 -1
  94. package/dist/lang/id.umd.prod.js +1 -1
  95. package/dist/lang/is.umd.prod.js +1 -1
  96. package/dist/lang/it.umd.prod.js +1 -1
  97. package/dist/lang/ja.umd.prod.js +1 -1
  98. package/dist/lang/km.umd.prod.js +1 -1
  99. package/dist/lang/ko-KR.umd.prod.js +2 -2
  100. package/dist/lang/kur-CKB.umd.prod.js +1 -1
  101. package/dist/lang/kz.umd.prod.js +1 -1
  102. package/dist/lang/lt.umd.prod.js +1 -1
  103. package/dist/lang/lu.umd.prod.js +1 -1
  104. package/dist/lang/lv.umd.prod.js +1 -1
  105. package/dist/lang/ml.umd.prod.js +1 -1
  106. package/dist/lang/mm.umd.prod.js +6 -0
  107. package/dist/lang/ms.umd.prod.js +1 -1
  108. package/dist/lang/my.umd.prod.js +1 -1
  109. package/dist/lang/nb-NO.umd.prod.js +1 -1
  110. package/dist/lang/nl.umd.prod.js +1 -1
  111. package/dist/lang/pl.umd.prod.js +1 -1
  112. package/dist/lang/pt-BR.umd.prod.js +1 -1
  113. package/dist/lang/pt.umd.prod.js +1 -1
  114. package/dist/lang/ro.umd.prod.js +1 -1
  115. package/dist/lang/ru.umd.prod.js +1 -1
  116. package/dist/lang/sk.umd.prod.js +1 -1
  117. package/dist/lang/sl.umd.prod.js +1 -1
  118. package/dist/lang/sm.umd.prod.js +6 -0
  119. package/dist/lang/sr-CYR.umd.prod.js +1 -1
  120. package/dist/lang/sr.umd.prod.js +1 -1
  121. package/dist/lang/sv.umd.prod.js +1 -1
  122. package/dist/lang/ta.umd.prod.js +1 -1
  123. package/dist/lang/th.umd.prod.js +1 -1
  124. package/dist/lang/tr.umd.prod.js +1 -1
  125. package/dist/lang/ug.umd.prod.js +1 -1
  126. package/dist/lang/uk.umd.prod.js +1 -1
  127. package/dist/lang/vi.umd.prod.js +1 -1
  128. package/dist/lang/zh-CN.umd.prod.js +1 -1
  129. package/dist/lang/zh-TW.umd.prod.js +1 -1
  130. package/dist/quasar.addon.rtl.css +251 -0
  131. package/dist/quasar.cjs.prod.js +2 -2
  132. package/dist/quasar.css +9 -9
  133. package/dist/quasar.esm.prod.js +2 -2
  134. package/dist/quasar.prod.css +1 -1
  135. package/dist/quasar.rtl.css +1229 -9
  136. package/dist/quasar.rtl.prod.css +1 -1
  137. package/dist/quasar.sass +10 -9
  138. package/dist/quasar.umd.js +182 -126
  139. package/dist/quasar.umd.prod.js +2 -2
  140. package/dist/types/api/quploader.d.ts +7 -7
  141. package/dist/types/extras/icon-set.d.ts +6 -0
  142. package/dist/types/index.d.ts +265 -255
  143. package/dist/types/utils/dom.d.ts +1 -1
  144. package/dist/types/utils.d.ts +11 -0
  145. package/dist/vetur/quasar-attributes.json +4 -0
  146. package/dist/vetur/quasar-tags.json +2 -1
  147. package/dist/web-types/web-types.json +12 -2
  148. package/icon-set/material-symbols-outlined.js +133 -0
  149. package/icon-set/material-symbols-outlined.mjs +128 -0
  150. package/icon-set/material-symbols-rounded.js +133 -0
  151. package/icon-set/material-symbols-rounded.mjs +128 -0
  152. package/icon-set/material-symbols-sharp.js +133 -0
  153. package/icon-set/material-symbols-sharp.mjs +128 -0
  154. package/icon-set/svg-material-symbols-outlined.js +201 -0
  155. package/icon-set/svg-material-symbols-outlined.mjs +201 -0
  156. package/icon-set/svg-material-symbols-rounded.js +201 -0
  157. package/icon-set/svg-material-symbols-rounded.mjs +201 -0
  158. package/icon-set/svg-material-symbols-sharp.js +201 -0
  159. package/icon-set/svg-material-symbols-sharp.mjs +201 -0
  160. package/lang/ca.js +31 -31
  161. package/lang/ca.mjs +31 -31
  162. package/lang/es.js +1 -1
  163. package/lang/es.mjs +1 -1
  164. package/lang/index.json +8 -0
  165. package/lang/ko-KR.js +21 -21
  166. package/lang/ko-KR.mjs +21 -21
  167. package/lang/mm.js +96 -0
  168. package/lang/mm.mjs +91 -0
  169. package/lang/sm.js +96 -0
  170. package/lang/sm.mjs +91 -0
  171. package/package.json +15 -15
  172. package/src/api.extends.json +1 -0
  173. package/src/components/avatar/__tests__/QAvatar.spec.js +1 -1
  174. package/src/components/badge/QBadge.js +2 -2
  175. package/src/components/badge/__tests__/QBadge.spec.js +1 -1
  176. package/src/components/btn/QBtn.js +2 -2
  177. package/src/components/checkbox/use-checkbox.js +8 -7
  178. package/src/components/dialog/QDialog.js +3 -1
  179. package/src/components/dialog/QDialog.json +7 -0
  180. package/src/components/editor/QEditor.js +11 -25
  181. package/src/components/file/QFile.js +6 -1
  182. package/src/components/icon/QIcon.js +24 -1
  183. package/src/components/icon/QIcon.sass +7 -3
  184. package/src/components/img/QImg.sass +1 -0
  185. package/src/components/infinite-scroll/QInfiniteScroll.js +10 -10
  186. package/src/components/input/QInput.js +6 -1
  187. package/src/components/item/QItem.js +5 -2
  188. package/src/components/item/QItem.json +2 -1
  189. package/src/components/layout/QLayout.js +2 -1
  190. package/src/components/menu/__tests__/QMenu.spec.js +23 -23
  191. package/src/components/pagination/QPagination.json +1 -1
  192. package/src/components/radio/QRadio.js +2 -2
  193. package/src/components/select/QSelect.js +28 -16
  194. package/src/components/select/__tests__/QSelect.spec.js +427 -451
  195. package/src/components/slider/use-slider.js +1 -1
  196. package/src/components/table/QTable.js +0 -1
  197. package/src/components/table/QTable.json +3 -0
  198. package/src/components/table/QTable.sass +1 -1
  199. package/src/components/tabs/QTabs.sass +0 -6
  200. package/src/components/uploader/uploader-core.js +23 -18
  201. package/src/components/virtual-scroll/use-virtual-scroll.js +9 -4
  202. package/src/composables/private/__tests__/use-anchor.spec.js +6 -6
  203. package/src/composables/private/__tests__/use-field.spec.js +7 -7
  204. package/src/composables/private/__tests__/use-model-toggle.spec.js +20 -19
  205. package/src/composables/private/__tests__/use-size.spec.js +2 -2
  206. package/src/composables/private/__tests__/use-transition.spec.js +5 -5
  207. package/src/composables/private/__tests__/use-validate.spec.js +5 -5
  208. package/src/composables/private/use-anchor.js +1 -1
  209. package/src/composables/private/use-field.js +2 -1
  210. package/src/composables/private/use-key-composition.js +16 -13
  211. package/src/directives/Ripple.js +2 -7
  212. package/src/utils/date.js +1 -1
  213. package/src/utils/private/global-dialog.js +22 -10
  214. package/src/components/select/__tests__/WrapperOne.vue +0 -28
@@ -135,6 +135,16 @@ export default createComponent({
135
135
 
136
136
  if (isWorking.value === true) {
137
137
  localScrollTarget.addEventListener('scroll', poll, passive)
138
+
139
+ if (props.reverse === true) {
140
+ const
141
+ scrollHeight = getScrollHeight(localScrollTarget),
142
+ containerHeight = height(localScrollTarget)
143
+
144
+ setVerticalScrollPosition(localScrollTarget, scrollHeight - containerHeight)
145
+ }
146
+
147
+ immediatePoll()
138
148
  }
139
149
  }
140
150
 
@@ -205,16 +215,6 @@ export default createComponent({
205
215
  setDebounce(props.debounce)
206
216
 
207
217
  updateScrollTarget()
208
-
209
- if (props.reverse === true) {
210
- const
211
- scrollHeight = getScrollHeight(localScrollTarget),
212
- containerHeight = height(localScrollTarget)
213
-
214
- setVerticalScrollPosition(localScrollTarget, scrollHeight - containerHeight)
215
- }
216
-
217
- immediatePoll()
218
218
  })
219
219
 
220
220
  return () => {
@@ -208,7 +208,7 @@ export default createComponent({
208
208
  }
209
209
 
210
210
  function onInput (e) {
211
- if (!e || !e.target || e.target.composing === true) {
211
+ if (!e || !e.target || e.target.qComposing === true) {
212
212
  return
213
213
  }
214
214
 
@@ -253,6 +253,8 @@ export default createComponent({
253
253
  }
254
254
 
255
255
  if (props.modelValue !== val && emitCachedValue !== val) {
256
+ emitCachedValue = val
257
+
256
258
  stopWatcher === true && (stopValueWatcher = true)
257
259
  emit('update:modelValue', val)
258
260
 
@@ -284,13 +286,16 @@ export default createComponent({
284
286
  const inp = inputRef.value
285
287
  if (inp !== null) {
286
288
  const parentStyle = inp.parentNode.style
289
+ const { overflow } = inp.style
287
290
 
288
291
  // reset height of textarea to a small size to detect the real height
289
292
  // but keep the total control size the same
290
293
  parentStyle.marginBottom = (inp.scrollHeight - 1) + 'px'
291
294
  inp.style.height = '1px'
295
+ inp.style.overflow = 'hidden'
292
296
 
293
297
  inp.style.height = inp.scrollHeight + 'px'
298
+ inp.style.overflow = overflow
294
299
  parentStyle.marginBottom = ''
295
300
  }
296
301
  }
@@ -20,7 +20,10 @@ export default createComponent({
20
20
  default: 'div'
21
21
  },
22
22
 
23
- active: Boolean,
23
+ active: {
24
+ type: Boolean,
25
+ default: null
26
+ },
24
27
 
25
28
  clickable: Boolean,
26
29
  dense: Boolean,
@@ -58,7 +61,7 @@ export default createComponent({
58
61
  + (props.dense === true ? ' q-item--dense' : '')
59
62
  + (isDark.value === true ? ' q-item--dark' : '')
60
63
  + (
61
- hasLink.value === true
64
+ hasLink.value === true && props.active === null
62
65
  ? linkClass.value
63
66
  : (
64
67
  props.active === true
@@ -9,7 +9,8 @@
9
9
  "active": {
10
10
  "type": "Boolean",
11
11
  "desc": "Put item into 'active' state",
12
- "category": "state"
12
+ "category": "state",
13
+ "default": null
13
14
  },
14
15
 
15
16
  "dark": {
@@ -231,7 +231,8 @@ export default createComponent({
231
231
  const layout = h('div', {
232
232
  class: classes.value,
233
233
  style: style.value,
234
- ref: props.container === true ? void 0 : rootRef
234
+ ref: props.container === true ? void 0 : rootRef,
235
+ tabindex: -1
235
236
  }, content)
236
237
 
237
238
  if (props.container === true) {
@@ -15,7 +15,7 @@ describe('Menu API', () => {
15
15
  describe('(prop): touch-position', () => {
16
16
  it('should show menu at the position of the click', () => {
17
17
  mount(WrapperOne, {
18
- attrs: {
18
+ props: {
19
19
  'touch-position': true
20
20
  }
21
21
  })
@@ -71,7 +71,7 @@ describe('Menu API', () => {
71
71
 
72
72
  it('should not close the menu when clicking outside the menu when persistent', () => {
73
73
  mount(WrapperOne, {
74
- attrs: {
74
+ props: {
75
75
  persistent: true
76
76
  }
77
77
  })
@@ -89,7 +89,7 @@ describe('Menu API', () => {
89
89
 
90
90
  it('should not close the menu when hitting the escape key when persistent', () => {
91
91
  mount(WrapperOne, {
92
- attrs: {
92
+ props: {
93
93
  persistent: true
94
94
  }
95
95
  })
@@ -129,7 +129,7 @@ describe('Menu API', () => {
129
129
 
130
130
  it('should close the menu when clicking a menu child without v-close-popup when auto-close is true', () => {
131
131
  mount(WrapperOne, {
132
- attrs: {
132
+ props: {
133
133
  'auto-close': true
134
134
  }
135
135
  })
@@ -174,7 +174,7 @@ describe('Menu API', () => {
174
174
 
175
175
  it('should not switch focus back to parent element when closing if no-refocus is true', () => {
176
176
  mount(WrapperOne, {
177
- attrs: {
177
+ props: {
178
178
  'no-refocus': true
179
179
  }
180
180
  })
@@ -208,7 +208,7 @@ describe('Menu API', () => {
208
208
 
209
209
  it('should no switch focus to the menu when opening with no-focus is true', () => {
210
210
  mount(WrapperOne, {
211
- attrs: {
211
+ props: {
212
212
  'no-focus': true
213
213
  }
214
214
  })
@@ -226,7 +226,7 @@ describe('Menu API', () => {
226
226
  describe('(prop): fit', () => {
227
227
  it('should show a menu that matches the full with of the target when fit is supplied', () => {
228
228
  mount(WrapperOne, {
229
- attrs: {
229
+ props: {
230
230
  target: '.other-target',
231
231
  fit: true
232
232
  }
@@ -245,7 +245,7 @@ describe('Menu API', () => {
245
245
 
246
246
  it('should show a menu that not matches the full with of the target when fit is false', () => {
247
247
  mount(WrapperOne, {
248
- attrs: {
248
+ props: {
249
249
  target: '.other-target',
250
250
  fit: false
251
251
  }
@@ -266,7 +266,7 @@ describe('Menu API', () => {
266
266
  describe('(prop): cover', () => {
267
267
  it('should show a menu that overlays the target when using cover', () => {
268
268
  mount(WrapperOne, {
269
- attrs: {
269
+ props: {
270
270
  cover: true
271
271
  }
272
272
  })
@@ -279,7 +279,7 @@ describe('Menu API', () => {
279
279
 
280
280
  it('should show a menu that overlays the target when using cover', () => {
281
281
  mount(WrapperOne, {
282
- attrs: {
282
+ props: {
283
283
  cover: true,
284
284
  target: '.other-target'
285
285
  }
@@ -293,7 +293,7 @@ describe('Menu API', () => {
293
293
 
294
294
  it('should ignore self property when using cover', () => {
295
295
  mount(WrapperOne, {
296
- attrs: {
296
+ props: {
297
297
  cover: true,
298
298
  self: 'center right',
299
299
  target: '.other-target'
@@ -328,7 +328,7 @@ describe('Menu API', () => {
328
328
  horizontalSelf.forEach((hS) => {
329
329
  it(`should position Anchor(${ vA } ${ hA }) & Self(${ vS } ${ hS }) correctly`, () => {
330
330
  mount(WrapperOne, {
331
- attrs: {
331
+ props: {
332
332
  anchor: `${ vA } ${ hA }`,
333
333
  self: `${ vS } ${ hS }`
334
334
  }
@@ -357,7 +357,7 @@ describe('Menu API', () => {
357
357
  verticalSelf.forEach((vS) => {
358
358
  it(`should offset vertical position Anchor(${ vA } left) & Self(${ vS } left) correctly`, () => {
359
359
  mount(WrapperOne, {
360
- attrs: {
360
+ props: {
361
361
  anchor: `${ vA } left`,
362
362
  self: `${ vS } left`,
363
363
  offset: [ 0, 20 ]
@@ -378,7 +378,7 @@ describe('Menu API', () => {
378
378
  horizontalSelf.forEach((hS) => {
379
379
  it(`should offset horizontal position Anchor(top ${ hA }) & Self(top ${ hS }) correctly`, () => {
380
380
  mount(WrapperOne, {
381
- attrs: {
381
+ props: {
382
382
  anchor: `top ${ hA }`,
383
383
  self: `top ${ hS }`,
384
384
  offset: [ 20, 0 ]
@@ -399,7 +399,7 @@ describe('Menu API', () => {
399
399
  describe('(prop): dark', () => {
400
400
  it('should set the --q-dark color as background and white text color', () => {
401
401
  mount(WrapperOne, {
402
- attrs: {
402
+ props: {
403
403
  dark: true
404
404
  }
405
405
  })
@@ -414,7 +414,7 @@ describe('Menu API', () => {
414
414
  describe('(prop): square', () => {
415
415
  it('should not have border-radius when using this prop', () => {
416
416
  mount(WrapperOne, {
417
- attrs: {
417
+ props: {
418
418
  square: true
419
419
  }
420
420
  })
@@ -429,7 +429,7 @@ describe('Menu API', () => {
429
429
  it('should specify a max-height when setting this prop', () => {
430
430
  const maxHeight = '30px'
431
431
  mount(WrapperOne, {
432
- attrs: {
432
+ props: {
433
433
  maxHeight
434
434
  }
435
435
  })
@@ -444,7 +444,7 @@ describe('Menu API', () => {
444
444
  it('should specify a max-width when setting this prop', () => {
445
445
  const maxWidth = '30px'
446
446
  mount(WrapperOne, {
447
- attrs: {
447
+ props: {
448
448
  maxWidth
449
449
  }
450
450
  })
@@ -470,7 +470,7 @@ describe('Menu API', () => {
470
470
  it('should emit @escape-key event when escape key is pressed', () => {
471
471
  const fn = cy.stub()
472
472
  mount(WrapperOne, {
473
- attrs: {
473
+ props: {
474
474
  onEscapeKey: fn
475
475
  }
476
476
  })
@@ -493,7 +493,7 @@ describe('Menu API', () => {
493
493
  it('should not emit @escape-key event when menu is persistent', () => {
494
494
  const fn = cy.stub()
495
495
  mount(WrapperOne, {
496
- attrs: {
496
+ props: {
497
497
  onEscapeKey: fn,
498
498
  persistent: true
499
499
  }
@@ -520,7 +520,7 @@ describe('Menu API', () => {
520
520
  describe('(method): updatePosition', () => {
521
521
  it('should reposition the menu when it is no longer in correct position', () => {
522
522
  mount(WrapperTwo, {
523
- attrs: {
523
+ props: {
524
524
  anchor: 'bottom left',
525
525
  self: 'bottom left'
526
526
  }
@@ -564,7 +564,7 @@ describe('Menu API', () => {
564
564
  describe('(method): focus', () => {
565
565
  it('should focus the menu', () => {
566
566
  mount(WrapperOne, {
567
- attrs: {
567
+ props: {
568
568
  'no-focus': true
569
569
  }
570
570
  })
@@ -586,7 +586,7 @@ describe('Menu API', () => {
586
586
 
587
587
  it('should focus the autofocus element inside the menu', () => {
588
588
  mount(WrapperTwo, {
589
- attrs: {
589
+ props: {
590
590
  'no-focus': true
591
591
  }
592
592
  })
@@ -223,7 +223,7 @@
223
223
  "extends": "update:model-value",
224
224
  "params": {
225
225
  "value": {
226
- "type": "String"
226
+ "type": "Number"
227
227
  }
228
228
  }
229
229
  }
@@ -1,4 +1,4 @@
1
- import { h, ref, computed, getCurrentInstance } from 'vue'
1
+ import { h, ref, computed, getCurrentInstance, toRaw } from 'vue'
2
2
 
3
3
  import QIcon from '../icon/QIcon.js'
4
4
 
@@ -64,7 +64,7 @@ export default createComponent({
64
64
  const rootRef = ref(null)
65
65
  const { refocusTargetEl, refocusTarget } = useRefocusTarget(props, rootRef)
66
66
 
67
- const isTrue = computed(() => props.modelValue === props.val)
67
+ const isTrue = computed(() => toRaw(props.modelValue) === toRaw(props.val))
68
68
 
69
69
  const classes = computed(() =>
70
70
  'q-radio cursor-pointer no-outline row inline no-wrap items-center'
@@ -127,7 +127,7 @@ export default createComponent({
127
127
 
128
128
  emits: [
129
129
  ...useFieldEmits,
130
- 'add', 'remove', 'input-value',
130
+ 'add', 'remove', 'input-value', 'new-value',
131
131
  'keyup', 'keypress', 'keydown',
132
132
  'filter-abort'
133
133
  ],
@@ -165,7 +165,7 @@ export default createComponent({
165
165
 
166
166
  const virtualScrollItemSizeComputed = computed(() => (
167
167
  props.virtualScrollItemSize === void 0
168
- ? (props.dense === true ? 24 : 48)
168
+ ? (props.optionsDense === true ? 24 : 48)
169
169
  : props.virtualScrollItemSize
170
170
  ))
171
171
 
@@ -175,7 +175,6 @@ export default createComponent({
175
175
  localResetVirtualScroll,
176
176
  padVirtualScroll,
177
177
  onVirtualScrollEvt,
178
- reset,
179
178
  scrollTo,
180
179
  setVirtualScrollSize
181
180
  } = useVirtualScroll({
@@ -269,15 +268,23 @@ export default createComponent({
269
268
 
270
269
  const tabindex = computed(() => (state.focused.value === true ? props.tabindex : -1))
271
270
 
272
- const comboboxAttrs = computed(() => ({
273
- tabindex: props.tabindex,
274
- role: 'combobox',
275
- 'aria-label': props.label,
276
- 'aria-autocomplete': props.useInput === true ? 'list' : 'none',
277
- 'aria-expanded': menu.value === true ? 'true' : 'false',
278
- 'aria-owns': `${ state.targetUid.value }_lb`,
279
- 'aria-controls': `${ state.targetUid.value }_lb`
280
- }))
271
+ const comboboxAttrs = computed(() => {
272
+ const attrs = {
273
+ tabindex: props.tabindex,
274
+ role: 'combobox',
275
+ 'aria-label': props.label,
276
+ 'aria-autocomplete': props.useInput === true ? 'list' : 'none',
277
+ 'aria-expanded': menu.value === true ? 'true' : 'false',
278
+ 'aria-owns': `${ state.targetUid.value }_lb`,
279
+ 'aria-controls': `${ state.targetUid.value }_lb`
280
+ }
281
+
282
+ if (optionIndex.value >= 0) {
283
+ attrs[ 'aria-activedescendant' ] = `${ state.targetUid.value }_${ optionIndex.value }`
284
+ }
285
+
286
+ return attrs
287
+ })
281
288
 
282
289
  const listboxAttrs = computed(() => {
283
290
  const attrs = {
@@ -1013,7 +1020,7 @@ export default createComponent({
1013
1020
  function onInput (e) {
1014
1021
  clearTimeout(inputTimer)
1015
1022
 
1016
- if (e && e.target && e.target.composing === true) {
1023
+ if (e && e.target && e.target.qComposing === true) {
1017
1024
  return
1018
1025
  }
1019
1026
 
@@ -1342,13 +1349,18 @@ export default createComponent({
1342
1349
  setOptionIndex(optionIndex)
1343
1350
  }
1344
1351
 
1345
- function rerenderMenu () {
1352
+ function rerenderMenu (newLength, oldLength) {
1346
1353
  if (menu.value === true && state.innerLoading.value === false) {
1347
- reset()
1354
+ localResetVirtualScroll(-1, true)
1348
1355
 
1349
1356
  nextTick(() => {
1350
1357
  if (menu.value === true && state.innerLoading.value === false) {
1351
- updateMenu(true)
1358
+ if (newLength > oldLength) {
1359
+ localResetVirtualScroll()
1360
+ }
1361
+ else {
1362
+ updateMenu(true)
1363
+ }
1352
1364
  }
1353
1365
  })
1354
1366
  }